Merge pull request #4607 from sdedic/vscode/revealByDefault

Reveal things in project explorer by default.
diff --git a/.github/ISSUE_TEMPLATE/netbeans_bug_report.yml b/.github/ISSUE_TEMPLATE/netbeans_bug_report.yml
index b408d54..716e03d 100644
--- a/.github/ISSUE_TEMPLATE/netbeans_bug_report.yml
+++ b/.github/ISSUE_TEMPLATE/netbeans_bug_report.yml
@@ -27,8 +27,8 @@
         Latest releases are always available from https://netbeans.apache.org/download/
       multiple: false
       options:
-        - "Apache NetBeans 14"
-        - "Apache NetBeans 15 release candidate"
+        - "Apache NetBeans 15"
+        # - "Apache NetBeans 16 release candidate"
         - "Apache NetBeans latest daily build"
     validations:
       required: true
diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml
index b5899ef..02e2ae8 100644
--- a/.github/workflows/main.yml
+++ b/.github/workflows/main.yml
@@ -103,7 +103,7 @@
         run: tar --zstd -xf build.tar.zst
 
       - name: Setup Xvfb
-        if: ${{ matrix.java != '19-ea' }}  # see #4299
+        if: ${{ matrix.java != '20-ea' }}  # see #4299
         run: |
           echo "DISPLAY=:99.0" >> $GITHUB_ENV
           Xvfb :99 -screen 0 1024x768x24 > /dev/null 2>&1 &
diff --git a/.gitignore b/.gitignore
index 60e508b..ce62816 100644
--- a/.gitignore
+++ b/.gitignore
@@ -108,3 +108,9 @@
 /extide/gradle/netbeans-gradle-tooling/gradle/wrapper/gradle-wrapper.jar
 /extide/gradle/release/modules/gradle/daemon-loader/.gradle/
 /nbbuild/misc/prepare-bundles/target/
+
+# ANTLR v4 Grammar
+##################################
+/java/languages.antlr/external/*.g4
+/java/languages.antlr/external/LexerAdaptor.java
+
diff --git a/.travis.yml b/.travis.yml
index 0fad142..f25454b 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -198,6 +198,20 @@
             - hide-logs.sh ant $OPTS -f platform/templates test
             - hide-logs.sh ant $OPTS -f platform/templatesui test
             - hide-logs.sh ant $OPTS -f platform/uihandler test
+          
+        - name: Test platform modules on JDK 11, Batch 1
+          jdk: openjdk8
+          env:
+            - OPTS="-Dmetabuild.jsonurl=https://raw.githubusercontent.com/apache/netbeans-jenkins-lib/master/meta/netbeansrelease.json -silent -Dcluster.config=platform -Djavac.compilerargs=-nowarn -Dbuild.compiler.deprecation=false -Dtest-unit-sys-prop.ignore.random.failures=true -Dvanilla.javac.exists=true"
+          before_script:
+            - nbbuild/travis/ant.sh $OPTS clean
+            - nbbuild/travis/ant.sh $OPTS build
+            - wget https://cdn.azul.com/zulu/bin/zulu11.58.23-ca-jdk11.0.16.1-linux_x64.tar.gz
+            - tar --extract --gzip --directory $HOME -f zulu11.58.23-ca-jdk11.0.16.1-linux_x64.tar.gz
+            - TEST_JDK=$HOME/zulu11.58.23-ca-jdk11.0.16.1-linux_x64
+            - export OPTS="$OPTS  -Dtest.nbjdk.home=$TEST_JDK"
+          script:
+            - hide-logs.sh ant $OPTS -f platform/o.n.bootstrap test
 
         - name: Test ide modules
           jdk: openjdk8
@@ -441,8 +455,9 @@
           env:
             - OPTS="-Dmetabuild.jsonurl=https://raw.githubusercontent.com/apache/netbeans-jenkins-lib/master/meta/netbeansrelease.json -quiet -Dcluster.config=java -Djavac.compilerargs=-nowarn -Dbuild.compiler.deprecation=false -Dtest-unit-sys-prop.ignore.random.failures=true"
           before_script:
-            - wget https://raw.githubusercontent.com/sormuras/bach/master/install-jdk.sh
-            - export TEST_JDK=`bash install-jdk.sh --feature 11 --license GPL --emit-java-home --silent | tail -1`
+            - wget https://cdn.azul.com/zulu/bin/zulu11.58.23-ca-jdk11.0.16.1-linux_x64.tar.gz
+            - tar --extract --gzip --directory $HOME -f zulu11.58.23-ca-jdk11.0.16.1-linux_x64.tar.gz
+            - TEST_JDK=$HOME/zulu11.58.23-ca-jdk11.0.16.1-linux_x64
             - export OPTS="-Dmetabuild.jsonurl=https://raw.githubusercontent.com/apache/netbeans-jenkins-lib/master/meta/netbeansrelease.json $OPTS  -Dtest.nbjdk.home=$TEST_JDK -Dtest.run.args=--limit-modules=java.base,java.logging,java.xml,java.prefs,java.desktop,java.management,java.instrument,jdk.zipfs,java.scripting,java.naming -Dtest.bootclasspath.prepend.args=-Dno.netbeans.bootclasspath.prepend.needed=true"
             - nbbuild/travis/ant.sh $OPTS clean
             - nbbuild/travis/ant.sh $OPTS build
@@ -620,8 +635,9 @@
           before_script:
             - nbbuild/travis/ant.sh $BUILD_OPTS clean
             - nbbuild/travis/ant.sh $BUILD_OPTS build
-            - wget https://raw.githubusercontent.com/sormuras/bach/master/install-jdk.sh
-            - export TEST_JDK=`bash install-jdk.sh --feature 11 --license GPL --emit-java-home --silent | tail -1`
+            - wget https://cdn.azul.com/zulu/bin/zulu11.58.23-ca-jdk11.0.16.1-linux_x64.tar.gz
+            - tar --extract --gzip --directory $HOME -f zulu11.58.23-ca-jdk11.0.16.1-linux_x64.tar.gz
+            - TEST_JDK=$HOME/zulu11.58.23-ca-jdk11.0.16.1-linux_x64
             - export OPTS="-Dmetabuild.jsonurl=https://raw.githubusercontent.com/apache/netbeans-jenkins-lib/master/meta/netbeansrelease.json $OPTS  -Dtest.nbjdk.home=$TEST_JDK -Dtest.run.args=--limit-modules=java.base,java.logging,java.xml,java.prefs,java.desktop,java.management,java.instrument,jdk.zipfs,java.scripting,java.naming -Dtest.bootclasspath.prepend.args=-Dno.netbeans.bootclasspath.prepend.needed=true"
           script:
             #- ant $TEST_OPTS -f groovy/groovy test
diff --git a/apisupport/apisupport.ant/test/unit/src/org/netbeans/modules/apisupport/project/suite/SuiteBrandingModelTest.java b/apisupport/apisupport.ant/test/unit/src/org/netbeans/modules/apisupport/project/suite/SuiteBrandingModelTest.java
index 669141b..0dc644d 100644
--- a/apisupport/apisupport.ant/test/unit/src/org/netbeans/modules/apisupport/project/suite/SuiteBrandingModelTest.java
+++ b/apisupport/apisupport.ant/test/unit/src/org/netbeans/modules/apisupport/project/suite/SuiteBrandingModelTest.java
@@ -19,7 +19,6 @@
 
 package org.netbeans.modules.apisupport.project.suite;
 
-import static junit.framework.Assert.*;
 import org.netbeans.api.project.ProjectManager;
 import org.netbeans.junit.NbTestCase;
 import org.netbeans.modules.apisupport.project.TestBase;
diff --git a/apisupport/apisupport.project/test/unit/src/org/netbeans/modules/apisupport/project/DialogDisplayerImpl.java b/apisupport/apisupport.project/test/unit/src/org/netbeans/modules/apisupport/project/DialogDisplayerImpl.java
index 51448e6..95a6912 100644
--- a/apisupport/apisupport.project/test/unit/src/org/netbeans/modules/apisupport/project/DialogDisplayerImpl.java
+++ b/apisupport/apisupport.project/test/unit/src/org/netbeans/modules/apisupport/project/DialogDisplayerImpl.java
@@ -20,7 +20,7 @@
 package org.netbeans.modules.apisupport.project;
 
 import java.awt.Dialog;
-import junit.framework.Assert;
+import org.junit.Assert;
 import org.openide.DialogDescriptor;
 import org.openide.DialogDisplayer;
 import org.openide.NotifyDescriptor;
diff --git a/apisupport/apisupport.project/test/unit/src/org/netbeans/modules/apisupport/project/ErrorManagerImpl.java b/apisupport/apisupport.project/test/unit/src/org/netbeans/modules/apisupport/project/ErrorManagerImpl.java
index 8b13d92..579bd47 100644
--- a/apisupport/apisupport.project/test/unit/src/org/netbeans/modules/apisupport/project/ErrorManagerImpl.java
+++ b/apisupport/apisupport.project/test/unit/src/org/netbeans/modules/apisupport/project/ErrorManagerImpl.java
@@ -22,7 +22,6 @@
 import java.io.PrintWriter;
 import java.io.StringWriter;
 import java.util.Date;
-import junit.framework.Assert;
 import org.netbeans.junit.NbTestCase;
 import org.openide.ErrorManager;
 
diff --git a/apisupport/apisupport.project/test/unit/src/org/netbeans/modules/apisupport/project/InputOutputProviderImpl.java b/apisupport/apisupport.project/test/unit/src/org/netbeans/modules/apisupport/project/InputOutputProviderImpl.java
index dee7633..071259e 100644
--- a/apisupport/apisupport.project/test/unit/src/org/netbeans/modules/apisupport/project/InputOutputProviderImpl.java
+++ b/apisupport/apisupport.project/test/unit/src/org/netbeans/modules/apisupport/project/InputOutputProviderImpl.java
@@ -24,9 +24,8 @@
 import java.io.StringReader;
 import java.io.StringWriter;
 import java.util.logging.Logger;
-import junit.framework.Assert;
+import org.junit.Assert;
 import org.netbeans.junit.NbTestCase;
-import org.openide.ErrorManager;
 import org.openide.windows.IOProvider;
 import org.openide.windows.InputOutput;
 import org.openide.windows.OutputListener;
diff --git a/apisupport/apisupport.project/test/unit/src/org/netbeans/modules/apisupport/project/layers/LayerTestBase.java b/apisupport/apisupport.project/test/unit/src/org/netbeans/modules/apisupport/project/layers/LayerTestBase.java
index 0ca9100..098280a 100644
--- a/apisupport/apisupport.project/test/unit/src/org/netbeans/modules/apisupport/project/layers/LayerTestBase.java
+++ b/apisupport/apisupport.project/test/unit/src/org/netbeans/modules/apisupport/project/layers/LayerTestBase.java
@@ -19,7 +19,6 @@
 
 package org.netbeans.modules.apisupport.project.layers;
 
-import junit.framework.Assert;
 import org.netbeans.api.xml.services.UserCatalog;
 import org.netbeans.junit.NbTestCase;
 import org.netbeans.spi.project.support.ant.AntBasedProjectType;
@@ -43,7 +42,7 @@
         static {
             // XXX replace with MockServices
             System.setProperty("org.openide.util.Lookup", Lkp.class.getName());
-            Assert.assertEquals(Lkp.class, Lookup.getDefault().getClass());
+            assertEquals(Lkp.class, Lookup.getDefault().getClass());
             Lookup p = Lookups.forPath("Services/AntBasedProjectTypes/");
             p.lookupAll(AntBasedProjectType.class);
             projects = p;
@@ -52,7 +51,7 @@
         private static Lkp DEFAULT;
         private static final Lookup projects;
         public Lkp() {
-            Assert.assertNull(DEFAULT);
+            assertNull(DEFAULT);
             DEFAULT = this;
             ClassLoader l = Lkp.class.getClassLoader();
             setLookups(new Lookup[] {
diff --git a/cpplite/cpplite.debugger/src/org/netbeans/modules/cpplite/debugger/CPPLiteDebugger.java b/cpplite/cpplite.debugger/src/org/netbeans/modules/cpplite/debugger/CPPLiteDebugger.java
index 2f143c6..7435261 100644
--- a/cpplite/cpplite.debugger/src/org/netbeans/modules/cpplite/debugger/CPPLiteDebugger.java
+++ b/cpplite/cpplite.debugger/src/org/netbeans/modules/cpplite/debugger/CPPLiteDebugger.java
@@ -388,7 +388,7 @@
             return ;
         }
         breakpointsHandler.dispose();
-        if (sendExit) {
+        if (sendExit && proxy != null) {
             proxy.send(new Command("-gdb-exit"));
         }
         Utils.unmarkCurrent ();
diff --git a/enterprise/cloud.oracle/src/org/netbeans/modules/cloud/oracle/adm/ProjectVulnerability.java b/enterprise/cloud.oracle/src/org/netbeans/modules/cloud/oracle/adm/ProjectVulnerability.java
index 8b6431c..153e29b 100644
--- a/enterprise/cloud.oracle/src/org/netbeans/modules/cloud/oracle/adm/ProjectVulnerability.java
+++ b/enterprise/cloud.oracle/src/org/netbeans/modules/cloud/oracle/adm/ProjectVulnerability.java
@@ -44,7 +44,7 @@
     @ProjectType(id = "org-netbeans-modules-gradle")
 })
 public final class ProjectVulnerability {
-    private final RequestProcessor AUDIT_PROCESSOR = new RequestProcessor(ProjectVulnerability.class);
+    private final RequestProcessor AUDIT_PROCESSOR = new RequestProcessor(ProjectVulnerability.class.getName(), 4);
     private final RequestProcessor CALL_PROCESSOR = new RequestProcessor(ProjectVulnerability.class);
     
     private final Project project;
diff --git a/enterprise/cloud.oracle/src/org/netbeans/modules/cloud/oracle/adm/VulnerabilityWorker.java b/enterprise/cloud.oracle/src/org/netbeans/modules/cloud/oracle/adm/VulnerabilityWorker.java
index 4516960..a721e28 100644
--- a/enterprise/cloud.oracle/src/org/netbeans/modules/cloud/oracle/adm/VulnerabilityWorker.java
+++ b/enterprise/cloud.oracle/src/org/netbeans/modules/cloud/oracle/adm/VulnerabilityWorker.java
@@ -78,12 +78,12 @@
  */
 @NbBundle.Messages({
     "# {0} - project name",
-    "MSG_Audit_Pass=Vulnerability audit for project {0} is done.\nNo vulnerability was found.",
+    "MSG_Audit_Pass=Vulnerability audit for project {0} is done.\nNo vulnerable dependency was found.",
     "# {0} - project name",
-    "MSG_Audit_Failed_One=Vulnerability audit for project {0} is done.\nOne vulnerability was found.\nThe vulnerability is listed in Problems window.",
+    "MSG_Audit_Failed_One=Vulnerability audit for project {0} is done.\nOne vulnerable dependency was found.\nThe vulnerability is listed in Problems window.",
     "# {0} - project name",
     "# {1} - number of vulnerabilities",
-    "MSG_Audit_Failed_More=Vulnerability audit for project {0} is done.\n{1} vulnerabilities were found.\nThe vulnerabilities are listed in Problems window.",
+    "MSG_Audit_Failed_More=Vulnerability audit for project {0} is done.\n{1} vulnerable dependencies were found.\nThe vulnerabilities are listed in Problems window.",
     "# {0} - project name",
     "MSG_CreatingAuditFailed=Creating Vulnerablity audit for project {0} failed.",
     "# {0} - project name",
@@ -390,15 +390,12 @@
         List<ApplicationDependency> result = new ArrayList();
         convert(dr.getRoot(), new HashMap<>(), result);
         
-        CacheItem cacheItem;
+        CacheItem cacheItem = null;
         VulnerabilityReport savedAudit = null;
         
         if (!forceAudit) {
             try {
                 savedAudit = AuditCache.getInstance().loadAudit(knowledgeBaseId);
-                if (savedAudit != null) {
-                    cacheItem = new CacheItem(project, dr, savedAudit);
-                }
             } catch (IOException ex) {
                 LOG.log(Level.WARNING, "Could not load cached audit data", ex);
             }
@@ -421,6 +418,7 @@
                 if (!response.getVulnerabilityAuditCollection().getItems().isEmpty()) {
                     VulnerabilityAuditSummary summary = response.getVulnerabilityAuditCollection().getItems().get(0);
                     cacheItem = fetchVulnerabilityItems(project, admClient, dr, summary, projectDisplayName);
+                    savedAudit = new VulnerabilityReport(cacheItem.getAudit(), cacheItem.getVulnerabilities());
                 }
             } catch (BmcException ex) {
                 LOG.log(Level.FINE, "Unable to list newest audit for knowledgebase {0}, compartment {1}", new Object[] {
@@ -429,7 +427,7 @@
             }
         }
         
-        if (savedAudit == null) {
+        if (savedAudit == null && forceAudit) {
             try (ApplicationDependencyManagementClient admClient
                     = new ApplicationDependencyManagementClient(OCIManager.getDefault().getConfigProvider())) {
                 final VulnerabilityAuditConfiguration auditConfiguration = VulnerabilityAuditConfiguration
@@ -442,7 +440,7 @@
                         .builder()
                         .compartmentId(compartmentId)
                         .knowledgeBaseId(knowledgeBaseId)
-                        .displayName(projectDisplayName)
+                        .displayName(projectDisplayName.replaceAll("[^A-Za-z0-9-_]", "_")) // remove offending characters
                         .buildType(VulnerabilityAudit.BuildType.Maven)
                         .configuration(auditConfiguration)
                         .applicationDependencies(result)
@@ -464,7 +462,7 @@
             } finally {
                 progressHandle.finish();
             }
-        } else {
+        } else if (savedAudit != null) {
             cacheItem = new CacheItem(project, dr, savedAudit);
         }
 
diff --git a/enterprise/j2ee.clientproject/test/unit/src/org/netbeans/modules/j2ee/clientproject/test/TestUtil.java b/enterprise/j2ee.clientproject/test/unit/src/org/netbeans/modules/j2ee/clientproject/test/TestUtil.java
index c2b3bc6..2f8bb8d 100644
--- a/enterprise/j2ee.clientproject/test/unit/src/org/netbeans/modules/j2ee/clientproject/test/TestUtil.java
+++ b/enterprise/j2ee.clientproject/test/unit/src/org/netbeans/modules/j2ee/clientproject/test/TestUtil.java
@@ -30,7 +30,7 @@
 import java.util.Map;
 import java.util.StringTokenizer;
 import java.util.WeakHashMap;
-import junit.framework.Assert;
+import org.junit.Assert;
 import org.netbeans.api.project.Project;
 import org.netbeans.junit.NbTestCase;
 import org.netbeans.spi.project.ProjectFactory;
diff --git a/enterprise/j2ee.common/test/unit/src/org/netbeans/modules/j2ee/common/ClasspathUtilTest.java b/enterprise/j2ee.common/test/unit/src/org/netbeans/modules/j2ee/common/ClasspathUtilTest.java
index 36c0972..fe102cc 100644
--- a/enterprise/j2ee.common/test/unit/src/org/netbeans/modules/j2ee/common/ClasspathUtilTest.java
+++ b/enterprise/j2ee.common/test/unit/src/org/netbeans/modules/j2ee/common/ClasspathUtilTest.java
@@ -27,8 +27,6 @@
 import java.util.LinkedHashMap;
 import java.util.LinkedList;
 import java.util.List;
-import static junit.framework.Assert.assertFalse;
-import static junit.framework.Assert.assertTrue;
 import org.netbeans.junit.NbTestCase;
 import org.openide.filesystems.FileUtil;
 
diff --git a/enterprise/j2ee.ddloaders/test/unit/src/org/netbeans/modules/j2ee/ddloaders/app/EarDataNodeTest.java b/enterprise/j2ee.ddloaders/test/unit/src/org/netbeans/modules/j2ee/ddloaders/app/EarDataNodeTest.java
index f2a0960..ee243aa 100644
--- a/enterprise/j2ee.ddloaders/test/unit/src/org/netbeans/modules/j2ee/ddloaders/app/EarDataNodeTest.java
+++ b/enterprise/j2ee.ddloaders/test/unit/src/org/netbeans/modules/j2ee/ddloaders/app/EarDataNodeTest.java
@@ -29,7 +29,6 @@
 import java.nio.charset.StandardCharsets;
 import java.util.Enumeration;
 import javax.swing.Action;
-import junit.framework.Assert;
 import org.netbeans.junit.NbTestCase;
 import org.openide.actions.OpenAction;
 import org.openide.filesystems.FileObject;
@@ -58,13 +57,13 @@
     static {
         // XXX replace with MockServices
         System.setProperty("org.openide.util.Lookup", Lkp.class.getName());
-        Assert.assertEquals(Lkp.class, Lookup.getDefault().getClass());
+        assertEquals(Lkp.class, Lookup.getDefault().getClass());
     }
     
     public static final class Lkp extends ProxyLookup {
         private static Lkp DEFAULT;
         public Lkp() {
-            Assert.assertNull(DEFAULT);
+            assertNull(DEFAULT);
             DEFAULT = this;
             setLookup(new Object[0]);
         }
diff --git a/enterprise/j2ee.earproject/test/unit/src/org/netbeans/modules/j2ee/earproject/EarProjectTest.java b/enterprise/j2ee.earproject/test/unit/src/org/netbeans/modules/j2ee/earproject/EarProjectTest.java
index 3616480..bf173cd 100644
--- a/enterprise/j2ee.earproject/test/unit/src/org/netbeans/modules/j2ee/earproject/EarProjectTest.java
+++ b/enterprise/j2ee.earproject/test/unit/src/org/netbeans/modules/j2ee/earproject/EarProjectTest.java
@@ -30,8 +30,6 @@
 import java.net.URL;
 import javax.xml.parsers.SAXParser;
 import javax.xml.parsers.SAXParserFactory;
-import junit.framework.Assert;
-import static junit.framework.Assert.assertEquals;
 import org.netbeans.api.project.Project;
 import org.netbeans.api.project.ProjectManager;
 import org.netbeans.api.project.ui.OpenProjects;
@@ -296,9 +294,9 @@
     }
 
     public static void validate(FileObject ddFO) throws Exception {
-        Assert.assertNotNull(ddFO);
+        assertNotNull(ddFO);
         File ddF = FileUtil.toFile(ddFO);
-        Assert.assertNotNull(ddF);
+        assertNotNull(ddF);
         validate(ddF);
     }
 
diff --git a/enterprise/j2ee.earproject/test/unit/src/org/netbeans/modules/j2ee/earproject/test/TestUtil.java b/enterprise/j2ee.earproject/test/unit/src/org/netbeans/modules/j2ee/earproject/test/TestUtil.java
index b9413d7..ec39caf 100644
--- a/enterprise/j2ee.earproject/test/unit/src/org/netbeans/modules/j2ee/earproject/test/TestUtil.java
+++ b/enterprise/j2ee.earproject/test/unit/src/org/netbeans/modules/j2ee/earproject/test/TestUtil.java
@@ -33,7 +33,7 @@
 import java.util.WeakHashMap;
 import java.util.zip.ZipEntry;
 import java.util.zip.ZipFile;
-import junit.framework.Assert;
+import org.junit.Assert;
 import org.netbeans.api.project.Project;
 import org.netbeans.junit.NbTestCase;
 import org.netbeans.spi.project.ProjectFactory;
diff --git a/enterprise/j2ee.ejbjarproject/test/unit/src/org/netbeans/modules/j2ee/ejbjarproject/EjbJarProviderTest.java b/enterprise/j2ee.ejbjarproject/test/unit/src/org/netbeans/modules/j2ee/ejbjarproject/EjbJarProviderTest.java
index 963f8c5..6226a40 100644
--- a/enterprise/j2ee.ejbjarproject/test/unit/src/org/netbeans/modules/j2ee/ejbjarproject/EjbJarProviderTest.java
+++ b/enterprise/j2ee.ejbjarproject/test/unit/src/org/netbeans/modules/j2ee/ejbjarproject/EjbJarProviderTest.java
@@ -20,7 +20,6 @@
 package org.netbeans.modules.j2ee.ejbjarproject;
 
 import java.io.File;
-import static junit.framework.Assert.assertEquals;
 import org.netbeans.api.j2ee.core.Profile;
 import org.netbeans.api.project.Project;
 import org.netbeans.api.project.ProjectManager;
diff --git a/enterprise/j2ee.ejbjarproject/test/unit/src/org/netbeans/modules/j2ee/ejbjarproject/test/TestUtil.java b/enterprise/j2ee.ejbjarproject/test/unit/src/org/netbeans/modules/j2ee/ejbjarproject/test/TestUtil.java
index f16edac..41f2d01 100644
--- a/enterprise/j2ee.ejbjarproject/test/unit/src/org/netbeans/modules/j2ee/ejbjarproject/test/TestUtil.java
+++ b/enterprise/j2ee.ejbjarproject/test/unit/src/org/netbeans/modules/j2ee/ejbjarproject/test/TestUtil.java
@@ -30,7 +30,7 @@
 import java.util.Map;
 import java.util.StringTokenizer;
 import java.util.WeakHashMap;
-import junit.framework.Assert;
+import org.junit.Assert;
 import org.netbeans.api.project.Project;
 import org.netbeans.junit.NbTestCase;
 import org.netbeans.spi.project.ProjectFactory;
diff --git a/enterprise/j2ee.ejbverification/test/unit/src/org/netbeans/modules/j2ee/ejbverification/rules/AnnotationPostContructTest.java b/enterprise/j2ee.ejbverification/test/unit/src/org/netbeans/modules/j2ee/ejbverification/rules/AnnotationPostContructTest.java
index e57e3e1..8f898b4 100644
--- a/enterprise/j2ee.ejbverification/test/unit/src/org/netbeans/modules/j2ee/ejbverification/rules/AnnotationPostContructTest.java
+++ b/enterprise/j2ee.ejbverification/test/unit/src/org/netbeans/modules/j2ee/ejbverification/rules/AnnotationPostContructTest.java
@@ -18,7 +18,6 @@
  */
 package org.netbeans.modules.j2ee.ejbverification.rules;
 
-import static junit.framework.Assert.assertNotNull;
 import org.netbeans.modules.j2ee.ejbverification.HintTestBase;
 import org.netbeans.modules.j2ee.ejbverification.TestBase;
 
diff --git a/enterprise/j2ee.ejbverification/test/unit/src/org/netbeans/modules/j2ee/ejbverification/rules/BMnotPartOfRBIandLBITest.java b/enterprise/j2ee.ejbverification/test/unit/src/org/netbeans/modules/j2ee/ejbverification/rules/BMnotPartOfRBIandLBITest.java
index d55151e..0f03255 100644
--- a/enterprise/j2ee.ejbverification/test/unit/src/org/netbeans/modules/j2ee/ejbverification/rules/BMnotPartOfRBIandLBITest.java
+++ b/enterprise/j2ee.ejbverification/test/unit/src/org/netbeans/modules/j2ee/ejbverification/rules/BMnotPartOfRBIandLBITest.java
@@ -18,7 +18,6 @@
  */
 package org.netbeans.modules.j2ee.ejbverification.rules;
 
-import static junit.framework.Assert.assertNotNull;
 import org.netbeans.modules.j2ee.ejbverification.HintTestBase;
 import org.netbeans.modules.j2ee.ejbverification.TestBase;
 import org.netbeans.modules.parsing.impl.indexing.RepositoryUpdater;
diff --git a/enterprise/j2ee.ejbverification/test/unit/src/org/netbeans/modules/j2ee/ejbverification/rules/BeanImplementsBITest.java b/enterprise/j2ee.ejbverification/test/unit/src/org/netbeans/modules/j2ee/ejbverification/rules/BeanImplementsBITest.java
index 9d86a21..3f6d599 100644
--- a/enterprise/j2ee.ejbverification/test/unit/src/org/netbeans/modules/j2ee/ejbverification/rules/BeanImplementsBITest.java
+++ b/enterprise/j2ee.ejbverification/test/unit/src/org/netbeans/modules/j2ee/ejbverification/rules/BeanImplementsBITest.java
@@ -18,7 +18,6 @@
  */
 package org.netbeans.modules.j2ee.ejbverification.rules;
 
-import static junit.framework.Assert.assertNotNull;
 import org.netbeans.modules.j2ee.ejbverification.HintTestBase;
 import org.netbeans.modules.j2ee.ejbverification.TestBase;
 import static org.netbeans.modules.j2ee.ejbverification.TestBase.copyStringToFileObject;
diff --git a/enterprise/j2ee.ejbverification/test/unit/src/org/netbeans/modules/j2ee/ejbverification/rules/BusinessMethodExposedTest.java b/enterprise/j2ee.ejbverification/test/unit/src/org/netbeans/modules/j2ee/ejbverification/rules/BusinessMethodExposedTest.java
index 76aea52..e3c79d5 100644
--- a/enterprise/j2ee.ejbverification/test/unit/src/org/netbeans/modules/j2ee/ejbverification/rules/BusinessMethodExposedTest.java
+++ b/enterprise/j2ee.ejbverification/test/unit/src/org/netbeans/modules/j2ee/ejbverification/rules/BusinessMethodExposedTest.java
@@ -18,7 +18,6 @@
  */
 package org.netbeans.modules.j2ee.ejbverification.rules;
 
-import static junit.framework.Assert.assertNotNull;
 import org.netbeans.modules.j2ee.ejbverification.HintTestBase;
 import org.netbeans.modules.j2ee.ejbverification.TestBase;
 import static org.netbeans.modules.j2ee.ejbverification.TestBase.copyStringToFileObject;
diff --git a/enterprise/j2ee.ejbverification/test/unit/src/org/netbeans/modules/j2ee/ejbverification/rules/HasNoArgContructorTest.java b/enterprise/j2ee.ejbverification/test/unit/src/org/netbeans/modules/j2ee/ejbverification/rules/HasNoArgContructorTest.java
index 7fb1b73..b5b4089 100644
--- a/enterprise/j2ee.ejbverification/test/unit/src/org/netbeans/modules/j2ee/ejbverification/rules/HasNoArgContructorTest.java
+++ b/enterprise/j2ee.ejbverification/test/unit/src/org/netbeans/modules/j2ee/ejbverification/rules/HasNoArgContructorTest.java
@@ -18,7 +18,6 @@
  */
 package org.netbeans.modules.j2ee.ejbverification.rules;
 
-import static junit.framework.Assert.assertNotNull;
 import org.netbeans.modules.j2ee.ejbverification.HintTestBase;
 import org.netbeans.modules.j2ee.ejbverification.TestBase;
 
diff --git a/enterprise/j2ee.ejbverification/test/unit/src/org/netbeans/modules/j2ee/ejbverification/rules/LegalModifiersTest.java b/enterprise/j2ee.ejbverification/test/unit/src/org/netbeans/modules/j2ee/ejbverification/rules/LegalModifiersTest.java
index bf034e4..c053132 100644
--- a/enterprise/j2ee.ejbverification/test/unit/src/org/netbeans/modules/j2ee/ejbverification/rules/LegalModifiersTest.java
+++ b/enterprise/j2ee.ejbverification/test/unit/src/org/netbeans/modules/j2ee/ejbverification/rules/LegalModifiersTest.java
@@ -18,7 +18,6 @@
  */
 package org.netbeans.modules.j2ee.ejbverification.rules;
 
-import static junit.framework.Assert.assertNotNull;
 import org.netbeans.modules.j2ee.ejbverification.HintTestBase;
 import org.netbeans.modules.j2ee.ejbverification.TestBase;
 
diff --git a/enterprise/j2ee.ejbverification/test/unit/src/org/netbeans/modules/j2ee/ejbverification/rules/LocalAnnotatedBeanHasLBITest.java b/enterprise/j2ee.ejbverification/test/unit/src/org/netbeans/modules/j2ee/ejbverification/rules/LocalAnnotatedBeanHasLBITest.java
index b2e8e42..c20996c 100644
--- a/enterprise/j2ee.ejbverification/test/unit/src/org/netbeans/modules/j2ee/ejbverification/rules/LocalAnnotatedBeanHasLBITest.java
+++ b/enterprise/j2ee.ejbverification/test/unit/src/org/netbeans/modules/j2ee/ejbverification/rules/LocalAnnotatedBeanHasLBITest.java
@@ -18,7 +18,6 @@
  */
 package org.netbeans.modules.j2ee.ejbverification.rules;
 
-import static junit.framework.Assert.assertNotNull;
 import org.netbeans.modules.j2ee.ejbverification.HintTestBase;
 import org.netbeans.modules.j2ee.ejbverification.TestBase;
 
diff --git a/enterprise/j2ee.ejbverification/test/unit/src/org/netbeans/modules/j2ee/ejbverification/rules/PersistentTimerInEjbLiteTest.java b/enterprise/j2ee.ejbverification/test/unit/src/org/netbeans/modules/j2ee/ejbverification/rules/PersistentTimerInEjbLiteTest.java
index 1b102d4..120458f 100644
--- a/enterprise/j2ee.ejbverification/test/unit/src/org/netbeans/modules/j2ee/ejbverification/rules/PersistentTimerInEjbLiteTest.java
+++ b/enterprise/j2ee.ejbverification/test/unit/src/org/netbeans/modules/j2ee/ejbverification/rules/PersistentTimerInEjbLiteTest.java
@@ -18,7 +18,6 @@
  */
 package org.netbeans.modules.j2ee.ejbverification.rules;
 
-import static junit.framework.Assert.assertNotNull;
 import org.netbeans.modules.j2ee.ejbverification.HintTestBase;
 import org.netbeans.modules.j2ee.ejbverification.TestBase;
 
diff --git a/enterprise/j2ee.ejbverification/test/unit/src/org/netbeans/modules/j2ee/ejbverification/rules/RemoteAnnotatedBeanHasRBITest.java b/enterprise/j2ee.ejbverification/test/unit/src/org/netbeans/modules/j2ee/ejbverification/rules/RemoteAnnotatedBeanHasRBITest.java
index 325e3e5..e99468b 100644
--- a/enterprise/j2ee.ejbverification/test/unit/src/org/netbeans/modules/j2ee/ejbverification/rules/RemoteAnnotatedBeanHasRBITest.java
+++ b/enterprise/j2ee.ejbverification/test/unit/src/org/netbeans/modules/j2ee/ejbverification/rules/RemoteAnnotatedBeanHasRBITest.java
@@ -18,7 +18,6 @@
  */
 package org.netbeans.modules.j2ee.ejbverification.rules;
 
-import static junit.framework.Assert.assertNotNull;
 import org.netbeans.modules.j2ee.ejbverification.HintTestBase;
 import org.netbeans.modules.j2ee.ejbverification.TestBase;
 
diff --git a/enterprise/j2ee.ejbverification/test/unit/src/org/netbeans/modules/j2ee/ejbverification/rules/SBSuperClassNotSBTest.java b/enterprise/j2ee.ejbverification/test/unit/src/org/netbeans/modules/j2ee/ejbverification/rules/SBSuperClassNotSBTest.java
index 4f5727c..f019600 100644
--- a/enterprise/j2ee.ejbverification/test/unit/src/org/netbeans/modules/j2ee/ejbverification/rules/SBSuperClassNotSBTest.java
+++ b/enterprise/j2ee.ejbverification/test/unit/src/org/netbeans/modules/j2ee/ejbverification/rules/SBSuperClassNotSBTest.java
@@ -18,7 +18,6 @@
  */
 package org.netbeans.modules.j2ee.ejbverification.rules;
 
-import static junit.framework.Assert.assertNotNull;
 import org.netbeans.modules.j2ee.ejbverification.HintTestBase;
 import org.netbeans.modules.j2ee.ejbverification.TestBase;
 import static org.netbeans.modules.j2ee.ejbverification.TestBase.copyStringToFileObject;
diff --git a/enterprise/j2ee.ejbverification/test/unit/src/org/netbeans/modules/j2ee/ejbverification/rules/SessionSynchImplementedBySFSBOnlyTest.java b/enterprise/j2ee.ejbverification/test/unit/src/org/netbeans/modules/j2ee/ejbverification/rules/SessionSynchImplementedBySFSBOnlyTest.java
index b60412f..8899ac7 100644
--- a/enterprise/j2ee.ejbverification/test/unit/src/org/netbeans/modules/j2ee/ejbverification/rules/SessionSynchImplementedBySFSBOnlyTest.java
+++ b/enterprise/j2ee.ejbverification/test/unit/src/org/netbeans/modules/j2ee/ejbverification/rules/SessionSynchImplementedBySFSBOnlyTest.java
@@ -18,7 +18,6 @@
  */
 package org.netbeans.modules.j2ee.ejbverification.rules;
 
-import static junit.framework.Assert.assertNotNull;
 import org.netbeans.modules.j2ee.ejbverification.EJBAPIAnnotations;
 import org.netbeans.modules.j2ee.ejbverification.HintTestBase;
 import org.netbeans.modules.j2ee.ejbverification.TestBase;
diff --git a/enterprise/j2ee.ejbverification/test/unit/src/org/netbeans/modules/j2ee/ejbverification/rules/ValueNotSpecifiedForRemoteAnnotationInterfaceTest.java b/enterprise/j2ee.ejbverification/test/unit/src/org/netbeans/modules/j2ee/ejbverification/rules/ValueNotSpecifiedForRemoteAnnotationInterfaceTest.java
index a3faa2a..b0542be 100644
--- a/enterprise/j2ee.ejbverification/test/unit/src/org/netbeans/modules/j2ee/ejbverification/rules/ValueNotSpecifiedForRemoteAnnotationInterfaceTest.java
+++ b/enterprise/j2ee.ejbverification/test/unit/src/org/netbeans/modules/j2ee/ejbverification/rules/ValueNotSpecifiedForRemoteAnnotationInterfaceTest.java
@@ -18,7 +18,6 @@
  */
 package org.netbeans.modules.j2ee.ejbverification.rules;
 
-import static junit.framework.Assert.assertNotNull;
 import org.netbeans.modules.j2ee.ejbverification.HintTestBase;
 import org.netbeans.modules.j2ee.ejbverification.TestBase;
 
diff --git a/enterprise/j2ee.ejbverification/test/unit/src/org/netbeans/modules/j2ee/ejbverification/rules/WSisSLSBTest.java b/enterprise/j2ee.ejbverification/test/unit/src/org/netbeans/modules/j2ee/ejbverification/rules/WSisSLSBTest.java
index 336373f..2ddf97c 100644
--- a/enterprise/j2ee.ejbverification/test/unit/src/org/netbeans/modules/j2ee/ejbverification/rules/WSisSLSBTest.java
+++ b/enterprise/j2ee.ejbverification/test/unit/src/org/netbeans/modules/j2ee/ejbverification/rules/WSisSLSBTest.java
@@ -18,7 +18,6 @@
  */
 package org.netbeans.modules.j2ee.ejbverification.rules;
 
-import static junit.framework.Assert.assertNotNull;
 import org.netbeans.modules.j2ee.ejbverification.HintTestBase;
 import org.netbeans.modules.j2ee.ejbverification.TestBase;
 
diff --git a/enterprise/maven.j2ee/test/unit/src/org/netbeans/modules/maven/j2ee/JavaEEProjectSettingsImplTest.java b/enterprise/maven.j2ee/test/unit/src/org/netbeans/modules/maven/j2ee/JavaEEProjectSettingsImplTest.java
index f6b61b3..ec42268 100644
--- a/enterprise/maven.j2ee/test/unit/src/org/netbeans/modules/maven/j2ee/JavaEEProjectSettingsImplTest.java
+++ b/enterprise/maven.j2ee/test/unit/src/org/netbeans/modules/maven/j2ee/JavaEEProjectSettingsImplTest.java
@@ -18,7 +18,6 @@
  */
 package org.netbeans.modules.maven.j2ee;
 
-import static junit.framework.Assert.assertEquals;
 import org.netbeans.api.j2ee.core.Profile;
 import org.netbeans.api.project.Project;
 import org.netbeans.modules.javaee.project.api.JavaEEProjectSettings;
diff --git a/enterprise/maven.j2ee/test/unit/src/org/netbeans/modules/maven/j2ee/web/WebModuleImplTest.java b/enterprise/maven.j2ee/test/unit/src/org/netbeans/modules/maven/j2ee/web/WebModuleImplTest.java
index 7ef3735..8800f0f 100644
--- a/enterprise/maven.j2ee/test/unit/src/org/netbeans/modules/maven/j2ee/web/WebModuleImplTest.java
+++ b/enterprise/maven.j2ee/test/unit/src/org/netbeans/modules/maven/j2ee/web/WebModuleImplTest.java
@@ -19,7 +19,6 @@
 package org.netbeans.modules.maven.j2ee.web;
 
 import java.io.IOException;
-import static junit.framework.Assert.assertEquals;
 import org.netbeans.api.j2ee.core.Profile;
 import org.netbeans.modules.javaee.project.api.JavaEEProjectSettings;
 import org.netbeans.modules.maven.j2ee.JavaEEMavenTestBase;
diff --git a/enterprise/micronaut/nbproject/project.xml b/enterprise/micronaut/nbproject/project.xml
index e548c58..b6fbd84 100644
--- a/enterprise/micronaut/nbproject/project.xml
+++ b/enterprise/micronaut/nbproject/project.xml
@@ -74,7 +74,7 @@
                     <compile-dependency/>
                     <run-dependency>
                         <release-version>2</release-version>
-                        <specification-version>2.154</specification-version>
+                        <specification-version>2.156</specification-version>
                     </run-dependency>
                 </dependency>
                 <dependency>
diff --git a/enterprise/micronaut/src/org/netbeans/modules/micronaut/resources/layer.xml b/enterprise/micronaut/src/org/netbeans/modules/micronaut/resources/layer.xml
index c69d3bb..e542a83 100644
--- a/enterprise/micronaut/src/org/netbeans/modules/micronaut/resources/layer.xml
+++ b/enterprise/micronaut/src/org/netbeans/modules/micronaut/resources/layer.xml
@@ -59,6 +59,14 @@
                     </file>
                 </folder>
             </folder>
+            <folder name="LifecycleParticipants">
+                <folder name="org.graalvm.buildtools.maven.NativeExtension">
+                    <attr name="ignoreOnModelLoad" boolvalue="true"/>
+                </folder>
+                <folder name="io.micronaut.build.testresources.TestResourcesLifecycleExtension">
+                    <attr name="ignoreOnModelLoad" boolvalue="true"/>
+                </folder>
+            </folder>
         </folder>
     </folder>
     <folder name="Templates">
diff --git a/enterprise/performance.scripting/test/qa-functional/src/org/netbeans/performance/languages/actions/CountingSecurityManager.java b/enterprise/performance.scripting/test/qa-functional/src/org/netbeans/performance/languages/actions/CountingSecurityManager.java
index b3a387c..fdab7ff 100644
--- a/enterprise/performance.scripting/test/qa-functional/src/org/netbeans/performance/languages/actions/CountingSecurityManager.java
+++ b/enterprise/performance.scripting/test/qa-functional/src/org/netbeans/performance/languages/actions/CountingSecurityManager.java
@@ -31,7 +31,7 @@
 import java.util.Map;
 import java.util.TreeSet;
 import java.util.concurrent.atomic.AtomicLong;
-import junit.framework.Assert;
+import org.junit.Assert;
 import org.openide.util.Exceptions;
 
 /**
diff --git a/enterprise/profiler.j2ee/test/unit/src/org/netbeans/modules/profiler/categories/j2ee/TestUtilities.java b/enterprise/profiler.j2ee/test/unit/src/org/netbeans/modules/profiler/categories/j2ee/TestUtilities.java
index 832de79..553159f 100644
--- a/enterprise/profiler.j2ee/test/unit/src/org/netbeans/modules/profiler/categories/j2ee/TestUtilities.java
+++ b/enterprise/profiler.j2ee/test/unit/src/org/netbeans/modules/profiler/categories/j2ee/TestUtilities.java
@@ -25,9 +25,7 @@
 import java.io.InputStream;
 import java.io.OutputStream;
 import java.nio.charset.StandardCharsets;
-
-import junit.framework.Assert;
-
+import org.junit.Assert;
 import org.netbeans.api.editor.mimelookup.MimePath;
 import org.netbeans.modules.java.source.indexing.JavaCustomIndexer;
 import org.netbeans.modules.java.source.parsing.ClassParser;
diff --git a/enterprise/web.core.syntax/test/qa-functional/src/org/netbeans/test/syntax/CompletionSanityTest.java b/enterprise/web.core.syntax/test/qa-functional/src/org/netbeans/test/syntax/CompletionSanityTest.java
index 740cd3b..df9b313 100644
--- a/enterprise/web.core.syntax/test/qa-functional/src/org/netbeans/test/syntax/CompletionSanityTest.java
+++ b/enterprise/web.core.syntax/test/qa-functional/src/org/netbeans/test/syntax/CompletionSanityTest.java
@@ -20,7 +20,6 @@
 
 import java.awt.event.InputEvent;
 import java.awt.event.KeyEvent;
-import static junit.framework.Assert.assertEquals;
 import junit.framework.Test;
 import org.netbeans.jellytools.EditorOperator;
 import org.netbeans.jellytools.modules.editor.CompletionJListOperator;
diff --git a/enterprise/web.core.syntax/test/qa-functional/src/org/netbeans/test/syntax/CompletionTagSanityTest.java b/enterprise/web.core.syntax/test/qa-functional/src/org/netbeans/test/syntax/CompletionTagSanityTest.java
index ff3fcdd..4eac185 100644
--- a/enterprise/web.core.syntax/test/qa-functional/src/org/netbeans/test/syntax/CompletionTagSanityTest.java
+++ b/enterprise/web.core.syntax/test/qa-functional/src/org/netbeans/test/syntax/CompletionTagSanityTest.java
@@ -20,7 +20,6 @@
 
 import java.awt.event.InputEvent;
 import java.awt.event.KeyEvent;
-import static junit.framework.Assert.assertEquals;
 import junit.framework.Test;
 import org.netbeans.jellytools.EditorOperator;
 import org.netbeans.jellytools.modules.editor.CompletionJListOperator;
diff --git a/enterprise/web.core.syntax/test/qa-functional/src/org/netbeans/test/syntax/ExpressionLang30Test.java b/enterprise/web.core.syntax/test/qa-functional/src/org/netbeans/test/syntax/ExpressionLang30Test.java
index e01eb93..c770f21 100644
--- a/enterprise/web.core.syntax/test/qa-functional/src/org/netbeans/test/syntax/ExpressionLang30Test.java
+++ b/enterprise/web.core.syntax/test/qa-functional/src/org/netbeans/test/syntax/ExpressionLang30Test.java
@@ -19,8 +19,6 @@
 package org.netbeans.test.syntax;
 
 import java.awt.event.InputEvent;
-import static junit.framework.Assert.assertEquals;
-import static junit.framework.Assert.assertTrue;
 import junit.framework.Test;
 import org.netbeans.jellytools.EditorOperator;
 import org.netbeans.jellytools.modules.editor.CompletionJListOperator;
diff --git a/enterprise/web.core.syntax/test/qa-functional/src/org/netbeans/test/syntax/GeneralJSP.java b/enterprise/web.core.syntax/test/qa-functional/src/org/netbeans/test/syntax/GeneralJSP.java
index c31cd21..c5514fb 100644
--- a/enterprise/web.core.syntax/test/qa-functional/src/org/netbeans/test/syntax/GeneralJSP.java
+++ b/enterprise/web.core.syntax/test/qa-functional/src/org/netbeans/test/syntax/GeneralJSP.java
@@ -25,7 +25,6 @@
 import java.util.Set;
 import java.util.logging.Level;
 import java.util.logging.Logger;
-import static junit.framework.Assert.fail;
 import org.netbeans.jellytools.EditorOperator;
 import org.netbeans.jellytools.ProjectsTabOperator;
 import org.netbeans.jellytools.modules.editor.CompletionJListOperator;
diff --git a/enterprise/web.core.syntax/test/unit/src/org/netbeans/modules/web/core/syntax/JspKitTest.java b/enterprise/web.core.syntax/test/unit/src/org/netbeans/modules/web/core/syntax/JspKitTest.java
index e2975ba..3fc8e7c 100644
--- a/enterprise/web.core.syntax/test/unit/src/org/netbeans/modules/web/core/syntax/JspKitTest.java
+++ b/enterprise/web.core.syntax/test/unit/src/org/netbeans/modules/web/core/syntax/JspKitTest.java
@@ -20,7 +20,7 @@
 package org.netbeans.modules.web.core.syntax;
 
 import javax.swing.text.EditorKit;
-import junit.framework.Assert;
+import org.junit.Assert;
 import org.junit.Test;
 import org.netbeans.api.editor.mimelookup.MimeLookup;
 import org.netbeans.api.editor.mimelookup.MimePath;
diff --git a/enterprise/web.core/test/unit/src/org/netbeans/modules/web/core/test/TestUtil.java b/enterprise/web.core/test/unit/src/org/netbeans/modules/web/core/test/TestUtil.java
index df43123..f170c95 100644
--- a/enterprise/web.core/test/unit/src/org/netbeans/modules/web/core/test/TestUtil.java
+++ b/enterprise/web.core/test/unit/src/org/netbeans/modules/web/core/test/TestUtil.java
@@ -35,7 +35,7 @@
 import java.util.WeakHashMap;
 import java.util.zip.ZipEntry;
 import java.util.zip.ZipInputStream;
-import junit.framework.Assert;
+import org.junit.Assert;
 import org.netbeans.api.project.Project;
 import org.netbeans.junit.NbTestCase;
 import org.netbeans.modules.j2ee.deployment.impl.ServerRegistry;
diff --git a/enterprise/web.el/test/unit/src/org/netbeans/modules/web/el/ELTestBase.java b/enterprise/web.el/test/unit/src/org/netbeans/modules/web/el/ELTestBase.java
index a8e623c..96e931a 100644
--- a/enterprise/web.el/test/unit/src/org/netbeans/modules/web/el/ELTestBase.java
+++ b/enterprise/web.el/test/unit/src/org/netbeans/modules/web/el/ELTestBase.java
@@ -60,8 +60,6 @@
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
-import static junit.framework.Assert.assertNotNull;
-import static junit.framework.Assert.assertTrue;
 import org.netbeans.api.j2ee.core.Profile;
 import org.netbeans.api.java.classpath.ClassPath;
 import org.netbeans.modules.csl.api.CodeCompletionContext;
diff --git a/enterprise/web.jsf.editor/test/unit/src/org/netbeans/modules/web/jsf/editor/TestBase.java b/enterprise/web.jsf.editor/test/unit/src/org/netbeans/modules/web/jsf/editor/TestBase.java
index 0e478a6..609dab4 100644
--- a/enterprise/web.jsf.editor/test/unit/src/org/netbeans/modules/web/jsf/editor/TestBase.java
+++ b/enterprise/web.jsf.editor/test/unit/src/org/netbeans/modules/web/jsf/editor/TestBase.java
@@ -61,7 +61,6 @@
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
-import static junit.framework.Assert.assertNotNull;
 import org.netbeans.api.j2ee.core.Profile;
 import org.netbeans.api.java.classpath.ClassPath;
 import org.netbeans.api.xml.services.UserCatalog;
diff --git a/enterprise/web.jsf.editor/test/unit/src/org/netbeans/modules/web/jsf/editor/TestBaseForTestProject.java b/enterprise/web.jsf.editor/test/unit/src/org/netbeans/modules/web/jsf/editor/TestBaseForTestProject.java
index 977b2de..5d4b428 100644
--- a/enterprise/web.jsf.editor/test/unit/src/org/netbeans/modules/web/jsf/editor/TestBaseForTestProject.java
+++ b/enterprise/web.jsf.editor/test/unit/src/org/netbeans/modules/web/jsf/editor/TestBaseForTestProject.java
@@ -24,7 +24,6 @@
 import java.util.Map;
 import java.util.logging.Level;
 import java.util.logging.Logger;
-import static junit.framework.Assert.assertNotNull;
 import org.netbeans.api.java.classpath.ClassPath;
 import org.netbeans.api.project.Project;
 import org.netbeans.api.project.Sources;
diff --git a/enterprise/web.jsf.editor/test/unit/src/org/netbeans/modules/web/jsf/editor/el/JsfVariablesModelTest.java b/enterprise/web.jsf.editor/test/unit/src/org/netbeans/modules/web/jsf/editor/el/JsfVariablesModelTest.java
index 1e60e3c..99fa282 100644
--- a/enterprise/web.jsf.editor/test/unit/src/org/netbeans/modules/web/jsf/editor/el/JsfVariablesModelTest.java
+++ b/enterprise/web.jsf.editor/test/unit/src/org/netbeans/modules/web/jsf/editor/el/JsfVariablesModelTest.java
@@ -20,7 +20,6 @@
 
 import java.util.Iterator;
 import java.util.SortedSet;
-import static junit.framework.Assert.assertNotNull;
 import org.netbeans.modules.parsing.api.ParserManager;
 import org.netbeans.modules.parsing.api.ResultIterator;
 import org.netbeans.modules.parsing.api.UserTask;
diff --git a/enterprise/web.jsf.editor/test/unit/src/org/netbeans/modules/web/jsf/editor/facelets/FaceletsLibrarySupportTest.java b/enterprise/web.jsf.editor/test/unit/src/org/netbeans/modules/web/jsf/editor/facelets/FaceletsLibrarySupportTest.java
index 81f0d9f..13f92d8 100644
--- a/enterprise/web.jsf.editor/test/unit/src/org/netbeans/modules/web/jsf/editor/facelets/FaceletsLibrarySupportTest.java
+++ b/enterprise/web.jsf.editor/test/unit/src/org/netbeans/modules/web/jsf/editor/facelets/FaceletsLibrarySupportTest.java
@@ -23,7 +23,6 @@
 import java.util.logging.ConsoleHandler;
 import java.util.logging.Handler;
 import java.util.logging.Level;
-import static junit.framework.Assert.assertNotNull;
 import junit.framework.Test;
 import junit.framework.TestSuite;
 import org.netbeans.modules.web.jsf.editor.JsfSupportImpl;
diff --git a/enterprise/web.jsf.editor/test/unit/src/org/netbeans/modules/web/jsf/editor/index/ResourcesMappingModelTest.java b/enterprise/web.jsf.editor/test/unit/src/org/netbeans/modules/web/jsf/editor/index/ResourcesMappingModelTest.java
index c1a07b9..83be08c 100644
--- a/enterprise/web.jsf.editor/test/unit/src/org/netbeans/modules/web/jsf/editor/index/ResourcesMappingModelTest.java
+++ b/enterprise/web.jsf.editor/test/unit/src/org/netbeans/modules/web/jsf/editor/index/ResourcesMappingModelTest.java
@@ -20,8 +20,6 @@
 
 import java.util.ArrayList;
 import java.util.List;
-import static junit.framework.Assert.assertFalse;
-import static junit.framework.Assert.assertTrue;
 import org.junit.Test;
 import org.netbeans.junit.NbTestCase;
 import org.netbeans.modules.web.jsf.editor.index.ResourcesMappingModel.Resource;
diff --git a/enterprise/web.jsf.navigation/test/unit/src/org/netbeans/modules/web/jsf/navigation/TestUtilities.java b/enterprise/web.jsf.navigation/test/unit/src/org/netbeans/modules/web/jsf/navigation/TestUtilities.java
index 83de9e6..df2eddb 100644
--- a/enterprise/web.jsf.navigation/test/unit/src/org/netbeans/modules/web/jsf/navigation/TestUtilities.java
+++ b/enterprise/web.jsf.navigation/test/unit/src/org/netbeans/modules/web/jsf/navigation/TestUtilities.java
@@ -20,7 +20,7 @@
 
 
 import java.io.File;
-import junit.framework.Assert;
+import org.junit.Assert;
 import org.netbeans.api.editor.mimelookup.MimePath;
 import org.netbeans.modules.java.source.indexing.JavaCustomIndexer;
 import org.netbeans.modules.java.source.parsing.ClassParser;
diff --git a/enterprise/web.jsf/test/unit/src/org/netbeans/modules/web/jsf/metamodel/CommonTestCase.java b/enterprise/web.jsf/test/unit/src/org/netbeans/modules/web/jsf/metamodel/CommonTestCase.java
index cfbab26..3f2c9ad 100644
--- a/enterprise/web.jsf/test/unit/src/org/netbeans/modules/web/jsf/metamodel/CommonTestCase.java
+++ b/enterprise/web.jsf/test/unit/src/org/netbeans/modules/web/jsf/metamodel/CommonTestCase.java
@@ -27,9 +27,7 @@
 import java.util.Map;
 import javax.swing.Icon;
 import javax.swing.event.ChangeListener;
-import static junit.framework.Assert.assertNotNull;
 import org.netbeans.api.j2ee.core.Profile;
-
 import org.netbeans.api.java.classpath.ClassPath;
 import org.netbeans.api.project.FileOwnerQuery;
 import org.netbeans.api.project.Project;
diff --git a/enterprise/web.jsf/test/unit/src/org/netbeans/modules/web/jsf/xdm/model/ElementOrderingTest.java b/enterprise/web.jsf/test/unit/src/org/netbeans/modules/web/jsf/xdm/model/ElementOrderingTest.java
index c0a7962..59f77a1 100644
--- a/enterprise/web.jsf/test/unit/src/org/netbeans/modules/web/jsf/xdm/model/ElementOrderingTest.java
+++ b/enterprise/web.jsf/test/unit/src/org/netbeans/modules/web/jsf/xdm/model/ElementOrderingTest.java
@@ -22,9 +22,6 @@
 import java.util.List;
 import java.util.logging.Level;
 import java.util.logging.Logger;
-import static junit.framework.Assert.assertEquals;
-import static junit.framework.Assert.assertNull;
-
 import org.netbeans.junit.NbTestCase;
 import org.netbeans.modules.web.jsf.api.facesmodel.Application;
 import org.netbeans.modules.web.jsf.api.facesmodel.Clazz;
diff --git a/enterprise/web.jspparser/test/unit/src/org/netbeans/modules/web/jspparser/TestUtil.java b/enterprise/web.jspparser/test/unit/src/org/netbeans/modules/web/jspparser/TestUtil.java
index 64b71ec..b9e6788 100644
--- a/enterprise/web.jspparser/test/unit/src/org/netbeans/modules/web/jspparser/TestUtil.java
+++ b/enterprise/web.jspparser/test/unit/src/org/netbeans/modules/web/jspparser/TestUtil.java
@@ -33,7 +33,7 @@
 import java.util.logging.Logger;
 import java.util.zip.ZipEntry;
 import java.util.zip.ZipFile;
-import junit.framework.Assert;
+import org.junit.Assert;
 import org.netbeans.api.project.Project;
 import org.netbeans.api.project.ProjectManager;
 import org.netbeans.junit.NbTestCase;
diff --git a/enterprise/web.project/test/unit/src/org/netbeans/modules/web/project/WebProjectTest.java b/enterprise/web.project/test/unit/src/org/netbeans/modules/web/project/WebProjectTest.java
index 31e1a81..d007888 100644
--- a/enterprise/web.project/test/unit/src/org/netbeans/modules/web/project/WebProjectTest.java
+++ b/enterprise/web.project/test/unit/src/org/netbeans/modules/web/project/WebProjectTest.java
@@ -20,7 +20,6 @@
 package org.netbeans.modules.web.project;
 
 import java.io.File;
-import static junit.framework.Assert.assertEquals;
 import org.netbeans.api.j2ee.core.Profile;
 import org.netbeans.api.project.Project;
 import org.netbeans.api.project.ProjectManager;
@@ -29,7 +28,6 @@
 import org.netbeans.modules.j2ee.deployment.devmodules.api.J2eeModule;
 import org.netbeans.modules.project.uiapi.ProjectOpenedTrampoline;
 import org.netbeans.modules.web.project.api.WebPropertyEvaluator;
-import org.netbeans.modules.web.project.test.TestUtil;
 import org.netbeans.spi.project.ui.ProjectOpenedHook;
 import org.openide.filesystems.FileObject;
 import org.openide.filesystems.FileUtil;
diff --git a/enterprise/web.project/test/unit/src/org/netbeans/modules/web/project/test/TestUtil.java b/enterprise/web.project/test/unit/src/org/netbeans/modules/web/project/test/TestUtil.java
index 5478ee3..982a45d 100644
--- a/enterprise/web.project/test/unit/src/org/netbeans/modules/web/project/test/TestUtil.java
+++ b/enterprise/web.project/test/unit/src/org/netbeans/modules/web/project/test/TestUtil.java
@@ -36,7 +36,7 @@
 import java.util.WeakHashMap;
 import java.util.zip.ZipEntry;
 import java.util.zip.ZipInputStream;
-import junit.framework.Assert;
+import org.junit.Assert;
 import org.netbeans.api.editor.mimelookup.MimePath;
 import org.netbeans.api.project.Project;
 import org.netbeans.junit.NbTestCase;
@@ -47,7 +47,6 @@
 import org.netbeans.spi.editor.mimelookup.MimeDataProvider;
 import org.netbeans.spi.project.ProjectFactory;
 import org.netbeans.spi.project.ProjectState;
-import org.netbeans.spi.project.support.ant.AntBasedProjectType;
 import org.netbeans.spi.project.support.ant.AntProjectHelper;
 import org.netbeans.spi.project.support.ant.EditableProperties;
 import org.openide.filesystems.FileLock;
diff --git a/enterprise/websvc.design/test/unit/src/org/netbeans/modules/websvc/design/javamodel/SourceUtilsTestUtil.java b/enterprise/websvc.design/test/unit/src/org/netbeans/modules/websvc/design/javamodel/SourceUtilsTestUtil.java
index 4b58852..169d1c4 100644
--- a/enterprise/websvc.design/test/unit/src/org/netbeans/modules/websvc/design/javamodel/SourceUtilsTestUtil.java
+++ b/enterprise/websvc.design/test/unit/src/org/netbeans/modules/websvc/design/javamodel/SourceUtilsTestUtil.java
@@ -25,7 +25,7 @@
 import java.util.Collections;
 import java.util.LinkedList;
 import java.util.List;
-import junit.framework.Assert;
+import org.junit.Assert;
 import org.netbeans.modules.parsing.api.indexing.IndexingManager;
 import org.openide.filesystems.FileObject;
 import org.openide.filesystems.FileSystem;
diff --git a/enterprise/websvc.rest/test/unit/src/org/netbeans/modules/websvc/rest/codegen/TestBase.java b/enterprise/websvc.rest/test/unit/src/org/netbeans/modules/websvc/rest/codegen/TestBase.java
index 5370afc..e855974 100644
--- a/enterprise/websvc.rest/test/unit/src/org/netbeans/modules/websvc/rest/codegen/TestBase.java
+++ b/enterprise/websvc.rest/test/unit/src/org/netbeans/modules/websvc/rest/codegen/TestBase.java
@@ -25,7 +25,6 @@
 import java.util.Collections;
 import java.util.List;
 import javax.persistence.Entity;
-import junit.framework.Assert;
 import org.netbeans.api.java.classpath.ClassPath;
 import org.netbeans.api.java.source.ClasspathInfo;
 import org.netbeans.api.java.source.JavaSource;
@@ -105,13 +104,13 @@
             URL url = Thread.currentThread().getContextClassLoader().getResource(
                     "org/netbeans/modules/websvc/rest/resources/layer.xml");
             URL url2 = TestBase.class.getResource("layer.xml"); 
-            Assert.assertNotNull(url);
-            Assert.assertNotNull(url2);
+            assertNotNull(url);
+            assertNotNull(url2);
             try {
                 xmlFS.setXmlUrls(new URL[] { url, url2 });
             } catch(Exception e) {
                 e.printStackTrace();
-                Assert.fail(e.getMessage());
+                fail(e.getMessage());
             }
             FileSystem system = new MultiFileSystem(new FileSystem[] {FileUtil.createMemoryFileSystem(), xmlFS});
             defaultRepository = new Repository(system);
diff --git a/harness/nbjunit/src/org/netbeans/junit/ControlFlow.java b/harness/nbjunit/src/org/netbeans/junit/ControlFlow.java
index e8bc035..6b1323f 100644
--- a/harness/nbjunit/src/org/netbeans/junit/ControlFlow.java
+++ b/harness/nbjunit/src/org/netbeans/junit/ControlFlow.java
@@ -32,7 +32,7 @@
 import java.util.logging.LogRecord;
 import java.util.logging.Logger;
 import java.util.regex.Pattern;
-import junit.framework.Assert;
+import org.junit.Assert;
 
 /** Basic skeleton for logging test case.
  *
diff --git a/harness/nbjunit/src/org/netbeans/junit/Log.java b/harness/nbjunit/src/org/netbeans/junit/Log.java
index 454347f..8964a56 100644
--- a/harness/nbjunit/src/org/netbeans/junit/Log.java
+++ b/harness/nbjunit/src/org/netbeans/junit/Log.java
@@ -41,8 +41,8 @@
 import java.util.logging.LogManager;
 import java.util.logging.LogRecord;
 import java.util.logging.Logger;
-import junit.framework.Assert;
 import junit.framework.AssertionFailedError;
+import static junit.framework.TestCase.fail;
 import org.netbeans.junit.internal.NbModuleLogHandler;
 
 /** Collects log messages.
@@ -420,7 +420,7 @@
             }
 
             if (count == 0) {
-                Assert.fail("No instance of this type reported");
+                fail("No instance of this type reported");
             }
             
             for (int i = 0; i < count; i++) {
diff --git a/harness/nbjunit/src/org/netbeans/junit/NbModuleSuite.java b/harness/nbjunit/src/org/netbeans/junit/NbModuleSuite.java
index 2abfe13..47ad32a 100644
--- a/harness/nbjunit/src/org/netbeans/junit/NbModuleSuite.java
+++ b/harness/nbjunit/src/org/netbeans/junit/NbModuleSuite.java
@@ -54,13 +54,13 @@
 import java.util.regex.Pattern;
 import javax.swing.JFrame;
 import javax.swing.SwingUtilities;
-import junit.framework.Assert;
 import junit.framework.AssertionFailedError;
 import junit.framework.Protectable;
 import junit.framework.Test;
 import junit.framework.TestCase;
 import junit.framework.TestFailure;
 import junit.framework.TestResult;
+import org.junit.Assert;
 import org.netbeans.junit.internal.NbModuleLogHandler;
 
 /**
diff --git a/harness/nbjunit/src/org/netbeans/junit/diff/Diff.java b/harness/nbjunit/src/org/netbeans/junit/diff/Diff.java
index 797085a..6c18827 100644
--- a/harness/nbjunit/src/org/netbeans/junit/diff/Diff.java
+++ b/harness/nbjunit/src/org/netbeans/junit/diff/Diff.java
@@ -36,7 +36,7 @@
  *
  * @author Jan Becicka
  * @version 0.1
- * @see junit.framework.Assert Assert class
+ * @see org.junit.Assert Assert class
  */
 public interface Diff {
     
diff --git a/harness/nbjunit/test/unit/src/org/netbeans/junit/OrderAZTest.java b/harness/nbjunit/test/unit/src/org/netbeans/junit/OrderAZTest.java
index 412b908..569a8b1 100644
--- a/harness/nbjunit/test/unit/src/org/netbeans/junit/OrderAZTest.java
+++ b/harness/nbjunit/test/unit/src/org/netbeans/junit/OrderAZTest.java
@@ -19,9 +19,9 @@
 package org.netbeans.junit;
 
 import java.lang.reflect.Method;
-import junit.framework.Assert;
 import junit.framework.TestResult;
 import junit.framework.TestSuite;
+import org.junit.Assert;
 import org.junit.Test;
 
 /** Check the a-z behaviour.
diff --git a/harness/nbjunit/test/unit/src/org/netbeans/junit/OrderTest.java b/harness/nbjunit/test/unit/src/org/netbeans/junit/OrderTest.java
index f12a40e..97d5f0b 100644
--- a/harness/nbjunit/test/unit/src/org/netbeans/junit/OrderTest.java
+++ b/harness/nbjunit/test/unit/src/org/netbeans/junit/OrderTest.java
@@ -19,9 +19,9 @@
 package org.netbeans.junit;
 
 import java.lang.reflect.Method;
-import junit.framework.Assert;
 import junit.framework.TestResult;
 import junit.framework.TestSuite;
+import org.junit.Assert;
 import org.junit.Test;
 
 /** Check the shuffle behaviour.
diff --git a/harness/nbjunit/test/unit/src/org/netbeans/junit/OrderZATest.java b/harness/nbjunit/test/unit/src/org/netbeans/junit/OrderZATest.java
index 61a5bda..a11bde5 100644
--- a/harness/nbjunit/test/unit/src/org/netbeans/junit/OrderZATest.java
+++ b/harness/nbjunit/test/unit/src/org/netbeans/junit/OrderZATest.java
@@ -19,9 +19,9 @@
 package org.netbeans.junit;
 
 import java.lang.reflect.Method;
-import junit.framework.Assert;
 import junit.framework.TestResult;
 import junit.framework.TestSuite;
+import org.junit.Assert;
 import org.junit.Test;
 
 /** Check the z-a behaviour.
diff --git a/ide/bugtracking/test/unit/src/org/netbeans/modules/bugtracking/api/IssueTest.java b/ide/bugtracking/test/unit/src/org/netbeans/modules/bugtracking/api/IssueTest.java
index 5bebc46..b96bbab 100644
--- a/ide/bugtracking/test/unit/src/org/netbeans/modules/bugtracking/api/IssueTest.java
+++ b/ide/bugtracking/test/unit/src/org/netbeans/modules/bugtracking/api/IssueTest.java
@@ -23,9 +23,6 @@
 import java.beans.PropertyChangeListener;
 import java.io.File;
 import java.util.logging.Level;
-import static junit.framework.Assert.assertEquals;
-import static junit.framework.Assert.assertFalse;
-import static junit.framework.Assert.assertNull;
 import org.netbeans.junit.NbTestCase;
 import org.netbeans.modules.bugtracking.APIAccessor;
 import org.netbeans.modules.bugtracking.IssueImpl;
diff --git a/ide/bugtracking/test/unit/src/org/netbeans/modules/bugtracking/api/QueryTest.java b/ide/bugtracking/test/unit/src/org/netbeans/modules/bugtracking/api/QueryTest.java
index e672476..66feade 100644
--- a/ide/bugtracking/test/unit/src/org/netbeans/modules/bugtracking/api/QueryTest.java
+++ b/ide/bugtracking/test/unit/src/org/netbeans/modules/bugtracking/api/QueryTest.java
@@ -22,11 +22,6 @@
 import java.beans.PropertyChangeEvent;
 import java.beans.PropertyChangeListener;
 import java.util.logging.Level;
-import static junit.framework.Assert.assertEquals;
-import static junit.framework.Assert.assertFalse;
-import static junit.framework.Assert.assertNotNull;
-import static junit.framework.Assert.assertTrue;
-import static junit.framework.Assert.fail;
 import org.netbeans.junit.NbTestCase;
 import org.netbeans.modules.bugtracking.APIAccessor;
 import org.netbeans.modules.bugtracking.ui.query.QueryTopComponent;
diff --git a/ide/bugtracking/test/unit/src/org/netbeans/modules/bugtracking/api/RepositoryManagerTest.java b/ide/bugtracking/test/unit/src/org/netbeans/modules/bugtracking/api/RepositoryManagerTest.java
index f0f7a5c..d0da06b 100644
--- a/ide/bugtracking/test/unit/src/org/netbeans/modules/bugtracking/api/RepositoryManagerTest.java
+++ b/ide/bugtracking/test/unit/src/org/netbeans/modules/bugtracking/api/RepositoryManagerTest.java
@@ -25,7 +25,6 @@
 import java.util.LinkedList;
 import java.util.List;
 import java.util.logging.Level;
-import static junit.framework.Assert.assertTrue;
 import org.netbeans.junit.NbTestCase;
 import org.netbeans.modules.bugtracking.BugtrackingManager;
 import org.netbeans.modules.bugtracking.DelegatingConnector;
diff --git a/ide/bugtracking/test/unit/src/org/netbeans/modules/bugtracking/api/RepositoryTest.java b/ide/bugtracking/test/unit/src/org/netbeans/modules/bugtracking/api/RepositoryTest.java
index 81903e2..2fc8658 100644
--- a/ide/bugtracking/test/unit/src/org/netbeans/modules/bugtracking/api/RepositoryTest.java
+++ b/ide/bugtracking/test/unit/src/org/netbeans/modules/bugtracking/api/RepositoryTest.java
@@ -24,7 +24,6 @@
 import java.io.IOException;
 import java.util.Map;
 import java.util.logging.Level;
-import static junit.framework.Assert.assertTrue;
 import org.netbeans.junit.NbTestCase;
 import org.netbeans.junit.NbTestSuite;
 import org.netbeans.modules.bugtracking.RepositoryImpl;
diff --git a/ide/bugtracking/test/unit/src/org/netbeans/modules/bugtracking/api/UtilTestCase.java b/ide/bugtracking/test/unit/src/org/netbeans/modules/bugtracking/api/UtilTestCase.java
index 46317c3..0a49575 100644
--- a/ide/bugtracking/test/unit/src/org/netbeans/modules/bugtracking/api/UtilTestCase.java
+++ b/ide/bugtracking/test/unit/src/org/netbeans/modules/bugtracking/api/UtilTestCase.java
@@ -21,10 +21,6 @@
 
 import java.util.Set;
 import java.util.logging.Level;
-import static junit.framework.Assert.assertFalse;
-import static junit.framework.Assert.assertNotNull;
-import static junit.framework.Assert.assertNull;
-import static junit.framework.Assert.fail;
 import org.netbeans.junit.NbTestCase;
 import org.netbeans.modules.bugtracking.APIAccessor;
 import org.netbeans.modules.bugtracking.IssueImpl;
diff --git a/ide/bugtracking/test/unit/src/org/netbeans/modules/bugtracking/spi/SchedulingPickerTest.java b/ide/bugtracking/test/unit/src/org/netbeans/modules/bugtracking/spi/SchedulingPickerTest.java
index bcf40a6..cca90db 100644
--- a/ide/bugtracking/test/unit/src/org/netbeans/modules/bugtracking/spi/SchedulingPickerTest.java
+++ b/ide/bugtracking/test/unit/src/org/netbeans/modules/bugtracking/spi/SchedulingPickerTest.java
@@ -20,7 +20,7 @@
 package org.netbeans.modules.bugtracking.spi;
 
 import java.util.Date;
-import junit.framework.Assert;
+import org.junit.Assert;
 import org.junit.Test;
 
 /**
diff --git a/ide/bugtracking/test/unit/src/org/netbeans/modules/bugtracking/tasks/cache/DashboardStorageTest.java b/ide/bugtracking/test/unit/src/org/netbeans/modules/bugtracking/tasks/cache/DashboardStorageTest.java
index bd9eb13..39a7936 100644
--- a/ide/bugtracking/test/unit/src/org/netbeans/modules/bugtracking/tasks/cache/DashboardStorageTest.java
+++ b/ide/bugtracking/test/unit/src/org/netbeans/modules/bugtracking/tasks/cache/DashboardStorageTest.java
@@ -26,11 +26,6 @@
 import java.util.Collections;
 import java.util.List;
 import java.util.logging.Level;
-import static junit.framework.Assert.assertEquals;
-import static junit.framework.Assert.assertFalse;
-import static junit.framework.Assert.assertNotNull;
-import static junit.framework.Assert.assertNull;
-import static junit.framework.Assert.assertTrue;
 import org.netbeans.junit.NbTestCase;
 
 /**
diff --git a/ide/bugzilla/test/unit/src/org/netbeans/modules/bugzilla/MylynStorageTest.java b/ide/bugzilla/test/unit/src/org/netbeans/modules/bugzilla/MylynStorageTest.java
index 241a3f8..5514f04 100644
--- a/ide/bugzilla/test/unit/src/org/netbeans/modules/bugzilla/MylynStorageTest.java
+++ b/ide/bugzilla/test/unit/src/org/netbeans/modules/bugzilla/MylynStorageTest.java
@@ -34,12 +34,6 @@
 import java.util.concurrent.CountDownLatch;
 import java.util.concurrent.TimeUnit;
 import java.util.logging.Level;
-import static junit.framework.Assert.assertEquals;
-import static junit.framework.Assert.assertFalse;
-import static junit.framework.Assert.assertNotNull;
-import static junit.framework.Assert.assertNull;
-import static junit.framework.Assert.assertSame;
-import static junit.framework.Assert.assertTrue;
 import junit.framework.Test;
 import org.eclipse.core.runtime.CoreException;
 import org.eclipse.core.runtime.NullProgressMonitor;
diff --git a/ide/bugzilla/test/unit/src/org/netbeans/modules/bugzilla/autoupdate/BugzillaNotSupportedTest.java b/ide/bugzilla/test/unit/src/org/netbeans/modules/bugzilla/autoupdate/BugzillaNotSupportedTest.java
index 0f3f588..83be6de 100644
--- a/ide/bugzilla/test/unit/src/org/netbeans/modules/bugzilla/autoupdate/BugzillaNotSupportedTest.java
+++ b/ide/bugzilla/test/unit/src/org/netbeans/modules/bugzilla/autoupdate/BugzillaNotSupportedTest.java
@@ -19,7 +19,6 @@
 
 package org.netbeans.modules.bugzilla.autoupdate;
 
-import static junit.framework.Assert.assertFalse;
 import org.eclipse.mylyn.internal.bugzilla.core.BugzillaVersion;
 import org.netbeans.junit.NbTestCase;
 import org.netbeans.modules.bugzilla.TestConstants;
diff --git a/ide/bugzilla/test/unit/src/org/netbeans/modules/bugzilla/autoupdate/BugzillaPluginUCTest.java b/ide/bugzilla/test/unit/src/org/netbeans/modules/bugzilla/autoupdate/BugzillaPluginUCTest.java
index 8c8f9e5..a99f7f7 100644
--- a/ide/bugzilla/test/unit/src/org/netbeans/modules/bugzilla/autoupdate/BugzillaPluginUCTest.java
+++ b/ide/bugzilla/test/unit/src/org/netbeans/modules/bugzilla/autoupdate/BugzillaPluginUCTest.java
@@ -20,9 +20,6 @@
 package org.netbeans.modules.bugzilla.autoupdate;
 
 import org.netbeans.modules.bugtracking.commons.AutoupdatePluginUCTestCase;
-import static junit.framework.Assert.assertFalse;
-import static junit.framework.Assert.assertTrue;
-import junit.framework.Test;
 import org.eclipse.mylyn.internal.bugzilla.core.BugzillaVersion;
 import org.netbeans.junit.NbModuleSuite;
 import org.netbeans.modules.bugtracking.commons.AutoupdateSupport;
diff --git a/ide/bugzilla/test/unit/src/org/netbeans/modules/bugzilla/autoupdate/BugzillaSupportedTest.java b/ide/bugzilla/test/unit/src/org/netbeans/modules/bugzilla/autoupdate/BugzillaSupportedTest.java
index 54aab73..ed03970 100644
--- a/ide/bugzilla/test/unit/src/org/netbeans/modules/bugzilla/autoupdate/BugzillaSupportedTest.java
+++ b/ide/bugzilla/test/unit/src/org/netbeans/modules/bugzilla/autoupdate/BugzillaSupportedTest.java
@@ -19,7 +19,6 @@
 
 package org.netbeans.modules.bugzilla.autoupdate;
 
-import static junit.framework.Assert.assertTrue;
 import org.eclipse.mylyn.internal.bugzilla.core.BugzillaVersion;
 import org.netbeans.junit.NbTestCase;
 import org.netbeans.modules.bugzilla.TestConstants;
diff --git a/ide/c.jcraft.jsch/build.xml b/ide/c.jcraft.jsch/build.xml
index a7252c9..d06dfb5 100644
--- a/ide/c.jcraft.jsch/build.xml
+++ b/ide/c.jcraft.jsch/build.xml
@@ -33,6 +33,7 @@
                 <!-- Ensure that the necessary modules/bundles are made available to JSch -->
                 <attribute name="Require-Bundle" value="com.jcraft.jzlib,bcprov,libs.c.kohlschutter.junixsocket,org.netbeans.libs.jna,org.netbeans.libs.jna.platform"/>
                 <attribute name="NB-Original-CRC" value="${c.jcraft.jsch.crc32}"/>
+                <attribute name="Multi-Release" value="true"/>
             </manifest>
         </jar>
     </target>
diff --git a/ide/css.lib/test/unit/src/org/netbeans/modules/css/lib/Css3ParserTest.java b/ide/css.lib/test/unit/src/org/netbeans/modules/css/lib/Css3ParserTest.java
index cc3a99c..4012197 100644
--- a/ide/css.lib/test/unit/src/org/netbeans/modules/css/lib/Css3ParserTest.java
+++ b/ide/css.lib/test/unit/src/org/netbeans/modules/css/lib/Css3ParserTest.java
@@ -27,8 +27,6 @@
 import java.util.Set;
 import java.util.concurrent.atomic.AtomicBoolean;
 import javax.swing.text.BadLocationException;
-import static junit.framework.Assert.assertEquals;
-import static junit.framework.Assert.assertNotNull;
 import org.netbeans.modules.css.lib.api.*;
 import org.netbeans.modules.parsing.spi.ParseException;
 import org.openide.filesystems.FileObject;
diff --git a/ide/css.model/test/unit/src/org/netbeans/modules/css/model/impl/ElementHandleImplTest.java b/ide/css.model/test/unit/src/org/netbeans/modules/css/model/impl/ElementHandleImplTest.java
index 129642b..2f2b9e1 100644
--- a/ide/css.model/test/unit/src/org/netbeans/modules/css/model/impl/ElementHandleImplTest.java
+++ b/ide/css.model/test/unit/src/org/netbeans/modules/css/model/impl/ElementHandleImplTest.java
@@ -18,7 +18,6 @@
  */
 package org.netbeans.modules.css.model.impl;
 
-import static junit.framework.Assert.assertEquals;
 import org.netbeans.modules.css.model.api.Element;
 import org.netbeans.modules.css.model.api.ElementHandle;
 import org.netbeans.modules.css.model.api.Model;
diff --git a/ide/css.prep/test/qa-functional/src/org/netbeans/modules/css/prep/syntax/LessSyntaxTest.java b/ide/css.prep/test/qa-functional/src/org/netbeans/modules/css/prep/syntax/LessSyntaxTest.java
index 4f1c5d5..c22ee9b 100644
--- a/ide/css.prep/test/qa-functional/src/org/netbeans/modules/css/prep/syntax/LessSyntaxTest.java
+++ b/ide/css.prep/test/qa-functional/src/org/netbeans/modules/css/prep/syntax/LessSyntaxTest.java
@@ -19,11 +19,8 @@
 
 package org.netbeans.modules.css.prep.syntax;
 
-import static junit.framework.Assert.assertTrue;
 import junit.framework.Test;
 import org.netbeans.jellytools.EditorOperator;
-import org.netbeans.jellytools.ProjectsTabOperator;
-import org.netbeans.jellytools.nodes.Node;
 import org.netbeans.jemmy.JemmyProperties;
 import org.netbeans.junit.NbModuleSuite;
 import org.netbeans.modules.css.prep.GeneralCSSPrep;
diff --git a/ide/css.prep/test/unit/src/org/netbeans/modules/css/prep/editor/model/CPModelTest.java b/ide/css.prep/test/unit/src/org/netbeans/modules/css/prep/editor/model/CPModelTest.java
index 2540fee..4e08d8d 100644
--- a/ide/css.prep/test/unit/src/org/netbeans/modules/css/prep/editor/model/CPModelTest.java
+++ b/ide/css.prep/test/unit/src/org/netbeans/modules/css/prep/editor/model/CPModelTest.java
@@ -24,8 +24,6 @@
 import java.util.Arrays;
 import java.util.Collection;
 import java.util.Iterator;
-import static junit.framework.Assert.assertEquals;
-import static org.junit.Assert.*;
 import org.netbeans.modules.csl.api.OffsetRange;
 import org.netbeans.modules.css.lib.CssTestBase;
 import org.netbeans.modules.css.lib.TestUtil;
diff --git a/ide/css.prep/test/unit/src/org/netbeans/modules/css/prep/less/LessExecutableTest.java b/ide/css.prep/test/unit/src/org/netbeans/modules/css/prep/less/LessExecutableTest.java
index 72d099d..f7020df 100644
--- a/ide/css.prep/test/unit/src/org/netbeans/modules/css/prep/less/LessExecutableTest.java
+++ b/ide/css.prep/test/unit/src/org/netbeans/modules/css/prep/less/LessExecutableTest.java
@@ -19,8 +19,6 @@
 
 package org.netbeans.modules.css.prep.less;
 
-import static junit.framework.Assert.assertEquals;
-import static junit.framework.Assert.assertNull;
 import org.netbeans.junit.NbTestCase;
 import org.netbeans.modules.css.prep.util.VersionOutputProcessorFactory;
 
diff --git a/ide/db.dataview/test/unit/src/org/netbeans/modules/db/dataview/api/DataViewPageContextTest.java b/ide/db.dataview/test/unit/src/org/netbeans/modules/db/dataview/api/DataViewPageContextTest.java
index d4c4554..9341dc3 100644
--- a/ide/db.dataview/test/unit/src/org/netbeans/modules/db/dataview/api/DataViewPageContextTest.java
+++ b/ide/db.dataview/test/unit/src/org/netbeans/modules/db/dataview/api/DataViewPageContextTest.java
@@ -18,8 +18,6 @@
  */
 package org.netbeans.modules.db.dataview.api;
 
-import static junit.framework.Assert.assertEquals;
-import static junit.framework.Assert.assertTrue;
 import org.netbeans.junit.NbTestCase;
 
 /**
diff --git a/ide/db.dataview/test/unit/src/org/netbeans/modules/db/dataview/output/SQLStatementGeneratorTest.java b/ide/db.dataview/test/unit/src/org/netbeans/modules/db/dataview/output/SQLStatementGeneratorTest.java
index f786b84..8d7053f 100644
--- a/ide/db.dataview/test/unit/src/org/netbeans/modules/db/dataview/output/SQLStatementGeneratorTest.java
+++ b/ide/db.dataview/test/unit/src/org/netbeans/modules/db/dataview/output/SQLStatementGeneratorTest.java
@@ -29,7 +29,6 @@
 import java.util.Arrays;
 import java.util.Collection;
 import java.util.List;
-import static junit.framework.Assert.assertEquals;
 import org.netbeans.api.db.explorer.DatabaseConnection;
 import org.netbeans.junit.NbTestCase;
 import org.netbeans.modules.db.dataview.meta.DBColumn;
diff --git a/ide/db/test/unit/src/org/netbeans/api/db/explorer/support/DatabaseExplorerUIsTest.java b/ide/db/test/unit/src/org/netbeans/api/db/explorer/support/DatabaseExplorerUIsTest.java
index ff7590b..21eb5ba 100644
--- a/ide/db/test/unit/src/org/netbeans/api/db/explorer/support/DatabaseExplorerUIsTest.java
+++ b/ide/db/test/unit/src/org/netbeans/api/db/explorer/support/DatabaseExplorerUIsTest.java
@@ -19,7 +19,6 @@
 package org.netbeans.api.db.explorer.support;
 
 import javax.swing.JComboBox;
-import static junit.framework.Assert.assertEquals;
 import org.netbeans.api.db.explorer.*;
 import org.netbeans.modules.db.test.TestBase;
 import org.netbeans.modules.db.test.Util;
diff --git a/ide/db/test/unit/src/org/netbeans/modules/db/explorer/DatabaseConnectionConvertor2Test.java b/ide/db/test/unit/src/org/netbeans/modules/db/explorer/DatabaseConnectionConvertor2Test.java
index 98d2088..602ad3f 100644
--- a/ide/db/test/unit/src/org/netbeans/modules/db/explorer/DatabaseConnectionConvertor2Test.java
+++ b/ide/db/test/unit/src/org/netbeans/modules/db/explorer/DatabaseConnectionConvertor2Test.java
@@ -19,8 +19,6 @@
 package org.netbeans.modules.db.explorer;
 
 import java.io.IOException;
-import static junit.framework.Assert.assertNotNull;
-import static junit.framework.Assert.assertNull;
 import static org.netbeans.modules.db.explorer.DatabaseConnectionConvertor.CONNECTIONS_PATH;
 import org.netbeans.modules.db.test.TestBase;
 import org.netbeans.modules.db.test.Util;
diff --git a/ide/dlight.nativeexecution/external/binaries-list b/ide/dlight.nativeexecution/external/binaries-list
index f33e33e..e2eb41e 100644
--- a/ide/dlight.nativeexecution/external/binaries-list
+++ b/ide/dlight.nativeexecution/external/binaries-list
@@ -14,4 +14,4 @@
 # KIND, either express or implied.  See the License for the
 # specific language governing permissions and limitations
 # under the License.
-89E5CF21801B51580FF00D6CC1209676EDE420FA exechlp-1.0.zip
+4B4DCA62F8C4A1954AE6D286955C36CC50B8CC3A exechlp-1.2.zip
diff --git a/ide/dlight.nativeexecution/external/exechlp-1.0-license.txt b/ide/dlight.nativeexecution/external/exechlp-1.2-license.txt
similarity index 99%
rename from ide/dlight.nativeexecution/external/exechlp-1.0-license.txt
rename to ide/dlight.nativeexecution/external/exechlp-1.2-license.txt
index b71517a..6235148 100644
--- a/ide/dlight.nativeexecution/external/exechlp-1.0-license.txt
+++ b/ide/dlight.nativeexecution/external/exechlp-1.2-license.txt
@@ -1,6 +1,6 @@
 Name: exechlp
 Description: binaries that used by dlight.nativeexecution module (process_start, pty, pty_open - used for dealing with pseude terminals; sigqueue, killall - sending signals to processes; stat - getting detailed file information; unbuffer.so - used when unbuffering is required)
-Version: 1.0
+Version: 1.2
 License: CDDL-1.0
 Origin: NetBeans
 Comment: needed for dlight.nativeexecution module to provide system-dependent services
diff --git a/ide/dlight.nativeexecution/nbproject/project.properties b/ide/dlight.nativeexecution/nbproject/project.properties
index 350e9d0..5562ead 100644
--- a/ide/dlight.nativeexecution/nbproject/project.properties
+++ b/ide/dlight.nativeexecution/nbproject/project.properties
@@ -40,72 +40,79 @@
     **/TerminalConfigurationProviderTest.class,\
     **/WindowsSupportTest.class
 
-release.external/exechlp-1.0.zip!/Linux-x86/process_start       = bin/nativeexecution/Linux-x86/process_start
-release.external/exechlp-1.0.zip!/Linux-x86/pty                 = bin/nativeexecution/Linux-x86/pty
-release.external/exechlp-1.0.zip!/Linux-x86/pty_open            = bin/nativeexecution/Linux-x86/pty_open
-release.external/exechlp-1.0.zip!/Linux-x86/sigqueue            = bin/nativeexecution/Linux-x86/sigqueue
-release.external/exechlp-1.0.zip!/Linux-x86/stat                = bin/nativeexecution/Linux-x86/stat
-release.external/exechlp-1.0.zip!/Linux-x86/unbuffer.so         = bin/nativeexecution/Linux-x86/unbuffer.so
-release.external/exechlp-1.0.zip!/Linux-x86/killall             = bin/nativeexecution/Linux-x86/killall
-release.external/exechlp-1.0.zip!/Linux-x86_64/process_start    = bin/nativeexecution/Linux-x86_64/process_start
-release.external/exechlp-1.0.zip!/Linux-x86_64/pty              = bin/nativeexecution/Linux-x86_64/pty
-release.external/exechlp-1.0.zip!/Linux-x86_64/pty_open         = bin/nativeexecution/Linux-x86_64/pty_open
-release.external/exechlp-1.0.zip!/Linux-x86_64/sigqueue         = bin/nativeexecution/Linux-x86_64/sigqueue
-release.external/exechlp-1.0.zip!/Linux-x86_64/stat             = bin/nativeexecution/Linux-x86_64/stat
-release.external/exechlp-1.0.zip!/Linux-x86_64/unbuffer.so      = bin/nativeexecution/Linux-x86_64/unbuffer.so
-release.external/exechlp-1.0.zip!/Linux-x86_64/killall          = bin/nativeexecution/Linux-x86_64/killall
-release.external/exechlp-1.0.zip!/Linux-sparc_64/process_start  = bin/nativeexecution/Linux-sparc_64/process_start
-release.external/exechlp-1.0.zip!/Linux-sparc_64/pty            = bin/nativeexecution/Linux-sparc_64/pty
-release.external/exechlp-1.0.zip!/Linux-sparc_64/pty_open       = bin/nativeexecution/Linux-sparc_64/pty_open
-release.external/exechlp-1.0.zip!/Linux-sparc_64/sigqueue       = bin/nativeexecution/Linux-sparc_64/sigqueue
-release.external/exechlp-1.0.zip!/Linux-sparc_64/stat           = bin/nativeexecution/Linux-sparc_64/stat
-release.external/exechlp-1.0.zip!/Linux-sparc_64/unbuffer.so    = bin/nativeexecution/Linux-sparc_64/unbuffer.so
-release.external/exechlp-1.0.zip!/Linux-sparc_64/killall        = bin/nativeexecution/Linux-sparc_64/killall
-release.external/exechlp-1.0.zip!/Windows-x86/process_start     = bin/nativeexecution/Windows-x86/process_start
-release.external/exechlp-1.0.zip!/Windows-x86/pty               = bin/nativeexecution/Windows-x86/pty
-release.external/exechlp-1.0.zip!/Windows-x86/pty_open          = bin/nativeexecution/Windows-x86/pty_open
-release.external/exechlp-1.0.zip!/Windows-x86/sigqueue          = bin/nativeexecution/Windows-x86/sigqueue
-release.external/exechlp-1.0.zip!/Windows-x86/unbuffer.dll      = bin/nativeexecution/Windows-x86/unbuffer.dll
-release.external/exechlp-1.0.zip!/Windows-x86/killall           = bin/nativeexecution/Windows-x86/killall
-release.external/exechlp-1.0.zip!/Windows-x86_64/process_start  = bin/nativeexecution/Windows-x86_64/process_start
-release.external/exechlp-1.0.zip!/Windows-x86_64/pty            = bin/nativeexecution/Windows-x86_64/pty
-release.external/exechlp-1.0.zip!/Windows-x86_64/pty_open       = bin/nativeexecution/Windows-x86_64/pty_open
-release.external/exechlp-1.0.zip!/Windows-x86_64/sigqueue       = bin/nativeexecution/Windows-x86_64/sigqueue
-release.external/exechlp-1.0.zip!/Windows-x86_64/killall        = bin/nativeexecution/Windows-x86_64/killall
-release.external/exechlp-1.0.zip!/Windows-x86_64/unbuffer.dll   = bin/nativeexecution/Windows-x86_64/unbuffer.dll
-release.external/exechlp-1.0.zip!/MacOSX-x86/process_start      = bin/nativeexecution/MacOSX-x86/process_start
-release.external/exechlp-1.0.zip!/MacOSX-x86/pty                = bin/nativeexecution/MacOSX-x86/pty
-release.external/exechlp-1.0.zip!/MacOSX-x86/pty_open           = bin/nativeexecution/MacOSX-x86/pty_open
-release.external/exechlp-1.0.zip!/MacOSX-x86/stat               = bin/nativeexecution/MacOSX-x86/stat
-release.external/exechlp-1.0.zip!/MacOSX-x86/unbuffer.dylib     = bin/nativeexecution/MacOSX-x86/unbuffer.dylib
-release.external/exechlp-1.0.zip!/MacOSX-x86/killall            = bin/nativeexecution/MacOSX-x86/killall
-release.external/exechlp-1.0.zip!/MacOSX-x86_64/process_start   = bin/nativeexecution/MacOSX-x86_64/process_start
-release.external/exechlp-1.0.zip!/MacOSX-x86_64/pty             = bin/nativeexecution/MacOSX-x86_64/pty
-release.external/exechlp-1.0.zip!/MacOSX-x86_64/pty_open        = bin/nativeexecution/MacOSX-x86_64/pty_open
-release.external/exechlp-1.0.zip!/MacOSX-x86_64/stat            = bin/nativeexecution/MacOSX-x86_64/stat
-release.external/exechlp-1.0.zip!/MacOSX-x86_64/unbuffer.dylib  = bin/nativeexecution/MacOSX-x86_64/unbuffer.dylib
-release.external/exechlp-1.0.zip!/MacOSX-x86_64/killall         = bin/nativeexecution/MacOSX-x86_64/killall
-release.external/exechlp-1.0.zip!/SunOS-sparc_64/privp          = bin/nativeexecution/SunOS-sparc_64/privp
-release.external/exechlp-1.0.zip!/SunOS-sparc_64/process_start  = bin/nativeexecution/SunOS-sparc_64/process_start
-release.external/exechlp-1.0.zip!/SunOS-sparc_64/pty            = bin/nativeexecution/SunOS-sparc_64/pty
-release.external/exechlp-1.0.zip!/SunOS-sparc_64/pty_open       = bin/nativeexecution/SunOS-sparc_64/pty_open
-release.external/exechlp-1.0.zip!/SunOS-sparc_64/sigqueue       = bin/nativeexecution/SunOS-sparc_64/sigqueue
-release.external/exechlp-1.0.zip!/SunOS-sparc_64/stat           = bin/nativeexecution/SunOS-sparc_64/stat
-release.external/exechlp-1.0.zip!/SunOS-sparc_64/unbuffer.so    = bin/nativeexecution/SunOS-sparc_64/unbuffer.so
-release.external/exechlp-1.0.zip!/SunOS-sparc_64/killall        = bin/nativeexecution/SunOS-sparc_64/killall
-release.external/exechlp-1.0.zip!/SunOS-x86/privp               = bin/nativeexecution/SunOS-x86/privp
-release.external/exechlp-1.0.zip!/SunOS-x86/process_start       = bin/nativeexecution/SunOS-x86/process_start
-release.external/exechlp-1.0.zip!/SunOS-x86/pty                 = bin/nativeexecution/SunOS-x86/pty
-release.external/exechlp-1.0.zip!/SunOS-x86/pty_open            = bin/nativeexecution/SunOS-x86/pty_open
-release.external/exechlp-1.0.zip!/SunOS-x86/sigqueue            = bin/nativeexecution/SunOS-x86/sigqueue
-release.external/exechlp-1.0.zip!/SunOS-x86/stat                = bin/nativeexecution/SunOS-x86/stat
-release.external/exechlp-1.0.zip!/SunOS-x86/unbuffer.so         = bin/nativeexecution/SunOS-x86/unbuffer.so
-release.external/exechlp-1.0.zip!/SunOS-x86/killall             = bin/nativeexecution/SunOS-x86/killall
-release.external/exechlp-1.0.zip!/SunOS-x86_64/process_start    = bin/nativeexecution/SunOS-x86_64/process_start
-release.external/exechlp-1.0.zip!/SunOS-x86_64/pty              = bin/nativeexecution/SunOS-x86_64/pty
-release.external/exechlp-1.0.zip!/SunOS-x86_64/pty_open         = bin/nativeexecution/SunOS-x86_64/pty_open
-release.external/exechlp-1.0.zip!/SunOS-x86_64/sigqueue         = bin/nativeexecution/SunOS-x86_64/sigqueue
-release.external/exechlp-1.0.zip!/SunOS-x86_64/stat             = bin/nativeexecution/SunOS-x86_64/stat
-release.external/exechlp-1.0.zip!/SunOS-x86_64/unbuffer.so      = bin/nativeexecution/SunOS-x86_64/unbuffer.so
-release.external/exechlp-1.0.zip!/SunOS-x86_64/killall          = bin/nativeexecution/SunOS-x86_64/killall
+release.external/exechlp-1.2.zip!/Linux-aarch64/process_start   = bin/nativeexecution/Linux-aarch64/process_start
+release.external/exechlp-1.2.zip!/Linux-aarch64/pty             = bin/nativeexecution/Linux-aarch64/pty
+release.external/exechlp-1.2.zip!/Linux-aarch64/pty_open        = bin/nativeexecution/Linux-aarch64/pty_open
+release.external/exechlp-1.2.zip!/Linux-aarch64/sigqueue        = bin/nativeexecution/Linux-aarch64/sigqueue
+release.external/exechlp-1.2.zip!/Linux-aarch64/stat            = bin/nativeexecution/Linux-aarch64/stat
+release.external/exechlp-1.2.zip!/Linux-aarch64/unbuffer.so     = bin/nativeexecution/Linux-aarch64/unbuffer.so
+release.external/exechlp-1.2.zip!/Linux-aarch64/killall         = bin/nativeexecution/Linux-aarch64/killall
+release.external/exechlp-1.2.zip!/Linux-x86/process_start       = bin/nativeexecution/Linux-x86/process_start
+release.external/exechlp-1.2.zip!/Linux-x86/pty                 = bin/nativeexecution/Linux-x86/pty
+release.external/exechlp-1.2.zip!/Linux-x86/pty_open            = bin/nativeexecution/Linux-x86/pty_open
+release.external/exechlp-1.2.zip!/Linux-x86/sigqueue            = bin/nativeexecution/Linux-x86/sigqueue
+release.external/exechlp-1.2.zip!/Linux-x86/stat                = bin/nativeexecution/Linux-x86/stat
+release.external/exechlp-1.2.zip!/Linux-x86/unbuffer.so         = bin/nativeexecution/Linux-x86/unbuffer.so
+release.external/exechlp-1.2.zip!/Linux-x86/killall             = bin/nativeexecution/Linux-x86/killall
+release.external/exechlp-1.2.zip!/Linux-x86_64/process_start    = bin/nativeexecution/Linux-x86_64/process_start
+release.external/exechlp-1.2.zip!/Linux-x86_64/pty              = bin/nativeexecution/Linux-x86_64/pty
+release.external/exechlp-1.2.zip!/Linux-x86_64/pty_open         = bin/nativeexecution/Linux-x86_64/pty_open
+release.external/exechlp-1.2.zip!/Linux-x86_64/sigqueue         = bin/nativeexecution/Linux-x86_64/sigqueue
+release.external/exechlp-1.2.zip!/Linux-x86_64/stat             = bin/nativeexecution/Linux-x86_64/stat
+release.external/exechlp-1.2.zip!/Linux-x86_64/unbuffer.so      = bin/nativeexecution/Linux-x86_64/unbuffer.so
+release.external/exechlp-1.2.zip!/Linux-x86_64/killall          = bin/nativeexecution/Linux-x86_64/killall
+release.external/exechlp-1.2.zip!/Linux-sparc_64/process_start  = bin/nativeexecution/Linux-sparc_64/process_start
+release.external/exechlp-1.2.zip!/Linux-sparc_64/pty            = bin/nativeexecution/Linux-sparc_64/pty
+release.external/exechlp-1.2.zip!/Linux-sparc_64/pty_open       = bin/nativeexecution/Linux-sparc_64/pty_open
+release.external/exechlp-1.2.zip!/Linux-sparc_64/sigqueue       = bin/nativeexecution/Linux-sparc_64/sigqueue
+release.external/exechlp-1.2.zip!/Linux-sparc_64/stat           = bin/nativeexecution/Linux-sparc_64/stat
+release.external/exechlp-1.2.zip!/Linux-sparc_64/unbuffer.so    = bin/nativeexecution/Linux-sparc_64/unbuffer.so
+release.external/exechlp-1.2.zip!/Linux-sparc_64/killall        = bin/nativeexecution/Linux-sparc_64/killall
+release.external/exechlp-1.2.zip!/Windows-x86/process_start     = bin/nativeexecution/Windows-x86/process_start
+release.external/exechlp-1.2.zip!/Windows-x86/pty               = bin/nativeexecution/Windows-x86/pty
+release.external/exechlp-1.2.zip!/Windows-x86/pty_open          = bin/nativeexecution/Windows-x86/pty_open
+release.external/exechlp-1.2.zip!/Windows-x86/sigqueue          = bin/nativeexecution/Windows-x86/sigqueue
+release.external/exechlp-1.2.zip!/Windows-x86/unbuffer.dll      = bin/nativeexecution/Windows-x86/unbuffer.dll
+release.external/exechlp-1.2.zip!/Windows-x86/killall           = bin/nativeexecution/Windows-x86/killall
+release.external/exechlp-1.2.zip!/Windows-x86_64/process_start  = bin/nativeexecution/Windows-x86_64/process_start
+release.external/exechlp-1.2.zip!/Windows-x86_64/pty            = bin/nativeexecution/Windows-x86_64/pty
+release.external/exechlp-1.2.zip!/Windows-x86_64/pty_open       = bin/nativeexecution/Windows-x86_64/pty_open
+release.external/exechlp-1.2.zip!/Windows-x86_64/sigqueue       = bin/nativeexecution/Windows-x86_64/sigqueue
+release.external/exechlp-1.2.zip!/Windows-x86_64/killall        = bin/nativeexecution/Windows-x86_64/killall
+release.external/exechlp-1.2.zip!/Windows-x86_64/unbuffer.dll   = bin/nativeexecution/Windows-x86_64/unbuffer.dll
+release.external/exechlp-1.2.zip!/MacOSX-x86/process_start      = bin/nativeexecution/MacOSX-x86/process_start
+release.external/exechlp-1.2.zip!/MacOSX-x86/pty                = bin/nativeexecution/MacOSX-x86/pty
+release.external/exechlp-1.2.zip!/MacOSX-x86/pty_open           = bin/nativeexecution/MacOSX-x86/pty_open
+release.external/exechlp-1.2.zip!/MacOSX-x86/stat               = bin/nativeexecution/MacOSX-x86/stat
+release.external/exechlp-1.2.zip!/MacOSX-x86/unbuffer.dylib     = bin/nativeexecution/MacOSX-x86/unbuffer.dylib
+release.external/exechlp-1.2.zip!/MacOSX-x86/killall            = bin/nativeexecution/MacOSX-x86/killall
+release.external/exechlp-1.2.zip!/MacOSX-x86_64/process_start   = bin/nativeexecution/MacOSX-x86_64/process_start
+release.external/exechlp-1.2.zip!/MacOSX-x86_64/pty             = bin/nativeexecution/MacOSX-x86_64/pty
+release.external/exechlp-1.2.zip!/MacOSX-x86_64/pty_open        = bin/nativeexecution/MacOSX-x86_64/pty_open
+release.external/exechlp-1.2.zip!/MacOSX-x86_64/stat            = bin/nativeexecution/MacOSX-x86_64/stat
+release.external/exechlp-1.2.zip!/MacOSX-x86_64/unbuffer.dylib  = bin/nativeexecution/MacOSX-x86_64/unbuffer.dylib
+release.external/exechlp-1.2.zip!/MacOSX-x86_64/killall         = bin/nativeexecution/MacOSX-x86_64/killall
+release.external/exechlp-1.2.zip!/SunOS-sparc_64/privp          = bin/nativeexecution/SunOS-sparc_64/privp
+release.external/exechlp-1.2.zip!/SunOS-sparc_64/process_start  = bin/nativeexecution/SunOS-sparc_64/process_start
+release.external/exechlp-1.2.zip!/SunOS-sparc_64/pty            = bin/nativeexecution/SunOS-sparc_64/pty
+release.external/exechlp-1.2.zip!/SunOS-sparc_64/pty_open       = bin/nativeexecution/SunOS-sparc_64/pty_open
+release.external/exechlp-1.2.zip!/SunOS-sparc_64/sigqueue       = bin/nativeexecution/SunOS-sparc_64/sigqueue
+release.external/exechlp-1.2.zip!/SunOS-sparc_64/stat           = bin/nativeexecution/SunOS-sparc_64/stat
+release.external/exechlp-1.2.zip!/SunOS-sparc_64/unbuffer.so    = bin/nativeexecution/SunOS-sparc_64/unbuffer.so
+release.external/exechlp-1.2.zip!/SunOS-sparc_64/killall        = bin/nativeexecution/SunOS-sparc_64/killall
+release.external/exechlp-1.2.zip!/SunOS-x86/privp               = bin/nativeexecution/SunOS-x86/privp
+release.external/exechlp-1.2.zip!/SunOS-x86/process_start       = bin/nativeexecution/SunOS-x86/process_start
+release.external/exechlp-1.2.zip!/SunOS-x86/pty                 = bin/nativeexecution/SunOS-x86/pty
+release.external/exechlp-1.2.zip!/SunOS-x86/pty_open            = bin/nativeexecution/SunOS-x86/pty_open
+release.external/exechlp-1.2.zip!/SunOS-x86/sigqueue            = bin/nativeexecution/SunOS-x86/sigqueue
+release.external/exechlp-1.2.zip!/SunOS-x86/stat                = bin/nativeexecution/SunOS-x86/stat
+release.external/exechlp-1.2.zip!/SunOS-x86/unbuffer.so         = bin/nativeexecution/SunOS-x86/unbuffer.so
+release.external/exechlp-1.2.zip!/SunOS-x86/killall             = bin/nativeexecution/SunOS-x86/killall
+release.external/exechlp-1.2.zip!/SunOS-x86_64/process_start    = bin/nativeexecution/SunOS-x86_64/process_start
+release.external/exechlp-1.2.zip!/SunOS-x86_64/pty              = bin/nativeexecution/SunOS-x86_64/pty
+release.external/exechlp-1.2.zip!/SunOS-x86_64/pty_open         = bin/nativeexecution/SunOS-x86_64/pty_open
+release.external/exechlp-1.2.zip!/SunOS-x86_64/sigqueue         = bin/nativeexecution/SunOS-x86_64/sigqueue
+release.external/exechlp-1.2.zip!/SunOS-x86_64/stat             = bin/nativeexecution/SunOS-x86_64/stat
+release.external/exechlp-1.2.zip!/SunOS-x86_64/unbuffer.so      = bin/nativeexecution/SunOS-x86_64/unbuffer.so
+release.external/exechlp-1.2.zip!/SunOS-x86_64/killall          = bin/nativeexecution/SunOS-x86_64/killall
 
diff --git a/ide/dlight.nativeexecution/release/bin/nativeexecution/hostinfo.sh b/ide/dlight.nativeexecution/release/bin/nativeexecution/hostinfo.sh
index eb85297..100cb3e 100755
--- a/ide/dlight.nativeexecution/release/bin/nativeexecution/hostinfo.sh
+++ b/ide/dlight.nativeexecution/release/bin/nativeexecution/hostinfo.sh
@@ -39,7 +39,7 @@
          BITNESS=64
       fi
    else
-      uname -a | egrep "x86_64|WOW64|sparc64" >/dev/null
+      uname -a | egrep "x86_64|WOW64|sparc64|aarch64" >/dev/null
       if [ $? -eq 0 ]; then
          BITNESS=64
       fi
@@ -187,4 +187,4 @@
 echo DATETIME=${DATETIME}
 echo ENVFILE=${ENVFILE}
 echo ID=${ID}
-exit 0
\ No newline at end of file
+exit 0
diff --git a/ide/dlight.nativeexecution/src/org/netbeans/modules/nativeexecution/api/HostInfo.java b/ide/dlight.nativeexecution/src/org/netbeans/modules/nativeexecution/api/HostInfo.java
index 65fd11c..667acc7 100644
--- a/ide/dlight.nativeexecution/src/org/netbeans/modules/nativeexecution/api/HostInfo.java
+++ b/ide/dlight.nativeexecution/src/org/netbeans/modules/nativeexecution/api/HostInfo.java
@@ -28,6 +28,7 @@
         SPARC,
         X86,
         ARM,
+        AARCH64,
         UNKNOWN;
     }
 
diff --git a/ide/dlight.nativeexecution/src/org/netbeans/modules/nativeexecution/api/pty/PtySupport.java b/ide/dlight.nativeexecution/src/org/netbeans/modules/nativeexecution/api/pty/PtySupport.java
index 9420be6..8848070 100644
--- a/ide/dlight.nativeexecution/src/org/netbeans/modules/nativeexecution/api/pty/PtySupport.java
+++ b/ide/dlight.nativeexecution/src/org/netbeans/modules/nativeexecution/api/pty/PtySupport.java
@@ -168,7 +168,8 @@
                 case LINUX:
                     return hostInfo.getCpuFamily().equals(CpuFamily.X86) 
                             || hostInfo.getCpuFamily().equals(CpuFamily.SPARC)
-                            || (hostInfo.getCpuFamily().equals(CpuFamily.ARM) && Boolean.getBoolean("cnd.pty.arm.support"));
+                            || (hostInfo.getCpuFamily().equals(CpuFamily.ARM) && Boolean.getBoolean("cnd.pty.arm.support"))
+                            || hostInfo.getCpuFamily().equals(CpuFamily.AARCH64);
                 case SUNOS:
                     return true;
                 case FREEBSD:
diff --git a/ide/dlight.nativeexecution/src/org/netbeans/modules/nativeexecution/api/util/MacroExpanderFactory.java b/ide/dlight.nativeexecution/src/org/netbeans/modules/nativeexecution/api/util/MacroExpanderFactory.java
index 198f8be..c177954 100644
--- a/ide/dlight.nativeexecution/src/org/netbeans/modules/nativeexecution/api/util/MacroExpanderFactory.java
+++ b/ide/dlight.nativeexecution/src/org/netbeans/modules/nativeexecution/api/util/MacroExpanderFactory.java
@@ -277,7 +277,7 @@
             predefinedMacros.put("soext", soext); // NOI18N
             predefinedMacros.put("osname", osname); // NOI18N
             predefinedMacros.put("isa", os.getBitness().toString()); // NOI18N
-            predefinedMacros.put("_isa", os.getBitness() == HostInfo.Bitness._64 ? "_64" : ""); // NOI18N
+            predefinedMacros.put("_isa", os.getBitness() == HostInfo.Bitness._64 && hostInfo.getCpuFamily() != HostInfo.CpuFamily.AARCH64 ? "_64" : ""); // NOI18N
             String platform = hostInfo.getCpuFamily().name().toLowerCase();
 
             if (style == ExpanderStyle.SUNSTUDIO_STYLE) {
diff --git a/ide/dlight.nativeexecution/src/org/netbeans/modules/nativeexecution/api/util/UnbufferSupport.java b/ide/dlight.nativeexecution/src/org/netbeans/modules/nativeexecution/api/util/UnbufferSupport.java
index cc358f2..c3928a2 100644
--- a/ide/dlight.nativeexecution/src/org/netbeans/modules/nativeexecution/api/util/UnbufferSupport.java
+++ b/ide/dlight.nativeexecution/src/org/netbeans/modules/nativeexecution/api/util/UnbufferSupport.java
@@ -73,9 +73,10 @@
                 return;
             case LINUX:
                 if (!hinfo.getCpuFamily().equals(CpuFamily.X86) && 
-                        !hinfo.getCpuFamily().equals(CpuFamily.SPARC)) {
+                        !hinfo.getCpuFamily().equals(CpuFamily.SPARC) &&
+                        !hinfo.getCpuFamily().equals(CpuFamily.AARCH64)) {
                     // Unbuffer is available for x86 only
-                    //and now for sparc linux
+                    // and now for sparc and aarch64 linux
                     return;
                 }
                 break;
diff --git a/ide/dlight.nativeexecution/test/unit/src/org/netbeans/modules/nativeexecution/ConcurrentTasksSupport.java b/ide/dlight.nativeexecution/test/unit/src/org/netbeans/modules/nativeexecution/ConcurrentTasksSupport.java
index a053f2c..c199870 100644
--- a/ide/dlight.nativeexecution/test/unit/src/org/netbeans/modules/nativeexecution/ConcurrentTasksSupport.java
+++ b/ide/dlight.nativeexecution/test/unit/src/org/netbeans/modules/nativeexecution/ConcurrentTasksSupport.java
@@ -29,7 +29,7 @@
 import java.util.concurrent.atomic.AtomicInteger;
 import java.util.logging.Level;
 import java.util.logging.Logger;
-import junit.framework.Assert;
+import org.junit.Assert;
 
 /**
  *
diff --git a/ide/dlight.nativeexecution/test/unit/src/org/netbeans/modules/nativeexecution/test/NbClustersInfoProvider.java b/ide/dlight.nativeexecution/test/unit/src/org/netbeans/modules/nativeexecution/test/NbClustersInfoProvider.java
index 418e9a7..766a845 100644
--- a/ide/dlight.nativeexecution/test/unit/src/org/netbeans/modules/nativeexecution/test/NbClustersInfoProvider.java
+++ b/ide/dlight.nativeexecution/test/unit/src/org/netbeans/modules/nativeexecution/test/NbClustersInfoProvider.java
@@ -21,7 +21,7 @@
 import java.io.File;
 import java.io.FileFilter;
 import java.util.TreeSet;
-import junit.framework.Assert;
+import org.junit.Assert;
 import org.netbeans.junit.NbModuleSuite;
 
 /**
diff --git a/ide/dlight.nativeexecution/tools/Makefile b/ide/dlight.nativeexecution/tools/Makefile
index 0796cbd..4eab98e 100644
--- a/ide/dlight.nativeexecution/tools/Makefile
+++ b/ide/dlight.nativeexecution/tools/Makefile
@@ -31,6 +31,7 @@
 CF_Linux-x86_64	    = -DLINUX   -D_GNU_SOURCE -D_XOPEN_SOURCE=700 -m64
 CF_Linux-sparc_64   = -DLINUX   -D_GNU_SOURCE -D_XOPEN_SOURCE=700 -m64
 CF_Linux-arm	    = -DLINUX   -D_GNU_SOURCE -D_XOPEN_SOURCE=700 -std=c99
+CF_Linux-aarch64    = -DLINUX   -D_GNU_SOURCE -D_XOPEN_SOURCE=700 -std=c99
 CF_MacOSX-x86	    = -DMAXOSX  -D_DARWIN_C_SOURCE -m32
 CF_MacOSX-x86_64    = -DMAXOSX  -D_DARWIN_C_SOURCE -m64
 CF_SunOS-sparc_64   = -DSOLARIS -D__EXTENSIONS__ -m64
diff --git a/ide/dlight.nativeexecution/tools/killall/Makefile b/ide/dlight.nativeexecution/tools/killall/Makefile
index fde9873..dd2c181 100644
--- a/ide/dlight.nativeexecution/tools/killall/Makefile
+++ b/ide/dlight.nativeexecution/tools/killall/Makefile
@@ -52,6 +52,7 @@
 SOURCES_SunOS-sparc_64=$(SOURCES_SunOS)
 SOURCES_Linux-x86=$(SOURCES_Linux)
 SOURCES_Linux-arm=$(SOURCES_Linux)
+SOURCES_Linux-aarch64=$(SOURCES_Linux)
 SOURCES_Linux-x86_64=$(SOURCES_Linux)
 SOURCES_Linux-sparc_64=$(SOURCES_Linux)
 SOURCES_MacOSX-x86=$(SOURCES_Mac)
@@ -84,6 +85,7 @@
 CF_Windows-x86    = $(CF_COMMON) -DWINDOWS -m32
 
 CF_Linux-x86_64   = $(CF_COMMON) -DLINUX -m64
+CF_Linux-aarch64  = $(CF_COMMON) -DLINUX   -D_GNU_SOURCE -D_XOPEN_SOURCE=700 -std=c99
 CF_Linux-sparc_64 = $(CF_COMMON) -DLINUX   -D_GNU_SOURCE -D_XOPEN_SOURCE=700 -m64
 CF_MacOSX-x86_64  = $(CF_COMMON) -DMACOSX  -m64
 CF_SunOS-sparc_64 = $(CF_COMMON) -DSOLARIS -D__EXTENSIONS__ -m64
diff --git a/ide/dlight.nativeexecution/tools/pty/Makefile b/ide/dlight.nativeexecution/tools/pty/Makefile
index 83d8bd8..a40b0c0 100644
--- a/ide/dlight.nativeexecution/tools/pty/Makefile
+++ b/ide/dlight.nativeexecution/tools/pty/Makefile
@@ -51,6 +51,7 @@
 CF_Linux-x86_64   = $(CF_COMMON) -DLINUX   -D_GNU_SOURCE -D_XOPEN_SOURCE=700 -m64
 CF_Linux-sparc_64 = $(CF_COMMON) -DLINUX   -D_GNU_SOURCE -D_XOPEN_SOURCE=700 -m64
 CF_Linux-arm      = $(CF_COMMON) -DLINUX   -D_GNU_SOURCE -D_XOPEN_SOURCE=700 -std=c99
+CF_Linux-aarch64  = $(CF_COMMON) -DLINUX   -D_GNU_SOURCE -D_XOPEN_SOURCE=700 -std=c99
 CF_MacOSX-x86     = $(CF_COMMON) -DMAXOSX  -D_DARWIN_C_SOURCE -m32
 CF_MacOSX-x86_64  = $(CF_COMMON) -DMAXOSX  -D_DARWIN_C_SOURCE -m64
 CF_SunOS-sparc_64 = $(CF_COMMON) -DSOLARIS -D__EXTENSIONS__ -m64
diff --git a/ide/dlight.nativeexecution/tools/unbuffer/Makefile b/ide/dlight.nativeexecution/tools/unbuffer/Makefile
index b7c028e..f3b17ac 100644
--- a/ide/dlight.nativeexecution/tools/unbuffer/Makefile
+++ b/ide/dlight.nativeexecution/tools/unbuffer/Makefile
@@ -38,6 +38,8 @@
 EX_Linux-x86      = unbuffer.so
 CF_Linux-arm      = $(CF_COMMON) -DLINUX -shared -fPIC
 EX_Linux-arm      = unbuffer.so
+CF_Linux-aarch64  = $(CF_COMMON) -DLINUX -shared -fPIC
+EX_Linux-aarch64  = unbuffer.so
 CF_Linux-x86_64   = $(CF_COMMON) -DLINUX -shared -fPIC -m64
 EX_Linux-x86_64   = unbuffer.so
 CF_Linux-sparc_64 = $(CF_COMMON) -DLINUX -shared -fPIC -m64
diff --git a/ide/editor.codetemplates/src/org/netbeans/lib/editor/codetemplates/CodeTemplateInsertHandler.java b/ide/editor.codetemplates/src/org/netbeans/lib/editor/codetemplates/CodeTemplateInsertHandler.java
index cb15ca4..5d7f36c 100644
--- a/ide/editor.codetemplates/src/org/netbeans/lib/editor/codetemplates/CodeTemplateInsertHandler.java
+++ b/ide/editor.codetemplates/src/org/netbeans/lib/editor/codetemplates/CodeTemplateInsertHandler.java
@@ -515,7 +515,7 @@
             return false;
         }
         TextSync last = removed.get(removed.size()-1).activeTextSync();
-        return last.isCaretMarker() && last.isCompletionInvoke();
+        return last != null && last.isCaretMarker() && last.isCompletionInvoke();
     }
 
     void release() {
diff --git a/ide/editor.errorstripe/test/unit/src/org/netbeans/modules/editor/errorstripe/UnitUtilities.java b/ide/editor.errorstripe/test/unit/src/org/netbeans/modules/editor/errorstripe/UnitUtilities.java
index 4b770ae..523142e 100644
--- a/ide/editor.errorstripe/test/unit/src/org/netbeans/modules/editor/errorstripe/UnitUtilities.java
+++ b/ide/editor.errorstripe/test/unit/src/org/netbeans/modules/editor/errorstripe/UnitUtilities.java
@@ -24,7 +24,7 @@
 import java.io.IOException;
 import java.net.URL;
 import javax.swing.text.Utilities;
-import junit.framework.Assert;
+import org.junit.Assert;
 import org.netbeans.junit.NbTestCase;
 import org.openide.filesystems.FileObject;
 import org.openide.filesystems.FileUtil;
diff --git a/ide/editor.fold/test/unit/src/org/netbeans/modules/editor/fold/FoldContentReaderTest.java b/ide/editor.fold/test/unit/src/org/netbeans/modules/editor/fold/FoldContentReaderTest.java
index 714a384..e2af1e7 100644
--- a/ide/editor.fold/test/unit/src/org/netbeans/modules/editor/fold/FoldContentReaderTest.java
+++ b/ide/editor.fold/test/unit/src/org/netbeans/modules/editor/fold/FoldContentReaderTest.java
@@ -24,7 +24,6 @@
 import javax.swing.event.DocumentEvent;
 import javax.swing.text.BadLocationException;
 import javax.swing.text.Document;
-import junit.framework.Assert;
 import org.netbeans.api.editor.fold.Fold;
 import org.netbeans.api.editor.fold.FoldHierarchy;
 import org.netbeans.api.editor.fold.FoldTemplate;
@@ -38,9 +37,6 @@
 import org.netbeans.spi.editor.fold.FoldOperation;
 import org.openide.util.Exceptions;
 
-import static junit.framework.Assert.assertEquals;
-import static junit.framework.Assert.assertNotNull;
-
 /**
  *
  * @author
@@ -228,7 +224,7 @@
                     idx = idx2;
                 }
             } catch (BadLocationException ex) {
-                Assert.fail("Unexpected exception");
+                fail("Unexpected exception");
                 return;
             }
         }
diff --git a/ide/editor.fold/test/unit/src/org/netbeans/modules/editor/fold/FoldGuardTest.java b/ide/editor.fold/test/unit/src/org/netbeans/modules/editor/fold/FoldGuardTest.java
index b264920..1b9393b 100644
--- a/ide/editor.fold/test/unit/src/org/netbeans/modules/editor/fold/FoldGuardTest.java
+++ b/ide/editor.fold/test/unit/src/org/netbeans/modules/editor/fold/FoldGuardTest.java
@@ -23,11 +23,6 @@
 import javax.swing.event.DocumentEvent;
 import javax.swing.text.AbstractDocument;
 import javax.swing.text.BadLocationException;
-import static junit.framework.Assert.assertEquals;
-import static junit.framework.Assert.assertFalse;
-import static junit.framework.Assert.assertNull;
-import static junit.framework.Assert.assertSame;
-import static junit.framework.Assert.assertTrue;
 import org.netbeans.api.editor.fold.Fold;
 import org.netbeans.api.editor.fold.FoldHierarchy;
 import org.netbeans.api.editor.fold.FoldHierarchyEvent;
diff --git a/ide/editor.lib2/src/org/netbeans/modules/editor/lib2/view/DocumentViewOp.java b/ide/editor.lib2/src/org/netbeans/modules/editor/lib2/view/DocumentViewOp.java
index 06cbd5a..7475b09 100644
--- a/ide/editor.lib2/src/org/netbeans/modules/editor/lib2/view/DocumentViewOp.java
+++ b/ide/editor.lib2/src/org/netbeans/modules/editor/lib2/view/DocumentViewOp.java
@@ -1391,7 +1391,7 @@
 
     TextLayout createTextLayout(String text, Font font) {
         checkSettingsInfo();
-        if (fontRenderContext != null && font != null) {
+        if (fontRenderContext != null && font != null && text.length() > 0) {
             ViewStats.incrementTextLayoutCreated(text.length());
             FontInfo fontInfo = getFontInfo(font);
             TextLayout textLayout = new TextLayout(text, fontInfo.renderFont, fontRenderContext);
diff --git a/ide/editor.lib2/test/unit/src/org/netbeans/modules/editor/lib2/highlighting/WhitespaceHighlightingTest.java b/ide/editor.lib2/test/unit/src/org/netbeans/modules/editor/lib2/highlighting/WhitespaceHighlightingTest.java
index 185c60b..eeb307a 100644
--- a/ide/editor.lib2/test/unit/src/org/netbeans/modules/editor/lib2/highlighting/WhitespaceHighlightingTest.java
+++ b/ide/editor.lib2/test/unit/src/org/netbeans/modules/editor/lib2/highlighting/WhitespaceHighlightingTest.java
@@ -26,9 +26,6 @@
 import javax.swing.text.AttributeSet;
 import javax.swing.text.Document;
 import javax.swing.text.StyleConstants;
-import static junit.framework.Assert.assertEquals;
-import static junit.framework.Assert.assertFalse;
-import static junit.framework.Assert.assertTrue;
 import org.netbeans.api.editor.settings.AttributesUtilities;
 import org.netbeans.junit.Filter;
 import org.netbeans.junit.NbTestCase;
diff --git a/ide/editor.lib2/test/unit/src/org/netbeans/modules/editor/lib2/view/TestHighlightsViewFactory.java b/ide/editor.lib2/test/unit/src/org/netbeans/modules/editor/lib2/view/TestHighlightsViewFactory.java
index 651902a..b201d95 100644
--- a/ide/editor.lib2/test/unit/src/org/netbeans/modules/editor/lib2/view/TestHighlightsViewFactory.java
+++ b/ide/editor.lib2/test/unit/src/org/netbeans/modules/editor/lib2/view/TestHighlightsViewFactory.java
@@ -21,7 +21,6 @@
 import java.util.List;
 import javax.swing.text.JTextComponent;
 import javax.swing.text.View;
-import junit.framework.Assert;
 import junit.framework.TestCase;
 
 /**
diff --git a/ide/editor.settings.lib/test/unit/src/org/netbeans/modules/editor/settings/storage/EditorTestLookup.java b/ide/editor.settings.lib/test/unit/src/org/netbeans/modules/editor/settings/storage/EditorTestLookup.java
index 9df3eb0..e52298f 100644
--- a/ide/editor.settings.lib/test/unit/src/org/netbeans/modules/editor/settings/storage/EditorTestLookup.java
+++ b/ide/editor.settings.lib/test/unit/src/org/netbeans/modules/editor/settings/storage/EditorTestLookup.java
@@ -31,7 +31,7 @@
 import java.util.MissingResourceException;
 import java.util.ResourceBundle;
 import java.util.concurrent.Executor;
-import junit.framework.Assert;
+import org.junit.Assert;
 import org.openide.filesystems.AbstractFileSystem;
 import org.openide.filesystems.DefaultAttributes;
 import org.openide.filesystems.FileObject;
diff --git a/ide/editor.settings.storage/test/unit/src/org/netbeans/modules/editor/settings/storage/EditorTestLookup.java b/ide/editor.settings.storage/test/unit/src/org/netbeans/modules/editor/settings/storage/EditorTestLookup.java
index 9df3eb0..e52298f 100644
--- a/ide/editor.settings.storage/test/unit/src/org/netbeans/modules/editor/settings/storage/EditorTestLookup.java
+++ b/ide/editor.settings.storage/test/unit/src/org/netbeans/modules/editor/settings/storage/EditorTestLookup.java
@@ -31,7 +31,7 @@
 import java.util.MissingResourceException;
 import java.util.ResourceBundle;
 import java.util.concurrent.Executor;
-import junit.framework.Assert;
+import org.junit.Assert;
 import org.openide.filesystems.AbstractFileSystem;
 import org.openide.filesystems.DefaultAttributes;
 import org.openide.filesystems.FileObject;
diff --git a/ide/editor.settings.storage/test/unit/src/org/netbeans/modules/editor/settings/storage/preferences/ProxyPreferencesImplTest.java b/ide/editor.settings.storage/test/unit/src/org/netbeans/modules/editor/settings/storage/preferences/ProxyPreferencesImplTest.java
index 5b862ba..5c3d4d0 100644
--- a/ide/editor.settings.storage/test/unit/src/org/netbeans/modules/editor/settings/storage/preferences/ProxyPreferencesImplTest.java
+++ b/ide/editor.settings.storage/test/unit/src/org/netbeans/modules/editor/settings/storage/preferences/ProxyPreferencesImplTest.java
@@ -32,7 +32,6 @@
 import java.util.prefs.PreferenceChangeEvent;
 import java.util.prefs.PreferenceChangeListener;
 import java.util.prefs.Preferences;
-import static junit.framework.Assert.assertEquals;
 import org.netbeans.junit.NbTestCase;
 import org.netbeans.modules.editor.settings.storage.api.OverridePreferences;
 import org.netbeans.modules.editor.settings.storage.api.MemoryPreferences;
diff --git a/ide/editor/test/unit/src/org/netbeans/modules/editor/EditorTestLookup.java b/ide/editor/test/unit/src/org/netbeans/modules/editor/EditorTestLookup.java
index e9727da..1ef0310 100644
--- a/ide/editor/test/unit/src/org/netbeans/modules/editor/EditorTestLookup.java
+++ b/ide/editor/test/unit/src/org/netbeans/modules/editor/EditorTestLookup.java
@@ -22,7 +22,7 @@
 import java.beans.PropertyVetoException;
 import java.io.IOException;
 import java.net.URL;
-import junit.framework.Assert;
+import org.junit.Assert;
 import org.openide.filesystems.Repository;
 import org.openide.filesystems.XMLFileSystem;
 import org.openide.util.Lookup;
diff --git a/ide/git/test/qa-functional/src/org/netbeans/test/git/main/diff/DiffTest.java b/ide/git/test/qa-functional/src/org/netbeans/test/git/main/diff/DiffTest.java
index c2e836d..3902762 100644
--- a/ide/git/test/qa-functional/src/org/netbeans/test/git/main/diff/DiffTest.java
+++ b/ide/git/test/qa-functional/src/org/netbeans/test/git/main/diff/DiffTest.java
@@ -22,7 +22,6 @@
 import java.io.PrintStream;
 import java.util.logging.Level;
 import java.util.logging.Logger;
-import static junit.framework.Assert.assertNotNull;
 import junit.framework.Test;
 import org.netbeans.jellytools.EditorOperator;
 import org.netbeans.jellytools.JellyTestCase;
diff --git a/ide/git/test/qa-functional/src/org/netbeans/test/git/main/diff/ExportDiffPatchTest.java b/ide/git/test/qa-functional/src/org/netbeans/test/git/main/diff/ExportDiffPatchTest.java
index 3278309..d07f085 100644
--- a/ide/git/test/qa-functional/src/org/netbeans/test/git/main/diff/ExportDiffPatchTest.java
+++ b/ide/git/test/qa-functional/src/org/netbeans/test/git/main/diff/ExportDiffPatchTest.java
@@ -25,8 +25,6 @@
 import java.io.PrintStream;
 import java.util.logging.Level;
 import java.util.logging.Logger;
-import static junit.framework.Assert.assertEquals;
-import static junit.framework.Assert.assertTrue;
 import junit.framework.Test;
 import org.netbeans.jellytools.EditorOperator;
 import org.netbeans.jellytools.JellyTestCase;
diff --git a/ide/git/test/unit/src/org/netbeans/modules/git/ExternalChangesTest.java b/ide/git/test/unit/src/org/netbeans/modules/git/ExternalChangesTest.java
index d1071eb..1382776 100644
--- a/ide/git/test/unit/src/org/netbeans/modules/git/ExternalChangesTest.java
+++ b/ide/git/test/unit/src/org/netbeans/modules/git/ExternalChangesTest.java
@@ -29,7 +29,6 @@
 import java.util.logging.Level;
 import java.util.logging.LogRecord;
 import java.util.logging.Logger;
-import static junit.framework.Assert.assertTrue;
 import org.netbeans.junit.MockServices;
 import org.netbeans.junit.RandomlyFails;
 import org.netbeans.libs.git.GitBranch;
diff --git a/ide/html.editor/test/unit/src/org/netbeans/modules/html/editor/completion/HtmlCompletionTestSupport.java b/ide/html.editor/test/unit/src/org/netbeans/modules/html/editor/completion/HtmlCompletionTestSupport.java
index f205f37..8e7e733 100644
--- a/ide/html.editor/test/unit/src/org/netbeans/modules/html/editor/completion/HtmlCompletionTestSupport.java
+++ b/ide/html.editor/test/unit/src/org/netbeans/modules/html/editor/completion/HtmlCompletionTestSupport.java
@@ -26,7 +26,6 @@
 import javax.swing.JEditorPane;
 import javax.swing.text.BadLocationException;
 import javax.swing.text.Document;
-import junit.framework.AssertionFailedError;
 import org.junit.Assert;
 import org.netbeans.modules.html.editor.api.completion.HtmlCompletionItem;
 import org.netbeans.modules.html.editor.api.gsf.HtmlParserResult;
@@ -114,7 +113,7 @@
 
         try {
             assertCompletionItemNames(expectedItemsNames, items, type);
-        } catch (AssertionFailedError e) {
+        } catch (AssertionError e) {
             for (CompletionItem item : items) {
                 System.out.println(((HtmlCompletionItem) item).getItemText());
             }
diff --git a/ide/html.editor/test/unit/src/org/netbeans/modules/html/editor/spi/embedding/JsEmbeddingProviderPluginTest.java b/ide/html.editor/test/unit/src/org/netbeans/modules/html/editor/spi/embedding/JsEmbeddingProviderPluginTest.java
index f339f07..eebe6d7 100644
--- a/ide/html.editor/test/unit/src/org/netbeans/modules/html/editor/spi/embedding/JsEmbeddingProviderPluginTest.java
+++ b/ide/html.editor/test/unit/src/org/netbeans/modules/html/editor/spi/embedding/JsEmbeddingProviderPluginTest.java
@@ -18,11 +18,7 @@
  */
 package org.netbeans.modules.html.editor.spi.embedding;
 
-import java.util.Collections;
 import java.util.List;
-import java.util.concurrent.atomic.AtomicReference;
-import static junit.framework.Assert.assertEquals;
-import static junit.framework.Assert.assertNotNull;
 import org.netbeans.api.editor.mimelookup.MimeRegistration;
 import org.netbeans.api.html.lexer.HTMLTokenId;
 import org.netbeans.api.lexer.TokenSequence;
@@ -31,14 +27,8 @@
 import org.netbeans.modules.html.editor.api.gsf.HtmlParserResult;
 import org.netbeans.modules.html.editor.embedding.JsEmbeddingProviderTest;
 import org.netbeans.modules.parsing.api.Embedding;
-import org.netbeans.modules.parsing.api.ParserManager;
-import org.netbeans.modules.parsing.api.ResultIterator;
 import org.netbeans.modules.parsing.api.Snapshot;
-import org.netbeans.modules.parsing.api.Source;
-import org.netbeans.modules.parsing.api.UserTask;
-import org.netbeans.modules.parsing.spi.ParseException;
 import org.netbeans.modules.web.common.api.LexerUtils;
-import org.netbeans.modules.web.common.api.WebUtils;
 
 /**
  *
@@ -69,7 +59,8 @@
         public static boolean started, ended, processed;
         
         @Override
-        public boolean startProcessing(HtmlParserResult parserResult, Snapshot snapshot, TokenSequence<HTMLTokenId> ts, List<Embedding> embeddings) {            assertNotNull(snapshot);
+        public boolean startProcessing(HtmlParserResult parserResult, Snapshot snapshot, TokenSequence<HTMLTokenId> ts, List<Embedding> embeddings) {
+            assertNotNull(snapshot);
             assertNotNull(parserResult);
             assertNotNull(ts);
             assertNotNull(embeddings);
diff --git a/ide/ide.kit/test/qa-functional/src/org/netbeans/test/ide/CountingSecurityManager.java b/ide/ide.kit/test/qa-functional/src/org/netbeans/test/ide/CountingSecurityManager.java
index fb6e46c..770c208 100755
--- a/ide/ide.kit/test/qa-functional/src/org/netbeans/test/ide/CountingSecurityManager.java
+++ b/ide/ide.kit/test/qa-functional/src/org/netbeans/test/ide/CountingSecurityManager.java
@@ -40,7 +40,7 @@
 import java.util.concurrent.Callable;
 import java.util.logging.Level;
 import java.util.logging.Logger;
-import junit.framework.Assert;
+import org.junit.Assert;
 import org.openide.util.Utilities;
 
 /**
diff --git a/ide/javascript2.debug/test/unit/src/org/netbeans/modules/javascript2/debug/sources/SourceFSTest.java b/ide/javascript2.debug/test/unit/src/org/netbeans/modules/javascript2/debug/sources/SourceFSTest.java
index f8492c0..bbaad5d 100644
--- a/ide/javascript2.debug/test/unit/src/org/netbeans/modules/javascript2/debug/sources/SourceFSTest.java
+++ b/ide/javascript2.debug/test/unit/src/org/netbeans/modules/javascript2/debug/sources/SourceFSTest.java
@@ -20,10 +20,12 @@
 package org.netbeans.modules.javascript2.debug.sources;
 
 import java.io.IOException;
-import static junit.framework.Assert.*;
 import org.junit.Test;
 import org.openide.filesystems.FileObject;
 
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+
 /**
  *
  * @author Martin Entlicher
diff --git a/ide/languages.yaml/src/org/netbeans/modules/languages/yaml/EmbeddedSectionsHighlighting.java b/ide/languages.yaml/src/org/netbeans/modules/languages/yaml/EmbeddedSectionsHighlighting.java
index 6711aad..5182019 100644
--- a/ide/languages.yaml/src/org/netbeans/modules/languages/yaml/EmbeddedSectionsHighlighting.java
+++ b/ide/languages.yaml/src/org/netbeans/modules/languages/yaml/EmbeddedSectionsHighlighting.java
@@ -37,7 +37,7 @@
 import org.netbeans.editor.BaseDocument;
 import org.netbeans.editor.Utilities;
 import org.netbeans.lib.editor.util.swing.DocumentUtilities;
-import static org.netbeans.modules.languages.yaml.YamlTokenId.YAML_MIME_TYPE;
+import static org.netbeans.modules.languages.yaml.YamlLanguage.MIME_TYPE;
 import org.netbeans.spi.editor.highlighting.HighlightsLayer;
 import org.netbeans.spi.editor.highlighting.HighlightsLayerFactory;
 import org.netbeans.spi.editor.highlighting.HighlightsSequence;
@@ -257,7 +257,7 @@
         }
     } // End of Highlights class
 
-    @MimeRegistration(mimeType = YAML_MIME_TYPE, service = HighlightsLayerFactory.class)
+    @MimeRegistration(mimeType = MIME_TYPE, service = HighlightsLayerFactory.class)
     public static final class Factory implements HighlightsLayerFactory {
 
         @Override
diff --git a/ide/languages.yaml/src/org/netbeans/modules/languages/yaml/YamlCompletion.java b/ide/languages.yaml/src/org/netbeans/modules/languages/yaml/YamlCompletion.java
index 6ff3089..2e8e665 100644
--- a/ide/languages.yaml/src/org/netbeans/modules/languages/yaml/YamlCompletion.java
+++ b/ide/languages.yaml/src/org/netbeans/modules/languages/yaml/YamlCompletion.java
@@ -326,7 +326,7 @@
 
         @Override
         public String getMimeType() {
-            return YamlTokenId.YAML_MIME_TYPE;
+            return YamlLanguage.MIME_TYPE;
         }
 
         @Override
diff --git a/ide/languages.yaml/src/org/netbeans/modules/languages/yaml/YamlLanguage.java b/ide/languages.yaml/src/org/netbeans/modules/languages/yaml/YamlLanguage.java
index 218e7e2..c0f59ab 100644
--- a/ide/languages.yaml/src/org/netbeans/modules/languages/yaml/YamlLanguage.java
+++ b/ide/languages.yaml/src/org/netbeans/modules/languages/yaml/YamlLanguage.java
@@ -18,7 +18,13 @@
  */
 package org.netbeans.modules.languages.yaml;
 
+import java.util.Collection;
+import java.util.EnumSet;
+import org.netbeans.api.lexer.InputAttributes;
 import org.netbeans.api.lexer.Language;
+import org.netbeans.api.lexer.LanguagePath;
+import org.netbeans.api.lexer.Token;
+import org.netbeans.api.lexer.TokenId;
 import org.netbeans.core.spi.multiview.MultiViewElement;
 import org.netbeans.core.spi.multiview.text.MultiViewEditorElement;
 import org.netbeans.modules.csl.api.CodeCompletionHandler;
@@ -29,6 +35,11 @@
 import org.netbeans.modules.csl.spi.DefaultLanguageConfig;
 import org.netbeans.modules.csl.spi.LanguageRegistration;
 import org.netbeans.modules.parsing.spi.Parser;
+import org.netbeans.spi.lexer.LanguageEmbedding;
+import org.netbeans.spi.lexer.LanguageHierarchy;
+import org.netbeans.spi.lexer.LanguageProvider;
+import org.netbeans.spi.lexer.Lexer;
+import org.netbeans.spi.lexer.LexerRestartInfo;
 import org.openide.awt.*;
 import org.openide.filesystems.MIMEResolver;
 import org.openide.util.Lookup;
@@ -102,12 +113,12 @@
             position = 1500
     )
 })
-@LanguageRegistration(mimeType = "text/x-yaml", useMultiview = true) //NOI18N
+@LanguageRegistration(mimeType = YamlLanguage.MIME_TYPE, useMultiview = true)
 public class YamlLanguage extends DefaultLanguageConfig {
 
     @Override
     public Language getLexerLanguage() {
-        return YamlTokenId.language();
+        return language();
     }
 
     @Override
@@ -155,12 +166,73 @@
         return null;
     }
 
+    public static final Language<YamlTokenId> language() {
+        return language;
+    }
+
+    private static final Language<YamlTokenId> language =
+        new LanguageHierarchy<YamlTokenId>() {
+
+            @Override
+            protected String mimeType() {
+                return MIME_TYPE;
+            }
+
+            @Override
+            protected Collection<YamlTokenId> createTokenIds() {
+                return EnumSet.allOf(YamlTokenId.class);
+            }
+
+            @Override
+            protected Lexer<YamlTokenId> createLexer(LexerRestartInfo<YamlTokenId> info) {
+                return new YamlLexer(info);
+            }
+
+            @Override
+            protected LanguageEmbedding<? extends TokenId> embedding(Token<YamlTokenId> token,
+                    LanguagePath languagePath, InputAttributes inputAttributes) {
+                switch (token.id()) {
+                    case RUBY_EXPR:
+                    case RUBY:
+                        return findLanguage(YamlLanguage.RUBY_MIME_TYPE);
+                    case PHP:
+                        return findLanguage(YamlLanguage.PHP_MIME_TYPE);
+                    default:
+                        return null;
+                }
+            }
+    }.language();
+
+    private static LanguageEmbedding<? extends TokenId> findLanguage(String mimeType) {
+        Language<? extends TokenId> ret = null;
+
+        Collection<? extends LanguageProvider> providers = Lookup.getDefault().lookupAll(LanguageProvider.class);
+        for (LanguageProvider provider : providers) {
+            ret = provider.findLanguage(mimeType);
+            if (ret != null) {
+                break;
+            }
+        }
+
+        return ret != null ? LanguageEmbedding.create(ret, 0, 0, false) : null;
+    }
+
+    /**
+     * MIME type for YAML. Don't change this without also consulting the various
+     * XML files that cannot reference this value directly.
+     */
+    public static final String MIME_TYPE = "text/x-yaml"; // NOI18N
+
+    public static final String RUBY_MIME_TYPE = "text/x-ruby"; // NOI18N
+    public static final String PHP_MIME_TYPE = "text/x-php5"; // NOI18N
+
+
     @NbBundle.Messages("Source=&Source")
     @MultiViewElement.Registration(
             displayName="#Source",
             iconBase="org/netbeans/modules/languages/yaml/yaml_files_16.png",
             persistenceType=TopComponent.PERSISTENCE_ONLY_OPENED,
-            mimeType=YamlTokenId.YAML_MIME_TYPE,
+            mimeType=MIME_TYPE,
             preferredID="yaml.source",
             position=100
     )
diff --git a/ide/languages.yaml/src/org/netbeans/modules/languages/yaml/YamlParser.java b/ide/languages.yaml/src/org/netbeans/modules/languages/yaml/YamlParser.java
index 653f628..d734c54 100644
--- a/ide/languages.yaml/src/org/netbeans/modules/languages/yaml/YamlParser.java
+++ b/ide/languages.yaml/src/org/netbeans/modules/languages/yaml/YamlParser.java
@@ -258,7 +258,7 @@
 
             // Construct source by removing <% %> tokens etc.
             StringBuilder sb = new StringBuilder();
-            TokenHierarchy hi = TokenHierarchy.create(source, YamlTokenId.language());
+            TokenHierarchy hi = TokenHierarchy.create(source, YamlLanguage.language());
 
             TokenSequence ts = hi.tokenSequence();
 
diff --git a/ide/languages.yaml/src/org/netbeans/modules/languages/yaml/YamlStructureItem.java b/ide/languages.yaml/src/org/netbeans/modules/languages/yaml/YamlStructureItem.java
index 2fcec4e..339c852 100644
--- a/ide/languages.yaml/src/org/netbeans/modules/languages/yaml/YamlStructureItem.java
+++ b/ide/languages.yaml/src/org/netbeans/modules/languages/yaml/YamlStructureItem.java
@@ -129,7 +129,7 @@
 
     @Override
     public String getMimeType() {
-        return YamlTokenId.YAML_MIME_TYPE;
+        return YamlLanguage.MIME_TYPE;
     }
 
     @Override
diff --git a/ide/languages.yaml/src/org/netbeans/modules/languages/yaml/YamlTokenId.java b/ide/languages.yaml/src/org/netbeans/modules/languages/yaml/YamlTokenId.java
index f0fd5f6..dbefca3 100644
--- a/ide/languages.yaml/src/org/netbeans/modules/languages/yaml/YamlTokenId.java
+++ b/ide/languages.yaml/src/org/netbeans/modules/languages/yaml/YamlTokenId.java
@@ -18,24 +18,7 @@
  */
 package org.netbeans.modules.languages.yaml;
 
-import java.util.Collection;
-import java.util.EnumSet;
-import java.util.HashMap;
-import java.util.Map;
-import org.netbeans.api.editor.mimelookup.MimeRegistration;
-
-import org.netbeans.api.lexer.InputAttributes;
-import org.netbeans.api.lexer.Language;
-import org.netbeans.api.lexer.LanguagePath;
-import org.netbeans.api.lexer.Token;
 import org.netbeans.api.lexer.TokenId;
-import org.netbeans.modules.languages.yaml.ruby.RubyEmbeddingProvider;
-import org.netbeans.spi.lexer.LanguageEmbedding;
-import org.netbeans.spi.lexer.LanguageHierarchy;
-import org.netbeans.spi.lexer.LanguageProvider;
-import org.netbeans.spi.lexer.Lexer;
-import org.netbeans.spi.lexer.LexerRestartInfo;
-import org.openide.util.Lookup;
 
 /**
  * Token type definitions for YAML
@@ -79,74 +62,5 @@
     public static boolean isRuby(TokenId id) {
         return id == RUBY || id == RUBY_EXPR || id == RUBYCOMMENT;
     }
-    private static final Language<YamlTokenId> language =
-            new LanguageHierarchy<YamlTokenId>() {
 
-                @Override
-                protected String mimeType() {
-                    return YamlTokenId.YAML_MIME_TYPE;
-                }
-
-                @Override
-                protected Collection<YamlTokenId> createTokenIds() {
-                    return EnumSet.allOf(YamlTokenId.class);
-                }
-
-                @Override
-                protected Map<String, Collection<YamlTokenId>> createTokenCategories() {
-                    Map<String, Collection<YamlTokenId>> cats =
-                            new HashMap<String, Collection<YamlTokenId>>();
-                    return cats;
-                }
-
-                @Override
-                protected Lexer<YamlTokenId> createLexer(LexerRestartInfo<YamlTokenId> info) {
-                    return new YamlLexer(info);
-                }
-
-                @Override
-                protected LanguageEmbedding<? extends TokenId> embedding(Token<YamlTokenId> token,
-                        LanguagePath languagePath, InputAttributes inputAttributes) {
-                    switch (token.id()) {
-                        case RUBY_EXPR:
-                        case RUBY:
-                            // No dependency on the Ruby module:
-                            //Language rubyLanguage = RubyTokenId.language();
-                            Language<? extends TokenId> rubyLanguage = null;
-
-                            @SuppressWarnings("unchecked") Collection<LanguageProvider> providers = (Collection<LanguageProvider>) Lookup.getDefault().lookupAll(LanguageProvider.class);
-                            for (LanguageProvider provider : providers) {
-                                rubyLanguage = (Language<? extends TokenId>) provider.findLanguage(RubyEmbeddingProvider.RUBY_MIME_TYPE);
-                                if (rubyLanguage != null) {
-                                    break;
-                                }
-                            }
-
-                            return rubyLanguage != null ? LanguageEmbedding.create(rubyLanguage, 0, 0, false) : null;
-                        case PHP:
-                            Language<? extends TokenId> phpLanguage = null;
-
-                            providers = (Collection<LanguageProvider>) Lookup.getDefault().lookupAll(LanguageProvider.class);
-                            for (LanguageProvider provider : providers) {
-                                phpLanguage = (Language<? extends TokenId>) provider.findLanguage("text/x-php5");
-                                if (phpLanguage != null) {
-                                    break;
-                                }
-                            }
-                            return phpLanguage != null ? LanguageEmbedding.create(phpLanguage, 0, 0, false) : null;
-                        default:
-                            return null;
-                    }
-                }
-            }.language();
-
-    @MimeRegistration(mimeType = YAML_MIME_TYPE, service = Language.class)
-    public static Language<YamlTokenId> language() {
-        return language;
-    }
-    /**
-     * MIME type for YAML. Don't change this without also consulting the various
-     * XML files that cannot reference this value directly.
-     */
-    public static final String YAML_MIME_TYPE = "text/x-yaml"; // NOI18N
 }
diff --git a/ide/languages.yaml/src/org/netbeans/modules/languages/yaml/ruby/RubyEmbeddingProvider.java b/ide/languages.yaml/src/org/netbeans/modules/languages/yaml/ruby/RubyEmbeddingProvider.java
deleted file mode 100644
index ac73ae9..0000000
--- a/ide/languages.yaml/src/org/netbeans/modules/languages/yaml/ruby/RubyEmbeddingProvider.java
+++ /dev/null
@@ -1,220 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.netbeans.modules.languages.yaml.ruby;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.List;
-import java.util.logging.Logger;
-import javax.swing.text.Document;
-import org.netbeans.api.editor.mimelookup.MimeRegistration;
-import org.netbeans.api.lexer.Token;
-import org.netbeans.api.lexer.TokenHierarchy;
-import org.netbeans.api.lexer.TokenSequence;
-import org.netbeans.editor.BaseDocument;
-import org.netbeans.modules.languages.yaml.YamlTokenId;
-import org.netbeans.modules.parsing.api.Embedding;
-import org.netbeans.modules.parsing.api.Snapshot;
-import org.netbeans.modules.parsing.spi.EmbeddingProvider;
-import org.netbeans.modules.parsing.spi.SchedulerTask;
-import org.netbeans.modules.parsing.spi.TaskFactory;
-
-/**
- *
- * @author Petr Hejl
- */
-public class RubyEmbeddingProvider extends EmbeddingProvider {
-
-    public static final String RUBY_MIME_TYPE = "text/x-ruby"; // NOI18N
-    private static final Logger LOG = Logger.getLogger(RubyEmbeddingProvider.class.getName());
-
-    @Override
-    public List<Embedding> getEmbeddings(Snapshot snapshot) {
-        if (YamlTokenId.YAML_MIME_TYPE.equals(snapshot.getMimeType())) {
-            List<Embedding> embeddings = translate(snapshot);
-            if (embeddings.isEmpty()) {
-                return Collections.<Embedding>emptyList();
-            } else {
-                return Collections.singletonList(Embedding.create(embeddings));
-            }
-        } else {
-            LOG.warning("Unexpected snapshot type: '" + snapshot.getMimeType() + "'; expecting '" + YamlTokenId.YAML_MIME_TYPE + "'"); //NOI18N
-            return Collections.<Embedding>emptyList();
-        }
-    }
-
-    @Override
-    public int getPriority() {
-        return Integer.MAX_VALUE;
-    }
-
-    @Override
-    public void cancel() {
-        // FIXME parsing API
-    }
-
-    private List<Embedding> translate(Snapshot snapshot) {
-        BaseDocument d = (BaseDocument) snapshot.getSource().getDocument(false);
-        if (d == null) {
-            return Collections.emptyList();
-        }
-
-        List<Embedding> embeddings = new ArrayList<Embedding>();
-
-        try {
-            d.readLock();
-            TokenHierarchy<Document> tokenHierarchy = TokenHierarchy.get((Document) d);
-            TokenSequence<YamlTokenId> tokenSequence = tokenHierarchy.tokenSequence(YamlTokenId.language()); //get top level token sequence
-
-            if (tokenSequence != null) {
-                translate(snapshot, tokenHierarchy, tokenSequence, embeddings);
-            }
-        } finally {
-            d.readUnlock();
-        }
-        return embeddings;
-    }
-
-    /**
-     * Perform eruby translation
-     *
-     * @param outputBuffer The buffer to emit the translation to
-     * @param tokenHierarchy The token hierarchy for the yaml code
-     * @param tokenSequence The token sequence for the yaml code
-     */
-    private void translate(Snapshot snapshot, TokenHierarchy<Document> tokenHierarchy,
-            TokenSequence<? extends YamlTokenId> tokenSequence, List<Embedding> embeddings) {
-        // Add a super class such that code completion, goto declaration etc.
-        // knows where to pull the various link_to etc. methods from
-
-        // Erubis uses _buf; I've seen eruby using something else (_erbout?)
-        embeddings.add(snapshot.create("_buf='';", RUBY_MIME_TYPE));
-
-        boolean skipNewline = false;
-        while (tokenSequence.moveNext()) {
-            Token<? extends YamlTokenId> token = tokenSequence.token();
-
-            if (token.id() == YamlTokenId.TEXT || token.id() == YamlTokenId.COMMENT) {
-                int sourceStart = token.offset(tokenHierarchy);
-
-                String text = token.text().toString();
-
-                // If there is leading whitespace in this token followed by a newline,
-                // emit it directly first, then insert my buffer append. Otherwise,
-                // insert a semicolon if we're on the same line as the previous output.
-                boolean found = false;
-                int i = 0;
-                for (; i < text.length(); i++) {
-                    char c = text.charAt(i);
-                    if (c == '\n') {
-                        i++; // include it
-                        found = true;
-                        break;
-                    } else if (!Character.isWhitespace(c)) {
-                        break;
-                    }
-                }
-
-                // avoid creating an embedding for the artificial '\n' at the end (which is now there
-                // as a result of the fix for #159502
-                // XXX: shouldn't this be handled e.g. in token hiearchy creation??
-                if (found && tokenSequence.index() < tokenSequence.tokenCount() - 1) {
-                    embeddings.add(snapshot.create(sourceStart, i, RUBY_MIME_TYPE));
-                    //buffer.append(text.substring(0, i));
-                    text = text.substring(i);
-                } else {
-                    embeddings.add(snapshot.create(";", RUBY_MIME_TYPE));
-                    //buffer.append(';');
-                }
-                embeddings.add(snapshot.create("_buf << '", RUBY_MIME_TYPE));
-
-                if (skipNewline && text.startsWith("\n")) { // NOI18N
-                    text = text.substring(1);
-                }
-                // Escape 's in the document so they don't escape out of the ruby code
-                // I don't have to do this on lines that are in comments... But no big harm
-                text = text.replace("'", "\\'");
-
-                // FIXME this escaping should be replaced with
-                // proper embeddings from source code
-                embeddings.add(snapshot.create(text, RUBY_MIME_TYPE));
-
-                // TODO: This "\n" shouldn't be there if the next "<%" is a "<%-" !
-                embeddings.add(snapshot.create("';\n", RUBY_MIME_TYPE));
-                //buffer.append("';\n"); // NOI18N
-
-                skipNewline = false;
-            } else if (token.id() == YamlTokenId.RUBY) {
-                int sourceStart = token.offset(tokenHierarchy);
-
-                String text = token.text().toString();
-                skipNewline = false;
-                if (text.endsWith("-")) { // NOI18N
-                    text = text.substring(0, text.length() - 1);
-                    skipNewline = true;
-                }
-
-                embeddings.add(snapshot.create(sourceStart, text.length(), RUBY_MIME_TYPE));
-
-                skipNewline = false;
-            } else if (token.id() == YamlTokenId.RUBY_EXPR) {
-                embeddings.add(snapshot.create("_buf << (", RUBY_MIME_TYPE));
-
-                int sourceStart = token.offset(tokenHierarchy);
-
-                String text = token.text().toString();
-                skipNewline = false;
-                if (text.endsWith("-")) { // NOI18N
-                    text = text.substring(0, text.length() - 1);
-                    skipNewline = true;
-                }
-                embeddings.add(snapshot.create(sourceStart, text.length(), RUBY_MIME_TYPE));
-
-// Make code sanitizing work better:  buffer.append("\n).to_s;"); // NOI18N
-                embeddings.add(snapshot.create(").to_s;", RUBY_MIME_TYPE));
-            }
-        }
-
-        // Close off the class
-        // eruby also ends with this statement: _buf.to_s
-//        String end = "\nend\n"; // NOI18N
-//        buffer.append(end);
-//        if (doc != null) {
-//            codeBlocks.add(new CodeBlockData(doc.getLength(), doc.getLength(), buffer.length()-end.length(), buffer.length()));
-//        }
-    }
-
-    @MimeRegistration(mimeType = YamlTokenId.YAML_MIME_TYPE, service = TaskFactory.class)
-    public static final class Factory extends TaskFactory {
-
-        public Factory() {
-            // no-op
-        }
-
-        public @Override
-        Collection<? extends SchedulerTask> create(Snapshot snapshot) {
-            if (!YamlTokenId.YAML_MIME_TYPE.equals(snapshot.getMimeType())) {
-                return Collections.<SchedulerTask>emptyList();
-            }
-
-            return Collections.singleton(new RubyEmbeddingProvider());
-        }
-    }
-}
diff --git a/ide/languages.yaml/test/unit/src/org/netbeans/modules/languages/yaml/YamlLexerTest.java b/ide/languages.yaml/test/unit/src/org/netbeans/modules/languages/yaml/YamlLexerTest.java
index 18886f1..834dcdc 100644
--- a/ide/languages.yaml/test/unit/src/org/netbeans/modules/languages/yaml/YamlLexerTest.java
+++ b/ide/languages.yaml/test/unit/src/org/netbeans/modules/languages/yaml/YamlLexerTest.java
@@ -42,41 +42,41 @@
 
     public void testInput() throws Exception {
         LexerTestUtilities.checkTokenDump(this, "testfiles/input.yaml.txt",
-                YamlTokenId.language());
+                YamlLanguage.language());
     }
 
     public void testInput2() throws Exception {
         LexerTestUtilities.checkTokenDump(this, "testfiles/input2.yaml.txt",
-                YamlTokenId.language());
+                YamlLanguage.language());
     }
 
     public void testInput3() throws Exception {
         LexerTestUtilities.checkTokenDump(this, "testfiles/input3.yaml.txt",
-                YamlTokenId.language());
+                YamlLanguage.language());
     }
     
     public void testInput4() throws Exception {
         LexerTestUtilities.checkTokenDump(this, "testfiles/input4.yaml.txt",
-                YamlTokenId.language());
+                YamlLanguage.language());
     }
 
     public void testNETBEANS_4167() throws Exception {
         LexerTestUtilities.checkTokenDump(this, "testfiles/issue_NETBEANS-4167.yaml.txt",
-                YamlTokenId.language());
+                YamlLanguage.language());
     }
 
     public void testNETBEANS_4370_1() throws Exception {
         LexerTestUtilities.checkTokenDump(this, "testfiles/issue_NETBEANS-4370_1.yaml.txt",
-                YamlTokenId.language());
+                YamlLanguage.language());
     }
 
     public void testNETBEANS_4370_2() throws Exception {
         LexerTestUtilities.checkTokenDump(this, "testfiles/issue_NETBEANS-4370_2.yaml.txt",
-                YamlTokenId.language());
+                YamlLanguage.language());
     }
 
     public void testIssue246124() throws Exception {
         LexerTestUtilities.checkTokenDump(this, "testfiles/issue246124.yaml",
-                YamlTokenId.language());
+                YamlLanguage.language());
     }
 }
diff --git a/ide/languages.yaml/test/unit/src/org/netbeans/modules/languages/yaml/YamlTestBase.java b/ide/languages.yaml/test/unit/src/org/netbeans/modules/languages/yaml/YamlTestBase.java
index 3a907e3..348f1c3 100644
--- a/ide/languages.yaml/test/unit/src/org/netbeans/modules/languages/yaml/YamlTestBase.java
+++ b/ide/languages.yaml/test/unit/src/org/netbeans/modules/languages/yaml/YamlTestBase.java
@@ -40,7 +40,7 @@
 
     @Override
     protected String getPreferredMimeType() {
-        return YamlTokenId.YAML_MIME_TYPE;
+        return YamlLanguage.MIME_TYPE;
     }
 
     @Override
diff --git a/ide/lexer/test/unit/src/org/netbeans/lib/lexer/test/join/JoinMixTest.java b/ide/lexer/test/unit/src/org/netbeans/lib/lexer/test/join/JoinMixTest.java
index 93e04b7..ca11621 100644
--- a/ide/lexer/test/unit/src/org/netbeans/lib/lexer/test/join/JoinMixTest.java
+++ b/ide/lexer/test/unit/src/org/netbeans/lib/lexer/test/join/JoinMixTest.java
@@ -23,7 +23,6 @@
 import java.util.List;
 import java.util.logging.Level;
 import javax.swing.text.AbstractDocument;
-import static junit.framework.Assert.assertTrue;
 import org.netbeans.api.lexer.Language;
 import org.netbeans.api.lexer.LanguagePath;
 import org.netbeans.api.lexer.TokenHierarchy;
diff --git a/ide/libs.antlr4.runtime/external/antlr4-runtime-4.7.2-license.txt b/ide/libs.antlr4.runtime/external/antlr4-runtime-4.7.2-license.txt
index 4dbaf42..8a2f197 100644
--- a/ide/libs.antlr4.runtime/external/antlr4-runtime-4.7.2-license.txt
+++ b/ide/libs.antlr4.runtime/external/antlr4-runtime-4.7.2-license.txt
@@ -4,6 +4,7 @@
 License: BSD-antlr-runtime4
 Origin: Antlr
 URL: https://www.antlr.org
+Files: antlr4-runtime-4.7.2.jar, antlr4-4.7.2.jar, ST4-4.1.jar
 
 Use of Antlr version 4.7.2 is governed by the terms of the license below:
 
diff --git a/ide/libs.antlr4.runtime/external/binaries-list b/ide/libs.antlr4.runtime/external/binaries-list
index 3b4b24c..1714789 100644
--- a/ide/libs.antlr4.runtime/external/binaries-list
+++ b/ide/libs.antlr4.runtime/external/binaries-list
@@ -15,3 +15,5 @@
 # specific language governing permissions and limitations
 # under the License.
 E27D8AB4F984F9D186F54DA984A6AB1CCCAC755E org.antlr:antlr4-runtime:4.7.2
+93058C41A6CBB7F5CA63EDAC837F42C002DBC556 org.antlr:antlr4:4.7.2
+467D508BE07A542AD0A68FFCAED2D561C5FB2E0C org.antlr:ST4:4.1
diff --git a/ide/libs.antlr4.runtime/src/org/netbeans/libs/antlr4/runtime/Bundle.properties b/ide/libs.antlr4.runtime/src/org/netbeans/libs/antlr4/runtime/Bundle.properties
index 34ae00b..5c0cc8b 100644
--- a/ide/libs.antlr4.runtime/src/org/netbeans/libs/antlr4/runtime/Bundle.properties
+++ b/ide/libs.antlr4.runtime/src/org/netbeans/libs/antlr4/runtime/Bundle.properties
@@ -16,9 +16,9 @@
 # under the License.
 
 
-OpenIDE-Module-Name=Antlr 4.5 Runtime
+OpenIDE-Module-Name=Antlr 4 Runtime
 OpenIDE-Module-Short-Description=Antlr Runtime Libraries
-OpenIDE-Module-Long-Description=Contains Antlr 4.5 runtime libraries
+OpenIDE-Module-Long-Description=Contains Antlr 4.7.2 runtime libraries
 OpenIDE-Module-Display-Category=Libraries
 
 
diff --git a/ide/libs.freemarker/test/unit/src/org/netbeans/freemarker/templates/ScriptingCreateFromTemplateTest.java b/ide/libs.freemarker/test/unit/src/org/netbeans/freemarker/templates/ScriptingCreateFromTemplateTest.java
index ea2f396..86be52a 100644
--- a/ide/libs.freemarker/test/unit/src/org/netbeans/freemarker/templates/ScriptingCreateFromTemplateTest.java
+++ b/ide/libs.freemarker/test/unit/src/org/netbeans/freemarker/templates/ScriptingCreateFromTemplateTest.java
@@ -28,7 +28,6 @@
 import java.util.Map;
 import javax.swing.text.DefaultEditorKit;
 import javax.swing.text.Document;
-import static junit.framework.Assert.assertEquals;
 import org.netbeans.api.editor.mimelookup.MimePath;
 import org.netbeans.api.queries.FileEncodingQuery;
 import org.netbeans.junit.MockServices;
diff --git a/ide/libs.git/test/unit/src/org/netbeans/libs/git/jgit/commands/CompareCommitTest.java b/ide/libs.git/test/unit/src/org/netbeans/libs/git/jgit/commands/CompareCommitTest.java
index 9aaefff..5b15bcd 100644
--- a/ide/libs.git/test/unit/src/org/netbeans/libs/git/jgit/commands/CompareCommitTest.java
+++ b/ide/libs.git/test/unit/src/org/netbeans/libs/git/jgit/commands/CompareCommitTest.java
@@ -22,7 +22,6 @@
 import java.io.File;
 import java.io.IOException;
 import java.util.Map;
-import static junit.framework.Assert.assertEquals;
 import org.eclipse.jgit.lib.Constants;
 import org.eclipse.jgit.lib.Repository;
 import org.netbeans.libs.git.GitClient;
diff --git a/ide/libs.git/test/unit/src/org/netbeans/libs/git/jgit/commands/RebaseTest.java b/ide/libs.git/test/unit/src/org/netbeans/libs/git/jgit/commands/RebaseTest.java
index cedbd0c..d965092 100644
--- a/ide/libs.git/test/unit/src/org/netbeans/libs/git/jgit/commands/RebaseTest.java
+++ b/ide/libs.git/test/unit/src/org/netbeans/libs/git/jgit/commands/RebaseTest.java
@@ -23,10 +23,6 @@
 import java.io.IOException;
 import java.util.Arrays;
 import java.util.Map;
-import static junit.framework.Assert.assertEquals;
-import static junit.framework.Assert.assertFalse;
-import static junit.framework.Assert.assertNotNull;
-import static junit.framework.Assert.assertTrue;
 import org.eclipse.jgit.lib.Constants;
 import org.eclipse.jgit.lib.Repository;
 import org.netbeans.libs.git.GitBranch;
diff --git a/ide/libs.git/test/unit/src/org/netbeans/libs/git/jgit/commands/RenameTest.java b/ide/libs.git/test/unit/src/org/netbeans/libs/git/jgit/commands/RenameTest.java
index c711fe7..144510f 100644
--- a/ide/libs.git/test/unit/src/org/netbeans/libs/git/jgit/commands/RenameTest.java
+++ b/ide/libs.git/test/unit/src/org/netbeans/libs/git/jgit/commands/RenameTest.java
@@ -27,7 +27,6 @@
 import java.util.Collections;
 import java.util.HashSet;
 import java.util.Map;
-import static junit.framework.Assert.assertTrue;
 import org.netbeans.libs.git.GitClient;
 import org.netbeans.libs.git.GitException;
 import org.netbeans.libs.git.GitStatus;
diff --git a/ide/libs.git/test/unit/src/org/netbeans/libs/git/jgit/commands/StatusTest.java b/ide/libs.git/test/unit/src/org/netbeans/libs/git/jgit/commands/StatusTest.java
index ea9a782..befff67 100644
--- a/ide/libs.git/test/unit/src/org/netbeans/libs/git/jgit/commands/StatusTest.java
+++ b/ide/libs.git/test/unit/src/org/netbeans/libs/git/jgit/commands/StatusTest.java
@@ -24,7 +24,6 @@
 import java.nio.file.Paths;
 import java.util.HashMap;
 import java.util.Map;
-import static junit.framework.Assert.assertFalse;
 import org.eclipse.jgit.dircache.DirCache;
 import org.eclipse.jgit.dircache.DirCacheBuilder;
 import org.eclipse.jgit.dircache.DirCacheEntry;
diff --git a/ide/mercurial/test/unit/src/org/netbeans/modules/mercurial/HgCommandTest.java b/ide/mercurial/test/unit/src/org/netbeans/modules/mercurial/HgCommandTest.java
index e239267..f253e4b 100644
--- a/ide/mercurial/test/unit/src/org/netbeans/modules/mercurial/HgCommandTest.java
+++ b/ide/mercurial/test/unit/src/org/netbeans/modules/mercurial/HgCommandTest.java
@@ -28,8 +28,6 @@
 import java.util.logging.Handler;
 import java.util.logging.Level;
 import java.util.logging.LogRecord;
-import static junit.framework.Assert.assertFalse;
-import static junit.framework.Assert.assertTrue;
 import org.netbeans.junit.MockServices;
 import org.netbeans.modules.mercurial.ui.log.HgLogMessage;
 import org.netbeans.modules.mercurial.util.HgCommand;
diff --git a/ide/parsing.indexing/test/unit/src/org/netbeans/modules/parsing/impl/indexing/BrokenIndexRecoveryTest.java b/ide/parsing.indexing/test/unit/src/org/netbeans/modules/parsing/impl/indexing/BrokenIndexRecoveryTest.java
index 99c67ce..756fe57 100644
--- a/ide/parsing.indexing/test/unit/src/org/netbeans/modules/parsing/impl/indexing/BrokenIndexRecoveryTest.java
+++ b/ide/parsing.indexing/test/unit/src/org/netbeans/modules/parsing/impl/indexing/BrokenIndexRecoveryTest.java
@@ -29,7 +29,6 @@
 import java.util.concurrent.atomic.AtomicInteger;
 import java.util.logging.Level;
 import java.util.logging.Logger;
-import static junit.framework.Assert.assertTrue;
 import org.netbeans.api.annotations.common.NonNull;
 import org.netbeans.api.editor.mimelookup.MimeLookup;
 import org.netbeans.api.editor.mimelookup.MimePath;
diff --git a/ide/parsing.indexing/test/unit/src/org/netbeans/modules/parsing/impl/indexing/ParsinApiInteractionTest.java b/ide/parsing.indexing/test/unit/src/org/netbeans/modules/parsing/impl/indexing/ParsinApiInteractionTest.java
index 07313e5..be80e2a 100644
--- a/ide/parsing.indexing/test/unit/src/org/netbeans/modules/parsing/impl/indexing/ParsinApiInteractionTest.java
+++ b/ide/parsing.indexing/test/unit/src/org/netbeans/modules/parsing/impl/indexing/ParsinApiInteractionTest.java
@@ -42,7 +42,6 @@
 import java.util.logging.Logger;
 import javax.swing.event.ChangeListener;
 import javax.swing.text.StyledDocument;
-import static junit.framework.Assert.assertNotNull;
 import org.netbeans.api.annotations.common.NonNull;
 import org.netbeans.api.annotations.common.NullAllowed;
 import org.netbeans.api.editor.mimelookup.MimePath;
diff --git a/ide/parsing.nb/test/unit/src/org/netbeans/modules/parsing/nb/TaskProcessorSuspendTest.java b/ide/parsing.nb/test/unit/src/org/netbeans/modules/parsing/nb/TaskProcessorSuspendTest.java
index 643eccb..3c305ab 100644
--- a/ide/parsing.nb/test/unit/src/org/netbeans/modules/parsing/nb/TaskProcessorSuspendTest.java
+++ b/ide/parsing.nb/test/unit/src/org/netbeans/modules/parsing/nb/TaskProcessorSuspendTest.java
@@ -28,8 +28,6 @@
 import java.util.concurrent.CountDownLatch;
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.atomic.AtomicBoolean;
-import static junit.framework.Assert.assertFalse;
-import static junit.framework.Assert.assertTrue;
 import org.netbeans.api.annotations.common.NonNull;
 import org.netbeans.api.editor.mimelookup.MimePath;
 import org.netbeans.api.editor.mimelookup.test.MockMimeLookup;
diff --git a/ide/project.dependency/src/org/netbeans/modules/project/dependency/ArtifactSpec.java b/ide/project.dependency/src/org/netbeans/modules/project/dependency/ArtifactSpec.java
index 0bdc541..fb80df8 100644
--- a/ide/project.dependency/src/org/netbeans/modules/project/dependency/ArtifactSpec.java
+++ b/ide/project.dependency/src/org/netbeans/modules/project/dependency/ArtifactSpec.java
@@ -22,7 +22,10 @@
 import java.net.URI;
 import java.net.URISyntaxException;
 import java.net.URL;
+import java.util.Collections;
+import java.util.HashSet;
 import java.util.Objects;
+import java.util.Set;
 import java.util.logging.Level;
 import java.util.logging.Logger;
 import org.netbeans.api.annotations.common.NonNull;
@@ -45,10 +48,58 @@
  * The version specified is further classified by {@link VersionKind}, to 
  * distinguish versions possibly from repositories, development versions and
  * floating versions.
+ * <p>
+ * The ArtifactSpec may provide additional tags, that can further describe the artifact,
+ * but those tags are not part of "identity" of the artifact, for dependencies or build
+ * systems, only 
+ * <ul>
+ * <li>group
+ * <li>artifact
+ * <li>version
+ * <li>classifier
+ * <Li>extension
+ * </ul>
+ * are important.
  * 
  * @author sdedic
  */
 public final class ArtifactSpec<T> {
+    
+    /**
+     * A tag for an artifact with basic output of the project's code/contents.
+     * You almost never want this, usually you want {@code null} classifier to 
+     * identify the <b>default</b> output. But in rare cases you really do want
+     * to avoid post-processing or shading, this (abstract) classifier should
+     * identify an artifact before those steps.
+     * <p>
+     * If used in a query, a non-tagged artifact may be returned if the implementation
+     * does not support the tag.
+     */
+    public static final String TAG_BASE = "<basic>"; // NOI18N
+    
+    /**
+     * Tag for an artifact, that eventually contains dependencies bundled in. If used
+     * in a query, an ordinary (non-tagged) artifact may be returned from the query in case
+     * the implementation does not support the tag. Implementations may use additional, more
+     * specific tags on the returned artifacts.
+     */
+    public static final String TAG_SHADED = "<shaded>";
+
+    /**
+     * Classifier for an artifact that contains sources.
+     */
+    public static final String CLASSIFIER_SOURCES = "sources"; // NOI18N
+
+    /**
+     * Classifier for an artifact that contains test code
+     */
+    public static final String CLASSIFIER_TESTS = "tests"; // NOI18N
+
+    /**
+     * Classifier for an artifact that contains test sources.
+     */
+    public static final String CLASSIFIER_TEST_SOURCES = "test-sources"; // NOI18N
+    
     static final Logger LOG = Logger.getLogger(ProjectDependencies.class.getName());
     
     /**
@@ -74,10 +125,14 @@
     private final String classifier;
     private final boolean optional;
     private final URI location;
+    
+    // note: tags is NOT a part of hascode / equals, as externally only the classifier
+    // is visible, e.g. to the build system.
+    private final Set<String> tags;
     private FileObject localFile;
     final T data;
 
-    ArtifactSpec(VersionKind kind, String groupId, String artifactId, String versionSpec, String type, String classifier, boolean optional, URI location, FileObject localFile, T impl) {
+    ArtifactSpec(VersionKind kind, String groupId, String artifactId, String versionSpec, String type, String classifier, boolean optional, URI location, FileObject localFile, Set<String> tags, T impl) {
         this.kind = kind;
         this.groupId = groupId;
         this.artifactId = artifactId;
@@ -88,6 +143,7 @@
         this.type = type;
         this.location = location;
         this.localFile = localFile;
+        this.tags = tags == null ? Collections.emptySet() : tags;
     }
 
     public T getData() {
@@ -120,6 +176,10 @@
         }
         return f == FileUtil.getConfigRoot() ? null : f;
     }
+    
+    public boolean hasTag(String tag) {
+        return tags.contains(tag);
+    }
 
     public URI getLocation() {
         return location;
@@ -238,23 +298,25 @@
                 // should not happen
             }
         }
-        return new ArtifactSpec<V>(VersionKind.REGULAR, groupId, artifactId, versionSpec, type, classifier, optional, uri, localFile, data);
+        return new ArtifactSpec<V>(VersionKind.REGULAR, groupId, artifactId, versionSpec, type, classifier, optional, uri, localFile, Collections.emptySet(), data);
     }
 
     public static <V> ArtifactSpec<V> createSnapshotSpec(
             @NonNull String groupId, @NonNull String artifactId, 
             @NullAllowed String type, @NullAllowed String classifier, 
             @NonNull String versionSpec, boolean optional, @NullAllowed FileObject localFile, @NonNull V data) {
-        URL u = URLMapper.findURL(localFile, URLMapper.EXTERNAL);
         URI uri = null;
-        if (u != null) {
-            try {
-                uri = u.toURI();
-            } catch (URISyntaxException ex) {
-                // should not happen
+        if (localFile != null) {
+            URL u = URLMapper.findURL(localFile, URLMapper.EXTERNAL);
+            if (u != null) {
+                try {
+                    uri = u.toURI();
+                } catch (URISyntaxException ex) {
+                    // should not happen
+                }
             }
         }
-        return new ArtifactSpec<V>(VersionKind.SNAPSHOT, groupId, artifactId, versionSpec, type, classifier, optional, uri, localFile, data);
+        return new ArtifactSpec<V>(VersionKind.SNAPSHOT, groupId, artifactId, versionSpec, type, classifier, optional, uri, localFile, Collections.emptySet(), data);
     }
     
     public static final <T> Builder<T> builder(String group, String artifact, String version, T projectData) {
@@ -272,6 +334,7 @@
         private boolean optional;
         private FileObject localFile;
         private URI location;
+        private Set<String> tags;
         
         public Builder(String groupId, String artifactId, String versionSpec, T data) {
             this.groupId = groupId;
@@ -299,6 +362,25 @@
             this.localFile = localFile;
             return this;
         }
+        
+        public Builder tag(String tag) {
+            if (tags == null) {
+                tags = new HashSet<>();
+            }
+            tags.add(tag);
+            return this;
+        }
+        
+        public Builder tags(String... tags) {
+            if (tags == null || tags.length == 0) {
+                return this;
+            } else {
+                for (String t : tags) {
+                    tag(t);
+                }
+                return this;
+            }
+        }
 
         /**
          * Forces the local file reference. Unlike {@link #localFile}, if {@code null} is
@@ -319,7 +401,7 @@
         }
         
         public ArtifactSpec build() {
-            return new ArtifactSpec(kind, groupId, artifactId, versionSpec, type, classifier, optional, location, localFile, data);
+            return new ArtifactSpec(kind, groupId, artifactId, versionSpec, type, classifier, optional, location, localFile, tags, data);
         }
     }
 }
diff --git a/ide/project.dependency/src/org/netbeans/modules/project/dependency/ProjectArtifactsQuery.java b/ide/project.dependency/src/org/netbeans/modules/project/dependency/ProjectArtifactsQuery.java
index f92840b..1d8a41b 100644
--- a/ide/project.dependency/src/org/netbeans/modules/project/dependency/ProjectArtifactsQuery.java
+++ b/ide/project.dependency/src/org/netbeans/modules/project/dependency/ProjectArtifactsQuery.java
@@ -19,9 +19,13 @@
 package org.netbeans.modules.project.dependency;
 
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.Collection;
+import java.util.Collections;
+import java.util.HashSet;
 import java.util.LinkedHashSet;
 import java.util.List;
+import java.util.Set;
 import java.util.SortedMap;
 import java.util.TreeMap;
 import java.util.stream.Collectors;
@@ -43,7 +47,15 @@
  * <p>
  * By default the query will return artifacts produced by project's compilation (incl. packaging, in maven terminology) - 
  * but the exact meaning depends on a build system used, and the project's settings and the active configuration.
- * 
+ * <p>
+ * Different project output are marked by different <b>classifiers</b>. Some special, abstract classifiers may
+ * be defined that should be handled by implementations specific for each build system.
+ * <ul>
+ * <li>{@link Filter#CLASSIFIER_BUNDLED} - describes a product with all dependencies included, such as the output of
+ * <b>shade or shadow plugins</b> in Gradle or Maven. Since the plugins behave differently (maven replaces the original artifact,
+ * while gradle attaches a new one), this meta-classiifer allows to pick the appropriate artifact despite its real classifier depends
+ * on project type. If there are more bundles (shadows), 
+ * </ul>
  * @author sdedic
  */
 public final class ProjectArtifactsQuery {
@@ -140,6 +152,7 @@
         
         List<ArtifactSpec> updateResults() {
             boolean changes = false;
+            // accept only first matching artifact.
             Collection<ArtifactSpec> specs = new LinkedHashSet<>();
             for (E<?> e : delegates) {
                 Collection<ArtifactSpec> ex = e.findExcludedArtifacts();
@@ -213,25 +226,27 @@
      * perhaps determined by the configured packaging with <b>no classifier</b>. It it possible
      * to list artifacts of all types and/or artifacts with any classifier in one query.
      */
-    public static class Filter {
+    public static final class Filter {
         /**
          * Represents all types of artifacts. The query will return all build products
          */
-        public static final String TYPE_ALL = "all"; // NOI18N
+        public static final String TYPE_ALL = "<all>"; // NOI18N
         
         /**
          * Will return artifacts with any classifier.
          */
-        public static final String CLASSIFIER_ANY = "any"; // NOI18N
+        public static final String CLASSIFIER_ANY = "<any>"; // NOI18N
         
+        private final Set<String> tags;
         private final String classifier;
         private final String artifactType;
         private final ProjectActionContext  buildContext;
         
-        Filter(String artifactType, String classifier, ProjectActionContext buildContext) {
+        Filter(String artifactType, String classifier, Set<String> tags, ProjectActionContext buildContext) {
             this.classifier = classifier;
             this.artifactType = artifactType;
             this.buildContext = buildContext;
+            this.tags = tags == null ? Collections.emptySet() : Collections.unmodifiableSet(tags);
         }
 
         /**
@@ -245,6 +260,14 @@
         public String getClassifier() {
             return classifier;
         }
+        
+        public Set<String> getTags() {
+            return tags;
+        }
+        
+        public boolean hasTag(String t) {
+            return tags.contains(t);
+        }
 
         /**
          * The desired artifact type. Only artifacts with tha type will be returned. {@link #TYPE_ALL} means that artifacts
@@ -274,7 +297,7 @@
      */
     @NonNull
     public static Filter newQuery(@NullAllowed String artifactType) {
-        return new Filter(artifactType, null, null);
+        return new Filter(artifactType, null, null, null);
     }
     
     /**
@@ -286,6 +309,20 @@
      */
     @NonNull
     public static Filter newQuery(@NullAllowed String artifactType, @NullAllowed String classifier, @NullAllowed ProjectActionContext buildContext) {
-        return new Filter(artifactType, classifier, buildContext);
+        return new Filter(artifactType, classifier, null, buildContext);
+    }
+
+    /**
+     * Creates a Filter with the specified properties
+     * @param artifactType the desired type; use {@code null} for the default artifact type (i.e. defined by packaging)
+     * @param classifier the desired classifier; use {@code null} for no classifier
+     * @param buildContext the action context
+     * @return Filter instance.
+     */
+    @NonNull
+    public static Filter newQuery(@NullAllowed String artifactType, @NullAllowed String classifier, @NullAllowed ProjectActionContext buildContext, String... tags) {
+        return new Filter(artifactType, classifier, 
+                tags == null || tags.length == 0 ? null : new HashSet<>(Arrays.asList(tags)), 
+                buildContext);
     }
 }
diff --git a/ide/project.dependency/src/org/netbeans/modules/project/dependency/spi/ProjectArtifactsImplementation.java b/ide/project.dependency/src/org/netbeans/modules/project/dependency/spi/ProjectArtifactsImplementation.java
index 198350a..339cc78 100644
--- a/ide/project.dependency/src/org/netbeans/modules/project/dependency/spi/ProjectArtifactsImplementation.java
+++ b/ide/project.dependency/src/org/netbeans/modules/project/dependency/spi/ProjectArtifactsImplementation.java
@@ -41,7 +41,8 @@
     public Result evaluate(ProjectArtifactsQuery.Filter query);
 
     /**
-     * Returns evaluation order of this Implementation. If the Implementation needs to post-process
+     * Returns evaluation order of this Implementation. Implementations ordered
+     * later may remove artifacts generated by earlier ones.
      * 
      * @return 
      */
diff --git a/ide/project.libraries.ui/test/unit/src/org/netbeans/api/project/libraries/LibraryManageTest.java b/ide/project.libraries.ui/test/unit/src/org/netbeans/api/project/libraries/LibraryManageTest.java
index 07c81bd..d952f7f 100644
--- a/ide/project.libraries.ui/test/unit/src/org/netbeans/api/project/libraries/LibraryManageTest.java
+++ b/ide/project.libraries.ui/test/unit/src/org/netbeans/api/project/libraries/LibraryManageTest.java
@@ -24,9 +24,6 @@
 import java.util.Arrays;
 import java.util.Collections;
 import java.util.List;
-import static junit.framework.Assert.assertEquals;
-import static junit.framework.Assert.assertEquals;
-import static junit.framework.Assert.assertNotNull;
 import org.netbeans.junit.NbTestCase;
 import org.netbeans.modules.project.libraries.LibrariesTestUtil;
 import org.netbeans.modules.project.libraries.LibrariesTestUtil.Area;
diff --git a/ide/projectapi/test/unit/src/org/netbeans/api/project/TestUtil.java b/ide/projectapi/test/unit/src/org/netbeans/api/project/TestUtil.java
index 0ce5448..45551ac 100644
--- a/ide/projectapi/test/unit/src/org/netbeans/api/project/TestUtil.java
+++ b/ide/projectapi/test/unit/src/org/netbeans/api/project/TestUtil.java
@@ -32,7 +32,7 @@
 import java.util.WeakHashMap;
 import java.util.logging.Logger;
 import javax.swing.Icon;
-import junit.framework.Assert;
+import org.junit.Assert;
 import org.netbeans.junit.NbTestCase;
 import org.netbeans.spi.project.ProjectFactory;
 import org.netbeans.spi.project.ProjectFactory2;
diff --git a/ide/spellchecker/test/unit/src/org/netbeans/modules/spellchecker/UnitUtilities.java b/ide/spellchecker/test/unit/src/org/netbeans/modules/spellchecker/UnitUtilities.java
index 14c47e1..9b3c411 100644
--- a/ide/spellchecker/test/unit/src/org/netbeans/modules/spellchecker/UnitUtilities.java
+++ b/ide/spellchecker/test/unit/src/org/netbeans/modules/spellchecker/UnitUtilities.java
@@ -22,7 +22,7 @@
 import java.beans.PropertyVetoException;
 import java.io.File;
 import java.io.IOException;
-import junit.framework.Assert;
+import org.junit.Assert;
 import org.netbeans.junit.NbTestCase;
 import org.openide.filesystems.FileObject;
 import org.openide.filesystems.FileUtil;
diff --git a/ide/spi.debugger.ui/test/unit/src/org/netbeans/api/debugger/IDEInitializer.java b/ide/spi.debugger.ui/test/unit/src/org/netbeans/api/debugger/IDEInitializer.java
index 87420fc..570d3fa 100644
--- a/ide/spi.debugger.ui/test/unit/src/org/netbeans/api/debugger/IDEInitializer.java
+++ b/ide/spi.debugger.ui/test/unit/src/org/netbeans/api/debugger/IDEInitializer.java
@@ -26,7 +26,7 @@
 import java.net.URLStreamHandler;
 import java.net.URLStreamHandlerFactory;
 import java.util.Enumeration;
-import junit.framework.Assert;
+import org.junit.Assert;
 import org.netbeans.junit.Manager;
 import org.openide.filesystems.FileObject;
 import org.openide.filesystems.FileSystem;
diff --git a/ide/spi.navigator/test/unit/src/org/netbeans/modules/navigator/NavigatorControllerTest.java b/ide/spi.navigator/test/unit/src/org/netbeans/modules/navigator/NavigatorControllerTest.java
index bf28abe..9c696bc 100644
--- a/ide/spi.navigator/test/unit/src/org/netbeans/modules/navigator/NavigatorControllerTest.java
+++ b/ide/spi.navigator/test/unit/src/org/netbeans/modules/navigator/NavigatorControllerTest.java
@@ -23,7 +23,6 @@
 import java.util.ArrayList;
 import java.util.List;
 import javax.swing.JComponent;
-import static junit.framework.Assert.assertNotNull;
 import org.netbeans.junit.NbTestCase;
 import org.netbeans.junit.RandomlyFails;
 import org.netbeans.modules.navigator.NavigatorTCTest.GlobalLookup4TestImpl;
diff --git a/ide/spi.navigator/test/unit/src/org/netbeans/modules/navigator/UnitTestUtils.java b/ide/spi.navigator/test/unit/src/org/netbeans/modules/navigator/UnitTestUtils.java
index 267299a..4902c93 100644
--- a/ide/spi.navigator/test/unit/src/org/netbeans/modules/navigator/UnitTestUtils.java
+++ b/ide/spi.navigator/test/unit/src/org/netbeans/modules/navigator/UnitTestUtils.java
@@ -20,15 +20,10 @@
 package org.netbeans.modules.navigator;
 
 import java.beans.PropertyVetoException;
-import java.io.File;
 import java.io.IOException;
 import java.net.URL;
 import javax.swing.text.Utilities;
-import junit.framework.Assert;
-import org.netbeans.junit.NbTestCase;
-import org.openide.filesystems.FileObject;
-import org.openide.filesystems.FileUtil;
-import org.openide.filesystems.LocalFileSystem;
+import org.junit.Assert;
 import org.openide.filesystems.Repository;
 import org.openide.filesystems.XMLFileSystem;
 import org.openide.util.Lookup;
diff --git a/ide/spi.palette/test/unit/src/org/netbeans/modules/palette/PaletteItemRegistrationProcessorTest.java b/ide/spi.palette/test/unit/src/org/netbeans/modules/palette/PaletteItemRegistrationProcessorTest.java
index 1b2f428..421e095 100644
--- a/ide/spi.palette/test/unit/src/org/netbeans/modules/palette/PaletteItemRegistrationProcessorTest.java
+++ b/ide/spi.palette/test/unit/src/org/netbeans/modules/palette/PaletteItemRegistrationProcessorTest.java
@@ -21,8 +21,6 @@
 import java.awt.GraphicsEnvironment;
 import java.io.ByteArrayOutputStream;
 import java.io.IOException;
-import static junit.framework.Assert.assertFalse;
-import static junit.framework.Assert.assertTrue;
 import org.netbeans.junit.NbTestCase;
 import org.openide.util.test.AnnotationProcessorTestUtils;
 
diff --git a/ide/spi.palette/test/unit/src/org/netbeans/spi/palette/IDEInitializer.java b/ide/spi.palette/test/unit/src/org/netbeans/spi/palette/IDEInitializer.java
index ba5cb99..a53d97f 100644
--- a/ide/spi.palette/test/unit/src/org/netbeans/spi/palette/IDEInitializer.java
+++ b/ide/spi.palette/test/unit/src/org/netbeans/spi/palette/IDEInitializer.java
@@ -26,7 +26,7 @@
 import java.net.URLStreamHandler;
 import java.net.URLStreamHandlerFactory;
 import java.util.Enumeration;
-import junit.framework.Assert;
+import org.junit.Assert;
 import org.netbeans.junit.Manager;
 import org.openide.filesystems.FileObject;
 import org.openide.filesystems.FileSystem;
diff --git a/ide/spi.tasklist/test/unit/src/org/netbeans/modules/tasklist/trampoline/IDEInitializer.java b/ide/spi.tasklist/test/unit/src/org/netbeans/modules/tasklist/trampoline/IDEInitializer.java
index 3dc2ccf..cddefef 100644
--- a/ide/spi.tasklist/test/unit/src/org/netbeans/modules/tasklist/trampoline/IDEInitializer.java
+++ b/ide/spi.tasklist/test/unit/src/org/netbeans/modules/tasklist/trampoline/IDEInitializer.java
@@ -26,7 +26,7 @@
 import java.net.URLStreamHandler;
 import java.net.URLStreamHandlerFactory;
 import java.util.Enumeration;
-import junit.framework.Assert;
+import org.junit.Assert;
 import org.netbeans.junit.Manager;
 import org.openide.filesystems.FileObject;
 import org.openide.filesystems.FileSystem;
diff --git a/ide/spi.tasklist/test/unit/src/org/netbeans/spi/tasklist/IDEInitializer.java b/ide/spi.tasklist/test/unit/src/org/netbeans/spi/tasklist/IDEInitializer.java
index 20a24a6..2f4ac07 100644
--- a/ide/spi.tasklist/test/unit/src/org/netbeans/spi/tasklist/IDEInitializer.java
+++ b/ide/spi.tasklist/test/unit/src/org/netbeans/spi/tasklist/IDEInitializer.java
@@ -26,7 +26,7 @@
 import java.net.URLStreamHandler;
 import java.net.URLStreamHandlerFactory;
 import java.util.Enumeration;
-import junit.framework.Assert;
+import org.junit.Assert;
 import org.netbeans.junit.Manager;
 import org.openide.filesystems.FileObject;
 import org.openide.filesystems.FileSystem;
diff --git a/ide/subversion/test/unit/src/org/netbeans/modules/subversion/client/SvnClientInvocationHandlerTest.java b/ide/subversion/test/unit/src/org/netbeans/modules/subversion/client/SvnClientInvocationHandlerTest.java
index b127458..4b2c6d8 100644
--- a/ide/subversion/test/unit/src/org/netbeans/modules/subversion/client/SvnClientInvocationHandlerTest.java
+++ b/ide/subversion/test/unit/src/org/netbeans/modules/subversion/client/SvnClientInvocationHandlerTest.java
@@ -25,7 +25,7 @@
 import java.util.HashSet;
 import java.util.List;
 import java.util.Set;
-import junit.framework.Assert;
+import org.junit.Assert;
 import org.junit.Test;
 import org.tigris.subversion.svnclientadapter.ISVNClientAdapter;
 
diff --git a/ide/team.commons/test/unit/src/org/netbeans/modules/bugtracking/commons/AutoupdatePluginUCTestCase.java b/ide/team.commons/test/unit/src/org/netbeans/modules/bugtracking/commons/AutoupdatePluginUCTestCase.java
index 9450072..b82411a 100644
--- a/ide/team.commons/test/unit/src/org/netbeans/modules/bugtracking/commons/AutoupdatePluginUCTestCase.java
+++ b/ide/team.commons/test/unit/src/org/netbeans/modules/bugtracking/commons/AutoupdatePluginUCTestCase.java
@@ -26,8 +26,6 @@
 import java.io.OutputStream;
 import java.net.URL;
 import java.text.MessageFormat;
-import static junit.framework.Assert.assertNotNull;
-import static junit.framework.Assert.assertNull;
 import org.netbeans.api.autoupdate.UpdateUnitProvider;
 import org.netbeans.api.autoupdate.UpdateUnitProviderFactory;
 import org.netbeans.junit.NbTestCase;
diff --git a/ide/team.commons/test/unit/src/org/netbeans/modules/bugtracking/commons/AutoupdateSupportTest.java b/ide/team.commons/test/unit/src/org/netbeans/modules/bugtracking/commons/AutoupdateSupportTest.java
index 16dd3e7..5851866 100644
--- a/ide/team.commons/test/unit/src/org/netbeans/modules/bugtracking/commons/AutoupdateSupportTest.java
+++ b/ide/team.commons/test/unit/src/org/netbeans/modules/bugtracking/commons/AutoupdateSupportTest.java
@@ -20,8 +20,6 @@
 package org.netbeans.modules.bugtracking.commons;
 
 import java.util.Calendar;
-import static junit.framework.Assert.assertFalse;
-import static junit.framework.Assert.assertTrue;
 import junit.framework.TestCase;
 
 /**
diff --git a/ide/utilities/test/unit/src/org/netbeans/modules/url/URLDataObjectTest.java b/ide/utilities/test/unit/src/org/netbeans/modules/url/URLDataObjectTest.java
index 8e4151a..c9ee870 100644
--- a/ide/utilities/test/unit/src/org/netbeans/modules/url/URLDataObjectTest.java
+++ b/ide/utilities/test/unit/src/org/netbeans/modules/url/URLDataObjectTest.java
@@ -20,9 +20,10 @@
 
 import java.io.BufferedReader;
 import java.io.StringReader;
-import static junit.framework.Assert.*;
 import org.junit.Test;
 
+import static org.junit.Assert.assertEquals;
+
 /**
  *
  * @author jhavlin
diff --git a/ide/versioning.core/test/unit/src/org/netbeans/modules/versioning/core/spi/VCSVisibilityQueryTest.java b/ide/versioning.core/test/unit/src/org/netbeans/modules/versioning/core/spi/VCSVisibilityQueryTest.java
index d5b3ab3..d772478 100644
--- a/ide/versioning.core/test/unit/src/org/netbeans/modules/versioning/core/spi/VCSVisibilityQueryTest.java
+++ b/ide/versioning.core/test/unit/src/org/netbeans/modules/versioning/core/spi/VCSVisibilityQueryTest.java
@@ -26,7 +26,6 @@
 import java.util.ArrayList;
 import java.util.List;
 import javax.swing.event.ChangeListener;
-import junit.framework.Assert;
 import org.netbeans.api.queries.VisibilityQuery;
 import org.netbeans.junit.NbTestCase;
 import org.netbeans.modules.versioning.core.VersioningManager;
@@ -100,9 +99,9 @@
         VisibilityQuery.getDefault().addChangeListener(list = new ChangeListener() {
             @Override
             public void stateChanged(ChangeEvent ce) {
-                Assert.assertTrue(ce instanceof VisibilityQueryChangeEvent);
+                assertTrue(ce instanceof VisibilityQueryChangeEvent);
                 FileObject[] fos = ((VisibilityQueryChangeEvent)ce).getFileObjects();
-                Assert.assertEquals(2, fos.length);
+                assertEquals(2, fos.length);
                 received.add(fos[0].getName());
                 received.add(fos[1].getName());
             }
diff --git a/ide/versioning/test/unit/src/org/netbeans/modules/versioning/spi/VCSVisibilityQueryTest.java b/ide/versioning/test/unit/src/org/netbeans/modules/versioning/spi/VCSVisibilityQueryTest.java
index d250c44..40abb44 100644
--- a/ide/versioning/test/unit/src/org/netbeans/modules/versioning/spi/VCSVisibilityQueryTest.java
+++ b/ide/versioning/test/unit/src/org/netbeans/modules/versioning/spi/VCSVisibilityQueryTest.java
@@ -27,7 +27,6 @@
 import java.util.ArrayList;
 import java.util.List;
 import javax.swing.event.ChangeListener;
-import junit.framework.Assert;
 import org.netbeans.api.queries.VisibilityQuery;
 import org.netbeans.junit.NbTestCase;
 import org.netbeans.modules.versioning.spi.testvcs.TestVCS;
@@ -98,9 +97,9 @@
         VisibilityQuery.getDefault().addChangeListener(list = new ChangeListener() {
             @Override
             public void stateChanged(ChangeEvent ce) {
-                Assert.assertTrue(ce instanceof VisibilityQueryChangeEvent);
+                assertTrue(ce instanceof VisibilityQueryChangeEvent);
                 FileObject[] fos = ((VisibilityQueryChangeEvent)ce).getFileObjects();
-                Assert.assertEquals(2, fos.length);
+                assertEquals(2, fos.length);
                 received.add(fos[0].getName());
                 received.add(fos[1].getName());
             }
diff --git a/ide/xml.schema.completion/test/unit/src/org/netbeans/modules/xml/schema/completion/util/CompletionContextImplTest.java b/ide/xml.schema.completion/test/unit/src/org/netbeans/modules/xml/schema/completion/util/CompletionContextImplTest.java
index 7c87ad3..e378bbb 100644
--- a/ide/xml.schema.completion/test/unit/src/org/netbeans/modules/xml/schema/completion/util/CompletionContextImplTest.java
+++ b/ide/xml.schema.completion/test/unit/src/org/netbeans/modules/xml/schema/completion/util/CompletionContextImplTest.java
@@ -22,7 +22,6 @@
 import java.util.List;
 import javax.swing.text.Document;
 import javax.xml.namespace.QName;
-import static junit.framework.Assert.assertEquals;
 import org.junit.Test;
 import org.netbeans.api.lexer.Language;
 import org.netbeans.api.xml.lexer.XMLTokenId;
@@ -30,6 +29,8 @@
 import org.netbeans.modules.xml.text.api.dom.XMLSyntaxSupport;
 import org.openide.filesystems.FileObject;
 
+import static org.junit.Assert.assertEquals;
+
 public class CompletionContextImplTest {
     @Test
     public void testDetectedPaths() throws Exception {
diff --git a/java/beans/test/qa-functional/src/org/netbeans/test/beans/operators/Navigator.java b/java/beans/test/qa-functional/src/org/netbeans/test/beans/operators/Navigator.java
index 55fa24c..02a71d0 100644
--- a/java/beans/test/qa-functional/src/org/netbeans/test/beans/operators/Navigator.java
+++ b/java/beans/test/qa-functional/src/org/netbeans/test/beans/operators/Navigator.java
@@ -26,7 +26,6 @@
 import java.util.Stack;
 import javax.swing.tree.TreeNode;
 import javax.swing.tree.TreePath;
-import static junit.framework.Assert.fail;
 import org.netbeans.jellytools.TopComponentOperator;
 import org.netbeans.jemmy.TimeoutExpiredException;
 import org.netbeans.jemmy.Waitable;
@@ -38,6 +37,7 @@
 import org.openide.explorer.view.Visualizer;
 import org.openide.nodes.Node;
 
+import static org.junit.Assert.fail;
 
 /**
  *
diff --git a/java/debugger.jpda/nbproject/org-netbeans-modules-debugger-jpda.sig b/java/debugger.jpda/nbproject/org-netbeans-modules-debugger-jpda.sig
index 5a10587..fb6f2e7 100644
--- a/java/debugger.jpda/nbproject/org-netbeans-modules-debugger-jpda.sig
+++ b/java/debugger.jpda/nbproject/org-netbeans-modules-debugger-jpda.sig
@@ -27,7 +27,6 @@
 meth public abstract {com.sun.source.tree.TreeVisitor%0} visitExports(com.sun.source.tree.ExportsTree,{com.sun.source.tree.TreeVisitor%1})
 meth public abstract {com.sun.source.tree.TreeVisitor%0} visitExpressionStatement(com.sun.source.tree.ExpressionStatementTree,{com.sun.source.tree.TreeVisitor%1})
 meth public abstract {com.sun.source.tree.TreeVisitor%0} visitForLoop(com.sun.source.tree.ForLoopTree,{com.sun.source.tree.TreeVisitor%1})
-meth public abstract {com.sun.source.tree.TreeVisitor%0} visitGuardedPattern(com.sun.source.tree.GuardedPatternTree,{com.sun.source.tree.TreeVisitor%1})
 meth public abstract {com.sun.source.tree.TreeVisitor%0} visitIdentifier(com.sun.source.tree.IdentifierTree,{com.sun.source.tree.TreeVisitor%1})
 meth public abstract {com.sun.source.tree.TreeVisitor%0} visitIf(com.sun.source.tree.IfTree,{com.sun.source.tree.TreeVisitor%1})
 meth public abstract {com.sun.source.tree.TreeVisitor%0} visitImport(com.sun.source.tree.ImportTree,{com.sun.source.tree.TreeVisitor%1})
@@ -108,7 +107,6 @@
 meth public {com.sun.source.util.TreeScanner%0} visitExports(com.sun.source.tree.ExportsTree,{com.sun.source.util.TreeScanner%1})
 meth public {com.sun.source.util.TreeScanner%0} visitExpressionStatement(com.sun.source.tree.ExpressionStatementTree,{com.sun.source.util.TreeScanner%1})
 meth public {com.sun.source.util.TreeScanner%0} visitForLoop(com.sun.source.tree.ForLoopTree,{com.sun.source.util.TreeScanner%1})
-meth public {com.sun.source.util.TreeScanner%0} visitGuardedPattern(com.sun.source.tree.GuardedPatternTree,{com.sun.source.util.TreeScanner%1})
 meth public {com.sun.source.util.TreeScanner%0} visitIdentifier(com.sun.source.tree.IdentifierTree,{com.sun.source.util.TreeScanner%1})
 meth public {com.sun.source.util.TreeScanner%0} visitIf(com.sun.source.tree.IfTree,{com.sun.source.util.TreeScanner%1})
 meth public {com.sun.source.util.TreeScanner%0} visitImport(com.sun.source.tree.ImportTree,{com.sun.source.util.TreeScanner%1})
diff --git a/java/debugger.jpda/nbproject/project.properties b/java/debugger.jpda/nbproject/project.properties
index d72f135..a8853bf 100644
--- a/java/debugger.jpda/nbproject/project.properties
+++ b/java/debugger.jpda/nbproject/project.properties
@@ -23,7 +23,7 @@
 javadoc.arch=${basedir}/arch.xml
 jpda.classes.dir=${build.dir}/jpda/classes/
 requires.nb.javac=true
-spec.version.base=1.126.0
+spec.version.base=1.127.0
 test-unit-sys-prop.test.dir.src=${basedir}/test/unit/src/
 test-unit-sys-prop.netbeans.user=${basedir}/work/nb_user_dir
 test.unit.cp.extra=../java.source.nbjavac/build/test-nb-javac/cluster/modules/org-netbeans-modules-java-source-nbjavac-test.jar
diff --git a/java/gradle.java/src/org/netbeans/modules/gradle/java/queries/GradleDependencyResult.java b/java/gradle.java/src/org/netbeans/modules/gradle/java/queries/GradleDependencyResult.java
index a7dd5de..eeeffd9 100644
--- a/java/gradle.java/src/org/netbeans/modules/gradle/java/queries/GradleDependencyResult.java
+++ b/java/gradle.java/src/org/netbeans/modules/gradle/java/queries/GradleDependencyResult.java
@@ -20,6 +20,7 @@
 
 import java.beans.PropertyChangeEvent;
 import java.beans.PropertyChangeListener;
+import java.io.File;
 import java.io.IOException;
 import java.util.ArrayList;
 import java.util.Collection;
@@ -76,7 +77,8 @@
         this.gradleProject = gradleProject;
         this.root = root;
         this.gp = NbGradleProject.get(gradleProject);
-        this.projectFile = FileUtil.toFileObject(gp.getGradleFiles().getBuildScript());
+        File bs = gp.getGradleFiles().getBuildScript();
+        this.projectFile = bs == null ? null : FileUtil.toFileObject(gp.getGradleFiles().getBuildScript());
     }
     
     @Override
@@ -173,18 +175,21 @@
         });
         
         String contents = null;
-        EditorCookie cake = projectFile.getLookup().lookup(EditorCookie.class);
-        if (cake != null) {
-            Document doc = cake.getDocument();
-            if (doc != null) {
-                String[] docContent = new String[1];
-                doc.render(() -> {
-                    try {
-                        docContent[0] = doc.getText(0, doc.getLength());
-                    } catch (BadLocationException ex) {
-                        // ignore
-                    }
-                });
+        if (projectFile != null) {
+            EditorCookie cake = null;
+            cake = projectFile.getLookup().lookup(EditorCookie.class);
+            if (cake != null) {
+                Document doc = cake.getDocument();
+                if (doc != null) {
+                    String[] docContent = new String[1];
+                    doc.render(() -> {
+                        try {
+                            docContent[0] = doc.getText(0, doc.getLength());
+                        } catch (BadLocationException ex) {
+                            // ignore
+                        }
+                    });
+                }
             }
         }
         if (contents == null) {
diff --git a/java/j2ee.metadata.model.support/test/unit/src/org/netbeans/modules/j2ee/metadata/model/api/support/annotation/PersistentObjectManagerTest.java b/java/j2ee.metadata.model.support/test/unit/src/org/netbeans/modules/j2ee/metadata/model/api/support/annotation/PersistentObjectManagerTest.java
index 4daacdd..fdf97fc 100644
--- a/java/j2ee.metadata.model.support/test/unit/src/org/netbeans/modules/j2ee/metadata/model/api/support/annotation/PersistentObjectManagerTest.java
+++ b/java/j2ee.metadata.model.support/test/unit/src/org/netbeans/modules/j2ee/metadata/model/api/support/annotation/PersistentObjectManagerTest.java
@@ -32,7 +32,6 @@
 import javax.lang.model.element.AnnotationMirror;
 import javax.lang.model.element.Element;
 import javax.lang.model.element.TypeElement;
-import static junit.framework.Assert.assertTrue;
 import org.netbeans.api.java.classpath.ClassPath;
 import org.netbeans.api.java.classpath.GlobalPathRegistry;
 import org.netbeans.api.java.source.ClassIndex;
diff --git a/java/java.completion/test/unit/data/org/netbeans/modules/java/completion/data/SwitchPatternMatching.java b/java/java.completion/test/unit/data/org/netbeans/modules/java/completion/data/SwitchPatternMatching.java
index 82cc419..9703698 100644
--- a/java/java.completion/test/unit/data/org/netbeans/modules/java/completion/data/SwitchPatternMatching.java
+++ b/java/java.completion/test/unit/data/org/netbeans/modules/java/completion/data/SwitchPatternMatching.java
@@ -28,9 +28,9 @@
         String result = switch (obj) {
             case null, String  ->
                 "null & String";
-            case CharSequence s && s. && obj. && IntStream.of(1).max().->
+            case CharSequence s when s. && obj. && IntStream.of(1).max().->
                 "CharSequence";
-            case (java.util.List list && list. && new StringBuilder().ERROR. && java.util.ArrayList<String>.)->"list";
+            case (java.util.List list when list. && new StringBuilder().ERROR. && java.util.ArrayList<String>.)->"list";
             default ->
                 "default";
         };
diff --git a/java/java.completion/test/unit/src/org/netbeans/modules/java/completion/CompletionTestBaseBase.java b/java/java.completion/test/unit/src/org/netbeans/modules/java/completion/CompletionTestBaseBase.java
index 3e71573..a25e9cf 100644
--- a/java/java.completion/test/unit/src/org/netbeans/modules/java/completion/CompletionTestBaseBase.java
+++ b/java/java.completion/test/unit/src/org/netbeans/modules/java/completion/CompletionTestBaseBase.java
@@ -33,8 +33,6 @@
 
 import javax.swing.JEditorPane;
 
-import junit.framework.Assert;
-
 import org.netbeans.api.editor.mimelookup.MimeLookup;
 import org.netbeans.api.java.classpath.ClassPath;
 import org.netbeans.api.java.classpath.JavaClassPathConstants;
@@ -78,7 +76,7 @@
         private static Lkp DEFAULT;
 
         public Lkp() {
-            Assert.assertNull(DEFAULT);
+            assertNull(DEFAULT);
             DEFAULT = this;
         }
 
@@ -195,7 +193,7 @@
                 layers.add(en.nextElement());
             }
 
-            Assert.assertTrue(paths[cntr], found);
+            assertTrue(paths[cntr], found);
         }
 
         return layers.toArray(new URL[0]);
diff --git a/java/java.completion/test/unit/src/org/netbeans/modules/java/completion/JavaCompletionTask117FeaturesTest.java b/java/java.completion/test/unit/src/org/netbeans/modules/java/completion/JavaCompletionTask117FeaturesTest.java
index 4318fb3..a9e7981 100644
--- a/java/java.completion/test/unit/src/org/netbeans/modules/java/completion/JavaCompletionTask117FeaturesTest.java
+++ b/java/java.completion/test/unit/src/org/netbeans/modules/java/completion/JavaCompletionTask117FeaturesTest.java
@@ -58,24 +58,24 @@
 
     public void testClassMembersAutoCompletion_GuardedPattern() throws Exception {
         TestCompilerOptionsQueryImplementation.EXTRA_OPTIONS.add("--enable-preview");
-        performTest("SwitchPatternMatching", 1085, null, "AutoCompletion_MembersSelect_GuardedPatternMatchingSwitch.pass", getLatestSource());
+        performTest("SwitchPatternMatching", 1087, null, "AutoCompletion_MembersSelect_GuardedPatternMatchingSwitch.pass", getLatestSource());
     }
 
     public void testClassMembersAutoCompletion_GuardedPattern_1() throws Exception {
         TestCompilerOptionsQueryImplementation.EXTRA_OPTIONS.add("--enable-preview");
-        performTest("SwitchPatternMatching", 1093, null, "AutoCompletion_MembersSelect_GuardedPatternMatchingSwitch_1.pass", getLatestSource());
+        performTest("SwitchPatternMatching", 1095, null, "AutoCompletion_MembersSelect_GuardedPatternMatchingSwitch_1.pass", getLatestSource());
     }
     public void testClassMembersAutoCompletion_GuardedPattern_2() throws Exception {
         TestCompilerOptionsQueryImplementation.EXTRA_OPTIONS.add("--enable-preview");
-        performTest("SwitchPatternMatching", 1113, null, "AutoCompletion_MembersSelect_GuardedPatternMatchingSwitch_2.pass", getLatestSource());
+        performTest("SwitchPatternMatching", 1115, null, "AutoCompletion_MembersSelect_GuardedPatternMatchingSwitch_2.pass", getLatestSource());
     }
     public void testClassMembersAutoCompletion_ParanthesizedPattern() throws Exception {
         TestCompilerOptionsQueryImplementation.EXTRA_OPTIONS.add("--enable-preview");
-        performTest("SwitchPatternMatching", 1200, null, "AutoCompletion_MembersSelect_ParenthesizedPatternMatchingSwitch.pass", getLatestSource());
+        performTest("SwitchPatternMatching", 1204, null, "AutoCompletion_MembersSelect_ParenthesizedPatternMatchingSwitch.pass", getLatestSource());
     }
     public void testClassMembersAutoCompletion_ParanthesizedPattern_1() throws Exception {
         TestCompilerOptionsQueryImplementation.EXTRA_OPTIONS.add("--enable-preview");
-        performTest("SwitchPatternMatching", 1224, null, "AutoCompletion_MembersSelect_ParenthesizedPatternMatchingSwitch_1.pass", getLatestSource());
+        performTest("SwitchPatternMatching", 1228, null, "AutoCompletion_MembersSelect_ParenthesizedPatternMatchingSwitch_1.pass", getLatestSource());
     }
     public void noop() {
     }
diff --git a/java/java.editor/src/org/netbeans/modules/editor/java/JavaCodeTemplateFilter.java b/java/java.editor/src/org/netbeans/modules/editor/java/JavaCodeTemplateFilter.java
index c93e2b3..85a6555 100644
--- a/java/java.editor/src/org/netbeans/modules/editor/java/JavaCodeTemplateFilter.java
+++ b/java/java.editor/src/org/netbeans/modules/editor/java/JavaCodeTemplateFilter.java
@@ -19,6 +19,7 @@
 
 package org.netbeans.modules.editor.java;
 
+import com.sun.source.tree.CaseLabelTree;
 import com.sun.source.tree.Tree;
 import java.util.ArrayList;
 import java.util.Collections;
@@ -112,12 +113,23 @@
                                     }
                                     treeKindCtx = tree.getKind();
                                     switch (treeKindCtx) {
-                                        case CASE:
-                                            if (so < controller.getTrees().getSourcePositions().getEndPosition(controller.getCompilationUnit(), ((CaseTree)tree).getExpression())) {
+                                        case CASE: {
+                                            if (((CaseTree)tree).getCaseKind() == CaseTree.CaseKind.RULE) {
                                                 treeKindCtx = null;
+                                            } else {
+                                                SourcePositions sp = controller.getTrees().getSourcePositions();
+                                                List<? extends CaseLabelTree> labels = ((CaseTree)tree).getLabels();
+                                                int startPos = labels.isEmpty() ? (int) sp.getEndPosition(controller.getCompilationUnit(), labels.get(labels.size() - 1))
+                                                        : (int)sp.getStartPosition(controller.getCompilationUnit(), tree);
+                                                String headerText = controller.getText().substring(startPos, so);
+                                                int idx = headerText.indexOf(':');
+                                                if (idx < 0) {
+                                                    treeKindCtx = null;
+                                                }
                                             }
                                             break;
-                                        case CLASS:
+                                        }
+                                        case CLASS: {
                                             SourcePositions sp = controller.getTrees().getSourcePositions();
                                             int startPos = (int)sp.getEndPosition(controller.getCompilationUnit(), ((ClassTree)tree).getModifiers());
                                             if (startPos <= 0) {
@@ -130,6 +142,7 @@
                                                 stringCtx = CLASS_HEADER;
                                             }
                                             break;
+                                        }
                                         case FOR_LOOP:
                                         case ENHANCED_FOR_LOOP:
                                             if (!isRightParenthesisOfLoopPresent(controller, so)) {
diff --git a/java/java.editor/test/qa-functional/src/org/netbeans/test/java/editor/codetemplates/CustomizedLog.java b/java/java.editor/test/qa-functional/src/org/netbeans/test/java/editor/codetemplates/CustomizedLog.java
index 19c079b..8495298 100644
--- a/java/java.editor/test/qa-functional/src/org/netbeans/test/java/editor/codetemplates/CustomizedLog.java
+++ b/java/java.editor/test/qa-functional/src/org/netbeans/test/java/editor/codetemplates/CustomizedLog.java
@@ -35,8 +35,8 @@
 import java.util.logging.Level;
 import java.util.logging.LogRecord;
 import java.util.logging.Logger;
-import junit.framework.Assert;
 import junit.framework.AssertionFailedError;
+import org.junit.Assert;
 import org.netbeans.junit.Log;
 import org.netbeans.junit.NbTestCase;
 
diff --git a/java/java.hints/src/org/netbeans/modules/java/hints/bugs/InfiniteRecursion.java b/java/java.hints/src/org/netbeans/modules/java/hints/bugs/InfiniteRecursion.java
index 77d2641..47ab70f 100644
--- a/java/java.hints/src/org/netbeans/modules/java/hints/bugs/InfiniteRecursion.java
+++ b/java/java.hints/src/org/netbeans/modules/java/hints/bugs/InfiniteRecursion.java
@@ -23,6 +23,7 @@
 import com.sun.source.tree.CaseTree;
 import com.sun.source.tree.ClassTree;
 import com.sun.source.tree.ConditionalExpressionTree;
+import com.sun.source.tree.ConstantCaseLabelTree;
 import com.sun.source.tree.ContinueTree;
 import com.sun.source.tree.DoWhileLoopTree;
 import com.sun.source.tree.EnhancedForLoopTree;
@@ -551,6 +552,11 @@
         }
 
         @Override
+        public State visitConstantCaseLabel(ConstantCaseLabelTree node, Void p) {
+            return super.scan(node.getConstantExpression(), p);
+        }
+
+        @Override
         public State visitEnhancedForLoop(EnhancedForLoopTree node, Void p) {
             State s;
 
diff --git a/java/java.hints/src/org/netbeans/modules/java/hints/suggestions/ExpectedTypeResolver.java b/java/java.hints/src/org/netbeans/modules/java/hints/suggestions/ExpectedTypeResolver.java
index e87f86e..56fd371 100644
--- a/java/java.hints/src/org/netbeans/modules/java/hints/suggestions/ExpectedTypeResolver.java
+++ b/java/java.hints/src/org/netbeans/modules/java/hints/suggestions/ExpectedTypeResolver.java
@@ -34,7 +34,9 @@
 import com.sun.source.tree.CompilationUnitTree;
 import com.sun.source.tree.CompoundAssignmentTree;
 import com.sun.source.tree.ConditionalExpressionTree;
+import com.sun.source.tree.ConstantCaseLabelTree;
 import com.sun.source.tree.ContinueTree;
+import com.sun.source.tree.DeconstructionPatternTree;
 import com.sun.source.tree.DefaultCaseLabelTree;
 import com.sun.source.tree.DoWhileLoopTree;
 import com.sun.source.tree.EmptyStatementTree;
@@ -44,7 +46,6 @@
 import com.sun.source.tree.ExpressionStatementTree;
 import com.sun.source.tree.ExpressionTree;
 import com.sun.source.tree.ForLoopTree;
-import com.sun.source.tree.GuardedPatternTree;
 import com.sun.source.tree.IdentifierTree;
 import com.sun.source.tree.IfTree;
 import com.sun.source.tree.ImportTree;
@@ -66,6 +67,7 @@
 import com.sun.source.tree.ParameterizedTypeTree;
 import com.sun.source.tree.ParenthesizedPatternTree;
 import com.sun.source.tree.ParenthesizedTree;
+import com.sun.source.tree.PatternCaseLabelTree;
 import com.sun.source.tree.PrimitiveTypeTree;
 import com.sun.source.tree.ProvidesTree;
 import com.sun.source.tree.RequiresTree;
@@ -110,7 +112,6 @@
 import javax.lang.model.type.PrimitiveType;
 import javax.lang.model.type.TypeKind;
 import javax.lang.model.type.TypeMirror;
-import javax.lang.model.type.TypeVariable;
 import javax.lang.model.type.UnionType;
 import javax.lang.model.type.WildcardType;
 import javax.lang.model.util.ElementFilter;
@@ -1416,7 +1417,17 @@
     }
 
     @Override
-    public List<? extends TypeMirror> visitGuardedPattern(GuardedPatternTree node, Object p) {
+    public List<? extends TypeMirror> visitConstantCaseLabel(ConstantCaseLabelTree node, Object p) {
+        return null;
+    }
+
+    @Override
+    public List<? extends TypeMirror> visitPatternCaseLabel(PatternCaseLabelTree node, Object p) {
+        return null;
+    }
+
+    @Override
+    public List<? extends TypeMirror> visitDeconstructionPattern(DeconstructionPatternTree node, Object p) {
         return null;
     }
 
diff --git a/java/java.hints/test/unit/src/org/netbeans/modules/java/hints/jdk/ConvertSwitchToRuleSwitchTest.java b/java/java.hints/test/unit/src/org/netbeans/modules/java/hints/jdk/ConvertSwitchToRuleSwitchTest.java
index b87dc9f..61ff166 100644
--- a/java/java.hints/test/unit/src/org/netbeans/modules/java/hints/jdk/ConvertSwitchToRuleSwitchTest.java
+++ b/java/java.hints/test/unit/src/org/netbeans/modules/java/hints/jdk/ConvertSwitchToRuleSwitchTest.java
@@ -987,10 +987,10 @@
         HintTest.create()
                 .input("package test;" +
                         "public class Test {\n" +
-                        "     private void test(int p) {\n" +
+                        "     private void test(Object p) {\n" +
                         "         String result;\n" +
                         "         switch (p) {\n" +
-                        "            case Integer i && (i > 10): result = \"a\"; break;\n" +
+                        "            case Integer i when (i > 10): result = \"a\"; break;\n" +
                         "            default: System.err.println(\"No.\"); break;\n" +
                         "         }\n" +
                         "     }\n" +
@@ -1003,10 +1003,10 @@
                 .assertCompilable()
                 .assertVerbatimOutput("package test;" +
                         "public class Test {\n" +
-                        "     private void test(int p) {\n" +
+                        "     private void test(Object p) {\n" +
                         "         String result;\n" +
                         "         switch (p) {\n" +
-                        "            case Integer i && (i > 10) -> result = \"a\";\n" +
+                        "            case Integer i when (i > 10) -> result = \"a\";\n" +
                         "            default -> System.err.println(\"No.\");\n" +
                         "         }\n" +
                         "     }\n" +
@@ -1025,7 +1025,7 @@
                         + "class Test {\n"
                         + "    public String test(Object p, Object o1, Object o2) {\n"
                         + "        switch (p) {\n"
-                        + "            case (Integer i  && (i > 10)):\n"
+                        + "            case (Integer i)  when (i > 10):\n"
                         + "               return (String) o1;\n"
                         + "            default :\n"
                         + "                return (String) o2;\n"
@@ -1042,7 +1042,7 @@
                             + "class Test {\n"
                             + "    public String test(Object p, Object o1, Object o2) {\n"
                             + "        return (String) (switch (p) {\n"
-                            + "            case (Integer i  && (i > 10)) -> o1;\n"
+                            + "            case (Integer i)  when (i > 10) -> o1;\n"
                             + "            default -> o2;\n"
                             + "        });\n"
                             + "    }\n"
diff --git a/java/java.j2seproject/test/unit/src/org/netbeans/modules/java/j2seproject/api/J2SEProjectPlatformTest.java b/java/java.j2seproject/test/unit/src/org/netbeans/modules/java/j2seproject/api/J2SEProjectPlatformTest.java
index 320d488..b51bc6f 100644
--- a/java/java.j2seproject/test/unit/src/org/netbeans/modules/java/j2seproject/api/J2SEProjectPlatformTest.java
+++ b/java/java.j2seproject/test/unit/src/org/netbeans/modules/java/j2seproject/api/J2SEProjectPlatformTest.java
@@ -29,7 +29,6 @@
 import java.util.List;
 import java.util.Map;
 import java.util.concurrent.atomic.AtomicBoolean;
-import static junit.framework.Assert.assertEquals;
 import org.netbeans.api.annotations.common.NonNull;
 import org.netbeans.api.java.classpath.ClassPath;
 import org.netbeans.api.java.platform.JavaPlatform;
diff --git a/java/java.kit/nbproject/project.xml b/java/java.kit/nbproject/project.xml
index 3f769e4..be9d02d 100644
--- a/java/java.kit/nbproject/project.xml
+++ b/java/java.kit/nbproject/project.xml
@@ -238,6 +238,12 @@
                     </run-dependency>
                 </dependency>
                 <dependency>
+                    <code-name-base>org.netbeans.modules.languages.antlr</code-name-base>
+                    <run-dependency>
+                        <specification-version>1.0</specification-version>
+                    </run-dependency>
+                </dependency>
+                <dependency>
                     <code-name-base>org.netbeans.modules.nashorn.execution</code-name-base>
                     <run-dependency>
                         <release-version>1</release-version>
diff --git a/java/java.kit/test/qa-functional/src/org/netbeans/test/ide/WatchProjects.java b/java/java.kit/test/qa-functional/src/org/netbeans/test/ide/WatchProjects.java
index bad7652..be9b02b 100644
--- a/java/java.kit/test/qa-functional/src/org/netbeans/test/ide/WatchProjects.java
+++ b/java/java.kit/test/qa-functional/src/org/netbeans/test/ide/WatchProjects.java
@@ -33,8 +33,8 @@
 import java.util.logging.Level;
 import java.util.logging.Logger;
 import javax.swing.*;
-import junit.framework.Assert;
 import junit.framework.AssertionFailedError;
+import org.junit.Assert;
 import org.netbeans.api.java.source.ui.ScanDialog;
 import org.netbeans.api.project.Project;
 import org.netbeans.api.project.ui.OpenProjects;
diff --git a/java/java.lsp.server/nbcode/integration/src/org/netbeans/modules/nbcode/integration/commands/ProjectMetadataCommand.java b/java/java.lsp.server/nbcode/integration/src/org/netbeans/modules/nbcode/integration/commands/ProjectMetadataCommand.java
index 2cc483e..eabfd06 100644
--- a/java/java.lsp.server/nbcode/integration/src/org/netbeans/modules/nbcode/integration/commands/ProjectMetadataCommand.java
+++ b/java/java.lsp.server/nbcode/integration/src/org/netbeans/modules/nbcode/integration/commands/ProjectMetadataCommand.java
@@ -22,6 +22,8 @@
 import com.google.gson.FieldAttributes;
 import com.google.gson.Gson;
 import com.google.gson.GsonBuilder;
+import com.google.gson.JsonArray;
+import com.google.gson.JsonObject;
 import com.google.gson.JsonPrimitive;
 import com.google.gson.TypeAdapter;
 import com.google.gson.TypeAdapterFactory;
@@ -132,7 +134,7 @@
     public Set<String> getCommands() {
         return COMMANDS;
     }
-
+    
     @Override
     public CompletableFuture<Object> processCommand(NbCodeLanguageClient client, String command, List<Object> arguments) {
         if (arguments.size() < 1) {
@@ -140,29 +142,79 @@
         }
         FileObject f = Utils.extractFileObject(arguments.get(0), gson);
         Project p = FileOwnerQuery.getOwner(f);
-        if (p == null || p.getProjectDirectory() != f) {
+        if (p == null) {
             throw new IllegalArgumentException("Not a project " + f);
         }
         String artifactType = null;
         ProjectActionContext ctx = null;
+        String[] tags = null;
+        String classifier = null;
         
         if (arguments.size() > 1) {
             // 2nd parameter is the project action
             Object o = arguments.get(1);
-            if (!(o instanceof JsonPrimitive)) {
-                throw new IllegalArgumentException("String or null expected as parameter #3, got " + o);
+            if (o instanceof JsonObject) {
+                JsonObject request = (JsonObject)o;
+                if (request.has("action")) {
+                    Object a = request.get("action");
+                    if (a instanceof JsonPrimitive) {
+                        ctx = ProjectActionContext.newBuilder(p).forProjectAction(((JsonPrimitive)a).getAsString()).context();
+                    } else {
+                        throw new IllegalArgumentException("String expected as action, got " + a);
+                    }
+                }
+                if (request.has("type")) {
+                    Object t = request.get("type");
+                    if (t instanceof JsonPrimitive) {
+                        artifactType = ((JsonPrimitive)t).getAsString();
+                    } else {
+                        throw new IllegalArgumentException("String expected as type, got " + t);
+                    }
+                }
+                if (request.has("classifier")) {
+                    Object c = request.get("classifier");
+                    if (c instanceof JsonPrimitive) {
+                        classifier = ((JsonPrimitive)c).getAsString();
+                    } else {
+                        throw new IllegalArgumentException("String expected as classifier, got " + c);
+                    }
+                }
+                if (request.has("tags")) {
+                    Object t = request.get("tags");
+                    if (t instanceof JsonPrimitive) {
+                        tags = new String[] { ((JsonPrimitive)t).getAsString() };
+                    } else if (t instanceof JsonArray) {
+                        JsonArray arr = (JsonArray)t;
+                        tags = new String[arr.size()];
+                        int index = 0;
+                        for (Object item : arr) {
+                            if (item instanceof JsonPrimitive) {
+                                tags[index++] = ((JsonPrimitive)item).getAsString();
+                            } else {
+                                throw new IllegalArgumentException("String expected as tag, got " + item);
+                            }
+                        }
+                    } else {
+                        throw new IllegalArgumentException("String or array expected as tags, got " + t);
+                    }
+                }
+                
+            } else if (o instanceof JsonPrimitive) {
+                ctx = ProjectActionContext.newBuilder(p).forProjectAction(((JsonPrimitive)o).getAsString()).context();
+            } else {
+                throw new IllegalArgumentException("String, structure, or null expected as parameter #2, got " + o);
             }
-            ctx = ProjectActionContext.newBuilder(p).forProjectAction(((JsonPrimitive)o).getAsString()).context();
+            
         }
         if (arguments.size() > 2) {
             // 3rd parameter is the type of artifact
             Object o = arguments.get(2);
             if (!(o instanceof JsonPrimitive)) {
-                throw new IllegalArgumentException("String or null expected as parameter #2, got " + o);
+                throw new IllegalArgumentException("String or null expected as parameter #3, got " + o);
             }
             artifactType = ((JsonPrimitive)o).getAsString();
         }
-        ProjectArtifactsQuery.Filter filter = ProjectArtifactsQuery.newQuery(artifactType, null, ctx);
+        ProjectArtifactsQuery.Filter filter = ProjectArtifactsQuery.newQuery(artifactType, classifier, ctx, tags);
         CompletableFuture result = new CompletableFuture();
         METADATA_PROCESSOR.post(() -> {
             try {
diff --git a/java/java.lsp.server/src/org/netbeans/modules/java/lsp/server/protocol/WorkspaceServiceImpl.java b/java/java.lsp.server/src/org/netbeans/modules/java/lsp/server/protocol/WorkspaceServiceImpl.java
index 2060a45..d7e4494 100644
--- a/java/java.lsp.server/src/org/netbeans/modules/java/lsp/server/protocol/WorkspaceServiceImpl.java
+++ b/java/java.lsp.server/src/org/netbeans/modules/java/lsp/server/protocol/WorkspaceServiceImpl.java
@@ -609,6 +609,7 @@
                             }
                         }
                     });
+                    locations = locs.toArray(new URL[0]);
                 } else if (o instanceof JsonPrimitive) {
                     String s = ((JsonPrimitive)o).getAsString();
                     try {
diff --git a/java/java.mx.project/src/org/netbeans/modules/java/mx/project/CoreSuite.java b/java/java.mx.project/src/org/netbeans/modules/java/mx/project/CoreSuite.java
index d227009..28e1b85 100644
--- a/java/java.mx.project/src/org/netbeans/modules/java/mx/project/CoreSuite.java
+++ b/java/java.mx.project/src/org/netbeans/modules/java/mx/project/CoreSuite.java
@@ -161,6 +161,13 @@
             }
 
             @Override
+            public List<String> generatedDependencies() {
+                return Collections.emptyList();
+            }
+
+
+
+            @Override
             public List<String> annotationProcessors() {
                 return annotationProcessors;
             }
diff --git a/java/java.mx.project/src/org/netbeans/modules/java/mx/project/SuiteProject.java b/java/java.mx.project/src/org/netbeans/modules/java/mx/project/SuiteProject.java
index ee2e8f9..0de2b68 100644
--- a/java/java.mx.project/src/org/netbeans/modules/java/mx/project/SuiteProject.java
+++ b/java/java.mx.project/src/org/netbeans/modules/java/mx/project/SuiteProject.java
@@ -19,9 +19,13 @@
 package org.netbeans.modules.java.mx.project;
 
 import java.io.File;
+import java.util.Arrays;
+import java.util.List;
 import java.util.concurrent.Future;
+import javax.swing.event.ChangeListener;
 import org.netbeans.modules.java.mx.project.suitepy.MxSuite;
 import org.netbeans.api.project.Project;
+import org.netbeans.spi.java.queries.CompilerOptionsQueryImplementation;
 import org.openide.filesystems.FileObject;
 import org.openide.filesystems.FileUtil;
 import org.openide.util.Exceptions;
@@ -46,7 +50,8 @@
                 new SuiteLogicalView(this),
                 new SuiteClassPathProvider(this, jdks),
                 new SuiteProperties(),
-                new SuiteActionProvider(this)
+                new SuiteActionProvider(this),
+                new SuiteCompilerOptionsQueryImpl()
             );
         } catch (RuntimeException ex) {
             throw Exceptions.attachMessage(ex, "Error parsing " + suitePy);
@@ -104,4 +109,24 @@
         return null;
     }
 
+    private class SuiteCompilerOptionsQueryImpl implements CompilerOptionsQueryImplementation {
+
+        private CompilerOptionsQueryImplementation.Result RESULT = new Result() {
+            @Override
+            public List<? extends String> getArguments() {
+                return Arrays.asList("--add-modules", "ALL-MODULE-PATH");
+            }
+
+            @Override
+            public void addChangeListener(ChangeListener listener) {}
+
+            @Override
+            public void removeChangeListener(ChangeListener listener) {}
+        };
+
+        @Override
+        public CompilerOptionsQueryImplementation.Result getOptions(FileObject file) {
+            return RESULT;
+        }
+    }
 }
diff --git a/java/java.mx.project/src/org/netbeans/modules/java/mx/project/SuiteSources.java b/java/java.mx.project/src/org/netbeans/modules/java/mx/project/SuiteSources.java
index 4f9347e..096d2bf 100644
--- a/java/java.mx.project/src/org/netbeans/modules/java/mx/project/SuiteSources.java
+++ b/java/java.mx.project/src/org/netbeans/modules/java/mx/project/SuiteSources.java
@@ -771,7 +771,10 @@
 
         @Override
         public Collection<String> depNames() {
-            return mxPrj.dependencies();
+            List<String> both = new ArrayList<>();
+            both.addAll(mxPrj.dependencies());
+            both.addAll(mxPrj.generatedDependencies());
+            return both;
         }
 
         @Override
diff --git a/java/java.mx.project/src/org/netbeans/modules/java/mx/project/suitepy/MxProject.java b/java/java.mx.project/src/org/netbeans/modules/java/mx/project/suitepy/MxProject.java
index f9268dc..6da50ae 100644
--- a/java/java.mx.project/src/org/netbeans/modules/java/mx/project/suitepy/MxProject.java
+++ b/java/java.mx.project/src/org/netbeans/modules/java/mx/project/suitepy/MxProject.java
@@ -29,6 +29,8 @@
 
     List<String> dependencies();
 
+    List<String> generatedDependencies();
+
     List<String> annotationProcessors();
 
     String javaCompliance();
diff --git a/java/java.platform.ui/test/unit/src/org/netbeans/modules/java/platform/DefaultJavaPlatformProviderTest.java b/java/java.platform.ui/test/unit/src/org/netbeans/modules/java/platform/DefaultJavaPlatformProviderTest.java
index a99f49e..e16f5b1 100644
--- a/java/java.platform.ui/test/unit/src/org/netbeans/modules/java/platform/DefaultJavaPlatformProviderTest.java
+++ b/java/java.platform.ui/test/unit/src/org/netbeans/modules/java/platform/DefaultJavaPlatformProviderTest.java
@@ -23,7 +23,6 @@
 import java.beans.PropertyChangeListener;
 import java.util.concurrent.Semaphore;
 import java.util.concurrent.TimeUnit;
-import junit.framework.Assert;
 import org.netbeans.junit.NbTestCase;
 import org.openide.filesystems.FileObject;
 import org.openide.filesystems.FileSystem;
@@ -52,7 +51,7 @@
         fs.getRoot();
         rp = new Repository(fs);
         System.setProperty("org.openide.util.Lookup", DefaultJavaPlatformProviderTest.Lkp.class.getName()); //NOI18N
-        Assert.assertEquals(DefaultJavaPlatformProviderTest.Lkp.class, Lookup.getDefault().getClass());
+        assertEquals(DefaultJavaPlatformProviderTest.Lkp.class, Lookup.getDefault().getClass());
     }
 
     public void testMissingLayer202479() throws Exception {
diff --git a/java/java.source.base/nbproject/org-netbeans-modules-java-source-base.sig b/java/java.source.base/nbproject/org-netbeans-modules-java-source-base.sig
index cc7a583..335dc64 100644
--- a/java/java.source.base/nbproject/org-netbeans-modules-java-source-base.sig
+++ b/java/java.source.base/nbproject/org-netbeans-modules-java-source-base.sig
@@ -27,7 +27,6 @@
 meth public abstract {com.sun.source.tree.TreeVisitor%0} visitExports(com.sun.source.tree.ExportsTree,{com.sun.source.tree.TreeVisitor%1})
 meth public abstract {com.sun.source.tree.TreeVisitor%0} visitExpressionStatement(com.sun.source.tree.ExpressionStatementTree,{com.sun.source.tree.TreeVisitor%1})
 meth public abstract {com.sun.source.tree.TreeVisitor%0} visitForLoop(com.sun.source.tree.ForLoopTree,{com.sun.source.tree.TreeVisitor%1})
-meth public abstract {com.sun.source.tree.TreeVisitor%0} visitGuardedPattern(com.sun.source.tree.GuardedPatternTree,{com.sun.source.tree.TreeVisitor%1})
 meth public abstract {com.sun.source.tree.TreeVisitor%0} visitIdentifier(com.sun.source.tree.IdentifierTree,{com.sun.source.tree.TreeVisitor%1})
 meth public abstract {com.sun.source.tree.TreeVisitor%0} visitIf(com.sun.source.tree.IfTree,{com.sun.source.tree.TreeVisitor%1})
 meth public abstract {com.sun.source.tree.TreeVisitor%0} visitImport(com.sun.source.tree.ImportTree,{com.sun.source.tree.TreeVisitor%1})
@@ -108,7 +107,6 @@
 meth public {com.sun.source.util.TreeScanner%0} visitExports(com.sun.source.tree.ExportsTree,{com.sun.source.util.TreeScanner%1})
 meth public {com.sun.source.util.TreeScanner%0} visitExpressionStatement(com.sun.source.tree.ExpressionStatementTree,{com.sun.source.util.TreeScanner%1})
 meth public {com.sun.source.util.TreeScanner%0} visitForLoop(com.sun.source.tree.ForLoopTree,{com.sun.source.util.TreeScanner%1})
-meth public {com.sun.source.util.TreeScanner%0} visitGuardedPattern(com.sun.source.tree.GuardedPatternTree,{com.sun.source.util.TreeScanner%1})
 meth public {com.sun.source.util.TreeScanner%0} visitIdentifier(com.sun.source.tree.IdentifierTree,{com.sun.source.util.TreeScanner%1})
 meth public {com.sun.source.util.TreeScanner%0} visitIf(com.sun.source.tree.IfTree,{com.sun.source.util.TreeScanner%1})
 meth public {com.sun.source.util.TreeScanner%0} visitImport(com.sun.source.tree.ImportTree,{com.sun.source.util.TreeScanner%1})
diff --git a/java/java.source.base/nbproject/project.properties b/java/java.source.base/nbproject/project.properties
index bb2801c..9d0e680 100644
--- a/java/java.source.base/nbproject/project.properties
+++ b/java/java.source.base/nbproject/project.properties
@@ -23,7 +23,7 @@
 javadoc.title=Java Source Base
 javadoc.arch=${basedir}/arch.xml
 javadoc.apichanges=${basedir}/apichanges.xml
-spec.version.base=2.58.0
+spec.version.base=2.59.0
 test.qa-functional.cp.extra=${refactoring.java.dir}/modules/ext/nb-javac-api.jar
 test.unit.run.cp.extra=${o.n.core.dir}/core/core.jar:\
     ${o.n.core.dir}/lib/boot.jar:\
diff --git a/java/java.source.base/src/org/netbeans/api/java/source/TranslateIdentifier.java b/java/java.source.base/src/org/netbeans/api/java/source/TranslateIdentifier.java
index c9247e3..c1f498e 100644
--- a/java/java.source.base/src/org/netbeans/api/java/source/TranslateIdentifier.java
+++ b/java/java.source.base/src/org/netbeans/api/java/source/TranslateIdentifier.java
@@ -21,6 +21,7 @@
 
 import com.sun.source.tree.CaseTree;
 import com.sun.source.tree.CompilationUnitTree;
+import com.sun.source.tree.ConstantCaseLabelTree;
 import com.sun.source.tree.IdentifierTree;
 import com.sun.source.tree.MemberSelectTree;
 import com.sun.source.tree.MethodTree;
@@ -79,7 +80,7 @@
                     || (element.getKind().isField() && ((Symbol) element).isStatic())) {
                 Tree parent = path.getParentPath() != null ? path.getParentPath().getLeaf() : null;
                 
-                if (   (parent != null && parent.getKind() == Kind.CASE && ((CaseTree) parent).getExpression() == node && element.getKind() == ElementKind.ENUM_CONSTANT)
+                if (   (parent != null && parent.getKind() == Kind.CONSTANT_CASE_LABEL && ((ConstantCaseLabelTree) parent).getConstantExpression() == node && element.getKind() == ElementKind.ENUM_CONSTANT)
                     || (path.getCompilationUnit() != null && ((Symbol) element).enclClass() != null && path.getCompilationUnit().getSourceFile() == ((Symbol) element).enclClass().sourcefile)) {
                     translateMap.put(node, make.Identifier(element.getSimpleName()));
                 } else {
diff --git a/java/java.source.base/src/org/netbeans/api/java/source/TreeMaker.java b/java/java.source.base/src/org/netbeans/api/java/source/TreeMaker.java
index b7667a4..cb830c6 100644
--- a/java/java.source.base/src/org/netbeans/api/java/source/TreeMaker.java
+++ b/java/java.source.base/src/org/netbeans/api/java/source/TreeMaker.java
@@ -276,7 +276,7 @@
      * @since 2.39
      */
     public CaseTree CasePatterns(List<? extends Tree> patterns, Tree body) {
-        return delegate.CaseMultiplePatterns(patterns.stream().map(p -> (CaseLabelTree) p).collect(Collectors.toList()), body);
+        return delegate.CaseMultiplePatterns(toCaseLabelTrees(patterns), body);
     }
     
     /**
@@ -288,7 +288,22 @@
      * @since 2.39
      */
     public CaseTree CasePatterns(List<? extends Tree> patterns, List<? extends StatementTree> statements) {
-        return delegate.CaseMultiplePatterns(patterns.stream().map(p -> (CaseLabelTree) p).collect(Collectors.toList()), statements);
+        return delegate.CaseMultiplePatterns(toCaseLabelTrees(patterns), statements);
+    }
+
+    private List<? extends CaseLabelTree> toCaseLabelTrees(List<? extends Tree> patterns) {
+        return patterns.stream().map(p -> {
+            if (p instanceof CaseLabelTree) {
+                return (CaseLabelTree) p;
+            }
+            if (p instanceof ExpressionTree) {
+                return delegate.ConstantCaseLabel((ExpressionTree) p);
+            }
+            if (p instanceof PatternTree) {
+                return delegate.PatternCaseLabel((PatternTree) p, null);
+            }
+            throw new IllegalArgumentException("Invalid pattern kind: " + p.getKind()); //NOI18N
+        }).collect(Collectors.toList());
     }
     
     /**
diff --git a/java/java.source.base/src/org/netbeans/modules/java/source/NoJavacHelper.java b/java/java.source.base/src/org/netbeans/modules/java/source/NoJavacHelper.java
index 2085580..727e20c 100644
--- a/java/java.source.base/src/org/netbeans/modules/java/source/NoJavacHelper.java
+++ b/java/java.source.base/src/org/netbeans/modules/java/source/NoJavacHelper.java
@@ -34,7 +34,7 @@
  */
 public class NoJavacHelper {
 
-    public static final int REQUIRED_JAVAC_VERSION = 18; // <- TODO: increment on every release
+    public static final int REQUIRED_JAVAC_VERSION = 19; // <- TODO: increment on every release
     private static final boolean HAS_WORKING_JAVAC;
 
     static {
diff --git a/java/java.source.base/src/org/netbeans/modules/java/source/builder/TreeFactory.java b/java/java.source.base/src/org/netbeans/modules/java/source/builder/TreeFactory.java
index 568e8952..102544c 100644
--- a/java/java.source.base/src/org/netbeans/modules/java/source/builder/TreeFactory.java
+++ b/java/java.source.base/src/org/netbeans/modules/java/source/builder/TreeFactory.java
@@ -77,6 +77,7 @@
 import java.util.Collections;
 import java.util.List;
 import java.util.Set;
+import java.util.stream.Collectors;
 import javax.lang.model.element.*;
 import javax.lang.model.type.ArrayType;
 import javax.lang.model.type.TypeKind;
@@ -210,16 +211,31 @@
         return make.at(NOPOS).DefaultCaseLabel();
     }
 
+    public ConstantCaseLabelTree ConstantCaseLabel(ExpressionTree expr) {
+        return make.at(NOPOS).ConstantCaseLabel((JCExpression) expr);
+    }
+
+    public PatternCaseLabelTree PatternCaseLabel(PatternTree pat, ExpressionTree guard) {
+        return make.at(NOPOS).PatternCaseLabel((JCPattern) pat, (JCExpression) guard);
+    }
+
+    public DeconstructionPatternTree DeconstructionPattern(ExpressionTree deconstructor, List<? extends PatternTree> nested, VariableTree var) {
+        ListBuffer<JCPattern> pats = new ListBuffer<>();
+        for (PatternTree t : nested)
+            pats.append((JCPattern)t);
+        return make.at(NOPOS).RecordPattern((JCExpression) deconstructor, pats.toList(), (JCVariableDecl) var);
+    }
+
     public CaseTree Case(ExpressionTree expression, List<? extends StatementTree> statements) {
         return Case(expression != null ? Collections.singletonList(expression) : Collections.emptyList(), statements);
     }
     
     public CaseTree Case(List<? extends ExpressionTree> expressions, List<? extends StatementTree> statements) {
-        return CaseMultiplePatterns(expressions.isEmpty() ? Collections.singletonList(DefaultCaseLabel()) : expressions, statements);
+        return CaseMultiplePatterns(expressions.isEmpty() ? Collections.singletonList(DefaultCaseLabel()) : expressions.stream().map(e -> ConstantCaseLabel(e)).collect(Collectors.toList()), statements);
     }
     
     public CaseTree Case(List<? extends ExpressionTree> expressions, Tree body) {
-        return CaseMultiplePatterns(expressions.isEmpty() ? Collections.singletonList(DefaultCaseLabel()) : expressions, body);
+        return CaseMultiplePatterns(expressions.isEmpty() ? Collections.singletonList(DefaultCaseLabel()) : expressions.stream().map(e -> ConstantCaseLabel(e)).collect(Collectors.toList()), body);
     }
     
     public CaseTree CaseMultiplePatterns(List<? extends CaseLabelTree> expressions, Tree body) {
@@ -906,10 +922,6 @@
         return make.at(NOPOS).BindingPattern((JCVariableDecl) vt);
     }
 
-    public GuardedPatternTree GuardedPattern(PatternTree pattern, ExpressionTree guard) {
-        return make.at(NOPOS).GuardPattern((JCPattern) pattern, (JCExpression) guard);
-    }
-
     public ParenthesizedPatternTree ParenthesizedPattern(PatternTree pattern) {
         return make.at(NOPOS).ParenthesizedPattern((JCPattern) pattern);
     }
diff --git a/java/java.source.base/src/org/netbeans/modules/java/source/pretty/VeryPretty.java b/java/java.source.base/src/org/netbeans/modules/java/source/pretty/VeryPretty.java
index 8c8867f..5a76b60 100644
--- a/java/java.source.base/src/org/netbeans/modules/java/source/pretty/VeryPretty.java
+++ b/java/java.source.base/src/org/netbeans/modules/java/source/pretty/VeryPretty.java
@@ -2061,11 +2061,25 @@
     }
 
     @Override
-    public void visitDefaultCaseLabel(JCDefaultCaseLabel that) {
+    public void visitDefaultCaseLabel(JCDefaultCaseLabel tree) {
         print("default");
     }
 
     @Override
+    public void visitConstantCaseLabel(JCConstantCaseLabel tree) {
+        printExpr(tree.expr);
+    }
+
+    @Override
+    public void visitPatternCaseLabel(JCPatternCaseLabel tree) {
+        print(tree.pat);
+        if (tree.guard != null) {
+            print(" when ");
+            printExpr(tree.guard);
+        }
+    }
+
+    @Override
     public void visitLetExpr(LetExpr tree) {
 	print("(let " + tree.defs + " in " + tree.expr + ")");
     }
diff --git a/java/java.source.base/src/org/netbeans/modules/java/source/save/CasualDiff.java b/java/java.source.base/src/org/netbeans/modules/java/source/save/CasualDiff.java
index 3441ee9..3bc2d5d 100644
--- a/java/java.source.base/src/org/netbeans/modules/java/source/save/CasualDiff.java
+++ b/java/java.source.base/src/org/netbeans/modules/java/source/save/CasualDiff.java
@@ -76,6 +76,7 @@
 import com.sun.tools.javac.tree.JCTree.JCClassDecl;
 import com.sun.tools.javac.tree.JCTree.JCCompilationUnit;
 import com.sun.tools.javac.tree.JCTree.JCConditional;
+import com.sun.tools.javac.tree.JCTree.JCConstantCaseLabel;
 import com.sun.tools.javac.tree.JCTree.JCContinue;
 import com.sun.tools.javac.tree.JCTree.JCDoWhileLoop;
 import com.sun.tools.javac.tree.JCTree.JCEnhancedForLoop;
@@ -1965,23 +1966,14 @@
         return diffTree((JCTree) oldT.var, (JCTree) newT.var, bounds);
     }
 
+    protected int diffConstantCaseLabel(JCConstantCaseLabel oldT, JCConstantCaseLabel newT, int[] bounds) {
+        return diffTree((JCTree) oldT.expr, (JCTree) newT.expr, bounds);
+    }
+
     protected int diffCase(JCCase oldT, JCCase newT, int[] bounds) {
         int localPointer = bounds[0];
-        List<? extends JCTree> oldPatterns;
-        List<? extends JCTree> newPatterns;
-        
-        if(!(oldT.getLabels().size()==1 && oldT.getLabels().get(0).getKind().toString().equals("DEFAULT_CASE_LABEL"))){
-            oldPatterns = oldT.getLabels();            
-        }else{
-            oldPatterns = oldT.getExpressions();           
-        }
-        
-        if(!(newT.getLabels().size() == 1 && newT.getLabels().get(0).getKind().toString().equals("DEFAULT_CASE_LABEL"))){
-            newPatterns = newT.getLabels();            
-        }else{
-            newPatterns = newT.getExpressions();           
-        }
-        
+        List<? extends JCTree.JCCaseLabel> oldPatterns = oldT.getLabels();
+        List<? extends JCTree.JCCaseLabel> newPatterns = newT.getLabels();
         PositionEstimator patternEst = EstimatorFactory.casePatterns(
                 oldPatterns,
                 newPatterns,
@@ -1990,24 +1982,13 @@
         int posHint;
         int endpos;
         int copyTo;
-        if (oldPatterns.isEmpty()) {
-            moveFwdToOneOfTokens(tokenSequence, bounds[0], EnumSet.of(JavaTokenId.DEFAULT));
-            tokenSequence.moveNext();
+        if (JavaTokenId.DEFAULT == moveFwdToOneOfTokens(tokenSequence, bounds[0], EnumSet.of(JavaTokenId.CASE, JavaTokenId.DEFAULT))) {
             copyTo = endpos = posHint = tokenSequence.offset();
-
-            if (!newPatterns.isEmpty()) {
-                copyTo = getOldPos(oldT);
-            }
         } else {
             copyTo = posHint = oldPatterns.iterator().next().getStartPosition();
             endpos = endPos(oldPatterns.get(oldPatterns.size() - 1));
-
-            if (newPatterns.isEmpty()) {
-                moveFwdToOneOfTokens(tokenSequence, bounds[0], EnumSet.of(JavaTokenId.CASE));
+            if (newPatterns.size() == 1 && newPatterns.get(0).getKind() == Kind.DEFAULT_CASE_LABEL) {
                 copyTo = tokenSequence.offset();
-                copyTo(localPointer, copyTo);
-                localPointer = copyTo = posHint = endpos;
-                printer.print("default");
             }
         }
         copyTo(localPointer, copyTo);
@@ -5439,8 +5420,10 @@
         if (oldT == null && newT != null)
             throw new IllegalArgumentException("Null is not allowed in parameters.");
 
-        if (oldT == newT)
-            return elementBounds[0];
+        if (oldT == newT) {
+            copyTo(elementBounds[0], elementBounds[1]);
+            return elementBounds[1];
+        }
 
         if (newT == null) {
             tokenSequence.move(elementBounds[1]);
@@ -5730,6 +5713,13 @@
           case BINDINGPATTERN:
               retVal = diffBindingPattern((JCBindingPattern) oldT, (JCBindingPattern) newT, elementBounds);
               break;
+          case DEFAULTCASELABEL:
+              copyTo(elementBounds[0], elementBounds[1]);
+              retVal = elementBounds[1];
+              break;
+          case CONSTANTCASELABEL:
+              retVal = diffConstantCaseLabel((JCConstantCaseLabel) oldT, (JCConstantCaseLabel) newT, elementBounds);
+              break;
           default:
               // handle special cases like field groups and enum constants
               if (oldT.getKind() == Kind.OTHER) {
diff --git a/java/java.source.base/src/org/netbeans/modules/java/source/save/Reformatter.java b/java/java.source.base/src/org/netbeans/modules/java/source/save/Reformatter.java
index 434d2cd..941da1c 100644
--- a/java/java.source.base/src/org/netbeans/modules/java/source/save/Reformatter.java
+++ b/java/java.source.base/src/org/netbeans/modules/java/source/save/Reformatter.java
@@ -1151,7 +1151,7 @@
                                 newline();
                             else
                                 space();
-                        } else {
+                        } else if (sp.getStartPosition(root, mods) != sp.getStartPosition(root, node.getType())) {
                             space();
                         }
                     } else if (afterAnnotation) {
@@ -2801,20 +2801,46 @@
         }
 
         @Override
-        public Boolean visitGuardedPattern(GuardedPatternTree node, Void p) {
+        public Boolean visitDefaultCaseLabel(DefaultCaseLabelTree node, Void p) {
+            accept(DEFAULT);
+            return true;
+        }
+
+        @Override
+        public Boolean visitConstantCaseLabel(ConstantCaseLabelTree node, Void p) {
+            scan(node.getConstantExpression(), p);
+            return true;
+        }
+
+        @Override
+        public Boolean visitPatternCaseLabel(PatternCaseLabelTree node, Void p) {
             scan(node.getPattern(), p);
             space();
-            accept(AMPAMP);
+            accept(IDENTIFIER);
             space();
-            scan(node.getExpression(), p);
+            scan(node.getGuard(), p);
+            return true;
+        }
 
+        @Override
+        public Boolean visitDeconstructionPattern(DeconstructionPatternTree node, Void p) {
+            scan(node.getDeconstructor(), p);
+            accept(LPAREN);
+            scan(node.getNestedPatterns(), p);
+            accept(RPAREN);
+            if (node.getVariable() != null) {
+                space();
+                accept(IDENTIFIER);
+            }
             return true;
         }
 
         @Override
         public Boolean visitParenthesizedPattern(ParenthesizedPatternTree node, Void p) {
             accept(LPAREN);
+            spaces(0);
             scan(node.getPattern(), p);
+            spaces(0);
             accept(RPAREN);
             return true;
         }
@@ -2933,36 +2959,24 @@
 
         @Override
         public Boolean visitCase(CaseTree node, Void p) {
-            List<? extends Tree> labels = node.getLabels();
-            if (labels != null && labels.size() > 0) {
+            List<? extends CaseLabelTree> labels = node.getLabels();
+            if (labels != null && !labels.isEmpty()) {
                 if (tokens.token().id() == JavaTokenId.DEFAULT && labels.get(0).getKind() == Kind.DEFAULT_CASE_LABEL) {
                     accept(DEFAULT);
                 } else {
                     accept(CASE);
                     space();
-                    for (Tree label : labels) {
-                        switch (label.getKind()) {
-                            case DEFAULT_CASE_LABEL:
-                                removeWhiteSpace(JavaTokenId.DEFAULT);
-                                accept(DEFAULT);
-                                break;
-                            case BINDING_PATTERN:
-                            case PARENTHESIZED_PATTERN:
-                            case GUARDED_PATTERN:
-                                removeWhiteSpace(JavaTokenId.IDENTIFIER);
-                                scan(label, p);
-                                break;
-                            case NULL_LITERAL:
-                                removeWhiteSpace(JavaTokenId.NULL);
-                                scan(label, p);
-                                break;
-                            default:
-                                scan(label, p);
-                                break;
+                    for (Iterator<? extends CaseLabelTree> it = labels.iterator(); it.hasNext();) {
+                        CaseLabelTree label = it.next();
+                        scan(label, p);
+                        if (it.hasNext()) {
+                            spaces(0);
+                            accept(COMMA);
+                            space();
                         }
                     }
                 }
-            } else if (node.getExpressions().size() > 0) {
+            } else if (!node.getExpressions().isEmpty()) {
                 List<? extends ExpressionTree> exprs = node.getExpressions();
                 accept(CASE);
                 space();
@@ -3016,15 +3030,14 @@
                 if (tokens.offset() >= endPos) {
                     break;
                 }
-                if (tokens.token().id() == forToken) {
-                    break;
-                }
                 if (tokens.token().id() == WHITESPACE) {
                     String text = tokens.token().text().toString();
                     String ind = getIndent();
                     if (!ind.equals(text)) {
                         addDiff(new Diff(tokens.offset(), tokens.offset() + tokens.token().length(), " "));
                     }
+                } else if (forToken == null || tokens.token().id() == forToken) {
+                    break;
                 }
             } while (tokens.moveNext());
         }
diff --git a/java/java.source.base/src/org/netbeans/modules/java/source/save/Reindenter.java b/java/java.source.base/src/org/netbeans/modules/java/source/save/Reindenter.java
index e6be578..1632cf2 100644
--- a/java/java.source.base/src/org/netbeans/modules/java/source/save/Reindenter.java
+++ b/java/java.source.base/src/org/netbeans/modules/java/source/save/Reindenter.java
@@ -709,9 +709,9 @@
                 }
                     if (t != null) {
                         int i = getCurrentIndent(t, path);
-                        currentIndent = i < 0 ? getStmtIndent(startOffset, endOffset, EnumSet.of(tokenId), getEndPosition(((CaseTree) last).getExpression()), currentIndent) : i;
+                        currentIndent = i < 0 ? getStmtIndent(startOffset, endOffset, EnumSet.of(tokenId), getEndPosition(((CaseTree) last).getExpression()), currentIndent) : i; // TODO
                     } else {
-                        currentIndent = getStmtIndent(startOffset, endOffset, EnumSet.of(tokenId), getEndPosition(((CaseTree) last).getExpression()), currentIndent);
+                        currentIndent = getStmtIndent(startOffset, endOffset, EnumSet.of(tokenId), getEndPosition(((CaseTree) last).getExpression()), currentIndent); // TODO
                     }
 
                 break;
@@ -881,10 +881,10 @@
                     }
                     if (t != null) {
                         int i = getCurrentIndent(t, path);
-                        currentIndent = i < 0 ? getStmtIndent(startOffset, endOffset, EnumSet.of(JavaTokenId.COLON), getEndPosition(ct.getExpression()), currentIndent) : i;
+                        currentIndent = i < 0 ? getStmtIndent(startOffset, endOffset, EnumSet.of(JavaTokenId.COLON), getEndPosition(ct.getExpression()), currentIndent) : i; // TODO
                     } else {
                         int i = getCurrentIndent(ct, path);
-                        currentIndent = i < 0 ? getStmtIndent(startOffset, endOffset, EnumSet.of(JavaTokenId.COLON), getEndPosition(ct.getExpression()), currentIndent) : i;
+                        currentIndent = i < 0 ? getStmtIndent(startOffset, endOffset, EnumSet.of(JavaTokenId.COLON), getEndPosition(ct.getExpression()), currentIndent) : i; // TODO
                         currentIndent += cs.getIndentSize();
                     }
                 } else {
diff --git a/java/java.source.base/src/org/netbeans/modules/java/source/transform/ImmutableTreeTranslator.java b/java/java.source.base/src/org/netbeans/modules/java/source/transform/ImmutableTreeTranslator.java
index 7844e18..63c21fa 100644
--- a/java/java.source.base/src/org/netbeans/modules/java/source/transform/ImmutableTreeTranslator.java
+++ b/java/java.source.base/src/org/netbeans/modules/java/source/transform/ImmutableTreeTranslator.java
@@ -318,16 +318,20 @@
  * Visitor methods
  ****************************************************************************/
 
+    @Override
     public Tree visitCompilationUnit(CompilationUnitTree tree, Object p) {
 	CompilationUnitTree result = rewriteChildren(tree);
         return result;
     }
+    @Override
     public Tree visitPackage(PackageTree tree, Object p) {
         return rewriteChildren(tree);
     }
+    @Override
     public Tree visitImport(ImportTree tree, Object p) {
 	return rewriteChildren(tree);
     }
+    @Override
     public Tree visitClass(ClassTree tree, Object p) {
         Element oldSym = currentSym;
         importAnalysis.classEntered(tree);
@@ -337,6 +341,7 @@
         currentSym = oldSym;
         return result;
     }
+    @Override
     public Tree visitMethod(MethodTree tree, Object p) {
         Element oldSym = currentSym;
         currentSym = model.getElement(tree);
@@ -345,6 +350,7 @@
         return result;
     }
 	
+    @Override
     public Tree visitVariable(VariableTree tree, Object p) {
         Element oldSym = currentSym;
         currentSym = model.getElement(tree);
@@ -353,105 +359,139 @@
         return result;
     }
 	
+    @Override
     public Tree visitEmptyStatement(EmptyStatementTree tree, Object p) {
 	return rewriteChildren(tree);
     }
+    @Override
     public Tree visitBlock(BlockTree tree, Object p) {
 	return rewriteChildren(tree);
     }
+    @Override
     public Tree visitUnionType(UnionTypeTree tree, Object p) {
         return rewriteChildren(tree);
     }
+    @Override
     public Tree visitDoWhileLoop(DoWhileLoopTree tree, Object p) {
 	return rewriteChildren(tree);
     }
+    @Override
     public Tree visitWhileLoop(WhileLoopTree tree, Object p) {
 	return rewriteChildren(tree);
     }
+    @Override
     public Tree visitForLoop(ForLoopTree tree, Object p) {
 	return rewriteChildren(tree);
     }
+    @Override
     public Tree visitEnhancedForLoop(EnhancedForLoopTree tree, Object p) {
 	return rewriteChildren(tree);
     }
+    @Override
     public Tree visitLabeledStatement(LabeledStatementTree tree, Object p) {
 	return rewriteChildren(tree);
     }
+    @Override
     public Tree visitLambdaExpression(LambdaExpressionTree tree, Object p) {
         return rewriteChildren(tree);
     }
+    @Override
     public Tree visitSwitch(SwitchTree tree, Object p) {
 	return rewriteChildren(tree);
     }
+    @Override
     public Tree visitCase(CaseTree tree, Object p) {
 	return rewriteChildren(tree);
     }
+    @Override
     public Tree visitSynchronized(SynchronizedTree tree, Object p) {
 	return rewriteChildren(tree);
     }
+    @Override
     public Tree visitTry(TryTree tree, Object p) {
 	return rewriteChildren(tree);
     }
+    @Override
     public Tree visitCatch(CatchTree tree, Object p) {
 	return rewriteChildren(tree);
     }
+    @Override
     public Tree visitConditionalExpression(ConditionalExpressionTree tree, Object p) {
 	return rewriteChildren(tree);
     }
+    @Override
     public Tree visitIf(IfTree tree, Object p) {
 	return rewriteChildren(tree);
     }
+    @Override
     public Tree visitExpressionStatement(ExpressionStatementTree tree, Object p) {
 	return rewriteChildren(tree);
     }
+    @Override
     public Tree visitBreak(BreakTree tree, Object p) {
 	return rewriteChildren(tree);
     }
+    @Override
     public Tree visitContinue(ContinueTree tree, Object p) {
 	return rewriteChildren(tree);
     }
+    @Override
     public Tree visitReturn(ReturnTree tree, Object p) {
 	return rewriteChildren(tree);
     }
+    @Override
     public Tree visitThrow(ThrowTree tree, Object p) {
 	return rewriteChildren(tree);
     }
+    @Override
     public Tree visitAssert(AssertTree tree, Object p) {
 	return rewriteChildren(tree);
     }
+    @Override
     public Tree visitMethodInvocation(MethodInvocationTree tree, Object p) {
 	return rewriteChildren(tree);
     }
+    @Override
     public Tree visitNewClass(NewClassTree tree, Object p) {
 	return rewriteChildren(tree);
     }
+    @Override
     public Tree visitNewArray(NewArrayTree tree, Object p) {
 	return rewriteChildren(tree);
     }
+    @Override
     public Tree visitParenthesized(ParenthesizedTree tree, Object p) {
 	return rewriteChildren(tree);
     }
+    @Override
     public Tree visitAssignment(AssignmentTree tree, Object p) {
 	return rewriteChildren(tree);
     }
+    @Override
     public Tree visitCompoundAssignment(CompoundAssignmentTree tree, Object p) {
 	return rewriteChildren(tree);
     }
+    @Override
     public Tree visitUnary(UnaryTree tree, Object p) {
 	return rewriteChildren(tree);
     }
+    @Override
     public Tree visitBinary(BinaryTree tree, Object p) {
 	return rewriteChildren(tree);
     }
+    @Override
     public Tree visitTypeCast(TypeCastTree tree, Object p) {
 	return rewriteChildren(tree);
     }
+    @Override
     public Tree visitInstanceOf(InstanceOfTree tree, Object p) {
 	return rewriteChildren(tree);
     }
+    @Override
     public Tree visitIntersectionType(IntersectionTypeTree tree, Object p) {
         return rewriteChildren(tree);
     }
+    @Override
     public Tree visitArrayAccess(ArrayAccessTree tree, Object p) {
 	return rewriteChildren(tree);
     }
@@ -459,6 +499,7 @@
     public Tree visitMemberReference(MemberReferenceTree tree, Object p) {
         return rewriteChildren(tree);
     }
+    @Override
     public Tree visitMemberSelect(MemberSelectTree tree, Object p) {
         if (tree instanceof QualIdentTree) {
             QualIdentTree qit = (QualIdentTree) tree;
@@ -477,75 +518,107 @@
             return rewriteChildren(tree);
         }
     }
+    @Override
     public Tree visitIdentifier(IdentifierTree tree, Object p) {
 	return rewriteChildren(tree);
     }
+    @Override
     public Tree visitLiteral(LiteralTree tree, Object p) {
 	return rewriteChildren(tree);
     }
+    @Override
     public Tree visitPrimitiveType(PrimitiveTypeTree tree, Object p) {
 	return rewriteChildren(tree);
     }
+    @Override
     public Tree visitArrayType(ArrayTypeTree tree, Object p) {
 	return rewriteChildren(tree);
     }
+    @Override
     public Tree visitParameterizedType(ParameterizedTypeTree tree, Object p) {
 	return rewriteChildren(tree);
     }
+    @Override
     public Tree visitTypeParameter(TypeParameterTree tree, Object p) {
 	return rewriteChildren(tree);
     }
+    @Override
     public Tree visitWildcard(WildcardTree tree, Object p) {
         return rewriteChildren(tree);
     }
+    @Override
     public Tree visitAnnotatedType(AnnotatedTypeTree tree, Object p) {
         return rewriteChildren(tree);
     }
+    @Override
     public Tree visitAnnotation(AnnotationTree tree, Object p) {
         return rewriteChildren(tree);
     }
+    @Override
     public Tree visitModifiers(ModifiersTree tree, Object p) {
         return rewriteChildren(tree);
     }
+    @Override
     public Tree visitErroneous(ErroneousTree tree, Object p) {
 	return rewriteChildren(tree);
     }
+    @Override
     public Tree visitModule(ModuleTree tree, Object p) {
         return rewriteChildren(tree);
     }
+    @Override
     public Tree visitExports(ExportsTree tree, Object p) {
         return rewriteChildren(tree);
     }
+    @Override
     public Tree visitOpens(OpensTree tree, Object p) {
         return rewriteChildren(tree);
     }
+    @Override
     public Tree visitProvides(ProvidesTree tree, Object p) {
         return rewriteChildren(tree);
     }
+    @Override
     public Tree visitRequires(RequiresTree tree, Object p) {
         return rewriteChildren(tree);
     }
+    @Override
     public Tree visitUses(UsesTree tree, Object p) {
         return rewriteChildren(tree);
     }
+    @Override
     public Tree visitBindingPattern(BindingPatternTree tree, Object p) {
         return rewriteChildren(tree);
     }
+    @Override
     public Tree visitDefaultCaseLabel(DefaultCaseLabelTree tree, Object p) {
         return rewriteChildren(tree);
     }
-    public Tree visitGuardedPattern(GuardedPatternTree tree, Object p) {
+    @Override
+    public Tree visitConstantCaseLabel(ConstantCaseLabelTree tree, Object p) {
         return rewriteChildren(tree);
     }
+    @Override
+    public Tree visitPatternCaseLabel(PatternCaseLabelTree tree, Object p) {
+        return rewriteChildren(tree);
+    }
+    @Override
+    public Tree visitDeconstructionPattern(DeconstructionPatternTree tree, Object p) {
+        return rewriteChildren(tree);
+    }
+    @Override
     public Tree visitParenthesizedPattern(ParenthesizedPatternTree tree, Object p) {
         return rewriteChildren(tree);
     }
+    @Override
     public Tree visitSwitchExpression(SwitchExpressionTree tree, Object p) {
         return rewriteChildren(tree);
     }
+    @Override
     public Tree visitYield(YieldTree tree, Object p) {
         return rewriteChildren(tree);
     }
+    @Override
     public Tree visitOther(Tree tree, Object p) {
 	throw new Error("Tree not overloaded: "+tree);
     }
@@ -1429,15 +1502,40 @@
         return tree;
     }
 
-    private GuardedPatternTree rewriteChildren(GuardedPatternTree tree) {
-        PatternTree newPattern = (PatternTree) translate(tree.getPattern());
-        ExpressionTree newGuard = (ExpressionTree) translate(tree.getExpression());
-        if (newPattern != tree.getPattern() ||
-            newGuard != tree.getExpression()) {
-            GuardedPatternTree n = make.GuardedPattern(newPattern, newGuard);
+    private ConstantCaseLabelTree rewriteChildren(ConstantCaseLabelTree tree) {
+        ExpressionTree newExpression = (ExpressionTree) translate(tree.getConstantExpression());
+        if (newExpression != tree.getConstantExpression()) {
+            ConstantCaseLabelTree n = make.ConstantCaseLabel(newExpression);
             model.setType(n, model.getType(tree));
-            copyCommentTo(tree,n);
-            copyPosTo(tree,n);
+            copyCommentTo(tree, n);
+            copyPosTo(tree, n);
+            tree = n;
+        }
+        return tree;
+    }
+
+    private PatternCaseLabelTree rewriteChildren(PatternCaseLabelTree tree) {
+        ExpressionTree newGuard = (ExpressionTree) translate(tree.getGuard());
+        PatternTree newPattern = (PatternTree) translate(tree.getPattern());
+        if (newGuard != tree.getGuard() || newPattern != tree.getPattern()) {
+            PatternCaseLabelTree n = make.PatternCaseLabel(newPattern, newGuard);
+            model.setType(n, model.getType(tree));
+            copyCommentTo(tree, n);
+            copyPosTo(tree, n);
+            tree = n;
+        }
+        return tree;
+    }
+
+    private DeconstructionPatternTree rewriteChildren(DeconstructionPatternTree tree) {
+        ExpressionTree newDeconstructor = (ExpressionTree) translate(tree.getDeconstructor());
+        List<? extends PatternTree> newNestedPatterns = translate(tree.getNestedPatterns());
+        VariableTree newVariable = (VariableTree) translate(tree.getVariable());
+        if (newDeconstructor != tree.getDeconstructor() || newVariable != tree.getVariable() || !Objects.equals(newNestedPatterns, tree.getNestedPatterns())) {
+            DeconstructionPatternTree n = make.DeconstructionPattern(newDeconstructor, newNestedPatterns, newVariable);
+            model.setType(n, model.getType(tree));
+            copyCommentTo(tree, n);
+            copyPosTo(tree, n);
             tree = n;
         }
         return tree;
diff --git a/java/java.source.base/src/org/netbeans/modules/java/source/transform/TreeDuplicator.java b/java/java.source.base/src/org/netbeans/modules/java/source/transform/TreeDuplicator.java
index 39c5743..35646e2 100644
--- a/java/java.source.base/src/org/netbeans/modules/java/source/transform/TreeDuplicator.java
+++ b/java/java.source.base/src/org/netbeans/modules/java/source/transform/TreeDuplicator.java
@@ -34,7 +34,9 @@
 import com.sun.source.tree.CompilationUnitTree;
 import com.sun.source.tree.CompoundAssignmentTree;
 import com.sun.source.tree.ConditionalExpressionTree;
+import com.sun.source.tree.ConstantCaseLabelTree;
 import com.sun.source.tree.ContinueTree;
+import com.sun.source.tree.DeconstructionPatternTree;
 import com.sun.source.tree.DefaultCaseLabelTree;
 import com.sun.source.tree.DoWhileLoopTree;
 import com.sun.source.tree.EmptyStatementTree;
@@ -44,7 +46,6 @@
 import com.sun.source.tree.ExpressionStatementTree;
 import com.sun.source.tree.ExpressionTree;
 import com.sun.source.tree.ForLoopTree;
-import com.sun.source.tree.GuardedPatternTree;
 import com.sun.source.tree.IdentifierTree;
 import com.sun.source.tree.IfTree;
 import com.sun.source.tree.ImportTree;
@@ -66,6 +67,7 @@
 import com.sun.source.tree.ParameterizedTypeTree;
 import com.sun.source.tree.ParenthesizedPatternTree;
 import com.sun.source.tree.ParenthesizedTree;
+import com.sun.source.tree.PatternCaseLabelTree;
 import com.sun.source.tree.PrimitiveTypeTree;
 import com.sun.source.tree.ProvidesTree;
 import com.sun.source.tree.RequiresTree;
@@ -192,7 +194,9 @@
 
     @Override
     public Tree visitCase(CaseTree tree, Void p) {
-        CaseTree n = make.Case(tree.getExpression(), tree.getStatements());
+        CaseTree n = tree.getCaseKind() == CaseTree.CaseKind.STATEMENT
+                ? make.Case(tree.getExpressions(), tree.getStatements())
+                : make.Case(tree.getExpressions(), tree.getBody());
         model.setType(n, model.getType(tree));
         comments.copyComments(tree, n);
         model.setPos(n, model.getPos(tree));
@@ -678,8 +682,26 @@
     }
 
     @Override
-    public Tree visitGuardedPattern(GuardedPatternTree tree, Void p) {
-        GuardedPatternTree n = make.GuardedPattern(tree.getPattern(), tree.getExpression());
+    public Tree visitConstantCaseLabel(ConstantCaseLabelTree tree, Void p) {
+        ConstantCaseLabelTree n = make.ConstantCaseLabel(tree.getConstantExpression());
+        model.setType(n, model.getType(tree));
+        comments.copyComments(tree, n);
+        model.setPos(n, model.getPos(tree));
+        return n;
+    }
+
+    @Override
+    public Tree visitPatternCaseLabel(PatternCaseLabelTree tree, Void p) {
+        PatternCaseLabelTree n = make.PatternCaseLabel(tree.getPattern(), tree.getGuard());
+        model.setType(n, model.getType(tree));
+        comments.copyComments(tree, n);
+        model.setPos(n, model.getPos(tree));
+        return n;
+    }
+
+    @Override
+    public Tree visitDeconstructionPattern(DeconstructionPatternTree tree, Void p) {
+        DeconstructionPatternTree n = make.DeconstructionPattern(tree.getDeconstructor(), tree.getNestedPatterns(), tree.getVariable());
         model.setType(n, model.getType(tree));
         comments.copyComments(tree, n);
         model.setPos(n, model.getPos(tree));
diff --git a/java/java.source.base/test/unit/src/org/netbeans/api/java/source/SourceUtilsTestUtil.java b/java/java.source.base/test/unit/src/org/netbeans/api/java/source/SourceUtilsTestUtil.java
index a77c3bd..430ba45 100644
--- a/java/java.source.base/test/unit/src/org/netbeans/api/java/source/SourceUtilsTestUtil.java
+++ b/java/java.source.base/test/unit/src/org/netbeans/api/java/source/SourceUtilsTestUtil.java
@@ -31,7 +31,7 @@
 import java.util.stream.Collectors;
 import javax.swing.event.ChangeListener;
 import javax.swing.text.Document;
-import junit.framework.Assert;
+import org.junit.Assert;
 import org.netbeans.api.editor.mimelookup.MimePath;
 import org.netbeans.api.java.classpath.ClassPath;
 import org.netbeans.api.java.classpath.JavaClassPathConstants;
diff --git a/java/java.source.base/test/unit/src/org/netbeans/api/java/source/TranslateIdentifierTest.java b/java/java.source.base/test/unit/src/org/netbeans/api/java/source/TranslateIdentifierTest.java
index 7c569d2..04f5bb9 100644
--- a/java/java.source.base/test/unit/src/org/netbeans/api/java/source/TranslateIdentifierTest.java
+++ b/java/java.source.base/test/unit/src/org/netbeans/api/java/source/TranslateIdentifierTest.java
@@ -19,17 +19,7 @@
 package org.netbeans.api.java.source;
 
 import com.sun.source.tree.CompilationUnitTree;
-import com.sun.source.tree.IdentifierTree;
-import com.sun.source.tree.MemberSelectTree;
-import com.sun.source.tree.MethodTree;
 import java.io.File;
-import static junit.framework.Assert.assertNotNull;
-import org.junit.After;
-import org.junit.AfterClass;
-import org.junit.Before;
-import org.junit.BeforeClass;
-import org.junit.Test;
-import static org.junit.Assert.*;
 import org.netbeans.api.java.source.JavaSource.Phase;
 import org.netbeans.junit.NbTestCase;
 import org.openide.filesystems.FileObject;
diff --git a/java/java.source.base/test/unit/src/org/netbeans/api/java/source/gen/SwitchRuleFormattingTest.java b/java/java.source.base/test/unit/src/org/netbeans/api/java/source/gen/SwitchRuleFormattingTest.java
index 0ef62ee..16d92c0 100644
--- a/java/java.source.base/test/unit/src/org/netbeans/api/java/source/gen/SwitchRuleFormattingTest.java
+++ b/java/java.source.base/test/unit/src/org/netbeans/api/java/source/gen/SwitchRuleFormattingTest.java
@@ -205,46 +205,42 @@
                 SwitchTree switchBlock = (SwitchTree) ((BlockTree) method.getBody()).getStatements().get(0);
                 List<? extends CaseTree> cases;
                 List<ExpressionTree> patterns = new ArrayList<>();
-                if(switchBlock!=null){
+                if(switchBlock != null){
                 boolean switchExpressionFlag = switchBlock.getKind() == Kind.SWITCH_EXPRESSION;
-                if (switchExpressionFlag) {
-                    cases = ((SwitchExpressionTree) switchBlock).getCases();
-                } else {
-                    cases = ((SwitchTree) switchBlock).getCases();
-                }
-                for (Iterator<? extends CaseTree> it = cases.iterator(); it.hasNext();) {
-                    CaseTree ct = it.next();
-                    patterns.addAll(ct.getExpressions());
-                    List<StatementTree> statements;
-                    if (ct.getStatements() == null) {
-                        statements = new ArrayList<>(((JCTree.JCCase) ct).stats);
+                    if (switchExpressionFlag) {
+                        cases = ((SwitchExpressionTree) switchBlock).getCases();
                     } else {
-                        statements = new ArrayList<>(ct.getStatements());
-                        if(!statements.isEmpty() && statements.get(statements.size()-1) instanceof JCTree.JCBreak){
-                            statements.remove(statements.size()-1);
-                        }
+                        cases = ((SwitchTree) switchBlock).getCases();
                     }
-                    if (statements.isEmpty()) {
-                        if (it.hasNext()) {
-                            continue;
-                        }
-                    }
-                    Set<Element> seenVariables = new HashSet<>();
-                    int idx = 0;
-                    for (StatementTree statement : new ArrayList<>(statements)) {
-                        Tree body = make.Block(statements, false);
-                        if (statements.size() == 1) {
-                            if (statements.get(0).getKind() == Tree.Kind.EXPRESSION_STATEMENT
-                                    || statements.get(0).getKind() == Tree.Kind.THROW
-                                    || statements.get(0).getKind() == Tree.Kind.BLOCK) {
-                                body = statements.get(0);
+                    for (Iterator<? extends CaseTree> it = cases.iterator(); it.hasNext();) {
+                        CaseTree ct = it.next();
+                        patterns.addAll(ct.getExpressions());
+                        List<StatementTree> statements;
+                        if (ct.getStatements() == null) {
+                            statements = new ArrayList<>(((JCTree.JCCase) ct).stats);
+                        } else {
+                            statements = new ArrayList<>(ct.getStatements());
+                            if(!statements.isEmpty() && statements.get(statements.size()-1) instanceof JCTree.JCBreak){
+                                statements.remove(statements.size()-1);
                             }
                         }
-                        newCases.add(make.Case(patterns, body));
-                        patterns = new ArrayList<>();
+                        if (statements.isEmpty()) {
+                            if (it.hasNext()) {
+                                continue;
+                            }
+                        } else {
+                            Tree body = make.Block(statements, false);
+                            if (statements.size() == 1) {
+                                if (statements.get(0).getKind() == Tree.Kind.EXPRESSION_STATEMENT
+                                        || statements.get(0).getKind() == Tree.Kind.THROW
+                                        || statements.get(0).getKind() == Tree.Kind.BLOCK) {
+                                    body = statements.get(0);
+                                }
+                            }
+                            newCases.add(make.Case(patterns, body));
+                            patterns = new ArrayList<>();
+                        }
                     }
-                }
-                  
                     workingCopy.rewrite((SwitchTree) switchBlock , make.Switch(((SwitchTree) switchBlock).getExpression(), newCases));
                 }
             }
diff --git a/java/java.source.base/test/unit/src/org/netbeans/api/java/source/gen/SwitchTest.java b/java/java.source.base/test/unit/src/org/netbeans/api/java/source/gen/SwitchTest.java
index ae896dbd..252714d 100644
--- a/java/java.source.base/test/unit/src/org/netbeans/api/java/source/gen/SwitchTest.java
+++ b/java/java.source.base/test/unit/src/org/netbeans/api/java/source/gen/SwitchTest.java
@@ -289,7 +289,7 @@
                              labels.remove(0);
                              return copy.getTreeMaker().CaseMultipleLabels(labels, tree.getStatements());
                          },
-                         "case " + /*XXX: too many spaces:*/ " " + "0, 1:"),
+                         "case 0, 1:"),
             new TestCase("case -1, 0, 1:",
                          (copy, tree) -> {
                              List<ExpressionTree> labels = new ArrayList<>(tree.getExpressions());
diff --git a/java/java.source.base/test/unit/src/org/netbeans/api/java/source/gen/WrappingTest.java b/java/java.source.base/test/unit/src/org/netbeans/api/java/source/gen/WrappingTest.java
index 4e13560..a4d0a47 100644
--- a/java/java.source.base/test/unit/src/org/netbeans/api/java/source/gen/WrappingTest.java
+++ b/java/java.source.base/test/unit/src/org/netbeans/api/java/source/gen/WrappingTest.java
@@ -36,7 +36,6 @@
 import java.util.Map.Entry;
 import java.util.prefs.Preferences;
 import javax.lang.model.element.Modifier;
-import static junit.framework.Assert.assertEquals;
 import org.netbeans.api.editor.mimelookup.MimeLookup;
 import org.netbeans.api.java.lexer.JavaTokenId;
 import org.netbeans.api.java.source.CodeStyle;
diff --git a/java/java.source.base/test/unit/src/org/netbeans/modules/java/source/parsing/ClassParserTest.java b/java/java.source.base/test/unit/src/org/netbeans/modules/java/source/parsing/ClassParserTest.java
index 292b53e..bed8787 100644
--- a/java/java.source.base/test/unit/src/org/netbeans/modules/java/source/parsing/ClassParserTest.java
+++ b/java/java.source.base/test/unit/src/org/netbeans/modules/java/source/parsing/ClassParserTest.java
@@ -22,7 +22,6 @@
 import java.io.IOException;
 import java.net.URI;
 import javax.lang.model.element.TypeElement;
-import static junit.framework.Assert.assertNotNull;
 import org.netbeans.api.editor.mimelookup.MimePath;
 import org.netbeans.api.editor.mimelookup.test.MockMimeLookup;
 import org.netbeans.api.java.classpath.ClassPath;
diff --git a/java/java.source.base/test/unit/src/org/netbeans/modules/java/source/save/FormatingTest.java b/java/java.source.base/test/unit/src/org/netbeans/modules/java/source/save/FormatingTest.java
index d2ebd92..a7b245a 100644
--- a/java/java.source.base/test/unit/src/org/netbeans/modules/java/source/save/FormatingTest.java
+++ b/java/java.source.base/test/unit/src/org/netbeans/modules/java/source/save/FormatingTest.java
@@ -2853,7 +2853,7 @@
                 + "        Object str = \"pattern matching switch\";\n"
                 + "        switch (str) {\n"
                 + "case \n"
-                + "      String       s &&       s.length() == 1\n"
+                + "      String       s when       s.length() == 1\n"
                 + "                    \n"
                 + "                    ->\n"
                 + "                System.out.println(\"case with guarded pattern formatting\");\n"
@@ -2871,7 +2871,7 @@
                 + "    void testSwitchCaseGuardedPattern() {\n"
                 + "        Object str = \"pattern matching switch\";\n"
                 + "        switch (str) {\n"
-                + "            case String s && s.length() == 1 ->\n"
+                + "            case String s when s.length() == 1 ->\n"
                 + "                System.out.println(\"case with guarded pattern formatting\");\n"
                 + "            default ->\n"
                 + "                System.out.println(\"default formatting\");\n"
@@ -2903,7 +2903,7 @@
                 + "        switch (str) {\n"
                 + "case            \n"
                 + "                    null,\n"
-                + "      String       s &&       s.length() == 1\n"
+                + "      String       s when       s.length() == 1\n"
                 + "                    \n"
                 + "                    ->\n"
                 + "                System.out.println(\"case with null and guarded pattern formatting\");\n"
@@ -2921,7 +2921,7 @@
                 + "    void testSwitchCaseNullAndGuardedPattern() {\n"
                 + "        Object str = \"pattern matching switch\";\n"
                 + "        switch (str) {\n"
-                + "            case null, String s && s.length() == 1 ->\n"
+                + "            case null, String s when s.length() == 1 ->\n"
                 + "                System.out.println(\"case with null and guarded pattern formatting\");\n"
                 + "            default ->\n"
                 + "                System.out.println(\"default formatting\");\n"
@@ -3052,9 +3052,8 @@
                 + "        switch (str) {\n"
                 + "case \n"
                 + "        (String       \n"
-                + "        s       &&\n"
+                + "        s)       when\n"
                 + "        s.length() == 1\n"
-                + "        )\n"
                 + "                    \n"
                 + "                    ->\n"
                 + "                System.out.println(\"case with Parenthesized Guarded Pattern formatting\");default ->\n"
@@ -3071,7 +3070,7 @@
                 + "    void testSwitchCaseParenthesizedGuardedPattern() {\n"
                 + "        Object str = \"pattern matching switch\";\n"
                 + "        switch (str) {\n"
-                + "            case (String s && s.length() == 1) ->\n"
+                + "            case (String s) when s.length() == 1 ->\n"
                 + "                System.out.println(\"case with Parenthesized Guarded Pattern formatting\");\n"
                 + "            default ->\n"
                 + "                System.out.println(\"default formatting\");\n"
@@ -3103,9 +3102,9 @@
                 + "        switch (str) {\n"
                 + "case \n"
                 + "        (String       \n"
-                + "        s       &&\n"
+                + "        s)       when\n"
                 + "        s.length() == 1\n"
-                + "        ) , \n"
+                + "        , \n"
                 + "        null\n"
                 + "                    \n"
                 + "                    ->\n"
@@ -3123,7 +3122,7 @@
                 + "    void testSwitchCaseParenthesizedGuardedPatternAndNull() {\n"
                 + "        Object str = \"pattern matching switch\";\n"
                 + "        switch (str) {\n"
-                + "            case (String s && s.length() == 1) , null ->\n"
+                + "            case (String s) when s.length() == 1, null ->\n"
                 + "                System.out.println(\"case with Parenthesized Binding Pattern formatting\");\n"
                 + "            default ->\n"
                 + "                System.out.println(\"default formatting\");\n"
@@ -3134,58 +3133,6 @@
         reformat(doc, content, golden);
     }
    
-    public void testSwitchCaseGuardedPatternNestedParenthesizedPatternWithNull() throws Exception {
-        try {
-            SourceVersion.valueOf("RELEASE_17"); //NOI18N
-        } catch (IllegalArgumentException ex) {
-            //OK, no RELEASE_17, skip test
-            return;
-        }
-        testFile = new File(getWorkDir(), "Test.java");
-        TestUtilities.copyStringToFile(testFile, "");
-        FileObject testSourceFO = FileUtil.toFileObject(testFile);
-        DataObject testSourceDO = DataObject.find(testSourceFO);
-        EditorCookie ec = (EditorCookie) testSourceDO.getCookie(EditorCookie.class);
-        final Document doc = ec.openDocument();
-        doc.putProperty(Language.class, JavaTokenId.language());
-        String content = "package p;"
-                + "public class Test{    \n"
-                + "void testSwitchCaseGuardedPatternNestedParenthesizedPattern() {\n"
-                + "        Object str = \"pattern matching switch\";\n"
-                + "        switch (str) {\n"
-                + "case \n"
-                + "        (String       \n"
-                + "        s )      &&\n"
-                + "        s.length() == 1\n"
-                + "         , \n"
-                + "        null\n"
-                + "                    \n"
-                + "                    ->\n"
-                + "                System.out.println(\"SwitchCaseGuardedPatternNestedParenthesizedPattern\");default ->\n"
-                + "                System.out.println(\"default formatting\");\n"
-                + "        }\n"
-                + "    }"
-                + "}";
-
-        String golden
-                = "package p;\n"
-                + "\n"
-                + "public class Test {\n"
-                + "\n"
-                + "    void testSwitchCaseGuardedPatternNestedParenthesizedPattern() {\n"
-                + "        Object str = \"pattern matching switch\";\n"
-                + "        switch (str) {\n"
-                + "            case (String s) && s.length() == 1 , null ->\n"
-                + "                System.out.println(\"SwitchCaseGuardedPatternNestedParenthesizedPattern\");\n"
-                + "            default ->\n"
-                + "                System.out.println(\"default formatting\");\n"
-                + "        }\n"
-                + "    }\n"
-                + "}\n"
-                + "";
-        reformat(doc, content, golden);
-    }
-    
     public void testSwitchCaseGuardedPatternNestedParenthesizedPattern() throws Exception {
         try {
             SourceVersion.valueOf("RELEASE_17"); //NOI18N
@@ -3206,7 +3153,7 @@
                 + "        Object str = \"pattern matching switch\";\n"
                 + "        switch (str) {\n"
                 + "case (  \n"
-                + "                String s) && s.length() >= 2 && \n"
+                + "                String s) when s.length() >= 2 && \n"
                 + "                \n"
                 + "                            (s.contains(\"@\") || s.contains(\"!\")) \n"
                 + "                \n"
@@ -3225,7 +3172,7 @@
                 + "    void testSwitchCaseGuardedPatternNestedParenthesizedPattern() {\n"
                 + "        Object str = \"pattern matching switch\";\n"
                 + "        switch (str) {\n"
-                + "            case ( String s) && s.length() >= 2\n"
+                + "            case (String s) when s.length() >= 2\n"
                 + "            && (s.contains(\"@\") || s.contains(\"!\")) ->\n"
                 + "                String.format(\"Valid string value is %s\", s);\n"
                 + "            default ->\n"
@@ -3260,11 +3207,11 @@
                 + "case null ->\n"
                 + "     System.out.println(\"case with null formatting\");\n"
                 + "  case String string\n"
-                + "          && (string.length()==  iso.filter(i -> i / 2 == 0).count() || string.length() == 0)\n"
+                + "          when (string.length()==  iso.filter(i -> i / 2 == 0).count() || string.length() == 0)\n"
                 + "          ->\n"
                 + "      System.out.println(\"case with pattern matching + condition + lambda expression formatting\");\n"
-                + "  case                  String s && s.length() == 1 ->System.out.println(\"case with pattern matching + condition formatting\");\n"
-                + "  case      (String s &&    true )-> \n"
+                + "  case                  String s when s.length() == 1 ->System.out.println(\"case with pattern matching + condition formatting\");\n"
+                + "  case      (String s )-> \n"
                 + "      System.out.println(\"case with pattern matching + condition formatting\");\n"
                 + "  case CharSequence\n"
                 + "          s ->\n"
@@ -3288,11 +3235,11 @@
                 + "        switch (str) {\n"
                 + "            case null ->\n"
                 + "                System.out.println(\"case with null formatting\");\n"
-                + "            case String string && (string.length() == iso.filter(i -> i / 2 == 0).count() || string.length() == 0) ->\n"
+                + "            case String string when (string.length() == iso.filter(i -> i / 2 == 0).count() || string.length() == 0) ->\n"
                 + "                System.out.println(\"case with pattern matching + condition + lambda expression formatting\");\n"
-                + "            case String s && s.length() == 1 ->\n"
+                + "            case String s when s.length() == 1 ->\n"
                 + "                System.out.println(\"case with pattern matching + condition formatting\");\n"
-                + "            case (String s && true) ->\n"
+                + "            case (String s) ->\n"
                 + "                System.out.println(\"case with pattern matching + condition formatting\");\n"
                 + "            case CharSequence s ->\n"
                 + "                System.out.println(\"case with pattern matching formatting\");\n"
@@ -3329,11 +3276,11 @@
                 + "case null ->\n"
                 + "     \"case with null formatting\";\n"
                 + "  case String string\n"
-                + "          && (string.length()==  iso.filter(i -> i / 2 == 0).count() || string.length() == 0)\n"
+                + "          when (string.length()==  iso.filter(i -> i / 2 == 0).count() || string.length() == 0)\n"
                 + "          ->\n"
                 + "      \"case with pattern matching + condition + lambda expression formatting\";\n"
-                + "  case                  String s && s.length() == 1 ->\"case with pattern matching + condition formatting\";\n"
-                + "  case      (String s &&    true )-> \n"
+                + "  case                  String s when s.length() == 1 ->\"case with pattern matching + condition formatting\";\n"
+                + "  case      (String s )-> \n"
                 + "      \"case with pattern matching + condition formatting\";\n"
                 + "  case CharSequence\n"
                 + "          s ->\n"
@@ -3357,11 +3304,11 @@
                 + "        String retVal = switch (str) {\n"
                 + "            case null ->\n"
                 + "                \"case with null formatting\";\n"
-                + "            case String string && (string.length() == iso.filter(i -> i / 2 == 0).count() || string.length() == 0) ->\n"
+                + "            case String string when (string.length() == iso.filter(i -> i / 2 == 0).count() || string.length() == 0) ->\n"
                 + "                \"case with pattern matching + condition + lambda expression formatting\";\n"
-                + "            case String s && s.length() == 1 ->\n"
+                + "            case String s when s.length() == 1 ->\n"
                 + "                \"case with pattern matching + condition formatting\";\n"
-                + "            case (String s && true) ->\n"
+                + "            case (String s) ->\n"
                 + "                \"case with pattern matching + condition formatting\";\n"
                 + "            case CharSequence s ->\n"
                 + "                \"case with pattern matching formatting\";\n"
@@ -6152,6 +6099,61 @@
         reformat(doc, content, golden);
     }
 
+    public void testTryWithResources() throws Exception {
+        testFile = new File(getWorkDir(), "Test.java");
+        TestUtilities.copyStringToFile(testFile, "");
+        FileObject testSourceFO = FileUtil.toFileObject(testFile);
+        DataObject testSourceDO = DataObject.find(testSourceFO);
+        EditorCookie ec = (EditorCookie) testSourceDO.getCookie(EditorCookie.class);
+        final Document doc = ec.openDocument();
+        doc.putProperty(Language.class, JavaTokenId.language());
+
+        String content
+                = "package hierbas.del.litoral;\n\n"
+                + "public class Test {\n\n"
+                + "    public static void main(String[] args) {\n"
+                + "        try (PrintStream out = System.out) {\n"
+                + "            System.out.println(\"TEST\");\n"
+                + "        } catch (Exception e) {\n"
+                + "            System.out.println(\"CATCH\");\n"
+                + "        } finally {\n"
+                + "            System.out.println(\"FINALLY\");\n"
+                + "        }\n"
+                + "    }\n"
+                + "}\n";
+        String golden
+                = "package hierbas.del.litoral;\n\n"
+                + "public class Test {\n\n"
+                + "    public static void main(String[] args) {\n"
+                + "        try (PrintStream out = System.out) {\n"
+                + "            System.out.println(\"TEST\");\n"
+                + "        } catch (Exception e) {\n"
+                + "            System.out.println(\"CATCH\");\n"
+                + "        } finally {\n"
+                + "            System.out.println(\"FINALLY\");\n"
+                + "        }\n"
+                + "    }\n"
+                + "}\n";
+        reformat(doc, content, golden);
+
+        content = "package hierbas.del.litoral;\n\n"
+                + "public class Test {\n\n"
+                + "    public static void main(String[] args) {\n"
+                + "        try ( final   PrintStream  out = System.out) {\n"
+                + "            System.out.println(\"TEST\");\n"
+                + "        }\n"
+                + "    }\n"
+                + "}\n";
+        golden = "package hierbas.del.litoral;\n\n"
+                + "public class Test {\n\n"
+                + "    public static void main(String[] args) {\n"
+                + "        try (final PrintStream out = System.out) {\n"
+                + "            System.out.println(\"TEST\");\n"
+                + "        }\n"
+                + "    }\n"
+                + "}\n";
+        reformat(doc, content, golden);
+    }
 
     public void testSynchronizedBlockAfterFor() throws Exception {
         testFile = new File(getWorkDir(), "Test.java");
diff --git a/java/java.source/nbproject/org-netbeans-modules-java-source.sig b/java/java.source/nbproject/org-netbeans-modules-java-source.sig
index 05ec978..95f3426 100644
--- a/java/java.source/nbproject/org-netbeans-modules-java-source.sig
+++ b/java/java.source/nbproject/org-netbeans-modules-java-source.sig
@@ -27,7 +27,6 @@
 meth public abstract {com.sun.source.tree.TreeVisitor%0} visitExports(com.sun.source.tree.ExportsTree,{com.sun.source.tree.TreeVisitor%1})
 meth public abstract {com.sun.source.tree.TreeVisitor%0} visitExpressionStatement(com.sun.source.tree.ExpressionStatementTree,{com.sun.source.tree.TreeVisitor%1})
 meth public abstract {com.sun.source.tree.TreeVisitor%0} visitForLoop(com.sun.source.tree.ForLoopTree,{com.sun.source.tree.TreeVisitor%1})
-meth public abstract {com.sun.source.tree.TreeVisitor%0} visitGuardedPattern(com.sun.source.tree.GuardedPatternTree,{com.sun.source.tree.TreeVisitor%1})
 meth public abstract {com.sun.source.tree.TreeVisitor%0} visitIdentifier(com.sun.source.tree.IdentifierTree,{com.sun.source.tree.TreeVisitor%1})
 meth public abstract {com.sun.source.tree.TreeVisitor%0} visitIf(com.sun.source.tree.IfTree,{com.sun.source.tree.TreeVisitor%1})
 meth public abstract {com.sun.source.tree.TreeVisitor%0} visitImport(com.sun.source.tree.ImportTree,{com.sun.source.tree.TreeVisitor%1})
@@ -108,7 +107,6 @@
 meth public {com.sun.source.util.TreeScanner%0} visitExports(com.sun.source.tree.ExportsTree,{com.sun.source.util.TreeScanner%1})
 meth public {com.sun.source.util.TreeScanner%0} visitExpressionStatement(com.sun.source.tree.ExpressionStatementTree,{com.sun.source.util.TreeScanner%1})
 meth public {com.sun.source.util.TreeScanner%0} visitForLoop(com.sun.source.tree.ForLoopTree,{com.sun.source.util.TreeScanner%1})
-meth public {com.sun.source.util.TreeScanner%0} visitGuardedPattern(com.sun.source.tree.GuardedPatternTree,{com.sun.source.util.TreeScanner%1})
 meth public {com.sun.source.util.TreeScanner%0} visitIdentifier(com.sun.source.tree.IdentifierTree,{com.sun.source.util.TreeScanner%1})
 meth public {com.sun.source.util.TreeScanner%0} visitIf(com.sun.source.tree.IfTree,{com.sun.source.util.TreeScanner%1})
 meth public {com.sun.source.util.TreeScanner%0} visitImport(com.sun.source.tree.ImportTree,{com.sun.source.util.TreeScanner%1})
diff --git a/java/java.source/nbproject/project.properties b/java/java.source/nbproject/project.properties
index 627e2cd..b9bdb14 100644
--- a/java/java.source/nbproject/project.properties
+++ b/java/java.source/nbproject/project.properties
@@ -22,7 +22,7 @@
 javadoc.title=Java Source
 javadoc.arch=${basedir}/arch.xml
 javadoc.apichanges=${basedir}/apichanges.xml
-spec.version.base=0.182.0
+spec.version.base=0.183.0
 test.qa-functional.cp.extra=${refactoring.java.dir}/modules/ext/nb-javac-api.jar
 test.unit.run.cp.extra=${o.n.core.dir}/core/core.jar:\
     ${o.n.core.dir}/lib/boot.jar:\
diff --git a/java/languages.antlr/build.xml b/java/languages.antlr/build.xml
new file mode 100644
index 0000000..4926bce
--- /dev/null
+++ b/java/languages.antlr/build.xml
@@ -0,0 +1,143 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+    Licensed to the Apache Software Foundation (ASF) under one
+    or more contributor license agreements.  See the NOTICE file
+    distributed with this work for additional information
+    regarding copyright ownership.  The ASF licenses this file
+    to you under the Apache License, Version 2.0 (the
+    "License"); you may not use this file except in compliance
+    with the License.  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing,
+    software distributed under the License is distributed on an
+    "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+    KIND, either express or implied.  See the License for the
+    specific language governing permissions and limitations
+    under the License.
+
+-->
+<!-- You may freely edit this file. See harness/README in the NetBeans platform -->
+<!-- for some information on what you could do (e.g. targets to override). -->
+<!-- If you delete this file and reopen the project it will be recreated. -->
+<project name="java/languages.antlr" default="build" basedir=".">
+    <description>Builds, tests, and runs the project org.netbeans.modules.languages.antlr</description>
+    <import file="../../nbbuild/templates/projectized.xml"/>
+
+    <target name="download-antlr-grammar" depends="init">
+        <property name="apache.license.header">
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+// DO NOT EDIT THIS FILE MANUALLY!
+// SEE build.xml FOR INSTRUCTIONS
+
+</property>
+        <property name="antlr3.additionalheader">
+
+@header{
+${apache.license.header}
+package org.antlr.parser.antlr3;
+
+}
+
+</property>
+        <property name="antlr4.additionalheader">
+
+@header{
+${apache.license.header}
+package org.antlr.parser.antlr4;
+
+}
+
+</property>
+        <property name="antlr4.outdir" location="${src.dir}/org/antlr/parser/antlr4"/>
+        <property name="antlr3.outdir" location="${src.dir}/org/antlr/parser/antlr3"/>
+        <mkdir dir="${antlr3.outdir}"/>
+        <mkdir dir="${antlr4.outdir}"/>
+
+        <get src="https://raw.githubusercontent.com/antlr/grammars-v4/${antlr4.grammar.version}/antlr/antlr3/ANTLRv3Lexer.g4" dest="${antlr3.outdir}"/>
+        <get src="https://raw.githubusercontent.com/antlr/grammars-v4/${antlr4.grammar.version}/antlr/antlr3/ANTLRv3Parser.g4" dest="${antlr3.outdir}"/>
+        <get src="https://raw.githubusercontent.com/antlr/grammars-v4/${antlr4.grammar.version}/antlr/antlr3/Java/LexerAdaptor.java" dest="${antlr3.outdir}"/>
+
+        <get src="https://raw.githubusercontent.com/antlr/grammars-v4/${antlr4.grammar.version}/antlr/antlr4/ANTLRv4Lexer.g4" dest="${antlr4.outdir}"/>
+        <get src="https://raw.githubusercontent.com/antlr/grammars-v4/${antlr4.grammar.version}/antlr/antlr4/ANTLRv4Parser.g4" dest="${antlr4.outdir}"/>
+        <get src="https://raw.githubusercontent.com/antlr/grammars-v4/${antlr4.grammar.version}/antlr/antlr4/LexBasic.g4" dest="${antlr4.outdir}"/>
+        <get src="https://raw.githubusercontent.com/antlr/grammars-v4/${antlr4.grammar.version}/antlr/antlr4/Java/LexerAdaptor.java" dest="${antlr4.outdir}"/>
+
+        <replace file="${antlr3.outdir}/LexerAdaptor.java">
+              <replacetoken><![CDATA[
+import org.antlr.v4.runtime.CharStream;]]></replacetoken>
+  <replacevalue><![CDATA[
+package org.antlr.parser.antlr3;
+import org.antlr.v4.runtime.CharStream;]]></replacevalue>
+        </replace>
+        <replace file="${antlr4.outdir}/LexerAdaptor.java" token="//package" value="package"/>
+
+        <replaceregexp match="(parser|lexer) grammar ([^;]+);([\n\r]*)"
+                       replace="\1 grammar \2;${antlr3.additionalheader}"
+                       flags="g"
+        >
+            <fileset dir="${antlr3.outdir}" includes="ANTLRv3Parser.g4 ANTLRv3Lexer.g4" />
+        </replaceregexp>
+
+        <replaceregexp match="(parser|lexer) grammar ([^;]+);([\n\r]*)"
+                       replace="\1 grammar \2;${antlr4.additionalheader}"
+                       flags="g"
+        >
+            <fileset dir="${antlr4.outdir}" includes="ANTLRv4Parser.g4 LexBasic.g4" />
+        </replaceregexp>
+    </target>
+
+    <target name="generate-antlr-parser" description="Regenerate the ANTLRv4 parser" depends="init">
+        <property name="antlr3.outdir" location="${src.dir}/org/antlr/parser/antlr3"/>
+        <property name="antlr4.outdir" location="${src.dir}/org/antlr/parser/antlr4"/>
+        <path id="antlr4.tool">
+            <fileset dir="../../ide/libs.antlr4.runtime/external" includes="*.jar"/>
+            <fileset dir="../../ide/libs.antlr3.runtime/external" includes="antlr-runtime-*.jar"/>
+        </path>
+
+        <java classname="org.antlr.v4.Tool" classpathref="antlr4.tool" fork="true" dir="${antlr3.outdir}">
+            <arg value="-o"/>
+            <arg value="${antlr3.outdir}"/>
+            <!--arg value="-package"/>
+            <arg value="org.antlr.parser.antlr4"/-->
+            <arg value="ANTLRv3Lexer.g4"/>
+            <arg value="ANTLRv3Parser.g4"/>
+        </java>
+
+        <java classname="org.antlr.v4.Tool" classpathref="antlr4.tool" fork="true" dir="${antlr4.outdir}">
+            <arg value="-o"/>
+            <arg value="${antlr4.outdir}"/>
+            <!--arg value="-package"/>
+            <arg value="org.antlr.parser.antlr4"/-->
+            <arg value="ANTLRv4Lexer.g4"/>
+            <arg value="ANTLRv4Parser.g4"/>
+        </java>
+
+        <delete dir="${antlr3.outdir}" includes="*.tokens"/>
+        <delete dir="${antlr3.outdir}" includes="*.interp"/>
+        <delete dir="${antlr4.outdir}" includes="*.tokens"/>
+        <delete dir="${antlr4.outdir}" includes="*.interp"/>
+        <!--delete dir="${antlr.outdir}" includes="*.g4"/-->
+
+    </target>
+</project>
diff --git a/java/languages.antlr/licenseinfo.xml b/java/languages.antlr/licenseinfo.xml
new file mode 100644
index 0000000..656b77e
--- /dev/null
+++ b/java/languages.antlr/licenseinfo.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+    Licensed to the Apache Software Foundation (ASF) under one
+    or more contributor license agreements.  See the NOTICE file
+    distributed with this work for additional information
+    regarding copyright ownership.  The ASF licenses this file
+    to you under the Apache License, Version 2.0 (the
+    "License"); you may not use this file except in compliance
+    with the License.  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing,
+    software distributed under the License is distributed on an
+    "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+    KIND, either express or implied.  See the License for the
+    specific language governing permissions and limitations
+    under the License.
+
+-->
+<licenseinfo>
+    <fileset>
+        <file>src/org/antlr/parser/antlr3/ANTLRv3Lexer.g4</file>
+        <file>src/org/antlr/parser/antlr3/ANTLRv3Parser.g4</file>
+        <file>src/org/antlr/parser/antlr3/LexerAdaptor.java</file>
+        <file>src/org/antlr/parser/antlr4/ANTLRv4Lexer.g4</file>
+        <file>src/org/antlr/parser/antlr4/ANTLRv4Parser.g4</file>
+        <file>src/org/antlr/parser/antlr4/LexBasic.g4</file>
+        <file>src/org/antlr/parser/antlr4/LexerAdaptor.java</file>
+        <license ref="BSD-antlr4-grammar" />
+    </fileset>
+    <fileset>
+        <file>src/org/netbeans/modules/languages/antlr/resources/antlr.png</file>
+        <license ref="BSD-antlr-icons" />
+    </fileset>
+</licenseinfo>
diff --git a/java/languages.antlr/manifest.mf b/java/languages.antlr/manifest.mf
new file mode 100644
index 0000000..e61fc7c
--- /dev/null
+++ b/java/languages.antlr/manifest.mf
@@ -0,0 +1,6 @@
+Manifest-Version: 1.0
+OpenIDE-Module: org.netbeans.modules.languages.antlr
+OpenIDE-Module-Layer: org/netbeans/modules/languages/antlr/layer.xml
+OpenIDE-Module-Localizing-Bundle: org/netbeans/modules/languages/antlr/Bundle.properties
+OpenIDE-Module-Specification-Version: 1.0
+AutoUpdate-Show-In-Client: false
diff --git a/java/languages.antlr/nbproject/project.properties b/java/languages.antlr/nbproject/project.properties
new file mode 100644
index 0000000..68135cc
--- /dev/null
+++ b/java/languages.antlr/nbproject/project.properties
@@ -0,0 +1,23 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+javac.source=1.8
+
+# As of 30th Aug 2022, we use the Grammar from:
+# https://github.com/antlr/grammars-v4/tree/07518e5c5d3a43c75e17f0c196be93eab21d6c83/antlr/antlr4
+#
+antlr3.grammar.version=07518e5c5d3a43c75e17f0c196be93eab21d6c83
+antlr4.grammar.version=07518e5c5d3a43c75e17f0c196be93eab21d6c83
diff --git a/java/languages.antlr/nbproject/project.xml b/java/languages.antlr/nbproject/project.xml
new file mode 100644
index 0000000..0088942
--- /dev/null
+++ b/java/languages.antlr/nbproject/project.xml
@@ -0,0 +1,218 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+    Licensed to the Apache Software Foundation (ASF) under one
+    or more contributor license agreements.  See the NOTICE file
+    distributed with this work for additional information
+    regarding copyright ownership.  The ASF licenses this file
+    to you under the Apache License, Version 2.0 (the
+    "License"); you may not use this file except in compliance
+    with the License.  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing,
+    software distributed under the License is distributed on an
+    "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+    KIND, either express or implied.  See the License for the
+    specific language governing permissions and limitations
+    under the License.
+
+-->
+<project xmlns="http://www.netbeans.org/ns/project/1">
+    <type>org.netbeans.modules.apisupport.project</type>
+    <configuration>
+        <data xmlns="http://www.netbeans.org/ns/nb-module-project/3">
+            <code-name-base>org.netbeans.modules.languages.antlr</code-name-base>
+            <module-dependencies>
+                <dependency>
+                    <code-name-base>org.netbeans.core.multiview</code-name-base>
+                    <build-prerequisite/>
+                    <compile-dependency/>
+                    <run-dependency>
+                        <release-version>1</release-version>
+                        <specification-version>1.29</specification-version>
+                    </run-dependency>
+                </dependency>
+                <dependency>
+                    <code-name-base>org.netbeans.libs.antlr4.runtime</code-name-base>
+                    <build-prerequisite/>
+                    <compile-dependency/>
+                    <run-dependency>
+                        <specification-version>1.18</specification-version>
+                    </run-dependency>
+                </dependency>
+                <dependency>
+                    <code-name-base>org.netbeans.modules.csl.api</code-name-base>
+                    <build-prerequisite/>
+                    <compile-dependency/>
+                    <run-dependency>
+                        <release-version>2</release-version>
+                        <specification-version>2.74</specification-version>
+                    </run-dependency>
+                </dependency>
+                <dependency>
+                    <code-name-base>org.netbeans.modules.csl.types</code-name-base>
+                    <build-prerequisite/>
+                    <compile-dependency/>
+                    <run-dependency>
+                        <release-version>1</release-version>
+                        <specification-version>1.18</specification-version>
+                    </run-dependency>
+                </dependency>
+                <dependency>
+                    <code-name-base>org.netbeans.modules.editor</code-name-base>
+                    <build-prerequisite/>
+                    <compile-dependency/>
+                    <run-dependency>
+                        <release-version>3</release-version>
+                        <specification-version>1.105</specification-version>
+                    </run-dependency>
+                </dependency>
+                <dependency>
+                    <code-name-base>org.netbeans.modules.editor.completion</code-name-base>
+                    <build-prerequisite/>
+                    <compile-dependency/>
+                    <run-dependency>
+                        <release-version>1</release-version>
+                        <specification-version>1.62</specification-version>
+                    </run-dependency>
+                </dependency>
+                <dependency>
+                    <code-name-base>org.netbeans.modules.editor.document</code-name-base>
+                    <build-prerequisite/>
+                    <compile-dependency/>
+                    <run-dependency>
+                        <specification-version>1.26</specification-version>
+                    </run-dependency>
+                </dependency>
+                <dependency>
+                    <code-name-base>org.netbeans.modules.editor.lib2</code-name-base>
+                    <build-prerequisite/>
+                    <compile-dependency/>
+                    <run-dependency>
+                        <release-version>1</release-version>
+                        <specification-version>2.37</specification-version>
+                    </run-dependency>
+                </dependency>
+                <dependency>
+                    <code-name-base>org.netbeans.modules.editor.mimelookup</code-name-base>
+                    <build-prerequisite/>
+                    <compile-dependency/>
+                    <run-dependency>
+                        <release-version>1</release-version>
+                        <specification-version>1.57</specification-version>
+                    </run-dependency>
+                </dependency>
+                <dependency>
+                    <code-name-base>org.netbeans.modules.editor.settings</code-name-base>
+                    <build-prerequisite/>
+                    <compile-dependency/>
+                    <run-dependency>
+                        <release-version>1</release-version>
+                        <specification-version>1.75</specification-version>
+                    </run-dependency>
+                </dependency>
+                <dependency>
+                    <code-name-base>org.netbeans.modules.lexer</code-name-base>
+                    <build-prerequisite/>
+                    <compile-dependency/>
+                    <run-dependency>
+                        <release-version>2</release-version>
+                        <specification-version>1.80</specification-version>
+                    </run-dependency>
+                </dependency>
+                <dependency>
+                    <code-name-base>org.netbeans.modules.parsing.api</code-name-base>
+                    <build-prerequisite/>
+                    <compile-dependency/>
+                    <run-dependency>
+                        <release-version>1</release-version>
+                        <specification-version>9.25</specification-version>
+                    </run-dependency>
+                </dependency>
+                <dependency>
+                    <code-name-base>org.netbeans.modules.refactoring.api</code-name-base>
+                    <build-prerequisite/>
+                    <compile-dependency/>
+                    <run-dependency>
+                        <specification-version>1.65</specification-version>
+                    </run-dependency>
+                </dependency>
+                <dependency>
+                    <code-name-base>org.openide.awt</code-name-base>
+                    <build-prerequisite/>
+                    <compile-dependency/>
+                    <run-dependency>
+                        <specification-version>7.85</specification-version>
+                    </run-dependency>
+                </dependency>
+                <dependency>
+                    <code-name-base>org.openide.filesystems</code-name-base>
+                    <build-prerequisite/>
+                    <compile-dependency/>
+                    <run-dependency>
+                        <specification-version>9.29</specification-version>
+                    </run-dependency>
+                </dependency>
+                <dependency>
+                    <code-name-base>org.openide.loaders</code-name-base>
+                    <build-prerequisite/>
+                    <compile-dependency/>
+                    <run-dependency>
+                        <specification-version>7.87</specification-version>
+                    </run-dependency>
+                </dependency>
+                <dependency>
+                    <code-name-base>org.openide.nodes</code-name-base>
+                    <build-prerequisite/>
+                    <compile-dependency/>
+                    <run-dependency>
+                        <specification-version>7.62</specification-version>
+                    </run-dependency>
+                </dependency>
+                <dependency>
+                    <code-name-base>org.openide.text</code-name-base>
+                    <build-prerequisite/>
+                    <compile-dependency/>
+                    <run-dependency>
+                        <specification-version>6.86</specification-version>
+                    </run-dependency>
+                </dependency>
+                <dependency>
+                    <code-name-base>org.openide.util</code-name-base>
+                    <build-prerequisite/>
+                    <compile-dependency/>
+                    <run-dependency>
+                        <specification-version>9.25</specification-version>
+                    </run-dependency>
+                </dependency>
+                <dependency>
+                    <code-name-base>org.openide.util.lookup</code-name-base>
+                    <build-prerequisite/>
+                    <compile-dependency/>
+                    <run-dependency>
+                        <specification-version>8.51</specification-version>
+                    </run-dependency>
+                </dependency>
+                <dependency>
+                    <code-name-base>org.openide.util.ui</code-name-base>
+                    <build-prerequisite/>
+                    <compile-dependency/>
+                    <run-dependency>
+                        <specification-version>9.25</specification-version>
+                    </run-dependency>
+                </dependency>
+                <dependency>
+                    <code-name-base>org.openide.windows</code-name-base>
+                    <build-prerequisite/>
+                    <compile-dependency/>
+                    <run-dependency>
+                        <specification-version>6.94</specification-version>
+                    </run-dependency>
+                </dependency>
+            </module-dependencies>
+            <public-packages/>
+        </data>
+    </configuration>
+</project>
diff --git a/java/languages.antlr/src/org/antlr/parser/antlr3/ANTLRv3Lexer.g4 b/java/languages.antlr/src/org/antlr/parser/antlr3/ANTLRv3Lexer.g4
new file mode 100644
index 0000000..729390a
--- /dev/null
+++ b/java/languages.antlr/src/org/antlr/parser/antlr3/ANTLRv3Lexer.g4
@@ -0,0 +1,636 @@
+/*
+ [The "BSD licence"]
+ Copyright (c) 2005-2007 Terence Parr
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+ 1. Redistributions of source code must retain the above copyright
+    notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+    notice, this list of conditions and the following disclaimer in the
+    documentation and/or other materials provided with the distribution.
+ 3. The name of the author may not be used to endorse or promote products
+    derived from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 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 OF
+ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+lexer grammar ANTLRv3Lexer;
+
+@header{
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+// DO NOT EDIT THIS FILE MANUALLY!
+// SEE build.xml FOR INSTRUCTIONS
+
+
+package org.antlr.parser.antlr3;
+
+}
+
+options { superClass = LexerAdaptor; }
+
+channels { OFF_CHANNEL }
+
+tokens {
+    DOC_COMMENT,
+    PARSER,	
+    LEXER,
+    RULE,
+    BLOCK,
+    OPTIONAL,
+    CLOSURE,
+    POSITIVE_CLOSURE,
+    SYNPRED,
+    RANGE,
+    CHAR_RANGE,
+    EPSILON,
+    ALT,
+    EOR,
+    EOB,
+    EOA, // end of alt
+    ID,
+    ARG,
+    ARGLIST,
+    RET,
+    LEXER_GRAMMAR,
+    PARSER_GRAMMAR,
+    TREE_GRAMMAR,
+    COMBINED_GRAMMAR,
+    INITACTION,
+    LABEL, // $x used in rewrite rules
+    TEMPLATE,
+    SCOPE,
+    SEMPRED,
+    GATED_SEMPRED, // {p}? =>
+    SYN_SEMPRED, // (...) =>   it's a manually-specified synpred converted to sempred
+    BACKTRACK_SEMPRED, // auto backtracking mode syn pred converted to sempred
+    FRAGMENT,
+    TREE_BEGIN,
+    ROOT,
+    BANG,
+    RANGE,
+    REWRITE,
+    ACTION_CONTENT
+}
+
+DOC_COMMENT
+   : '/**' .*? ('*/' | EOF) -> channel(OFF_CHANNEL)
+   ;
+
+SL_COMMENT
+   : '//' ~ [\r\n]* -> channel(OFF_CHANNEL)
+   ;
+
+ML_COMMENT
+   : '/*' .*? '*/' -> channel(OFF_CHANNEL)
+   ;
+
+INT
+   : '0' .. '9'+
+   ;
+
+CHAR_LITERAL
+   : '\'' LITERAL_CHAR '\''
+   ;
+
+STRING_LITERAL
+   : '\'' LITERAL_CHAR LITERAL_CHAR* '\''
+   ;
+
+fragment LITERAL_CHAR
+   : ESC
+   | ~ ('\'' | '\\')
+   ;
+
+// This seems to be available in Antlr3.
+
+DOUBLE_QUOTE_STRING_LITERAL
+   : '"' (ESC | ~ ('\\' | '"'))* '"'
+   ;
+
+// This seems to be available in Antlr3.
+
+DOUBLE_ANGLE_STRING_LITERAL
+   : '<<' .*? '>>'
+   ;
+
+fragment ESC
+   : '\\' ('n' | 'r' | 't' | 'b' | 'f' | '"' | '\'' | '\\' | '>' | 'u' XDIGIT XDIGIT XDIGIT XDIGIT | .)
+   ;
+
+fragment XDIGIT
+   : '0' .. '9'
+   | 'a' .. 'f'
+   | 'A' .. 'F'
+   ;
+
+
+// -------------------------
+// Arguments
+//
+// Certain argument lists, such as those specifying call parameters
+// to a rule invocation, or input parameters to a rule specification
+// are contained within square brackets.
+
+BEGIN_ARGUMENT
+   : LBrack
+   { this.handleBeginArgument(); }
+   ;
+
+// -------------------------
+// Actions
+
+BEGIN_ACTION
+   : LBrace -> pushMode (Actionx)
+   ;
+
+// -------------------------
+// Keywords
+//
+// Keywords may not be used as labels for rules or in any other context where
+// they would be ambiguous with the keyword vs some other identifier.  OPTIONS,
+// TOKENS, & CHANNELS blocks are handled idiomatically in dedicated lexical modes.
+
+OPTIONS
+   : 'options' -> pushMode (Options)
+   ;
+
+TOKENS
+   : 'tokens' -> pushMode (Tokens)
+   ;
+
+CATCH : 'catch' ;
+FINALLY : 'finally' ;
+FRAGMENT : 'fragment' ;
+GRAMMAR : 'grammar' ;
+LEXER : 'lexer' ;
+PARSER : 'parser' ;
+PRIVATE : 'private' ;
+PROTECTED : 'protected' ;
+PUBLIC : 'public' ;
+RETURNS : 'returns' ;
+SCOPE : 'scope' ;
+THROWS : 'throws' ;
+TREE : 'tree' ;
+
+
+fragment WS_LOOP : (WS | SL_COMMENT | ML_COMMENT)* ;
+
+//// =================================
+ 
+AT : At ;
+BANG : '!' ;
+COLON : Colon ;
+COLONCOLON : DColon ;
+COMMA : Comma ;
+DOT : Dot ;
+EQUAL : Equal ;
+LBRACE : LBrace ;
+LBRACK : LBrack ;
+LPAREN : LParen ;
+OR : Pipe ;
+PLUS : Plus ;
+QM : Question ;
+RANGE : '..' ;
+RBRACE : RBrace ;
+RBRACK : RBrack ;
+REWRITE : RArrow ;
+ROOT : '^' ;
+RPAREN : RParen ;
+SEMI : Semi ;
+SEMPREDOP : '=>' ;
+STAR : Star ;
+TREE_BEGIN : '^(' ;
+DOLLAR : Dollar ;
+PEQ : PlusAssign ;
+NOT : Tilde ;
+
+WS
+   : (' ' | '\t' | '\r'? '\n')+ -> channel(OFF_CHANNEL)
+   ;
+
+TOKEN_REF
+   : 'A' .. 'Z' ('a' .. 'z' | 'A' .. 'Z' | '_' | '0' .. '9')*
+   ;
+
+RULE_REF
+   : 'a' .. 'z' ('a' .. 'z' | 'A' .. 'Z' | '_' | '0' .. '9')*
+   ;
+
+// ======================================================
+// Lexer fragments
+//
+// -----------------------------------
+// Whitespace & Comments
+
+fragment Ws
+   : Hws
+   | Vws
+   ;
+
+fragment Hws
+   : [ \t]
+   ;
+
+fragment Vws
+   : [\r\n\f]
+   ;
+
+fragment BlockComment
+   : '/*' .*? ('*/' | EOF)
+   ;
+
+fragment DocComment
+   : '/**' .*? ('*/' | EOF)
+   ;
+
+fragment LineComment
+   : '//' ~ [\r\n]*
+   ;
+   // -----------------------------------
+   // Escapes
+   // Any kind of escaped character that we can embed within ANTLR literal strings.
+
+fragment EscSeq
+   : Esc ([btnfr"'\\] | UnicodeEsc | . | EOF)
+   ;
+
+fragment EscAny
+   : Esc .
+   ;
+
+fragment UnicodeEsc
+   : 'u' (HexDigit (HexDigit (HexDigit HexDigit?)?)?)?
+   ;
+   // -----------------------------------
+   // Numerals
+
+fragment DecimalNumeral
+   : '0'
+   | [1-9] DecDigit*
+   ;
+   // -----------------------------------
+   // Digits
+
+fragment HexDigit
+   : [0-9a-fA-F]
+   ;
+
+fragment DecDigit
+   : [0-9]
+   ;
+   // -----------------------------------
+   // Literals
+
+fragment BoolLiteral
+   : 'true'
+   | 'false'
+   ;
+
+fragment CharLiteral
+   : SQuote (EscSeq | ~ ['\r\n\\]) SQuote
+   ;
+
+fragment SQuoteLiteral
+   : SQuote (EscSeq | ~ ['\r\n\\])* SQuote
+   ;
+
+fragment DQuoteLiteral
+   : DQuote (EscSeq | ~ ["\r\n\\])* DQuote
+   ;
+
+fragment USQuoteLiteral
+   : SQuote (EscSeq | ~ ['\r\n\\])*
+   ;
+   // -----------------------------------
+   // Character ranges
+
+fragment NameChar
+   : NameStartChar
+   | '0' .. '9'
+   | Underscore
+   | '\u00B7'
+   | '\u0300' .. '\u036F'
+   | '\u203F' .. '\u2040'
+   ;
+
+fragment NameStartChar
+   : 'A' .. 'Z'
+   | 'a' .. 'z'
+   | '\u00C0' .. '\u00D6'
+   | '\u00D8' .. '\u00F6'
+   | '\u00F8' .. '\u02FF'
+   | '\u0370' .. '\u037D'
+   | '\u037F' .. '\u1FFF'
+   | '\u200C' .. '\u200D'
+   | '\u2070' .. '\u218F'
+   | '\u2C00' .. '\u2FEF'
+   | '\u3001' .. '\uD7FF'
+   | '\uF900' .. '\uFDCF'
+   | '\uFDF0' .. '\uFFFD'
+   ;
+
+// ignores | ['\u10000-'\uEFFFF] ;
+
+// -----------------------------------
+// Types
+
+fragment Int : 'int' ;
+
+// -----------------------------------
+// Symbols
+
+fragment Esc : '\\' ;
+fragment Colon : ':' ;
+fragment DColon : '::' ;
+
+fragment SQuote
+   : '\''
+   ;
+
+fragment DQuote
+   : '"'
+   ;
+
+fragment LParen : '(' ;
+fragment RParen : ')' ;
+fragment LBrace : '{' ;
+fragment RBrace : '}' ;
+fragment LBrack : '[' ;
+fragment RBrack : ']' ;
+fragment RArrow : '->' ;
+
+fragment Lt
+   : '<'
+   ;
+
+fragment Gt
+   : '>'
+   ;
+
+fragment Equal : '=' ;
+fragment Question : '?' ;
+fragment Star : '*' ;
+fragment Plus : '+' ;
+fragment PlusAssign : '+=' ;
+fragment Underscore : '_' ;
+fragment Pipe : '|' ;
+fragment Dollar : '$' ;
+fragment Comma : ',' ;
+fragment Semi : ';' ;
+fragment Dot : '.' ;
+fragment Range : '..' ;
+fragment At : '@' ;
+
+fragment Pound
+   : '#'
+   ;
+
+fragment Tilde
+   : '~'
+   ;
+
+// ======================================================
+// Lexer modes
+// -------------------------
+// Arguments
+
+mode Argument;
+// E.g., [int x, List<String> a[]]
+NESTED_ARGUMENT
+   : LBrack -> type (ARGUMENT_CONTENT) , pushMode (Argument)
+   ;
+
+ARGUMENT_ESCAPE
+   : EscAny -> type (ARGUMENT_CONTENT)
+   ;
+
+ARGUMENT_STRING_LITERAL
+   : DQuoteLiteral -> type (ARGUMENT_CONTENT)
+   ;
+
+ARGUMENT_CHAR_LITERAL
+   : SQuoteLiteral -> type (ARGUMENT_CONTENT)
+   ;
+
+END_ARGUMENT
+   : RBrack
+   { this.handleEndArgument(); }
+   ;
+   // added this to return non-EOF token type here. EOF does something weird
+
+UNTERMINATED_ARGUMENT
+   : EOF -> popMode
+   ;
+
+ARGUMENT_CONTENT
+   : .
+   ;
+
+// -------------------------
+// Actions
+//
+// Many language targets use {} as block delimiters and so we
+// must recursively match {} delimited blocks to balance the
+// braces. Additionally, we must make some assumptions about
+// literal string representation in the target language. We assume
+// that they are delimited by ' or " and so consume these
+// in their own alts so as not to inadvertantly match {}.
+
+mode Actionx;
+NESTED_ACTION
+   : LBrace -> type (ACTION_CONTENT) , pushMode (Actionx)
+   ;
+
+ACTION_ESCAPE
+   : EscAny -> type (ACTION_CONTENT)
+   ;
+
+ACTION_STRING_LITERAL
+   : DQuoteLiteral -> type (ACTION_CONTENT)
+   ;
+
+ACTION_CHAR_LITERAL
+   : SQuoteLiteral -> type (ACTION_CONTENT)
+   ;
+
+ACTION_DOC_COMMENT
+   : DocComment -> type (ACTION_CONTENT)
+   ;
+
+ACTION_BLOCK_COMMENT
+   : BlockComment -> type (ACTION_CONTENT)
+   ;
+
+ACTION_LINE_COMMENT
+   : LineComment -> type (ACTION_CONTENT)
+   ;
+
+END_ACTION
+   : RBrace
+   { this.handleEndAction(); }
+   ;
+
+UNTERMINATED_ACTION
+   : EOF -> popMode
+   ;
+
+ACTION_CONTENT
+   : .
+   ;
+
+// -------------------------
+
+mode Options;
+OPT_DOC_COMMENT
+   : DocComment -> type (DOC_COMMENT) , channel (OFF_CHANNEL)
+   ;
+
+OPT_BLOCK_COMMENT
+   : BlockComment -> type (ML_COMMENT) , channel (OFF_CHANNEL)
+   ;
+
+OPT_LINE_COMMENT
+   : LineComment -> type (SL_COMMENT) , channel (OFF_CHANNEL)
+   ;
+
+OPT_LBRACE
+   : LBrace
+   { this.handleOptionsLBrace(); }
+   ;
+
+OPT_RBRACE
+   : RBrace -> type (RBRACE) , popMode
+   ;
+
+OPT_ID
+   : Id -> type (ID)
+   ;
+
+OPT_DOT
+   : Dot -> type (DOT)
+   ;
+
+OPT_ASSIGN
+   : Equal -> type (EQUAL)
+   ;
+
+OPT_STRING_LITERAL
+   : SQuoteLiteral -> type (STRING_LITERAL)
+   ;
+
+OPT_INT
+   : DecimalNumeral -> type (INT)
+   ;
+
+OPT_STAR
+   : Star -> type (STAR)
+   ;
+
+OPT_SEMI
+   : Semi -> type (SEMI)
+   ;
+
+OPT_WS
+   : Ws+ -> type (WS) , channel (OFF_CHANNEL)
+   ;
+
+// -------------------------
+
+mode Tokens;
+TOK_DOC_COMMENT
+   : DocComment -> type (DOC_COMMENT) , channel (OFF_CHANNEL)
+   ;
+
+TOK_BLOCK_COMMENT
+   : BlockComment -> type (ML_COMMENT) , channel (OFF_CHANNEL)
+   ;
+
+TOK_LINE_COMMENT
+   : LineComment -> type (SL_COMMENT) , channel (OFF_CHANNEL)
+   ;
+
+TOK_LBRACE
+   : LBrace -> type (LBRACE)
+   ;
+
+TOK_RBRACE
+   : RBrace -> type (RBRACE) , popMode
+   ;
+
+TOK_ID
+   : Id -> type (TOKEN_REF)
+   ;
+
+TOK_EQ
+   : Equal -> type (EQUAL)
+   ;
+
+TOK_CL
+   : '\'' LITERAL_CHAR '\'' -> type(CHAR_LITERAL)
+   ;
+
+TOK_SL
+   : '\'' LITERAL_CHAR LITERAL_CHAR* '\'' -> type(STRING_LITERAL)
+   ;
+
+TOK_SEMI
+   : Semi -> type (SEMI)
+   ;
+
+TOK_WS
+   : Ws+ -> type (WS) , channel (OFF_CHANNEL)
+   ;
+
+
+// -------------------------
+
+mode LexerCharSet;
+LEXER_CHAR_SET_BODY
+   : (~ [\]\\] | EscAny)+ -> more
+   ;
+
+LEXER_CHAR_SET
+   : RBrack -> popMode
+   ;
+
+UNTERMINATED_CHAR_SET
+   : EOF -> popMode
+   ;
+
+// ------------------------------------------------------------------------------
+// Grammar specific Keywords, Punctuation, etc.
+
+fragment Id
+   : NameStartChar NameChar*
+   ;
+
diff --git a/java/languages.antlr/src/org/antlr/parser/antlr3/ANTLRv3Lexer.java b/java/languages.antlr/src/org/antlr/parser/antlr3/ANTLRv3Lexer.java
new file mode 100644
index 0000000..bc07205
--- /dev/null
+++ b/java/languages.antlr/src/org/antlr/parser/antlr3/ANTLRv3Lexer.java
@@ -0,0 +1,625 @@
+// Generated from ANTLRv3Lexer.g4 by ANTLR 4.7.2
+
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+// DO NOT EDIT THIS FILE MANUALLY!
+// SEE build.xml FOR INSTRUCTIONS
+
+
+package org.antlr.parser.antlr3;
+
+
+import org.antlr.v4.runtime.Lexer;
+import org.antlr.v4.runtime.CharStream;
+import org.antlr.v4.runtime.Token;
+import org.antlr.v4.runtime.TokenStream;
+import org.antlr.v4.runtime.*;
+import org.antlr.v4.runtime.atn.*;
+import org.antlr.v4.runtime.dfa.DFA;
+import org.antlr.v4.runtime.misc.*;
+
+@SuppressWarnings({"all", "warnings", "unchecked", "unused", "cast"})
+public class ANTLRv3Lexer extends LexerAdaptor {
+	static { RuntimeMetaData.checkVersion("4.7.2", RuntimeMetaData.VERSION); }
+
+	protected static final DFA[] _decisionToDFA;
+	protected static final PredictionContextCache _sharedContextCache =
+		new PredictionContextCache();
+	public static final int
+		DOC_COMMENT=1, PARSER=2, LEXER=3, RULE=4, BLOCK=5, OPTIONAL=6, CLOSURE=7, 
+		POSITIVE_CLOSURE=8, SYNPRED=9, RANGE=10, CHAR_RANGE=11, EPSILON=12, ALT=13, 
+		EOR=14, EOB=15, EOA=16, ID=17, ARG=18, ARGLIST=19, RET=20, LEXER_GRAMMAR=21, 
+		PARSER_GRAMMAR=22, TREE_GRAMMAR=23, COMBINED_GRAMMAR=24, INITACTION=25, 
+		LABEL=26, TEMPLATE=27, SCOPE=28, SEMPRED=29, GATED_SEMPRED=30, SYN_SEMPRED=31, 
+		BACKTRACK_SEMPRED=32, FRAGMENT=33, TREE_BEGIN=34, ROOT=35, BANG=36, REWRITE=37, 
+		ACTION_CONTENT=38, SL_COMMENT=39, ML_COMMENT=40, INT=41, CHAR_LITERAL=42, 
+		STRING_LITERAL=43, DOUBLE_QUOTE_STRING_LITERAL=44, DOUBLE_ANGLE_STRING_LITERAL=45, 
+		BEGIN_ARGUMENT=46, BEGIN_ACTION=47, OPTIONS=48, TOKENS=49, CATCH=50, FINALLY=51, 
+		GRAMMAR=52, PRIVATE=53, PROTECTED=54, PUBLIC=55, RETURNS=56, THROWS=57, 
+		TREE=58, AT=59, COLON=60, COLONCOLON=61, COMMA=62, DOT=63, EQUAL=64, LBRACE=65, 
+		LBRACK=66, LPAREN=67, OR=68, PLUS=69, QM=70, RBRACE=71, RBRACK=72, RPAREN=73, 
+		SEMI=74, SEMPREDOP=75, STAR=76, DOLLAR=77, PEQ=78, NOT=79, WS=80, TOKEN_REF=81, 
+		RULE_REF=82, END_ARGUMENT=83, UNTERMINATED_ARGUMENT=84, ARGUMENT_CONTENT=85, 
+		END_ACTION=86, UNTERMINATED_ACTION=87, OPT_LBRACE=88, LEXER_CHAR_SET=89, 
+		UNTERMINATED_CHAR_SET=90;
+	public static final int
+		OFF_CHANNEL=2;
+	public static final int
+		Argument=1, Actionx=2, Options=3, Tokens=4, LexerCharSet=5;
+	public static String[] channelNames = {
+		"DEFAULT_TOKEN_CHANNEL", "HIDDEN", "OFF_CHANNEL"
+	};
+
+	public static String[] modeNames = {
+		"DEFAULT_MODE", "Argument", "Actionx", "Options", "Tokens", "LexerCharSet"
+	};
+
+	private static String[] makeRuleNames() {
+		return new String[] {
+			"DOC_COMMENT", "SL_COMMENT", "ML_COMMENT", "INT", "CHAR_LITERAL", "STRING_LITERAL", 
+			"LITERAL_CHAR", "DOUBLE_QUOTE_STRING_LITERAL", "DOUBLE_ANGLE_STRING_LITERAL", 
+			"ESC", "XDIGIT", "BEGIN_ARGUMENT", "BEGIN_ACTION", "OPTIONS", "TOKENS", 
+			"CATCH", "FINALLY", "FRAGMENT", "GRAMMAR", "LEXER", "PARSER", "PRIVATE", 
+			"PROTECTED", "PUBLIC", "RETURNS", "SCOPE", "THROWS", "TREE", "WS_LOOP", 
+			"AT", "BANG", "COLON", "COLONCOLON", "COMMA", "DOT", "EQUAL", "LBRACE", 
+			"LBRACK", "LPAREN", "OR", "PLUS", "QM", "RANGE", "RBRACE", "RBRACK", 
+			"REWRITE", "ROOT", "RPAREN", "SEMI", "SEMPREDOP", "STAR", "TREE_BEGIN", 
+			"DOLLAR", "PEQ", "NOT", "WS", "TOKEN_REF", "RULE_REF", "Ws", "Hws", "Vws", 
+			"BlockComment", "DocComment", "LineComment", "EscSeq", "EscAny", "UnicodeEsc", 
+			"DecimalNumeral", "HexDigit", "DecDigit", "BoolLiteral", "CharLiteral", 
+			"SQuoteLiteral", "DQuoteLiteral", "USQuoteLiteral", "NameChar", "NameStartChar", 
+			"Int", "Esc", "Colon", "DColon", "SQuote", "DQuote", "LParen", "RParen", 
+			"LBrace", "RBrace", "LBrack", "RBrack", "RArrow", "Lt", "Gt", "Equal", 
+			"Question", "Star", "Plus", "PlusAssign", "Underscore", "Pipe", "Dollar", 
+			"Comma", "Semi", "Dot", "Range", "At", "Pound", "Tilde", "NESTED_ARGUMENT", 
+			"ARGUMENT_ESCAPE", "ARGUMENT_STRING_LITERAL", "ARGUMENT_CHAR_LITERAL", 
+			"END_ARGUMENT", "UNTERMINATED_ARGUMENT", "ARGUMENT_CONTENT", "NESTED_ACTION", 
+			"ACTION_ESCAPE", "ACTION_STRING_LITERAL", "ACTION_CHAR_LITERAL", "ACTION_DOC_COMMENT", 
+			"ACTION_BLOCK_COMMENT", "ACTION_LINE_COMMENT", "END_ACTION", "UNTERMINATED_ACTION", 
+			"ACTION_CONTENT", "OPT_DOC_COMMENT", "OPT_BLOCK_COMMENT", "OPT_LINE_COMMENT", 
+			"OPT_LBRACE", "OPT_RBRACE", "OPT_ID", "OPT_DOT", "OPT_ASSIGN", "OPT_STRING_LITERAL", 
+			"OPT_INT", "OPT_STAR", "OPT_SEMI", "OPT_WS", "TOK_DOC_COMMENT", "TOK_BLOCK_COMMENT", 
+			"TOK_LINE_COMMENT", "TOK_LBRACE", "TOK_RBRACE", "TOK_ID", "TOK_EQ", "TOK_CL", 
+			"TOK_SL", "TOK_SEMI", "TOK_WS", "LEXER_CHAR_SET_BODY", "LEXER_CHAR_SET", 
+			"UNTERMINATED_CHAR_SET", "Id"
+		};
+	}
+	public static final String[] ruleNames = makeRuleNames();
+
+	private static String[] makeLiteralNames() {
+		return new String[] {
+			null, null, "'parser'", "'lexer'", null, null, null, null, null, null, 
+			"'..'", null, null, null, null, null, null, null, null, null, null, null, 
+			null, null, null, null, null, null, "'scope'", null, null, null, null, 
+			"'fragment'", "'^('", "'^'", "'!'", null, null, null, null, null, null, 
+			null, null, null, null, null, "'options'", "'tokens'", "'catch'", "'finally'", 
+			"'grammar'", "'private'", "'protected'", "'public'", "'returns'", "'throws'", 
+			"'tree'", null, null, null, null, null, null, null, null, null, null, 
+			null, null, null, null, null, null, "'=>'"
+		};
+	}
+	private static final String[] _LITERAL_NAMES = makeLiteralNames();
+	private static String[] makeSymbolicNames() {
+		return new String[] {
+			null, "DOC_COMMENT", "PARSER", "LEXER", "RULE", "BLOCK", "OPTIONAL", 
+			"CLOSURE", "POSITIVE_CLOSURE", "SYNPRED", "RANGE", "CHAR_RANGE", "EPSILON", 
+			"ALT", "EOR", "EOB", "EOA", "ID", "ARG", "ARGLIST", "RET", "LEXER_GRAMMAR", 
+			"PARSER_GRAMMAR", "TREE_GRAMMAR", "COMBINED_GRAMMAR", "INITACTION", "LABEL", 
+			"TEMPLATE", "SCOPE", "SEMPRED", "GATED_SEMPRED", "SYN_SEMPRED", "BACKTRACK_SEMPRED", 
+			"FRAGMENT", "TREE_BEGIN", "ROOT", "BANG", "REWRITE", "ACTION_CONTENT", 
+			"SL_COMMENT", "ML_COMMENT", "INT", "CHAR_LITERAL", "STRING_LITERAL", 
+			"DOUBLE_QUOTE_STRING_LITERAL", "DOUBLE_ANGLE_STRING_LITERAL", "BEGIN_ARGUMENT", 
+			"BEGIN_ACTION", "OPTIONS", "TOKENS", "CATCH", "FINALLY", "GRAMMAR", "PRIVATE", 
+			"PROTECTED", "PUBLIC", "RETURNS", "THROWS", "TREE", "AT", "COLON", "COLONCOLON", 
+			"COMMA", "DOT", "EQUAL", "LBRACE", "LBRACK", "LPAREN", "OR", "PLUS", 
+			"QM", "RBRACE", "RBRACK", "RPAREN", "SEMI", "SEMPREDOP", "STAR", "DOLLAR", 
+			"PEQ", "NOT", "WS", "TOKEN_REF", "RULE_REF", "END_ARGUMENT", "UNTERMINATED_ARGUMENT", 
+			"ARGUMENT_CONTENT", "END_ACTION", "UNTERMINATED_ACTION", "OPT_LBRACE", 
+			"LEXER_CHAR_SET", "UNTERMINATED_CHAR_SET"
+		};
+	}
+	private static final String[] _SYMBOLIC_NAMES = makeSymbolicNames();
+	public static final Vocabulary VOCABULARY = new VocabularyImpl(_LITERAL_NAMES, _SYMBOLIC_NAMES);
+
+	/**
+	 * @deprecated Use {@link #VOCABULARY} instead.
+	 */
+	@Deprecated
+	public static final String[] tokenNames;
+	static {
+		tokenNames = new String[_SYMBOLIC_NAMES.length];
+		for (int i = 0; i < tokenNames.length; i++) {
+			tokenNames[i] = VOCABULARY.getLiteralName(i);
+			if (tokenNames[i] == null) {
+				tokenNames[i] = VOCABULARY.getSymbolicName(i);
+			}
+
+			if (tokenNames[i] == null) {
+				tokenNames[i] = "<INVALID>";
+			}
+		}
+	}
+
+	@Override
+	@Deprecated
+	public String[] getTokenNames() {
+		return tokenNames;
+	}
+
+	@Override
+
+	public Vocabulary getVocabulary() {
+		return VOCABULARY;
+	}
+
+
+	public ANTLRv3Lexer(CharStream input) {
+		super(input);
+		_interp = new LexerATNSimulator(this,_ATN,_decisionToDFA,_sharedContextCache);
+	}
+
+	@Override
+	public String getGrammarFileName() { return "ANTLRv3Lexer.g4"; }
+
+	@Override
+	public String[] getRuleNames() { return ruleNames; }
+
+	@Override
+	public String getSerializedATN() { return _serializedATN; }
+
+	@Override
+	public String[] getChannelNames() { return channelNames; }
+
+	@Override
+	public String[] getModeNames() { return modeNames; }
+
+	@Override
+	public ATN getATN() { return _ATN; }
+
+	@Override
+	public void action(RuleContext _localctx, int ruleIndex, int actionIndex) {
+		switch (ruleIndex) {
+		case 11:
+			BEGIN_ARGUMENT_action((RuleContext)_localctx, actionIndex);
+			break;
+		case 111:
+			END_ARGUMENT_action((RuleContext)_localctx, actionIndex);
+			break;
+		case 121:
+			END_ACTION_action((RuleContext)_localctx, actionIndex);
+			break;
+		case 127:
+			OPT_LBRACE_action((RuleContext)_localctx, actionIndex);
+			break;
+		}
+	}
+	private void BEGIN_ARGUMENT_action(RuleContext _localctx, int actionIndex) {
+		switch (actionIndex) {
+		case 0:
+			 this.handleBeginArgument(); 
+			break;
+		}
+	}
+	private void END_ARGUMENT_action(RuleContext _localctx, int actionIndex) {
+		switch (actionIndex) {
+		case 1:
+			 this.handleEndArgument(); 
+			break;
+		}
+	}
+	private void END_ACTION_action(RuleContext _localctx, int actionIndex) {
+		switch (actionIndex) {
+		case 2:
+			 this.handleEndAction(); 
+			break;
+		}
+	}
+	private void OPT_LBRACE_action(RuleContext _localctx, int actionIndex) {
+		switch (actionIndex) {
+		case 3:
+			 this.handleOptionsLBrace(); 
+			break;
+		}
+	}
+
+	public static final String _serializedATN =
+		"\3\u608b\ua72a\u8133\ub9ed\u417c\u3be7\u7786\u5964\2\\\u0408\b\1\b\1\b"+
+		"\1\b\1\b\1\b\1\4\2\t\2\4\3\t\3\4\4\t\4\4\5\t\5\4\6\t\6\4\7\t\7\4\b\t\b"+
+		"\4\t\t\t\4\n\t\n\4\13\t\13\4\f\t\f\4\r\t\r\4\16\t\16\4\17\t\17\4\20\t"+
+		"\20\4\21\t\21\4\22\t\22\4\23\t\23\4\24\t\24\4\25\t\25\4\26\t\26\4\27\t"+
+		"\27\4\30\t\30\4\31\t\31\4\32\t\32\4\33\t\33\4\34\t\34\4\35\t\35\4\36\t"+
+		"\36\4\37\t\37\4 \t \4!\t!\4\"\t\"\4#\t#\4$\t$\4%\t%\4&\t&\4\'\t\'\4(\t"+
+		"(\4)\t)\4*\t*\4+\t+\4,\t,\4-\t-\4.\t.\4/\t/\4\60\t\60\4\61\t\61\4\62\t"+
+		"\62\4\63\t\63\4\64\t\64\4\65\t\65\4\66\t\66\4\67\t\67\48\t8\49\t9\4:\t"+
+		":\4;\t;\4<\t<\4=\t=\4>\t>\4?\t?\4@\t@\4A\tA\4B\tB\4C\tC\4D\tD\4E\tE\4"+
+		"F\tF\4G\tG\4H\tH\4I\tI\4J\tJ\4K\tK\4L\tL\4M\tM\4N\tN\4O\tO\4P\tP\4Q\t"+
+		"Q\4R\tR\4S\tS\4T\tT\4U\tU\4V\tV\4W\tW\4X\tX\4Y\tY\4Z\tZ\4[\t[\4\\\t\\"+
+		"\4]\t]\4^\t^\4_\t_\4`\t`\4a\ta\4b\tb\4c\tc\4d\td\4e\te\4f\tf\4g\tg\4h"+
+		"\th\4i\ti\4j\tj\4k\tk\4l\tl\4m\tm\4n\tn\4o\to\4p\tp\4q\tq\4r\tr\4s\ts"+
+		"\4t\tt\4u\tu\4v\tv\4w\tw\4x\tx\4y\ty\4z\tz\4{\t{\4|\t|\4}\t}\4~\t~\4\177"+
+		"\t\177\4\u0080\t\u0080\4\u0081\t\u0081\4\u0082\t\u0082\4\u0083\t\u0083"+
+		"\4\u0084\t\u0084\4\u0085\t\u0085\4\u0086\t\u0086\4\u0087\t\u0087\4\u0088"+
+		"\t\u0088\4\u0089\t\u0089\4\u008a\t\u008a\4\u008b\t\u008b\4\u008c\t\u008c"+
+		"\4\u008d\t\u008d\4\u008e\t\u008e\4\u008f\t\u008f\4\u0090\t\u0090\4\u0091"+
+		"\t\u0091\4\u0092\t\u0092\4\u0093\t\u0093\4\u0094\t\u0094\4\u0095\t\u0095"+
+		"\4\u0096\t\u0096\4\u0097\t\u0097\4\u0098\t\u0098\4\u0099\t\u0099\3\2\3"+
+		"\2\3\2\3\2\3\2\7\2\u013e\n\2\f\2\16\2\u0141\13\2\3\2\3\2\3\2\5\2\u0146"+
+		"\n\2\3\2\3\2\3\3\3\3\3\3\3\3\7\3\u014e\n\3\f\3\16\3\u0151\13\3\3\3\3\3"+
+		"\3\4\3\4\3\4\3\4\7\4\u0159\n\4\f\4\16\4\u015c\13\4\3\4\3\4\3\4\3\4\3\4"+
+		"\3\5\6\5\u0164\n\5\r\5\16\5\u0165\3\6\3\6\3\6\3\6\3\7\3\7\3\7\7\7\u016f"+
+		"\n\7\f\7\16\7\u0172\13\7\3\7\3\7\3\b\3\b\5\b\u0178\n\b\3\t\3\t\3\t\7\t"+
+		"\u017d\n\t\f\t\16\t\u0180\13\t\3\t\3\t\3\n\3\n\3\n\3\n\7\n\u0188\n\n\f"+
+		"\n\16\n\u018b\13\n\3\n\3\n\3\n\3\13\3\13\3\13\3\13\3\13\3\13\3\13\3\13"+
+		"\3\13\5\13\u0199\n\13\3\f\3\f\3\r\3\r\3\r\3\16\3\16\3\16\3\16\3\17\3\17"+
+		"\3\17\3\17\3\17\3\17\3\17\3\17\3\17\3\17\3\20\3\20\3\20\3\20\3\20\3\20"+
+		"\3\20\3\20\3\20\3\21\3\21\3\21\3\21\3\21\3\21\3\22\3\22\3\22\3\22\3\22"+
+		"\3\22\3\22\3\22\3\23\3\23\3\23\3\23\3\23\3\23\3\23\3\23\3\23\3\24\3\24"+
+		"\3\24\3\24\3\24\3\24\3\24\3\24\3\25\3\25\3\25\3\25\3\25\3\25\3\26\3\26"+
+		"\3\26\3\26\3\26\3\26\3\26\3\27\3\27\3\27\3\27\3\27\3\27\3\27\3\27\3\30"+
+		"\3\30\3\30\3\30\3\30\3\30\3\30\3\30\3\30\3\30\3\31\3\31\3\31\3\31\3\31"+
+		"\3\31\3\31\3\32\3\32\3\32\3\32\3\32\3\32\3\32\3\32\3\33\3\33\3\33\3\33"+
+		"\3\33\3\33\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3\35\3\35\3\35\3\35\3\35"+
+		"\3\36\3\36\3\36\7\36\u0219\n\36\f\36\16\36\u021c\13\36\3\37\3\37\3 \3"+
+		" \3!\3!\3\"\3\"\3#\3#\3$\3$\3%\3%\3&\3&\3\'\3\'\3(\3(\3)\3)\3*\3*\3+\3"+
+		"+\3,\3,\3,\3-\3-\3.\3.\3/\3/\3\60\3\60\3\61\3\61\3\62\3\62\3\63\3\63\3"+
+		"\63\3\64\3\64\3\65\3\65\3\65\3\66\3\66\3\67\3\67\38\38\39\39\59\u0257"+
+		"\n9\39\69\u025a\n9\r9\169\u025b\39\39\3:\3:\7:\u0262\n:\f:\16:\u0265\13"+
+		":\3;\3;\7;\u0269\n;\f;\16;\u026c\13;\3<\3<\5<\u0270\n<\3=\3=\3>\3>\3?"+
+		"\3?\3?\3?\7?\u027a\n?\f?\16?\u027d\13?\3?\3?\3?\5?\u0282\n?\3@\3@\3@\3"+
+		"@\3@\7@\u0289\n@\f@\16@\u028c\13@\3@\3@\3@\5@\u0291\n@\3A\3A\3A\3A\7A"+
+		"\u0297\nA\fA\16A\u029a\13A\3B\3B\3B\3B\3B\5B\u02a1\nB\3C\3C\3C\3D\3D\3"+
+		"D\3D\3D\5D\u02ab\nD\5D\u02ad\nD\5D\u02af\nD\5D\u02b1\nD\3E\3E\3E\7E\u02b6"+
+		"\nE\fE\16E\u02b9\13E\5E\u02bb\nE\3F\3F\3G\3G\3H\3H\3H\3H\3H\3H\3H\3H\3"+
+		"H\5H\u02ca\nH\3I\3I\3I\5I\u02cf\nI\3I\3I\3J\3J\3J\7J\u02d6\nJ\fJ\16J\u02d9"+
+		"\13J\3J\3J\3K\3K\3K\7K\u02e0\nK\fK\16K\u02e3\13K\3K\3K\3L\3L\3L\7L\u02ea"+
+		"\nL\fL\16L\u02ed\13L\3M\3M\3M\3M\5M\u02f3\nM\3N\3N\3O\3O\3O\3O\3P\3P\3"+
+		"Q\3Q\3R\3R\3R\3S\3S\3T\3T\3U\3U\3V\3V\3W\3W\3X\3X\3Y\3Y\3Z\3Z\3[\3[\3"+
+		"[\3\\\3\\\3]\3]\3^\3^\3_\3_\3`\3`\3a\3a\3b\3b\3b\3c\3c\3d\3d\3e\3e\3f"+
+		"\3f\3g\3g\3h\3h\3i\3i\3i\3j\3j\3k\3k\3l\3l\3m\3m\3m\3m\3m\3n\3n\3n\3n"+
+		"\3o\3o\3o\3o\3p\3p\3p\3p\3q\3q\3q\3r\3r\3r\3r\3s\3s\3t\3t\3t\3t\3t\3u"+
+		"\3u\3u\3u\3v\3v\3v\3v\3w\3w\3w\3w\3x\3x\3x\3x\3y\3y\3y\3y\3z\3z\3z\3z"+
+		"\3{\3{\3{\3|\3|\3|\3|\3}\3}\3~\3~\3~\3~\3~\3\177\3\177\3\177\3\177\3\177"+
+		"\3\u0080\3\u0080\3\u0080\3\u0080\3\u0080\3\u0081\3\u0081\3\u0081\3\u0082"+
+		"\3\u0082\3\u0082\3\u0082\3\u0082\3\u0083\3\u0083\3\u0083\3\u0083\3\u0084"+
+		"\3\u0084\3\u0084\3\u0084\3\u0085\3\u0085\3\u0085\3\u0085\3\u0086\3\u0086"+
+		"\3\u0086\3\u0086\3\u0087\3\u0087\3\u0087\3\u0087\3\u0088\3\u0088\3\u0088"+
+		"\3\u0088\3\u0089\3\u0089\3\u0089\3\u0089\3\u008a\6\u008a\u03ad\n\u008a"+
+		"\r\u008a\16\u008a\u03ae\3\u008a\3\u008a\3\u008a\3\u008b\3\u008b\3\u008b"+
+		"\3\u008b\3\u008b\3\u008c\3\u008c\3\u008c\3\u008c\3\u008c\3\u008d\3\u008d"+
+		"\3\u008d\3\u008d\3\u008d\3\u008e\3\u008e\3\u008e\3\u008e\3\u008f\3\u008f"+
+		"\3\u008f\3\u008f\3\u008f\3\u0090\3\u0090\3\u0090\3\u0090\3\u0091\3\u0091"+
+		"\3\u0091\3\u0091\3\u0092\3\u0092\3\u0092\3\u0092\3\u0092\3\u0092\3\u0093"+
+		"\3\u0093\3\u0093\7\u0093\u03dd\n\u0093\f\u0093\16\u0093\u03e0\13\u0093"+
+		"\3\u0093\3\u0093\3\u0093\3\u0093\3\u0094\3\u0094\3\u0094\3\u0094\3\u0095"+
+		"\6\u0095\u03eb\n\u0095\r\u0095\16\u0095\u03ec\3\u0095\3\u0095\3\u0095"+
+		"\3\u0096\3\u0096\6\u0096\u03f4\n\u0096\r\u0096\16\u0096\u03f5\3\u0096"+
+		"\3\u0096\3\u0097\3\u0097\3\u0097\3\u0097\3\u0098\3\u0098\3\u0098\3\u0098"+
+		"\3\u0099\3\u0099\7\u0099\u0404\n\u0099\f\u0099\16\u0099\u0407\13\u0099"+
+		"\7\u013f\u015a\u0189\u027b\u028a\2\u009a\b\3\n)\f*\16+\20,\22-\24\2\26"+
+		".\30/\32\2\34\2\36\60 \61\"\62$\63&\64(\65*#,\66.\5\60\4\62\67\648\66"+
+		"98::\36<;><@\2B=D&F>H?J@LANBPCRDTEVFXGZH\\\f^I`Jb\'d%fKhLjMlNn$pOrPtQ"+
+		"vRxSzT|\2~\2\u0080\2\u0082\2\u0084\2\u0086\2\u0088\2\u008a\2\u008c\2\u008e"+
+		"\2\u0090\2\u0092\2\u0094\2\u0096\2\u0098\2\u009a\2\u009c\2\u009e\2\u00a0"+
+		"\2\u00a2\2\u00a4\2\u00a6\2\u00a8\2\u00aa\2\u00ac\2\u00ae\2\u00b0\2\u00b2"+
+		"\2\u00b4\2\u00b6\2\u00b8\2\u00ba\2\u00bc\2\u00be\2\u00c0\2\u00c2\2\u00c4"+
+		"\2\u00c6\2\u00c8\2\u00ca\2\u00cc\2\u00ce\2\u00d0\2\u00d2\2\u00d4\2\u00d6"+
+		"\2\u00d8\2\u00da\2\u00dc\2\u00de\2\u00e0\2\u00e2\2\u00e4\2\u00e6U\u00e8"+
+		"V\u00eaW\u00ec\2\u00ee\2\u00f0\2\u00f2\2\u00f4\2\u00f6\2\u00f8\2\u00fa"+
+		"X\u00fcY\u00fe(\u0100\2\u0102\2\u0104\2\u0106Z\u0108\2\u010a\2\u010c\2"+
+		"\u010e\2\u0110\2\u0112\2\u0114\2\u0116\2\u0118\2\u011a\2\u011c\2\u011e"+
+		"\2\u0120\2\u0122\2\u0124\2\u0126\2\u0128\2\u012a\2\u012c\2\u012e\2\u0130"+
+		"\2\u0132[\u0134\\\u0136\2\b\2\3\4\5\6\7\22\4\2\f\f\17\17\4\2))^^\4\2$"+
+		"$^^\13\2$$))@@^^ddhhppttvv\5\2\62;CHch\4\2\13\13\"\"\6\2\62;C\\aac|\4"+
+		"\2\f\f\16\17\n\2$$))^^ddhhppttvv\3\2\63;\3\2\62;\6\2\f\f\17\17))^^\6\2"+
+		"\f\f\17\17$$^^\5\2\u00b9\u00b9\u0302\u0371\u2041\u2042\17\2C\\c|\u00c2"+
+		"\u00d8\u00da\u00f8\u00fa\u0301\u0372\u037f\u0381\u2001\u200e\u200f\u2072"+
+		"\u2191\u2c02\u2ff1\u3003\ud801\uf902\ufdd1\ufdf2\uffff\3\2^_\2\u0400\2"+
+		"\b\3\2\2\2\2\n\3\2\2\2\2\f\3\2\2\2\2\16\3\2\2\2\2\20\3\2\2\2\2\22\3\2"+
+		"\2\2\2\26\3\2\2\2\2\30\3\2\2\2\2\36\3\2\2\2\2 \3\2\2\2\2\"\3\2\2\2\2$"+
+		"\3\2\2\2\2&\3\2\2\2\2(\3\2\2\2\2*\3\2\2\2\2,\3\2\2\2\2.\3\2\2\2\2\60\3"+
+		"\2\2\2\2\62\3\2\2\2\2\64\3\2\2\2\2\66\3\2\2\2\28\3\2\2\2\2:\3\2\2\2\2"+
+		"<\3\2\2\2\2>\3\2\2\2\2B\3\2\2\2\2D\3\2\2\2\2F\3\2\2\2\2H\3\2\2\2\2J\3"+
+		"\2\2\2\2L\3\2\2\2\2N\3\2\2\2\2P\3\2\2\2\2R\3\2\2\2\2T\3\2\2\2\2V\3\2\2"+
+		"\2\2X\3\2\2\2\2Z\3\2\2\2\2\\\3\2\2\2\2^\3\2\2\2\2`\3\2\2\2\2b\3\2\2\2"+
+		"\2d\3\2\2\2\2f\3\2\2\2\2h\3\2\2\2\2j\3\2\2\2\2l\3\2\2\2\2n\3\2\2\2\2p"+
+		"\3\2\2\2\2r\3\2\2\2\2t\3\2\2\2\2v\3\2\2\2\2x\3\2\2\2\2z\3\2\2\2\3\u00de"+
+		"\3\2\2\2\3\u00e0\3\2\2\2\3\u00e2\3\2\2\2\3\u00e4\3\2\2\2\3\u00e6\3\2\2"+
+		"\2\3\u00e8\3\2\2\2\3\u00ea\3\2\2\2\4\u00ec\3\2\2\2\4\u00ee\3\2\2\2\4\u00f0"+
+		"\3\2\2\2\4\u00f2\3\2\2\2\4\u00f4\3\2\2\2\4\u00f6\3\2\2\2\4\u00f8\3\2\2"+
+		"\2\4\u00fa\3\2\2\2\4\u00fc\3\2\2\2\4\u00fe\3\2\2\2\5\u0100\3\2\2\2\5\u0102"+
+		"\3\2\2\2\5\u0104\3\2\2\2\5\u0106\3\2\2\2\5\u0108\3\2\2\2\5\u010a\3\2\2"+
+		"\2\5\u010c\3\2\2\2\5\u010e\3\2\2\2\5\u0110\3\2\2\2\5\u0112\3\2\2\2\5\u0114"+
+		"\3\2\2\2\5\u0116\3\2\2\2\5\u0118\3\2\2\2\6\u011a\3\2\2\2\6\u011c\3\2\2"+
+		"\2\6\u011e\3\2\2\2\6\u0120\3\2\2\2\6\u0122\3\2\2\2\6\u0124\3\2\2\2\6\u0126"+
+		"\3\2\2\2\6\u0128\3\2\2\2\6\u012a\3\2\2\2\6\u012c\3\2\2\2\6\u012e\3\2\2"+
+		"\2\7\u0130\3\2\2\2\7\u0132\3\2\2\2\7\u0134\3\2\2\2\b\u0138\3\2\2\2\n\u0149"+
+		"\3\2\2\2\f\u0154\3\2\2\2\16\u0163\3\2\2\2\20\u0167\3\2\2\2\22\u016b\3"+
+		"\2\2\2\24\u0177\3\2\2\2\26\u0179\3\2\2\2\30\u0183\3\2\2\2\32\u018f\3\2"+
+		"\2\2\34\u019a\3\2\2\2\36\u019c\3\2\2\2 \u019f\3\2\2\2\"\u01a3\3\2\2\2"+
+		"$\u01ad\3\2\2\2&\u01b6\3\2\2\2(\u01bc\3\2\2\2*\u01c4\3\2\2\2,\u01cd\3"+
+		"\2\2\2.\u01d5\3\2\2\2\60\u01db\3\2\2\2\62\u01e2\3\2\2\2\64\u01ea\3\2\2"+
+		"\2\66\u01f4\3\2\2\28\u01fb\3\2\2\2:\u0203\3\2\2\2<\u0209\3\2\2\2>\u0210"+
+		"\3\2\2\2@\u021a\3\2\2\2B\u021d\3\2\2\2D\u021f\3\2\2\2F\u0221\3\2\2\2H"+
+		"\u0223\3\2\2\2J\u0225\3\2\2\2L\u0227\3\2\2\2N\u0229\3\2\2\2P\u022b\3\2"+
+		"\2\2R\u022d\3\2\2\2T\u022f\3\2\2\2V\u0231\3\2\2\2X\u0233\3\2\2\2Z\u0235"+
+		"\3\2\2\2\\\u0237\3\2\2\2^\u023a\3\2\2\2`\u023c\3\2\2\2b\u023e\3\2\2\2"+
+		"d\u0240\3\2\2\2f\u0242\3\2\2\2h\u0244\3\2\2\2j\u0246\3\2\2\2l\u0249\3"+
+		"\2\2\2n\u024b\3\2\2\2p\u024e\3\2\2\2r\u0250\3\2\2\2t\u0252\3\2\2\2v\u0259"+
+		"\3\2\2\2x\u025f\3\2\2\2z\u0266\3\2\2\2|\u026f\3\2\2\2~\u0271\3\2\2\2\u0080"+
+		"\u0273\3\2\2\2\u0082\u0275\3\2\2\2\u0084\u0283\3\2\2\2\u0086\u0292\3\2"+
+		"\2\2\u0088\u029b\3\2\2\2\u008a\u02a2\3\2\2\2\u008c\u02a5\3\2\2\2\u008e"+
+		"\u02ba\3\2\2\2\u0090\u02bc\3\2\2\2\u0092\u02be\3\2\2\2\u0094\u02c9\3\2"+
+		"\2\2\u0096\u02cb\3\2\2\2\u0098\u02d2\3\2\2\2\u009a\u02dc\3\2\2\2\u009c"+
+		"\u02e6\3\2\2\2\u009e\u02f2\3\2\2\2\u00a0\u02f4\3\2\2\2\u00a2\u02f6\3\2"+
+		"\2\2\u00a4\u02fa\3\2\2\2\u00a6\u02fc\3\2\2\2\u00a8\u02fe\3\2\2\2\u00aa"+
+		"\u0301\3\2\2\2\u00ac\u0303\3\2\2\2\u00ae\u0305\3\2\2\2\u00b0\u0307\3\2"+
+		"\2\2\u00b2\u0309\3\2\2\2\u00b4\u030b\3\2\2\2\u00b6\u030d\3\2\2\2\u00b8"+
+		"\u030f\3\2\2\2\u00ba\u0311\3\2\2\2\u00bc\u0314\3\2\2\2\u00be\u0316\3\2"+
+		"\2\2\u00c0\u0318\3\2\2\2\u00c2\u031a\3\2\2\2\u00c4\u031c\3\2\2\2\u00c6"+
+		"\u031e\3\2\2\2\u00c8\u0320\3\2\2\2\u00ca\u0323\3\2\2\2\u00cc\u0325\3\2"+
+		"\2\2\u00ce\u0327\3\2\2\2\u00d0\u0329\3\2\2\2\u00d2\u032b\3\2\2\2\u00d4"+
+		"\u032d\3\2\2\2\u00d6\u032f\3\2\2\2\u00d8\u0332\3\2\2\2\u00da\u0334\3\2"+
+		"\2\2\u00dc\u0336\3\2\2\2\u00de\u0338\3\2\2\2\u00e0\u033d\3\2\2\2\u00e2"+
+		"\u0341\3\2\2\2\u00e4\u0345\3\2\2\2\u00e6\u0349\3\2\2\2\u00e8\u034c\3\2"+
+		"\2\2\u00ea\u0350\3\2\2\2\u00ec\u0352\3\2\2\2\u00ee\u0357\3\2\2\2\u00f0"+
+		"\u035b\3\2\2\2\u00f2\u035f\3\2\2\2\u00f4\u0363\3\2\2\2\u00f6\u0367\3\2"+
+		"\2\2\u00f8\u036b\3\2\2\2\u00fa\u036f\3\2\2\2\u00fc\u0372\3\2\2\2\u00fe"+
+		"\u0376\3\2\2\2\u0100\u0378\3\2\2\2\u0102\u037d\3\2\2\2\u0104\u0382\3\2"+
+		"\2\2\u0106\u0387\3\2\2\2\u0108\u038a\3\2\2\2\u010a\u038f\3\2\2\2\u010c"+
+		"\u0393\3\2\2\2\u010e\u0397\3\2\2\2\u0110\u039b\3\2\2\2\u0112\u039f\3\2"+
+		"\2\2\u0114\u03a3\3\2\2\2\u0116\u03a7\3\2\2\2\u0118\u03ac\3\2\2\2\u011a"+
+		"\u03b3\3\2\2\2\u011c\u03b8\3\2\2\2\u011e\u03bd\3\2\2\2\u0120\u03c2\3\2"+
+		"\2\2\u0122\u03c6\3\2\2\2\u0124\u03cb\3\2\2\2\u0126\u03cf\3\2\2\2\u0128"+
+		"\u03d3\3\2\2\2\u012a\u03d9\3\2\2\2\u012c\u03e5\3\2\2\2\u012e\u03ea\3\2"+
+		"\2\2\u0130\u03f3\3\2\2\2\u0132\u03f9\3\2\2\2\u0134\u03fd\3\2\2\2\u0136"+
+		"\u0401\3\2\2\2\u0138\u0139\7\61\2\2\u0139\u013a\7,\2\2\u013a\u013b\7,"+
+		"\2\2\u013b\u013f\3\2\2\2\u013c\u013e\13\2\2\2\u013d\u013c\3\2\2\2\u013e"+
+		"\u0141\3\2\2\2\u013f\u0140\3\2\2\2\u013f\u013d\3\2\2\2\u0140\u0145\3\2"+
+		"\2\2\u0141\u013f\3\2\2\2\u0142\u0143\7,\2\2\u0143\u0146\7\61\2\2\u0144"+
+		"\u0146\7\2\2\3\u0145\u0142\3\2\2\2\u0145\u0144\3\2\2\2\u0146\u0147\3\2"+
+		"\2\2\u0147\u0148\b\2\2\2\u0148\t\3\2\2\2\u0149\u014a\7\61\2\2\u014a\u014b"+
+		"\7\61\2\2\u014b\u014f\3\2\2\2\u014c\u014e\n\2\2\2\u014d\u014c\3\2\2\2"+
+		"\u014e\u0151\3\2\2\2\u014f\u014d\3\2\2\2\u014f\u0150\3\2\2\2\u0150\u0152"+
+		"\3\2\2\2\u0151\u014f\3\2\2\2\u0152\u0153\b\3\2\2\u0153\13\3\2\2\2\u0154"+
+		"\u0155\7\61\2\2\u0155\u0156\7,\2\2\u0156\u015a\3\2\2\2\u0157\u0159\13"+
+		"\2\2\2\u0158\u0157\3\2\2\2\u0159\u015c\3\2\2\2\u015a\u015b\3\2\2\2\u015a"+
+		"\u0158\3\2\2\2\u015b\u015d\3\2\2\2\u015c\u015a\3\2\2\2\u015d\u015e\7,"+
+		"\2\2\u015e\u015f\7\61\2\2\u015f\u0160\3\2\2\2\u0160\u0161\b\4\2\2\u0161"+
+		"\r\3\2\2\2\u0162\u0164\4\62;\2\u0163\u0162\3\2\2\2\u0164\u0165\3\2\2\2"+
+		"\u0165\u0163\3\2\2\2\u0165\u0166\3\2\2\2\u0166\17\3\2\2\2\u0167\u0168"+
+		"\7)\2\2\u0168\u0169\5\24\b\2\u0169\u016a\7)\2\2\u016a\21\3\2\2\2\u016b"+
+		"\u016c\7)\2\2\u016c\u0170\5\24\b\2\u016d\u016f\5\24\b\2\u016e\u016d\3"+
+		"\2\2\2\u016f\u0172\3\2\2\2\u0170\u016e\3\2\2\2\u0170\u0171\3\2\2\2\u0171"+
+		"\u0173\3\2\2\2\u0172\u0170\3\2\2\2\u0173\u0174\7)\2\2\u0174\23\3\2\2\2"+
+		"\u0175\u0178\5\32\13\2\u0176\u0178\n\3\2\2\u0177\u0175\3\2\2\2\u0177\u0176"+
+		"\3\2\2\2\u0178\25\3\2\2\2\u0179\u017e\7$\2\2\u017a\u017d\5\32\13\2\u017b"+
+		"\u017d\n\4\2\2\u017c\u017a\3\2\2\2\u017c\u017b\3\2\2\2\u017d\u0180\3\2"+
+		"\2\2\u017e\u017c\3\2\2\2\u017e\u017f\3\2\2\2\u017f\u0181\3\2\2\2\u0180"+
+		"\u017e\3\2\2\2\u0181\u0182\7$\2\2\u0182\27\3\2\2\2\u0183\u0184\7>\2\2"+
+		"\u0184\u0185\7>\2\2\u0185\u0189\3\2\2\2\u0186\u0188\13\2\2\2\u0187\u0186"+
+		"\3\2\2\2\u0188\u018b\3\2\2\2\u0189\u018a\3\2\2\2\u0189\u0187\3\2\2\2\u018a"+
+		"\u018c\3\2\2\2\u018b\u0189\3\2\2\2\u018c\u018d\7@\2\2\u018d\u018e\7@\2"+
+		"\2\u018e\31\3\2\2\2\u018f\u0198\7^\2\2\u0190\u0199\t\5\2\2\u0191\u0192"+
+		"\7w\2\2\u0192\u0193\5\34\f\2\u0193\u0194\5\34\f\2\u0194\u0195\5\34\f\2"+
+		"\u0195\u0196\5\34\f\2\u0196\u0199\3\2\2\2\u0197\u0199\13\2\2\2\u0198\u0190"+
+		"\3\2\2\2\u0198\u0191\3\2\2\2\u0198\u0197\3\2\2\2\u0199\33\3\2\2\2\u019a"+
+		"\u019b\t\6\2\2\u019b\35\3\2\2\2\u019c\u019d\5\u00b6Y\2\u019d\u019e\b\r"+
+		"\3\2\u019e\37\3\2\2\2\u019f\u01a0\5\u00b2W\2\u01a0\u01a1\3\2\2\2\u01a1"+
+		"\u01a2\b\16\4\2\u01a2!\3\2\2\2\u01a3\u01a4\7q\2\2\u01a4\u01a5\7r\2\2\u01a5"+
+		"\u01a6\7v\2\2\u01a6\u01a7\7k\2\2\u01a7\u01a8\7q\2\2\u01a8\u01a9\7p\2\2"+
+		"\u01a9\u01aa\7u\2\2\u01aa\u01ab\3\2\2\2\u01ab\u01ac\b\17\5\2\u01ac#\3"+
+		"\2\2\2\u01ad\u01ae\7v\2\2\u01ae\u01af\7q\2\2\u01af\u01b0\7m\2\2\u01b0"+
+		"\u01b1\7g\2\2\u01b1\u01b2\7p\2\2\u01b2\u01b3\7u\2\2\u01b3\u01b4\3\2\2"+
+		"\2\u01b4\u01b5\b\20\6\2\u01b5%\3\2\2\2\u01b6\u01b7\7e\2\2\u01b7\u01b8"+
+		"\7c\2\2\u01b8\u01b9\7v\2\2\u01b9\u01ba\7e\2\2\u01ba\u01bb\7j\2\2\u01bb"+
+		"\'\3\2\2\2\u01bc\u01bd\7h\2\2\u01bd\u01be\7k\2\2\u01be\u01bf\7p\2\2\u01bf"+
+		"\u01c0\7c\2\2\u01c0\u01c1\7n\2\2\u01c1\u01c2\7n\2\2\u01c2\u01c3\7{\2\2"+
+		"\u01c3)\3\2\2\2\u01c4\u01c5\7h\2\2\u01c5\u01c6\7t\2\2\u01c6\u01c7\7c\2"+
+		"\2\u01c7\u01c8\7i\2\2\u01c8\u01c9\7o\2\2\u01c9\u01ca\7g\2\2\u01ca\u01cb"+
+		"\7p\2\2\u01cb\u01cc\7v\2\2\u01cc+\3\2\2\2\u01cd\u01ce\7i\2\2\u01ce\u01cf"+
+		"\7t\2\2\u01cf\u01d0\7c\2\2\u01d0\u01d1\7o\2\2\u01d1\u01d2\7o\2\2\u01d2"+
+		"\u01d3\7c\2\2\u01d3\u01d4\7t\2\2\u01d4-\3\2\2\2\u01d5\u01d6\7n\2\2\u01d6"+
+		"\u01d7\7g\2\2\u01d7\u01d8\7z\2\2\u01d8\u01d9\7g\2\2\u01d9\u01da\7t\2\2"+
+		"\u01da/\3\2\2\2\u01db\u01dc\7r\2\2\u01dc\u01dd\7c\2\2\u01dd\u01de\7t\2"+
+		"\2\u01de\u01df\7u\2\2\u01df\u01e0\7g\2\2\u01e0\u01e1\7t\2\2\u01e1\61\3"+
+		"\2\2\2\u01e2\u01e3\7r\2\2\u01e3\u01e4\7t\2\2\u01e4\u01e5\7k\2\2\u01e5"+
+		"\u01e6\7x\2\2\u01e6\u01e7\7c\2\2\u01e7\u01e8\7v\2\2\u01e8\u01e9\7g\2\2"+
+		"\u01e9\63\3\2\2\2\u01ea\u01eb\7r\2\2\u01eb\u01ec\7t\2\2\u01ec\u01ed\7"+
+		"q\2\2\u01ed\u01ee\7v\2\2\u01ee\u01ef\7g\2\2\u01ef\u01f0\7e\2\2\u01f0\u01f1"+
+		"\7v\2\2\u01f1\u01f2\7g\2\2\u01f2\u01f3\7f\2\2\u01f3\65\3\2\2\2\u01f4\u01f5"+
+		"\7r\2\2\u01f5\u01f6\7w\2\2\u01f6\u01f7\7d\2\2\u01f7\u01f8\7n\2\2\u01f8"+
+		"\u01f9\7k\2\2\u01f9\u01fa\7e\2\2\u01fa\67\3\2\2\2\u01fb\u01fc\7t\2\2\u01fc"+
+		"\u01fd\7g\2\2\u01fd\u01fe\7v\2\2\u01fe\u01ff\7w\2\2\u01ff\u0200\7t\2\2"+
+		"\u0200\u0201\7p\2\2\u0201\u0202\7u\2\2\u02029\3\2\2\2\u0203\u0204\7u\2"+
+		"\2\u0204\u0205\7e\2\2\u0205\u0206\7q\2\2\u0206\u0207\7r\2\2\u0207\u0208"+
+		"\7g\2\2\u0208;\3\2\2\2\u0209\u020a\7v\2\2\u020a\u020b\7j\2\2\u020b\u020c"+
+		"\7t\2\2\u020c\u020d\7q\2\2\u020d\u020e\7y\2\2\u020e\u020f\7u\2\2\u020f"+
+		"=\3\2\2\2\u0210\u0211\7v\2\2\u0211\u0212\7t\2\2\u0212\u0213\7g\2\2\u0213"+
+		"\u0214\7g\2\2\u0214?\3\2\2\2\u0215\u0219\5v9\2\u0216\u0219\5\n\3\2\u0217"+
+		"\u0219\5\f\4\2\u0218\u0215\3\2\2\2\u0218\u0216\3\2\2\2\u0218\u0217\3\2"+
+		"\2\2\u0219\u021c\3\2\2\2\u021a\u0218\3\2\2\2\u021a\u021b\3\2\2\2\u021b"+
+		"A\3\2\2\2\u021c\u021a\3\2\2\2\u021d\u021e\5\u00d8j\2\u021eC\3\2\2\2\u021f"+
+		"\u0220\7#\2\2\u0220E\3\2\2\2\u0221\u0222\5\u00a6Q\2\u0222G\3\2\2\2\u0223"+
+		"\u0224\5\u00a8R\2\u0224I\3\2\2\2\u0225\u0226\5\u00d0f\2\u0226K\3\2\2\2"+
+		"\u0227\u0228\5\u00d4h\2\u0228M\3\2\2\2\u0229\u022a\5\u00c0^\2\u022aO\3"+
+		"\2\2\2\u022b\u022c\5\u00b2W\2\u022cQ\3\2\2\2\u022d\u022e\5\u00b6Y\2\u022e"+
+		"S\3\2\2\2\u022f\u0230\5\u00aeU\2\u0230U\3\2\2\2\u0231\u0232\5\u00ccd\2"+
+		"\u0232W\3\2\2\2\u0233\u0234\5\u00c6a\2\u0234Y\3\2\2\2\u0235\u0236\5\u00c2"+
+		"_\2\u0236[\3\2\2\2\u0237\u0238\7\60\2\2\u0238\u0239\7\60\2\2\u0239]\3"+
+		"\2\2\2\u023a\u023b\5\u00b4X\2\u023b_\3\2\2\2\u023c\u023d\5\u00b8Z\2\u023d"+
+		"a\3\2\2\2\u023e\u023f\5\u00ba[\2\u023fc\3\2\2\2\u0240\u0241\7`\2\2\u0241"+
+		"e\3\2\2\2\u0242\u0243\5\u00b0V\2\u0243g\3\2\2\2\u0244\u0245\5\u00d2g\2"+
+		"\u0245i\3\2\2\2\u0246\u0247\7?\2\2\u0247\u0248\7@\2\2\u0248k\3\2\2\2\u0249"+
+		"\u024a\5\u00c4`\2\u024am\3\2\2\2\u024b\u024c\7`\2\2\u024c\u024d\7*\2\2"+
+		"\u024do\3\2\2\2\u024e\u024f\5\u00cee\2\u024fq\3\2\2\2\u0250\u0251\5\u00c8"+
+		"b\2\u0251s\3\2\2\2\u0252\u0253\5\u00dcl\2\u0253u\3\2\2\2\u0254\u025a\t"+
+		"\7\2\2\u0255\u0257\7\17\2\2\u0256\u0255\3\2\2\2\u0256\u0257\3\2\2\2\u0257"+
+		"\u0258\3\2\2\2\u0258\u025a\7\f\2\2\u0259\u0254\3\2\2\2\u0259\u0256\3\2"+
+		"\2\2\u025a\u025b\3\2\2\2\u025b\u0259\3\2\2\2\u025b\u025c\3\2\2\2\u025c"+
+		"\u025d\3\2\2\2\u025d\u025e\b9\2\2\u025ew\3\2\2\2\u025f\u0263\4C\\\2\u0260"+
+		"\u0262\t\b\2\2\u0261\u0260\3\2\2\2\u0262\u0265\3\2\2\2\u0263\u0261\3\2"+
+		"\2\2\u0263\u0264\3\2\2\2\u0264y\3\2\2\2\u0265\u0263\3\2\2\2\u0266\u026a"+
+		"\4c|\2\u0267\u0269\t\b\2\2\u0268\u0267\3\2\2\2\u0269\u026c\3\2\2\2\u026a"+
+		"\u0268\3\2\2\2\u026a\u026b\3\2\2\2\u026b{\3\2\2\2\u026c\u026a\3\2\2\2"+
+		"\u026d\u0270\5~=\2\u026e\u0270\5\u0080>\2\u026f\u026d\3\2\2\2\u026f\u026e"+
+		"\3\2\2\2\u0270}\3\2\2\2\u0271\u0272\t\7\2\2\u0272\177\3\2\2\2\u0273\u0274"+
+		"\t\t\2\2\u0274\u0081\3\2\2\2\u0275\u0276\7\61\2\2\u0276\u0277\7,\2\2\u0277"+
+		"\u027b\3\2\2\2\u0278\u027a\13\2\2\2\u0279\u0278\3\2\2\2\u027a\u027d\3"+
+		"\2\2\2\u027b\u027c\3\2\2\2\u027b\u0279\3\2\2\2\u027c\u0281\3\2\2\2\u027d"+
+		"\u027b\3\2\2\2\u027e\u027f\7,\2\2\u027f\u0282\7\61\2\2\u0280\u0282\7\2"+
+		"\2\3\u0281\u027e\3\2\2\2\u0281\u0280\3\2\2\2\u0282\u0083\3\2\2\2\u0283"+
+		"\u0284\7\61\2\2\u0284\u0285\7,\2\2\u0285\u0286\7,\2\2\u0286\u028a\3\2"+
+		"\2\2\u0287\u0289\13\2\2\2\u0288\u0287\3\2\2\2\u0289\u028c\3\2\2\2\u028a"+
+		"\u028b\3\2\2\2\u028a\u0288\3\2\2\2\u028b\u0290\3\2\2\2\u028c\u028a\3\2"+
+		"\2\2\u028d\u028e\7,\2\2\u028e\u0291\7\61\2\2\u028f\u0291\7\2\2\3\u0290"+
+		"\u028d\3\2\2\2\u0290\u028f\3\2\2\2\u0291\u0085\3\2\2\2\u0292\u0293\7\61"+
+		"\2\2\u0293\u0294\7\61\2\2\u0294\u0298\3\2\2\2\u0295\u0297\n\2\2\2\u0296"+
+		"\u0295\3\2\2\2\u0297\u029a\3\2\2\2\u0298\u0296\3\2\2\2\u0298\u0299\3\2"+
+		"\2\2\u0299\u0087\3\2\2\2\u029a\u0298\3\2\2\2\u029b\u02a0\5\u00a4P\2\u029c"+
+		"\u02a1\t\n\2\2\u029d\u02a1\5\u008cD\2\u029e\u02a1\13\2\2\2\u029f\u02a1"+
+		"\7\2\2\3\u02a0\u029c\3\2\2\2\u02a0\u029d\3\2\2\2\u02a0\u029e\3\2\2\2\u02a0"+
+		"\u029f\3\2\2\2\u02a1\u0089\3\2\2\2\u02a2\u02a3\5\u00a4P\2\u02a3\u02a4"+
+		"\13\2\2\2\u02a4\u008b\3\2\2\2\u02a5\u02b0\7w\2\2\u02a6\u02ae\5\u0090F"+
+		"\2\u02a7\u02ac\5\u0090F\2\u02a8\u02aa\5\u0090F\2\u02a9\u02ab\5\u0090F"+
+		"\2\u02aa\u02a9\3\2\2\2\u02aa\u02ab\3\2\2\2\u02ab\u02ad\3\2\2\2\u02ac\u02a8"+
+		"\3\2\2\2\u02ac\u02ad\3\2\2\2\u02ad\u02af\3\2\2\2\u02ae\u02a7\3\2\2\2\u02ae"+
+		"\u02af\3\2\2\2\u02af\u02b1\3\2\2\2\u02b0\u02a6\3\2\2\2\u02b0\u02b1\3\2"+
+		"\2\2\u02b1\u008d\3\2\2\2\u02b2\u02bb\7\62\2\2\u02b3\u02b7\t\13\2\2\u02b4"+
+		"\u02b6\5\u0092G\2\u02b5\u02b4\3\2\2\2\u02b6\u02b9\3\2\2\2\u02b7\u02b5"+
+		"\3\2\2\2\u02b7\u02b8\3\2\2\2\u02b8\u02bb\3\2\2\2\u02b9\u02b7\3\2\2\2\u02ba"+
+		"\u02b2\3\2\2\2\u02ba\u02b3\3\2\2\2\u02bb\u008f\3\2\2\2\u02bc\u02bd\t\6"+
+		"\2\2\u02bd\u0091\3\2\2\2\u02be\u02bf\t\f\2\2\u02bf\u0093\3\2\2\2\u02c0"+
+		"\u02c1\7v\2\2\u02c1\u02c2\7t\2\2\u02c2\u02c3\7w\2\2\u02c3\u02ca\7g\2\2"+
+		"\u02c4\u02c5\7h\2\2\u02c5\u02c6\7c\2\2\u02c6\u02c7\7n\2\2\u02c7\u02c8"+
+		"\7u\2\2\u02c8\u02ca\7g\2\2\u02c9\u02c0\3\2\2\2\u02c9\u02c4\3\2\2\2\u02ca"+
+		"\u0095\3\2\2\2\u02cb\u02ce\5\u00aaS\2\u02cc\u02cf\5\u0088B\2\u02cd\u02cf"+
+		"\n\r\2\2\u02ce\u02cc\3\2\2\2\u02ce\u02cd\3\2\2\2\u02cf\u02d0\3\2\2\2\u02d0"+
+		"\u02d1\5\u00aaS\2\u02d1\u0097\3\2\2\2\u02d2\u02d7\5\u00aaS\2\u02d3\u02d6"+
+		"\5\u0088B\2\u02d4\u02d6\n\r\2\2\u02d5\u02d3\3\2\2\2\u02d5\u02d4\3\2\2"+
+		"\2\u02d6\u02d9\3\2\2\2\u02d7\u02d5\3\2\2\2\u02d7\u02d8\3\2\2\2\u02d8\u02da"+
+		"\3\2\2\2\u02d9\u02d7\3\2\2\2\u02da\u02db\5\u00aaS\2\u02db\u0099\3\2\2"+
+		"\2\u02dc\u02e1\5\u00acT\2\u02dd\u02e0\5\u0088B\2\u02de\u02e0\n\16\2\2"+
+		"\u02df\u02dd\3\2\2\2\u02df\u02de\3\2\2\2\u02e0\u02e3\3\2\2\2\u02e1\u02df"+
+		"\3\2\2\2\u02e1\u02e2\3\2\2\2\u02e2\u02e4\3\2\2\2\u02e3\u02e1\3\2\2\2\u02e4"+
+		"\u02e5\5\u00acT\2\u02e5\u009b\3\2\2\2\u02e6\u02eb\5\u00aaS\2\u02e7\u02ea"+
+		"\5\u0088B\2\u02e8\u02ea\n\r\2\2\u02e9\u02e7\3\2\2\2\u02e9\u02e8\3\2\2"+
+		"\2\u02ea\u02ed\3\2\2\2\u02eb\u02e9\3\2\2\2\u02eb\u02ec\3\2\2\2\u02ec\u009d"+
+		"\3\2\2\2\u02ed\u02eb\3\2\2\2\u02ee\u02f3\5\u00a0N\2\u02ef\u02f3\4\62;"+
+		"\2\u02f0\u02f3\5\u00cac\2\u02f1\u02f3\t\17\2\2\u02f2\u02ee\3\2\2\2\u02f2"+
+		"\u02ef\3\2\2\2\u02f2\u02f0\3\2\2\2\u02f2\u02f1\3\2\2\2\u02f3\u009f\3\2"+
+		"\2\2\u02f4\u02f5\t\20\2\2\u02f5\u00a1\3\2\2\2\u02f6\u02f7\7k\2\2\u02f7"+
+		"\u02f8\7p\2\2\u02f8\u02f9\7v\2\2\u02f9\u00a3\3\2\2\2\u02fa\u02fb\7^\2"+
+		"\2\u02fb\u00a5\3\2\2\2\u02fc\u02fd\7<\2\2\u02fd\u00a7\3\2\2\2\u02fe\u02ff"+
+		"\7<\2\2\u02ff\u0300\7<\2\2\u0300\u00a9\3\2\2\2\u0301\u0302\7)\2\2\u0302"+
+		"\u00ab\3\2\2\2\u0303\u0304\7$\2\2\u0304\u00ad\3\2\2\2\u0305\u0306\7*\2"+
+		"\2\u0306\u00af\3\2\2\2\u0307\u0308\7+\2\2\u0308\u00b1\3\2\2\2\u0309\u030a"+
+		"\7}\2\2\u030a\u00b3\3\2\2\2\u030b\u030c\7\177\2\2\u030c\u00b5\3\2\2\2"+
+		"\u030d\u030e\7]\2\2\u030e\u00b7\3\2\2\2\u030f\u0310\7_\2\2\u0310\u00b9"+
+		"\3\2\2\2\u0311\u0312\7/\2\2\u0312\u0313\7@\2\2\u0313\u00bb\3\2\2\2\u0314"+
+		"\u0315\7>\2\2\u0315\u00bd\3\2\2\2\u0316\u0317\7@\2\2\u0317\u00bf\3\2\2"+
+		"\2\u0318\u0319\7?\2\2\u0319\u00c1\3\2\2\2\u031a\u031b\7A\2\2\u031b\u00c3"+
+		"\3\2\2\2\u031c\u031d\7,\2\2\u031d\u00c5\3\2\2\2\u031e\u031f\7-\2\2\u031f"+
+		"\u00c7\3\2\2\2\u0320\u0321\7-\2\2\u0321\u0322\7?\2\2\u0322\u00c9\3\2\2"+
+		"\2\u0323\u0324\7a\2\2\u0324\u00cb\3\2\2\2\u0325\u0326\7~\2\2\u0326\u00cd"+
+		"\3\2\2\2\u0327\u0328\7&\2\2\u0328\u00cf\3\2\2\2\u0329\u032a\7.\2\2\u032a"+
+		"\u00d1\3\2\2\2\u032b\u032c\7=\2\2\u032c\u00d3\3\2\2\2\u032d\u032e\7\60"+
+		"\2\2\u032e\u00d5\3\2\2\2\u032f\u0330\7\60\2\2\u0330\u0331\7\60\2\2\u0331"+
+		"\u00d7\3\2\2\2\u0332\u0333\7B\2\2\u0333\u00d9\3\2\2\2\u0334\u0335\7%\2"+
+		"\2\u0335\u00db\3\2\2\2\u0336\u0337\7\u0080\2\2\u0337\u00dd\3\2\2\2\u0338"+
+		"\u0339\5\u00b6Y\2\u0339\u033a\3\2\2\2\u033a\u033b\bm\7\2\u033b\u033c\b"+
+		"m\b\2\u033c\u00df\3\2\2\2\u033d\u033e\5\u008aC\2\u033e\u033f\3\2\2\2\u033f"+
+		"\u0340\bn\7\2\u0340\u00e1\3\2\2\2\u0341\u0342\5\u009aK\2\u0342\u0343\3"+
+		"\2\2\2\u0343\u0344\bo\7\2\u0344\u00e3\3\2\2\2\u0345\u0346\5\u0098J\2\u0346"+
+		"\u0347\3\2\2\2\u0347\u0348\bp\7\2\u0348\u00e5\3\2\2\2\u0349\u034a\5\u00b8"+
+		"Z\2\u034a\u034b\bq\t\2\u034b\u00e7\3\2\2\2\u034c\u034d\7\2\2\3\u034d\u034e"+
+		"\3\2\2\2\u034e\u034f\br\n\2\u034f\u00e9\3\2\2\2\u0350\u0351\13\2\2\2\u0351"+
+		"\u00eb\3\2\2\2\u0352\u0353\5\u00b2W\2\u0353\u0354\3\2\2\2\u0354\u0355"+
+		"\bt\13\2\u0355\u0356\bt\4\2\u0356\u00ed\3\2\2\2\u0357\u0358\5\u008aC\2"+
+		"\u0358\u0359\3\2\2\2\u0359\u035a\bu\13\2\u035a\u00ef\3\2\2\2\u035b\u035c"+
+		"\5\u009aK\2\u035c\u035d\3\2\2\2\u035d\u035e\bv\13\2\u035e\u00f1\3\2\2"+
+		"\2\u035f\u0360\5\u0098J\2\u0360\u0361\3\2\2\2\u0361\u0362\bw\13\2\u0362"+
+		"\u00f3\3\2\2\2\u0363\u0364\5\u0084@\2\u0364\u0365\3\2\2\2\u0365\u0366"+
+		"\bx\13\2\u0366\u00f5\3\2\2\2\u0367\u0368\5\u0082?\2\u0368\u0369\3\2\2"+
+		"\2\u0369\u036a\by\13\2\u036a\u00f7\3\2\2\2\u036b\u036c\5\u0086A\2\u036c"+
+		"\u036d\3\2\2\2\u036d\u036e\bz\13\2\u036e\u00f9\3\2\2\2\u036f\u0370\5\u00b4"+
+		"X\2\u0370\u0371\b{\f\2\u0371\u00fb\3\2\2\2\u0372\u0373\7\2\2\3\u0373\u0374"+
+		"\3\2\2\2\u0374\u0375\b|\n\2\u0375\u00fd\3\2\2\2\u0376\u0377\13\2\2\2\u0377"+
+		"\u00ff\3\2\2\2\u0378\u0379\5\u0084@\2\u0379\u037a\3\2\2\2\u037a\u037b"+
+		"\b~\r\2\u037b\u037c\b~\2\2\u037c\u0101\3\2\2\2\u037d\u037e\5\u0082?\2"+
+		"\u037e\u037f\3\2\2\2\u037f\u0380\b\177\16\2\u0380\u0381\b\177\2\2\u0381"+
+		"\u0103\3\2\2\2\u0382\u0383\5\u0086A\2\u0383\u0384\3\2\2\2\u0384\u0385"+
+		"\b\u0080\17\2\u0385\u0386\b\u0080\2\2\u0386\u0105\3\2\2\2\u0387\u0388"+
+		"\5\u00b2W\2\u0388\u0389\b\u0081\20\2\u0389\u0107\3\2\2\2\u038a\u038b\5"+
+		"\u00b4X\2\u038b\u038c\3\2\2\2\u038c\u038d\b\u0082\21\2\u038d\u038e\b\u0082"+
+		"\n\2\u038e\u0109\3\2\2\2\u038f\u0390\5\u0136\u0099\2\u0390\u0391\3\2\2"+
+		"\2\u0391\u0392\b\u0083\22\2\u0392\u010b\3\2\2\2\u0393\u0394\5\u00d4h\2"+
+		"\u0394\u0395\3\2\2\2\u0395\u0396\b\u0084\23\2\u0396\u010d\3\2\2\2\u0397"+
+		"\u0398\5\u00c0^\2\u0398\u0399\3\2\2\2\u0399\u039a\b\u0085\24\2\u039a\u010f"+
+		"\3\2\2\2\u039b\u039c\5\u0098J\2\u039c\u039d\3\2\2\2\u039d\u039e\b\u0086"+
+		"\25\2\u039e\u0111\3\2\2\2\u039f\u03a0\5\u008eE\2\u03a0\u03a1\3\2\2\2\u03a1"+
+		"\u03a2\b\u0087\26\2\u03a2\u0113\3\2\2\2\u03a3\u03a4\5\u00c4`\2\u03a4\u03a5"+
+		"\3\2\2\2\u03a5\u03a6\b\u0088\27\2\u03a6\u0115\3\2\2\2\u03a7\u03a8\5\u00d2"+
+		"g\2\u03a8\u03a9\3\2\2\2\u03a9\u03aa\b\u0089\30\2\u03aa\u0117\3\2\2\2\u03ab"+
+		"\u03ad\5|<\2\u03ac\u03ab\3\2\2\2\u03ad\u03ae\3\2\2\2\u03ae\u03ac\3\2\2"+
+		"\2\u03ae\u03af\3\2\2\2\u03af\u03b0\3\2\2\2\u03b0\u03b1\b\u008a\31\2\u03b1"+
+		"\u03b2\b\u008a\2\2\u03b2\u0119\3\2\2\2\u03b3\u03b4\5\u0084@\2\u03b4\u03b5"+
+		"\3\2\2\2\u03b5\u03b6\b\u008b\r\2\u03b6\u03b7\b\u008b\2\2\u03b7\u011b\3"+
+		"\2\2\2\u03b8\u03b9\5\u0082?\2\u03b9\u03ba\3\2\2\2\u03ba\u03bb\b\u008c"+
+		"\16\2\u03bb\u03bc\b\u008c\2\2\u03bc\u011d\3\2\2\2\u03bd\u03be\5\u0086"+
+		"A\2\u03be\u03bf\3\2\2\2\u03bf\u03c0\b\u008d\17\2\u03c0\u03c1\b\u008d\2"+
+		"\2\u03c1\u011f\3\2\2\2\u03c2\u03c3\5\u00b2W\2\u03c3\u03c4\3\2\2\2\u03c4"+
+		"\u03c5\b\u008e\32\2\u03c5\u0121\3\2\2\2\u03c6\u03c7\5\u00b4X\2\u03c7\u03c8"+
+		"\3\2\2\2\u03c8\u03c9\b\u008f\21\2\u03c9\u03ca\b\u008f\n\2\u03ca\u0123"+
+		"\3\2\2\2\u03cb\u03cc\5\u0136\u0099\2\u03cc\u03cd\3\2\2\2\u03cd\u03ce\b"+
+		"\u0090\33\2\u03ce\u0125\3\2\2\2\u03cf\u03d0\5\u00c0^\2\u03d0\u03d1\3\2"+
+		"\2\2\u03d1\u03d2\b\u0091\24\2\u03d2\u0127\3\2\2\2\u03d3\u03d4\7)\2\2\u03d4"+
+		"\u03d5\5\24\b\2\u03d5\u03d6\7)\2\2\u03d6\u03d7\3\2\2\2\u03d7\u03d8\b\u0092"+
+		"\34\2\u03d8\u0129\3\2\2\2\u03d9\u03da\7)\2\2\u03da\u03de\5\24\b\2\u03db"+
+		"\u03dd\5\24\b\2\u03dc\u03db\3\2\2\2\u03dd\u03e0\3\2\2\2\u03de\u03dc\3"+
+		"\2\2\2\u03de\u03df\3\2\2\2\u03df\u03e1\3\2\2\2\u03e0\u03de\3\2\2\2\u03e1"+
+		"\u03e2\7)\2\2\u03e2\u03e3\3\2\2\2\u03e3\u03e4\b\u0093\25\2\u03e4\u012b"+
+		"\3\2\2\2\u03e5\u03e6\5\u00d2g\2\u03e6\u03e7\3\2\2\2\u03e7\u03e8\b\u0094"+
+		"\30\2\u03e8\u012d\3\2\2\2\u03e9\u03eb\5|<\2\u03ea\u03e9\3\2\2\2\u03eb"+
+		"\u03ec\3\2\2\2\u03ec\u03ea\3\2\2\2\u03ec\u03ed\3\2\2\2\u03ed\u03ee\3\2"+
+		"\2\2\u03ee\u03ef\b\u0095\31\2\u03ef\u03f0\b\u0095\2\2\u03f0\u012f\3\2"+
+		"\2\2\u03f1\u03f4\n\21\2\2\u03f2\u03f4\5\u008aC\2\u03f3\u03f1\3\2\2\2\u03f3"+
+		"\u03f2\3\2\2\2\u03f4\u03f5\3\2\2\2\u03f5\u03f3\3\2\2\2\u03f5\u03f6\3\2"+
+		"\2\2\u03f6\u03f7\3\2\2\2\u03f7\u03f8\b\u0096\35\2\u03f8\u0131\3\2\2\2"+
+		"\u03f9\u03fa\5\u00b8Z\2\u03fa\u03fb\3\2\2\2\u03fb\u03fc\b\u0097\n\2\u03fc"+
+		"\u0133\3\2\2\2\u03fd\u03fe\7\2\2\3\u03fe\u03ff\3\2\2\2\u03ff\u0400\b\u0098"+
+		"\n\2\u0400\u0135\3\2\2\2\u0401\u0405\5\u00a0N\2\u0402\u0404\5\u009eM\2"+
+		"\u0403\u0402\3\2\2\2\u0404\u0407\3\2\2\2\u0405\u0403\3\2\2\2\u0405\u0406"+
+		"\3\2\2\2\u0406\u0137\3\2\2\2\u0407\u0405\3\2\2\2\66\2\3\4\5\6\7\u013f"+
+		"\u0145\u014f\u015a\u0165\u0170\u0177\u017c\u017e\u0189\u0198\u0218\u021a"+
+		"\u0256\u0259\u025b\u0263\u026a\u026f\u027b\u0281\u028a\u0290\u0298\u02a0"+
+		"\u02aa\u02ac\u02ae\u02b0\u02b7\u02ba\u02c9\u02ce\u02d5\u02d7\u02df\u02e1"+
+		"\u02e9\u02eb\u02f2\u03ae\u03de\u03ec\u03f3\u03f5\u0405\36\2\4\2\3\r\2"+
+		"\7\4\2\7\5\2\7\6\2\tW\2\7\3\2\3q\3\6\2\2\t(\2\3{\4\t\3\2\t*\2\t)\2\3\u0081"+
+		"\5\tI\2\t\23\2\tA\2\tB\2\t-\2\t+\2\tN\2\tL\2\tR\2\tC\2\tS\2\t,\2\5\2\2";
+	public static final ATN _ATN =
+		new ATNDeserializer().deserialize(_serializedATN.toCharArray());
+	static {
+		_decisionToDFA = new DFA[_ATN.getNumberOfDecisions()];
+		for (int i = 0; i < _ATN.getNumberOfDecisions(); i++) {
+			_decisionToDFA[i] = new DFA(_ATN.getDecisionState(i), i);
+		}
+	}
+}
\ No newline at end of file
diff --git a/java/languages.antlr/src/org/antlr/parser/antlr3/ANTLRv3Parser.g4 b/java/languages.antlr/src/org/antlr/parser/antlr3/ANTLRv3Parser.g4
new file mode 100644
index 0000000..753d377
--- /dev/null
+++ b/java/languages.antlr/src/org/antlr/parser/antlr3/ANTLRv3Parser.g4
@@ -0,0 +1,287 @@
+/*
+ [The "BSD licence"]
+ Copyright (c) 2005-2007 Terence Parr
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+ 1. Redistributions of source code must retain the above copyright
+    notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+    notice, this list of conditions and the following disclaimer in the
+    documentation and/or other materials provided with the distribution.
+ 3. The name of the author may not be used to endorse or promote products
+    derived from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 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 OF
+ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+parser grammar ANTLRv3Parser;
+
+@header{
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+// DO NOT EDIT THIS FILE MANUALLY!
+// SEE build.xml FOR INSTRUCTIONS
+
+
+package org.antlr.parser.antlr3;
+
+}
+
+options { tokenVocab = ANTLRv3Lexer; }
+
+grammarDef
+   : DOC_COMMENT? (LEXER | PARSER | TREE| ) GRAMMAR id_ SEMI optionsSpec? tokensSpec? attrScope* action* rule_+
+   EOF
+   ;
+
+tokensSpec
+   : TOKENS LBRACE tokenSpec+ RBRACE
+   ;
+
+tokenSpec
+   : TOKEN_REF ( EQUAL (STRING_LITERAL | CHAR_LITERAL) | ) SEMI
+   ;
+
+attrScope
+   : SCOPE id_ actionBlock
+   ;
+
+action
+   : AT (actionScopeName COLONCOLON)? id_ actionBlock
+   ;
+
+actionScopeName
+   : id_
+   | LEXER
+   | PARSER
+   ;
+
+optionsSpec
+   : OPTIONS LBRACE option* RBRACE
+   ;
+
+option
+   : id_ EQUAL optionValue SEMI
+   ;
+
+optionValue
+   : id_
+   | STRING_LITERAL
+   | CHAR_LITERAL
+   | INT
+   | STAR
+   ;
+
+rule_
+   : DOC_COMMENT? ((PROTECTED | PUBLIC | PRIVATE | FRAGMENT))? id_ BANG? argActionBlock? (RETURNS argActionBlock)? throwsSpec? optionsSpec? ruleScopeSpec? ruleAction* COLON altList SEMI exceptionGroup?
+   ;
+   
+ruleAction
+   : AT id_ actionBlock
+   ;
+
+throwsSpec
+   : THROWS id_ (COMMA id_)*
+   ;
+
+ruleScopeSpec
+   : SCOPE actionBlock
+   | SCOPE id_ (COMMA id_)* SEMI
+   | SCOPE actionBlock SCOPE id_ (COMMA id_)* SEMI
+   ;
+
+block
+   : LPAREN ((optionsSpec)? COLON)?
+                alternative rewrite (OR alternative rewrite )*
+        RPAREN
+   ;
+
+altList
+   : alternative rewrite (OR alternative rewrite )*
+   ;
+
+alternative
+   : element+
+   |
+   ;
+
+exceptionGroup
+   : (exceptionHandler)+ (finallyClause)?
+   | finallyClause
+   ;
+
+exceptionHandler
+   : CATCH argActionBlock actionBlock
+   ;
+
+finallyClause
+   : FINALLY actionBlock
+   ;
+
+element
+   : elementNoOptionSpec
+   ;
+
+elementNoOptionSpec
+   : id_ (EQUAL | PEQ) atom (ebnfSuffix | )
+   | id_ (EQUAL | PEQ) block (ebnfSuffix | )
+   | atom (ebnfSuffix | )
+   | ebnf
+   | actionBlock
+   | actionBlock QM ( SEMPREDOP | )
+   | treeSpec (ebnfSuffix | )
+   ;
+
+actionBlock
+   : BEGIN_ACTION ACTION_CONTENT* END_ACTION
+   ;
+
+argActionBlock
+   : BEGIN_ARGUMENT ARGUMENT_CONTENT* END_ARGUMENT
+   ;
+
+atom
+   : range_ ( ROOT | BANG | )
+   | terminal_
+   | notSet ( ROOT | BANG | )
+   | RULE_REF argActionBlock? ( ROOT | BANG )?
+   ;
+
+notSet
+   : NOT (notTerminal | block)
+   ;
+
+treeSpec
+   : TREE_BEGIN element (element)+ RPAREN
+   ;
+
+ebnf
+   : block (QM | STAR | PLUS | SEMPREDOP | )
+   ;
+
+range_
+   : CHAR_LITERAL RANGE CHAR_LITERAL
+   ;
+
+terminal_
+   : (CHAR_LITERAL
+        | TOKEN_REF (argActionBlock | )
+        | STRING_LITERAL
+        | DOT
+     ) (ROOT | BANG)?
+   ;
+
+notTerminal
+   : CHAR_LITERAL
+   | TOKEN_REF
+   | STRING_LITERAL
+   ;
+
+ebnfSuffix
+   : QM
+   | STAR
+   | PLUS
+   ;
+
+rewrite
+   : (REWRITE actionBlock QM rewrite_alternative)* REWRITE rewrite_alternative
+   |
+   ;
+
+rewrite_alternative
+   : rewrite_template
+   | rewrite_tree_alternative
+   |
+   ;
+
+rewrite_tree_block
+   : LPAREN rewrite_tree_alternative RPAREN
+   ;
+
+rewrite_tree_alternative
+   : rewrite_tree_element+
+   ;
+
+rewrite_tree_element
+   : rewrite_tree_atom
+   | rewrite_tree_atom ebnfSuffix
+   | rewrite_tree (ebnfSuffix | )
+   | rewrite_tree_ebnf
+   ;
+
+rewrite_tree_atom
+   : CHAR_LITERAL
+   | TOKEN_REF argActionBlock?
+   | RULE_REF
+   | STRING_LITERAL
+   | DOLLAR id_
+   | actionBlock
+   ;
+
+rewrite_tree_ebnf
+   : rewrite_tree_block ebnfSuffix
+   ;
+
+rewrite_tree
+   : TREE_BEGIN rewrite_tree_atom rewrite_tree_element* RPAREN
+   ;
+
+rewrite_template
+   : id_ LPAREN rewrite_template_args RPAREN
+      ( DOUBLE_QUOTE_STRING_LITERAL | DOUBLE_ANGLE_STRING_LITERAL )
+   | rewrite_template_ref
+   | rewrite_indirect_template_head
+   | actionBlock
+   ;
+
+rewrite_template_ref
+   : id_ LPAREN rewrite_template_args RPAREN
+   ;
+
+rewrite_indirect_template_head
+   : LPAREN actionBlock RPAREN LPAREN rewrite_template_args RPAREN
+   ;
+
+rewrite_template_args
+   : rewrite_template_arg (COMMA rewrite_template_arg)*
+   |
+   ;
+
+rewrite_template_arg
+   : id_ EQUAL actionBlock
+   ;
+
+id_
+   : TOKEN_REF
+   | RULE_REF
+   ;
+
diff --git a/java/languages.antlr/src/org/antlr/parser/antlr3/ANTLRv3Parser.java b/java/languages.antlr/src/org/antlr/parser/antlr3/ANTLRv3Parser.java
new file mode 100644
index 0000000..60a0d5b
--- /dev/null
+++ b/java/languages.antlr/src/org/antlr/parser/antlr3/ANTLRv3Parser.java
@@ -0,0 +1,3986 @@
+// Generated from ANTLRv3Parser.g4 by ANTLR 4.7.2
+
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+// DO NOT EDIT THIS FILE MANUALLY!
+// SEE build.xml FOR INSTRUCTIONS
+
+
+package org.antlr.parser.antlr3;
+
+
+import org.antlr.v4.runtime.atn.*;
+import org.antlr.v4.runtime.dfa.DFA;
+import org.antlr.v4.runtime.*;
+import org.antlr.v4.runtime.misc.*;
+import org.antlr.v4.runtime.tree.*;
+import java.util.List;
+import java.util.Iterator;
+import java.util.ArrayList;
+
+@SuppressWarnings({"all", "warnings", "unchecked", "unused", "cast"})
+public class ANTLRv3Parser extends Parser {
+	static { RuntimeMetaData.checkVersion("4.7.2", RuntimeMetaData.VERSION); }
+
+	protected static final DFA[] _decisionToDFA;
+	protected static final PredictionContextCache _sharedContextCache =
+		new PredictionContextCache();
+	public static final int
+		DOC_COMMENT=1, PARSER=2, LEXER=3, RULE=4, BLOCK=5, OPTIONAL=6, CLOSURE=7, 
+		POSITIVE_CLOSURE=8, SYNPRED=9, RANGE=10, CHAR_RANGE=11, EPSILON=12, ALT=13, 
+		EOR=14, EOB=15, EOA=16, ID=17, ARG=18, ARGLIST=19, RET=20, LEXER_GRAMMAR=21, 
+		PARSER_GRAMMAR=22, TREE_GRAMMAR=23, COMBINED_GRAMMAR=24, INITACTION=25, 
+		LABEL=26, TEMPLATE=27, SCOPE=28, SEMPRED=29, GATED_SEMPRED=30, SYN_SEMPRED=31, 
+		BACKTRACK_SEMPRED=32, FRAGMENT=33, TREE_BEGIN=34, ROOT=35, BANG=36, REWRITE=37, 
+		ACTION_CONTENT=38, SL_COMMENT=39, ML_COMMENT=40, INT=41, CHAR_LITERAL=42, 
+		STRING_LITERAL=43, DOUBLE_QUOTE_STRING_LITERAL=44, DOUBLE_ANGLE_STRING_LITERAL=45, 
+		BEGIN_ARGUMENT=46, BEGIN_ACTION=47, OPTIONS=48, TOKENS=49, CATCH=50, FINALLY=51, 
+		GRAMMAR=52, PRIVATE=53, PROTECTED=54, PUBLIC=55, RETURNS=56, THROWS=57, 
+		TREE=58, AT=59, COLON=60, COLONCOLON=61, COMMA=62, DOT=63, EQUAL=64, LBRACE=65, 
+		LBRACK=66, LPAREN=67, OR=68, PLUS=69, QM=70, RBRACE=71, RBRACK=72, RPAREN=73, 
+		SEMI=74, SEMPREDOP=75, STAR=76, DOLLAR=77, PEQ=78, NOT=79, WS=80, TOKEN_REF=81, 
+		RULE_REF=82, END_ARGUMENT=83, UNTERMINATED_ARGUMENT=84, ARGUMENT_CONTENT=85, 
+		END_ACTION=86, UNTERMINATED_ACTION=87, OPT_LBRACE=88, LEXER_CHAR_SET=89, 
+		UNTERMINATED_CHAR_SET=90;
+	public static final int
+		RULE_grammarDef = 0, RULE_tokensSpec = 1, RULE_tokenSpec = 2, RULE_attrScope = 3, 
+		RULE_action = 4, RULE_actionScopeName = 5, RULE_optionsSpec = 6, RULE_option = 7, 
+		RULE_optionValue = 8, RULE_rule_ = 9, RULE_ruleAction = 10, RULE_throwsSpec = 11, 
+		RULE_ruleScopeSpec = 12, RULE_block = 13, RULE_altList = 14, RULE_alternative = 15, 
+		RULE_exceptionGroup = 16, RULE_exceptionHandler = 17, RULE_finallyClause = 18, 
+		RULE_element = 19, RULE_elementNoOptionSpec = 20, RULE_actionBlock = 21, 
+		RULE_argActionBlock = 22, RULE_atom = 23, RULE_notSet = 24, RULE_treeSpec = 25, 
+		RULE_ebnf = 26, RULE_range_ = 27, RULE_terminal_ = 28, RULE_notTerminal = 29, 
+		RULE_ebnfSuffix = 30, RULE_rewrite = 31, RULE_rewrite_alternative = 32, 
+		RULE_rewrite_tree_block = 33, RULE_rewrite_tree_alternative = 34, RULE_rewrite_tree_element = 35, 
+		RULE_rewrite_tree_atom = 36, RULE_rewrite_tree_ebnf = 37, RULE_rewrite_tree = 38, 
+		RULE_rewrite_template = 39, RULE_rewrite_template_ref = 40, RULE_rewrite_indirect_template_head = 41, 
+		RULE_rewrite_template_args = 42, RULE_rewrite_template_arg = 43, RULE_id_ = 44;
+	private static String[] makeRuleNames() {
+		return new String[] {
+			"grammarDef", "tokensSpec", "tokenSpec", "attrScope", "action", "actionScopeName", 
+			"optionsSpec", "option", "optionValue", "rule_", "ruleAction", "throwsSpec", 
+			"ruleScopeSpec", "block", "altList", "alternative", "exceptionGroup", 
+			"exceptionHandler", "finallyClause", "element", "elementNoOptionSpec", 
+			"actionBlock", "argActionBlock", "atom", "notSet", "treeSpec", "ebnf", 
+			"range_", "terminal_", "notTerminal", "ebnfSuffix", "rewrite", "rewrite_alternative", 
+			"rewrite_tree_block", "rewrite_tree_alternative", "rewrite_tree_element", 
+			"rewrite_tree_atom", "rewrite_tree_ebnf", "rewrite_tree", "rewrite_template", 
+			"rewrite_template_ref", "rewrite_indirect_template_head", "rewrite_template_args", 
+			"rewrite_template_arg", "id_"
+		};
+	}
+	public static final String[] ruleNames = makeRuleNames();
+
+	private static String[] makeLiteralNames() {
+		return new String[] {
+			null, null, "'parser'", "'lexer'", null, null, null, null, null, null, 
+			"'..'", null, null, null, null, null, null, null, null, null, null, null, 
+			null, null, null, null, null, null, "'scope'", null, null, null, null, 
+			"'fragment'", "'^('", "'^'", "'!'", null, null, null, null, null, null, 
+			null, null, null, null, null, "'options'", "'tokens'", "'catch'", "'finally'", 
+			"'grammar'", "'private'", "'protected'", "'public'", "'returns'", "'throws'", 
+			"'tree'", null, null, null, null, null, null, null, null, null, null, 
+			null, null, null, null, null, null, "'=>'"
+		};
+	}
+	private static final String[] _LITERAL_NAMES = makeLiteralNames();
+	private static String[] makeSymbolicNames() {
+		return new String[] {
+			null, "DOC_COMMENT", "PARSER", "LEXER", "RULE", "BLOCK", "OPTIONAL", 
+			"CLOSURE", "POSITIVE_CLOSURE", "SYNPRED", "RANGE", "CHAR_RANGE", "EPSILON", 
+			"ALT", "EOR", "EOB", "EOA", "ID", "ARG", "ARGLIST", "RET", "LEXER_GRAMMAR", 
+			"PARSER_GRAMMAR", "TREE_GRAMMAR", "COMBINED_GRAMMAR", "INITACTION", "LABEL", 
+			"TEMPLATE", "SCOPE", "SEMPRED", "GATED_SEMPRED", "SYN_SEMPRED", "BACKTRACK_SEMPRED", 
+			"FRAGMENT", "TREE_BEGIN", "ROOT", "BANG", "REWRITE", "ACTION_CONTENT", 
+			"SL_COMMENT", "ML_COMMENT", "INT", "CHAR_LITERAL", "STRING_LITERAL", 
+			"DOUBLE_QUOTE_STRING_LITERAL", "DOUBLE_ANGLE_STRING_LITERAL", "BEGIN_ARGUMENT", 
+			"BEGIN_ACTION", "OPTIONS", "TOKENS", "CATCH", "FINALLY", "GRAMMAR", "PRIVATE", 
+			"PROTECTED", "PUBLIC", "RETURNS", "THROWS", "TREE", "AT", "COLON", "COLONCOLON", 
+			"COMMA", "DOT", "EQUAL", "LBRACE", "LBRACK", "LPAREN", "OR", "PLUS", 
+			"QM", "RBRACE", "RBRACK", "RPAREN", "SEMI", "SEMPREDOP", "STAR", "DOLLAR", 
+			"PEQ", "NOT", "WS", "TOKEN_REF", "RULE_REF", "END_ARGUMENT", "UNTERMINATED_ARGUMENT", 
+			"ARGUMENT_CONTENT", "END_ACTION", "UNTERMINATED_ACTION", "OPT_LBRACE", 
+			"LEXER_CHAR_SET", "UNTERMINATED_CHAR_SET"
+		};
+	}
+	private static final String[] _SYMBOLIC_NAMES = makeSymbolicNames();
+	public static final Vocabulary VOCABULARY = new VocabularyImpl(_LITERAL_NAMES, _SYMBOLIC_NAMES);
+
+	/**
+	 * @deprecated Use {@link #VOCABULARY} instead.
+	 */
+	@Deprecated
+	public static final String[] tokenNames;
+	static {
+		tokenNames = new String[_SYMBOLIC_NAMES.length];
+		for (int i = 0; i < tokenNames.length; i++) {
+			tokenNames[i] = VOCABULARY.getLiteralName(i);
+			if (tokenNames[i] == null) {
+				tokenNames[i] = VOCABULARY.getSymbolicName(i);
+			}
+
+			if (tokenNames[i] == null) {
+				tokenNames[i] = "<INVALID>";
+			}
+		}
+	}
+
+	@Override
+	@Deprecated
+	public String[] getTokenNames() {
+		return tokenNames;
+	}
+
+	@Override
+
+	public Vocabulary getVocabulary() {
+		return VOCABULARY;
+	}
+
+	@Override
+	public String getGrammarFileName() { return "ANTLRv3Parser.g4"; }
+
+	@Override
+	public String[] getRuleNames() { return ruleNames; }
+
+	@Override
+	public String getSerializedATN() { return _serializedATN; }
+
+	@Override
+	public ATN getATN() { return _ATN; }
+
+	public ANTLRv3Parser(TokenStream input) {
+		super(input);
+		_interp = new ParserATNSimulator(this,_ATN,_decisionToDFA,_sharedContextCache);
+	}
+
+	public static class GrammarDefContext extends ParserRuleContext {
+		public TerminalNode GRAMMAR() { return getToken(ANTLRv3Parser.GRAMMAR, 0); }
+		public Id_Context id_() {
+			return getRuleContext(Id_Context.class,0);
+		}
+		public TerminalNode SEMI() { return getToken(ANTLRv3Parser.SEMI, 0); }
+		public TerminalNode EOF() { return getToken(ANTLRv3Parser.EOF, 0); }
+		public TerminalNode LEXER() { return getToken(ANTLRv3Parser.LEXER, 0); }
+		public TerminalNode PARSER() { return getToken(ANTLRv3Parser.PARSER, 0); }
+		public TerminalNode TREE() { return getToken(ANTLRv3Parser.TREE, 0); }
+		public TerminalNode DOC_COMMENT() { return getToken(ANTLRv3Parser.DOC_COMMENT, 0); }
+		public OptionsSpecContext optionsSpec() {
+			return getRuleContext(OptionsSpecContext.class,0);
+		}
+		public TokensSpecContext tokensSpec() {
+			return getRuleContext(TokensSpecContext.class,0);
+		}
+		public List<AttrScopeContext> attrScope() {
+			return getRuleContexts(AttrScopeContext.class);
+		}
+		public AttrScopeContext attrScope(int i) {
+			return getRuleContext(AttrScopeContext.class,i);
+		}
+		public List<ActionContext> action() {
+			return getRuleContexts(ActionContext.class);
+		}
+		public ActionContext action(int i) {
+			return getRuleContext(ActionContext.class,i);
+		}
+		public List<Rule_Context> rule_() {
+			return getRuleContexts(Rule_Context.class);
+		}
+		public Rule_Context rule_(int i) {
+			return getRuleContext(Rule_Context.class,i);
+		}
+		public GrammarDefContext(ParserRuleContext parent, int invokingState) {
+			super(parent, invokingState);
+		}
+		@Override public int getRuleIndex() { return RULE_grammarDef; }
+		@Override
+		public void enterRule(ParseTreeListener listener) {
+			if ( listener instanceof ANTLRv3ParserListener ) ((ANTLRv3ParserListener)listener).enterGrammarDef(this);
+		}
+		@Override
+		public void exitRule(ParseTreeListener listener) {
+			if ( listener instanceof ANTLRv3ParserListener ) ((ANTLRv3ParserListener)listener).exitGrammarDef(this);
+		}
+	}
+
+	public final GrammarDefContext grammarDef() throws RecognitionException {
+		GrammarDefContext _localctx = new GrammarDefContext(_ctx, getState());
+		enterRule(_localctx, 0, RULE_grammarDef);
+		int _la;
+		try {
+			enterOuterAlt(_localctx, 1);
+			{
+			setState(91);
+			_errHandler.sync(this);
+			_la = _input.LA(1);
+			if (_la==DOC_COMMENT) {
+				{
+				setState(90);
+				match(DOC_COMMENT);
+				}
+			}
+
+			setState(97);
+			_errHandler.sync(this);
+			switch (_input.LA(1)) {
+			case LEXER:
+				{
+				setState(93);
+				match(LEXER);
+				}
+				break;
+			case PARSER:
+				{
+				setState(94);
+				match(PARSER);
+				}
+				break;
+			case TREE:
+				{
+				setState(95);
+				match(TREE);
+				}
+				break;
+			case GRAMMAR:
+				{
+				}
+				break;
+			default:
+				throw new NoViableAltException(this);
+			}
+			setState(99);
+			match(GRAMMAR);
+			setState(100);
+			id_();
+			setState(101);
+			match(SEMI);
+			setState(103);
+			_errHandler.sync(this);
+			_la = _input.LA(1);
+			if (_la==OPTIONS) {
+				{
+				setState(102);
+				optionsSpec();
+				}
+			}
+
+			setState(106);
+			_errHandler.sync(this);
+			_la = _input.LA(1);
+			if (_la==TOKENS) {
+				{
+				setState(105);
+				tokensSpec();
+				}
+			}
+
+			setState(111);
+			_errHandler.sync(this);
+			_la = _input.LA(1);
+			while (_la==SCOPE) {
+				{
+				{
+				setState(108);
+				attrScope();
+				}
+				}
+				setState(113);
+				_errHandler.sync(this);
+				_la = _input.LA(1);
+			}
+			setState(117);
+			_errHandler.sync(this);
+			_la = _input.LA(1);
+			while (_la==AT) {
+				{
+				{
+				setState(114);
+				action();
+				}
+				}
+				setState(119);
+				_errHandler.sync(this);
+				_la = _input.LA(1);
+			}
+			setState(121); 
+			_errHandler.sync(this);
+			_la = _input.LA(1);
+			do {
+				{
+				{
+				setState(120);
+				rule_();
+				}
+				}
+				setState(123); 
+				_errHandler.sync(this);
+				_la = _input.LA(1);
+			} while ( (((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << DOC_COMMENT) | (1L << FRAGMENT) | (1L << PRIVATE) | (1L << PROTECTED) | (1L << PUBLIC))) != 0) || _la==TOKEN_REF || _la==RULE_REF );
+			setState(125);
+			match(EOF);
+			}
+		}
+		catch (RecognitionException re) {
+			_localctx.exception = re;
+			_errHandler.reportError(this, re);
+			_errHandler.recover(this, re);
+		}
+		finally {
+			exitRule();
+		}
+		return _localctx;
+	}
+
+	public static class TokensSpecContext extends ParserRuleContext {
+		public TerminalNode TOKENS() { return getToken(ANTLRv3Parser.TOKENS, 0); }
+		public TerminalNode LBRACE() { return getToken(ANTLRv3Parser.LBRACE, 0); }
+		public TerminalNode RBRACE() { return getToken(ANTLRv3Parser.RBRACE, 0); }
+		public List<TokenSpecContext> tokenSpec() {
+			return getRuleContexts(TokenSpecContext.class);
+		}
+		public TokenSpecContext tokenSpec(int i) {
+			return getRuleContext(TokenSpecContext.class,i);
+		}
+		public TokensSpecContext(ParserRuleContext parent, int invokingState) {
+			super(parent, invokingState);
+		}
+		@Override public int getRuleIndex() { return RULE_tokensSpec; }
+		@Override
+		public void enterRule(ParseTreeListener listener) {
+			if ( listener instanceof ANTLRv3ParserListener ) ((ANTLRv3ParserListener)listener).enterTokensSpec(this);
+		}
+		@Override
+		public void exitRule(ParseTreeListener listener) {
+			if ( listener instanceof ANTLRv3ParserListener ) ((ANTLRv3ParserListener)listener).exitTokensSpec(this);
+		}
+	}
+
+	public final TokensSpecContext tokensSpec() throws RecognitionException {
+		TokensSpecContext _localctx = new TokensSpecContext(_ctx, getState());
+		enterRule(_localctx, 2, RULE_tokensSpec);
+		int _la;
+		try {
+			enterOuterAlt(_localctx, 1);
+			{
+			setState(127);
+			match(TOKENS);
+			setState(128);
+			match(LBRACE);
+			setState(130); 
+			_errHandler.sync(this);
+			_la = _input.LA(1);
+			do {
+				{
+				{
+				setState(129);
+				tokenSpec();
+				}
+				}
+				setState(132); 
+				_errHandler.sync(this);
+				_la = _input.LA(1);
+			} while ( _la==TOKEN_REF );
+			setState(134);
+			match(RBRACE);
+			}
+		}
+		catch (RecognitionException re) {
+			_localctx.exception = re;
+			_errHandler.reportError(this, re);
+			_errHandler.recover(this, re);
+		}
+		finally {
+			exitRule();
+		}
+		return _localctx;
+	}
+
+	public static class TokenSpecContext extends ParserRuleContext {
+		public TerminalNode TOKEN_REF() { return getToken(ANTLRv3Parser.TOKEN_REF, 0); }
+		public TerminalNode SEMI() { return getToken(ANTLRv3Parser.SEMI, 0); }
+		public TerminalNode EQUAL() { return getToken(ANTLRv3Parser.EQUAL, 0); }
+		public TerminalNode STRING_LITERAL() { return getToken(ANTLRv3Parser.STRING_LITERAL, 0); }
+		public TerminalNode CHAR_LITERAL() { return getToken(ANTLRv3Parser.CHAR_LITERAL, 0); }
+		public TokenSpecContext(ParserRuleContext parent, int invokingState) {
+			super(parent, invokingState);
+		}
+		@Override public int getRuleIndex() { return RULE_tokenSpec; }
+		@Override
+		public void enterRule(ParseTreeListener listener) {
+			if ( listener instanceof ANTLRv3ParserListener ) ((ANTLRv3ParserListener)listener).enterTokenSpec(this);
+		}
+		@Override
+		public void exitRule(ParseTreeListener listener) {
+			if ( listener instanceof ANTLRv3ParserListener ) ((ANTLRv3ParserListener)listener).exitTokenSpec(this);
+		}
+	}
+
+	public final TokenSpecContext tokenSpec() throws RecognitionException {
+		TokenSpecContext _localctx = new TokenSpecContext(_ctx, getState());
+		enterRule(_localctx, 4, RULE_tokenSpec);
+		int _la;
+		try {
+			enterOuterAlt(_localctx, 1);
+			{
+			setState(136);
+			match(TOKEN_REF);
+			setState(140);
+			_errHandler.sync(this);
+			switch (_input.LA(1)) {
+			case EQUAL:
+				{
+				setState(137);
+				match(EQUAL);
+				setState(138);
+				_la = _input.LA(1);
+				if ( !(_la==CHAR_LITERAL || _la==STRING_LITERAL) ) {
+				_errHandler.recoverInline(this);
+				}
+				else {
+					if ( _input.LA(1)==Token.EOF ) matchedEOF = true;
+					_errHandler.reportMatch(this);
+					consume();
+				}
+				}
+				break;
+			case SEMI:
+				{
+				}
+				break;
+			default:
+				throw new NoViableAltException(this);
+			}
+			setState(142);
+			match(SEMI);
+			}
+		}
+		catch (RecognitionException re) {
+			_localctx.exception = re;
+			_errHandler.reportError(this, re);
+			_errHandler.recover(this, re);
+		}
+		finally {
+			exitRule();
+		}
+		return _localctx;
+	}
+
+	public static class AttrScopeContext extends ParserRuleContext {
+		public TerminalNode SCOPE() { return getToken(ANTLRv3Parser.SCOPE, 0); }
+		public Id_Context id_() {
+			return getRuleContext(Id_Context.class,0);
+		}
+		public ActionBlockContext actionBlock() {
+			return getRuleContext(ActionBlockContext.class,0);
+		}
+		public AttrScopeContext(ParserRuleContext parent, int invokingState) {
+			super(parent, invokingState);
+		}
+		@Override public int getRuleIndex() { return RULE_attrScope; }
+		@Override
+		public void enterRule(ParseTreeListener listener) {
+			if ( listener instanceof ANTLRv3ParserListener ) ((ANTLRv3ParserListener)listener).enterAttrScope(this);
+		}
+		@Override
+		public void exitRule(ParseTreeListener listener) {
+			if ( listener instanceof ANTLRv3ParserListener ) ((ANTLRv3ParserListener)listener).exitAttrScope(this);
+		}
+	}
+
+	public final AttrScopeContext attrScope() throws RecognitionException {
+		AttrScopeContext _localctx = new AttrScopeContext(_ctx, getState());
+		enterRule(_localctx, 6, RULE_attrScope);
+		try {
+			enterOuterAlt(_localctx, 1);
+			{
+			setState(144);
+			match(SCOPE);
+			setState(145);
+			id_();
+			setState(146);
+			actionBlock();
+			}
+		}
+		catch (RecognitionException re) {
+			_localctx.exception = re;
+			_errHandler.reportError(this, re);
+			_errHandler.recover(this, re);
+		}
+		finally {
+			exitRule();
+		}
+		return _localctx;
+	}
+
+	public static class ActionContext extends ParserRuleContext {
+		public TerminalNode AT() { return getToken(ANTLRv3Parser.AT, 0); }
+		public Id_Context id_() {
+			return getRuleContext(Id_Context.class,0);
+		}
+		public ActionBlockContext actionBlock() {
+			return getRuleContext(ActionBlockContext.class,0);
+		}
+		public ActionScopeNameContext actionScopeName() {
+			return getRuleContext(ActionScopeNameContext.class,0);
+		}
+		public TerminalNode COLONCOLON() { return getToken(ANTLRv3Parser.COLONCOLON, 0); }
+		public ActionContext(ParserRuleContext parent, int invokingState) {
+			super(parent, invokingState);
+		}
+		@Override public int getRuleIndex() { return RULE_action; }
+		@Override
+		public void enterRule(ParseTreeListener listener) {
+			if ( listener instanceof ANTLRv3ParserListener ) ((ANTLRv3ParserListener)listener).enterAction(this);
+		}
+		@Override
+		public void exitRule(ParseTreeListener listener) {
+			if ( listener instanceof ANTLRv3ParserListener ) ((ANTLRv3ParserListener)listener).exitAction(this);
+		}
+	}
+
+	public final ActionContext action() throws RecognitionException {
+		ActionContext _localctx = new ActionContext(_ctx, getState());
+		enterRule(_localctx, 8, RULE_action);
+		try {
+			enterOuterAlt(_localctx, 1);
+			{
+			setState(148);
+			match(AT);
+			setState(152);
+			_errHandler.sync(this);
+			switch ( getInterpreter().adaptivePredict(_input,9,_ctx) ) {
+			case 1:
+				{
+				setState(149);
+				actionScopeName();
+				setState(150);
+				match(COLONCOLON);
+				}
+				break;
+			}
+			setState(154);
+			id_();
+			setState(155);
+			actionBlock();
+			}
+		}
+		catch (RecognitionException re) {
+			_localctx.exception = re;
+			_errHandler.reportError(this, re);
+			_errHandler.recover(this, re);
+		}
+		finally {
+			exitRule();
+		}
+		return _localctx;
+	}
+
+	public static class ActionScopeNameContext extends ParserRuleContext {
+		public Id_Context id_() {
+			return getRuleContext(Id_Context.class,0);
+		}
+		public TerminalNode LEXER() { return getToken(ANTLRv3Parser.LEXER, 0); }
+		public TerminalNode PARSER() { return getToken(ANTLRv3Parser.PARSER, 0); }
+		public ActionScopeNameContext(ParserRuleContext parent, int invokingState) {
+			super(parent, invokingState);
+		}
+		@Override public int getRuleIndex() { return RULE_actionScopeName; }
+		@Override
+		public void enterRule(ParseTreeListener listener) {
+			if ( listener instanceof ANTLRv3ParserListener ) ((ANTLRv3ParserListener)listener).enterActionScopeName(this);
+		}
+		@Override
+		public void exitRule(ParseTreeListener listener) {
+			if ( listener instanceof ANTLRv3ParserListener ) ((ANTLRv3ParserListener)listener).exitActionScopeName(this);
+		}
+	}
+
+	public final ActionScopeNameContext actionScopeName() throws RecognitionException {
+		ActionScopeNameContext _localctx = new ActionScopeNameContext(_ctx, getState());
+		enterRule(_localctx, 10, RULE_actionScopeName);
+		try {
+			setState(160);
+			_errHandler.sync(this);
+			switch (_input.LA(1)) {
+			case TOKEN_REF:
+			case RULE_REF:
+				enterOuterAlt(_localctx, 1);
+				{
+				setState(157);
+				id_();
+				}
+				break;
+			case LEXER:
+				enterOuterAlt(_localctx, 2);
+				{
+				setState(158);
+				match(LEXER);
+				}
+				break;
+			case PARSER:
+				enterOuterAlt(_localctx, 3);
+				{
+				setState(159);
+				match(PARSER);
+				}
+				break;
+			default:
+				throw new NoViableAltException(this);
+			}
+		}
+		catch (RecognitionException re) {
+			_localctx.exception = re;
+			_errHandler.reportError(this, re);
+			_errHandler.recover(this, re);
+		}
+		finally {
+			exitRule();
+		}
+		return _localctx;
+	}
+
+	public static class OptionsSpecContext extends ParserRuleContext {
+		public TerminalNode OPTIONS() { return getToken(ANTLRv3Parser.OPTIONS, 0); }
+		public TerminalNode LBRACE() { return getToken(ANTLRv3Parser.LBRACE, 0); }
+		public TerminalNode RBRACE() { return getToken(ANTLRv3Parser.RBRACE, 0); }
+		public List<OptionContext> option() {
+			return getRuleContexts(OptionContext.class);
+		}
+		public OptionContext option(int i) {
+			return getRuleContext(OptionContext.class,i);
+		}
+		public OptionsSpecContext(ParserRuleContext parent, int invokingState) {
+			super(parent, invokingState);
+		}
+		@Override public int getRuleIndex() { return RULE_optionsSpec; }
+		@Override
+		public void enterRule(ParseTreeListener listener) {
+			if ( listener instanceof ANTLRv3ParserListener ) ((ANTLRv3ParserListener)listener).enterOptionsSpec(this);
+		}
+		@Override
+		public void exitRule(ParseTreeListener listener) {
+			if ( listener instanceof ANTLRv3ParserListener ) ((ANTLRv3ParserListener)listener).exitOptionsSpec(this);
+		}
+	}
+
+	public final OptionsSpecContext optionsSpec() throws RecognitionException {
+		OptionsSpecContext _localctx = new OptionsSpecContext(_ctx, getState());
+		enterRule(_localctx, 12, RULE_optionsSpec);
+		int _la;
+		try {
+			enterOuterAlt(_localctx, 1);
+			{
+			setState(162);
+			match(OPTIONS);
+			setState(163);
+			match(LBRACE);
+			setState(167);
+			_errHandler.sync(this);
+			_la = _input.LA(1);
+			while (_la==TOKEN_REF || _la==RULE_REF) {
+				{
+				{
+				setState(164);
+				option();
+				}
+				}
+				setState(169);
+				_errHandler.sync(this);
+				_la = _input.LA(1);
+			}
+			setState(170);
+			match(RBRACE);
+			}
+		}
+		catch (RecognitionException re) {
+			_localctx.exception = re;
+			_errHandler.reportError(this, re);
+			_errHandler.recover(this, re);
+		}
+		finally {
+			exitRule();
+		}
+		return _localctx;
+	}
+
+	public static class OptionContext extends ParserRuleContext {
+		public Id_Context id_() {
+			return getRuleContext(Id_Context.class,0);
+		}
+		public TerminalNode EQUAL() { return getToken(ANTLRv3Parser.EQUAL, 0); }
+		public OptionValueContext optionValue() {
+			return getRuleContext(OptionValueContext.class,0);
+		}
+		public TerminalNode SEMI() { return getToken(ANTLRv3Parser.SEMI, 0); }
+		public OptionContext(ParserRuleContext parent, int invokingState) {
+			super(parent, invokingState);
+		}
+		@Override public int getRuleIndex() { return RULE_option; }
+		@Override
+		public void enterRule(ParseTreeListener listener) {
+			if ( listener instanceof ANTLRv3ParserListener ) ((ANTLRv3ParserListener)listener).enterOption(this);
+		}
+		@Override
+		public void exitRule(ParseTreeListener listener) {
+			if ( listener instanceof ANTLRv3ParserListener ) ((ANTLRv3ParserListener)listener).exitOption(this);
+		}
+	}
+
+	public final OptionContext option() throws RecognitionException {
+		OptionContext _localctx = new OptionContext(_ctx, getState());
+		enterRule(_localctx, 14, RULE_option);
+		try {
+			enterOuterAlt(_localctx, 1);
+			{
+			setState(172);
+			id_();
+			setState(173);
+			match(EQUAL);
+			setState(174);
+			optionValue();
+			setState(175);
+			match(SEMI);
+			}
+		}
+		catch (RecognitionException re) {
+			_localctx.exception = re;
+			_errHandler.reportError(this, re);
+			_errHandler.recover(this, re);
+		}
+		finally {
+			exitRule();
+		}
+		return _localctx;
+	}
+
+	public static class OptionValueContext extends ParserRuleContext {
+		public Id_Context id_() {
+			return getRuleContext(Id_Context.class,0);
+		}
+		public TerminalNode STRING_LITERAL() { return getToken(ANTLRv3Parser.STRING_LITERAL, 0); }
+		public TerminalNode CHAR_LITERAL() { return getToken(ANTLRv3Parser.CHAR_LITERAL, 0); }
+		public TerminalNode INT() { return getToken(ANTLRv3Parser.INT, 0); }
+		public TerminalNode STAR() { return getToken(ANTLRv3Parser.STAR, 0); }
+		public OptionValueContext(ParserRuleContext parent, int invokingState) {
+			super(parent, invokingState);
+		}
+		@Override public int getRuleIndex() { return RULE_optionValue; }
+		@Override
+		public void enterRule(ParseTreeListener listener) {
+			if ( listener instanceof ANTLRv3ParserListener ) ((ANTLRv3ParserListener)listener).enterOptionValue(this);
+		}
+		@Override
+		public void exitRule(ParseTreeListener listener) {
+			if ( listener instanceof ANTLRv3ParserListener ) ((ANTLRv3ParserListener)listener).exitOptionValue(this);
+		}
+	}
+
+	public final OptionValueContext optionValue() throws RecognitionException {
+		OptionValueContext _localctx = new OptionValueContext(_ctx, getState());
+		enterRule(_localctx, 16, RULE_optionValue);
+		try {
+			setState(182);
+			_errHandler.sync(this);
+			switch (_input.LA(1)) {
+			case TOKEN_REF:
+			case RULE_REF:
+				enterOuterAlt(_localctx, 1);
+				{
+				setState(177);
+				id_();
+				}
+				break;
+			case STRING_LITERAL:
+				enterOuterAlt(_localctx, 2);
+				{
+				setState(178);
+				match(STRING_LITERAL);
+				}
+				break;
+			case CHAR_LITERAL:
+				enterOuterAlt(_localctx, 3);
+				{
+				setState(179);
+				match(CHAR_LITERAL);
+				}
+				break;
+			case INT:
+				enterOuterAlt(_localctx, 4);
+				{
+				setState(180);
+				match(INT);
+				}
+				break;
+			case STAR:
+				enterOuterAlt(_localctx, 5);
+				{
+				setState(181);
+				match(STAR);
+				}
+				break;
+			default:
+				throw new NoViableAltException(this);
+			}
+		}
+		catch (RecognitionException re) {
+			_localctx.exception = re;
+			_errHandler.reportError(this, re);
+			_errHandler.recover(this, re);
+		}
+		finally {
+			exitRule();
+		}
+		return _localctx;
+	}
+
+	public static class Rule_Context extends ParserRuleContext {
+		public Id_Context id_() {
+			return getRuleContext(Id_Context.class,0);
+		}
+		public TerminalNode COLON() { return getToken(ANTLRv3Parser.COLON, 0); }
+		public AltListContext altList() {
+			return getRuleContext(AltListContext.class,0);
+		}
+		public TerminalNode SEMI() { return getToken(ANTLRv3Parser.SEMI, 0); }
+		public TerminalNode DOC_COMMENT() { return getToken(ANTLRv3Parser.DOC_COMMENT, 0); }
+		public TerminalNode BANG() { return getToken(ANTLRv3Parser.BANG, 0); }
+		public List<ArgActionBlockContext> argActionBlock() {
+			return getRuleContexts(ArgActionBlockContext.class);
+		}
+		public ArgActionBlockContext argActionBlock(int i) {
+			return getRuleContext(ArgActionBlockContext.class,i);
+		}
+		public TerminalNode RETURNS() { return getToken(ANTLRv3Parser.RETURNS, 0); }
+		public ThrowsSpecContext throwsSpec() {
+			return getRuleContext(ThrowsSpecContext.class,0);
+		}
+		public OptionsSpecContext optionsSpec() {
+			return getRuleContext(OptionsSpecContext.class,0);
+		}
+		public RuleScopeSpecContext ruleScopeSpec() {
+			return getRuleContext(RuleScopeSpecContext.class,0);
+		}
+		public List<RuleActionContext> ruleAction() {
+			return getRuleContexts(RuleActionContext.class);
+		}
+		public RuleActionContext ruleAction(int i) {
+			return getRuleContext(RuleActionContext.class,i);
+		}
+		public ExceptionGroupContext exceptionGroup() {
+			return getRuleContext(ExceptionGroupContext.class,0);
+		}
+		public TerminalNode PROTECTED() { return getToken(ANTLRv3Parser.PROTECTED, 0); }
+		public TerminalNode PUBLIC() { return getToken(ANTLRv3Parser.PUBLIC, 0); }
+		public TerminalNode PRIVATE() { return getToken(ANTLRv3Parser.PRIVATE, 0); }
+		public TerminalNode FRAGMENT() { return getToken(ANTLRv3Parser.FRAGMENT, 0); }
+		public Rule_Context(ParserRuleContext parent, int invokingState) {
+			super(parent, invokingState);
+		}
+		@Override public int getRuleIndex() { return RULE_rule_; }
+		@Override
+		public void enterRule(ParseTreeListener listener) {
+			if ( listener instanceof ANTLRv3ParserListener ) ((ANTLRv3ParserListener)listener).enterRule_(this);
+		}
+		@Override
+		public void exitRule(ParseTreeListener listener) {
+			if ( listener instanceof ANTLRv3ParserListener ) ((ANTLRv3ParserListener)listener).exitRule_(this);
+		}
+	}
+
+	public final Rule_Context rule_() throws RecognitionException {
+		Rule_Context _localctx = new Rule_Context(_ctx, getState());
+		enterRule(_localctx, 18, RULE_rule_);
+		int _la;
+		try {
+			enterOuterAlt(_localctx, 1);
+			{
+			setState(185);
+			_errHandler.sync(this);
+			_la = _input.LA(1);
+			if (_la==DOC_COMMENT) {
+				{
+				setState(184);
+				match(DOC_COMMENT);
+				}
+			}
+
+			setState(188);
+			_errHandler.sync(this);
+			_la = _input.LA(1);
+			if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << FRAGMENT) | (1L << PRIVATE) | (1L << PROTECTED) | (1L << PUBLIC))) != 0)) {
+				{
+				setState(187);
+				_la = _input.LA(1);
+				if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << FRAGMENT) | (1L << PRIVATE) | (1L << PROTECTED) | (1L << PUBLIC))) != 0)) ) {
+				_errHandler.recoverInline(this);
+				}
+				else {
+					if ( _input.LA(1)==Token.EOF ) matchedEOF = true;
+					_errHandler.reportMatch(this);
+					consume();
+				}
+				}
+			}
+
+			setState(190);
+			id_();
+			setState(192);
+			_errHandler.sync(this);
+			_la = _input.LA(1);
+			if (_la==BANG) {
+				{
+				setState(191);
+				match(BANG);
+				}
+			}
+
+			setState(195);
+			_errHandler.sync(this);
+			_la = _input.LA(1);
+			if (_la==BEGIN_ARGUMENT) {
+				{
+				setState(194);
+				argActionBlock();
+				}
+			}
+
+			setState(199);
+			_errHandler.sync(this);
+			_la = _input.LA(1);
+			if (_la==RETURNS) {
+				{
+				setState(197);
+				match(RETURNS);
+				setState(198);
+				argActionBlock();
+				}
+			}
+
+			setState(202);
+			_errHandler.sync(this);
+			_la = _input.LA(1);
+			if (_la==THROWS) {
+				{
+				setState(201);
+				throwsSpec();
+				}
+			}
+
+			setState(205);
+			_errHandler.sync(this);
+			_la = _input.LA(1);
+			if (_la==OPTIONS) {
+				{
+				setState(204);
+				optionsSpec();
+				}
+			}
+
+			setState(208);
+			_errHandler.sync(this);
+			_la = _input.LA(1);
+			if (_la==SCOPE) {
+				{
+				setState(207);
+				ruleScopeSpec();
+				}
+			}
+
+			setState(213);
+			_errHandler.sync(this);
+			_la = _input.LA(1);
+			while (_la==AT) {
+				{
+				{
+				setState(210);
+				ruleAction();
+				}
+				}
+				setState(215);
+				_errHandler.sync(this);
+				_la = _input.LA(1);
+			}
+			setState(216);
+			match(COLON);
+			setState(217);
+			altList();
+			setState(218);
+			match(SEMI);
+			setState(220);
+			_errHandler.sync(this);
+			_la = _input.LA(1);
+			if (_la==CATCH || _la==FINALLY) {
+				{
+				setState(219);
+				exceptionGroup();
+				}
+			}
+
+			}
+		}
+		catch (RecognitionException re) {
+			_localctx.exception = re;
+			_errHandler.reportError(this, re);
+			_errHandler.recover(this, re);
+		}
+		finally {
+			exitRule();
+		}
+		return _localctx;
+	}
+
+	public static class RuleActionContext extends ParserRuleContext {
+		public TerminalNode AT() { return getToken(ANTLRv3Parser.AT, 0); }
+		public Id_Context id_() {
+			return getRuleContext(Id_Context.class,0);
+		}
+		public ActionBlockContext actionBlock() {
+			return getRuleContext(ActionBlockContext.class,0);
+		}
+		public RuleActionContext(ParserRuleContext parent, int invokingState) {
+			super(parent, invokingState);
+		}
+		@Override public int getRuleIndex() { return RULE_ruleAction; }
+		@Override
+		public void enterRule(ParseTreeListener listener) {
+			if ( listener instanceof ANTLRv3ParserListener ) ((ANTLRv3ParserListener)listener).enterRuleAction(this);
+		}
+		@Override
+		public void exitRule(ParseTreeListener listener) {
+			if ( listener instanceof ANTLRv3ParserListener ) ((ANTLRv3ParserListener)listener).exitRuleAction(this);
+		}
+	}
+
+	public final RuleActionContext ruleAction() throws RecognitionException {
+		RuleActionContext _localctx = new RuleActionContext(_ctx, getState());
+		enterRule(_localctx, 20, RULE_ruleAction);
+		try {
+			enterOuterAlt(_localctx, 1);
+			{
+			setState(222);
+			match(AT);
+			setState(223);
+			id_();
+			setState(224);
+			actionBlock();
+			}
+		}
+		catch (RecognitionException re) {
+			_localctx.exception = re;
+			_errHandler.reportError(this, re);
+			_errHandler.recover(this, re);
+		}
+		finally {
+			exitRule();
+		}
+		return _localctx;
+	}
+
+	public static class ThrowsSpecContext extends ParserRuleContext {
+		public TerminalNode THROWS() { return getToken(ANTLRv3Parser.THROWS, 0); }
+		public List<Id_Context> id_() {
+			return getRuleContexts(Id_Context.class);
+		}
+		public Id_Context id_(int i) {
+			return getRuleContext(Id_Context.class,i);
+		}
+		public List<TerminalNode> COMMA() { return getTokens(ANTLRv3Parser.COMMA); }
+		public TerminalNode COMMA(int i) {
+			return getToken(ANTLRv3Parser.COMMA, i);
+		}
+		public ThrowsSpecContext(ParserRuleContext parent, int invokingState) {
+			super(parent, invokingState);
+		}
+		@Override public int getRuleIndex() { return RULE_throwsSpec; }
+		@Override
+		public void enterRule(ParseTreeListener listener) {
+			if ( listener instanceof ANTLRv3ParserListener ) ((ANTLRv3ParserListener)listener).enterThrowsSpec(this);
+		}
+		@Override
+		public void exitRule(ParseTreeListener listener) {
+			if ( listener instanceof ANTLRv3ParserListener ) ((ANTLRv3ParserListener)listener).exitThrowsSpec(this);
+		}
+	}
+
+	public final ThrowsSpecContext throwsSpec() throws RecognitionException {
+		ThrowsSpecContext _localctx = new ThrowsSpecContext(_ctx, getState());
+		enterRule(_localctx, 22, RULE_throwsSpec);
+		int _la;
+		try {
+			enterOuterAlt(_localctx, 1);
+			{
+			setState(226);
+			match(THROWS);
+			setState(227);
+			id_();
+			setState(232);
+			_errHandler.sync(this);
+			_la = _input.LA(1);
+			while (_la==COMMA) {
+				{
+				{
+				setState(228);
+				match(COMMA);
+				setState(229);
+				id_();
+				}
+				}
+				setState(234);
+				_errHandler.sync(this);
+				_la = _input.LA(1);
+			}
+			}
+		}
+		catch (RecognitionException re) {
+			_localctx.exception = re;
+			_errHandler.reportError(this, re);
+			_errHandler.recover(this, re);
+		}
+		finally {
+			exitRule();
+		}
+		return _localctx;
+	}
+
+	public static class RuleScopeSpecContext extends ParserRuleContext {
+		public List<TerminalNode> SCOPE() { return getTokens(ANTLRv3Parser.SCOPE); }
+		public TerminalNode SCOPE(int i) {
+			return getToken(ANTLRv3Parser.SCOPE, i);
+		}
+		public ActionBlockContext actionBlock() {
+			return getRuleContext(ActionBlockContext.class,0);
+		}
+		public List<Id_Context> id_() {
+			return getRuleContexts(Id_Context.class);
+		}
+		public Id_Context id_(int i) {
+			return getRuleContext(Id_Context.class,i);
+		}
+		public TerminalNode SEMI() { return getToken(ANTLRv3Parser.SEMI, 0); }
+		public List<TerminalNode> COMMA() { return getTokens(ANTLRv3Parser.COMMA); }
+		public TerminalNode COMMA(int i) {
+			return getToken(ANTLRv3Parser.COMMA, i);
+		}
+		public RuleScopeSpecContext(ParserRuleContext parent, int invokingState) {
+			super(parent, invokingState);
+		}
+		@Override public int getRuleIndex() { return RULE_ruleScopeSpec; }
+		@Override
+		public void enterRule(ParseTreeListener listener) {
+			if ( listener instanceof ANTLRv3ParserListener ) ((ANTLRv3ParserListener)listener).enterRuleScopeSpec(this);
+		}
+		@Override
+		public void exitRule(ParseTreeListener listener) {
+			if ( listener instanceof ANTLRv3ParserListener ) ((ANTLRv3ParserListener)listener).exitRuleScopeSpec(this);
+		}
+	}
+
+	public final RuleScopeSpecContext ruleScopeSpec() throws RecognitionException {
+		RuleScopeSpecContext _localctx = new RuleScopeSpecContext(_ctx, getState());
+		enterRule(_localctx, 24, RULE_ruleScopeSpec);
+		int _la;
+		try {
+			setState(261);
+			_errHandler.sync(this);
+			switch ( getInterpreter().adaptivePredict(_input,26,_ctx) ) {
+			case 1:
+				enterOuterAlt(_localctx, 1);
+				{
+				setState(235);
+				match(SCOPE);
+				setState(236);
+				actionBlock();
+				}
+				break;
+			case 2:
+				enterOuterAlt(_localctx, 2);
+				{
+				setState(237);
+				match(SCOPE);
+				setState(238);
+				id_();
+				setState(243);
+				_errHandler.sync(this);
+				_la = _input.LA(1);
+				while (_la==COMMA) {
+					{
+					{
+					setState(239);
+					match(COMMA);
+					setState(240);
+					id_();
+					}
+					}
+					setState(245);
+					_errHandler.sync(this);
+					_la = _input.LA(1);
+				}
+				setState(246);
+				match(SEMI);
+				}
+				break;
+			case 3:
+				enterOuterAlt(_localctx, 3);
+				{
+				setState(248);
+				match(SCOPE);
+				setState(249);
+				actionBlock();
+				setState(250);
+				match(SCOPE);
+				setState(251);
+				id_();
+				setState(256);
+				_errHandler.sync(this);
+				_la = _input.LA(1);
+				while (_la==COMMA) {
+					{
+					{
+					setState(252);
+					match(COMMA);
+					setState(253);
+					id_();
+					}
+					}
+					setState(258);
+					_errHandler.sync(this);
+					_la = _input.LA(1);
+				}
+				setState(259);
+				match(SEMI);
+				}
+				break;
+			}
+		}
+		catch (RecognitionException re) {
+			_localctx.exception = re;
+			_errHandler.reportError(this, re);
+			_errHandler.recover(this, re);
+		}
+		finally {
+			exitRule();
+		}
+		return _localctx;
+	}
+
+	public static class BlockContext extends ParserRuleContext {
+		public TerminalNode LPAREN() { return getToken(ANTLRv3Parser.LPAREN, 0); }
+		public List<AlternativeContext> alternative() {
+			return getRuleContexts(AlternativeContext.class);
+		}
+		public AlternativeContext alternative(int i) {
+			return getRuleContext(AlternativeContext.class,i);
+		}
+		public List<RewriteContext> rewrite() {
+			return getRuleContexts(RewriteContext.class);
+		}
+		public RewriteContext rewrite(int i) {
+			return getRuleContext(RewriteContext.class,i);
+		}
+		public TerminalNode RPAREN() { return getToken(ANTLRv3Parser.RPAREN, 0); }
+		public TerminalNode COLON() { return getToken(ANTLRv3Parser.COLON, 0); }
+		public List<TerminalNode> OR() { return getTokens(ANTLRv3Parser.OR); }
+		public TerminalNode OR(int i) {
+			return getToken(ANTLRv3Parser.OR, i);
+		}
+		public OptionsSpecContext optionsSpec() {
+			return getRuleContext(OptionsSpecContext.class,0);
+		}
+		public BlockContext(ParserRuleContext parent, int invokingState) {
+			super(parent, invokingState);
+		}
+		@Override public int getRuleIndex() { return RULE_block; }
+		@Override
+		public void enterRule(ParseTreeListener listener) {
+			if ( listener instanceof ANTLRv3ParserListener ) ((ANTLRv3ParserListener)listener).enterBlock(this);
+		}
+		@Override
+		public void exitRule(ParseTreeListener listener) {
+			if ( listener instanceof ANTLRv3ParserListener ) ((ANTLRv3ParserListener)listener).exitBlock(this);
+		}
+	}
+
+	public final BlockContext block() throws RecognitionException {
+		BlockContext _localctx = new BlockContext(_ctx, getState());
+		enterRule(_localctx, 26, RULE_block);
+		int _la;
+		try {
+			enterOuterAlt(_localctx, 1);
+			{
+			setState(263);
+			match(LPAREN);
+			setState(268);
+			_errHandler.sync(this);
+			_la = _input.LA(1);
+			if (_la==OPTIONS || _la==COLON) {
+				{
+				setState(265);
+				_errHandler.sync(this);
+				_la = _input.LA(1);
+				if (_la==OPTIONS) {
+					{
+					setState(264);
+					optionsSpec();
+					}
+				}
+
+				setState(267);
+				match(COLON);
+				}
+			}
+
+			setState(270);
+			alternative();
+			setState(271);
+			rewrite();
+			setState(278);
+			_errHandler.sync(this);
+			_la = _input.LA(1);
+			while (_la==OR) {
+				{
+				{
+				setState(272);
+				match(OR);
+				setState(273);
+				alternative();
+				setState(274);
+				rewrite();
+				}
+				}
+				setState(280);
+				_errHandler.sync(this);
+				_la = _input.LA(1);
+			}
+			setState(281);
+			match(RPAREN);
+			}
+		}
+		catch (RecognitionException re) {
+			_localctx.exception = re;
+			_errHandler.reportError(this, re);
+			_errHandler.recover(this, re);
+		}
+		finally {
+			exitRule();
+		}
+		return _localctx;
+	}
+
+	public static class AltListContext extends ParserRuleContext {
+		public List<AlternativeContext> alternative() {
+			return getRuleContexts(AlternativeContext.class);
+		}
+		public AlternativeContext alternative(int i) {
+			return getRuleContext(AlternativeContext.class,i);
+		}
+		public List<RewriteContext> rewrite() {
+			return getRuleContexts(RewriteContext.class);
+		}
+		public RewriteContext rewrite(int i) {
+			return getRuleContext(RewriteContext.class,i);
+		}
+		public List<TerminalNode> OR() { return getTokens(ANTLRv3Parser.OR); }
+		public TerminalNode OR(int i) {
+			return getToken(ANTLRv3Parser.OR, i);
+		}
+		public AltListContext(ParserRuleContext parent, int invokingState) {
+			super(parent, invokingState);
+		}
+		@Override public int getRuleIndex() { return RULE_altList; }
+		@Override
+		public void enterRule(ParseTreeListener listener) {
+			if ( listener instanceof ANTLRv3ParserListener ) ((ANTLRv3ParserListener)listener).enterAltList(this);
+		}
+		@Override
+		public void exitRule(ParseTreeListener listener) {
+			if ( listener instanceof ANTLRv3ParserListener ) ((ANTLRv3ParserListener)listener).exitAltList(this);
+		}
+	}
+
+	public final AltListContext altList() throws RecognitionException {
+		AltListContext _localctx = new AltListContext(_ctx, getState());
+		enterRule(_localctx, 28, RULE_altList);
+		int _la;
+		try {
+			enterOuterAlt(_localctx, 1);
+			{
+			setState(283);
+			alternative();
+			setState(284);
+			rewrite();
+			setState(291);
+			_errHandler.sync(this);
+			_la = _input.LA(1);
+			while (_la==OR) {
+				{
+				{
+				setState(285);
+				match(OR);
+				setState(286);
+				alternative();
+				setState(287);
+				rewrite();
+				}
+				}
+				setState(293);
+				_errHandler.sync(this);
+				_la = _input.LA(1);
+			}
+			}
+		}
+		catch (RecognitionException re) {
+			_localctx.exception = re;
+			_errHandler.reportError(this, re);
+			_errHandler.recover(this, re);
+		}
+		finally {
+			exitRule();
+		}
+		return _localctx;
+	}
+
+	public static class AlternativeContext extends ParserRuleContext {
+		public List<ElementContext> element() {
+			return getRuleContexts(ElementContext.class);
+		}
+		public ElementContext element(int i) {
+			return getRuleContext(ElementContext.class,i);
+		}
+		public AlternativeContext(ParserRuleContext parent, int invokingState) {
+			super(parent, invokingState);
+		}
+		@Override public int getRuleIndex() { return RULE_alternative; }
+		@Override
+		public void enterRule(ParseTreeListener listener) {
+			if ( listener instanceof ANTLRv3ParserListener ) ((ANTLRv3ParserListener)listener).enterAlternative(this);
+		}
+		@Override
+		public void exitRule(ParseTreeListener listener) {
+			if ( listener instanceof ANTLRv3ParserListener ) ((ANTLRv3ParserListener)listener).exitAlternative(this);
+		}
+	}
+
+	public final AlternativeContext alternative() throws RecognitionException {
+		AlternativeContext _localctx = new AlternativeContext(_ctx, getState());
+		enterRule(_localctx, 30, RULE_alternative);
+		int _la;
+		try {
+			setState(300);
+			_errHandler.sync(this);
+			switch (_input.LA(1)) {
+			case TREE_BEGIN:
+			case CHAR_LITERAL:
+			case STRING_LITERAL:
+			case BEGIN_ACTION:
+			case DOT:
+			case LPAREN:
+			case NOT:
+			case TOKEN_REF:
+			case RULE_REF:
+				enterOuterAlt(_localctx, 1);
+				{
+				setState(295); 
+				_errHandler.sync(this);
+				_la = _input.LA(1);
+				do {
+					{
+					{
+					setState(294);
+					element();
+					}
+					}
+					setState(297); 
+					_errHandler.sync(this);
+					_la = _input.LA(1);
+				} while ( ((((_la - 34)) & ~0x3f) == 0 && ((1L << (_la - 34)) & ((1L << (TREE_BEGIN - 34)) | (1L << (CHAR_LITERAL - 34)) | (1L << (STRING_LITERAL - 34)) | (1L << (BEGIN_ACTION - 34)) | (1L << (DOT - 34)) | (1L << (LPAREN - 34)) | (1L << (NOT - 34)) | (1L << (TOKEN_REF - 34)) | (1L << (RULE_REF - 34)))) != 0) );
+				}
+				break;
+			case REWRITE:
+			case OR:
+			case RPAREN:
+			case SEMI:
+				enterOuterAlt(_localctx, 2);
+				{
+				}
+				break;
+			default:
+				throw new NoViableAltException(this);
+			}
+		}
+		catch (RecognitionException re) {
+			_localctx.exception = re;
+			_errHandler.reportError(this, re);
+			_errHandler.recover(this, re);
+		}
+		finally {
+			exitRule();
+		}
+		return _localctx;
+	}
+
+	public static class ExceptionGroupContext extends ParserRuleContext {
+		public List<ExceptionHandlerContext> exceptionHandler() {
+			return getRuleContexts(ExceptionHandlerContext.class);
+		}
+		public ExceptionHandlerContext exceptionHandler(int i) {
+			return getRuleContext(ExceptionHandlerContext.class,i);
+		}
+		public FinallyClauseContext finallyClause() {
+			return getRuleContext(FinallyClauseContext.class,0);
+		}
+		public ExceptionGroupContext(ParserRuleContext parent, int invokingState) {
+			super(parent, invokingState);
+		}
+		@Override public int getRuleIndex() { return RULE_exceptionGroup; }
+		@Override
+		public void enterRule(ParseTreeListener listener) {
+			if ( listener instanceof ANTLRv3ParserListener ) ((ANTLRv3ParserListener)listener).enterExceptionGroup(this);
+		}
+		@Override
+		public void exitRule(ParseTreeListener listener) {
+			if ( listener instanceof ANTLRv3ParserListener ) ((ANTLRv3ParserListener)listener).exitExceptionGroup(this);
+		}
+	}
+
+	public final ExceptionGroupContext exceptionGroup() throws RecognitionException {
+		ExceptionGroupContext _localctx = new ExceptionGroupContext(_ctx, getState());
+		enterRule(_localctx, 32, RULE_exceptionGroup);
+		int _la;
+		try {
+			setState(311);
+			_errHandler.sync(this);
+			switch (_input.LA(1)) {
+			case CATCH:
+				enterOuterAlt(_localctx, 1);
+				{
+				setState(303); 
+				_errHandler.sync(this);
+				_la = _input.LA(1);
+				do {
+					{
+					{
+					setState(302);
+					exceptionHandler();
+					}
+					}
+					setState(305); 
+					_errHandler.sync(this);
+					_la = _input.LA(1);
+				} while ( _la==CATCH );
+				setState(308);
+				_errHandler.sync(this);
+				_la = _input.LA(1);
+				if (_la==FINALLY) {
+					{
+					setState(307);
+					finallyClause();
+					}
+				}
+
+				}
+				break;
+			case FINALLY:
+				enterOuterAlt(_localctx, 2);
+				{
+				setState(310);
+				finallyClause();
+				}
+				break;
+			default:
+				throw new NoViableAltException(this);
+			}
+		}
+		catch (RecognitionException re) {
+			_localctx.exception = re;
+			_errHandler.reportError(this, re);
+			_errHandler.recover(this, re);
+		}
+		finally {
+			exitRule();
+		}
+		return _localctx;
+	}
+
+	public static class ExceptionHandlerContext extends ParserRuleContext {
+		public TerminalNode CATCH() { return getToken(ANTLRv3Parser.CATCH, 0); }
+		public ArgActionBlockContext argActionBlock() {
+			return getRuleContext(ArgActionBlockContext.class,0);
+		}
+		public ActionBlockContext actionBlock() {
+			return getRuleContext(ActionBlockContext.class,0);
+		}
+		public ExceptionHandlerContext(ParserRuleContext parent, int invokingState) {
+			super(parent, invokingState);
+		}
+		@Override public int getRuleIndex() { return RULE_exceptionHandler; }
+		@Override
+		public void enterRule(ParseTreeListener listener) {
+			if ( listener instanceof ANTLRv3ParserListener ) ((ANTLRv3ParserListener)listener).enterExceptionHandler(this);
+		}
+		@Override
+		public void exitRule(ParseTreeListener listener) {
+			if ( listener instanceof ANTLRv3ParserListener ) ((ANTLRv3ParserListener)listener).exitExceptionHandler(this);
+		}
+	}
+
+	public final ExceptionHandlerContext exceptionHandler() throws RecognitionException {
+		ExceptionHandlerContext _localctx = new ExceptionHandlerContext(_ctx, getState());
+		enterRule(_localctx, 34, RULE_exceptionHandler);
+		try {
+			enterOuterAlt(_localctx, 1);
+			{
+			setState(313);
+			match(CATCH);
+			setState(314);
+			argActionBlock();
+			setState(315);
+			actionBlock();
+			}
+		}
+		catch (RecognitionException re) {
+			_localctx.exception = re;
+			_errHandler.reportError(this, re);
+			_errHandler.recover(this, re);
+		}
+		finally {
+			exitRule();
+		}
+		return _localctx;
+	}
+
+	public static class FinallyClauseContext extends ParserRuleContext {
+		public TerminalNode FINALLY() { return getToken(ANTLRv3Parser.FINALLY, 0); }
+		public ActionBlockContext actionBlock() {
+			return getRuleContext(ActionBlockContext.class,0);
+		}
+		public FinallyClauseContext(ParserRuleContext parent, int invokingState) {
+			super(parent, invokingState);
+		}
+		@Override public int getRuleIndex() { return RULE_finallyClause; }
+		@Override
+		public void enterRule(ParseTreeListener listener) {
+			if ( listener instanceof ANTLRv3ParserListener ) ((ANTLRv3ParserListener)listener).enterFinallyClause(this);
+		}
+		@Override
+		public void exitRule(ParseTreeListener listener) {
+			if ( listener instanceof ANTLRv3ParserListener ) ((ANTLRv3ParserListener)listener).exitFinallyClause(this);
+		}
+	}
+
+	public final FinallyClauseContext finallyClause() throws RecognitionException {
+		FinallyClauseContext _localctx = new FinallyClauseContext(_ctx, getState());
+		enterRule(_localctx, 36, RULE_finallyClause);
+		try {
+			enterOuterAlt(_localctx, 1);
+			{
+			setState(317);
+			match(FINALLY);
+			setState(318);
+			actionBlock();
+			}
+		}
+		catch (RecognitionException re) {
+			_localctx.exception = re;
+			_errHandler.reportError(this, re);
+			_errHandler.recover(this, re);
+		}
+		finally {
+			exitRule();
+		}
+		return _localctx;
+	}
+
+	public static class ElementContext extends ParserRuleContext {
+		public ElementNoOptionSpecContext elementNoOptionSpec() {
+			return getRuleContext(ElementNoOptionSpecContext.class,0);
+		}
+		public ElementContext(ParserRuleContext parent, int invokingState) {
+			super(parent, invokingState);
+		}
+		@Override public int getRuleIndex() { return RULE_element; }
+		@Override
+		public void enterRule(ParseTreeListener listener) {
+			if ( listener instanceof ANTLRv3ParserListener ) ((ANTLRv3ParserListener)listener).enterElement(this);
+		}
+		@Override
+		public void exitRule(ParseTreeListener listener) {
+			if ( listener instanceof ANTLRv3ParserListener ) ((ANTLRv3ParserListener)listener).exitElement(this);
+		}
+	}
+
+	public final ElementContext element() throws RecognitionException {
+		ElementContext _localctx = new ElementContext(_ctx, getState());
+		enterRule(_localctx, 38, RULE_element);
+		try {
+			enterOuterAlt(_localctx, 1);
+			{
+			setState(320);
+			elementNoOptionSpec();
+			}
+		}
+		catch (RecognitionException re) {
+			_localctx.exception = re;
+			_errHandler.reportError(this, re);
+			_errHandler.recover(this, re);
+		}
+		finally {
+			exitRule();
+		}
+		return _localctx;
+	}
+
+	public static class ElementNoOptionSpecContext extends ParserRuleContext {
+		public Id_Context id_() {
+			return getRuleContext(Id_Context.class,0);
+		}
+		public AtomContext atom() {
+			return getRuleContext(AtomContext.class,0);
+		}
+		public TerminalNode EQUAL() { return getToken(ANTLRv3Parser.EQUAL, 0); }
+		public TerminalNode PEQ() { return getToken(ANTLRv3Parser.PEQ, 0); }
+		public EbnfSuffixContext ebnfSuffix() {
+			return getRuleContext(EbnfSuffixContext.class,0);
+		}
+		public BlockContext block() {
+			return getRuleContext(BlockContext.class,0);
+		}
+		public EbnfContext ebnf() {
+			return getRuleContext(EbnfContext.class,0);
+		}
+		public ActionBlockContext actionBlock() {
+			return getRuleContext(ActionBlockContext.class,0);
+		}
+		public TerminalNode QM() { return getToken(ANTLRv3Parser.QM, 0); }
+		public TerminalNode SEMPREDOP() { return getToken(ANTLRv3Parser.SEMPREDOP, 0); }
+		public TreeSpecContext treeSpec() {
+			return getRuleContext(TreeSpecContext.class,0);
+		}
+		public ElementNoOptionSpecContext(ParserRuleContext parent, int invokingState) {
+			super(parent, invokingState);
+		}
+		@Override public int getRuleIndex() { return RULE_elementNoOptionSpec; }
+		@Override
+		public void enterRule(ParseTreeListener listener) {
+			if ( listener instanceof ANTLRv3ParserListener ) ((ANTLRv3ParserListener)listener).enterElementNoOptionSpec(this);
+		}
+		@Override
+		public void exitRule(ParseTreeListener listener) {
+			if ( listener instanceof ANTLRv3ParserListener ) ((ANTLRv3ParserListener)listener).exitElementNoOptionSpec(this);
+		}
+	}
+
+	public final ElementNoOptionSpecContext elementNoOptionSpec() throws RecognitionException {
+		ElementNoOptionSpecContext _localctx = new ElementNoOptionSpecContext(_ctx, getState());
+		enterRule(_localctx, 40, RULE_elementNoOptionSpec);
+		int _la;
+		try {
+			setState(354);
+			_errHandler.sync(this);
+			switch ( getInterpreter().adaptivePredict(_input,41,_ctx) ) {
+			case 1:
+				enterOuterAlt(_localctx, 1);
+				{
+				setState(322);
+				id_();
+				setState(323);
+				_la = _input.LA(1);
+				if ( !(_la==EQUAL || _la==PEQ) ) {
+				_errHandler.recoverInline(this);
+				}
+				else {
+					if ( _input.LA(1)==Token.EOF ) matchedEOF = true;
+					_errHandler.reportMatch(this);
+					consume();
+				}
+				setState(324);
+				atom();
+				setState(327);
+				_errHandler.sync(this);
+				switch (_input.LA(1)) {
+				case PLUS:
+				case QM:
+				case STAR:
+					{
+					setState(325);
+					ebnfSuffix();
+					}
+					break;
+				case TREE_BEGIN:
+				case REWRITE:
+				case CHAR_LITERAL:
+				case STRING_LITERAL:
+				case BEGIN_ACTION:
+				case DOT:
+				case LPAREN:
+				case OR:
+				case RPAREN:
+				case SEMI:
+				case NOT:
+				case TOKEN_REF:
+				case RULE_REF:
+					{
+					}
+					break;
+				default:
+					throw new NoViableAltException(this);
+				}
+				}
+				break;
+			case 2:
+				enterOuterAlt(_localctx, 2);
+				{
+				setState(329);
+				id_();
+				setState(330);
+				_la = _input.LA(1);
+				if ( !(_la==EQUAL || _la==PEQ) ) {
+				_errHandler.recoverInline(this);
+				}
+				else {
+					if ( _input.LA(1)==Token.EOF ) matchedEOF = true;
+					_errHandler.reportMatch(this);
+					consume();
+				}
+				setState(331);
+				block();
+				setState(334);
+				_errHandler.sync(this);
+				switch (_input.LA(1)) {
+				case PLUS:
+				case QM:
+				case STAR:
+					{
+					setState(332);
+					ebnfSuffix();
+					}
+					break;
+				case TREE_BEGIN:
+				case REWRITE:
+				case CHAR_LITERAL:
+				case STRING_LITERAL:
+				case BEGIN_ACTION:
+				case DOT:
+				case LPAREN:
+				case OR:
+				case RPAREN:
+				case SEMI:
+				case NOT:
+				case TOKEN_REF:
+				case RULE_REF:
+					{
+					}
+					break;
+				default:
+					throw new NoViableAltException(this);
+				}
+				}
+				break;
+			case 3:
+				enterOuterAlt(_localctx, 3);
+				{
+				setState(336);
+				atom();
+				setState(339);
+				_errHandler.sync(this);
+				switch (_input.LA(1)) {
+				case PLUS:
+				case QM:
+				case STAR:
+					{
+					setState(337);
+					ebnfSuffix();
+					}
+					break;
+				case TREE_BEGIN:
+				case REWRITE:
+				case CHAR_LITERAL:
+				case STRING_LITERAL:
+				case BEGIN_ACTION:
+				case DOT:
+				case LPAREN:
+				case OR:
+				case RPAREN:
+				case SEMI:
+				case NOT:
+				case TOKEN_REF:
+				case RULE_REF:
+					{
+					}
+					break;
+				default:
+					throw new NoViableAltException(this);
+				}
+				}
+				break;
+			case 4:
+				enterOuterAlt(_localctx, 4);
+				{
+				setState(341);
+				ebnf();
+				}
+				break;
+			case 5:
+				enterOuterAlt(_localctx, 5);
+				{
+				setState(342);
+				actionBlock();
+				}
+				break;
+			case 6:
+				enterOuterAlt(_localctx, 6);
+				{
+				setState(343);
+				actionBlock();
+				setState(344);
+				match(QM);
+				setState(347);
+				_errHandler.sync(this);
+				switch (_input.LA(1)) {
+				case SEMPREDOP:
+					{
+					setState(345);
+					match(SEMPREDOP);
+					}
+					break;
+				case TREE_BEGIN:
+				case REWRITE:
+				case CHAR_LITERAL:
+				case STRING_LITERAL:
+				case BEGIN_ACTION:
+				case DOT:
+				case LPAREN:
+				case OR:
+				case RPAREN:
+				case SEMI:
+				case NOT:
+				case TOKEN_REF:
+				case RULE_REF:
+					{
+					}
+					break;
+				default:
+					throw new NoViableAltException(this);
+				}
+				}
+				break;
+			case 7:
+				enterOuterAlt(_localctx, 7);
+				{
+				setState(349);
+				treeSpec();
+				setState(352);
+				_errHandler.sync(this);
+				switch (_input.LA(1)) {
+				case PLUS:
+				case QM:
+				case STAR:
+					{
+					setState(350);
+					ebnfSuffix();
+					}
+					break;
+				case TREE_BEGIN:
+				case REWRITE:
+				case CHAR_LITERAL:
+				case STRING_LITERAL:
+				case BEGIN_ACTION:
+				case DOT:
+				case LPAREN:
+				case OR:
+				case RPAREN:
+				case SEMI:
+				case NOT:
+				case TOKEN_REF:
+				case RULE_REF:
+					{
+					}
+					break;
+				default:
+					throw new NoViableAltException(this);
+				}
+				}
+				break;
+			}
+		}
+		catch (RecognitionException re) {
+			_localctx.exception = re;
+			_errHandler.reportError(this, re);
+			_errHandler.recover(this, re);
+		}
+		finally {
+			exitRule();
+		}
+		return _localctx;
+	}
+
+	public static class ActionBlockContext extends ParserRuleContext {
+		public TerminalNode BEGIN_ACTION() { return getToken(ANTLRv3Parser.BEGIN_ACTION, 0); }
+		public TerminalNode END_ACTION() { return getToken(ANTLRv3Parser.END_ACTION, 0); }
+		public List<TerminalNode> ACTION_CONTENT() { return getTokens(ANTLRv3Parser.ACTION_CONTENT); }
+		public TerminalNode ACTION_CONTENT(int i) {
+			return getToken(ANTLRv3Parser.ACTION_CONTENT, i);
+		}
+		public ActionBlockContext(ParserRuleContext parent, int invokingState) {
+			super(parent, invokingState);
+		}
+		@Override public int getRuleIndex() { return RULE_actionBlock; }
+		@Override
+		public void enterRule(ParseTreeListener listener) {
+			if ( listener instanceof ANTLRv3ParserListener ) ((ANTLRv3ParserListener)listener).enterActionBlock(this);
+		}
+		@Override
+		public void exitRule(ParseTreeListener listener) {
+			if ( listener instanceof ANTLRv3ParserListener ) ((ANTLRv3ParserListener)listener).exitActionBlock(this);
+		}
+	}
+
+	public final ActionBlockContext actionBlock() throws RecognitionException {
+		ActionBlockContext _localctx = new ActionBlockContext(_ctx, getState());
+		enterRule(_localctx, 42, RULE_actionBlock);
+		int _la;
+		try {
+			enterOuterAlt(_localctx, 1);
+			{
+			setState(356);
+			match(BEGIN_ACTION);
+			setState(360);
+			_errHandler.sync(this);
+			_la = _input.LA(1);
+			while (_la==ACTION_CONTENT) {
+				{
+				{
+				setState(357);
+				match(ACTION_CONTENT);
+				}
+				}
+				setState(362);
+				_errHandler.sync(this);
+				_la = _input.LA(1);
+			}
+			setState(363);
+			match(END_ACTION);
+			}
+		}
+		catch (RecognitionException re) {
+			_localctx.exception = re;
+			_errHandler.reportError(this, re);
+			_errHandler.recover(this, re);
+		}
+		finally {
+			exitRule();
+		}
+		return _localctx;
+	}
+
+	public static class ArgActionBlockContext extends ParserRuleContext {
+		public TerminalNode BEGIN_ARGUMENT() { return getToken(ANTLRv3Parser.BEGIN_ARGUMENT, 0); }
+		public TerminalNode END_ARGUMENT() { return getToken(ANTLRv3Parser.END_ARGUMENT, 0); }
+		public List<TerminalNode> ARGUMENT_CONTENT() { return getTokens(ANTLRv3Parser.ARGUMENT_CONTENT); }
+		public TerminalNode ARGUMENT_CONTENT(int i) {
+			return getToken(ANTLRv3Parser.ARGUMENT_CONTENT, i);
+		}
+		public ArgActionBlockContext(ParserRuleContext parent, int invokingState) {
+			super(parent, invokingState);
+		}
+		@Override public int getRuleIndex() { return RULE_argActionBlock; }
+		@Override
+		public void enterRule(ParseTreeListener listener) {
+			if ( listener instanceof ANTLRv3ParserListener ) ((ANTLRv3ParserListener)listener).enterArgActionBlock(this);
+		}
+		@Override
+		public void exitRule(ParseTreeListener listener) {
+			if ( listener instanceof ANTLRv3ParserListener ) ((ANTLRv3ParserListener)listener).exitArgActionBlock(this);
+		}
+	}
+
+	public final ArgActionBlockContext argActionBlock() throws RecognitionException {
+		ArgActionBlockContext _localctx = new ArgActionBlockContext(_ctx, getState());
+		enterRule(_localctx, 44, RULE_argActionBlock);
+		int _la;
+		try {
+			enterOuterAlt(_localctx, 1);
+			{
+			setState(365);
+			match(BEGIN_ARGUMENT);
+			setState(369);
+			_errHandler.sync(this);
+			_la = _input.LA(1);
+			while (_la==ARGUMENT_CONTENT) {
+				{
+				{
+				setState(366);
+				match(ARGUMENT_CONTENT);
+				}
+				}
+				setState(371);
+				_errHandler.sync(this);
+				_la = _input.LA(1);
+			}
+			setState(372);
+			match(END_ARGUMENT);
+			}
+		}
+		catch (RecognitionException re) {
+			_localctx.exception = re;
+			_errHandler.reportError(this, re);
+			_errHandler.recover(this, re);
+		}
+		finally {
+			exitRule();
+		}
+		return _localctx;
+	}
+
+	public static class AtomContext extends ParserRuleContext {
+		public Range_Context range_() {
+			return getRuleContext(Range_Context.class,0);
+		}
+		public TerminalNode ROOT() { return getToken(ANTLRv3Parser.ROOT, 0); }
+		public TerminalNode BANG() { return getToken(ANTLRv3Parser.BANG, 0); }
+		public Terminal_Context terminal_() {
+			return getRuleContext(Terminal_Context.class,0);
+		}
+		public NotSetContext notSet() {
+			return getRuleContext(NotSetContext.class,0);
+		}
+		public TerminalNode RULE_REF() { return getToken(ANTLRv3Parser.RULE_REF, 0); }
+		public ArgActionBlockContext argActionBlock() {
+			return getRuleContext(ArgActionBlockContext.class,0);
+		}
+		public AtomContext(ParserRuleContext parent, int invokingState) {
+			super(parent, invokingState);
+		}
+		@Override public int getRuleIndex() { return RULE_atom; }
+		@Override
+		public void enterRule(ParseTreeListener listener) {
+			if ( listener instanceof ANTLRv3ParserListener ) ((ANTLRv3ParserListener)listener).enterAtom(this);
+		}
+		@Override
+		public void exitRule(ParseTreeListener listener) {
+			if ( listener instanceof ANTLRv3ParserListener ) ((ANTLRv3ParserListener)listener).exitAtom(this);
+		}
+	}
+
+	public final AtomContext atom() throws RecognitionException {
+		AtomContext _localctx = new AtomContext(_ctx, getState());
+		enterRule(_localctx, 46, RULE_atom);
+		int _la;
+		try {
+			setState(394);
+			_errHandler.sync(this);
+			switch ( getInterpreter().adaptivePredict(_input,48,_ctx) ) {
+			case 1:
+				enterOuterAlt(_localctx, 1);
+				{
+				setState(374);
+				range_();
+				setState(378);
+				_errHandler.sync(this);
+				switch (_input.LA(1)) {
+				case ROOT:
+					{
+					setState(375);
+					match(ROOT);
+					}
+					break;
+				case BANG:
+					{
+					setState(376);
+					match(BANG);
+					}
+					break;
+				case TREE_BEGIN:
+				case REWRITE:
+				case CHAR_LITERAL:
+				case STRING_LITERAL:
+				case BEGIN_ACTION:
+				case DOT:
+				case LPAREN:
+				case OR:
+				case PLUS:
+				case QM:
+				case RPAREN:
+				case SEMI:
+				case STAR:
+				case NOT:
+				case TOKEN_REF:
+				case RULE_REF:
+					{
+					}
+					break;
+				default:
+					throw new NoViableAltException(this);
+				}
+				}
+				break;
+			case 2:
+				enterOuterAlt(_localctx, 2);
+				{
+				setState(380);
+				terminal_();
+				}
+				break;
+			case 3:
+				enterOuterAlt(_localctx, 3);
+				{
+				setState(381);
+				notSet();
+				setState(385);
+				_errHandler.sync(this);
+				switch (_input.LA(1)) {
+				case ROOT:
+					{
+					setState(382);
+					match(ROOT);
+					}
+					break;
+				case BANG:
+					{
+					setState(383);
+					match(BANG);
+					}
+					break;
+				case TREE_BEGIN:
+				case REWRITE:
+				case CHAR_LITERAL:
+				case STRING_LITERAL:
+				case BEGIN_ACTION:
+				case DOT:
+				case LPAREN:
+				case OR:
+				case PLUS:
+				case QM:
+				case RPAREN:
+				case SEMI:
+				case STAR:
+				case NOT:
+				case TOKEN_REF:
+				case RULE_REF:
+					{
+					}
+					break;
+				default:
+					throw new NoViableAltException(this);
+				}
+				}
+				break;
+			case 4:
+				enterOuterAlt(_localctx, 4);
+				{
+				setState(387);
+				match(RULE_REF);
+				setState(389);
+				_errHandler.sync(this);
+				_la = _input.LA(1);
+				if (_la==BEGIN_ARGUMENT) {
+					{
+					setState(388);
+					argActionBlock();
+					}
+				}
+
+				setState(392);
+				_errHandler.sync(this);
+				_la = _input.LA(1);
+				if (_la==ROOT || _la==BANG) {
+					{
+					setState(391);
+					_la = _input.LA(1);
+					if ( !(_la==ROOT || _la==BANG) ) {
+					_errHandler.recoverInline(this);
+					}
+					else {
+						if ( _input.LA(1)==Token.EOF ) matchedEOF = true;
+						_errHandler.reportMatch(this);
+						consume();
+					}
+					}
+				}
+
+				}
+				break;
+			}
+		}
+		catch (RecognitionException re) {
+			_localctx.exception = re;
+			_errHandler.reportError(this, re);
+			_errHandler.recover(this, re);
+		}
+		finally {
+			exitRule();
+		}
+		return _localctx;
+	}
+
+	public static class NotSetContext extends ParserRuleContext {
+		public TerminalNode NOT() { return getToken(ANTLRv3Parser.NOT, 0); }
+		public NotTerminalContext notTerminal() {
+			return getRuleContext(NotTerminalContext.class,0);
+		}
+		public BlockContext block() {
+			return getRuleContext(BlockContext.class,0);
+		}
+		public NotSetContext(ParserRuleContext parent, int invokingState) {
+			super(parent, invokingState);
+		}
+		@Override public int getRuleIndex() { return RULE_notSet; }
+		@Override
+		public void enterRule(ParseTreeListener listener) {
+			if ( listener instanceof ANTLRv3ParserListener ) ((ANTLRv3ParserListener)listener).enterNotSet(this);
+		}
+		@Override
+		public void exitRule(ParseTreeListener listener) {
+			if ( listener instanceof ANTLRv3ParserListener ) ((ANTLRv3ParserListener)listener).exitNotSet(this);
+		}
+	}
+
+	public final NotSetContext notSet() throws RecognitionException {
+		NotSetContext _localctx = new NotSetContext(_ctx, getState());
+		enterRule(_localctx, 48, RULE_notSet);
+		try {
+			enterOuterAlt(_localctx, 1);
+			{
+			setState(396);
+			match(NOT);
+			setState(399);
+			_errHandler.sync(this);
+			switch (_input.LA(1)) {
+			case CHAR_LITERAL:
+			case STRING_LITERAL:
+			case TOKEN_REF:
+				{
+				setState(397);
+				notTerminal();
+				}
+				break;
+			case LPAREN:
+				{
+				setState(398);
+				block();
+				}
+				break;
+			default:
+				throw new NoViableAltException(this);
+			}
+			}
+		}
+		catch (RecognitionException re) {
+			_localctx.exception = re;
+			_errHandler.reportError(this, re);
+			_errHandler.recover(this, re);
+		}
+		finally {
+			exitRule();
+		}
+		return _localctx;
+	}
+
+	public static class TreeSpecContext extends ParserRuleContext {
+		public TerminalNode TREE_BEGIN() { return getToken(ANTLRv3Parser.TREE_BEGIN, 0); }
+		public List<ElementContext> element() {
+			return getRuleContexts(ElementContext.class);
+		}
+		public ElementContext element(int i) {
+			return getRuleContext(ElementContext.class,i);
+		}
+		public TerminalNode RPAREN() { return getToken(ANTLRv3Parser.RPAREN, 0); }
+		public TreeSpecContext(ParserRuleContext parent, int invokingState) {
+			super(parent, invokingState);
+		}
+		@Override public int getRuleIndex() { return RULE_treeSpec; }
+		@Override
+		public void enterRule(ParseTreeListener listener) {
+			if ( listener instanceof ANTLRv3ParserListener ) ((ANTLRv3ParserListener)listener).enterTreeSpec(this);
+		}
+		@Override
+		public void exitRule(ParseTreeListener listener) {
+			if ( listener instanceof ANTLRv3ParserListener ) ((ANTLRv3ParserListener)listener).exitTreeSpec(this);
+		}
+	}
+
+	public final TreeSpecContext treeSpec() throws RecognitionException {
+		TreeSpecContext _localctx = new TreeSpecContext(_ctx, getState());
+		enterRule(_localctx, 50, RULE_treeSpec);
+		int _la;
+		try {
+			enterOuterAlt(_localctx, 1);
+			{
+			setState(401);
+			match(TREE_BEGIN);
+			setState(402);
+			element();
+			setState(404); 
+			_errHandler.sync(this);
+			_la = _input.LA(1);
+			do {
+				{
+				{
+				setState(403);
+				element();
+				}
+				}
+				setState(406); 
+				_errHandler.sync(this);
+				_la = _input.LA(1);
+			} while ( ((((_la - 34)) & ~0x3f) == 0 && ((1L << (_la - 34)) & ((1L << (TREE_BEGIN - 34)) | (1L << (CHAR_LITERAL - 34)) | (1L << (STRING_LITERAL - 34)) | (1L << (BEGIN_ACTION - 34)) | (1L << (DOT - 34)) | (1L << (LPAREN - 34)) | (1L << (NOT - 34)) | (1L << (TOKEN_REF - 34)) | (1L << (RULE_REF - 34)))) != 0) );
+			setState(408);
+			match(RPAREN);
+			}
+		}
+		catch (RecognitionException re) {
+			_localctx.exception = re;
+			_errHandler.reportError(this, re);
+			_errHandler.recover(this, re);
+		}
+		finally {
+			exitRule();
+		}
+		return _localctx;
+	}
+
+	public static class EbnfContext extends ParserRuleContext {
+		public BlockContext block() {
+			return getRuleContext(BlockContext.class,0);
+		}
+		public TerminalNode QM() { return getToken(ANTLRv3Parser.QM, 0); }
+		public TerminalNode STAR() { return getToken(ANTLRv3Parser.STAR, 0); }
+		public TerminalNode PLUS() { return getToken(ANTLRv3Parser.PLUS, 0); }
+		public TerminalNode SEMPREDOP() { return getToken(ANTLRv3Parser.SEMPREDOP, 0); }
+		public EbnfContext(ParserRuleContext parent, int invokingState) {
+			super(parent, invokingState);
+		}
+		@Override public int getRuleIndex() { return RULE_ebnf; }
+		@Override
+		public void enterRule(ParseTreeListener listener) {
+			if ( listener instanceof ANTLRv3ParserListener ) ((ANTLRv3ParserListener)listener).enterEbnf(this);
+		}
+		@Override
+		public void exitRule(ParseTreeListener listener) {
+			if ( listener instanceof ANTLRv3ParserListener ) ((ANTLRv3ParserListener)listener).exitEbnf(this);
+		}
+	}
+
+	public final EbnfContext ebnf() throws RecognitionException {
+		EbnfContext _localctx = new EbnfContext(_ctx, getState());
+		enterRule(_localctx, 52, RULE_ebnf);
+		try {
+			enterOuterAlt(_localctx, 1);
+			{
+			setState(410);
+			block();
+			setState(416);
+			_errHandler.sync(this);
+			switch (_input.LA(1)) {
+			case QM:
+				{
+				setState(411);
+				match(QM);
+				}
+				break;
+			case STAR:
+				{
+				setState(412);
+				match(STAR);
+				}
+				break;
+			case PLUS:
+				{
+				setState(413);
+				match(PLUS);
+				}
+				break;
+			case SEMPREDOP:
+				{
+				setState(414);
+				match(SEMPREDOP);
+				}
+				break;
+			case TREE_BEGIN:
+			case REWRITE:
+			case CHAR_LITERAL:
+			case STRING_LITERAL:
+			case BEGIN_ACTION:
+			case DOT:
+			case LPAREN:
+			case OR:
+			case RPAREN:
+			case SEMI:
+			case NOT:
+			case TOKEN_REF:
+			case RULE_REF:
+				{
+				}
+				break;
+			default:
+				throw new NoViableAltException(this);
+			}
+			}
+		}
+		catch (RecognitionException re) {
+			_localctx.exception = re;
+			_errHandler.reportError(this, re);
+			_errHandler.recover(this, re);
+		}
+		finally {
+			exitRule();
+		}
+		return _localctx;
+	}
+
+	public static class Range_Context extends ParserRuleContext {
+		public List<TerminalNode> CHAR_LITERAL() { return getTokens(ANTLRv3Parser.CHAR_LITERAL); }
+		public TerminalNode CHAR_LITERAL(int i) {
+			return getToken(ANTLRv3Parser.CHAR_LITERAL, i);
+		}
+		public TerminalNode RANGE() { return getToken(ANTLRv3Parser.RANGE, 0); }
+		public Range_Context(ParserRuleContext parent, int invokingState) {
+			super(parent, invokingState);
+		}
+		@Override public int getRuleIndex() { return RULE_range_; }
+		@Override
+		public void enterRule(ParseTreeListener listener) {
+			if ( listener instanceof ANTLRv3ParserListener ) ((ANTLRv3ParserListener)listener).enterRange_(this);
+		}
+		@Override
+		public void exitRule(ParseTreeListener listener) {
+			if ( listener instanceof ANTLRv3ParserListener ) ((ANTLRv3ParserListener)listener).exitRange_(this);
+		}
+	}
+
+	public final Range_Context range_() throws RecognitionException {
+		Range_Context _localctx = new Range_Context(_ctx, getState());
+		enterRule(_localctx, 54, RULE_range_);
+		try {
+			enterOuterAlt(_localctx, 1);
+			{
+			setState(418);
+			match(CHAR_LITERAL);
+			setState(419);
+			match(RANGE);
+			setState(420);
+			match(CHAR_LITERAL);
+			}
+		}
+		catch (RecognitionException re) {
+			_localctx.exception = re;
+			_errHandler.reportError(this, re);
+			_errHandler.recover(this, re);
+		}
+		finally {
+			exitRule();
+		}
+		return _localctx;
+	}
+
+	public static class Terminal_Context extends ParserRuleContext {
+		public TerminalNode CHAR_LITERAL() { return getToken(ANTLRv3Parser.CHAR_LITERAL, 0); }
+		public TerminalNode TOKEN_REF() { return getToken(ANTLRv3Parser.TOKEN_REF, 0); }
+		public TerminalNode STRING_LITERAL() { return getToken(ANTLRv3Parser.STRING_LITERAL, 0); }
+		public TerminalNode DOT() { return getToken(ANTLRv3Parser.DOT, 0); }
+		public ArgActionBlockContext argActionBlock() {
+			return getRuleContext(ArgActionBlockContext.class,0);
+		}
+		public TerminalNode ROOT() { return getToken(ANTLRv3Parser.ROOT, 0); }
+		public TerminalNode BANG() { return getToken(ANTLRv3Parser.BANG, 0); }
+		public Terminal_Context(ParserRuleContext parent, int invokingState) {
+			super(parent, invokingState);
+		}
+		@Override public int getRuleIndex() { return RULE_terminal_; }
+		@Override
+		public void enterRule(ParseTreeListener listener) {
+			if ( listener instanceof ANTLRv3ParserListener ) ((ANTLRv3ParserListener)listener).enterTerminal_(this);
+		}
+		@Override
+		public void exitRule(ParseTreeListener listener) {
+			if ( listener instanceof ANTLRv3ParserListener ) ((ANTLRv3ParserListener)listener).exitTerminal_(this);
+		}
+	}
+
+	public final Terminal_Context terminal_() throws RecognitionException {
+		Terminal_Context _localctx = new Terminal_Context(_ctx, getState());
+		enterRule(_localctx, 56, RULE_terminal_);
+		int _la;
+		try {
+			enterOuterAlt(_localctx, 1);
+			{
+			setState(430);
+			_errHandler.sync(this);
+			switch (_input.LA(1)) {
+			case CHAR_LITERAL:
+				{
+				setState(422);
+				match(CHAR_LITERAL);
+				}
+				break;
+			case TOKEN_REF:
+				{
+				setState(423);
+				match(TOKEN_REF);
+				setState(426);
+				_errHandler.sync(this);
+				switch (_input.LA(1)) {
+				case BEGIN_ARGUMENT:
+					{
+					setState(424);
+					argActionBlock();
+					}
+					break;
+				case TREE_BEGIN:
+				case ROOT:
+				case BANG:
+				case REWRITE:
+				case CHAR_LITERAL:
+				case STRING_LITERAL:
+				case BEGIN_ACTION:
+				case DOT:
+				case LPAREN:
+				case OR:
+				case PLUS:
+				case QM:
+				case RPAREN:
+				case SEMI:
+				case STAR:
+				case NOT:
+				case TOKEN_REF:
+				case RULE_REF:
+					{
+					}
+					break;
+				default:
+					throw new NoViableAltException(this);
+				}
+				}
+				break;
+			case STRING_LITERAL:
+				{
+				setState(428);
+				match(STRING_LITERAL);
+				}
+				break;
+			case DOT:
+				{
+				setState(429);
+				match(DOT);
+				}
+				break;
+			default:
+				throw new NoViableAltException(this);
+			}
+			setState(433);
+			_errHandler.sync(this);
+			_la = _input.LA(1);
+			if (_la==ROOT || _la==BANG) {
+				{
+				setState(432);
+				_la = _input.LA(1);
+				if ( !(_la==ROOT || _la==BANG) ) {
+				_errHandler.recoverInline(this);
+				}
+				else {
+					if ( _input.LA(1)==Token.EOF ) matchedEOF = true;
+					_errHandler.reportMatch(this);
+					consume();
+				}
+				}
+			}
+
+			}
+		}
+		catch (RecognitionException re) {
+			_localctx.exception = re;
+			_errHandler.reportError(this, re);
+			_errHandler.recover(this, re);
+		}
+		finally {
+			exitRule();
+		}
+		return _localctx;
+	}
+
+	public static class NotTerminalContext extends ParserRuleContext {
+		public TerminalNode CHAR_LITERAL() { return getToken(ANTLRv3Parser.CHAR_LITERAL, 0); }
+		public TerminalNode TOKEN_REF() { return getToken(ANTLRv3Parser.TOKEN_REF, 0); }
+		public TerminalNode STRING_LITERAL() { return getToken(ANTLRv3Parser.STRING_LITERAL, 0); }
+		public NotTerminalContext(ParserRuleContext parent, int invokingState) {
+			super(parent, invokingState);
+		}
+		@Override public int getRuleIndex() { return RULE_notTerminal; }
+		@Override
+		public void enterRule(ParseTreeListener listener) {
+			if ( listener instanceof ANTLRv3ParserListener ) ((ANTLRv3ParserListener)listener).enterNotTerminal(this);
+		}
+		@Override
+		public void exitRule(ParseTreeListener listener) {
+			if ( listener instanceof ANTLRv3ParserListener ) ((ANTLRv3ParserListener)listener).exitNotTerminal(this);
+		}
+	}
+
+	public final NotTerminalContext notTerminal() throws RecognitionException {
+		NotTerminalContext _localctx = new NotTerminalContext(_ctx, getState());
+		enterRule(_localctx, 58, RULE_notTerminal);
+		int _la;
+		try {
+			enterOuterAlt(_localctx, 1);
+			{
+			setState(435);
+			_la = _input.LA(1);
+			if ( !(((((_la - 42)) & ~0x3f) == 0 && ((1L << (_la - 42)) & ((1L << (CHAR_LITERAL - 42)) | (1L << (STRING_LITERAL - 42)) | (1L << (TOKEN_REF - 42)))) != 0)) ) {
+			_errHandler.recoverInline(this);
+			}
+			else {
+				if ( _input.LA(1)==Token.EOF ) matchedEOF = true;
+				_errHandler.reportMatch(this);
+				consume();
+			}
+			}
+		}
+		catch (RecognitionException re) {
+			_localctx.exception = re;
+			_errHandler.reportError(this, re);
+			_errHandler.recover(this, re);
+		}
+		finally {
+			exitRule();
+		}
+		return _localctx;
+	}
+
+	public static class EbnfSuffixContext extends ParserRuleContext {
+		public TerminalNode QM() { return getToken(ANTLRv3Parser.QM, 0); }
+		public TerminalNode STAR() { return getToken(ANTLRv3Parser.STAR, 0); }
+		public TerminalNode PLUS() { return getToken(ANTLRv3Parser.PLUS, 0); }
+		public EbnfSuffixContext(ParserRuleContext parent, int invokingState) {
+			super(parent, invokingState);
+		}
+		@Override public int getRuleIndex() { return RULE_ebnfSuffix; }
+		@Override
+		public void enterRule(ParseTreeListener listener) {
+			if ( listener instanceof ANTLRv3ParserListener ) ((ANTLRv3ParserListener)listener).enterEbnfSuffix(this);
+		}
+		@Override
+		public void exitRule(ParseTreeListener listener) {
+			if ( listener instanceof ANTLRv3ParserListener ) ((ANTLRv3ParserListener)listener).exitEbnfSuffix(this);
+		}
+	}
+
+	public final EbnfSuffixContext ebnfSuffix() throws RecognitionException {
+		EbnfSuffixContext _localctx = new EbnfSuffixContext(_ctx, getState());
+		enterRule(_localctx, 60, RULE_ebnfSuffix);
+		int _la;
+		try {
+			enterOuterAlt(_localctx, 1);
+			{
+			setState(437);
+			_la = _input.LA(1);
+			if ( !(((((_la - 69)) & ~0x3f) == 0 && ((1L << (_la - 69)) & ((1L << (PLUS - 69)) | (1L << (QM - 69)) | (1L << (STAR - 69)))) != 0)) ) {
+			_errHandler.recoverInline(this);
+			}
+			else {
+				if ( _input.LA(1)==Token.EOF ) matchedEOF = true;
+				_errHandler.reportMatch(this);
+				consume();
+			}
+			}
+		}
+		catch (RecognitionException re) {
+			_localctx.exception = re;
+			_errHandler.reportError(this, re);
+			_errHandler.recover(this, re);
+		}
+		finally {
+			exitRule();
+		}
+		return _localctx;
+	}
+
+	public static class RewriteContext extends ParserRuleContext {
+		public List<TerminalNode> REWRITE() { return getTokens(ANTLRv3Parser.REWRITE); }
+		public TerminalNode REWRITE(int i) {
+			return getToken(ANTLRv3Parser.REWRITE, i);
+		}
+		public List<Rewrite_alternativeContext> rewrite_alternative() {
+			return getRuleContexts(Rewrite_alternativeContext.class);
+		}
+		public Rewrite_alternativeContext rewrite_alternative(int i) {
+			return getRuleContext(Rewrite_alternativeContext.class,i);
+		}
+		public List<ActionBlockContext> actionBlock() {
+			return getRuleContexts(ActionBlockContext.class);
+		}
+		public ActionBlockContext actionBlock(int i) {
+			return getRuleContext(ActionBlockContext.class,i);
+		}
+		public List<TerminalNode> QM() { return getTokens(ANTLRv3Parser.QM); }
+		public TerminalNode QM(int i) {
+			return getToken(ANTLRv3Parser.QM, i);
+		}
+		public RewriteContext(ParserRuleContext parent, int invokingState) {
+			super(parent, invokingState);
+		}
+		@Override public int getRuleIndex() { return RULE_rewrite; }
+		@Override
+		public void enterRule(ParseTreeListener listener) {
+			if ( listener instanceof ANTLRv3ParserListener ) ((ANTLRv3ParserListener)listener).enterRewrite(this);
+		}
+		@Override
+		public void exitRule(ParseTreeListener listener) {
+			if ( listener instanceof ANTLRv3ParserListener ) ((ANTLRv3ParserListener)listener).exitRewrite(this);
+		}
+	}
+
+	public final RewriteContext rewrite() throws RecognitionException {
+		RewriteContext _localctx = new RewriteContext(_ctx, getState());
+		enterRule(_localctx, 62, RULE_rewrite);
+		try {
+			int _alt;
+			setState(452);
+			_errHandler.sync(this);
+			switch (_input.LA(1)) {
+			case REWRITE:
+				enterOuterAlt(_localctx, 1);
+				{
+				setState(446);
+				_errHandler.sync(this);
+				_alt = getInterpreter().adaptivePredict(_input,55,_ctx);
+				while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) {
+					if ( _alt==1 ) {
+						{
+						{
+						setState(439);
+						match(REWRITE);
+						setState(440);
+						actionBlock();
+						setState(441);
+						match(QM);
+						setState(442);
+						rewrite_alternative();
+						}
+						} 
+					}
+					setState(448);
+					_errHandler.sync(this);
+					_alt = getInterpreter().adaptivePredict(_input,55,_ctx);
+				}
+				setState(449);
+				match(REWRITE);
+				setState(450);
+				rewrite_alternative();
+				}
+				break;
+			case OR:
+			case RPAREN:
+			case SEMI:
+				enterOuterAlt(_localctx, 2);
+				{
+				}
+				break;
+			default:
+				throw new NoViableAltException(this);
+			}
+		}
+		catch (RecognitionException re) {
+			_localctx.exception = re;
+			_errHandler.reportError(this, re);
+			_errHandler.recover(this, re);
+		}
+		finally {
+			exitRule();
+		}
+		return _localctx;
+	}
+
+	public static class Rewrite_alternativeContext extends ParserRuleContext {
+		public Rewrite_templateContext rewrite_template() {
+			return getRuleContext(Rewrite_templateContext.class,0);
+		}
+		public Rewrite_tree_alternativeContext rewrite_tree_alternative() {
+			return getRuleContext(Rewrite_tree_alternativeContext.class,0);
+		}
+		public Rewrite_alternativeContext(ParserRuleContext parent, int invokingState) {
+			super(parent, invokingState);
+		}
+		@Override public int getRuleIndex() { return RULE_rewrite_alternative; }
+		@Override
+		public void enterRule(ParseTreeListener listener) {
+			if ( listener instanceof ANTLRv3ParserListener ) ((ANTLRv3ParserListener)listener).enterRewrite_alternative(this);
+		}
+		@Override
+		public void exitRule(ParseTreeListener listener) {
+			if ( listener instanceof ANTLRv3ParserListener ) ((ANTLRv3ParserListener)listener).exitRewrite_alternative(this);
+		}
+	}
+
+	public final Rewrite_alternativeContext rewrite_alternative() throws RecognitionException {
+		Rewrite_alternativeContext _localctx = new Rewrite_alternativeContext(_ctx, getState());
+		enterRule(_localctx, 64, RULE_rewrite_alternative);
+		try {
+			setState(457);
+			_errHandler.sync(this);
+			switch ( getInterpreter().adaptivePredict(_input,57,_ctx) ) {
+			case 1:
+				enterOuterAlt(_localctx, 1);
+				{
+				setState(454);
+				rewrite_template();
+				}
+				break;
+			case 2:
+				enterOuterAlt(_localctx, 2);
+				{
+				setState(455);
+				rewrite_tree_alternative();
+				}
+				break;
+			case 3:
+				enterOuterAlt(_localctx, 3);
+				{
+				}
+				break;
+			}
+		}
+		catch (RecognitionException re) {
+			_localctx.exception = re;
+			_errHandler.reportError(this, re);
+			_errHandler.recover(this, re);
+		}
+		finally {
+			exitRule();
+		}
+		return _localctx;
+	}
+
+	public static class Rewrite_tree_blockContext extends ParserRuleContext {
+		public TerminalNode LPAREN() { return getToken(ANTLRv3Parser.LPAREN, 0); }
+		public Rewrite_tree_alternativeContext rewrite_tree_alternative() {
+			return getRuleContext(Rewrite_tree_alternativeContext.class,0);
+		}
+		public TerminalNode RPAREN() { return getToken(ANTLRv3Parser.RPAREN, 0); }
+		public Rewrite_tree_blockContext(ParserRuleContext parent, int invokingState) {
+			super(parent, invokingState);
+		}
+		@Override public int getRuleIndex() { return RULE_rewrite_tree_block; }
+		@Override
+		public void enterRule(ParseTreeListener listener) {
+			if ( listener instanceof ANTLRv3ParserListener ) ((ANTLRv3ParserListener)listener).enterRewrite_tree_block(this);
+		}
+		@Override
+		public void exitRule(ParseTreeListener listener) {
+			if ( listener instanceof ANTLRv3ParserListener ) ((ANTLRv3ParserListener)listener).exitRewrite_tree_block(this);
+		}
+	}
+
+	public final Rewrite_tree_blockContext rewrite_tree_block() throws RecognitionException {
+		Rewrite_tree_blockContext _localctx = new Rewrite_tree_blockContext(_ctx, getState());
+		enterRule(_localctx, 66, RULE_rewrite_tree_block);
+		try {
+			enterOuterAlt(_localctx, 1);
+			{
+			setState(459);
+			match(LPAREN);
+			setState(460);
+			rewrite_tree_alternative();
+			setState(461);
+			match(RPAREN);
+			}
+		}
+		catch (RecognitionException re) {
+			_localctx.exception = re;
+			_errHandler.reportError(this, re);
+			_errHandler.recover(this, re);
+		}
+		finally {
+			exitRule();
+		}
+		return _localctx;
+	}
+
+	public static class Rewrite_tree_alternativeContext extends ParserRuleContext {
+		public List<Rewrite_tree_elementContext> rewrite_tree_element() {
+			return getRuleContexts(Rewrite_tree_elementContext.class);
+		}
+		public Rewrite_tree_elementContext rewrite_tree_element(int i) {
+			return getRuleContext(Rewrite_tree_elementContext.class,i);
+		}
+		public Rewrite_tree_alternativeContext(ParserRuleContext parent, int invokingState) {
+			super(parent, invokingState);
+		}
+		@Override public int getRuleIndex() { return RULE_rewrite_tree_alternative; }
+		@Override
+		public void enterRule(ParseTreeListener listener) {
+			if ( listener instanceof ANTLRv3ParserListener ) ((ANTLRv3ParserListener)listener).enterRewrite_tree_alternative(this);
+		}
+		@Override
+		public void exitRule(ParseTreeListener listener) {
+			if ( listener instanceof ANTLRv3ParserListener ) ((ANTLRv3ParserListener)listener).exitRewrite_tree_alternative(this);
+		}
+	}
+
+	public final Rewrite_tree_alternativeContext rewrite_tree_alternative() throws RecognitionException {
+		Rewrite_tree_alternativeContext _localctx = new Rewrite_tree_alternativeContext(_ctx, getState());
+		enterRule(_localctx, 68, RULE_rewrite_tree_alternative);
+		int _la;
+		try {
+			enterOuterAlt(_localctx, 1);
+			{
+			setState(464); 
+			_errHandler.sync(this);
+			_la = _input.LA(1);
+			do {
+				{
+				{
+				setState(463);
+				rewrite_tree_element();
+				}
+				}
+				setState(466); 
+				_errHandler.sync(this);
+				_la = _input.LA(1);
+			} while ( ((((_la - 34)) & ~0x3f) == 0 && ((1L << (_la - 34)) & ((1L << (TREE_BEGIN - 34)) | (1L << (CHAR_LITERAL - 34)) | (1L << (STRING_LITERAL - 34)) | (1L << (BEGIN_ACTION - 34)) | (1L << (LPAREN - 34)) | (1L << (DOLLAR - 34)) | (1L << (TOKEN_REF - 34)) | (1L << (RULE_REF - 34)))) != 0) );
+			}
+		}
+		catch (RecognitionException re) {
+			_localctx.exception = re;
+			_errHandler.reportError(this, re);
+			_errHandler.recover(this, re);
+		}
+		finally {
+			exitRule();
+		}
+		return _localctx;
+	}
+
+	public static class Rewrite_tree_elementContext extends ParserRuleContext {
+		public Rewrite_tree_atomContext rewrite_tree_atom() {
+			return getRuleContext(Rewrite_tree_atomContext.class,0);
+		}
+		public EbnfSuffixContext ebnfSuffix() {
+			return getRuleContext(EbnfSuffixContext.class,0);
+		}
+		public Rewrite_treeContext rewrite_tree() {
+			return getRuleContext(Rewrite_treeContext.class,0);
+		}
+		public Rewrite_tree_ebnfContext rewrite_tree_ebnf() {
+			return getRuleContext(Rewrite_tree_ebnfContext.class,0);
+		}
+		public Rewrite_tree_elementContext(ParserRuleContext parent, int invokingState) {
+			super(parent, invokingState);
+		}
+		@Override public int getRuleIndex() { return RULE_rewrite_tree_element; }
+		@Override
+		public void enterRule(ParseTreeListener listener) {
+			if ( listener instanceof ANTLRv3ParserListener ) ((ANTLRv3ParserListener)listener).enterRewrite_tree_element(this);
+		}
+		@Override
+		public void exitRule(ParseTreeListener listener) {
+			if ( listener instanceof ANTLRv3ParserListener ) ((ANTLRv3ParserListener)listener).exitRewrite_tree_element(this);
+		}
+	}
+
+	public final Rewrite_tree_elementContext rewrite_tree_element() throws RecognitionException {
+		Rewrite_tree_elementContext _localctx = new Rewrite_tree_elementContext(_ctx, getState());
+		enterRule(_localctx, 70, RULE_rewrite_tree_element);
+		try {
+			setState(478);
+			_errHandler.sync(this);
+			switch ( getInterpreter().adaptivePredict(_input,60,_ctx) ) {
+			case 1:
+				enterOuterAlt(_localctx, 1);
+				{
+				setState(468);
+				rewrite_tree_atom();
+				}
+				break;
+			case 2:
+				enterOuterAlt(_localctx, 2);
+				{
+				setState(469);
+				rewrite_tree_atom();
+				setState(470);
+				ebnfSuffix();
+				}
+				break;
+			case 3:
+				enterOuterAlt(_localctx, 3);
+				{
+				setState(472);
+				rewrite_tree();
+				setState(475);
+				_errHandler.sync(this);
+				switch (_input.LA(1)) {
+				case PLUS:
+				case QM:
+				case STAR:
+					{
+					setState(473);
+					ebnfSuffix();
+					}
+					break;
+				case TREE_BEGIN:
+				case REWRITE:
+				case CHAR_LITERAL:
+				case STRING_LITERAL:
+				case BEGIN_ACTION:
+				case LPAREN:
+				case OR:
+				case RPAREN:
+				case SEMI:
+				case DOLLAR:
+				case TOKEN_REF:
+				case RULE_REF:
+					{
+					}
+					break;
+				default:
+					throw new NoViableAltException(this);
+				}
+				}
+				break;
+			case 4:
+				enterOuterAlt(_localctx, 4);
+				{
+				setState(477);
+				rewrite_tree_ebnf();
+				}
+				break;
+			}
+		}
+		catch (RecognitionException re) {
+			_localctx.exception = re;
+			_errHandler.reportError(this, re);
+			_errHandler.recover(this, re);
+		}
+		finally {
+			exitRule();
+		}
+		return _localctx;
+	}
+
+	public static class Rewrite_tree_atomContext extends ParserRuleContext {
+		public TerminalNode CHAR_LITERAL() { return getToken(ANTLRv3Parser.CHAR_LITERAL, 0); }
+		public TerminalNode TOKEN_REF() { return getToken(ANTLRv3Parser.TOKEN_REF, 0); }
+		public ArgActionBlockContext argActionBlock() {
+			return getRuleContext(ArgActionBlockContext.class,0);
+		}
+		public TerminalNode RULE_REF() { return getToken(ANTLRv3Parser.RULE_REF, 0); }
+		public TerminalNode STRING_LITERAL() { return getToken(ANTLRv3Parser.STRING_LITERAL, 0); }
+		public TerminalNode DOLLAR() { return getToken(ANTLRv3Parser.DOLLAR, 0); }
+		public Id_Context id_() {
+			return getRuleContext(Id_Context.class,0);
+		}
+		public ActionBlockContext actionBlock() {
+			return getRuleContext(ActionBlockContext.class,0);
+		}
+		public Rewrite_tree_atomContext(ParserRuleContext parent, int invokingState) {
+			super(parent, invokingState);
+		}
+		@Override public int getRuleIndex() { return RULE_rewrite_tree_atom; }
+		@Override
+		public void enterRule(ParseTreeListener listener) {
+			if ( listener instanceof ANTLRv3ParserListener ) ((ANTLRv3ParserListener)listener).enterRewrite_tree_atom(this);
+		}
+		@Override
+		public void exitRule(ParseTreeListener listener) {
+			if ( listener instanceof ANTLRv3ParserListener ) ((ANTLRv3ParserListener)listener).exitRewrite_tree_atom(this);
+		}
+	}
+
+	public final Rewrite_tree_atomContext rewrite_tree_atom() throws RecognitionException {
+		Rewrite_tree_atomContext _localctx = new Rewrite_tree_atomContext(_ctx, getState());
+		enterRule(_localctx, 72, RULE_rewrite_tree_atom);
+		int _la;
+		try {
+			setState(490);
+			_errHandler.sync(this);
+			switch (_input.LA(1)) {
+			case CHAR_LITERAL:
+				enterOuterAlt(_localctx, 1);
+				{
+				setState(480);
+				match(CHAR_LITERAL);
+				}
+				break;
+			case TOKEN_REF:
+				enterOuterAlt(_localctx, 2);
+				{
+				setState(481);
+				match(TOKEN_REF);
+				setState(483);
+				_errHandler.sync(this);
+				_la = _input.LA(1);
+				if (_la==BEGIN_ARGUMENT) {
+					{
+					setState(482);
+					argActionBlock();
+					}
+				}
+
+				}
+				break;
+			case RULE_REF:
+				enterOuterAlt(_localctx, 3);
+				{
+				setState(485);
+				match(RULE_REF);
+				}
+				break;
+			case STRING_LITERAL:
+				enterOuterAlt(_localctx, 4);
+				{
+				setState(486);
+				match(STRING_LITERAL);
+				}
+				break;
+			case DOLLAR:
+				enterOuterAlt(_localctx, 5);
+				{
+				setState(487);
+				match(DOLLAR);
+				setState(488);
+				id_();
+				}
+				break;
+			case BEGIN_ACTION:
+				enterOuterAlt(_localctx, 6);
+				{
+				setState(489);
+				actionBlock();
+				}
+				break;
+			default:
+				throw new NoViableAltException(this);
+			}
+		}
+		catch (RecognitionException re) {
+			_localctx.exception = re;
+			_errHandler.reportError(this, re);
+			_errHandler.recover(this, re);
+		}
+		finally {
+			exitRule();
+		}
+		return _localctx;
+	}
+
+	public static class Rewrite_tree_ebnfContext extends ParserRuleContext {
+		public Rewrite_tree_blockContext rewrite_tree_block() {
+			return getRuleContext(Rewrite_tree_blockContext.class,0);
+		}
+		public EbnfSuffixContext ebnfSuffix() {
+			return getRuleContext(EbnfSuffixContext.class,0);
+		}
+		public Rewrite_tree_ebnfContext(ParserRuleContext parent, int invokingState) {
+			super(parent, invokingState);
+		}
+		@Override public int getRuleIndex() { return RULE_rewrite_tree_ebnf; }
+		@Override
+		public void enterRule(ParseTreeListener listener) {
+			if ( listener instanceof ANTLRv3ParserListener ) ((ANTLRv3ParserListener)listener).enterRewrite_tree_ebnf(this);
+		}
+		@Override
+		public void exitRule(ParseTreeListener listener) {
+			if ( listener instanceof ANTLRv3ParserListener ) ((ANTLRv3ParserListener)listener).exitRewrite_tree_ebnf(this);
+		}
+	}
+
+	public final Rewrite_tree_ebnfContext rewrite_tree_ebnf() throws RecognitionException {
+		Rewrite_tree_ebnfContext _localctx = new Rewrite_tree_ebnfContext(_ctx, getState());
+		enterRule(_localctx, 74, RULE_rewrite_tree_ebnf);
+		try {
+			enterOuterAlt(_localctx, 1);
+			{
+			setState(492);
+			rewrite_tree_block();
+			setState(493);
+			ebnfSuffix();
+			}
+		}
+		catch (RecognitionException re) {
+			_localctx.exception = re;
+			_errHandler.reportError(this, re);
+			_errHandler.recover(this, re);
+		}
+		finally {
+			exitRule();
+		}
+		return _localctx;
+	}
+
+	public static class Rewrite_treeContext extends ParserRuleContext {
+		public TerminalNode TREE_BEGIN() { return getToken(ANTLRv3Parser.TREE_BEGIN, 0); }
+		public Rewrite_tree_atomContext rewrite_tree_atom() {
+			return getRuleContext(Rewrite_tree_atomContext.class,0);
+		}
+		public TerminalNode RPAREN() { return getToken(ANTLRv3Parser.RPAREN, 0); }
+		public List<Rewrite_tree_elementContext> rewrite_tree_element() {
+			return getRuleContexts(Rewrite_tree_elementContext.class);
+		}
+		public Rewrite_tree_elementContext rewrite_tree_element(int i) {
+			return getRuleContext(Rewrite_tree_elementContext.class,i);
+		}
+		public Rewrite_treeContext(ParserRuleContext parent, int invokingState) {
+			super(parent, invokingState);
+		}
+		@Override public int getRuleIndex() { return RULE_rewrite_tree; }
+		@Override
+		public void enterRule(ParseTreeListener listener) {
+			if ( listener instanceof ANTLRv3ParserListener ) ((ANTLRv3ParserListener)listener).enterRewrite_tree(this);
+		}
+		@Override
+		public void exitRule(ParseTreeListener listener) {
+			if ( listener instanceof ANTLRv3ParserListener ) ((ANTLRv3ParserListener)listener).exitRewrite_tree(this);
+		}
+	}
+
+	public final Rewrite_treeContext rewrite_tree() throws RecognitionException {
+		Rewrite_treeContext _localctx = new Rewrite_treeContext(_ctx, getState());
+		enterRule(_localctx, 76, RULE_rewrite_tree);
+		int _la;
+		try {
+			enterOuterAlt(_localctx, 1);
+			{
+			setState(495);
+			match(TREE_BEGIN);
+			setState(496);
+			rewrite_tree_atom();
+			setState(500);
+			_errHandler.sync(this);
+			_la = _input.LA(1);
+			while (((((_la - 34)) & ~0x3f) == 0 && ((1L << (_la - 34)) & ((1L << (TREE_BEGIN - 34)) | (1L << (CHAR_LITERAL - 34)) | (1L << (STRING_LITERAL - 34)) | (1L << (BEGIN_ACTION - 34)) | (1L << (LPAREN - 34)) | (1L << (DOLLAR - 34)) | (1L << (TOKEN_REF - 34)) | (1L << (RULE_REF - 34)))) != 0)) {
+				{
+				{
+				setState(497);
+				rewrite_tree_element();
+				}
+				}
+				setState(502);
+				_errHandler.sync(this);
+				_la = _input.LA(1);
+			}
+			setState(503);
+			match(RPAREN);
+			}
+		}
+		catch (RecognitionException re) {
+			_localctx.exception = re;
+			_errHandler.reportError(this, re);
+			_errHandler.recover(this, re);
+		}
+		finally {
+			exitRule();
+		}
+		return _localctx;
+	}
+
+	public static class Rewrite_templateContext extends ParserRuleContext {
+		public Id_Context id_() {
+			return getRuleContext(Id_Context.class,0);
+		}
+		public TerminalNode LPAREN() { return getToken(ANTLRv3Parser.LPAREN, 0); }
+		public Rewrite_template_argsContext rewrite_template_args() {
+			return getRuleContext(Rewrite_template_argsContext.class,0);
+		}
+		public TerminalNode RPAREN() { return getToken(ANTLRv3Parser.RPAREN, 0); }
+		public TerminalNode DOUBLE_QUOTE_STRING_LITERAL() { return getToken(ANTLRv3Parser.DOUBLE_QUOTE_STRING_LITERAL, 0); }
+		public TerminalNode DOUBLE_ANGLE_STRING_LITERAL() { return getToken(ANTLRv3Parser.DOUBLE_ANGLE_STRING_LITERAL, 0); }
+		public Rewrite_template_refContext rewrite_template_ref() {
+			return getRuleContext(Rewrite_template_refContext.class,0);
+		}
+		public Rewrite_indirect_template_headContext rewrite_indirect_template_head() {
+			return getRuleContext(Rewrite_indirect_template_headContext.class,0);
+		}
+		public ActionBlockContext actionBlock() {
+			return getRuleContext(ActionBlockContext.class,0);
+		}
+		public Rewrite_templateContext(ParserRuleContext parent, int invokingState) {
+			super(parent, invokingState);
+		}
+		@Override public int getRuleIndex() { return RULE_rewrite_template; }
+		@Override
+		public void enterRule(ParseTreeListener listener) {
+			if ( listener instanceof ANTLRv3ParserListener ) ((ANTLRv3ParserListener)listener).enterRewrite_template(this);
+		}
+		@Override
+		public void exitRule(ParseTreeListener listener) {
+			if ( listener instanceof ANTLRv3ParserListener ) ((ANTLRv3ParserListener)listener).exitRewrite_template(this);
+		}
+	}
+
+	public final Rewrite_templateContext rewrite_template() throws RecognitionException {
+		Rewrite_templateContext _localctx = new Rewrite_templateContext(_ctx, getState());
+		enterRule(_localctx, 78, RULE_rewrite_template);
+		int _la;
+		try {
+			setState(514);
+			_errHandler.sync(this);
+			switch ( getInterpreter().adaptivePredict(_input,64,_ctx) ) {
+			case 1:
+				enterOuterAlt(_localctx, 1);
+				{
+				setState(505);
+				id_();
+				setState(506);
+				match(LPAREN);
+				setState(507);
+				rewrite_template_args();
+				setState(508);
+				match(RPAREN);
+				setState(509);
+				_la = _input.LA(1);
+				if ( !(_la==DOUBLE_QUOTE_STRING_LITERAL || _la==DOUBLE_ANGLE_STRING_LITERAL) ) {
+				_errHandler.recoverInline(this);
+				}
+				else {
+					if ( _input.LA(1)==Token.EOF ) matchedEOF = true;
+					_errHandler.reportMatch(this);
+					consume();
+				}
+				}
+				break;
+			case 2:
+				enterOuterAlt(_localctx, 2);
+				{
+				setState(511);
+				rewrite_template_ref();
+				}
+				break;
+			case 3:
+				enterOuterAlt(_localctx, 3);
+				{
+				setState(512);
+				rewrite_indirect_template_head();
+				}
+				break;
+			case 4:
+				enterOuterAlt(_localctx, 4);
+				{
+				setState(513);
+				actionBlock();
+				}
+				break;
+			}
+		}
+		catch (RecognitionException re) {
+			_localctx.exception = re;
+			_errHandler.reportError(this, re);
+			_errHandler.recover(this, re);
+		}
+		finally {
+			exitRule();
+		}
+		return _localctx;
+	}
+
+	public static class Rewrite_template_refContext extends ParserRuleContext {
+		public Id_Context id_() {
+			return getRuleContext(Id_Context.class,0);
+		}
+		public TerminalNode LPAREN() { return getToken(ANTLRv3Parser.LPAREN, 0); }
+		public Rewrite_template_argsContext rewrite_template_args() {
+			return getRuleContext(Rewrite_template_argsContext.class,0);
+		}
+		public TerminalNode RPAREN() { return getToken(ANTLRv3Parser.RPAREN, 0); }
+		public Rewrite_template_refContext(ParserRuleContext parent, int invokingState) {
+			super(parent, invokingState);
+		}
+		@Override public int getRuleIndex() { return RULE_rewrite_template_ref; }
+		@Override
+		public void enterRule(ParseTreeListener listener) {
+			if ( listener instanceof ANTLRv3ParserListener ) ((ANTLRv3ParserListener)listener).enterRewrite_template_ref(this);
+		}
+		@Override
+		public void exitRule(ParseTreeListener listener) {
+			if ( listener instanceof ANTLRv3ParserListener ) ((ANTLRv3ParserListener)listener).exitRewrite_template_ref(this);
+		}
+	}
+
+	public final Rewrite_template_refContext rewrite_template_ref() throws RecognitionException {
+		Rewrite_template_refContext _localctx = new Rewrite_template_refContext(_ctx, getState());
+		enterRule(_localctx, 80, RULE_rewrite_template_ref);
+		try {
+			enterOuterAlt(_localctx, 1);
+			{
+			setState(516);
+			id_();
+			setState(517);
+			match(LPAREN);
+			setState(518);
+			rewrite_template_args();
+			setState(519);
+			match(RPAREN);
+			}
+		}
+		catch (RecognitionException re) {
+			_localctx.exception = re;
+			_errHandler.reportError(this, re);
+			_errHandler.recover(this, re);
+		}
+		finally {
+			exitRule();
+		}
+		return _localctx;
+	}
+
+	public static class Rewrite_indirect_template_headContext extends ParserRuleContext {
+		public List<TerminalNode> LPAREN() { return getTokens(ANTLRv3Parser.LPAREN); }
+		public TerminalNode LPAREN(int i) {
+			return getToken(ANTLRv3Parser.LPAREN, i);
+		}
+		public ActionBlockContext actionBlock() {
+			return getRuleContext(ActionBlockContext.class,0);
+		}
+		public List<TerminalNode> RPAREN() { return getTokens(ANTLRv3Parser.RPAREN); }
+		public TerminalNode RPAREN(int i) {
+			return getToken(ANTLRv3Parser.RPAREN, i);
+		}
+		public Rewrite_template_argsContext rewrite_template_args() {
+			return getRuleContext(Rewrite_template_argsContext.class,0);
+		}
+		public Rewrite_indirect_template_headContext(ParserRuleContext parent, int invokingState) {
+			super(parent, invokingState);
+		}
+		@Override public int getRuleIndex() { return RULE_rewrite_indirect_template_head; }
+		@Override
+		public void enterRule(ParseTreeListener listener) {
+			if ( listener instanceof ANTLRv3ParserListener ) ((ANTLRv3ParserListener)listener).enterRewrite_indirect_template_head(this);
+		}
+		@Override
+		public void exitRule(ParseTreeListener listener) {
+			if ( listener instanceof ANTLRv3ParserListener ) ((ANTLRv3ParserListener)listener).exitRewrite_indirect_template_head(this);
+		}
+	}
+
+	public final Rewrite_indirect_template_headContext rewrite_indirect_template_head() throws RecognitionException {
+		Rewrite_indirect_template_headContext _localctx = new Rewrite_indirect_template_headContext(_ctx, getState());
+		enterRule(_localctx, 82, RULE_rewrite_indirect_template_head);
+		try {
+			enterOuterAlt(_localctx, 1);
+			{
+			setState(521);
+			match(LPAREN);
+			setState(522);
+			actionBlock();
+			setState(523);
+			match(RPAREN);
+			setState(524);
+			match(LPAREN);
+			setState(525);
+			rewrite_template_args();
+			setState(526);
+			match(RPAREN);
+			}
+		}
+		catch (RecognitionException re) {
+			_localctx.exception = re;
+			_errHandler.reportError(this, re);
+			_errHandler.recover(this, re);
+		}
+		finally {
+			exitRule();
+		}
+		return _localctx;
+	}
+
+	public static class Rewrite_template_argsContext extends ParserRuleContext {
+		public List<Rewrite_template_argContext> rewrite_template_arg() {
+			return getRuleContexts(Rewrite_template_argContext.class);
+		}
+		public Rewrite_template_argContext rewrite_template_arg(int i) {
+			return getRuleContext(Rewrite_template_argContext.class,i);
+		}
+		public List<TerminalNode> COMMA() { return getTokens(ANTLRv3Parser.COMMA); }
+		public TerminalNode COMMA(int i) {
+			return getToken(ANTLRv3Parser.COMMA, i);
+		}
+		public Rewrite_template_argsContext(ParserRuleContext parent, int invokingState) {
+			super(parent, invokingState);
+		}
+		@Override public int getRuleIndex() { return RULE_rewrite_template_args; }
+		@Override
+		public void enterRule(ParseTreeListener listener) {
+			if ( listener instanceof ANTLRv3ParserListener ) ((ANTLRv3ParserListener)listener).enterRewrite_template_args(this);
+		}
+		@Override
+		public void exitRule(ParseTreeListener listener) {
+			if ( listener instanceof ANTLRv3ParserListener ) ((ANTLRv3ParserListener)listener).exitRewrite_template_args(this);
+		}
+	}
+
+	public final Rewrite_template_argsContext rewrite_template_args() throws RecognitionException {
+		Rewrite_template_argsContext _localctx = new Rewrite_template_argsContext(_ctx, getState());
+		enterRule(_localctx, 84, RULE_rewrite_template_args);
+		int _la;
+		try {
+			setState(537);
+			_errHandler.sync(this);
+			switch (_input.LA(1)) {
+			case TOKEN_REF:
+			case RULE_REF:
+				enterOuterAlt(_localctx, 1);
+				{
+				setState(528);
+				rewrite_template_arg();
+				setState(533);
+				_errHandler.sync(this);
+				_la = _input.LA(1);
+				while (_la==COMMA) {
+					{
+					{
+					setState(529);
+					match(COMMA);
+					setState(530);
+					rewrite_template_arg();
+					}
+					}
+					setState(535);
+					_errHandler.sync(this);
+					_la = _input.LA(1);
+				}
+				}
+				break;
+			case RPAREN:
+				enterOuterAlt(_localctx, 2);
+				{
+				}
+				break;
+			default:
+				throw new NoViableAltException(this);
+			}
+		}
+		catch (RecognitionException re) {
+			_localctx.exception = re;
+			_errHandler.reportError(this, re);
+			_errHandler.recover(this, re);
+		}
+		finally {
+			exitRule();
+		}
+		return _localctx;
+	}
+
+	public static class Rewrite_template_argContext extends ParserRuleContext {
+		public Id_Context id_() {
+			return getRuleContext(Id_Context.class,0);
+		}
+		public TerminalNode EQUAL() { return getToken(ANTLRv3Parser.EQUAL, 0); }
+		public ActionBlockContext actionBlock() {
+			return getRuleContext(ActionBlockContext.class,0);
+		}
+		public Rewrite_template_argContext(ParserRuleContext parent, int invokingState) {
+			super(parent, invokingState);
+		}
+		@Override public int getRuleIndex() { return RULE_rewrite_template_arg; }
+		@Override
+		public void enterRule(ParseTreeListener listener) {
+			if ( listener instanceof ANTLRv3ParserListener ) ((ANTLRv3ParserListener)listener).enterRewrite_template_arg(this);
+		}
+		@Override
+		public void exitRule(ParseTreeListener listener) {
+			if ( listener instanceof ANTLRv3ParserListener ) ((ANTLRv3ParserListener)listener).exitRewrite_template_arg(this);
+		}
+	}
+
+	public final Rewrite_template_argContext rewrite_template_arg() throws RecognitionException {
+		Rewrite_template_argContext _localctx = new Rewrite_template_argContext(_ctx, getState());
+		enterRule(_localctx, 86, RULE_rewrite_template_arg);
+		try {
+			enterOuterAlt(_localctx, 1);
+			{
+			setState(539);
+			id_();
+			setState(540);
+			match(EQUAL);
+			setState(541);
+			actionBlock();
+			}
+		}
+		catch (RecognitionException re) {
+			_localctx.exception = re;
+			_errHandler.reportError(this, re);
+			_errHandler.recover(this, re);
+		}
+		finally {
+			exitRule();
+		}
+		return _localctx;
+	}
+
+	public static class Id_Context extends ParserRuleContext {
+		public TerminalNode TOKEN_REF() { return getToken(ANTLRv3Parser.TOKEN_REF, 0); }
+		public TerminalNode RULE_REF() { return getToken(ANTLRv3Parser.RULE_REF, 0); }
+		public Id_Context(ParserRuleContext parent, int invokingState) {
+			super(parent, invokingState);
+		}
+		@Override public int getRuleIndex() { return RULE_id_; }
+		@Override
+		public void enterRule(ParseTreeListener listener) {
+			if ( listener instanceof ANTLRv3ParserListener ) ((ANTLRv3ParserListener)listener).enterId_(this);
+		}
+		@Override
+		public void exitRule(ParseTreeListener listener) {
+			if ( listener instanceof ANTLRv3ParserListener ) ((ANTLRv3ParserListener)listener).exitId_(this);
+		}
+	}
+
+	public final Id_Context id_() throws RecognitionException {
+		Id_Context _localctx = new Id_Context(_ctx, getState());
+		enterRule(_localctx, 88, RULE_id_);
+		int _la;
+		try {
+			enterOuterAlt(_localctx, 1);
+			{
+			setState(543);
+			_la = _input.LA(1);
+			if ( !(_la==TOKEN_REF || _la==RULE_REF) ) {
+			_errHandler.recoverInline(this);
+			}
+			else {
+				if ( _input.LA(1)==Token.EOF ) matchedEOF = true;
+				_errHandler.reportMatch(this);
+				consume();
+			}
+			}
+		}
+		catch (RecognitionException re) {
+			_localctx.exception = re;
+			_errHandler.reportError(this, re);
+			_errHandler.recover(this, re);
+		}
+		finally {
+			exitRule();
+		}
+		return _localctx;
+	}
+
+	public static final String _serializedATN =
+		"\3\u608b\ua72a\u8133\ub9ed\u417c\u3be7\u7786\u5964\3\\\u0224\4\2\t\2\4"+
+		"\3\t\3\4\4\t\4\4\5\t\5\4\6\t\6\4\7\t\7\4\b\t\b\4\t\t\t\4\n\t\n\4\13\t"+
+		"\13\4\f\t\f\4\r\t\r\4\16\t\16\4\17\t\17\4\20\t\20\4\21\t\21\4\22\t\22"+
+		"\4\23\t\23\4\24\t\24\4\25\t\25\4\26\t\26\4\27\t\27\4\30\t\30\4\31\t\31"+
+		"\4\32\t\32\4\33\t\33\4\34\t\34\4\35\t\35\4\36\t\36\4\37\t\37\4 \t \4!"+
+		"\t!\4\"\t\"\4#\t#\4$\t$\4%\t%\4&\t&\4\'\t\'\4(\t(\4)\t)\4*\t*\4+\t+\4"+
+		",\t,\4-\t-\4.\t.\3\2\5\2^\n\2\3\2\3\2\3\2\3\2\5\2d\n\2\3\2\3\2\3\2\3\2"+
+		"\5\2j\n\2\3\2\5\2m\n\2\3\2\7\2p\n\2\f\2\16\2s\13\2\3\2\7\2v\n\2\f\2\16"+
+		"\2y\13\2\3\2\6\2|\n\2\r\2\16\2}\3\2\3\2\3\3\3\3\3\3\6\3\u0085\n\3\r\3"+
+		"\16\3\u0086\3\3\3\3\3\4\3\4\3\4\3\4\5\4\u008f\n\4\3\4\3\4\3\5\3\5\3\5"+
+		"\3\5\3\6\3\6\3\6\3\6\5\6\u009b\n\6\3\6\3\6\3\6\3\7\3\7\3\7\5\7\u00a3\n"+
+		"\7\3\b\3\b\3\b\7\b\u00a8\n\b\f\b\16\b\u00ab\13\b\3\b\3\b\3\t\3\t\3\t\3"+
+		"\t\3\t\3\n\3\n\3\n\3\n\3\n\5\n\u00b9\n\n\3\13\5\13\u00bc\n\13\3\13\5\13"+
+		"\u00bf\n\13\3\13\3\13\5\13\u00c3\n\13\3\13\5\13\u00c6\n\13\3\13\3\13\5"+
+		"\13\u00ca\n\13\3\13\5\13\u00cd\n\13\3\13\5\13\u00d0\n\13\3\13\5\13\u00d3"+
+		"\n\13\3\13\7\13\u00d6\n\13\f\13\16\13\u00d9\13\13\3\13\3\13\3\13\3\13"+
+		"\5\13\u00df\n\13\3\f\3\f\3\f\3\f\3\r\3\r\3\r\3\r\7\r\u00e9\n\r\f\r\16"+
+		"\r\u00ec\13\r\3\16\3\16\3\16\3\16\3\16\3\16\7\16\u00f4\n\16\f\16\16\16"+
+		"\u00f7\13\16\3\16\3\16\3\16\3\16\3\16\3\16\3\16\3\16\7\16\u0101\n\16\f"+
+		"\16\16\16\u0104\13\16\3\16\3\16\5\16\u0108\n\16\3\17\3\17\5\17\u010c\n"+
+		"\17\3\17\5\17\u010f\n\17\3\17\3\17\3\17\3\17\3\17\3\17\7\17\u0117\n\17"+
+		"\f\17\16\17\u011a\13\17\3\17\3\17\3\20\3\20\3\20\3\20\3\20\3\20\7\20\u0124"+
+		"\n\20\f\20\16\20\u0127\13\20\3\21\6\21\u012a\n\21\r\21\16\21\u012b\3\21"+
+		"\5\21\u012f\n\21\3\22\6\22\u0132\n\22\r\22\16\22\u0133\3\22\5\22\u0137"+
+		"\n\22\3\22\5\22\u013a\n\22\3\23\3\23\3\23\3\23\3\24\3\24\3\24\3\25\3\25"+
+		"\3\26\3\26\3\26\3\26\3\26\5\26\u014a\n\26\3\26\3\26\3\26\3\26\3\26\5\26"+
+		"\u0151\n\26\3\26\3\26\3\26\5\26\u0156\n\26\3\26\3\26\3\26\3\26\3\26\3"+
+		"\26\5\26\u015e\n\26\3\26\3\26\3\26\5\26\u0163\n\26\5\26\u0165\n\26\3\27"+
+		"\3\27\7\27\u0169\n\27\f\27\16\27\u016c\13\27\3\27\3\27\3\30\3\30\7\30"+
+		"\u0172\n\30\f\30\16\30\u0175\13\30\3\30\3\30\3\31\3\31\3\31\3\31\5\31"+
+		"\u017d\n\31\3\31\3\31\3\31\3\31\3\31\5\31\u0184\n\31\3\31\3\31\5\31\u0188"+
+		"\n\31\3\31\5\31\u018b\n\31\5\31\u018d\n\31\3\32\3\32\3\32\5\32\u0192\n"+
+		"\32\3\33\3\33\3\33\6\33\u0197\n\33\r\33\16\33\u0198\3\33\3\33\3\34\3\34"+
+		"\3\34\3\34\3\34\3\34\5\34\u01a3\n\34\3\35\3\35\3\35\3\35\3\36\3\36\3\36"+
+		"\3\36\5\36\u01ad\n\36\3\36\3\36\5\36\u01b1\n\36\3\36\5\36\u01b4\n\36\3"+
+		"\37\3\37\3 \3 \3!\3!\3!\3!\3!\7!\u01bf\n!\f!\16!\u01c2\13!\3!\3!\3!\5"+
+		"!\u01c7\n!\3\"\3\"\3\"\5\"\u01cc\n\"\3#\3#\3#\3#\3$\6$\u01d3\n$\r$\16"+
+		"$\u01d4\3%\3%\3%\3%\3%\3%\3%\5%\u01de\n%\3%\5%\u01e1\n%\3&\3&\3&\5&\u01e6"+
+		"\n&\3&\3&\3&\3&\3&\5&\u01ed\n&\3\'\3\'\3\'\3(\3(\3(\7(\u01f5\n(\f(\16"+
+		"(\u01f8\13(\3(\3(\3)\3)\3)\3)\3)\3)\3)\3)\3)\5)\u0205\n)\3*\3*\3*\3*\3"+
+		"*\3+\3+\3+\3+\3+\3+\3+\3,\3,\3,\7,\u0216\n,\f,\16,\u0219\13,\3,\5,\u021c"+
+		"\n,\3-\3-\3-\3-\3.\3.\3.\2\2/\2\4\6\b\n\f\16\20\22\24\26\30\32\34\36 "+
+		"\"$&(*,.\60\62\64\668:<>@BDFHJLNPRTVXZ\2\n\3\2,-\4\2##\679\4\2BBPP\3\2"+
+		"%&\4\2,-SS\4\2GHNN\3\2./\3\2ST\2\u0257\2]\3\2\2\2\4\u0081\3\2\2\2\6\u008a"+
+		"\3\2\2\2\b\u0092\3\2\2\2\n\u0096\3\2\2\2\f\u00a2\3\2\2\2\16\u00a4\3\2"+
+		"\2\2\20\u00ae\3\2\2\2\22\u00b8\3\2\2\2\24\u00bb\3\2\2\2\26\u00e0\3\2\2"+
+		"\2\30\u00e4\3\2\2\2\32\u0107\3\2\2\2\34\u0109\3\2\2\2\36\u011d\3\2\2\2"+
+		" \u012e\3\2\2\2\"\u0139\3\2\2\2$\u013b\3\2\2\2&\u013f\3\2\2\2(\u0142\3"+
+		"\2\2\2*\u0164\3\2\2\2,\u0166\3\2\2\2.\u016f\3\2\2\2\60\u018c\3\2\2\2\62"+
+		"\u018e\3\2\2\2\64\u0193\3\2\2\2\66\u019c\3\2\2\28\u01a4\3\2\2\2:\u01b0"+
+		"\3\2\2\2<\u01b5\3\2\2\2>\u01b7\3\2\2\2@\u01c6\3\2\2\2B\u01cb\3\2\2\2D"+
+		"\u01cd\3\2\2\2F\u01d2\3\2\2\2H\u01e0\3\2\2\2J\u01ec\3\2\2\2L\u01ee\3\2"+
+		"\2\2N\u01f1\3\2\2\2P\u0204\3\2\2\2R\u0206\3\2\2\2T\u020b\3\2\2\2V\u021b"+
+		"\3\2\2\2X\u021d\3\2\2\2Z\u0221\3\2\2\2\\^\7\3\2\2]\\\3\2\2\2]^\3\2\2\2"+
+		"^c\3\2\2\2_d\7\5\2\2`d\7\4\2\2ad\7<\2\2bd\3\2\2\2c_\3\2\2\2c`\3\2\2\2"+
+		"ca\3\2\2\2cb\3\2\2\2de\3\2\2\2ef\7\66\2\2fg\5Z.\2gi\7L\2\2hj\5\16\b\2"+
+		"ih\3\2\2\2ij\3\2\2\2jl\3\2\2\2km\5\4\3\2lk\3\2\2\2lm\3\2\2\2mq\3\2\2\2"+
+		"np\5\b\5\2on\3\2\2\2ps\3\2\2\2qo\3\2\2\2qr\3\2\2\2rw\3\2\2\2sq\3\2\2\2"+
+		"tv\5\n\6\2ut\3\2\2\2vy\3\2\2\2wu\3\2\2\2wx\3\2\2\2x{\3\2\2\2yw\3\2\2\2"+
+		"z|\5\24\13\2{z\3\2\2\2|}\3\2\2\2}{\3\2\2\2}~\3\2\2\2~\177\3\2\2\2\177"+
+		"\u0080\7\2\2\3\u0080\3\3\2\2\2\u0081\u0082\7\63\2\2\u0082\u0084\7C\2\2"+
+		"\u0083\u0085\5\6\4\2\u0084\u0083\3\2\2\2\u0085\u0086\3\2\2\2\u0086\u0084"+
+		"\3\2\2\2\u0086\u0087\3\2\2\2\u0087\u0088\3\2\2\2\u0088\u0089\7I\2\2\u0089"+
+		"\5\3\2\2\2\u008a\u008e\7S\2\2\u008b\u008c\7B\2\2\u008c\u008f\t\2\2\2\u008d"+
+		"\u008f\3\2\2\2\u008e\u008b\3\2\2\2\u008e\u008d\3\2\2\2\u008f\u0090\3\2"+
+		"\2\2\u0090\u0091\7L\2\2\u0091\7\3\2\2\2\u0092\u0093\7\36\2\2\u0093\u0094"+
+		"\5Z.\2\u0094\u0095\5,\27\2\u0095\t\3\2\2\2\u0096\u009a\7=\2\2\u0097\u0098"+
+		"\5\f\7\2\u0098\u0099\7?\2\2\u0099\u009b\3\2\2\2\u009a\u0097\3\2\2\2\u009a"+
+		"\u009b\3\2\2\2\u009b\u009c\3\2\2\2\u009c\u009d\5Z.\2\u009d\u009e\5,\27"+
+		"\2\u009e\13\3\2\2\2\u009f\u00a3\5Z.\2\u00a0\u00a3\7\5\2\2\u00a1\u00a3"+
+		"\7\4\2\2\u00a2\u009f\3\2\2\2\u00a2\u00a0\3\2\2\2\u00a2\u00a1\3\2\2\2\u00a3"+
+		"\r\3\2\2\2\u00a4\u00a5\7\62\2\2\u00a5\u00a9\7C\2\2\u00a6\u00a8\5\20\t"+
+		"\2\u00a7\u00a6\3\2\2\2\u00a8\u00ab\3\2\2\2\u00a9\u00a7\3\2\2\2\u00a9\u00aa"+
+		"\3\2\2\2\u00aa\u00ac\3\2\2\2\u00ab\u00a9\3\2\2\2\u00ac\u00ad\7I\2\2\u00ad"+
+		"\17\3\2\2\2\u00ae\u00af\5Z.\2\u00af\u00b0\7B\2\2\u00b0\u00b1\5\22\n\2"+
+		"\u00b1\u00b2\7L\2\2\u00b2\21\3\2\2\2\u00b3\u00b9\5Z.\2\u00b4\u00b9\7-"+
+		"\2\2\u00b5\u00b9\7,\2\2\u00b6\u00b9\7+\2\2\u00b7\u00b9\7N\2\2\u00b8\u00b3"+
+		"\3\2\2\2\u00b8\u00b4\3\2\2\2\u00b8\u00b5\3\2\2\2\u00b8\u00b6\3\2\2\2\u00b8"+
+		"\u00b7\3\2\2\2\u00b9\23\3\2\2\2\u00ba\u00bc\7\3\2\2\u00bb\u00ba\3\2\2"+
+		"\2\u00bb\u00bc\3\2\2\2\u00bc\u00be\3\2\2\2\u00bd\u00bf\t\3\2\2\u00be\u00bd"+
+		"\3\2\2\2\u00be\u00bf\3\2\2\2\u00bf\u00c0\3\2\2\2\u00c0\u00c2\5Z.\2\u00c1"+
+		"\u00c3\7&\2\2\u00c2\u00c1\3\2\2\2\u00c2\u00c3\3\2\2\2\u00c3\u00c5\3\2"+
+		"\2\2\u00c4\u00c6\5.\30\2\u00c5\u00c4\3\2\2\2\u00c5\u00c6\3\2\2\2\u00c6"+
+		"\u00c9\3\2\2\2\u00c7\u00c8\7:\2\2\u00c8\u00ca\5.\30\2\u00c9\u00c7\3\2"+
+		"\2\2\u00c9\u00ca\3\2\2\2\u00ca\u00cc\3\2\2\2\u00cb\u00cd\5\30\r\2\u00cc"+
+		"\u00cb\3\2\2\2\u00cc\u00cd\3\2\2\2\u00cd\u00cf\3\2\2\2\u00ce\u00d0\5\16"+
+		"\b\2\u00cf\u00ce\3\2\2\2\u00cf\u00d0\3\2\2\2\u00d0\u00d2\3\2\2\2\u00d1"+
+		"\u00d3\5\32\16\2\u00d2\u00d1\3\2\2\2\u00d2\u00d3\3\2\2\2\u00d3\u00d7\3"+
+		"\2\2\2\u00d4\u00d6\5\26\f\2\u00d5\u00d4\3\2\2\2\u00d6\u00d9\3\2\2\2\u00d7"+
+		"\u00d5\3\2\2\2\u00d7\u00d8\3\2\2\2\u00d8\u00da\3\2\2\2\u00d9\u00d7\3\2"+
+		"\2\2\u00da\u00db\7>\2\2\u00db\u00dc\5\36\20\2\u00dc\u00de\7L\2\2\u00dd"+
+		"\u00df\5\"\22\2\u00de\u00dd\3\2\2\2\u00de\u00df\3\2\2\2\u00df\25\3\2\2"+
+		"\2\u00e0\u00e1\7=\2\2\u00e1\u00e2\5Z.\2\u00e2\u00e3\5,\27\2\u00e3\27\3"+
+		"\2\2\2\u00e4\u00e5\7;\2\2\u00e5\u00ea\5Z.\2\u00e6\u00e7\7@\2\2\u00e7\u00e9"+
+		"\5Z.\2\u00e8\u00e6\3\2\2\2\u00e9\u00ec\3\2\2\2\u00ea\u00e8\3\2\2\2\u00ea"+
+		"\u00eb\3\2\2\2\u00eb\31\3\2\2\2\u00ec\u00ea\3\2\2\2\u00ed\u00ee\7\36\2"+
+		"\2\u00ee\u0108\5,\27\2\u00ef\u00f0\7\36\2\2\u00f0\u00f5\5Z.\2\u00f1\u00f2"+
+		"\7@\2\2\u00f2\u00f4\5Z.\2\u00f3\u00f1\3\2\2\2\u00f4\u00f7\3\2\2\2\u00f5"+
+		"\u00f3\3\2\2\2\u00f5\u00f6\3\2\2\2\u00f6\u00f8\3\2\2\2\u00f7\u00f5\3\2"+
+		"\2\2\u00f8\u00f9\7L\2\2\u00f9\u0108\3\2\2\2\u00fa\u00fb\7\36\2\2\u00fb"+
+		"\u00fc\5,\27\2\u00fc\u00fd\7\36\2\2\u00fd\u0102\5Z.\2\u00fe\u00ff\7@\2"+
+		"\2\u00ff\u0101\5Z.\2\u0100\u00fe\3\2\2\2\u0101\u0104\3\2\2\2\u0102\u0100"+
+		"\3\2\2\2\u0102\u0103\3\2\2\2\u0103\u0105\3\2\2\2\u0104\u0102\3\2\2\2\u0105"+
+		"\u0106\7L\2\2\u0106\u0108\3\2\2\2\u0107\u00ed\3\2\2\2\u0107\u00ef\3\2"+
+		"\2\2\u0107\u00fa\3\2\2\2\u0108\33\3\2\2\2\u0109\u010e\7E\2\2\u010a\u010c"+
+		"\5\16\b\2\u010b\u010a\3\2\2\2\u010b\u010c\3\2\2\2\u010c\u010d\3\2\2\2"+
+		"\u010d\u010f\7>\2\2\u010e\u010b\3\2\2\2\u010e\u010f\3\2\2\2\u010f\u0110"+
+		"\3\2\2\2\u0110\u0111\5 \21\2\u0111\u0118\5@!\2\u0112\u0113\7F\2\2\u0113"+
+		"\u0114\5 \21\2\u0114\u0115\5@!\2\u0115\u0117\3\2\2\2\u0116\u0112\3\2\2"+
+		"\2\u0117\u011a\3\2\2\2\u0118\u0116\3\2\2\2\u0118\u0119\3\2\2\2\u0119\u011b"+
+		"\3\2\2\2\u011a\u0118\3\2\2\2\u011b\u011c\7K\2\2\u011c\35\3\2\2\2\u011d"+
+		"\u011e\5 \21\2\u011e\u0125\5@!\2\u011f\u0120\7F\2\2\u0120\u0121\5 \21"+
+		"\2\u0121\u0122\5@!\2\u0122\u0124\3\2\2\2\u0123\u011f\3\2\2\2\u0124\u0127"+
+		"\3\2\2\2\u0125\u0123\3\2\2\2\u0125\u0126\3\2\2\2\u0126\37\3\2\2\2\u0127"+
+		"\u0125\3\2\2\2\u0128\u012a\5(\25\2\u0129\u0128\3\2\2\2\u012a\u012b\3\2"+
+		"\2\2\u012b\u0129\3\2\2\2\u012b\u012c\3\2\2\2\u012c\u012f\3\2\2\2\u012d"+
+		"\u012f\3\2\2\2\u012e\u0129\3\2\2\2\u012e\u012d\3\2\2\2\u012f!\3\2\2\2"+
+		"\u0130\u0132\5$\23\2\u0131\u0130\3\2\2\2\u0132\u0133\3\2\2\2\u0133\u0131"+
+		"\3\2\2\2\u0133\u0134\3\2\2\2\u0134\u0136\3\2\2\2\u0135\u0137\5&\24\2\u0136"+
+		"\u0135\3\2\2\2\u0136\u0137\3\2\2\2\u0137\u013a\3\2\2\2\u0138\u013a\5&"+
+		"\24\2\u0139\u0131\3\2\2\2\u0139\u0138\3\2\2\2\u013a#\3\2\2\2\u013b\u013c"+
+		"\7\64\2\2\u013c\u013d\5.\30\2\u013d\u013e\5,\27\2\u013e%\3\2\2\2\u013f"+
+		"\u0140\7\65\2\2\u0140\u0141\5,\27\2\u0141\'\3\2\2\2\u0142\u0143\5*\26"+
+		"\2\u0143)\3\2\2\2\u0144\u0145\5Z.\2\u0145\u0146\t\4\2\2\u0146\u0149\5"+
+		"\60\31\2\u0147\u014a\5> \2\u0148\u014a\3\2\2\2\u0149\u0147\3\2\2\2\u0149"+
+		"\u0148\3\2\2\2\u014a\u0165\3\2\2\2\u014b\u014c\5Z.\2\u014c\u014d\t\4\2"+
+		"\2\u014d\u0150\5\34\17\2\u014e\u0151\5> \2\u014f\u0151\3\2\2\2\u0150\u014e"+
+		"\3\2\2\2\u0150\u014f\3\2\2\2\u0151\u0165\3\2\2\2\u0152\u0155\5\60\31\2"+
+		"\u0153\u0156\5> \2\u0154\u0156\3\2\2\2\u0155\u0153\3\2\2\2\u0155\u0154"+
+		"\3\2\2\2\u0156\u0165\3\2\2\2\u0157\u0165\5\66\34\2\u0158\u0165\5,\27\2"+
+		"\u0159\u015a\5,\27\2\u015a\u015d\7H\2\2\u015b\u015e\7M\2\2\u015c\u015e"+
+		"\3\2\2\2\u015d\u015b\3\2\2\2\u015d\u015c\3\2\2\2\u015e\u0165\3\2\2\2\u015f"+
+		"\u0162\5\64\33\2\u0160\u0163\5> \2\u0161\u0163\3\2\2\2\u0162\u0160\3\2"+
+		"\2\2\u0162\u0161\3\2\2\2\u0163\u0165\3\2\2\2\u0164\u0144\3\2\2\2\u0164"+
+		"\u014b\3\2\2\2\u0164\u0152\3\2\2\2\u0164\u0157\3\2\2\2\u0164\u0158\3\2"+
+		"\2\2\u0164\u0159\3\2\2\2\u0164\u015f\3\2\2\2\u0165+\3\2\2\2\u0166\u016a"+
+		"\7\61\2\2\u0167\u0169\7(\2\2\u0168\u0167\3\2\2\2\u0169\u016c\3\2\2\2\u016a"+
+		"\u0168\3\2\2\2\u016a\u016b\3\2\2\2\u016b\u016d\3\2\2\2\u016c\u016a\3\2"+
+		"\2\2\u016d\u016e\7X\2\2\u016e-\3\2\2\2\u016f\u0173\7\60\2\2\u0170\u0172"+
+		"\7W\2\2\u0171\u0170\3\2\2\2\u0172\u0175\3\2\2\2\u0173\u0171\3\2\2\2\u0173"+
+		"\u0174\3\2\2\2\u0174\u0176\3\2\2\2\u0175\u0173\3\2\2\2\u0176\u0177\7U"+
+		"\2\2\u0177/\3\2\2\2\u0178\u017c\58\35\2\u0179\u017d\7%\2\2\u017a\u017d"+
+		"\7&\2\2\u017b\u017d\3\2\2\2\u017c\u0179\3\2\2\2\u017c\u017a\3\2\2\2\u017c"+
+		"\u017b\3\2\2\2\u017d\u018d\3\2\2\2\u017e\u018d\5:\36\2\u017f\u0183\5\62"+
+		"\32\2\u0180\u0184\7%\2\2\u0181\u0184\7&\2\2\u0182\u0184\3\2\2\2\u0183"+
+		"\u0180\3\2\2\2\u0183\u0181\3\2\2\2\u0183\u0182\3\2\2\2\u0184\u018d\3\2"+
+		"\2\2\u0185\u0187\7T\2\2\u0186\u0188\5.\30\2\u0187\u0186\3\2\2\2\u0187"+
+		"\u0188\3\2\2\2\u0188\u018a\3\2\2\2\u0189\u018b\t\5\2\2\u018a\u0189\3\2"+
+		"\2\2\u018a\u018b\3\2\2\2\u018b\u018d\3\2\2\2\u018c\u0178\3\2\2\2\u018c"+
+		"\u017e\3\2\2\2\u018c\u017f\3\2\2\2\u018c\u0185\3\2\2\2\u018d\61\3\2\2"+
+		"\2\u018e\u0191\7Q\2\2\u018f\u0192\5<\37\2\u0190\u0192\5\34\17\2\u0191"+
+		"\u018f\3\2\2\2\u0191\u0190\3\2\2\2\u0192\63\3\2\2\2\u0193\u0194\7$\2\2"+
+		"\u0194\u0196\5(\25\2\u0195\u0197\5(\25\2\u0196\u0195\3\2\2\2\u0197\u0198"+
+		"\3\2\2\2\u0198\u0196\3\2\2\2\u0198\u0199\3\2\2\2\u0199\u019a\3\2\2\2\u019a"+
+		"\u019b\7K\2\2\u019b\65\3\2\2\2\u019c\u01a2\5\34\17\2\u019d\u01a3\7H\2"+
+		"\2\u019e\u01a3\7N\2\2\u019f\u01a3\7G\2\2\u01a0\u01a3\7M\2\2\u01a1\u01a3"+
+		"\3\2\2\2\u01a2\u019d\3\2\2\2\u01a2\u019e\3\2\2\2\u01a2\u019f\3\2\2\2\u01a2"+
+		"\u01a0\3\2\2\2\u01a2\u01a1\3\2\2\2\u01a3\67\3\2\2\2\u01a4\u01a5\7,\2\2"+
+		"\u01a5\u01a6\7\f\2\2\u01a6\u01a7\7,\2\2\u01a79\3\2\2\2\u01a8\u01b1\7,"+
+		"\2\2\u01a9\u01ac\7S\2\2\u01aa\u01ad\5.\30\2\u01ab\u01ad\3\2\2\2\u01ac"+
+		"\u01aa\3\2\2\2\u01ac\u01ab\3\2\2\2\u01ad\u01b1\3\2\2\2\u01ae\u01b1\7-"+
+		"\2\2\u01af\u01b1\7A\2\2\u01b0\u01a8\3\2\2\2\u01b0\u01a9\3\2\2\2\u01b0"+
+		"\u01ae\3\2\2\2\u01b0\u01af\3\2\2\2\u01b1\u01b3\3\2\2\2\u01b2\u01b4\t\5"+
+		"\2\2\u01b3\u01b2\3\2\2\2\u01b3\u01b4\3\2\2\2\u01b4;\3\2\2\2\u01b5\u01b6"+
+		"\t\6\2\2\u01b6=\3\2\2\2\u01b7\u01b8\t\7\2\2\u01b8?\3\2\2\2\u01b9\u01ba"+
+		"\7\'\2\2\u01ba\u01bb\5,\27\2\u01bb\u01bc\7H\2\2\u01bc\u01bd\5B\"\2\u01bd"+
+		"\u01bf\3\2\2\2\u01be\u01b9\3\2\2\2\u01bf\u01c2\3\2\2\2\u01c0\u01be\3\2"+
+		"\2\2\u01c0\u01c1\3\2\2\2\u01c1\u01c3\3\2\2\2\u01c2\u01c0\3\2\2\2\u01c3"+
+		"\u01c4\7\'\2\2\u01c4\u01c7\5B\"\2\u01c5\u01c7\3\2\2\2\u01c6\u01c0\3\2"+
+		"\2\2\u01c6\u01c5\3\2\2\2\u01c7A\3\2\2\2\u01c8\u01cc\5P)\2\u01c9\u01cc"+
+		"\5F$\2\u01ca\u01cc\3\2\2\2\u01cb\u01c8\3\2\2\2\u01cb\u01c9\3\2\2\2\u01cb"+
+		"\u01ca\3\2\2\2\u01ccC\3\2\2\2\u01cd\u01ce\7E\2\2\u01ce\u01cf\5F$\2\u01cf"+
+		"\u01d0\7K\2\2\u01d0E\3\2\2\2\u01d1\u01d3\5H%\2\u01d2\u01d1\3\2\2\2\u01d3"+
+		"\u01d4\3\2\2\2\u01d4\u01d2\3\2\2\2\u01d4\u01d5\3\2\2\2\u01d5G\3\2\2\2"+
+		"\u01d6\u01e1\5J&\2\u01d7\u01d8\5J&\2\u01d8\u01d9\5> \2\u01d9\u01e1\3\2"+
+		"\2\2\u01da\u01dd\5N(\2\u01db\u01de\5> \2\u01dc\u01de\3\2\2\2\u01dd\u01db"+
+		"\3\2\2\2\u01dd\u01dc\3\2\2\2\u01de\u01e1\3\2\2\2\u01df\u01e1\5L\'\2\u01e0"+
+		"\u01d6\3\2\2\2\u01e0\u01d7\3\2\2\2\u01e0\u01da\3\2\2\2\u01e0\u01df\3\2"+
+		"\2\2\u01e1I\3\2\2\2\u01e2\u01ed\7,\2\2\u01e3\u01e5\7S\2\2\u01e4\u01e6"+
+		"\5.\30\2\u01e5\u01e4\3\2\2\2\u01e5\u01e6\3\2\2\2\u01e6\u01ed\3\2\2\2\u01e7"+
+		"\u01ed\7T\2\2\u01e8\u01ed\7-\2\2\u01e9\u01ea\7O\2\2\u01ea\u01ed\5Z.\2"+
+		"\u01eb\u01ed\5,\27\2\u01ec\u01e2\3\2\2\2\u01ec\u01e3\3\2\2\2\u01ec\u01e7"+
+		"\3\2\2\2\u01ec\u01e8\3\2\2\2\u01ec\u01e9\3\2\2\2\u01ec\u01eb\3\2\2\2\u01ed"+
+		"K\3\2\2\2\u01ee\u01ef\5D#\2\u01ef\u01f0\5> \2\u01f0M\3\2\2\2\u01f1\u01f2"+
+		"\7$\2\2\u01f2\u01f6\5J&\2\u01f3\u01f5\5H%\2\u01f4\u01f3\3\2\2\2\u01f5"+
+		"\u01f8\3\2\2\2\u01f6\u01f4\3\2\2\2\u01f6\u01f7\3\2\2\2\u01f7\u01f9\3\2"+
+		"\2\2\u01f8\u01f6\3\2\2\2\u01f9\u01fa\7K\2\2\u01faO\3\2\2\2\u01fb\u01fc"+
+		"\5Z.\2\u01fc\u01fd\7E\2\2\u01fd\u01fe\5V,\2\u01fe\u01ff\7K\2\2\u01ff\u0200"+
+		"\t\b\2\2\u0200\u0205\3\2\2\2\u0201\u0205\5R*\2\u0202\u0205\5T+\2\u0203"+
+		"\u0205\5,\27\2\u0204\u01fb\3\2\2\2\u0204\u0201\3\2\2\2\u0204\u0202\3\2"+
+		"\2\2\u0204\u0203\3\2\2\2\u0205Q\3\2\2\2\u0206\u0207\5Z.\2\u0207\u0208"+
+		"\7E\2\2\u0208\u0209\5V,\2\u0209\u020a\7K\2\2\u020aS\3\2\2\2\u020b\u020c"+
+		"\7E\2\2\u020c\u020d\5,\27\2\u020d\u020e\7K\2\2\u020e\u020f\7E\2\2\u020f"+
+		"\u0210\5V,\2\u0210\u0211\7K\2\2\u0211U\3\2\2\2\u0212\u0217\5X-\2\u0213"+
+		"\u0214\7@\2\2\u0214\u0216\5X-\2\u0215\u0213\3\2\2\2\u0216\u0219\3\2\2"+
+		"\2\u0217\u0215\3\2\2\2\u0217\u0218\3\2\2\2\u0218\u021c\3\2\2\2\u0219\u0217"+
+		"\3\2\2\2\u021a\u021c\3\2\2\2\u021b\u0212\3\2\2\2\u021b\u021a\3\2\2\2\u021c"+
+		"W\3\2\2\2\u021d\u021e\5Z.\2\u021e\u021f\7B\2\2\u021f\u0220\5,\27\2\u0220"+
+		"Y\3\2\2\2\u0221\u0222\t\t\2\2\u0222[\3\2\2\2E]cilqw}\u0086\u008e\u009a"+
+		"\u00a2\u00a9\u00b8\u00bb\u00be\u00c2\u00c5\u00c9\u00cc\u00cf\u00d2\u00d7"+
+		"\u00de\u00ea\u00f5\u0102\u0107\u010b\u010e\u0118\u0125\u012b\u012e\u0133"+
+		"\u0136\u0139\u0149\u0150\u0155\u015d\u0162\u0164\u016a\u0173\u017c\u0183"+
+		"\u0187\u018a\u018c\u0191\u0198\u01a2\u01ac\u01b0\u01b3\u01c0\u01c6\u01cb"+
+		"\u01d4\u01dd\u01e0\u01e5\u01ec\u01f6\u0204\u0217\u021b";
+	public static final ATN _ATN =
+		new ATNDeserializer().deserialize(_serializedATN.toCharArray());
+	static {
+		_decisionToDFA = new DFA[_ATN.getNumberOfDecisions()];
+		for (int i = 0; i < _ATN.getNumberOfDecisions(); i++) {
+			_decisionToDFA[i] = new DFA(_ATN.getDecisionState(i), i);
+		}
+	}
+}
\ No newline at end of file
diff --git a/java/languages.antlr/src/org/antlr/parser/antlr3/ANTLRv3ParserBaseListener.java b/java/languages.antlr/src/org/antlr/parser/antlr3/ANTLRv3ParserBaseListener.java
new file mode 100644
index 0000000..1978ba1
--- /dev/null
+++ b/java/languages.antlr/src/org/antlr/parser/antlr3/ANTLRv3ParserBaseListener.java
@@ -0,0 +1,606 @@
+// Generated from ANTLRv3Parser.g4 by ANTLR 4.7.2
+
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+// DO NOT EDIT THIS FILE MANUALLY!
+// SEE build.xml FOR INSTRUCTIONS
+
+
+package org.antlr.parser.antlr3;
+
+
+
+import org.antlr.v4.runtime.ParserRuleContext;
+import org.antlr.v4.runtime.tree.ErrorNode;
+import org.antlr.v4.runtime.tree.TerminalNode;
+
+/**
+ * This class provides an empty implementation of {@link ANTLRv3ParserListener},
+ * which can be extended to create a listener which only needs to handle a subset
+ * of the available methods.
+ */
+public class ANTLRv3ParserBaseListener implements ANTLRv3ParserListener {
+	/**
+	 * {@inheritDoc}
+	 *
+	 * <p>The default implementation does nothing.</p>
+	 */
+	@Override public void enterGrammarDef(ANTLRv3Parser.GrammarDefContext ctx) { }
+	/**
+	 * {@inheritDoc}
+	 *
+	 * <p>The default implementation does nothing.</p>
+	 */
+	@Override public void exitGrammarDef(ANTLRv3Parser.GrammarDefContext ctx) { }
+	/**
+	 * {@inheritDoc}
+	 *
+	 * <p>The default implementation does nothing.</p>
+	 */
+	@Override public void enterTokensSpec(ANTLRv3Parser.TokensSpecContext ctx) { }
+	/**
+	 * {@inheritDoc}
+	 *
+	 * <p>The default implementation does nothing.</p>
+	 */
+	@Override public void exitTokensSpec(ANTLRv3Parser.TokensSpecContext ctx) { }
+	/**
+	 * {@inheritDoc}
+	 *
+	 * <p>The default implementation does nothing.</p>
+	 */
+	@Override public void enterTokenSpec(ANTLRv3Parser.TokenSpecContext ctx) { }
+	/**
+	 * {@inheritDoc}
+	 *
+	 * <p>The default implementation does nothing.</p>
+	 */
+	@Override public void exitTokenSpec(ANTLRv3Parser.TokenSpecContext ctx) { }
+	/**
+	 * {@inheritDoc}
+	 *
+	 * <p>The default implementation does nothing.</p>
+	 */
+	@Override public void enterAttrScope(ANTLRv3Parser.AttrScopeContext ctx) { }
+	/**
+	 * {@inheritDoc}
+	 *
+	 * <p>The default implementation does nothing.</p>
+	 */
+	@Override public void exitAttrScope(ANTLRv3Parser.AttrScopeContext ctx) { }
+	/**
+	 * {@inheritDoc}
+	 *
+	 * <p>The default implementation does nothing.</p>
+	 */
+	@Override public void enterAction(ANTLRv3Parser.ActionContext ctx) { }
+	/**
+	 * {@inheritDoc}
+	 *
+	 * <p>The default implementation does nothing.</p>
+	 */
+	@Override public void exitAction(ANTLRv3Parser.ActionContext ctx) { }
+	/**
+	 * {@inheritDoc}
+	 *
+	 * <p>The default implementation does nothing.</p>
+	 */
+	@Override public void enterActionScopeName(ANTLRv3Parser.ActionScopeNameContext ctx) { }
+	/**
+	 * {@inheritDoc}
+	 *
+	 * <p>The default implementation does nothing.</p>
+	 */
+	@Override public void exitActionScopeName(ANTLRv3Parser.ActionScopeNameContext ctx) { }
+	/**
+	 * {@inheritDoc}
+	 *
+	 * <p>The default implementation does nothing.</p>
+	 */
+	@Override public void enterOptionsSpec(ANTLRv3Parser.OptionsSpecContext ctx) { }
+	/**
+	 * {@inheritDoc}
+	 *
+	 * <p>The default implementation does nothing.</p>
+	 */
+	@Override public void exitOptionsSpec(ANTLRv3Parser.OptionsSpecContext ctx) { }
+	/**
+	 * {@inheritDoc}
+	 *
+	 * <p>The default implementation does nothing.</p>
+	 */
+	@Override public void enterOption(ANTLRv3Parser.OptionContext ctx) { }
+	/**
+	 * {@inheritDoc}
+	 *
+	 * <p>The default implementation does nothing.</p>
+	 */
+	@Override public void exitOption(ANTLRv3Parser.OptionContext ctx) { }
+	/**
+	 * {@inheritDoc}
+	 *
+	 * <p>The default implementation does nothing.</p>
+	 */
+	@Override public void enterOptionValue(ANTLRv3Parser.OptionValueContext ctx) { }
+	/**
+	 * {@inheritDoc}
+	 *
+	 * <p>The default implementation does nothing.</p>
+	 */
+	@Override public void exitOptionValue(ANTLRv3Parser.OptionValueContext ctx) { }
+	/**
+	 * {@inheritDoc}
+	 *
+	 * <p>The default implementation does nothing.</p>
+	 */
+	@Override public void enterRule_(ANTLRv3Parser.Rule_Context ctx) { }
+	/**
+	 * {@inheritDoc}
+	 *
+	 * <p>The default implementation does nothing.</p>
+	 */
+	@Override public void exitRule_(ANTLRv3Parser.Rule_Context ctx) { }
+	/**
+	 * {@inheritDoc}
+	 *
+	 * <p>The default implementation does nothing.</p>
+	 */
+	@Override public void enterRuleAction(ANTLRv3Parser.RuleActionContext ctx) { }
+	/**
+	 * {@inheritDoc}
+	 *
+	 * <p>The default implementation does nothing.</p>
+	 */
+	@Override public void exitRuleAction(ANTLRv3Parser.RuleActionContext ctx) { }
+	/**
+	 * {@inheritDoc}
+	 *
+	 * <p>The default implementation does nothing.</p>
+	 */
+	@Override public void enterThrowsSpec(ANTLRv3Parser.ThrowsSpecContext ctx) { }
+	/**
+	 * {@inheritDoc}
+	 *
+	 * <p>The default implementation does nothing.</p>
+	 */
+	@Override public void exitThrowsSpec(ANTLRv3Parser.ThrowsSpecContext ctx) { }
+	/**
+	 * {@inheritDoc}
+	 *
+	 * <p>The default implementation does nothing.</p>
+	 */
+	@Override public void enterRuleScopeSpec(ANTLRv3Parser.RuleScopeSpecContext ctx) { }
+	/**
+	 * {@inheritDoc}
+	 *
+	 * <p>The default implementation does nothing.</p>
+	 */
+	@Override public void exitRuleScopeSpec(ANTLRv3Parser.RuleScopeSpecContext ctx) { }
+	/**
+	 * {@inheritDoc}
+	 *
+	 * <p>The default implementation does nothing.</p>
+	 */
+	@Override public void enterBlock(ANTLRv3Parser.BlockContext ctx) { }
+	/**
+	 * {@inheritDoc}
+	 *
+	 * <p>The default implementation does nothing.</p>
+	 */
+	@Override public void exitBlock(ANTLRv3Parser.BlockContext ctx) { }
+	/**
+	 * {@inheritDoc}
+	 *
+	 * <p>The default implementation does nothing.</p>
+	 */
+	@Override public void enterAltList(ANTLRv3Parser.AltListContext ctx) { }
+	/**
+	 * {@inheritDoc}
+	 *
+	 * <p>The default implementation does nothing.</p>
+	 */
+	@Override public void exitAltList(ANTLRv3Parser.AltListContext ctx) { }
+	/**
+	 * {@inheritDoc}
+	 *
+	 * <p>The default implementation does nothing.</p>
+	 */
+	@Override public void enterAlternative(ANTLRv3Parser.AlternativeContext ctx) { }
+	/**
+	 * {@inheritDoc}
+	 *
+	 * <p>The default implementation does nothing.</p>
+	 */
+	@Override public void exitAlternative(ANTLRv3Parser.AlternativeContext ctx) { }
+	/**
+	 * {@inheritDoc}
+	 *
+	 * <p>The default implementation does nothing.</p>
+	 */
+	@Override public void enterExceptionGroup(ANTLRv3Parser.ExceptionGroupContext ctx) { }
+	/**
+	 * {@inheritDoc}
+	 *
+	 * <p>The default implementation does nothing.</p>
+	 */
+	@Override public void exitExceptionGroup(ANTLRv3Parser.ExceptionGroupContext ctx) { }
+	/**
+	 * {@inheritDoc}
+	 *
+	 * <p>The default implementation does nothing.</p>
+	 */
+	@Override public void enterExceptionHandler(ANTLRv3Parser.ExceptionHandlerContext ctx) { }
+	/**
+	 * {@inheritDoc}
+	 *
+	 * <p>The default implementation does nothing.</p>
+	 */
+	@Override public void exitExceptionHandler(ANTLRv3Parser.ExceptionHandlerContext ctx) { }
+	/**
+	 * {@inheritDoc}
+	 *
+	 * <p>The default implementation does nothing.</p>
+	 */
+	@Override public void enterFinallyClause(ANTLRv3Parser.FinallyClauseContext ctx) { }
+	/**
+	 * {@inheritDoc}
+	 *
+	 * <p>The default implementation does nothing.</p>
+	 */
+	@Override public void exitFinallyClause(ANTLRv3Parser.FinallyClauseContext ctx) { }
+	/**
+	 * {@inheritDoc}
+	 *
+	 * <p>The default implementation does nothing.</p>
+	 */
+	@Override public void enterElement(ANTLRv3Parser.ElementContext ctx) { }
+	/**
+	 * {@inheritDoc}
+	 *
+	 * <p>The default implementation does nothing.</p>
+	 */
+	@Override public void exitElement(ANTLRv3Parser.ElementContext ctx) { }
+	/**
+	 * {@inheritDoc}
+	 *
+	 * <p>The default implementation does nothing.</p>
+	 */
+	@Override public void enterElementNoOptionSpec(ANTLRv3Parser.ElementNoOptionSpecContext ctx) { }
+	/**
+	 * {@inheritDoc}
+	 *
+	 * <p>The default implementation does nothing.</p>
+	 */
+	@Override public void exitElementNoOptionSpec(ANTLRv3Parser.ElementNoOptionSpecContext ctx) { }
+	/**
+	 * {@inheritDoc}
+	 *
+	 * <p>The default implementation does nothing.</p>
+	 */
+	@Override public void enterActionBlock(ANTLRv3Parser.ActionBlockContext ctx) { }
+	/**
+	 * {@inheritDoc}
+	 *
+	 * <p>The default implementation does nothing.</p>
+	 */
+	@Override public void exitActionBlock(ANTLRv3Parser.ActionBlockContext ctx) { }
+	/**
+	 * {@inheritDoc}
+	 *
+	 * <p>The default implementation does nothing.</p>
+	 */
+	@Override public void enterArgActionBlock(ANTLRv3Parser.ArgActionBlockContext ctx) { }
+	/**
+	 * {@inheritDoc}
+	 *
+	 * <p>The default implementation does nothing.</p>
+	 */
+	@Override public void exitArgActionBlock(ANTLRv3Parser.ArgActionBlockContext ctx) { }
+	/**
+	 * {@inheritDoc}
+	 *
+	 * <p>The default implementation does nothing.</p>
+	 */
+	@Override public void enterAtom(ANTLRv3Parser.AtomContext ctx) { }
+	/**
+	 * {@inheritDoc}
+	 *
+	 * <p>The default implementation does nothing.</p>
+	 */
+	@Override public void exitAtom(ANTLRv3Parser.AtomContext ctx) { }
+	/**
+	 * {@inheritDoc}
+	 *
+	 * <p>The default implementation does nothing.</p>
+	 */
+	@Override public void enterNotSet(ANTLRv3Parser.NotSetContext ctx) { }
+	/**
+	 * {@inheritDoc}
+	 *
+	 * <p>The default implementation does nothing.</p>
+	 */
+	@Override public void exitNotSet(ANTLRv3Parser.NotSetContext ctx) { }
+	/**
+	 * {@inheritDoc}
+	 *
+	 * <p>The default implementation does nothing.</p>
+	 */
+	@Override public void enterTreeSpec(ANTLRv3Parser.TreeSpecContext ctx) { }
+	/**
+	 * {@inheritDoc}
+	 *
+	 * <p>The default implementation does nothing.</p>
+	 */
+	@Override public void exitTreeSpec(ANTLRv3Parser.TreeSpecContext ctx) { }
+	/**
+	 * {@inheritDoc}
+	 *
+	 * <p>The default implementation does nothing.</p>
+	 */
+	@Override public void enterEbnf(ANTLRv3Parser.EbnfContext ctx) { }
+	/**
+	 * {@inheritDoc}
+	 *
+	 * <p>The default implementation does nothing.</p>
+	 */
+	@Override public void exitEbnf(ANTLRv3Parser.EbnfContext ctx) { }
+	/**
+	 * {@inheritDoc}
+	 *
+	 * <p>The default implementation does nothing.</p>
+	 */
+	@Override public void enterRange_(ANTLRv3Parser.Range_Context ctx) { }
+	/**
+	 * {@inheritDoc}
+	 *
+	 * <p>The default implementation does nothing.</p>
+	 */
+	@Override public void exitRange_(ANTLRv3Parser.Range_Context ctx) { }
+	/**
+	 * {@inheritDoc}
+	 *
+	 * <p>The default implementation does nothing.</p>
+	 */
+	@Override public void enterTerminal_(ANTLRv3Parser.Terminal_Context ctx) { }
+	/**
+	 * {@inheritDoc}
+	 *
+	 * <p>The default implementation does nothing.</p>
+	 */
+	@Override public void exitTerminal_(ANTLRv3Parser.Terminal_Context ctx) { }
+	/**
+	 * {@inheritDoc}
+	 *
+	 * <p>The default implementation does nothing.</p>
+	 */
+	@Override public void enterNotTerminal(ANTLRv3Parser.NotTerminalContext ctx) { }
+	/**
+	 * {@inheritDoc}
+	 *
+	 * <p>The default implementation does nothing.</p>
+	 */
+	@Override public void exitNotTerminal(ANTLRv3Parser.NotTerminalContext ctx) { }
+	/**
+	 * {@inheritDoc}
+	 *
+	 * <p>The default implementation does nothing.</p>
+	 */
+	@Override public void enterEbnfSuffix(ANTLRv3Parser.EbnfSuffixContext ctx) { }
+	/**
+	 * {@inheritDoc}
+	 *
+	 * <p>The default implementation does nothing.</p>
+	 */
+	@Override public void exitEbnfSuffix(ANTLRv3Parser.EbnfSuffixContext ctx) { }
+	/**
+	 * {@inheritDoc}
+	 *
+	 * <p>The default implementation does nothing.</p>
+	 */
+	@Override public void enterRewrite(ANTLRv3Parser.RewriteContext ctx) { }
+	/**
+	 * {@inheritDoc}
+	 *
+	 * <p>The default implementation does nothing.</p>
+	 */
+	@Override public void exitRewrite(ANTLRv3Parser.RewriteContext ctx) { }
+	/**
+	 * {@inheritDoc}
+	 *
+	 * <p>The default implementation does nothing.</p>
+	 */
+	@Override public void enterRewrite_alternative(ANTLRv3Parser.Rewrite_alternativeContext ctx) { }
+	/**
+	 * {@inheritDoc}
+	 *
+	 * <p>The default implementation does nothing.</p>
+	 */
+	@Override public void exitRewrite_alternative(ANTLRv3Parser.Rewrite_alternativeContext ctx) { }
+	/**
+	 * {@inheritDoc}
+	 *
+	 * <p>The default implementation does nothing.</p>
+	 */
+	@Override public void enterRewrite_tree_block(ANTLRv3Parser.Rewrite_tree_blockContext ctx) { }
+	/**
+	 * {@inheritDoc}
+	 *
+	 * <p>The default implementation does nothing.</p>
+	 */
+	@Override public void exitRewrite_tree_block(ANTLRv3Parser.Rewrite_tree_blockContext ctx) { }
+	/**
+	 * {@inheritDoc}
+	 *
+	 * <p>The default implementation does nothing.</p>
+	 */
+	@Override public void enterRewrite_tree_alternative(ANTLRv3Parser.Rewrite_tree_alternativeContext ctx) { }
+	/**
+	 * {@inheritDoc}
+	 *
+	 * <p>The default implementation does nothing.</p>
+	 */
+	@Override public void exitRewrite_tree_alternative(ANTLRv3Parser.Rewrite_tree_alternativeContext ctx) { }
+	/**
+	 * {@inheritDoc}
+	 *
+	 * <p>The default implementation does nothing.</p>
+	 */
+	@Override public void enterRewrite_tree_element(ANTLRv3Parser.Rewrite_tree_elementContext ctx) { }
+	/**
+	 * {@inheritDoc}
+	 *
+	 * <p>The default implementation does nothing.</p>
+	 */
+	@Override public void exitRewrite_tree_element(ANTLRv3Parser.Rewrite_tree_elementContext ctx) { }
+	/**
+	 * {@inheritDoc}
+	 *
+	 * <p>The default implementation does nothing.</p>
+	 */
+	@Override public void enterRewrite_tree_atom(ANTLRv3Parser.Rewrite_tree_atomContext ctx) { }
+	/**
+	 * {@inheritDoc}
+	 *
+	 * <p>The default implementation does nothing.</p>
+	 */
+	@Override public void exitRewrite_tree_atom(ANTLRv3Parser.Rewrite_tree_atomContext ctx) { }
+	/**
+	 * {@inheritDoc}
+	 *
+	 * <p>The default implementation does nothing.</p>
+	 */
+	@Override public void enterRewrite_tree_ebnf(ANTLRv3Parser.Rewrite_tree_ebnfContext ctx) { }
+	/**
+	 * {@inheritDoc}
+	 *
+	 * <p>The default implementation does nothing.</p>
+	 */
+	@Override public void exitRewrite_tree_ebnf(ANTLRv3Parser.Rewrite_tree_ebnfContext ctx) { }
+	/**
+	 * {@inheritDoc}
+	 *
+	 * <p>The default implementation does nothing.</p>
+	 */
+	@Override public void enterRewrite_tree(ANTLRv3Parser.Rewrite_treeContext ctx) { }
+	/**
+	 * {@inheritDoc}
+	 *
+	 * <p>The default implementation does nothing.</p>
+	 */
+	@Override public void exitRewrite_tree(ANTLRv3Parser.Rewrite_treeContext ctx) { }
+	/**
+	 * {@inheritDoc}
+	 *
+	 * <p>The default implementation does nothing.</p>
+	 */
+	@Override public void enterRewrite_template(ANTLRv3Parser.Rewrite_templateContext ctx) { }
+	/**
+	 * {@inheritDoc}
+	 *
+	 * <p>The default implementation does nothing.</p>
+	 */
+	@Override public void exitRewrite_template(ANTLRv3Parser.Rewrite_templateContext ctx) { }
+	/**
+	 * {@inheritDoc}
+	 *
+	 * <p>The default implementation does nothing.</p>
+	 */
+	@Override public void enterRewrite_template_ref(ANTLRv3Parser.Rewrite_template_refContext ctx) { }
+	/**
+	 * {@inheritDoc}
+	 *
+	 * <p>The default implementation does nothing.</p>
+	 */
+	@Override public void exitRewrite_template_ref(ANTLRv3Parser.Rewrite_template_refContext ctx) { }
+	/**
+	 * {@inheritDoc}
+	 *
+	 * <p>The default implementation does nothing.</p>
+	 */
+	@Override public void enterRewrite_indirect_template_head(ANTLRv3Parser.Rewrite_indirect_template_headContext ctx) { }
+	/**
+	 * {@inheritDoc}
+	 *
+	 * <p>The default implementation does nothing.</p>
+	 */
+	@Override public void exitRewrite_indirect_template_head(ANTLRv3Parser.Rewrite_indirect_template_headContext ctx) { }
+	/**
+	 * {@inheritDoc}
+	 *
+	 * <p>The default implementation does nothing.</p>
+	 */
+	@Override public void enterRewrite_template_args(ANTLRv3Parser.Rewrite_template_argsContext ctx) { }
+	/**
+	 * {@inheritDoc}
+	 *
+	 * <p>The default implementation does nothing.</p>
+	 */
+	@Override public void exitRewrite_template_args(ANTLRv3Parser.Rewrite_template_argsContext ctx) { }
+	/**
+	 * {@inheritDoc}
+	 *
+	 * <p>The default implementation does nothing.</p>
+	 */
+	@Override public void enterRewrite_template_arg(ANTLRv3Parser.Rewrite_template_argContext ctx) { }
+	/**
+	 * {@inheritDoc}
+	 *
+	 * <p>The default implementation does nothing.</p>
+	 */
+	@Override public void exitRewrite_template_arg(ANTLRv3Parser.Rewrite_template_argContext ctx) { }
+	/**
+	 * {@inheritDoc}
+	 *
+	 * <p>The default implementation does nothing.</p>
+	 */
+	@Override public void enterId_(ANTLRv3Parser.Id_Context ctx) { }
+	/**
+	 * {@inheritDoc}
+	 *
+	 * <p>The default implementation does nothing.</p>
+	 */
+	@Override public void exitId_(ANTLRv3Parser.Id_Context ctx) { }
+
+	/**
+	 * {@inheritDoc}
+	 *
+	 * <p>The default implementation does nothing.</p>
+	 */
+	@Override public void enterEveryRule(ParserRuleContext ctx) { }
+	/**
+	 * {@inheritDoc}
+	 *
+	 * <p>The default implementation does nothing.</p>
+	 */
+	@Override public void exitEveryRule(ParserRuleContext ctx) { }
+	/**
+	 * {@inheritDoc}
+	 *
+	 * <p>The default implementation does nothing.</p>
+	 */
+	@Override public void visitTerminal(TerminalNode node) { }
+	/**
+	 * {@inheritDoc}
+	 *
+	 * <p>The default implementation does nothing.</p>
+	 */
+	@Override public void visitErrorNode(ErrorNode node) { }
+}
\ No newline at end of file
diff --git a/java/languages.antlr/src/org/antlr/parser/antlr3/ANTLRv3ParserListener.java b/java/languages.antlr/src/org/antlr/parser/antlr3/ANTLRv3ParserListener.java
new file mode 100644
index 0000000..3d27c93
--- /dev/null
+++ b/java/languages.antlr/src/org/antlr/parser/antlr3/ANTLRv3ParserListener.java
@@ -0,0 +1,487 @@
+// Generated from ANTLRv3Parser.g4 by ANTLR 4.7.2
+
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+// DO NOT EDIT THIS FILE MANUALLY!
+// SEE build.xml FOR INSTRUCTIONS
+
+
+package org.antlr.parser.antlr3;
+
+
+import org.antlr.v4.runtime.tree.ParseTreeListener;
+
+/**
+ * This interface defines a complete listener for a parse tree produced by
+ * {@link ANTLRv3Parser}.
+ */
+public interface ANTLRv3ParserListener extends ParseTreeListener {
+	/**
+	 * Enter a parse tree produced by {@link ANTLRv3Parser#grammarDef}.
+	 * @param ctx the parse tree
+	 */
+	void enterGrammarDef(ANTLRv3Parser.GrammarDefContext ctx);
+	/**
+	 * Exit a parse tree produced by {@link ANTLRv3Parser#grammarDef}.
+	 * @param ctx the parse tree
+	 */
+	void exitGrammarDef(ANTLRv3Parser.GrammarDefContext ctx);
+	/**
+	 * Enter a parse tree produced by {@link ANTLRv3Parser#tokensSpec}.
+	 * @param ctx the parse tree
+	 */
+	void enterTokensSpec(ANTLRv3Parser.TokensSpecContext ctx);
+	/**
+	 * Exit a parse tree produced by {@link ANTLRv3Parser#tokensSpec}.
+	 * @param ctx the parse tree
+	 */
+	void exitTokensSpec(ANTLRv3Parser.TokensSpecContext ctx);
+	/**
+	 * Enter a parse tree produced by {@link ANTLRv3Parser#tokenSpec}.
+	 * @param ctx the parse tree
+	 */
+	void enterTokenSpec(ANTLRv3Parser.TokenSpecContext ctx);
+	/**
+	 * Exit a parse tree produced by {@link ANTLRv3Parser#tokenSpec}.
+	 * @param ctx the parse tree
+	 */
+	void exitTokenSpec(ANTLRv3Parser.TokenSpecContext ctx);
+	/**
+	 * Enter a parse tree produced by {@link ANTLRv3Parser#attrScope}.
+	 * @param ctx the parse tree
+	 */
+	void enterAttrScope(ANTLRv3Parser.AttrScopeContext ctx);
+	/**
+	 * Exit a parse tree produced by {@link ANTLRv3Parser#attrScope}.
+	 * @param ctx the parse tree
+	 */
+	void exitAttrScope(ANTLRv3Parser.AttrScopeContext ctx);
+	/**
+	 * Enter a parse tree produced by {@link ANTLRv3Parser#action}.
+	 * @param ctx the parse tree
+	 */
+	void enterAction(ANTLRv3Parser.ActionContext ctx);
+	/**
+	 * Exit a parse tree produced by {@link ANTLRv3Parser#action}.
+	 * @param ctx the parse tree
+	 */
+	void exitAction(ANTLRv3Parser.ActionContext ctx);
+	/**
+	 * Enter a parse tree produced by {@link ANTLRv3Parser#actionScopeName}.
+	 * @param ctx the parse tree
+	 */
+	void enterActionScopeName(ANTLRv3Parser.ActionScopeNameContext ctx);
+	/**
+	 * Exit a parse tree produced by {@link ANTLRv3Parser#actionScopeName}.
+	 * @param ctx the parse tree
+	 */
+	void exitActionScopeName(ANTLRv3Parser.ActionScopeNameContext ctx);
+	/**
+	 * Enter a parse tree produced by {@link ANTLRv3Parser#optionsSpec}.
+	 * @param ctx the parse tree
+	 */
+	void enterOptionsSpec(ANTLRv3Parser.OptionsSpecContext ctx);
+	/**
+	 * Exit a parse tree produced by {@link ANTLRv3Parser#optionsSpec}.
+	 * @param ctx the parse tree
+	 */
+	void exitOptionsSpec(ANTLRv3Parser.OptionsSpecContext ctx);
+	/**
+	 * Enter a parse tree produced by {@link ANTLRv3Parser#option}.
+	 * @param ctx the parse tree
+	 */
+	void enterOption(ANTLRv3Parser.OptionContext ctx);
+	/**
+	 * Exit a parse tree produced by {@link ANTLRv3Parser#option}.
+	 * @param ctx the parse tree
+	 */
+	void exitOption(ANTLRv3Parser.OptionContext ctx);
+	/**
+	 * Enter a parse tree produced by {@link ANTLRv3Parser#optionValue}.
+	 * @param ctx the parse tree
+	 */
+	void enterOptionValue(ANTLRv3Parser.OptionValueContext ctx);
+	/**
+	 * Exit a parse tree produced by {@link ANTLRv3Parser#optionValue}.
+	 * @param ctx the parse tree
+	 */
+	void exitOptionValue(ANTLRv3Parser.OptionValueContext ctx);
+	/**
+	 * Enter a parse tree produced by {@link ANTLRv3Parser#rule_}.
+	 * @param ctx the parse tree
+	 */
+	void enterRule_(ANTLRv3Parser.Rule_Context ctx);
+	/**
+	 * Exit a parse tree produced by {@link ANTLRv3Parser#rule_}.
+	 * @param ctx the parse tree
+	 */
+	void exitRule_(ANTLRv3Parser.Rule_Context ctx);
+	/**
+	 * Enter a parse tree produced by {@link ANTLRv3Parser#ruleAction}.
+	 * @param ctx the parse tree
+	 */
+	void enterRuleAction(ANTLRv3Parser.RuleActionContext ctx);
+	/**
+	 * Exit a parse tree produced by {@link ANTLRv3Parser#ruleAction}.
+	 * @param ctx the parse tree
+	 */
+	void exitRuleAction(ANTLRv3Parser.RuleActionContext ctx);
+	/**
+	 * Enter a parse tree produced by {@link ANTLRv3Parser#throwsSpec}.
+	 * @param ctx the parse tree
+	 */
+	void enterThrowsSpec(ANTLRv3Parser.ThrowsSpecContext ctx);
+	/**
+	 * Exit a parse tree produced by {@link ANTLRv3Parser#throwsSpec}.
+	 * @param ctx the parse tree
+	 */
+	void exitThrowsSpec(ANTLRv3Parser.ThrowsSpecContext ctx);
+	/**
+	 * Enter a parse tree produced by {@link ANTLRv3Parser#ruleScopeSpec}.
+	 * @param ctx the parse tree
+	 */
+	void enterRuleScopeSpec(ANTLRv3Parser.RuleScopeSpecContext ctx);
+	/**
+	 * Exit a parse tree produced by {@link ANTLRv3Parser#ruleScopeSpec}.
+	 * @param ctx the parse tree
+	 */
+	void exitRuleScopeSpec(ANTLRv3Parser.RuleScopeSpecContext ctx);
+	/**
+	 * Enter a parse tree produced by {@link ANTLRv3Parser#block}.
+	 * @param ctx the parse tree
+	 */
+	void enterBlock(ANTLRv3Parser.BlockContext ctx);
+	/**
+	 * Exit a parse tree produced by {@link ANTLRv3Parser#block}.
+	 * @param ctx the parse tree
+	 */
+	void exitBlock(ANTLRv3Parser.BlockContext ctx);
+	/**
+	 * Enter a parse tree produced by {@link ANTLRv3Parser#altList}.
+	 * @param ctx the parse tree
+	 */
+	void enterAltList(ANTLRv3Parser.AltListContext ctx);
+	/**
+	 * Exit a parse tree produced by {@link ANTLRv3Parser#altList}.
+	 * @param ctx the parse tree
+	 */
+	void exitAltList(ANTLRv3Parser.AltListContext ctx);
+	/**
+	 * Enter a parse tree produced by {@link ANTLRv3Parser#alternative}.
+	 * @param ctx the parse tree
+	 */
+	void enterAlternative(ANTLRv3Parser.AlternativeContext ctx);
+	/**
+	 * Exit a parse tree produced by {@link ANTLRv3Parser#alternative}.
+	 * @param ctx the parse tree
+	 */
+	void exitAlternative(ANTLRv3Parser.AlternativeContext ctx);
+	/**
+	 * Enter a parse tree produced by {@link ANTLRv3Parser#exceptionGroup}.
+	 * @param ctx the parse tree
+	 */
+	void enterExceptionGroup(ANTLRv3Parser.ExceptionGroupContext ctx);
+	/**
+	 * Exit a parse tree produced by {@link ANTLRv3Parser#exceptionGroup}.
+	 * @param ctx the parse tree
+	 */
+	void exitExceptionGroup(ANTLRv3Parser.ExceptionGroupContext ctx);
+	/**
+	 * Enter a parse tree produced by {@link ANTLRv3Parser#exceptionHandler}.
+	 * @param ctx the parse tree
+	 */
+	void enterExceptionHandler(ANTLRv3Parser.ExceptionHandlerContext ctx);
+	/**
+	 * Exit a parse tree produced by {@link ANTLRv3Parser#exceptionHandler}.
+	 * @param ctx the parse tree
+	 */
+	void exitExceptionHandler(ANTLRv3Parser.ExceptionHandlerContext ctx);
+	/**
+	 * Enter a parse tree produced by {@link ANTLRv3Parser#finallyClause}.
+	 * @param ctx the parse tree
+	 */
+	void enterFinallyClause(ANTLRv3Parser.FinallyClauseContext ctx);
+	/**
+	 * Exit a parse tree produced by {@link ANTLRv3Parser#finallyClause}.
+	 * @param ctx the parse tree
+	 */
+	void exitFinallyClause(ANTLRv3Parser.FinallyClauseContext ctx);
+	/**
+	 * Enter a parse tree produced by {@link ANTLRv3Parser#element}.
+	 * @param ctx the parse tree
+	 */
+	void enterElement(ANTLRv3Parser.ElementContext ctx);
+	/**
+	 * Exit a parse tree produced by {@link ANTLRv3Parser#element}.
+	 * @param ctx the parse tree
+	 */
+	void exitElement(ANTLRv3Parser.ElementContext ctx);
+	/**
+	 * Enter a parse tree produced by {@link ANTLRv3Parser#elementNoOptionSpec}.
+	 * @param ctx the parse tree
+	 */
+	void enterElementNoOptionSpec(ANTLRv3Parser.ElementNoOptionSpecContext ctx);
+	/**
+	 * Exit a parse tree produced by {@link ANTLRv3Parser#elementNoOptionSpec}.
+	 * @param ctx the parse tree
+	 */
+	void exitElementNoOptionSpec(ANTLRv3Parser.ElementNoOptionSpecContext ctx);
+	/**
+	 * Enter a parse tree produced by {@link ANTLRv3Parser#actionBlock}.
+	 * @param ctx the parse tree
+	 */
+	void enterActionBlock(ANTLRv3Parser.ActionBlockContext ctx);
+	/**
+	 * Exit a parse tree produced by {@link ANTLRv3Parser#actionBlock}.
+	 * @param ctx the parse tree
+	 */
+	void exitActionBlock(ANTLRv3Parser.ActionBlockContext ctx);
+	/**
+	 * Enter a parse tree produced by {@link ANTLRv3Parser#argActionBlock}.
+	 * @param ctx the parse tree
+	 */
+	void enterArgActionBlock(ANTLRv3Parser.ArgActionBlockContext ctx);
+	/**
+	 * Exit a parse tree produced by {@link ANTLRv3Parser#argActionBlock}.
+	 * @param ctx the parse tree
+	 */
+	void exitArgActionBlock(ANTLRv3Parser.ArgActionBlockContext ctx);
+	/**
+	 * Enter a parse tree produced by {@link ANTLRv3Parser#atom}.
+	 * @param ctx the parse tree
+	 */
+	void enterAtom(ANTLRv3Parser.AtomContext ctx);
+	/**
+	 * Exit a parse tree produced by {@link ANTLRv3Parser#atom}.
+	 * @param ctx the parse tree
+	 */
+	void exitAtom(ANTLRv3Parser.AtomContext ctx);
+	/**
+	 * Enter a parse tree produced by {@link ANTLRv3Parser#notSet}.
+	 * @param ctx the parse tree
+	 */
+	void enterNotSet(ANTLRv3Parser.NotSetContext ctx);
+	/**
+	 * Exit a parse tree produced by {@link ANTLRv3Parser#notSet}.
+	 * @param ctx the parse tree
+	 */
+	void exitNotSet(ANTLRv3Parser.NotSetContext ctx);
+	/**
+	 * Enter a parse tree produced by {@link ANTLRv3Parser#treeSpec}.
+	 * @param ctx the parse tree
+	 */
+	void enterTreeSpec(ANTLRv3Parser.TreeSpecContext ctx);
+	/**
+	 * Exit a parse tree produced by {@link ANTLRv3Parser#treeSpec}.
+	 * @param ctx the parse tree
+	 */
+	void exitTreeSpec(ANTLRv3Parser.TreeSpecContext ctx);
+	/**
+	 * Enter a parse tree produced by {@link ANTLRv3Parser#ebnf}.
+	 * @param ctx the parse tree
+	 */
+	void enterEbnf(ANTLRv3Parser.EbnfContext ctx);
+	/**
+	 * Exit a parse tree produced by {@link ANTLRv3Parser#ebnf}.
+	 * @param ctx the parse tree
+	 */
+	void exitEbnf(ANTLRv3Parser.EbnfContext ctx);
+	/**
+	 * Enter a parse tree produced by {@link ANTLRv3Parser#range_}.
+	 * @param ctx the parse tree
+	 */
+	void enterRange_(ANTLRv3Parser.Range_Context ctx);
+	/**
+	 * Exit a parse tree produced by {@link ANTLRv3Parser#range_}.
+	 * @param ctx the parse tree
+	 */
+	void exitRange_(ANTLRv3Parser.Range_Context ctx);
+	/**
+	 * Enter a parse tree produced by {@link ANTLRv3Parser#terminal_}.
+	 * @param ctx the parse tree
+	 */
+	void enterTerminal_(ANTLRv3Parser.Terminal_Context ctx);
+	/**
+	 * Exit a parse tree produced by {@link ANTLRv3Parser#terminal_}.
+	 * @param ctx the parse tree
+	 */
+	void exitTerminal_(ANTLRv3Parser.Terminal_Context ctx);
+	/**
+	 * Enter a parse tree produced by {@link ANTLRv3Parser#notTerminal}.
+	 * @param ctx the parse tree
+	 */
+	void enterNotTerminal(ANTLRv3Parser.NotTerminalContext ctx);
+	/**
+	 * Exit a parse tree produced by {@link ANTLRv3Parser#notTerminal}.
+	 * @param ctx the parse tree
+	 */
+	void exitNotTerminal(ANTLRv3Parser.NotTerminalContext ctx);
+	/**
+	 * Enter a parse tree produced by {@link ANTLRv3Parser#ebnfSuffix}.
+	 * @param ctx the parse tree
+	 */
+	void enterEbnfSuffix(ANTLRv3Parser.EbnfSuffixContext ctx);
+	/**
+	 * Exit a parse tree produced by {@link ANTLRv3Parser#ebnfSuffix}.
+	 * @param ctx the parse tree
+	 */
+	void exitEbnfSuffix(ANTLRv3Parser.EbnfSuffixContext ctx);
+	/**
+	 * Enter a parse tree produced by {@link ANTLRv3Parser#rewrite}.
+	 * @param ctx the parse tree
+	 */
+	void enterRewrite(ANTLRv3Parser.RewriteContext ctx);
+	/**
+	 * Exit a parse tree produced by {@link ANTLRv3Parser#rewrite}.
+	 * @param ctx the parse tree
+	 */
+	void exitRewrite(ANTLRv3Parser.RewriteContext ctx);
+	/**
+	 * Enter a parse tree produced by {@link ANTLRv3Parser#rewrite_alternative}.
+	 * @param ctx the parse tree
+	 */
+	void enterRewrite_alternative(ANTLRv3Parser.Rewrite_alternativeContext ctx);
+	/**
+	 * Exit a parse tree produced by {@link ANTLRv3Parser#rewrite_alternative}.
+	 * @param ctx the parse tree
+	 */
+	void exitRewrite_alternative(ANTLRv3Parser.Rewrite_alternativeContext ctx);
+	/**
+	 * Enter a parse tree produced by {@link ANTLRv3Parser#rewrite_tree_block}.
+	 * @param ctx the parse tree
+	 */
+	void enterRewrite_tree_block(ANTLRv3Parser.Rewrite_tree_blockContext ctx);
+	/**
+	 * Exit a parse tree produced by {@link ANTLRv3Parser#rewrite_tree_block}.
+	 * @param ctx the parse tree
+	 */
+	void exitRewrite_tree_block(ANTLRv3Parser.Rewrite_tree_blockContext ctx);
+	/**
+	 * Enter a parse tree produced by {@link ANTLRv3Parser#rewrite_tree_alternative}.
+	 * @param ctx the parse tree
+	 */
+	void enterRewrite_tree_alternative(ANTLRv3Parser.Rewrite_tree_alternativeContext ctx);
+	/**
+	 * Exit a parse tree produced by {@link ANTLRv3Parser#rewrite_tree_alternative}.
+	 * @param ctx the parse tree
+	 */
+	void exitRewrite_tree_alternative(ANTLRv3Parser.Rewrite_tree_alternativeContext ctx);
+	/**
+	 * Enter a parse tree produced by {@link ANTLRv3Parser#rewrite_tree_element}.
+	 * @param ctx the parse tree
+	 */
+	void enterRewrite_tree_element(ANTLRv3Parser.Rewrite_tree_elementContext ctx);
+	/**
+	 * Exit a parse tree produced by {@link ANTLRv3Parser#rewrite_tree_element}.
+	 * @param ctx the parse tree
+	 */
+	void exitRewrite_tree_element(ANTLRv3Parser.Rewrite_tree_elementContext ctx);
+	/**
+	 * Enter a parse tree produced by {@link ANTLRv3Parser#rewrite_tree_atom}.
+	 * @param ctx the parse tree
+	 */
+	void enterRewrite_tree_atom(ANTLRv3Parser.Rewrite_tree_atomContext ctx);
+	/**
+	 * Exit a parse tree produced by {@link ANTLRv3Parser#rewrite_tree_atom}.
+	 * @param ctx the parse tree
+	 */
+	void exitRewrite_tree_atom(ANTLRv3Parser.Rewrite_tree_atomContext ctx);
+	/**
+	 * Enter a parse tree produced by {@link ANTLRv3Parser#rewrite_tree_ebnf}.
+	 * @param ctx the parse tree
+	 */
+	void enterRewrite_tree_ebnf(ANTLRv3Parser.Rewrite_tree_ebnfContext ctx);
+	/**
+	 * Exit a parse tree produced by {@link ANTLRv3Parser#rewrite_tree_ebnf}.
+	 * @param ctx the parse tree
+	 */
+	void exitRewrite_tree_ebnf(ANTLRv3Parser.Rewrite_tree_ebnfContext ctx);
+	/**
+	 * Enter a parse tree produced by {@link ANTLRv3Parser#rewrite_tree}.
+	 * @param ctx the parse tree
+	 */
+	void enterRewrite_tree(ANTLRv3Parser.Rewrite_treeContext ctx);
+	/**
+	 * Exit a parse tree produced by {@link ANTLRv3Parser#rewrite_tree}.
+	 * @param ctx the parse tree
+	 */
+	void exitRewrite_tree(ANTLRv3Parser.Rewrite_treeContext ctx);
+	/**
+	 * Enter a parse tree produced by {@link ANTLRv3Parser#rewrite_template}.
+	 * @param ctx the parse tree
+	 */
+	void enterRewrite_template(ANTLRv3Parser.Rewrite_templateContext ctx);
+	/**
+	 * Exit a parse tree produced by {@link ANTLRv3Parser#rewrite_template}.
+	 * @param ctx the parse tree
+	 */
+	void exitRewrite_template(ANTLRv3Parser.Rewrite_templateContext ctx);
+	/**
+	 * Enter a parse tree produced by {@link ANTLRv3Parser#rewrite_template_ref}.
+	 * @param ctx the parse tree
+	 */
+	void enterRewrite_template_ref(ANTLRv3Parser.Rewrite_template_refContext ctx);
+	/**
+	 * Exit a parse tree produced by {@link ANTLRv3Parser#rewrite_template_ref}.
+	 * @param ctx the parse tree
+	 */
+	void exitRewrite_template_ref(ANTLRv3Parser.Rewrite_template_refContext ctx);
+	/**
+	 * Enter a parse tree produced by {@link ANTLRv3Parser#rewrite_indirect_template_head}.
+	 * @param ctx the parse tree
+	 */
+	void enterRewrite_indirect_template_head(ANTLRv3Parser.Rewrite_indirect_template_headContext ctx);
+	/**
+	 * Exit a parse tree produced by {@link ANTLRv3Parser#rewrite_indirect_template_head}.
+	 * @param ctx the parse tree
+	 */
+	void exitRewrite_indirect_template_head(ANTLRv3Parser.Rewrite_indirect_template_headContext ctx);
+	/**
+	 * Enter a parse tree produced by {@link ANTLRv3Parser#rewrite_template_args}.
+	 * @param ctx the parse tree
+	 */
+	void enterRewrite_template_args(ANTLRv3Parser.Rewrite_template_argsContext ctx);
+	/**
+	 * Exit a parse tree produced by {@link ANTLRv3Parser#rewrite_template_args}.
+	 * @param ctx the parse tree
+	 */
+	void exitRewrite_template_args(ANTLRv3Parser.Rewrite_template_argsContext ctx);
+	/**
+	 * Enter a parse tree produced by {@link ANTLRv3Parser#rewrite_template_arg}.
+	 * @param ctx the parse tree
+	 */
+	void enterRewrite_template_arg(ANTLRv3Parser.Rewrite_template_argContext ctx);
+	/**
+	 * Exit a parse tree produced by {@link ANTLRv3Parser#rewrite_template_arg}.
+	 * @param ctx the parse tree
+	 */
+	void exitRewrite_template_arg(ANTLRv3Parser.Rewrite_template_argContext ctx);
+	/**
+	 * Enter a parse tree produced by {@link ANTLRv3Parser#id_}.
+	 * @param ctx the parse tree
+	 */
+	void enterId_(ANTLRv3Parser.Id_Context ctx);
+	/**
+	 * Exit a parse tree produced by {@link ANTLRv3Parser#id_}.
+	 * @param ctx the parse tree
+	 */
+	void exitId_(ANTLRv3Parser.Id_Context ctx);
+}
\ No newline at end of file
diff --git a/java/languages.antlr/src/org/antlr/parser/antlr3/LexerAdaptor.java b/java/languages.antlr/src/org/antlr/parser/antlr3/LexerAdaptor.java
new file mode 100644
index 0000000..d0991b2
--- /dev/null
+++ b/java/languages.antlr/src/org/antlr/parser/antlr3/LexerAdaptor.java
@@ -0,0 +1,146 @@
+/*
+ [The "BSD licence"]
+ Copyright (c) 2005-2007 Terence Parr
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+ 1. Redistributions of source code must retain the above copyright
+    notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+    notice, this list of conditions and the following disclaimer in the
+    documentation and/or other materials provided with the distribution.
+ 3. The name of the author may not be used to endorse or promote products
+    derived from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 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 OF
+ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+
+package org.antlr.parser.antlr3;
+import org.antlr.v4.runtime.CharStream;
+import org.antlr.v4.runtime.Lexer;
+import org.antlr.v4.runtime.Token;
+import org.antlr.v4.runtime.misc.Interval;
+
+public abstract class LexerAdaptor extends Lexer {
+
+    /**
+     *  Generic type for OPTIONS, TOKENS and CHANNELS
+     */
+    private static final int PREQUEL_CONSTRUCT = -10;
+
+    public LexerAdaptor(CharStream input) {
+        super(input);
+    }
+
+    /**
+     * Track whether we are inside of a rule and whether it is lexical parser. _currentRuleType==Token.INVALID_TYPE
+     * means that we are outside of a rule. At the first sign of a rule name reference and _currentRuleType==invalid, we
+     * can assume that we are starting a parser rule. Similarly, seeing a token reference when not already in rule means
+     * starting a token rule. The terminating ';' of a rule, flips this back to invalid type.
+     *
+     * This is not perfect logic but works. For example, "grammar T;" means that we start and stop a lexical rule for
+     * the "T;". Dangerous but works.
+     *
+     * The whole point of this state information is to distinguish between [..arg actions..] and [charsets]. Char sets
+     * can only occur in lexical rules and arg actions cannot occur.
+     */
+    private int _currentRuleType = Token.INVALID_TYPE;
+
+    private boolean insideOptionsBlock = false;
+
+    public int getCurrentRuleType() {
+        return _currentRuleType;
+    }
+
+    public void setCurrentRuleType(int ruleType) {
+        this._currentRuleType = ruleType;
+    }
+
+    protected void handleBeginArgument()
+    {
+        if (inLexerRule()) {
+            pushMode(ANTLRv3Lexer.LexerCharSet);
+            more();
+        } else {
+            pushMode(ANTLRv3Lexer.Argument);
+        }
+    }
+
+    protected void handleEndArgument() {
+        popMode();
+        if (_modeStack.size() > 0) {
+            setType(ANTLRv3Lexer.ARGUMENT_CONTENT);
+        }
+    }
+
+    protected void handleEndAction() {
+        int oldMode = _mode;
+        int newMode = popMode();
+        boolean isActionWithinAction = _modeStack.size() > 0
+            && newMode == ANTLRv3Lexer.Actionx
+            && oldMode == newMode;
+
+        if (isActionWithinAction) {
+            setType(ANTLRv3Lexer.ACTION_CONTENT);
+        }
+    }
+
+    protected void handleOptionsLBrace() {
+		setType(ANTLRv3Lexer.LBRACE);
+    }
+
+    @Override
+    public Token emit() {
+        if ((_type == ANTLRv3Lexer.OPTIONS || _type == ANTLRv3Lexer.TOKENS)
+              && _currentRuleType == Token.INVALID_TYPE) { // enter prequel construct ending with an RBRACE
+            setCurrentRuleType(PREQUEL_CONSTRUCT);
+        } else if (_type == ANTLRv3Lexer.RBRACE && _currentRuleType == PREQUEL_CONSTRUCT) { // exit prequel construct
+            setCurrentRuleType(Token.INVALID_TYPE);
+        } else if (_type == ANTLRv3Lexer.AT && _currentRuleType == Token.INVALID_TYPE) { // enter action
+            setCurrentRuleType(ANTLRv3Lexer.AT);
+        } else if (_type == ANTLRv3Lexer.END_ACTION && _currentRuleType == ANTLRv3Lexer.AT) { // exit action
+            setCurrentRuleType(Token.INVALID_TYPE);
+        } else if (_type == ANTLRv3Lexer.ID) {
+            String firstChar = _input.getText(Interval.of(_tokenStartCharIndex, _tokenStartCharIndex));
+            if (Character.isUpperCase(firstChar.charAt(0))) {
+                _type = ANTLRv3Lexer.TOKEN_REF;
+            } else {
+                _type = ANTLRv3Lexer.RULE_REF;
+            }
+
+            if (getCurrentRuleType() == Token.INVALID_TYPE) { // if outside of rule def
+                setCurrentRuleType(_type); // set to inside lexer or parser rule
+            }
+        } else if (_type == ANTLRv3Lexer.SEMI) { // exit rule def
+            setCurrentRuleType(Token.INVALID_TYPE);
+        }
+
+        return super.emit();
+    }
+
+    private boolean inLexerRule() {
+        return getCurrentRuleType() == ANTLRv3Lexer.TOKEN_REF;
+    }
+
+    @SuppressWarnings("unused")
+    private boolean inParserRule() { // not used, but added for clarity
+        return getCurrentRuleType() == ANTLRv3Lexer.RULE_REF;
+    }
+
+    @Override
+    public void reset() {
+        setCurrentRuleType(Token.INVALID_TYPE);
+        super.reset();
+    }   
+}
diff --git a/java/languages.antlr/src/org/antlr/parser/antlr4/ANTLRv4Lexer.g4 b/java/languages.antlr/src/org/antlr/parser/antlr4/ANTLRv4Lexer.g4
new file mode 100644
index 0000000..d72e8f7
--- /dev/null
+++ b/java/languages.antlr/src/org/antlr/parser/antlr4/ANTLRv4Lexer.g4
@@ -0,0 +1,406 @@
+/*
+ * [The "BSD license"]
+ *  Copyright (c) 2012-2015 Terence Parr
+ *  Copyright (c) 2012-2015 Sam Harwell
+ *  Copyright (c) 2015 Gerald Rosenberg
+ *  All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions
+ *  are met:
+ *
+ *  1. Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *  2. Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *  3. The name of the author may not be used to endorse or promote products
+ *     derived from this software without specific prior written permission.
+ *
+ *  THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ *  IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ *  OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ *  IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ *  INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ *  NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ *  DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 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 OF
+ *  THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+/**
+ *	A grammar for ANTLR v4 implemented using v4 syntax
+ *
+ *	Modified 2015.06.16 gbr
+ *	-- update for compatibility with Antlr v4.5
+ */
+
+// ======================================================
+// Lexer specification
+// ======================================================
+
+lexer grammar ANTLRv4Lexer;
+
+options { superClass = LexerAdaptor; }
+import LexBasic;
+
+// Standard set of fragments
+tokens { TOKEN_REF , RULE_REF , LEXER_CHAR_SET }
+channels { OFF_CHANNEL , COMMENT }
+
+// -------------------------
+// Comments
+DOC_COMMENT
+   : DocComment -> channel (COMMENT)
+   ;
+
+BLOCK_COMMENT
+   : BlockComment -> channel (COMMENT)
+   ;
+
+LINE_COMMENT
+   : LineComment -> channel (COMMENT)
+   ;
+
+// -------------------------
+// Integer
+
+INT
+   : DecimalNumeral
+   ;
+
+// -------------------------
+// Literal string
+//
+// ANTLR makes no distinction between a single character literal and a
+// multi-character string. All literals are single quote delimited and
+// may contain unicode escape sequences of the form \uxxxx, where x
+// is a valid hexadecimal number (per Unicode standard).
+STRING_LITERAL
+   : SQuoteLiteral
+   ;
+
+UNTERMINATED_STRING_LITERAL
+   : USQuoteLiteral
+   ;
+
+// -------------------------
+// Arguments
+//
+// Certain argument lists, such as those specifying call parameters
+// to a rule invocation, or input parameters to a rule specification
+// are contained within square brackets.
+BEGIN_ARGUMENT
+   : LBrack
+   { this.handleBeginArgument(); }
+   ;
+
+// -------------------------
+// Target Language Actions
+BEGIN_ACTION
+   : LBrace -> pushMode (TargetLanguageAction)
+   ;
+
+// -------------------------
+// Keywords
+//
+// 'options', 'tokens', and 'channels' are considered keywords
+// but only when followed by '{', and considered as a single token.
+// Otherwise, the symbols are tokenized as RULE_REF and allowed as
+// an identifier in a labeledElement.
+OPTIONS      : 'options'  WSNLCHARS* '{'  ;
+TOKENS       : 'tokens'   WSNLCHARS* '{'  ;
+CHANNELS     : 'channels' WSNLCHARS* '{'  ;
+
+fragment WSNLCHARS : ' ' | '\t' | '\f' | '\n' | '\r' ;
+
+IMPORT
+   : 'import'
+   ;
+
+FRAGMENT
+   : 'fragment'
+   ;
+
+LEXER
+   : 'lexer'
+   ;
+
+PARSER
+   : 'parser'
+   ;
+
+GRAMMAR
+   : 'grammar'
+   ;
+
+PROTECTED
+   : 'protected'
+   ;
+
+PUBLIC
+   : 'public'
+   ;
+
+PRIVATE
+   : 'private'
+   ;
+
+RETURNS
+   : 'returns'
+   ;
+
+LOCALS
+   : 'locals'
+   ;
+
+THROWS
+   : 'throws'
+   ;
+
+CATCH
+   : 'catch'
+   ;
+
+FINALLY
+   : 'finally'
+   ;
+
+MODE
+   : 'mode'
+   ;
+   // -------------------------
+   // Punctuation
+
+COLON
+   : Colon
+   ;
+
+COLONCOLON
+   : DColon
+   ;
+
+COMMA
+   : Comma
+   ;
+
+SEMI
+   : Semi
+   ;
+
+LPAREN
+   : LParen
+   ;
+
+RPAREN
+   : RParen
+   ;
+
+LBRACE
+   : LBrace
+   ;
+
+RBRACE
+   : RBrace
+   ;
+
+RARROW
+   : RArrow
+   ;
+
+LT
+   : Lt
+   ;
+
+GT
+   : Gt
+   ;
+
+ASSIGN
+   : Equal
+   ;
+
+QUESTION
+   : Question
+   ;
+
+STAR
+   : Star
+   ;
+
+PLUS_ASSIGN
+   : PlusAssign
+   ;
+
+PLUS
+   : Plus
+   ;
+
+OR
+   : Pipe
+   ;
+
+DOLLAR
+   : Dollar
+   ;
+
+RANGE
+   : Range
+   ;
+
+DOT
+   : Dot
+   ;
+
+AT
+   : At
+   ;
+
+POUND
+   : Pound
+   ;
+
+NOT
+   : Tilde
+   ;
+   // -------------------------
+   // Identifiers - allows unicode rule/token names
+
+ID
+   : Id
+   ;
+   // -------------------------
+   // Whitespace
+
+WS
+   : Ws+ -> channel (OFF_CHANNEL)
+   ;
+
+// -------------------------
+// Illegal Characters
+//
+// This is an illegal character trap which is always the last rule in the
+// lexer specification. It matches a single character of any value and being
+// the last rule in the file will match when no other rule knows what to do
+// about the character. It is reported as an error but is not passed on to the
+// parser. This means that the parser to deal with the gramamr file anyway
+// but we will not try to analyse or code generate from a file with lexical
+// errors.
+
+// Comment this rule out to allow the error to be propagated to the parser
+ERRCHAR
+   : . -> channel (HIDDEN)
+   ;
+
+// ======================================================
+// Lexer modes
+// -------------------------
+// Arguments
+mode Argument;
+// E.g., [int x, List<String> a[]]
+NESTED_ARGUMENT
+   : LBrack -> type (ARGUMENT_CONTENT) , pushMode (Argument)
+   ;
+
+ARGUMENT_ESCAPE
+   : EscAny -> type (ARGUMENT_CONTENT)
+   ;
+
+ARGUMENT_STRING_LITERAL
+   : DQuoteLiteral -> type (ARGUMENT_CONTENT)
+   ;
+
+ARGUMENT_CHAR_LITERAL
+   : SQuoteLiteral -> type (ARGUMENT_CONTENT)
+   ;
+
+END_ARGUMENT
+   : RBrack
+   { this.handleEndArgument(); }
+   ;
+
+// added this to return non-EOF token type here. EOF does something weird
+UNTERMINATED_ARGUMENT
+   : EOF -> popMode
+   ;
+
+ARGUMENT_CONTENT
+   : .
+   ;
+
+// TODO: This grammar and the one used in the Intellij Antlr4 plugin differ
+// for "actions". This needs to be resolved at some point.
+// The Intellij Antlr4 grammar is here:
+// https://github.com/antlr/intellij-plugin-v4/blob/1f36fde17f7fa63cb18d7eeb9cb213815ac658fb/src/main/antlr/org/antlr/intellij/plugin/parser/ANTLRv4Lexer.g4#L587
+
+// -------------------------
+// Target Language Actions
+//
+// Many language targets use {} as block delimiters and so we
+// must recursively match {} delimited blocks to balance the
+// braces. Additionally, we must make some assumptions about
+// literal string representation in the target language. We assume
+// that they are delimited by ' or " and so consume these
+// in their own alts so as not to inadvertantly match {}.
+mode TargetLanguageAction;
+NESTED_ACTION
+   : LBrace -> type (ACTION_CONTENT) , pushMode (TargetLanguageAction)
+   ;
+
+ACTION_ESCAPE
+   : EscAny -> type (ACTION_CONTENT)
+   ;
+
+ACTION_STRING_LITERAL
+   : DQuoteLiteral -> type (ACTION_CONTENT)
+   ;
+
+ACTION_CHAR_LITERAL
+   : SQuoteLiteral -> type (ACTION_CONTENT)
+   ;
+
+ACTION_DOC_COMMENT
+   : DocComment -> type (ACTION_CONTENT)
+   ;
+
+ACTION_BLOCK_COMMENT
+   : BlockComment -> type (ACTION_CONTENT)
+   ;
+
+ACTION_LINE_COMMENT
+   : LineComment -> type (ACTION_CONTENT)
+   ;
+
+END_ACTION
+   : RBrace
+   { this.handleEndAction(); }
+   ;
+
+UNTERMINATED_ACTION
+   : EOF -> popMode
+   ;
+
+ACTION_CONTENT
+   : .
+   ;
+
+// -------------------------
+mode LexerCharSet;
+LEXER_CHAR_SET_BODY
+   : (~ [\]\\] | EscAny)+ -> more
+   ;
+
+LEXER_CHAR_SET
+   : RBrack -> popMode
+   ;
+
+UNTERMINATED_CHAR_SET
+   : EOF -> popMode
+   ;
+
+// ------------------------------------------------------------------------------
+// Grammar specific Keywords, Punctuation, etc.
+fragment Id
+   : NameStartChar NameChar*
+   ;
+   
diff --git a/java/languages.antlr/src/org/antlr/parser/antlr4/ANTLRv4Lexer.java b/java/languages.antlr/src/org/antlr/parser/antlr4/ANTLRv4Lexer.java
new file mode 100644
index 0000000..54abded
--- /dev/null
+++ b/java/languages.antlr/src/org/antlr/parser/antlr4/ANTLRv4Lexer.java
@@ -0,0 +1,484 @@
+// Generated from ANTLRv4Lexer.g4 by ANTLR 4.7.2
+
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+// DO NOT EDIT THIS FILE MANUALLY!
+// SEE build.xml FOR INSTRUCTIONS
+
+
+package org.antlr.parser.antlr4;
+
+
+import org.antlr.v4.runtime.Lexer;
+import org.antlr.v4.runtime.CharStream;
+import org.antlr.v4.runtime.Token;
+import org.antlr.v4.runtime.TokenStream;
+import org.antlr.v4.runtime.*;
+import org.antlr.v4.runtime.atn.*;
+import org.antlr.v4.runtime.dfa.DFA;
+import org.antlr.v4.runtime.misc.*;
+
+@SuppressWarnings({"all", "warnings", "unchecked", "unused", "cast"})
+public class ANTLRv4Lexer extends LexerAdaptor {
+	static { RuntimeMetaData.checkVersion("4.7.2", RuntimeMetaData.VERSION); }
+
+	protected static final DFA[] _decisionToDFA;
+	protected static final PredictionContextCache _sharedContextCache =
+		new PredictionContextCache();
+	public static final int
+		TOKEN_REF=1, RULE_REF=2, LEXER_CHAR_SET=3, DOC_COMMENT=4, BLOCK_COMMENT=5, 
+		LINE_COMMENT=6, INT=7, STRING_LITERAL=8, UNTERMINATED_STRING_LITERAL=9, 
+		BEGIN_ARGUMENT=10, BEGIN_ACTION=11, OPTIONS=12, TOKENS=13, CHANNELS=14, 
+		IMPORT=15, FRAGMENT=16, LEXER=17, PARSER=18, GRAMMAR=19, PROTECTED=20, 
+		PUBLIC=21, PRIVATE=22, RETURNS=23, LOCALS=24, THROWS=25, CATCH=26, FINALLY=27, 
+		MODE=28, COLON=29, COLONCOLON=30, COMMA=31, SEMI=32, LPAREN=33, RPAREN=34, 
+		LBRACE=35, RBRACE=36, RARROW=37, LT=38, GT=39, ASSIGN=40, QUESTION=41, 
+		STAR=42, PLUS_ASSIGN=43, PLUS=44, OR=45, DOLLAR=46, RANGE=47, DOT=48, 
+		AT=49, POUND=50, NOT=51, ID=52, WS=53, ERRCHAR=54, END_ARGUMENT=55, UNTERMINATED_ARGUMENT=56, 
+		ARGUMENT_CONTENT=57, END_ACTION=58, UNTERMINATED_ACTION=59, ACTION_CONTENT=60, 
+		UNTERMINATED_CHAR_SET=61;
+	public static final int
+		OFF_CHANNEL=2, COMMENT=3;
+	public static final int
+		Argument=1, TargetLanguageAction=2, LexerCharSet=3;
+	public static String[] channelNames = {
+		"DEFAULT_TOKEN_CHANNEL", "HIDDEN", "OFF_CHANNEL", "COMMENT"
+	};
+
+	public static String[] modeNames = {
+		"DEFAULT_MODE", "Argument", "TargetLanguageAction", "LexerCharSet"
+	};
+
+	private static String[] makeRuleNames() {
+		return new String[] {
+			"DOC_COMMENT", "BLOCK_COMMENT", "LINE_COMMENT", "INT", "STRING_LITERAL", 
+			"UNTERMINATED_STRING_LITERAL", "BEGIN_ARGUMENT", "BEGIN_ACTION", "OPTIONS", 
+			"TOKENS", "CHANNELS", "WSNLCHARS", "IMPORT", "FRAGMENT", "LEXER", "PARSER", 
+			"GRAMMAR", "PROTECTED", "PUBLIC", "PRIVATE", "RETURNS", "LOCALS", "THROWS", 
+			"CATCH", "FINALLY", "MODE", "COLON", "COLONCOLON", "COMMA", "SEMI", "LPAREN", 
+			"RPAREN", "LBRACE", "RBRACE", "RARROW", "LT", "GT", "ASSIGN", "QUESTION", 
+			"STAR", "PLUS_ASSIGN", "PLUS", "OR", "DOLLAR", "RANGE", "DOT", "AT", 
+			"POUND", "NOT", "ID", "WS", "ERRCHAR", "Ws", "Hws", "Vws", "BlockComment", 
+			"DocComment", "LineComment", "EscSeq", "EscAny", "UnicodeEsc", "DecimalNumeral", 
+			"HexDigit", "DecDigit", "BoolLiteral", "CharLiteral", "SQuoteLiteral", 
+			"DQuoteLiteral", "USQuoteLiteral", "NameChar", "NameStartChar", "Int", 
+			"Esc", "Colon", "DColon", "SQuote", "DQuote", "LParen", "RParen", "LBrace", 
+			"RBrace", "LBrack", "RBrack", "RArrow", "Lt", "Gt", "Equal", "Question", 
+			"Star", "Plus", "PlusAssign", "Underscore", "Pipe", "Dollar", "Comma", 
+			"Semi", "Dot", "Range", "At", "Pound", "Tilde", "NESTED_ARGUMENT", "ARGUMENT_ESCAPE", 
+			"ARGUMENT_STRING_LITERAL", "ARGUMENT_CHAR_LITERAL", "END_ARGUMENT", "UNTERMINATED_ARGUMENT", 
+			"ARGUMENT_CONTENT", "NESTED_ACTION", "ACTION_ESCAPE", "ACTION_STRING_LITERAL", 
+			"ACTION_CHAR_LITERAL", "ACTION_DOC_COMMENT", "ACTION_BLOCK_COMMENT", 
+			"ACTION_LINE_COMMENT", "END_ACTION", "UNTERMINATED_ACTION", "ACTION_CONTENT", 
+			"LEXER_CHAR_SET_BODY", "LEXER_CHAR_SET", "UNTERMINATED_CHAR_SET", "Id"
+		};
+	}
+	public static final String[] ruleNames = makeRuleNames();
+
+	private static String[] makeLiteralNames() {
+		return new String[] {
+			null, null, null, null, null, null, null, null, null, null, null, null, 
+			null, null, null, "'import'", "'fragment'", "'lexer'", "'parser'", "'grammar'", 
+			"'protected'", "'public'", "'private'", "'returns'", "'locals'", "'throws'", 
+			"'catch'", "'finally'", "'mode'"
+		};
+	}
+	private static final String[] _LITERAL_NAMES = makeLiteralNames();
+	private static String[] makeSymbolicNames() {
+		return new String[] {
+			null, "TOKEN_REF", "RULE_REF", "LEXER_CHAR_SET", "DOC_COMMENT", "BLOCK_COMMENT", 
+			"LINE_COMMENT", "INT", "STRING_LITERAL", "UNTERMINATED_STRING_LITERAL", 
+			"BEGIN_ARGUMENT", "BEGIN_ACTION", "OPTIONS", "TOKENS", "CHANNELS", "IMPORT", 
+			"FRAGMENT", "LEXER", "PARSER", "GRAMMAR", "PROTECTED", "PUBLIC", "PRIVATE", 
+			"RETURNS", "LOCALS", "THROWS", "CATCH", "FINALLY", "MODE", "COLON", "COLONCOLON", 
+			"COMMA", "SEMI", "LPAREN", "RPAREN", "LBRACE", "RBRACE", "RARROW", "LT", 
+			"GT", "ASSIGN", "QUESTION", "STAR", "PLUS_ASSIGN", "PLUS", "OR", "DOLLAR", 
+			"RANGE", "DOT", "AT", "POUND", "NOT", "ID", "WS", "ERRCHAR", "END_ARGUMENT", 
+			"UNTERMINATED_ARGUMENT", "ARGUMENT_CONTENT", "END_ACTION", "UNTERMINATED_ACTION", 
+			"ACTION_CONTENT", "UNTERMINATED_CHAR_SET"
+		};
+	}
+	private static final String[] _SYMBOLIC_NAMES = makeSymbolicNames();
+	public static final Vocabulary VOCABULARY = new VocabularyImpl(_LITERAL_NAMES, _SYMBOLIC_NAMES);
+
+	/**
+	 * @deprecated Use {@link #VOCABULARY} instead.
+	 */
+	@Deprecated
+	public static final String[] tokenNames;
+	static {
+		tokenNames = new String[_SYMBOLIC_NAMES.length];
+		for (int i = 0; i < tokenNames.length; i++) {
+			tokenNames[i] = VOCABULARY.getLiteralName(i);
+			if (tokenNames[i] == null) {
+				tokenNames[i] = VOCABULARY.getSymbolicName(i);
+			}
+
+			if (tokenNames[i] == null) {
+				tokenNames[i] = "<INVALID>";
+			}
+		}
+	}
+
+	@Override
+	@Deprecated
+	public String[] getTokenNames() {
+		return tokenNames;
+	}
+
+	@Override
+
+	public Vocabulary getVocabulary() {
+		return VOCABULARY;
+	}
+
+
+	public ANTLRv4Lexer(CharStream input) {
+		super(input);
+		_interp = new LexerATNSimulator(this,_ATN,_decisionToDFA,_sharedContextCache);
+	}
+
+	@Override
+	public String getGrammarFileName() { return "ANTLRv4Lexer.g4"; }
+
+	@Override
+	public String[] getRuleNames() { return ruleNames; }
+
+	@Override
+	public String getSerializedATN() { return _serializedATN; }
+
+	@Override
+	public String[] getChannelNames() { return channelNames; }
+
+	@Override
+	public String[] getModeNames() { return modeNames; }
+
+	@Override
+	public ATN getATN() { return _ATN; }
+
+	@Override
+	public void action(RuleContext _localctx, int ruleIndex, int actionIndex) {
+		switch (ruleIndex) {
+		case 6:
+			BEGIN_ARGUMENT_action((RuleContext)_localctx, actionIndex);
+			break;
+		case 105:
+			END_ARGUMENT_action((RuleContext)_localctx, actionIndex);
+			break;
+		case 115:
+			END_ACTION_action((RuleContext)_localctx, actionIndex);
+			break;
+		}
+	}
+	private void BEGIN_ARGUMENT_action(RuleContext _localctx, int actionIndex) {
+		switch (actionIndex) {
+		case 0:
+			 this.handleBeginArgument(); 
+			break;
+		}
+	}
+	private void END_ARGUMENT_action(RuleContext _localctx, int actionIndex) {
+		switch (actionIndex) {
+		case 1:
+			 this.handleEndArgument(); 
+			break;
+		}
+	}
+	private void END_ACTION_action(RuleContext _localctx, int actionIndex) {
+		switch (actionIndex) {
+		case 2:
+			 this.handleEndAction(); 
+			break;
+		}
+	}
+
+	public static final String _serializedATN =
+		"\3\u608b\ua72a\u8133\ub9ed\u417c\u3be7\u7786\u5964\2?\u0309\b\1\b\1\b"+
+		"\1\b\1\4\2\t\2\4\3\t\3\4\4\t\4\4\5\t\5\4\6\t\6\4\7\t\7\4\b\t\b\4\t\t\t"+
+		"\4\n\t\n\4\13\t\13\4\f\t\f\4\r\t\r\4\16\t\16\4\17\t\17\4\20\t\20\4\21"+
+		"\t\21\4\22\t\22\4\23\t\23\4\24\t\24\4\25\t\25\4\26\t\26\4\27\t\27\4\30"+
+		"\t\30\4\31\t\31\4\32\t\32\4\33\t\33\4\34\t\34\4\35\t\35\4\36\t\36\4\37"+
+		"\t\37\4 \t \4!\t!\4\"\t\"\4#\t#\4$\t$\4%\t%\4&\t&\4\'\t\'\4(\t(\4)\t)"+
+		"\4*\t*\4+\t+\4,\t,\4-\t-\4.\t.\4/\t/\4\60\t\60\4\61\t\61\4\62\t\62\4\63"+
+		"\t\63\4\64\t\64\4\65\t\65\4\66\t\66\4\67\t\67\48\t8\49\t9\4:\t:\4;\t;"+
+		"\4<\t<\4=\t=\4>\t>\4?\t?\4@\t@\4A\tA\4B\tB\4C\tC\4D\tD\4E\tE\4F\tF\4G"+
+		"\tG\4H\tH\4I\tI\4J\tJ\4K\tK\4L\tL\4M\tM\4N\tN\4O\tO\4P\tP\4Q\tQ\4R\tR"+
+		"\4S\tS\4T\tT\4U\tU\4V\tV\4W\tW\4X\tX\4Y\tY\4Z\tZ\4[\t[\4\\\t\\\4]\t]\4"+
+		"^\t^\4_\t_\4`\t`\4a\ta\4b\tb\4c\tc\4d\td\4e\te\4f\tf\4g\tg\4h\th\4i\t"+
+		"i\4j\tj\4k\tk\4l\tl\4m\tm\4n\tn\4o\to\4p\tp\4q\tq\4r\tr\4s\ts\4t\tt\4"+
+		"u\tu\4v\tv\4w\tw\4x\tx\4y\ty\4z\tz\4{\t{\3\2\3\2\3\2\3\2\3\3\3\3\3\3\3"+
+		"\3\3\4\3\4\3\4\3\4\3\5\3\5\3\6\3\6\3\7\3\7\3\b\3\b\3\b\3\t\3\t\3\t\3\t"+
+		"\3\n\3\n\3\n\3\n\3\n\3\n\3\n\3\n\3\n\7\n\u011d\n\n\f\n\16\n\u0120\13\n"+
+		"\3\n\3\n\3\13\3\13\3\13\3\13\3\13\3\13\3\13\3\13\7\13\u012c\n\13\f\13"+
+		"\16\13\u012f\13\13\3\13\3\13\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3\f\7"+
+		"\f\u013d\n\f\f\f\16\f\u0140\13\f\3\f\3\f\3\r\3\r\3\16\3\16\3\16\3\16\3"+
+		"\16\3\16\3\16\3\17\3\17\3\17\3\17\3\17\3\17\3\17\3\17\3\17\3\20\3\20\3"+
+		"\20\3\20\3\20\3\20\3\21\3\21\3\21\3\21\3\21\3\21\3\21\3\22\3\22\3\22\3"+
+		"\22\3\22\3\22\3\22\3\22\3\23\3\23\3\23\3\23\3\23\3\23\3\23\3\23\3\23\3"+
+		"\23\3\24\3\24\3\24\3\24\3\24\3\24\3\24\3\25\3\25\3\25\3\25\3\25\3\25\3"+
+		"\25\3\25\3\26\3\26\3\26\3\26\3\26\3\26\3\26\3\26\3\27\3\27\3\27\3\27\3"+
+		"\27\3\27\3\27\3\30\3\30\3\30\3\30\3\30\3\30\3\30\3\31\3\31\3\31\3\31\3"+
+		"\31\3\31\3\32\3\32\3\32\3\32\3\32\3\32\3\32\3\32\3\33\3\33\3\33\3\33\3"+
+		"\33\3\34\3\34\3\35\3\35\3\36\3\36\3\37\3\37\3 \3 \3!\3!\3\"\3\"\3#\3#"+
+		"\3$\3$\3%\3%\3&\3&\3\'\3\'\3(\3(\3)\3)\3*\3*\3+\3+\3,\3,\3-\3-\3.\3.\3"+
+		"/\3/\3\60\3\60\3\61\3\61\3\62\3\62\3\63\3\63\3\64\6\64\u01de\n\64\r\64"+
+		"\16\64\u01df\3\64\3\64\3\65\3\65\3\65\3\65\3\66\3\66\5\66\u01ea\n\66\3"+
+		"\67\3\67\38\38\39\39\39\39\79\u01f4\n9\f9\169\u01f7\139\39\39\39\59\u01fc"+
+		"\n9\3:\3:\3:\3:\3:\7:\u0203\n:\f:\16:\u0206\13:\3:\3:\3:\5:\u020b\n:\3"+
+		";\3;\3;\3;\7;\u0211\n;\f;\16;\u0214\13;\3<\3<\3<\3<\3<\5<\u021b\n<\3="+
+		"\3=\3=\3>\3>\3>\3>\3>\5>\u0225\n>\5>\u0227\n>\5>\u0229\n>\5>\u022b\n>"+
+		"\3?\3?\3?\7?\u0230\n?\f?\16?\u0233\13?\5?\u0235\n?\3@\3@\3A\3A\3B\3B\3"+
+		"B\3B\3B\3B\3B\3B\3B\5B\u0244\nB\3C\3C\3C\5C\u0249\nC\3C\3C\3D\3D\3D\7"+
+		"D\u0250\nD\fD\16D\u0253\13D\3D\3D\3E\3E\3E\7E\u025a\nE\fE\16E\u025d\13"+
+		"E\3E\3E\3F\3F\3F\7F\u0264\nF\fF\16F\u0267\13F\3G\3G\3G\3G\5G\u026d\nG"+
+		"\3H\3H\3I\3I\3I\3I\3J\3J\3K\3K\3L\3L\3L\3M\3M\3N\3N\3O\3O\3P\3P\3Q\3Q"+
+		"\3R\3R\3S\3S\3T\3T\3U\3U\3U\3V\3V\3W\3W\3X\3X\3Y\3Y\3Z\3Z\3[\3[\3\\\3"+
+		"\\\3\\\3]\3]\3^\3^\3_\3_\3`\3`\3a\3a\3b\3b\3c\3c\3c\3d\3d\3e\3e\3f\3f"+
+		"\3g\3g\3g\3g\3g\3h\3h\3h\3h\3i\3i\3i\3i\3j\3j\3j\3j\3k\3k\3k\3l\3l\3l"+
+		"\3l\3m\3m\3n\3n\3n\3n\3n\3o\3o\3o\3o\3p\3p\3p\3p\3q\3q\3q\3q\3r\3r\3r"+
+		"\3r\3s\3s\3s\3s\3t\3t\3t\3t\3u\3u\3u\3v\3v\3v\3v\3w\3w\3x\3x\6x\u02f5"+
+		"\nx\rx\16x\u02f6\3x\3x\3y\3y\3y\3y\3z\3z\3z\3z\3{\3{\7{\u0305\n{\f{\16"+
+		"{\u0308\13{\4\u01f5\u0204\2|\6\6\b\7\n\b\f\t\16\n\20\13\22\f\24\r\26\16"+
+		"\30\17\32\20\34\2\36\21 \22\"\23$\24&\25(\26*\27,\30.\31\60\32\62\33\64"+
+		"\34\66\358\36:\37< >!@\"B#D$F%H&J\'L(N)P*R+T,V-X.Z/\\\60^\61`\62b\63d"+
+		"\64f\65h\66j\67l8n\2p\2r\2t\2v\2x\2z\2|\2~\2\u0080\2\u0082\2\u0084\2\u0086"+
+		"\2\u0088\2\u008a\2\u008c\2\u008e\2\u0090\2\u0092\2\u0094\2\u0096\2\u0098"+
+		"\2\u009a\2\u009c\2\u009e\2\u00a0\2\u00a2\2\u00a4\2\u00a6\2\u00a8\2\u00aa"+
+		"\2\u00ac\2\u00ae\2\u00b0\2\u00b2\2\u00b4\2\u00b6\2\u00b8\2\u00ba\2\u00bc"+
+		"\2\u00be\2\u00c0\2\u00c2\2\u00c4\2\u00c6\2\u00c8\2\u00ca\2\u00cc\2\u00ce"+
+		"\2\u00d0\2\u00d2\2\u00d4\2\u00d6\2\u00d89\u00da:\u00dc;\u00de\2\u00e0"+
+		"\2\u00e2\2\u00e4\2\u00e6\2\u00e8\2\u00ea\2\u00ec<\u00ee=\u00f0>\u00f2"+
+		"\2\u00f4\5\u00f6?\u00f8\2\6\2\3\4\5\17\5\2\13\f\16\17\"\"\4\2\13\13\""+
+		"\"\4\2\f\f\16\17\4\2\f\f\17\17\n\2$$))^^ddhhppttvv\3\2\63;\5\2\62;CHc"+
+		"h\3\2\62;\6\2\f\f\17\17))^^\6\2\f\f\17\17$$^^\5\2\u00b9\u00b9\u0302\u0371"+
+		"\u2041\u2042\17\2C\\c|\u00c2\u00d8\u00da\u00f8\u00fa\u0301\u0372\u037f"+
+		"\u0381\u2001\u200e\u200f\u2072\u2191\u2c02\u2ff1\u3003\ud801\uf902\ufdd1"+
+		"\ufdf2\uffff\3\2^_\2\u02f3\2\6\3\2\2\2\2\b\3\2\2\2\2\n\3\2\2\2\2\f\3\2"+
+		"\2\2\2\16\3\2\2\2\2\20\3\2\2\2\2\22\3\2\2\2\2\24\3\2\2\2\2\26\3\2\2\2"+
+		"\2\30\3\2\2\2\2\32\3\2\2\2\2\36\3\2\2\2\2 \3\2\2\2\2\"\3\2\2\2\2$\3\2"+
+		"\2\2\2&\3\2\2\2\2(\3\2\2\2\2*\3\2\2\2\2,\3\2\2\2\2.\3\2\2\2\2\60\3\2\2"+
+		"\2\2\62\3\2\2\2\2\64\3\2\2\2\2\66\3\2\2\2\28\3\2\2\2\2:\3\2\2\2\2<\3\2"+
+		"\2\2\2>\3\2\2\2\2@\3\2\2\2\2B\3\2\2\2\2D\3\2\2\2\2F\3\2\2\2\2H\3\2\2\2"+
+		"\2J\3\2\2\2\2L\3\2\2\2\2N\3\2\2\2\2P\3\2\2\2\2R\3\2\2\2\2T\3\2\2\2\2V"+
+		"\3\2\2\2\2X\3\2\2\2\2Z\3\2\2\2\2\\\3\2\2\2\2^\3\2\2\2\2`\3\2\2\2\2b\3"+
+		"\2\2\2\2d\3\2\2\2\2f\3\2\2\2\2h\3\2\2\2\2j\3\2\2\2\2l\3\2\2\2\3\u00d0"+
+		"\3\2\2\2\3\u00d2\3\2\2\2\3\u00d4\3\2\2\2\3\u00d6\3\2\2\2\3\u00d8\3\2\2"+
+		"\2\3\u00da\3\2\2\2\3\u00dc\3\2\2\2\4\u00de\3\2\2\2\4\u00e0\3\2\2\2\4\u00e2"+
+		"\3\2\2\2\4\u00e4\3\2\2\2\4\u00e6\3\2\2\2\4\u00e8\3\2\2\2\4\u00ea\3\2\2"+
+		"\2\4\u00ec\3\2\2\2\4\u00ee\3\2\2\2\4\u00f0\3\2\2\2\5\u00f2\3\2\2\2\5\u00f4"+
+		"\3\2\2\2\5\u00f6\3\2\2\2\6\u00fa\3\2\2\2\b\u00fe\3\2\2\2\n\u0102\3\2\2"+
+		"\2\f\u0106\3\2\2\2\16\u0108\3\2\2\2\20\u010a\3\2\2\2\22\u010c\3\2\2\2"+
+		"\24\u010f\3\2\2\2\26\u0113\3\2\2\2\30\u0123\3\2\2\2\32\u0132\3\2\2\2\34"+
+		"\u0143\3\2\2\2\36\u0145\3\2\2\2 \u014c\3\2\2\2\"\u0155\3\2\2\2$\u015b"+
+		"\3\2\2\2&\u0162\3\2\2\2(\u016a\3\2\2\2*\u0174\3\2\2\2,\u017b\3\2\2\2."+
+		"\u0183\3\2\2\2\60\u018b\3\2\2\2\62\u0192\3\2\2\2\64\u0199\3\2\2\2\66\u019f"+
+		"\3\2\2\28\u01a7\3\2\2\2:\u01ac\3\2\2\2<\u01ae\3\2\2\2>\u01b0\3\2\2\2@"+
+		"\u01b2\3\2\2\2B\u01b4\3\2\2\2D\u01b6\3\2\2\2F\u01b8\3\2\2\2H\u01ba\3\2"+
+		"\2\2J\u01bc\3\2\2\2L\u01be\3\2\2\2N\u01c0\3\2\2\2P\u01c2\3\2\2\2R\u01c4"+
+		"\3\2\2\2T\u01c6\3\2\2\2V\u01c8\3\2\2\2X\u01ca\3\2\2\2Z\u01cc\3\2\2\2\\"+
+		"\u01ce\3\2\2\2^\u01d0\3\2\2\2`\u01d2\3\2\2\2b\u01d4\3\2\2\2d\u01d6\3\2"+
+		"\2\2f\u01d8\3\2\2\2h\u01da\3\2\2\2j\u01dd\3\2\2\2l\u01e3\3\2\2\2n\u01e9"+
+		"\3\2\2\2p\u01eb\3\2\2\2r\u01ed\3\2\2\2t\u01ef\3\2\2\2v\u01fd\3\2\2\2x"+
+		"\u020c\3\2\2\2z\u0215\3\2\2\2|\u021c\3\2\2\2~\u021f\3\2\2\2\u0080\u0234"+
+		"\3\2\2\2\u0082\u0236\3\2\2\2\u0084\u0238\3\2\2\2\u0086\u0243\3\2\2\2\u0088"+
+		"\u0245\3\2\2\2\u008a\u024c\3\2\2\2\u008c\u0256\3\2\2\2\u008e\u0260\3\2"+
+		"\2\2\u0090\u026c\3\2\2\2\u0092\u026e\3\2\2\2\u0094\u0270\3\2\2\2\u0096"+
+		"\u0274\3\2\2\2\u0098\u0276\3\2\2\2\u009a\u0278\3\2\2\2\u009c\u027b\3\2"+
+		"\2\2\u009e\u027d\3\2\2\2\u00a0\u027f\3\2\2\2\u00a2\u0281\3\2\2\2\u00a4"+
+		"\u0283\3\2\2\2\u00a6\u0285\3\2\2\2\u00a8\u0287\3\2\2\2\u00aa\u0289\3\2"+
+		"\2\2\u00ac\u028b\3\2\2\2\u00ae\u028e\3\2\2\2\u00b0\u0290\3\2\2\2\u00b2"+
+		"\u0292\3\2\2\2\u00b4\u0294\3\2\2\2\u00b6\u0296\3\2\2\2\u00b8\u0298\3\2"+
+		"\2\2\u00ba\u029a\3\2\2\2\u00bc\u029d\3\2\2\2\u00be\u029f\3\2\2\2\u00c0"+
+		"\u02a1\3\2\2\2\u00c2\u02a3\3\2\2\2\u00c4\u02a5\3\2\2\2\u00c6\u02a7\3\2"+
+		"\2\2\u00c8\u02a9\3\2\2\2\u00ca\u02ac\3\2\2\2\u00cc\u02ae\3\2\2\2\u00ce"+
+		"\u02b0\3\2\2\2\u00d0\u02b2\3\2\2\2\u00d2\u02b7\3\2\2\2\u00d4\u02bb\3\2"+
+		"\2\2\u00d6\u02bf\3\2\2\2\u00d8\u02c3\3\2\2\2\u00da\u02c6\3\2\2\2\u00dc"+
+		"\u02ca\3\2\2\2\u00de\u02cc\3\2\2\2\u00e0\u02d1\3\2\2\2\u00e2\u02d5\3\2"+
+		"\2\2\u00e4\u02d9\3\2\2\2\u00e6\u02dd\3\2\2\2\u00e8\u02e1\3\2\2\2\u00ea"+
+		"\u02e5\3\2\2\2\u00ec\u02e9\3\2\2\2\u00ee\u02ec\3\2\2\2\u00f0\u02f0\3\2"+
+		"\2\2\u00f2\u02f4\3\2\2\2\u00f4\u02fa\3\2\2\2\u00f6\u02fe\3\2\2\2\u00f8"+
+		"\u0302\3\2\2\2\u00fa\u00fb\5v:\2\u00fb\u00fc\3\2\2\2\u00fc\u00fd\b\2\2"+
+		"\2\u00fd\7\3\2\2\2\u00fe\u00ff\5t9\2\u00ff\u0100\3\2\2\2\u0100\u0101\b"+
+		"\3\2\2\u0101\t\3\2\2\2\u0102\u0103\5x;\2\u0103\u0104\3\2\2\2\u0104\u0105"+
+		"\b\4\2\2\u0105\13\3\2\2\2\u0106\u0107\5\u0080?\2\u0107\r\3\2\2\2\u0108"+
+		"\u0109\5\u008aD\2\u0109\17\3\2\2\2\u010a\u010b\5\u008eF\2\u010b\21\3\2"+
+		"\2\2\u010c\u010d\5\u00a8S\2\u010d\u010e\b\b\3\2\u010e\23\3\2\2\2\u010f"+
+		"\u0110\5\u00a4Q\2\u0110\u0111\3\2\2\2\u0111\u0112\b\t\4\2\u0112\25\3\2"+
+		"\2\2\u0113\u0114\7q\2\2\u0114\u0115\7r\2\2\u0115\u0116\7v\2\2\u0116\u0117"+
+		"\7k\2\2\u0117\u0118\7q\2\2\u0118\u0119\7p\2\2\u0119\u011a\7u\2\2\u011a"+
+		"\u011e\3\2\2\2\u011b\u011d\5\34\r\2\u011c\u011b\3\2\2\2\u011d\u0120\3"+
+		"\2\2\2\u011e\u011c\3\2\2\2\u011e\u011f\3\2\2\2\u011f\u0121\3\2\2\2\u0120"+
+		"\u011e\3\2\2\2\u0121\u0122\7}\2\2\u0122\27\3\2\2\2\u0123\u0124\7v\2\2"+
+		"\u0124\u0125\7q\2\2\u0125\u0126\7m\2\2\u0126\u0127\7g\2\2\u0127\u0128"+
+		"\7p\2\2\u0128\u0129\7u\2\2\u0129\u012d\3\2\2\2\u012a\u012c\5\34\r\2\u012b"+
+		"\u012a\3\2\2\2\u012c\u012f\3\2\2\2\u012d\u012b\3\2\2\2\u012d\u012e\3\2"+
+		"\2\2\u012e\u0130\3\2\2\2\u012f\u012d\3\2\2\2\u0130\u0131\7}\2\2\u0131"+
+		"\31\3\2\2\2\u0132\u0133\7e\2\2\u0133\u0134\7j\2\2\u0134\u0135\7c\2\2\u0135"+
+		"\u0136\7p\2\2\u0136\u0137\7p\2\2\u0137\u0138\7g\2\2\u0138\u0139\7n\2\2"+
+		"\u0139\u013a\7u\2\2\u013a\u013e\3\2\2\2\u013b\u013d\5\34\r\2\u013c\u013b"+
+		"\3\2\2\2\u013d\u0140\3\2\2\2\u013e\u013c\3\2\2\2\u013e\u013f\3\2\2\2\u013f"+
+		"\u0141\3\2\2\2\u0140\u013e\3\2\2\2\u0141\u0142\7}\2\2\u0142\33\3\2\2\2"+
+		"\u0143\u0144\t\2\2\2\u0144\35\3\2\2\2\u0145\u0146\7k\2\2\u0146\u0147\7"+
+		"o\2\2\u0147\u0148\7r\2\2\u0148\u0149\7q\2\2\u0149\u014a\7t\2\2\u014a\u014b"+
+		"\7v\2\2\u014b\37\3\2\2\2\u014c\u014d\7h\2\2\u014d\u014e\7t\2\2\u014e\u014f"+
+		"\7c\2\2\u014f\u0150\7i\2\2\u0150\u0151\7o\2\2\u0151\u0152\7g\2\2\u0152"+
+		"\u0153\7p\2\2\u0153\u0154\7v\2\2\u0154!\3\2\2\2\u0155\u0156\7n\2\2\u0156"+
+		"\u0157\7g\2\2\u0157\u0158\7z\2\2\u0158\u0159\7g\2\2\u0159\u015a\7t\2\2"+
+		"\u015a#\3\2\2\2\u015b\u015c\7r\2\2\u015c\u015d\7c\2\2\u015d\u015e\7t\2"+
+		"\2\u015e\u015f\7u\2\2\u015f\u0160\7g\2\2\u0160\u0161\7t\2\2\u0161%\3\2"+
+		"\2\2\u0162\u0163\7i\2\2\u0163\u0164\7t\2\2\u0164\u0165\7c\2\2\u0165\u0166"+
+		"\7o\2\2\u0166\u0167\7o\2\2\u0167\u0168\7c\2\2\u0168\u0169\7t\2\2\u0169"+
+		"\'\3\2\2\2\u016a\u016b\7r\2\2\u016b\u016c\7t\2\2\u016c\u016d\7q\2\2\u016d"+
+		"\u016e\7v\2\2\u016e\u016f\7g\2\2\u016f\u0170\7e\2\2\u0170\u0171\7v\2\2"+
+		"\u0171\u0172\7g\2\2\u0172\u0173\7f\2\2\u0173)\3\2\2\2\u0174\u0175\7r\2"+
+		"\2\u0175\u0176\7w\2\2\u0176\u0177\7d\2\2\u0177\u0178\7n\2\2\u0178\u0179"+
+		"\7k\2\2\u0179\u017a\7e\2\2\u017a+\3\2\2\2\u017b\u017c\7r\2\2\u017c\u017d"+
+		"\7t\2\2\u017d\u017e\7k\2\2\u017e\u017f\7x\2\2\u017f\u0180\7c\2\2\u0180"+
+		"\u0181\7v\2\2\u0181\u0182\7g\2\2\u0182-\3\2\2\2\u0183\u0184\7t\2\2\u0184"+
+		"\u0185\7g\2\2\u0185\u0186\7v\2\2\u0186\u0187\7w\2\2\u0187\u0188\7t\2\2"+
+		"\u0188\u0189\7p\2\2\u0189\u018a\7u\2\2\u018a/\3\2\2\2\u018b\u018c\7n\2"+
+		"\2\u018c\u018d\7q\2\2\u018d\u018e\7e\2\2\u018e\u018f\7c\2\2\u018f\u0190"+
+		"\7n\2\2\u0190\u0191\7u\2\2\u0191\61\3\2\2\2\u0192\u0193\7v\2\2\u0193\u0194"+
+		"\7j\2\2\u0194\u0195\7t\2\2\u0195\u0196\7q\2\2\u0196\u0197\7y\2\2\u0197"+
+		"\u0198\7u\2\2\u0198\63\3\2\2\2\u0199\u019a\7e\2\2\u019a\u019b\7c\2\2\u019b"+
+		"\u019c\7v\2\2\u019c\u019d\7e\2\2\u019d\u019e\7j\2\2\u019e\65\3\2\2\2\u019f"+
+		"\u01a0\7h\2\2\u01a0\u01a1\7k\2\2\u01a1\u01a2\7p\2\2\u01a2\u01a3\7c\2\2"+
+		"\u01a3\u01a4\7n\2\2\u01a4\u01a5\7n\2\2\u01a5\u01a6\7{\2\2\u01a6\67\3\2"+
+		"\2\2\u01a7\u01a8\7o\2\2\u01a8\u01a9\7q\2\2\u01a9\u01aa\7f\2\2\u01aa\u01ab"+
+		"\7g\2\2\u01ab9\3\2\2\2\u01ac\u01ad\5\u0098K\2\u01ad;\3\2\2\2\u01ae\u01af"+
+		"\5\u009aL\2\u01af=\3\2\2\2\u01b0\u01b1\5\u00c2`\2\u01b1?\3\2\2\2\u01b2"+
+		"\u01b3\5\u00c4a\2\u01b3A\3\2\2\2\u01b4\u01b5\5\u00a0O\2\u01b5C\3\2\2\2"+
+		"\u01b6\u01b7\5\u00a2P\2\u01b7E\3\2\2\2\u01b8\u01b9\5\u00a4Q\2\u01b9G\3"+
+		"\2\2\2\u01ba\u01bb\5\u00a6R\2\u01bbI\3\2\2\2\u01bc\u01bd\5\u00acU\2\u01bd"+
+		"K\3\2\2\2\u01be\u01bf\5\u00aeV\2\u01bfM\3\2\2\2\u01c0\u01c1\5\u00b0W\2"+
+		"\u01c1O\3\2\2\2\u01c2\u01c3\5\u00b2X\2\u01c3Q\3\2\2\2\u01c4\u01c5\5\u00b4"+
+		"Y\2\u01c5S\3\2\2\2\u01c6\u01c7\5\u00b6Z\2\u01c7U\3\2\2\2\u01c8\u01c9\5"+
+		"\u00ba\\\2\u01c9W\3\2\2\2\u01ca\u01cb\5\u00b8[\2\u01cbY\3\2\2\2\u01cc"+
+		"\u01cd\5\u00be^\2\u01cd[\3\2\2\2\u01ce\u01cf\5\u00c0_\2\u01cf]\3\2\2\2"+
+		"\u01d0\u01d1\5\u00c8c\2\u01d1_\3\2\2\2\u01d2\u01d3\5\u00c6b\2\u01d3a\3"+
+		"\2\2\2\u01d4\u01d5\5\u00cad\2\u01d5c\3\2\2\2\u01d6\u01d7\5\u00cce\2\u01d7"+
+		"e\3\2\2\2\u01d8\u01d9\5\u00cef\2\u01d9g\3\2\2\2\u01da\u01db\5\u00f8{\2"+
+		"\u01dbi\3\2\2\2\u01dc\u01de\5n\66\2\u01dd\u01dc\3\2\2\2\u01de\u01df\3"+
+		"\2\2\2\u01df\u01dd\3\2\2\2\u01df\u01e0\3\2\2\2\u01e0\u01e1\3\2\2\2\u01e1"+
+		"\u01e2\b\64\5\2\u01e2k\3\2\2\2\u01e3\u01e4\13\2\2\2\u01e4\u01e5\3\2\2"+
+		"\2\u01e5\u01e6\b\65\6\2\u01e6m\3\2\2\2\u01e7\u01ea\5p\67\2\u01e8\u01ea"+
+		"\5r8\2\u01e9\u01e7\3\2\2\2\u01e9\u01e8\3\2\2\2\u01eao\3\2\2\2\u01eb\u01ec"+
+		"\t\3\2\2\u01ecq\3\2\2\2\u01ed\u01ee\t\4\2\2\u01ees\3\2\2\2\u01ef\u01f0"+
+		"\7\61\2\2\u01f0\u01f1\7,\2\2\u01f1\u01f5\3\2\2\2\u01f2\u01f4\13\2\2\2"+
+		"\u01f3\u01f2\3\2\2\2\u01f4\u01f7\3\2\2\2\u01f5\u01f6\3\2\2\2\u01f5\u01f3"+
+		"\3\2\2\2\u01f6\u01fb\3\2\2\2\u01f7\u01f5\3\2\2\2\u01f8\u01f9\7,\2\2\u01f9"+
+		"\u01fc\7\61\2\2\u01fa\u01fc\7\2\2\3\u01fb\u01f8\3\2\2\2\u01fb\u01fa\3"+
+		"\2\2\2\u01fcu\3\2\2\2\u01fd\u01fe\7\61\2\2\u01fe\u01ff\7,\2\2\u01ff\u0200"+
+		"\7,\2\2\u0200\u0204\3\2\2\2\u0201\u0203\13\2\2\2\u0202\u0201\3\2\2\2\u0203"+
+		"\u0206\3\2\2\2\u0204\u0205\3\2\2\2\u0204\u0202\3\2\2\2\u0205\u020a\3\2"+
+		"\2\2\u0206\u0204\3\2\2\2\u0207\u0208\7,\2\2\u0208\u020b\7\61\2\2\u0209"+
+		"\u020b\7\2\2\3\u020a\u0207\3\2\2\2\u020a\u0209\3\2\2\2\u020bw\3\2\2\2"+
+		"\u020c\u020d\7\61\2\2\u020d\u020e\7\61\2\2\u020e\u0212\3\2\2\2\u020f\u0211"+
+		"\n\5\2\2\u0210\u020f\3\2\2\2\u0211\u0214\3\2\2\2\u0212\u0210\3\2\2\2\u0212"+
+		"\u0213\3\2\2\2\u0213y\3\2\2\2\u0214\u0212\3\2\2\2\u0215\u021a\5\u0096"+
+		"J\2\u0216\u021b\t\6\2\2\u0217\u021b\5~>\2\u0218\u021b\13\2\2\2\u0219\u021b"+
+		"\7\2\2\3\u021a\u0216\3\2\2\2\u021a\u0217\3\2\2\2\u021a\u0218\3\2\2\2\u021a"+
+		"\u0219\3\2\2\2\u021b{\3\2\2\2\u021c\u021d\5\u0096J\2\u021d\u021e\13\2"+
+		"\2\2\u021e}\3\2\2\2\u021f\u022a\7w\2\2\u0220\u0228\5\u0082@\2\u0221\u0226"+
+		"\5\u0082@\2\u0222\u0224\5\u0082@\2\u0223\u0225\5\u0082@\2\u0224\u0223"+
+		"\3\2\2\2\u0224\u0225\3\2\2\2\u0225\u0227\3\2\2\2\u0226\u0222\3\2\2\2\u0226"+
+		"\u0227\3\2\2\2\u0227\u0229\3\2\2\2\u0228\u0221\3\2\2\2\u0228\u0229\3\2"+
+		"\2\2\u0229\u022b\3\2\2\2\u022a\u0220\3\2\2\2\u022a\u022b\3\2\2\2\u022b"+
+		"\177\3\2\2\2\u022c\u0235\7\62\2\2\u022d\u0231\t\7\2\2\u022e\u0230\5\u0084"+
+		"A\2\u022f\u022e\3\2\2\2\u0230\u0233\3\2\2\2\u0231\u022f\3\2\2\2\u0231"+
+		"\u0232\3\2\2\2\u0232\u0235\3\2\2\2\u0233\u0231\3\2\2\2\u0234\u022c\3\2"+
+		"\2\2\u0234\u022d\3\2\2\2\u0235\u0081\3\2\2\2\u0236\u0237\t\b\2\2\u0237"+
+		"\u0083\3\2\2\2\u0238\u0239\t\t\2\2\u0239\u0085\3\2\2\2\u023a\u023b\7v"+
+		"\2\2\u023b\u023c\7t\2\2\u023c\u023d\7w\2\2\u023d\u0244\7g\2\2\u023e\u023f"+
+		"\7h\2\2\u023f\u0240\7c\2\2\u0240\u0241\7n\2\2\u0241\u0242\7u\2\2\u0242"+
+		"\u0244\7g\2\2\u0243\u023a\3\2\2\2\u0243\u023e\3\2\2\2\u0244\u0087\3\2"+
+		"\2\2\u0245\u0248\5\u009cM\2\u0246\u0249\5z<\2\u0247\u0249\n\n\2\2\u0248"+
+		"\u0246\3\2\2\2\u0248\u0247\3\2\2\2\u0249\u024a\3\2\2\2\u024a\u024b\5\u009c"+
+		"M\2\u024b\u0089\3\2\2\2\u024c\u0251\5\u009cM\2\u024d\u0250\5z<\2\u024e"+
+		"\u0250\n\n\2\2\u024f\u024d\3\2\2\2\u024f\u024e\3\2\2\2\u0250\u0253\3\2"+
+		"\2\2\u0251\u024f\3\2\2\2\u0251\u0252\3\2\2\2\u0252\u0254\3\2\2\2\u0253"+
+		"\u0251\3\2\2\2\u0254\u0255\5\u009cM\2\u0255\u008b\3\2\2\2\u0256\u025b"+
+		"\5\u009eN\2\u0257\u025a\5z<\2\u0258\u025a\n\13\2\2\u0259\u0257\3\2\2\2"+
+		"\u0259\u0258\3\2\2\2\u025a\u025d\3\2\2\2\u025b\u0259\3\2\2\2\u025b\u025c"+
+		"\3\2\2\2\u025c\u025e\3\2\2\2\u025d\u025b\3\2\2\2\u025e\u025f\5\u009eN"+
+		"\2\u025f\u008d\3\2\2\2\u0260\u0265\5\u009cM\2\u0261\u0264\5z<\2\u0262"+
+		"\u0264\n\n\2\2\u0263\u0261\3\2\2\2\u0263\u0262\3\2\2\2\u0264\u0267\3\2"+
+		"\2\2\u0265\u0263\3\2\2\2\u0265\u0266\3\2\2\2\u0266\u008f\3\2\2\2\u0267"+
+		"\u0265\3\2\2\2\u0268\u026d\5\u0092H\2\u0269\u026d\4\62;\2\u026a\u026d"+
+		"\5\u00bc]\2\u026b\u026d\t\f\2\2\u026c\u0268\3\2\2\2\u026c\u0269\3\2\2"+
+		"\2\u026c\u026a\3\2\2\2\u026c\u026b\3\2\2\2\u026d\u0091\3\2\2\2\u026e\u026f"+
+		"\t\r\2\2\u026f\u0093\3\2\2\2\u0270\u0271\7k\2\2\u0271\u0272\7p\2\2\u0272"+
+		"\u0273\7v\2\2\u0273\u0095\3\2\2\2\u0274\u0275\7^\2\2\u0275\u0097\3\2\2"+
+		"\2\u0276\u0277\7<\2\2\u0277\u0099\3\2\2\2\u0278\u0279\7<\2\2\u0279\u027a"+
+		"\7<\2\2\u027a\u009b\3\2\2\2\u027b\u027c\7)\2\2\u027c\u009d\3\2\2\2\u027d"+
+		"\u027e\7$\2\2\u027e\u009f\3\2\2\2\u027f\u0280\7*\2\2\u0280\u00a1\3\2\2"+
+		"\2\u0281\u0282\7+\2\2\u0282\u00a3\3\2\2\2\u0283\u0284\7}\2\2\u0284\u00a5"+
+		"\3\2\2\2\u0285\u0286\7\177\2\2\u0286\u00a7\3\2\2\2\u0287\u0288\7]\2\2"+
+		"\u0288\u00a9\3\2\2\2\u0289\u028a\7_\2\2\u028a\u00ab\3\2\2\2\u028b\u028c"+
+		"\7/\2\2\u028c\u028d\7@\2\2\u028d\u00ad\3\2\2\2\u028e\u028f\7>\2\2\u028f"+
+		"\u00af\3\2\2\2\u0290\u0291\7@\2\2\u0291\u00b1\3\2\2\2\u0292\u0293\7?\2"+
+		"\2\u0293\u00b3\3\2\2\2\u0294\u0295\7A\2\2\u0295\u00b5\3\2\2\2\u0296\u0297"+
+		"\7,\2\2\u0297\u00b7\3\2\2\2\u0298\u0299\7-\2\2\u0299\u00b9\3\2\2\2\u029a"+
+		"\u029b\7-\2\2\u029b\u029c\7?\2\2\u029c\u00bb\3\2\2\2\u029d\u029e\7a\2"+
+		"\2\u029e\u00bd\3\2\2\2\u029f\u02a0\7~\2\2\u02a0\u00bf\3\2\2\2\u02a1\u02a2"+
+		"\7&\2\2\u02a2\u00c1\3\2\2\2\u02a3\u02a4\7.\2\2\u02a4\u00c3\3\2\2\2\u02a5"+
+		"\u02a6\7=\2\2\u02a6\u00c5\3\2\2\2\u02a7\u02a8\7\60\2\2\u02a8\u00c7\3\2"+
+		"\2\2\u02a9\u02aa\7\60\2\2\u02aa\u02ab\7\60\2\2\u02ab\u00c9\3\2\2\2\u02ac"+
+		"\u02ad\7B\2\2\u02ad\u00cb\3\2\2\2\u02ae\u02af\7%\2\2\u02af\u00cd\3\2\2"+
+		"\2\u02b0\u02b1\7\u0080\2\2\u02b1\u00cf\3\2\2\2\u02b2\u02b3\5\u00a8S\2"+
+		"\u02b3\u02b4\3\2\2\2\u02b4\u02b5\bg\7\2\u02b5\u02b6\bg\b\2\u02b6\u00d1"+
+		"\3\2\2\2\u02b7\u02b8\5|=\2\u02b8\u02b9\3\2\2\2\u02b9\u02ba\bh\7\2\u02ba"+
+		"\u00d3\3\2\2\2\u02bb\u02bc\5\u008cE\2\u02bc\u02bd\3\2\2\2\u02bd\u02be"+
+		"\bi\7\2\u02be\u00d5\3\2\2\2\u02bf\u02c0\5\u008aD\2\u02c0\u02c1\3\2\2\2"+
+		"\u02c1\u02c2\bj\7\2\u02c2\u00d7\3\2\2\2\u02c3\u02c4\5\u00aaT\2\u02c4\u02c5"+
+		"\bk\t\2\u02c5\u00d9\3\2\2\2\u02c6\u02c7\7\2\2\3\u02c7\u02c8\3\2\2\2\u02c8"+
+		"\u02c9\bl\n\2\u02c9\u00db\3\2\2\2\u02ca\u02cb\13\2\2\2\u02cb\u00dd\3\2"+
+		"\2\2\u02cc\u02cd\5\u00a4Q\2\u02cd\u02ce\3\2\2\2\u02ce\u02cf\bn\13\2\u02cf"+
+		"\u02d0\bn\4\2\u02d0\u00df\3\2\2\2\u02d1\u02d2\5|=\2\u02d2\u02d3\3\2\2"+
+		"\2\u02d3\u02d4\bo\13\2\u02d4\u00e1\3\2\2\2\u02d5\u02d6\5\u008cE\2\u02d6"+
+		"\u02d7\3\2\2\2\u02d7\u02d8\bp\13\2\u02d8\u00e3\3\2\2\2\u02d9\u02da\5\u008a"+
+		"D\2\u02da\u02db\3\2\2\2\u02db\u02dc\bq\13\2\u02dc\u00e5\3\2\2\2\u02dd"+
+		"\u02de\5v:\2\u02de\u02df\3\2\2\2\u02df\u02e0\br\13\2\u02e0\u00e7\3\2\2"+
+		"\2\u02e1\u02e2\5t9\2\u02e2\u02e3\3\2\2\2\u02e3\u02e4\bs\13\2\u02e4\u00e9"+
+		"\3\2\2\2\u02e5\u02e6\5x;\2\u02e6\u02e7\3\2\2\2\u02e7\u02e8\bt\13\2\u02e8"+
+		"\u00eb\3\2\2\2\u02e9\u02ea\5\u00a6R\2\u02ea\u02eb\bu\f\2\u02eb\u00ed\3"+
+		"\2\2\2\u02ec\u02ed\7\2\2\3\u02ed\u02ee\3\2\2\2\u02ee\u02ef\bv\n\2\u02ef"+
+		"\u00ef\3\2\2\2\u02f0\u02f1\13\2\2\2\u02f1\u00f1\3\2\2\2\u02f2\u02f5\n"+
+		"\16\2\2\u02f3\u02f5\5|=\2\u02f4\u02f2\3\2\2\2\u02f4\u02f3\3\2\2\2\u02f5"+
+		"\u02f6\3\2\2\2\u02f6\u02f4\3\2\2\2\u02f6\u02f7\3\2\2\2\u02f7\u02f8\3\2"+
+		"\2\2\u02f8\u02f9\bx\r\2\u02f9\u00f3\3\2\2\2\u02fa\u02fb\5\u00aaT\2\u02fb"+
+		"\u02fc\3\2\2\2\u02fc\u02fd\by\n\2\u02fd\u00f5\3\2\2\2\u02fe\u02ff\7\2"+
+		"\2\3\u02ff\u0300\3\2\2\2\u0300\u0301\bz\n\2\u0301\u00f7\3\2\2\2\u0302"+
+		"\u0306\5\u0092H\2\u0303\u0305\5\u0090G\2\u0304\u0303\3\2\2\2\u0305\u0308"+
+		"\3\2\2\2\u0306\u0304\3\2\2\2\u0306\u0307\3\2\2\2\u0307\u00f9\3\2\2\2\u0308"+
+		"\u0306\3\2\2\2#\2\3\4\5\u011e\u012d\u013e\u01df\u01e9\u01f5\u01fb\u0204"+
+		"\u020a\u0212\u021a\u0224\u0226\u0228\u022a\u0231\u0234\u0243\u0248\u024f"+
+		"\u0251\u0259\u025b\u0263\u0265\u026c\u02f4\u02f6\u0306\16\2\5\2\3\b\2"+
+		"\7\4\2\2\4\2\2\3\2\t;\2\7\3\2\3k\3\6\2\2\t>\2\3u\4\5\2\2";
+	public static final ATN _ATN =
+		new ATNDeserializer().deserialize(_serializedATN.toCharArray());
+	static {
+		_decisionToDFA = new DFA[_ATN.getNumberOfDecisions()];
+		for (int i = 0; i < _ATN.getNumberOfDecisions(); i++) {
+			_decisionToDFA[i] = new DFA(_ATN.getDecisionState(i), i);
+		}
+	}
+}
\ No newline at end of file
diff --git a/java/languages.antlr/src/org/antlr/parser/antlr4/ANTLRv4Parser.g4 b/java/languages.antlr/src/org/antlr/parser/antlr4/ANTLRv4Parser.g4
new file mode 100644
index 0000000..92dfbe8
--- /dev/null
+++ b/java/languages.antlr/src/org/antlr/parser/antlr4/ANTLRv4Parser.g4
@@ -0,0 +1,411 @@
+/*
+ * [The "BSD license"]
+ *  Copyright (c) 2012-2014 Terence Parr
+ *  Copyright (c) 2012-2014 Sam Harwell
+ *  Copyright (c) 2015 Gerald Rosenberg
+ *  All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions
+ *  are met:
+ *
+ *  1. Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *  2. Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *  3. The name of the author may not be used to endorse or promote products
+ *     derived from this software without specific prior written permission.
+ *
+ *  THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ *  IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ *  OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ *  IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ *  INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ *  NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ *  DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 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 OF
+ *  THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/*	A grammar for ANTLR v4 written in ANTLR v4.
+ *
+ *	Modified 2015.06.16 gbr
+ *	-- update for compatibility with Antlr v4.5
+ *	-- add mode for channels
+ *	-- moved members to LexerAdaptor
+ * 	-- move fragments to imports
+ */
+parser grammar ANTLRv4Parser;
+
+@header{
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+// DO NOT EDIT THIS FILE MANUALLY!
+// SEE build.xml FOR INSTRUCTIONS
+
+
+package org.antlr.parser.antlr4;
+
+}
+
+options { tokenVocab = ANTLRv4Lexer; }
+// The main entry point for parsing a v4 grammar.
+grammarSpec
+   : grammarDecl prequelConstruct* rules modeSpec* EOF
+   ;
+
+grammarDecl
+   : grammarType identifier SEMI
+   ;
+
+grammarType
+   : (LEXER GRAMMAR | PARSER GRAMMAR | GRAMMAR)
+   ;
+   // This is the list of all constructs that can be declared before
+   // the set of rules that compose the grammar, and is invoked 0..n
+   // times by the grammarPrequel rule.
+
+prequelConstruct
+   : optionsSpec
+   | delegateGrammars
+   | tokensSpec
+   | channelsSpec
+   | action_
+   ;
+   // ------------
+   // Options - things that affect analysis and/or code generation
+
+optionsSpec
+   : OPTIONS (option SEMI)* RBRACE
+   ;
+
+option
+   : identifier ASSIGN optionValue
+   ;
+
+optionValue
+   : identifier (DOT identifier)*
+   | STRING_LITERAL
+   | actionBlock
+   | INT
+   ;
+   // ------------
+   // Delegates
+
+delegateGrammars
+   : IMPORT delegateGrammar (COMMA delegateGrammar)* SEMI
+   ;
+
+delegateGrammar
+   : identifier ASSIGN identifier
+   | identifier
+   ;
+   // ------------
+   // Tokens & Channels
+
+tokensSpec
+   : TOKENS idList? RBRACE
+   ;
+
+channelsSpec
+   : CHANNELS idList? RBRACE
+   ;
+
+idList
+   : identifier (COMMA identifier)* COMMA?
+   ;
+   // Match stuff like @parser::members {int i;}
+
+action_
+   : AT (actionScopeName COLONCOLON)? identifier actionBlock
+   ;
+   // Scope names could collide with keywords; allow them as ids for action scopes
+
+actionScopeName
+   : identifier
+   | LEXER
+   | PARSER
+   ;
+
+actionBlock
+   : BEGIN_ACTION ACTION_CONTENT* END_ACTION
+   ;
+
+argActionBlock
+   : BEGIN_ARGUMENT ARGUMENT_CONTENT* END_ARGUMENT
+   ;
+
+modeSpec
+   : MODE identifier SEMI lexerRuleSpec*
+   ;
+
+rules
+   : ruleSpec*
+   ;
+
+ruleSpec
+   : parserRuleSpec
+   | lexerRuleSpec
+   ;
+
+parserRuleSpec
+   : ruleModifiers? RULE_REF argActionBlock? ruleReturns? throwsSpec? localsSpec? rulePrequel* COLON ruleBlock SEMI exceptionGroup
+   ;
+
+exceptionGroup
+   : exceptionHandler* finallyClause?
+   ;
+
+exceptionHandler
+   : CATCH argActionBlock actionBlock
+   ;
+
+finallyClause
+   : FINALLY actionBlock
+   ;
+
+rulePrequel
+   : optionsSpec
+   | ruleAction
+   ;
+
+ruleReturns
+   : RETURNS argActionBlock
+   ;
+
+// --------------
+// Exception spec
+throwsSpec
+   : THROWS identifier (COMMA identifier)*
+   ;
+
+localsSpec
+   : LOCALS argActionBlock
+   ;
+
+/** Match stuff like @init {int i;} */
+ruleAction
+   : AT identifier actionBlock
+   ;
+
+ruleModifiers
+   : ruleModifier+
+   ;
+   // An individual access modifier for a rule. The 'fragment' modifier
+   // is an internal indication for lexer rules that they do not match
+   // from the input but are like subroutines for other lexer rules to
+   // reuse for certain lexical patterns. The other modifiers are passed
+   // to the code generation templates and may be ignored by the template
+   // if they are of no use in that language.
+
+ruleModifier
+   : PUBLIC
+   | PRIVATE
+   | PROTECTED
+   | FRAGMENT
+   ;
+
+ruleBlock
+   : ruleAltList
+   ;
+
+ruleAltList
+   : labeledAlt (OR labeledAlt)*
+   ;
+
+labeledAlt
+   : alternative (POUND identifier)?
+   ;
+   // --------------------
+   // Lexer rules
+
+lexerRuleSpec
+   : FRAGMENT? TOKEN_REF optionsSpec? COLON lexerRuleBlock SEMI
+   ;
+
+lexerRuleBlock
+   : lexerAltList
+   ;
+
+lexerAltList
+   : lexerAlt (OR lexerAlt)*
+   ;
+
+lexerAlt
+   : lexerElements lexerCommands?
+   |
+   // explicitly allow empty alts
+   ;
+
+lexerElements
+   : lexerElement+
+   |
+   ;
+
+lexerElement
+   : labeledLexerElement ebnfSuffix?
+   | lexerAtom ebnfSuffix?
+   | lexerBlock ebnfSuffix?
+   | actionBlock QUESTION?
+   ;
+   // but preds can be anywhere
+
+labeledLexerElement
+   : identifier (ASSIGN | PLUS_ASSIGN) (lexerAtom | lexerBlock)
+   ;
+
+lexerBlock
+   : LPAREN lexerAltList RPAREN
+   ;
+   // E.g., channel(HIDDEN), skip, more, mode(INSIDE), push(INSIDE), pop
+
+lexerCommands
+   : RARROW lexerCommand (COMMA lexerCommand)*
+   ;
+
+lexerCommand
+   : lexerCommandName LPAREN lexerCommandExpr RPAREN
+   | lexerCommandName
+   ;
+
+lexerCommandName
+   : identifier
+   | MODE
+   ;
+
+lexerCommandExpr
+   : identifier
+   | INT
+   ;
+   // --------------------
+   // Rule Alts
+
+altList
+   : alternative (OR alternative)*
+   ;
+
+alternative
+   : elementOptions? element+
+   |
+   // explicitly allow empty alts
+   ;
+
+element
+   : labeledElement (ebnfSuffix |)
+   | atom (ebnfSuffix |)
+   | ebnf
+   | actionBlock QUESTION?
+   ;
+
+labeledElement
+   : identifier (ASSIGN | PLUS_ASSIGN) (atom | block)
+   ;
+   // --------------------
+   // EBNF and blocks
+
+ebnf
+   : block blockSuffix?
+   ;
+
+blockSuffix
+   : ebnfSuffix
+   ;
+
+ebnfSuffix
+   : QUESTION QUESTION?
+   | STAR QUESTION?
+   | PLUS QUESTION?
+   ;
+
+lexerAtom
+   : characterRange
+   | terminal
+   | notSet
+   | LEXER_CHAR_SET
+   | DOT elementOptions?
+   ;
+
+atom
+   : terminal
+   | ruleref
+   | notSet
+   | DOT elementOptions?
+   ;
+
+// --------------------
+// Inverted element set
+notSet
+   : NOT setElement
+   | NOT blockSet
+   ;
+
+blockSet
+   : LPAREN setElement (OR setElement)* RPAREN
+   ;
+
+setElement
+   : TOKEN_REF elementOptions?
+   | STRING_LITERAL elementOptions?
+   | characterRange
+   | LEXER_CHAR_SET
+   ;
+
+// -------------
+// Grammar Block
+block
+   : LPAREN (optionsSpec? ruleAction* COLON)? altList RPAREN
+   ;
+
+// ----------------
+// Parser rule ref
+ruleref
+   : RULE_REF argActionBlock? elementOptions?
+   ;
+
+// ---------------
+// Character Range
+characterRange
+   : STRING_LITERAL RANGE STRING_LITERAL
+   ;
+
+terminal
+   : TOKEN_REF elementOptions?
+   | STRING_LITERAL elementOptions?
+   ;
+
+// Terminals may be adorned with certain options when
+// reference in the grammar: TOK<,,,>
+elementOptions
+   : LT elementOption (COMMA elementOption)* GT
+   ;
+
+elementOption
+   : identifier
+   | identifier ASSIGN (identifier | STRING_LITERAL)
+   ;
+
+identifier
+   : RULE_REF
+   | TOKEN_REF
+   ;
+   
diff --git a/java/languages.antlr/src/org/antlr/parser/antlr4/ANTLRv4Parser.java b/java/languages.antlr/src/org/antlr/parser/antlr4/ANTLRv4Parser.java
new file mode 100644
index 0000000..6df7f7b
--- /dev/null
+++ b/java/languages.antlr/src/org/antlr/parser/antlr4/ANTLRv4Parser.java
@@ -0,0 +1,4708 @@
+// Generated from ANTLRv4Parser.g4 by ANTLR 4.7.2
+
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+// DO NOT EDIT THIS FILE MANUALLY!
+// SEE build.xml FOR INSTRUCTIONS
+
+
+package org.antlr.parser.antlr4;
+
+
+import org.antlr.v4.runtime.atn.*;
+import org.antlr.v4.runtime.dfa.DFA;
+import org.antlr.v4.runtime.*;
+import org.antlr.v4.runtime.misc.*;
+import org.antlr.v4.runtime.tree.*;
+import java.util.List;
+import java.util.Iterator;
+import java.util.ArrayList;
+
+@SuppressWarnings({"all", "warnings", "unchecked", "unused", "cast"})
+public class ANTLRv4Parser extends Parser {
+	static { RuntimeMetaData.checkVersion("4.7.2", RuntimeMetaData.VERSION); }
+
+	protected static final DFA[] _decisionToDFA;
+	protected static final PredictionContextCache _sharedContextCache =
+		new PredictionContextCache();
+	public static final int
+		TOKEN_REF=1, RULE_REF=2, LEXER_CHAR_SET=3, DOC_COMMENT=4, BLOCK_COMMENT=5, 
+		LINE_COMMENT=6, INT=7, STRING_LITERAL=8, UNTERMINATED_STRING_LITERAL=9, 
+		BEGIN_ARGUMENT=10, BEGIN_ACTION=11, OPTIONS=12, TOKENS=13, CHANNELS=14, 
+		IMPORT=15, FRAGMENT=16, LEXER=17, PARSER=18, GRAMMAR=19, PROTECTED=20, 
+		PUBLIC=21, PRIVATE=22, RETURNS=23, LOCALS=24, THROWS=25, CATCH=26, FINALLY=27, 
+		MODE=28, COLON=29, COLONCOLON=30, COMMA=31, SEMI=32, LPAREN=33, RPAREN=34, 
+		LBRACE=35, RBRACE=36, RARROW=37, LT=38, GT=39, ASSIGN=40, QUESTION=41, 
+		STAR=42, PLUS_ASSIGN=43, PLUS=44, OR=45, DOLLAR=46, RANGE=47, DOT=48, 
+		AT=49, POUND=50, NOT=51, ID=52, WS=53, ERRCHAR=54, END_ARGUMENT=55, UNTERMINATED_ARGUMENT=56, 
+		ARGUMENT_CONTENT=57, END_ACTION=58, UNTERMINATED_ACTION=59, ACTION_CONTENT=60, 
+		UNTERMINATED_CHAR_SET=61;
+	public static final int
+		RULE_grammarSpec = 0, RULE_grammarDecl = 1, RULE_grammarType = 2, RULE_prequelConstruct = 3, 
+		RULE_optionsSpec = 4, RULE_option = 5, RULE_optionValue = 6, RULE_delegateGrammars = 7, 
+		RULE_delegateGrammar = 8, RULE_tokensSpec = 9, RULE_channelsSpec = 10, 
+		RULE_idList = 11, RULE_action_ = 12, RULE_actionScopeName = 13, RULE_actionBlock = 14, 
+		RULE_argActionBlock = 15, RULE_modeSpec = 16, RULE_rules = 17, RULE_ruleSpec = 18, 
+		RULE_parserRuleSpec = 19, RULE_exceptionGroup = 20, RULE_exceptionHandler = 21, 
+		RULE_finallyClause = 22, RULE_rulePrequel = 23, RULE_ruleReturns = 24, 
+		RULE_throwsSpec = 25, RULE_localsSpec = 26, RULE_ruleAction = 27, RULE_ruleModifiers = 28, 
+		RULE_ruleModifier = 29, RULE_ruleBlock = 30, RULE_ruleAltList = 31, RULE_labeledAlt = 32, 
+		RULE_lexerRuleSpec = 33, RULE_lexerRuleBlock = 34, RULE_lexerAltList = 35, 
+		RULE_lexerAlt = 36, RULE_lexerElements = 37, RULE_lexerElement = 38, RULE_labeledLexerElement = 39, 
+		RULE_lexerBlock = 40, RULE_lexerCommands = 41, RULE_lexerCommand = 42, 
+		RULE_lexerCommandName = 43, RULE_lexerCommandExpr = 44, RULE_altList = 45, 
+		RULE_alternative = 46, RULE_element = 47, RULE_labeledElement = 48, RULE_ebnf = 49, 
+		RULE_blockSuffix = 50, RULE_ebnfSuffix = 51, RULE_lexerAtom = 52, RULE_atom = 53, 
+		RULE_notSet = 54, RULE_blockSet = 55, RULE_setElement = 56, RULE_block = 57, 
+		RULE_ruleref = 58, RULE_characterRange = 59, RULE_terminal = 60, RULE_elementOptions = 61, 
+		RULE_elementOption = 62, RULE_identifier = 63;
+	private static String[] makeRuleNames() {
+		return new String[] {
+			"grammarSpec", "grammarDecl", "grammarType", "prequelConstruct", "optionsSpec", 
+			"option", "optionValue", "delegateGrammars", "delegateGrammar", "tokensSpec", 
+			"channelsSpec", "idList", "action_", "actionScopeName", "actionBlock", 
+			"argActionBlock", "modeSpec", "rules", "ruleSpec", "parserRuleSpec", 
+			"exceptionGroup", "exceptionHandler", "finallyClause", "rulePrequel", 
+			"ruleReturns", "throwsSpec", "localsSpec", "ruleAction", "ruleModifiers", 
+			"ruleModifier", "ruleBlock", "ruleAltList", "labeledAlt", "lexerRuleSpec", 
+			"lexerRuleBlock", "lexerAltList", "lexerAlt", "lexerElements", "lexerElement", 
+			"labeledLexerElement", "lexerBlock", "lexerCommands", "lexerCommand", 
+			"lexerCommandName", "lexerCommandExpr", "altList", "alternative", "element", 
+			"labeledElement", "ebnf", "blockSuffix", "ebnfSuffix", "lexerAtom", "atom", 
+			"notSet", "blockSet", "setElement", "block", "ruleref", "characterRange", 
+			"terminal", "elementOptions", "elementOption", "identifier"
+		};
+	}
+	public static final String[] ruleNames = makeRuleNames();
+
+	private static String[] makeLiteralNames() {
+		return new String[] {
+			null, null, null, null, null, null, null, null, null, null, null, null, 
+			null, null, null, "'import'", "'fragment'", "'lexer'", "'parser'", "'grammar'", 
+			"'protected'", "'public'", "'private'", "'returns'", "'locals'", "'throws'", 
+			"'catch'", "'finally'", "'mode'"
+		};
+	}
+	private static final String[] _LITERAL_NAMES = makeLiteralNames();
+	private static String[] makeSymbolicNames() {
+		return new String[] {
+			null, "TOKEN_REF", "RULE_REF", "LEXER_CHAR_SET", "DOC_COMMENT", "BLOCK_COMMENT", 
+			"LINE_COMMENT", "INT", "STRING_LITERAL", "UNTERMINATED_STRING_LITERAL", 
+			"BEGIN_ARGUMENT", "BEGIN_ACTION", "OPTIONS", "TOKENS", "CHANNELS", "IMPORT", 
+			"FRAGMENT", "LEXER", "PARSER", "GRAMMAR", "PROTECTED", "PUBLIC", "PRIVATE", 
+			"RETURNS", "LOCALS", "THROWS", "CATCH", "FINALLY", "MODE", "COLON", "COLONCOLON", 
+			"COMMA", "SEMI", "LPAREN", "RPAREN", "LBRACE", "RBRACE", "RARROW", "LT", 
+			"GT", "ASSIGN", "QUESTION", "STAR", "PLUS_ASSIGN", "PLUS", "OR", "DOLLAR", 
+			"RANGE", "DOT", "AT", "POUND", "NOT", "ID", "WS", "ERRCHAR", "END_ARGUMENT", 
+			"UNTERMINATED_ARGUMENT", "ARGUMENT_CONTENT", "END_ACTION", "UNTERMINATED_ACTION", 
+			"ACTION_CONTENT", "UNTERMINATED_CHAR_SET"
+		};
+	}
+	private static final String[] _SYMBOLIC_NAMES = makeSymbolicNames();
+	public static final Vocabulary VOCABULARY = new VocabularyImpl(_LITERAL_NAMES, _SYMBOLIC_NAMES);
+
+	/**
+	 * @deprecated Use {@link #VOCABULARY} instead.
+	 */
+	@Deprecated
+	public static final String[] tokenNames;
+	static {
+		tokenNames = new String[_SYMBOLIC_NAMES.length];
+		for (int i = 0; i < tokenNames.length; i++) {
+			tokenNames[i] = VOCABULARY.getLiteralName(i);
+			if (tokenNames[i] == null) {
+				tokenNames[i] = VOCABULARY.getSymbolicName(i);
+			}
+
+			if (tokenNames[i] == null) {
+				tokenNames[i] = "<INVALID>";
+			}
+		}
+	}
+
+	@Override
+	@Deprecated
+	public String[] getTokenNames() {
+		return tokenNames;
+	}
+
+	@Override
+
+	public Vocabulary getVocabulary() {
+		return VOCABULARY;
+	}
+
+	@Override
+	public String getGrammarFileName() { return "ANTLRv4Parser.g4"; }
+
+	@Override
+	public String[] getRuleNames() { return ruleNames; }
+
+	@Override
+	public String getSerializedATN() { return _serializedATN; }
+
+	@Override
+	public ATN getATN() { return _ATN; }
+
+	public ANTLRv4Parser(TokenStream input) {
+		super(input);
+		_interp = new ParserATNSimulator(this,_ATN,_decisionToDFA,_sharedContextCache);
+	}
+
+	public static class GrammarSpecContext extends ParserRuleContext {
+		public GrammarDeclContext grammarDecl() {
+			return getRuleContext(GrammarDeclContext.class,0);
+		}
+		public RulesContext rules() {
+			return getRuleContext(RulesContext.class,0);
+		}
+		public TerminalNode EOF() { return getToken(ANTLRv4Parser.EOF, 0); }
+		public List<PrequelConstructContext> prequelConstruct() {
+			return getRuleContexts(PrequelConstructContext.class);
+		}
+		public PrequelConstructContext prequelConstruct(int i) {
+			return getRuleContext(PrequelConstructContext.class,i);
+		}
+		public List<ModeSpecContext> modeSpec() {
+			return getRuleContexts(ModeSpecContext.class);
+		}
+		public ModeSpecContext modeSpec(int i) {
+			return getRuleContext(ModeSpecContext.class,i);
+		}
+		public GrammarSpecContext(ParserRuleContext parent, int invokingState) {
+			super(parent, invokingState);
+		}
+		@Override public int getRuleIndex() { return RULE_grammarSpec; }
+		@Override
+		public void enterRule(ParseTreeListener listener) {
+			if ( listener instanceof ANTLRv4ParserListener ) ((ANTLRv4ParserListener)listener).enterGrammarSpec(this);
+		}
+		@Override
+		public void exitRule(ParseTreeListener listener) {
+			if ( listener instanceof ANTLRv4ParserListener ) ((ANTLRv4ParserListener)listener).exitGrammarSpec(this);
+		}
+	}
+
+	public final GrammarSpecContext grammarSpec() throws RecognitionException {
+		GrammarSpecContext _localctx = new GrammarSpecContext(_ctx, getState());
+		enterRule(_localctx, 0, RULE_grammarSpec);
+		int _la;
+		try {
+			enterOuterAlt(_localctx, 1);
+			{
+			setState(128);
+			grammarDecl();
+			setState(132);
+			_errHandler.sync(this);
+			_la = _input.LA(1);
+			while ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << OPTIONS) | (1L << TOKENS) | (1L << CHANNELS) | (1L << IMPORT) | (1L << AT))) != 0)) {
+				{
+				{
+				setState(129);
+				prequelConstruct();
+				}
+				}
+				setState(134);
+				_errHandler.sync(this);
+				_la = _input.LA(1);
+			}
+			setState(135);
+			rules();
+			setState(139);
+			_errHandler.sync(this);
+			_la = _input.LA(1);
+			while (_la==MODE) {
+				{
+				{
+				setState(136);
+				modeSpec();
+				}
+				}
+				setState(141);
+				_errHandler.sync(this);
+				_la = _input.LA(1);
+			}
+			setState(142);
+			match(EOF);
+			}
+		}
+		catch (RecognitionException re) {
+			_localctx.exception = re;
+			_errHandler.reportError(this, re);
+			_errHandler.recover(this, re);
+		}
+		finally {
+			exitRule();
+		}
+		return _localctx;
+	}
+
+	public static class GrammarDeclContext extends ParserRuleContext {
+		public GrammarTypeContext grammarType() {
+			return getRuleContext(GrammarTypeContext.class,0);
+		}
+		public IdentifierContext identifier() {
+			return getRuleContext(IdentifierContext.class,0);
+		}
+		public TerminalNode SEMI() { return getToken(ANTLRv4Parser.SEMI, 0); }
+		public GrammarDeclContext(ParserRuleContext parent, int invokingState) {
+			super(parent, invokingState);
+		}
+		@Override public int getRuleIndex() { return RULE_grammarDecl; }
+		@Override
+		public void enterRule(ParseTreeListener listener) {
+			if ( listener instanceof ANTLRv4ParserListener ) ((ANTLRv4ParserListener)listener).enterGrammarDecl(this);
+		}
+		@Override
+		public void exitRule(ParseTreeListener listener) {
+			if ( listener instanceof ANTLRv4ParserListener ) ((ANTLRv4ParserListener)listener).exitGrammarDecl(this);
+		}
+	}
+
+	public final GrammarDeclContext grammarDecl() throws RecognitionException {
+		GrammarDeclContext _localctx = new GrammarDeclContext(_ctx, getState());
+		enterRule(_localctx, 2, RULE_grammarDecl);
+		try {
+			enterOuterAlt(_localctx, 1);
+			{
+			setState(144);
+			grammarType();
+			setState(145);
+			identifier();
+			setState(146);
+			match(SEMI);
+			}
+		}
+		catch (RecognitionException re) {
+			_localctx.exception = re;
+			_errHandler.reportError(this, re);
+			_errHandler.recover(this, re);
+		}
+		finally {
+			exitRule();
+		}
+		return _localctx;
+	}
+
+	public static class GrammarTypeContext extends ParserRuleContext {
+		public TerminalNode LEXER() { return getToken(ANTLRv4Parser.LEXER, 0); }
+		public TerminalNode GRAMMAR() { return getToken(ANTLRv4Parser.GRAMMAR, 0); }
+		public TerminalNode PARSER() { return getToken(ANTLRv4Parser.PARSER, 0); }
+		public GrammarTypeContext(ParserRuleContext parent, int invokingState) {
+			super(parent, invokingState);
+		}
+		@Override public int getRuleIndex() { return RULE_grammarType; }
+		@Override
+		public void enterRule(ParseTreeListener listener) {
+			if ( listener instanceof ANTLRv4ParserListener ) ((ANTLRv4ParserListener)listener).enterGrammarType(this);
+		}
+		@Override
+		public void exitRule(ParseTreeListener listener) {
+			if ( listener instanceof ANTLRv4ParserListener ) ((ANTLRv4ParserListener)listener).exitGrammarType(this);
+		}
+	}
+
+	public final GrammarTypeContext grammarType() throws RecognitionException {
+		GrammarTypeContext _localctx = new GrammarTypeContext(_ctx, getState());
+		enterRule(_localctx, 4, RULE_grammarType);
+		try {
+			enterOuterAlt(_localctx, 1);
+			{
+			setState(153);
+			_errHandler.sync(this);
+			switch (_input.LA(1)) {
+			case LEXER:
+				{
+				setState(148);
+				match(LEXER);
+				setState(149);
+				match(GRAMMAR);
+				}
+				break;
+			case PARSER:
+				{
+				setState(150);
+				match(PARSER);
+				setState(151);
+				match(GRAMMAR);
+				}
+				break;
+			case GRAMMAR:
+				{
+				setState(152);
+				match(GRAMMAR);
+				}
+				break;
+			default:
+				throw new NoViableAltException(this);
+			}
+			}
+		}
+		catch (RecognitionException re) {
+			_localctx.exception = re;
+			_errHandler.reportError(this, re);
+			_errHandler.recover(this, re);
+		}
+		finally {
+			exitRule();
+		}
+		return _localctx;
+	}
+
+	public static class PrequelConstructContext extends ParserRuleContext {
+		public OptionsSpecContext optionsSpec() {
+			return getRuleContext(OptionsSpecContext.class,0);
+		}
+		public DelegateGrammarsContext delegateGrammars() {
+			return getRuleContext(DelegateGrammarsContext.class,0);
+		}
+		public TokensSpecContext tokensSpec() {
+			return getRuleContext(TokensSpecContext.class,0);
+		}
+		public ChannelsSpecContext channelsSpec() {
+			return getRuleContext(ChannelsSpecContext.class,0);
+		}
+		public Action_Context action_() {
+			return getRuleContext(Action_Context.class,0);
+		}
+		public PrequelConstructContext(ParserRuleContext parent, int invokingState) {
+			super(parent, invokingState);
+		}
+		@Override public int getRuleIndex() { return RULE_prequelConstruct; }
+		@Override
+		public void enterRule(ParseTreeListener listener) {
+			if ( listener instanceof ANTLRv4ParserListener ) ((ANTLRv4ParserListener)listener).enterPrequelConstruct(this);
+		}
+		@Override
+		public void exitRule(ParseTreeListener listener) {
+			if ( listener instanceof ANTLRv4ParserListener ) ((ANTLRv4ParserListener)listener).exitPrequelConstruct(this);
+		}
+	}
+
+	public final PrequelConstructContext prequelConstruct() throws RecognitionException {
+		PrequelConstructContext _localctx = new PrequelConstructContext(_ctx, getState());
+		enterRule(_localctx, 6, RULE_prequelConstruct);
+		try {
+			setState(160);
+			_errHandler.sync(this);
+			switch (_input.LA(1)) {
+			case OPTIONS:
+				enterOuterAlt(_localctx, 1);
+				{
+				setState(155);
+				optionsSpec();
+				}
+				break;
+			case IMPORT:
+				enterOuterAlt(_localctx, 2);
+				{
+				setState(156);
+				delegateGrammars();
+				}
+				break;
+			case TOKENS:
+				enterOuterAlt(_localctx, 3);
+				{
+				setState(157);
+				tokensSpec();
+				}
+				break;
+			case CHANNELS:
+				enterOuterAlt(_localctx, 4);
+				{
+				setState(158);
+				channelsSpec();
+				}
+				break;
+			case AT:
+				enterOuterAlt(_localctx, 5);
+				{
+				setState(159);
+				action_();
+				}
+				break;
+			default:
+				throw new NoViableAltException(this);
+			}
+		}
+		catch (RecognitionException re) {
+			_localctx.exception = re;
+			_errHandler.reportError(this, re);
+			_errHandler.recover(this, re);
+		}
+		finally {
+			exitRule();
+		}
+		return _localctx;
+	}
+
+	public static class OptionsSpecContext extends ParserRuleContext {
+		public TerminalNode OPTIONS() { return getToken(ANTLRv4Parser.OPTIONS, 0); }
+		public TerminalNode RBRACE() { return getToken(ANTLRv4Parser.RBRACE, 0); }
+		public List<OptionContext> option() {
+			return getRuleContexts(OptionContext.class);
+		}
+		public OptionContext option(int i) {
+			return getRuleContext(OptionContext.class,i);
+		}
+		public List<TerminalNode> SEMI() { return getTokens(ANTLRv4Parser.SEMI); }
+		public TerminalNode SEMI(int i) {
+			return getToken(ANTLRv4Parser.SEMI, i);
+		}
+		public OptionsSpecContext(ParserRuleContext parent, int invokingState) {
+			super(parent, invokingState);
+		}
+		@Override public int getRuleIndex() { return RULE_optionsSpec; }
+		@Override
+		public void enterRule(ParseTreeListener listener) {
+			if ( listener instanceof ANTLRv4ParserListener ) ((ANTLRv4ParserListener)listener).enterOptionsSpec(this);
+		}
+		@Override
+		public void exitRule(ParseTreeListener listener) {
+			if ( listener instanceof ANTLRv4ParserListener ) ((ANTLRv4ParserListener)listener).exitOptionsSpec(this);
+		}
+	}
+
+	public final OptionsSpecContext optionsSpec() throws RecognitionException {
+		OptionsSpecContext _localctx = new OptionsSpecContext(_ctx, getState());
+		enterRule(_localctx, 8, RULE_optionsSpec);
+		int _la;
+		try {
+			enterOuterAlt(_localctx, 1);
+			{
+			setState(162);
+			match(OPTIONS);
+			setState(168);
+			_errHandler.sync(this);
+			_la = _input.LA(1);
+			while (_la==TOKEN_REF || _la==RULE_REF) {
+				{
+				{
+				setState(163);
+				option();
+				setState(164);
+				match(SEMI);
+				}
+				}
+				setState(170);
+				_errHandler.sync(this);
+				_la = _input.LA(1);
+			}
+			setState(171);
+			match(RBRACE);
+			}
+		}
+		catch (RecognitionException re) {
+			_localctx.exception = re;
+			_errHandler.reportError(this, re);
+			_errHandler.recover(this, re);
+		}
+		finally {
+			exitRule();
+		}
+		return _localctx;
+	}
+
+	public static class OptionContext extends ParserRuleContext {
+		public IdentifierContext identifier() {
+			return getRuleContext(IdentifierContext.class,0);
+		}
+		public TerminalNode ASSIGN() { return getToken(ANTLRv4Parser.ASSIGN, 0); }
+		public OptionValueContext optionValue() {
+			return getRuleContext(OptionValueContext.class,0);
+		}
+		public OptionContext(ParserRuleContext parent, int invokingState) {
+			super(parent, invokingState);
+		}
+		@Override public int getRuleIndex() { return RULE_option; }
+		@Override
+		public void enterRule(ParseTreeListener listener) {
+			if ( listener instanceof ANTLRv4ParserListener ) ((ANTLRv4ParserListener)listener).enterOption(this);
+		}
+		@Override
+		public void exitRule(ParseTreeListener listener) {
+			if ( listener instanceof ANTLRv4ParserListener ) ((ANTLRv4ParserListener)listener).exitOption(this);
+		}
+	}
+
+	public final OptionContext option() throws RecognitionException {
+		OptionContext _localctx = new OptionContext(_ctx, getState());
+		enterRule(_localctx, 10, RULE_option);
+		try {
+			enterOuterAlt(_localctx, 1);
+			{
+			setState(173);
+			identifier();
+			setState(174);
+			match(ASSIGN);
+			setState(175);
+			optionValue();
+			}
+		}
+		catch (RecognitionException re) {
+			_localctx.exception = re;
+			_errHandler.reportError(this, re);
+			_errHandler.recover(this, re);
+		}
+		finally {
+			exitRule();
+		}
+		return _localctx;
+	}
+
+	public static class OptionValueContext extends ParserRuleContext {
+		public List<IdentifierContext> identifier() {
+			return getRuleContexts(IdentifierContext.class);
+		}
+		public IdentifierContext identifier(int i) {
+			return getRuleContext(IdentifierContext.class,i);
+		}
+		public List<TerminalNode> DOT() { return getTokens(ANTLRv4Parser.DOT); }
+		public TerminalNode DOT(int i) {
+			return getToken(ANTLRv4Parser.DOT, i);
+		}
+		public TerminalNode STRING_LITERAL() { return getToken(ANTLRv4Parser.STRING_LITERAL, 0); }
+		public ActionBlockContext actionBlock() {
+			return getRuleContext(ActionBlockContext.class,0);
+		}
+		public TerminalNode INT() { return getToken(ANTLRv4Parser.INT, 0); }
+		public OptionValueContext(ParserRuleContext parent, int invokingState) {
+			super(parent, invokingState);
+		}
+		@Override public int getRuleIndex() { return RULE_optionValue; }
+		@Override
+		public void enterRule(ParseTreeListener listener) {
+			if ( listener instanceof ANTLRv4ParserListener ) ((ANTLRv4ParserListener)listener).enterOptionValue(this);
+		}
+		@Override
+		public void exitRule(ParseTreeListener listener) {
+			if ( listener instanceof ANTLRv4ParserListener ) ((ANTLRv4ParserListener)listener).exitOptionValue(this);
+		}
+	}
+
+	public final OptionValueContext optionValue() throws RecognitionException {
+		OptionValueContext _localctx = new OptionValueContext(_ctx, getState());
+		enterRule(_localctx, 12, RULE_optionValue);
+		int _la;
+		try {
+			setState(188);
+			_errHandler.sync(this);
+			switch (_input.LA(1)) {
+			case TOKEN_REF:
+			case RULE_REF:
+				enterOuterAlt(_localctx, 1);
+				{
+				setState(177);
+				identifier();
+				setState(182);
+				_errHandler.sync(this);
+				_la = _input.LA(1);
+				while (_la==DOT) {
+					{
+					{
+					setState(178);
+					match(DOT);
+					setState(179);
+					identifier();
+					}
+					}
+					setState(184);
+					_errHandler.sync(this);
+					_la = _input.LA(1);
+				}
+				}
+				break;
+			case STRING_LITERAL:
+				enterOuterAlt(_localctx, 2);
+				{
+				setState(185);
+				match(STRING_LITERAL);
+				}
+				break;
+			case BEGIN_ACTION:
+				enterOuterAlt(_localctx, 3);
+				{
+				setState(186);
+				actionBlock();
+				}
+				break;
+			case INT:
+				enterOuterAlt(_localctx, 4);
+				{
+				setState(187);
+				match(INT);
+				}
+				break;
+			default:
+				throw new NoViableAltException(this);
+			}
+		}
+		catch (RecognitionException re) {
+			_localctx.exception = re;
+			_errHandler.reportError(this, re);
+			_errHandler.recover(this, re);
+		}
+		finally {
+			exitRule();
+		}
+		return _localctx;
+	}
+
+	public static class DelegateGrammarsContext extends ParserRuleContext {
+		public TerminalNode IMPORT() { return getToken(ANTLRv4Parser.IMPORT, 0); }
+		public List<DelegateGrammarContext> delegateGrammar() {
+			return getRuleContexts(DelegateGrammarContext.class);
+		}
+		public DelegateGrammarContext delegateGrammar(int i) {
+			return getRuleContext(DelegateGrammarContext.class,i);
+		}
+		public TerminalNode SEMI() { return getToken(ANTLRv4Parser.SEMI, 0); }
+		public List<TerminalNode> COMMA() { return getTokens(ANTLRv4Parser.COMMA); }
+		public TerminalNode COMMA(int i) {
+			return getToken(ANTLRv4Parser.COMMA, i);
+		}
+		public DelegateGrammarsContext(ParserRuleContext parent, int invokingState) {
+			super(parent, invokingState);
+		}
+		@Override public int getRuleIndex() { return RULE_delegateGrammars; }
+		@Override
+		public void enterRule(ParseTreeListener listener) {
+			if ( listener instanceof ANTLRv4ParserListener ) ((ANTLRv4ParserListener)listener).enterDelegateGrammars(this);
+		}
+		@Override
+		public void exitRule(ParseTreeListener listener) {
+			if ( listener instanceof ANTLRv4ParserListener ) ((ANTLRv4ParserListener)listener).exitDelegateGrammars(this);
+		}
+	}
+
+	public final DelegateGrammarsContext delegateGrammars() throws RecognitionException {
+		DelegateGrammarsContext _localctx = new DelegateGrammarsContext(_ctx, getState());
+		enterRule(_localctx, 14, RULE_delegateGrammars);
+		int _la;
+		try {
+			enterOuterAlt(_localctx, 1);
+			{
+			setState(190);
+			match(IMPORT);
+			setState(191);
+			delegateGrammar();
+			setState(196);
+			_errHandler.sync(this);
+			_la = _input.LA(1);
+			while (_la==COMMA) {
+				{
+				{
+				setState(192);
+				match(COMMA);
+				setState(193);
+				delegateGrammar();
+				}
+				}
+				setState(198);
+				_errHandler.sync(this);
+				_la = _input.LA(1);
+			}
+			setState(199);
+			match(SEMI);
+			}
+		}
+		catch (RecognitionException re) {
+			_localctx.exception = re;
+			_errHandler.reportError(this, re);
+			_errHandler.recover(this, re);
+		}
+		finally {
+			exitRule();
+		}
+		return _localctx;
+	}
+
+	public static class DelegateGrammarContext extends ParserRuleContext {
+		public List<IdentifierContext> identifier() {
+			return getRuleContexts(IdentifierContext.class);
+		}
+		public IdentifierContext identifier(int i) {
+			return getRuleContext(IdentifierContext.class,i);
+		}
+		public TerminalNode ASSIGN() { return getToken(ANTLRv4Parser.ASSIGN, 0); }
+		public DelegateGrammarContext(ParserRuleContext parent, int invokingState) {
+			super(parent, invokingState);
+		}
+		@Override public int getRuleIndex() { return RULE_delegateGrammar; }
+		@Override
+		public void enterRule(ParseTreeListener listener) {
+			if ( listener instanceof ANTLRv4ParserListener ) ((ANTLRv4ParserListener)listener).enterDelegateGrammar(this);
+		}
+		@Override
+		public void exitRule(ParseTreeListener listener) {
+			if ( listener instanceof ANTLRv4ParserListener ) ((ANTLRv4ParserListener)listener).exitDelegateGrammar(this);
+		}
+	}
+
+	public final DelegateGrammarContext delegateGrammar() throws RecognitionException {
+		DelegateGrammarContext _localctx = new DelegateGrammarContext(_ctx, getState());
+		enterRule(_localctx, 16, RULE_delegateGrammar);
+		try {
+			setState(206);
+			_errHandler.sync(this);
+			switch ( getInterpreter().adaptivePredict(_input,8,_ctx) ) {
+			case 1:
+				enterOuterAlt(_localctx, 1);
+				{
+				setState(201);
+				identifier();
+				setState(202);
+				match(ASSIGN);
+				setState(203);
+				identifier();
+				}
+				break;
+			case 2:
+				enterOuterAlt(_localctx, 2);
+				{
+				setState(205);
+				identifier();
+				}
+				break;
+			}
+		}
+		catch (RecognitionException re) {
+			_localctx.exception = re;
+			_errHandler.reportError(this, re);
+			_errHandler.recover(this, re);
+		}
+		finally {
+			exitRule();
+		}
+		return _localctx;
+	}
+
+	public static class TokensSpecContext extends ParserRuleContext {
+		public TerminalNode TOKENS() { return getToken(ANTLRv4Parser.TOKENS, 0); }
+		public TerminalNode RBRACE() { return getToken(ANTLRv4Parser.RBRACE, 0); }
+		public IdListContext idList() {
+			return getRuleContext(IdListContext.class,0);
+		}
+		public TokensSpecContext(ParserRuleContext parent, int invokingState) {
+			super(parent, invokingState);
+		}
+		@Override public int getRuleIndex() { return RULE_tokensSpec; }
+		@Override
+		public void enterRule(ParseTreeListener listener) {
+			if ( listener instanceof ANTLRv4ParserListener ) ((ANTLRv4ParserListener)listener).enterTokensSpec(this);
+		}
+		@Override
+		public void exitRule(ParseTreeListener listener) {
+			if ( listener instanceof ANTLRv4ParserListener ) ((ANTLRv4ParserListener)listener).exitTokensSpec(this);
+		}
+	}
+
+	public final TokensSpecContext tokensSpec() throws RecognitionException {
+		TokensSpecContext _localctx = new TokensSpecContext(_ctx, getState());
+		enterRule(_localctx, 18, RULE_tokensSpec);
+		int _la;
+		try {
+			enterOuterAlt(_localctx, 1);
+			{
+			setState(208);
+			match(TOKENS);
+			setState(210);
+			_errHandler.sync(this);
+			_la = _input.LA(1);
+			if (_la==TOKEN_REF || _la==RULE_REF) {
+				{
+				setState(209);
+				idList();
+				}
+			}
+
+			setState(212);
+			match(RBRACE);
+			}
+		}
+		catch (RecognitionException re) {
+			_localctx.exception = re;
+			_errHandler.reportError(this, re);
+			_errHandler.recover(this, re);
+		}
+		finally {
+			exitRule();
+		}
+		return _localctx;
+	}
+
+	public static class ChannelsSpecContext extends ParserRuleContext {
+		public TerminalNode CHANNELS() { return getToken(ANTLRv4Parser.CHANNELS, 0); }
+		public TerminalNode RBRACE() { return getToken(ANTLRv4Parser.RBRACE, 0); }
+		public IdListContext idList() {
+			return getRuleContext(IdListContext.class,0);
+		}
+		public ChannelsSpecContext(ParserRuleContext parent, int invokingState) {
+			super(parent, invokingState);
+		}
+		@Override public int getRuleIndex() { return RULE_channelsSpec; }
+		@Override
+		public void enterRule(ParseTreeListener listener) {
+			if ( listener instanceof ANTLRv4ParserListener ) ((ANTLRv4ParserListener)listener).enterChannelsSpec(this);
+		}
+		@Override
+		public void exitRule(ParseTreeListener listener) {
+			if ( listener instanceof ANTLRv4ParserListener ) ((ANTLRv4ParserListener)listener).exitChannelsSpec(this);
+		}
+	}
+
+	public final ChannelsSpecContext channelsSpec() throws RecognitionException {
+		ChannelsSpecContext _localctx = new ChannelsSpecContext(_ctx, getState());
+		enterRule(_localctx, 20, RULE_channelsSpec);
+		int _la;
+		try {
+			enterOuterAlt(_localctx, 1);
+			{
+			setState(214);
+			match(CHANNELS);
+			setState(216);
+			_errHandler.sync(this);
+			_la = _input.LA(1);
+			if (_la==TOKEN_REF || _la==RULE_REF) {
+				{
+				setState(215);
+				idList();
+				}
+			}
+
+			setState(218);
+			match(RBRACE);
+			}
+		}
+		catch (RecognitionException re) {
+			_localctx.exception = re;
+			_errHandler.reportError(this, re);
+			_errHandler.recover(this, re);
+		}
+		finally {
+			exitRule();
+		}
+		return _localctx;
+	}
+
+	public static class IdListContext extends ParserRuleContext {
+		public List<IdentifierContext> identifier() {
+			return getRuleContexts(IdentifierContext.class);
+		}
+		public IdentifierContext identifier(int i) {
+			return getRuleContext(IdentifierContext.class,i);
+		}
+		public List<TerminalNode> COMMA() { return getTokens(ANTLRv4Parser.COMMA); }
+		public TerminalNode COMMA(int i) {
+			return getToken(ANTLRv4Parser.COMMA, i);
+		}
+		public IdListContext(ParserRuleContext parent, int invokingState) {
+			super(parent, invokingState);
+		}
+		@Override public int getRuleIndex() { return RULE_idList; }
+		@Override
+		public void enterRule(ParseTreeListener listener) {
+			if ( listener instanceof ANTLRv4ParserListener ) ((ANTLRv4ParserListener)listener).enterIdList(this);
+		}
+		@Override
+		public void exitRule(ParseTreeListener listener) {
+			if ( listener instanceof ANTLRv4ParserListener ) ((ANTLRv4ParserListener)listener).exitIdList(this);
+		}
+	}
+
+	public final IdListContext idList() throws RecognitionException {
+		IdListContext _localctx = new IdListContext(_ctx, getState());
+		enterRule(_localctx, 22, RULE_idList);
+		int _la;
+		try {
+			int _alt;
+			enterOuterAlt(_localctx, 1);
+			{
+			setState(220);
+			identifier();
+			setState(225);
+			_errHandler.sync(this);
+			_alt = getInterpreter().adaptivePredict(_input,11,_ctx);
+			while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) {
+				if ( _alt==1 ) {
+					{
+					{
+					setState(221);
+					match(COMMA);
+					setState(222);
+					identifier();
+					}
+					} 
+				}
+				setState(227);
+				_errHandler.sync(this);
+				_alt = getInterpreter().adaptivePredict(_input,11,_ctx);
+			}
+			setState(229);
+			_errHandler.sync(this);
+			_la = _input.LA(1);
+			if (_la==COMMA) {
+				{
+				setState(228);
+				match(COMMA);
+				}
+			}
+
+			}
+		}
+		catch (RecognitionException re) {
+			_localctx.exception = re;
+			_errHandler.reportError(this, re);
+			_errHandler.recover(this, re);
+		}
+		finally {
+			exitRule();
+		}
+		return _localctx;
+	}
+
+	public static class Action_Context extends ParserRuleContext {
+		public TerminalNode AT() { return getToken(ANTLRv4Parser.AT, 0); }
+		public IdentifierContext identifier() {
+			return getRuleContext(IdentifierContext.class,0);
+		}
+		public ActionBlockContext actionBlock() {
+			return getRuleContext(ActionBlockContext.class,0);
+		}
+		public ActionScopeNameContext actionScopeName() {
+			return getRuleContext(ActionScopeNameContext.class,0);
+		}
+		public TerminalNode COLONCOLON() { return getToken(ANTLRv4Parser.COLONCOLON, 0); }
+		public Action_Context(ParserRuleContext parent, int invokingState) {
+			super(parent, invokingState);
+		}
+		@Override public int getRuleIndex() { return RULE_action_; }
+		@Override
+		public void enterRule(ParseTreeListener listener) {
+			if ( listener instanceof ANTLRv4ParserListener ) ((ANTLRv4ParserListener)listener).enterAction_(this);
+		}
+		@Override
+		public void exitRule(ParseTreeListener listener) {
+			if ( listener instanceof ANTLRv4ParserListener ) ((ANTLRv4ParserListener)listener).exitAction_(this);
+		}
+	}
+
+	public final Action_Context action_() throws RecognitionException {
+		Action_Context _localctx = new Action_Context(_ctx, getState());
+		enterRule(_localctx, 24, RULE_action_);
+		try {
+			enterOuterAlt(_localctx, 1);
+			{
+			setState(231);
+			match(AT);
+			setState(235);
+			_errHandler.sync(this);
+			switch ( getInterpreter().adaptivePredict(_input,13,_ctx) ) {
+			case 1:
+				{
+				setState(232);
+				actionScopeName();
+				setState(233);
+				match(COLONCOLON);
+				}
+				break;
+			}
+			setState(237);
+			identifier();
+			setState(238);
+			actionBlock();
+			}
+		}
+		catch (RecognitionException re) {
+			_localctx.exception = re;
+			_errHandler.reportError(this, re);
+			_errHandler.recover(this, re);
+		}
+		finally {
+			exitRule();
+		}
+		return _localctx;
+	}
+
+	public static class ActionScopeNameContext extends ParserRuleContext {
+		public IdentifierContext identifier() {
+			return getRuleContext(IdentifierContext.class,0);
+		}
+		public TerminalNode LEXER() { return getToken(ANTLRv4Parser.LEXER, 0); }
+		public TerminalNode PARSER() { return getToken(ANTLRv4Parser.PARSER, 0); }
+		public ActionScopeNameContext(ParserRuleContext parent, int invokingState) {
+			super(parent, invokingState);
+		}
+		@Override public int getRuleIndex() { return RULE_actionScopeName; }
+		@Override
+		public void enterRule(ParseTreeListener listener) {
+			if ( listener instanceof ANTLRv4ParserListener ) ((ANTLRv4ParserListener)listener).enterActionScopeName(this);
+		}
+		@Override
+		public void exitRule(ParseTreeListener listener) {
+			if ( listener instanceof ANTLRv4ParserListener ) ((ANTLRv4ParserListener)listener).exitActionScopeName(this);
+		}
+	}
+
+	public final ActionScopeNameContext actionScopeName() throws RecognitionException {
+		ActionScopeNameContext _localctx = new ActionScopeNameContext(_ctx, getState());
+		enterRule(_localctx, 26, RULE_actionScopeName);
+		try {
+			setState(243);
+			_errHandler.sync(this);
+			switch (_input.LA(1)) {
+			case TOKEN_REF:
+			case RULE_REF:
+				enterOuterAlt(_localctx, 1);
+				{
+				setState(240);
+				identifier();
+				}
+				break;
+			case LEXER:
+				enterOuterAlt(_localctx, 2);
+				{
+				setState(241);
+				match(LEXER);
+				}
+				break;
+			case PARSER:
+				enterOuterAlt(_localctx, 3);
+				{
+				setState(242);
+				match(PARSER);
+				}
+				break;
+			default:
+				throw new NoViableAltException(this);
+			}
+		}
+		catch (RecognitionException re) {
+			_localctx.exception = re;
+			_errHandler.reportError(this, re);
+			_errHandler.recover(this, re);
+		}
+		finally {
+			exitRule();
+		}
+		return _localctx;
+	}
+
+	public static class ActionBlockContext extends ParserRuleContext {
+		public TerminalNode BEGIN_ACTION() { return getToken(ANTLRv4Parser.BEGIN_ACTION, 0); }
+		public TerminalNode END_ACTION() { return getToken(ANTLRv4Parser.END_ACTION, 0); }
+		public List<TerminalNode> ACTION_CONTENT() { return getTokens(ANTLRv4Parser.ACTION_CONTENT); }
+		public TerminalNode ACTION_CONTENT(int i) {
+			return getToken(ANTLRv4Parser.ACTION_CONTENT, i);
+		}
+		public ActionBlockContext(ParserRuleContext parent, int invokingState) {
+			super(parent, invokingState);
+		}
+		@Override public int getRuleIndex() { return RULE_actionBlock; }
+		@Override
+		public void enterRule(ParseTreeListener listener) {
+			if ( listener instanceof ANTLRv4ParserListener ) ((ANTLRv4ParserListener)listener).enterActionBlock(this);
+		}
+		@Override
+		public void exitRule(ParseTreeListener listener) {
+			if ( listener instanceof ANTLRv4ParserListener ) ((ANTLRv4ParserListener)listener).exitActionBlock(this);
+		}
+	}
+
+	public final ActionBlockContext actionBlock() throws RecognitionException {
+		ActionBlockContext _localctx = new ActionBlockContext(_ctx, getState());
+		enterRule(_localctx, 28, RULE_actionBlock);
+		int _la;
+		try {
+			enterOuterAlt(_localctx, 1);
+			{
+			setState(245);
+			match(BEGIN_ACTION);
+			setState(249);
+			_errHandler.sync(this);
+			_la = _input.LA(1);
+			while (_la==ACTION_CONTENT) {
+				{
+				{
+				setState(246);
+				match(ACTION_CONTENT);
+				}
+				}
+				setState(251);
+				_errHandler.sync(this);
+				_la = _input.LA(1);
+			}
+			setState(252);
+			match(END_ACTION);
+			}
+		}
+		catch (RecognitionException re) {
+			_localctx.exception = re;
+			_errHandler.reportError(this, re);
+			_errHandler.recover(this, re);
+		}
+		finally {
+			exitRule();
+		}
+		return _localctx;
+	}
+
+	public static class ArgActionBlockContext extends ParserRuleContext {
+		public TerminalNode BEGIN_ARGUMENT() { return getToken(ANTLRv4Parser.BEGIN_ARGUMENT, 0); }
+		public TerminalNode END_ARGUMENT() { return getToken(ANTLRv4Parser.END_ARGUMENT, 0); }
+		public List<TerminalNode> ARGUMENT_CONTENT() { return getTokens(ANTLRv4Parser.ARGUMENT_CONTENT); }
+		public TerminalNode ARGUMENT_CONTENT(int i) {
+			return getToken(ANTLRv4Parser.ARGUMENT_CONTENT, i);
+		}
+		public ArgActionBlockContext(ParserRuleContext parent, int invokingState) {
+			super(parent, invokingState);
+		}
+		@Override public int getRuleIndex() { return RULE_argActionBlock; }
+		@Override
+		public void enterRule(ParseTreeListener listener) {
+			if ( listener instanceof ANTLRv4ParserListener ) ((ANTLRv4ParserListener)listener).enterArgActionBlock(this);
+		}
+		@Override
+		public void exitRule(ParseTreeListener listener) {
+			if ( listener instanceof ANTLRv4ParserListener ) ((ANTLRv4ParserListener)listener).exitArgActionBlock(this);
+		}
+	}
+
+	public final ArgActionBlockContext argActionBlock() throws RecognitionException {
+		ArgActionBlockContext _localctx = new ArgActionBlockContext(_ctx, getState());
+		enterRule(_localctx, 30, RULE_argActionBlock);
+		int _la;
+		try {
+			enterOuterAlt(_localctx, 1);
+			{
+			setState(254);
+			match(BEGIN_ARGUMENT);
+			setState(258);
+			_errHandler.sync(this);
+			_la = _input.LA(1);
+			while (_la==ARGUMENT_CONTENT) {
+				{
+				{
+				setState(255);
+				match(ARGUMENT_CONTENT);
+				}
+				}
+				setState(260);
+				_errHandler.sync(this);
+				_la = _input.LA(1);
+			}
+			setState(261);
+			match(END_ARGUMENT);
+			}
+		}
+		catch (RecognitionException re) {
+			_localctx.exception = re;
+			_errHandler.reportError(this, re);
+			_errHandler.recover(this, re);
+		}
+		finally {
+			exitRule();
+		}
+		return _localctx;
+	}
+
+	public static class ModeSpecContext extends ParserRuleContext {
+		public TerminalNode MODE() { return getToken(ANTLRv4Parser.MODE, 0); }
+		public IdentifierContext identifier() {
+			return getRuleContext(IdentifierContext.class,0);
+		}
+		public TerminalNode SEMI() { return getToken(ANTLRv4Parser.SEMI, 0); }
+		public List<LexerRuleSpecContext> lexerRuleSpec() {
+			return getRuleContexts(LexerRuleSpecContext.class);
+		}
+		public LexerRuleSpecContext lexerRuleSpec(int i) {
+			return getRuleContext(LexerRuleSpecContext.class,i);
+		}
+		public ModeSpecContext(ParserRuleContext parent, int invokingState) {
+			super(parent, invokingState);
+		}
+		@Override public int getRuleIndex() { return RULE_modeSpec; }
+		@Override
+		public void enterRule(ParseTreeListener listener) {
+			if ( listener instanceof ANTLRv4ParserListener ) ((ANTLRv4ParserListener)listener).enterModeSpec(this);
+		}
+		@Override
+		public void exitRule(ParseTreeListener listener) {
+			if ( listener instanceof ANTLRv4ParserListener ) ((ANTLRv4ParserListener)listener).exitModeSpec(this);
+		}
+	}
+
+	public final ModeSpecContext modeSpec() throws RecognitionException {
+		ModeSpecContext _localctx = new ModeSpecContext(_ctx, getState());
+		enterRule(_localctx, 32, RULE_modeSpec);
+		int _la;
+		try {
+			enterOuterAlt(_localctx, 1);
+			{
+			setState(263);
+			match(MODE);
+			setState(264);
+			identifier();
+			setState(265);
+			match(SEMI);
+			setState(269);
+			_errHandler.sync(this);
+			_la = _input.LA(1);
+			while (_la==TOKEN_REF || _la==FRAGMENT) {
+				{
+				{
+				setState(266);
+				lexerRuleSpec();
+				}
+				}
+				setState(271);
+				_errHandler.sync(this);
+				_la = _input.LA(1);
+			}
+			}
+		}
+		catch (RecognitionException re) {
+			_localctx.exception = re;
+			_errHandler.reportError(this, re);
+			_errHandler.recover(this, re);
+		}
+		finally {
+			exitRule();
+		}
+		return _localctx;
+	}
+
+	public static class RulesContext extends ParserRuleContext {
+		public List<RuleSpecContext> ruleSpec() {
+			return getRuleContexts(RuleSpecContext.class);
+		}
+		public RuleSpecContext ruleSpec(int i) {
+			return getRuleContext(RuleSpecContext.class,i);
+		}
+		public RulesContext(ParserRuleContext parent, int invokingState) {
+			super(parent, invokingState);
+		}
+		@Override public int getRuleIndex() { return RULE_rules; }
+		@Override
+		public void enterRule(ParseTreeListener listener) {
+			if ( listener instanceof ANTLRv4ParserListener ) ((ANTLRv4ParserListener)listener).enterRules(this);
+		}
+		@Override
+		public void exitRule(ParseTreeListener listener) {
+			if ( listener instanceof ANTLRv4ParserListener ) ((ANTLRv4ParserListener)listener).exitRules(this);
+		}
+	}
+
+	public final RulesContext rules() throws RecognitionException {
+		RulesContext _localctx = new RulesContext(_ctx, getState());
+		enterRule(_localctx, 34, RULE_rules);
+		int _la;
+		try {
+			enterOuterAlt(_localctx, 1);
+			{
+			setState(275);
+			_errHandler.sync(this);
+			_la = _input.LA(1);
+			while ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << TOKEN_REF) | (1L << RULE_REF) | (1L << FRAGMENT) | (1L << PROTECTED) | (1L << PUBLIC) | (1L << PRIVATE))) != 0)) {
+				{
+				{
+				setState(272);
+				ruleSpec();
+				}
+				}
+				setState(277);
+				_errHandler.sync(this);
+				_la = _input.LA(1);
+			}
+			}
+		}
+		catch (RecognitionException re) {
+			_localctx.exception = re;
+			_errHandler.reportError(this, re);
+			_errHandler.recover(this, re);
+		}
+		finally {
+			exitRule();
+		}
+		return _localctx;
+	}
+
+	public static class RuleSpecContext extends ParserRuleContext {
+		public ParserRuleSpecContext parserRuleSpec() {
+			return getRuleContext(ParserRuleSpecContext.class,0);
+		}
+		public LexerRuleSpecContext lexerRuleSpec() {
+			return getRuleContext(LexerRuleSpecContext.class,0);
+		}
+		public RuleSpecContext(ParserRuleContext parent, int invokingState) {
+			super(parent, invokingState);
+		}
+		@Override public int getRuleIndex() { return RULE_ruleSpec; }
+		@Override
+		public void enterRule(ParseTreeListener listener) {
+			if ( listener instanceof ANTLRv4ParserListener ) ((ANTLRv4ParserListener)listener).enterRuleSpec(this);
+		}
+		@Override
+		public void exitRule(ParseTreeListener listener) {
+			if ( listener instanceof ANTLRv4ParserListener ) ((ANTLRv4ParserListener)listener).exitRuleSpec(this);
+		}
+	}
+
+	public final RuleSpecContext ruleSpec() throws RecognitionException {
+		RuleSpecContext _localctx = new RuleSpecContext(_ctx, getState());
+		enterRule(_localctx, 36, RULE_ruleSpec);
+		try {
+			setState(280);
+			_errHandler.sync(this);
+			switch ( getInterpreter().adaptivePredict(_input,19,_ctx) ) {
+			case 1:
+				enterOuterAlt(_localctx, 1);
+				{
+				setState(278);
+				parserRuleSpec();
+				}
+				break;
+			case 2:
+				enterOuterAlt(_localctx, 2);
+				{
+				setState(279);
+				lexerRuleSpec();
+				}
+				break;
+			}
+		}
+		catch (RecognitionException re) {
+			_localctx.exception = re;
+			_errHandler.reportError(this, re);
+			_errHandler.recover(this, re);
+		}
+		finally {
+			exitRule();
+		}
+		return _localctx;
+	}
+
+	public static class ParserRuleSpecContext extends ParserRuleContext {
+		public TerminalNode RULE_REF() { return getToken(ANTLRv4Parser.RULE_REF, 0); }
+		public TerminalNode COLON() { return getToken(ANTLRv4Parser.COLON, 0); }
+		public RuleBlockContext ruleBlock() {
+			return getRuleContext(RuleBlockContext.class,0);
+		}
+		public TerminalNode SEMI() { return getToken(ANTLRv4Parser.SEMI, 0); }
+		public ExceptionGroupContext exceptionGroup() {
+			return getRuleContext(ExceptionGroupContext.class,0);
+		}
+		public RuleModifiersContext ruleModifiers() {
+			return getRuleContext(RuleModifiersContext.class,0);
+		}
+		public ArgActionBlockContext argActionBlock() {
+			return getRuleContext(ArgActionBlockContext.class,0);
+		}
+		public RuleReturnsContext ruleReturns() {
+			return getRuleContext(RuleReturnsContext.class,0);
+		}
+		public ThrowsSpecContext throwsSpec() {
+			return getRuleContext(ThrowsSpecContext.class,0);
+		}
+		public LocalsSpecContext localsSpec() {
+			return getRuleContext(LocalsSpecContext.class,0);
+		}
+		public List<RulePrequelContext> rulePrequel() {
+			return getRuleContexts(RulePrequelContext.class);
+		}
+		public RulePrequelContext rulePrequel(int i) {
+			return getRuleContext(RulePrequelContext.class,i);
+		}
+		public ParserRuleSpecContext(ParserRuleContext parent, int invokingState) {
+			super(parent, invokingState);
+		}
+		@Override public int getRuleIndex() { return RULE_parserRuleSpec; }
+		@Override
+		public void enterRule(ParseTreeListener listener) {
+			if ( listener instanceof ANTLRv4ParserListener ) ((ANTLRv4ParserListener)listener).enterParserRuleSpec(this);
+		}
+		@Override
+		public void exitRule(ParseTreeListener listener) {
+			if ( listener instanceof ANTLRv4ParserListener ) ((ANTLRv4ParserListener)listener).exitParserRuleSpec(this);
+		}
+	}
+
+	public final ParserRuleSpecContext parserRuleSpec() throws RecognitionException {
+		ParserRuleSpecContext _localctx = new ParserRuleSpecContext(_ctx, getState());
+		enterRule(_localctx, 38, RULE_parserRuleSpec);
+		int _la;
+		try {
+			enterOuterAlt(_localctx, 1);
+			{
+			setState(283);
+			_errHandler.sync(this);
+			_la = _input.LA(1);
+			if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << FRAGMENT) | (1L << PROTECTED) | (1L << PUBLIC) | (1L << PRIVATE))) != 0)) {
+				{
+				setState(282);
+				ruleModifiers();
+				}
+			}
+
+			setState(285);
+			match(RULE_REF);
+			setState(287);
+			_errHandler.sync(this);
+			_la = _input.LA(1);
+			if (_la==BEGIN_ARGUMENT) {
+				{
+				setState(286);
+				argActionBlock();
+				}
+			}
+
+			setState(290);
+			_errHandler.sync(this);
+			_la = _input.LA(1);
+			if (_la==RETURNS) {
+				{
+				setState(289);
+				ruleReturns();
+				}
+			}
+
+			setState(293);
+			_errHandler.sync(this);
+			_la = _input.LA(1);
+			if (_la==THROWS) {
+				{
+				setState(292);
+				throwsSpec();
+				}
+			}
+
+			setState(296);
+			_errHandler.sync(this);
+			_la = _input.LA(1);
+			if (_la==LOCALS) {
+				{
+				setState(295);
+				localsSpec();
+				}
+			}
+
+			setState(301);
+			_errHandler.sync(this);
+			_la = _input.LA(1);
+			while (_la==OPTIONS || _la==AT) {
+				{
+				{
+				setState(298);
+				rulePrequel();
+				}
+				}
+				setState(303);
+				_errHandler.sync(this);
+				_la = _input.LA(1);
+			}
+			setState(304);
+			match(COLON);
+			setState(305);
+			ruleBlock();
+			setState(306);
+			match(SEMI);
+			setState(307);
+			exceptionGroup();
+			}
+		}
+		catch (RecognitionException re) {
+			_localctx.exception = re;
+			_errHandler.reportError(this, re);
+			_errHandler.recover(this, re);
+		}
+		finally {
+			exitRule();
+		}
+		return _localctx;
+	}
+
+	public static class ExceptionGroupContext extends ParserRuleContext {
+		public List<ExceptionHandlerContext> exceptionHandler() {
+			return getRuleContexts(ExceptionHandlerContext.class);
+		}
+		public ExceptionHandlerContext exceptionHandler(int i) {
+			return getRuleContext(ExceptionHandlerContext.class,i);
+		}
+		public FinallyClauseContext finallyClause() {
+			return getRuleContext(FinallyClauseContext.class,0);
+		}
+		public ExceptionGroupContext(ParserRuleContext parent, int invokingState) {
+			super(parent, invokingState);
+		}
+		@Override public int getRuleIndex() { return RULE_exceptionGroup; }
+		@Override
+		public void enterRule(ParseTreeListener listener) {
+			if ( listener instanceof ANTLRv4ParserListener ) ((ANTLRv4ParserListener)listener).enterExceptionGroup(this);
+		}
+		@Override
+		public void exitRule(ParseTreeListener listener) {
+			if ( listener instanceof ANTLRv4ParserListener ) ((ANTLRv4ParserListener)listener).exitExceptionGroup(this);
+		}
+	}
+
+	public final ExceptionGroupContext exceptionGroup() throws RecognitionException {
+		ExceptionGroupContext _localctx = new ExceptionGroupContext(_ctx, getState());
+		enterRule(_localctx, 40, RULE_exceptionGroup);
+		int _la;
+		try {
+			enterOuterAlt(_localctx, 1);
+			{
+			setState(312);
+			_errHandler.sync(this);
+			_la = _input.LA(1);
+			while (_la==CATCH) {
+				{
+				{
+				setState(309);
+				exceptionHandler();
+				}
+				}
+				setState(314);
+				_errHandler.sync(this);
+				_la = _input.LA(1);
+			}
+			setState(316);
+			_errHandler.sync(this);
+			_la = _input.LA(1);
+			if (_la==FINALLY) {
+				{
+				setState(315);
+				finallyClause();
+				}
+			}
+
+			}
+		}
+		catch (RecognitionException re) {
+			_localctx.exception = re;
+			_errHandler.reportError(this, re);
+			_errHandler.recover(this, re);
+		}
+		finally {
+			exitRule();
+		}
+		return _localctx;
+	}
+
+	public static class ExceptionHandlerContext extends ParserRuleContext {
+		public TerminalNode CATCH() { return getToken(ANTLRv4Parser.CATCH, 0); }
+		public ArgActionBlockContext argActionBlock() {
+			return getRuleContext(ArgActionBlockContext.class,0);
+		}
+		public ActionBlockContext actionBlock() {
+			return getRuleContext(ActionBlockContext.class,0);
+		}
+		public ExceptionHandlerContext(ParserRuleContext parent, int invokingState) {
+			super(parent, invokingState);
+		}
+		@Override public int getRuleIndex() { return RULE_exceptionHandler; }
+		@Override
+		public void enterRule(ParseTreeListener listener) {
+			if ( listener instanceof ANTLRv4ParserListener ) ((ANTLRv4ParserListener)listener).enterExceptionHandler(this);
+		}
+		@Override
+		public void exitRule(ParseTreeListener listener) {
+			if ( listener instanceof ANTLRv4ParserListener ) ((ANTLRv4ParserListener)listener).exitExceptionHandler(this);
+		}
+	}
+
+	public final ExceptionHandlerContext exceptionHandler() throws RecognitionException {
+		ExceptionHandlerContext _localctx = new ExceptionHandlerContext(_ctx, getState());
+		enterRule(_localctx, 42, RULE_exceptionHandler);
+		try {
+			enterOuterAlt(_localctx, 1);
+			{
+			setState(318);
+			match(CATCH);
+			setState(319);
+			argActionBlock();
+			setState(320);
+			actionBlock();
+			}
+		}
+		catch (RecognitionException re) {
+			_localctx.exception = re;
+			_errHandler.reportError(this, re);
+			_errHandler.recover(this, re);
+		}
+		finally {
+			exitRule();
+		}
+		return _localctx;
+	}
+
+	public static class FinallyClauseContext extends ParserRuleContext {
+		public TerminalNode FINALLY() { return getToken(ANTLRv4Parser.FINALLY, 0); }
+		public ActionBlockContext actionBlock() {
+			return getRuleContext(ActionBlockContext.class,0);
+		}
+		public FinallyClauseContext(ParserRuleContext parent, int invokingState) {
+			super(parent, invokingState);
+		}
+		@Override public int getRuleIndex() { return RULE_finallyClause; }
+		@Override
+		public void enterRule(ParseTreeListener listener) {
+			if ( listener instanceof ANTLRv4ParserListener ) ((ANTLRv4ParserListener)listener).enterFinallyClause(this);
+		}
+		@Override
+		public void exitRule(ParseTreeListener listener) {
+			if ( listener instanceof ANTLRv4ParserListener ) ((ANTLRv4ParserListener)listener).exitFinallyClause(this);
+		}
+	}
+
+	public final FinallyClauseContext finallyClause() throws RecognitionException {
+		FinallyClauseContext _localctx = new FinallyClauseContext(_ctx, getState());
+		enterRule(_localctx, 44, RULE_finallyClause);
+		try {
+			enterOuterAlt(_localctx, 1);
+			{
+			setState(322);
+			match(FINALLY);
+			setState(323);
+			actionBlock();
+			}
+		}
+		catch (RecognitionException re) {
+			_localctx.exception = re;
+			_errHandler.reportError(this, re);
+			_errHandler.recover(this, re);
+		}
+		finally {
+			exitRule();
+		}
+		return _localctx;
+	}
+
+	public static class RulePrequelContext extends ParserRuleContext {
+		public OptionsSpecContext optionsSpec() {
+			return getRuleContext(OptionsSpecContext.class,0);
+		}
+		public RuleActionContext ruleAction() {
+			return getRuleContext(RuleActionContext.class,0);
+		}
+		public RulePrequelContext(ParserRuleContext parent, int invokingState) {
+			super(parent, invokingState);
+		}
+		@Override public int getRuleIndex() { return RULE_rulePrequel; }
+		@Override
+		public void enterRule(ParseTreeListener listener) {
+			if ( listener instanceof ANTLRv4ParserListener ) ((ANTLRv4ParserListener)listener).enterRulePrequel(this);
+		}
+		@Override
+		public void exitRule(ParseTreeListener listener) {
+			if ( listener instanceof ANTLRv4ParserListener ) ((ANTLRv4ParserListener)listener).exitRulePrequel(this);
+		}
+	}
+
+	public final RulePrequelContext rulePrequel() throws RecognitionException {
+		RulePrequelContext _localctx = new RulePrequelContext(_ctx, getState());
+		enterRule(_localctx, 46, RULE_rulePrequel);
+		try {
+			setState(327);
+			_errHandler.sync(this);
+			switch (_input.LA(1)) {
+			case OPTIONS:
+				enterOuterAlt(_localctx, 1);
+				{
+				setState(325);
+				optionsSpec();
+				}
+				break;
+			case AT:
+				enterOuterAlt(_localctx, 2);
+				{
+				setState(326);
+				ruleAction();
+				}
+				break;
+			default:
+				throw new NoViableAltException(this);
+			}
+		}
+		catch (RecognitionException re) {
+			_localctx.exception = re;
+			_errHandler.reportError(this, re);
+			_errHandler.recover(this, re);
+		}
+		finally {
+			exitRule();
+		}
+		return _localctx;
+	}
+
+	public static class RuleReturnsContext extends ParserRuleContext {
+		public TerminalNode RETURNS() { return getToken(ANTLRv4Parser.RETURNS, 0); }
+		public ArgActionBlockContext argActionBlock() {
+			return getRuleContext(ArgActionBlockContext.class,0);
+		}
+		public RuleReturnsContext(ParserRuleContext parent, int invokingState) {
+			super(parent, invokingState);
+		}
+		@Override public int getRuleIndex() { return RULE_ruleReturns; }
+		@Override
+		public void enterRule(ParseTreeListener listener) {
+			if ( listener instanceof ANTLRv4ParserListener ) ((ANTLRv4ParserListener)listener).enterRuleReturns(this);
+		}
+		@Override
+		public void exitRule(ParseTreeListener listener) {
+			if ( listener instanceof ANTLRv4ParserListener ) ((ANTLRv4ParserListener)listener).exitRuleReturns(this);
+		}
+	}
+
+	public final RuleReturnsContext ruleReturns() throws RecognitionException {
+		RuleReturnsContext _localctx = new RuleReturnsContext(_ctx, getState());
+		enterRule(_localctx, 48, RULE_ruleReturns);
+		try {
+			enterOuterAlt(_localctx, 1);
+			{
+			setState(329);
+			match(RETURNS);
+			setState(330);
+			argActionBlock();
+			}
+		}
+		catch (RecognitionException re) {
+			_localctx.exception = re;
+			_errHandler.reportError(this, re);
+			_errHandler.recover(this, re);
+		}
+		finally {
+			exitRule();
+		}
+		return _localctx;
+	}
+
+	public static class ThrowsSpecContext extends ParserRuleContext {
+		public TerminalNode THROWS() { return getToken(ANTLRv4Parser.THROWS, 0); }
+		public List<IdentifierContext> identifier() {
+			return getRuleContexts(IdentifierContext.class);
+		}
+		public IdentifierContext identifier(int i) {
+			return getRuleContext(IdentifierContext.class,i);
+		}
+		public List<TerminalNode> COMMA() { return getTokens(ANTLRv4Parser.COMMA); }
+		public TerminalNode COMMA(int i) {
+			return getToken(ANTLRv4Parser.COMMA, i);
+		}
+		public ThrowsSpecContext(ParserRuleContext parent, int invokingState) {
+			super(parent, invokingState);
+		}
+		@Override public int getRuleIndex() { return RULE_throwsSpec; }
+		@Override
+		public void enterRule(ParseTreeListener listener) {
+			if ( listener instanceof ANTLRv4ParserListener ) ((ANTLRv4ParserListener)listener).enterThrowsSpec(this);
+		}
+		@Override
+		public void exitRule(ParseTreeListener listener) {
+			if ( listener instanceof ANTLRv4ParserListener ) ((ANTLRv4ParserListener)listener).exitThrowsSpec(this);
+		}
+	}
+
+	public final ThrowsSpecContext throwsSpec() throws RecognitionException {
+		ThrowsSpecContext _localctx = new ThrowsSpecContext(_ctx, getState());
+		enterRule(_localctx, 50, RULE_throwsSpec);
+		int _la;
+		try {
+			enterOuterAlt(_localctx, 1);
+			{
+			setState(332);
+			match(THROWS);
+			setState(333);
+			identifier();
+			setState(338);
+			_errHandler.sync(this);
+			_la = _input.LA(1);
+			while (_la==COMMA) {
+				{
+				{
+				setState(334);
+				match(COMMA);
+				setState(335);
+				identifier();
+				}
+				}
+				setState(340);
+				_errHandler.sync(this);
+				_la = _input.LA(1);
+			}
+			}
+		}
+		catch (RecognitionException re) {
+			_localctx.exception = re;
+			_errHandler.reportError(this, re);
+			_errHandler.recover(this, re);
+		}
+		finally {
+			exitRule();
+		}
+		return _localctx;
+	}
+
+	public static class LocalsSpecContext extends ParserRuleContext {
+		public TerminalNode LOCALS() { return getToken(ANTLRv4Parser.LOCALS, 0); }
+		public ArgActionBlockContext argActionBlock() {
+			return getRuleContext(ArgActionBlockContext.class,0);
+		}
+		public LocalsSpecContext(ParserRuleContext parent, int invokingState) {
+			super(parent, invokingState);
+		}
+		@Override public int getRuleIndex() { return RULE_localsSpec; }
+		@Override
+		public void enterRule(ParseTreeListener listener) {
+			if ( listener instanceof ANTLRv4ParserListener ) ((ANTLRv4ParserListener)listener).enterLocalsSpec(this);
+		}
+		@Override
+		public void exitRule(ParseTreeListener listener) {
+			if ( listener instanceof ANTLRv4ParserListener ) ((ANTLRv4ParserListener)listener).exitLocalsSpec(this);
+		}
+	}
+
+	public final LocalsSpecContext localsSpec() throws RecognitionException {
+		LocalsSpecContext _localctx = new LocalsSpecContext(_ctx, getState());
+		enterRule(_localctx, 52, RULE_localsSpec);
+		try {
+			enterOuterAlt(_localctx, 1);
+			{
+			setState(341);
+			match(LOCALS);
+			setState(342);
+			argActionBlock();
+			}
+		}
+		catch (RecognitionException re) {
+			_localctx.exception = re;
+			_errHandler.reportError(this, re);
+			_errHandler.recover(this, re);
+		}
+		finally {
+			exitRule();
+		}
+		return _localctx;
+	}
+
+	public static class RuleActionContext extends ParserRuleContext {
+		public TerminalNode AT() { return getToken(ANTLRv4Parser.AT, 0); }
+		public IdentifierContext identifier() {
+			return getRuleContext(IdentifierContext.class,0);
+		}
+		public ActionBlockContext actionBlock() {
+			return getRuleContext(ActionBlockContext.class,0);
+		}
+		public RuleActionContext(ParserRuleContext parent, int invokingState) {
+			super(parent, invokingState);
+		}
+		@Override public int getRuleIndex() { return RULE_ruleAction; }
+		@Override
+		public void enterRule(ParseTreeListener listener) {
+			if ( listener instanceof ANTLRv4ParserListener ) ((ANTLRv4ParserListener)listener).enterRuleAction(this);
+		}
+		@Override
+		public void exitRule(ParseTreeListener listener) {
+			if ( listener instanceof ANTLRv4ParserListener ) ((ANTLRv4ParserListener)listener).exitRuleAction(this);
+		}
+	}
+
+	public final RuleActionContext ruleAction() throws RecognitionException {
+		RuleActionContext _localctx = new RuleActionContext(_ctx, getState());
+		enterRule(_localctx, 54, RULE_ruleAction);
+		try {
+			enterOuterAlt(_localctx, 1);
+			{
+			setState(344);
+			match(AT);
+			setState(345);
+			identifier();
+			setState(346);
+			actionBlock();
+			}
+		}
+		catch (RecognitionException re) {
+			_localctx.exception = re;
+			_errHandler.reportError(this, re);
+			_errHandler.recover(this, re);
+		}
+		finally {
+			exitRule();
+		}
+		return _localctx;
+	}
+
+	public static class RuleModifiersContext extends ParserRuleContext {
+		public List<RuleModifierContext> ruleModifier() {
+			return getRuleContexts(RuleModifierContext.class);
+		}
+		public RuleModifierContext ruleModifier(int i) {
+			return getRuleContext(RuleModifierContext.class,i);
+		}
+		public RuleModifiersContext(ParserRuleContext parent, int invokingState) {
+			super(parent, invokingState);
+		}
+		@Override public int getRuleIndex() { return RULE_ruleModifiers; }
+		@Override
+		public void enterRule(ParseTreeListener listener) {
+			if ( listener instanceof ANTLRv4ParserListener ) ((ANTLRv4ParserListener)listener).enterRuleModifiers(this);
+		}
+		@Override
+		public void exitRule(ParseTreeListener listener) {
+			if ( listener instanceof ANTLRv4ParserListener ) ((ANTLRv4ParserListener)listener).exitRuleModifiers(this);
+		}
+	}
+
+	public final RuleModifiersContext ruleModifiers() throws RecognitionException {
+		RuleModifiersContext _localctx = new RuleModifiersContext(_ctx, getState());
+		enterRule(_localctx, 56, RULE_ruleModifiers);
+		int _la;
+		try {
+			enterOuterAlt(_localctx, 1);
+			{
+			setState(349); 
+			_errHandler.sync(this);
+			_la = _input.LA(1);
+			do {
+				{
+				{
+				setState(348);
+				ruleModifier();
+				}
+				}
+				setState(351); 
+				_errHandler.sync(this);
+				_la = _input.LA(1);
+			} while ( (((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << FRAGMENT) | (1L << PROTECTED) | (1L << PUBLIC) | (1L << PRIVATE))) != 0) );
+			}
+		}
+		catch (RecognitionException re) {
+			_localctx.exception = re;
+			_errHandler.reportError(this, re);
+			_errHandler.recover(this, re);
+		}
+		finally {
+			exitRule();
+		}
+		return _localctx;
+	}
+
+	public static class RuleModifierContext extends ParserRuleContext {
+		public TerminalNode PUBLIC() { return getToken(ANTLRv4Parser.PUBLIC, 0); }
+		public TerminalNode PRIVATE() { return getToken(ANTLRv4Parser.PRIVATE, 0); }
+		public TerminalNode PROTECTED() { return getToken(ANTLRv4Parser.PROTECTED, 0); }
+		public TerminalNode FRAGMENT() { return getToken(ANTLRv4Parser.FRAGMENT, 0); }
+		public RuleModifierContext(ParserRuleContext parent, int invokingState) {
+			super(parent, invokingState);
+		}
+		@Override public int getRuleIndex() { return RULE_ruleModifier; }
+		@Override
+		public void enterRule(ParseTreeListener listener) {
+			if ( listener instanceof ANTLRv4ParserListener ) ((ANTLRv4ParserListener)listener).enterRuleModifier(this);
+		}
+		@Override
+		public void exitRule(ParseTreeListener listener) {
+			if ( listener instanceof ANTLRv4ParserListener ) ((ANTLRv4ParserListener)listener).exitRuleModifier(this);
+		}
+	}
+
+	public final RuleModifierContext ruleModifier() throws RecognitionException {
+		RuleModifierContext _localctx = new RuleModifierContext(_ctx, getState());
+		enterRule(_localctx, 58, RULE_ruleModifier);
+		int _la;
+		try {
+			enterOuterAlt(_localctx, 1);
+			{
+			setState(353);
+			_la = _input.LA(1);
+			if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << FRAGMENT) | (1L << PROTECTED) | (1L << PUBLIC) | (1L << PRIVATE))) != 0)) ) {
+			_errHandler.recoverInline(this);
+			}
+			else {
+				if ( _input.LA(1)==Token.EOF ) matchedEOF = true;
+				_errHandler.reportMatch(this);
+				consume();
+			}
+			}
+		}
+		catch (RecognitionException re) {
+			_localctx.exception = re;
+			_errHandler.reportError(this, re);
+			_errHandler.recover(this, re);
+		}
+		finally {
+			exitRule();
+		}
+		return _localctx;
+	}
+
+	public static class RuleBlockContext extends ParserRuleContext {
+		public RuleAltListContext ruleAltList() {
+			return getRuleContext(RuleAltListContext.class,0);
+		}
+		public RuleBlockContext(ParserRuleContext parent, int invokingState) {
+			super(parent, invokingState);
+		}
+		@Override public int getRuleIndex() { return RULE_ruleBlock; }
+		@Override
+		public void enterRule(ParseTreeListener listener) {
+			if ( listener instanceof ANTLRv4ParserListener ) ((ANTLRv4ParserListener)listener).enterRuleBlock(this);
+		}
+		@Override
+		public void exitRule(ParseTreeListener listener) {
+			if ( listener instanceof ANTLRv4ParserListener ) ((ANTLRv4ParserListener)listener).exitRuleBlock(this);
+		}
+	}
+
+	public final RuleBlockContext ruleBlock() throws RecognitionException {
+		RuleBlockContext _localctx = new RuleBlockContext(_ctx, getState());
+		enterRule(_localctx, 60, RULE_ruleBlock);
+		try {
+			enterOuterAlt(_localctx, 1);
+			{
+			setState(355);
+			ruleAltList();
+			}
+		}
+		catch (RecognitionException re) {
+			_localctx.exception = re;
+			_errHandler.reportError(this, re);
+			_errHandler.recover(this, re);
+		}
+		finally {
+			exitRule();
+		}
+		return _localctx;
+	}
+
+	public static class RuleAltListContext extends ParserRuleContext {
+		public List<LabeledAltContext> labeledAlt() {
+			return getRuleContexts(LabeledAltContext.class);
+		}
+		public LabeledAltContext labeledAlt(int i) {
+			return getRuleContext(LabeledAltContext.class,i);
+		}
+		public List<TerminalNode> OR() { return getTokens(ANTLRv4Parser.OR); }
+		public TerminalNode OR(int i) {
+			return getToken(ANTLRv4Parser.OR, i);
+		}
+		public RuleAltListContext(ParserRuleContext parent, int invokingState) {
+			super(parent, invokingState);
+		}
+		@Override public int getRuleIndex() { return RULE_ruleAltList; }
+		@Override
+		public void enterRule(ParseTreeListener listener) {
+			if ( listener instanceof ANTLRv4ParserListener ) ((ANTLRv4ParserListener)listener).enterRuleAltList(this);
+		}
+		@Override
+		public void exitRule(ParseTreeListener listener) {
+			if ( listener instanceof ANTLRv4ParserListener ) ((ANTLRv4ParserListener)listener).exitRuleAltList(this);
+		}
+	}
+
+	public final RuleAltListContext ruleAltList() throws RecognitionException {
+		RuleAltListContext _localctx = new RuleAltListContext(_ctx, getState());
+		enterRule(_localctx, 62, RULE_ruleAltList);
+		int _la;
+		try {
+			enterOuterAlt(_localctx, 1);
+			{
+			setState(357);
+			labeledAlt();
+			setState(362);
+			_errHandler.sync(this);
+			_la = _input.LA(1);
+			while (_la==OR) {
+				{
+				{
+				setState(358);
+				match(OR);
+				setState(359);
+				labeledAlt();
+				}
+				}
+				setState(364);
+				_errHandler.sync(this);
+				_la = _input.LA(1);
+			}
+			}
+		}
+		catch (RecognitionException re) {
+			_localctx.exception = re;
+			_errHandler.reportError(this, re);
+			_errHandler.recover(this, re);
+		}
+		finally {
+			exitRule();
+		}
+		return _localctx;
+	}
+
+	public static class LabeledAltContext extends ParserRuleContext {
+		public AlternativeContext alternative() {
+			return getRuleContext(AlternativeContext.class,0);
+		}
+		public TerminalNode POUND() { return getToken(ANTLRv4Parser.POUND, 0); }
+		public IdentifierContext identifier() {
+			return getRuleContext(IdentifierContext.class,0);
+		}
+		public LabeledAltContext(ParserRuleContext parent, int invokingState) {
+			super(parent, invokingState);
+		}
+		@Override public int getRuleIndex() { return RULE_labeledAlt; }
+		@Override
+		public void enterRule(ParseTreeListener listener) {
+			if ( listener instanceof ANTLRv4ParserListener ) ((ANTLRv4ParserListener)listener).enterLabeledAlt(this);
+		}
+		@Override
+		public void exitRule(ParseTreeListener listener) {
+			if ( listener instanceof ANTLRv4ParserListener ) ((ANTLRv4ParserListener)listener).exitLabeledAlt(this);
+		}
+	}
+
+	public final LabeledAltContext labeledAlt() throws RecognitionException {
+		LabeledAltContext _localctx = new LabeledAltContext(_ctx, getState());
+		enterRule(_localctx, 64, RULE_labeledAlt);
+		int _la;
+		try {
+			enterOuterAlt(_localctx, 1);
+			{
+			setState(365);
+			alternative();
+			setState(368);
+			_errHandler.sync(this);
+			_la = _input.LA(1);
+			if (_la==POUND) {
+				{
+				setState(366);
+				match(POUND);
+				setState(367);
+				identifier();
+				}
+			}
+
+			}
+		}
+		catch (RecognitionException re) {
+			_localctx.exception = re;
+			_errHandler.reportError(this, re);
+			_errHandler.recover(this, re);
+		}
+		finally {
+			exitRule();
+		}
+		return _localctx;
+	}
+
+	public static class LexerRuleSpecContext extends ParserRuleContext {
+		public TerminalNode TOKEN_REF() { return getToken(ANTLRv4Parser.TOKEN_REF, 0); }
+		public TerminalNode COLON() { return getToken(ANTLRv4Parser.COLON, 0); }
+		public LexerRuleBlockContext lexerRuleBlock() {
+			return getRuleContext(LexerRuleBlockContext.class,0);
+		}
+		public TerminalNode SEMI() { return getToken(ANTLRv4Parser.SEMI, 0); }
+		public TerminalNode FRAGMENT() { return getToken(ANTLRv4Parser.FRAGMENT, 0); }
+		public OptionsSpecContext optionsSpec() {
+			return getRuleContext(OptionsSpecContext.class,0);
+		}
+		public LexerRuleSpecContext(ParserRuleContext parent, int invokingState) {
+			super(parent, invokingState);
+		}
+		@Override public int getRuleIndex() { return RULE_lexerRuleSpec; }
+		@Override
+		public void enterRule(ParseTreeListener listener) {
+			if ( listener instanceof ANTLRv4ParserListener ) ((ANTLRv4ParserListener)listener).enterLexerRuleSpec(this);
+		}
+		@Override
+		public void exitRule(ParseTreeListener listener) {
+			if ( listener instanceof ANTLRv4ParserListener ) ((ANTLRv4ParserListener)listener).exitLexerRuleSpec(this);
+		}
+	}
+
+	public final LexerRuleSpecContext lexerRuleSpec() throws RecognitionException {
+		LexerRuleSpecContext _localctx = new LexerRuleSpecContext(_ctx, getState());
+		enterRule(_localctx, 66, RULE_lexerRuleSpec);
+		int _la;
+		try {
+			enterOuterAlt(_localctx, 1);
+			{
+			setState(371);
+			_errHandler.sync(this);
+			_la = _input.LA(1);
+			if (_la==FRAGMENT) {
+				{
+				setState(370);
+				match(FRAGMENT);
+				}
+			}
+
+			setState(373);
+			match(TOKEN_REF);
+			setState(375);
+			_errHandler.sync(this);
+			_la = _input.LA(1);
+			if (_la==OPTIONS) {
+				{
+				setState(374);
+				optionsSpec();
+				}
+			}
+
+			setState(377);
+			match(COLON);
+			setState(378);
+			lexerRuleBlock();
+			setState(379);
+			match(SEMI);
+			}
+		}
+		catch (RecognitionException re) {
+			_localctx.exception = re;
+			_errHandler.reportError(this, re);
+			_errHandler.recover(this, re);
+		}
+		finally {
+			exitRule();
+		}
+		return _localctx;
+	}
+
+	public static class LexerRuleBlockContext extends ParserRuleContext {
+		public LexerAltListContext lexerAltList() {
+			return getRuleContext(LexerAltListContext.class,0);
+		}
+		public LexerRuleBlockContext(ParserRuleContext parent, int invokingState) {
+			super(parent, invokingState);
+		}
+		@Override public int getRuleIndex() { return RULE_lexerRuleBlock; }
+		@Override
+		public void enterRule(ParseTreeListener listener) {
+			if ( listener instanceof ANTLRv4ParserListener ) ((ANTLRv4ParserListener)listener).enterLexerRuleBlock(this);
+		}
+		@Override
+		public void exitRule(ParseTreeListener listener) {
+			if ( listener instanceof ANTLRv4ParserListener ) ((ANTLRv4ParserListener)listener).exitLexerRuleBlock(this);
+		}
+	}
+
+	public final LexerRuleBlockContext lexerRuleBlock() throws RecognitionException {
+		LexerRuleBlockContext _localctx = new LexerRuleBlockContext(_ctx, getState());
+		enterRule(_localctx, 68, RULE_lexerRuleBlock);
+		try {
+			enterOuterAlt(_localctx, 1);
+			{
+			setState(381);
+			lexerAltList();
+			}
+		}
+		catch (RecognitionException re) {
+			_localctx.exception = re;
+			_errHandler.reportError(this, re);
+			_errHandler.recover(this, re);
+		}
+		finally {
+			exitRule();
+		}
+		return _localctx;
+	}
+
+	public static class LexerAltListContext extends ParserRuleContext {
+		public List<LexerAltContext> lexerAlt() {
+			return getRuleContexts(LexerAltContext.class);
+		}
+		public LexerAltContext lexerAlt(int i) {
+			return getRuleContext(LexerAltContext.class,i);
+		}
+		public List<TerminalNode> OR() { return getTokens(ANTLRv4Parser.OR); }
+		public TerminalNode OR(int i) {
+			return getToken(ANTLRv4Parser.OR, i);
+		}
+		public LexerAltListContext(ParserRuleContext parent, int invokingState) {
+			super(parent, invokingState);
+		}
+		@Override public int getRuleIndex() { return RULE_lexerAltList; }
+		@Override
+		public void enterRule(ParseTreeListener listener) {
+			if ( listener instanceof ANTLRv4ParserListener ) ((ANTLRv4ParserListener)listener).enterLexerAltList(this);
+		}
+		@Override
+		public void exitRule(ParseTreeListener listener) {
+			if ( listener instanceof ANTLRv4ParserListener ) ((ANTLRv4ParserListener)listener).exitLexerAltList(this);
+		}
+	}
+
+	public final LexerAltListContext lexerAltList() throws RecognitionException {
+		LexerAltListContext _localctx = new LexerAltListContext(_ctx, getState());
+		enterRule(_localctx, 70, RULE_lexerAltList);
+		int _la;
+		try {
+			enterOuterAlt(_localctx, 1);
+			{
+			setState(383);
+			lexerAlt();
+			setState(388);
+			_errHandler.sync(this);
+			_la = _input.LA(1);
+			while (_la==OR) {
+				{
+				{
+				setState(384);
+				match(OR);
+				setState(385);
+				lexerAlt();
+				}
+				}
+				setState(390);
+				_errHandler.sync(this);
+				_la = _input.LA(1);
+			}
+			}
+		}
+		catch (RecognitionException re) {
+			_localctx.exception = re;
+			_errHandler.reportError(this, re);
+			_errHandler.recover(this, re);
+		}
+		finally {
+			exitRule();
+		}
+		return _localctx;
+	}
+
+	public static class LexerAltContext extends ParserRuleContext {
+		public LexerElementsContext lexerElements() {
+			return getRuleContext(LexerElementsContext.class,0);
+		}
+		public LexerCommandsContext lexerCommands() {
+			return getRuleContext(LexerCommandsContext.class,0);
+		}
+		public LexerAltContext(ParserRuleContext parent, int invokingState) {
+			super(parent, invokingState);
+		}
+		@Override public int getRuleIndex() { return RULE_lexerAlt; }
+		@Override
+		public void enterRule(ParseTreeListener listener) {
+			if ( listener instanceof ANTLRv4ParserListener ) ((ANTLRv4ParserListener)listener).enterLexerAlt(this);
+		}
+		@Override
+		public void exitRule(ParseTreeListener listener) {
+			if ( listener instanceof ANTLRv4ParserListener ) ((ANTLRv4ParserListener)listener).exitLexerAlt(this);
+		}
+	}
+
+	public final LexerAltContext lexerAlt() throws RecognitionException {
+		LexerAltContext _localctx = new LexerAltContext(_ctx, getState());
+		enterRule(_localctx, 72, RULE_lexerAlt);
+		int _la;
+		try {
+			setState(396);
+			_errHandler.sync(this);
+			switch ( getInterpreter().adaptivePredict(_input,37,_ctx) ) {
+			case 1:
+				enterOuterAlt(_localctx, 1);
+				{
+				setState(391);
+				lexerElements();
+				setState(393);
+				_errHandler.sync(this);
+				_la = _input.LA(1);
+				if (_la==RARROW) {
+					{
+					setState(392);
+					lexerCommands();
+					}
+				}
+
+				}
+				break;
+			case 2:
+				enterOuterAlt(_localctx, 2);
+				{
+				}
+				break;
+			}
+		}
+		catch (RecognitionException re) {
+			_localctx.exception = re;
+			_errHandler.reportError(this, re);
+			_errHandler.recover(this, re);
+		}
+		finally {
+			exitRule();
+		}
+		return _localctx;
+	}
+
+	public static class LexerElementsContext extends ParserRuleContext {
+		public List<LexerElementContext> lexerElement() {
+			return getRuleContexts(LexerElementContext.class);
+		}
+		public LexerElementContext lexerElement(int i) {
+			return getRuleContext(LexerElementContext.class,i);
+		}
+		public LexerElementsContext(ParserRuleContext parent, int invokingState) {
+			super(parent, invokingState);
+		}
+		@Override public int getRuleIndex() { return RULE_lexerElements; }
+		@Override
+		public void enterRule(ParseTreeListener listener) {
+			if ( listener instanceof ANTLRv4ParserListener ) ((ANTLRv4ParserListener)listener).enterLexerElements(this);
+		}
+		@Override
+		public void exitRule(ParseTreeListener listener) {
+			if ( listener instanceof ANTLRv4ParserListener ) ((ANTLRv4ParserListener)listener).exitLexerElements(this);
+		}
+	}
+
+	public final LexerElementsContext lexerElements() throws RecognitionException {
+		LexerElementsContext _localctx = new LexerElementsContext(_ctx, getState());
+		enterRule(_localctx, 74, RULE_lexerElements);
+		int _la;
+		try {
+			setState(404);
+			_errHandler.sync(this);
+			switch (_input.LA(1)) {
+			case TOKEN_REF:
+			case RULE_REF:
+			case LEXER_CHAR_SET:
+			case STRING_LITERAL:
+			case BEGIN_ACTION:
+			case LPAREN:
+			case DOT:
+			case NOT:
+				enterOuterAlt(_localctx, 1);
+				{
+				setState(399); 
+				_errHandler.sync(this);
+				_la = _input.LA(1);
+				do {
+					{
+					{
+					setState(398);
+					lexerElement();
+					}
+					}
+					setState(401); 
+					_errHandler.sync(this);
+					_la = _input.LA(1);
+				} while ( (((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << TOKEN_REF) | (1L << RULE_REF) | (1L << LEXER_CHAR_SET) | (1L << STRING_LITERAL) | (1L << BEGIN_ACTION) | (1L << LPAREN) | (1L << DOT) | (1L << NOT))) != 0) );
+				}
+				break;
+			case SEMI:
+			case RPAREN:
+			case RARROW:
+			case OR:
+				enterOuterAlt(_localctx, 2);
+				{
+				}
+				break;
+			default:
+				throw new NoViableAltException(this);
+			}
+		}
+		catch (RecognitionException re) {
+			_localctx.exception = re;
+			_errHandler.reportError(this, re);
+			_errHandler.recover(this, re);
+		}
+		finally {
+			exitRule();
+		}
+		return _localctx;
+	}
+
+	public static class LexerElementContext extends ParserRuleContext {
+		public LabeledLexerElementContext labeledLexerElement() {
+			return getRuleContext(LabeledLexerElementContext.class,0);
+		}
+		public EbnfSuffixContext ebnfSuffix() {
+			return getRuleContext(EbnfSuffixContext.class,0);
+		}
+		public LexerAtomContext lexerAtom() {
+			return getRuleContext(LexerAtomContext.class,0);
+		}
+		public LexerBlockContext lexerBlock() {
+			return getRuleContext(LexerBlockContext.class,0);
+		}
+		public ActionBlockContext actionBlock() {
+			return getRuleContext(ActionBlockContext.class,0);
+		}
+		public TerminalNode QUESTION() { return getToken(ANTLRv4Parser.QUESTION, 0); }
+		public LexerElementContext(ParserRuleContext parent, int invokingState) {
+			super(parent, invokingState);
+		}
+		@Override public int getRuleIndex() { return RULE_lexerElement; }
+		@Override
+		public void enterRule(ParseTreeListener listener) {
+			if ( listener instanceof ANTLRv4ParserListener ) ((ANTLRv4ParserListener)listener).enterLexerElement(this);
+		}
+		@Override
+		public void exitRule(ParseTreeListener listener) {
+			if ( listener instanceof ANTLRv4ParserListener ) ((ANTLRv4ParserListener)listener).exitLexerElement(this);
+		}
+	}
+
+	public final LexerElementContext lexerElement() throws RecognitionException {
+		LexerElementContext _localctx = new LexerElementContext(_ctx, getState());
+		enterRule(_localctx, 76, RULE_lexerElement);
+		int _la;
+		try {
+			setState(422);
+			_errHandler.sync(this);
+			switch ( getInterpreter().adaptivePredict(_input,44,_ctx) ) {
+			case 1:
+				enterOuterAlt(_localctx, 1);
+				{
+				setState(406);
+				labeledLexerElement();
+				setState(408);
+				_errHandler.sync(this);
+				_la = _input.LA(1);
+				if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << QUESTION) | (1L << STAR) | (1L << PLUS))) != 0)) {
+					{
+					setState(407);
+					ebnfSuffix();
+					}
+				}
+
+				}
+				break;
+			case 2:
+				enterOuterAlt(_localctx, 2);
+				{
+				setState(410);
+				lexerAtom();
+				setState(412);
+				_errHandler.sync(this);
+				_la = _input.LA(1);
+				if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << QUESTION) | (1L << STAR) | (1L << PLUS))) != 0)) {
+					{
+					setState(411);
+					ebnfSuffix();
+					}
+				}
+
+				}
+				break;
+			case 3:
+				enterOuterAlt(_localctx, 3);
+				{
+				setState(414);
+				lexerBlock();
+				setState(416);
+				_errHandler.sync(this);
+				_la = _input.LA(1);
+				if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << QUESTION) | (1L << STAR) | (1L << PLUS))) != 0)) {
+					{
+					setState(415);
+					ebnfSuffix();
+					}
+				}
+
+				}
+				break;
+			case 4:
+				enterOuterAlt(_localctx, 4);
+				{
+				setState(418);
+				actionBlock();
+				setState(420);
+				_errHandler.sync(this);
+				_la = _input.LA(1);
+				if (_la==QUESTION) {
+					{
+					setState(419);
+					match(QUESTION);
+					}
+				}
+
+				}
+				break;
+			}
+		}
+		catch (RecognitionException re) {
+			_localctx.exception = re;
+			_errHandler.reportError(this, re);
+			_errHandler.recover(this, re);
+		}
+		finally {
+			exitRule();
+		}
+		return _localctx;
+	}
+
+	public static class LabeledLexerElementContext extends ParserRuleContext {
+		public IdentifierContext identifier() {
+			return getRuleContext(IdentifierContext.class,0);
+		}
+		public TerminalNode ASSIGN() { return getToken(ANTLRv4Parser.ASSIGN, 0); }
+		public TerminalNode PLUS_ASSIGN() { return getToken(ANTLRv4Parser.PLUS_ASSIGN, 0); }
+		public LexerAtomContext lexerAtom() {
+			return getRuleContext(LexerAtomContext.class,0);
+		}
+		public LexerBlockContext lexerBlock() {
+			return getRuleContext(LexerBlockContext.class,0);
+		}
+		public LabeledLexerElementContext(ParserRuleContext parent, int invokingState) {
+			super(parent, invokingState);
+		}
+		@Override public int getRuleIndex() { return RULE_labeledLexerElement; }
+		@Override
+		public void enterRule(ParseTreeListener listener) {
+			if ( listener instanceof ANTLRv4ParserListener ) ((ANTLRv4ParserListener)listener).enterLabeledLexerElement(this);
+		}
+		@Override
+		public void exitRule(ParseTreeListener listener) {
+			if ( listener instanceof ANTLRv4ParserListener ) ((ANTLRv4ParserListener)listener).exitLabeledLexerElement(this);
+		}
+	}
+
+	public final LabeledLexerElementContext labeledLexerElement() throws RecognitionException {
+		LabeledLexerElementContext _localctx = new LabeledLexerElementContext(_ctx, getState());
+		enterRule(_localctx, 78, RULE_labeledLexerElement);
+		int _la;
+		try {
+			enterOuterAlt(_localctx, 1);
+			{
+			setState(424);
+			identifier();
+			setState(425);
+			_la = _input.LA(1);
+			if ( !(_la==ASSIGN || _la==PLUS_ASSIGN) ) {
+			_errHandler.recoverInline(this);
+			}
+			else {
+				if ( _input.LA(1)==Token.EOF ) matchedEOF = true;
+				_errHandler.reportMatch(this);
+				consume();
+			}
+			setState(428);
+			_errHandler.sync(this);
+			switch (_input.LA(1)) {
+			case TOKEN_REF:
+			case LEXER_CHAR_SET:
+			case STRING_LITERAL:
+			case DOT:
+			case NOT:
+				{
+				setState(426);
+				lexerAtom();
+				}
+				break;
+			case LPAREN:
+				{
+				setState(427);
+				lexerBlock();
+				}
+				break;
+			default:
+				throw new NoViableAltException(this);
+			}
+			}
+		}
+		catch (RecognitionException re) {
+			_localctx.exception = re;
+			_errHandler.reportError(this, re);
+			_errHandler.recover(this, re);
+		}
+		finally {
+			exitRule();
+		}
+		return _localctx;
+	}
+
+	public static class LexerBlockContext extends ParserRuleContext {
+		public TerminalNode LPAREN() { return getToken(ANTLRv4Parser.LPAREN, 0); }
+		public LexerAltListContext lexerAltList() {
+			return getRuleContext(LexerAltListContext.class,0);
+		}
+		public TerminalNode RPAREN() { return getToken(ANTLRv4Parser.RPAREN, 0); }
+		public LexerBlockContext(ParserRuleContext parent, int invokingState) {
+			super(parent, invokingState);
+		}
+		@Override public int getRuleIndex() { return RULE_lexerBlock; }
+		@Override
+		public void enterRule(ParseTreeListener listener) {
+			if ( listener instanceof ANTLRv4ParserListener ) ((ANTLRv4ParserListener)listener).enterLexerBlock(this);
+		}
+		@Override
+		public void exitRule(ParseTreeListener listener) {
+			if ( listener instanceof ANTLRv4ParserListener ) ((ANTLRv4ParserListener)listener).exitLexerBlock(this);
+		}
+	}
+
+	public final LexerBlockContext lexerBlock() throws RecognitionException {
+		LexerBlockContext _localctx = new LexerBlockContext(_ctx, getState());
+		enterRule(_localctx, 80, RULE_lexerBlock);
+		try {
+			enterOuterAlt(_localctx, 1);
+			{
+			setState(430);
+			match(LPAREN);
+			setState(431);
+			lexerAltList();
+			setState(432);
+			match(RPAREN);
+			}
+		}
+		catch (RecognitionException re) {
+			_localctx.exception = re;
+			_errHandler.reportError(this, re);
+			_errHandler.recover(this, re);
+		}
+		finally {
+			exitRule();
+		}
+		return _localctx;
+	}
+
+	public static class LexerCommandsContext extends ParserRuleContext {
+		public TerminalNode RARROW() { return getToken(ANTLRv4Parser.RARROW, 0); }
+		public List<LexerCommandContext> lexerCommand() {
+			return getRuleContexts(LexerCommandContext.class);
+		}
+		public LexerCommandContext lexerCommand(int i) {
+			return getRuleContext(LexerCommandContext.class,i);
+		}
+		public List<TerminalNode> COMMA() { return getTokens(ANTLRv4Parser.COMMA); }
+		public TerminalNode COMMA(int i) {
+			return getToken(ANTLRv4Parser.COMMA, i);
+		}
+		public LexerCommandsContext(ParserRuleContext parent, int invokingState) {
+			super(parent, invokingState);
+		}
+		@Override public int getRuleIndex() { return RULE_lexerCommands; }
+		@Override
+		public void enterRule(ParseTreeListener listener) {
+			if ( listener instanceof ANTLRv4ParserListener ) ((ANTLRv4ParserListener)listener).enterLexerCommands(this);
+		}
+		@Override
+		public void exitRule(ParseTreeListener listener) {
+			if ( listener instanceof ANTLRv4ParserListener ) ((ANTLRv4ParserListener)listener).exitLexerCommands(this);
+		}
+	}
+
+	public final LexerCommandsContext lexerCommands() throws RecognitionException {
+		LexerCommandsContext _localctx = new LexerCommandsContext(_ctx, getState());
+		enterRule(_localctx, 82, RULE_lexerCommands);
+		int _la;
+		try {
+			enterOuterAlt(_localctx, 1);
+			{
+			setState(434);
+			match(RARROW);
+			setState(435);
+			lexerCommand();
+			setState(440);
+			_errHandler.sync(this);
+			_la = _input.LA(1);
+			while (_la==COMMA) {
+				{
+				{
+				setState(436);
+				match(COMMA);
+				setState(437);
+				lexerCommand();
+				}
+				}
+				setState(442);
+				_errHandler.sync(this);
+				_la = _input.LA(1);
+			}
+			}
+		}
+		catch (RecognitionException re) {
+			_localctx.exception = re;
+			_errHandler.reportError(this, re);
+			_errHandler.recover(this, re);
+		}
+		finally {
+			exitRule();
+		}
+		return _localctx;
+	}
+
+	public static class LexerCommandContext extends ParserRuleContext {
+		public LexerCommandNameContext lexerCommandName() {
+			return getRuleContext(LexerCommandNameContext.class,0);
+		}
+		public TerminalNode LPAREN() { return getToken(ANTLRv4Parser.LPAREN, 0); }
+		public LexerCommandExprContext lexerCommandExpr() {
+			return getRuleContext(LexerCommandExprContext.class,0);
+		}
+		public TerminalNode RPAREN() { return getToken(ANTLRv4Parser.RPAREN, 0); }
+		public LexerCommandContext(ParserRuleContext parent, int invokingState) {
+			super(parent, invokingState);
+		}
+		@Override public int getRuleIndex() { return RULE_lexerCommand; }
+		@Override
+		public void enterRule(ParseTreeListener listener) {
+			if ( listener instanceof ANTLRv4ParserListener ) ((ANTLRv4ParserListener)listener).enterLexerCommand(this);
+		}
+		@Override
+		public void exitRule(ParseTreeListener listener) {
+			if ( listener instanceof ANTLRv4ParserListener ) ((ANTLRv4ParserListener)listener).exitLexerCommand(this);
+		}
+	}
+
+	public final LexerCommandContext lexerCommand() throws RecognitionException {
+		LexerCommandContext _localctx = new LexerCommandContext(_ctx, getState());
+		enterRule(_localctx, 84, RULE_lexerCommand);
+		try {
+			setState(449);
+			_errHandler.sync(this);
+			switch ( getInterpreter().adaptivePredict(_input,47,_ctx) ) {
+			case 1:
+				enterOuterAlt(_localctx, 1);
+				{
+				setState(443);
+				lexerCommandName();
+				setState(444);
+				match(LPAREN);
+				setState(445);
+				lexerCommandExpr();
+				setState(446);
+				match(RPAREN);
+				}
+				break;
+			case 2:
+				enterOuterAlt(_localctx, 2);
+				{
+				setState(448);
+				lexerCommandName();
+				}
+				break;
+			}
+		}
+		catch (RecognitionException re) {
+			_localctx.exception = re;
+			_errHandler.reportError(this, re);
+			_errHandler.recover(this, re);
+		}
+		finally {
+			exitRule();
+		}
+		return _localctx;
+	}
+
+	public static class LexerCommandNameContext extends ParserRuleContext {
+		public IdentifierContext identifier() {
+			return getRuleContext(IdentifierContext.class,0);
+		}
+		public TerminalNode MODE() { return getToken(ANTLRv4Parser.MODE, 0); }
+		public LexerCommandNameContext(ParserRuleContext parent, int invokingState) {
+			super(parent, invokingState);
+		}
+		@Override public int getRuleIndex() { return RULE_lexerCommandName; }
+		@Override
+		public void enterRule(ParseTreeListener listener) {
+			if ( listener instanceof ANTLRv4ParserListener ) ((ANTLRv4ParserListener)listener).enterLexerCommandName(this);
+		}
+		@Override
+		public void exitRule(ParseTreeListener listener) {
+			if ( listener instanceof ANTLRv4ParserListener ) ((ANTLRv4ParserListener)listener).exitLexerCommandName(this);
+		}
+	}
+
+	public final LexerCommandNameContext lexerCommandName() throws RecognitionException {
+		LexerCommandNameContext _localctx = new LexerCommandNameContext(_ctx, getState());
+		enterRule(_localctx, 86, RULE_lexerCommandName);
+		try {
+			setState(453);
+			_errHandler.sync(this);
+			switch (_input.LA(1)) {
+			case TOKEN_REF:
+			case RULE_REF:
+				enterOuterAlt(_localctx, 1);
+				{
+				setState(451);
+				identifier();
+				}
+				break;
+			case MODE:
+				enterOuterAlt(_localctx, 2);
+				{
+				setState(452);
+				match(MODE);
+				}
+				break;
+			default:
+				throw new NoViableAltException(this);
+			}
+		}
+		catch (RecognitionException re) {
+			_localctx.exception = re;
+			_errHandler.reportError(this, re);
+			_errHandler.recover(this, re);
+		}
+		finally {
+			exitRule();
+		}
+		return _localctx;
+	}
+
+	public static class LexerCommandExprContext extends ParserRuleContext {
+		public IdentifierContext identifier() {
+			return getRuleContext(IdentifierContext.class,0);
+		}
+		public TerminalNode INT() { return getToken(ANTLRv4Parser.INT, 0); }
+		public LexerCommandExprContext(ParserRuleContext parent, int invokingState) {
+			super(parent, invokingState);
+		}
+		@Override public int getRuleIndex() { return RULE_lexerCommandExpr; }
+		@Override
+		public void enterRule(ParseTreeListener listener) {
+			if ( listener instanceof ANTLRv4ParserListener ) ((ANTLRv4ParserListener)listener).enterLexerCommandExpr(this);
+		}
+		@Override
+		public void exitRule(ParseTreeListener listener) {
+			if ( listener instanceof ANTLRv4ParserListener ) ((ANTLRv4ParserListener)listener).exitLexerCommandExpr(this);
+		}
+	}
+
+	public final LexerCommandExprContext lexerCommandExpr() throws RecognitionException {
+		LexerCommandExprContext _localctx = new LexerCommandExprContext(_ctx, getState());
+		enterRule(_localctx, 88, RULE_lexerCommandExpr);
+		try {
+			setState(457);
+			_errHandler.sync(this);
+			switch (_input.LA(1)) {
+			case TOKEN_REF:
+			case RULE_REF:
+				enterOuterAlt(_localctx, 1);
+				{
+				setState(455);
+				identifier();
+				}
+				break;
+			case INT:
+				enterOuterAlt(_localctx, 2);
+				{
+				setState(456);
+				match(INT);
+				}
+				break;
+			default:
+				throw new NoViableAltException(this);
+			}
+		}
+		catch (RecognitionException re) {
+			_localctx.exception = re;
+			_errHandler.reportError(this, re);
+			_errHandler.recover(this, re);
+		}
+		finally {
+			exitRule();
+		}
+		return _localctx;
+	}
+
+	public static class AltListContext extends ParserRuleContext {
+		public List<AlternativeContext> alternative() {
+			return getRuleContexts(AlternativeContext.class);
+		}
+		public AlternativeContext alternative(int i) {
+			return getRuleContext(AlternativeContext.class,i);
+		}
+		public List<TerminalNode> OR() { return getTokens(ANTLRv4Parser.OR); }
+		public TerminalNode OR(int i) {
+			return getToken(ANTLRv4Parser.OR, i);
+		}
+		public AltListContext(ParserRuleContext parent, int invokingState) {
+			super(parent, invokingState);
+		}
+		@Override public int getRuleIndex() { return RULE_altList; }
+		@Override
+		public void enterRule(ParseTreeListener listener) {
+			if ( listener instanceof ANTLRv4ParserListener ) ((ANTLRv4ParserListener)listener).enterAltList(this);
+		}
+		@Override
+		public void exitRule(ParseTreeListener listener) {
+			if ( listener instanceof ANTLRv4ParserListener ) ((ANTLRv4ParserListener)listener).exitAltList(this);
+		}
+	}
+
+	public final AltListContext altList() throws RecognitionException {
+		AltListContext _localctx = new AltListContext(_ctx, getState());
+		enterRule(_localctx, 90, RULE_altList);
+		int _la;
+		try {
+			enterOuterAlt(_localctx, 1);
+			{
+			setState(459);
+			alternative();
+			setState(464);
+			_errHandler.sync(this);
+			_la = _input.LA(1);
+			while (_la==OR) {
+				{
+				{
+				setState(460);
+				match(OR);
+				setState(461);
+				alternative();
+				}
+				}
+				setState(466);
+				_errHandler.sync(this);
+				_la = _input.LA(1);
+			}
+			}
+		}
+		catch (RecognitionException re) {
+			_localctx.exception = re;
+			_errHandler.reportError(this, re);
+			_errHandler.recover(this, re);
+		}
+		finally {
+			exitRule();
+		}
+		return _localctx;
+	}
+
+	public static class AlternativeContext extends ParserRuleContext {
+		public ElementOptionsContext elementOptions() {
+			return getRuleContext(ElementOptionsContext.class,0);
+		}
+		public List<ElementContext> element() {
+			return getRuleContexts(ElementContext.class);
+		}
+		public ElementContext element(int i) {
+			return getRuleContext(ElementContext.class,i);
+		}
+		public AlternativeContext(ParserRuleContext parent, int invokingState) {
+			super(parent, invokingState);
+		}
+		@Override public int getRuleIndex() { return RULE_alternative; }
+		@Override
+		public void enterRule(ParseTreeListener listener) {
+			if ( listener instanceof ANTLRv4ParserListener ) ((ANTLRv4ParserListener)listener).enterAlternative(this);
+		}
+		@Override
+		public void exitRule(ParseTreeListener listener) {
+			if ( listener instanceof ANTLRv4ParserListener ) ((ANTLRv4ParserListener)listener).exitAlternative(this);
+		}
+	}
+
+	public final AlternativeContext alternative() throws RecognitionException {
+		AlternativeContext _localctx = new AlternativeContext(_ctx, getState());
+		enterRule(_localctx, 92, RULE_alternative);
+		int _la;
+		try {
+			setState(476);
+			_errHandler.sync(this);
+			switch (_input.LA(1)) {
+			case TOKEN_REF:
+			case RULE_REF:
+			case STRING_LITERAL:
+			case BEGIN_ACTION:
+			case LPAREN:
+			case LT:
+			case DOT:
+			case NOT:
+				enterOuterAlt(_localctx, 1);
+				{
+				setState(468);
+				_errHandler.sync(this);
+				_la = _input.LA(1);
+				if (_la==LT) {
+					{
+					setState(467);
+					elementOptions();
+					}
+				}
+
+				setState(471); 
+				_errHandler.sync(this);
+				_la = _input.LA(1);
+				do {
+					{
+					{
+					setState(470);
+					element();
+					}
+					}
+					setState(473); 
+					_errHandler.sync(this);
+					_la = _input.LA(1);
+				} while ( (((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << TOKEN_REF) | (1L << RULE_REF) | (1L << STRING_LITERAL) | (1L << BEGIN_ACTION) | (1L << LPAREN) | (1L << DOT) | (1L << NOT))) != 0) );
+				}
+				break;
+			case SEMI:
+			case RPAREN:
+			case OR:
+			case POUND:
+				enterOuterAlt(_localctx, 2);
+				{
+				}
+				break;
+			default:
+				throw new NoViableAltException(this);
+			}
+		}
+		catch (RecognitionException re) {
+			_localctx.exception = re;
+			_errHandler.reportError(this, re);
+			_errHandler.recover(this, re);
+		}
+		finally {
+			exitRule();
+		}
+		return _localctx;
+	}
+
+	public static class ElementContext extends ParserRuleContext {
+		public LabeledElementContext labeledElement() {
+			return getRuleContext(LabeledElementContext.class,0);
+		}
+		public EbnfSuffixContext ebnfSuffix() {
+			return getRuleContext(EbnfSuffixContext.class,0);
+		}
+		public AtomContext atom() {
+			return getRuleContext(AtomContext.class,0);
+		}
+		public EbnfContext ebnf() {
+			return getRuleContext(EbnfContext.class,0);
+		}
+		public ActionBlockContext actionBlock() {
+			return getRuleContext(ActionBlockContext.class,0);
+		}
+		public TerminalNode QUESTION() { return getToken(ANTLRv4Parser.QUESTION, 0); }
+		public ElementContext(ParserRuleContext parent, int invokingState) {
+			super(parent, invokingState);
+		}
+		@Override public int getRuleIndex() { return RULE_element; }
+		@Override
+		public void enterRule(ParseTreeListener listener) {
+			if ( listener instanceof ANTLRv4ParserListener ) ((ANTLRv4ParserListener)listener).enterElement(this);
+		}
+		@Override
+		public void exitRule(ParseTreeListener listener) {
+			if ( listener instanceof ANTLRv4ParserListener ) ((ANTLRv4ParserListener)listener).exitElement(this);
+		}
+	}
+
+	public final ElementContext element() throws RecognitionException {
+		ElementContext _localctx = new ElementContext(_ctx, getState());
+		enterRule(_localctx, 94, RULE_element);
+		int _la;
+		try {
+			setState(493);
+			_errHandler.sync(this);
+			switch ( getInterpreter().adaptivePredict(_input,57,_ctx) ) {
+			case 1:
+				enterOuterAlt(_localctx, 1);
+				{
+				setState(478);
+				labeledElement();
+				setState(481);
+				_errHandler.sync(this);
+				switch (_input.LA(1)) {
+				case QUESTION:
+				case STAR:
+				case PLUS:
+					{
+					setState(479);
+					ebnfSuffix();
+					}
+					break;
+				case TOKEN_REF:
+				case RULE_REF:
+				case STRING_LITERAL:
+				case BEGIN_ACTION:
+				case SEMI:
+				case LPAREN:
+				case RPAREN:
+				case OR:
+				case DOT:
+				case POUND:
+				case NOT:
+					{
+					}
+					break;
+				default:
+					throw new NoViableAltException(this);
+				}
+				}
+				break;
+			case 2:
+				enterOuterAlt(_localctx, 2);
+				{
+				setState(483);
+				atom();
+				setState(486);
+				_errHandler.sync(this);
+				switch (_input.LA(1)) {
+				case QUESTION:
+				case STAR:
+				case PLUS:
+					{
+					setState(484);
+					ebnfSuffix();
+					}
+					break;
+				case TOKEN_REF:
+				case RULE_REF:
+				case STRING_LITERAL:
+				case BEGIN_ACTION:
+				case SEMI:
+				case LPAREN:
+				case RPAREN:
+				case OR:
+				case DOT:
+				case POUND:
+				case NOT:
+					{
+					}
+					break;
+				default:
+					throw new NoViableAltException(this);
+				}
+				}
+				break;
+			case 3:
+				enterOuterAlt(_localctx, 3);
+				{
+				setState(488);
+				ebnf();
+				}
+				break;
+			case 4:
+				enterOuterAlt(_localctx, 4);
+				{
+				setState(489);
+				actionBlock();
+				setState(491);
+				_errHandler.sync(this);
+				_la = _input.LA(1);
+				if (_la==QUESTION) {
+					{
+					setState(490);
+					match(QUESTION);
+					}
+				}
+
+				}
+				break;
+			}
+		}
+		catch (RecognitionException re) {
+			_localctx.exception = re;
+			_errHandler.reportError(this, re);
+			_errHandler.recover(this, re);
+		}
+		finally {
+			exitRule();
+		}
+		return _localctx;
+	}
+
+	public static class LabeledElementContext extends ParserRuleContext {
+		public IdentifierContext identifier() {
+			return getRuleContext(IdentifierContext.class,0);
+		}
+		public TerminalNode ASSIGN() { return getToken(ANTLRv4Parser.ASSIGN, 0); }
+		public TerminalNode PLUS_ASSIGN() { return getToken(ANTLRv4Parser.PLUS_ASSIGN, 0); }
+		public AtomContext atom() {
+			return getRuleContext(AtomContext.class,0);
+		}
+		public BlockContext block() {
+			return getRuleContext(BlockContext.class,0);
+		}
+		public LabeledElementContext(ParserRuleContext parent, int invokingState) {
+			super(parent, invokingState);
+		}
+		@Override public int getRuleIndex() { return RULE_labeledElement; }
+		@Override
+		public void enterRule(ParseTreeListener listener) {
+			if ( listener instanceof ANTLRv4ParserListener ) ((ANTLRv4ParserListener)listener).enterLabeledElement(this);
+		}
+		@Override
+		public void exitRule(ParseTreeListener listener) {
+			if ( listener instanceof ANTLRv4ParserListener ) ((ANTLRv4ParserListener)listener).exitLabeledElement(this);
+		}
+	}
+
+	public final LabeledElementContext labeledElement() throws RecognitionException {
+		LabeledElementContext _localctx = new LabeledElementContext(_ctx, getState());
+		enterRule(_localctx, 96, RULE_labeledElement);
+		int _la;
+		try {
+			enterOuterAlt(_localctx, 1);
+			{
+			setState(495);
+			identifier();
+			setState(496);
+			_la = _input.LA(1);
+			if ( !(_la==ASSIGN || _la==PLUS_ASSIGN) ) {
+			_errHandler.recoverInline(this);
+			}
+			else {
+				if ( _input.LA(1)==Token.EOF ) matchedEOF = true;
+				_errHandler.reportMatch(this);
+				consume();
+			}
+			setState(499);
+			_errHandler.sync(this);
+			switch (_input.LA(1)) {
+			case TOKEN_REF:
+			case RULE_REF:
+			case STRING_LITERAL:
+			case DOT:
+			case NOT:
+				{
+				setState(497);
+				atom();
+				}
+				break;
+			case LPAREN:
+				{
+				setState(498);
+				block();
+				}
+				break;
+			default:
+				throw new NoViableAltException(this);
+			}
+			}
+		}
+		catch (RecognitionException re) {
+			_localctx.exception = re;
+			_errHandler.reportError(this, re);
+			_errHandler.recover(this, re);
+		}
+		finally {
+			exitRule();
+		}
+		return _localctx;
+	}
+
+	public static class EbnfContext extends ParserRuleContext {
+		public BlockContext block() {
+			return getRuleContext(BlockContext.class,0);
+		}
+		public BlockSuffixContext blockSuffix() {
+			return getRuleContext(BlockSuffixContext.class,0);
+		}
+		public EbnfContext(ParserRuleContext parent, int invokingState) {
+			super(parent, invokingState);
+		}
+		@Override public int getRuleIndex() { return RULE_ebnf; }
+		@Override
+		public void enterRule(ParseTreeListener listener) {
+			if ( listener instanceof ANTLRv4ParserListener ) ((ANTLRv4ParserListener)listener).enterEbnf(this);
+		}
+		@Override
+		public void exitRule(ParseTreeListener listener) {
+			if ( listener instanceof ANTLRv4ParserListener ) ((ANTLRv4ParserListener)listener).exitEbnf(this);
+		}
+	}
+
+	public final EbnfContext ebnf() throws RecognitionException {
+		EbnfContext _localctx = new EbnfContext(_ctx, getState());
+		enterRule(_localctx, 98, RULE_ebnf);
+		int _la;
+		try {
+			enterOuterAlt(_localctx, 1);
+			{
+			setState(501);
+			block();
+			setState(503);
+			_errHandler.sync(this);
+			_la = _input.LA(1);
+			if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << QUESTION) | (1L << STAR) | (1L << PLUS))) != 0)) {
+				{
+				setState(502);
+				blockSuffix();
+				}
+			}
+
+			}
+		}
+		catch (RecognitionException re) {
+			_localctx.exception = re;
+			_errHandler.reportError(this, re);
+			_errHandler.recover(this, re);
+		}
+		finally {
+			exitRule();
+		}
+		return _localctx;
+	}
+
+	public static class BlockSuffixContext extends ParserRuleContext {
+		public EbnfSuffixContext ebnfSuffix() {
+			return getRuleContext(EbnfSuffixContext.class,0);
+		}
+		public BlockSuffixContext(ParserRuleContext parent, int invokingState) {
+			super(parent, invokingState);
+		}
+		@Override public int getRuleIndex() { return RULE_blockSuffix; }
+		@Override
+		public void enterRule(ParseTreeListener listener) {
+			if ( listener instanceof ANTLRv4ParserListener ) ((ANTLRv4ParserListener)listener).enterBlockSuffix(this);
+		}
+		@Override
+		public void exitRule(ParseTreeListener listener) {
+			if ( listener instanceof ANTLRv4ParserListener ) ((ANTLRv4ParserListener)listener).exitBlockSuffix(this);
+		}
+	}
+
+	public final BlockSuffixContext blockSuffix() throws RecognitionException {
+		BlockSuffixContext _localctx = new BlockSuffixContext(_ctx, getState());
+		enterRule(_localctx, 100, RULE_blockSuffix);
+		try {
+			enterOuterAlt(_localctx, 1);
+			{
+			setState(505);
+			ebnfSuffix();
+			}
+		}
+		catch (RecognitionException re) {
+			_localctx.exception = re;
+			_errHandler.reportError(this, re);
+			_errHandler.recover(this, re);
+		}
+		finally {
+			exitRule();
+		}
+		return _localctx;
+	}
+
+	public static class EbnfSuffixContext extends ParserRuleContext {
+		public List<TerminalNode> QUESTION() { return getTokens(ANTLRv4Parser.QUESTION); }
+		public TerminalNode QUESTION(int i) {
+			return getToken(ANTLRv4Parser.QUESTION, i);
+		}
+		public TerminalNode STAR() { return getToken(ANTLRv4Parser.STAR, 0); }
+		public TerminalNode PLUS() { return getToken(ANTLRv4Parser.PLUS, 0); }
+		public EbnfSuffixContext(ParserRuleContext parent, int invokingState) {
+			super(parent, invokingState);
+		}
+		@Override public int getRuleIndex() { return RULE_ebnfSuffix; }
+		@Override
+		public void enterRule(ParseTreeListener listener) {
+			if ( listener instanceof ANTLRv4ParserListener ) ((ANTLRv4ParserListener)listener).enterEbnfSuffix(this);
+		}
+		@Override
+		public void exitRule(ParseTreeListener listener) {
+			if ( listener instanceof ANTLRv4ParserListener ) ((ANTLRv4ParserListener)listener).exitEbnfSuffix(this);
+		}
+	}
+
+	public final EbnfSuffixContext ebnfSuffix() throws RecognitionException {
+		EbnfSuffixContext _localctx = new EbnfSuffixContext(_ctx, getState());
+		enterRule(_localctx, 102, RULE_ebnfSuffix);
+		int _la;
+		try {
+			setState(519);
+			_errHandler.sync(this);
+			switch (_input.LA(1)) {
+			case QUESTION:
+				enterOuterAlt(_localctx, 1);
+				{
+				setState(507);
+				match(QUESTION);
+				setState(509);
+				_errHandler.sync(this);
+				_la = _input.LA(1);
+				if (_la==QUESTION) {
+					{
+					setState(508);
+					match(QUESTION);
+					}
+				}
+
+				}
+				break;
+			case STAR:
+				enterOuterAlt(_localctx, 2);
+				{
+				setState(511);
+				match(STAR);
+				setState(513);
+				_errHandler.sync(this);
+				_la = _input.LA(1);
+				if (_la==QUESTION) {
+					{
+					setState(512);
+					match(QUESTION);
+					}
+				}
+
+				}
+				break;
+			case PLUS:
+				enterOuterAlt(_localctx, 3);
+				{
+				setState(515);
+				match(PLUS);
+				setState(517);
+				_errHandler.sync(this);
+				_la = _input.LA(1);
+				if (_la==QUESTION) {
+					{
+					setState(516);
+					match(QUESTION);
+					}
+				}
+
+				}
+				break;
+			default:
+				throw new NoViableAltException(this);
+			}
+		}
+		catch (RecognitionException re) {
+			_localctx.exception = re;
+			_errHandler.reportError(this, re);
+			_errHandler.recover(this, re);
+		}
+		finally {
+			exitRule();
+		}
+		return _localctx;
+	}
+
+	public static class LexerAtomContext extends ParserRuleContext {
+		public CharacterRangeContext characterRange() {
+			return getRuleContext(CharacterRangeContext.class,0);
+		}
+		public TerminalContext terminal() {
+			return getRuleContext(TerminalContext.class,0);
+		}
+		public NotSetContext notSet() {
+			return getRuleContext(NotSetContext.class,0);
+		}
+		public TerminalNode LEXER_CHAR_SET() { return getToken(ANTLRv4Parser.LEXER_CHAR_SET, 0); }
+		public TerminalNode DOT() { return getToken(ANTLRv4Parser.DOT, 0); }
+		public ElementOptionsContext elementOptions() {
+			return getRuleContext(ElementOptionsContext.class,0);
+		}
+		public LexerAtomContext(ParserRuleContext parent, int invokingState) {
+			super(parent, invokingState);
+		}
+		@Override public int getRuleIndex() { return RULE_lexerAtom; }
+		@Override
+		public void enterRule(ParseTreeListener listener) {
+			if ( listener instanceof ANTLRv4ParserListener ) ((ANTLRv4ParserListener)listener).enterLexerAtom(this);
+		}
+		@Override
+		public void exitRule(ParseTreeListener listener) {
+			if ( listener instanceof ANTLRv4ParserListener ) ((ANTLRv4ParserListener)listener).exitLexerAtom(this);
+		}
+	}
+
+	public final LexerAtomContext lexerAtom() throws RecognitionException {
+		LexerAtomContext _localctx = new LexerAtomContext(_ctx, getState());
+		enterRule(_localctx, 104, RULE_lexerAtom);
+		int _la;
+		try {
+			setState(529);
+			_errHandler.sync(this);
+			switch ( getInterpreter().adaptivePredict(_input,65,_ctx) ) {
+			case 1:
+				enterOuterAlt(_localctx, 1);
+				{
+				setState(521);
+				characterRange();
+				}
+				break;
+			case 2:
+				enterOuterAlt(_localctx, 2);
+				{
+				setState(522);
+				terminal();
+				}
+				break;
+			case 3:
+				enterOuterAlt(_localctx, 3);
+				{
+				setState(523);
+				notSet();
+				}
+				break;
+			case 4:
+				enterOuterAlt(_localctx, 4);
+				{
+				setState(524);
+				match(LEXER_CHAR_SET);
+				}
+				break;
+			case 5:
+				enterOuterAlt(_localctx, 5);
+				{
+				setState(525);
+				match(DOT);
+				setState(527);
+				_errHandler.sync(this);
+				_la = _input.LA(1);
+				if (_la==LT) {
+					{
+					setState(526);
+					elementOptions();
+					}
+				}
+
+				}
+				break;
+			}
+		}
+		catch (RecognitionException re) {
+			_localctx.exception = re;
+			_errHandler.reportError(this, re);
+			_errHandler.recover(this, re);
+		}
+		finally {
+			exitRule();
+		}
+		return _localctx;
+	}
+
+	public static class AtomContext extends ParserRuleContext {
+		public TerminalContext terminal() {
+			return getRuleContext(TerminalContext.class,0);
+		}
+		public RulerefContext ruleref() {
+			return getRuleContext(RulerefContext.class,0);
+		}
+		public NotSetContext notSet() {
+			return getRuleContext(NotSetContext.class,0);
+		}
+		public TerminalNode DOT() { return getToken(ANTLRv4Parser.DOT, 0); }
+		public ElementOptionsContext elementOptions() {
+			return getRuleContext(ElementOptionsContext.class,0);
+		}
+		public AtomContext(ParserRuleContext parent, int invokingState) {
+			super(parent, invokingState);
+		}
+		@Override public int getRuleIndex() { return RULE_atom; }
+		@Override
+		public void enterRule(ParseTreeListener listener) {
+			if ( listener instanceof ANTLRv4ParserListener ) ((ANTLRv4ParserListener)listener).enterAtom(this);
+		}
+		@Override
+		public void exitRule(ParseTreeListener listener) {
+			if ( listener instanceof ANTLRv4ParserListener ) ((ANTLRv4ParserListener)listener).exitAtom(this);
+		}
+	}
+
+	public final AtomContext atom() throws RecognitionException {
+		AtomContext _localctx = new AtomContext(_ctx, getState());
+		enterRule(_localctx, 106, RULE_atom);
+		int _la;
+		try {
+			setState(538);
+			_errHandler.sync(this);
+			switch (_input.LA(1)) {
+			case TOKEN_REF:
+			case STRING_LITERAL:
+				enterOuterAlt(_localctx, 1);
+				{
+				setState(531);
+				terminal();
+				}
+				break;
+			case RULE_REF:
+				enterOuterAlt(_localctx, 2);
+				{
+				setState(532);
+				ruleref();
+				}
+				break;
+			case NOT:
+				enterOuterAlt(_localctx, 3);
+				{
+				setState(533);
+				notSet();
+				}
+				break;
+			case DOT:
+				enterOuterAlt(_localctx, 4);
+				{
+				setState(534);
+				match(DOT);
+				setState(536);
+				_errHandler.sync(this);
+				_la = _input.LA(1);
+				if (_la==LT) {
+					{
+					setState(535);
+					elementOptions();
+					}
+				}
+
+				}
+				break;
+			default:
+				throw new NoViableAltException(this);
+			}
+		}
+		catch (RecognitionException re) {
+			_localctx.exception = re;
+			_errHandler.reportError(this, re);
+			_errHandler.recover(this, re);
+		}
+		finally {
+			exitRule();
+		}
+		return _localctx;
+	}
+
+	public static class NotSetContext extends ParserRuleContext {
+		public TerminalNode NOT() { return getToken(ANTLRv4Parser.NOT, 0); }
+		public SetElementContext setElement() {
+			return getRuleContext(SetElementContext.class,0);
+		}
+		public BlockSetContext blockSet() {
+			return getRuleContext(BlockSetContext.class,0);
+		}
+		public NotSetContext(ParserRuleContext parent, int invokingState) {
+			super(parent, invokingState);
+		}
+		@Override public int getRuleIndex() { return RULE_notSet; }
+		@Override
+		public void enterRule(ParseTreeListener listener) {
+			if ( listener instanceof ANTLRv4ParserListener ) ((ANTLRv4ParserListener)listener).enterNotSet(this);
+		}
+		@Override
+		public void exitRule(ParseTreeListener listener) {
+			if ( listener instanceof ANTLRv4ParserListener ) ((ANTLRv4ParserListener)listener).exitNotSet(this);
+		}
+	}
+
+	public final NotSetContext notSet() throws RecognitionException {
+		NotSetContext _localctx = new NotSetContext(_ctx, getState());
+		enterRule(_localctx, 108, RULE_notSet);
+		try {
+			setState(544);
+			_errHandler.sync(this);
+			switch ( getInterpreter().adaptivePredict(_input,68,_ctx) ) {
+			case 1:
+				enterOuterAlt(_localctx, 1);
+				{
+				setState(540);
+				match(NOT);
+				setState(541);
+				setElement();
+				}
+				break;
+			case 2:
+				enterOuterAlt(_localctx, 2);
+				{
+				setState(542);
+				match(NOT);
+				setState(543);
+				blockSet();
+				}
+				break;
+			}
+		}
+		catch (RecognitionException re) {
+			_localctx.exception = re;
+			_errHandler.reportError(this, re);
+			_errHandler.recover(this, re);
+		}
+		finally {
+			exitRule();
+		}
+		return _localctx;
+	}
+
+	public static class BlockSetContext extends ParserRuleContext {
+		public TerminalNode LPAREN() { return getToken(ANTLRv4Parser.LPAREN, 0); }
+		public List<SetElementContext> setElement() {
+			return getRuleContexts(SetElementContext.class);
+		}
+		public SetElementContext setElement(int i) {
+			return getRuleContext(SetElementContext.class,i);
+		}
+		public TerminalNode RPAREN() { return getToken(ANTLRv4Parser.RPAREN, 0); }
+		public List<TerminalNode> OR() { return getTokens(ANTLRv4Parser.OR); }
+		public TerminalNode OR(int i) {
+			return getToken(ANTLRv4Parser.OR, i);
+		}
+		public BlockSetContext(ParserRuleContext parent, int invokingState) {
+			super(parent, invokingState);
+		}
+		@Override public int getRuleIndex() { return RULE_blockSet; }
+		@Override
+		public void enterRule(ParseTreeListener listener) {
+			if ( listener instanceof ANTLRv4ParserListener ) ((ANTLRv4ParserListener)listener).enterBlockSet(this);
+		}
+		@Override
+		public void exitRule(ParseTreeListener listener) {
+			if ( listener instanceof ANTLRv4ParserListener ) ((ANTLRv4ParserListener)listener).exitBlockSet(this);
+		}
+	}
+
+	public final BlockSetContext blockSet() throws RecognitionException {
+		BlockSetContext _localctx = new BlockSetContext(_ctx, getState());
+		enterRule(_localctx, 110, RULE_blockSet);
+		int _la;
+		try {
+			enterOuterAlt(_localctx, 1);
+			{
+			setState(546);
+			match(LPAREN);
+			setState(547);
+			setElement();
+			setState(552);
+			_errHandler.sync(this);
+			_la = _input.LA(1);
+			while (_la==OR) {
+				{
+				{
+				setState(548);
+				match(OR);
+				setState(549);
+				setElement();
+				}
+				}
+				setState(554);
+				_errHandler.sync(this);
+				_la = _input.LA(1);
+			}
+			setState(555);
+			match(RPAREN);
+			}
+		}
+		catch (RecognitionException re) {
+			_localctx.exception = re;
+			_errHandler.reportError(this, re);
+			_errHandler.recover(this, re);
+		}
+		finally {
+			exitRule();
+		}
+		return _localctx;
+	}
+
+	public static class SetElementContext extends ParserRuleContext {
+		public TerminalNode TOKEN_REF() { return getToken(ANTLRv4Parser.TOKEN_REF, 0); }
+		public ElementOptionsContext elementOptions() {
+			return getRuleContext(ElementOptionsContext.class,0);
+		}
+		public TerminalNode STRING_LITERAL() { return getToken(ANTLRv4Parser.STRING_LITERAL, 0); }
+		public CharacterRangeContext characterRange() {
+			return getRuleContext(CharacterRangeContext.class,0);
+		}
+		public TerminalNode LEXER_CHAR_SET() { return getToken(ANTLRv4Parser.LEXER_CHAR_SET, 0); }
+		public SetElementContext(ParserRuleContext parent, int invokingState) {
+			super(parent, invokingState);
+		}
+		@Override public int getRuleIndex() { return RULE_setElement; }
+		@Override
+		public void enterRule(ParseTreeListener listener) {
+			if ( listener instanceof ANTLRv4ParserListener ) ((ANTLRv4ParserListener)listener).enterSetElement(this);
+		}
+		@Override
+		public void exitRule(ParseTreeListener listener) {
+			if ( listener instanceof ANTLRv4ParserListener ) ((ANTLRv4ParserListener)listener).exitSetElement(this);
+		}
+	}
+
+	public final SetElementContext setElement() throws RecognitionException {
+		SetElementContext _localctx = new SetElementContext(_ctx, getState());
+		enterRule(_localctx, 112, RULE_setElement);
+		int _la;
+		try {
+			setState(567);
+			_errHandler.sync(this);
+			switch ( getInterpreter().adaptivePredict(_input,72,_ctx) ) {
+			case 1:
+				enterOuterAlt(_localctx, 1);
+				{
+				setState(557);
+				match(TOKEN_REF);
+				setState(559);
+				_errHandler.sync(this);
+				_la = _input.LA(1);
+				if (_la==LT) {
+					{
+					setState(558);
+					elementOptions();
+					}
+				}
+
+				}
+				break;
+			case 2:
+				enterOuterAlt(_localctx, 2);
+				{
+				setState(561);
+				match(STRING_LITERAL);
+				setState(563);
+				_errHandler.sync(this);
+				_la = _input.LA(1);
+				if (_la==LT) {
+					{
+					setState(562);
+					elementOptions();
+					}
+				}
+
+				}
+				break;
+			case 3:
+				enterOuterAlt(_localctx, 3);
+				{
+				setState(565);
+				characterRange();
+				}
+				break;
+			case 4:
+				enterOuterAlt(_localctx, 4);
+				{
+				setState(566);
+				match(LEXER_CHAR_SET);
+				}
+				break;
+			}
+		}
+		catch (RecognitionException re) {
+			_localctx.exception = re;
+			_errHandler.reportError(this, re);
+			_errHandler.recover(this, re);
+		}
+		finally {
+			exitRule();
+		}
+		return _localctx;
+	}
+
+	public static class BlockContext extends ParserRuleContext {
+		public TerminalNode LPAREN() { return getToken(ANTLRv4Parser.LPAREN, 0); }
+		public AltListContext altList() {
+			return getRuleContext(AltListContext.class,0);
+		}
+		public TerminalNode RPAREN() { return getToken(ANTLRv4Parser.RPAREN, 0); }
+		public TerminalNode COLON() { return getToken(ANTLRv4Parser.COLON, 0); }
+		public OptionsSpecContext optionsSpec() {
+			return getRuleContext(OptionsSpecContext.class,0);
+		}
+		public List<RuleActionContext> ruleAction() {
+			return getRuleContexts(RuleActionContext.class);
+		}
+		public RuleActionContext ruleAction(int i) {
+			return getRuleContext(RuleActionContext.class,i);
+		}
+		public BlockContext(ParserRuleContext parent, int invokingState) {
+			super(parent, invokingState);
+		}
+		@Override public int getRuleIndex() { return RULE_block; }
+		@Override
+		public void enterRule(ParseTreeListener listener) {
+			if ( listener instanceof ANTLRv4ParserListener ) ((ANTLRv4ParserListener)listener).enterBlock(this);
+		}
+		@Override
+		public void exitRule(ParseTreeListener listener) {
+			if ( listener instanceof ANTLRv4ParserListener ) ((ANTLRv4ParserListener)listener).exitBlock(this);
+		}
+	}
+
+	public final BlockContext block() throws RecognitionException {
+		BlockContext _localctx = new BlockContext(_ctx, getState());
+		enterRule(_localctx, 114, RULE_block);
+		int _la;
+		try {
+			enterOuterAlt(_localctx, 1);
+			{
+			setState(569);
+			match(LPAREN);
+			setState(580);
+			_errHandler.sync(this);
+			_la = _input.LA(1);
+			if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << OPTIONS) | (1L << COLON) | (1L << AT))) != 0)) {
+				{
+				setState(571);
+				_errHandler.sync(this);
+				_la = _input.LA(1);
+				if (_la==OPTIONS) {
+					{
+					setState(570);
+					optionsSpec();
+					}
+				}
+
+				setState(576);
+				_errHandler.sync(this);
+				_la = _input.LA(1);
+				while (_la==AT) {
+					{
+					{
+					setState(573);
+					ruleAction();
+					}
+					}
+					setState(578);
+					_errHandler.sync(this);
+					_la = _input.LA(1);
+				}
+				setState(579);
+				match(COLON);
+				}
+			}
+
+			setState(582);
+			altList();
+			setState(583);
+			match(RPAREN);
+			}
+		}
+		catch (RecognitionException re) {
+			_localctx.exception = re;
+			_errHandler.reportError(this, re);
+			_errHandler.recover(this, re);
+		}
+		finally {
+			exitRule();
+		}
+		return _localctx;
+	}
+
+	public static class RulerefContext extends ParserRuleContext {
+		public TerminalNode RULE_REF() { return getToken(ANTLRv4Parser.RULE_REF, 0); }
+		public ArgActionBlockContext argActionBlock() {
+			return getRuleContext(ArgActionBlockContext.class,0);
+		}
+		public ElementOptionsContext elementOptions() {
+			return getRuleContext(ElementOptionsContext.class,0);
+		}
+		public RulerefContext(ParserRuleContext parent, int invokingState) {
+			super(parent, invokingState);
+		}
+		@Override public int getRuleIndex() { return RULE_ruleref; }
+		@Override
+		public void enterRule(ParseTreeListener listener) {
+			if ( listener instanceof ANTLRv4ParserListener ) ((ANTLRv4ParserListener)listener).enterRuleref(this);
+		}
+		@Override
+		public void exitRule(ParseTreeListener listener) {
+			if ( listener instanceof ANTLRv4ParserListener ) ((ANTLRv4ParserListener)listener).exitRuleref(this);
+		}
+	}
+
+	public final RulerefContext ruleref() throws RecognitionException {
+		RulerefContext _localctx = new RulerefContext(_ctx, getState());
+		enterRule(_localctx, 116, RULE_ruleref);
+		int _la;
+		try {
+			enterOuterAlt(_localctx, 1);
+			{
+			setState(585);
+			match(RULE_REF);
+			setState(587);
+			_errHandler.sync(this);
+			_la = _input.LA(1);
+			if (_la==BEGIN_ARGUMENT) {
+				{
+				setState(586);
+				argActionBlock();
+				}
+			}
+
+			setState(590);
+			_errHandler.sync(this);
+			_la = _input.LA(1);
+			if (_la==LT) {
+				{
+				setState(589);
+				elementOptions();
+				}
+			}
+
+			}
+		}
+		catch (RecognitionException re) {
+			_localctx.exception = re;
+			_errHandler.reportError(this, re);
+			_errHandler.recover(this, re);
+		}
+		finally {
+			exitRule();
+		}
+		return _localctx;
+	}
+
+	public static class CharacterRangeContext extends ParserRuleContext {
+		public List<TerminalNode> STRING_LITERAL() { return getTokens(ANTLRv4Parser.STRING_LITERAL); }
+		public TerminalNode STRING_LITERAL(int i) {
+			return getToken(ANTLRv4Parser.STRING_LITERAL, i);
+		}
+		public TerminalNode RANGE() { return getToken(ANTLRv4Parser.RANGE, 0); }
+		public CharacterRangeContext(ParserRuleContext parent, int invokingState) {
+			super(parent, invokingState);
+		}
+		@Override public int getRuleIndex() { return RULE_characterRange; }
+		@Override
+		public void enterRule(ParseTreeListener listener) {
+			if ( listener instanceof ANTLRv4ParserListener ) ((ANTLRv4ParserListener)listener).enterCharacterRange(this);
+		}
+		@Override
+		public void exitRule(ParseTreeListener listener) {
+			if ( listener instanceof ANTLRv4ParserListener ) ((ANTLRv4ParserListener)listener).exitCharacterRange(this);
+		}
+	}
+
+	public final CharacterRangeContext characterRange() throws RecognitionException {
+		CharacterRangeContext _localctx = new CharacterRangeContext(_ctx, getState());
+		enterRule(_localctx, 118, RULE_characterRange);
+		try {
+			enterOuterAlt(_localctx, 1);
+			{
+			setState(592);
+			match(STRING_LITERAL);
+			setState(593);
+			match(RANGE);
+			setState(594);
+			match(STRING_LITERAL);
+			}
+		}
+		catch (RecognitionException re) {
+			_localctx.exception = re;
+			_errHandler.reportError(this, re);
+			_errHandler.recover(this, re);
+		}
+		finally {
+			exitRule();
+		}
+		return _localctx;
+	}
+
+	public static class TerminalContext extends ParserRuleContext {
+		public TerminalNode TOKEN_REF() { return getToken(ANTLRv4Parser.TOKEN_REF, 0); }
+		public ElementOptionsContext elementOptions() {
+			return getRuleContext(ElementOptionsContext.class,0);
+		}
+		public TerminalNode STRING_LITERAL() { return getToken(ANTLRv4Parser.STRING_LITERAL, 0); }
+		public TerminalContext(ParserRuleContext parent, int invokingState) {
+			super(parent, invokingState);
+		}
+		@Override public int getRuleIndex() { return RULE_terminal; }
+		@Override
+		public void enterRule(ParseTreeListener listener) {
+			if ( listener instanceof ANTLRv4ParserListener ) ((ANTLRv4ParserListener)listener).enterTerminal(this);
+		}
+		@Override
+		public void exitRule(ParseTreeListener listener) {
+			if ( listener instanceof ANTLRv4ParserListener ) ((ANTLRv4ParserListener)listener).exitTerminal(this);
+		}
+	}
+
+	public final TerminalContext terminal() throws RecognitionException {
+		TerminalContext _localctx = new TerminalContext(_ctx, getState());
+		enterRule(_localctx, 120, RULE_terminal);
+		int _la;
+		try {
+			setState(604);
+			_errHandler.sync(this);
+			switch (_input.LA(1)) {
+			case TOKEN_REF:
+				enterOuterAlt(_localctx, 1);
+				{
+				setState(596);
+				match(TOKEN_REF);
+				setState(598);
+				_errHandler.sync(this);
+				_la = _input.LA(1);
+				if (_la==LT) {
+					{
+					setState(597);
+					elementOptions();
+					}
+				}
+
+				}
+				break;
+			case STRING_LITERAL:
+				enterOuterAlt(_localctx, 2);
+				{
+				setState(600);
+				match(STRING_LITERAL);
+				setState(602);
+				_errHandler.sync(this);
+				_la = _input.LA(1);
+				if (_la==LT) {
+					{
+					setState(601);
+					elementOptions();
+					}
+				}
+
+				}
+				break;
+			default:
+				throw new NoViableAltException(this);
+			}
+		}
+		catch (RecognitionException re) {
+			_localctx.exception = re;
+			_errHandler.reportError(this, re);
+			_errHandler.recover(this, re);
+		}
+		finally {
+			exitRule();
+		}
+		return _localctx;
+	}
+
+	public static class ElementOptionsContext extends ParserRuleContext {
+		public TerminalNode LT() { return getToken(ANTLRv4Parser.LT, 0); }
+		public List<ElementOptionContext> elementOption() {
+			return getRuleContexts(ElementOptionContext.class);
+		}
+		public ElementOptionContext elementOption(int i) {
+			return getRuleContext(ElementOptionContext.class,i);
+		}
+		public TerminalNode GT() { return getToken(ANTLRv4Parser.GT, 0); }
+		public List<TerminalNode> COMMA() { return getTokens(ANTLRv4Parser.COMMA); }
+		public TerminalNode COMMA(int i) {
+			return getToken(ANTLRv4Parser.COMMA, i);
+		}
+		public ElementOptionsContext(ParserRuleContext parent, int invokingState) {
+			super(parent, invokingState);
+		}
+		@Override public int getRuleIndex() { return RULE_elementOptions; }
+		@Override
+		public void enterRule(ParseTreeListener listener) {
+			if ( listener instanceof ANTLRv4ParserListener ) ((ANTLRv4ParserListener)listener).enterElementOptions(this);
+		}
+		@Override
+		public void exitRule(ParseTreeListener listener) {
+			if ( listener instanceof ANTLRv4ParserListener ) ((ANTLRv4ParserListener)listener).exitElementOptions(this);
+		}
+	}
+
+	public final ElementOptionsContext elementOptions() throws RecognitionException {
+		ElementOptionsContext _localctx = new ElementOptionsContext(_ctx, getState());
+		enterRule(_localctx, 122, RULE_elementOptions);
+		int _la;
+		try {
+			enterOuterAlt(_localctx, 1);
+			{
+			setState(606);
+			match(LT);
+			setState(607);
+			elementOption();
+			setState(612);
+			_errHandler.sync(this);
+			_la = _input.LA(1);
+			while (_la==COMMA) {
+				{
+				{
+				setState(608);
+				match(COMMA);
+				setState(609);
+				elementOption();
+				}
+				}
+				setState(614);
+				_errHandler.sync(this);
+				_la = _input.LA(1);
+			}
+			setState(615);
+			match(GT);
+			}
+		}
+		catch (RecognitionException re) {
+			_localctx.exception = re;
+			_errHandler.reportError(this, re);
+			_errHandler.recover(this, re);
+		}
+		finally {
+			exitRule();
+		}
+		return _localctx;
+	}
+
+	public static class ElementOptionContext extends ParserRuleContext {
+		public List<IdentifierContext> identifier() {
+			return getRuleContexts(IdentifierContext.class);
+		}
+		public IdentifierContext identifier(int i) {
+			return getRuleContext(IdentifierContext.class,i);
+		}
+		public TerminalNode ASSIGN() { return getToken(ANTLRv4Parser.ASSIGN, 0); }
+		public TerminalNode STRING_LITERAL() { return getToken(ANTLRv4Parser.STRING_LITERAL, 0); }
+		public ElementOptionContext(ParserRuleContext parent, int invokingState) {
+			super(parent, invokingState);
+		}
+		@Override public int getRuleIndex() { return RULE_elementOption; }
+		@Override
+		public void enterRule(ParseTreeListener listener) {
+			if ( listener instanceof ANTLRv4ParserListener ) ((ANTLRv4ParserListener)listener).enterElementOption(this);
+		}
+		@Override
+		public void exitRule(ParseTreeListener listener) {
+			if ( listener instanceof ANTLRv4ParserListener ) ((ANTLRv4ParserListener)listener).exitElementOption(this);
+		}
+	}
+
+	public final ElementOptionContext elementOption() throws RecognitionException {
+		ElementOptionContext _localctx = new ElementOptionContext(_ctx, getState());
+		enterRule(_localctx, 124, RULE_elementOption);
+		try {
+			setState(624);
+			_errHandler.sync(this);
+			switch ( getInterpreter().adaptivePredict(_input,83,_ctx) ) {
+			case 1:
+				enterOuterAlt(_localctx, 1);
+				{
+				setState(617);
+				identifier();
+				}
+				break;
+			case 2:
+				enterOuterAlt(_localctx, 2);
+				{
+				setState(618);
+				identifier();
+				setState(619);
+				match(ASSIGN);
+				setState(622);
+				_errHandler.sync(this);
+				switch (_input.LA(1)) {
+				case TOKEN_REF:
+				case RULE_REF:
+					{
+					setState(620);
+					identifier();
+					}
+					break;
+				case STRING_LITERAL:
+					{
+					setState(621);
+					match(STRING_LITERAL);
+					}
+					break;
+				default:
+					throw new NoViableAltException(this);
+				}
+				}
+				break;
+			}
+		}
+		catch (RecognitionException re) {
+			_localctx.exception = re;
+			_errHandler.reportError(this, re);
+			_errHandler.recover(this, re);
+		}
+		finally {
+			exitRule();
+		}
+		return _localctx;
+	}
+
+	public static class IdentifierContext extends ParserRuleContext {
+		public TerminalNode RULE_REF() { return getToken(ANTLRv4Parser.RULE_REF, 0); }
+		public TerminalNode TOKEN_REF() { return getToken(ANTLRv4Parser.TOKEN_REF, 0); }
+		public IdentifierContext(ParserRuleContext parent, int invokingState) {
+			super(parent, invokingState);
+		}
+		@Override public int getRuleIndex() { return RULE_identifier; }
+		@Override
+		public void enterRule(ParseTreeListener listener) {
+			if ( listener instanceof ANTLRv4ParserListener ) ((ANTLRv4ParserListener)listener).enterIdentifier(this);
+		}
+		@Override
+		public void exitRule(ParseTreeListener listener) {
+			if ( listener instanceof ANTLRv4ParserListener ) ((ANTLRv4ParserListener)listener).exitIdentifier(this);
+		}
+	}
+
+	public final IdentifierContext identifier() throws RecognitionException {
+		IdentifierContext _localctx = new IdentifierContext(_ctx, getState());
+		enterRule(_localctx, 126, RULE_identifier);
+		int _la;
+		try {
+			enterOuterAlt(_localctx, 1);
+			{
+			setState(626);
+			_la = _input.LA(1);
+			if ( !(_la==TOKEN_REF || _la==RULE_REF) ) {
+			_errHandler.recoverInline(this);
+			}
+			else {
+				if ( _input.LA(1)==Token.EOF ) matchedEOF = true;
+				_errHandler.reportMatch(this);
+				consume();
+			}
+			}
+		}
+		catch (RecognitionException re) {
+			_localctx.exception = re;
+			_errHandler.reportError(this, re);
+			_errHandler.recover(this, re);
+		}
+		finally {
+			exitRule();
+		}
+		return _localctx;
+	}
+
+	public static final String _serializedATN =
+		"\3\u608b\ua72a\u8133\ub9ed\u417c\u3be7\u7786\u5964\3?\u0277\4\2\t\2\4"+
+		"\3\t\3\4\4\t\4\4\5\t\5\4\6\t\6\4\7\t\7\4\b\t\b\4\t\t\t\4\n\t\n\4\13\t"+
+		"\13\4\f\t\f\4\r\t\r\4\16\t\16\4\17\t\17\4\20\t\20\4\21\t\21\4\22\t\22"+
+		"\4\23\t\23\4\24\t\24\4\25\t\25\4\26\t\26\4\27\t\27\4\30\t\30\4\31\t\31"+
+		"\4\32\t\32\4\33\t\33\4\34\t\34\4\35\t\35\4\36\t\36\4\37\t\37\4 \t \4!"+
+		"\t!\4\"\t\"\4#\t#\4$\t$\4%\t%\4&\t&\4\'\t\'\4(\t(\4)\t)\4*\t*\4+\t+\4"+
+		",\t,\4-\t-\4.\t.\4/\t/\4\60\t\60\4\61\t\61\4\62\t\62\4\63\t\63\4\64\t"+
+		"\64\4\65\t\65\4\66\t\66\4\67\t\67\48\t8\49\t9\4:\t:\4;\t;\4<\t<\4=\t="+
+		"\4>\t>\4?\t?\4@\t@\4A\tA\3\2\3\2\7\2\u0085\n\2\f\2\16\2\u0088\13\2\3\2"+
+		"\3\2\7\2\u008c\n\2\f\2\16\2\u008f\13\2\3\2\3\2\3\3\3\3\3\3\3\3\3\4\3\4"+
+		"\3\4\3\4\3\4\5\4\u009c\n\4\3\5\3\5\3\5\3\5\3\5\5\5\u00a3\n\5\3\6\3\6\3"+
+		"\6\3\6\7\6\u00a9\n\6\f\6\16\6\u00ac\13\6\3\6\3\6\3\7\3\7\3\7\3\7\3\b\3"+
+		"\b\3\b\7\b\u00b7\n\b\f\b\16\b\u00ba\13\b\3\b\3\b\3\b\5\b\u00bf\n\b\3\t"+
+		"\3\t\3\t\3\t\7\t\u00c5\n\t\f\t\16\t\u00c8\13\t\3\t\3\t\3\n\3\n\3\n\3\n"+
+		"\3\n\5\n\u00d1\n\n\3\13\3\13\5\13\u00d5\n\13\3\13\3\13\3\f\3\f\5\f\u00db"+
+		"\n\f\3\f\3\f\3\r\3\r\3\r\7\r\u00e2\n\r\f\r\16\r\u00e5\13\r\3\r\5\r\u00e8"+
+		"\n\r\3\16\3\16\3\16\3\16\5\16\u00ee\n\16\3\16\3\16\3\16\3\17\3\17\3\17"+
+		"\5\17\u00f6\n\17\3\20\3\20\7\20\u00fa\n\20\f\20\16\20\u00fd\13\20\3\20"+
+		"\3\20\3\21\3\21\7\21\u0103\n\21\f\21\16\21\u0106\13\21\3\21\3\21\3\22"+
+		"\3\22\3\22\3\22\7\22\u010e\n\22\f\22\16\22\u0111\13\22\3\23\7\23\u0114"+
+		"\n\23\f\23\16\23\u0117\13\23\3\24\3\24\5\24\u011b\n\24\3\25\5\25\u011e"+
+		"\n\25\3\25\3\25\5\25\u0122\n\25\3\25\5\25\u0125\n\25\3\25\5\25\u0128\n"+
+		"\25\3\25\5\25\u012b\n\25\3\25\7\25\u012e\n\25\f\25\16\25\u0131\13\25\3"+
+		"\25\3\25\3\25\3\25\3\25\3\26\7\26\u0139\n\26\f\26\16\26\u013c\13\26\3"+
+		"\26\5\26\u013f\n\26\3\27\3\27\3\27\3\27\3\30\3\30\3\30\3\31\3\31\5\31"+
+		"\u014a\n\31\3\32\3\32\3\32\3\33\3\33\3\33\3\33\7\33\u0153\n\33\f\33\16"+
+		"\33\u0156\13\33\3\34\3\34\3\34\3\35\3\35\3\35\3\35\3\36\6\36\u0160\n\36"+
+		"\r\36\16\36\u0161\3\37\3\37\3 \3 \3!\3!\3!\7!\u016b\n!\f!\16!\u016e\13"+
+		"!\3\"\3\"\3\"\5\"\u0173\n\"\3#\5#\u0176\n#\3#\3#\5#\u017a\n#\3#\3#\3#"+
+		"\3#\3$\3$\3%\3%\3%\7%\u0185\n%\f%\16%\u0188\13%\3&\3&\5&\u018c\n&\3&\5"+
+		"&\u018f\n&\3\'\6\'\u0192\n\'\r\'\16\'\u0193\3\'\5\'\u0197\n\'\3(\3(\5"+
+		"(\u019b\n(\3(\3(\5(\u019f\n(\3(\3(\5(\u01a3\n(\3(\3(\5(\u01a7\n(\5(\u01a9"+
+		"\n(\3)\3)\3)\3)\5)\u01af\n)\3*\3*\3*\3*\3+\3+\3+\3+\7+\u01b9\n+\f+\16"+
+		"+\u01bc\13+\3,\3,\3,\3,\3,\3,\5,\u01c4\n,\3-\3-\5-\u01c8\n-\3.\3.\5.\u01cc"+
+		"\n.\3/\3/\3/\7/\u01d1\n/\f/\16/\u01d4\13/\3\60\5\60\u01d7\n\60\3\60\6"+
+		"\60\u01da\n\60\r\60\16\60\u01db\3\60\5\60\u01df\n\60\3\61\3\61\3\61\5"+
+		"\61\u01e4\n\61\3\61\3\61\3\61\5\61\u01e9\n\61\3\61\3\61\3\61\5\61\u01ee"+
+		"\n\61\5\61\u01f0\n\61\3\62\3\62\3\62\3\62\5\62\u01f6\n\62\3\63\3\63\5"+
+		"\63\u01fa\n\63\3\64\3\64\3\65\3\65\5\65\u0200\n\65\3\65\3\65\5\65\u0204"+
+		"\n\65\3\65\3\65\5\65\u0208\n\65\5\65\u020a\n\65\3\66\3\66\3\66\3\66\3"+
+		"\66\3\66\5\66\u0212\n\66\5\66\u0214\n\66\3\67\3\67\3\67\3\67\3\67\5\67"+
+		"\u021b\n\67\5\67\u021d\n\67\38\38\38\38\58\u0223\n8\39\39\39\39\79\u0229"+
+		"\n9\f9\169\u022c\139\39\39\3:\3:\5:\u0232\n:\3:\3:\5:\u0236\n:\3:\3:\5"+
+		":\u023a\n:\3;\3;\5;\u023e\n;\3;\7;\u0241\n;\f;\16;\u0244\13;\3;\5;\u0247"+
+		"\n;\3;\3;\3;\3<\3<\5<\u024e\n<\3<\5<\u0251\n<\3=\3=\3=\3=\3>\3>\5>\u0259"+
+		"\n>\3>\3>\5>\u025d\n>\5>\u025f\n>\3?\3?\3?\3?\7?\u0265\n?\f?\16?\u0268"+
+		"\13?\3?\3?\3@\3@\3@\3@\3@\5@\u0271\n@\5@\u0273\n@\3A\3A\3A\2\2B\2\4\6"+
+		"\b\n\f\16\20\22\24\26\30\32\34\36 \"$&(*,.\60\62\64\668:<>@BDFHJLNPRT"+
+		"VXZ\\^`bdfhjlnprtvxz|~\u0080\2\5\4\2\22\22\26\30\4\2**--\3\2\3\4\2\u029d"+
+		"\2\u0082\3\2\2\2\4\u0092\3\2\2\2\6\u009b\3\2\2\2\b\u00a2\3\2\2\2\n\u00a4"+
+		"\3\2\2\2\f\u00af\3\2\2\2\16\u00be\3\2\2\2\20\u00c0\3\2\2\2\22\u00d0\3"+
+		"\2\2\2\24\u00d2\3\2\2\2\26\u00d8\3\2\2\2\30\u00de\3\2\2\2\32\u00e9\3\2"+
+		"\2\2\34\u00f5\3\2\2\2\36\u00f7\3\2\2\2 \u0100\3\2\2\2\"\u0109\3\2\2\2"+
+		"$\u0115\3\2\2\2&\u011a\3\2\2\2(\u011d\3\2\2\2*\u013a\3\2\2\2,\u0140\3"+
+		"\2\2\2.\u0144\3\2\2\2\60\u0149\3\2\2\2\62\u014b\3\2\2\2\64\u014e\3\2\2"+
+		"\2\66\u0157\3\2\2\28\u015a\3\2\2\2:\u015f\3\2\2\2<\u0163\3\2\2\2>\u0165"+
+		"\3\2\2\2@\u0167\3\2\2\2B\u016f\3\2\2\2D\u0175\3\2\2\2F\u017f\3\2\2\2H"+
+		"\u0181\3\2\2\2J\u018e\3\2\2\2L\u0196\3\2\2\2N\u01a8\3\2\2\2P\u01aa\3\2"+
+		"\2\2R\u01b0\3\2\2\2T\u01b4\3\2\2\2V\u01c3\3\2\2\2X\u01c7\3\2\2\2Z\u01cb"+
+		"\3\2\2\2\\\u01cd\3\2\2\2^\u01de\3\2\2\2`\u01ef\3\2\2\2b\u01f1\3\2\2\2"+
+		"d\u01f7\3\2\2\2f\u01fb\3\2\2\2h\u0209\3\2\2\2j\u0213\3\2\2\2l\u021c\3"+
+		"\2\2\2n\u0222\3\2\2\2p\u0224\3\2\2\2r\u0239\3\2\2\2t\u023b\3\2\2\2v\u024b"+
+		"\3\2\2\2x\u0252\3\2\2\2z\u025e\3\2\2\2|\u0260\3\2\2\2~\u0272\3\2\2\2\u0080"+
+		"\u0274\3\2\2\2\u0082\u0086\5\4\3\2\u0083\u0085\5\b\5\2\u0084\u0083\3\2"+
+		"\2\2\u0085\u0088\3\2\2\2\u0086\u0084\3\2\2\2\u0086\u0087\3\2\2\2\u0087"+
+		"\u0089\3\2\2\2\u0088\u0086\3\2\2\2\u0089\u008d\5$\23\2\u008a\u008c\5\""+
+		"\22\2\u008b\u008a\3\2\2\2\u008c\u008f\3\2\2\2\u008d\u008b\3\2\2\2\u008d"+
+		"\u008e\3\2\2\2\u008e\u0090\3\2\2\2\u008f\u008d\3\2\2\2\u0090\u0091\7\2"+
+		"\2\3\u0091\3\3\2\2\2\u0092\u0093\5\6\4\2\u0093\u0094\5\u0080A\2\u0094"+
+		"\u0095\7\"\2\2\u0095\5\3\2\2\2\u0096\u0097\7\23\2\2\u0097\u009c\7\25\2"+
+		"\2\u0098\u0099\7\24\2\2\u0099\u009c\7\25\2\2\u009a\u009c\7\25\2\2\u009b"+
+		"\u0096\3\2\2\2\u009b\u0098\3\2\2\2\u009b\u009a\3\2\2\2\u009c\7\3\2\2\2"+
+		"\u009d\u00a3\5\n\6\2\u009e\u00a3\5\20\t\2\u009f\u00a3\5\24\13\2\u00a0"+
+		"\u00a3\5\26\f\2\u00a1\u00a3\5\32\16\2\u00a2\u009d\3\2\2\2\u00a2\u009e"+
+		"\3\2\2\2\u00a2\u009f\3\2\2\2\u00a2\u00a0\3\2\2\2\u00a2\u00a1\3\2\2\2\u00a3"+
+		"\t\3\2\2\2\u00a4\u00aa\7\16\2\2\u00a5\u00a6\5\f\7\2\u00a6\u00a7\7\"\2"+
+		"\2\u00a7\u00a9\3\2\2\2\u00a8\u00a5\3\2\2\2\u00a9\u00ac\3\2\2\2\u00aa\u00a8"+
+		"\3\2\2\2\u00aa\u00ab\3\2\2\2\u00ab\u00ad\3\2\2\2\u00ac\u00aa\3\2\2\2\u00ad"+
+		"\u00ae\7&\2\2\u00ae\13\3\2\2\2\u00af\u00b0\5\u0080A\2\u00b0\u00b1\7*\2"+
+		"\2\u00b1\u00b2\5\16\b\2\u00b2\r\3\2\2\2\u00b3\u00b8\5\u0080A\2\u00b4\u00b5"+
+		"\7\62\2\2\u00b5\u00b7\5\u0080A\2\u00b6\u00b4\3\2\2\2\u00b7\u00ba\3\2\2"+
+		"\2\u00b8\u00b6\3\2\2\2\u00b8\u00b9\3\2\2\2\u00b9\u00bf\3\2\2\2\u00ba\u00b8"+
+		"\3\2\2\2\u00bb\u00bf\7\n\2\2\u00bc\u00bf\5\36\20\2\u00bd\u00bf\7\t\2\2"+
+		"\u00be\u00b3\3\2\2\2\u00be\u00bb\3\2\2\2\u00be\u00bc\3\2\2\2\u00be\u00bd"+
+		"\3\2\2\2\u00bf\17\3\2\2\2\u00c0\u00c1\7\21\2\2\u00c1\u00c6\5\22\n\2\u00c2"+
+		"\u00c3\7!\2\2\u00c3\u00c5\5\22\n\2\u00c4\u00c2\3\2\2\2\u00c5\u00c8\3\2"+
+		"\2\2\u00c6\u00c4\3\2\2\2\u00c6\u00c7\3\2\2\2\u00c7\u00c9\3\2\2\2\u00c8"+
+		"\u00c6\3\2\2\2\u00c9\u00ca\7\"\2\2\u00ca\21\3\2\2\2\u00cb\u00cc\5\u0080"+
+		"A\2\u00cc\u00cd\7*\2\2\u00cd\u00ce\5\u0080A\2\u00ce\u00d1\3\2\2\2\u00cf"+
+		"\u00d1\5\u0080A\2\u00d0\u00cb\3\2\2\2\u00d0\u00cf\3\2\2\2\u00d1\23\3\2"+
+		"\2\2\u00d2\u00d4\7\17\2\2\u00d3\u00d5\5\30\r\2\u00d4\u00d3\3\2\2\2\u00d4"+
+		"\u00d5\3\2\2\2\u00d5\u00d6\3\2\2\2\u00d6\u00d7\7&\2\2\u00d7\25\3\2\2\2"+
+		"\u00d8\u00da\7\20\2\2\u00d9\u00db\5\30\r\2\u00da\u00d9\3\2\2\2\u00da\u00db"+
+		"\3\2\2\2\u00db\u00dc\3\2\2\2\u00dc\u00dd\7&\2\2\u00dd\27\3\2\2\2\u00de"+
+		"\u00e3\5\u0080A\2\u00df\u00e0\7!\2\2\u00e0\u00e2\5\u0080A\2\u00e1\u00df"+
+		"\3\2\2\2\u00e2\u00e5\3\2\2\2\u00e3\u00e1\3\2\2\2\u00e3\u00e4\3\2\2\2\u00e4"+
+		"\u00e7\3\2\2\2\u00e5\u00e3\3\2\2\2\u00e6\u00e8\7!\2\2\u00e7\u00e6\3\2"+
+		"\2\2\u00e7\u00e8\3\2\2\2\u00e8\31\3\2\2\2\u00e9\u00ed\7\63\2\2\u00ea\u00eb"+
+		"\5\34\17\2\u00eb\u00ec\7 \2\2\u00ec\u00ee\3\2\2\2\u00ed\u00ea\3\2\2\2"+
+		"\u00ed\u00ee\3\2\2\2\u00ee\u00ef\3\2\2\2\u00ef\u00f0\5\u0080A\2\u00f0"+
+		"\u00f1\5\36\20\2\u00f1\33\3\2\2\2\u00f2\u00f6\5\u0080A\2\u00f3\u00f6\7"+
+		"\23\2\2\u00f4\u00f6\7\24\2\2\u00f5\u00f2\3\2\2\2\u00f5\u00f3\3\2\2\2\u00f5"+
+		"\u00f4\3\2\2\2\u00f6\35\3\2\2\2\u00f7\u00fb\7\r\2\2\u00f8\u00fa\7>\2\2"+
+		"\u00f9\u00f8\3\2\2\2\u00fa\u00fd\3\2\2\2\u00fb\u00f9\3\2\2\2\u00fb\u00fc"+
+		"\3\2\2\2\u00fc\u00fe\3\2\2\2\u00fd\u00fb\3\2\2\2\u00fe\u00ff\7<\2\2\u00ff"+
+		"\37\3\2\2\2\u0100\u0104\7\f\2\2\u0101\u0103\7;\2\2\u0102\u0101\3\2\2\2"+
+		"\u0103\u0106\3\2\2\2\u0104\u0102\3\2\2\2\u0104\u0105\3\2\2\2\u0105\u0107"+
+		"\3\2\2\2\u0106\u0104\3\2\2\2\u0107\u0108\79\2\2\u0108!\3\2\2\2\u0109\u010a"+
+		"\7\36\2\2\u010a\u010b\5\u0080A\2\u010b\u010f\7\"\2\2\u010c\u010e\5D#\2"+
+		"\u010d\u010c\3\2\2\2\u010e\u0111\3\2\2\2\u010f\u010d\3\2\2\2\u010f\u0110"+
+		"\3\2\2\2\u0110#\3\2\2\2\u0111\u010f\3\2\2\2\u0112\u0114\5&\24\2\u0113"+
+		"\u0112\3\2\2\2\u0114\u0117\3\2\2\2\u0115\u0113\3\2\2\2\u0115\u0116\3\2"+
+		"\2\2\u0116%\3\2\2\2\u0117\u0115\3\2\2\2\u0118\u011b\5(\25\2\u0119\u011b"+
+		"\5D#\2\u011a\u0118\3\2\2\2\u011a\u0119\3\2\2\2\u011b\'\3\2\2\2\u011c\u011e"+
+		"\5:\36\2\u011d\u011c\3\2\2\2\u011d\u011e\3\2\2\2\u011e\u011f\3\2\2\2\u011f"+
+		"\u0121\7\4\2\2\u0120\u0122\5 \21\2\u0121\u0120\3\2\2\2\u0121\u0122\3\2"+
+		"\2\2\u0122\u0124\3\2\2\2\u0123\u0125\5\62\32\2\u0124\u0123\3\2\2\2\u0124"+
+		"\u0125\3\2\2\2\u0125\u0127\3\2\2\2\u0126\u0128\5\64\33\2\u0127\u0126\3"+
+		"\2\2\2\u0127\u0128\3\2\2\2\u0128\u012a\3\2\2\2\u0129\u012b\5\66\34\2\u012a"+
+		"\u0129\3\2\2\2\u012a\u012b\3\2\2\2\u012b\u012f\3\2\2\2\u012c\u012e\5\60"+
+		"\31\2\u012d\u012c\3\2\2\2\u012e\u0131\3\2\2\2\u012f\u012d\3\2\2\2\u012f"+
+		"\u0130\3\2\2\2\u0130\u0132\3\2\2\2\u0131\u012f\3\2\2\2\u0132\u0133\7\37"+
+		"\2\2\u0133\u0134\5> \2\u0134\u0135\7\"\2\2\u0135\u0136\5*\26\2\u0136)"+
+		"\3\2\2\2\u0137\u0139\5,\27\2\u0138\u0137\3\2\2\2\u0139\u013c\3\2\2\2\u013a"+
+		"\u0138\3\2\2\2\u013a\u013b\3\2\2\2\u013b\u013e\3\2\2\2\u013c\u013a\3\2"+
+		"\2\2\u013d\u013f\5.\30\2\u013e\u013d\3\2\2\2\u013e\u013f\3\2\2\2\u013f"+
+		"+\3\2\2\2\u0140\u0141\7\34\2\2\u0141\u0142\5 \21\2\u0142\u0143\5\36\20"+
+		"\2\u0143-\3\2\2\2\u0144\u0145\7\35\2\2\u0145\u0146\5\36\20\2\u0146/\3"+
+		"\2\2\2\u0147\u014a\5\n\6\2\u0148\u014a\58\35\2\u0149\u0147\3\2\2\2\u0149"+
+		"\u0148\3\2\2\2\u014a\61\3\2\2\2\u014b\u014c\7\31\2\2\u014c\u014d\5 \21"+
+		"\2\u014d\63\3\2\2\2\u014e\u014f\7\33\2\2\u014f\u0154\5\u0080A\2\u0150"+
+		"\u0151\7!\2\2\u0151\u0153\5\u0080A\2\u0152\u0150\3\2\2\2\u0153\u0156\3"+
+		"\2\2\2\u0154\u0152\3\2\2\2\u0154\u0155\3\2\2\2\u0155\65\3\2\2\2\u0156"+
+		"\u0154\3\2\2\2\u0157\u0158\7\32\2\2\u0158\u0159\5 \21\2\u0159\67\3\2\2"+
+		"\2\u015a\u015b\7\63\2\2\u015b\u015c\5\u0080A\2\u015c\u015d\5\36\20\2\u015d"+
+		"9\3\2\2\2\u015e\u0160\5<\37\2\u015f\u015e\3\2\2\2\u0160\u0161\3\2\2\2"+
+		"\u0161\u015f\3\2\2\2\u0161\u0162\3\2\2\2\u0162;\3\2\2\2\u0163\u0164\t"+
+		"\2\2\2\u0164=\3\2\2\2\u0165\u0166\5@!\2\u0166?\3\2\2\2\u0167\u016c\5B"+
+		"\"\2\u0168\u0169\7/\2\2\u0169\u016b\5B\"\2\u016a\u0168\3\2\2\2\u016b\u016e"+
+		"\3\2\2\2\u016c\u016a\3\2\2\2\u016c\u016d\3\2\2\2\u016dA\3\2\2\2\u016e"+
+		"\u016c\3\2\2\2\u016f\u0172\5^\60\2\u0170\u0171\7\64\2\2\u0171\u0173\5"+
+		"\u0080A\2\u0172\u0170\3\2\2\2\u0172\u0173\3\2\2\2\u0173C\3\2\2\2\u0174"+
+		"\u0176\7\22\2\2\u0175\u0174\3\2\2\2\u0175\u0176\3\2\2\2\u0176\u0177\3"+
+		"\2\2\2\u0177\u0179\7\3\2\2\u0178\u017a\5\n\6\2\u0179\u0178\3\2\2\2\u0179"+
+		"\u017a\3\2\2\2\u017a\u017b\3\2\2\2\u017b\u017c\7\37\2\2\u017c\u017d\5"+
+		"F$\2\u017d\u017e\7\"\2\2\u017eE\3\2\2\2\u017f\u0180\5H%\2\u0180G\3\2\2"+
+		"\2\u0181\u0186\5J&\2\u0182\u0183\7/\2\2\u0183\u0185\5J&\2\u0184\u0182"+
+		"\3\2\2\2\u0185\u0188\3\2\2\2\u0186\u0184\3\2\2\2\u0186\u0187\3\2\2\2\u0187"+
+		"I\3\2\2\2\u0188\u0186\3\2\2\2\u0189\u018b\5L\'\2\u018a\u018c\5T+\2\u018b"+
+		"\u018a\3\2\2\2\u018b\u018c\3\2\2\2\u018c\u018f\3\2\2\2\u018d\u018f\3\2"+
+		"\2\2\u018e\u0189\3\2\2\2\u018e\u018d\3\2\2\2\u018fK\3\2\2\2\u0190\u0192"+
+		"\5N(\2\u0191\u0190\3\2\2\2\u0192\u0193\3\2\2\2\u0193\u0191\3\2\2\2\u0193"+
+		"\u0194\3\2\2\2\u0194\u0197\3\2\2\2\u0195\u0197\3\2\2\2\u0196\u0191\3\2"+
+		"\2\2\u0196\u0195\3\2\2\2\u0197M\3\2\2\2\u0198\u019a\5P)\2\u0199\u019b"+
+		"\5h\65\2\u019a\u0199\3\2\2\2\u019a\u019b\3\2\2\2\u019b\u01a9\3\2\2\2\u019c"+
+		"\u019e\5j\66\2\u019d\u019f\5h\65\2\u019e\u019d\3\2\2\2\u019e\u019f\3\2"+
+		"\2\2\u019f\u01a9\3\2\2\2\u01a0\u01a2\5R*\2\u01a1\u01a3\5h\65\2\u01a2\u01a1"+
+		"\3\2\2\2\u01a2\u01a3\3\2\2\2\u01a3\u01a9\3\2\2\2\u01a4\u01a6\5\36\20\2"+
+		"\u01a5\u01a7\7+\2\2\u01a6\u01a5\3\2\2\2\u01a6\u01a7\3\2\2\2\u01a7\u01a9"+
+		"\3\2\2\2\u01a8\u0198\3\2\2\2\u01a8\u019c\3\2\2\2\u01a8\u01a0\3\2\2\2\u01a8"+
+		"\u01a4\3\2\2\2\u01a9O\3\2\2\2\u01aa\u01ab\5\u0080A\2\u01ab\u01ae\t\3\2"+
+		"\2\u01ac\u01af\5j\66\2\u01ad\u01af\5R*\2\u01ae\u01ac\3\2\2\2\u01ae\u01ad"+
+		"\3\2\2\2\u01afQ\3\2\2\2\u01b0\u01b1\7#\2\2\u01b1\u01b2\5H%\2\u01b2\u01b3"+
+		"\7$\2\2\u01b3S\3\2\2\2\u01b4\u01b5\7\'\2\2\u01b5\u01ba\5V,\2\u01b6\u01b7"+
+		"\7!\2\2\u01b7\u01b9\5V,\2\u01b8\u01b6\3\2\2\2\u01b9\u01bc\3\2\2\2\u01ba"+
+		"\u01b8\3\2\2\2\u01ba\u01bb\3\2\2\2\u01bbU\3\2\2\2\u01bc\u01ba\3\2\2\2"+
+		"\u01bd\u01be\5X-\2\u01be\u01bf\7#\2\2\u01bf\u01c0\5Z.\2\u01c0\u01c1\7"+
+		"$\2\2\u01c1\u01c4\3\2\2\2\u01c2\u01c4\5X-\2\u01c3\u01bd\3\2\2\2\u01c3"+
+		"\u01c2\3\2\2\2\u01c4W\3\2\2\2\u01c5\u01c8\5\u0080A\2\u01c6\u01c8\7\36"+
+		"\2\2\u01c7\u01c5\3\2\2\2\u01c7\u01c6\3\2\2\2\u01c8Y\3\2\2\2\u01c9\u01cc"+
+		"\5\u0080A\2\u01ca\u01cc\7\t\2\2\u01cb\u01c9\3\2\2\2\u01cb\u01ca\3\2\2"+
+		"\2\u01cc[\3\2\2\2\u01cd\u01d2\5^\60\2\u01ce\u01cf\7/\2\2\u01cf\u01d1\5"+
+		"^\60\2\u01d0\u01ce\3\2\2\2\u01d1\u01d4\3\2\2\2\u01d2\u01d0\3\2\2\2\u01d2"+
+		"\u01d3\3\2\2\2\u01d3]\3\2\2\2\u01d4\u01d2\3\2\2\2\u01d5\u01d7\5|?\2\u01d6"+
+		"\u01d5\3\2\2\2\u01d6\u01d7\3\2\2\2\u01d7\u01d9\3\2\2\2\u01d8\u01da\5`"+
+		"\61\2\u01d9\u01d8\3\2\2\2\u01da\u01db\3\2\2\2\u01db\u01d9\3\2\2\2\u01db"+
+		"\u01dc\3\2\2\2\u01dc\u01df\3\2\2\2\u01dd\u01df\3\2\2\2\u01de\u01d6\3\2"+
+		"\2\2\u01de\u01dd\3\2\2\2\u01df_\3\2\2\2\u01e0\u01e3\5b\62\2\u01e1\u01e4"+
+		"\5h\65\2\u01e2\u01e4\3\2\2\2\u01e3\u01e1\3\2\2\2\u01e3\u01e2\3\2\2\2\u01e4"+
+		"\u01f0\3\2\2\2\u01e5\u01e8\5l\67\2\u01e6\u01e9\5h\65\2\u01e7\u01e9\3\2"+
+		"\2\2\u01e8\u01e6\3\2\2\2\u01e8\u01e7\3\2\2\2\u01e9\u01f0\3\2\2\2\u01ea"+
+		"\u01f0\5d\63\2\u01eb\u01ed\5\36\20\2\u01ec\u01ee\7+\2\2\u01ed\u01ec\3"+
+		"\2\2\2\u01ed\u01ee\3\2\2\2\u01ee\u01f0\3\2\2\2\u01ef\u01e0\3\2\2\2\u01ef"+
+		"\u01e5\3\2\2\2\u01ef\u01ea\3\2\2\2\u01ef\u01eb\3\2\2\2\u01f0a\3\2\2\2"+
+		"\u01f1\u01f2\5\u0080A\2\u01f2\u01f5\t\3\2\2\u01f3\u01f6\5l\67\2\u01f4"+
+		"\u01f6\5t;\2\u01f5\u01f3\3\2\2\2\u01f5\u01f4\3\2\2\2\u01f6c\3\2\2\2\u01f7"+
+		"\u01f9\5t;\2\u01f8\u01fa\5f\64\2\u01f9\u01f8\3\2\2\2\u01f9\u01fa\3\2\2"+
+		"\2\u01fae\3\2\2\2\u01fb\u01fc\5h\65\2\u01fcg\3\2\2\2\u01fd\u01ff\7+\2"+
+		"\2\u01fe\u0200\7+\2\2\u01ff\u01fe\3\2\2\2\u01ff\u0200\3\2\2\2\u0200\u020a"+
+		"\3\2\2\2\u0201\u0203\7,\2\2\u0202\u0204\7+\2\2\u0203\u0202\3\2\2\2\u0203"+
+		"\u0204\3\2\2\2\u0204\u020a\3\2\2\2\u0205\u0207\7.\2\2\u0206\u0208\7+\2"+
+		"\2\u0207\u0206\3\2\2\2\u0207\u0208\3\2\2\2\u0208\u020a\3\2\2\2\u0209\u01fd"+
+		"\3\2\2\2\u0209\u0201\3\2\2\2\u0209\u0205\3\2\2\2\u020ai\3\2\2\2\u020b"+
+		"\u0214\5x=\2\u020c\u0214\5z>\2\u020d\u0214\5n8\2\u020e\u0214\7\5\2\2\u020f"+
+		"\u0211\7\62\2\2\u0210\u0212\5|?\2\u0211\u0210\3\2\2\2\u0211\u0212\3\2"+
+		"\2\2\u0212\u0214\3\2\2\2\u0213\u020b\3\2\2\2\u0213\u020c\3\2\2\2\u0213"+
+		"\u020d\3\2\2\2\u0213\u020e\3\2\2\2\u0213\u020f\3\2\2\2\u0214k\3\2\2\2"+
+		"\u0215\u021d\5z>\2\u0216\u021d\5v<\2\u0217\u021d\5n8\2\u0218\u021a\7\62"+
+		"\2\2\u0219\u021b\5|?\2\u021a\u0219\3\2\2\2\u021a\u021b\3\2\2\2\u021b\u021d"+
+		"\3\2\2\2\u021c\u0215\3\2\2\2\u021c\u0216\3\2\2\2\u021c\u0217\3\2\2\2\u021c"+
+		"\u0218\3\2\2\2\u021dm\3\2\2\2\u021e\u021f\7\65\2\2\u021f\u0223\5r:\2\u0220"+
+		"\u0221\7\65\2\2\u0221\u0223\5p9\2\u0222\u021e\3\2\2\2\u0222\u0220\3\2"+
+		"\2\2\u0223o\3\2\2\2\u0224\u0225\7#\2\2\u0225\u022a\5r:\2\u0226\u0227\7"+
+		"/\2\2\u0227\u0229\5r:\2\u0228\u0226\3\2\2\2\u0229\u022c\3\2\2\2\u022a"+
+		"\u0228\3\2\2\2\u022a\u022b\3\2\2\2\u022b\u022d\3\2\2\2\u022c\u022a\3\2"+
+		"\2\2\u022d\u022e\7$\2\2\u022eq\3\2\2\2\u022f\u0231\7\3\2\2\u0230\u0232"+
+		"\5|?\2\u0231\u0230\3\2\2\2\u0231\u0232\3\2\2\2\u0232\u023a\3\2\2\2\u0233"+
+		"\u0235\7\n\2\2\u0234\u0236\5|?\2\u0235\u0234\3\2\2\2\u0235\u0236\3\2\2"+
+		"\2\u0236\u023a\3\2\2\2\u0237\u023a\5x=\2\u0238\u023a\7\5\2\2\u0239\u022f"+
+		"\3\2\2\2\u0239\u0233\3\2\2\2\u0239\u0237\3\2\2\2\u0239\u0238\3\2\2\2\u023a"+
+		"s\3\2\2\2\u023b\u0246\7#\2\2\u023c\u023e\5\n\6\2\u023d\u023c\3\2\2\2\u023d"+
+		"\u023e\3\2\2\2\u023e\u0242\3\2\2\2\u023f\u0241\58\35\2\u0240\u023f\3\2"+
+		"\2\2\u0241\u0244\3\2\2\2\u0242\u0240\3\2\2\2\u0242\u0243\3\2\2\2\u0243"+
+		"\u0245\3\2\2\2\u0244\u0242\3\2\2\2\u0245\u0247\7\37\2\2\u0246\u023d\3"+
+		"\2\2\2\u0246\u0247\3\2\2\2\u0247\u0248\3\2\2\2\u0248\u0249\5\\/\2\u0249"+
+		"\u024a\7$\2\2\u024au\3\2\2\2\u024b\u024d\7\4\2\2\u024c\u024e\5 \21\2\u024d"+
+		"\u024c\3\2\2\2\u024d\u024e\3\2\2\2\u024e\u0250\3\2\2\2\u024f\u0251\5|"+
+		"?\2\u0250\u024f\3\2\2\2\u0250\u0251\3\2\2\2\u0251w\3\2\2\2\u0252\u0253"+
+		"\7\n\2\2\u0253\u0254\7\61\2\2\u0254\u0255\7\n\2\2\u0255y\3\2\2\2\u0256"+
+		"\u0258\7\3\2\2\u0257\u0259\5|?\2\u0258\u0257\3\2\2\2\u0258\u0259\3\2\2"+
+		"\2\u0259\u025f\3\2\2\2\u025a\u025c\7\n\2\2\u025b\u025d\5|?\2\u025c\u025b"+
+		"\3\2\2\2\u025c\u025d\3\2\2\2\u025d\u025f\3\2\2\2\u025e\u0256\3\2\2\2\u025e"+
+		"\u025a\3\2\2\2\u025f{\3\2\2\2\u0260\u0261\7(\2\2\u0261\u0266\5~@\2\u0262"+
+		"\u0263\7!\2\2\u0263\u0265\5~@\2\u0264\u0262\3\2\2\2\u0265\u0268\3\2\2"+
+		"\2\u0266\u0264\3\2\2\2\u0266\u0267\3\2\2\2\u0267\u0269\3\2\2\2\u0268\u0266"+
+		"\3\2\2\2\u0269\u026a\7)\2\2\u026a}\3\2\2\2\u026b\u0273\5\u0080A\2\u026c"+
+		"\u026d\5\u0080A\2\u026d\u0270\7*\2\2\u026e\u0271\5\u0080A\2\u026f\u0271"+
+		"\7\n\2\2\u0270\u026e\3\2\2\2\u0270\u026f\3\2\2\2\u0271\u0273\3\2\2\2\u0272"+
+		"\u026b\3\2\2\2\u0272\u026c\3\2\2\2\u0273\177\3\2\2\2\u0274\u0275\t\4\2"+
+		"\2\u0275\u0081\3\2\2\2V\u0086\u008d\u009b\u00a2\u00aa\u00b8\u00be\u00c6"+
+		"\u00d0\u00d4\u00da\u00e3\u00e7\u00ed\u00f5\u00fb\u0104\u010f\u0115\u011a"+
+		"\u011d\u0121\u0124\u0127\u012a\u012f\u013a\u013e\u0149\u0154\u0161\u016c"+
+		"\u0172\u0175\u0179\u0186\u018b\u018e\u0193\u0196\u019a\u019e\u01a2\u01a6"+
+		"\u01a8\u01ae\u01ba\u01c3\u01c7\u01cb\u01d2\u01d6\u01db\u01de\u01e3\u01e8"+
+		"\u01ed\u01ef\u01f5\u01f9\u01ff\u0203\u0207\u0209\u0211\u0213\u021a\u021c"+
+		"\u0222\u022a\u0231\u0235\u0239\u023d\u0242\u0246\u024d\u0250\u0258\u025c"+
+		"\u025e\u0266\u0270\u0272";
+	public static final ATN _ATN =
+		new ATNDeserializer().deserialize(_serializedATN.toCharArray());
+	static {
+		_decisionToDFA = new DFA[_ATN.getNumberOfDecisions()];
+		for (int i = 0; i < _ATN.getNumberOfDecisions(); i++) {
+			_decisionToDFA[i] = new DFA(_ATN.getDecisionState(i), i);
+		}
+	}
+}
\ No newline at end of file
diff --git a/java/languages.antlr/src/org/antlr/parser/antlr4/ANTLRv4ParserBaseListener.java b/java/languages.antlr/src/org/antlr/parser/antlr4/ANTLRv4ParserBaseListener.java
new file mode 100644
index 0000000..c03504d
--- /dev/null
+++ b/java/languages.antlr/src/org/antlr/parser/antlr4/ANTLRv4ParserBaseListener.java
@@ -0,0 +1,834 @@
+// Generated from ANTLRv4Parser.g4 by ANTLR 4.7.2
+
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+// DO NOT EDIT THIS FILE MANUALLY!
+// SEE build.xml FOR INSTRUCTIONS
+
+
+package org.antlr.parser.antlr4;
+
+
+
+import org.antlr.v4.runtime.ParserRuleContext;
+import org.antlr.v4.runtime.tree.ErrorNode;
+import org.antlr.v4.runtime.tree.TerminalNode;
+
+/**
+ * This class provides an empty implementation of {@link ANTLRv4ParserListener},
+ * which can be extended to create a listener which only needs to handle a subset
+ * of the available methods.
+ */
+public class ANTLRv4ParserBaseListener implements ANTLRv4ParserListener {
+	/**
+	 * {@inheritDoc}
+	 *
+	 * <p>The default implementation does nothing.</p>
+	 */
+	@Override public void enterGrammarSpec(ANTLRv4Parser.GrammarSpecContext ctx) { }
+	/**
+	 * {@inheritDoc}
+	 *
+	 * <p>The default implementation does nothing.</p>
+	 */
+	@Override public void exitGrammarSpec(ANTLRv4Parser.GrammarSpecContext ctx) { }
+	/**
+	 * {@inheritDoc}
+	 *
+	 * <p>The default implementation does nothing.</p>
+	 */
+	@Override public void enterGrammarDecl(ANTLRv4Parser.GrammarDeclContext ctx) { }
+	/**
+	 * {@inheritDoc}
+	 *
+	 * <p>The default implementation does nothing.</p>
+	 */
+	@Override public void exitGrammarDecl(ANTLRv4Parser.GrammarDeclContext ctx) { }
+	/**
+	 * {@inheritDoc}
+	 *
+	 * <p>The default implementation does nothing.</p>
+	 */
+	@Override public void enterGrammarType(ANTLRv4Parser.GrammarTypeContext ctx) { }
+	/**
+	 * {@inheritDoc}
+	 *
+	 * <p>The default implementation does nothing.</p>
+	 */
+	@Override public void exitGrammarType(ANTLRv4Parser.GrammarTypeContext ctx) { }
+	/**
+	 * {@inheritDoc}
+	 *
+	 * <p>The default implementation does nothing.</p>
+	 */
+	@Override public void enterPrequelConstruct(ANTLRv4Parser.PrequelConstructContext ctx) { }
+	/**
+	 * {@inheritDoc}
+	 *
+	 * <p>The default implementation does nothing.</p>
+	 */
+	@Override public void exitPrequelConstruct(ANTLRv4Parser.PrequelConstructContext ctx) { }
+	/**
+	 * {@inheritDoc}
+	 *
+	 * <p>The default implementation does nothing.</p>
+	 */
+	@Override public void enterOptionsSpec(ANTLRv4Parser.OptionsSpecContext ctx) { }
+	/**
+	 * {@inheritDoc}
+	 *
+	 * <p>The default implementation does nothing.</p>
+	 */
+	@Override public void exitOptionsSpec(ANTLRv4Parser.OptionsSpecContext ctx) { }
+	/**
+	 * {@inheritDoc}
+	 *
+	 * <p>The default implementation does nothing.</p>
+	 */
+	@Override public void enterOption(ANTLRv4Parser.OptionContext ctx) { }
+	/**
+	 * {@inheritDoc}
+	 *
+	 * <p>The default implementation does nothing.</p>
+	 */
+	@Override public void exitOption(ANTLRv4Parser.OptionContext ctx) { }
+	/**
+	 * {@inheritDoc}
+	 *
+	 * <p>The default implementation does nothing.</p>
+	 */
+	@Override public void enterOptionValue(ANTLRv4Parser.OptionValueContext ctx) { }
+	/**
+	 * {@inheritDoc}
+	 *
+	 * <p>The default implementation does nothing.</p>
+	 */
+	@Override public void exitOptionValue(ANTLRv4Parser.OptionValueContext ctx) { }
+	/**
+	 * {@inheritDoc}
+	 *
+	 * <p>The default implementation does nothing.</p>
+	 */
+	@Override public void enterDelegateGrammars(ANTLRv4Parser.DelegateGrammarsContext ctx) { }
+	/**
+	 * {@inheritDoc}
+	 *
+	 * <p>The default implementation does nothing.</p>
+	 */
+	@Override public void exitDelegateGrammars(ANTLRv4Parser.DelegateGrammarsContext ctx) { }
+	/**
+	 * {@inheritDoc}
+	 *
+	 * <p>The default implementation does nothing.</p>
+	 */
+	@Override public void enterDelegateGrammar(ANTLRv4Parser.DelegateGrammarContext ctx) { }
+	/**
+	 * {@inheritDoc}
+	 *
+	 * <p>The default implementation does nothing.</p>
+	 */
+	@Override public void exitDelegateGrammar(ANTLRv4Parser.DelegateGrammarContext ctx) { }
+	/**
+	 * {@inheritDoc}
+	 *
+	 * <p>The default implementation does nothing.</p>
+	 */
+	@Override public void enterTokensSpec(ANTLRv4Parser.TokensSpecContext ctx) { }
+	/**
+	 * {@inheritDoc}
+	 *
+	 * <p>The default implementation does nothing.</p>
+	 */
+	@Override public void exitTokensSpec(ANTLRv4Parser.TokensSpecContext ctx) { }
+	/**
+	 * {@inheritDoc}
+	 *
+	 * <p>The default implementation does nothing.</p>
+	 */
+	@Override public void enterChannelsSpec(ANTLRv4Parser.ChannelsSpecContext ctx) { }
+	/**
+	 * {@inheritDoc}
+	 *
+	 * <p>The default implementation does nothing.</p>
+	 */
+	@Override public void exitChannelsSpec(ANTLRv4Parser.ChannelsSpecContext ctx) { }
+	/**
+	 * {@inheritDoc}
+	 *
+	 * <p>The default implementation does nothing.</p>
+	 */
+	@Override public void enterIdList(ANTLRv4Parser.IdListContext ctx) { }
+	/**
+	 * {@inheritDoc}
+	 *
+	 * <p>The default implementation does nothing.</p>
+	 */
+	@Override public void exitIdList(ANTLRv4Parser.IdListContext ctx) { }
+	/**
+	 * {@inheritDoc}
+	 *
+	 * <p>The default implementation does nothing.</p>
+	 */
+	@Override public void enterAction_(ANTLRv4Parser.Action_Context ctx) { }
+	/**
+	 * {@inheritDoc}
+	 *
+	 * <p>The default implementation does nothing.</p>
+	 */
+	@Override public void exitAction_(ANTLRv4Parser.Action_Context ctx) { }
+	/**
+	 * {@inheritDoc}
+	 *
+	 * <p>The default implementation does nothing.</p>
+	 */
+	@Override public void enterActionScopeName(ANTLRv4Parser.ActionScopeNameContext ctx) { }
+	/**
+	 * {@inheritDoc}
+	 *
+	 * <p>The default implementation does nothing.</p>
+	 */
+	@Override public void exitActionScopeName(ANTLRv4Parser.ActionScopeNameContext ctx) { }
+	/**
+	 * {@inheritDoc}
+	 *
+	 * <p>The default implementation does nothing.</p>
+	 */
+	@Override public void enterActionBlock(ANTLRv4Parser.ActionBlockContext ctx) { }
+	/**
+	 * {@inheritDoc}
+	 *
+	 * <p>The default implementation does nothing.</p>
+	 */
+	@Override public void exitActionBlock(ANTLRv4Parser.ActionBlockContext ctx) { }
+	/**
+	 * {@inheritDoc}
+	 *
+	 * <p>The default implementation does nothing.</p>
+	 */
+	@Override public void enterArgActionBlock(ANTLRv4Parser.ArgActionBlockContext ctx) { }
+	/**
+	 * {@inheritDoc}
+	 *
+	 * <p>The default implementation does nothing.</p>
+	 */
+	@Override public void exitArgActionBlock(ANTLRv4Parser.ArgActionBlockContext ctx) { }
+	/**
+	 * {@inheritDoc}
+	 *
+	 * <p>The default implementation does nothing.</p>
+	 */
+	@Override public void enterModeSpec(ANTLRv4Parser.ModeSpecContext ctx) { }
+	/**
+	 * {@inheritDoc}
+	 *
+	 * <p>The default implementation does nothing.</p>
+	 */
+	@Override public void exitModeSpec(ANTLRv4Parser.ModeSpecContext ctx) { }
+	/**
+	 * {@inheritDoc}
+	 *
+	 * <p>The default implementation does nothing.</p>
+	 */
+	@Override public void enterRules(ANTLRv4Parser.RulesContext ctx) { }
+	/**
+	 * {@inheritDoc}
+	 *
+	 * <p>The default implementation does nothing.</p>
+	 */
+	@Override public void exitRules(ANTLRv4Parser.RulesContext ctx) { }
+	/**
+	 * {@inheritDoc}
+	 *
+	 * <p>The default implementation does nothing.</p>
+	 */
+	@Override public void enterRuleSpec(ANTLRv4Parser.RuleSpecContext ctx) { }
+	/**
+	 * {@inheritDoc}
+	 *
+	 * <p>The default implementation does nothing.</p>
+	 */
+	@Override public void exitRuleSpec(ANTLRv4Parser.RuleSpecContext ctx) { }
+	/**
+	 * {@inheritDoc}
+	 *
+	 * <p>The default implementation does nothing.</p>
+	 */
+	@Override public void enterParserRuleSpec(ANTLRv4Parser.ParserRuleSpecContext ctx) { }
+	/**
+	 * {@inheritDoc}
+	 *
+	 * <p>The default implementation does nothing.</p>
+	 */
+	@Override public void exitParserRuleSpec(ANTLRv4Parser.ParserRuleSpecContext ctx) { }
+	/**
+	 * {@inheritDoc}
+	 *
+	 * <p>The default implementation does nothing.</p>
+	 */
+	@Override public void enterExceptionGroup(ANTLRv4Parser.ExceptionGroupContext ctx) { }
+	/**
+	 * {@inheritDoc}
+	 *
+	 * <p>The default implementation does nothing.</p>
+	 */
+	@Override public void exitExceptionGroup(ANTLRv4Parser.ExceptionGroupContext ctx) { }
+	/**
+	 * {@inheritDoc}
+	 *
+	 * <p>The default implementation does nothing.</p>
+	 */
+	@Override public void enterExceptionHandler(ANTLRv4Parser.ExceptionHandlerContext ctx) { }
+	/**
+	 * {@inheritDoc}
+	 *
+	 * <p>The default implementation does nothing.</p>
+	 */
+	@Override public void exitExceptionHandler(ANTLRv4Parser.ExceptionHandlerContext ctx) { }
+	/**
+	 * {@inheritDoc}
+	 *
+	 * <p>The default implementation does nothing.</p>
+	 */
+	@Override public void enterFinallyClause(ANTLRv4Parser.FinallyClauseContext ctx) { }
+	/**
+	 * {@inheritDoc}
+	 *
+	 * <p>The default implementation does nothing.</p>
+	 */
+	@Override public void exitFinallyClause(ANTLRv4Parser.FinallyClauseContext ctx) { }
+	/**
+	 * {@inheritDoc}
+	 *
+	 * <p>The default implementation does nothing.</p>
+	 */
+	@Override public void enterRulePrequel(ANTLRv4Parser.RulePrequelContext ctx) { }
+	/**
+	 * {@inheritDoc}
+	 *
+	 * <p>The default implementation does nothing.</p>
+	 */
+	@Override public void exitRulePrequel(ANTLRv4Parser.RulePrequelContext ctx) { }
+	/**
+	 * {@inheritDoc}
+	 *
+	 * <p>The default implementation does nothing.</p>
+	 */
+	@Override public void enterRuleReturns(ANTLRv4Parser.RuleReturnsContext ctx) { }
+	/**
+	 * {@inheritDoc}
+	 *
+	 * <p>The default implementation does nothing.</p>
+	 */
+	@Override public void exitRuleReturns(ANTLRv4Parser.RuleReturnsContext ctx) { }
+	/**
+	 * {@inheritDoc}
+	 *
+	 * <p>The default implementation does nothing.</p>
+	 */
+	@Override public void enterThrowsSpec(ANTLRv4Parser.ThrowsSpecContext ctx) { }
+	/**
+	 * {@inheritDoc}
+	 *
+	 * <p>The default implementation does nothing.</p>
+	 */
+	@Override public void exitThrowsSpec(ANTLRv4Parser.ThrowsSpecContext ctx) { }
+	/**
+	 * {@inheritDoc}
+	 *
+	 * <p>The default implementation does nothing.</p>
+	 */
+	@Override public void enterLocalsSpec(ANTLRv4Parser.LocalsSpecContext ctx) { }
+	/**
+	 * {@inheritDoc}
+	 *
+	 * <p>The default implementation does nothing.</p>
+	 */
+	@Override public void exitLocalsSpec(ANTLRv4Parser.LocalsSpecContext ctx) { }
+	/**
+	 * {@inheritDoc}
+	 *
+	 * <p>The default implementation does nothing.</p>
+	 */
+	@Override public void enterRuleAction(ANTLRv4Parser.RuleActionContext ctx) { }
+	/**
+	 * {@inheritDoc}
+	 *
+	 * <p>The default implementation does nothing.</p>
+	 */
+	@Override public void exitRuleAction(ANTLRv4Parser.RuleActionContext ctx) { }
+	/**
+	 * {@inheritDoc}
+	 *
+	 * <p>The default implementation does nothing.</p>
+	 */
+	@Override public void enterRuleModifiers(ANTLRv4Parser.RuleModifiersContext ctx) { }
+	/**
+	 * {@inheritDoc}
+	 *
+	 * <p>The default implementation does nothing.</p>
+	 */
+	@Override public void exitRuleModifiers(ANTLRv4Parser.RuleModifiersContext ctx) { }
+	/**
+	 * {@inheritDoc}
+	 *
+	 * <p>The default implementation does nothing.</p>
+	 */
+	@Override public void enterRuleModifier(ANTLRv4Parser.RuleModifierContext ctx) { }
+	/**
+	 * {@inheritDoc}
+	 *
+	 * <p>The default implementation does nothing.</p>
+	 */
+	@Override public void exitRuleModifier(ANTLRv4Parser.RuleModifierContext ctx) { }
+	/**
+	 * {@inheritDoc}
+	 *
+	 * <p>The default implementation does nothing.</p>
+	 */
+	@Override public void enterRuleBlock(ANTLRv4Parser.RuleBlockContext ctx) { }
+	/**
+	 * {@inheritDoc}
+	 *
+	 * <p>The default implementation does nothing.</p>
+	 */
+	@Override public void exitRuleBlock(ANTLRv4Parser.RuleBlockContext ctx) { }
+	/**
+	 * {@inheritDoc}
+	 *
+	 * <p>The default implementation does nothing.</p>
+	 */
+	@Override public void enterRuleAltList(ANTLRv4Parser.RuleAltListContext ctx) { }
+	/**
+	 * {@inheritDoc}
+	 *
+	 * <p>The default implementation does nothing.</p>
+	 */
+	@Override public void exitRuleAltList(ANTLRv4Parser.RuleAltListContext ctx) { }
+	/**
+	 * {@inheritDoc}
+	 *
+	 * <p>The default implementation does nothing.</p>
+	 */
+	@Override public void enterLabeledAlt(ANTLRv4Parser.LabeledAltContext ctx) { }
+	/**
+	 * {@inheritDoc}
+	 *
+	 * <p>The default implementation does nothing.</p>
+	 */
+	@Override public void exitLabeledAlt(ANTLRv4Parser.LabeledAltContext ctx) { }
+	/**
+	 * {@inheritDoc}
+	 *
+	 * <p>The default implementation does nothing.</p>
+	 */
+	@Override public void enterLexerRuleSpec(ANTLRv4Parser.LexerRuleSpecContext ctx) { }
+	/**
+	 * {@inheritDoc}
+	 *
+	 * <p>The default implementation does nothing.</p>
+	 */
+	@Override public void exitLexerRuleSpec(ANTLRv4Parser.LexerRuleSpecContext ctx) { }
+	/**
+	 * {@inheritDoc}
+	 *
+	 * <p>The default implementation does nothing.</p>
+	 */
+	@Override public void enterLexerRuleBlock(ANTLRv4Parser.LexerRuleBlockContext ctx) { }
+	/**
+	 * {@inheritDoc}
+	 *
+	 * <p>The default implementation does nothing.</p>
+	 */
+	@Override public void exitLexerRuleBlock(ANTLRv4Parser.LexerRuleBlockContext ctx) { }
+	/**
+	 * {@inheritDoc}
+	 *
+	 * <p>The default implementation does nothing.</p>
+	 */
+	@Override public void enterLexerAltList(ANTLRv4Parser.LexerAltListContext ctx) { }
+	/**
+	 * {@inheritDoc}
+	 *
+	 * <p>The default implementation does nothing.</p>
+	 */
+	@Override public void exitLexerAltList(ANTLRv4Parser.LexerAltListContext ctx) { }
+	/**
+	 * {@inheritDoc}
+	 *
+	 * <p>The default implementation does nothing.</p>
+	 */
+	@Override public void enterLexerAlt(ANTLRv4Parser.LexerAltContext ctx) { }
+	/**
+	 * {@inheritDoc}
+	 *
+	 * <p>The default implementation does nothing.</p>
+	 */
+	@Override public void exitLexerAlt(ANTLRv4Parser.LexerAltContext ctx) { }
+	/**
+	 * {@inheritDoc}
+	 *
+	 * <p>The default implementation does nothing.</p>
+	 */
+	@Override public void enterLexerElements(ANTLRv4Parser.LexerElementsContext ctx) { }
+	/**
+	 * {@inheritDoc}
+	 *
+	 * <p>The default implementation does nothing.</p>
+	 */
+	@Override public void exitLexerElements(ANTLRv4Parser.LexerElementsContext ctx) { }
+	/**
+	 * {@inheritDoc}
+	 *
+	 * <p>The default implementation does nothing.</p>
+	 */
+	@Override public void enterLexerElement(ANTLRv4Parser.LexerElementContext ctx) { }
+	/**
+	 * {@inheritDoc}
+	 *
+	 * <p>The default implementation does nothing.</p>
+	 */
+	@Override public void exitLexerElement(ANTLRv4Parser.LexerElementContext ctx) { }
+	/**
+	 * {@inheritDoc}
+	 *
+	 * <p>The default implementation does nothing.</p>
+	 */
+	@Override public void enterLabeledLexerElement(ANTLRv4Parser.LabeledLexerElementContext ctx) { }
+	/**
+	 * {@inheritDoc}
+	 *
+	 * <p>The default implementation does nothing.</p>
+	 */
+	@Override public void exitLabeledLexerElement(ANTLRv4Parser.LabeledLexerElementContext ctx) { }
+	/**
+	 * {@inheritDoc}
+	 *
+	 * <p>The default implementation does nothing.</p>
+	 */
+	@Override public void enterLexerBlock(ANTLRv4Parser.LexerBlockContext ctx) { }
+	/**
+	 * {@inheritDoc}
+	 *
+	 * <p>The default implementation does nothing.</p>
+	 */
+	@Override public void exitLexerBlock(ANTLRv4Parser.LexerBlockContext ctx) { }
+	/**
+	 * {@inheritDoc}
+	 *
+	 * <p>The default implementation does nothing.</p>
+	 */
+	@Override public void enterLexerCommands(ANTLRv4Parser.LexerCommandsContext ctx) { }
+	/**
+	 * {@inheritDoc}
+	 *
+	 * <p>The default implementation does nothing.</p>
+	 */
+	@Override public void exitLexerCommands(ANTLRv4Parser.LexerCommandsContext ctx) { }
+	/**
+	 * {@inheritDoc}
+	 *
+	 * <p>The default implementation does nothing.</p>
+	 */
+	@Override public void enterLexerCommand(ANTLRv4Parser.LexerCommandContext ctx) { }
+	/**
+	 * {@inheritDoc}
+	 *
+	 * <p>The default implementation does nothing.</p>
+	 */
+	@Override public void exitLexerCommand(ANTLRv4Parser.LexerCommandContext ctx) { }
+	/**
+	 * {@inheritDoc}
+	 *
+	 * <p>The default implementation does nothing.</p>
+	 */
+	@Override public void enterLexerCommandName(ANTLRv4Parser.LexerCommandNameContext ctx) { }
+	/**
+	 * {@inheritDoc}
+	 *
+	 * <p>The default implementation does nothing.</p>
+	 */
+	@Override public void exitLexerCommandName(ANTLRv4Parser.LexerCommandNameContext ctx) { }
+	/**
+	 * {@inheritDoc}
+	 *
+	 * <p>The default implementation does nothing.</p>
+	 */
+	@Override public void enterLexerCommandExpr(ANTLRv4Parser.LexerCommandExprContext ctx) { }
+	/**
+	 * {@inheritDoc}
+	 *
+	 * <p>The default implementation does nothing.</p>
+	 */
+	@Override public void exitLexerCommandExpr(ANTLRv4Parser.LexerCommandExprContext ctx) { }
+	/**
+	 * {@inheritDoc}
+	 *
+	 * <p>The default implementation does nothing.</p>
+	 */
+	@Override public void enterAltList(ANTLRv4Parser.AltListContext ctx) { }
+	/**
+	 * {@inheritDoc}
+	 *
+	 * <p>The default implementation does nothing.</p>
+	 */
+	@Override public void exitAltList(ANTLRv4Parser.AltListContext ctx) { }
+	/**
+	 * {@inheritDoc}
+	 *
+	 * <p>The default implementation does nothing.</p>
+	 */
+	@Override public void enterAlternative(ANTLRv4Parser.AlternativeContext ctx) { }
+	/**
+	 * {@inheritDoc}
+	 *
+	 * <p>The default implementation does nothing.</p>
+	 */
+	@Override public void exitAlternative(ANTLRv4Parser.AlternativeContext ctx) { }
+	/**
+	 * {@inheritDoc}
+	 *
+	 * <p>The default implementation does nothing.</p>
+	 */
+	@Override public void enterElement(ANTLRv4Parser.ElementContext ctx) { }
+	/**
+	 * {@inheritDoc}
+	 *
+	 * <p>The default implementation does nothing.</p>
+	 */
+	@Override public void exitElement(ANTLRv4Parser.ElementContext ctx) { }
+	/**
+	 * {@inheritDoc}
+	 *
+	 * <p>The default implementation does nothing.</p>
+	 */
+	@Override public void enterLabeledElement(ANTLRv4Parser.LabeledElementContext ctx) { }
+	/**
+	 * {@inheritDoc}
+	 *
+	 * <p>The default implementation does nothing.</p>
+	 */
+	@Override public void exitLabeledElement(ANTLRv4Parser.LabeledElementContext ctx) { }
+	/**
+	 * {@inheritDoc}
+	 *
+	 * <p>The default implementation does nothing.</p>
+	 */
+	@Override public void enterEbnf(ANTLRv4Parser.EbnfContext ctx) { }
+	/**
+	 * {@inheritDoc}
+	 *
+	 * <p>The default implementation does nothing.</p>
+	 */
+	@Override public void exitEbnf(ANTLRv4Parser.EbnfContext ctx) { }
+	/**
+	 * {@inheritDoc}
+	 *
+	 * <p>The default implementation does nothing.</p>
+	 */
+	@Override public void enterBlockSuffix(ANTLRv4Parser.BlockSuffixContext ctx) { }
+	/**
+	 * {@inheritDoc}
+	 *
+	 * <p>The default implementation does nothing.</p>
+	 */
+	@Override public void exitBlockSuffix(ANTLRv4Parser.BlockSuffixContext ctx) { }
+	/**
+	 * {@inheritDoc}
+	 *
+	 * <p>The default implementation does nothing.</p>
+	 */
+	@Override public void enterEbnfSuffix(ANTLRv4Parser.EbnfSuffixContext ctx) { }
+	/**
+	 * {@inheritDoc}
+	 *
+	 * <p>The default implementation does nothing.</p>
+	 */
+	@Override public void exitEbnfSuffix(ANTLRv4Parser.EbnfSuffixContext ctx) { }
+	/**
+	 * {@inheritDoc}
+	 *
+	 * <p>The default implementation does nothing.</p>
+	 */
+	@Override public void enterLexerAtom(ANTLRv4Parser.LexerAtomContext ctx) { }
+	/**
+	 * {@inheritDoc}
+	 *
+	 * <p>The default implementation does nothing.</p>
+	 */
+	@Override public void exitLexerAtom(ANTLRv4Parser.LexerAtomContext ctx) { }
+	/**
+	 * {@inheritDoc}
+	 *
+	 * <p>The default implementation does nothing.</p>
+	 */
+	@Override public void enterAtom(ANTLRv4Parser.AtomContext ctx) { }
+	/**
+	 * {@inheritDoc}
+	 *
+	 * <p>The default implementation does nothing.</p>
+	 */
+	@Override public void exitAtom(ANTLRv4Parser.AtomContext ctx) { }
+	/**
+	 * {@inheritDoc}
+	 *
+	 * <p>The default implementation does nothing.</p>
+	 */
+	@Override public void enterNotSet(ANTLRv4Parser.NotSetContext ctx) { }
+	/**
+	 * {@inheritDoc}
+	 *
+	 * <p>The default implementation does nothing.</p>
+	 */
+	@Override public void exitNotSet(ANTLRv4Parser.NotSetContext ctx) { }
+	/**
+	 * {@inheritDoc}
+	 *
+	 * <p>The default implementation does nothing.</p>
+	 */
+	@Override public void enterBlockSet(ANTLRv4Parser.BlockSetContext ctx) { }
+	/**
+	 * {@inheritDoc}
+	 *
+	 * <p>The default implementation does nothing.</p>
+	 */
+	@Override public void exitBlockSet(ANTLRv4Parser.BlockSetContext ctx) { }
+	/**
+	 * {@inheritDoc}
+	 *
+	 * <p>The default implementation does nothing.</p>
+	 */
+	@Override public void enterSetElement(ANTLRv4Parser.SetElementContext ctx) { }
+	/**
+	 * {@inheritDoc}
+	 *
+	 * <p>The default implementation does nothing.</p>
+	 */
+	@Override public void exitSetElement(ANTLRv4Parser.SetElementContext ctx) { }
+	/**
+	 * {@inheritDoc}
+	 *
+	 * <p>The default implementation does nothing.</p>
+	 */
+	@Override public void enterBlock(ANTLRv4Parser.BlockContext ctx) { }
+	/**
+	 * {@inheritDoc}
+	 *
+	 * <p>The default implementation does nothing.</p>
+	 */
+	@Override public void exitBlock(ANTLRv4Parser.BlockContext ctx) { }
+	/**
+	 * {@inheritDoc}
+	 *
+	 * <p>The default implementation does nothing.</p>
+	 */
+	@Override public void enterRuleref(ANTLRv4Parser.RulerefContext ctx) { }
+	/**
+	 * {@inheritDoc}
+	 *
+	 * <p>The default implementation does nothing.</p>
+	 */
+	@Override public void exitRuleref(ANTLRv4Parser.RulerefContext ctx) { }
+	/**
+	 * {@inheritDoc}
+	 *
+	 * <p>The default implementation does nothing.</p>
+	 */
+	@Override public void enterCharacterRange(ANTLRv4Parser.CharacterRangeContext ctx) { }
+	/**
+	 * {@inheritDoc}
+	 *
+	 * <p>The default implementation does nothing.</p>
+	 */
+	@Override public void exitCharacterRange(ANTLRv4Parser.CharacterRangeContext ctx) { }
+	/**
+	 * {@inheritDoc}
+	 *
+	 * <p>The default implementation does nothing.</p>
+	 */
+	@Override public void enterTerminal(ANTLRv4Parser.TerminalContext ctx) { }
+	/**
+	 * {@inheritDoc}
+	 *
+	 * <p>The default implementation does nothing.</p>
+	 */
+	@Override public void exitTerminal(ANTLRv4Parser.TerminalContext ctx) { }
+	/**
+	 * {@inheritDoc}
+	 *
+	 * <p>The default implementation does nothing.</p>
+	 */
+	@Override public void enterElementOptions(ANTLRv4Parser.ElementOptionsContext ctx) { }
+	/**
+	 * {@inheritDoc}
+	 *
+	 * <p>The default implementation does nothing.</p>
+	 */
+	@Override public void exitElementOptions(ANTLRv4Parser.ElementOptionsContext ctx) { }
+	/**
+	 * {@inheritDoc}
+	 *
+	 * <p>The default implementation does nothing.</p>
+	 */
+	@Override public void enterElementOption(ANTLRv4Parser.ElementOptionContext ctx) { }
+	/**
+	 * {@inheritDoc}
+	 *
+	 * <p>The default implementation does nothing.</p>
+	 */
+	@Override public void exitElementOption(ANTLRv4Parser.ElementOptionContext ctx) { }
+	/**
+	 * {@inheritDoc}
+	 *
+	 * <p>The default implementation does nothing.</p>
+	 */
+	@Override public void enterIdentifier(ANTLRv4Parser.IdentifierContext ctx) { }
+	/**
+	 * {@inheritDoc}
+	 *
+	 * <p>The default implementation does nothing.</p>
+	 */
+	@Override public void exitIdentifier(ANTLRv4Parser.IdentifierContext ctx) { }
+
+	/**
+	 * {@inheritDoc}
+	 *
+	 * <p>The default implementation does nothing.</p>
+	 */
+	@Override public void enterEveryRule(ParserRuleContext ctx) { }
+	/**
+	 * {@inheritDoc}
+	 *
+	 * <p>The default implementation does nothing.</p>
+	 */
+	@Override public void exitEveryRule(ParserRuleContext ctx) { }
+	/**
+	 * {@inheritDoc}
+	 *
+	 * <p>The default implementation does nothing.</p>
+	 */
+	@Override public void visitTerminal(TerminalNode node) { }
+	/**
+	 * {@inheritDoc}
+	 *
+	 * <p>The default implementation does nothing.</p>
+	 */
+	@Override public void visitErrorNode(ErrorNode node) { }
+}
\ No newline at end of file
diff --git a/java/languages.antlr/src/org/antlr/parser/antlr4/ANTLRv4ParserListener.java b/java/languages.antlr/src/org/antlr/parser/antlr4/ANTLRv4ParserListener.java
new file mode 100644
index 0000000..80a5bdf
--- /dev/null
+++ b/java/languages.antlr/src/org/antlr/parser/antlr4/ANTLRv4ParserListener.java
@@ -0,0 +1,677 @@
+// Generated from ANTLRv4Parser.g4 by ANTLR 4.7.2
+
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+// DO NOT EDIT THIS FILE MANUALLY!
+// SEE build.xml FOR INSTRUCTIONS
+
+
+package org.antlr.parser.antlr4;
+
+
+import org.antlr.v4.runtime.tree.ParseTreeListener;
+
+/**
+ * This interface defines a complete listener for a parse tree produced by
+ * {@link ANTLRv4Parser}.
+ */
+public interface ANTLRv4ParserListener extends ParseTreeListener {
+	/**
+	 * Enter a parse tree produced by {@link ANTLRv4Parser#grammarSpec}.
+	 * @param ctx the parse tree
+	 */
+	void enterGrammarSpec(ANTLRv4Parser.GrammarSpecContext ctx);
+	/**
+	 * Exit a parse tree produced by {@link ANTLRv4Parser#grammarSpec}.
+	 * @param ctx the parse tree
+	 */
+	void exitGrammarSpec(ANTLRv4Parser.GrammarSpecContext ctx);
+	/**
+	 * Enter a parse tree produced by {@link ANTLRv4Parser#grammarDecl}.
+	 * @param ctx the parse tree
+	 */
+	void enterGrammarDecl(ANTLRv4Parser.GrammarDeclContext ctx);
+	/**
+	 * Exit a parse tree produced by {@link ANTLRv4Parser#grammarDecl}.
+	 * @param ctx the parse tree
+	 */
+	void exitGrammarDecl(ANTLRv4Parser.GrammarDeclContext ctx);
+	/**
+	 * Enter a parse tree produced by {@link ANTLRv4Parser#grammarType}.
+	 * @param ctx the parse tree
+	 */
+	void enterGrammarType(ANTLRv4Parser.GrammarTypeContext ctx);
+	/**
+	 * Exit a parse tree produced by {@link ANTLRv4Parser#grammarType}.
+	 * @param ctx the parse tree
+	 */
+	void exitGrammarType(ANTLRv4Parser.GrammarTypeContext ctx);
+	/**
+	 * Enter a parse tree produced by {@link ANTLRv4Parser#prequelConstruct}.
+	 * @param ctx the parse tree
+	 */
+	void enterPrequelConstruct(ANTLRv4Parser.PrequelConstructContext ctx);
+	/**
+	 * Exit a parse tree produced by {@link ANTLRv4Parser#prequelConstruct}.
+	 * @param ctx the parse tree
+	 */
+	void exitPrequelConstruct(ANTLRv4Parser.PrequelConstructContext ctx);
+	/**
+	 * Enter a parse tree produced by {@link ANTLRv4Parser#optionsSpec}.
+	 * @param ctx the parse tree
+	 */
+	void enterOptionsSpec(ANTLRv4Parser.OptionsSpecContext ctx);
+	/**
+	 * Exit a parse tree produced by {@link ANTLRv4Parser#optionsSpec}.
+	 * @param ctx the parse tree
+	 */
+	void exitOptionsSpec(ANTLRv4Parser.OptionsSpecContext ctx);
+	/**
+	 * Enter a parse tree produced by {@link ANTLRv4Parser#option}.
+	 * @param ctx the parse tree
+	 */
+	void enterOption(ANTLRv4Parser.OptionContext ctx);
+	/**
+	 * Exit a parse tree produced by {@link ANTLRv4Parser#option}.
+	 * @param ctx the parse tree
+	 */
+	void exitOption(ANTLRv4Parser.OptionContext ctx);
+	/**
+	 * Enter a parse tree produced by {@link ANTLRv4Parser#optionValue}.
+	 * @param ctx the parse tree
+	 */
+	void enterOptionValue(ANTLRv4Parser.OptionValueContext ctx);
+	/**
+	 * Exit a parse tree produced by {@link ANTLRv4Parser#optionValue}.
+	 * @param ctx the parse tree
+	 */
+	void exitOptionValue(ANTLRv4Parser.OptionValueContext ctx);
+	/**
+	 * Enter a parse tree produced by {@link ANTLRv4Parser#delegateGrammars}.
+	 * @param ctx the parse tree
+	 */
+	void enterDelegateGrammars(ANTLRv4Parser.DelegateGrammarsContext ctx);
+	/**
+	 * Exit a parse tree produced by {@link ANTLRv4Parser#delegateGrammars}.
+	 * @param ctx the parse tree
+	 */
+	void exitDelegateGrammars(ANTLRv4Parser.DelegateGrammarsContext ctx);
+	/**
+	 * Enter a parse tree produced by {@link ANTLRv4Parser#delegateGrammar}.
+	 * @param ctx the parse tree
+	 */
+	void enterDelegateGrammar(ANTLRv4Parser.DelegateGrammarContext ctx);
+	/**
+	 * Exit a parse tree produced by {@link ANTLRv4Parser#delegateGrammar}.
+	 * @param ctx the parse tree
+	 */
+	void exitDelegateGrammar(ANTLRv4Parser.DelegateGrammarContext ctx);
+	/**
+	 * Enter a parse tree produced by {@link ANTLRv4Parser#tokensSpec}.
+	 * @param ctx the parse tree
+	 */
+	void enterTokensSpec(ANTLRv4Parser.TokensSpecContext ctx);
+	/**
+	 * Exit a parse tree produced by {@link ANTLRv4Parser#tokensSpec}.
+	 * @param ctx the parse tree
+	 */
+	void exitTokensSpec(ANTLRv4Parser.TokensSpecContext ctx);
+	/**
+	 * Enter a parse tree produced by {@link ANTLRv4Parser#channelsSpec}.
+	 * @param ctx the parse tree
+	 */
+	void enterChannelsSpec(ANTLRv4Parser.ChannelsSpecContext ctx);
+	/**
+	 * Exit a parse tree produced by {@link ANTLRv4Parser#channelsSpec}.
+	 * @param ctx the parse tree
+	 */
+	void exitChannelsSpec(ANTLRv4Parser.ChannelsSpecContext ctx);
+	/**
+	 * Enter a parse tree produced by {@link ANTLRv4Parser#idList}.
+	 * @param ctx the parse tree
+	 */
+	void enterIdList(ANTLRv4Parser.IdListContext ctx);
+	/**
+	 * Exit a parse tree produced by {@link ANTLRv4Parser#idList}.
+	 * @param ctx the parse tree
+	 */
+	void exitIdList(ANTLRv4Parser.IdListContext ctx);
+	/**
+	 * Enter a parse tree produced by {@link ANTLRv4Parser#action_}.
+	 * @param ctx the parse tree
+	 */
+	void enterAction_(ANTLRv4Parser.Action_Context ctx);
+	/**
+	 * Exit a parse tree produced by {@link ANTLRv4Parser#action_}.
+	 * @param ctx the parse tree
+	 */
+	void exitAction_(ANTLRv4Parser.Action_Context ctx);
+	/**
+	 * Enter a parse tree produced by {@link ANTLRv4Parser#actionScopeName}.
+	 * @param ctx the parse tree
+	 */
+	void enterActionScopeName(ANTLRv4Parser.ActionScopeNameContext ctx);
+	/**
+	 * Exit a parse tree produced by {@link ANTLRv4Parser#actionScopeName}.
+	 * @param ctx the parse tree
+	 */
+	void exitActionScopeName(ANTLRv4Parser.ActionScopeNameContext ctx);
+	/**
+	 * Enter a parse tree produced by {@link ANTLRv4Parser#actionBlock}.
+	 * @param ctx the parse tree
+	 */
+	void enterActionBlock(ANTLRv4Parser.ActionBlockContext ctx);
+	/**
+	 * Exit a parse tree produced by {@link ANTLRv4Parser#actionBlock}.
+	 * @param ctx the parse tree
+	 */
+	void exitActionBlock(ANTLRv4Parser.ActionBlockContext ctx);
+	/**
+	 * Enter a parse tree produced by {@link ANTLRv4Parser#argActionBlock}.
+	 * @param ctx the parse tree
+	 */
+	void enterArgActionBlock(ANTLRv4Parser.ArgActionBlockContext ctx);
+	/**
+	 * Exit a parse tree produced by {@link ANTLRv4Parser#argActionBlock}.
+	 * @param ctx the parse tree
+	 */
+	void exitArgActionBlock(ANTLRv4Parser.ArgActionBlockContext ctx);
+	/**
+	 * Enter a parse tree produced by {@link ANTLRv4Parser#modeSpec}.
+	 * @param ctx the parse tree
+	 */
+	void enterModeSpec(ANTLRv4Parser.ModeSpecContext ctx);
+	/**
+	 * Exit a parse tree produced by {@link ANTLRv4Parser#modeSpec}.
+	 * @param ctx the parse tree
+	 */
+	void exitModeSpec(ANTLRv4Parser.ModeSpecContext ctx);
+	/**
+	 * Enter a parse tree produced by {@link ANTLRv4Parser#rules}.
+	 * @param ctx the parse tree
+	 */
+	void enterRules(ANTLRv4Parser.RulesContext ctx);
+	/**
+	 * Exit a parse tree produced by {@link ANTLRv4Parser#rules}.
+	 * @param ctx the parse tree
+	 */
+	void exitRules(ANTLRv4Parser.RulesContext ctx);
+	/**
+	 * Enter a parse tree produced by {@link ANTLRv4Parser#ruleSpec}.
+	 * @param ctx the parse tree
+	 */
+	void enterRuleSpec(ANTLRv4Parser.RuleSpecContext ctx);
+	/**
+	 * Exit a parse tree produced by {@link ANTLRv4Parser#ruleSpec}.
+	 * @param ctx the parse tree
+	 */
+	void exitRuleSpec(ANTLRv4Parser.RuleSpecContext ctx);
+	/**
+	 * Enter a parse tree produced by {@link ANTLRv4Parser#parserRuleSpec}.
+	 * @param ctx the parse tree
+	 */
+	void enterParserRuleSpec(ANTLRv4Parser.ParserRuleSpecContext ctx);
+	/**
+	 * Exit a parse tree produced by {@link ANTLRv4Parser#parserRuleSpec}.
+	 * @param ctx the parse tree
+	 */
+	void exitParserRuleSpec(ANTLRv4Parser.ParserRuleSpecContext ctx);
+	/**
+	 * Enter a parse tree produced by {@link ANTLRv4Parser#exceptionGroup}.
+	 * @param ctx the parse tree
+	 */
+	void enterExceptionGroup(ANTLRv4Parser.ExceptionGroupContext ctx);
+	/**
+	 * Exit a parse tree produced by {@link ANTLRv4Parser#exceptionGroup}.
+	 * @param ctx the parse tree
+	 */
+	void exitExceptionGroup(ANTLRv4Parser.ExceptionGroupContext ctx);
+	/**
+	 * Enter a parse tree produced by {@link ANTLRv4Parser#exceptionHandler}.
+	 * @param ctx the parse tree
+	 */
+	void enterExceptionHandler(ANTLRv4Parser.ExceptionHandlerContext ctx);
+	/**
+	 * Exit a parse tree produced by {@link ANTLRv4Parser#exceptionHandler}.
+	 * @param ctx the parse tree
+	 */
+	void exitExceptionHandler(ANTLRv4Parser.ExceptionHandlerContext ctx);
+	/**
+	 * Enter a parse tree produced by {@link ANTLRv4Parser#finallyClause}.
+	 * @param ctx the parse tree
+	 */
+	void enterFinallyClause(ANTLRv4Parser.FinallyClauseContext ctx);
+	/**
+	 * Exit a parse tree produced by {@link ANTLRv4Parser#finallyClause}.
+	 * @param ctx the parse tree
+	 */
+	void exitFinallyClause(ANTLRv4Parser.FinallyClauseContext ctx);
+	/**
+	 * Enter a parse tree produced by {@link ANTLRv4Parser#rulePrequel}.
+	 * @param ctx the parse tree
+	 */
+	void enterRulePrequel(ANTLRv4Parser.RulePrequelContext ctx);
+	/**
+	 * Exit a parse tree produced by {@link ANTLRv4Parser#rulePrequel}.
+	 * @param ctx the parse tree
+	 */
+	void exitRulePrequel(ANTLRv4Parser.RulePrequelContext ctx);
+	/**
+	 * Enter a parse tree produced by {@link ANTLRv4Parser#ruleReturns}.
+	 * @param ctx the parse tree
+	 */
+	void enterRuleReturns(ANTLRv4Parser.RuleReturnsContext ctx);
+	/**
+	 * Exit a parse tree produced by {@link ANTLRv4Parser#ruleReturns}.
+	 * @param ctx the parse tree
+	 */
+	void exitRuleReturns(ANTLRv4Parser.RuleReturnsContext ctx);
+	/**
+	 * Enter a parse tree produced by {@link ANTLRv4Parser#throwsSpec}.
+	 * @param ctx the parse tree
+	 */
+	void enterThrowsSpec(ANTLRv4Parser.ThrowsSpecContext ctx);
+	/**
+	 * Exit a parse tree produced by {@link ANTLRv4Parser#throwsSpec}.
+	 * @param ctx the parse tree
+	 */
+	void exitThrowsSpec(ANTLRv4Parser.ThrowsSpecContext ctx);
+	/**
+	 * Enter a parse tree produced by {@link ANTLRv4Parser#localsSpec}.
+	 * @param ctx the parse tree
+	 */
+	void enterLocalsSpec(ANTLRv4Parser.LocalsSpecContext ctx);
+	/**
+	 * Exit a parse tree produced by {@link ANTLRv4Parser#localsSpec}.
+	 * @param ctx the parse tree
+	 */
+	void exitLocalsSpec(ANTLRv4Parser.LocalsSpecContext ctx);
+	/**
+	 * Enter a parse tree produced by {@link ANTLRv4Parser#ruleAction}.
+	 * @param ctx the parse tree
+	 */
+	void enterRuleAction(ANTLRv4Parser.RuleActionContext ctx);
+	/**
+	 * Exit a parse tree produced by {@link ANTLRv4Parser#ruleAction}.
+	 * @param ctx the parse tree
+	 */
+	void exitRuleAction(ANTLRv4Parser.RuleActionContext ctx);
+	/**
+	 * Enter a parse tree produced by {@link ANTLRv4Parser#ruleModifiers}.
+	 * @param ctx the parse tree
+	 */
+	void enterRuleModifiers(ANTLRv4Parser.RuleModifiersContext ctx);
+	/**
+	 * Exit a parse tree produced by {@link ANTLRv4Parser#ruleModifiers}.
+	 * @param ctx the parse tree
+	 */
+	void exitRuleModifiers(ANTLRv4Parser.RuleModifiersContext ctx);
+	/**
+	 * Enter a parse tree produced by {@link ANTLRv4Parser#ruleModifier}.
+	 * @param ctx the parse tree
+	 */
+	void enterRuleModifier(ANTLRv4Parser.RuleModifierContext ctx);
+	/**
+	 * Exit a parse tree produced by {@link ANTLRv4Parser#ruleModifier}.
+	 * @param ctx the parse tree
+	 */
+	void exitRuleModifier(ANTLRv4Parser.RuleModifierContext ctx);
+	/**
+	 * Enter a parse tree produced by {@link ANTLRv4Parser#ruleBlock}.
+	 * @param ctx the parse tree
+	 */
+	void enterRuleBlock(ANTLRv4Parser.RuleBlockContext ctx);
+	/**
+	 * Exit a parse tree produced by {@link ANTLRv4Parser#ruleBlock}.
+	 * @param ctx the parse tree
+	 */
+	void exitRuleBlock(ANTLRv4Parser.RuleBlockContext ctx);
+	/**
+	 * Enter a parse tree produced by {@link ANTLRv4Parser#ruleAltList}.
+	 * @param ctx the parse tree
+	 */
+	void enterRuleAltList(ANTLRv4Parser.RuleAltListContext ctx);
+	/**
+	 * Exit a parse tree produced by {@link ANTLRv4Parser#ruleAltList}.
+	 * @param ctx the parse tree
+	 */
+	void exitRuleAltList(ANTLRv4Parser.RuleAltListContext ctx);
+	/**
+	 * Enter a parse tree produced by {@link ANTLRv4Parser#labeledAlt}.
+	 * @param ctx the parse tree
+	 */
+	void enterLabeledAlt(ANTLRv4Parser.LabeledAltContext ctx);
+	/**
+	 * Exit a parse tree produced by {@link ANTLRv4Parser#labeledAlt}.
+	 * @param ctx the parse tree
+	 */
+	void exitLabeledAlt(ANTLRv4Parser.LabeledAltContext ctx);
+	/**
+	 * Enter a parse tree produced by {@link ANTLRv4Parser#lexerRuleSpec}.
+	 * @param ctx the parse tree
+	 */
+	void enterLexerRuleSpec(ANTLRv4Parser.LexerRuleSpecContext ctx);
+	/**
+	 * Exit a parse tree produced by {@link ANTLRv4Parser#lexerRuleSpec}.
+	 * @param ctx the parse tree
+	 */
+	void exitLexerRuleSpec(ANTLRv4Parser.LexerRuleSpecContext ctx);
+	/**
+	 * Enter a parse tree produced by {@link ANTLRv4Parser#lexerRuleBlock}.
+	 * @param ctx the parse tree
+	 */
+	void enterLexerRuleBlock(ANTLRv4Parser.LexerRuleBlockContext ctx);
+	/**
+	 * Exit a parse tree produced by {@link ANTLRv4Parser#lexerRuleBlock}.
+	 * @param ctx the parse tree
+	 */
+	void exitLexerRuleBlock(ANTLRv4Parser.LexerRuleBlockContext ctx);
+	/**
+	 * Enter a parse tree produced by {@link ANTLRv4Parser#lexerAltList}.
+	 * @param ctx the parse tree
+	 */
+	void enterLexerAltList(ANTLRv4Parser.LexerAltListContext ctx);
+	/**
+	 * Exit a parse tree produced by {@link ANTLRv4Parser#lexerAltList}.
+	 * @param ctx the parse tree
+	 */
+	void exitLexerAltList(ANTLRv4Parser.LexerAltListContext ctx);
+	/**
+	 * Enter a parse tree produced by {@link ANTLRv4Parser#lexerAlt}.
+	 * @param ctx the parse tree
+	 */
+	void enterLexerAlt(ANTLRv4Parser.LexerAltContext ctx);
+	/**
+	 * Exit a parse tree produced by {@link ANTLRv4Parser#lexerAlt}.
+	 * @param ctx the parse tree
+	 */
+	void exitLexerAlt(ANTLRv4Parser.LexerAltContext ctx);
+	/**
+	 * Enter a parse tree produced by {@link ANTLRv4Parser#lexerElements}.
+	 * @param ctx the parse tree
+	 */
+	void enterLexerElements(ANTLRv4Parser.LexerElementsContext ctx);
+	/**
+	 * Exit a parse tree produced by {@link ANTLRv4Parser#lexerElements}.
+	 * @param ctx the parse tree
+	 */
+	void exitLexerElements(ANTLRv4Parser.LexerElementsContext ctx);
+	/**
+	 * Enter a parse tree produced by {@link ANTLRv4Parser#lexerElement}.
+	 * @param ctx the parse tree
+	 */
+	void enterLexerElement(ANTLRv4Parser.LexerElementContext ctx);
+	/**
+	 * Exit a parse tree produced by {@link ANTLRv4Parser#lexerElement}.
+	 * @param ctx the parse tree
+	 */
+	void exitLexerElement(ANTLRv4Parser.LexerElementContext ctx);
+	/**
+	 * Enter a parse tree produced by {@link ANTLRv4Parser#labeledLexerElement}.
+	 * @param ctx the parse tree
+	 */
+	void enterLabeledLexerElement(ANTLRv4Parser.LabeledLexerElementContext ctx);
+	/**
+	 * Exit a parse tree produced by {@link ANTLRv4Parser#labeledLexerElement}.
+	 * @param ctx the parse tree
+	 */
+	void exitLabeledLexerElement(ANTLRv4Parser.LabeledLexerElementContext ctx);
+	/**
+	 * Enter a parse tree produced by {@link ANTLRv4Parser#lexerBlock}.
+	 * @param ctx the parse tree
+	 */
+	void enterLexerBlock(ANTLRv4Parser.LexerBlockContext ctx);
+	/**
+	 * Exit a parse tree produced by {@link ANTLRv4Parser#lexerBlock}.
+	 * @param ctx the parse tree
+	 */
+	void exitLexerBlock(ANTLRv4Parser.LexerBlockContext ctx);
+	/**
+	 * Enter a parse tree produced by {@link ANTLRv4Parser#lexerCommands}.
+	 * @param ctx the parse tree
+	 */
+	void enterLexerCommands(ANTLRv4Parser.LexerCommandsContext ctx);
+	/**
+	 * Exit a parse tree produced by {@link ANTLRv4Parser#lexerCommands}.
+	 * @param ctx the parse tree
+	 */
+	void exitLexerCommands(ANTLRv4Parser.LexerCommandsContext ctx);
+	/**
+	 * Enter a parse tree produced by {@link ANTLRv4Parser#lexerCommand}.
+	 * @param ctx the parse tree
+	 */
+	void enterLexerCommand(ANTLRv4Parser.LexerCommandContext ctx);
+	/**
+	 * Exit a parse tree produced by {@link ANTLRv4Parser#lexerCommand}.
+	 * @param ctx the parse tree
+	 */
+	void exitLexerCommand(ANTLRv4Parser.LexerCommandContext ctx);
+	/**
+	 * Enter a parse tree produced by {@link ANTLRv4Parser#lexerCommandName}.
+	 * @param ctx the parse tree
+	 */
+	void enterLexerCommandName(ANTLRv4Parser.LexerCommandNameContext ctx);
+	/**
+	 * Exit a parse tree produced by {@link ANTLRv4Parser#lexerCommandName}.
+	 * @param ctx the parse tree
+	 */
+	void exitLexerCommandName(ANTLRv4Parser.LexerCommandNameContext ctx);
+	/**
+	 * Enter a parse tree produced by {@link ANTLRv4Parser#lexerCommandExpr}.
+	 * @param ctx the parse tree
+	 */
+	void enterLexerCommandExpr(ANTLRv4Parser.LexerCommandExprContext ctx);
+	/**
+	 * Exit a parse tree produced by {@link ANTLRv4Parser#lexerCommandExpr}.
+	 * @param ctx the parse tree
+	 */
+	void exitLexerCommandExpr(ANTLRv4Parser.LexerCommandExprContext ctx);
+	/**
+	 * Enter a parse tree produced by {@link ANTLRv4Parser#altList}.
+	 * @param ctx the parse tree
+	 */
+	void enterAltList(ANTLRv4Parser.AltListContext ctx);
+	/**
+	 * Exit a parse tree produced by {@link ANTLRv4Parser#altList}.
+	 * @param ctx the parse tree
+	 */
+	void exitAltList(ANTLRv4Parser.AltListContext ctx);
+	/**
+	 * Enter a parse tree produced by {@link ANTLRv4Parser#alternative}.
+	 * @param ctx the parse tree
+	 */
+	void enterAlternative(ANTLRv4Parser.AlternativeContext ctx);
+	/**
+	 * Exit a parse tree produced by {@link ANTLRv4Parser#alternative}.
+	 * @param ctx the parse tree
+	 */
+	void exitAlternative(ANTLRv4Parser.AlternativeContext ctx);
+	/**
+	 * Enter a parse tree produced by {@link ANTLRv4Parser#element}.
+	 * @param ctx the parse tree
+	 */
+	void enterElement(ANTLRv4Parser.ElementContext ctx);
+	/**
+	 * Exit a parse tree produced by {@link ANTLRv4Parser#element}.
+	 * @param ctx the parse tree
+	 */
+	void exitElement(ANTLRv4Parser.ElementContext ctx);
+	/**
+	 * Enter a parse tree produced by {@link ANTLRv4Parser#labeledElement}.
+	 * @param ctx the parse tree
+	 */
+	void enterLabeledElement(ANTLRv4Parser.LabeledElementContext ctx);
+	/**
+	 * Exit a parse tree produced by {@link ANTLRv4Parser#labeledElement}.
+	 * @param ctx the parse tree
+	 */
+	void exitLabeledElement(ANTLRv4Parser.LabeledElementContext ctx);
+	/**
+	 * Enter a parse tree produced by {@link ANTLRv4Parser#ebnf}.
+	 * @param ctx the parse tree
+	 */
+	void enterEbnf(ANTLRv4Parser.EbnfContext ctx);
+	/**
+	 * Exit a parse tree produced by {@link ANTLRv4Parser#ebnf}.
+	 * @param ctx the parse tree
+	 */
+	void exitEbnf(ANTLRv4Parser.EbnfContext ctx);
+	/**
+	 * Enter a parse tree produced by {@link ANTLRv4Parser#blockSuffix}.
+	 * @param ctx the parse tree
+	 */
+	void enterBlockSuffix(ANTLRv4Parser.BlockSuffixContext ctx);
+	/**
+	 * Exit a parse tree produced by {@link ANTLRv4Parser#blockSuffix}.
+	 * @param ctx the parse tree
+	 */
+	void exitBlockSuffix(ANTLRv4Parser.BlockSuffixContext ctx);
+	/**
+	 * Enter a parse tree produced by {@link ANTLRv4Parser#ebnfSuffix}.
+	 * @param ctx the parse tree
+	 */
+	void enterEbnfSuffix(ANTLRv4Parser.EbnfSuffixContext ctx);
+	/**
+	 * Exit a parse tree produced by {@link ANTLRv4Parser#ebnfSuffix}.
+	 * @param ctx the parse tree
+	 */
+	void exitEbnfSuffix(ANTLRv4Parser.EbnfSuffixContext ctx);
+	/**
+	 * Enter a parse tree produced by {@link ANTLRv4Parser#lexerAtom}.
+	 * @param ctx the parse tree
+	 */
+	void enterLexerAtom(ANTLRv4Parser.LexerAtomContext ctx);
+	/**
+	 * Exit a parse tree produced by {@link ANTLRv4Parser#lexerAtom}.
+	 * @param ctx the parse tree
+	 */
+	void exitLexerAtom(ANTLRv4Parser.LexerAtomContext ctx);
+	/**
+	 * Enter a parse tree produced by {@link ANTLRv4Parser#atom}.
+	 * @param ctx the parse tree
+	 */
+	void enterAtom(ANTLRv4Parser.AtomContext ctx);
+	/**
+	 * Exit a parse tree produced by {@link ANTLRv4Parser#atom}.
+	 * @param ctx the parse tree
+	 */
+	void exitAtom(ANTLRv4Parser.AtomContext ctx);
+	/**
+	 * Enter a parse tree produced by {@link ANTLRv4Parser#notSet}.
+	 * @param ctx the parse tree
+	 */
+	void enterNotSet(ANTLRv4Parser.NotSetContext ctx);
+	/**
+	 * Exit a parse tree produced by {@link ANTLRv4Parser#notSet}.
+	 * @param ctx the parse tree
+	 */
+	void exitNotSet(ANTLRv4Parser.NotSetContext ctx);
+	/**
+	 * Enter a parse tree produced by {@link ANTLRv4Parser#blockSet}.
+	 * @param ctx the parse tree
+	 */
+	void enterBlockSet(ANTLRv4Parser.BlockSetContext ctx);
+	/**
+	 * Exit a parse tree produced by {@link ANTLRv4Parser#blockSet}.
+	 * @param ctx the parse tree
+	 */
+	void exitBlockSet(ANTLRv4Parser.BlockSetContext ctx);
+	/**
+	 * Enter a parse tree produced by {@link ANTLRv4Parser#setElement}.
+	 * @param ctx the parse tree
+	 */
+	void enterSetElement(ANTLRv4Parser.SetElementContext ctx);
+	/**
+	 * Exit a parse tree produced by {@link ANTLRv4Parser#setElement}.
+	 * @param ctx the parse tree
+	 */
+	void exitSetElement(ANTLRv4Parser.SetElementContext ctx);
+	/**
+	 * Enter a parse tree produced by {@link ANTLRv4Parser#block}.
+	 * @param ctx the parse tree
+	 */
+	void enterBlock(ANTLRv4Parser.BlockContext ctx);
+	/**
+	 * Exit a parse tree produced by {@link ANTLRv4Parser#block}.
+	 * @param ctx the parse tree
+	 */
+	void exitBlock(ANTLRv4Parser.BlockContext ctx);
+	/**
+	 * Enter a parse tree produced by {@link ANTLRv4Parser#ruleref}.
+	 * @param ctx the parse tree
+	 */
+	void enterRuleref(ANTLRv4Parser.RulerefContext ctx);
+	/**
+	 * Exit a parse tree produced by {@link ANTLRv4Parser#ruleref}.
+	 * @param ctx the parse tree
+	 */
+	void exitRuleref(ANTLRv4Parser.RulerefContext ctx);
+	/**
+	 * Enter a parse tree produced by {@link ANTLRv4Parser#characterRange}.
+	 * @param ctx the parse tree
+	 */
+	void enterCharacterRange(ANTLRv4Parser.CharacterRangeContext ctx);
+	/**
+	 * Exit a parse tree produced by {@link ANTLRv4Parser#characterRange}.
+	 * @param ctx the parse tree
+	 */
+	void exitCharacterRange(ANTLRv4Parser.CharacterRangeContext ctx);
+	/**
+	 * Enter a parse tree produced by {@link ANTLRv4Parser#terminal}.
+	 * @param ctx the parse tree
+	 */
+	void enterTerminal(ANTLRv4Parser.TerminalContext ctx);
+	/**
+	 * Exit a parse tree produced by {@link ANTLRv4Parser#terminal}.
+	 * @param ctx the parse tree
+	 */
+	void exitTerminal(ANTLRv4Parser.TerminalContext ctx);
+	/**
+	 * Enter a parse tree produced by {@link ANTLRv4Parser#elementOptions}.
+	 * @param ctx the parse tree
+	 */
+	void enterElementOptions(ANTLRv4Parser.ElementOptionsContext ctx);
+	/**
+	 * Exit a parse tree produced by {@link ANTLRv4Parser#elementOptions}.
+	 * @param ctx the parse tree
+	 */
+	void exitElementOptions(ANTLRv4Parser.ElementOptionsContext ctx);
+	/**
+	 * Enter a parse tree produced by {@link ANTLRv4Parser#elementOption}.
+	 * @param ctx the parse tree
+	 */
+	void enterElementOption(ANTLRv4Parser.ElementOptionContext ctx);
+	/**
+	 * Exit a parse tree produced by {@link ANTLRv4Parser#elementOption}.
+	 * @param ctx the parse tree
+	 */
+	void exitElementOption(ANTLRv4Parser.ElementOptionContext ctx);
+	/**
+	 * Enter a parse tree produced by {@link ANTLRv4Parser#identifier}.
+	 * @param ctx the parse tree
+	 */
+	void enterIdentifier(ANTLRv4Parser.IdentifierContext ctx);
+	/**
+	 * Exit a parse tree produced by {@link ANTLRv4Parser#identifier}.
+	 * @param ctx the parse tree
+	 */
+	void exitIdentifier(ANTLRv4Parser.IdentifierContext ctx);
+}
\ No newline at end of file
diff --git a/java/languages.antlr/src/org/antlr/parser/antlr4/LexBasic.g4 b/java/languages.antlr/src/org/antlr/parser/antlr4/LexBasic.g4
new file mode 100644
index 0000000..b0ea0b8
--- /dev/null
+++ b/java/languages.antlr/src/org/antlr/parser/antlr4/LexBasic.g4
@@ -0,0 +1,304 @@
+/*
+ * [The "BSD license"]
+ *  Copyright (c) 2014-2015 Gerald Rosenberg
+ *  All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions
+ *  are met:
+ *
+ *  1. Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *  2. Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *  3. The name of the author may not be used to endorse or promote products
+ *     derived from this software without specific prior written permission.
+ *
+ *  THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ *  IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ *  OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ *  IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ *  INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ *  NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ *  DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 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 OF
+ *  THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+/** 
+ * A generally reusable set of fragments for import in to Lexer grammars.
+ *
+ *	Modified 2015.06.16 gbr - 
+ *	-- generalized for inclusion into the ANTLRv4 grammar distribution
+ * 
+ */
+lexer grammar LexBasic;
+
+@header{
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+// DO NOT EDIT THIS FILE MANUALLY!
+// SEE build.xml FOR INSTRUCTIONS
+
+
+package org.antlr.parser.antlr4;
+
+}
+
+// ======================================================
+// Lexer fragments
+//
+// -----------------------------------
+// Whitespace & Comments
+
+fragment Ws
+   : Hws
+   | Vws
+   ;
+
+fragment Hws
+   : [ \t]
+   ;
+
+fragment Vws
+   : [\r\n\f]
+   ;
+
+fragment BlockComment
+   : '/*' .*? ('*/' | EOF)
+   ;
+
+fragment DocComment
+   : '/**' .*? ('*/' | EOF)
+   ;
+
+fragment LineComment
+   : '//' ~ [\r\n]*
+   ;
+   // -----------------------------------
+   // Escapes
+   // Any kind of escaped character that we can embed within ANTLR literal strings.
+
+fragment EscSeq
+   : Esc ([btnfr"'\\] | UnicodeEsc | . | EOF)
+   ;
+
+fragment EscAny
+   : Esc .
+   ;
+
+fragment UnicodeEsc
+   : 'u' (HexDigit (HexDigit (HexDigit HexDigit?)?)?)?
+   ;
+   // -----------------------------------
+   // Numerals
+
+fragment DecimalNumeral
+   : '0'
+   | [1-9] DecDigit*
+   ;
+   // -----------------------------------
+   // Digits
+
+fragment HexDigit
+   : [0-9a-fA-F]
+   ;
+
+fragment DecDigit
+   : [0-9]
+   ;
+   // -----------------------------------
+   // Literals
+
+fragment BoolLiteral
+   : 'true'
+   | 'false'
+   ;
+
+fragment CharLiteral
+   : SQuote (EscSeq | ~ ['\r\n\\]) SQuote
+   ;
+
+fragment SQuoteLiteral
+   : SQuote (EscSeq | ~ ['\r\n\\])* SQuote
+   ;
+
+fragment DQuoteLiteral
+   : DQuote (EscSeq | ~ ["\r\n\\])* DQuote
+   ;
+
+fragment USQuoteLiteral
+   : SQuote (EscSeq | ~ ['\r\n\\])*
+   ;
+   // -----------------------------------
+   // Character ranges
+
+fragment NameChar
+   : NameStartChar
+   | '0' .. '9'
+   | Underscore
+   | '\u00B7'
+   | '\u0300' .. '\u036F'
+   | '\u203F' .. '\u2040'
+   ;
+
+fragment NameStartChar
+   : 'A' .. 'Z'
+   | 'a' .. 'z'
+   | '\u00C0' .. '\u00D6'
+   | '\u00D8' .. '\u00F6'
+   | '\u00F8' .. '\u02FF'
+   | '\u0370' .. '\u037D'
+   | '\u037F' .. '\u1FFF'
+   | '\u200C' .. '\u200D'
+   | '\u2070' .. '\u218F'
+   | '\u2C00' .. '\u2FEF'
+   | '\u3001' .. '\uD7FF'
+   | '\uF900' .. '\uFDCF'
+   | '\uFDF0' .. '\uFFFD'
+   ;
+   // ignores | ['\u10000-'\uEFFFF] ;
+   // -----------------------------------
+   // Types
+
+fragment Int
+   : 'int'
+   ;
+   // -----------------------------------
+   // Symbols
+
+fragment Esc
+   : '\\'
+   ;
+
+fragment Colon
+   : ':'
+   ;
+
+fragment DColon
+   : '::'
+   ;
+
+fragment SQuote
+   : '\''
+   ;
+
+fragment DQuote
+   : '"'
+   ;
+
+fragment LParen
+   : '('
+   ;
+
+fragment RParen
+   : ')'
+   ;
+
+fragment LBrace
+   : '{'
+   ;
+
+fragment RBrace
+   : '}'
+   ;
+
+fragment LBrack
+   : '['
+   ;
+
+fragment RBrack
+   : ']'
+   ;
+
+fragment RArrow
+   : '->'
+   ;
+
+fragment Lt
+   : '<'
+   ;
+
+fragment Gt
+   : '>'
+   ;
+
+fragment Equal
+   : '='
+   ;
+
+fragment Question
+   : '?'
+   ;
+
+fragment Star
+   : '*'
+   ;
+
+fragment Plus
+   : '+'
+   ;
+
+fragment PlusAssign
+   : '+='
+   ;
+
+fragment Underscore
+   : '_'
+   ;
+
+fragment Pipe
+   : '|'
+   ;
+
+fragment Dollar
+   : '$'
+   ;
+
+fragment Comma
+   : ','
+   ;
+
+fragment Semi
+   : ';'
+   ;
+
+fragment Dot
+   : '.'
+   ;
+
+fragment Range
+   : '..'
+   ;
+
+fragment At
+   : '@'
+   ;
+
+fragment Pound
+   : '#'
+   ;
+
+fragment Tilde
+   : '~'
+   ;
+   
diff --git a/java/languages.antlr/src/org/antlr/parser/antlr4/LexerAdaptor.java b/java/languages.antlr/src/org/antlr/parser/antlr4/LexerAdaptor.java
new file mode 100644
index 0000000..287b6ee
--- /dev/null
+++ b/java/languages.antlr/src/org/antlr/parser/antlr4/LexerAdaptor.java
@@ -0,0 +1,151 @@
+/*
+ [The "BSD licence"]
+ Copyright (c) 2005-2007 Terence Parr
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+ 1. Redistributions of source code must retain the above copyright
+    notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+    notice, this list of conditions and the following disclaimer in the
+    documentation and/or other materials provided with the distribution.
+ 3. The name of the author may not be used to endorse or promote products
+    derived from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 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 OF
+ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+package org.antlr.parser.antlr4;
+
+import org.antlr.v4.runtime.CharStream;
+import org.antlr.v4.runtime.Lexer;
+import org.antlr.v4.runtime.Token;
+import org.antlr.v4.runtime.misc.Interval;
+
+public abstract class LexerAdaptor extends Lexer {
+
+    /**
+     *  Generic type for OPTIONS, TOKENS and CHANNELS
+     */
+    private static final int PREQUEL_CONSTRUCT = -10;
+    private static final int OPTIONS_CONSTRUCT = -11;
+
+    public LexerAdaptor(CharStream input) {
+        super(input);
+    }
+
+    /**
+     * Track whether we are inside of a rule and whether it is lexical parser. _currentRuleType==Token.INVALID_TYPE
+     * means that we are outside of a rule. At the first sign of a rule name reference and _currentRuleType==invalid, we
+     * can assume that we are starting a parser rule. Similarly, seeing a token reference when not already in rule means
+     * starting a token rule. The terminating ';' of a rule, flips this back to invalid type.
+     *
+     * This is not perfect logic but works. For example, "grammar T;" means that we start and stop a lexical rule for
+     * the "T;". Dangerous but works.
+     *
+     * The whole point of this state information is to distinguish between [..arg actions..] and [charsets]. Char sets
+     * can only occur in lexical rules and arg actions cannot occur.
+     */
+    private int _currentRuleType = Token.INVALID_TYPE;
+
+    private boolean insideOptionsBlock = false;
+
+    public int getCurrentRuleType() {
+        return _currentRuleType;
+    }
+
+    public void setCurrentRuleType(int ruleType) {
+        this._currentRuleType = ruleType;
+    }
+
+    protected void handleBeginArgument() {
+        if (inLexerRule()) {
+            pushMode(ANTLRv4Lexer.LexerCharSet);
+            more();
+        } else {
+            pushMode(ANTLRv4Lexer.Argument);
+        }
+    }
+
+    protected void handleEndArgument() {
+        popMode();
+        if (_modeStack.size() > 0) {
+            setType(ANTLRv4Lexer.ARGUMENT_CONTENT);
+        }
+    }
+
+    protected void handleEndAction() {
+        int oldMode = _mode;
+        int newMode = popMode();
+        boolean isActionWithinAction = _modeStack.size() > 0
+            && newMode == ANTLRv4Lexer.TargetLanguageAction
+            && oldMode == newMode;
+
+        if (isActionWithinAction) {
+            setType(ANTLRv4Lexer.ACTION_CONTENT);
+        }
+    }
+
+    @Override
+    public Token emit() {
+        if ((_type == ANTLRv4Lexer.OPTIONS || _type == ANTLRv4Lexer.TOKENS || _type == ANTLRv4Lexer.CHANNELS)
+                && getCurrentRuleType() == Token.INVALID_TYPE) { // enter prequel construct ending with an RBRACE
+            setCurrentRuleType(PREQUEL_CONSTRUCT);
+        } else if (_type == ANTLRv4Lexer.OPTIONS && getCurrentRuleType() == ANTLRv4Lexer.TOKEN_REF)
+        {
+            setCurrentRuleType(OPTIONS_CONSTRUCT);
+        } else if (_type == ANTLRv4Lexer.RBRACE && getCurrentRuleType() == PREQUEL_CONSTRUCT) { // exit prequel construct
+            setCurrentRuleType(Token.INVALID_TYPE);
+        } else if (_type == ANTLRv4Lexer.RBRACE && getCurrentRuleType() == OPTIONS_CONSTRUCT)
+        { // exit options
+            setCurrentRuleType(ANTLRv4Lexer.TOKEN_REF);
+        } else if (_type == ANTLRv4Lexer.AT && getCurrentRuleType() == Token.INVALID_TYPE) { // enter action
+            setCurrentRuleType(ANTLRv4Lexer.AT);
+        } else if (_type == ANTLRv4Lexer.SEMI && getCurrentRuleType() == OPTIONS_CONSTRUCT)
+        { // ';' in options { .... }. Don't change anything.
+        } else if (_type == ANTLRv4Lexer.END_ACTION && getCurrentRuleType() == ANTLRv4Lexer.AT) { // exit action
+            setCurrentRuleType(Token.INVALID_TYPE);
+        } else if (_type == ANTLRv4Lexer.ID) {
+            String firstChar = _input.getText(Interval.of(_tokenStartCharIndex, _tokenStartCharIndex));
+            if (Character.isUpperCase(firstChar.charAt(0))) {
+                _type = ANTLRv4Lexer.TOKEN_REF;
+            } else {
+                _type = ANTLRv4Lexer.RULE_REF;
+            }
+
+            if (getCurrentRuleType() == Token.INVALID_TYPE) { // if outside of rule def
+                setCurrentRuleType(_type); // set to inside lexer or parser rule
+            }
+        } else if (_type == ANTLRv4Lexer.SEMI) { // exit rule def
+            setCurrentRuleType(Token.INVALID_TYPE);
+        }
+
+        return super.emit();
+    }
+
+    private boolean inLexerRule() {
+        return getCurrentRuleType() == ANTLRv4Lexer.TOKEN_REF;
+    }
+
+    @SuppressWarnings("unused")
+    private boolean inParserRule() { // not used, but added for clarity
+        return getCurrentRuleType() == ANTLRv4Lexer.RULE_REF;
+    }
+
+    @Override
+    public void reset() {
+        setCurrentRuleType(Token.INVALID_TYPE);
+        insideOptionsBlock = false;
+        super.reset();
+    }   
+}
diff --git a/java/languages.antlr/src/org/netbeans/modules/languages/antlr/AbstractAntlrLexer.java b/java/languages.antlr/src/org/netbeans/modules/languages/antlr/AbstractAntlrLexer.java
new file mode 100644
index 0000000..eec144e
--- /dev/null
+++ b/java/languages.antlr/src/org/netbeans/modules/languages/antlr/AbstractAntlrLexer.java
@@ -0,0 +1,87 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.netbeans.modules.languages.antlr;
+
+import org.antlr.v4.runtime.misc.IntegerList;
+import org.netbeans.api.lexer.Token;
+import org.netbeans.spi.lexer.Lexer;
+import org.netbeans.spi.lexer.LexerRestartInfo;
+import org.netbeans.spi.lexer.TokenFactory;
+
+
+/**
+ *
+ * @author lkishalmi
+ */
+public abstract class AbstractAntlrLexer implements Lexer<AntlrTokenId> {
+
+    private final TokenFactory<AntlrTokenId> tokenFactory;
+    protected final org.antlr.v4.runtime.Lexer lexer;
+    private final LexerInputCharStream input;
+
+    public AbstractAntlrLexer(LexerRestartInfo<AntlrTokenId> info, org.antlr.v4.runtime.Lexer lexer) {
+        this.tokenFactory = info.tokenFactory();
+        this.lexer = lexer;
+        this.input = (LexerInputCharStream) lexer.getInputStream();
+        if (info.state() != null) {
+            ((LexerState) info.state()).restore(lexer);
+        }
+        input.markToken();
+    }
+
+
+    @Override
+    public Object state() {
+        return new LexerState(lexer);
+    }
+
+    @Override
+    public void release() {
+    }
+
+    protected final Token<AntlrTokenId> token(AntlrTokenId id) {
+        input.markToken();
+        return tokenFactory.createToken(id);
+    }
+
+    private static class LexerState {
+        final int state;
+        final int mode;
+        final IntegerList modes;
+
+        LexerState(org.antlr.v4.runtime.Lexer lexer) {
+            this.state= lexer.getState();
+
+            this.mode = lexer._mode;
+            this.modes = new IntegerList(lexer._modeStack);
+        }
+
+        public void restore(org.antlr.v4.runtime.Lexer lexer) {
+            lexer.setState(state);
+            lexer._modeStack.addAll(modes);
+            lexer._mode = mode;
+        }
+
+        @Override
+        public String toString() {
+            return String.valueOf(state);
+        }
+
+    }
+}
diff --git a/java/languages.antlr/src/org/netbeans/modules/languages/antlr/AntlrCompletionProvider.java b/java/languages.antlr/src/org/netbeans/modules/languages/antlr/AntlrCompletionProvider.java
new file mode 100644
index 0000000..6f12999
--- /dev/null
+++ b/java/languages.antlr/src/org/netbeans/modules/languages/antlr/AntlrCompletionProvider.java
@@ -0,0 +1,150 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.netbeans.modules.languages.antlr;
+
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Set;
+import java.util.prefs.Preferences;
+import javax.swing.text.Document;
+import javax.swing.text.JTextComponent;
+import org.netbeans.api.editor.document.EditorDocumentUtils;
+import org.netbeans.api.editor.mimelookup.MimeLookup;
+import org.netbeans.api.editor.mimelookup.MimePath;
+import org.netbeans.api.editor.mimelookup.MimeRegistration;
+import org.netbeans.api.editor.mimelookup.MimeRegistrations;
+import org.netbeans.api.editor.settings.SimpleValueNames;
+import org.netbeans.api.lexer.Token;
+import org.netbeans.api.lexer.TokenHierarchy;
+import org.netbeans.api.lexer.TokenSequence;
+import org.netbeans.modules.languages.antlr.v3.Antlr3Language;
+import org.netbeans.modules.languages.antlr.v4.Antlr4Language;
+import org.netbeans.modules.languages.antlr.v4.Antlr4ParserResult;
+import org.netbeans.spi.editor.completion.CompletionItem;
+import org.netbeans.spi.editor.completion.CompletionProvider;
+import org.netbeans.spi.editor.completion.CompletionResultSet;
+import org.netbeans.spi.editor.completion.CompletionTask;
+import org.netbeans.spi.editor.completion.support.AsyncCompletionQuery;
+import org.netbeans.spi.editor.completion.support.AsyncCompletionTask;
+import org.netbeans.spi.editor.completion.support.CompletionUtilities;
+import org.openide.filesystems.FileObject;
+
+/**
+ *
+ * @author Laszlo Kishalmi
+ */
+@MimeRegistrations({
+    @MimeRegistration(mimeType = Antlr3Language.MIME_TYPE, service = CompletionProvider.class),
+    @MimeRegistration(mimeType = Antlr4Language.MIME_TYPE, service = CompletionProvider.class),
+})
+public class AntlrCompletionProvider implements CompletionProvider {
+
+    @Override
+    public CompletionTask createTask(int queryType, JTextComponent component) {
+        return new AsyncCompletionTask(new AntlrCompletionQuery(), component);
+    }
+
+    @Override
+    public int getAutoQueryTypes(JTextComponent component, String typedText) {
+        return 0;
+    }
+
+    private static boolean isCaseSensitive() {
+        Preferences prefs = MimeLookup.getLookup(MimePath.EMPTY).lookup(Preferences.class);
+        return prefs.getBoolean(SimpleValueNames.COMPLETION_CASE_SENSITIVE, false);
+    }
+
+    private class AntlrCompletionQuery extends AsyncCompletionQuery {
+
+        //TODO: This is a Lexer based pretty dumb implementation. Only offer
+        //      prefix if the cursor is at the end of a start of token/lexer rule.
+        //      Shall be replaced with a better approach.
+        private String getPrefix(Document doc, int caretOffset, boolean upToOffset) {
+            String ret = null;
+            TokenHierarchy<?> tokenHierarchy = TokenHierarchy.get(doc);
+            TokenSequence<?> ts = tokenHierarchy.tokenSequence();
+            ts.move(caretOffset);
+            if (ts.movePrevious()) {
+                int len = caretOffset - ts.offset();
+                Token<?> token = ts.token();
+                if (token.id() == AntlrTokenId.RULE || token.id() == AntlrTokenId.TOKEN) {
+                    ret = String.valueOf(token.text());
+                    ret = upToOffset ? ret.substring(0, len) : ret;
+                }
+            }
+            return ret;
+        }
+
+        @Override
+        protected void query(CompletionResultSet resultSet, Document doc, int caretOffset) {
+            try {
+                FileObject fo = EditorDocumentUtils.getFileObject(doc);
+                if(fo == null) {
+                    return;
+                }
+
+                boolean isCaseSensitive = isCaseSensitive();
+                String prefix = getPrefix(doc, caretOffset, true);
+
+                if(prefix == null) {
+                    return;
+                }
+
+                Set<FileObject> scannedFiles = new HashSet<>();
+                addReferencesForFile(fo, isCaseSensitive, caretOffset - prefix.length(), prefix, resultSet, scannedFiles);
+
+            } finally {
+                resultSet.finish();
+            }
+        }
+
+        public void addReferencesForFile(FileObject fo, boolean isCaseSensitive, int removeLength, String prefix, CompletionResultSet resultSet, Set<FileObject> scannedFiles) {
+            if(scannedFiles.contains(fo)) {
+                return;
+            }
+            scannedFiles.add(fo);
+
+            String mprefix = isCaseSensitive ? prefix : prefix.toUpperCase();
+
+            AntlrParserResult result = AntlrParser.getParserResult(fo);
+            Map<String, AntlrParserResult.Reference> refs = result.references;
+            for (String ref : refs.keySet()) {
+                String mref = isCaseSensitive ? ref : ref.toUpperCase();
+                boolean match = mref.startsWith(mprefix);
+                if (match) {
+                    CompletionItem item = CompletionUtilities.newCompletionItemBuilder(ref)
+                            .startOffset(removeLength)
+                            .leftHtmlText(ref)
+                            .sortText(ref)
+                            .build();
+                    resultSet.addItem(item);
+                }
+            }
+
+            if(result instanceof Antlr4ParserResult) {
+                for(String s: ((Antlr4ParserResult) result).getImports()) {
+                    FileObject importedFo = fo.getParent().getFileObject(s, "g4");
+                    if(importedFo != null) {
+                        addReferencesForFile(importedFo, isCaseSensitive, removeLength, prefix, resultSet, scannedFiles);
+                    }
+                }
+            }
+        }
+    }
+}
diff --git a/java/languages.antlr/src/org/netbeans/modules/languages/antlr/AntlrDeclarationFinder.java b/java/languages.antlr/src/org/netbeans/modules/languages/antlr/AntlrDeclarationFinder.java
new file mode 100644
index 0000000..1fa4169
--- /dev/null
+++ b/java/languages.antlr/src/org/netbeans/modules/languages/antlr/AntlrDeclarationFinder.java
@@ -0,0 +1,145 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.netbeans.modules.languages.antlr;
+
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Set;
+import javax.swing.text.AbstractDocument;
+import javax.swing.text.Document;
+import org.netbeans.api.lexer.Token;
+import org.netbeans.api.lexer.TokenHierarchy;
+import org.netbeans.api.lexer.TokenSequence;
+import org.netbeans.modules.csl.api.DeclarationFinder;
+import org.netbeans.modules.csl.api.ElementHandle;
+import org.netbeans.modules.csl.api.HtmlFormatter;
+import org.netbeans.modules.csl.api.OffsetRange;
+import org.netbeans.modules.csl.spi.ParserResult;
+import org.netbeans.modules.languages.antlr.AntlrParserResult.Reference;
+import org.netbeans.modules.languages.antlr.v4.Antlr4ParserResult;
+import org.openide.filesystems.FileObject;
+
+/**
+ *
+ * @author lkishalmi
+ */
+public class AntlrDeclarationFinder implements DeclarationFinder {
+
+    @Override
+    public DeclarationLocation findDeclaration(ParserResult info, int caretOffset) {
+        TokenSequence<?> ts = info.getSnapshot().getTokenHierarchy().tokenSequence();
+        ts.move(caretOffset);
+        ts.movePrevious();
+        ts.moveNext();
+        Token<?> token = ts.token();
+        String ref = String.valueOf(token.text());
+        Set<FileObject> scannedFiles = new HashSet<>();
+        return getDeclarationLocation(info.getSnapshot().getSource().getFileObject(), ref, DeclarationLocation.NONE, scannedFiles);
+    }
+
+    @Override
+    public OffsetRange getReferenceSpan(Document document, int caretOffset) {
+        AbstractDocument doc = (AbstractDocument) document;
+        doc.readLock();
+        try {
+            TokenHierarchy<Document> th = TokenHierarchy.get(doc);
+            TokenSequence<?> ts = th.tokenSequence();
+            ts.move(caretOffset);
+            ts.movePrevious();
+            ts.moveNext();
+            Token<?> token = ts.token();
+            if ((token.id() == AntlrTokenId.RULE) || (token.id() == AntlrTokenId.TOKEN)) {
+                int start = ts.offset();
+                ts.moveNext();
+                int end = ts.offset();
+                return new OffsetRange(start, end);
+            } else {
+                return OffsetRange.NONE;
+            }
+        } finally {
+            doc.readUnlock();
+        }
+    }
+
+    public static DeclarationLocation getDeclarationLocation(FileObject fo, String name, DeclarationLocation existingDL, Set<FileObject> scannedFiles) {
+        DeclarationLocation resultDL = existingDL;
+
+        if(scannedFiles.contains(fo)) {
+            return resultDL;
+        }
+        scannedFiles.add(fo);
+
+        AntlrParserResult result = AntlrParser.getParserResult(fo);
+
+        Reference ref = ((Map<String, Reference>) result.references).get(name);
+
+        if(ref != null && ref.defOffset != null) {
+            AntlrStructureItem asi = new AntlrStructureItem.RuleStructureItem(name, fo, ref.defOffset.getStart(), ref.defOffset.getEnd());
+            DeclarationLocation dln = new DeclarationFinder.DeclarationLocation(fo, ref.defOffset.getStart(), asi);
+            if (resultDL == DeclarationLocation.NONE) {
+                resultDL = dln;
+            }
+            // If multiple declaration locations are possible (antlr4
+            // allows redefinition), the original location must be part
+            // of the alternative locations.
+            resultDL.addAlternative(new AlternativeLocationImpl(dln));
+        }
+
+        if(result instanceof Antlr4ParserResult) {
+            for(String s: ((Antlr4ParserResult) result).getImports()) {
+                FileObject importedFo = fo.getParent().getFileObject(s, "g4");
+                if(importedFo != null) {
+                    resultDL = getDeclarationLocation(importedFo, name, resultDL, scannedFiles);
+                }
+            }
+        }
+
+        return resultDL;
+    }
+
+    private static class AlternativeLocationImpl implements AlternativeLocation {
+
+        private final DeclarationLocation location;
+
+        public AlternativeLocationImpl(DeclarationLocation location) {
+            this.location = location;
+        }
+
+        @Override
+        public ElementHandle getElement() {
+            return getLocation().getElement();
+        }
+
+        @Override
+        public String getDisplayHtml(HtmlFormatter formatter) {
+            return getLocation().toString();
+        }
+
+        @Override
+        public DeclarationFinder.DeclarationLocation getLocation() {
+            return location;
+        }
+
+        @Override
+        public int compareTo(DeclarationFinder.AlternativeLocation o) {
+            return 0;
+        }
+
+    }
+}
diff --git a/java/languages.antlr/src/org/netbeans/modules/languages/antlr/AntlrDeletedTextInterceptor.java b/java/languages.antlr/src/org/netbeans/modules/languages/antlr/AntlrDeletedTextInterceptor.java
new file mode 100644
index 0000000..dd90400
--- /dev/null
+++ b/java/languages.antlr/src/org/netbeans/modules/languages/antlr/AntlrDeletedTextInterceptor.java
@@ -0,0 +1,75 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.netbeans.modules.languages.antlr;
+
+import javax.swing.text.BadLocationException;
+import org.netbeans.api.editor.mimelookup.MimePath;
+import org.netbeans.api.editor.mimelookup.MimeRegistration;
+import org.netbeans.api.editor.mimelookup.MimeRegistrations;
+import org.netbeans.modules.languages.antlr.v3.Antlr3Language;
+import org.netbeans.modules.languages.antlr.v4.Antlr4Language;
+import org.netbeans.spi.editor.typinghooks.DeletedTextInterceptor;
+
+/**
+ *
+ * @author lkishalmi
+ */
+public final class AntlrDeletedTextInterceptor implements DeletedTextInterceptor {
+
+    @Override
+    public boolean beforeRemove(Context context) throws BadLocationException {
+        return false;
+    }
+
+    @Override
+    public void remove(Context context) throws BadLocationException {
+        if (context.isBackwardDelete()) {
+            String txt = context.getText();
+            int nextCharOffset = context.getOffset() - 1;
+            String after = context.getDocument().getText(nextCharOffset, 1);
+            if (("[".equals(txt) && "]".equals(after))
+                    || ("{".equals(txt) && "}".equals(after))
+                    || ("'".equals(txt) && "'".equals(after))) {
+                context.getDocument().remove(nextCharOffset, 1);
+            }
+        }
+    }
+
+    @Override
+    public void afterRemove(Context context) throws BadLocationException {
+    }
+
+    @Override
+    public void cancelled(Context context) {
+    }
+
+    @MimeRegistrations({
+        @MimeRegistration(mimeType = Antlr3Language.MIME_TYPE, service = DeletedTextInterceptor.Factory.class),
+        @MimeRegistration(mimeType = Antlr4Language.MIME_TYPE, service = DeletedTextInterceptor.Factory.class),
+    })
+    public static class TomlDeletedTextInterceptorFactory implements DeletedTextInterceptor.Factory {
+
+        @Override
+        public DeletedTextInterceptor createDeletedTextInterceptor(MimePath mimePath) {
+            return new AntlrDeletedTextInterceptor();
+        }
+
+    }
+
+}
diff --git a/java/languages.antlr/src/org/netbeans/modules/languages/antlr/AntlrExample.g b/java/languages.antlr/src/org/netbeans/modules/languages/antlr/AntlrExample.g
new file mode 100644
index 0000000..e4ccb8e
--- /dev/null
+++ b/java/languages.antlr/src/org/netbeans/modules/languages/antlr/AntlrExample.g
@@ -0,0 +1,71 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+grammar AntlrExample;
+
+tokens {
+    GET='get';
+    PUT='put';
+}
+
+file
+    : row+ EOF
+    ;
+
+row
+    : IDENTIFIER '=' value?
+    ;
+
+value
+    : BOOL
+    | STRING
+    ;
+
+WS
+    : [ \t]+
+    ;
+
+NL
+    : NewLine
+    ;
+
+IDENTIFIER
+    : Letter LetterDigit*
+    ;
+
+BOOL
+    : 'true'
+    | 'false'
+    ;
+
+COMMENT
+    : '/*' ( options {greedy=false;} : . )* '*/'
+    ;
+
+LINE_COMMENT
+    : ('#' | '//') ~[\r\n]*? -> skip
+    ;
+
+fragment Letter
+    : [a-zA-Z\-_]
+    ;
+
+fragment NewLine
+    : '\r'? '\n'
+    ;
+
diff --git a/java/languages.antlr/src/org/netbeans/modules/languages/antlr/AntlrExample.g4 b/java/languages.antlr/src/org/netbeans/modules/languages/antlr/AntlrExample.g4
new file mode 100644
index 0000000..d0cff98
--- /dev/null
+++ b/java/languages.antlr/src/org/netbeans/modules/languages/antlr/AntlrExample.g4
@@ -0,0 +1,70 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+grammar AntlrExample;
+
+@header {
+package com.example;
+}
+
+file
+    : row+ EOF
+    ;
+
+row
+    : IDENTIFIER '=' value?
+    ;
+
+value
+    : BOOL
+    | STRING
+    ;
+
+WS
+    : [ \t]+
+    ;
+
+NL
+    : NewLine
+    ;
+
+IDENTIFIER
+    : Letter LetterDigit*
+    ;
+
+BOOL
+    : 'true'
+    | 'false'
+    ;
+
+COMMENT
+    : '/*' .*? '*/' -> skip
+    ;
+
+LINE_COMMENT
+    : ('#' | '//') ~[\r\n]*? -> skip
+    ;
+
+fragment Letter
+    : [a-zA-Z\-_]
+    ;
+
+fragment NewLine
+    : '\r'? '\n'
+    ;
+
diff --git a/java/languages.antlr/src/org/netbeans/modules/languages/antlr/AntlrOccurancesFinder.java b/java/languages.antlr/src/org/netbeans/modules/languages/antlr/AntlrOccurancesFinder.java
new file mode 100644
index 0000000..c9ac3e0
--- /dev/null
+++ b/java/languages.antlr/src/org/netbeans/modules/languages/antlr/AntlrOccurancesFinder.java
@@ -0,0 +1,107 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.netbeans.modules.languages.antlr;
+
+import java.util.HashMap;
+import java.util.Map;
+import org.netbeans.api.lexer.Token;
+import org.netbeans.api.lexer.TokenHierarchy;
+import org.netbeans.api.lexer.TokenSequence;
+import org.netbeans.modules.csl.api.ColoringAttributes;
+import org.netbeans.modules.csl.api.OccurrencesFinder;
+import org.netbeans.modules.csl.api.OffsetRange;
+import org.netbeans.modules.parsing.spi.Scheduler;
+import org.netbeans.modules.parsing.spi.SchedulerEvent;
+
+/**
+ *
+ * @author lkishalmi
+ */
+public class AntlrOccurancesFinder extends OccurrencesFinder<AntlrParserResult> {
+
+    private int caretPosition;
+    private boolean cancelled;
+    private final Map<OffsetRange, ColoringAttributes> occurrences = new HashMap<>();
+
+    @Override
+    public void setCaretPosition(int position) {
+        caretPosition = position;
+    }
+
+    @Override
+    public Map<OffsetRange, ColoringAttributes> getOccurrences() {
+        return occurrences;
+    }
+
+    @Override
+    public void run(AntlrParserResult result, SchedulerEvent event) {
+        occurrences.clear();
+        if (checkAndResetCancel()) {
+            return;
+        }
+        computeOccurrences(result);
+    }
+
+    @Override
+    public int getPriority() {
+        return 200;
+    }
+
+    @Override
+    public Class<? extends Scheduler> getSchedulerClass() {
+        return Scheduler.CURSOR_SENSITIVE_TASK_SCHEDULER;
+    }
+
+    @Override
+    public void cancel() {
+        this.cancelled = true;
+    }
+
+
+    private boolean checkAndResetCancel() {
+        if (cancelled) {
+            cancelled = false;
+            return true;
+        }
+        return false;
+    }
+
+    private void computeOccurrences(AntlrParserResult result) {
+        TokenHierarchy<?> tokenHierarchy = result.getSnapshot().getTokenHierarchy();
+        TokenSequence<?> ts = tokenHierarchy.tokenSequence();
+        ts.move(caretPosition);
+        if (ts.movePrevious()) {
+            ts.moveNext();
+            Token<?> token = ts.token();
+            if (token.id() == AntlrTokenId.RULE || token.id() == AntlrTokenId.TOKEN) {
+                String refName = String.valueOf(token.text());
+                Map<String, AntlrParserResult.Reference> refs = result.references;
+                AntlrParserResult.Reference ref = refs.get(refName);
+                if (ref != null) {
+                    if(ref.defOffset != null) {
+                        occurrences.put(ref.defOffset, ColoringAttributes.MARK_OCCURRENCES);
+                    }
+                    for (OffsetRange occurance : ref.occurances) {
+                        occurrences.put(occurance, ColoringAttributes.MARK_OCCURRENCES);
+                    }
+                }
+            }
+        }
+    }
+}
diff --git a/java/languages.antlr/src/org/netbeans/modules/languages/antlr/AntlrParser.java b/java/languages.antlr/src/org/netbeans/modules/languages/antlr/AntlrParser.java
new file mode 100644
index 0000000..b81ba9e
--- /dev/null
+++ b/java/languages.antlr/src/org/netbeans/modules/languages/antlr/AntlrParser.java
@@ -0,0 +1,118 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.netbeans.modules.languages.antlr;
+
+import java.lang.ref.Reference;
+import java.lang.ref.WeakReference;
+import java.util.Collections;
+import java.util.WeakHashMap;
+import javax.swing.event.ChangeListener;
+import org.netbeans.modules.parsing.api.ParserManager;
+import org.netbeans.modules.parsing.api.ResultIterator;
+import org.netbeans.modules.parsing.api.Snapshot;
+import org.netbeans.modules.parsing.api.Source;
+import org.netbeans.modules.parsing.api.Task;
+import org.netbeans.modules.parsing.api.UserTask;
+import org.netbeans.modules.parsing.spi.ParseException;
+import org.netbeans.modules.parsing.spi.SourceModificationEvent;
+import org.openide.filesystems.FileObject;
+import org.openide.util.Exceptions;
+
+/**
+ *
+ * @author lkishalmi
+ */
+public abstract class AntlrParser extends org.netbeans.modules.parsing.spi.Parser {
+
+    AntlrParserResult lastResult;
+
+    /*
+     * The NetBeans indexer support is more appropriate for large scale project
+     * where parsing of all affected files would take a too long time. For ANTLR
+     * imports are only possible from the current directory, so it can be
+     * expected that the number of files that can be imported or need to be
+     * scanned is low.
+     */
+    private static final WeakHashMap<FileObject, Reference<AntlrParserResult>> CACHE = new WeakHashMap<>();
+
+    protected abstract AntlrParserResult<?> createParserResult(Snapshot snapshot);
+
+    @Override
+    public void parse(Snapshot snapshot, Task task, SourceModificationEvent event) throws ParseException {
+        AntlrParserResult<?> parserResult = createParserResult(snapshot);
+
+        AntlrParserResult<?> parsed = parserResult.get();
+        cacheResult(snapshot.getSource().getFileObject(), parsed);
+        lastResult = parsed;
+    }
+
+    @Override
+    public Result getResult(Task task) throws ParseException {
+        assert lastResult != null;
+        return lastResult;
+    }
+
+    @Override
+    public void addChangeListener(ChangeListener changeListener) {
+    }
+
+    @Override
+    public void removeChangeListener(ChangeListener changeListener) {
+    }
+
+    private static void cacheResult(FileObject fo, AntlrParserResult<?> result) {
+        synchronized (CACHE) {
+            CACHE.put(fo, new WeakReference<>(result));
+        }
+    }
+
+    public static AntlrParserResult getParserResult(FileObject fo) {
+        AntlrParserResult result = null;
+        java.lang.ref.Reference<AntlrParserResult> ceReference;
+        synchronized (CACHE) {
+            ceReference = CACHE.get(fo);
+        }
+        if (ceReference != null) {
+            result = ceReference.get();
+        }
+
+        if (result == null) {
+            try {
+                AntlrParserResult[] parserResult = new AntlrParserResult[1];
+                ParserManager.parse(Collections.singleton(Source.create(fo)), new UserTask() {
+                    @Override
+                    public void run(ResultIterator resultIterator) throws Exception {
+                        org.netbeans.modules.parsing.spi.Parser.Result result = resultIterator.getParserResult();
+                        if (result instanceof AntlrParserResult) {
+                            parserResult[0] = (AntlrParserResult) result;
+                        }
+                    }
+                });
+                if (parserResult[0] != null) {
+                    result = parserResult[0];
+                }
+            } catch (ParseException ex) {
+                Exceptions.printStackTrace(ex);
+            }
+        }
+
+        return result;
+    }
+
+}
diff --git a/java/languages.antlr/src/org/netbeans/modules/languages/antlr/AntlrParserResult.java b/java/languages.antlr/src/org/netbeans/modules/languages/antlr/AntlrParserResult.java
new file mode 100644
index 0000000..f903eeb
--- /dev/null
+++ b/java/languages.antlr/src/org/netbeans/modules/languages/antlr/AntlrParserResult.java
@@ -0,0 +1,138 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.netbeans.modules.languages.antlr;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.TreeMap;
+import org.antlr.v4.runtime.ANTLRErrorListener;
+import org.antlr.v4.runtime.BaseErrorListener;
+import org.antlr.v4.runtime.Parser;
+import org.antlr.v4.runtime.RecognitionException;
+import org.antlr.v4.runtime.Recognizer;
+import org.antlr.v4.runtime.Token;
+import org.antlr.v4.runtime.tree.ParseTreeListener;
+import org.netbeans.modules.csl.api.Error;
+import org.netbeans.modules.csl.api.OffsetRange;
+import org.netbeans.modules.csl.api.Severity;
+import org.netbeans.modules.csl.spi.DefaultError;
+import org.netbeans.modules.csl.spi.ParserResult;
+import org.netbeans.modules.parsing.api.Snapshot;
+import org.openide.filesystems.FileObject;
+
+/**
+ *
+ * @author lkishalmi
+ */
+public abstract class AntlrParserResult<T extends Parser> extends ParserResult {
+
+    public final List<DefaultError> errors = new ArrayList<>();
+    public final Map<String, Reference> references = new TreeMap<>();
+
+    public final List<OffsetRange> folds = new ArrayList<>();
+    public final List<AntlrStructureItem> structure = new ArrayList<>();
+
+    volatile boolean finished = false;
+
+    public AntlrParserResult(Snapshot snapshot) {
+        super(snapshot);
+    }
+
+    public AntlrParserResult get() {
+        if (! finished) {
+            FileObject fo = getSnapshot().getSource().getFileObject();
+            T parser = createParser(getSnapshot());
+            parser.addErrorListener(createErrorListener());
+            parser.addParseListener(createFoldListener());
+            parser.addParseListener(createReferenceListener());
+            parser.addParseListener(createImportListener());
+            parser.addParseListener(createStructureListener());
+            parser.addParseListener(createOccurancesListener());
+            evaluateParser(parser);
+
+            // Start a second parsing phase for checking;
+            parser = createParser(getSnapshot());
+            parser.addParseListener(createCheckReferences());
+            evaluateParser(parser);
+            finished = true;
+        }
+        return this;
+    }
+
+    @Override
+    public List<? extends Error> getDiagnostics() {
+        return errors;
+    }
+
+    @Override
+    protected void invalidate() {
+        //references.clear();
+    }
+
+    @Override
+    protected boolean processingFinished() {
+        return finished;
+    }
+
+    public static class Reference {
+        public final String name;
+        public FileObject source;
+        public OffsetRange defOffset;
+        public final List<OffsetRange> occurances = new ArrayList<>();
+
+        public Reference(String name, FileObject source, OffsetRange defOffset) {
+            this.name = name;
+            this.source = source;
+            this.defOffset = defOffset;
+        }
+    }
+
+    protected final FileObject getFileObject() {
+        return getSnapshot().getSource().getFileObject();
+    }
+
+    protected abstract T createParser(Snapshot snapshot);
+    protected abstract void evaluateParser(T parser);
+
+    protected abstract ParseTreeListener createReferenceListener();
+    protected abstract ParseTreeListener createImportListener();
+    protected abstract ParseTreeListener createFoldListener();
+    protected abstract ParseTreeListener createStructureListener();
+    protected abstract ParseTreeListener createOccurancesListener();
+
+    protected abstract ParseTreeListener createCheckReferences();
+
+    protected ANTLRErrorListener createErrorListener() {
+        return new BaseErrorListener() {
+            @Override
+            public void syntaxError(Recognizer<?, ?> recognizer, Object offendingSymbol, int line, int charPositionInLine, String msg, RecognitionException e) {
+                int errorPosition = 0;
+                if (offendingSymbol instanceof Token) {
+                    Token offendingToken = (Token) offendingSymbol;
+                    errorPosition = offendingToken.getStartIndex();
+                }
+                errors.add(new DefaultError(null, msg, null, getFileObject(), errorPosition, errorPosition, Severity.ERROR));
+            }
+
+        };
+    }
+
+
+}
diff --git a/java/languages.antlr/src/org/netbeans/modules/languages/antlr/AntlrStructureItem.java b/java/languages.antlr/src/org/netbeans/modules/languages/antlr/AntlrStructureItem.java
new file mode 100644
index 0000000..e357e2d
--- /dev/null
+++ b/java/languages.antlr/src/org/netbeans/modules/languages/antlr/AntlrStructureItem.java
@@ -0,0 +1,170 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.netbeans.modules.languages.antlr;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import java.util.Set;
+import javax.swing.ImageIcon;
+import org.netbeans.modules.csl.api.ElementHandle;
+import org.netbeans.modules.csl.api.ElementKind;
+import org.netbeans.modules.csl.api.HtmlFormatter;
+import org.netbeans.modules.csl.api.Modifier;
+import org.netbeans.modules.csl.api.OffsetRange;
+import org.netbeans.modules.csl.api.StructureItem;
+import org.netbeans.modules.csl.spi.ParserResult;
+import org.openide.filesystems.FileObject;
+
+/**
+ *
+ * @author Laszlo Kishalmi
+ */
+public abstract class AntlrStructureItem implements ElementHandle, StructureItem {
+
+    final String name;
+    final FileObject source;
+    final int startOffset;
+    final int stopOffset;
+
+    public AntlrStructureItem(String name, FileObject source, int startOffset, int stopOffset) {
+        this.name = name;
+        this.source = source;
+        this.startOffset = startOffset;
+        this.stopOffset = stopOffset;
+    }
+
+    @Override
+    public String getSortText() {
+        return name;
+    }
+
+    @Override
+    public String getHtml(HtmlFormatter formatter) {
+        formatter.appendText(name);
+        return formatter.getText();
+    }
+
+    @Override
+    public ElementHandle getElementHandle() {
+        return this;
+    }
+
+    @Override
+    public long getPosition() {
+        return startOffset;
+    }
+
+    @Override
+    public long getEndPosition() {
+        return stopOffset;
+    }
+
+    @Override
+    public ImageIcon getCustomIcon() {
+        return null;
+    }
+
+    @Override
+    public FileObject getFileObject() {
+        return source;
+    }
+
+    @Override
+    public String getMimeType() {
+        return source.getMIMEType();
+    }
+
+    @Override
+    public String getName() {
+        return name;
+    }
+
+    @Override
+    public String getIn() {
+        return null;
+    }
+
+    @Override
+    public Set<Modifier> getModifiers() {
+        return Collections.emptySet();
+    }
+
+    @Override
+    public boolean signatureEquals(ElementHandle handle) {
+        return false;
+    }
+
+    @Override
+    public OffsetRange getOffsetRange(ParserResult result) {
+        return new OffsetRange(startOffset, stopOffset);
+    }
+
+
+    public static final class ModeStructureItem extends AntlrStructureItem {
+
+        public final List<RuleStructureItem> rules = new ArrayList<>();
+
+        public ModeStructureItem(FileObject source, int startOffset, int stopOffset) {
+            super("DEFAULT_MODE", source, startOffset, stopOffset); //NOI18N
+        }
+
+        public ModeStructureItem(String name, FileObject source, int startOffset, int stopOffset) {
+            super(name, source, startOffset, stopOffset);
+        }
+
+        @Override
+        public boolean isLeaf() {
+            return rules.isEmpty();
+        }
+
+        @Override
+        public List<? extends StructureItem> getNestedItems() {
+            return rules;
+        }
+
+        @Override
+        public ElementKind getKind() {
+            return ElementKind.CLASS;
+        }
+
+    }
+
+    public static final class RuleStructureItem extends AntlrStructureItem {
+
+        public RuleStructureItem(String name, FileObject source, int startOffset, int stopOffset) {
+            super(name, source, startOffset, stopOffset);
+        }
+
+        @Override
+        public boolean isLeaf() {
+            return true;
+        }
+
+        @Override
+        public List<? extends StructureItem> getNestedItems() {
+            return Collections.emptyList();
+        }
+
+        @Override
+        public ElementKind getKind() {
+            return Character.isUpperCase(name.charAt(0)) ? ElementKind.FIELD : ElementKind.RULE;
+        }
+    }
+}
diff --git a/java/languages.antlr/src/org/netbeans/modules/languages/antlr/AntlrStructureScanner.java b/java/languages.antlr/src/org/netbeans/modules/languages/antlr/AntlrStructureScanner.java
new file mode 100644
index 0000000..8c08a32
--- /dev/null
+++ b/java/languages.antlr/src/org/netbeans/modules/languages/antlr/AntlrStructureScanner.java
@@ -0,0 +1,51 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.netbeans.modules.languages.antlr;
+
+import java.util.Collections;
+import java.util.List;
+import java.util.Map;
+import org.netbeans.modules.csl.api.OffsetRange;
+import org.netbeans.modules.csl.api.StructureItem;
+import org.netbeans.modules.csl.api.StructureScanner;
+import org.netbeans.modules.csl.spi.ParserResult;
+
+/**
+ *
+ * @author Laszlo Kishalmi
+ */
+public class AntlrStructureScanner implements StructureScanner {
+
+    @Override
+    public List<? extends StructureItem> scan(ParserResult info) {
+        return ((AntlrParserResult)info).structure;
+    }
+
+    @Override
+    public Map<String, List<OffsetRange>> folds(ParserResult info) {
+        Map<String, List<OffsetRange>> ret = Collections.singletonMap("codeblocks", ((AntlrParserResult)info).folds); //NOI18N
+        return ret;
+    }
+
+    @Override
+    public Configuration getConfiguration() {
+        return new Configuration(true, false);
+    }
+
+}
diff --git a/java/languages.antlr/src/org/netbeans/modules/languages/antlr/AntlrTokenId.java b/java/languages.antlr/src/org/netbeans/modules/languages/antlr/AntlrTokenId.java
new file mode 100644
index 0000000..56c840b
--- /dev/null
+++ b/java/languages.antlr/src/org/netbeans/modules/languages/antlr/AntlrTokenId.java
@@ -0,0 +1,91 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.netbeans.modules.languages.antlr;
+
+import java.util.Collection;
+import java.util.EnumSet;
+import org.netbeans.api.lexer.InputAttributes;
+import org.netbeans.api.lexer.Language;
+import org.netbeans.api.lexer.LanguagePath;
+import org.netbeans.api.lexer.Token;
+import org.netbeans.api.lexer.TokenId;
+import org.netbeans.spi.lexer.LanguageEmbedding;
+import org.netbeans.spi.lexer.LanguageHierarchy;
+import org.netbeans.spi.lexer.LanguageProvider;
+import org.openide.util.Lookup;
+
+/**
+ *
+ * @author lkishalmi
+ */
+public enum AntlrTokenId implements TokenId {
+
+    ACTION("action"),
+    COMMENT("comment"),
+    ERROR("error"),
+    KEYWORD("keyword"),
+    NUMBER("number"),
+    PUNCTUATION("punctuation"),
+    REGEXP_CHARS("regexp-chars"),
+    RULE("rule"),
+    STRING("string"),
+    TOKEN("token"),
+    WHITESPACE("whitespace");
+
+    private final String category;
+
+    AntlrTokenId(String category) {
+        this.category = category;
+    }
+
+    @Override
+    public String primaryCategory() {
+        return category;
+    }
+
+    public static abstract class AntlrLanguageHierarchy extends LanguageHierarchy<AntlrTokenId> {
+
+        @Override
+        protected Collection<AntlrTokenId> createTokenIds() {
+            return EnumSet.allOf(AntlrTokenId.class);
+        }
+
+        @Override
+        protected LanguageEmbedding<? extends TokenId> embedding(Token<AntlrTokenId> token,
+                LanguagePath languagePath, InputAttributes inputAttributes) {
+            switch (token.id()) {
+                case ACTION:
+                    Language<? extends TokenId> javaLanguage = null;
+
+                    @SuppressWarnings("unchecked") Collection<LanguageProvider> providers = (Collection<LanguageProvider>) Lookup.getDefault().lookupAll(LanguageProvider.class);
+                    for (LanguageProvider provider : providers) {
+                        javaLanguage = (Language<? extends TokenId>) provider.findLanguage("text/x-java"); //NOI18N
+                        if (javaLanguage != null) {
+                            break;
+                        }
+                    }
+
+                    return javaLanguage != null ? LanguageEmbedding.create(javaLanguage, 0, 0, false) : null;
+                default:
+                    return null;
+            }
+        }
+    }
+
+}
diff --git a/java/languages.antlr/src/org/netbeans/modules/languages/antlr/AntlrTypedTextInterceptor.java b/java/languages.antlr/src/org/netbeans/modules/languages/antlr/AntlrTypedTextInterceptor.java
new file mode 100644
index 0000000..a52b6b9
--- /dev/null
+++ b/java/languages.antlr/src/org/netbeans/modules/languages/antlr/AntlrTypedTextInterceptor.java
@@ -0,0 +1,162 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.netbeans.modules.languages.antlr;
+
+import javax.swing.text.BadLocationException;
+import org.netbeans.api.editor.document.LineDocument;
+import org.netbeans.api.editor.document.LineDocumentUtils;
+import org.netbeans.api.editor.mimelookup.MimePath;
+import org.netbeans.api.editor.mimelookup.MimeRegistration;
+import org.netbeans.api.editor.mimelookup.MimeRegistrations;
+import org.netbeans.modules.languages.antlr.v3.Antlr3Language;
+import org.netbeans.modules.languages.antlr.v4.Antlr4Language;
+import org.netbeans.spi.editor.typinghooks.TypedTextInterceptor;
+
+/**
+ *
+ * @author lkishalmi
+ */
+public final class AntlrTypedTextInterceptor implements TypedTextInterceptor {
+
+    private int caretPosition = -1;
+
+    @Override
+    public boolean beforeInsert(Context context) throws BadLocationException {
+        return false;
+    }
+
+    @Override
+    public void insert(MutableContext context) throws BadLocationException {
+        String txt = context.getText();
+        if (context.getReplacedText().length() == 0) {
+            switch (txt) {
+                case "{":
+                    context.setText("{}", 1);
+                    break;
+                case "}":
+                    if ("}".equals(textAfter(context, 1))) {
+                        skipNext(context);
+                    }
+                    break;
+                case "[":
+                    context.setText("[]", 1);
+                    break;
+                case "]":
+                    if ("]".equals(textAfter(context, 1))){
+                        skipNext(context);
+                    }
+                    break;
+                case "(":
+                    context.setText("()", 1);
+                    break;
+                case ")":
+                    if (")".equals(textAfter(context, 1))){
+                        skipNext(context);
+                    }
+                    break;
+                case " ":
+                    String b = textBefore(context, 1);
+                    String a = textAfter(context, 1);
+                    if ( ("{".equals(b) && "}".equals(a))
+                            || ("[".equals(b) && "]".equals(a))) {
+                        context.setText("  ", 1);
+                    }
+                    break;
+                case "\"":
+                    if ("\"".equals(textAfter(context, 1))){
+                        skipNext(context);
+                    } else {
+                        int quotes = quotesInLine(context, '"');
+                        if (quotes % 2 == 0) {
+                            context.setText("\"\"", 1);
+                        }
+                    }
+                    break;
+                case "'":
+                    if ("'".equals(textAfter(context, 1))){
+                        skipNext(context);
+                    } else {
+                        int quotes = quotesInLine(context, '\'');
+                        if (quotes % 2 == 0) {
+                            context.setText("''", 1);
+                        }
+                    }
+                    break;
+            }
+        }
+    }
+
+    private void skipNext(MutableContext context) {
+        context.setText("", 0);
+        caretPosition = context.getOffset() + 1;
+    }
+
+    private static String textAfter(Context context, int length) throws BadLocationException {
+        int next = Math.min(length, context.getDocument().getLength() - context.getOffset());
+        return context.getDocument().getText(context.getOffset(), next);
+    }
+
+    private static String textBefore(Context context, int lenght) throws BadLocationException {
+        int pre = Math.min(lenght, context.getOffset());
+        return context.getDocument().getText(context.getOffset() - pre, pre);
+    }
+
+    private static int quotesInLine(Context context, char quote) throws BadLocationException {
+        LineDocument doc = (LineDocument) context.getDocument();
+        int lineStart = LineDocumentUtils.getLineStart(doc, context.getOffset());
+        int lineEnd = LineDocumentUtils.getLineEnd(doc, context.getOffset());
+        char[] line = doc.getText(lineStart, lineEnd - lineStart).toCharArray();
+
+        int quotes = 0;
+        for (int i = 0; i < line.length; i++) {
+            char d = line[i];
+            if ('\\' == d) {
+                i++;
+                continue;
+            }
+            if (quote == d) quotes++;
+        }
+        return quotes;
+    }
+
+    @Override
+    public void afterInsert(Context context) throws BadLocationException {
+        if (caretPosition > -1) {
+            context.getComponent().setCaretPosition(caretPosition);
+            caretPosition = -1;
+        }
+    }
+
+    @Override
+    public void cancelled(Context context) {
+    }
+
+    @MimeRegistrations({
+            @MimeRegistration(mimeType = Antlr3Language.MIME_TYPE, service = TypedTextInterceptor.Factory.class),
+            @MimeRegistration(mimeType = Antlr4Language.MIME_TYPE, service = TypedTextInterceptor.Factory.class)
+    })
+    public static class TomlTypedTextInterceptorFactory implements TypedTextInterceptor.Factory {
+
+        @Override
+        public TypedTextInterceptor createTypedTextInterceptor(MimePath mimePath) {
+            return new AntlrTypedTextInterceptor();
+        }
+
+    }
+}
diff --git a/java/languages.antlr/src/org/netbeans/modules/languages/antlr/Bundle.properties b/java/languages.antlr/src/org/netbeans/modules/languages/antlr/Bundle.properties
new file mode 100644
index 0000000..812b7e7
--- /dev/null
+++ b/java/languages.antlr/src/org/netbeans/modules/languages/antlr/Bundle.properties
@@ -0,0 +1,36 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+
+OpenIDE-Module-Name=ANTLR Grammar Editor Support
+OpenIDE-Module-Display-Category=Java
+OpenIDE-Module-Short-Description=Support for editing ANTLR Grammar files.
+OpenIDE-Module-Long-Description=Support for editing ANTLR v3 and v4 Grammar files.
+
+Editors/text/x-antlr3=ANTLR v3 Grammar
+Editors/text/x-antlr4=ANTLR v4 Grammar
+
+action=Action Script
+comment=Comment
+error=Error
+keyword=Keyword
+number=Number
+punctuation=Punctuations
+regexp-chars=Regular Expression Special Characters
+rule=Parser Rule
+string=String
+token=Lexer Token
+whitespace=Whitespace
diff --git a/java/languages.antlr/src/org/netbeans/modules/languages/antlr/FlatLafDark-FontAndColors.xml b/java/languages.antlr/src/org/netbeans/modules/languages/antlr/FlatLafDark-FontAndColors.xml
new file mode 100644
index 0000000..1e971ab
--- /dev/null
+++ b/java/languages.antlr/src/org/netbeans/modules/languages/antlr/FlatLafDark-FontAndColors.xml
@@ -0,0 +1,44 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+    Licensed to the Apache Software Foundation (ASF) under one
+    or more contributor license agreements.  See the NOTICE file
+    distributed with this work for additional information
+    regarding copyright ownership.  The ASF licenses this file
+    to you under the Apache License, Version 2.0 (the
+    "License"); you may not use this file except in compliance
+    with the License.  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing,
+    software distributed under the License is distributed on an
+    "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+    KIND, either express or implied.  See the License for the
+    specific language governing permissions and limitations
+    under the License.
+
+-->
+<!DOCTYPE fontscolors PUBLIC "-//NetBeans//DTD Editor Fonts and Colors settings 1.1//EN" "http://www.netbeans.org/dtds/EditorFontsColors-1_1.dtd">
+<fontscolors>
+    <fontcolor name="action" default="keyword"/>
+    <fontcolor name="comment" default="comment"/>
+    <fontcolor name="error" default="error"/>
+    <fontcolor name="number" default="number"/>
+    <fontcolor name="keyword" default="keyword"/>
+    <fontcolor name="number" default="number"/>
+    <fontcolor name="punctuation" default="operator"/>
+    <fontcolor name="regexp-chars" foreColor="33ffcc">
+        <font style="bold"/>
+    </fontcolor>
+    <fontcolor name="rule" foreColor="b2b200">
+        <font style="bold"/>
+    </fontcolor>
+    <fontcolor name="string" default="string">
+        <font style="bold"/>
+    </fontcolor>
+    <fontcolor name="token" foreColor="e500e5">
+        <font style="bold" />
+    </fontcolor>
+    <fontcolor name="whitespace" default="whitespace"/>
+</fontscolors>
diff --git a/java/languages.antlr/src/org/netbeans/modules/languages/antlr/FontAndColors.xml b/java/languages.antlr/src/org/netbeans/modules/languages/antlr/FontAndColors.xml
new file mode 100644
index 0000000..666fdd2
--- /dev/null
+++ b/java/languages.antlr/src/org/netbeans/modules/languages/antlr/FontAndColors.xml
@@ -0,0 +1,44 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+    Licensed to the Apache Software Foundation (ASF) under one
+    or more contributor license agreements.  See the NOTICE file
+    distributed with this work for additional information
+    regarding copyright ownership.  The ASF licenses this file
+    to you under the Apache License, Version 2.0 (the
+    "License"); you may not use this file except in compliance
+    with the License.  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing,
+    software distributed under the License is distributed on an
+    "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+    KIND, either express or implied.  See the License for the
+    specific language governing permissions and limitations
+    under the License.
+
+-->
+<!DOCTYPE fontscolors PUBLIC "-//NetBeans//DTD Editor Fonts and Colors settings 1.1//EN" "http://www.netbeans.org/dtds/EditorFontsColors-1_1.dtd">
+<fontscolors>
+    <fontcolor name="action" default="keyword"/>
+    <fontcolor name="comment" default="comment"/>
+    <fontcolor name="error" default="error"/>
+    <fontcolor name="number" default="number"/>
+    <fontcolor name="keyword" default="keyword"/>
+    <fontcolor name="number" default="number"/>
+    <fontcolor name="punctuation" default="operator"/>
+    <fontcolor name="regexp-chars" foreColor="bf4040">
+        <font style="bold"/>
+    </fontcolor>
+    <fontcolor name="rule" foreColor="47478e">
+        <font style="bold"/>
+    </fontcolor>
+    <fontcolor name="string" default="string">
+        <font style="bold"/>
+    </fontcolor>
+    <fontcolor name="token" foreColor="660e7a">
+        <font style="bold" />
+    </fontcolor>
+    <fontcolor name="whitespace" default="whitespace"/>
+</fontscolors>
diff --git a/java/languages.antlr/src/org/netbeans/modules/languages/antlr/LexerInputCharStream.java b/java/languages.antlr/src/org/netbeans/modules/languages/antlr/LexerInputCharStream.java
new file mode 100644
index 0000000..e289246
--- /dev/null
+++ b/java/languages.antlr/src/org/netbeans/modules/languages/antlr/LexerInputCharStream.java
@@ -0,0 +1,134 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.netbeans.modules.languages.antlr;
+
+import org.antlr.v4.runtime.CharStream;
+import org.antlr.v4.runtime.misc.Interval;
+import org.netbeans.spi.lexer.*;
+
+/**
+ *
+ * @author lkishalmi
+ */
+public class LexerInputCharStream implements CharStream {
+    private final LexerInput input;
+
+    private int tokenMark = Integer.MAX_VALUE;
+    private int index = 0;
+
+    public LexerInputCharStream(LexerInput input) {
+        this.input = input;
+    }
+
+    @Override
+    public String getText(Interval intrvl) {
+        if (intrvl.a < tokenMark) {
+            throw new UnsupportedOperationException("Can't read before the last token end: " + tokenMark);
+        }
+        int start = intrvl.a - tokenMark;
+        int end = intrvl.b - tokenMark + 1;
+        int toread = end - start - input.readLength();
+        for (int i = 0; i < toread; i++) {
+            input.read();
+        }
+        String ret = String.valueOf(input.readText(start, end));
+        if (toread > 0) {
+            input.backup(toread);
+        }
+        return ret;
+    }
+
+    @Override
+    public void consume() {
+        read();
+    }
+
+    @Override
+    public int LA(int count) {
+        if (count == 0) {
+            return 0; //the behaviour is not defined
+        }
+
+        int c = 0;
+        if (count > 0) {
+            for (int i = 0; i < count; i++) {
+                c = read();
+            }
+            backup(count);
+        } else {
+            backup(count);
+            c = read();
+        }
+        return c;
+    }
+
+    //Marks are for buffering in ANTLR4, we do not really need them
+    @Override
+    public int mark() {
+        return -1;
+    }
+
+    public void markToken() {
+        tokenMark = index;
+    }
+
+    @Override
+    public void release(int marker) {
+    }
+
+    @Override
+    public int index() {
+        return index;
+    }
+
+    @Override
+    public void seek(int i) {
+        if (i < index()) {
+            backup(index() - i);
+        } else {
+            while (index() < i) {
+                if (read() == LexerInput.EOF) {
+                    break;
+                }
+            }
+        }
+    }
+
+
+    private int read() {
+        int ret = input.read();
+        index += 1;
+        return ret;
+    }
+
+    private void backup(int count) {
+        index -= count;
+        input.backup(count);
+    }
+
+    @Override
+    public int size() {
+        throw new UnsupportedOperationException("Stream size is unknown.");
+    }
+
+    @Override
+    public String getSourceName() {
+        return UNKNOWN_SOURCE_NAME;
+    }
+}
diff --git a/java/languages.antlr/src/org/netbeans/modules/languages/antlr/layer.xml b/java/languages.antlr/src/org/netbeans/modules/languages/antlr/layer.xml
new file mode 100644
index 0000000..0972a92
--- /dev/null
+++ b/java/languages.antlr/src/org/netbeans/modules/languages/antlr/layer.xml
@@ -0,0 +1,106 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+    Licensed to the Apache Software Foundation (ASF) under one
+    or more contributor license agreements.  See the NOTICE file
+    distributed with this work for additional information
+    regarding copyright ownership.  The ASF licenses this file
+    to you under the Apache License, Version 2.0 (the
+    "License"); you may not use this file except in compliance
+    with the License.  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing,
+    software distributed under the License is distributed on an
+    "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+    KIND, either express or implied.  See the License for the
+    specific language governing permissions and limitations
+    under the License.
+
+-->
+<!DOCTYPE filesystem PUBLIC "-//NetBeans//DTD Filesystem 1.2//EN" "http://www.netbeans.org/dtds/filesystem-1_2.dtd">
+<filesystem>
+    <folder name="Editors">
+        <folder name="text">
+            <folder name="x-antlr3">
+                <attr name="displayName" bundlevalue="org.netbeans.modules.languages.antlr.Bundle#Editors/text/x-antlr3"/>
+                <folder name="FontsColors">
+                    <folder name="FlatLafDark">
+                        <folder name="Defaults">
+                            <file name="FontAndColors.xml" url="FlatLafDark-FontAndColors.xml">
+                                <attr name="SystemFileSystem.localizingBundle" stringvalue="org.netbeans.modules.languages.antlr.Bundle"/>
+                            </file>
+                        </folder>
+                    </folder>
+                    <folder name="NetBeans">
+                        <folder name="Defaults">
+                            <file name="FontAndColors.xml" url="FontAndColors.xml">
+                                <attr name="SystemFileSystem.localizingBundle" stringvalue="org.netbeans.modules.languages.antlr.Bundle"/>
+                            </file>
+                        </folder>
+                    </folder>
+                </folder>
+            </folder>
+            <folder name="x-antlr4">
+                <attr name="displayName" bundlevalue="org.netbeans.modules.languages.antlr.Bundle#Editors/text/x-antlr4"/>
+                <folder name="FontsColors">
+                    <folder name="FlatLafDark">
+                        <folder name="Defaults">
+                            <file name="FontAndColors.xml" url="FlatLafDark-FontAndColors.xml">
+                                <attr name="SystemFileSystem.localizingBundle" stringvalue="org.netbeans.modules.languages.antlr.Bundle"/>
+                            </file>
+                        </folder>
+                    </folder>
+                    <folder name="NetBeans">
+                        <folder name="Defaults">
+                            <file name="FontAndColors.xml" url="FontAndColors.xml">
+                                <attr name="SystemFileSystem.localizingBundle" stringvalue="org.netbeans.modules.languages.antlr.Bundle"/>
+                            </file>
+                        </folder>
+                    </folder>
+                </folder>
+            </folder>
+        </folder>
+    </folder>
+    <folder name="Loaders">
+        <folder name="text">
+            <folder name="x-antlr3">
+                <attr name="iconBase" stringvalue="org/netbeans/modules/languages/antlr/resources/antlr.png"/>
+            </folder>
+            <folder name="x-antlr4">
+                <attr name="iconBase" stringvalue="org/netbeans/modules/languages/antlr/resources/antlr.png"/>
+            </folder>
+        </folder>
+    </folder>
+    <folder name="OptionsDialog">
+        <folder name="PreviewExamples">
+            <folder name="text">
+                <file name="x-antlr3" url="AntlrExample.g"/>
+                <file name="x-antlr4" url="AntlrExample.g4"/>
+            </folder>
+        </folder>
+        <folder name="Editor">
+            <folder name="Formatting">
+                <folder name="text">
+                    <folder name="x-antlr3">
+                        <file name="TabsAndIndents.instance">
+                            <attr name="instanceOf" stringvalue="org.netbeans.modules.options.editor.spi.PreferencesCustomizer$Factory"/>
+                            <attr name="instanceCreate" methodvalue="org.netbeans.modules.options.editor.spi.CustomizerFactories.createDefaultTabsAndIndentsCustomizerFactory"/>
+                            <attr name="previewTextFile" stringvalue="org/netbeans/modules/languages/antlr/AntlrExample.g"/>
+                            <attr name="position" intvalue="100"/>
+                        </file>
+                    </folder>
+                    <folder name="x-antlr4">
+                        <file name="TabsAndIndents.instance">
+                            <attr name="instanceOf" stringvalue="org.netbeans.modules.options.editor.spi.PreferencesCustomizer$Factory"/>
+                            <attr name="instanceCreate" methodvalue="org.netbeans.modules.options.editor.spi.CustomizerFactories.createDefaultTabsAndIndentsCustomizerFactory"/>
+                            <attr name="previewTextFile" stringvalue="org/netbeans/modules/languages/antlr/AntlrExample.g4"/>
+                            <attr name="position" intvalue="100"/>
+                        </file>
+                    </folder>
+                </folder>
+            </folder>
+        </folder>
+    </folder>
+</filesystem>
diff --git a/java/languages.antlr/src/org/netbeans/modules/languages/antlr/refactoring/Refactoring.java b/java/languages.antlr/src/org/netbeans/modules/languages/antlr/refactoring/Refactoring.java
new file mode 100644
index 0000000..747feae
--- /dev/null
+++ b/java/languages.antlr/src/org/netbeans/modules/languages/antlr/refactoring/Refactoring.java
@@ -0,0 +1,262 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.netbeans.modules.languages.antlr.refactoring;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Map.Entry;
+import java.util.Set;
+import java.util.TreeSet;
+import java.util.concurrent.CancellationException;
+import java.util.concurrent.atomic.AtomicBoolean;
+import javax.swing.text.BadLocationException;
+import javax.swing.text.Position;
+import javax.swing.text.StyledDocument;
+import org.netbeans.api.editor.document.LineDocument;
+import org.netbeans.api.editor.document.LineDocumentUtils;
+import org.netbeans.modules.csl.api.OffsetRange;
+import org.netbeans.modules.languages.antlr.AntlrParser;
+import org.netbeans.modules.languages.antlr.AntlrParserResult;
+import org.netbeans.modules.languages.antlr.AntlrParserResult.Reference;
+import org.netbeans.modules.languages.antlr.v4.Antlr4Language;
+import org.netbeans.modules.languages.antlr.v4.Antlr4ParserResult;
+import org.netbeans.modules.refactoring.api.AbstractRefactoring;
+import org.netbeans.modules.refactoring.api.Problem;
+import org.netbeans.modules.refactoring.api.WhereUsedQuery;
+import org.netbeans.modules.refactoring.spi.RefactoringElementsBag;
+import org.netbeans.modules.refactoring.spi.RefactoringPlugin;
+import org.netbeans.modules.refactoring.spi.RefactoringPluginFactory;
+import org.netbeans.modules.refactoring.spi.SimpleRefactoringElementImplementation;
+import org.openide.cookies.EditorCookie;
+import org.openide.filesystems.FileObject;
+import org.openide.text.CloneableEditorSupport;
+import org.openide.text.PositionBounds;
+import org.openide.util.Exceptions;
+import org.openide.util.Lookup;
+import org.openide.util.NbBundle;
+import org.openide.util.lookup.ServiceProvider;
+
+/**
+ *
+     * @author lahvac
+ */
+@NbBundle.Messages("TXT_Canceled=Canceled")
+public class Refactoring {
+
+    private static final class WhereUsedRefactoringPlugin implements RefactoringPlugin {
+
+        private final WhereUsedQuery query;
+        private final SymbolInformation symbolInformation;
+        private final AtomicBoolean cancel = new AtomicBoolean();
+
+        public WhereUsedRefactoringPlugin(WhereUsedQuery query, SymbolInformation symbolInformation) {
+            this.query = query;
+            this.symbolInformation = symbolInformation;
+        }
+
+        @Override
+        public Problem preCheck() {
+            return null;
+        }
+
+        @Override
+        public Problem checkParameters() {
+            return null;
+        }
+
+        @Override
+        public Problem fastCheckParameters() {
+            return null;
+        }
+
+        @Override
+        public void cancelRequest() {
+            cancel.set(true);
+        }
+
+        @Override
+        public Problem prepare(RefactoringElementsBag refactoringElements) {
+            try {
+                String name = this.symbolInformation.getName();
+                FileObject sourceFO = this.symbolInformation.getSourceFile();
+                Map<FileObject,Set<FileObject>> imports = new HashMap<>();
+
+                if (Antlr4Language.MIME_TYPE.equals(sourceFO.getMIMEType())) {
+                    FileObject parent = sourceFO.getParent();
+                    for(FileObject cf: parent.getChildren()) {
+                        if (cancel.get()) {
+                            throw new CancellationException();
+                        }
+                        if (Antlr4Language.MIME_TYPE.equals(cf.getMIMEType())) {
+                            Antlr4ParserResult result = (Antlr4ParserResult) AntlrParser.getParserResult(cf);
+
+                            result.getImports().forEach(s -> {
+                                FileObject referencedFO = parent.getFileObject(s, "g4");
+                                if(referencedFO != null) {
+                                    imports.computeIfAbsent(cf, cd2 -> new HashSet<>())
+                                            .add(referencedFO);
+                                }
+                            });
+                        }
+                    }
+                }
+
+                List<FileObject> toScan = new ArrayList<>();
+                Set<FileObject> scannedFileObjects = new HashSet<>();
+
+                toScan.add(sourceFO);
+
+                while(! toScan.isEmpty()) {
+                    if (cancel.get()) {
+                        throw new CancellationException();
+                    }
+
+                    FileObject fo = toScan.remove(0);
+                    if(scannedFileObjects.contains(fo)) {
+                        continue;
+                    }
+                    scannedFileObjects.add(fo);
+
+                    AntlrParserResult<?> result = (AntlrParserResult) AntlrParser.getParserResult(fo);
+
+                    Reference ref = result.references.get(name);
+
+                    TreeSet<OffsetRange> ranges = new TreeSet<>();
+
+                    if(ref != null) {
+                        if(ref.defOffset != null) {
+                            ranges.add(ref.defOffset);
+                        }
+                        ranges.addAll(ref.occurances);
+                    }
+
+                    for(OffsetRange or : ranges) {
+                        PositionBounds bounds;
+                        try {
+                            CloneableEditorSupport es = fo.getLookup().lookup(CloneableEditorSupport.class);
+                            EditorCookie ec = fo.getLookup().lookup(EditorCookie.class);
+                            StyledDocument doc = ec.openDocument();
+                            LineDocument ldoc = (LineDocument) doc;
+
+                            int rowStart = LineDocumentUtils.getLineStart(ldoc, or.getStart());
+                            int rowEnd = LineDocumentUtils.getLineEnd(ldoc, or.getEnd());
+
+                            bounds = new PositionBounds(
+                                    es.createPositionRef(or.getStart(), Position.Bias.Forward),
+                                    es.createPositionRef(or.getEnd(), Position.Bias.Forward)
+                            );
+
+                            String lineText = doc.getText(rowStart, rowEnd - rowStart);
+                            String annotatedLine =
+                                    lineText.substring(0, or.getStart() - rowStart)
+                                    + "<strong>" 
+                                    + lineText.substring(or.getStart() - rowStart, or.getEnd() - rowStart)
+                                    + "</strong>"
+                                    + lineText.substring(or.getEnd() - rowStart);
+                            refactoringElements.add(query, new AntlrRefactoringElementImpl(annotatedLine, fo, bounds));
+                        } catch (BadLocationException | IOException ex) {
+                            Exceptions.printStackTrace(ex);
+                            bounds = null;
+                        }
+                    }
+
+                    toScan.addAll(imports.getOrDefault(fo, Collections.emptySet()));
+
+                    for(Entry<FileObject,Set<FileObject>> e: imports.entrySet()) {
+                        if(e.getValue().contains(fo)) {
+                            toScan.add(e.getKey());
+                        }
+                    }
+                }
+
+                return null;
+            } catch (CancellationException ex) {
+                return new Problem(false, Bundle.TXT_Canceled());
+            }
+        }
+
+    }
+
+    @ServiceProvider(service=RefactoringPluginFactory.class)
+    public static class FactoryImpl implements RefactoringPluginFactory {
+
+        @Override
+        public RefactoringPlugin createInstance(AbstractRefactoring refactoring) {
+            if (refactoring instanceof WhereUsedQuery) {
+                WhereUsedQuery q = (WhereUsedQuery) refactoring;
+                SymbolInformation symbolInformation = q.getRefactoringSource().lookup(SymbolInformation.class);
+                if (symbolInformation != null) {
+                    return new WhereUsedRefactoringPlugin(q, symbolInformation);
+                }
+            }
+            return null;
+        }
+
+    }
+
+    public static class AntlrRefactoringElementImpl extends SimpleRefactoringElementImplementation {
+
+        private final String annotatedLine;
+        private final FileObject file;
+        private final PositionBounds bounds;
+
+        public AntlrRefactoringElementImpl(String annotatedLine, FileObject file, PositionBounds bounds) {
+            this.annotatedLine = annotatedLine;
+            this.file = file;
+            this.bounds = bounds;
+        }
+
+        @Override
+        public String getText() {
+            return "Element usage";
+        }
+
+        @Override
+        public String getDisplayText() {
+            return annotatedLine;
+        }
+
+        @Override
+        public void performChange() {
+            // Currently the AntlrRefactoringElementImpl is only used for the
+            // WhereUsedRefactoring, which is not doing changes
+            throw new UnsupportedOperationException();
+        }
+
+        @Override
+        public Lookup getLookup() {
+            return Lookup.EMPTY;
+        }
+
+        @Override
+        public FileObject getParentFile() {
+            return file;
+        }
+
+        @Override
+        public PositionBounds getPosition() {
+            return bounds;
+        }
+    }
+}
diff --git a/java/languages.antlr/src/org/netbeans/modules/languages/antlr/refactoring/RefactoringActionsProvider.java b/java/languages.antlr/src/org/netbeans/modules/languages/antlr/refactoring/RefactoringActionsProvider.java
new file mode 100644
index 0000000..87bce7a
--- /dev/null
+++ b/java/languages.antlr/src/org/netbeans/modules/languages/antlr/refactoring/RefactoringActionsProvider.java
@@ -0,0 +1,117 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.netbeans.modules.languages.antlr.refactoring;
+
+import javax.swing.Action;
+import javax.swing.JEditorPane;
+import javax.swing.SwingUtilities;
+import javax.swing.text.AbstractDocument;
+import javax.swing.text.Document;
+import org.netbeans.api.lexer.TokenHierarchy;
+import org.netbeans.api.lexer.TokenSequence;
+import org.netbeans.modules.editor.NbEditorUtilities;
+import org.netbeans.modules.languages.antlr.v3.Antlr3Language;
+import org.netbeans.modules.languages.antlr.v4.Antlr4Language;
+import org.netbeans.modules.refactoring.spi.ui.ActionsImplementationProvider;
+import org.netbeans.modules.refactoring.spi.ui.UI;
+import org.openide.cookies.*;
+import org.openide.filesystems.FileObject;
+import org.openide.text.CloneableEditorSupport;
+import org.openide.text.NbDocument;
+import org.openide.util.Lookup;
+import org.openide.util.NbBundle;
+import org.openide.util.NbBundle.Messages;
+import org.openide.windows.TopComponent;
+
+
+@NbBundle.Messages({"WARN_CannotPerformHere=Cannot perform rename here."})
+@org.openide.util.lookup.ServiceProvider(service=org.netbeans.modules.refactoring.spi.ui.ActionsImplementationProvider.class, position=150)
+public class RefactoringActionsProvider extends ActionsImplementationProvider{
+
+    @Override
+    @Messages("NM_Unknown=Unknown")
+    public void doFindUsages(Lookup lookup) {
+        Runnable start = () -> {
+            EditorCookie ec = lookup.lookup(EditorCookie.class);
+
+            if (isFromEditor(ec)) {
+                JEditorPane c = ec.getOpenedPanes()[0];
+                Document doc = c.getDocument();
+                AbstractDocument abstractDoc = (doc instanceof AbstractDocument) ? ((AbstractDocument) doc) : null;
+                FileObject file = NbEditorUtilities.getFileObject(doc);
+                int caretPos = c.getCaretPosition();
+
+                String name = Bundle.NM_Unknown();
+
+                if (abstractDoc != null) {
+                    abstractDoc.readLock();
+                }
+                try {
+                    TokenSequence<?> ts = TokenHierarchy.get(doc).tokenSequence();
+                    if (ts != null) {
+                        ts.move(caretPos);
+                        if (ts.moveNext()) {
+                            name = ts.token().text().toString();
+                        }
+                    }
+                } finally {
+                    if (abstractDoc != null) {
+                        abstractDoc.readUnlock();
+                    }
+                }
+
+                SymbolInformation si = new SymbolInformation(file, name);
+                UI.openRefactoringUI(new WhereUsedRefactoringUIImpl(si),
+                                     TopComponent.getRegistry().getActivated());
+            }
+        };
+        SwingUtilities.invokeLater(start);
+    }
+
+    static String getActionName(Action action) {
+        String arg = (String) action.getValue(Action.NAME);
+        arg = arg.replace("&", ""); // NOI18N
+        return arg.replace("...", ""); // NOI18N
+    }
+
+    @Override
+    public boolean canFindUsages(Lookup lookup) {
+        boolean ret = false;
+        EditorCookie ec = lookup.lookup(EditorCookie.class);
+        if (ec != null) {
+            Document doc = ec.getDocument();
+            FileObject file = NbEditorUtilities.getFileObject(doc);
+            ret = Antlr3Language.MIME_TYPE.equals(file.getMIMEType())
+                    || Antlr4Language.MIME_TYPE.equals(file.getMIMEType());
+        }
+        return ret;
+    }
+
+    public static boolean isFromEditor(EditorCookie ec) {
+        if (ec != null && NbDocument.findRecentEditorPane(ec) != null) {
+            TopComponent activetc = TopComponent.getRegistry().getActivated();
+            if (activetc instanceof CloneableEditorSupport.Pane) {
+                return true;
+            }
+        }
+        return false;
+    }
+
+}
diff --git a/java/languages.antlr/src/org/netbeans/modules/languages/antlr/refactoring/SymbolInformation.java b/java/languages.antlr/src/org/netbeans/modules/languages/antlr/refactoring/SymbolInformation.java
new file mode 100644
index 0000000..ef39741
--- /dev/null
+++ b/java/languages.antlr/src/org/netbeans/modules/languages/antlr/refactoring/SymbolInformation.java
@@ -0,0 +1,67 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.netbeans.modules.languages.antlr.refactoring;
+
+import java.util.Objects;
+import org.openide.filesystems.FileObject;
+
+public class SymbolInformation {
+    private final FileObject sourceFile;
+    private final String name;
+
+    public SymbolInformation(FileObject sourceFile, String name) {
+        this.sourceFile = sourceFile;
+        this.name = name;
+    }
+
+    public FileObject getSourceFile() {
+        return sourceFile;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    @Override
+    public int hashCode() {
+        int hash = 7;
+        hash = 53 * hash + Objects.hashCode(this.sourceFile);
+        hash = 53 * hash + Objects.hashCode(this.name);
+        return hash;
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        if (this == obj) {
+            return true;
+        }
+        if (obj == null) {
+            return false;
+        }
+        if (getClass() != obj.getClass()) {
+            return false;
+        }
+        final SymbolInformation other = (SymbolInformation) obj;
+        if (!Objects.equals(this.name, other.name)) {
+            return false;
+        }
+        return Objects.equals(this.sourceFile, other.sourceFile);
+    }
+
+}
diff --git a/java/languages.antlr/src/org/netbeans/modules/languages/antlr/refactoring/WhereUsedRefactoringUIImpl.java b/java/languages.antlr/src/org/netbeans/modules/languages/antlr/refactoring/WhereUsedRefactoringUIImpl.java
new file mode 100644
index 0000000..d219c15
--- /dev/null
+++ b/java/languages.antlr/src/org/netbeans/modules/languages/antlr/refactoring/WhereUsedRefactoringUIImpl.java
@@ -0,0 +1,88 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.netbeans.modules.languages.antlr.refactoring;
+
+import javax.swing.event.ChangeListener;
+import org.netbeans.modules.refactoring.api.AbstractRefactoring;
+import org.netbeans.modules.refactoring.api.Problem;
+import org.netbeans.modules.refactoring.api.WhereUsedQuery;
+import org.netbeans.modules.refactoring.spi.ui.CustomRefactoringPanel;
+import org.netbeans.modules.refactoring.spi.ui.RefactoringUI;
+import org.openide.util.HelpCtx;
+import org.openide.util.NbBundle.Messages;
+import org.openide.util.lookup.Lookups;
+
+
+public class WhereUsedRefactoringUIImpl implements RefactoringUI {
+    private final SymbolInformation symbolInformation;
+
+    public WhereUsedRefactoringUIImpl(SymbolInformation symbolInformation) {
+        this.symbolInformation = symbolInformation;
+    }
+
+    @Override
+    public String getName() {
+        return symbolInformation.getName();
+    }
+
+    @Override
+    @Messages({
+        "# {0} - identifier",
+        "DESC_Usages=Usages of {0}"
+    })
+    public String getDescription() {
+        return Bundle.DESC_Usages(symbolInformation.getName());
+    }
+
+    @Override
+    public boolean isQuery() {
+        return true;
+    }
+
+    @Override
+    public CustomRefactoringPanel getPanel(ChangeListener parent) {
+        return null;
+    }
+
+    @Override
+    public Problem setParameters() {
+        return null;
+    }
+
+    @Override
+    public Problem checkParameters() {
+        return null;
+    }
+
+    @Override
+    public boolean hasParameters() {
+        return false;
+    }
+
+    @Override
+    public AbstractRefactoring getRefactoring() {
+        return new WhereUsedQuery(Lookups.fixed(symbolInformation));
+    }
+
+    @Override
+    public HelpCtx getHelpCtx() {
+        return HelpCtx.DEFAULT_HELP;
+    }
+
+}
diff --git a/java/languages.antlr/src/org/netbeans/modules/languages/antlr/resources/antlr.png b/java/languages.antlr/src/org/netbeans/modules/languages/antlr/resources/antlr.png
new file mode 100644
index 0000000..cea8293
--- /dev/null
+++ b/java/languages.antlr/src/org/netbeans/modules/languages/antlr/resources/antlr.png
Binary files differ
diff --git a/java/languages.antlr/src/org/netbeans/modules/languages/antlr/v3/Antlr3Language.java b/java/languages.antlr/src/org/netbeans/modules/languages/antlr/v3/Antlr3Language.java
new file mode 100644
index 0000000..419e91c
--- /dev/null
+++ b/java/languages.antlr/src/org/netbeans/modules/languages/antlr/v3/Antlr3Language.java
@@ -0,0 +1,210 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.netbeans.modules.languages.antlr.v3;
+
+import org.netbeans.api.lexer.Language;
+import org.netbeans.core.spi.multiview.MultiViewElement;
+import org.netbeans.core.spi.multiview.text.MultiViewEditorElement;
+import org.netbeans.modules.csl.api.DeclarationFinder;
+import org.netbeans.modules.csl.api.OccurrencesFinder;
+import org.netbeans.modules.csl.api.StructureScanner;
+import org.netbeans.modules.csl.spi.DefaultLanguageConfig;
+import org.netbeans.modules.csl.spi.LanguageRegistration;
+import org.netbeans.modules.languages.antlr.AntlrDeclarationFinder;
+import org.netbeans.modules.languages.antlr.AntlrOccurancesFinder;
+import org.netbeans.modules.languages.antlr.AntlrParser;
+import org.netbeans.modules.languages.antlr.AntlrParserResult;
+import org.netbeans.modules.languages.antlr.AntlrStructureScanner;
+import org.netbeans.modules.languages.antlr.AntlrTokenId;
+import org.netbeans.modules.parsing.api.Snapshot;
+import org.netbeans.modules.parsing.spi.Parser;
+import org.netbeans.spi.lexer.Lexer;
+import org.netbeans.spi.lexer.LexerRestartInfo;
+import org.openide.awt.ActionID;
+import org.openide.awt.ActionReference;
+import org.openide.awt.ActionReferences;
+import org.openide.filesystems.MIMEResolver;
+import org.openide.util.Lookup;
+import org.openide.util.NbBundle;
+import org.openide.windows.TopComponent;
+
+/**
+ *
+ * @author lkishalmi
+ */
+@NbBundle.Messages(
+        "ANTLRv3Resolver=ANTLR v3 Grammar"
+)
+@MIMEResolver.ExtensionRegistration(displayName = "#ANTLRv3Resolver",
+    extension = "g",
+    mimeType = Antlr3Language.MIME_TYPE,
+    position = 286
+)
+
+@ActionReferences({
+    @ActionReference(
+            path = "Loaders/text/x-antlr3/Actions",
+            id = @ActionID(category = "System", id = "org.openide.actions.OpenAction"),
+            position = 100,
+            separatorAfter = 200
+    ),
+    @ActionReference(
+            path = "Loaders/text/x-antlr3/Actions",
+            id = @ActionID(category = "Edit", id = "org.openide.actions.CutAction"),
+            position = 300
+    ),
+    @ActionReference(
+            path = "Loaders/text/x-antlr3/Actions",
+            id = @ActionID(category = "Edit", id = "org.openide.actions.CopyAction"),
+            position = 400
+    ),
+    @ActionReference(
+            path = "Loaders/text/x-antlr3/Actions",
+            id = @ActionID(category = "Edit", id = "org.openide.actions.PasteAction"),
+            position = 500,
+            separatorAfter = 600
+    ),
+    @ActionReference(
+            path = "Loaders/text/x-antlr3/Actions",
+            id = @ActionID(category = "Edit", id = "org.openide.actions.DeleteAction"),
+            position = 700
+    ),
+    @ActionReference(
+            path = "Loaders/text/x-antlr3/Actions",
+            id = @ActionID(category = "System", id = "org.openide.actions.RenameAction"),
+            position = 800,
+            separatorAfter = 900
+    ),
+    @ActionReference(
+            path = "Loaders/text/x-antlr3/Actions",
+            id = @ActionID(category = "System", id = "org.openide.actions.SaveAsTemplateAction"),
+            position = 1000,
+            separatorAfter = 1100
+    ),
+    @ActionReference(
+            path = "Loaders/text/x-antlr3/Actions",
+            id = @ActionID(category = "System", id = "org.openide.actions.FileSystemAction"),
+            position = 1200,
+            separatorAfter = 1300
+    ),
+    @ActionReference(
+            path = "Loaders/text/x-antlr3/Actions",
+            id = @ActionID(category = "System", id = "org.openide.actions.ToolsAction"),
+            position = 1400
+    ),
+    @ActionReference(
+            path = "Loaders/text/x-antlr3/Actions",
+            id = @ActionID(category = "System", id = "org.openide.actions.PropertiesAction"),
+            position = 1500
+    ),
+    @ActionReference(
+            path = "Editors/text/x-antlr3/Popup",
+            id = @ActionID(category = "Refactoring", id = "org.netbeans.modules.refactoring.api.ui.WhereUsedAction"),
+            position = 1600
+    ),
+})
+
+@LanguageRegistration(mimeType = Antlr3Language.MIME_TYPE, useMultiview = true)
+public final class Antlr3Language extends DefaultLanguageConfig {
+
+    public static final String MIME_TYPE = "text/x-antlr3";
+
+    @Override
+    public Language getLexerLanguage() {
+        return language;
+    }
+
+    @Override
+    public String getDisplayName() {
+        return Bundle.ANTLRv3Resolver();
+    }
+
+    @Override
+    public String getPreferredExtension() {
+        return "g";
+    }
+
+    @Override
+    public Parser getParser() {
+        return new AntlrParser() {
+            @Override
+            protected AntlrParserResult<?> createParserResult(Snapshot snapshot) {
+                return new Antlr3ParserResult(snapshot);
+            }
+        };
+    }
+
+    @Override
+    public String getLineCommentPrefix() {
+        return "//"; // NOI18N
+    }
+
+    @Override
+    public DeclarationFinder getDeclarationFinder() {
+        return new AntlrDeclarationFinder();
+    }
+
+    @Override
+    public StructureScanner getStructureScanner() {
+        return new AntlrStructureScanner();
+    }
+
+    @Override
+    public boolean hasStructureScanner() {
+        return true;
+    }
+
+    @Override
+    public OccurrencesFinder getOccurrencesFinder() {
+        return new AntlrOccurancesFinder();
+    }
+
+    @Override
+    public boolean hasOccurrencesFinder() {
+        return true;
+    }
+
+    private static final Language<AntlrTokenId> language
+            = new AntlrTokenId.AntlrLanguageHierarchy() {
+
+                @Override
+                protected String mimeType() {
+                    return Antlr3Language.MIME_TYPE;
+                }
+
+                @Override
+                protected Lexer<AntlrTokenId> createLexer(LexerRestartInfo<AntlrTokenId> info) {
+                    return  new Antlr3Lexer(info);
+                }
+
+    }.language();
+
+    @NbBundle.Messages("Source=&Source")
+    @MultiViewElement.Registration(
+            displayName = "#Source",
+            persistenceType = TopComponent.PERSISTENCE_ONLY_OPENED,
+            mimeType = Antlr3Language.MIME_TYPE,
+            preferredID = "antlr3.source",
+            position = 100
+    )
+    public static MultiViewEditorElement createMultiViewEditorElement(Lookup context) {
+        return new MultiViewEditorElement(context);
+    }
+
+}
diff --git a/java/languages.antlr/src/org/netbeans/modules/languages/antlr/v3/Antlr3Lexer.java b/java/languages.antlr/src/org/netbeans/modules/languages/antlr/v3/Antlr3Lexer.java
new file mode 100644
index 0000000..baded59
--- /dev/null
+++ b/java/languages.antlr/src/org/netbeans/modules/languages/antlr/v3/Antlr3Lexer.java
@@ -0,0 +1,144 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.netbeans.modules.languages.antlr.v3;
+
+import org.netbeans.api.lexer.Token;
+import org.netbeans.spi.lexer.LexerRestartInfo;
+
+import static org.antlr.parser.antlr3.ANTLRv3Lexer.*;
+import org.netbeans.modules.languages.antlr.AbstractAntlrLexer;
+import org.netbeans.modules.languages.antlr.AntlrTokenId;
+import static org.netbeans.modules.languages.antlr.AntlrTokenId.*;
+import org.netbeans.modules.languages.antlr.LexerInputCharStream;
+
+/**
+ *
+ * @author lkishalmi
+ */
+public final class Antlr3Lexer extends AbstractAntlrLexer {
+
+
+    public Antlr3Lexer(LexerRestartInfo<AntlrTokenId> info) {
+        super(info, new org.antlr.parser.antlr3.ANTLRv3Lexer(new LexerInputCharStream(info.input())));
+    }
+
+    private org.antlr.v4.runtime.Token preFetchedToken = null;
+
+    @Override
+    public Token<AntlrTokenId> nextToken() {
+        org.antlr.v4.runtime.Token nextToken;
+        if (preFetchedToken != null) {
+            nextToken = preFetchedToken;
+            lexer.getInputStream().seek(preFetchedToken.getStopIndex() + 1);
+            preFetchedToken = null;
+        } else {
+            nextToken = lexer.nextToken();
+        }
+        if (nextToken.getType() == EOF) {
+            return null;
+        }
+        switch (nextToken.getType()) {
+            case TOKEN_REF:
+                return token(AntlrTokenId.TOKEN);
+            case RULE_REF:
+                return token(AntlrTokenId.RULE);
+
+            case DOC_COMMENT:
+            case ML_COMMENT:
+            case SL_COMMENT:
+                return token(AntlrTokenId.COMMENT);
+
+            case INT:
+                return token(NUMBER);
+
+            case CHAR_LITERAL:
+            case STRING_LITERAL:
+            case DOUBLE_QUOTE_STRING_LITERAL:
+            case DOUBLE_ANGLE_STRING_LITERAL:
+                return token(STRING);
+
+            case BEGIN_ARGUMENT:
+            case BEGIN_ACTION:
+            case END_ARGUMENT:
+            case END_ACTION:
+                return token(PUNCTUATION);
+
+
+            case OPTIONS:
+            case TOKENS:
+            case CATCH:
+            case FINALLY:
+            case FRAGMENT:
+            case GRAMMAR:
+            case LEXER:
+            case PARSER:
+            case PRIVATE:
+            case PROTECTED:
+            case PUBLIC:
+            case RETURNS:
+            case SCOPE:
+            case THROWS:
+            case TREE:
+                return token(KEYWORD);
+
+            case AT:
+            case COLON:
+            case COLONCOLON:
+            case COMMA:
+            case DOT:
+            case EQUAL:
+            case LBRACE:
+            case RBRACE:
+            case SEMI:
+            case SEMPREDOP:
+            case PEQ:
+            case REWRITE:
+                return token(PUNCTUATION);
+
+            case LBRACK:
+            case LPAREN:
+            case OR:
+            case PLUS:
+            case QM:
+            case RBRACK:
+            case RPAREN:
+            case STAR:
+            case DOLLAR:
+            case NOT:
+            case LEXER_CHAR_SET:
+            case RANGE:
+                return token(REGEXP_CHARS);
+
+            case WS:
+                return token(WHITESPACE);
+
+            case ACTION_CONTENT:
+                preFetchedToken = lexer.nextToken();
+                while (preFetchedToken.getType() == ACTION_CONTENT) {
+                    preFetchedToken = lexer.nextToken();
+                }
+                lexer.getInputStream().seek(preFetchedToken.getStartIndex());
+                return token(ACTION);
+
+            default:
+                return token(ERROR);
+        }
+    }
+
+}
diff --git a/java/languages.antlr/src/org/netbeans/modules/languages/antlr/v3/Antlr3ParserResult.java b/java/languages.antlr/src/org/netbeans/modules/languages/antlr/v3/Antlr3ParserResult.java
new file mode 100644
index 0000000..84c7583
--- /dev/null
+++ b/java/languages.antlr/src/org/netbeans/modules/languages/antlr/v3/Antlr3ParserResult.java
@@ -0,0 +1,214 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.netbeans.modules.languages.antlr.v3;
+
+import java.util.function.Consumer;
+import org.antlr.parser.antlr3.ANTLRv3Lexer;
+import org.antlr.parser.antlr3.ANTLRv3Parser;
+import org.antlr.parser.antlr3.ANTLRv3ParserBaseListener;
+import org.antlr.v4.runtime.CharStream;
+import org.antlr.v4.runtime.CharStreams;
+import org.antlr.v4.runtime.CommonTokenStream;
+import org.antlr.v4.runtime.Token;
+import org.antlr.v4.runtime.tree.ParseTreeListener;
+import org.netbeans.modules.csl.api.OffsetRange;
+import org.netbeans.modules.languages.antlr.AntlrParserResult;
+import org.netbeans.modules.languages.antlr.AntlrStructureItem;
+import org.netbeans.modules.parsing.api.Snapshot;
+
+/**
+ *
+ * @author lkishalmi
+ */
+public final class Antlr3ParserResult extends AntlrParserResult<ANTLRv3Parser> {
+
+    public Antlr3ParserResult(Snapshot snapshot) {
+        super(snapshot);
+    }
+
+    @Override
+    protected ANTLRv3Parser createParser(Snapshot snapshot) {
+        CharStream cs = CharStreams.fromString(String.valueOf(snapshot.getText()));
+        ANTLRv3Lexer lexer = new ANTLRv3Lexer(cs);
+        CommonTokenStream tokens = new CommonTokenStream(lexer);
+        return new ANTLRv3Parser(tokens);
+    }
+
+    @Override
+    protected void evaluateParser(ANTLRv3Parser parser) {
+        parser.grammarDef();
+    }
+
+    @Override
+    protected ParseTreeListener createReferenceListener() {
+        return new ANTLRv3ParserBaseListener() {
+            @Override
+            public void exitRule_(ANTLRv3Parser.Rule_Context ctx) {
+                Token token = ctx.id_().getStart();
+                OffsetRange range = new OffsetRange(token.getStartIndex(), token.getStopIndex() + 1);
+                String name = token.getText();
+                if (references.containsKey(name)) {
+                    references.get(name).defOffset = range;
+                } else {
+                    Reference ref = new Reference(name, getFileObject(), range);
+                    references.put(ref.name, ref);
+                }
+            }
+        };
+    }
+
+    @Override
+    protected ParseTreeListener createCheckReferences() {
+        return new ANTLRv3OccuranceListener((token) -> {
+            String name = token.getText();
+            if (!"EOF".equals(name) && (!references.containsKey(name) || references.get(name).defOffset == null)) {
+                //TODO: It seems the ANTLRv3 Grammar Occurance finder could be a bit smarter
+                //Adding the following line could produce false positives.
+                //errors.add(new DefaultError(null, "Unknown Reference: " + name, null, source, token.getStartIndex(), token.getStopIndex() + 1, Severity.ERROR));
+            }
+        });
+    }
+
+    @Override
+    protected ParseTreeListener createImportListener() {
+        return new ANTLRv3ParserBaseListener();
+    }
+
+    @Override
+    protected ParseTreeListener createFoldListener() {
+        return new ANTLRv3ParserBaseListener() {
+
+            private void addFold(Token startToken, Token stopToken) {
+                int start = startToken.getStopIndex() + 1;
+                int stop = stopToken.getStartIndex();
+                if (start >= stop) {
+                    return;
+                }
+                OffsetRange range = new OffsetRange(start, stop);
+                if (!folds.contains(range)) {
+                    folds.add(range);
+                }
+            }
+
+            @Override
+            public void exitActionBlock(ANTLRv3Parser.ActionBlockContext ctx) {
+                if (ctx.BEGIN_ACTION() != null && ctx.BEGIN_ACTION().getSymbol() != null
+                        && ctx.END_ACTION() != null && ctx.END_ACTION().getSymbol() != null) {
+                    addFold(ctx.BEGIN_ACTION().getSymbol(), ctx.END_ACTION().getSymbol());
+                }
+            }
+
+            @Override
+            public void exitRule_(ANTLRv3Parser.Rule_Context ctx) {
+                if (ctx.getStart() != null && ctx.getStop() != null) {
+                    addFold(ctx.getStart(), ctx.getStop());
+                }
+            }
+
+            @Override
+            public void exitTokenSpec(ANTLRv3Parser.TokenSpecContext ctx) {
+                if (ctx.getStart() != null && ctx.getStop() != null) {
+                    addFold(ctx.getStart(), ctx.getStop());
+                }
+            }
+
+        };
+    }
+
+    @Override
+    protected ParseTreeListener createStructureListener() {
+        return new ANTLRv3ParserBaseListener() {
+
+            @Override
+            public void exitRule_(ANTLRv3Parser.Rule_Context ctx) {
+                if (ctx.id_() != null) {
+                    AntlrStructureItem.RuleStructureItem rule = new AntlrStructureItem.RuleStructureItem(
+                            ctx.id_().getText(), getFileObject(), ctx.getStart().getStartIndex(), ctx.getStop().getStopIndex() + 1);
+                    structure.add(rule);
+                }
+            }
+
+        };
+    }
+
+    @Override
+    protected ParseTreeListener createOccurancesListener() {
+        return new ANTLRv3OccuranceListener((token) -> {
+                String refName = token.getText();
+                Reference ref = references.get(refName);
+                if (ref == null) {
+                    ref = new Reference(refName, getSnapshot().getSource().getFileObject(), null);
+                    references.put(ref.name, ref);
+                }
+                ref.occurances.add(new OffsetRange(token.getStartIndex(), token.getStopIndex() + 1));
+        });
+    }
+
+    private static class ANTLRv3OccuranceListener extends ANTLRv3ParserBaseListener {
+
+        private final Consumer<Token> onOccurance;
+
+        public ANTLRv3OccuranceListener(Consumer<Token> onOccurance) {
+            this.onOccurance = onOccurance;
+        }
+
+        @Override
+        public void exitAtom(ANTLRv3Parser.AtomContext ctx) {
+            if (ctx.RULE_REF() != null) {
+                onOccurance.accept(ctx.RULE_REF().getSymbol());
+            }
+        }
+
+        @Override
+        public void exitRewrite_tree_atom(ANTLRv3Parser.Rewrite_tree_atomContext ctx) {
+            if (ctx.TOKEN_REF() != null) {
+                onOccurance.accept(ctx.TOKEN_REF().getSymbol());
+            }
+            if (ctx.RULE_REF() != null) {
+                onOccurance.accept(ctx.RULE_REF().getSymbol());
+            }
+        }
+
+        @Override
+        public void exitNotTerminal(ANTLRv3Parser.NotTerminalContext ctx) {
+            if (ctx.TOKEN_REF() != null) {
+                onOccurance.accept(ctx.TOKEN_REF().getSymbol());
+            }
+        }
+
+        @Override
+        public void exitTokenSpec(ANTLRv3Parser.TokenSpecContext ctx) {
+            if (ctx.TOKEN_REF() != null) {
+                onOccurance.accept(ctx.TOKEN_REF().getSymbol());
+            }
+        }
+
+        @Override
+        public void exitId_(ANTLRv3Parser.Id_Context ctx) {
+            onOccurance.accept(ctx.getStart());
+        }
+
+        @Override
+        public void exitTerminal_(ANTLRv3Parser.Terminal_Context ctx) {
+            if (ctx.TOKEN_REF() != null) {
+                onOccurance.accept(ctx.TOKEN_REF().getSymbol());
+            }
+        }
+    }
+}
diff --git a/java/languages.antlr/src/org/netbeans/modules/languages/antlr/v4/Antlr4Language.java b/java/languages.antlr/src/org/netbeans/modules/languages/antlr/v4/Antlr4Language.java
new file mode 100644
index 0000000..70739c6
--- /dev/null
+++ b/java/languages.antlr/src/org/netbeans/modules/languages/antlr/v4/Antlr4Language.java
@@ -0,0 +1,205 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.netbeans.modules.languages.antlr.v4;
+
+import org.netbeans.modules.languages.antlr.*;
+import org.netbeans.api.lexer.Language;
+import org.netbeans.core.spi.multiview.MultiViewElement;
+import org.netbeans.core.spi.multiview.text.MultiViewEditorElement;
+import org.netbeans.modules.csl.api.DeclarationFinder;
+import org.netbeans.modules.csl.api.OccurrencesFinder;
+import org.netbeans.modules.csl.api.StructureScanner;
+import org.netbeans.modules.csl.spi.DefaultLanguageConfig;
+import org.netbeans.modules.csl.spi.LanguageRegistration;
+import org.netbeans.modules.languages.antlr.AntlrTokenId.AntlrLanguageHierarchy;
+import org.netbeans.modules.parsing.api.Snapshot;
+import org.netbeans.modules.parsing.spi.Parser;
+import org.netbeans.spi.lexer.Lexer;
+import org.netbeans.spi.lexer.LexerRestartInfo;
+import org.openide.awt.ActionID;
+import org.openide.awt.ActionReference;
+import org.openide.awt.ActionReferences;
+import org.openide.filesystems.MIMEResolver;
+import org.openide.util.Lookup;
+import org.openide.util.NbBundle;
+import org.openide.windows.TopComponent;
+
+/**
+ *
+ * @author lkishalmi
+ */
+@NbBundle.Messages(
+        "ANTLRv4Resolver=ANTLR v4 Grammar"
+)
+@MIMEResolver.ExtensionRegistration(displayName = "#ANTLRv4Resolver",
+        extension = "g4",
+        mimeType = Antlr4Language.MIME_TYPE,
+        position = 287
+)
+
+@ActionReferences({
+    @ActionReference(
+            path = "Loaders/text/x-antlr4/Actions",
+            id = @ActionID(category = "System", id = "org.openide.actions.OpenAction"),
+            position = 100,
+            separatorAfter = 200
+    ),
+    @ActionReference(
+            path = "Loaders/text/x-antlr4/Actions",
+            id = @ActionID(category = "Edit", id = "org.openide.actions.CutAction"),
+            position = 300
+    ),
+    @ActionReference(
+            path = "Loaders/text/x-antlr4/Actions",
+            id = @ActionID(category = "Edit", id = "org.openide.actions.CopyAction"),
+            position = 400
+    ),
+    @ActionReference(
+            path = "Loaders/text/x-antlr4/Actions",
+            id = @ActionID(category = "Edit", id = "org.openide.actions.PasteAction"),
+            position = 500,
+            separatorAfter = 600
+    ),
+    @ActionReference(
+            path = "Loaders/text/x-antlr4/Actions",
+            id = @ActionID(category = "Edit", id = "org.openide.actions.DeleteAction"),
+            position = 700
+    ),
+    @ActionReference(
+            path = "Loaders/text/x-antlr4/Actions",
+            id = @ActionID(category = "System", id = "org.openide.actions.RenameAction"),
+            position = 800,
+            separatorAfter = 900
+    ),
+    @ActionReference(
+            path = "Loaders/text/x-antlr4/Actions",
+            id = @ActionID(category = "System", id = "org.openide.actions.SaveAsTemplateAction"),
+            position = 1000,
+            separatorAfter = 1100
+    ),
+    @ActionReference(
+            path = "Loaders/text/x-antlr4/Actions",
+            id = @ActionID(category = "System", id = "org.openide.actions.FileSystemAction"),
+            position = 1200,
+            separatorAfter = 1300
+    ),
+    @ActionReference(
+            path = "Loaders/text/x-antlr4/Actions",
+            id = @ActionID(category = "System", id = "org.openide.actions.ToolsAction"),
+            position = 1400
+    ),
+    @ActionReference(
+            path = "Loaders/text/x-antlr4/Actions",
+            id = @ActionID(category = "System", id = "org.openide.actions.PropertiesAction"),
+            position = 1500
+    ),
+    @ActionReference(
+            path = "Editors/text/x-antlr4/Popup",
+            id = @ActionID(category = "Refactoring", id = "org.netbeans.modules.refactoring.api.ui.WhereUsedAction"),
+            position = 1600
+    ),
+})
+
+@LanguageRegistration(mimeType = Antlr4Language.MIME_TYPE, useMultiview = true)
+public final class Antlr4Language extends DefaultLanguageConfig {
+
+    public static final String MIME_TYPE = "text/x-antlr4";
+
+    @Override
+    public Language getLexerLanguage() {
+        return language;
+    }
+
+    @Override
+    public String getDisplayName() {
+        return Bundle.ANTLRv4Resolver();
+    }
+
+    @Override
+    public String getPreferredExtension() {
+        return "g4";
+    }
+
+    @Override
+    public Parser getParser() {
+        return new AntlrParser() {
+            @Override
+            protected AntlrParserResult<?> createParserResult(Snapshot snapshot) {
+                return new Antlr4ParserResult(snapshot);
+            }
+        };
+    }
+
+    @Override
+    public String getLineCommentPrefix() {
+        return "//"; // NOI18N
+    }
+
+    @Override
+    public DeclarationFinder getDeclarationFinder() {
+        return new AntlrDeclarationFinder();
+    }
+
+    @Override
+    public StructureScanner getStructureScanner() {
+        return new AntlrStructureScanner();
+    }
+
+    @Override
+    public boolean hasStructureScanner() {
+        return true;
+    }
+
+    @Override
+    public OccurrencesFinder getOccurrencesFinder() {
+        return new AntlrOccurancesFinder();
+    }
+
+    @Override
+    public boolean hasOccurrencesFinder() {
+        return true;
+    }
+    private static final Language<AntlrTokenId> language
+            = new AntlrLanguageHierarchy() {
+
+                @Override
+                protected String mimeType() {
+                    return Antlr4Language.MIME_TYPE;
+                }
+
+                @Override
+                protected Lexer<AntlrTokenId> createLexer(LexerRestartInfo<AntlrTokenId> info) {
+                    return  new Antlr4Lexer(info);
+                }
+
+    }.language();
+
+    @NbBundle.Messages("Source=&Source")
+    @MultiViewElement.Registration(
+            displayName = "#Source",
+            persistenceType = TopComponent.PERSISTENCE_ONLY_OPENED,
+            mimeType = Antlr4Language.MIME_TYPE,
+            preferredID = "antlr4.source",
+            position = 100
+    )
+    public static MultiViewEditorElement createMultiViewEditorElement(Lookup context) {
+        return new MultiViewEditorElement(context);
+    }
+
+}
diff --git a/java/languages.antlr/src/org/netbeans/modules/languages/antlr/v4/Antlr4Lexer.java b/java/languages.antlr/src/org/netbeans/modules/languages/antlr/v4/Antlr4Lexer.java
new file mode 100644
index 0000000..2c54130
--- /dev/null
+++ b/java/languages.antlr/src/org/netbeans/modules/languages/antlr/v4/Antlr4Lexer.java
@@ -0,0 +1,139 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.netbeans.modules.languages.antlr.v4;
+
+import org.netbeans.api.lexer.Token;
+import org.netbeans.spi.lexer.LexerRestartInfo;
+
+import static org.antlr.parser.antlr4.ANTLRv4Lexer.*;
+import org.netbeans.modules.languages.antlr.AbstractAntlrLexer;
+import org.netbeans.modules.languages.antlr.AntlrTokenId;
+import static org.netbeans.modules.languages.antlr.AntlrTokenId.*;
+import org.netbeans.modules.languages.antlr.LexerInputCharStream;
+
+/**
+ *
+ * @author lkishalmi
+ */
+public final class Antlr4Lexer extends AbstractAntlrLexer {
+
+
+    public Antlr4Lexer(LexerRestartInfo<AntlrTokenId> info) {
+        super(info, new org.antlr.parser.antlr4.ANTLRv4Lexer(new LexerInputCharStream(info.input())));
+    }
+
+    private org.antlr.v4.runtime.Token preFetchedToken = null;
+
+    @Override
+    public Token<AntlrTokenId> nextToken() {
+        org.antlr.v4.runtime.Token nextToken;
+        if (preFetchedToken != null) {
+            nextToken = preFetchedToken;
+            lexer.getInputStream().seek(preFetchedToken.getStopIndex() + 1);
+            preFetchedToken = null;
+        } else {
+            nextToken = lexer.nextToken();
+        }
+        if (nextToken.getType() == EOF) {
+            return null;
+        }
+        switch (nextToken.getType()) {
+            case TOKEN_REF:
+                return token(TOKEN);
+            case RULE_REF:
+                return token(RULE);
+
+            case DOC_COMMENT:
+            case BLOCK_COMMENT:
+            case LINE_COMMENT:
+                return token(AntlrTokenId.COMMENT);
+
+            case INT:
+                return token(NUMBER);
+
+            case LEXER_CHAR_SET:
+            case STRING_LITERAL:
+            case UNTERMINATED_STRING_LITERAL:
+                return token(STRING);
+
+            case OPTIONS:
+            case TOKENS:
+            case CHANNELS:
+            case IMPORT:
+            case FRAGMENT:
+            case LEXER:
+            case PARSER:
+            case GRAMMAR:
+            case PROTECTED:
+            case PUBLIC:
+            case PRIVATE:
+            case RETURNS:
+            case LOCALS:
+            case THROWS:
+            case CATCH:
+            case FINALLY:
+            case MODE:
+                return token(KEYWORD);
+
+            case COLON:
+            case COLONCOLON:
+            case LT:
+            case GT:
+            case BEGIN_ACTION:
+            case END_ACTION:
+            case AT:
+            case PLUS_ASSIGN:
+            case POUND:
+            case LBRACE:
+            case RBRACE:
+            case RARROW:
+            case ASSIGN:
+            case COMMA:
+            case SEMI:
+                return token(PUNCTUATION);
+
+            case LPAREN:
+            case RPAREN:
+            case QUESTION:
+            case STAR:
+            case PLUS:
+            case OR:
+            case DOLLAR:
+            case RANGE:
+            case DOT:
+            case NOT:
+                return token(REGEXP_CHARS);
+
+            case WS:
+                return token(WHITESPACE);
+
+            case ACTION_CONTENT:
+                preFetchedToken = lexer.nextToken();
+                while (preFetchedToken.getType() == ACTION_CONTENT) {
+                    preFetchedToken = lexer.nextToken();
+                }
+                lexer.getInputStream().seek(preFetchedToken.getStartIndex());
+                return token(ACTION);
+
+            default:
+                return token(ERROR);
+        }
+    }
+
+}
diff --git a/java/languages.antlr/src/org/netbeans/modules/languages/antlr/v4/Antlr4ParserResult.java b/java/languages.antlr/src/org/netbeans/modules/languages/antlr/v4/Antlr4ParserResult.java
new file mode 100644
index 0000000..ffffb31
--- /dev/null
+++ b/java/languages.antlr/src/org/netbeans/modules/languages/antlr/v4/Antlr4ParserResult.java
@@ -0,0 +1,291 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.netbeans.modules.languages.antlr.v4;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.function.Consumer;
+import org.antlr.parser.antlr4.ANTLRv4Lexer;
+import org.antlr.parser.antlr4.ANTLRv4Parser;
+import org.antlr.parser.antlr4.ANTLRv4ParserBaseListener;
+import org.antlr.v4.runtime.CharStream;
+import org.antlr.v4.runtime.CharStreams;
+import org.antlr.v4.runtime.CommonTokenStream;
+import org.antlr.v4.runtime.Token;
+import org.antlr.v4.runtime.tree.ParseTreeListener;
+import org.netbeans.modules.csl.api.OffsetRange;
+import org.netbeans.modules.csl.api.Severity;
+import org.netbeans.modules.csl.spi.DefaultError;
+import org.netbeans.modules.languages.antlr.AntlrParser;
+import org.netbeans.modules.languages.antlr.AntlrParserResult;
+import org.netbeans.modules.languages.antlr.AntlrStructureItem;
+import org.netbeans.modules.parsing.api.Snapshot;
+import org.openide.filesystems.FileObject;
+
+/**
+ *
+ * @author lkishalmi
+ */
+public final class Antlr4ParserResult extends AntlrParserResult<ANTLRv4Parser> {
+
+    private List<String> imports = new ArrayList<>();
+
+    public Antlr4ParserResult(Snapshot snapshot) {
+        super(snapshot);
+    }
+    
+    @Override
+    protected ANTLRv4Parser createParser(Snapshot snapshot) {
+        CharStream cs = CharStreams.fromString(String.valueOf(snapshot.getText()));
+        ANTLRv4Lexer lexer = new org.antlr.parser.antlr4.ANTLRv4Lexer(cs);
+        CommonTokenStream tokens = new CommonTokenStream(lexer);
+        return new ANTLRv4Parser(tokens);
+    }
+
+    @Override
+    protected void evaluateParser(ANTLRv4Parser parser) {
+        parser.grammarSpec();
+    }
+
+    @Override
+    protected ParseTreeListener createReferenceListener() {
+        return new ANTLRv4ParserBaseListener() {
+            @Override
+            public void exitParserRuleSpec(ANTLRv4Parser.ParserRuleSpecContext ctx) {
+                Token token = ctx.RULE_REF().getSymbol();
+                addReference(token);
+            }
+
+            @Override
+            public void exitLexerRuleSpec(ANTLRv4Parser.LexerRuleSpecContext ctx) {
+                Token token = ctx.TOKEN_REF().getSymbol();
+                addReference(token);
+            }
+
+            @Override
+            public void exitTokensSpec(ANTLRv4Parser.TokensSpecContext ctx) {
+                List<ANTLRv4Parser.IdentifierContext> ids = ctx.idList().identifier();
+                for (ANTLRv4Parser.IdentifierContext id : ids) {
+                    if (id.TOKEN_REF() != null) {
+                        addReference(id.TOKEN_REF().getSymbol());
+                    }
+                }
+            }
+
+            public void addReference(Token token) {
+                OffsetRange range = new OffsetRange(token.getStartIndex(), token.getStopIndex() + 1);
+                String name = token.getText();
+                if(references.containsKey(name)) {
+                    references.get(name).defOffset = range;
+                } else {
+                    Reference ref = new Reference(name, getFileObject(), range);
+                    references.put(ref.name, ref);
+                }
+            }
+
+        };
+    }
+
+
+    @Override
+    protected ParseTreeListener createCheckReferences() {
+        final Map<String, Reference> allRefs = new HashMap<>(references);
+        for (String im : imports) {
+            FileObject fo = getFileObject().getParent().getFileObject(im + ".g4");
+            if (fo != null) {
+                AntlrParserResult pr = AntlrParser.getParserResult(fo);
+                allRefs.putAll(pr.references);
+            }
+        }
+        return new ANTLRv4OccuranceListener((token) -> {
+            String name = token.getText();
+            if(!"EOF".equals(name) && (!allRefs.containsKey(name) || (allRefs.get(name).defOffset == null))) {
+                errors.add(new DefaultError(null, "Unknown Reference: " + name, null, getFileObject(), token.getStartIndex(), token.getStopIndex() + 1, Severity.ERROR));
+            }
+        });
+    }
+
+    @Override
+    protected ParseTreeListener createImportListener() {
+        return new ANTLRv4ParserBaseListener() {
+            private void addImport(String importedGrammar) {
+                imports.add(importedGrammar);
+            }
+
+            @Override
+            public void exitDelegateGrammar(ANTLRv4Parser.DelegateGrammarContext ctx) {
+                addImport(ctx.identifier(0).getText());
+            }
+
+            @Override
+            public void exitOption(ANTLRv4Parser.OptionContext ctx) {
+                if ("tokenVocab".equals(ctx.identifier().getText())) {
+                    addImport(ctx.optionValue().getText());
+                }
+            }
+
+        };
+    }
+
+    @Override
+    protected ParseTreeListener createFoldListener() {
+        return new ANTLRv4ParserBaseListener() {
+
+            private void addFold(Token startToken, Token stopToken) {
+                int start = startToken.getStopIndex() + 1;
+                int stop = stopToken.getStartIndex();
+                if(start >= stop) {
+                    return;
+                }
+                OffsetRange range = new OffsetRange(start, stop);
+                if(! folds.contains(range)) {
+                    folds.add(range);
+                }
+            }
+
+            @Override
+            public void exitLexerRuleSpec(ANTLRv4Parser.LexerRuleSpecContext ctx) {
+                if(ctx.TOKEN_REF() != null && ctx.TOKEN_REF().getSymbol() != null
+                        && ctx.SEMI() != null && ctx.SEMI().getSymbol() != null) {
+                    addFold(ctx.TOKEN_REF().getSymbol(), ctx.SEMI().getSymbol());
+                }
+            }
+
+            @Override
+            public void exitActionBlock(ANTLRv4Parser.ActionBlockContext ctx) {
+                if(ctx.BEGIN_ACTION() != null && ctx.BEGIN_ACTION().getSymbol() != null
+                        && ctx.END_ACTION() != null && ctx.END_ACTION().getSymbol() != null) {
+                    addFold(ctx.BEGIN_ACTION().getSymbol(), ctx.END_ACTION().getSymbol());
+                }
+            }
+
+            @Override
+            public void exitParserRuleSpec(ANTLRv4Parser.ParserRuleSpecContext ctx) {
+                if (ctx.RULE_REF() != null && ctx.RULE_REF().getSymbol() != null
+                        && ctx.SEMI() != null && ctx.SEMI().getSymbol() != null) {
+                    addFold(ctx.RULE_REF().getSymbol(), ctx.SEMI().getSymbol());
+                }
+            }
+
+            @Override
+            public void exitRules(ANTLRv4Parser.RulesContext ctx) {
+                if(ctx.getStart() != null && ctx.getStop() != null) {
+                    addFold(ctx.getStart(), ctx.getStop());
+                }
+            }
+
+            @Override
+            public void exitModeSpec(ANTLRv4Parser.ModeSpecContext ctx) {
+                if (ctx.identifier() != null && ctx.identifier().getStop() != null
+                        && ctx.getStop() != null) {
+                    addFold(ctx.identifier().getStop(), ctx.getStop());
+                }
+            }
+
+        };
+    }
+
+    @Override
+    protected ParseTreeListener createStructureListener() {
+        return new ANTLRv4ParserBaseListener() {
+            final List<AntlrStructureItem.RuleStructureItem> lexerStructure = new ArrayList<>();
+
+            @Override
+            public void exitLexerRuleSpec(ANTLRv4Parser.LexerRuleSpecContext ctx) {
+                if ((ctx.FRAGMENT() == null) && (ctx.TOKEN_REF() != null)) {
+                    // Do not represent fragments in the structure
+                    AntlrStructureItem.RuleStructureItem rule = new AntlrStructureItem.RuleStructureItem(ctx.TOKEN_REF().getText(), getFileObject(), ctx.getStart().getStartIndex(), ctx.getStop().getStopIndex() + 1);
+                    lexerStructure.add(rule);
+                }
+            }
+
+            @Override
+            public void exitParserRuleSpec(ANTLRv4Parser.ParserRuleSpecContext ctx) {
+                if (ctx.RULE_REF() != null) {
+                    AntlrStructureItem.RuleStructureItem rule = new AntlrStructureItem.RuleStructureItem(ctx.RULE_REF().getText(), getFileObject(), ctx.getStart().getStartIndex(), ctx.getStop().getStopIndex() + 1);
+                    structure.add(rule);
+                }
+            }
+
+            @Override
+            public void exitRules(ANTLRv4Parser.RulesContext ctx) {
+                if (!lexerStructure.isEmpty()) {
+                    AntlrStructureItem.ModeStructureItem mode = new AntlrStructureItem.ModeStructureItem(getFileObject(), ctx.getStart().getStartIndex(), ctx.getStop().getStopIndex() + 1);
+                    mode.rules.addAll(lexerStructure);
+                    structure.add(mode);
+                    lexerStructure.clear();
+                }
+
+            }
+
+            @Override
+            public void exitModeSpec(ANTLRv4Parser.ModeSpecContext ctx) {
+                AntlrStructureItem.ModeStructureItem mode = new AntlrStructureItem.ModeStructureItem(ctx.identifier().getText(), getFileObject(), ctx.getStart().getStartIndex(), ctx.getStop().getStopIndex() + 1);
+                mode.rules.addAll(lexerStructure);
+                structure.add(mode);
+                lexerStructure.clear();
+            }
+
+        };
+    }
+
+    private void addOccurance(Token token) {
+        String refName = token.getText();
+        Reference ref = references.get(refName);
+        if (ref == null) {
+            ref = new Reference(refName, getSnapshot().getSource().getFileObject(), null);
+            references.put(ref.name, ref);
+        }
+       ref.occurances.add(new OffsetRange(token.getStartIndex(), token.getStopIndex() + 1));
+    }
+
+    @Override
+    protected ParseTreeListener createOccurancesListener() {
+        return new ANTLRv4OccuranceListener(this::addOccurance);
+    }
+
+    public List<String> getImports() {
+        return Collections.unmodifiableList(imports);
+    }
+
+    private static class ANTLRv4OccuranceListener extends ANTLRv4ParserBaseListener {
+        private final Consumer<Token> onOccurance;
+
+        public ANTLRv4OccuranceListener(Consumer<Token> onOccurance) {
+            this.onOccurance = onOccurance;
+        }
+
+        @Override
+        public void exitTerminal(ANTLRv4Parser.TerminalContext ctx) {
+            if (ctx.TOKEN_REF() != null) {
+                onOccurance.accept(ctx.TOKEN_REF().getSymbol());
+            }
+        }
+
+        @Override
+        public void exitRuleref(ANTLRv4Parser.RulerefContext ctx) {
+            if (ctx.RULE_REF() != null) {
+                onOccurance.accept(ctx.RULE_REF().getSymbol());
+            }
+        }
+    }
+}
diff --git a/java/libs.javacapi/external/binaries-list b/java/libs.javacapi/external/binaries-list
index cb152e0..b42feac 100644
--- a/java/libs.javacapi/external/binaries-list
+++ b/java/libs.javacapi/external/binaries-list
@@ -14,5 +14,5 @@
 # KIND, either express or implied.  See the License for the
 # specific language governing permissions and limitations
 # under the License.
-ECA15E615777CE6E7550F71EF312B8CEEBCBE0BD com.dukescript.nbjavac:nb-javac:jdk-18.0.1+10:api
-3AD512FBC8830D89AC70D0CA59397C4868789DCC com.dukescript.nbjavac:nb-javac:jdk-18.0.1+10
+DBA592C75DD52B97EC88A6B06ADF71D4F3C3DED9 com.dukescript.nbjavac:nb-javac:jdk-19+33:api
+A36688EDA1DE51508A039AED3518771C6F75E416 com.dukescript.nbjavac:nb-javac:jdk-19+33
diff --git a/java/libs.javacapi/external/nb-javac-jdk-18.0.1+10-license.txt b/java/libs.javacapi/external/nb-javac-jdk-19+33-license.txt
similarity index 98%
rename from java/libs.javacapi/external/nb-javac-jdk-18.0.1+10-license.txt
rename to java/libs.javacapi/external/nb-javac-jdk-19+33-license.txt
index 2329bc0..8123b5f 100644
--- a/java/libs.javacapi/external/nb-javac-jdk-18.0.1+10-license.txt
+++ b/java/libs.javacapi/external/nb-javac-jdk-19+33-license.txt
@@ -1,10 +1,10 @@
 Name: Javac Compiler Implementation
 Description: Javac Compiler Implementation
-Version: 18.0.1+10
-Files: nb-javac-jdk-18.0.1+10-api.jar nb-javac-jdk-18.0.1+10.jar
+Version: jdk-19+33
+Files: nb-javac-jdk-19+33-api.jar nb-javac-jdk-19+33.jar
 License: GPL-2-CP
-Origin: OpenJDK (https://github.com/openjdk/jdk18)
-Source: https://github.com/openjdk/jdk18
+Origin: OpenJDK (https://github.com/openjdk/jdk19)
+Source: https://github.com/openjdk/jdk19
 Type: optional,reviewed
 Comment: The binary has been reviewed to be under the Classpath Exception as a whole. Optional at runtime, but used by default.
 
diff --git a/java/libs.javacapi/nbproject/org-netbeans-libs-javacapi.sig b/java/libs.javacapi/nbproject/org-netbeans-libs-javacapi.sig
index e3a6abe..8082273 100644
--- a/java/libs.javacapi/nbproject/org-netbeans-libs-javacapi.sig
+++ b/java/libs.javacapi/nbproject/org-netbeans-libs-javacapi.sig
@@ -1,5 +1,5 @@
 #Signature file v4.1
-#Version 8.39.0
+#Version 8.41.0
 
 CLSS public abstract interface com.sun.source.doctree.AttributeTree
 innr public final static !enum ValueKind
@@ -380,10 +380,20 @@
 meth public abstract com.sun.source.tree.ExpressionTree getFalseExpression()
 meth public abstract com.sun.source.tree.ExpressionTree getTrueExpression()
 
+CLSS public abstract interface com.sun.source.tree.ConstantCaseLabelTree
+intf com.sun.source.tree.CaseLabelTree
+meth public abstract com.sun.source.tree.ExpressionTree getConstantExpression()
+
 CLSS public abstract interface com.sun.source.tree.ContinueTree
 intf com.sun.source.tree.StatementTree
 meth public abstract javax.lang.model.element.Name getLabel()
 
+CLSS public abstract interface com.sun.source.tree.DeconstructionPatternTree
+intf com.sun.source.tree.PatternTree
+meth public abstract com.sun.source.tree.ExpressionTree getDeconstructor()
+meth public abstract com.sun.source.tree.VariableTree getVariable()
+meth public abstract java.util.List<? extends com.sun.source.tree.PatternTree> getNestedPatterns()
+
 CLSS public abstract interface com.sun.source.tree.DefaultCaseLabelTree
 intf com.sun.source.tree.CaseLabelTree
 
@@ -418,7 +428,6 @@
 meth public abstract com.sun.source.tree.ExpressionTree getExpression()
 
 CLSS public abstract interface com.sun.source.tree.ExpressionTree
-intf com.sun.source.tree.CaseLabelTree
 intf com.sun.source.tree.Tree
 
 CLSS public abstract interface com.sun.source.tree.ForLoopTree
@@ -428,11 +437,6 @@
 meth public abstract java.util.List<? extends com.sun.source.tree.ExpressionStatementTree> getUpdate()
 meth public abstract java.util.List<? extends com.sun.source.tree.StatementTree> getInitializer()
 
-CLSS public abstract interface com.sun.source.tree.GuardedPatternTree
-intf com.sun.source.tree.PatternTree
-meth public abstract com.sun.source.tree.ExpressionTree getExpression()
-meth public abstract com.sun.source.tree.PatternTree getPattern()
-
 CLSS public abstract interface com.sun.source.tree.IdentifierTree
 intf com.sun.source.tree.ExpressionTree
 meth public abstract javax.lang.model.element.Name getName()
@@ -587,8 +591,12 @@
 intf com.sun.source.tree.ExpressionTree
 meth public abstract com.sun.source.tree.ExpressionTree getExpression()
 
-CLSS public abstract interface com.sun.source.tree.PatternTree
+CLSS public abstract interface com.sun.source.tree.PatternCaseLabelTree
 intf com.sun.source.tree.CaseLabelTree
+meth public abstract com.sun.source.tree.ExpressionTree getGuard()
+meth public abstract com.sun.source.tree.PatternTree getPattern()
+
+CLSS public abstract interface com.sun.source.tree.PatternTree
 intf com.sun.source.tree.Tree
 
 CLSS public abstract interface com.sun.source.tree.PrimitiveTypeTree
@@ -667,7 +675,9 @@
 fld public final static com.sun.source.tree.Tree$Kind CONDITIONAL_AND
 fld public final static com.sun.source.tree.Tree$Kind CONDITIONAL_EXPRESSION
 fld public final static com.sun.source.tree.Tree$Kind CONDITIONAL_OR
+fld public final static com.sun.source.tree.Tree$Kind CONSTANT_CASE_LABEL
 fld public final static com.sun.source.tree.Tree$Kind CONTINUE
+fld public final static com.sun.source.tree.Tree$Kind DECONSTRUCTION_PATTERN
 fld public final static com.sun.source.tree.Tree$Kind DEFAULT_CASE_LABEL
 fld public final static com.sun.source.tree.Tree$Kind DIVIDE
 fld public final static com.sun.source.tree.Tree$Kind DIVIDE_ASSIGNMENT
@@ -685,7 +695,6 @@
 fld public final static com.sun.source.tree.Tree$Kind FOR_LOOP
 fld public final static com.sun.source.tree.Tree$Kind GREATER_THAN
 fld public final static com.sun.source.tree.Tree$Kind GREATER_THAN_EQUAL
-fld public final static com.sun.source.tree.Tree$Kind GUARDED_PATTERN
 fld public final static com.sun.source.tree.Tree$Kind IDENTIFIER
 fld public final static com.sun.source.tree.Tree$Kind IF
 fld public final static com.sun.source.tree.Tree$Kind IMPORT
@@ -723,6 +732,7 @@
 fld public final static com.sun.source.tree.Tree$Kind PARAMETERIZED_TYPE
 fld public final static com.sun.source.tree.Tree$Kind PARENTHESIZED
 fld public final static com.sun.source.tree.Tree$Kind PARENTHESIZED_PATTERN
+fld public final static com.sun.source.tree.Tree$Kind PATTERN_CASE_LABEL
 fld public final static com.sun.source.tree.Tree$Kind PLUS
 fld public final static com.sun.source.tree.Tree$Kind PLUS_ASSIGNMENT
 fld public final static com.sun.source.tree.Tree$Kind POSTFIX_DECREMENT
@@ -783,7 +793,9 @@
 meth public abstract {com.sun.source.tree.TreeVisitor%0} visitCompilationUnit(com.sun.source.tree.CompilationUnitTree,{com.sun.source.tree.TreeVisitor%1})
 meth public abstract {com.sun.source.tree.TreeVisitor%0} visitCompoundAssignment(com.sun.source.tree.CompoundAssignmentTree,{com.sun.source.tree.TreeVisitor%1})
 meth public abstract {com.sun.source.tree.TreeVisitor%0} visitConditionalExpression(com.sun.source.tree.ConditionalExpressionTree,{com.sun.source.tree.TreeVisitor%1})
+meth public abstract {com.sun.source.tree.TreeVisitor%0} visitConstantCaseLabel(com.sun.source.tree.ConstantCaseLabelTree,{com.sun.source.tree.TreeVisitor%1})
 meth public abstract {com.sun.source.tree.TreeVisitor%0} visitContinue(com.sun.source.tree.ContinueTree,{com.sun.source.tree.TreeVisitor%1})
+meth public abstract {com.sun.source.tree.TreeVisitor%0} visitDeconstructionPattern(com.sun.source.tree.DeconstructionPatternTree,{com.sun.source.tree.TreeVisitor%1})
 meth public abstract {com.sun.source.tree.TreeVisitor%0} visitDefaultCaseLabel(com.sun.source.tree.DefaultCaseLabelTree,{com.sun.source.tree.TreeVisitor%1})
 meth public abstract {com.sun.source.tree.TreeVisitor%0} visitDoWhileLoop(com.sun.source.tree.DoWhileLoopTree,{com.sun.source.tree.TreeVisitor%1})
 meth public abstract {com.sun.source.tree.TreeVisitor%0} visitEmptyStatement(com.sun.source.tree.EmptyStatementTree,{com.sun.source.tree.TreeVisitor%1})
@@ -792,7 +804,6 @@
 meth public abstract {com.sun.source.tree.TreeVisitor%0} visitExports(com.sun.source.tree.ExportsTree,{com.sun.source.tree.TreeVisitor%1})
 meth public abstract {com.sun.source.tree.TreeVisitor%0} visitExpressionStatement(com.sun.source.tree.ExpressionStatementTree,{com.sun.source.tree.TreeVisitor%1})
 meth public abstract {com.sun.source.tree.TreeVisitor%0} visitForLoop(com.sun.source.tree.ForLoopTree,{com.sun.source.tree.TreeVisitor%1})
-meth public abstract {com.sun.source.tree.TreeVisitor%0} visitGuardedPattern(com.sun.source.tree.GuardedPatternTree,{com.sun.source.tree.TreeVisitor%1})
 meth public abstract {com.sun.source.tree.TreeVisitor%0} visitIdentifier(com.sun.source.tree.IdentifierTree,{com.sun.source.tree.TreeVisitor%1})
 meth public abstract {com.sun.source.tree.TreeVisitor%0} visitIf(com.sun.source.tree.IfTree,{com.sun.source.tree.TreeVisitor%1})
 meth public abstract {com.sun.source.tree.TreeVisitor%0} visitImport(com.sun.source.tree.ImportTree,{com.sun.source.tree.TreeVisitor%1})
@@ -815,6 +826,7 @@
 meth public abstract {com.sun.source.tree.TreeVisitor%0} visitParameterizedType(com.sun.source.tree.ParameterizedTypeTree,{com.sun.source.tree.TreeVisitor%1})
 meth public abstract {com.sun.source.tree.TreeVisitor%0} visitParenthesized(com.sun.source.tree.ParenthesizedTree,{com.sun.source.tree.TreeVisitor%1})
 meth public abstract {com.sun.source.tree.TreeVisitor%0} visitParenthesizedPattern(com.sun.source.tree.ParenthesizedPatternTree,{com.sun.source.tree.TreeVisitor%1})
+meth public abstract {com.sun.source.tree.TreeVisitor%0} visitPatternCaseLabel(com.sun.source.tree.PatternCaseLabelTree,{com.sun.source.tree.TreeVisitor%1})
 meth public abstract {com.sun.source.tree.TreeVisitor%0} visitPrimitiveType(com.sun.source.tree.PrimitiveTypeTree,{com.sun.source.tree.TreeVisitor%1})
 meth public abstract {com.sun.source.tree.TreeVisitor%0} visitProvides(com.sun.source.tree.ProvidesTree,{com.sun.source.tree.TreeVisitor%1})
 meth public abstract {com.sun.source.tree.TreeVisitor%0} visitRequires(com.sun.source.tree.RequiresTree,{com.sun.source.tree.TreeVisitor%1})
@@ -1117,7 +1129,9 @@
 meth public {com.sun.source.util.SimpleTreeVisitor%0} visitCompilationUnit(com.sun.source.tree.CompilationUnitTree,{com.sun.source.util.SimpleTreeVisitor%1})
 meth public {com.sun.source.util.SimpleTreeVisitor%0} visitCompoundAssignment(com.sun.source.tree.CompoundAssignmentTree,{com.sun.source.util.SimpleTreeVisitor%1})
 meth public {com.sun.source.util.SimpleTreeVisitor%0} visitConditionalExpression(com.sun.source.tree.ConditionalExpressionTree,{com.sun.source.util.SimpleTreeVisitor%1})
+meth public {com.sun.source.util.SimpleTreeVisitor%0} visitConstantCaseLabel(com.sun.source.tree.ConstantCaseLabelTree,{com.sun.source.util.SimpleTreeVisitor%1})
 meth public {com.sun.source.util.SimpleTreeVisitor%0} visitContinue(com.sun.source.tree.ContinueTree,{com.sun.source.util.SimpleTreeVisitor%1})
+meth public {com.sun.source.util.SimpleTreeVisitor%0} visitDeconstructionPattern(com.sun.source.tree.DeconstructionPatternTree,{com.sun.source.util.SimpleTreeVisitor%1})
 meth public {com.sun.source.util.SimpleTreeVisitor%0} visitDefaultCaseLabel(com.sun.source.tree.DefaultCaseLabelTree,{com.sun.source.util.SimpleTreeVisitor%1})
 meth public {com.sun.source.util.SimpleTreeVisitor%0} visitDoWhileLoop(com.sun.source.tree.DoWhileLoopTree,{com.sun.source.util.SimpleTreeVisitor%1})
 meth public {com.sun.source.util.SimpleTreeVisitor%0} visitEmptyStatement(com.sun.source.tree.EmptyStatementTree,{com.sun.source.util.SimpleTreeVisitor%1})
@@ -1126,7 +1140,6 @@
 meth public {com.sun.source.util.SimpleTreeVisitor%0} visitExports(com.sun.source.tree.ExportsTree,{com.sun.source.util.SimpleTreeVisitor%1})
 meth public {com.sun.source.util.SimpleTreeVisitor%0} visitExpressionStatement(com.sun.source.tree.ExpressionStatementTree,{com.sun.source.util.SimpleTreeVisitor%1})
 meth public {com.sun.source.util.SimpleTreeVisitor%0} visitForLoop(com.sun.source.tree.ForLoopTree,{com.sun.source.util.SimpleTreeVisitor%1})
-meth public {com.sun.source.util.SimpleTreeVisitor%0} visitGuardedPattern(com.sun.source.tree.GuardedPatternTree,{com.sun.source.util.SimpleTreeVisitor%1})
 meth public {com.sun.source.util.SimpleTreeVisitor%0} visitIdentifier(com.sun.source.tree.IdentifierTree,{com.sun.source.util.SimpleTreeVisitor%1})
 meth public {com.sun.source.util.SimpleTreeVisitor%0} visitIf(com.sun.source.tree.IfTree,{com.sun.source.util.SimpleTreeVisitor%1})
 meth public {com.sun.source.util.SimpleTreeVisitor%0} visitImport(com.sun.source.tree.ImportTree,{com.sun.source.util.SimpleTreeVisitor%1})
@@ -1149,6 +1162,7 @@
 meth public {com.sun.source.util.SimpleTreeVisitor%0} visitParameterizedType(com.sun.source.tree.ParameterizedTypeTree,{com.sun.source.util.SimpleTreeVisitor%1})
 meth public {com.sun.source.util.SimpleTreeVisitor%0} visitParenthesized(com.sun.source.tree.ParenthesizedTree,{com.sun.source.util.SimpleTreeVisitor%1})
 meth public {com.sun.source.util.SimpleTreeVisitor%0} visitParenthesizedPattern(com.sun.source.tree.ParenthesizedPatternTree,{com.sun.source.util.SimpleTreeVisitor%1})
+meth public {com.sun.source.util.SimpleTreeVisitor%0} visitPatternCaseLabel(com.sun.source.tree.PatternCaseLabelTree,{com.sun.source.util.SimpleTreeVisitor%1})
 meth public {com.sun.source.util.SimpleTreeVisitor%0} visitPrimitiveType(com.sun.source.tree.PrimitiveTypeTree,{com.sun.source.util.SimpleTreeVisitor%1})
 meth public {com.sun.source.util.SimpleTreeVisitor%0} visitProvides(com.sun.source.tree.ProvidesTree,{com.sun.source.util.SimpleTreeVisitor%1})
 meth public {com.sun.source.util.SimpleTreeVisitor%0} visitRequires(com.sun.source.tree.RequiresTree,{com.sun.source.util.SimpleTreeVisitor%1})
@@ -1247,7 +1261,9 @@
 meth public {com.sun.source.util.TreeScanner%0} visitCompilationUnit(com.sun.source.tree.CompilationUnitTree,{com.sun.source.util.TreeScanner%1})
 meth public {com.sun.source.util.TreeScanner%0} visitCompoundAssignment(com.sun.source.tree.CompoundAssignmentTree,{com.sun.source.util.TreeScanner%1})
 meth public {com.sun.source.util.TreeScanner%0} visitConditionalExpression(com.sun.source.tree.ConditionalExpressionTree,{com.sun.source.util.TreeScanner%1})
+meth public {com.sun.source.util.TreeScanner%0} visitConstantCaseLabel(com.sun.source.tree.ConstantCaseLabelTree,{com.sun.source.util.TreeScanner%1})
 meth public {com.sun.source.util.TreeScanner%0} visitContinue(com.sun.source.tree.ContinueTree,{com.sun.source.util.TreeScanner%1})
+meth public {com.sun.source.util.TreeScanner%0} visitDeconstructionPattern(com.sun.source.tree.DeconstructionPatternTree,{com.sun.source.util.TreeScanner%1})
 meth public {com.sun.source.util.TreeScanner%0} visitDefaultCaseLabel(com.sun.source.tree.DefaultCaseLabelTree,{com.sun.source.util.TreeScanner%1})
 meth public {com.sun.source.util.TreeScanner%0} visitDoWhileLoop(com.sun.source.tree.DoWhileLoopTree,{com.sun.source.util.TreeScanner%1})
 meth public {com.sun.source.util.TreeScanner%0} visitEmptyStatement(com.sun.source.tree.EmptyStatementTree,{com.sun.source.util.TreeScanner%1})
@@ -1256,7 +1272,6 @@
 meth public {com.sun.source.util.TreeScanner%0} visitExports(com.sun.source.tree.ExportsTree,{com.sun.source.util.TreeScanner%1})
 meth public {com.sun.source.util.TreeScanner%0} visitExpressionStatement(com.sun.source.tree.ExpressionStatementTree,{com.sun.source.util.TreeScanner%1})
 meth public {com.sun.source.util.TreeScanner%0} visitForLoop(com.sun.source.tree.ForLoopTree,{com.sun.source.util.TreeScanner%1})
-meth public {com.sun.source.util.TreeScanner%0} visitGuardedPattern(com.sun.source.tree.GuardedPatternTree,{com.sun.source.util.TreeScanner%1})
 meth public {com.sun.source.util.TreeScanner%0} visitIdentifier(com.sun.source.tree.IdentifierTree,{com.sun.source.util.TreeScanner%1})
 meth public {com.sun.source.util.TreeScanner%0} visitIf(com.sun.source.tree.IfTree,{com.sun.source.util.TreeScanner%1})
 meth public {com.sun.source.util.TreeScanner%0} visitImport(com.sun.source.tree.ImportTree,{com.sun.source.util.TreeScanner%1})
@@ -1279,6 +1294,7 @@
 meth public {com.sun.source.util.TreeScanner%0} visitParameterizedType(com.sun.source.tree.ParameterizedTypeTree,{com.sun.source.util.TreeScanner%1})
 meth public {com.sun.source.util.TreeScanner%0} visitParenthesized(com.sun.source.tree.ParenthesizedTree,{com.sun.source.util.TreeScanner%1})
 meth public {com.sun.source.util.TreeScanner%0} visitParenthesizedPattern(com.sun.source.tree.ParenthesizedPatternTree,{com.sun.source.util.TreeScanner%1})
+meth public {com.sun.source.util.TreeScanner%0} visitPatternCaseLabel(com.sun.source.tree.PatternCaseLabelTree,{com.sun.source.util.TreeScanner%1})
 meth public {com.sun.source.util.TreeScanner%0} visitPrimitiveType(com.sun.source.tree.PrimitiveTypeTree,{com.sun.source.util.TreeScanner%1})
 meth public {com.sun.source.util.TreeScanner%0} visitProvides(com.sun.source.tree.ProvidesTree,{com.sun.source.util.TreeScanner%1})
 meth public {com.sun.source.util.TreeScanner%0} visitRequires(com.sun.source.tree.RequiresTree,{com.sun.source.util.TreeScanner%1})
@@ -1584,6 +1600,7 @@
 fld public final static javax.lang.model.SourceVersion RELEASE_16
 fld public final static javax.lang.model.SourceVersion RELEASE_17
 fld public final static javax.lang.model.SourceVersion RELEASE_18
+fld public final static javax.lang.model.SourceVersion RELEASE_19
 fld public final static javax.lang.model.SourceVersion RELEASE_2
 fld public final static javax.lang.model.SourceVersion RELEASE_3
 fld public final static javax.lang.model.SourceVersion RELEASE_4
@@ -1676,8 +1693,12 @@
 fld public final static javax.lang.model.element.ElementKind STATIC_INIT
 fld public final static javax.lang.model.element.ElementKind TYPE_PARAMETER
 meth public boolean isClass()
+meth public boolean isDeclaredType()
+meth public boolean isExecutable()
 meth public boolean isField()
+meth public boolean isInitializer()
 meth public boolean isInterface()
+meth public boolean isVariable()
 meth public static javax.lang.model.element.ElementKind valueOf(java.lang.String)
 meth public static javax.lang.model.element.ElementKind[] values()
 supr java.lang.Enum<javax.lang.model.element.ElementKind>
@@ -2024,7 +2045,7 @@
 meth public abstract javax.lang.model.type.TypeMirror getSuperBound()
 
 CLSS public abstract javax.lang.model.util.AbstractAnnotationValueVisitor14<%0 extends java.lang.Object, %1 extends java.lang.Object>
- anno 0 javax.annotation.processing.SupportedSourceVersion(javax.lang.model.SourceVersion value=RELEASE_18)
+ anno 0 javax.annotation.processing.SupportedSourceVersion(javax.lang.model.SourceVersion value=RELEASE_19)
 cons protected init()
 supr javax.lang.model.util.AbstractAnnotationValueVisitor9<{javax.lang.model.util.AbstractAnnotationValueVisitor14%0},{javax.lang.model.util.AbstractAnnotationValueVisitor14%1}>
 
@@ -2055,7 +2076,7 @@
 supr javax.lang.model.util.AbstractAnnotationValueVisitor8<{javax.lang.model.util.AbstractAnnotationValueVisitor9%0},{javax.lang.model.util.AbstractAnnotationValueVisitor9%1}>
 
 CLSS public abstract javax.lang.model.util.AbstractElementVisitor14<%0 extends java.lang.Object, %1 extends java.lang.Object>
- anno 0 javax.annotation.processing.SupportedSourceVersion(javax.lang.model.SourceVersion value=RELEASE_18)
+ anno 0 javax.annotation.processing.SupportedSourceVersion(javax.lang.model.SourceVersion value=RELEASE_19)
 cons protected init()
 meth public abstract {javax.lang.model.util.AbstractElementVisitor14%0} visitRecordComponent(javax.lang.model.element.RecordComponentElement,{javax.lang.model.util.AbstractElementVisitor14%1})
 supr javax.lang.model.util.AbstractElementVisitor9<{javax.lang.model.util.AbstractElementVisitor14%0},{javax.lang.model.util.AbstractElementVisitor14%1}>
@@ -2090,7 +2111,7 @@
 supr javax.lang.model.util.AbstractElementVisitor8<{javax.lang.model.util.AbstractElementVisitor9%0},{javax.lang.model.util.AbstractElementVisitor9%1}>
 
 CLSS public abstract javax.lang.model.util.AbstractTypeVisitor14<%0 extends java.lang.Object, %1 extends java.lang.Object>
- anno 0 javax.annotation.processing.SupportedSourceVersion(javax.lang.model.SourceVersion value=RELEASE_18)
+ anno 0 javax.annotation.processing.SupportedSourceVersion(javax.lang.model.SourceVersion value=RELEASE_19)
 cons protected init()
 supr javax.lang.model.util.AbstractTypeVisitor9<{javax.lang.model.util.AbstractTypeVisitor14%0},{javax.lang.model.util.AbstractTypeVisitor14%1}>
 
@@ -2148,7 +2169,7 @@
 hfds CONSTRUCTOR_KIND,FIELD_KINDS,METHOD_KIND,MODULE_KIND,PACKAGE_KIND,RECORD_COMPONENT_KIND,TYPE_KINDS
 
 CLSS public javax.lang.model.util.ElementKindVisitor14<%0 extends java.lang.Object, %1 extends java.lang.Object>
- anno 0 javax.annotation.processing.SupportedSourceVersion(javax.lang.model.SourceVersion value=RELEASE_18)
+ anno 0 javax.annotation.processing.SupportedSourceVersion(javax.lang.model.SourceVersion value=RELEASE_19)
 cons protected init()
 cons protected init({javax.lang.model.util.ElementKindVisitor14%0})
 meth public {javax.lang.model.util.ElementKindVisitor14%0} visitRecordComponent(javax.lang.model.element.RecordComponentElement,{javax.lang.model.util.ElementKindVisitor14%1})
@@ -2208,7 +2229,7 @@
 supr javax.lang.model.util.ElementKindVisitor8<{javax.lang.model.util.ElementKindVisitor9%0},{javax.lang.model.util.ElementKindVisitor9%1}>
 
 CLSS public javax.lang.model.util.ElementScanner14<%0 extends java.lang.Object, %1 extends java.lang.Object>
- anno 0 javax.annotation.processing.SupportedSourceVersion(javax.lang.model.SourceVersion value=RELEASE_18)
+ anno 0 javax.annotation.processing.SupportedSourceVersion(javax.lang.model.SourceVersion value=RELEASE_19)
 cons protected init()
 cons protected init({javax.lang.model.util.ElementScanner14%0})
 meth public {javax.lang.model.util.ElementScanner14%0} visitExecutable(javax.lang.model.element.ExecutableElement,{javax.lang.model.util.ElementScanner14%1})
@@ -2299,7 +2320,7 @@
 supr java.lang.Enum<javax.lang.model.util.Elements$Origin>
 
 CLSS public javax.lang.model.util.SimpleAnnotationValueVisitor14<%0 extends java.lang.Object, %1 extends java.lang.Object>
- anno 0 javax.annotation.processing.SupportedSourceVersion(javax.lang.model.SourceVersion value=RELEASE_18)
+ anno 0 javax.annotation.processing.SupportedSourceVersion(javax.lang.model.SourceVersion value=RELEASE_19)
 cons protected init()
 cons protected init({javax.lang.model.util.SimpleAnnotationValueVisitor14%0})
 supr javax.lang.model.util.SimpleAnnotationValueVisitor9<{javax.lang.model.util.SimpleAnnotationValueVisitor14%0},{javax.lang.model.util.SimpleAnnotationValueVisitor14%1}>
@@ -2348,7 +2369,7 @@
 supr javax.lang.model.util.SimpleAnnotationValueVisitor8<{javax.lang.model.util.SimpleAnnotationValueVisitor9%0},{javax.lang.model.util.SimpleAnnotationValueVisitor9%1}>
 
 CLSS public javax.lang.model.util.SimpleElementVisitor14<%0 extends java.lang.Object, %1 extends java.lang.Object>
- anno 0 javax.annotation.processing.SupportedSourceVersion(javax.lang.model.SourceVersion value=RELEASE_18)
+ anno 0 javax.annotation.processing.SupportedSourceVersion(javax.lang.model.SourceVersion value=RELEASE_19)
 cons protected init()
 cons protected init({javax.lang.model.util.SimpleElementVisitor14%0})
 meth public {javax.lang.model.util.SimpleElementVisitor14%0} visitRecordComponent(javax.lang.model.element.RecordComponentElement,{javax.lang.model.util.SimpleElementVisitor14%1})
@@ -2392,7 +2413,7 @@
 supr javax.lang.model.util.SimpleElementVisitor8<{javax.lang.model.util.SimpleElementVisitor9%0},{javax.lang.model.util.SimpleElementVisitor9%1}>
 
 CLSS public javax.lang.model.util.SimpleTypeVisitor14<%0 extends java.lang.Object, %1 extends java.lang.Object>
- anno 0 javax.annotation.processing.SupportedSourceVersion(javax.lang.model.SourceVersion value=RELEASE_18)
+ anno 0 javax.annotation.processing.SupportedSourceVersion(javax.lang.model.SourceVersion value=RELEASE_19)
 cons protected init()
 cons protected init({javax.lang.model.util.SimpleTypeVisitor14%0})
 supr javax.lang.model.util.SimpleTypeVisitor9<{javax.lang.model.util.SimpleTypeVisitor14%0},{javax.lang.model.util.SimpleTypeVisitor14%1}>
@@ -2439,7 +2460,7 @@
 supr javax.lang.model.util.SimpleTypeVisitor8<{javax.lang.model.util.SimpleTypeVisitor9%0},{javax.lang.model.util.SimpleTypeVisitor9%1}>
 
 CLSS public javax.lang.model.util.TypeKindVisitor14<%0 extends java.lang.Object, %1 extends java.lang.Object>
- anno 0 javax.annotation.processing.SupportedSourceVersion(javax.lang.model.SourceVersion value=RELEASE_18)
+ anno 0 javax.annotation.processing.SupportedSourceVersion(javax.lang.model.SourceVersion value=RELEASE_19)
 cons protected init()
 cons protected init({javax.lang.model.util.TypeKindVisitor14%0})
 supr javax.lang.model.util.TypeKindVisitor9<{javax.lang.model.util.TypeKindVisitor14%0},{javax.lang.model.util.TypeKindVisitor14%1}>
diff --git a/java/libs.javacapi/nbproject/project.properties b/java/libs.javacapi/nbproject/project.properties
index a988ae1..f7f3deb 100644
--- a/java/libs.javacapi/nbproject/project.properties
+++ b/java/libs.javacapi/nbproject/project.properties
@@ -20,6 +20,6 @@
 javadoc.title=Javac API
 nbm.homepage=http://jackpot.netbeans.org/
 nbm.module.author=Petr Hrebejk
-spec.version.base=8.40.0
+spec.version.base=8.41.0
 javadoc.arch=${basedir}/arch.xml
 module.javadoc.packages=com.sun.source.tree,com.sun.source.util
diff --git a/java/libs.javacapi/nbproject/project.xml b/java/libs.javacapi/nbproject/project.xml
index 905d81b..35901e2 100644
--- a/java/libs.javacapi/nbproject/project.xml
+++ b/java/libs.javacapi/nbproject/project.xml
@@ -40,11 +40,11 @@
             </public-packages>
             <class-path-extension>
                 <runtime-relative-path />
-                <binary-origin>external/nb-javac-jdk-18.0.1+10-api.jar</binary-origin>
+                <binary-origin>external/nb-javac-jdk-19+33-api.jar</binary-origin>
             </class-path-extension>
             <class-path-extension>
                 <runtime-relative-path />
-                <binary-origin>external/nb-javac-jdk-18.0.1+10.jar</binary-origin>
+                <binary-origin>external/nb-javac-jdk-19+33.jar</binary-origin>
             </class-path-extension>
         </data>
     </configuration>
diff --git a/java/libs.nbjavacapi/external/binaries-list b/java/libs.nbjavacapi/external/binaries-list
index cb152e0..b42feac 100644
--- a/java/libs.nbjavacapi/external/binaries-list
+++ b/java/libs.nbjavacapi/external/binaries-list
@@ -14,5 +14,5 @@
 # KIND, either express or implied.  See the License for the
 # specific language governing permissions and limitations
 # under the License.
-ECA15E615777CE6E7550F71EF312B8CEEBCBE0BD com.dukescript.nbjavac:nb-javac:jdk-18.0.1+10:api
-3AD512FBC8830D89AC70D0CA59397C4868789DCC com.dukescript.nbjavac:nb-javac:jdk-18.0.1+10
+DBA592C75DD52B97EC88A6B06ADF71D4F3C3DED9 com.dukescript.nbjavac:nb-javac:jdk-19+33:api
+A36688EDA1DE51508A039AED3518771C6F75E416 com.dukescript.nbjavac:nb-javac:jdk-19+33
diff --git a/java/libs.nbjavacapi/external/nb-javac-jdk-18.0.1+10-license.txt b/java/libs.nbjavacapi/external/nb-javac-jdk-19+33-license.txt
similarity index 98%
rename from java/libs.nbjavacapi/external/nb-javac-jdk-18.0.1+10-license.txt
rename to java/libs.nbjavacapi/external/nb-javac-jdk-19+33-license.txt
index 6d324e9..770d20b 100644
--- a/java/libs.nbjavacapi/external/nb-javac-jdk-18.0.1+10-license.txt
+++ b/java/libs.nbjavacapi/external/nb-javac-jdk-19+33-license.txt
@@ -1,10 +1,10 @@
 Name: Javac Compiler Implementation
 Description: Javac Compiler Implementation
-Files: nb-javac-jdk-18.0.1+10-api.jar nb-javac-jdk-18.0.1+10.jar
-Version: jdk-18.0.1+10
+Files: nb-javac-jdk-19+33-api.jar nb-javac-jdk-19+33.jar
+Version: jdk-19+33
 License: GPL-2-CP
-Origin: OpenJDK (https://github.com/openjdk/jdk18)
-Source: https://github.com/openjdk/jdk18
+Origin: OpenJDK (https://github.com/openjdk/jdk19)
+Source: https://github.com/openjdk/jdk19
 Type: compile-time,optional
 Comment: Used at compile and design time to compile against; optional at runtime.
 
diff --git a/java/libs.nbjavacapi/manifest.mf b/java/libs.nbjavacapi/manifest.mf
index 5debd3f..3310a0f 100644
--- a/java/libs.nbjavacapi/manifest.mf
+++ b/java/libs.nbjavacapi/manifest.mf
@@ -2,7 +2,7 @@
 AutoUpdate-Show-In-Client: true
 OpenIDE-Module: org.netbeans.libs.nbjavacapi
 OpenIDE-Module-Localizing-Bundle: org/netbeans/modules/nbjavac/api/Bundle.properties
-OpenIDE-Module-Specification-Version: 18.2
+OpenIDE-Module-Specification-Version: 19.0
 OpenIDE-Module-Hide-Classpath-Packages: com.sun.javadoc.**, com.sun.source.**, javax.annotation.processing.**, javax.lang.model.**, javax.tools.**, com.sun.tools.javac.** com.sun.tools.javac.**, com.sun.tools.javadoc.**, com.sun.tools.javap.**, com.sun.tools.classfile.**, com.sun.tools.doclint.**
 OpenIDE-Module-Fragment-Host: org.netbeans.libs.javacapi
 OpenIDE-Module-Provides: org.netbeans.libs.nbjavac
diff --git a/java/libs.nbjavacapi/nbproject/project.properties b/java/libs.nbjavacapi/nbproject/project.properties
index 1bd61ee..f48dd15 100644
--- a/java/libs.nbjavacapi/nbproject/project.properties
+++ b/java/libs.nbjavacapi/nbproject/project.properties
@@ -18,5 +18,5 @@
 javac.source=1.7
 javac.compilerargs=-Xlint -Xlint:-serial
 license.file.override=${nb_all}/nbbuild/licenses/GPL-2-CP
-release.external/nb-javac-jdk-18.0.1+10-api.jar=modules/ext/nb-javac-jdk-18-api.jar
-release.external/nb-javac-jdk-18.0.1+10.jar=modules/ext/nb-javac-jdk-18.jar
+release.external/nb-javac-jdk-19+33-api.jar=modules/ext/nb-javac-jdk-19-api.jar
+release.external/nb-javac-jdk-19+33.jar=modules/ext/nb-javac-jdk-19.jar
diff --git a/java/libs.nbjavacapi/nbproject/project.xml b/java/libs.nbjavacapi/nbproject/project.xml
index 7dc8a08..5b801b8 100644
--- a/java/libs.nbjavacapi/nbproject/project.xml
+++ b/java/libs.nbjavacapi/nbproject/project.xml
@@ -36,12 +36,12 @@
             </module-dependencies>
             <public-packages/>
             <class-path-extension>
-                <runtime-relative-path>ext/nb-javac-jdk-18-api.jar</runtime-relative-path>
-                <binary-origin>external/nb-javac-jdk-18.0.1+10-api.jar</binary-origin>
+                <runtime-relative-path>ext/nb-javac-jdk-19-api.jar</runtime-relative-path>
+                <binary-origin>external/nb-javac-jdk-19+33-api.jar</binary-origin>
             </class-path-extension>
             <class-path-extension>
-                <runtime-relative-path>ext/nb-javac-jdk-18.jar</runtime-relative-path>
-                <binary-origin>external/nb-javac-jdk-18.0.1+10.jar</binary-origin>
+                <runtime-relative-path>ext/nb-javac-jdk-19.jar</runtime-relative-path>
+                <binary-origin>external/nb-javac-jdk-19+33.jar</binary-origin>
             </class-path-extension>
         </data>
     </configuration>
diff --git a/java/libs.nbjavacapi/src/org/netbeans/modules/nbjavac/api/Bundle.properties b/java/libs.nbjavacapi/src/org/netbeans/modules/nbjavac/api/Bundle.properties
index c5c441a..e9a4b6b 100644
--- a/java/libs.nbjavacapi/src/org/netbeans/modules/nbjavac/api/Bundle.properties
+++ b/java/libs.nbjavacapi/src/org/netbeans/modules/nbjavac/api/Bundle.properties
@@ -18,6 +18,6 @@
 OpenIDE-Module-Display-Category=Java
 OpenIDE-Module-Long-Description=\
     This library provides a Java language parser for the IDE. \
-    Supports JDK-18 features.
+    Supports JDK-19 features.
 OpenIDE-Module-Name=The nb-javac Java editing support library
 OpenIDE-Module-Short-Description=The nb-javac Java editing support library
diff --git a/java/maven/apichanges.xml b/java/maven/apichanges.xml
index 7335b70..3b2f5a3 100644
--- a/java/maven/apichanges.xml
+++ b/java/maven/apichanges.xml
@@ -83,6 +83,19 @@
     <!-- ACTUAL CHANGES BEGIN HERE: -->
 
     <changes>
+        <change id="lifecycle-white-list">
+            <api name="general"/>
+            <summary>LifecycleParticipants can be ignored</summary>
+            <version major="2" minor="156"/>
+            <date day="9" month="9" year="2022"/>
+            <author login="sdedic"/>
+            <compatibility addition="yes" semantic="compatible"/>
+            <description>
+                NetBeans warns if a project / plugin provides AbstractLifecycleParticipants that
+                can reconfigure the project after load. Now some harmless ones can be whitelisted
+                so they do not produce warning / project problem. See <a href="@TOP@/architecture-summary.html#layer-LifecycleParticipants">LifecycleParticipants</a>.
+            </description>
+        </change>
         <change id="evaluated-project">
             <api name="general"/>
             <summary>Project model can be customized for specific action or usage</summary>
diff --git a/java/maven/arch.xml b/java/maven/arch.xml
index 8827e43..90197a0 100644
--- a/java/maven/arch.xml
+++ b/java/maven/arch.xml
@@ -140,6 +140,14 @@
        It's content is expected to be <code>Action</code> instances.
      </p>
     </api>
+    <api group="layer" name="LifecycleParticipants" type="export" category="official">
+     <p>
+         A module can disable warning for a custom lifecycle participant by creating a <b>folder</b> in 
+         <code>Projects/org-netbeans-modules-maven/LifecycleParticipant</code>. Currently single boolean attribute,
+         <code>ignoreOnModelLoad</code> is supported, which suppresses project problem and warning about
+         the custom participant. The participant's code does not run after project load.         
+     </p>
+    </api>
 
     <api group="layer" name="MavenArchetypes" type="export" category="official">
      <p>
diff --git a/java/maven/nbproject/project.properties b/java/maven/nbproject/project.properties
index b835cee..eaeea26 100644
--- a/java/maven/nbproject/project.properties
+++ b/java/maven/nbproject/project.properties
@@ -22,7 +22,7 @@
 javadoc.arch=${basedir}/arch.xml
 javahelp.hs=maven.hs
 extra.module.files=maven-nblib/
-spec.version.base: 2.155
+spec.version.base: 2.156
 
 # The CPExtender test fails in library processing (not randomly) since NetBeans 8.2; disabling.
 test.excludes=**/CPExtenderTest.class
diff --git a/java/maven/src/org/netbeans/modules/maven/layer.xml b/java/maven/src/org/netbeans/modules/maven/layer.xml
index 013037a..b23427b 100644
--- a/java/maven/src/org/netbeans/modules/maven/layer.xml
+++ b/java/maven/src/org/netbeans/modules/maven/layer.xml
@@ -170,6 +170,12 @@
                     <attr name="position" intvalue="3200"/>
                 </file>
             </folder>
+            <folder name="LifecycleParticipants">
+                <!-- Lifecycle participant classes with special handling; folders with attributes -->
+                <folder name="org.sonatype.nexus.maven.staging.deploy.DeployLifecycleParticipant">
+                    <attr name="ignoreOnModelLoad" boolvalue="true"/>
+                </folder>
+            </folder>
             <file name="nbactions.xml" url="nbactions.xml"/>
         </folder>
     </folder>
diff --git a/java/maven/src/org/netbeans/modules/maven/modelcache/MavenProjectCache.java b/java/maven/src/org/netbeans/modules/maven/modelcache/MavenProjectCache.java
index 4029d8b..65b5660 100644
--- a/java/maven/src/org/netbeans/modules/maven/modelcache/MavenProjectCache.java
+++ b/java/maven/src/org/netbeans/modules/maven/modelcache/MavenProjectCache.java
@@ -25,12 +25,10 @@
 import java.util.Arrays;
 import java.util.Collection;
 import java.util.Collections;
-import java.util.HashSet;
 import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
 import java.util.Properties;
-import java.util.Set;
 import java.util.WeakHashMap;
 import java.util.function.BiConsumer;
 import java.util.logging.Level;
@@ -45,6 +43,7 @@
 import org.netbeans.api.annotations.common.NonNull;
 import org.netbeans.api.project.ProjectActionContext;
 import org.netbeans.modules.maven.M2AuxilaryConfigImpl;
+import org.netbeans.modules.maven.api.NbMavenProject;
 import org.netbeans.modules.maven.api.execute.RunConfig;
 import org.netbeans.modules.maven.configurations.M2Configuration;
 import org.netbeans.modules.maven.embedder.EmbedderFactory;
@@ -68,9 +67,15 @@
     private static final String CONTEXT_EXECUTION_RESULT = "NB_Execution_Result";
     private static final String CONTEXT_PARTICIPANTS = "NB_AbstractParticipant_Present";
     
-    private static final Set<String> PARTICIPANT_WHITELIST = new HashSet<String>(Arrays.asList(new String[] {
-        "org.sonatype.nexus.maven.staging.deploy.DeployLifecycleParticipant"
-    }));
+    /**
+     * Folder with module-configurable whitelist of lifecycle participants. Currently only 'ignore' can be specified.
+     */
+    private static final String LIFECYCLE_PARTICIPANT_PREFIX = "Projects/" + NbMavenProject.TYPE + "/LifecycleParticipants/"; // NOI18N
+    
+    /**
+     * Attribute that specifies the lifecycle participant should be silently ignored on model load.
+     */
+    private static final String ATTR_IGNORE_ON_LOAD = "ignoreOnModelLoad"; // NOI18N
     
     //File is referenced during lifetime of the Project. FileObject cannot be used as with rename it changes value@!!!
     private static final Map<File, WeakReference<MavenProject>> file2Project = new WeakHashMap<File, WeakReference<MavenProject>>();
@@ -151,6 +156,12 @@
         return loadOriginalMavenProject(pomFile, null, null);
     }
     
+    private static boolean isLifecycleParticipatnIgnored(AbstractMavenLifecycleParticipant instance) {
+        String n = instance.getClass().getName();
+        FileObject check = FileUtil.getConfigFile(LIFECYCLE_PARTICIPANT_PREFIX + n);
+        return check != null && check.getAttribute(ATTR_IGNORE_ON_LOAD) == Boolean.TRUE;
+    }
+    
     private static @NonNull MavenProject loadOriginalMavenProject(final File pomFile, ProjectActionContext ctx, RunConfig runConf) {
         long startLoading = System.currentTimeMillis();
         MavenEmbedder projectEmbedder = EmbedderFactory.getProjectEmbedder();
@@ -283,11 +294,11 @@
 //                            } else {
                                 List<String> parts = new ArrayList<String>();
                                 for (AbstractMavenLifecycleParticipant part : lookup) {
-                                    String name = part.getClass().getName();
-                                    if (PARTICIPANT_WHITELIST.contains(name)) {
+                                    if (isLifecycleParticipatnIgnored(part)) {
                                         //#204898 create a whitelist of known not harmful participants that can be just ignored
                                         continue;
                                     }
+                                    String name = part.getClass().getName();
                                     parts.add(name);
                                 }
                                 if (parts.size() > 0) {
diff --git a/java/maven/src/org/netbeans/modules/maven/queries/MavenArtifactsImplementation.java b/java/maven/src/org/netbeans/modules/maven/queries/MavenArtifactsImplementation.java
index 8a6bfd1..b3fc45d 100644
--- a/java/maven/src/org/netbeans/modules/maven/queries/MavenArtifactsImplementation.java
+++ b/java/maven/src/org/netbeans/modules/maven/queries/MavenArtifactsImplementation.java
@@ -59,8 +59,9 @@
  */
 @ProjectServiceProvider(service = ProjectArtifactsImplementation.class, projectType = NbMavenProject.TYPE)
 public class MavenArtifactsImplementation implements ProjectArtifactsImplementation<MavenArtifactsImplementation.Res> {
+
     private static final Logger LOG = Logger.getLogger(ProjectArtifactsImplementation.class.getName());
-    
+
     private final Project project;
 
     public MavenArtifactsImplementation(Project project) {
@@ -129,27 +130,293 @@
     public boolean computeSupportsChanges(Res r) {
         return r.supportsChanges();
     }
-    
+
     static class MavenQuery {
+
         final Project project;
         final NbMavenProject nbMavenProject;
         final ProjectArtifactsQuery.Filter filter;
-        
+        MavenProject evalProject;
+
         List<ArtifactSpec> specs;
+        
+        boolean skipDefaultOutput;
 
         public MavenQuery(Project project, NbMavenProject nbMavenProject, ProjectArtifactsQuery.Filter filter) {
             this.project = project;
             this.nbMavenProject = nbMavenProject;
             this.filter = filter;
         }
+
+        void addArtifactSpec(ArtifactSpec spec) {
+            if (specs.contains(spec)) {
+                return;
+            }
+            specs.add(spec);
+        }
+
+        /**
+         * Evaluator that processes one execution of the shade plugin. Note that multiple artifacts may be produced in multiple
+         * executions, with different classifiers.
+         */
+        private class ShadedEvaluator {
+            /**
+             * Default classifier for attached artifacts produced by shade plugin
+             */
+            private static final String DEFAULT_SHADE_CLASSIFIER = "shaded";
+
+            private final MavenProject evalProject;
+            private final PluginExecution exec;
+            private String t;
+            private String c;
+
+            String classifier;
+            String outputDir;
+            String outputFile;
+            String finalName;
+            String artifactId;
+            boolean attached;
+            boolean createSourcesJar;
+            boolean createTestJar;
+            boolean createTestSourcesJar;
+            String outD;
+            String name;
+            Path basePath;
+            Artifact mA;
+            boolean any;
+            boolean tagBase;
+            boolean tagShaded;
+            boolean renamed;
+
+            public ShadedEvaluator(MavenProject evalProject, PluginExecution exec) {
+                this.evalProject = evalProject;
+                this.exec = exec;
+            }
+
+            public void process() {
+                Xpp3Dom dom = evalProject.getGoalConfiguration(
+                        Constants.GROUP_APACHE_PLUGINS, "maven-shade-plugin", exec.getId(), "shade"); // NOI18N
+                mA = evalProject.getArtifact();
+                t = filter.getArtifactType();
+                c = filter.getClassifier();
+                classifier = getValueOrNull(dom, "shadedClassifierName"); // NOI18N
+                outputDir = getValueOrNull(dom, "outputDirectory"); // NOI18N
+                outputFile = getValueOrNull(dom, "outputFile"); // NOI18N
+                finalName = getValueOrNull(dom, "finalName"); // NOI18N
+                artifactId = getValueOrNull(dom, "shadedArtifactId"); // NOI18N
+
+                attached = Boolean.valueOf(getValueOrNull(dom, "shadedArtifactAttached")); // NOI18N
+                createSourcesJar = Boolean.valueOf(getValueOrNull(dom, "createSourcesJar")); // NOI18N
+                createTestJar = Boolean.valueOf(getValueOrNull(dom, "shadeTestJar")); // NOI18N
+                createTestSourcesJar = Boolean.valueOf(getValueOrNull(dom, "createTestSourcesJar")); // NOI18N
+
+                outD = evalProject.getModel().getBuild().getDirectory();
+                name = evalProject.getBuild().getFinalName();
+
+                if (artifactId == null) {
+                    artifactId = mA.getArtifactId();
+                }
+
+                if (outputDir != null) {
+                    outD = outputDir;
+                }
+                if (finalName != null && finalName.length() > 0) {
+                    name = finalName;
+                }
+                basePath = Paths.get(outD, name);
+                any = ProjectArtifactsQuery.Filter.CLASSIFIER_ANY.equals(c);
+
+                tagShaded = filter.hasTag(ArtifactSpec.TAG_SHADED) || filter.hasTag(classifier);
+                tagBase = filter.hasTag(ArtifactSpec.TAG_BASE);
+
+                // either the caller selects the classifier, or no classifier (this produces artifact tagged with 'shaded' or
+                // explicitly tagged with original to get the unshaded version
+                if (attached) {
+                    if (classifier == null) {
+                        classifier = DEFAULT_SHADE_CLASSIFIER;
+                    }
+                }
+                boolean classifierMatch = any || (classifier != null && classifier.equals(c)) || (c == null && !attached) || tagBase;
+                String suffix;
+
+                String gID = mA.getGroupId();
+                if (outputFile != null) {
+                    addExplicitOutputFile();
+                    suffix = "-" + classifier;
+                } else {
+                    if (name != null && !name.equals(evalProject.getBuild().getFinalName())) {
+                        renamed = true;
+                        basePath = basePath.resolveSibling(name);
+                        suffix = "";
+                    } else {
+                        suffix = "";
+                    }
+                    if (attached) {
+                        suffix = "-" + classifier;
+                    }
+                    if (classifierMatch) {
+                        // do not report base unless the base is explicitly requested
+                        if ((any && !tagShaded) || tagBase) {
+                            skipDefaultOutput = !attached;
+                            Path file = basePath.resolveSibling("original-" + basePath.getFileName() + suffix + ".jar");
+                            ArtifactSpec spec = ArtifactSpec.builder(attached ? gID : null, attached ? artifactId : null, mA.getVersion(), evalProject).
+                                    classifier(classifier).
+                                    location(file.toUri()).
+                                    type("jar").
+                                    tag(ArtifactSpec.TAG_BASE).
+                                    build();
+                            addArtifactSpec(spec);
+                        }
+                        boolean reportShaded;
+                        if (any) {
+                            reportShaded = !tagBase || tagShaded;
+                        } else {
+                            // if no tag is present the default is to report the shaded artifact
+                            reportShaded = !tagBase;
+                        }
+                        if (reportShaded) {
+                            Path file = basePath.resolveSibling(basePath.getFileName() + suffix + ".jar");
+                            ArtifactSpec spec = ArtifactSpec.builder(gID, artifactId, mA.getVersion(), evalProject).
+                                    classifier(classifier).
+                                    location(file.toUri()).
+                                    type("jar").
+                                    tag(ArtifactSpec.TAG_SHADED).
+                                    build();
+                            addArtifactSpec(spec);
+                        }
+                    }
+                }
+
+                if (classifierMatch) {
+                    if (createSourcesJar) {
+                        addClassifiedArtifact("sources", suffix, "sources", ArtifactSpec.CLASSIFIER_SOURCES, "java-source");
+                    }
+                    if (createTestJar) {
+                        addClassifiedArtifact("test-jar", suffix, "tests", ArtifactSpec.CLASSIFIER_TESTS, "test");
+                    }
+                    if (createTestSourcesJar) {
+                        addClassifiedArtifact("sources", suffix, "test-sources", ArtifactSpec.CLASSIFIER_TEST_SOURCES, "java-source", "test");
+                    }
+                }
+            }
+
+            private void addClassifiedArtifact(String type, String suffix, String typeSuffix, String defaultClassifier, String... tags) {
+                if (!(ProjectArtifactsQuery.Filter.TYPE_ALL.equals(t) || type.equals(t) || (any && t == null))) {
+                    return;
+                }
+
+                Path file;
+                ArtifactSpec spec;
+                
+                String clas = classifier;
+                if (clas == null) {
+                    clas = defaultClassifier;
+                }
+                
+                if (any || !tagBase || tagShaded) {
+                    file = basePath.resolveSibling(basePath.getFileName() + suffix + "-" + typeSuffix + ".jar");
+                    spec = ArtifactSpec.builder(mA.getGroupId(), artifactId, mA.getVersion(), evalProject).
+                        classifier(clas).
+                        location(file.toUri()).
+                        type(type).
+                        tag(ArtifactSpec.TAG_SHADED).
+                        tags(tags).
+                        build();
+                    addArtifactSpec(spec);
+                }
+
+                if (any || tagBase) {
+                    file = basePath.resolveSibling("original-" + basePath.getFileName() + suffix + "-" + typeSuffix + ".jar");
+                    spec = ArtifactSpec.builder(attached ? mA.getGroupId() : null, attached ? artifactId : null, mA.getVersion(), evalProject).
+                            classifier(clas).
+                            location(file.toUri()).
+                            type(type).
+                            tag(ArtifactSpec.TAG_BASE).
+                            tags(tags).
+                            build();
+                    addArtifactSpec(spec);
+                }
+            }
+
+            /**
+             * Include only if shaded was explicitly requested, or ALL
+             * classifiers. Otherwise the shaded artifact does not replace the
+             * main artifact and is not 'officially' attached, so it should be
+             * probably not reported at all, as it is invisible outside the
+             * project.
+             */
+            void addExplicitOutputFile() {
+                if ((ProjectArtifactsQuery.Filter.TYPE_ALL.equals(t) || t == null || "jar".equals(t))
+                        && (any || (c == null && filter.hasTag(ArtifactSpec.TAG_SHADED)))) {
+                    Path file = null;
+                    try {
+                        file = Paths.get(outputFile);
+                        ArtifactSpec spec = ArtifactSpec.builder(null, null, mA.getVersion(), evalProject).
+                                classifier(classifier).
+                                location(file.toUri()).
+                                type("jar").
+                                tag(ArtifactSpec.TAG_SHADED).
+                                build();
+                        addArtifactSpec(spec);
+                    } catch (InvalidPathException ex) {
+                        // no main artifact produced.
+                    }
+                } else {
+
+                }
+                if ((ProjectArtifactsQuery.Filter.TYPE_ALL.equals(t) || t == null || "jar".equals(t))
+                        && (any || (c == null && (filter.hasTag(ArtifactSpec.TAG_BASE) || filter.hasTag(DEFAULT_SHADE_CLASSIFIER))))) {
+                    // include the original, but tag it with base
+                    Path p = basePath.resolveSibling("original-" + basePath.getFileName() + ".jar"); // NOI18N
+                    ArtifactSpec spec = ArtifactSpec.builder(null, null, mA.getVersion(), evalProject).
+                            classifier(classifier).
+                            location(p.toUri()).
+                            type("jar").
+                            tag(ArtifactSpec.TAG_BASE).
+                            build();
+                    addArtifactSpec(spec);
+                }
+                // the other possible attachments are not afffected by 'outputFile'
+            }
+
+        }
+
+        private void appendShadePluginOutput(MavenProject evalProject) {
+            Plugin plugin = evalProject.getBuild().getPluginsAsMap().get(Constants.GROUP_APACHE_PLUGINS + ":" + "maven-shade-plugin"); // NOI18N
+            if (plugin == null) {
+                return;
+            }
+            for (PluginExecution exec : plugin.getExecutions()) {
+                if (exec.getGoals().contains("shade")) {
+                    ShadedEvaluator shadedEval = new ShadedEvaluator(evalProject, exec);
+                    shadedEval.process();
+                }
+            }
+        }
+
+        private static String getValueOrNull(Xpp3Dom parent, String childName) {
+            return getChildValue(parent, childName, null);
+        }
+
+        private static String getChildValue(Xpp3Dom parent, String childName, String defValue) {
+            Xpp3Dom child = null;
+            if (parent != null) {
+                child = parent.getChild(childName);
+            }
+            return child != null ? child.getValue() : defValue;
+        }
         
         private void appendPluginOutput(MavenProject evalProject, String pluginId, String goal, String packagingAndType) {
+            appendPluginOutput(evalProject, pluginId, goal, packagingAndType, packagingAndType, null);
+        }
+
+        private void appendPluginOutput(MavenProject evalProject, String pluginId, String goal, String type, String packaging, String defaultClassifier, String... tags) {
             if (filter != null) {
                 if (filter.getArtifactType() == null) {
-                    if (!evalProject.getPackaging().equals(packagingAndType)) {
+                    if (!evalProject.getPackaging().equals(packaging)) {
                         return;
                     }
-                } else if (!filter.getArtifactType().equals(packagingAndType)) {
+                } else if (!filter.getArtifactType().equals(type)) {
                     if (!ProjectArtifactsQuery.Filter.TYPE_ALL.equals(filter.getArtifactType())) {
                         return;
                     }
@@ -157,12 +424,12 @@
             }
             Artifact mA = evalProject.getArtifact();
             Model mdl = evalProject.getModel();
-            
+
             Plugin plugin = evalProject.getBuild().getPluginsAsMap().get(Constants.GROUP_APACHE_PLUGINS + ":" + pluginId); // NOI18N
             if (plugin == null) {
                 return;
             }
-            
+
             for (PluginExecution exec : plugin.getExecutions()) {
                 if (exec.getGoals().contains(goal)) {
                     Xpp3Dom dom = evalProject.getGoalConfiguration(
@@ -171,6 +438,9 @@
                     Xpp3Dom domOutputDir = dom == null ? null : dom.getChild("outputDirectory"); // NOI18N
 
                     String classifier = domClassifier == null ? null : domClassifier.getValue();
+                    if (classifier == null) {
+                        classifier = defaultClassifier;
+                    }
 
                     if (filter != null && !ProjectArtifactsQuery.Filter.CLASSIFIER_ANY.equals(filter.getClassifier())) {
                         if (!Objects.equals(classifier, filter.getClassifier())) {
@@ -178,15 +448,16 @@
                         }
                     }
                     StringBuilder finalNameExt = new StringBuilder(mdl.getBuild().getFinalName());
-                    if (domClassifier != null) {
-                        finalNameExt.append("-").append(domClassifier.getValue());
+                    if (classifier != null) {
+                        finalNameExt.append("-").append(classifier);
                     }
-                    finalNameExt.append(".").append(packagingAndType);
+                    finalNameExt.append(".").append(packaging);
 
-                    ArtifactSpec.Builder builder = ArtifactSpec.builder(mA.getGroupId(), mA.getArtifactId(), mA.getVersion(), 
+                    ArtifactSpec.Builder builder = ArtifactSpec.builder(mA.getGroupId(), mA.getArtifactId(), mA.getVersion(),
                             nbMavenProject.getMavenProject().getArtifact())
                             .classifier(classifier)
-                            .type(packagingAndType);
+                            .tags(tags)
+                            .type(type);
                     try {
                         Path dir = Paths.get(mdl.getBuild().getDirectory());
                         if (domOutputDir != null) {
@@ -202,16 +473,16 @@
                     } catch (InvalidPathException ex) {
                         // TODO: log 
                     }
-                    specs.add(builder.build());
+                    addArtifactSpec(builder.build());
                 }
             }
         }
-        
+
         public void run() {
             specs = new ArrayList<>();
             Model mdl;
             ProjectActionContext buildCtx;
-            
+
             if (filter != null && filter.getBuildContext() != null) {
                 if (filter.getBuildContext().getProjectAction() == null) {
                     buildCtx = filter.getBuildContext().newDerivedBuilder().forProjectAction(ActionProvider.COMMAND_BUILD).context();
@@ -223,37 +494,47 @@
             }
             MavenProject mp = nbMavenProject.getEvaluatedProject(buildCtx);
             mdl = mp.getModel();
-            
+            evalProject = mp;
+
             String packaging = mdl.getPackaging();
             if (packaging == null) {
                 packaging = NbMavenProject.TYPE_JAR;
             }
             
-            appendPluginOutput(mp, Constants.PLUGIN_JAR, NbMavenProject.TYPE_JAR, NbMavenProject.TYPE_JAR);
+            appendShadePluginOutput(evalProject);
+
+            if (!skipDefaultOutput) {
+                appendPluginOutput(mp, Constants.PLUGIN_JAR, NbMavenProject.TYPE_JAR, NbMavenProject.TYPE_JAR);
+            }
+            appendPluginOutput(mp, Constants.PLUGIN_JAR, "test-jar", "test-jar", NbMavenProject.TYPE_JAR, ArtifactSpec.CLASSIFIER_TESTS);
+            appendPluginOutput(mp, "maven-source-plugin", "jar", "sources", NbMavenProject.TYPE_JAR, ArtifactSpec.CLASSIFIER_SOURCES, "java-source");
+            appendPluginOutput(mp, "maven-source-plugin", "test-jar", "sources", NbMavenProject.TYPE_JAR, ArtifactSpec.CLASSIFIER_TEST_SOURCES, "java-source", "test");
+            
             appendPluginOutput(mp, Constants.PLUGIN_WAR, NbMavenProject.TYPE_WAR, NbMavenProject.TYPE_WAR);
             appendPluginOutput(mp, Constants.PLUGIN_EAR, NbMavenProject.TYPE_EAR, NbMavenProject.TYPE_EAR);
             appendPluginOutput(mp, Constants.PLUGIN_EJB, NbMavenProject.TYPE_EJB, NbMavenProject.TYPE_EJB);
         }
     }
-    
+
     private static final RequestProcessor MAVEN_ARTIFACTS_RP = new RequestProcessor(MavenArtifactsImplementation.class);
 
     static class Res implements PropertyChangeListener {
+
         private final Project project;
         private final ProjectArtifactsQuery.Filter filter;
-        
+
         // @GuardedBy(this)
         private List<ArtifactSpec> artifacts;
         // @GuardedBy(this)
         private List<ChangeListener> listeners;
-        
+
         private RequestProcessor.Task refreshTask;
-        
+
         public Res(Project project, ProjectArtifactsQuery.Filter filter) {
             this.project = project;
             this.filter = filter;
         }
-        
+
         public Project getProject() {
             return project;
         }
@@ -274,12 +555,12 @@
             }
             return q.specs;
         }
-        
+
         private void update(List<ArtifactSpec> copy, RequestProcessor.Task self) {
             NbMavenProject mvnProject = project.getLookup().lookup(NbMavenProject.class);
             MavenQuery q = new MavenQuery(project, mvnProject, filter);
             q.run();
-            
+
             ChangeListener[] ll;
             synchronized (this) {
                 if (artifacts == null) {
@@ -296,7 +577,7 @@
                 l.stateChanged(e);
             }
         }
-        
+
         public Collection<ArtifactSpec> getExcludedArtifacts() {
             return null;
         }
@@ -327,7 +608,7 @@
             }
             ChangeListener[] ll;
             final List<ArtifactSpec> copy;
-            
+
             synchronized (this) {
                 artifacts = null;
                 if (listeners == null && listeners.isEmpty()) {
@@ -338,9 +619,9 @@
                 }
                 copy = artifacts == null ? Collections.emptyList() : new ArrayList<>(this.artifacts);
                 RequestProcessor.Task[] arr = new RequestProcessor.Task[1];
-                
+
                 arr[0] = refreshTask = MAVEN_ARTIFACTS_RP.create(() -> update(copy, arr[0]));
-                
+
                 ll = listeners.toArray(new ChangeListener[listeners.size()]);
             }
             ChangeEvent e = new ChangeEvent(this);
diff --git a/java/maven/test/unit/data/artifacts/shaded-attached/pom.xml b/java/maven/test/unit/data/artifacts/shaded-attached/pom.xml
new file mode 100644
index 0000000..281dd69
--- /dev/null
+++ b/java/maven/test/unit/data/artifacts/shaded-attached/pom.xml
@@ -0,0 +1,73 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+    Licensed to the Apache Software Foundation (ASF) under one
+    or more contributor license agreements.  See the NOTICE file
+    distributed with this work for additional information
+    regarding copyright ownership.  The ASF licenses this file
+    to you under the Apache License, Version 2.0 (the
+    "License"); you may not use this file except in compliance
+    with the License.  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing,
+    software distributed under the License is distributed on an
+    "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+    KIND, either express or implied.  See the License for the
+    specific language governing permissions and limitations
+    under the License.
+
+-->
+<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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+
+    <groupId>nbtest.grp</groupId>
+    <artifactId>shaded-attached</artifactId>
+    <version>16</version>
+
+    <name>Shaded Test</name>
+    <description>Tests artifacts from shade plugin</description>
+    
+    <properties>
+        <maven.compiler.source>1.8</maven.compiler.source>
+        <maven.compiler.target>1.8</maven.compiler.target>
+    </properties>
+
+    <dependencies>
+        <dependency>
+            <groupId>org.slf4j</groupId>
+            <artifactId>slf4j-api</artifactId>
+            <version>1.7.36</version>
+        </dependency>
+        <dependency>
+            <groupId>org.slf4j</groupId>
+            <artifactId>slf4j-jdk14</artifactId>
+            <version>1.7.36</version>
+            <scope>runtime</scope>
+        </dependency>
+    </dependencies>
+    
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-shade-plugin</artifactId>
+                <version>3.3.0</version>
+                <configuration>
+                    <shadedArtifactAttached>true</shadedArtifactAttached>
+                </configuration>
+                <executions>
+                  <execution>
+                    <id>default-shade</id>
+                    <phase>package</phase>
+                    <goals>
+                      <goal>shade</goal>
+                    </goals>
+                  </execution>
+                </executions>
+            </plugin>
+        </plugins>
+    </build>
+</project>
+
diff --git a/java/maven/test/unit/data/artifacts/shaded-attached/src/main/java/SampleApplication.java b/java/maven/test/unit/data/artifacts/shaded-attached/src/main/java/SampleApplication.java
new file mode 100644
index 0000000..0db334b
--- /dev/null
+++ b/java/maven/test/unit/data/artifacts/shaded-attached/src/main/java/SampleApplication.java
@@ -0,0 +1,26 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+/**
+ *
+ * @author sdedic
+ */
+public class SampleApplication {
+    
+}
diff --git a/java/maven/test/unit/data/artifacts/shaded-default/pom.xml b/java/maven/test/unit/data/artifacts/shaded-default/pom.xml
new file mode 100644
index 0000000..f836baf
--- /dev/null
+++ b/java/maven/test/unit/data/artifacts/shaded-default/pom.xml
@@ -0,0 +1,70 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+    Licensed to the Apache Software Foundation (ASF) under one
+    or more contributor license agreements.  See the NOTICE file
+    distributed with this work for additional information
+    regarding copyright ownership.  The ASF licenses this file
+    to you under the Apache License, Version 2.0 (the
+    "License"); you may not use this file except in compliance
+    with the License.  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing,
+    software distributed under the License is distributed on an
+    "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+    KIND, either express or implied.  See the License for the
+    specific language governing permissions and limitations
+    under the License.
+
+-->
+<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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+
+    <groupId>nbtest.grp</groupId>
+    <artifactId>shaded-default</artifactId>
+    <version>16</version>
+
+    <name>Shaded Test</name>
+    <description>Tests artifacts from shade plugin</description>
+    
+    <properties>
+        <maven.compiler.source>1.8</maven.compiler.source>
+        <maven.compiler.target>1.8</maven.compiler.target>
+    </properties>
+
+    <dependencies>
+        <dependency>
+            <groupId>org.slf4j</groupId>
+            <artifactId>slf4j-api</artifactId>
+            <version>1.7.36</version>
+        </dependency>
+        <dependency>
+            <groupId>org.slf4j</groupId>
+            <artifactId>slf4j-jdk14</artifactId>
+            <version>1.7.36</version>
+            <scope>runtime</scope>
+        </dependency>
+    </dependencies>
+    
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-shade-plugin</artifactId>
+                <version>3.3.0</version>
+                <executions>
+                  <execution>
+                    <id>default-shade</id>
+                    <phase>package</phase>
+                    <goals>
+                      <goal>shade</goal>
+                    </goals>
+                  </execution>
+                </executions>
+            </plugin>
+        </plugins>
+    </build>
+</project>
+
diff --git a/java/maven/test/unit/data/artifacts/shaded-default/src/main/java/SampleApplication.java b/java/maven/test/unit/data/artifacts/shaded-default/src/main/java/SampleApplication.java
new file mode 100644
index 0000000..0db334b
--- /dev/null
+++ b/java/maven/test/unit/data/artifacts/shaded-default/src/main/java/SampleApplication.java
@@ -0,0 +1,26 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+/**
+ *
+ * @author sdedic
+ */
+public class SampleApplication {
+    
+}
diff --git a/java/maven/test/unit/data/artifacts/shaded-sources/pom.xml b/java/maven/test/unit/data/artifacts/shaded-sources/pom.xml
new file mode 100644
index 0000000..d0aa1ca
--- /dev/null
+++ b/java/maven/test/unit/data/artifacts/shaded-sources/pom.xml
@@ -0,0 +1,100 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+    Licensed to the Apache Software Foundation (ASF) under one
+    or more contributor license agreements.  See the NOTICE file
+    distributed with this work for additional information
+    regarding copyright ownership.  The ASF licenses this file
+    to you under the Apache License, Version 2.0 (the
+    "License"); you may not use this file except in compliance
+    with the License.  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing,
+    software distributed under the License is distributed on an
+    "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+    KIND, either express or implied.  See the License for the
+    specific language governing permissions and limitations
+    under the License.
+
+-->
+<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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+
+    <groupId>nbtest.grp</groupId>
+    <artifactId>shaded-sources</artifactId>
+    <version>16</version>
+
+    <name>Shaded Test</name>
+    <description>Tests artifacts from shade plugin</description>
+    
+    <properties>
+        <maven.compiler.source>1.8</maven.compiler.source>
+        <maven.compiler.target>1.8</maven.compiler.target>
+    </properties>
+
+    <dependencies>
+        <dependency>
+            <groupId>org.slf4j</groupId>
+            <artifactId>slf4j-api</artifactId>
+            <version>1.7.36</version>
+        </dependency>
+        <dependency>
+            <groupId>org.slf4j</groupId>
+            <artifactId>slf4j-jdk14</artifactId>
+            <version>1.7.36</version>
+            <scope>runtime</scope>
+        </dependency>
+    </dependencies>
+    
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-source-plugin</artifactId>
+                <version>3.2.1</version>
+                <executions>
+                    <execution>
+                        <goals>
+                            <goal>jar</goal>
+                            <goal>test-jar</goal>
+                        </goals>
+                    </execution>
+                </executions>
+            </plugin>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-jar-plugin</artifactId>
+                <version>3.2.2</version>
+                <executions>
+                    <execution>
+                        <goals>
+                            <goal>test-jar</goal>
+                        </goals>
+                    </execution>
+                </executions>
+            </plugin>            
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-shade-plugin</artifactId>
+                <version>3.3.0</version>
+                <configuration>
+                    <shadeTestJar>true</shadeTestJar>
+                    <createSourcesJar>true</createSourcesJar>
+                    <createTestSourcesJar>true</createTestSourcesJar>
+                </configuration>
+                <executions>
+                  <execution>
+                    <id>default-shade</id>
+                    <phase>package</phase>
+                    <goals>
+                      <goal>shade</goal>
+                    </goals>
+                  </execution>
+                </executions>
+            </plugin>
+        </plugins>
+    </build>
+</project>
+
diff --git a/java/maven/test/unit/data/artifacts/shaded-sources/src/main/java/SampleApplication.java b/java/maven/test/unit/data/artifacts/shaded-sources/src/main/java/SampleApplication.java
new file mode 100644
index 0000000..0db334b
--- /dev/null
+++ b/java/maven/test/unit/data/artifacts/shaded-sources/src/main/java/SampleApplication.java
@@ -0,0 +1,26 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+/**
+ *
+ * @author sdedic
+ */
+public class SampleApplication {
+    
+}
diff --git a/java/maven/test/unit/data/artifacts/sources/pom.xml b/java/maven/test/unit/data/artifacts/sources/pom.xml
new file mode 100644
index 0000000..dbf3dd3
--- /dev/null
+++ b/java/maven/test/unit/data/artifacts/sources/pom.xml
@@ -0,0 +1,102 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+    Licensed to the Apache Software Foundation (ASF) under one
+    or more contributor license agreements.  See the NOTICE file
+    distributed with this work for additional information
+    regarding copyright ownership.  The ASF licenses this file
+    to you under the Apache License, Version 2.0 (the
+    "License"); you may not use this file except in compliance
+    with the License.  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing,
+    software distributed under the License is distributed on an
+    "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+    KIND, either express or implied.  See the License for the
+    specific language governing permissions and limitations
+    under the License.
+
+-->
+<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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+
+    <groupId>nbtest.grp</groupId>
+    <artifactId>sources</artifactId>
+    <version>16</version>
+
+    <name>Shaded Test</name>
+    <description>Tests artifacts from shade plugin</description>
+    
+    <properties>
+        <maven.compiler.source>1.8</maven.compiler.source>
+        <maven.compiler.target>1.8</maven.compiler.target>
+    </properties>
+
+    <dependencies>
+        <dependency>
+            <groupId>org.slf4j</groupId>
+            <artifactId>slf4j-api</artifactId>
+            <version>1.7.36</version>
+        </dependency>
+        <dependency>
+            <groupId>org.slf4j</groupId>
+            <artifactId>slf4j-jdk14</artifactId>
+            <version>1.7.36</version>
+            <scope>runtime</scope>
+        </dependency>
+    </dependencies>
+    
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-source-plugin</artifactId>
+                <version>3.2.1</version>
+                <executions>
+                    <execution>
+                        <goals>
+                            <goal>jar</goal>
+                            <goal>test-jar</goal>
+                        </goals>
+                    </execution>
+                </executions>
+            </plugin>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-jar-plugin</artifactId>
+                <version>3.2.2</version>
+                <executions>
+                    <execution>
+                        <goals>
+                            <goal>test-jar</goal>
+                        </goals>
+                    </execution>
+                </executions>
+            </plugin>            
+            <!--
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-shade-plugin</artifactId>
+                <version>3.3.0</version>
+                <configuration>
+                    <shadeTestJar>true</shadeTestJar>
+                    <createSourcesJar>true</createSourcesJar>
+                    <createTestSourcesJar>true</createTestSourcesJar>
+                </configuration>
+                <executions>
+                  <execution>
+                    <id>default-shade</id>
+                    <phase>package</phase>
+                    <goals>
+                      <goal>shade</goal>
+                    </goals>
+                  </execution>
+                </executions>
+            </plugin>
+            -->
+        </plugins>
+    </build>
+</project>
+
diff --git a/java/maven/test/unit/data/artifacts/sources/src/main/java/SampleApplication.java b/java/maven/test/unit/data/artifacts/sources/src/main/java/SampleApplication.java
new file mode 100644
index 0000000..0db334b
--- /dev/null
+++ b/java/maven/test/unit/data/artifacts/sources/src/main/java/SampleApplication.java
@@ -0,0 +1,26 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+/**
+ *
+ * @author sdedic
+ */
+public class SampleApplication {
+    
+}
diff --git a/java/maven/test/unit/src/org/netbeans/modules/maven/output/TestOutputListenerProviderTest.java b/java/maven/test/unit/src/org/netbeans/modules/maven/output/TestOutputListenerProviderTest.java
index 0cfd9cc..5faa6a2 100644
--- a/java/maven/test/unit/src/org/netbeans/modules/maven/output/TestOutputListenerProviderTest.java
+++ b/java/maven/test/unit/src/org/netbeans/modules/maven/output/TestOutputListenerProviderTest.java
@@ -19,11 +19,6 @@
 package org.netbeans.modules.maven.output;
 
 import junit.framework.*;
-import static junit.framework.Assert.assertEquals;
-import static junit.framework.Assert.assertFalse;
-import static junit.framework.Assert.assertNotNull;
-import static junit.framework.Assert.assertNull;
-import static junit.framework.Assert.assertTrue;
 import org.netbeans.modules.maven.api.output.OutputVisitor;
 
 /**
diff --git a/java/maven/test/unit/src/org/netbeans/modules/maven/queries/MavenArtifactsImplementationTest.java b/java/maven/test/unit/src/org/netbeans/modules/maven/queries/MavenArtifactsImplementationTest.java
index 5837fb0..c7de3ac 100644
--- a/java/maven/test/unit/src/org/netbeans/modules/maven/queries/MavenArtifactsImplementationTest.java
+++ b/java/maven/test/unit/src/org/netbeans/modules/maven/queries/MavenArtifactsImplementationTest.java
@@ -20,6 +20,8 @@
 
 import java.io.File;
 import java.net.URI;
+import java.nio.file.Paths;
+import java.util.List;
 import java.util.concurrent.Exchanger;
 import static junit.framework.TestCase.assertNotNull;
 import static junit.framework.TestCase.assertNull;
@@ -27,7 +29,6 @@
 import org.netbeans.api.project.ProjectActionContext;
 import org.netbeans.api.project.ProjectManager;
 import org.netbeans.junit.NbTestCase;
-import org.netbeans.modules.maven.api.Constants;
 import org.netbeans.modules.maven.api.NbMavenProject;
 import org.netbeans.modules.maven.embedder.EmbedderFactory;
 import org.netbeans.modules.project.dependency.ArtifactSpec;
@@ -291,4 +292,357 @@
         assertEquals(0, ar.getArtifacts().size());
     }
 
+    /**
+     * Checks that the default artifact for shaded plugin does not change, but is annotated
+     * by an appropriate tag.
+     */
+    public void testShadedDefault() throws Exception {
+        FileObject testApp = dataFO.getFileObject("artifacts/shaded-default/");
+        FileObject prjCopy = FileUtil.copyFile(testApp, FileUtil.toFileObject(getWorkDir()), "shaded-default");
+        
+        Project p = ProjectManager.getDefault().findProject(prjCopy);
+        ProjectArtifactsQuery.ArtifactsResult ar = ProjectArtifactsQuery.findArtifacts(p, 
+                ProjectArtifactsQuery.newQuery(NbMavenProject.TYPE_JAR)
+        );
+        
+        assertNotNull(ar);
+        List<ArtifactSpec> specs = ar.getArtifacts();
+        assertEquals(1, specs.size());
+        
+        ArtifactSpec uberJar = specs.get(0);
+        assertReplacementUberjar(uberJar);
+    }
+    
+    /**
+     * Checks that the original jar can be queried, but has no GAV.
+     */
+    public void testShadedDefaultOriginal() throws Exception {
+        FileObject testApp = dataFO.getFileObject("artifacts/shaded-default/");
+        FileObject prjCopy = FileUtil.copyFile(testApp, FileUtil.toFileObject(getWorkDir()), "shaded-default");
+        
+        Project p = ProjectManager.getDefault().findProject(prjCopy);
+        ProjectArtifactsQuery.ArtifactsResult ar = ProjectArtifactsQuery.findArtifacts(p, 
+                ProjectArtifactsQuery.newQuery(NbMavenProject.TYPE_JAR, null, null, ArtifactSpec.TAG_BASE)
+        );
+        
+        List<ArtifactSpec> specs = ar.getArtifacts();
+        assertEquals(1, specs.size());
+        ArtifactSpec origJar = specs.get(0);
+        assertNotAttachedOriginal(origJar);
+    }
+    
+    private void assertReplacementUberjar(ArtifactSpec uberJar) {
+        assertReplacementUberjar(uberJar, "shaded-default");
+    }
+    
+    private void assertReplacementUberjar(ArtifactSpec uberJar, String prjName) {
+        assertEquals("Uber-jar has a proper artifactId", prjName, uberJar.getArtifactId());
+        assertEquals("Uber-jar has a proper groupId", "nbtest.grp", uberJar.getGroupId());
+        assertNull("Uber-jar should have no classifier", uberJar.getClassifier());
+        assertTrue(uberJar.hasTag("<shaded>"));
+        assertFalse(uberJar.hasTag(ArtifactSpec.TAG_BASE));
+    }
+    
+    void assertNotAttachedOriginal(ArtifactSpec origJar) {
+        assertNull("Orig-jar has no artifactId", origJar.getArtifactId());
+        assertNull("Orig-jar has no groupId", origJar.getGroupId());
+        assertNull("Orig-jar should have no classifier", origJar.getClassifier());
+        assertTrue(origJar.hasTag(ArtifactSpec.TAG_BASE));
+        assertFalse(origJar.hasTag("<shaded>"));
+    }
+    
+    /**
+     * Checks that 'any classifier' produces all jars, original and shaded.
+     */
+    public void testShadedAllCodeJars() throws Exception {
+        FileObject testApp = dataFO.getFileObject("artifacts/shaded-default/");
+        FileObject prjCopy = FileUtil.copyFile(testApp, FileUtil.toFileObject(getWorkDir()), "shaded-default");
+        
+        Project p = ProjectManager.getDefault().findProject(prjCopy);
+        ProjectArtifactsQuery.ArtifactsResult ar = ProjectArtifactsQuery.findArtifacts(p, 
+                ProjectArtifactsQuery.newQuery(NbMavenProject.TYPE_JAR, ProjectArtifactsQuery.Filter.CLASSIFIER_ANY, null)
+        );
+        List<ArtifactSpec> specs = ar.getArtifacts();
+        assertEquals(2, specs.size());
+        
+        boolean shadedFound = false;
+        boolean origFound = false;
+        for (ArtifactSpec spec : specs) {
+            if (spec.hasTag(ArtifactSpec.TAG_BASE)) {
+                assertFalse("Single base artifact expected", origFound);
+                origFound = true;
+                assertNotAttachedOriginal(spec);
+            } else if (spec.hasTag(ArtifactSpec.TAG_SHADED)) {
+                assertFalse("Single shaded artifact expected", shadedFound);
+                shadedFound = true;
+                assertReplacementUberjar(spec);
+            } else {
+                fail("Artifact should be either base or shaded");
+            }
+        }
+    }
+    
+    /**
+     * Checks that for attached shaded artifact, the default output is not affected and has no tag.
+     */
+    public void testShadedAttachedDefaultOutput() throws Exception {
+        FileObject testApp = dataFO.getFileObject("artifacts/shaded-attached");
+        FileObject prjCopy = FileUtil.copyFile(testApp, FileUtil.toFileObject(getWorkDir()), "shaded-attached");
+        
+        Project p = ProjectManager.getDefault().findProject(prjCopy);
+        ProjectArtifactsQuery.ArtifactsResult ar = ProjectArtifactsQuery.findArtifacts(p, 
+                ProjectArtifactsQuery.newQuery(NbMavenProject.TYPE_JAR)
+        );
+        List<ArtifactSpec> specs = ar.getArtifacts();
+        assertEquals(1, specs.size());
+        ArtifactSpec out = specs.get(0);
+        assertDefaultArtifactWithAttached(out);
+    }
+
+    /**
+     * Checks that for attached shaded artifact, the default output is not affected and has no tag.
+     */
+    public void testShadedAttachedClassifiedOutput() throws Exception {
+        FileObject testApp = dataFO.getFileObject("artifacts/shaded-attached");
+        FileObject prjCopy = FileUtil.copyFile(testApp, FileUtil.toFileObject(getWorkDir()), "shaded-attached");
+        
+        Project p = ProjectManager.getDefault().findProject(prjCopy);
+        ProjectArtifactsQuery.ArtifactsResult ar = ProjectArtifactsQuery.findArtifacts(p, 
+                ProjectArtifactsQuery.newQuery(NbMavenProject.TYPE_JAR, "shaded", null)
+        );
+        List<ArtifactSpec> specs = ar.getArtifacts();
+        assertEquals(1, specs.size());
+        ArtifactSpec out = specs.get(0);
+        assertAttachedUberjar(out, "shaded");
+    }
+    
+    /**
+     * Checks that for attached shaded artifact, the default output is not affected and has no tag.
+     */
+    public void testShadedAttachedClassifiedOriginalOutput() throws Exception {
+        FileObject testApp = dataFO.getFileObject("artifacts/shaded-attached");
+        FileObject prjCopy = FileUtil.copyFile(testApp, FileUtil.toFileObject(getWorkDir()), "shaded-attached");
+        
+        Project p = ProjectManager.getDefault().findProject(prjCopy);
+        ProjectArtifactsQuery.ArtifactsResult ar = ProjectArtifactsQuery.findArtifacts(p, 
+                ProjectArtifactsQuery.newQuery(NbMavenProject.TYPE_JAR, "shaded", null, ArtifactSpec.TAG_BASE)
+        );
+        List<ArtifactSpec> specs = ar.getArtifacts();
+        assertEquals(1, specs.size());
+        ArtifactSpec out = specs.get(0);
+        assertAttachedOriginal(out, "shaded");
+    }
+    
+    private void assertDefaultArtifactWithAttached(ArtifactSpec out) {
+        assertEquals("Output has a proper artifactId", "shaded-attached", out.getArtifactId());
+        assertEquals("Output has a proper groupId", "nbtest.grp", out.getGroupId());
+        assertNull("Output has no classifier", out.getClassifier());
+        assertFalse(out.hasTag("<shaded>"));
+        assertFalse(out.hasTag(ArtifactSpec.TAG_BASE));
+    }
+
+    private void assertAttachedUberjar(ArtifactSpec uberJar, String classifier) {
+        assertEquals("Uber-jar has a proper artifactId", "shaded-attached", uberJar.getArtifactId());
+        assertEquals("Uber-jar has a proper groupId", "nbtest.grp", uberJar.getGroupId());
+        assertEquals("Uber-jar has a classifier", classifier, uberJar.getClassifier());
+        assertTrue(uberJar.hasTag("<shaded>"));
+        assertFalse(uberJar.hasTag(ArtifactSpec.TAG_BASE));
+    }
+    
+    void assertAttachedOriginal(ArtifactSpec origJar, String classifier) {
+        assertEquals("Orig-jar has an artifactId", "shaded-attached", origJar.getArtifactId());
+        assertEquals("Orig-jar has a groupId", "nbtest.grp", origJar.getGroupId());
+        assertEquals("Orig-jar has a classifier", classifier, origJar.getClassifier());
+        assertTrue(origJar.hasTag(ArtifactSpec.TAG_BASE));
+        assertFalse(origJar.hasTag(ArtifactSpec.TAG_SHADED));
+    }
+    
+    /**
+     * Checks that for attached shaded artifact, the default output is not affected and has no tag.
+     */
+    public void testShadedAttachedClassifiedAllOutput() throws Exception {
+        FileObject testApp = dataFO.getFileObject("artifacts/shaded-attached");
+        FileObject prjCopy = FileUtil.copyFile(testApp, FileUtil.toFileObject(getWorkDir()), "shaded-attached");
+        
+        Project p = ProjectManager.getDefault().findProject(prjCopy);
+        ProjectArtifactsQuery.ArtifactsResult ar = ProjectArtifactsQuery.findArtifacts(p, 
+                ProjectArtifactsQuery.newQuery(NbMavenProject.TYPE_JAR, ProjectArtifactsQuery.Filter.CLASSIFIER_ANY, null)
+        );
+        List<ArtifactSpec> specs = ar.getArtifacts();
+        assertEquals(3, specs.size());
+        for (ArtifactSpec out : specs) {
+            if (out.hasTag(ArtifactSpec.TAG_BASE)) {
+                assertAttachedOriginal(out, "shaded");
+            } else if (out.hasTag(ArtifactSpec.TAG_SHADED)) {
+                assertAttachedUberjar(out, "shaded");
+            } else {
+                assertDefaultArtifactWithAttached(out);
+            }
+        }
+    }
+    
+    FileObject prjCopy;
+    
+    private void assertAttachedClassifiedArtifact(String prjName, ArtifactSpec out, String classifier, String type) {
+        assertEquals("Output has a proper artifactId", prjName, out.getArtifactId());
+        assertEquals("Output has a proper groupId", "nbtest.grp", out.getGroupId());
+        assertEquals("Output has a classifier", classifier, out.getClassifier());
+        assertEquals("Output has a type", type, out.getType());
+        assertFalse(out.hasTag("<shaded>"));
+        assertFalse(out.hasTag(ArtifactSpec.TAG_BASE));
+        
+        String suffix = classifier == null ? "" : "-" + classifier;
+        
+        URI expected = FileUtil.toFile(prjCopy).toPath().resolve(Paths.get("target", prjName + "-16" + suffix + ".jar")).toUri();
+        assertEquals(expected, out.getLocation());
+    }
+    
+    boolean attached;
+
+    private void assertShadedAttachedClassifiedArtifact(String prjName, ArtifactSpec out, String classifier, String type, Boolean shaded) {
+        if (Boolean.TRUE == shaded) {
+            assertTrue(out.hasTag("<shaded>"));
+            assertFalse(out.hasTag(ArtifactSpec.TAG_BASE));
+            if (attached) {
+                classifier = classifier + "-shaded";
+            }
+        } else if (Boolean.FALSE == shaded) {
+            assertFalse(out.hasTag(ArtifactSpec.TAG_SHADED));
+            assertTrue(out.hasTag(ArtifactSpec.TAG_BASE));
+            prjName = "original-" + prjName;
+        } else {
+            assertFalse(out.hasTag(ArtifactSpec.TAG_SHADED));
+            assertFalse(out.hasTag(ArtifactSpec.TAG_BASE));
+        }
+        if (attached || Boolean.FALSE != shaded) {
+            assertEquals("Output has a proper artifactId", prjName, out.getArtifactId());
+            assertEquals("Output has a proper groupId", "nbtest.grp", out.getGroupId());
+        }
+        assertEquals("Output has a classifier", classifier, out.getClassifier());
+        assertEquals("Output has a type", type, out.getType());
+        
+        URI expected = FileUtil.toFile(prjCopy).toPath().resolve(Paths.get("target", prjName + "-16-" + classifier + ".jar")).toUri();
+        assertEquals(expected, out.getLocation());
+    }
+    
+    public void testSourceAttachment() throws Exception {
+        FileObject testApp = dataFO.getFileObject("artifacts/sources");
+        prjCopy = FileUtil.copyFile(testApp, FileUtil.toFileObject(getWorkDir()), "sources");
+        
+        Project p = ProjectManager.getDefault().findProject(prjCopy);
+        ProjectArtifactsQuery.ArtifactsResult ar = ProjectArtifactsQuery.findArtifacts(p, 
+                ProjectArtifactsQuery.newQuery(null, ArtifactSpec.CLASSIFIER_SOURCES, null)
+        );
+        List<ArtifactSpec> specs = ar.getArtifacts();
+        assertEquals(1, specs.size());
+        ArtifactSpec out = specs.get(0);
+        assertAttachedClassifiedArtifact("sources", out, "sources", "sources");
+    }
+
+    public void testTestsAttachment() throws Exception {
+        FileObject testApp = dataFO.getFileObject("artifacts/sources");
+        prjCopy = FileUtil.copyFile(testApp, FileUtil.toFileObject(getWorkDir()), "sources");
+        
+        Project p = ProjectManager.getDefault().findProject(prjCopy);
+        ProjectArtifactsQuery.ArtifactsResult ar = ProjectArtifactsQuery.findArtifacts(p, 
+                ProjectArtifactsQuery.newQuery(null, ArtifactSpec.CLASSIFIER_TESTS, null)
+        );
+        List<ArtifactSpec> specs = ar.getArtifacts();
+        assertEquals(1, specs.size());
+        ArtifactSpec out = specs.get(0);
+        assertAttachedClassifiedArtifact("sources", out, "tests", "test-jar");
+    }
+
+    public void testTestsSourcesAttachment() throws Exception {
+        FileObject testApp = dataFO.getFileObject("artifacts/sources");
+        prjCopy = FileUtil.copyFile(testApp, FileUtil.toFileObject(getWorkDir()), "sources");
+        
+        Project p = ProjectManager.getDefault().findProject(prjCopy);
+        ProjectArtifactsQuery.ArtifactsResult ar = ProjectArtifactsQuery.findArtifacts(p, 
+                ProjectArtifactsQuery.newQuery(null, ArtifactSpec.CLASSIFIER_TEST_SOURCES, null)
+        );
+        List<ArtifactSpec> specs = ar.getArtifacts();
+        assertEquals(1, specs.size());
+        ArtifactSpec out = specs.get(0);
+        assertAttachedClassifiedArtifact("sources", out, "test-sources", "sources");
+    }
+    
+    public void testDefaultAllAttachments() throws Exception {
+        FileObject testApp = dataFO.getFileObject("artifacts/sources");
+        prjCopy = FileUtil.copyFile(testApp, FileUtil.toFileObject(getWorkDir()), "sources");
+        
+        Project p = ProjectManager.getDefault().findProject(prjCopy);
+        ProjectArtifactsQuery.ArtifactsResult ar = ProjectArtifactsQuery.findArtifacts(p, 
+                ProjectArtifactsQuery.newQuery(null, ProjectArtifactsQuery.Filter.CLASSIFIER_ANY, null)
+        );
+        List<ArtifactSpec> specs = ar.getArtifacts();
+        assertEquals(4, specs.size());
+        for (ArtifactSpec out : specs) {
+            if (ArtifactSpec.CLASSIFIER_SOURCES.equals(out.getClassifier())) {
+                assertAttachedClassifiedArtifact("sources", out, "sources", "sources");
+                assertFalse(out.hasTag("test"));
+            } else if (ArtifactSpec.CLASSIFIER_TESTS.equals(out.getClassifier())) {
+                assertAttachedClassifiedArtifact("sources", out, "tests", "test-jar");
+            } else if (ArtifactSpec.CLASSIFIER_TEST_SOURCES.equals(out.getClassifier())) {
+                assertAttachedClassifiedArtifact("sources", out, "test-sources", "sources");
+                assertTrue(out.hasTag("test"));
+            } else {
+                assertAttachedClassifiedArtifact("sources", out, null, "jar");
+            }
+        }
+    }
+
+    public void testShadedSourceAttachment() throws Exception {
+        FileObject testApp = dataFO.getFileObject("artifacts/shaded-sources");
+        prjCopy = FileUtil.copyFile(testApp, FileUtil.toFileObject(getWorkDir()), "shaded-sources");
+        
+        Project p = ProjectManager.getDefault().findProject(prjCopy);
+        ProjectArtifactsQuery.ArtifactsResult ar = ProjectArtifactsQuery.findArtifacts(p, 
+                ProjectArtifactsQuery.newQuery(null, ArtifactSpec.CLASSIFIER_SOURCES, null)
+        );
+        List<ArtifactSpec> specs = ar.getArtifacts();
+        assertEquals(1, specs.size());
+        ArtifactSpec out = specs.get(0);
+        assertAttachedClassifiedArtifact("shaded-sources", out, "sources", "sources");
+        assertSame(prjCopy.getFileObject("target/shaded-sources-16-sources.jar"), out.getLocalFile());
+    }
+
+    public void testShadedAllAttachments() throws Exception {
+        FileObject testApp = dataFO.getFileObject("artifacts/shaded-sources");
+        prjCopy = FileUtil.copyFile(testApp, FileUtil.toFileObject(getWorkDir()), "shaded-sources");
+        
+        Project p = ProjectManager.getDefault().findProject(prjCopy);
+        ProjectArtifactsQuery.ArtifactsResult ar = ProjectArtifactsQuery.findArtifacts(p, 
+                ProjectArtifactsQuery.newQuery(null, ProjectArtifactsQuery.Filter.CLASSIFIER_ANY, null)
+        );
+        List<ArtifactSpec> specs = ar.getArtifacts();
+        assertEquals(8, specs.size());
+        for (ArtifactSpec out : specs) {
+            Boolean b;
+            if (out.hasTag(ArtifactSpec.TAG_SHADED)) {
+                b = true;
+            } else if (out.hasTag(ArtifactSpec.TAG_BASE)) {
+                b = false;
+            } else {
+                fail("Only base and tagged artifacts expected");
+                return; // not reached
+            }
+            if (ArtifactSpec.CLASSIFIER_SOURCES.equals(out.getClassifier())) {
+                assertShadedAttachedClassifiedArtifact("shaded-sources", out, "sources", "sources", b);
+                assertFalse(out.hasTag("test"));
+            } else if (ArtifactSpec.CLASSIFIER_TESTS.equals(out.getClassifier())) {
+                assertShadedAttachedClassifiedArtifact("shaded-sources", out, "tests", "test-jar", b);
+                assertTrue(out.hasTag("test"));
+            } else if (ArtifactSpec.CLASSIFIER_TEST_SOURCES.equals(out.getClassifier())) {
+                assertShadedAttachedClassifiedArtifact("shaded-sources", out, "test-sources", "sources", b);
+                assertTrue(out.hasTag("test"));
+            } else {
+                if (Boolean.TRUE == b) {
+                    assertReplacementUberjar(out, "shaded-sources");
+                } else if (Boolean.FALSE == b) {
+                    assertNotAttachedOriginal(out);
+                }
+            }
+        }
+    }
 }
diff --git a/java/maven/test/unit/src/org/netbeans/modules/maven/queries/MavenSourceLevelImplTest.java b/java/maven/test/unit/src/org/netbeans/modules/maven/queries/MavenSourceLevelImplTest.java
index 7bea36a..e7ff907 100644
--- a/java/maven/test/unit/src/org/netbeans/modules/maven/queries/MavenSourceLevelImplTest.java
+++ b/java/maven/test/unit/src/org/netbeans/modules/maven/queries/MavenSourceLevelImplTest.java
@@ -20,7 +20,6 @@
 package org.netbeans.modules.maven.queries;
 
 import java.util.regex.Matcher;
-import static junit.framework.Assert.assertTrue;
 import org.netbeans.api.java.queries.SourceLevelQuery;
 import org.netbeans.api.project.ProjectManager;
 import org.netbeans.junit.NbTestCase;
diff --git a/java/performance.java/test/qa-functional/src/org/netbeans/performance/j2se/actions/CountingSecurityManager.java b/java/performance.java/test/qa-functional/src/org/netbeans/performance/j2se/actions/CountingSecurityManager.java
index e5ad6a7..3e9bcba 100644
--- a/java/performance.java/test/qa-functional/src/org/netbeans/performance/j2se/actions/CountingSecurityManager.java
+++ b/java/performance.java/test/qa-functional/src/org/netbeans/performance/j2se/actions/CountingSecurityManager.java
@@ -31,7 +31,7 @@
 import java.util.Map;
 import java.util.TreeSet;
 import java.util.concurrent.atomic.AtomicLong;
-import junit.framework.Assert;
+import org.junit.Assert;
 
 /**
  *
diff --git a/java/performance/benchmarks/test/perf/src/org/netbeans/performance/platform/RunnableMethod.java b/java/performance/benchmarks/test/perf/src/org/netbeans/performance/platform/RunnableMethod.java
index 5faa2f1..09fe4d0 100644
--- a/java/performance/benchmarks/test/perf/src/org/netbeans/performance/platform/RunnableMethod.java
+++ b/java/performance/benchmarks/test/perf/src/org/netbeans/performance/platform/RunnableMethod.java
@@ -158,7 +158,7 @@
                 mtd.invoke( obj, args );
             } catch( Throwable t ) {
                 t.printStackTrace();
-                junit.framework.Assert.fail( "Exception: " + t.getMessage() );
+                org.junit.Assert.fail( "Exception: " + t.getMessage() );
             }
         }
     }
diff --git a/java/performance/cnd/test/unit/src/org/netbeans/performance/cnd/Utilities.java b/java/performance/cnd/test/unit/src/org/netbeans/performance/cnd/Utilities.java
index 11b9499..fbea413 100644
--- a/java/performance/cnd/test/unit/src/org/netbeans/performance/cnd/Utilities.java
+++ b/java/performance/cnd/test/unit/src/org/netbeans/performance/cnd/Utilities.java
@@ -23,7 +23,7 @@
 import java.util.logging.*;
 import java.util.zip.*;
 
-import junit.framework.Assert;
+import org.junit.Assert;
 
 import org.openide.filesystems.*;
 import org.openide.util.*;
diff --git a/java/performance/enterprise/test/qa-functional/src/org/netbeans/performance/enterprise/actions/WatchProjectsTest.java b/java/performance/enterprise/test/qa-functional/src/org/netbeans/performance/enterprise/actions/WatchProjectsTest.java
index 636fecd..76f1c60 100644
--- a/java/performance/enterprise/test/qa-functional/src/org/netbeans/performance/enterprise/actions/WatchProjectsTest.java
+++ b/java/performance/enterprise/test/qa-functional/src/org/netbeans/performance/enterprise/actions/WatchProjectsTest.java
@@ -24,7 +24,6 @@
 import java.lang.reflect.Method;
 import java.util.logging.Level;
 import java.util.logging.Logger;
-import junit.framework.Assert;
 import org.netbeans.jellytools.JellyTestCase;
 import org.netbeans.jellytools.ProjectsTabOperator;
 import org.netbeans.jemmy.EventTool;
@@ -64,7 +63,7 @@
         Log.enableInstances(Logger.getLogger("TIMER"), "Project", Level.FINEST);
         
         final ClassLoader loader = Lookup.getDefault().lookup(ClassLoader.class);
-        Assert.assertNotNull("Classloader must exists", loader);
+        assertNotNull("Classloader must exists", loader);
         LOG.fine("Classloader: " + loader);
         Class pmClass = Class.forName(
             "org.netbeans.api.project.ui.OpenProjects", false, loader); //NOI18N
diff --git a/java/performance/src/org/netbeans/modules/performance/utilities/MeasureStartupTimeTestCase.java b/java/performance/src/org/netbeans/modules/performance/utilities/MeasureStartupTimeTestCase.java
index 6c9b319..536610e 100644
--- a/java/performance/src/org/netbeans/modules/performance/utilities/MeasureStartupTimeTestCase.java
+++ b/java/performance/src/org/netbeans/modules/performance/utilities/MeasureStartupTimeTestCase.java
@@ -29,7 +29,6 @@
 import java.util.TreeSet;
 import java.util.logging.Level;
 import java.util.logging.Logger;
-import junit.framework.Assert;
 
 /**
  * Measure startup time by org.netbeans.core.perftool.StartLog. Number of starts
@@ -366,24 +365,24 @@
         try {
             Class<?> lookup = Class.forName("org.openide.util.Lookup"); // NOI18N
             File util = new File(lookup.getProtectionDomain().getCodeSource().getLocation().toURI());
-            Assert.assertTrue("Util exists: " + util, util.exists());
+            assertTrue("Util exists: " + util, util.exists());
 
             return util.getParentFile().getParentFile();
         } catch (Exception ex) {
             try {
                 File nbjunit = new File(MeasureStartupTimeTestCase.class.getProtectionDomain().getCodeSource().getLocation().toURI());
                 File harness = nbjunit.getParentFile().getParentFile();
-                Assert.assertEquals("NbJUnit is in harness", "harness", harness.getName());
+                assertEquals("NbJUnit is in harness", "harness", harness.getName());
                 TreeSet<File> sorted = new TreeSet<>();
                 for (File p : harness.getParentFile().listFiles()) {
                     if (p.getName().startsWith("platform")) {
                         sorted.add(p);
                     }
                 }
-                Assert.assertFalse("Platform shall be found in " + harness.getParent(), sorted.isEmpty());
+                assertFalse("Platform shall be found in " + harness.getParent(), sorted.isEmpty());
                 return sorted.last();
             } catch (Exception ex2) {
-                Assert.fail("Cannot find utilities JAR: " + ex + " and: " + ex2);
+                fail("Cannot find utilities JAR: " + ex + " and: " + ex2);
             }
             return null;
         }
diff --git a/java/performance/test/qa-functional/src/org/netbeans/test/ide/PerfCountingSecurityManager.java b/java/performance/test/qa-functional/src/org/netbeans/test/ide/PerfCountingSecurityManager.java
index 7eaf822..ac6a135 100644
--- a/java/performance/test/qa-functional/src/org/netbeans/test/ide/PerfCountingSecurityManager.java
+++ b/java/performance/test/qa-functional/src/org/netbeans/test/ide/PerfCountingSecurityManager.java
@@ -40,7 +40,7 @@
 import java.util.concurrent.Callable;
 import java.util.logging.Level;
 import java.util.logging.Logger;
-import junit.framework.Assert;
+import org.junit.Assert;
 import org.openide.util.Utilities;
 import sun.security.util.SecurityConstants;
 
diff --git a/java/performance/test/qa-functional/src/org/netbeans/test/ide/PerfWatchProjects.java b/java/performance/test/qa-functional/src/org/netbeans/test/ide/PerfWatchProjects.java
index 28ae8b0..7d02ce7 100644
--- a/java/performance/test/qa-functional/src/org/netbeans/test/ide/PerfWatchProjects.java
+++ b/java/performance/test/qa-functional/src/org/netbeans/test/ide/PerfWatchProjects.java
@@ -34,8 +34,8 @@
 import java.util.logging.Level;
 import java.util.logging.Logger;
 import javax.swing.*;
-import junit.framework.Assert;
 import junit.framework.AssertionFailedError;
+import org.junit.Assert;
 import org.netbeans.api.java.source.ui.ScanDialog;
 import org.netbeans.api.project.Project;
 import org.netbeans.api.project.ui.OpenProjects;
diff --git a/java/performance/test/unit/src/org/netbeans/performance/scalability/CountingSecurityManager.java b/java/performance/test/unit/src/org/netbeans/performance/scalability/CountingSecurityManager.java
index b63d542..0534af0 100644
--- a/java/performance/test/unit/src/org/netbeans/performance/scalability/CountingSecurityManager.java
+++ b/java/performance/test/unit/src/org/netbeans/performance/scalability/CountingSecurityManager.java
@@ -31,7 +31,7 @@
 import java.util.Map;
 import java.util.TreeSet;
 import java.util.concurrent.atomic.AtomicLong;
-import junit.framework.Assert;
+import org.junit.Assert;
 import org.openide.util.Exceptions;
 
 /**
diff --git a/java/refactoring.java/nbproject/org-netbeans-modules-refactoring-java.sig b/java/refactoring.java/nbproject/org-netbeans-modules-refactoring-java.sig
index bc7ee9e..26adf5a 100644
--- a/java/refactoring.java/nbproject/org-netbeans-modules-refactoring-java.sig
+++ b/java/refactoring.java/nbproject/org-netbeans-modules-refactoring-java.sig
@@ -66,7 +66,6 @@
 meth public abstract {com.sun.source.tree.TreeVisitor%0} visitExports(com.sun.source.tree.ExportsTree,{com.sun.source.tree.TreeVisitor%1})
 meth public abstract {com.sun.source.tree.TreeVisitor%0} visitExpressionStatement(com.sun.source.tree.ExpressionStatementTree,{com.sun.source.tree.TreeVisitor%1})
 meth public abstract {com.sun.source.tree.TreeVisitor%0} visitForLoop(com.sun.source.tree.ForLoopTree,{com.sun.source.tree.TreeVisitor%1})
-meth public abstract {com.sun.source.tree.TreeVisitor%0} visitGuardedPattern(com.sun.source.tree.GuardedPatternTree,{com.sun.source.tree.TreeVisitor%1})
 meth public abstract {com.sun.source.tree.TreeVisitor%0} visitIdentifier(com.sun.source.tree.IdentifierTree,{com.sun.source.tree.TreeVisitor%1})
 meth public abstract {com.sun.source.tree.TreeVisitor%0} visitIf(com.sun.source.tree.IfTree,{com.sun.source.tree.TreeVisitor%1})
 meth public abstract {com.sun.source.tree.TreeVisitor%0} visitImport(com.sun.source.tree.ImportTree,{com.sun.source.tree.TreeVisitor%1})
@@ -147,7 +146,6 @@
 meth public {com.sun.source.util.TreeScanner%0} visitExports(com.sun.source.tree.ExportsTree,{com.sun.source.util.TreeScanner%1})
 meth public {com.sun.source.util.TreeScanner%0} visitExpressionStatement(com.sun.source.tree.ExpressionStatementTree,{com.sun.source.util.TreeScanner%1})
 meth public {com.sun.source.util.TreeScanner%0} visitForLoop(com.sun.source.tree.ForLoopTree,{com.sun.source.util.TreeScanner%1})
-meth public {com.sun.source.util.TreeScanner%0} visitGuardedPattern(com.sun.source.tree.GuardedPatternTree,{com.sun.source.util.TreeScanner%1})
 meth public {com.sun.source.util.TreeScanner%0} visitIdentifier(com.sun.source.tree.IdentifierTree,{com.sun.source.util.TreeScanner%1})
 meth public {com.sun.source.util.TreeScanner%0} visitIf(com.sun.source.tree.IfTree,{com.sun.source.util.TreeScanner%1})
 meth public {com.sun.source.util.TreeScanner%0} visitImport(com.sun.source.tree.ImportTree,{com.sun.source.util.TreeScanner%1})
diff --git a/java/refactoring.java/nbproject/project.properties b/java/refactoring.java/nbproject/project.properties
index bc377cf..e21b31a 100644
--- a/java/refactoring.java/nbproject/project.properties
+++ b/java/refactoring.java/nbproject/project.properties
@@ -18,7 +18,7 @@
 javadoc.arch=${basedir}/arch.xml
 javadoc.apichanges=${basedir}/apichanges.xml
 
-spec.version.base=1.79.0
+spec.version.base=1.80.0
 #test configs
 test.config.find.includes=\
     **/FindUsagesSuite.class
diff --git a/java/refactoring.java/test/unit/src/org/netbeans/modules/refactoring/java/test/Utilities.java b/java/refactoring.java/test/unit/src/org/netbeans/modules/refactoring/java/test/Utilities.java
index 2d43f2d..272d576 100644
--- a/java/refactoring.java/test/unit/src/org/netbeans/modules/refactoring/java/test/Utilities.java
+++ b/java/refactoring.java/test/unit/src/org/netbeans/modules/refactoring/java/test/Utilities.java
@@ -34,7 +34,7 @@
 import javax.xml.transform.TransformerFactory;
 import javax.xml.transform.dom.DOMSource;
 import javax.xml.transform.stream.StreamResult;
-import junit.framework.Assert;
+import org.junit.Assert;
 
 import org.openide.filesystems.*;
 import org.openide.util.*;
diff --git a/java/refactoring.java/test/unit/src/org/netbeans/modules/refactoring/java/ui/IntroduceParameterActionTest.java b/java/refactoring.java/test/unit/src/org/netbeans/modules/refactoring/java/ui/IntroduceParameterActionTest.java
index b7d4418..8f15229 100644
--- a/java/refactoring.java/test/unit/src/org/netbeans/modules/refactoring/java/ui/IntroduceParameterActionTest.java
+++ b/java/refactoring.java/test/unit/src/org/netbeans/modules/refactoring/java/ui/IntroduceParameterActionTest.java
@@ -20,8 +20,6 @@
 
 import com.sun.source.tree.Tree;
 import java.util.concurrent.atomic.AtomicInteger;
-import static junit.framework.Assert.assertEquals;
-import static junit.framework.Assert.assertTrue;
 import org.netbeans.api.java.source.TreePathHandle;
 import org.netbeans.modules.refactoring.java.test.RefactoringTestBase;
 import org.netbeans.modules.refactoring.spi.ui.RefactoringUI;
diff --git a/java/spi.java.hints/src/org/netbeans/modules/java/hints/spiimpl/Utilities.java b/java/spi.java.hints/src/org/netbeans/modules/java/hints/spiimpl/Utilities.java
index dab12e1..431f68a 100644
--- a/java/spi.java.hints/src/org/netbeans/modules/java/hints/spiimpl/Utilities.java
+++ b/java/spi.java.hints/src/org/netbeans/modules/java/hints/spiimpl/Utilities.java
@@ -74,6 +74,7 @@
 import com.sun.tools.javac.tree.JCTree.JCCase;
 import com.sun.tools.javac.tree.JCTree.JCCatch;
 import com.sun.tools.javac.tree.JCTree.JCCompilationUnit;
+import com.sun.tools.javac.tree.JCTree.JCConstantCaseLabel;
 import com.sun.tools.javac.tree.JCTree.JCExpression;
 import com.sun.tools.javac.tree.JCTree.JCFieldAccess;
 import com.sun.tools.javac.tree.JCTree.JCIdent;
@@ -1082,7 +1083,7 @@
             final JavaPlatformManager man = JavaPlatformManager.getDefault();
             if (select.getSpecification().getVersion() != null) {
                 for (JavaPlatform p : JavaPlatformManager.getDefault().getInstalledPlatforms()) {
-                    if (!"j2se".equals(p.getSpecification().getName()) || p.getSpecification().getVersion() == null) continue;
+                    if (!p.isValid() || !"j2se".equals(p.getSpecification().getName()) || p.getSpecification().getVersion() == null) continue;
                     if (p.getSpecification().getVersion().compareTo(select.getSpecification().getVersion()) > 0) {
                         select = p;
                     }
@@ -1444,9 +1445,9 @@
                         }
 
                         JCIdent identTree = F.at(pos).Ident(name);
-
+                        JCConstantCaseLabel labelTree = F.at(pos).ConstantCaseLabel(identTree);
                         return com.sun.tools.javac.util.List.of(
-                                new JackpotTrees.CaseWildcard(name, identTree, STATEMENT, com.sun.tools.javac.util.List.of(identTree), com.sun.tools.javac.util.List.nil(), null)
+                                new JackpotTrees.CaseWildcard(name, identTree, STATEMENT, com.sun.tools.javac.util.List.of(labelTree), com.sun.tools.javac.util.List.nil(), null)
                         );
                     }
                 }
diff --git a/javafx/javafx2.editor/test/unit/src/org/netbeans/modules/javafx2/editor/FXMLCompletionTestBase.java b/javafx/javafx2.editor/test/unit/src/org/netbeans/modules/javafx2/editor/FXMLCompletionTestBase.java
index 2ab69aa..da11e98 100644
--- a/javafx/javafx2.editor/test/unit/src/org/netbeans/modules/javafx2/editor/FXMLCompletionTestBase.java
+++ b/javafx/javafx2.editor/test/unit/src/org/netbeans/modules/javafx2/editor/FXMLCompletionTestBase.java
@@ -28,7 +28,6 @@
 import java.util.regex.Pattern;
 import javax.swing.JEditorPane;
 import javax.swing.text.Document;
-import junit.framework.Assert;
 import org.netbeans.ModuleManager;
 import org.netbeans.api.editor.mimelookup.MimePath;
 import org.netbeans.api.java.classpath.ClassPath;
@@ -83,7 +82,7 @@
     static {
         FXMLCompletionTestBase.class.getClassLoader().setDefaultAssertionStatus(true);
         System.setProperty("org.openide.util.Lookup", Lkp.class.getName());
-        Assert.assertEquals(Lkp.class, Lookup.getDefault().getClass());
+        assertEquals(Lkp.class, Lookup.getDefault().getClass());
 
         SourceUtilsTestUtil2.disableArtificalParameterNames();
     }
@@ -100,7 +99,7 @@
         
         @SuppressWarnings("LeakingThisInConstructor")
         public Lkp() {
-            Assert.assertNull(DEFAULT);
+            assertNull(DEFAULT);
             DEFAULT = this;
         }
         
diff --git a/javafx/javafx2.project/test/unit/src/org/netbeans/modules/javafx2/project/JFXConfigsTest.java b/javafx/javafx2.project/test/unit/src/org/netbeans/modules/javafx2/project/JFXConfigsTest.java
index 9e39d9a..690741e 100644
--- a/javafx/javafx2.project/test/unit/src/org/netbeans/modules/javafx2/project/JFXConfigsTest.java
+++ b/javafx/javafx2.project/test/unit/src/org/netbeans/modules/javafx2/project/JFXConfigsTest.java
@@ -22,8 +22,6 @@
 import java.io.IOException;
 import java.util.Arrays;
 import java.util.Set;
-import static junit.framework.Assert.assertEquals;
-import static junit.framework.Assert.assertTrue;
 import junit.framework.Test;
 import junit.framework.TestSuite;
 import org.netbeans.api.project.Project;
diff --git a/nb/welcome/test/unit/src/org/netbeans/modules/welcome/MemoryURL.java b/nb/welcome/test/unit/src/org/netbeans/modules/welcome/MemoryURL.java
index b961541..518a98a 100644
--- a/nb/welcome/test/unit/src/org/netbeans/modules/welcome/MemoryURL.java
+++ b/nb/welcome/test/unit/src/org/netbeans/modules/welcome/MemoryURL.java
@@ -30,7 +30,7 @@
 import java.net.URLStreamHandlerFactory;
 import java.util.HashMap;
 import java.util.Map;
-import junit.framework.Assert;
+import org.junit.Assert;
 
 /**
  *
diff --git a/nbbuild/antsrc/org/netbeans/nbbuild/extlibs/ignored-overlaps b/nbbuild/antsrc/org/netbeans/nbbuild/extlibs/ignored-overlaps
index 9553042..07ff8af 100644
--- a/nbbuild/antsrc/org/netbeans/nbbuild/extlibs/ignored-overlaps
+++ b/nbbuild/antsrc/org/netbeans/nbbuild/extlibs/ignored-overlaps
@@ -118,8 +118,8 @@
 harness/apisupport.harness/external/launcher-12.5-distribution.zip platform/o.n.bootstrap/external/launcher-12.5-distribution.zip
 
 # only one is part of the product:
-java/libs.javacapi/external/nb-javac-jdk-18.0.1+10-api.jar java/libs.nbjavacapi/external/nb-javac-jdk-18.0.1+10-api.jar
-java/libs.javacapi/external/nb-javac-jdk-18.0.1+10.jar java/libs.nbjavacapi/external/nb-javac-jdk-18.0.1+10.jar
+java/libs.javacapi/external/nb-javac-jdk-19+33-api.jar java/libs.nbjavacapi/external/nb-javac-jdk-19+33-api.jar
+java/libs.javacapi/external/nb-javac-jdk-19+33.jar java/libs.nbjavacapi/external/nb-javac-jdk-19+33.jar
 
 # Maven and Gradle are self-contained distributions - ignoring overlaps
 platform/o.apache.commons.lang3/external/commons-lang3-3.8.1.jar java/maven.embedder/external/apache-maven-3.8.6-bin.zip
diff --git a/nbbuild/cluster.properties b/nbbuild/cluster.properties
index db00d72..c5164b6 100644
--- a/nbbuild/cluster.properties
+++ b/nbbuild/cluster.properties
@@ -699,6 +699,7 @@
         junit.ui,\
         ko4j.debugging,\
         kotlin.editor,\
+        languages.antlr,\
         lib.jshell.agent,\
         lib.nbjavac,\
         lib.nbjshell,\
diff --git a/nbbuild/licenses/BSD-antlr-icons b/nbbuild/licenses/BSD-antlr-icons
new file mode 100644
index 0000000..4b754bb
--- /dev/null
+++ b/nbbuild/licenses/BSD-antlr-icons
@@ -0,0 +1,31 @@
+Use of Antlr Icon(s) are originated from ANTLR Intelli-J Plugin from:
+https://github.com/antlr/intellij-plugin-v4 repository which at the time of
+writing is governed by the terms of the license below:
+
+Copyright (c) 2013, Terence Parr
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without modification,
+are permitted provided that the following conditions are met:
+
+  Redistributions of source code must retain the above copyright notice, this
+  list of conditions and the following disclaimer.
+
+  Redistributions in binary form must reproduce the above copyright notice, this
+  list of conditions and the following disclaimer in the documentation and/or
+  other materials provided with the distribution.
+
+  Neither the name of the {organization} nor the names of its
+  contributors may be used to endorse or promote products derived from
+  this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
+ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 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 OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/nbbuild/licenses/BSD-antlr4-grammar b/nbbuild/licenses/BSD-antlr4-grammar
new file mode 100644
index 0000000..9a91665
--- /dev/null
+++ b/nbbuild/licenses/BSD-antlr4-grammar
@@ -0,0 +1,30 @@
+Use of Antlr Grammar is governed by the terms of the license below:
+
+[The "BSD license"]
+Copyright (c) 2012-2014 Terence Parr
+Copyright (c) 2012-2014 Sam Harwell
+Copyright (c) 2015 Gerald Rosenberg
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions
+are met:
+
+ 1. Redistributions of source code must retain the above copyright
+    notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+    notice, this list of conditions and the following disclaimer in the
+    documentation and/or other materials provided with the distribution.
+ 3. The name of the author may not be used to endorse or promote products
+    derived from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 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 OF
+THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/php/php.atoum/test/unit/src/org/netbeans/modules/php/atoum/coverage/CloverLogParserTest.java b/php/php.atoum/test/unit/src/org/netbeans/modules/php/atoum/coverage/CloverLogParserTest.java
index db4b255..b2a9c6a 100644
--- a/php/php.atoum/test/unit/src/org/netbeans/modules/php/atoum/coverage/CloverLogParserTest.java
+++ b/php/php.atoum/test/unit/src/org/netbeans/modules/php/atoum/coverage/CloverLogParserTest.java
@@ -28,14 +28,10 @@
 import java.nio.file.Files;
 import java.nio.file.Path;
 import java.util.List;
-import java.util.regex.Matcher;
 import org.netbeans.junit.NbTestCase;
 import org.netbeans.modules.php.spi.testing.coverage.Coverage;
 import org.netbeans.modules.php.spi.testing.coverage.FileMetrics;
 
-import static junit.framework.Assert.assertEquals;
-import static junit.framework.Assert.assertNotNull;
-import static junit.framework.Assert.assertTrue;
 
 public class CloverLogParserTest extends NbTestCase {
 
diff --git a/php/php.code.analysis/test/unit/src/org/netbeans/modules/php/analysis/parsers/MessDetectorReportParserTest.java b/php/php.code.analysis/test/unit/src/org/netbeans/modules/php/analysis/parsers/MessDetectorReportParserTest.java
index cba0345..f22f069 100644
--- a/php/php.code.analysis/test/unit/src/org/netbeans/modules/php/analysis/parsers/MessDetectorReportParserTest.java
+++ b/php/php.code.analysis/test/unit/src/org/netbeans/modules/php/analysis/parsers/MessDetectorReportParserTest.java
@@ -20,7 +20,6 @@
 
 import java.io.File;
 import java.util.List;
-import static junit.framework.Assert.assertTrue;
 import org.netbeans.junit.NbTestCase;
 import org.netbeans.modules.php.analysis.results.Result;
 
diff --git a/php/php.composer/test/unit/src/org/netbeans/modules/php/composer/output/parsers/CliParserTest.java b/php/php.composer/test/unit/src/org/netbeans/modules/php/composer/output/parsers/CliParserTest.java
index 2790ec5..a144d9f 100644
--- a/php/php.composer/test/unit/src/org/netbeans/modules/php/composer/output/parsers/CliParserTest.java
+++ b/php/php.composer/test/unit/src/org/netbeans/modules/php/composer/output/parsers/CliParserTest.java
@@ -22,8 +22,6 @@
 import java.io.File;
 import java.io.FileReader;
 import java.util.List;
-import static junit.framework.Assert.assertEquals;
-import static junit.framework.Assert.assertNotNull;
 import org.netbeans.junit.NbTestCase;
 import org.netbeans.modules.php.composer.output.model.SearchResult;
 
diff --git a/php/php.latte/test/unit/src/org/netbeans/modules/php/latte/actions/ToggleBlockCommentActionTest.java b/php/php.latte/test/unit/src/org/netbeans/modules/php/latte/actions/ToggleBlockCommentActionTest.java
index acc2b5f..b0b9fc9 100644
--- a/php/php.latte/test/unit/src/org/netbeans/modules/php/latte/actions/ToggleBlockCommentActionTest.java
+++ b/php/php.latte/test/unit/src/org/netbeans/modules/php/latte/actions/ToggleBlockCommentActionTest.java
@@ -22,7 +22,6 @@
 import javax.swing.Action;
 import javax.swing.JEditorPane;
 import javax.swing.text.Caret;
-import static junit.framework.Assert.assertNotNull;
 import org.netbeans.editor.BaseDocument;
 import org.openide.filesystems.FileObject;
 
diff --git a/php/php.latte/test/unit/src/org/netbeans/modules/php/latte/indent/LatteIndenterTestBase.java b/php/php.latte/test/unit/src/org/netbeans/modules/php/latte/indent/LatteIndenterTestBase.java
index 4e4eaba..e851988 100644
--- a/php/php.latte/test/unit/src/org/netbeans/modules/php/latte/indent/LatteIndenterTestBase.java
+++ b/php/php.latte/test/unit/src/org/netbeans/modules/php/latte/indent/LatteIndenterTestBase.java
@@ -21,8 +21,6 @@
 import java.nio.charset.Charset;
 import java.nio.charset.StandardCharsets;
 import javax.swing.text.Document;
-import static junit.framework.Assert.assertNotNull;
-import static junit.framework.Assert.fail;
 import org.netbeans.api.editor.mimelookup.MimePath;
 import org.netbeans.api.editor.mimelookup.test.MockMimeLookup;
 import org.netbeans.api.html.lexer.HTMLTokenId;
diff --git a/php/php.project/test/unit/src/org/netbeans/modules/php/project/util/TestUtils.java b/php/php.project/test/unit/src/org/netbeans/modules/php/project/util/TestUtils.java
index 3ddc85c..5297847 100644
--- a/php/php.project/test/unit/src/org/netbeans/modules/php/project/util/TestUtils.java
+++ b/php/php.project/test/unit/src/org/netbeans/modules/php/project/util/TestUtils.java
@@ -26,7 +26,7 @@
 import java.util.concurrent.Callable;
 import java.util.logging.Level;
 import java.util.logging.Logger;
-import junit.framework.Assert;
+import org.junit.Assert;
 import org.netbeans.api.project.Project;
 import org.netbeans.api.project.ProjectManager;
 import org.netbeans.modules.php.api.PhpVersion;
diff --git a/php/php.twig/test/unit/src/org/netbeans/modules/php/twig/editor/embedding/TwigHtmlEmbeddingProviderTest.java b/php/php.twig/test/unit/src/org/netbeans/modules/php/twig/editor/embedding/TwigHtmlEmbeddingProviderTest.java
index 92f6093..2da4f74 100644
--- a/php/php.twig/test/unit/src/org/netbeans/modules/php/twig/editor/embedding/TwigHtmlEmbeddingProviderTest.java
+++ b/php/php.twig/test/unit/src/org/netbeans/modules/php/twig/editor/embedding/TwigHtmlEmbeddingProviderTest.java
@@ -19,7 +19,6 @@
 package org.netbeans.modules.php.twig.editor.embedding;
 
 import java.util.List;
-import static junit.framework.Assert.assertNotNull;
 import org.netbeans.modules.parsing.api.Embedding;
 import org.netbeans.modules.parsing.api.Source;
 import org.netbeans.modules.parsing.spi.EmbeddingProvider;
diff --git a/php/php.twig/test/unit/src/org/netbeans/modules/php/twig/editor/format/TwigIndenterTestBase.java b/php/php.twig/test/unit/src/org/netbeans/modules/php/twig/editor/format/TwigIndenterTestBase.java
index 9eee8c3..2c8f1f4 100644
--- a/php/php.twig/test/unit/src/org/netbeans/modules/php/twig/editor/format/TwigIndenterTestBase.java
+++ b/php/php.twig/test/unit/src/org/netbeans/modules/php/twig/editor/format/TwigIndenterTestBase.java
@@ -19,8 +19,6 @@
 package org.netbeans.modules.php.twig.editor.format;
 
 import javax.swing.text.Document;
-import static junit.framework.Assert.assertNotNull;
-import static junit.framework.Assert.fail;
 import org.netbeans.api.editor.mimelookup.MimePath;
 import org.netbeans.api.editor.mimelookup.test.MockMimeLookup;
 import org.netbeans.api.html.lexer.HTMLTokenId;
diff --git a/php/php.zend2/test/unit/src/org/netbeans/modules/php/zend2/util/Zend2UtilsTest.java b/php/php.zend2/test/unit/src/org/netbeans/modules/php/zend2/util/Zend2UtilsTest.java
index 534e8ab..a43de4f 100644
--- a/php/php.zend2/test/unit/src/org/netbeans/modules/php/zend2/util/Zend2UtilsTest.java
+++ b/php/php.zend2/test/unit/src/org/netbeans/modules/php/zend2/util/Zend2UtilsTest.java
@@ -19,9 +19,6 @@
 package org.netbeans.modules.php.zend2.util;
 
 import java.io.File;
-import static junit.framework.Assert.assertEquals;
-import static junit.framework.Assert.assertNotNull;
-import static junit.framework.Assert.assertTrue;
 import org.netbeans.junit.NbTestCase;
 import org.netbeans.modules.php.api.editor.PhpClass;
 import org.openide.filesystems.FileObject;
diff --git a/platform/autoupdate.services/test/unit/src/org/netbeans/api/autoupdate/IDEInitializer.java b/platform/autoupdate.services/test/unit/src/org/netbeans/api/autoupdate/IDEInitializer.java
index 91847cc..9b327e2 100644
--- a/platform/autoupdate.services/test/unit/src/org/netbeans/api/autoupdate/IDEInitializer.java
+++ b/platform/autoupdate.services/test/unit/src/org/netbeans/api/autoupdate/IDEInitializer.java
@@ -26,7 +26,7 @@
 import java.net.URLStreamHandler;
 import java.net.URLStreamHandlerFactory;
 import java.util.Enumeration;
-import junit.framework.Assert;
+import org.junit.Assert;
 import org.netbeans.junit.Manager;
 import org.openide.filesystems.FileObject;
 import org.openide.filesystems.FileStateInvalidException;
diff --git a/platform/autoupdate.ui/test/unit/src/org/netbeans/modules/autoupdate/ui/MockUpdateProvider.java b/platform/autoupdate.ui/test/unit/src/org/netbeans/modules/autoupdate/ui/MockUpdateProvider.java
index a2b2a55..1695dbd 100644
--- a/platform/autoupdate.ui/test/unit/src/org/netbeans/modules/autoupdate/ui/MockUpdateProvider.java
+++ b/platform/autoupdate.ui/test/unit/src/org/netbeans/modules/autoupdate/ui/MockUpdateProvider.java
@@ -21,7 +21,7 @@
 
 import java.io.IOException;
 import java.util.Map;
-import junit.framework.Assert;
+import org.junit.Assert;
 import org.netbeans.api.autoupdate.UpdateUnitProvider.CATEGORY;
 import org.netbeans.spi.autoupdate.UpdateItem;
 import org.netbeans.spi.autoupdate.UpdateProvider;
diff --git a/platform/core.netigso/test/unit/src/org/netbeans/core/netigso/NetigsoDuplicatedClassForNameTest.java b/platform/core.netigso/test/unit/src/org/netbeans/core/netigso/NetigsoDuplicatedClassForNameTest.java
index f787e46..4662b28 100644
--- a/platform/core.netigso/test/unit/src/org/netbeans/core/netigso/NetigsoDuplicatedClassForNameTest.java
+++ b/platform/core.netigso/test/unit/src/org/netbeans/core/netigso/NetigsoDuplicatedClassForNameTest.java
@@ -24,7 +24,6 @@
 import java.util.Arrays;
 import java.util.HashSet;
 import java.util.Locale;
-import static junit.framework.Assert.assertEquals;
 import org.netbeans.MockEvents;
 import org.netbeans.MockModuleInstaller;
 import org.netbeans.Module;
diff --git a/platform/core.netigso/test/unit/src/org/netbeans/core/netigso/NetigsoUtil.java b/platform/core.netigso/test/unit/src/org/netbeans/core/netigso/NetigsoUtil.java
index e9eaca5..1eb4d08 100644
--- a/platform/core.netigso/test/unit/src/org/netbeans/core/netigso/NetigsoUtil.java
+++ b/platform/core.netigso/test/unit/src/org/netbeans/core/netigso/NetigsoUtil.java
@@ -19,8 +19,7 @@
 package org.netbeans.core.netigso;
 
 import java.lang.reflect.Method;
-import java.util.regex.Pattern;
-import junit.framework.Assert;
+import org.junit.Assert;
 import org.netbeans.Module;
 import org.netbeans.ModuleManager;
 import org.osgi.framework.Bundle;
diff --git a/platform/core.osgi/test/unit/src/org/netbeans/core/osgi/OSGiProcess.java b/platform/core.osgi/test/unit/src/org/netbeans/core/osgi/OSGiProcess.java
index 4c29efd..289208d 100644
--- a/platform/core.osgi/test/unit/src/org/netbeans/core/osgi/OSGiProcess.java
+++ b/platform/core.osgi/test/unit/src/org/netbeans/core/osgi/OSGiProcess.java
@@ -33,7 +33,6 @@
 import java.util.ServiceLoader;
 import java.util.Set;
 import java.util.jar.JarFile;
-import static junit.framework.Assert.*;
 import org.apache.tools.ant.Project;
 import org.apache.tools.ant.types.FileSet;
 import org.apache.tools.ant.types.resources.FileResource;
@@ -48,6 +47,8 @@
 import org.osgi.framework.launch.Framework;
 import org.osgi.framework.launch.FrameworkFactory;
 
+import static org.junit.Assert.assertTrue;
+
 class OSGiProcess {
 
     private static final File platformDir = new File(System.getProperty("platform.dir"));
diff --git a/platform/core.startup/test/unit/src/org/netbeans/core/startup/CountingSecurityManager.java b/platform/core.startup/test/unit/src/org/netbeans/core/startup/CountingSecurityManager.java
index aef32d3..fd6ac88 100644
--- a/platform/core.startup/test/unit/src/org/netbeans/core/startup/CountingSecurityManager.java
+++ b/platform/core.startup/test/unit/src/org/netbeans/core/startup/CountingSecurityManager.java
@@ -23,7 +23,7 @@
 import java.io.PrintWriter;
 import java.io.StringWriter;
 import java.security.Permission;
-import junit.framework.Assert;
+import org.junit.Assert;
 
 /**
  *
diff --git a/platform/core.startup/test/unit/src/org/netbeans/core/startup/IsDirCntSecurityManager.java b/platform/core.startup/test/unit/src/org/netbeans/core/startup/IsDirCntSecurityManager.java
index 31efa72..12a02eb 100644
--- a/platform/core.startup/test/unit/src/org/netbeans/core/startup/IsDirCntSecurityManager.java
+++ b/platform/core.startup/test/unit/src/org/netbeans/core/startup/IsDirCntSecurityManager.java
@@ -19,7 +19,7 @@
 package org.netbeans.core.startup;
 
 import java.security.Permission;
-import junit.framework.Assert;
+import org.junit.Assert;
 
 /**
  * Counts the number of File.isDirectory() calls.
diff --git a/platform/core.startup/test/unit/src/org/netbeans/core/startup/UpdateAllResourcesTest.java b/platform/core.startup/test/unit/src/org/netbeans/core/startup/UpdateAllResourcesTest.java
index aea47db..a38a3ab 100644
--- a/platform/core.startup/test/unit/src/org/netbeans/core/startup/UpdateAllResourcesTest.java
+++ b/platform/core.startup/test/unit/src/org/netbeans/core/startup/UpdateAllResourcesTest.java
@@ -21,7 +21,6 @@
 import java.lang.reflect.Constructor;
 import java.lang.reflect.Field;
 import java.lang.reflect.Method;
-import static junit.framework.Assert.assertTrue;
 import org.netbeans.JarClassLoader;
 import org.netbeans.Stamps;
 import org.netbeans.junit.NbTestCase;
diff --git a/platform/core.startup/test/unit/src/org/netbeans/core/startup/layers/CountingSecurityManager.java b/platform/core.startup/test/unit/src/org/netbeans/core/startup/layers/CountingSecurityManager.java
index 007e982..67de8f6 100644
--- a/platform/core.startup/test/unit/src/org/netbeans/core/startup/layers/CountingSecurityManager.java
+++ b/platform/core.startup/test/unit/src/org/netbeans/core/startup/layers/CountingSecurityManager.java
@@ -37,7 +37,7 @@
 import java.util.concurrent.Callable;
 import java.util.logging.Level;
 import java.util.logging.Logger;
-import junit.framework.Assert;
+import org.junit.Assert;
 import org.netbeans.core.startup.InstalledFileLocatorImpl;
 import org.openide.modules.Places;
 import org.openide.util.Exceptions;
diff --git a/platform/core.windows/test/unit/src/org/netbeans/core/windows/IDEInitializer.java b/platform/core.windows/test/unit/src/org/netbeans/core/windows/IDEInitializer.java
index e5a0871..dfb49bb 100644
--- a/platform/core.windows/test/unit/src/org/netbeans/core/windows/IDEInitializer.java
+++ b/platform/core.windows/test/unit/src/org/netbeans/core/windows/IDEInitializer.java
@@ -19,25 +19,9 @@
 
 package org.netbeans.core.windows;
 
-import java.beans.PropertyVetoException;
-import java.io.File;
-import java.io.IOException;
 import java.net.URL;
-import java.net.URLStreamHandler;
-import java.net.URLStreamHandlerFactory;
-import java.util.Enumeration;
-import junit.framework.Assert;
 import org.netbeans.core.startup.MainLookup;
-import org.netbeans.junit.Manager;
-import org.openide.filesystems.FileObject;
-import org.openide.filesystems.FileSystem;
-import org.openide.filesystems.FileUtil;
-import org.openide.filesystems.MultiFileSystem;
-import org.openide.filesystems.Repository;
 import org.openide.filesystems.XMLFileSystem;
-import org.openide.util.Lookup;
-import org.openide.util.lookup.Lookups;
-import org.openide.util.lookup.ProxyLookup;
 
 
 /**
diff --git a/platform/editor.mimelookup.impl/test/unit/src/org/netbeans/modules/editor/mimelookup/impl/EditorTestLookup.java b/platform/editor.mimelookup.impl/test/unit/src/org/netbeans/modules/editor/mimelookup/impl/EditorTestLookup.java
index 66c1733..7b19c15 100644
--- a/platform/editor.mimelookup.impl/test/unit/src/org/netbeans/modules/editor/mimelookup/impl/EditorTestLookup.java
+++ b/platform/editor.mimelookup.impl/test/unit/src/org/netbeans/modules/editor/mimelookup/impl/EditorTestLookup.java
@@ -25,7 +25,7 @@
 import java.io.IOException;
 import java.net.URL;
 import java.util.Set;
-import junit.framework.Assert;
+import org.junit.Assert;
 import org.openide.filesystems.FileObject;
 import org.openide.filesystems.FileSystem;
 import org.openide.filesystems.LocalFileSystem;
diff --git a/platform/editor.mimelookup/test/unit/src/org/netbeans/modules/editor/mimelookup/EditorTestLookup.java b/platform/editor.mimelookup/test/unit/src/org/netbeans/modules/editor/mimelookup/EditorTestLookup.java
index 6c70c0c..c8283cd 100644
--- a/platform/editor.mimelookup/test/unit/src/org/netbeans/modules/editor/mimelookup/EditorTestLookup.java
+++ b/platform/editor.mimelookup/test/unit/src/org/netbeans/modules/editor/mimelookup/EditorTestLookup.java
@@ -25,7 +25,7 @@
 import java.io.IOException;
 import java.net.URL;
 import java.util.Set;
-import junit.framework.Assert;
+import org.junit.Assert;
 import org.openide.filesystems.FileObject;
 import org.openide.filesystems.FileSystem;
 import org.openide.filesystems.LocalFileSystem;
diff --git a/platform/masterfs/test/unit/src/org/netbeans/modules/masterfs/filebasedfs/RecursiveValidityTest.java b/platform/masterfs/test/unit/src/org/netbeans/modules/masterfs/filebasedfs/RecursiveValidityTest.java
index 6363956..e8f70bc 100644
--- a/platform/masterfs/test/unit/src/org/netbeans/modules/masterfs/filebasedfs/RecursiveValidityTest.java
+++ b/platform/masterfs/test/unit/src/org/netbeans/modules/masterfs/filebasedfs/RecursiveValidityTest.java
@@ -18,15 +18,10 @@
  */
 package org.netbeans.modules.masterfs.filebasedfs;
 
-import java.awt.Image;
 import java.io.File;
 import java.io.IOException;
 import java.util.List;
 import java.util.Set;
-import java.util.logging.Level;
-import javax.swing.Action;
-import static junit.framework.Assert.assertFalse;
-import static junit.framework.Assert.assertTrue;
 import org.netbeans.junit.MockServices;
 import org.netbeans.junit.NbTestCase;
 import org.netbeans.modules.masterfs.providers.BaseAnnotationProvider;
diff --git a/platform/masterfs/test/unit/src/org/netbeans/modules/masterfs/filebasedfs/fileobjects/TestUtils.java b/platform/masterfs/test/unit/src/org/netbeans/modules/masterfs/filebasedfs/fileobjects/TestUtils.java
index b1ea691..720c93f 100644
--- a/platform/masterfs/test/unit/src/org/netbeans/modules/masterfs/filebasedfs/fileobjects/TestUtils.java
+++ b/platform/masterfs/test/unit/src/org/netbeans/modules/masterfs/filebasedfs/fileobjects/TestUtils.java
@@ -25,8 +25,8 @@
 import java.util.List;
 import java.util.logging.Level;
 import java.util.logging.Logger;
-import junit.framework.Assert;
 import junit.framework.AssertionFailedError;
+import org.junit.Assert;
 import org.netbeans.junit.NbTestCase;
 import org.netbeans.modules.masterfs.watcher.Watcher;
 import org.openide.filesystems.FileObject;
diff --git a/platform/masterfs/test/unit/src/org/netbeans/modules/masterfs/filebasedfs/utils/FileChangedManagerDeadlockTest.java b/platform/masterfs/test/unit/src/org/netbeans/modules/masterfs/filebasedfs/utils/FileChangedManagerDeadlockTest.java
index 3a0dc67..21a62d1 100644
--- a/platform/masterfs/test/unit/src/org/netbeans/modules/masterfs/filebasedfs/utils/FileChangedManagerDeadlockTest.java
+++ b/platform/masterfs/test/unit/src/org/netbeans/modules/masterfs/filebasedfs/utils/FileChangedManagerDeadlockTest.java
@@ -23,7 +23,6 @@
 import java.util.concurrent.Callable;
 import java.util.concurrent.Semaphore;
 import java.util.concurrent.atomic.AtomicBoolean;
-import static junit.framework.Assert.assertTrue;
 import org.junit.Before;
 import org.junit.Test;
 import org.netbeans.junit.MockServices;
@@ -33,6 +32,8 @@
 import org.openide.util.Exceptions;
 import org.openide.util.Lookup;
 
+import static org.junit.Assert.assertTrue;
+
 /**
  *
  * @author jhavlin
diff --git a/platform/netbinox/nbproject/project.properties b/platform/netbinox/nbproject/project.properties
index dfa06c9..dc24e53 100644
--- a/platform/netbinox/nbproject/project.properties
+++ b/platform/netbinox/nbproject/project.properties
@@ -17,7 +17,7 @@
 
 is.autoload=true
 release.external/org.eclipse.osgi_3.9.1.nb9.jar=modules/ext/org.eclipse.osgi_3.9.1.nb9.jar
-javac.source=1.6
+javac.source=1.8
 javac.target=1.8
 javac.compilerargs=-Xlint -Xlint:-serial
 
diff --git a/platform/netbinox/nbproject/project.xml b/platform/netbinox/nbproject/project.xml
index e123c78..da9a30a 100644
--- a/platform/netbinox/nbproject/project.xml
+++ b/platform/netbinox/nbproject/project.xml
@@ -92,6 +92,11 @@
                         <recursive/>
                         <compile-dependency/>
                     </test-dependency>
+                    <test-dependency>
+                        <code-name-base>org.openide.util.ui</code-name-base>
+                        <compile-dependency/>
+                        <test/>
+                    </test-dependency>
                 </test-type>
             </test-dependencies>
             <public-packages>
diff --git a/platform/netbinox/src/org/netbeans/modules/netbinox/JarBundleFile.java b/platform/netbinox/src/org/netbeans/modules/netbinox/JarBundleFile.java
index eb916cc..077ccf2 100644
--- a/platform/netbinox/src/org/netbeans/modules/netbinox/JarBundleFile.java
+++ b/platform/netbinox/src/org/netbeans/modules/netbinox/JarBundleFile.java
@@ -30,17 +30,21 @@
 import java.util.Enumeration;
 import java.util.HashMap;
 import java.util.Map;
+import java.util.Set;
+import java.util.TreeSet;
+import java.util.jar.Attributes.Name;
+import java.util.jar.Manifest;
 import java.util.logging.Level;
 import org.eclipse.osgi.baseadaptor.BaseData;
 import org.eclipse.osgi.baseadaptor.bundlefile.BundleEntry;
 import org.eclipse.osgi.baseadaptor.bundlefile.BundleFile;
 import org.eclipse.osgi.baseadaptor.bundlefile.DirBundleFile;
-import org.eclipse.osgi.baseadaptor.bundlefile.DirZipBundleEntry;
 import org.eclipse.osgi.baseadaptor.bundlefile.MRUBundleFileList;
 import org.eclipse.osgi.baseadaptor.bundlefile.ZipBundleFile;
 import org.netbeans.core.netigso.spi.BundleContent;
 import org.netbeans.core.netigso.spi.NetigsoArchive;
 import org.openide.modules.ModuleInfo;
+import org.openide.util.Exceptions;
 import org.openide.util.Lookup;
 
 /** This is fake bundle. It is created by the Netbinox infrastructure to 
@@ -49,14 +53,36 @@
  * @author Jaroslav Tulach <jtulach@netbeans.org>
  */
 final class JarBundleFile extends BundleFile implements BundleContent {
-    private BundleFile delegate;
-
+    //
+    // When making changes to this file, check if
+    // platform/o.n.bootstrap/src/org/netbeans/JarClassLoader.java (JarClassLoader/JarSource)
+    // should also be adjusted. At least the multi-release handling is similar.
+    //
+    private static final String META_INF = "META-INF/";
+    private static final Name MULTI_RELEASE = new Name("Multi-Release");
+    private static final int BASE_VERSION = 8;
+    private static final int RUNTIME_VERSION;
     private static Map<Long,File> usedIds;
 
+    static {
+        int version;
+        try {
+            Object runtimeVersion = Runtime.class.getMethod("version").invoke(null);
+            version = (int) runtimeVersion.getClass().getMethod("major").invoke(runtimeVersion);
+        } catch (ReflectiveOperationException ex) {
+            version = BASE_VERSION;
+        }
+        RUNTIME_VERSION = version;
+    }
+
+    private BundleFile delegate;
+
     private final MRUBundleFileList mru;
     private final BaseData data;
     private final NetigsoArchive archive;
-    
+    private int[] versions;
+    private Boolean isMultiRelease;
+
     JarBundleFile(
         File base, BaseData data, NetigsoArchive archive,
         MRUBundleFileList mru, boolean isBase
@@ -171,6 +197,18 @@
 
     @Override
     public File getFile(String file, boolean bln) {
+        if (((! file.startsWith(META_INF)) ) && isMultiRelease()) {
+            for (int version : getVersions()) {
+                File f = getFile0("META-INF/versions/" + version + "/" + file, bln);
+                if (f != null) {
+                    return f;
+                }
+            }
+        }
+        return getFile0(file, bln);
+    }
+
+    private File getFile0(String file, boolean bln) {
         byte[] exists = getCachedEntry(file);
         if (exists == null) {
             return null;
@@ -181,6 +219,18 @@
 
     @Override
     public byte[] resource(String name) throws IOException {
+        if ((! name.startsWith(META_INF)) && isMultiRelease()) {
+            for (int version : getVersions()) {
+                byte[] b = resource0("META-INF/versions/" + version + "/" + name);
+                if (b != null) {
+                    return b;
+                }
+            }
+        }
+        return resource0(name);
+    }
+
+    private byte[] resource0(String name) throws IOException {
         BundleEntry u = findEntry("resource", name);
         if (u == null) {
             return null;
@@ -262,6 +312,18 @@
 
     @Override
     public BundleEntry getEntry(final String name) {
+        if ((! name.startsWith(META_INF)) && isMultiRelease()) {
+            for (int version : getVersions()) {
+                BundleEntry be = getEntry0("META-INF/versions/" + version + "/" + name);
+                if(be != null) {
+                    return be;
+                }
+            }
+        }
+        return getEntry0(name);
+    }
+
+    private BundleEntry getEntry0(final String name) {
         if (!archive.isActive()) {
             return delegate("inactive", name).getEntry(name); // NOI18N
         }
@@ -351,4 +413,50 @@
             return findEntry("getFileURL", name).getFileURL(); // NOI18N
         }
     }
+
+    /**
+     * @return versions for which a {@code META-INF/versions/NUMBER} entry exists.
+     * The order is from largest version to lowest. Only versions supported by
+     * the runtime VM are reported.
+     */
+    private int[] getVersions() {
+        if (versions != null) {
+            return versions;
+        }
+
+        Set<Integer> vers = new TreeSet<>(Collections.reverseOrder());
+        for(int i = BASE_VERSION; i <= RUNTIME_VERSION; i++) {
+            String directory = "META-INF/versions/" + i;
+            BundleEntry be = delegate("getVersions", directory).getEntry(directory);
+            if (be != null) {
+                vers.add(i);
+            }
+        }
+        int[] ret = new int[vers.size()];
+        int i = 0;
+        for (Integer ver : vers) {
+            ret[i++] = ver;
+        }
+        versions = ret;
+        return versions;
+    }
+
+    private boolean isMultiRelease() {
+        if(isMultiRelease != null) {
+            return isMultiRelease;
+        }
+        BundleEntry be = delegate("isMultiRelease", "META-INF/MANIFEST.MF").getEntry("META-INF/MANIFEST.MF");
+        if(be == null) {
+            isMultiRelease = false;
+        } else {
+            try {
+                Manifest manifest = new Manifest(be.getInputStream());
+                isMultiRelease = Boolean.valueOf(manifest.getMainAttributes().getValue(MULTI_RELEASE));
+            } catch (IOException ex) {
+                Exceptions.printStackTrace(ex);
+            }
+
+        }
+        return isMultiRelease;
+    }
 }
diff --git a/platform/netbinox/src/org/netbeans/modules/netbinox/NetbinoxLoader.java b/platform/netbinox/src/org/netbeans/modules/netbinox/NetbinoxLoader.java
index bfeefde..34c0fae 100644
--- a/platform/netbinox/src/org/netbeans/modules/netbinox/NetbinoxLoader.java
+++ b/platform/netbinox/src/org/netbeans/modules/netbinox/NetbinoxLoader.java
@@ -20,8 +20,6 @@
 
 import java.io.File;
 import java.io.IOException;
-import java.lang.reflect.InvocationTargetException;
-import java.lang.reflect.Method;
 import java.net.URI;
 import java.net.URISyntaxException;
 import java.security.ProtectionDomain;
@@ -34,7 +32,6 @@
 import org.eclipse.osgi.baseadaptor.loader.ClasspathManager;
 import org.eclipse.osgi.framework.adaptor.ClassLoaderDelegate;
 import org.eclipse.osgi.internal.baseadaptor.DefaultClassLoader;
-import org.openide.util.Exceptions;
 import org.osgi.framework.FrameworkEvent;
 
 /** Classloader that eliminates some unnecessary disk touches.
diff --git a/platform/netbinox/test/unit/src/org/netbeans/modules/netbinox/CountingSecurityManager.java b/platform/netbinox/test/unit/src/org/netbeans/modules/netbinox/CountingSecurityManager.java
index b73f929..ca5d0d7 100644
--- a/platform/netbinox/test/unit/src/org/netbeans/modules/netbinox/CountingSecurityManager.java
+++ b/platform/netbinox/test/unit/src/org/netbeans/modules/netbinox/CountingSecurityManager.java
@@ -35,7 +35,7 @@
 import java.util.concurrent.Callable;
 import java.util.logging.Level;
 import java.util.logging.Logger;
-import junit.framework.Assert;
+import org.junit.Assert;
 import org.openide.modules.Places;
 import org.openide.util.Utilities;
 
diff --git a/platform/netbinox/test/unit/src/org/netbeans/modules/netbinox/NetbinoxDuplicatedBuddyForNameTest.java b/platform/netbinox/test/unit/src/org/netbeans/modules/netbinox/NetbinoxDuplicatedBuddyForNameTest.java
index 81f5df8..37a1cb6 100644
--- a/platform/netbinox/test/unit/src/org/netbeans/modules/netbinox/NetbinoxDuplicatedBuddyForNameTest.java
+++ b/platform/netbinox/test/unit/src/org/netbeans/modules/netbinox/NetbinoxDuplicatedBuddyForNameTest.java
@@ -19,18 +19,13 @@
 package org.netbeans.modules.netbinox;
 
 import java.io.File;
-import java.io.IOException;
-import java.lang.reflect.Method;
 import java.util.Arrays;
 import java.util.HashSet;
 import java.util.Locale;
-import static junit.framework.Assert.assertEquals;
 import org.netbeans.MockEvents;
 import org.netbeans.MockModuleInstaller;
 import org.netbeans.Module;
 import org.netbeans.ModuleManager;
-import org.netbeans.SetupHid;
-import static org.netbeans.SetupHid.createTestJAR;
 
 /**
  *
diff --git a/platform/netbinox/test/unit/src/org/netbeans/modules/netbinox/NetbinoxDuplicatedClassForNameTest.java b/platform/netbinox/test/unit/src/org/netbeans/modules/netbinox/NetbinoxDuplicatedClassForNameTest.java
index 8dcbdae..25f7f0d 100644
--- a/platform/netbinox/test/unit/src/org/netbeans/modules/netbinox/NetbinoxDuplicatedClassForNameTest.java
+++ b/platform/netbinox/test/unit/src/org/netbeans/modules/netbinox/NetbinoxDuplicatedClassForNameTest.java
@@ -19,18 +19,13 @@
 package org.netbeans.modules.netbinox;
 
 import java.io.File;
-import java.io.IOException;
-import java.lang.reflect.Method;
 import java.util.Arrays;
 import java.util.HashSet;
 import java.util.Locale;
-import static junit.framework.Assert.assertEquals;
 import org.netbeans.MockEvents;
 import org.netbeans.MockModuleInstaller;
 import org.netbeans.Module;
 import org.netbeans.ModuleManager;
-import org.netbeans.SetupHid;
-import static org.netbeans.SetupHid.createTestJAR;
 
 /**
  *
diff --git a/platform/netbinox/test/unit/src/org/netbeans/modules/netbinox/NetbinoxMultiversionJarTest.java b/platform/netbinox/test/unit/src/org/netbeans/modules/netbinox/NetbinoxMultiversionJarTest.java
new file mode 100644
index 0000000..f186ea4
--- /dev/null
+++ b/platform/netbinox/test/unit/src/org/netbeans/modules/netbinox/NetbinoxMultiversionJarTest.java
@@ -0,0 +1,175 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.netbeans.modules.netbinox;
+
+import java.io.ByteArrayOutputStream;
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.lang.reflect.Method;
+import java.net.URI;
+import java.net.URISyntaxException;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.LinkedHashMap;
+import java.util.Locale;
+import java.util.Map;
+import java.util.Set;
+import javax.tools.JavaFileObject;
+import javax.tools.SimpleJavaFileObject;
+import javax.tools.ToolProvider;
+import org.netbeans.MockEvents;
+import org.netbeans.MockModuleInstaller;
+import org.netbeans.ModuleManager;
+import org.openide.util.test.TestFileUtils;
+
+import static java.nio.charset.StandardCharsets.UTF_8;
+import static junit.framework.TestCase.assertEquals;
+
+public class NetbinoxMultiversionJarTest extends NetigsoHid {
+
+    public NetbinoxMultiversionJarTest(String name) {
+        super(name);
+    }
+
+    @Override
+    protected void setUp() throws Exception {
+        Locale.setDefault(new Locale("te", "ST"));
+        clearWorkDir();
+        File ud = new File(getWorkDir(), "ud");
+        ud.mkdirs();
+        System.setProperty("netbeans.user", ud.getPath());
+
+        data = new File(getDataDir(), "jars");
+        jars = new File(getWorkDir(), "space in path");
+        jars.mkdirs();
+
+        File classes = new File(getWorkDir(), "classes");
+        classes.mkdirs();
+        ToolProvider.getSystemJavaCompiler()
+                .getTask(null, null, d -> {
+                    throw new IllegalStateException(d.toString());
+                }, Arrays.asList("-d", classes.getAbsolutePath()), null,
+                        Arrays.asList(new SourceFileObject("test/Impl.java", "package test; public class Impl { public static String get() { return \"base\"; } }"),
+                                new SourceFileObject("api/API.java", "package api; public class API { public static String run() { return test.Impl.get(); } }")))
+                .call();
+        File classes9 = new File(new File(new File(classes, "META-INF"), "versions"), "9");
+        classes9.mkdirs();
+        ToolProvider.getSystemJavaCompiler()
+                .getTask(null, null, d -> {
+                    throw new IllegalStateException(d.toString());
+                }, Arrays.asList("-d", classes9.getAbsolutePath(), "-classpath", classes.getAbsolutePath()), null,
+                        Arrays.asList(new SourceFileObject("test/Impl.java", "package test; public class Impl { public static String get() { return \"9\"; } }")))
+                .call();
+        Map<String, byte[]> jarContent = new LinkedHashMap<>();
+        String manifest
+                = "Manifest-Version: 1.0\n"
+                + "Bundle-SymbolicName: test.module\n"
+                + "Bundle-Version: 1.0\n"
+                + "Multi-Release: true\n"
+                + "";
+        jarContent.put("META-INF/MANIFEST.MF", manifest.getBytes(UTF_8));
+        Path classesPath = classes.toPath();
+        Files.walk(classesPath)
+                .filter(p -> Files.isRegularFile(p))
+                .forEach(p -> {
+                    try {
+                        jarContent.put(classesPath.relativize(p).toString(), TestFileUtils.readFileBin(p.toFile()));
+                    } catch (IOException ex) {
+                        throw new IllegalStateException(ex);
+                    }
+                });
+        jarContent.put("test/dummy.txt", "base".getBytes(UTF_8));
+        jarContent.put("META-INF/versions/9/test/dummy.txt", "9".getBytes(UTF_8));
+        simpleModule = new File(jars, "multi-release.jar");
+        try ( OutputStream out = new FileOutputStream(simpleModule)) {
+            TestFileUtils.writeZipFile(out, jarContent);
+        }
+    }
+
+    public void testMultiReleaseJar() throws Exception {
+        MockModuleInstaller installer = new MockModuleInstaller();
+        MockEvents ev = new MockEvents();
+        ModuleManager mgr = new ModuleManager(installer, ev);
+        mgr.mutexPrivileged().enterWriteAccess();
+        Set<org.netbeans.Module> all = null;
+        try {
+            org.netbeans.Module m1 = mgr.create(simpleModule, null, false, false, false);
+            all = Collections.singleton(m1);
+
+            mgr.enable(all);
+
+            // Check multi release class loading
+            Class<?> impl = m1.getClassLoader().loadClass("test.Impl");
+            Method get = impl.getMethod("get");
+            String output = (String) get.invoke(null);
+
+            String expected;
+            try {
+                Class.forName("java.lang.Runtime$Version");
+                expected = "9";
+            } catch (ClassNotFoundException ex) {
+                expected = "base";
+            }
+            assertEquals(expected, output);
+
+            // Check multi release resource loading
+            try(InputStream is = m1.getClassLoader().getResourceAsStream("test/dummy.txt")) {
+                assertEquals(expected, loadUTF8(is));
+            }
+
+        } finally {
+            if (all != null) {
+                mgr.disable(all);
+            }
+            mgr.mutexPrivileged().exitWriteAccess();
+        }
+
+    }
+
+    private static String loadUTF8(InputStream is) throws IOException {
+        ByteArrayOutputStream baos = new ByteArrayOutputStream();
+        byte[] buffer = new byte[2048];
+        int read;
+        while ((read = is.read(buffer)) > 0) {
+            baos.write(buffer, 0, read);
+        }
+        return baos.toString("UTF-8");
+    }
+
+    private static final class SourceFileObject extends SimpleJavaFileObject {
+
+        private final String content;
+
+        public SourceFileObject(String path, String content) throws URISyntaxException {
+            super(new URI("mem://" + path), JavaFileObject.Kind.SOURCE);
+            this.content = content;
+        }
+
+        @Override
+        public CharSequence getCharContent(boolean ignoreEncodingErrors) throws IOException {
+            return content;
+        }
+
+    }
+}
diff --git a/platform/o.n.bootstrap/src/org/netbeans/JarClassLoader.java b/platform/o.n.bootstrap/src/org/netbeans/JarClassLoader.java
index 33a1399..7a238bc 100644
--- a/platform/o.n.bootstrap/src/org/netbeans/JarClassLoader.java
+++ b/platform/o.n.bootstrap/src/org/netbeans/JarClassLoader.java
@@ -30,6 +30,7 @@
 import java.lang.instrument.IllegalClassFormatException;
 import java.lang.ref.Reference;
 import java.lang.ref.SoftReference;
+import java.lang.reflect.InvocationTargetException;
 import java.lang.reflect.Method;
 import java.net.JarURLConnection;
 import java.net.MalformedURLException;
@@ -53,12 +54,14 @@
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
+import java.util.TreeSet;
 import java.util.Vector;
 import java.util.concurrent.Callable;
 import java.util.concurrent.ExecutionException;
 import java.util.concurrent.Future;
 import java.util.concurrent.FutureTask;
 import java.util.jar.Attributes;
+import java.util.jar.Attributes.Name;
 import java.util.jar.JarEntry;
 import java.util.jar.JarFile;
 import java.util.jar.Manifest;
@@ -76,7 +79,29 @@
  * @author  Petr Nejedly
  */
 public class JarClassLoader extends ProxyClassLoader {
+    //
+    // When making changes to this file, check if
+    // platform/netbinox/src/org/netbeans/modules/netbinox/JarBundleFile.java
+    // should also be adjusted. At least the multi-release handling is similar.
+    //
+    
     private static Stamps cache;
+    private static final String META_INF = "META-INF/";
+    private static final Name MULTI_RELEASE = new Name("Multi-Release");
+    private static final int BASE_VERSION = 8;
+    private static final int RUNTIME_VERSION;
+
+    static {
+        int version;
+        try {
+            Object runtimeVersion = Runtime.class.getMethod("version").invoke(null);
+            version = (int) runtimeVersion.getClass().getMethod("major").invoke(runtimeVersion);
+        } catch (ReflectiveOperationException ex) {
+            version = BASE_VERSION;
+        }
+        RUNTIME_VERSION = version;
+    }
+    
     static Archive archive = new Archive(); 
 
     static void initializeCache() {
@@ -272,6 +297,7 @@
                     }
                 }
                 Manifest man = new DelayedManifest();
+
                 try {
                     definePackage(pkgName, man, src.getURL());
                 } catch (IllegalArgumentException x) {
@@ -336,6 +362,7 @@
         private ProtectionDomain pd;
         protected JarClassLoader jcl;
         private static Map<String,Source> sources = new HashMap<String, Source>();
+        private Boolean multiRelease;
         
         public Source(URL url) {
             this.url = url;
@@ -412,6 +439,23 @@
             return url.toString();
         }
 
+        protected boolean isMultiRelease() {
+            Manifest man = getManifest();
+            if(man == null) {
+                return false;
+            }
+            if(multiRelease != null) {
+                return multiRelease;
+            }
+            if (man.getMainAttributes().containsKey(MULTI_RELEASE)) {
+                String multiReleaseString = (String) man.getMainAttributes().get(MULTI_RELEASE);
+                multiRelease = Boolean.valueOf(multiReleaseString);
+            } else {
+                multiRelease = false;
+            }
+            return multiRelease;
+        }
+
     }
     
     static void dumpFiles(File f, int retry) {
@@ -442,6 +486,7 @@
         private boolean dead;
         private int requests;
         private int used;
+        private volatile int[] versions;
         private volatile Reference<Manifest> manifest;
         /** #141110: expensive to repeatedly look for them */
         private final Set<String> nonexistentResources = Collections.synchronizedSet(new HashSet<String>());
@@ -574,13 +619,56 @@
         @Override
         protected byte[] readClass(String path) throws IOException {
             try {
+                if ((! path.startsWith(META_INF)) && isMultiRelease() && RUNTIME_VERSION > BASE_VERSION) {
+                    int[] vers = getVersions();
+                    for (int version: vers) {
+                        byte[] data = archive.getData(this, "META-INF/versions/" + version + "/" + path);
+                        if (data != null) {
+                            return data;
+                        }
+                    }
+                }
                 return archive.getData(this, path);
             } catch (ZipException ex) {
                 dumpFiles(file, -1);
                 throw ex;
             }
         }
-        
+
+        /**
+         * @return versions for which a {@code META-INF/versions/NUMBER} entry exists.
+         * The order is from largest version to lowest. Only versions supported by
+         * the runtime VM are reported.
+         */
+        private int[] getVersions() {
+            if (versions != null) {
+                return versions;
+            }
+            try {
+                Set<Integer> vers = new TreeSet<>(Collections.reverseOrder());
+                for(int i = BASE_VERSION; i <= RUNTIME_VERSION; i++) {
+                    String directory = "META-INF/versions/" + i;
+                    byte[] data = archive.getData(this, directory);
+                    if (data != null && data.length == 0) {
+                        vers.add(i);
+                    }
+                }
+                int[] ret = new int[vers.size()];
+                int i = 0;
+                for (Integer ver : vers) {
+                    ret[i++] = ver;
+                }
+                versions = ret;
+                return ret;
+            } catch (IOException ioe) {
+                if (warnedFiles.add(file)) {
+                    LOGGER.log(Level.WARNING, "problems with " + file, ioe);
+                    dumpFiles(file, -1);
+                }
+            }
+            return new int[0];
+        }
+
         @Override
         public byte[] resource(String path) throws IOException {
             if (nonexistentResources.contains(path)) {
diff --git a/platform/o.n.bootstrap/test/unit/src/org/netbeans/JarClassLoaderTest.java b/platform/o.n.bootstrap/test/unit/src/org/netbeans/JarClassLoaderTest.java
index 2306cba..cc6e36f 100644
--- a/platform/o.n.bootstrap/test/unit/src/org/netbeans/JarClassLoaderTest.java
+++ b/platform/o.n.bootstrap/test/unit/src/org/netbeans/JarClassLoaderTest.java
@@ -18,15 +18,23 @@
  */
 package org.netbeans;
 
+import java.io.ByteArrayOutputStream;
 import java.io.DataInputStream;
 import java.io.File;
+import java.io.FileOutputStream;
 import java.io.IOException;
 import java.io.InputStream;
+import java.io.OutputStream;
 import java.io.Serializable;
+import java.lang.reflect.Method;
 import java.net.JarURLConnection;
+import java.net.URI;
+import java.net.URISyntaxException;
 import java.net.URL;
 import java.net.URLClassLoader;
 import java.net.URLConnection;
+import java.nio.file.Files;
+import java.nio.file.Path;
 import java.util.Collections;
 import java.util.Enumeration;
 import java.util.List;
@@ -37,13 +45,19 @@
 import java.util.logging.Level;
 import java.util.logging.Logger;
 import java.security.Permission;
+import java.util.Arrays;
+import java.util.LinkedHashMap;
 import java.util.Map;
+import javax.tools.SimpleJavaFileObject;
+import javax.tools.ToolProvider;
 import junit.framework.AssertionFailedError;
 import org.netbeans.junit.NbTestCase;
 import org.openide.util.Utilities;
 import org.openide.util.lookup.Lookups;
 import org.openide.util.test.TestFileUtils;
 
+import static java.nio.charset.StandardCharsets.UTF_8;
+
 /** Tests that cover some basic aspects of a Proxy/JarClassLoader.
  *
  * @author Petr Nejedly
@@ -414,4 +428,86 @@
 
         public @Override void checkPermission(Permission perm, Object ctx) {}
     }
+
+    public void testMultiReleaseJar() throws Exception {
+        clearWorkDir();
+
+        // Prepare multi-release jar file
+        File classes = new File(getWorkDir(), "classes");
+        classes.mkdirs();
+        ToolProvider.getSystemJavaCompiler()
+                    .getTask(null, null, d -> { throw new IllegalStateException(d.toString()); }, Arrays.asList("-d", classes.getAbsolutePath()), null,
+                             Arrays.asList(new SourceFileObject("test/Impl.java", "package test; public class Impl { public static String get() { return \"base\"; } }"),
+                                           new SourceFileObject("api/API.java", "package api; public class API { public static String run() { return test.Impl.get(); } }")))
+                    .call();
+        File classes9 = new File(new File(new File(classes, "META-INF"), "versions"), "9");
+        classes9.mkdirs();
+        ToolProvider.getSystemJavaCompiler()
+                    .getTask(null, null, d -> { throw new IllegalStateException(d.toString()); }, Arrays.asList("-d", classes9.getAbsolutePath(), "-classpath", classes.getAbsolutePath()), null,
+                             Arrays.asList(new SourceFileObject("test/Impl.java", "package test; public class Impl { public static String get() { return \"9\"; } }")))
+                    .call();
+        Map<String, byte[]> jarContent = new LinkedHashMap<>();
+        jarContent.put("META-INF/MANIFEST.MF", "Manifest-Version: 1.0\nMulti-Release: true\n\n".getBytes());
+        Path classesPath = classes.toPath();
+        Files.walk(classesPath)
+             .filter(p -> Files.isRegularFile(p))
+             .forEach(p -> {
+                  try {
+                      jarContent.put(classesPath.relativize(p).toString(), TestFileUtils.readFileBin(p.toFile()));
+                  } catch (IOException ex) {
+                      throw new IllegalStateException(ex);
+                  }
+             });
+        jarContent.put("test/dummy.txt", "base".getBytes(UTF_8));
+        jarContent.put("META-INF/versions/9/test/dummy.txt", "9".getBytes(UTF_8));
+        File jar = new File(getWorkDir(), "multi-release.jar");
+        try (OutputStream out = new FileOutputStream(jar)) {
+            TestFileUtils.writeZipFile(out, jarContent);
+        }
+
+        // Check multi release class loading
+        JarClassLoader jcl = new JarClassLoader(Arrays.asList(jar), new ProxyClassLoader[0]);
+        Class<?> api = jcl.loadClass("api.API");
+        Method run = api.getDeclaredMethod("run");
+        String output = (String) run.invoke(null);
+        String expected;
+        try {
+            Class.forName("java.lang.Runtime$Version");
+            expected = "9";
+        } catch (ClassNotFoundException ex) {
+            expected = "base";
+        }
+        assertEquals(expected, output);
+
+        // Check multi release resource loading
+        try(InputStream is = jcl.getResourceAsStream("test/dummy.txt")) {
+            assertEquals(expected, loadUTF8(is));
+        }
+    }
+
+    private static String loadUTF8(InputStream is) throws IOException {
+        ByteArrayOutputStream baos = new ByteArrayOutputStream();
+        byte[] buffer = new byte[2048];
+        int read;
+        while ((read = is.read(buffer)) > 0) {
+            baos.write(buffer, 0, read);
+        }
+        return baos.toString("UTF-8");
+    }
+
+    private static final class SourceFileObject extends SimpleJavaFileObject {
+
+        private final String content;
+
+        public SourceFileObject(String path, String content) throws URISyntaxException {
+            super(new URI("mem://" + path), Kind.SOURCE);
+            this.content = content;
+        }
+
+        @Override
+        public CharSequence getCharContent(boolean ignoreEncodingErrors) throws IOException {
+            return content;
+        }
+
+    }
 }
diff --git a/platform/openide.awt/test/unit/src/org/openide/awt/ActionsInfraHid.java b/platform/openide.awt/test/unit/src/org/openide/awt/ActionsInfraHid.java
index 7aa70dc..80083c0 100644
--- a/platform/openide.awt/test/unit/src/org/openide/awt/ActionsInfraHid.java
+++ b/platform/openide.awt/test/unit/src/org/openide/awt/ActionsInfraHid.java
@@ -23,7 +23,7 @@
 import java.beans.PropertyChangeEvent;
 import java.beans.PropertyChangeListener;
 import java.lang.reflect.InvocationTargetException;
-import junit.framework.Assert;
+import org.junit.Assert;
 
 /** Utilities for actions tests.
  * @author Jesse Glick
diff --git a/platform/openide.dialogs/test/unit/src/org/openide/AsynchronousValidatingPanelTest.java b/platform/openide.dialogs/test/unit/src/org/openide/AsynchronousValidatingPanelTest.java
index 2d7de3e..483e0b0 100644
--- a/platform/openide.dialogs/test/unit/src/org/openide/AsynchronousValidatingPanelTest.java
+++ b/platform/openide.dialogs/test/unit/src/org/openide/AsynchronousValidatingPanelTest.java
@@ -24,7 +24,6 @@
 import javax.swing.*;
 import javax.swing.JLabel;
 import javax.swing.event.ChangeListener;
-import static junit.framework.Assert.assertTrue;
 import org.netbeans.junit.RandomlyFails;
 import org.openide.util.*;
 import org.openide.util.HelpCtx;
diff --git a/platform/openide.execution/test/unit/src/org/openide/execution/ExecutionCompatibilityTest.java b/platform/openide.execution/test/unit/src/org/openide/execution/ExecutionCompatibilityTest.java
index a0637e7..dce3055 100644
--- a/platform/openide.execution/test/unit/src/org/openide/execution/ExecutionCompatibilityTest.java
+++ b/platform/openide.execution/test/unit/src/org/openide/execution/ExecutionCompatibilityTest.java
@@ -19,9 +19,9 @@
 
 package org.openide.execution;
 
-import junit.framework.Assert;
 import junit.framework.Test;
 import junit.framework.TestSuite;
+import org.junit.Assert;
 import org.openide.util.Lookup;
 import org.openide.util.lookup.AbstractLookup;
 import org.openide.util.lookup.InstanceContent;
diff --git a/platform/openide.filesystems/test/unit/src/org/openide/filesystems/MIMESupportHid.java b/platform/openide.filesystems/test/unit/src/org/openide/filesystems/MIMESupportHid.java
index bac74c3..f13249d 100644
--- a/platform/openide.filesystems/test/unit/src/org/openide/filesystems/MIMESupportHid.java
+++ b/platform/openide.filesystems/test/unit/src/org/openide/filesystems/MIMESupportHid.java
@@ -21,7 +21,7 @@
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.List;
-import junit.framework.Assert;
+import org.junit.Assert;
 import org.netbeans.modules.openide.filesystems.declmime.MIMEResolverImpl;
 
 /**
diff --git a/platform/openide.filesystems/test/unit/src/org/openide/filesystems/test/StatFiles.java b/platform/openide.filesystems/test/unit/src/org/openide/filesystems/test/StatFiles.java
index 349601b..715df25 100644
--- a/platform/openide.filesystems/test/unit/src/org/openide/filesystems/test/StatFiles.java
+++ b/platform/openide.filesystems/test/unit/src/org/openide/filesystems/test/StatFiles.java
@@ -26,7 +26,7 @@
 import java.util.HashSet;
 import java.util.Map;
 import java.util.Set;
-import junit.framework.Assert;
+import org.junit.Assert;
 
 /**
  *
diff --git a/platform/openide.loaders/test/unit/src/org/openide/loaders/DefaultDataObjectTest.java b/platform/openide.loaders/test/unit/src/org/openide/loaders/DefaultDataObjectTest.java
index c18f07d..05d30ca 100644
--- a/platform/openide.loaders/test/unit/src/org/openide/loaders/DefaultDataObjectTest.java
+++ b/platform/openide.loaders/test/unit/src/org/openide/loaders/DefaultDataObjectTest.java
@@ -31,8 +31,6 @@
 import javax.swing.JEditorPane;
 import javax.swing.SwingUtilities;
 import javax.swing.text.StyledDocument;
-import static junit.framework.Assert.assertNotNull;
-import static junit.framework.Assert.assertTrue;
 import org.netbeans.junit.MockServices;
 import org.netbeans.junit.NbTestCase;
 import org.netbeans.junit.RandomlyFails;
diff --git a/platform/openide.loaders/test/unit/src/org/openide/loaders/XMLDataObjectSubclassTest.java b/platform/openide.loaders/test/unit/src/org/openide/loaders/XMLDataObjectSubclassTest.java
index 9909a89..30ead57 100644
--- a/platform/openide.loaders/test/unit/src/org/openide/loaders/XMLDataObjectSubclassTest.java
+++ b/platform/openide.loaders/test/unit/src/org/openide/loaders/XMLDataObjectSubclassTest.java
@@ -22,29 +22,11 @@
 import java.util.Enumeration;
 import org.openide.filesystems.*;
 import java.io.*;
-import java.lang.ref.Reference;
-import java.lang.ref.WeakReference;
-import java.security.Permission;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.Map;
-import java.util.Set;
-import java.util.TreeSet;
 import java.util.logging.Level;
-import junit.framework.Assert;
 import org.netbeans.junit.Log;
 import org.netbeans.junit.MockServices;
-import org.netbeans.junit.RandomlyFails;
 import org.openide.cookies.*;
-import org.openide.loaders.MultiDataObject.Entry;
-import org.openide.nodes.Node;
 import org.openide.util.Enumerations;
-import org.openide.util.RequestProcessor;
-import org.openide.xml.XMLUtil;
-import org.xml.sax.InputSource;
-import org.xml.sax.SAXParseException;
 
 /**
  *
diff --git a/platform/openide.loaders/test/unit/src/org/openide/loaders/XMLDataObjectTest.java b/platform/openide.loaders/test/unit/src/org/openide/loaders/XMLDataObjectTest.java
index 27d8762..7d33b5d 100644
--- a/platform/openide.loaders/test/unit/src/org/openide/loaders/XMLDataObjectTest.java
+++ b/platform/openide.loaders/test/unit/src/org/openide/loaders/XMLDataObjectTest.java
@@ -23,16 +23,8 @@
 import java.io.*;
 import java.lang.ref.Reference;
 import java.lang.ref.WeakReference;
-import java.security.Permission;
-import java.util.Arrays;
 import java.util.Collection;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.Map;
-import java.util.Set;
-import java.util.TreeSet;
 import java.util.logging.Level;
-import junit.framework.Assert;
 import org.netbeans.junit.Log;
 import org.netbeans.junit.RandomlyFails;
 import org.netbeans.modules.openide.util.NbMutexEventProvider;
diff --git a/platform/openide.nodes/test/unit/src/org/openide/util/actions/NodeActionsInfraHid.java b/platform/openide.nodes/test/unit/src/org/openide/util/actions/NodeActionsInfraHid.java
index 6ca1fd4..d5d74c2 100644
--- a/platform/openide.nodes/test/unit/src/org/openide/util/actions/NodeActionsInfraHid.java
+++ b/platform/openide.nodes/test/unit/src/org/openide/util/actions/NodeActionsInfraHid.java
@@ -24,7 +24,7 @@
 import java.util.Arrays;
 import java.util.Collections;
 import java.util.HashSet;
-import junit.framework.Assert;
+import org.junit.Assert;
 import org.openide.nodes.Node;
 import org.openide.util.ContextGlobalProvider;
 import org.openide.util.Lookup;
diff --git a/platform/openide.text/test/unit/src/org/openide/text/CloneableEditorSupportOpenCloseTest.java b/platform/openide.text/test/unit/src/org/openide/text/CloneableEditorSupportOpenCloseTest.java
index aae4e0f..9f18c90 100644
--- a/platform/openide.text/test/unit/src/org/openide/text/CloneableEditorSupportOpenCloseTest.java
+++ b/platform/openide.text/test/unit/src/org/openide/text/CloneableEditorSupportOpenCloseTest.java
@@ -27,8 +27,6 @@
 import java.util.List;
 import java.util.concurrent.CountDownLatch;
 import java.util.logging.Level;
-import static junit.framework.Assert.assertEquals;
-import static junit.framework.Assert.assertNull;
 import org.netbeans.junit.Filter;
 import org.netbeans.junit.NbTestCase;
 import org.openide.cookies.EditorCookie;
diff --git a/platform/openide.util.lookup/test/unit/src/org/openide/util/test/AnnotationProcessorTestUtils.java b/platform/openide.util.lookup/test/unit/src/org/openide/util/test/AnnotationProcessorTestUtils.java
index af69412..a61f690 100644
--- a/platform/openide.util.lookup/test/unit/src/org/openide/util/test/AnnotationProcessorTestUtils.java
+++ b/platform/openide.util.lookup/test/unit/src/org/openide/util/test/AnnotationProcessorTestUtils.java
@@ -33,7 +33,7 @@
 import java.util.regex.Pattern;
 import javax.tools.JavaCompiler;
 import javax.tools.ToolProvider;
-import junit.framework.Assert;
+import org.junit.Assert;
 
 /**
  * Utilities useful to those testing JSR 269 annotation processors.
diff --git a/platform/openide.util.lookup/test/unit/src/org/openide/util/test/MockLookup.java b/platform/openide.util.lookup/test/unit/src/org/openide/util/test/MockLookup.java
index e3ab365..159de77 100644
--- a/platform/openide.util.lookup/test/unit/src/org/openide/util/test/MockLookup.java
+++ b/platform/openide.util.lookup/test/unit/src/org/openide/util/test/MockLookup.java
@@ -21,11 +21,14 @@
 
 import java.lang.reflect.Field;
 import java.util.Collection;
-import static junit.framework.Assert.*;
 import org.openide.util.Lookup;
 import org.openide.util.lookup.Lookups;
 import org.openide.util.lookup.ProxyLookup;
 
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertTrue;
+
 /**
  * Mock implementation of system default lookup suitable for use in unit tests.
  * The initial value just contains classpath services.
diff --git a/platform/openide.util.ui/test/unit/src/org/openide/util/UtilitiesTest.java b/platform/openide.util.ui/test/unit/src/org/openide/util/UtilitiesTest.java
index 6963024..9bada3d 100644
--- a/platform/openide.util.ui/test/unit/src/org/openide/util/UtilitiesTest.java
+++ b/platform/openide.util.ui/test/unit/src/org/openide/util/UtilitiesTest.java
@@ -101,7 +101,6 @@
 import javax.swing.JPopupMenu;
 import javax.swing.JSeparator;
 import javax.swing.KeyStroke;
-import junit.framework.Assert;
 import org.netbeans.junit.NbTestCase;
 import org.openide.util.actions.Presenter;
 import org.openide.util.lookup.AbstractLookup;
@@ -542,7 +541,7 @@
             InstanceContent.Convertor<Boolean, JSeparator> separatorConvertor = new InstanceContent.Convertor<Boolean, JSeparator>() {
 
                 public JSeparator convert(Boolean obj) {
-                    Assert.fail("should not be creating the JSeparator yet");
+                    fail("should not be creating the JSeparator yet");
                     return new JSeparator();
                 }
 
diff --git a/platform/openide.util.ui/test/unit/src/org/openide/util/actions/ActionsInfraHid.java b/platform/openide.util.ui/test/unit/src/org/openide/util/actions/ActionsInfraHid.java
index 6f0ac01..655466e 100644
--- a/platform/openide.util.ui/test/unit/src/org/openide/util/actions/ActionsInfraHid.java
+++ b/platform/openide.util.ui/test/unit/src/org/openide/util/actions/ActionsInfraHid.java
@@ -24,7 +24,7 @@
 import java.util.Collections;
 import java.util.HashSet;
 import javax.swing.ActionMap;
-import junit.framework.Assert;
+import org.junit.Assert;
 import org.openide.util.ContextGlobalProvider;
 import org.openide.util.Lookup;
 import org.openide.util.Utilities;
diff --git a/platform/openide.util.ui/test/unit/src/org/openide/util/test/MockChangeListener.java b/platform/openide.util.ui/test/unit/src/org/openide/util/test/MockChangeListener.java
index 2881350..7832d56 100644
--- a/platform/openide.util.ui/test/unit/src/org/openide/util/test/MockChangeListener.java
+++ b/platform/openide.util.ui/test/unit/src/org/openide/util/test/MockChangeListener.java
@@ -23,7 +23,7 @@
 import java.util.List;
 import javax.swing.event.ChangeEvent;
 import javax.swing.event.ChangeListener;
-import static junit.framework.Assert.*;
+import static junit.framework.TestCase.*;
 import junit.framework.AssertionFailedError;
 
 /**
diff --git a/platform/openide.util.ui/test/unit/src/org/openide/util/test/MockChangeListenerTest.java b/platform/openide.util.ui/test/unit/src/org/openide/util/test/MockChangeListenerTest.java
index b26e7a6..bb8ee4e 100644
--- a/platform/openide.util.ui/test/unit/src/org/openide/util/test/MockChangeListenerTest.java
+++ b/platform/openide.util.ui/test/unit/src/org/openide/util/test/MockChangeListenerTest.java
@@ -24,6 +24,7 @@
 import org.netbeans.junit.RandomlyFails;
 import org.openide.util.ChangeSupport;
 
+// copy of openide.util
 public class MockChangeListenerTest extends NbTestCase {
 
     public MockChangeListenerTest(String n) {
diff --git a/platform/openide.util.ui/test/unit/src/org/openide/util/test/MockPropertyChangeListener.java b/platform/openide.util.ui/test/unit/src/org/openide/util/test/MockPropertyChangeListener.java
index 1fc36a6..10a1c0b 100644
--- a/platform/openide.util.ui/test/unit/src/org/openide/util/test/MockPropertyChangeListener.java
+++ b/platform/openide.util.ui/test/unit/src/org/openide/util/test/MockPropertyChangeListener.java
@@ -29,7 +29,7 @@
 import java.util.Map;
 import java.util.Set;
 import java.util.TreeSet;
-import static junit.framework.Assert.*;
+import static junit.framework.TestCase.*;
 import junit.framework.AssertionFailedError;
 
 /**
diff --git a/platform/openide.util.ui/test/unit/src/org/openide/util/test/MockPropertyChangeListenerTest.java b/platform/openide.util.ui/test/unit/src/org/openide/util/test/MockPropertyChangeListenerTest.java
index ce87b8d..ebedcf3 100644
--- a/platform/openide.util.ui/test/unit/src/org/openide/util/test/MockPropertyChangeListenerTest.java
+++ b/platform/openide.util.ui/test/unit/src/org/openide/util/test/MockPropertyChangeListenerTest.java
@@ -24,6 +24,7 @@
 import junit.framework.AssertionFailedError;
 import junit.framework.TestCase;
 
+// copy of openide.util
 public class MockPropertyChangeListenerTest extends TestCase {
 
     public MockPropertyChangeListenerTest(String n) {
diff --git a/platform/openide.util.ui/test/unit/src/org/openide/util/test/TestFileUtils.java b/platform/openide.util.ui/test/unit/src/org/openide/util/test/TestFileUtils.java
index a3702d9..f19877a 100644
--- a/platform/openide.util.ui/test/unit/src/org/openide/util/test/TestFileUtils.java
+++ b/platform/openide.util.ui/test/unit/src/org/openide/util/test/TestFileUtils.java
@@ -38,7 +38,7 @@
 import java.util.zip.ZipEntry;
 import java.util.zip.ZipInputStream;
 import java.util.zip.ZipOutputStream;
-import junit.framework.Assert;
+import org.junit.Assert;
 
 /**
  * Common utility methods for massaging and inspecting files from tests.
diff --git a/platform/openide.util.ui/test/unit/src/org/openide/xml/XMLUtilReflectionTest.java b/platform/openide.util.ui/test/unit/src/org/openide/xml/XMLUtilReflectionTest.java
index bf87a69..7caedcf 100644
--- a/platform/openide.util.ui/test/unit/src/org/openide/xml/XMLUtilReflectionTest.java
+++ b/platform/openide.util.ui/test/unit/src/org/openide/xml/XMLUtilReflectionTest.java
@@ -27,7 +27,7 @@
 import java.util.Map;
 import java.util.Set;
 import java.util.TreeSet;
-import junit.framework.Assert;
+import org.junit.Assert;
 import org.xml.sax.InputSource;
 import org.xml.sax.SAXParseException;
 
diff --git a/platform/openide.util/test/unit/src/org/openide/util/RequestProcessor226051Test.java b/platform/openide.util/test/unit/src/org/openide/util/RequestProcessor226051Test.java
index da25867..ceab7c2 100644
--- a/platform/openide.util/test/unit/src/org/openide/util/RequestProcessor226051Test.java
+++ b/platform/openide.util/test/unit/src/org/openide/util/RequestProcessor226051Test.java
@@ -23,11 +23,12 @@
 import java.util.concurrent.CountDownLatch;
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.atomic.AtomicBoolean;
-import static junit.framework.Assert.assertTrue;
 import org.junit.Test;
 import org.openide.util.Exceptions;
 import org.openide.util.RequestProcessor;
 
+import static org.junit.Assert.assertTrue;
+
 /**
  *
  * @author Tim Boudreau
diff --git a/platform/openide.util/test/unit/src/org/openide/util/test/MockChangeListener.java b/platform/openide.util/test/unit/src/org/openide/util/test/MockChangeListener.java
index 2881350..7832d56 100644
--- a/platform/openide.util/test/unit/src/org/openide/util/test/MockChangeListener.java
+++ b/platform/openide.util/test/unit/src/org/openide/util/test/MockChangeListener.java
@@ -23,7 +23,7 @@
 import java.util.List;
 import javax.swing.event.ChangeEvent;
 import javax.swing.event.ChangeListener;
-import static junit.framework.Assert.*;
+import static junit.framework.TestCase.*;
 import junit.framework.AssertionFailedError;
 
 /**
diff --git a/platform/openide.util/test/unit/src/org/openide/util/test/MockChangeListenerTest.java b/platform/openide.util/test/unit/src/org/openide/util/test/MockChangeListenerTest.java
index b26e7a6..5de00cd 100644
--- a/platform/openide.util/test/unit/src/org/openide/util/test/MockChangeListenerTest.java
+++ b/platform/openide.util/test/unit/src/org/openide/util/test/MockChangeListenerTest.java
@@ -24,6 +24,7 @@
 import org.netbeans.junit.RandomlyFails;
 import org.openide.util.ChangeSupport;
 
+// copy of openide.util.ui
 public class MockChangeListenerTest extends NbTestCase {
 
     public MockChangeListenerTest(String n) {
diff --git a/platform/openide.util/test/unit/src/org/openide/util/test/MockPropertyChangeListener.java b/platform/openide.util/test/unit/src/org/openide/util/test/MockPropertyChangeListener.java
index 1fc36a6..10a1c0b 100644
--- a/platform/openide.util/test/unit/src/org/openide/util/test/MockPropertyChangeListener.java
+++ b/platform/openide.util/test/unit/src/org/openide/util/test/MockPropertyChangeListener.java
@@ -29,7 +29,7 @@
 import java.util.Map;
 import java.util.Set;
 import java.util.TreeSet;
-import static junit.framework.Assert.*;
+import static junit.framework.TestCase.*;
 import junit.framework.AssertionFailedError;
 
 /**
diff --git a/platform/openide.util/test/unit/src/org/openide/util/test/MockPropertyChangeListenerTest.java b/platform/openide.util/test/unit/src/org/openide/util/test/MockPropertyChangeListenerTest.java
index ce87b8d..a2cee41 100644
--- a/platform/openide.util/test/unit/src/org/openide/util/test/MockPropertyChangeListenerTest.java
+++ b/platform/openide.util/test/unit/src/org/openide/util/test/MockPropertyChangeListenerTest.java
@@ -24,6 +24,7 @@
 import junit.framework.AssertionFailedError;
 import junit.framework.TestCase;
 
+// copy of openide.util.ui
 public class MockPropertyChangeListenerTest extends TestCase {
 
     public MockPropertyChangeListenerTest(String n) {
diff --git a/platform/openide.util/test/unit/src/org/openide/util/test/TestFileUtils.java b/platform/openide.util/test/unit/src/org/openide/util/test/TestFileUtils.java
index a3702d9..f19877a 100644
--- a/platform/openide.util/test/unit/src/org/openide/util/test/TestFileUtils.java
+++ b/platform/openide.util/test/unit/src/org/openide/util/test/TestFileUtils.java
@@ -38,7 +38,7 @@
 import java.util.zip.ZipEntry;
 import java.util.zip.ZipInputStream;
 import java.util.zip.ZipOutputStream;
-import junit.framework.Assert;
+import org.junit.Assert;
 
 /**
  * Common utility methods for massaging and inspecting files from tests.
diff --git a/platform/options.api/test/unit/src/org/netbeans/api/options/IDEInitializer.java b/platform/options.api/test/unit/src/org/netbeans/api/options/IDEInitializer.java
index b865045..1293491 100644
--- a/platform/options.api/test/unit/src/org/netbeans/api/options/IDEInitializer.java
+++ b/platform/options.api/test/unit/src/org/netbeans/api/options/IDEInitializer.java
@@ -26,7 +26,7 @@
 import java.net.URLStreamHandler;
 import java.net.URLStreamHandlerFactory;
 import java.util.Enumeration;
-import junit.framework.Assert;
+import org.junit.Assert;
 import org.netbeans.junit.Manager;
 import org.openide.filesystems.FileObject;
 import org.openide.filesystems.FileSystem;
diff --git a/platform/sendopts/test/unit/src/org/netbeans/api/sendopts/Provider.java b/platform/sendopts/test/unit/src/org/netbeans/api/sendopts/Provider.java
index 753171e..1a48bec 100644
--- a/platform/sendopts/test/unit/src/org/netbeans/api/sendopts/Provider.java
+++ b/platform/sendopts/test/unit/src/org/netbeans/api/sendopts/Provider.java
@@ -22,7 +22,7 @@
 import java.util.HashMap;
 import java.util.Map;
 import java.util.Set;
-import junit.framework.Assert;
+import org.junit.Assert;
 import org.netbeans.spi.sendopts.OptionGroups;
 import org.netbeans.spi.sendopts.Env;
 import org.netbeans.spi.sendopts.Option;
diff --git a/platform/spi.quicksearch/test/unit/src/org/netbeans/modules/quicksearch/UnitTestUtils.java b/platform/spi.quicksearch/test/unit/src/org/netbeans/modules/quicksearch/UnitTestUtils.java
index 083b36b..b8b1b96 100644
--- a/platform/spi.quicksearch/test/unit/src/org/netbeans/modules/quicksearch/UnitTestUtils.java
+++ b/platform/spi.quicksearch/test/unit/src/org/netbeans/modules/quicksearch/UnitTestUtils.java
@@ -22,7 +22,7 @@
 import java.beans.PropertyVetoException;
 import java.io.IOException;
 import java.net.URL;
-import junit.framework.Assert;
+import org.junit.Assert;
 import org.openide.filesystems.Repository;
 import org.openide.filesystems.XMLFileSystem;
 import org.openide.util.Lookup;
diff --git a/platform/templatesui/test/unit/src/org/netbeans/modules/templatesui/HTMLTemplateTest.java b/platform/templatesui/test/unit/src/org/netbeans/modules/templatesui/HTMLTemplateTest.java
index d7e92da..5d5f874 100644
--- a/platform/templatesui/test/unit/src/org/netbeans/modules/templatesui/HTMLTemplateTest.java
+++ b/platform/templatesui/test/unit/src/org/netbeans/modules/templatesui/HTMLTemplateTest.java
@@ -25,9 +25,10 @@
 import java.util.Set;
 import java.util.concurrent.CountDownLatch;
 import javafx.application.Platform;
-import static junit.framework.Assert.*;
 import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
 import org.junit.Test;
 import org.netbeans.api.templates.TemplateRegistration;
 import static org.netbeans.modules.templatesui.HTMLJavaTemplateTest.assertCurrentStep;
diff --git a/platform/uihandler/test/unit/src/org/netbeans/modules/uihandler/MemoryURL.java b/platform/uihandler/test/unit/src/org/netbeans/modules/uihandler/MemoryURL.java
index 8390143..f394268 100644
--- a/platform/uihandler/test/unit/src/org/netbeans/modules/uihandler/MemoryURL.java
+++ b/platform/uihandler/test/unit/src/org/netbeans/modules/uihandler/MemoryURL.java
@@ -30,7 +30,7 @@
 import java.net.URLStreamHandlerFactory;
 import java.util.HashMap;
 import java.util.Map;
-import junit.framework.Assert;
+import org.junit.Assert;
 
 /**
  *
diff --git a/profiler/profiler.j2se/test/unit/src/org/netbeans/modules/profiler/categories/j2se/TestUtilities.java b/profiler/profiler.j2se/test/unit/src/org/netbeans/modules/profiler/categories/j2se/TestUtilities.java
index e757e95..7d4e388 100644
--- a/profiler/profiler.j2se/test/unit/src/org/netbeans/modules/profiler/categories/j2se/TestUtilities.java
+++ b/profiler/profiler.j2se/test/unit/src/org/netbeans/modules/profiler/categories/j2se/TestUtilities.java
@@ -25,9 +25,7 @@
 import java.io.InputStream;
 import java.io.OutputStream;
 import java.nio.charset.StandardCharsets;
-
-import junit.framework.Assert;
-
+import org.junit.Assert;
 import org.netbeans.api.editor.mimelookup.MimePath;
 import org.netbeans.modules.java.source.indexing.JavaCustomIndexer;
 import org.netbeans.modules.java.source.parsing.JavacParser;
diff --git a/profiler/profiler.nbimpl/test/unit/src/org/netbeans/modules/profiler/nbimpl/TestUtilities.java b/profiler/profiler.nbimpl/test/unit/src/org/netbeans/modules/profiler/nbimpl/TestUtilities.java
index 0d6781d..fa488a9 100644
--- a/profiler/profiler.nbimpl/test/unit/src/org/netbeans/modules/profiler/nbimpl/TestUtilities.java
+++ b/profiler/profiler.nbimpl/test/unit/src/org/netbeans/modules/profiler/nbimpl/TestUtilities.java
@@ -25,9 +25,7 @@
 import java.io.InputStream;
 import java.io.OutputStream;
 import java.nio.charset.StandardCharsets;
-
-import junit.framework.Assert;
-
+import org.junit.Assert;
 import org.netbeans.api.editor.mimelookup.MimePath;
 import org.netbeans.modules.java.source.indexing.JavaCustomIndexer;
 import org.netbeans.modules.java.source.parsing.ClassParser;
diff --git a/webcommon/html.angular/test/qa-functional/src/org/netbeans/modules/html/angular/cc/CtrlAsModuleTest.java b/webcommon/html.angular/test/qa-functional/src/org/netbeans/modules/html/angular/cc/CtrlAsModuleTest.java
index 9a29ee7..f684fb5 100644
--- a/webcommon/html.angular/test/qa-functional/src/org/netbeans/modules/html/angular/cc/CtrlAsModuleTest.java
+++ b/webcommon/html.angular/test/qa-functional/src/org/netbeans/modules/html/angular/cc/CtrlAsModuleTest.java
@@ -21,7 +21,6 @@
 import java.awt.event.InputEvent;
 import java.awt.event.KeyEvent;
 import javax.swing.KeyStroke;
-import static junit.framework.Assert.assertTrue;
 import junit.framework.Test;
 import org.netbeans.jellytools.EditorOperator;
 import org.netbeans.jemmy.JemmyProperties;
diff --git a/webcommon/html.angular/test/qa-functional/src/org/netbeans/modules/html/angular/cc/CtrlModuleArrayETest.java b/webcommon/html.angular/test/qa-functional/src/org/netbeans/modules/html/angular/cc/CtrlModuleArrayETest.java
index 485d4bf..ff4484c 100644
--- a/webcommon/html.angular/test/qa-functional/src/org/netbeans/modules/html/angular/cc/CtrlModuleArrayETest.java
+++ b/webcommon/html.angular/test/qa-functional/src/org/netbeans/modules/html/angular/cc/CtrlModuleArrayETest.java
@@ -22,7 +22,6 @@
 import java.awt.event.InputEvent;
 import java.awt.event.KeyEvent;
 import javax.swing.KeyStroke;
-import static junit.framework.Assert.assertTrue;
 import junit.framework.Test;
 import org.netbeans.jellytools.EditorOperator;
 import org.netbeans.jemmy.JemmyProperties;
diff --git a/webcommon/html.angular/test/qa-functional/src/org/netbeans/modules/html/angular/cc/CtrlModuleArrayTest.java b/webcommon/html.angular/test/qa-functional/src/org/netbeans/modules/html/angular/cc/CtrlModuleArrayTest.java
index fd4e8c6..7bb63b4 100644
--- a/webcommon/html.angular/test/qa-functional/src/org/netbeans/modules/html/angular/cc/CtrlModuleArrayTest.java
+++ b/webcommon/html.angular/test/qa-functional/src/org/netbeans/modules/html/angular/cc/CtrlModuleArrayTest.java
@@ -21,7 +21,6 @@
 import java.awt.event.InputEvent;
 import java.awt.event.KeyEvent;
 import javax.swing.KeyStroke;
-import static junit.framework.Assert.assertTrue;
 import junit.framework.Test;
 import org.netbeans.jellytools.EditorOperator;
 import org.netbeans.jemmy.JemmyProperties;
diff --git a/webcommon/html.angular/test/qa-functional/src/org/netbeans/modules/html/angular/cc/CtrlModuleTest.java b/webcommon/html.angular/test/qa-functional/src/org/netbeans/modules/html/angular/cc/CtrlModuleTest.java
index 2c63ad3..061809e 100644
--- a/webcommon/html.angular/test/qa-functional/src/org/netbeans/modules/html/angular/cc/CtrlModuleTest.java
+++ b/webcommon/html.angular/test/qa-functional/src/org/netbeans/modules/html/angular/cc/CtrlModuleTest.java
@@ -22,7 +22,6 @@
 import java.awt.event.InputEvent;
 import java.awt.event.KeyEvent;
 import javax.swing.KeyStroke;
-import static junit.framework.Assert.assertTrue;
 import junit.framework.Test;
 import org.netbeans.jellytools.EditorOperator;
 import org.netbeans.jemmy.JemmyProperties;
diff --git a/webcommon/html.angular/test/qa-functional/src/org/netbeans/modules/html/angular/navigate/CtrlAsModuleNav2Test.java b/webcommon/html.angular/test/qa-functional/src/org/netbeans/modules/html/angular/navigate/CtrlAsModuleNav2Test.java
index 60f457a..bb34d86 100644
--- a/webcommon/html.angular/test/qa-functional/src/org/netbeans/modules/html/angular/navigate/CtrlAsModuleNav2Test.java
+++ b/webcommon/html.angular/test/qa-functional/src/org/netbeans/modules/html/angular/navigate/CtrlAsModuleNav2Test.java
@@ -20,7 +20,6 @@
 
 import java.awt.event.KeyEvent;
 import javax.swing.KeyStroke;
-import static junit.framework.Assert.assertTrue;
 import junit.framework.Test;
 import org.netbeans.jellytools.EditorOperator;
 import org.netbeans.jemmy.JemmyProperties;
diff --git a/webcommon/html.angular/test/qa-functional/src/org/netbeans/modules/html/angular/navigate/NavigationAsTest.java b/webcommon/html.angular/test/qa-functional/src/org/netbeans/modules/html/angular/navigate/NavigationAsTest.java
index e744467..be94b3c 100644
--- a/webcommon/html.angular/test/qa-functional/src/org/netbeans/modules/html/angular/navigate/NavigationAsTest.java
+++ b/webcommon/html.angular/test/qa-functional/src/org/netbeans/modules/html/angular/navigate/NavigationAsTest.java
@@ -20,8 +20,6 @@
 
 import java.awt.event.KeyEvent;
 import javax.swing.KeyStroke;
-import static junit.framework.Assert.assertTrue;
-import static junit.framework.Assert.fail;
 import junit.framework.Test;
 import org.netbeans.jellytools.EditorOperator;
 import org.netbeans.jemmy.JemmyProperties;
diff --git a/webcommon/html.angular/test/unit/src/org/netbeans/modules/html/angular/editor/AngularJsDeclarationFinder2Test.java b/webcommon/html.angular/test/unit/src/org/netbeans/modules/html/angular/editor/AngularJsDeclarationFinder2Test.java
index 05c2b19..466cb6f 100644
--- a/webcommon/html.angular/test/unit/src/org/netbeans/modules/html/angular/editor/AngularJsDeclarationFinder2Test.java
+++ b/webcommon/html.angular/test/unit/src/org/netbeans/modules/html/angular/editor/AngularJsDeclarationFinder2Test.java
@@ -25,7 +25,6 @@
 import java.util.LinkedList;
 import java.util.List;
 import java.util.Map;
-import static junit.framework.Assert.assertTrue;
 import org.netbeans.api.java.classpath.ClassPath;
 import org.netbeans.api.project.Project;
 import org.netbeans.modules.csl.api.DeclarationFinder;
diff --git a/webcommon/html.angular/test/unit/src/org/netbeans/modules/html/angular/editor/AngularJsDelcarationFinderTest.java b/webcommon/html.angular/test/unit/src/org/netbeans/modules/html/angular/editor/AngularJsDelcarationFinderTest.java
index a02257a..38e744f 100644
--- a/webcommon/html.angular/test/unit/src/org/netbeans/modules/html/angular/editor/AngularJsDelcarationFinderTest.java
+++ b/webcommon/html.angular/test/unit/src/org/netbeans/modules/html/angular/editor/AngularJsDelcarationFinderTest.java
@@ -27,7 +27,6 @@
 import java.util.Map;
 import javax.swing.Icon;
 import javax.swing.event.ChangeListener;
-import static junit.framework.Assert.assertTrue;
 import org.netbeans.api.editor.mimelookup.MimePath;
 import org.netbeans.api.editor.mimelookup.test.MockMimeLookup;
 import org.netbeans.api.html.lexer.HTMLTokenId;
diff --git a/webcommon/html.knockout/test/qa-functional/src/org/netbeans/modules/html/knockout/GeneralKnockout.java b/webcommon/html.knockout/test/qa-functional/src/org/netbeans/modules/html/knockout/GeneralKnockout.java
index ce6602b..4b86351 100644
--- a/webcommon/html.knockout/test/qa-functional/src/org/netbeans/modules/html/knockout/GeneralKnockout.java
+++ b/webcommon/html.knockout/test/qa-functional/src/org/netbeans/modules/html/knockout/GeneralKnockout.java
@@ -29,7 +29,6 @@
 import java.util.logging.Logger;
 import javax.swing.JEditorPane;
 import javax.swing.text.BadLocationException;
-import static junit.framework.Assert.fail;
 import org.netbeans.jellytools.EditorOperator;
 import org.netbeans.jellytools.JellyTestCase;
 import org.netbeans.jellytools.NewProjectWizardOperator;
@@ -47,8 +46,6 @@
 import org.netbeans.jemmy.operators.Operator;
 import org.openide.util.Exceptions;
 import javax.swing.JTextField;
-import static junit.framework.Assert.assertTrue;
-import static junit.framework.Assert.fail;
 import org.netbeans.jellytools.MainWindowOperator;
 import org.netbeans.jellytools.ProjectsTabOperator;
 import org.netbeans.jellytools.nodes.Node;
diff --git a/webcommon/html.knockout/test/qa-functional/src/org/netbeans/modules/html/knockout/cc/CustomComponentTest.java b/webcommon/html.knockout/test/qa-functional/src/org/netbeans/modules/html/knockout/cc/CustomComponentTest.java
index e7d0881..2a7565b 100644
--- a/webcommon/html.knockout/test/qa-functional/src/org/netbeans/modules/html/knockout/cc/CustomComponentTest.java
+++ b/webcommon/html.knockout/test/qa-functional/src/org/netbeans/modules/html/knockout/cc/CustomComponentTest.java
@@ -23,7 +23,6 @@
 import java.io.IOException;
 import java.util.logging.Level;
 import java.util.logging.Logger;
-import static junit.framework.Assert.assertTrue;
 import junit.framework.Test;
 import org.netbeans.jellytools.EditorOperator;
 import org.netbeans.jellytools.modules.editor.CompletionJListOperator;
diff --git a/webcommon/javascript.bower/test/unit/src/org/netbeans/modules/javascript/bower/file/BowerJsonTest.java b/webcommon/javascript.bower/test/unit/src/org/netbeans/modules/javascript/bower/file/BowerJsonTest.java
index ebeecfd..62131db 100644
--- a/webcommon/javascript.bower/test/unit/src/org/netbeans/modules/javascript/bower/file/BowerJsonTest.java
+++ b/webcommon/javascript.bower/test/unit/src/org/netbeans/modules/javascript/bower/file/BowerJsonTest.java
@@ -40,12 +40,6 @@
 import org.openide.filesystems.FileObject;
 import org.openide.filesystems.FileUtil;
 
-import static junit.framework.Assert.assertEquals;
-import static junit.framework.Assert.assertFalse;
-import static junit.framework.Assert.assertNotNull;
-import static junit.framework.Assert.assertNull;
-import static junit.framework.Assert.assertTrue;
-import static junit.framework.Assert.fail;
 
 public class BowerJsonTest extends NbTestCase {
 
diff --git a/webcommon/javascript2.editor/test/qa-functional/src/org/netbeans/modules/javascript2/editor/qaf/cc/TestCCInsideWith.java b/webcommon/javascript2.editor/test/qa-functional/src/org/netbeans/modules/javascript2/editor/qaf/cc/TestCCInsideWith.java
index 88be9be..f1ccd91 100644
--- a/webcommon/javascript2.editor/test/qa-functional/src/org/netbeans/modules/javascript2/editor/qaf/cc/TestCCInsideWith.java
+++ b/webcommon/javascript2.editor/test/qa-functional/src/org/netbeans/modules/javascript2/editor/qaf/cc/TestCCInsideWith.java
@@ -19,8 +19,6 @@
 package org.netbeans.modules.javascript2.editor.qaf.cc;
 
 import java.awt.event.InputEvent;
-import static junit.framework.Assert.assertTrue;
-import static junit.framework.Assert.fail;
 import junit.framework.Test;
 import org.netbeans.jellytools.EditorOperator;
 import org.netbeans.jellytools.modules.editor.CompletionJListOperator;
diff --git a/webcommon/javascript2.editor/test/unit/src/org/netbeans/modules/javascript2/editor/JsFindLogicalRangesTest.java b/webcommon/javascript2.editor/test/unit/src/org/netbeans/modules/javascript2/editor/JsFindLogicalRangesTest.java
index e071e22..6beed81 100644
--- a/webcommon/javascript2.editor/test/unit/src/org/netbeans/modules/javascript2/editor/JsFindLogicalRangesTest.java
+++ b/webcommon/javascript2.editor/test/unit/src/org/netbeans/modules/javascript2/editor/JsFindLogicalRangesTest.java
@@ -22,7 +22,6 @@
 import java.util.Collections;
 import java.util.HashMap;
 import java.util.List;
-import static junit.framework.Assert.assertTrue;
 import org.netbeans.modules.csl.api.OffsetRange;
 import org.netbeans.modules.csl.spi.ParserResult;
 import org.netbeans.modules.parsing.api.ParserManager;
diff --git a/webcommon/javascript2.editor/test/unit/src/org/netbeans/modules/javascript2/editor/JsWithBase.java b/webcommon/javascript2.editor/test/unit/src/org/netbeans/modules/javascript2/editor/JsWithBase.java
index 9cada5b..7540c7a 100644
--- a/webcommon/javascript2.editor/test/unit/src/org/netbeans/modules/javascript2/editor/JsWithBase.java
+++ b/webcommon/javascript2.editor/test/unit/src/org/netbeans/modules/javascript2/editor/JsWithBase.java
@@ -23,9 +23,6 @@
 import java.util.Map;
 import java.util.Set;
 import javax.swing.text.Document;
-import static junit.framework.Assert.assertEquals;
-import static junit.framework.Assert.assertNotNull;
-import static junit.framework.Assert.assertTrue;
 import org.netbeans.modules.csl.api.ColoringAttributes;
 import org.netbeans.modules.csl.api.DeclarationFinder;
 import org.netbeans.modules.csl.api.OccurrencesFinder;
diff --git a/webcommon/javascript2.jade/test/unit/src/org/netbeans/modules/javascript2/jade/editor/JadeJsEmbeddingProviderPluginTest.java b/webcommon/javascript2.jade/test/unit/src/org/netbeans/modules/javascript2/jade/editor/JadeJsEmbeddingProviderPluginTest.java
index 4b2cc8f..3da29fb 100644
--- a/webcommon/javascript2.jade/test/unit/src/org/netbeans/modules/javascript2/jade/editor/JadeJsEmbeddingProviderPluginTest.java
+++ b/webcommon/javascript2.jade/test/unit/src/org/netbeans/modules/javascript2/jade/editor/JadeJsEmbeddingProviderPluginTest.java
@@ -19,7 +19,6 @@
 package org.netbeans.modules.javascript2.jade.editor;
 
 import java.util.Collections;
-import static junit.framework.Assert.assertNotNull;
 import org.netbeans.modules.csl.api.test.CslTestBase;
 import org.netbeans.modules.parsing.api.Embedding;
 import org.netbeans.modules.parsing.api.ParserManager;
diff --git a/webcommon/javascript2.jade/test/unit/src/org/netbeans/modules/javascript2/jade/editor/indent/JadeIndenterTest.java b/webcommon/javascript2.jade/test/unit/src/org/netbeans/modules/javascript2/jade/editor/indent/JadeIndenterTest.java
index 4903174..e070b3e 100644
--- a/webcommon/javascript2.jade/test/unit/src/org/netbeans/modules/javascript2/jade/editor/indent/JadeIndenterTest.java
+++ b/webcommon/javascript2.jade/test/unit/src/org/netbeans/modules/javascript2/jade/editor/indent/JadeIndenterTest.java
@@ -21,7 +21,6 @@
 import javax.swing.JEditorPane;
 import javax.swing.text.Caret;
 import javax.swing.text.DefaultEditorKit;
-import static junit.framework.Assert.assertNotNull;
 import org.netbeans.editor.BaseDocument;
 import org.netbeans.lib.lexer.test.TestLanguageProvider;
 import org.netbeans.modules.csl.api.Formatter;
diff --git a/webcommon/javascript2.jade/test/unit/src/org/netbeans/modules/javascript2/jade/editor/lexer/JadeCompletionContextTest.java b/webcommon/javascript2.jade/test/unit/src/org/netbeans/modules/javascript2/jade/editor/lexer/JadeCompletionContextTest.java
index 22681d0..a265eb4 100644
--- a/webcommon/javascript2.jade/test/unit/src/org/netbeans/modules/javascript2/jade/editor/lexer/JadeCompletionContextTest.java
+++ b/webcommon/javascript2.jade/test/unit/src/org/netbeans/modules/javascript2/jade/editor/lexer/JadeCompletionContextTest.java
@@ -19,7 +19,6 @@
 package org.netbeans.modules.javascript2.jade.editor.lexer;
 
 import java.util.Collections;
-import static junit.framework.Assert.assertTrue;
 import org.netbeans.modules.csl.spi.ParserResult;
 import org.netbeans.modules.javascript2.jade.editor.JadeCompletionContext;
 import org.netbeans.modules.javascript2.jade.editor.JadeTestBase;
diff --git a/webcommon/javascript2.jquery/test/unit/src/org/netbeans/modules/javascript2/jquery/Goto218102Test.java b/webcommon/javascript2.jquery/test/unit/src/org/netbeans/modules/javascript2/jquery/Goto218102Test.java
index 96575b1..9414bcb 100644
--- a/webcommon/javascript2.jquery/test/unit/src/org/netbeans/modules/javascript2/jquery/Goto218102Test.java
+++ b/webcommon/javascript2.jquery/test/unit/src/org/netbeans/modules/javascript2/jquery/Goto218102Test.java
@@ -19,7 +19,6 @@
 package org.netbeans.modules.javascript2.jquery;
 
 import java.util.Collections;
-import static junit.framework.Assert.assertTrue;
 import org.netbeans.modules.csl.api.DeclarationFinder;
 import org.netbeans.modules.csl.api.OffsetRange;
 import static org.netbeans.modules.csl.api.test.CslTestBase.getCaretOffset;
diff --git a/webcommon/javascript2.nodejs/test/qa-functional/src/org/netbeans/modules/javascript2/nodejs/GeneralNodeJs.java b/webcommon/javascript2.nodejs/test/qa-functional/src/org/netbeans/modules/javascript2/nodejs/GeneralNodeJs.java
index 6f91f71..95aa7c4 100644
--- a/webcommon/javascript2.nodejs/test/qa-functional/src/org/netbeans/modules/javascript2/nodejs/GeneralNodeJs.java
+++ b/webcommon/javascript2.nodejs/test/qa-functional/src/org/netbeans/modules/javascript2/nodejs/GeneralNodeJs.java
@@ -34,8 +34,6 @@
 import javax.swing.JTextField;
 import javax.swing.KeyStroke;
 import javax.swing.text.BadLocationException;
-import static junit.framework.Assert.assertTrue;
-import static junit.framework.Assert.fail;
 import org.netbeans.jellytools.EditorOperator;
 import org.netbeans.jellytools.JellyTestCase;
 import org.netbeans.jellytools.NavigatorOperator;
diff --git a/webcommon/javascript2.requirejs/test/qa-functional/src/org/netbeans/modules/javascript2/requirejs/GeneralRequire.java b/webcommon/javascript2.requirejs/test/qa-functional/src/org/netbeans/modules/javascript2/requirejs/GeneralRequire.java
index da0a2d2..09364b8 100644
--- a/webcommon/javascript2.requirejs/test/qa-functional/src/org/netbeans/modules/javascript2/requirejs/GeneralRequire.java
+++ b/webcommon/javascript2.requirejs/test/qa-functional/src/org/netbeans/modules/javascript2/requirejs/GeneralRequire.java
@@ -32,8 +32,6 @@
 import javax.swing.JEditorPane;
 import javax.swing.KeyStroke;
 import javax.swing.text.BadLocationException;
-import static junit.framework.Assert.assertTrue;
-import static junit.framework.Assert.fail;
 import org.netbeans.jellytools.*;
 import org.netbeans.jellytools.modules.editor.CompletionJListOperator;
 import org.netbeans.jellytools.nodes.Node;
diff --git a/webcommon/javascript2.requirejs/test/qa-functional/src/org/netbeans/modules/javascript2/requirejs/navigate/DefineTest.java b/webcommon/javascript2.requirejs/test/qa-functional/src/org/netbeans/modules/javascript2/requirejs/navigate/DefineTest.java
index 57089f0..9805077 100644
--- a/webcommon/javascript2.requirejs/test/qa-functional/src/org/netbeans/modules/javascript2/requirejs/navigate/DefineTest.java
+++ b/webcommon/javascript2.requirejs/test/qa-functional/src/org/netbeans/modules/javascript2/requirejs/navigate/DefineTest.java
@@ -20,8 +20,6 @@
 
 import java.awt.event.KeyEvent;
 import javax.swing.KeyStroke;
-import static junit.framework.Assert.assertTrue;
-import static junit.framework.Assert.fail;
 import junit.framework.Test;
 import org.netbeans.jellytools.EditorOperator;
 import org.netbeans.jemmy.JemmyProperties;
diff --git a/webcommon/javascript2.requirejs/test/qa-functional/src/org/netbeans/modules/javascript2/requirejs/navigate/ExternalFileNavTest.java b/webcommon/javascript2.requirejs/test/qa-functional/src/org/netbeans/modules/javascript2/requirejs/navigate/ExternalFileNavTest.java
index ed2af94..9f15598 100644
--- a/webcommon/javascript2.requirejs/test/qa-functional/src/org/netbeans/modules/javascript2/requirejs/navigate/ExternalFileNavTest.java
+++ b/webcommon/javascript2.requirejs/test/qa-functional/src/org/netbeans/modules/javascript2/requirejs/navigate/ExternalFileNavTest.java
@@ -20,8 +20,6 @@
 
 import java.awt.event.KeyEvent;
 import javax.swing.KeyStroke;
-import static junit.framework.Assert.assertTrue;
-import static junit.framework.Assert.fail;
 import junit.framework.Test;
 import org.netbeans.jellytools.EditorOperator;
 import org.netbeans.jemmy.JemmyProperties;
diff --git a/webcommon/javascript2.requirejs/test/qa-functional/src/org/netbeans/modules/javascript2/requirejs/navigate/NavigateRequireTest.java b/webcommon/javascript2.requirejs/test/qa-functional/src/org/netbeans/modules/javascript2/requirejs/navigate/NavigateRequireTest.java
index 81020c5..1bd0b11 100644
--- a/webcommon/javascript2.requirejs/test/qa-functional/src/org/netbeans/modules/javascript2/requirejs/navigate/NavigateRequireTest.java
+++ b/webcommon/javascript2.requirejs/test/qa-functional/src/org/netbeans/modules/javascript2/requirejs/navigate/NavigateRequireTest.java
@@ -20,8 +20,6 @@
 
 import java.awt.event.KeyEvent;
 import javax.swing.KeyStroke;
-import static junit.framework.Assert.assertTrue;
-import static junit.framework.Assert.fail;
 import junit.framework.Test;
 import org.netbeans.jellytools.EditorOperator;
 import org.netbeans.jemmy.JemmyProperties;
diff --git a/webcommon/javascript2.requirejs/test/qa-functional/src/org/netbeans/modules/javascript2/requirejs/navigate/NavigateTest.java b/webcommon/javascript2.requirejs/test/qa-functional/src/org/netbeans/modules/javascript2/requirejs/navigate/NavigateTest.java
index a6059b4..bad8719 100644
--- a/webcommon/javascript2.requirejs/test/qa-functional/src/org/netbeans/modules/javascript2/requirejs/navigate/NavigateTest.java
+++ b/webcommon/javascript2.requirejs/test/qa-functional/src/org/netbeans/modules/javascript2/requirejs/navigate/NavigateTest.java
@@ -20,8 +20,6 @@
 
 import java.awt.event.KeyEvent;
 import javax.swing.KeyStroke;
-import static junit.framework.Assert.assertTrue;
-import static junit.framework.Assert.fail;
 import junit.framework.Test;
 import org.netbeans.jellytools.EditorOperator;
 import org.netbeans.jemmy.JemmyProperties;
diff --git a/webcommon/javascript2.requirejs/test/unit/src/org/netbeans/modules/javascript2/requirejs/editor/RequireFileCodeCompletionBaseUrlTest.java b/webcommon/javascript2.requirejs/test/unit/src/org/netbeans/modules/javascript2/requirejs/editor/RequireFileCodeCompletionBaseUrlTest.java
index c62513b..380ab98 100644
--- a/webcommon/javascript2.requirejs/test/unit/src/org/netbeans/modules/javascript2/requirejs/editor/RequireFileCodeCompletionBaseUrlTest.java
+++ b/webcommon/javascript2.requirejs/test/unit/src/org/netbeans/modules/javascript2/requirejs/editor/RequireFileCodeCompletionBaseUrlTest.java
@@ -29,9 +29,6 @@
 import javax.swing.text.BadLocationException;
 import javax.swing.text.Document;
 import javax.swing.text.Position;
-import static junit.framework.Assert.assertEquals;
-import static junit.framework.Assert.assertNotNull;
-import static junit.framework.Assert.assertTrue;
 import org.netbeans.api.java.classpath.ClassPath;
 import org.netbeans.api.project.Project;
 import org.netbeans.editor.BaseDocument;
diff --git a/webcommon/javascript2.requirejs/test/unit/src/org/netbeans/modules/javascript2/requirejs/editor/RequireFileCodeCompletionTest.java b/webcommon/javascript2.requirejs/test/unit/src/org/netbeans/modules/javascript2/requirejs/editor/RequireFileCodeCompletionTest.java
index 6f22200..c7ecab4 100644
--- a/webcommon/javascript2.requirejs/test/unit/src/org/netbeans/modules/javascript2/requirejs/editor/RequireFileCodeCompletionTest.java
+++ b/webcommon/javascript2.requirejs/test/unit/src/org/netbeans/modules/javascript2/requirejs/editor/RequireFileCodeCompletionTest.java
@@ -30,9 +30,6 @@
 import javax.swing.text.BadLocationException;
 import javax.swing.text.Document;
 import javax.swing.text.Position;
-import static junit.framework.Assert.assertEquals;
-import static junit.framework.Assert.assertNotNull;
-import static junit.framework.Assert.assertTrue;
 import org.netbeans.api.java.classpath.ClassPath;
 import org.netbeans.api.project.Project;
 import org.netbeans.editor.BaseDocument;
diff --git a/webcommon/selenium2.webclient/test/unit/src/org/netbeans/modules/selenium2/webclient/api/TestRunnerReporterTest.java b/webcommon/selenium2.webclient/test/unit/src/org/netbeans/modules/selenium2/webclient/api/TestRunnerReporterTest.java
index a4a8741..1dbb497 100644
--- a/webcommon/selenium2.webclient/test/unit/src/org/netbeans/modules/selenium2/webclient/api/TestRunnerReporterTest.java
+++ b/webcommon/selenium2.webclient/test/unit/src/org/netbeans/modules/selenium2/webclient/api/TestRunnerReporterTest.java
@@ -20,8 +20,6 @@
 
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
-import static junit.framework.Assert.assertEquals;
-import static junit.framework.Assert.assertTrue;
 import junit.framework.TestCase;
 import org.junit.Test;
 
diff --git a/webcommon/web.clientproject/test/qa-functional/src/org/netbeans/test/html5/debug/XHRDebuggerTest.java b/webcommon/web.clientproject/test/qa-functional/src/org/netbeans/test/html5/debug/XHRDebuggerTest.java
index a459bba..822c206 100644
--- a/webcommon/web.clientproject/test/qa-functional/src/org/netbeans/test/html5/debug/XHRDebuggerTest.java
+++ b/webcommon/web.clientproject/test/qa-functional/src/org/netbeans/test/html5/debug/XHRDebuggerTest.java
@@ -19,7 +19,6 @@
 package org.netbeans.test.html5.debug;
 
 import java.util.logging.Level;
-import static junit.framework.Assert.assertEquals;
 import junit.framework.Test;
 import org.netbeans.jellytools.EditorOperator;
 import org.netbeans.jellytools.EditorWindowOperator;