You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@plc4x.apache.org by cd...@apache.org on 2019/06/19 10:10:41 UTC

[plc4x] 02/02: - Major refactoring of the code generator -- Split up the plugin and the imaginary format parser -- Renamed the imaginary format parser to "MSpec" parser (Message Spec) -- Split up the java template into a java template and a freemarker template base -- Moved the modules that will be released separately into an external directory -- Changed the inheritance and versions of the modules staying in the main plc4x repo back to 0.5.0-SNAPSHOT and included them back into the normal build

This is an automated email from the ASF dual-hosted git repository.

cdutz pushed a commit to branch develop
in repository https://gitbox.apache.org/repos/asf/plc4x.git

commit 8b94bfe9ae705e8a4d1e715de9302c71b8725d1d
Author: Christofer Dutz <ch...@c-ware.de>
AuthorDate: Wed Jun 19 12:10:29 2019 +0200

    - Major refactoring of the code generator
    -- Split up the plugin and the imaginary format parser
    -- Renamed the imaginary format parser to "MSpec" parser (Message Spec)
    -- Split up the java template into a java template and a freemarker template base
    -- Moved the modules that will be released separately into an external directory
    -- Changed the inheritance and versions of the modules staying in the main plc4x repo back to 0.5.0-SNAPSHOT and included them back into the normal build
---
 Jenkinsfile                                        |  2 +-
 pom.xml                                            |  1 +
 sandbox/code-generation/driver-base-java/pom.xml   |  2 +-
 .../{ => external}/language-base/pom.xml           |  7 ++
 .../codegenerator}/language/LanguageOutput.java    |  6 +-
 .../{ => external}/plc4x-maven-plugin/pom.xml      | 19 -----
 .../plc4x-maven-plugin/src/it/settings.xml         |  0
 .../plc4x-maven-plugin/src/it/simple-it/pom.xml    |  0
 .../src/main/resources/test/protocol.dfdl.xsd      |  0
 .../src/it/simple-it/verify.groovy                 |  0
 .../plc4x/plugins/codegenerator/GenerateMojo.java  | 20 ++---
 .../src/site/asciidoc/index.adoc                   |  0
 .../src/site/asciidoc/message-format-language.adoc |  0
 .../plugins/codegenerator/GenerateMojoTest.java    |  0
 .../test/projects/simple-embedded-schema/pom.xml   |  0
 .../src/main/resources/protocol.spec               |  0
 .../src/main/resources/template.ftlh               |  0
 .../src/test/resources/specs/s7.spec               |  0
 sandbox/code-generation/{ => external}/pom.xml     | 16 +---
 .../{ => external}/protocol-base/pom.xml           |  8 ++
 .../plugins/codegenerator}/protocol/Protocol.java  | 14 ++--
 .../{protocol-base => external/types-base}/pom.xml |  6 +-
 .../codegenerator/types}/definitions/Argument.java |  4 +-
 .../types}/definitions/ComplexTypeDefinition.java  | 10 +--
 .../DiscriminatedComplexTypeDefinition.java        |  2 +-
 .../types}/definitions/EnumTypeDefinition.java     |  2 +-
 .../types}/definitions/TypeDefinition.java         |  2 +-
 .../types}/exceptions/GenerationException.java     |  2 +-
 .../codegenerator/types}/fields/ArrayField.java    |  4 +-
 .../codegenerator/types}/fields/ConstField.java    |  4 +-
 .../types}/fields/DiscriminatorField.java          |  2 +-
 .../plugins/codegenerator/types}/fields/Field.java |  2 +-
 .../codegenerator/types}/fields/ImplicitField.java |  4 +-
 .../codegenerator/types}/fields/OptionalField.java |  4 +-
 .../codegenerator/types}/fields/PropertyField.java |  2 +-
 .../codegenerator/types}/fields/ReservedField.java |  2 +-
 .../codegenerator/types}/fields/SimpleField.java   |  2 +-
 .../codegenerator/types}/fields/SwitchField.java   |  4 +-
 .../codegenerator/types}/fields/TypedField.java    |  4 +-
 .../types}/references/ComplexTypeReference.java    |  2 +-
 .../types}/references/SimpleTypeReference.java     |  2 +-
 .../references/SimpleVarLengthTypeReference.java   |  2 +-
 .../types}/references/TypeReference.java           |  2 +-
 .../codegenerator/types}/terms/BinaryTerm.java     |  2 +-
 .../codegenerator/types}/terms/BooleanLiteral.java |  2 +-
 .../codegenerator/types}/terms/Literal.java        |  2 +-
 .../codegenerator/types}/terms/NullLiteral.java    |  2 +-
 .../codegenerator/types}/terms/NumericLiteral.java |  2 +-
 .../codegenerator/types}/terms/StringLiteral.java  |  2 +-
 .../plugins/codegenerator/types}/terms/Term.java   |  2 +-
 .../codegenerator/types}/terms/TernaryTerm.java    |  2 +-
 .../codegenerator/types}/terms/UnaryTerm.java      |  2 +-
 .../types}/terms/VariableLiteral.java              |  2 +-
 .../pom.xml                                        |  8 +-
 .../freemarker/FreemarkerLanguageOutput.java}      | 37 ++++-----
 .../FreemarkerLanguageTemplateHelper.java}         |  7 +-
 .../pom.xml                                        | 13 +++-
 .../plc4x/language/java/JavaLanguageOutput.java    | 47 ++++++++++++
 .../language/java/JavaLanguageTemplateHelper.java  | 22 +++---
 ....plugins.codegenerator.language.LanguageOutput} |  0
 .../main/resources/templates/java/io-template.ftlh |  0
 .../resources/templates/java/pojo-template.ftlh    |  0
 .../parser/ManualExpressionParserTest.java         | 37 ---------
 .../parser/ManualMessageFormatParserTest.java      | 36 ---------
 sandbox/code-generation/pom.xml                    | 86 ++-------------------
 .../pom.xml                                        | 45 ++++++-----
 .../plugins/codegenerator/language/mspec/MSpec.g4} |  2 +-
 .../language/mspec}/expression/Expression.g4       |  0
 .../expression/ExpressionStringListener.java       |  6 +-
 .../mspec}/expression/ExpressionStringParser.java  |  6 +-
 .../definitions/DefaultComplexTypeDefinition.java  | 24 +++---
 .../DefaultDiscriminatedComplexTypeDefinition.java |  8 +-
 .../definitions/DefaultEnumTypeDefinition.java     | 10 +--
 .../model/definitions/DefaultTypeDefinition.java   |  7 +-
 .../mspec}/model/fields/DefaultArrayField.java     |  8 +-
 .../mspec}/model/fields/DefaultConstField.java     |  6 +-
 .../model/fields/DefaultDiscriminatorField.java    |  6 +-
 .../mspec}/model/fields/DefaultImplicitField.java  |  8 +-
 .../mspec}/model/fields/DefaultOptionalField.java  |  8 +-
 .../mspec}/model/fields/DefaultReservedField.java  |  6 +-
 .../mspec}/model/fields/DefaultSimpleField.java    |  6 +-
 .../mspec}/model/fields/DefaultSwitchField.java    |  7 +-
 .../references/DefaultComplexTypeReference.java    |  4 +-
 .../references/DefaultSimpleTypeReference.java     |  4 +-
 .../DefaultSimpleVarLengthTypeReference.java       |  4 +-
 .../mspec}/parser/MessageFormatListener.java       | 88 +++++++++++-----------
 .../mspec}/parser/MessageFormatParser.java         | 12 +--
 .../src}/remote-resources/LICENSE                  |  0
 .../src}/remote-resources/UNLICENSE                |  0
 sandbox/code-generation/protocol-s7/pom.xml        |  7 +-
 .../org/apache/plc4x/protocol/s7/S7Protocol.java   | 14 +++-
 ....plc4x.plugins.codegenerator.protocol.Protocol} |  0
 sandbox/pom.xml                                    |  1 +
 93 files changed, 341 insertions(+), 434 deletions(-)

diff --git a/Jenkinsfile b/Jenkinsfile
index aa80126..3b7e47b 100644
--- a/Jenkinsfile
+++ b/Jenkinsfile
@@ -81,7 +81,7 @@ pipeline {
         stage('Build Maven Plugin') {
             steps {
                 echo 'Building Maven Plugin'
-                sh 'mvn -f sandbox/code-generation/pom.xml -P${JENKINS_PROFILE} ${MVN_TEST_FAIL_IGNORE} ${MVN_LOCAL_REPO_OPT} clean install'
+                sh 'mvn -f sandbox/code-generation/external/pom.xml -P${JENKINS_PROFILE} ${MVN_TEST_FAIL_IGNORE} ${MVN_LOCAL_REPO_OPT} clean install'
             }
             post {
                 always {
diff --git a/pom.xml b/pom.xml
index e53e289..602efc6 100644
--- a/pom.xml
+++ b/pom.xml
@@ -102,6 +102,7 @@
     <!-- Exclude all generated code -->
     <sonar.exclusions>**/generated-sources</sonar.exclusions>
 
+    <antlr.version>4.7.2</antlr.version>
     <asm.version>5.0.4</asm.version>
     <assertj.version>3.11.1</assertj.version>
     <bouncycastle.version>1.60</bouncycastle.version>
diff --git a/sandbox/code-generation/driver-base-java/pom.xml b/sandbox/code-generation/driver-base-java/pom.xml
index 5924878..c64f2a9 100644
--- a/sandbox/code-generation/driver-base-java/pom.xml
+++ b/sandbox/code-generation/driver-base-java/pom.xml
@@ -24,7 +24,7 @@
   <parent>
     <groupId>org.apache.plc4x.plugins</groupId>
     <artifactId>plc4x-code-generaton</artifactId>
-    <version>1.0.0-SNAPSHOT</version>
+    <version>0.5.0-SNAPSHOT</version>
   </parent>
 
   <artifactId>plc4x-code-generation-driver-base-java</artifactId>
diff --git a/sandbox/code-generation/language-base/pom.xml b/sandbox/code-generation/external/language-base/pom.xml
similarity index 86%
rename from sandbox/code-generation/language-base/pom.xml
rename to sandbox/code-generation/external/language-base/pom.xml
index ad822ea..8896b2b 100644
--- a/sandbox/code-generation/language-base/pom.xml
+++ b/sandbox/code-generation/external/language-base/pom.xml
@@ -32,4 +32,11 @@
   <name>Sandbox: Code Generation: Language Template Base</name>
   <description>Base stuff for building language templates</description>
 
+  <dependencies>
+    <dependency>
+      <groupId>org.apache.plc4x.plugins</groupId>
+      <artifactId>plc4x-code-generation-types-base</artifactId>
+      <version>1.0.0-SNAPSHOT</version>
+    </dependency>
+  </dependencies>
 </project>
\ No newline at end of file
diff --git a/sandbox/code-generation/language-base/src/main/java/org/apache/plc4x/language/LanguageOutput.java b/sandbox/code-generation/external/language-base/src/main/java/org/apache/plc4x/plugins/codegenerator/language/LanguageOutput.java
similarity index 83%
rename from sandbox/code-generation/language-base/src/main/java/org/apache/plc4x/language/LanguageOutput.java
rename to sandbox/code-generation/external/language-base/src/main/java/org/apache/plc4x/plugins/codegenerator/language/LanguageOutput.java
index 2aab9af..c190a6f 100644
--- a/sandbox/code-generation/language-base/src/main/java/org/apache/plc4x/language/LanguageOutput.java
+++ b/sandbox/code-generation/external/language-base/src/main/java/org/apache/plc4x/plugins/codegenerator/language/LanguageOutput.java
@@ -17,10 +17,10 @@
  under the License.
  */
 
-package org.apache.plc4x.language;
+package org.apache.plc4x.plugins.codegenerator.language;
 
-import org.apache.plc4x.language.exceptions.GenerationException;
-import org.apache.plc4x.language.definitions.ComplexTypeDefinition;
+import org.apache.plc4x.plugins.codegenerator.types.definitions.ComplexTypeDefinition;
+import org.apache.plc4x.plugins.codegenerator.types.exceptions.GenerationException;
 
 import java.io.File;
 import java.util.Map;
diff --git a/sandbox/code-generation/plc4x-maven-plugin/pom.xml b/sandbox/code-generation/external/plc4x-maven-plugin/pom.xml
similarity index 91%
rename from sandbox/code-generation/plc4x-maven-plugin/pom.xml
rename to sandbox/code-generation/external/plc4x-maven-plugin/pom.xml
index 02b9d11..5b7c946 100644
--- a/sandbox/code-generation/plc4x-maven-plugin/pom.xml
+++ b/sandbox/code-generation/external/plc4x-maven-plugin/pom.xml
@@ -46,11 +46,6 @@
     </dependency>
 
     <dependency>
-      <groupId>org.antlr</groupId>
-      <artifactId>antlr4-runtime</artifactId>
-      <version>${antlr.version}</version>
-    </dependency>
-    <dependency>
       <groupId>commons-beanutils</groupId>
       <artifactId>commons-beanutils</artifactId>
       <version>1.9.3</version>
@@ -109,20 +104,6 @@
   <build>
     <plugins>
       <plugin>
-        <groupId>org.antlr</groupId>
-        <artifactId>antlr4-maven-plugin</artifactId>
-        <executions>
-          <execution>
-            <id>antlr</id>
-            <phase>generate-sources</phase>
-            <goals>
-              <goal>antlr4</goal>
-            </goals>
-          </execution>
-        </executions>
-      </plugin>
-
-      <plugin>
         <groupId>org.apache.maven.plugins</groupId>
         <artifactId>maven-compiler-plugin</artifactId>
       </plugin>
diff --git a/sandbox/code-generation/plc4x-maven-plugin/src/it/settings.xml b/sandbox/code-generation/external/plc4x-maven-plugin/src/it/settings.xml
similarity index 100%
rename from sandbox/code-generation/plc4x-maven-plugin/src/it/settings.xml
rename to sandbox/code-generation/external/plc4x-maven-plugin/src/it/settings.xml
diff --git a/sandbox/code-generation/plc4x-maven-plugin/src/it/simple-it/pom.xml b/sandbox/code-generation/external/plc4x-maven-plugin/src/it/simple-it/pom.xml
similarity index 100%
rename from sandbox/code-generation/plc4x-maven-plugin/src/it/simple-it/pom.xml
rename to sandbox/code-generation/external/plc4x-maven-plugin/src/it/simple-it/pom.xml
diff --git a/sandbox/code-generation/plc4x-maven-plugin/src/it/simple-it/src/main/resources/test/protocol.dfdl.xsd b/sandbox/code-generation/external/plc4x-maven-plugin/src/it/simple-it/src/main/resources/test/protocol.dfdl.xsd
similarity index 100%
rename from sandbox/code-generation/plc4x-maven-plugin/src/it/simple-it/src/main/resources/test/protocol.dfdl.xsd
rename to sandbox/code-generation/external/plc4x-maven-plugin/src/it/simple-it/src/main/resources/test/protocol.dfdl.xsd
diff --git a/sandbox/code-generation/plc4x-maven-plugin/src/it/simple-it/verify.groovy b/sandbox/code-generation/external/plc4x-maven-plugin/src/it/simple-it/verify.groovy
similarity index 100%
rename from sandbox/code-generation/plc4x-maven-plugin/src/it/simple-it/verify.groovy
rename to sandbox/code-generation/external/plc4x-maven-plugin/src/it/simple-it/verify.groovy
diff --git a/sandbox/code-generation/plc4x-maven-plugin/src/main/java/org/apache/plc4x/plugins/codegenerator/GenerateMojo.java b/sandbox/code-generation/external/plc4x-maven-plugin/src/main/java/org/apache/plc4x/plugins/codegenerator/GenerateMojo.java
similarity index 87%
rename from sandbox/code-generation/plc4x-maven-plugin/src/main/java/org/apache/plc4x/plugins/codegenerator/GenerateMojo.java
rename to sandbox/code-generation/external/plc4x-maven-plugin/src/main/java/org/apache/plc4x/plugins/codegenerator/GenerateMojo.java
index 516b789..1d11d3f 100644
--- a/sandbox/code-generation/plc4x-maven-plugin/src/main/java/org/apache/plc4x/plugins/codegenerator/GenerateMojo.java
+++ b/sandbox/code-generation/external/plc4x-maven-plugin/src/main/java/org/apache/plc4x/plugins/codegenerator/GenerateMojo.java
@@ -26,11 +26,10 @@ import org.apache.maven.plugins.annotations.Mojo;
 import org.apache.maven.plugins.annotations.Parameter;
 import org.apache.maven.plugins.annotations.ResolutionScope;
 import org.apache.maven.project.MavenProject;
-import org.apache.plc4x.language.LanguageOutput;
-import org.apache.plc4x.language.exceptions.GenerationException;
-import org.apache.plc4x.language.definitions.ComplexTypeDefinition;
-import org.apache.plc4x.plugins.codegenerator.parser.MessageFormatParser;
-import org.apache.plc4x.protocol.Protocol;
+import org.apache.plc4x.plugins.codegenerator.language.LanguageOutput;
+import org.apache.plc4x.plugins.codegenerator.types.definitions.ComplexTypeDefinition;
+import org.apache.plc4x.plugins.codegenerator.types.exceptions.GenerationException;
+import org.apache.plc4x.plugins.codegenerator.protocol.Protocol;
 
 import java.io.*;
 import java.net.MalformedURLException;
@@ -123,14 +122,11 @@ public class GenerateMojo extends AbstractMojo {
                 "Unable to find language output module '" + languageName + "' on modules classpath");
         }
 
-        // Try loading the file directly (Without classloader)
-        InputStream schemaInputStream = protocol.getMessageFormatSchema();
-        if(schemaInputStream == null) {
-            throw new MojoExecutionException("Error loading message-format schema for protocol '" + protocolName + "'");
-        }
-        Map<String, ComplexTypeDefinition> types = new MessageFormatParser().parse(schemaInputStream);
-
         try {
+            // Parse the type definitions.
+            Map<String, ComplexTypeDefinition> types = protocol.getTypeDefinitions();
+
+            // Generate output for the type definitions.
             language.generate(outputDir, "org.apache.plc4x." + languageName.toLowerCase() +
                 "." + protocolName.toLowerCase(), types);
         } catch (GenerationException e) {
diff --git a/sandbox/code-generation/plc4x-maven-plugin/src/site/asciidoc/index.adoc b/sandbox/code-generation/external/plc4x-maven-plugin/src/site/asciidoc/index.adoc
similarity index 100%
rename from sandbox/code-generation/plc4x-maven-plugin/src/site/asciidoc/index.adoc
rename to sandbox/code-generation/external/plc4x-maven-plugin/src/site/asciidoc/index.adoc
diff --git a/sandbox/code-generation/plc4x-maven-plugin/src/site/asciidoc/message-format-language.adoc b/sandbox/code-generation/external/plc4x-maven-plugin/src/site/asciidoc/message-format-language.adoc
similarity index 100%
rename from sandbox/code-generation/plc4x-maven-plugin/src/site/asciidoc/message-format-language.adoc
rename to sandbox/code-generation/external/plc4x-maven-plugin/src/site/asciidoc/message-format-language.adoc
diff --git a/sandbox/code-generation/plc4x-maven-plugin/src/test/java/org/apache/plc4x/plugins/codegenerator/GenerateMojoTest.java b/sandbox/code-generation/external/plc4x-maven-plugin/src/test/java/org/apache/plc4x/plugins/codegenerator/GenerateMojoTest.java
similarity index 100%
rename from sandbox/code-generation/plc4x-maven-plugin/src/test/java/org/apache/plc4x/plugins/codegenerator/GenerateMojoTest.java
rename to sandbox/code-generation/external/plc4x-maven-plugin/src/test/java/org/apache/plc4x/plugins/codegenerator/GenerateMojoTest.java
diff --git a/sandbox/code-generation/plc4x-maven-plugin/src/test/projects/simple-embedded-schema/pom.xml b/sandbox/code-generation/external/plc4x-maven-plugin/src/test/projects/simple-embedded-schema/pom.xml
similarity index 100%
rename from sandbox/code-generation/plc4x-maven-plugin/src/test/projects/simple-embedded-schema/pom.xml
rename to sandbox/code-generation/external/plc4x-maven-plugin/src/test/projects/simple-embedded-schema/pom.xml
diff --git a/sandbox/code-generation/plc4x-maven-plugin/src/test/projects/simple-embedded-schema/src/main/resources/protocol.spec b/sandbox/code-generation/external/plc4x-maven-plugin/src/test/projects/simple-embedded-schema/src/main/resources/protocol.spec
similarity index 100%
rename from sandbox/code-generation/plc4x-maven-plugin/src/test/projects/simple-embedded-schema/src/main/resources/protocol.spec
rename to sandbox/code-generation/external/plc4x-maven-plugin/src/test/projects/simple-embedded-schema/src/main/resources/protocol.spec
diff --git a/sandbox/code-generation/plc4x-maven-plugin/src/test/projects/simple-embedded-schema/src/main/resources/template.ftlh b/sandbox/code-generation/external/plc4x-maven-plugin/src/test/projects/simple-embedded-schema/src/main/resources/template.ftlh
similarity index 100%
rename from sandbox/code-generation/plc4x-maven-plugin/src/test/projects/simple-embedded-schema/src/main/resources/template.ftlh
rename to sandbox/code-generation/external/plc4x-maven-plugin/src/test/projects/simple-embedded-schema/src/main/resources/template.ftlh
diff --git a/sandbox/code-generation/plc4x-maven-plugin/src/test/resources/specs/s7.spec b/sandbox/code-generation/external/plc4x-maven-plugin/src/test/resources/specs/s7.spec
similarity index 100%
rename from sandbox/code-generation/plc4x-maven-plugin/src/test/resources/specs/s7.spec
rename to sandbox/code-generation/external/plc4x-maven-plugin/src/test/resources/specs/s7.spec
diff --git a/sandbox/code-generation/pom.xml b/sandbox/code-generation/external/pom.xml
similarity index 92%
copy from sandbox/code-generation/pom.xml
copy to sandbox/code-generation/external/pom.xml
index dd40660..b15d1e7 100644
--- a/sandbox/code-generation/pom.xml
+++ b/sandbox/code-generation/external/pom.xml
@@ -34,15 +34,15 @@
   </parent>
 
   <groupId>org.apache.plc4x.plugins</groupId>
-  <artifactId>plc4x-code-generaton</artifactId>
+  <artifactId>plc4x-code-generaton-external</artifactId>
   <version>1.0.0-SNAPSHOT</version>
   <packaging>pom</packaging>
 
-  <name>Sandbox: Code Generation</name>
+  <name>Sandbox: Code Generation: External</name>
+  <description>This module groups all the modules that will be moved outside the core repository.</description>
 
   <properties>
     <maven.version>3.3.9</maven.version>
-    <antlr.version>4.7.2</antlr.version>
     <java.version>1.8</java.version>
   </properties>
 
@@ -51,18 +51,10 @@
   </prerequisites>
 
   <modules>
+    <module>types-base</module>
     <module>language-base</module>
     <module>protocol-base</module>
-
     <module>plc4x-maven-plugin</module>
-
-    <module>language-template-java</module>
-
-    <module>protocol-s7</module>
-
-    <module>driver-base-java</module>
-
-    <!--module>test-java-s7-driver</module-->
   </modules>
 
   <build>
diff --git a/sandbox/code-generation/protocol-base/pom.xml b/sandbox/code-generation/external/protocol-base/pom.xml
similarity index 85%
copy from sandbox/code-generation/protocol-base/pom.xml
copy to sandbox/code-generation/external/protocol-base/pom.xml
index 0ad89fe..c8ea9a4 100644
--- a/sandbox/code-generation/protocol-base/pom.xml
+++ b/sandbox/code-generation/external/protocol-base/pom.xml
@@ -32,4 +32,12 @@
   <name>Sandbox: Code Generation: Protocol Base</name>
   <description>Base stuff for building protocols</description>
 
+  <dependencies>
+    <dependency>
+      <groupId>org.apache.plc4x.plugins</groupId>
+      <artifactId>plc4x-code-generation-types-base</artifactId>
+      <version>1.0.0-SNAPSHOT</version>
+    </dependency>
+  </dependencies>
+
 </project>
\ No newline at end of file
diff --git a/sandbox/code-generation/protocol-base/src/main/java/org/apache/plc4x/protocol/Protocol.java b/sandbox/code-generation/external/protocol-base/src/main/java/org/apache/plc4x/plugins/codegenerator/protocol/Protocol.java
similarity index 64%
rename from sandbox/code-generation/protocol-base/src/main/java/org/apache/plc4x/protocol/Protocol.java
rename to sandbox/code-generation/external/protocol-base/src/main/java/org/apache/plc4x/plugins/codegenerator/protocol/Protocol.java
index b329c1a..a55b5ad 100644
--- a/sandbox/code-generation/protocol-base/src/main/java/org/apache/plc4x/protocol/Protocol.java
+++ b/sandbox/code-generation/external/protocol-base/src/main/java/org/apache/plc4x/plugins/codegenerator/protocol/Protocol.java
@@ -17,9 +17,12 @@
  under the License.
  */
 
-package org.apache.plc4x.protocol;
+package org.apache.plc4x.plugins.codegenerator.protocol;
 
-import java.io.InputStream;
+import org.apache.plc4x.plugins.codegenerator.types.definitions.ComplexTypeDefinition;
+import org.apache.plc4x.plugins.codegenerator.types.exceptions.GenerationException;
+
+import java.util.Map;
 
 public interface Protocol {
 
@@ -31,10 +34,11 @@ public interface Protocol {
     String getName();
 
     /**
-     * Returns an InputStream to the spec that defines the message format of packets of the current driver.
+     * Returns a map of complex type definitions for which code has to be generated.
      *
-     * @return the InputStream for reading the message format spec for the current driver.
+     * @return the Map of types that need to be generated.
+     * @throws GenerationException if anything goes wrong parsing.
      */
-    InputStream getMessageFormatSchema();
+    Map<String, ComplexTypeDefinition> getTypeDefinitions() throws GenerationException;
 
 }
diff --git a/sandbox/code-generation/protocol-base/pom.xml b/sandbox/code-generation/external/types-base/pom.xml
similarity index 86%
rename from sandbox/code-generation/protocol-base/pom.xml
rename to sandbox/code-generation/external/types-base/pom.xml
index 0ad89fe..d5f2aa9 100644
--- a/sandbox/code-generation/protocol-base/pom.xml
+++ b/sandbox/code-generation/external/types-base/pom.xml
@@ -27,9 +27,9 @@
     <version>1.0.0-SNAPSHOT</version>
   </parent>
 
-  <artifactId>plc4x-code-generation-protocol-base</artifactId>
+  <artifactId>plc4x-code-generation-types-base</artifactId>
 
-  <name>Sandbox: Code Generation: Protocol Base</name>
-  <description>Base stuff for building protocols</description>
+  <name>Sandbox: Code Generation: Base Types</name>
+  <description>Base used throughout the code-generation.</description>
 
 </project>
\ No newline at end of file
diff --git a/sandbox/code-generation/language-base/src/main/java/org/apache/plc4x/language/definitions/Argument.java b/sandbox/code-generation/external/types-base/src/main/java/org/apache/plc4x/plugins/codegenerator/types/definitions/Argument.java
similarity index 88%
rename from sandbox/code-generation/language-base/src/main/java/org/apache/plc4x/language/definitions/Argument.java
rename to sandbox/code-generation/external/types-base/src/main/java/org/apache/plc4x/plugins/codegenerator/types/definitions/Argument.java
index 71432fe..3564015 100644
--- a/sandbox/code-generation/language-base/src/main/java/org/apache/plc4x/language/definitions/Argument.java
+++ b/sandbox/code-generation/external/types-base/src/main/java/org/apache/plc4x/plugins/codegenerator/types/definitions/Argument.java
@@ -17,9 +17,9 @@
  under the License.
  */
 
-package org.apache.plc4x.language.definitions;
+package org.apache.plc4x.plugins.codegenerator.types.definitions;
 
-import org.apache.plc4x.language.references.TypeReference;
+import org.apache.plc4x.plugins.codegenerator.types.references.TypeReference;
 
 public class Argument {
 
diff --git a/sandbox/code-generation/language-base/src/main/java/org/apache/plc4x/language/definitions/ComplexTypeDefinition.java b/sandbox/code-generation/external/types-base/src/main/java/org/apache/plc4x/plugins/codegenerator/types/definitions/ComplexTypeDefinition.java
similarity index 84%
rename from sandbox/code-generation/language-base/src/main/java/org/apache/plc4x/language/definitions/ComplexTypeDefinition.java
rename to sandbox/code-generation/external/types-base/src/main/java/org/apache/plc4x/plugins/codegenerator/types/definitions/ComplexTypeDefinition.java
index 4c61baa..81edc53 100644
--- a/sandbox/code-generation/language-base/src/main/java/org/apache/plc4x/language/definitions/ComplexTypeDefinition.java
+++ b/sandbox/code-generation/external/types-base/src/main/java/org/apache/plc4x/plugins/codegenerator/types/definitions/ComplexTypeDefinition.java
@@ -17,12 +17,12 @@
  under the License.
  */
 
-package org.apache.plc4x.language.definitions;
+package org.apache.plc4x.plugins.codegenerator.types.definitions;
 
-import org.apache.plc4x.language.fields.ConstField;
-import org.apache.plc4x.language.fields.Field;
-import org.apache.plc4x.language.fields.PropertyField;
-import org.apache.plc4x.language.fields.SimpleField;
+import org.apache.plc4x.plugins.codegenerator.types.fields.ConstField;
+import org.apache.plc4x.plugins.codegenerator.types.fields.Field;
+import org.apache.plc4x.plugins.codegenerator.types.fields.PropertyField;
+import org.apache.plc4x.plugins.codegenerator.types.fields.SimpleField;
 
 import java.util.List;
 
diff --git a/sandbox/code-generation/language-base/src/main/java/org/apache/plc4x/language/definitions/DiscriminatedComplexTypeDefinition.java b/sandbox/code-generation/external/types-base/src/main/java/org/apache/plc4x/plugins/codegenerator/types/definitions/DiscriminatedComplexTypeDefinition.java
similarity index 93%
rename from sandbox/code-generation/language-base/src/main/java/org/apache/plc4x/language/definitions/DiscriminatedComplexTypeDefinition.java
rename to sandbox/code-generation/external/types-base/src/main/java/org/apache/plc4x/plugins/codegenerator/types/definitions/DiscriminatedComplexTypeDefinition.java
index 1c874a5..f547354 100644
--- a/sandbox/code-generation/language-base/src/main/java/org/apache/plc4x/language/definitions/DiscriminatedComplexTypeDefinition.java
+++ b/sandbox/code-generation/external/types-base/src/main/java/org/apache/plc4x/plugins/codegenerator/types/definitions/DiscriminatedComplexTypeDefinition.java
@@ -17,7 +17,7 @@
  under the License.
  */
 
-package org.apache.plc4x.language.definitions;
+package org.apache.plc4x.plugins.codegenerator.types.definitions;
 
 public interface DiscriminatedComplexTypeDefinition extends ComplexTypeDefinition {
 
diff --git a/sandbox/code-generation/language-base/src/main/java/org/apache/plc4x/language/definitions/EnumTypeDefinition.java b/sandbox/code-generation/external/types-base/src/main/java/org/apache/plc4x/plugins/codegenerator/types/definitions/EnumTypeDefinition.java
similarity index 95%
rename from sandbox/code-generation/language-base/src/main/java/org/apache/plc4x/language/definitions/EnumTypeDefinition.java
rename to sandbox/code-generation/external/types-base/src/main/java/org/apache/plc4x/plugins/codegenerator/types/definitions/EnumTypeDefinition.java
index c493dd1..9153988 100644
--- a/sandbox/code-generation/language-base/src/main/java/org/apache/plc4x/language/definitions/EnumTypeDefinition.java
+++ b/sandbox/code-generation/external/types-base/src/main/java/org/apache/plc4x/plugins/codegenerator/types/definitions/EnumTypeDefinition.java
@@ -17,7 +17,7 @@
  under the License.
  */
 
-package org.apache.plc4x.language.definitions;
+package org.apache.plc4x.plugins.codegenerator.types.definitions;
 
 import java.util.List;
 
diff --git a/sandbox/code-generation/language-base/src/main/java/org/apache/plc4x/language/definitions/TypeDefinition.java b/sandbox/code-generation/external/types-base/src/main/java/org/apache/plc4x/plugins/codegenerator/types/definitions/TypeDefinition.java
similarity index 93%
rename from sandbox/code-generation/language-base/src/main/java/org/apache/plc4x/language/definitions/TypeDefinition.java
rename to sandbox/code-generation/external/types-base/src/main/java/org/apache/plc4x/plugins/codegenerator/types/definitions/TypeDefinition.java
index 2eddb9c..806436b 100644
--- a/sandbox/code-generation/language-base/src/main/java/org/apache/plc4x/language/definitions/TypeDefinition.java
+++ b/sandbox/code-generation/external/types-base/src/main/java/org/apache/plc4x/plugins/codegenerator/types/definitions/TypeDefinition.java
@@ -17,7 +17,7 @@
  under the License.
  */
 
-package org.apache.plc4x.language.definitions;
+package org.apache.plc4x.plugins.codegenerator.types.definitions;
 
 public interface TypeDefinition {
 
diff --git a/sandbox/code-generation/language-base/src/main/java/org/apache/plc4x/language/exceptions/GenerationException.java b/sandbox/code-generation/external/types-base/src/main/java/org/apache/plc4x/plugins/codegenerator/types/exceptions/GenerationException.java
similarity index 94%
rename from sandbox/code-generation/language-base/src/main/java/org/apache/plc4x/language/exceptions/GenerationException.java
rename to sandbox/code-generation/external/types-base/src/main/java/org/apache/plc4x/plugins/codegenerator/types/exceptions/GenerationException.java
index 80e782f..c387df1 100644
--- a/sandbox/code-generation/language-base/src/main/java/org/apache/plc4x/language/exceptions/GenerationException.java
+++ b/sandbox/code-generation/external/types-base/src/main/java/org/apache/plc4x/plugins/codegenerator/types/exceptions/GenerationException.java
@@ -17,7 +17,7 @@
  under the License.
  */
 
-package org.apache.plc4x.language.exceptions;
+package org.apache.plc4x.plugins.codegenerator.types.exceptions;
 
 public class GenerationException extends Exception {
 
diff --git a/sandbox/code-generation/language-base/src/main/java/org/apache/plc4x/language/fields/ArrayField.java b/sandbox/code-generation/external/types-base/src/main/java/org/apache/plc4x/plugins/codegenerator/types/fields/ArrayField.java
similarity index 89%
rename from sandbox/code-generation/language-base/src/main/java/org/apache/plc4x/language/fields/ArrayField.java
rename to sandbox/code-generation/external/types-base/src/main/java/org/apache/plc4x/plugins/codegenerator/types/fields/ArrayField.java
index b9042e1..2023e0c 100644
--- a/sandbox/code-generation/language-base/src/main/java/org/apache/plc4x/language/fields/ArrayField.java
+++ b/sandbox/code-generation/external/types-base/src/main/java/org/apache/plc4x/plugins/codegenerator/types/fields/ArrayField.java
@@ -17,10 +17,10 @@
  under the License.
  */
 
-package org.apache.plc4x.language.fields;
+package org.apache.plc4x.plugins.codegenerator.types.fields;
 
 
-import org.apache.plc4x.language.expressions.terms.Term;
+import org.apache.plc4x.plugins.codegenerator.types.terms.Term;
 
 public interface ArrayField extends PropertyField {
 
diff --git a/sandbox/code-generation/language-base/src/main/java/org/apache/plc4x/language/fields/ConstField.java b/sandbox/code-generation/external/types-base/src/main/java/org/apache/plc4x/plugins/codegenerator/types/fields/ConstField.java
similarity index 90%
rename from sandbox/code-generation/language-base/src/main/java/org/apache/plc4x/language/fields/ConstField.java
rename to sandbox/code-generation/external/types-base/src/main/java/org/apache/plc4x/plugins/codegenerator/types/fields/ConstField.java
index d1b6290..9c0029f 100644
--- a/sandbox/code-generation/language-base/src/main/java/org/apache/plc4x/language/fields/ConstField.java
+++ b/sandbox/code-generation/external/types-base/src/main/java/org/apache/plc4x/plugins/codegenerator/types/fields/ConstField.java
@@ -17,9 +17,7 @@
  under the License.
  */
 
-package org.apache.plc4x.language.fields;
-
-import org.apache.plc4x.language.references.TypeReference;
+package org.apache.plc4x.plugins.codegenerator.types.fields;
 
 public interface ConstField extends PropertyField {
 
diff --git a/sandbox/code-generation/language-base/src/main/java/org/apache/plc4x/language/fields/DiscriminatorField.java b/sandbox/code-generation/external/types-base/src/main/java/org/apache/plc4x/plugins/codegenerator/types/fields/DiscriminatorField.java
similarity index 93%
rename from sandbox/code-generation/language-base/src/main/java/org/apache/plc4x/language/fields/DiscriminatorField.java
rename to sandbox/code-generation/external/types-base/src/main/java/org/apache/plc4x/plugins/codegenerator/types/fields/DiscriminatorField.java
index f725598..c5c0552 100644
--- a/sandbox/code-generation/language-base/src/main/java/org/apache/plc4x/language/fields/DiscriminatorField.java
+++ b/sandbox/code-generation/external/types-base/src/main/java/org/apache/plc4x/plugins/codegenerator/types/fields/DiscriminatorField.java
@@ -17,7 +17,7 @@
  under the License.
  */
 
-package org.apache.plc4x.language.fields;
+package org.apache.plc4x.plugins.codegenerator.types.fields;
 
 public interface DiscriminatorField extends TypedField {
 
diff --git a/sandbox/code-generation/language-base/src/main/java/org/apache/plc4x/language/fields/Field.java b/sandbox/code-generation/external/types-base/src/main/java/org/apache/plc4x/plugins/codegenerator/types/fields/Field.java
similarity index 93%
rename from sandbox/code-generation/language-base/src/main/java/org/apache/plc4x/language/fields/Field.java
rename to sandbox/code-generation/external/types-base/src/main/java/org/apache/plc4x/plugins/codegenerator/types/fields/Field.java
index fa92e58..5863cc4 100644
--- a/sandbox/code-generation/language-base/src/main/java/org/apache/plc4x/language/fields/Field.java
+++ b/sandbox/code-generation/external/types-base/src/main/java/org/apache/plc4x/plugins/codegenerator/types/fields/Field.java
@@ -17,7 +17,7 @@
  under the License.
  */
 
-package org.apache.plc4x.language.fields;
+package org.apache.plc4x.plugins.codegenerator.types.fields;
 
 public interface Field {
 
diff --git a/sandbox/code-generation/language-base/src/main/java/org/apache/plc4x/language/fields/ImplicitField.java b/sandbox/code-generation/external/types-base/src/main/java/org/apache/plc4x/plugins/codegenerator/types/fields/ImplicitField.java
similarity index 88%
rename from sandbox/code-generation/language-base/src/main/java/org/apache/plc4x/language/fields/ImplicitField.java
rename to sandbox/code-generation/external/types-base/src/main/java/org/apache/plc4x/plugins/codegenerator/types/fields/ImplicitField.java
index 283d777..1cc5f97 100644
--- a/sandbox/code-generation/language-base/src/main/java/org/apache/plc4x/language/fields/ImplicitField.java
+++ b/sandbox/code-generation/external/types-base/src/main/java/org/apache/plc4x/plugins/codegenerator/types/fields/ImplicitField.java
@@ -17,9 +17,9 @@
  under the License.
  */
 
-package org.apache.plc4x.language.fields;
+package org.apache.plc4x.plugins.codegenerator.types.fields;
 
-import org.apache.plc4x.language.expressions.terms.Term;
+import org.apache.plc4x.plugins.codegenerator.types.terms.Term;
 
 public interface ImplicitField extends TypedField {
 
diff --git a/sandbox/code-generation/language-base/src/main/java/org/apache/plc4x/language/fields/OptionalField.java b/sandbox/code-generation/external/types-base/src/main/java/org/apache/plc4x/plugins/codegenerator/types/fields/OptionalField.java
similarity index 88%
rename from sandbox/code-generation/language-base/src/main/java/org/apache/plc4x/language/fields/OptionalField.java
rename to sandbox/code-generation/external/types-base/src/main/java/org/apache/plc4x/plugins/codegenerator/types/fields/OptionalField.java
index 1ede08b..ecef3be 100644
--- a/sandbox/code-generation/language-base/src/main/java/org/apache/plc4x/language/fields/OptionalField.java
+++ b/sandbox/code-generation/external/types-base/src/main/java/org/apache/plc4x/plugins/codegenerator/types/fields/OptionalField.java
@@ -17,10 +17,10 @@
  under the License.
  */
 
-package org.apache.plc4x.language.fields;
+package org.apache.plc4x.plugins.codegenerator.types.fields;
 
 
-import org.apache.plc4x.language.expressions.terms.Term;
+import org.apache.plc4x.plugins.codegenerator.types.terms.Term;
 
 public interface OptionalField extends PropertyField {
 
diff --git a/sandbox/code-generation/language-base/src/main/java/org/apache/plc4x/language/fields/PropertyField.java b/sandbox/code-generation/external/types-base/src/main/java/org/apache/plc4x/plugins/codegenerator/types/fields/PropertyField.java
similarity index 93%
rename from sandbox/code-generation/language-base/src/main/java/org/apache/plc4x/language/fields/PropertyField.java
rename to sandbox/code-generation/external/types-base/src/main/java/org/apache/plc4x/plugins/codegenerator/types/fields/PropertyField.java
index bda4a3e..b336f4f 100644
--- a/sandbox/code-generation/language-base/src/main/java/org/apache/plc4x/language/fields/PropertyField.java
+++ b/sandbox/code-generation/external/types-base/src/main/java/org/apache/plc4x/plugins/codegenerator/types/fields/PropertyField.java
@@ -17,7 +17,7 @@
  under the License.
  */
 
-package org.apache.plc4x.language.fields;
+package org.apache.plc4x.plugins.codegenerator.types.fields;
 
 public interface PropertyField extends TypedField {
 
diff --git a/sandbox/code-generation/language-base/src/main/java/org/apache/plc4x/language/fields/ReservedField.java b/sandbox/code-generation/external/types-base/src/main/java/org/apache/plc4x/plugins/codegenerator/types/fields/ReservedField.java
similarity index 93%
rename from sandbox/code-generation/language-base/src/main/java/org/apache/plc4x/language/fields/ReservedField.java
rename to sandbox/code-generation/external/types-base/src/main/java/org/apache/plc4x/plugins/codegenerator/types/fields/ReservedField.java
index e7644dd..5426d48 100644
--- a/sandbox/code-generation/language-base/src/main/java/org/apache/plc4x/language/fields/ReservedField.java
+++ b/sandbox/code-generation/external/types-base/src/main/java/org/apache/plc4x/plugins/codegenerator/types/fields/ReservedField.java
@@ -17,7 +17,7 @@
  under the License.
  */
 
-package org.apache.plc4x.language.fields;
+package org.apache.plc4x.plugins.codegenerator.types.fields;
 
 public interface ReservedField extends TypedField {
 
diff --git a/sandbox/code-generation/language-base/src/main/java/org/apache/plc4x/language/fields/SimpleField.java b/sandbox/code-generation/external/types-base/src/main/java/org/apache/plc4x/plugins/codegenerator/types/fields/SimpleField.java
similarity index 93%
rename from sandbox/code-generation/language-base/src/main/java/org/apache/plc4x/language/fields/SimpleField.java
rename to sandbox/code-generation/external/types-base/src/main/java/org/apache/plc4x/plugins/codegenerator/types/fields/SimpleField.java
index 73a34f0..966faac 100644
--- a/sandbox/code-generation/language-base/src/main/java/org/apache/plc4x/language/fields/SimpleField.java
+++ b/sandbox/code-generation/external/types-base/src/main/java/org/apache/plc4x/plugins/codegenerator/types/fields/SimpleField.java
@@ -17,7 +17,7 @@
  under the License.
  */
 
-package org.apache.plc4x.language.fields;
+package org.apache.plc4x.plugins.codegenerator.types.fields;
 
 public interface SimpleField extends PropertyField {
 
diff --git a/sandbox/code-generation/language-base/src/main/java/org/apache/plc4x/language/fields/SwitchField.java b/sandbox/code-generation/external/types-base/src/main/java/org/apache/plc4x/plugins/codegenerator/types/fields/SwitchField.java
similarity index 86%
rename from sandbox/code-generation/language-base/src/main/java/org/apache/plc4x/language/fields/SwitchField.java
rename to sandbox/code-generation/external/types-base/src/main/java/org/apache/plc4x/plugins/codegenerator/types/fields/SwitchField.java
index 5263b55..a6b4df7 100644
--- a/sandbox/code-generation/language-base/src/main/java/org/apache/plc4x/language/fields/SwitchField.java
+++ b/sandbox/code-generation/external/types-base/src/main/java/org/apache/plc4x/plugins/codegenerator/types/fields/SwitchField.java
@@ -17,9 +17,9 @@
  under the License.
  */
 
-package org.apache.plc4x.language.fields;
+package org.apache.plc4x.plugins.codegenerator.types.fields;
 
-import org.apache.plc4x.language.definitions.DiscriminatedComplexTypeDefinition;
+import org.apache.plc4x.plugins.codegenerator.types.definitions.DiscriminatedComplexTypeDefinition;
 
 import java.util.List;
 
diff --git a/sandbox/code-generation/language-base/src/main/java/org/apache/plc4x/language/fields/TypedField.java b/sandbox/code-generation/external/types-base/src/main/java/org/apache/plc4x/plugins/codegenerator/types/fields/TypedField.java
similarity index 86%
rename from sandbox/code-generation/language-base/src/main/java/org/apache/plc4x/language/fields/TypedField.java
rename to sandbox/code-generation/external/types-base/src/main/java/org/apache/plc4x/plugins/codegenerator/types/fields/TypedField.java
index e170f6b..4bb2006 100644
--- a/sandbox/code-generation/language-base/src/main/java/org/apache/plc4x/language/fields/TypedField.java
+++ b/sandbox/code-generation/external/types-base/src/main/java/org/apache/plc4x/plugins/codegenerator/types/fields/TypedField.java
@@ -17,9 +17,9 @@
  under the License.
  */
 
-package org.apache.plc4x.language.fields;
+package org.apache.plc4x.plugins.codegenerator.types.fields;
 
-import org.apache.plc4x.language.references.TypeReference;
+import org.apache.plc4x.plugins.codegenerator.types.references.TypeReference;
 
 public interface TypedField extends Field {
 
diff --git a/sandbox/code-generation/language-base/src/main/java/org/apache/plc4x/language/references/ComplexTypeReference.java b/sandbox/code-generation/external/types-base/src/main/java/org/apache/plc4x/plugins/codegenerator/types/references/ComplexTypeReference.java
similarity index 93%
rename from sandbox/code-generation/language-base/src/main/java/org/apache/plc4x/language/references/ComplexTypeReference.java
rename to sandbox/code-generation/external/types-base/src/main/java/org/apache/plc4x/plugins/codegenerator/types/references/ComplexTypeReference.java
index 7681f1d..bc760ea 100644
--- a/sandbox/code-generation/language-base/src/main/java/org/apache/plc4x/language/references/ComplexTypeReference.java
+++ b/sandbox/code-generation/external/types-base/src/main/java/org/apache/plc4x/plugins/codegenerator/types/references/ComplexTypeReference.java
@@ -17,7 +17,7 @@
  under the License.
  */
 
-package org.apache.plc4x.language.references;
+package org.apache.plc4x.plugins.codegenerator.types.references;
 
 public interface ComplexTypeReference extends TypeReference {
 
diff --git a/sandbox/code-generation/language-base/src/main/java/org/apache/plc4x/language/references/SimpleTypeReference.java b/sandbox/code-generation/external/types-base/src/main/java/org/apache/plc4x/plugins/codegenerator/types/references/SimpleTypeReference.java
similarity index 93%
rename from sandbox/code-generation/language-base/src/main/java/org/apache/plc4x/language/references/SimpleTypeReference.java
rename to sandbox/code-generation/external/types-base/src/main/java/org/apache/plc4x/plugins/codegenerator/types/references/SimpleTypeReference.java
index ad3eba9..834033d 100644
--- a/sandbox/code-generation/language-base/src/main/java/org/apache/plc4x/language/references/SimpleTypeReference.java
+++ b/sandbox/code-generation/external/types-base/src/main/java/org/apache/plc4x/plugins/codegenerator/types/references/SimpleTypeReference.java
@@ -17,7 +17,7 @@
  under the License.
  */
 
-package org.apache.plc4x.language.references;
+package org.apache.plc4x.plugins.codegenerator.types.references;
 
 public interface SimpleTypeReference extends TypeReference {
 
diff --git a/sandbox/code-generation/language-base/src/main/java/org/apache/plc4x/language/references/SimpleVarLengthTypeReference.java b/sandbox/code-generation/external/types-base/src/main/java/org/apache/plc4x/plugins/codegenerator/types/references/SimpleVarLengthTypeReference.java
similarity index 92%
rename from sandbox/code-generation/language-base/src/main/java/org/apache/plc4x/language/references/SimpleVarLengthTypeReference.java
rename to sandbox/code-generation/external/types-base/src/main/java/org/apache/plc4x/plugins/codegenerator/types/references/SimpleVarLengthTypeReference.java
index 8a07797..052ca91 100644
--- a/sandbox/code-generation/language-base/src/main/java/org/apache/plc4x/language/references/SimpleVarLengthTypeReference.java
+++ b/sandbox/code-generation/external/types-base/src/main/java/org/apache/plc4x/plugins/codegenerator/types/references/SimpleVarLengthTypeReference.java
@@ -17,7 +17,7 @@
  under the License.
  */
 
-package org.apache.plc4x.language.references;
+package org.apache.plc4x.plugins.codegenerator.types.references;
 
 public interface SimpleVarLengthTypeReference {
 
diff --git a/sandbox/code-generation/language-base/src/main/java/org/apache/plc4x/language/references/TypeReference.java b/sandbox/code-generation/external/types-base/src/main/java/org/apache/plc4x/plugins/codegenerator/types/references/TypeReference.java
similarity index 92%
rename from sandbox/code-generation/language-base/src/main/java/org/apache/plc4x/language/references/TypeReference.java
rename to sandbox/code-generation/external/types-base/src/main/java/org/apache/plc4x/plugins/codegenerator/types/references/TypeReference.java
index a4ad86d..3c33b3e 100644
--- a/sandbox/code-generation/language-base/src/main/java/org/apache/plc4x/language/references/TypeReference.java
+++ b/sandbox/code-generation/external/types-base/src/main/java/org/apache/plc4x/plugins/codegenerator/types/references/TypeReference.java
@@ -17,7 +17,7 @@
  under the License.
  */
 
-package org.apache.plc4x.language.references;
+package org.apache.plc4x.plugins.codegenerator.types.references;
 
 public interface TypeReference {
 
diff --git a/sandbox/code-generation/language-base/src/main/java/org/apache/plc4x/language/expressions/terms/BinaryTerm.java b/sandbox/code-generation/external/types-base/src/main/java/org/apache/plc4x/plugins/codegenerator/types/terms/BinaryTerm.java
similarity index 95%
rename from sandbox/code-generation/language-base/src/main/java/org/apache/plc4x/language/expressions/terms/BinaryTerm.java
rename to sandbox/code-generation/external/types-base/src/main/java/org/apache/plc4x/plugins/codegenerator/types/terms/BinaryTerm.java
index cbd9d50..534a8cb 100644
--- a/sandbox/code-generation/language-base/src/main/java/org/apache/plc4x/language/expressions/terms/BinaryTerm.java
+++ b/sandbox/code-generation/external/types-base/src/main/java/org/apache/plc4x/plugins/codegenerator/types/terms/BinaryTerm.java
@@ -17,7 +17,7 @@
  under the License.
  */
 
-package org.apache.plc4x.language.expressions.terms;
+package org.apache.plc4x.plugins.codegenerator.types.terms;
 
 public class BinaryTerm implements Term {
 
diff --git a/sandbox/code-generation/language-base/src/main/java/org/apache/plc4x/language/expressions/terms/BooleanLiteral.java b/sandbox/code-generation/external/types-base/src/main/java/org/apache/plc4x/plugins/codegenerator/types/terms/BooleanLiteral.java
similarity index 94%
rename from sandbox/code-generation/language-base/src/main/java/org/apache/plc4x/language/expressions/terms/BooleanLiteral.java
rename to sandbox/code-generation/external/types-base/src/main/java/org/apache/plc4x/plugins/codegenerator/types/terms/BooleanLiteral.java
index 24753c5..2ae9283 100644
--- a/sandbox/code-generation/language-base/src/main/java/org/apache/plc4x/language/expressions/terms/BooleanLiteral.java
+++ b/sandbox/code-generation/external/types-base/src/main/java/org/apache/plc4x/plugins/codegenerator/types/terms/BooleanLiteral.java
@@ -17,7 +17,7 @@
  under the License.
  */
 
-package org.apache.plc4x.language.expressions.terms;
+package org.apache.plc4x.plugins.codegenerator.types.terms;
 
 public class BooleanLiteral implements Literal {
 
diff --git a/sandbox/code-generation/language-base/src/main/java/org/apache/plc4x/language/expressions/terms/Literal.java b/sandbox/code-generation/external/types-base/src/main/java/org/apache/plc4x/plugins/codegenerator/types/terms/Literal.java
similarity index 93%
rename from sandbox/code-generation/language-base/src/main/java/org/apache/plc4x/language/expressions/terms/Literal.java
rename to sandbox/code-generation/external/types-base/src/main/java/org/apache/plc4x/plugins/codegenerator/types/terms/Literal.java
index 4b8eff8..225ec37 100644
--- a/sandbox/code-generation/language-base/src/main/java/org/apache/plc4x/language/expressions/terms/Literal.java
+++ b/sandbox/code-generation/external/types-base/src/main/java/org/apache/plc4x/plugins/codegenerator/types/terms/Literal.java
@@ -17,7 +17,7 @@
  under the License.
  */
 
-package org.apache.plc4x.language.expressions.terms;
+package org.apache.plc4x.plugins.codegenerator.types.terms;
 
 public interface Literal extends Term {
 }
diff --git a/sandbox/code-generation/language-base/src/main/java/org/apache/plc4x/language/expressions/terms/NullLiteral.java b/sandbox/code-generation/external/types-base/src/main/java/org/apache/plc4x/plugins/codegenerator/types/terms/NullLiteral.java
similarity index 94%
rename from sandbox/code-generation/language-base/src/main/java/org/apache/plc4x/language/expressions/terms/NullLiteral.java
rename to sandbox/code-generation/external/types-base/src/main/java/org/apache/plc4x/plugins/codegenerator/types/terms/NullLiteral.java
index c38bb49..153acc7 100644
--- a/sandbox/code-generation/language-base/src/main/java/org/apache/plc4x/language/expressions/terms/NullLiteral.java
+++ b/sandbox/code-generation/external/types-base/src/main/java/org/apache/plc4x/plugins/codegenerator/types/terms/NullLiteral.java
@@ -17,7 +17,7 @@
  under the License.
  */
 
-package org.apache.plc4x.language.expressions.terms;
+package org.apache.plc4x.plugins.codegenerator.types.terms;
 
 public class NullLiteral implements Literal {
 
diff --git a/sandbox/code-generation/language-base/src/main/java/org/apache/plc4x/language/expressions/terms/NumericLiteral.java b/sandbox/code-generation/external/types-base/src/main/java/org/apache/plc4x/plugins/codegenerator/types/terms/NumericLiteral.java
similarity index 94%
rename from sandbox/code-generation/language-base/src/main/java/org/apache/plc4x/language/expressions/terms/NumericLiteral.java
rename to sandbox/code-generation/external/types-base/src/main/java/org/apache/plc4x/plugins/codegenerator/types/terms/NumericLiteral.java
index fc99dc8..320421c 100644
--- a/sandbox/code-generation/language-base/src/main/java/org/apache/plc4x/language/expressions/terms/NumericLiteral.java
+++ b/sandbox/code-generation/external/types-base/src/main/java/org/apache/plc4x/plugins/codegenerator/types/terms/NumericLiteral.java
@@ -17,7 +17,7 @@
  under the License.
  */
 
-package org.apache.plc4x.language.expressions.terms;
+package org.apache.plc4x.plugins.codegenerator.types.terms;
 
 public class NumericLiteral implements Literal {
 
diff --git a/sandbox/code-generation/language-base/src/main/java/org/apache/plc4x/language/expressions/terms/StringLiteral.java b/sandbox/code-generation/external/types-base/src/main/java/org/apache/plc4x/plugins/codegenerator/types/terms/StringLiteral.java
similarity index 94%
rename from sandbox/code-generation/language-base/src/main/java/org/apache/plc4x/language/expressions/terms/StringLiteral.java
rename to sandbox/code-generation/external/types-base/src/main/java/org/apache/plc4x/plugins/codegenerator/types/terms/StringLiteral.java
index 1eb0068..f67982f 100644
--- a/sandbox/code-generation/language-base/src/main/java/org/apache/plc4x/language/expressions/terms/StringLiteral.java
+++ b/sandbox/code-generation/external/types-base/src/main/java/org/apache/plc4x/plugins/codegenerator/types/terms/StringLiteral.java
@@ -17,7 +17,7 @@
  under the License.
  */
 
-package org.apache.plc4x.language.expressions.terms;
+package org.apache.plc4x.plugins.codegenerator.types.terms;
 
 public class StringLiteral implements Literal {
 
diff --git a/sandbox/code-generation/language-base/src/main/java/org/apache/plc4x/language/expressions/terms/Term.java b/sandbox/code-generation/external/types-base/src/main/java/org/apache/plc4x/plugins/codegenerator/types/terms/Term.java
similarity index 93%
copy from sandbox/code-generation/language-base/src/main/java/org/apache/plc4x/language/expressions/terms/Term.java
copy to sandbox/code-generation/external/types-base/src/main/java/org/apache/plc4x/plugins/codegenerator/types/terms/Term.java
index b4b9217..389f6e4 100644
--- a/sandbox/code-generation/language-base/src/main/java/org/apache/plc4x/language/expressions/terms/Term.java
+++ b/sandbox/code-generation/external/types-base/src/main/java/org/apache/plc4x/plugins/codegenerator/types/terms/Term.java
@@ -17,7 +17,7 @@
  under the License.
  */
 
-package org.apache.plc4x.language.expressions.terms;
+package org.apache.plc4x.plugins.codegenerator.types.terms;
 
 public interface Term {
 
diff --git a/sandbox/code-generation/language-base/src/main/java/org/apache/plc4x/language/expressions/terms/TernaryTerm.java b/sandbox/code-generation/external/types-base/src/main/java/org/apache/plc4x/plugins/codegenerator/types/terms/TernaryTerm.java
similarity index 96%
rename from sandbox/code-generation/language-base/src/main/java/org/apache/plc4x/language/expressions/terms/TernaryTerm.java
rename to sandbox/code-generation/external/types-base/src/main/java/org/apache/plc4x/plugins/codegenerator/types/terms/TernaryTerm.java
index df34ee7..484eb11 100644
--- a/sandbox/code-generation/language-base/src/main/java/org/apache/plc4x/language/expressions/terms/TernaryTerm.java
+++ b/sandbox/code-generation/external/types-base/src/main/java/org/apache/plc4x/plugins/codegenerator/types/terms/TernaryTerm.java
@@ -17,7 +17,7 @@
  under the License.
  */
 
-package org.apache.plc4x.language.expressions.terms;
+package org.apache.plc4x.plugins.codegenerator.types.terms;
 
 public class TernaryTerm implements Term {
 
diff --git a/sandbox/code-generation/language-base/src/main/java/org/apache/plc4x/language/expressions/terms/UnaryTerm.java b/sandbox/code-generation/external/types-base/src/main/java/org/apache/plc4x/plugins/codegenerator/types/terms/UnaryTerm.java
similarity index 95%
rename from sandbox/code-generation/language-base/src/main/java/org/apache/plc4x/language/expressions/terms/UnaryTerm.java
rename to sandbox/code-generation/external/types-base/src/main/java/org/apache/plc4x/plugins/codegenerator/types/terms/UnaryTerm.java
index 8094e30..27ec739 100644
--- a/sandbox/code-generation/language-base/src/main/java/org/apache/plc4x/language/expressions/terms/UnaryTerm.java
+++ b/sandbox/code-generation/external/types-base/src/main/java/org/apache/plc4x/plugins/codegenerator/types/terms/UnaryTerm.java
@@ -17,7 +17,7 @@
  under the License.
  */
 
-package org.apache.plc4x.language.expressions.terms;
+package org.apache.plc4x.plugins.codegenerator.types.terms;
 
 public class UnaryTerm implements Term {
 
diff --git a/sandbox/code-generation/language-base/src/main/java/org/apache/plc4x/language/expressions/terms/VariableLiteral.java b/sandbox/code-generation/external/types-base/src/main/java/org/apache/plc4x/plugins/codegenerator/types/terms/VariableLiteral.java
similarity index 97%
rename from sandbox/code-generation/language-base/src/main/java/org/apache/plc4x/language/expressions/terms/VariableLiteral.java
rename to sandbox/code-generation/external/types-base/src/main/java/org/apache/plc4x/plugins/codegenerator/types/terms/VariableLiteral.java
index a980ac1..68ece64 100644
--- a/sandbox/code-generation/language-base/src/main/java/org/apache/plc4x/language/expressions/terms/VariableLiteral.java
+++ b/sandbox/code-generation/external/types-base/src/main/java/org/apache/plc4x/plugins/codegenerator/types/terms/VariableLiteral.java
@@ -17,7 +17,7 @@
  under the License.
  */
 
-package org.apache.plc4x.language.expressions.terms;
+package org.apache.plc4x.plugins.codegenerator.types.terms;
 
 import java.util.List;
 
diff --git a/sandbox/code-generation/language-template-java/pom.xml b/sandbox/code-generation/language-base-freemarker/pom.xml
similarity index 87%
copy from sandbox/code-generation/language-template-java/pom.xml
copy to sandbox/code-generation/language-base-freemarker/pom.xml
index fdc791e..7a972da 100644
--- a/sandbox/code-generation/language-template-java/pom.xml
+++ b/sandbox/code-generation/language-base-freemarker/pom.xml
@@ -24,13 +24,13 @@
   <parent>
     <groupId>org.apache.plc4x.plugins</groupId>
     <artifactId>plc4x-code-generaton</artifactId>
-    <version>1.0.0-SNAPSHOT</version>
+    <version>0.5.0-SNAPSHOT</version>
   </parent>
 
-  <artifactId>plc4x-code-generation-language-template-java</artifactId>
+  <artifactId>plc4x-code-generation-language-base-freemarker</artifactId>
 
-  <name>Sandbox: Code Generation: Language Template: Java</name>
-  <description>Code generation language template for generating Java code</description>
+  <name>Sandbox: Code Generation: Language Base: Freemarker</name>
+  <description>Base code for building language outputs based on Freemarker</description>
 
   <dependencies>
     <dependency>
diff --git a/sandbox/code-generation/language-template-java/src/main/java/org/apache/plc4x/language/java/JavaLanguageOutput.java b/sandbox/code-generation/language-base-freemarker/src/main/java/org/apache/plc4x/plugins/codegenerator/protocol/freemarker/FreemarkerLanguageOutput.java
similarity index 82%
rename from sandbox/code-generation/language-template-java/src/main/java/org/apache/plc4x/language/java/JavaLanguageOutput.java
rename to sandbox/code-generation/language-base-freemarker/src/main/java/org/apache/plc4x/plugins/codegenerator/protocol/freemarker/FreemarkerLanguageOutput.java
index c30a6c9..d349e45 100644
--- a/sandbox/code-generation/language-template-java/src/main/java/org/apache/plc4x/language/java/JavaLanguageOutput.java
+++ b/sandbox/code-generation/language-base-freemarker/src/main/java/org/apache/plc4x/plugins/codegenerator/protocol/freemarker/FreemarkerLanguageOutput.java
@@ -17,30 +17,28 @@
  under the License.
  */
 
-package org.apache.plc4x.language.java;
+package org.apache.plc4x.plugins.codegenerator.protocol.freemarker;
 
 import freemarker.cache.ClassTemplateLoader;
 import freemarker.core.ParseException;
 import freemarker.template.*;
-import org.apache.plc4x.language.LanguageOutput;
-import org.apache.plc4x.language.exceptions.GenerationException;
-import org.apache.plc4x.language.definitions.ComplexTypeDefinition;
+import org.apache.plc4x.plugins.codegenerator.language.LanguageOutput;
+import org.apache.plc4x.plugins.codegenerator.types.definitions.ComplexTypeDefinition;
+import org.apache.plc4x.plugins.codegenerator.types.exceptions.GenerationException;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 import java.io.*;
 import java.nio.charset.StandardCharsets;
 import java.nio.file.Files;
-import java.util.*;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
 
-public class JavaLanguageOutput implements LanguageOutput {
+public abstract class FreemarkerLanguageOutput implements LanguageOutput {
 
-    private static final Logger LOGGER = LoggerFactory.getLogger(JavaLanguageOutput.class);
-
-    @Override
-    public String getName() {
-        return "Java";
-    }
+    private static final Logger LOGGER = LoggerFactory.getLogger(FreemarkerLanguageOutput.class);
 
     @Override
     public void generate(File outputDir, String packageName, Map<String, ComplexTypeDefinition> types)
@@ -50,6 +48,9 @@ public class JavaLanguageOutput implements LanguageOutput {
             // Configure the Freemarker template engine
             Configuration freemarkerConfiguration = getFreemarkerConfiguration();
 
+            ClassTemplateLoader classTemplateLoader = new ClassTemplateLoader(FreemarkerLanguageOutput.class, "/");
+            freemarkerConfiguration.setTemplateLoader(classTemplateLoader);
+
             // Initialize all templates
             List<Template> templateList = getTemplates(freemarkerConfiguration);
 
@@ -114,16 +115,8 @@ public class JavaLanguageOutput implements LanguageOutput {
         return configuration;
     }
 
-    private List<Template> getTemplates(Configuration freemarkerConfiguration) throws IOException {
-        ClassTemplateLoader classTemplateLoader = new ClassTemplateLoader(JavaLanguageOutput.class, "/");
-        freemarkerConfiguration.setTemplateLoader(classTemplateLoader);
-        return Arrays.asList(
-            freemarkerConfiguration.getTemplate("templates/java/pojo-template.ftlh"),
-            freemarkerConfiguration.getTemplate("templates/java/io-template.ftlh"));
-    }
+    protected abstract List<Template> getTemplates(Configuration freemarkerConfiguration) throws IOException;
 
-    private JavaLanguageTemplateHelper getHelper(Map<String, ComplexTypeDefinition> types) {
-        return new JavaLanguageTemplateHelper(types);
-    }
+    protected abstract FreemarkerLanguageTemplateHelper getHelper(Map<String, ComplexTypeDefinition> types);
 
 }
diff --git a/sandbox/code-generation/language-base/src/main/java/org/apache/plc4x/language/expressions/terms/Term.java b/sandbox/code-generation/language-base-freemarker/src/main/java/org/apache/plc4x/plugins/codegenerator/protocol/freemarker/FreemarkerLanguageTemplateHelper.java
similarity index 86%
rename from sandbox/code-generation/language-base/src/main/java/org/apache/plc4x/language/expressions/terms/Term.java
rename to sandbox/code-generation/language-base-freemarker/src/main/java/org/apache/plc4x/plugins/codegenerator/protocol/freemarker/FreemarkerLanguageTemplateHelper.java
index b4b9217..6b70cd4 100644
--- a/sandbox/code-generation/language-base/src/main/java/org/apache/plc4x/language/expressions/terms/Term.java
+++ b/sandbox/code-generation/language-base-freemarker/src/main/java/org/apache/plc4x/plugins/codegenerator/protocol/freemarker/FreemarkerLanguageTemplateHelper.java
@@ -17,10 +17,7 @@
  under the License.
  */
 
-package org.apache.plc4x.language.expressions.terms;
-
-public interface Term {
-
-    boolean contains(String str);
+package org.apache.plc4x.plugins.codegenerator.protocol.freemarker;
 
+public interface FreemarkerLanguageTemplateHelper {
 }
diff --git a/sandbox/code-generation/language-template-java/pom.xml b/sandbox/code-generation/language-java/pom.xml
similarity index 80%
copy from sandbox/code-generation/language-template-java/pom.xml
copy to sandbox/code-generation/language-java/pom.xml
index fdc791e..2b91216 100644
--- a/sandbox/code-generation/language-template-java/pom.xml
+++ b/sandbox/code-generation/language-java/pom.xml
@@ -24,17 +24,22 @@
   <parent>
     <groupId>org.apache.plc4x.plugins</groupId>
     <artifactId>plc4x-code-generaton</artifactId>
-    <version>1.0.0-SNAPSHOT</version>
+    <version>0.5.0-SNAPSHOT</version>
   </parent>
 
-  <artifactId>plc4x-code-generation-language-template-java</artifactId>
+  <artifactId>plc4x-code-generation-language-java</artifactId>
 
-  <name>Sandbox: Code Generation: Language Template: Java</name>
-  <description>Code generation language template for generating Java code</description>
+  <name>Sandbox: Code Generation: Language: Java</name>
+  <description>Code generation template for generating Java code</description>
 
   <dependencies>
     <dependency>
       <groupId>org.apache.plc4x.plugins</groupId>
+      <artifactId>plc4x-code-generation-language-base-freemarker</artifactId>
+      <version>0.5.0-SNAPSHOT</version>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.plc4x.plugins</groupId>
       <artifactId>plc4x-code-generation-language-base</artifactId>
       <version>1.0.0-SNAPSHOT</version>
     </dependency>
diff --git a/sandbox/code-generation/language-java/src/main/java/org/apache/plc4x/language/java/JavaLanguageOutput.java b/sandbox/code-generation/language-java/src/main/java/org/apache/plc4x/language/java/JavaLanguageOutput.java
new file mode 100644
index 0000000..ba791e6
--- /dev/null
+++ b/sandbox/code-generation/language-java/src/main/java/org/apache/plc4x/language/java/JavaLanguageOutput.java
@@ -0,0 +1,47 @@
+/*
+ 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.apache.plc4x.language.java;
+
+import freemarker.template.*;
+import org.apache.plc4x.plugins.codegenerator.protocol.freemarker.FreemarkerLanguageOutput;
+import org.apache.plc4x.plugins.codegenerator.protocol.freemarker.FreemarkerLanguageTemplateHelper;
+import org.apache.plc4x.plugins.codegenerator.types.definitions.ComplexTypeDefinition;
+
+import java.io.*;
+import java.util.*;
+
+public class JavaLanguageOutput extends FreemarkerLanguageOutput {
+
+    @Override
+    public String getName() {
+        return "Java";
+    }
+
+    protected List<Template> getTemplates(Configuration freemarkerConfiguration) throws IOException {
+        return Arrays.asList(
+            freemarkerConfiguration.getTemplate("templates/java/pojo-template.ftlh"),
+            freemarkerConfiguration.getTemplate("templates/java/io-template.ftlh"));
+    }
+
+    protected FreemarkerLanguageTemplateHelper getHelper(Map<String, ComplexTypeDefinition> types) {
+        return new JavaLanguageTemplateHelper(types);
+    }
+
+}
diff --git a/sandbox/code-generation/language-template-java/src/main/java/org/apache/plc4x/language/java/JavaLanguageTemplateHelper.java b/sandbox/code-generation/language-java/src/main/java/org/apache/plc4x/language/java/JavaLanguageTemplateHelper.java
similarity index 95%
rename from sandbox/code-generation/language-template-java/src/main/java/org/apache/plc4x/language/java/JavaLanguageTemplateHelper.java
rename to sandbox/code-generation/language-java/src/main/java/org/apache/plc4x/language/java/JavaLanguageTemplateHelper.java
index b8314e8..39af1a1 100644
--- a/sandbox/code-generation/language-template-java/src/main/java/org/apache/plc4x/language/java/JavaLanguageTemplateHelper.java
+++ b/sandbox/code-generation/language-java/src/main/java/org/apache/plc4x/language/java/JavaLanguageTemplateHelper.java
@@ -19,23 +19,25 @@
 
 package org.apache.plc4x.language.java;
 
-import com.sun.org.apache.xpath.internal.operations.Variable;
 import org.apache.commons.text.WordUtils;
-import org.apache.plc4x.language.definitions.ComplexTypeDefinition;
-import org.apache.plc4x.language.definitions.DiscriminatedComplexTypeDefinition;
-import org.apache.plc4x.language.definitions.TypeDefinition;
-import org.apache.plc4x.language.expressions.terms.*;
-import org.apache.plc4x.language.fields.*;
-import org.apache.plc4x.language.references.ComplexTypeReference;
-import org.apache.plc4x.language.references.SimpleTypeReference;
-import org.apache.plc4x.language.references.TypeReference;
+import org.apache.plc4x.plugins.codegenerator.protocol.freemarker.FreemarkerLanguageTemplateHelper;
+import org.apache.plc4x.plugins.codegenerator.types.definitions.ComplexTypeDefinition;
+import org.apache.plc4x.plugins.codegenerator.types.definitions.DiscriminatedComplexTypeDefinition;
+import org.apache.plc4x.plugins.codegenerator.types.definitions.TypeDefinition;
+import org.apache.plc4x.plugins.codegenerator.types.fields.ArrayField;
+import org.apache.plc4x.plugins.codegenerator.types.fields.OptionalField;
+import org.apache.plc4x.plugins.codegenerator.types.fields.TypedField;
+import org.apache.plc4x.plugins.codegenerator.types.references.ComplexTypeReference;
+import org.apache.plc4x.plugins.codegenerator.types.references.SimpleTypeReference;
+import org.apache.plc4x.plugins.codegenerator.types.references.TypeReference;
+import org.apache.plc4x.plugins.codegenerator.types.terms.*;
 
 import java.util.Map;
 import java.util.function.Function;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 
-public class JavaLanguageTemplateHelper {
+public class JavaLanguageTemplateHelper implements FreemarkerLanguageTemplateHelper {
 
     private final Map<String, ComplexTypeDefinition> types;
 
diff --git a/sandbox/code-generation/language-template-java/src/main/resources/META-INF/services/org.apache.plc4x.language.LanguageOutput b/sandbox/code-generation/language-java/src/main/resources/META-INF/services/org.apache.plc4x.plugins.codegenerator.language.LanguageOutput
similarity index 100%
rename from sandbox/code-generation/language-template-java/src/main/resources/META-INF/services/org.apache.plc4x.language.LanguageOutput
rename to sandbox/code-generation/language-java/src/main/resources/META-INF/services/org.apache.plc4x.plugins.codegenerator.language.LanguageOutput
diff --git a/sandbox/code-generation/language-template-java/src/main/resources/templates/java/io-template.ftlh b/sandbox/code-generation/language-java/src/main/resources/templates/java/io-template.ftlh
similarity index 100%
rename from sandbox/code-generation/language-template-java/src/main/resources/templates/java/io-template.ftlh
rename to sandbox/code-generation/language-java/src/main/resources/templates/java/io-template.ftlh
diff --git a/sandbox/code-generation/language-template-java/src/main/resources/templates/java/pojo-template.ftlh b/sandbox/code-generation/language-java/src/main/resources/templates/java/pojo-template.ftlh
similarity index 100%
rename from sandbox/code-generation/language-template-java/src/main/resources/templates/java/pojo-template.ftlh
rename to sandbox/code-generation/language-java/src/main/resources/templates/java/pojo-template.ftlh
diff --git a/sandbox/code-generation/plc4x-maven-plugin/src/test/java/org/apache/plc4x/plugins/codegenerator/parser/ManualExpressionParserTest.java b/sandbox/code-generation/plc4x-maven-plugin/src/test/java/org/apache/plc4x/plugins/codegenerator/parser/ManualExpressionParserTest.java
deleted file mode 100644
index 0aa3412..0000000
--- a/sandbox/code-generation/plc4x-maven-plugin/src/test/java/org/apache/plc4x/plugins/codegenerator/parser/ManualExpressionParserTest.java
+++ /dev/null
@@ -1,37 +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.apache.plc4x.plugins.codegenerator.parser;
-
-import org.apache.commons.io.IOUtils;
-import org.apache.plc4x.language.expressions.terms.Term;
-import org.apache.plc4x.plugins.codegenerator.expression.ExpressionStringParser;
-
-import java.io.InputStream;
-
-public class ManualExpressionParserTest {
-
-    public static void main(String[] args) {
-        InputStream inputStream = IOUtils.toInputStream("lengthInBytes - (payload.lengthInBytes + 1)");
-        ExpressionStringParser parser = new ExpressionStringParser();
-        Term term =  parser.parse(inputStream);
-        System.out.println(term);
-    }
-
-}
diff --git a/sandbox/code-generation/plc4x-maven-plugin/src/test/java/org/apache/plc4x/plugins/codegenerator/parser/ManualMessageFormatParserTest.java b/sandbox/code-generation/plc4x-maven-plugin/src/test/java/org/apache/plc4x/plugins/codegenerator/parser/ManualMessageFormatParserTest.java
deleted file mode 100644
index 50f1b00..0000000
--- a/sandbox/code-generation/plc4x-maven-plugin/src/test/java/org/apache/plc4x/plugins/codegenerator/parser/ManualMessageFormatParserTest.java
+++ /dev/null
@@ -1,36 +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.apache.plc4x.plugins.codegenerator.parser;
-
-import org.apache.plc4x.language.definitions.ComplexTypeDefinition;
-
-import java.io.InputStream;
-import java.util.Map;
-
-public class ManualMessageFormatParserTest {
-
-    public static void main(String[] args) {
-        InputStream spec = Thread.currentThread().getContextClassLoader().getResourceAsStream("specs/s7.spec");
-        MessageFormatParser parser = new MessageFormatParser();
-        Map<String, ComplexTypeDefinition> types = parser.parse(spec);
-        System.out.println(types);
-    }
-
-}
diff --git a/sandbox/code-generation/pom.xml b/sandbox/code-generation/pom.xml
index dd40660..20a3152 100644
--- a/sandbox/code-generation/pom.xml
+++ b/sandbox/code-generation/pom.xml
@@ -22,100 +22,28 @@
          xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
   <modelVersion>4.0.0</modelVersion>
 
-  <!--
-    This is intentionally set to the apache parent as this way
-    we can release this module separately from the rest of the project
-  -->
   <parent>
-    <groupId>org.apache</groupId>
-    <artifactId>apache</artifactId>
-    <version>21</version>
-    <relativePath/>
+    <groupId>org.apache.plc4x.sandbox</groupId>
+    <artifactId>plc4x-sandbox</artifactId>
+    <version>0.5.0-SNAPSHOT</version>
   </parent>
 
   <groupId>org.apache.plc4x.plugins</groupId>
   <artifactId>plc4x-code-generaton</artifactId>
-  <version>1.0.0-SNAPSHOT</version>
   <packaging>pom</packaging>
 
   <name>Sandbox: Code Generation</name>
 
-  <properties>
-    <maven.version>3.3.9</maven.version>
-    <antlr.version>4.7.2</antlr.version>
-    <java.version>1.8</java.version>
-  </properties>
-
-  <prerequisites>
-    <maven>${maven.version}</maven>
-  </prerequisites>
-
   <modules>
-    <module>language-base</module>
-    <module>protocol-base</module>
-
-    <module>plc4x-maven-plugin</module>
-
-    <module>language-template-java</module>
-
+    <module>protocol-base-mspec</module>
     <module>protocol-s7</module>
 
+    <module>language-base-freemarker</module>
+    <module>language-java</module>
+
     <module>driver-base-java</module>
 
     <!--module>test-java-s7-driver</module-->
   </modules>
 
-  <build>
-    <pluginManagement>
-      <plugins>
-        <plugin>
-          <artifactId>maven-clean-plugin</artifactId>
-          <version>3.1.0</version>
-        </plugin>
-        <plugin>
-          <artifactId>maven-resources-plugin</artifactId>
-          <version>3.0.2</version>
-        </plugin>
-        <plugin>
-          <artifactId>maven-compiler-plugin</artifactId>
-          <version>3.8.0</version>
-          <configuration>
-            <source>${java.version}</source>
-            <target>${java.version}</target>
-            <testSource>${java.version}</testSource>
-            <testTarget>${java.version}</testTarget>
-          </configuration>
-        </plugin>
-        <plugin>
-          <artifactId>maven-plugin-plugin</artifactId>
-          <version>3.6.0</version>
-        </plugin>
-        <plugin>
-          <artifactId>maven-surefire-plugin</artifactId>
-          <version>2.22.1</version>
-        </plugin>
-        <plugin>
-          <artifactId>maven-jar-plugin</artifactId>
-          <version>3.0.2</version>
-        </plugin>
-        <plugin>
-          <artifactId>maven-install-plugin</artifactId>
-          <version>2.5.2</version>
-        </plugin>
-        <plugin>
-          <artifactId>maven-deploy-plugin</artifactId>
-          <version>2.8.2</version>
-        </plugin>
-        <plugin>
-          <artifactId>maven-invoker-plugin</artifactId>
-          <version>3.1.0</version>
-        </plugin>
-        <plugin>
-          <groupId>org.antlr</groupId>
-          <artifactId>antlr4-maven-plugin</artifactId>
-          <version>${antlr.version}</version>
-        </plugin>
-      </plugins>
-    </pluginManagement>
-  </build>
 </project>
diff --git a/sandbox/code-generation/language-template-java/pom.xml b/sandbox/code-generation/protocol-base-mspec/pom.xml
similarity index 62%
rename from sandbox/code-generation/language-template-java/pom.xml
rename to sandbox/code-generation/protocol-base-mspec/pom.xml
index fdc791e..2cb2bdf 100644
--- a/sandbox/code-generation/language-template-java/pom.xml
+++ b/sandbox/code-generation/protocol-base-mspec/pom.xml
@@ -24,13 +24,31 @@
   <parent>
     <groupId>org.apache.plc4x.plugins</groupId>
     <artifactId>plc4x-code-generaton</artifactId>
-    <version>1.0.0-SNAPSHOT</version>
+    <version>0.5.0-SNAPSHOT</version>
   </parent>
 
-  <artifactId>plc4x-code-generation-language-template-java</artifactId>
+  <artifactId>plc4x-code-generation-protocol-base-mspec</artifactId>
 
-  <name>Sandbox: Code Generation: Language Template: Java</name>
-  <description>Code generation language template for generating Java code</description>
+  <name>Sandbox: Code Generation: Protocol Base: MSpec</name>
+  <description>Base stuff for building protocols using our custom MSpec format.</description>
+
+  <build>
+    <plugins>
+      <plugin>
+        <groupId>org.antlr</groupId>
+        <artifactId>antlr4-maven-plugin</artifactId>
+        <executions>
+          <execution>
+            <id>antlr</id>
+            <phase>generate-sources</phase>
+            <goals>
+              <goal>antlr4</goal>
+            </goals>
+          </execution>
+        </executions>
+      </plugin>
+    </plugins>
+  </build>
 
   <dependencies>
     <dependency>
@@ -38,22 +56,15 @@
       <artifactId>plc4x-code-generation-language-base</artifactId>
       <version>1.0.0-SNAPSHOT</version>
     </dependency>
-
     <dependency>
-      <groupId>org.freemarker</groupId>
-      <artifactId>freemarker</artifactId>
-      <version>2.3.28</version>
+      <groupId>commons-io</groupId>
+      <artifactId>commons-io</artifactId>
+      <version>2.6</version>
     </dependency>
     <dependency>
-      <groupId>org.apache.commons</groupId>
-      <artifactId>commons-text</artifactId>
-      <version>1.6</version>
-    </dependency>
-
-    <dependency>
-      <groupId>org.slf4j</groupId>
-      <artifactId>slf4j-api</artifactId>
-      <version>1.7.25</version>
+      <groupId>org.antlr</groupId>
+      <artifactId>antlr4-runtime</artifactId>
+      <version>${antlr.version}</version>
     </dependency>
   </dependencies>
 
diff --git a/sandbox/code-generation/plc4x-maven-plugin/src/main/antlr4/org/apache/plc4x/codegenerator/parser/imaginary/Imaginary.g4 b/sandbox/code-generation/protocol-base-mspec/src/main/antlr4/org/apache/plc4x/plugins/codegenerator/language/mspec/MSpec.g4
similarity index 99%
rename from sandbox/code-generation/plc4x-maven-plugin/src/main/antlr4/org/apache/plc4x/codegenerator/parser/imaginary/Imaginary.g4
rename to sandbox/code-generation/protocol-base-mspec/src/main/antlr4/org/apache/plc4x/plugins/codegenerator/language/mspec/MSpec.g4
index c87c136..15d5e5f 100644
--- a/sandbox/code-generation/plc4x-maven-plugin/src/main/antlr4/org/apache/plc4x/codegenerator/parser/imaginary/Imaginary.g4
+++ b/sandbox/code-generation/protocol-base-mspec/src/main/antlr4/org/apache/plc4x/plugins/codegenerator/language/mspec/MSpec.g4
@@ -1,4 +1,4 @@
-grammar Imaginary;
+grammar MSpec;
 /*
  Licensed to the Apache Software Foundation (ASF) under one
  or more contributor license agreements.  See the NOTICE file
diff --git a/sandbox/code-generation/plc4x-maven-plugin/src/main/antlr4/org/apache/plc4x/codegenerator/parser/expression/Expression.g4 b/sandbox/code-generation/protocol-base-mspec/src/main/antlr4/org/apache/plc4x/plugins/codegenerator/language/mspec/expression/Expression.g4
similarity index 100%
rename from sandbox/code-generation/plc4x-maven-plugin/src/main/antlr4/org/apache/plc4x/codegenerator/parser/expression/Expression.g4
rename to sandbox/code-generation/protocol-base-mspec/src/main/antlr4/org/apache/plc4x/plugins/codegenerator/language/mspec/expression/Expression.g4
diff --git a/sandbox/code-generation/plc4x-maven-plugin/src/main/java/org/apache/plc4x/plugins/codegenerator/expression/ExpressionStringListener.java b/sandbox/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/expression/ExpressionStringListener.java
similarity index 97%
rename from sandbox/code-generation/plc4x-maven-plugin/src/main/java/org/apache/plc4x/plugins/codegenerator/expression/ExpressionStringListener.java
rename to sandbox/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/expression/ExpressionStringListener.java
index b9e8f45..fab3d61 100644
--- a/sandbox/code-generation/plc4x-maven-plugin/src/main/java/org/apache/plc4x/plugins/codegenerator/expression/ExpressionStringListener.java
+++ b/sandbox/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/expression/ExpressionStringListener.java
@@ -17,11 +17,9 @@
  under the License.
  */
 
-package org.apache.plc4x.plugins.codegenerator.expression;
+package org.apache.plc4x.plugins.codegenerator.language.mspec.expression;
 
-import org.apache.plc4x.codegenerator.parser.expression.ExpressionBaseListener;
-import org.apache.plc4x.codegenerator.parser.expression.ExpressionParser;
-import org.apache.plc4x.language.expressions.terms.*;
+import org.apache.plc4x.plugins.codegenerator.types.terms.*;
 
 import java.util.LinkedList;
 import java.util.List;
diff --git a/sandbox/code-generation/plc4x-maven-plugin/src/main/java/org/apache/plc4x/plugins/codegenerator/expression/ExpressionStringParser.java b/sandbox/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/expression/ExpressionStringParser.java
similarity index 86%
rename from sandbox/code-generation/plc4x-maven-plugin/src/main/java/org/apache/plc4x/plugins/codegenerator/expression/ExpressionStringParser.java
rename to sandbox/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/expression/ExpressionStringParser.java
index 18d8d69..4fccf54 100644
--- a/sandbox/code-generation/plc4x-maven-plugin/src/main/java/org/apache/plc4x/plugins/codegenerator/expression/ExpressionStringParser.java
+++ b/sandbox/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/expression/ExpressionStringParser.java
@@ -17,15 +17,13 @@
  under the License.
  */
 
-package org.apache.plc4x.plugins.codegenerator.expression;
+package org.apache.plc4x.plugins.codegenerator.language.mspec.expression;
 
 import org.antlr.v4.runtime.CharStreams;
 import org.antlr.v4.runtime.CommonTokenStream;
 import org.antlr.v4.runtime.tree.ParseTree;
 import org.antlr.v4.runtime.tree.ParseTreeWalker;
-import org.apache.plc4x.codegenerator.parser.expression.ExpressionLexer;
-import org.apache.plc4x.codegenerator.parser.expression.ExpressionParser;
-import org.apache.plc4x.language.expressions.terms.Term;
+import org.apache.plc4x.plugins.codegenerator.types.terms.Term;
 
 import java.io.IOException;
 import java.io.InputStream;
diff --git a/sandbox/code-generation/plc4x-maven-plugin/src/main/java/org/apache/plc4x/plugins/codegenerator/model/definitions/DefaultComplexTypeDefinition.java b/sandbox/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/definitions/DefaultComplexTypeDefinition.java
similarity index 77%
rename from sandbox/code-generation/plc4x-maven-plugin/src/main/java/org/apache/plc4x/plugins/codegenerator/model/definitions/DefaultComplexTypeDefinition.java
rename to sandbox/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/definitions/DefaultComplexTypeDefinition.java
index 46d410e..2618fe7 100644
--- a/sandbox/code-generation/plc4x-maven-plugin/src/main/java/org/apache/plc4x/plugins/codegenerator/model/definitions/DefaultComplexTypeDefinition.java
+++ b/sandbox/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/definitions/DefaultComplexTypeDefinition.java
@@ -17,16 +17,14 @@
  under the License.
  */
 
-package org.apache.plc4x.plugins.codegenerator.model.definitions;
+package org.apache.plc4x.plugins.codegenerator.language.mspec.model.definitions;
 
-import org.apache.plc4x.language.definitions.Argument;
-import org.apache.plc4x.language.fields.ConstField;
-import org.apache.plc4x.language.fields.Field;
-import org.apache.plc4x.language.definitions.ComplexTypeDefinition;
-import org.apache.plc4x.language.fields.PropertyField;
-import org.apache.plc4x.language.fields.SimpleField;
-import org.apache.plc4x.plugins.codegenerator.model.fields.DefaultConstField;
-import org.apache.plc4x.plugins.codegenerator.model.fields.DefaultSimpleField;
+import org.apache.plc4x.plugins.codegenerator.types.definitions.Argument;
+import org.apache.plc4x.plugins.codegenerator.types.definitions.ComplexTypeDefinition;
+import org.apache.plc4x.plugins.codegenerator.types.fields.ConstField;
+import org.apache.plc4x.plugins.codegenerator.types.fields.Field;
+import org.apache.plc4x.plugins.codegenerator.types.fields.PropertyField;
+import org.apache.plc4x.plugins.codegenerator.types.fields.SimpleField;
 
 import java.util.Collections;
 import java.util.LinkedList;
@@ -54,14 +52,14 @@ public class DefaultComplexTypeDefinition extends DefaultTypeDefinition implemen
 
     @Override
     public List<SimpleField> getSimpleFields() {
-        return fields.stream().filter(field -> field instanceof DefaultSimpleField).map(
-            field -> (DefaultSimpleField) field).collect(Collectors.toList());
+        return fields.stream().filter(field -> field instanceof SimpleField).map(
+            field -> (SimpleField) field).collect(Collectors.toList());
     }
 
     @Override
     public List<ConstField> getConstFields() {
-        return fields.stream().filter(field -> field instanceof DefaultConstField).map(
-            field -> (DefaultConstField) field).collect(Collectors.toList());
+        return fields.stream().filter(field -> field instanceof ConstField).map(
+            field -> (ConstField) field).collect(Collectors.toList());
     }
 
     @Override
diff --git a/sandbox/code-generation/plc4x-maven-plugin/src/main/java/org/apache/plc4x/plugins/codegenerator/model/definitions/DefaultDiscriminatedComplexTypeDefinition.java b/sandbox/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/definitions/DefaultDiscriminatedComplexTypeDefinition.java
similarity index 80%
rename from sandbox/code-generation/plc4x-maven-plugin/src/main/java/org/apache/plc4x/plugins/codegenerator/model/definitions/DefaultDiscriminatedComplexTypeDefinition.java
rename to sandbox/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/definitions/DefaultDiscriminatedComplexTypeDefinition.java
index 3ea24f2..ad912d1 100644
--- a/sandbox/code-generation/plc4x-maven-plugin/src/main/java/org/apache/plc4x/plugins/codegenerator/model/definitions/DefaultDiscriminatedComplexTypeDefinition.java
+++ b/sandbox/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/definitions/DefaultDiscriminatedComplexTypeDefinition.java
@@ -17,11 +17,11 @@
  under the License.
  */
 
-package org.apache.plc4x.plugins.codegenerator.model.definitions;
+package org.apache.plc4x.plugins.codegenerator.language.mspec.model.definitions;
 
-import org.apache.plc4x.language.definitions.Argument;
-import org.apache.plc4x.language.fields.Field;
-import org.apache.plc4x.language.definitions.DiscriminatedComplexTypeDefinition;
+import org.apache.plc4x.plugins.codegenerator.types.definitions.Argument;
+import org.apache.plc4x.plugins.codegenerator.types.definitions.DiscriminatedComplexTypeDefinition;
+import org.apache.plc4x.plugins.codegenerator.types.fields.Field;
 
 import java.util.List;
 
diff --git a/sandbox/code-generation/plc4x-maven-plugin/src/main/java/org/apache/plc4x/plugins/codegenerator/model/definitions/DefaultEnumTypeDefinition.java b/sandbox/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/definitions/DefaultEnumTypeDefinition.java
similarity index 77%
rename from sandbox/code-generation/plc4x-maven-plugin/src/main/java/org/apache/plc4x/plugins/codegenerator/model/definitions/DefaultEnumTypeDefinition.java
rename to sandbox/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/definitions/DefaultEnumTypeDefinition.java
index 52cb0e2..d887e14 100644
--- a/sandbox/code-generation/plc4x-maven-plugin/src/main/java/org/apache/plc4x/plugins/codegenerator/model/definitions/DefaultEnumTypeDefinition.java
+++ b/sandbox/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/definitions/DefaultEnumTypeDefinition.java
@@ -17,18 +17,18 @@
  under the License.
  */
 
-package org.apache.plc4x.plugins.codegenerator.model.definitions;
+package org.apache.plc4x.plugins.codegenerator.language.mspec.model.definitions;
 
-import org.apache.plc4x.language.definitions.Argument;
-import org.apache.plc4x.language.definitions.EnumTypeDefinition;
-import org.apache.plc4x.language.definitions.TypeDefinition;
+import org.apache.plc4x.plugins.codegenerator.types.definitions.Argument;
+import org.apache.plc4x.plugins.codegenerator.types.definitions.EnumTypeDefinition;
+import org.apache.plc4x.plugins.codegenerator.types.definitions.TypeDefinition;
 
 import java.util.List;
 
 public class DefaultEnumTypeDefinition extends DefaultTypeDefinition implements EnumTypeDefinition {
 
     private final TypeDefinition baseType;
-    private final List<EnumValue> values;
+    private final List<EnumTypeDefinition.EnumValue> values;
 
     public DefaultEnumTypeDefinition(String name, Argument[] parserArguments, TypeDefinition baseType, List<EnumValue> values) {
         super(name, parserArguments);
diff --git a/sandbox/code-generation/plc4x-maven-plugin/src/main/java/org/apache/plc4x/plugins/codegenerator/model/definitions/DefaultTypeDefinition.java b/sandbox/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/definitions/DefaultTypeDefinition.java
similarity index 86%
rename from sandbox/code-generation/plc4x-maven-plugin/src/main/java/org/apache/plc4x/plugins/codegenerator/model/definitions/DefaultTypeDefinition.java
rename to sandbox/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/definitions/DefaultTypeDefinition.java
index d4bcc37..ef9bfb4 100644
--- a/sandbox/code-generation/plc4x-maven-plugin/src/main/java/org/apache/plc4x/plugins/codegenerator/model/definitions/DefaultTypeDefinition.java
+++ b/sandbox/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/definitions/DefaultTypeDefinition.java
@@ -17,10 +17,11 @@
  under the License.
  */
 
-package org.apache.plc4x.plugins.codegenerator.model.definitions;
+package org.apache.plc4x.plugins.codegenerator.language.mspec.model.definitions;
 
-import org.apache.plc4x.language.definitions.Argument;
-import org.apache.plc4x.language.definitions.TypeDefinition;
+
+import org.apache.plc4x.plugins.codegenerator.types.definitions.Argument;
+import org.apache.plc4x.plugins.codegenerator.types.definitions.TypeDefinition;
 
 public abstract class DefaultTypeDefinition {
 
diff --git a/sandbox/code-generation/plc4x-maven-plugin/src/main/java/org/apache/plc4x/plugins/codegenerator/model/fields/DefaultArrayField.java b/sandbox/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/fields/DefaultArrayField.java
similarity index 86%
rename from sandbox/code-generation/plc4x-maven-plugin/src/main/java/org/apache/plc4x/plugins/codegenerator/model/fields/DefaultArrayField.java
rename to sandbox/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/fields/DefaultArrayField.java
index 2a8485c..d25b1ce 100644
--- a/sandbox/code-generation/plc4x-maven-plugin/src/main/java/org/apache/plc4x/plugins/codegenerator/model/fields/DefaultArrayField.java
+++ b/sandbox/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/fields/DefaultArrayField.java
@@ -17,11 +17,11 @@
  under the License.
  */
 
-package org.apache.plc4x.plugins.codegenerator.model.fields;
+package org.apache.plc4x.plugins.codegenerator.language.mspec.model.fields;
 
-import org.apache.plc4x.language.expressions.terms.Term;
-import org.apache.plc4x.language.fields.ArrayField;
-import org.apache.plc4x.language.references.TypeReference;
+import org.apache.plc4x.plugins.codegenerator.types.fields.ArrayField;
+import org.apache.plc4x.plugins.codegenerator.types.references.TypeReference;
+import org.apache.plc4x.plugins.codegenerator.types.terms.Term;
 
 public class DefaultArrayField implements ArrayField {
 
diff --git a/sandbox/code-generation/plc4x-maven-plugin/src/main/java/org/apache/plc4x/plugins/codegenerator/model/fields/DefaultConstField.java b/sandbox/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/fields/DefaultConstField.java
similarity index 86%
rename from sandbox/code-generation/plc4x-maven-plugin/src/main/java/org/apache/plc4x/plugins/codegenerator/model/fields/DefaultConstField.java
rename to sandbox/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/fields/DefaultConstField.java
index c92f48b..79eadff 100644
--- a/sandbox/code-generation/plc4x-maven-plugin/src/main/java/org/apache/plc4x/plugins/codegenerator/model/fields/DefaultConstField.java
+++ b/sandbox/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/fields/DefaultConstField.java
@@ -17,10 +17,10 @@
  under the License.
  */
 
-package org.apache.plc4x.plugins.codegenerator.model.fields;
+package org.apache.plc4x.plugins.codegenerator.language.mspec.model.fields;
 
-import org.apache.plc4x.language.fields.ConstField;
-import org.apache.plc4x.language.references.TypeReference;
+import org.apache.plc4x.plugins.codegenerator.types.fields.ConstField;
+import org.apache.plc4x.plugins.codegenerator.types.references.TypeReference;
 
 public class DefaultConstField implements ConstField {
 
diff --git a/sandbox/code-generation/plc4x-maven-plugin/src/main/java/org/apache/plc4x/plugins/codegenerator/model/fields/DefaultDiscriminatorField.java b/sandbox/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/fields/DefaultDiscriminatorField.java
similarity index 84%
rename from sandbox/code-generation/plc4x-maven-plugin/src/main/java/org/apache/plc4x/plugins/codegenerator/model/fields/DefaultDiscriminatorField.java
rename to sandbox/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/fields/DefaultDiscriminatorField.java
index 48a7544..0e012ce 100644
--- a/sandbox/code-generation/plc4x-maven-plugin/src/main/java/org/apache/plc4x/plugins/codegenerator/model/fields/DefaultDiscriminatorField.java
+++ b/sandbox/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/fields/DefaultDiscriminatorField.java
@@ -17,10 +17,10 @@
  under the License.
  */
 
-package org.apache.plc4x.plugins.codegenerator.model.fields;
+package org.apache.plc4x.plugins.codegenerator.language.mspec.model.fields;
 
-import org.apache.plc4x.language.fields.DiscriminatorField;
-import org.apache.plc4x.language.references.TypeReference;
+import org.apache.plc4x.plugins.codegenerator.types.fields.DiscriminatorField;
+import org.apache.plc4x.plugins.codegenerator.types.references.TypeReference;
 
 public class DefaultDiscriminatorField implements DiscriminatorField {
 
diff --git a/sandbox/code-generation/plc4x-maven-plugin/src/main/java/org/apache/plc4x/plugins/codegenerator/model/fields/DefaultImplicitField.java b/sandbox/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/fields/DefaultImplicitField.java
similarity index 83%
rename from sandbox/code-generation/plc4x-maven-plugin/src/main/java/org/apache/plc4x/plugins/codegenerator/model/fields/DefaultImplicitField.java
rename to sandbox/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/fields/DefaultImplicitField.java
index 0769db5..9c2ffb4 100644
--- a/sandbox/code-generation/plc4x-maven-plugin/src/main/java/org/apache/plc4x/plugins/codegenerator/model/fields/DefaultImplicitField.java
+++ b/sandbox/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/fields/DefaultImplicitField.java
@@ -17,11 +17,11 @@
  under the License.
  */
 
-package org.apache.plc4x.plugins.codegenerator.model.fields;
+package org.apache.plc4x.plugins.codegenerator.language.mspec.model.fields;
 
-import org.apache.plc4x.language.expressions.terms.Term;
-import org.apache.plc4x.language.fields.ImplicitField;
-import org.apache.plc4x.language.references.TypeReference;
+import org.apache.plc4x.plugins.codegenerator.types.fields.ImplicitField;
+import org.apache.plc4x.plugins.codegenerator.types.references.TypeReference;
+import org.apache.plc4x.plugins.codegenerator.types.terms.Term;
 
 public class DefaultImplicitField implements ImplicitField {
 
diff --git a/sandbox/code-generation/plc4x-maven-plugin/src/main/java/org/apache/plc4x/plugins/codegenerator/model/fields/DefaultOptionalField.java b/sandbox/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/fields/DefaultOptionalField.java
similarity index 83%
rename from sandbox/code-generation/plc4x-maven-plugin/src/main/java/org/apache/plc4x/plugins/codegenerator/model/fields/DefaultOptionalField.java
rename to sandbox/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/fields/DefaultOptionalField.java
index 1734fc3..521f75f 100644
--- a/sandbox/code-generation/plc4x-maven-plugin/src/main/java/org/apache/plc4x/plugins/codegenerator/model/fields/DefaultOptionalField.java
+++ b/sandbox/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/fields/DefaultOptionalField.java
@@ -17,11 +17,11 @@
  under the License.
  */
 
-package org.apache.plc4x.plugins.codegenerator.model.fields;
+package org.apache.plc4x.plugins.codegenerator.language.mspec.model.fields;
 
-import org.apache.plc4x.language.expressions.terms.Term;
-import org.apache.plc4x.language.fields.OptionalField;
-import org.apache.plc4x.language.references.TypeReference;
+import org.apache.plc4x.plugins.codegenerator.types.fields.OptionalField;
+import org.apache.plc4x.plugins.codegenerator.types.references.TypeReference;
+import org.apache.plc4x.plugins.codegenerator.types.terms.Term;
 
 public class DefaultOptionalField implements OptionalField {
 
diff --git a/sandbox/code-generation/plc4x-maven-plugin/src/main/java/org/apache/plc4x/plugins/codegenerator/model/fields/DefaultReservedField.java b/sandbox/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/fields/DefaultReservedField.java
similarity index 85%
rename from sandbox/code-generation/plc4x-maven-plugin/src/main/java/org/apache/plc4x/plugins/codegenerator/model/fields/DefaultReservedField.java
rename to sandbox/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/fields/DefaultReservedField.java
index 12d2f32..ab9587d 100644
--- a/sandbox/code-generation/plc4x-maven-plugin/src/main/java/org/apache/plc4x/plugins/codegenerator/model/fields/DefaultReservedField.java
+++ b/sandbox/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/fields/DefaultReservedField.java
@@ -17,10 +17,10 @@
  under the License.
  */
 
-package org.apache.plc4x.plugins.codegenerator.model.fields;
+package org.apache.plc4x.plugins.codegenerator.language.mspec.model.fields;
 
-import org.apache.plc4x.language.fields.ReservedField;
-import org.apache.plc4x.language.references.TypeReference;
+import org.apache.plc4x.plugins.codegenerator.types.fields.ReservedField;
+import org.apache.plc4x.plugins.codegenerator.types.references.TypeReference;
 
 public class DefaultReservedField implements ReservedField {
 
diff --git a/sandbox/code-generation/plc4x-maven-plugin/src/main/java/org/apache/plc4x/plugins/codegenerator/model/fields/DefaultSimpleField.java b/sandbox/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/fields/DefaultSimpleField.java
similarity index 85%
rename from sandbox/code-generation/plc4x-maven-plugin/src/main/java/org/apache/plc4x/plugins/codegenerator/model/fields/DefaultSimpleField.java
rename to sandbox/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/fields/DefaultSimpleField.java
index 7385b44..ceb1d80 100644
--- a/sandbox/code-generation/plc4x-maven-plugin/src/main/java/org/apache/plc4x/plugins/codegenerator/model/fields/DefaultSimpleField.java
+++ b/sandbox/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/fields/DefaultSimpleField.java
@@ -17,10 +17,10 @@
  under the License.
  */
 
-package org.apache.plc4x.plugins.codegenerator.model.fields;
+package org.apache.plc4x.plugins.codegenerator.language.mspec.model.fields;
 
-import org.apache.plc4x.language.fields.SimpleField;
-import org.apache.plc4x.language.references.TypeReference;
+import org.apache.plc4x.plugins.codegenerator.types.fields.SimpleField;
+import org.apache.plc4x.plugins.codegenerator.types.references.TypeReference;
 
 public class DefaultSimpleField implements SimpleField {
 
diff --git a/sandbox/code-generation/plc4x-maven-plugin/src/main/java/org/apache/plc4x/plugins/codegenerator/model/fields/DefaultSwitchField.java b/sandbox/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/fields/DefaultSwitchField.java
similarity index 85%
rename from sandbox/code-generation/plc4x-maven-plugin/src/main/java/org/apache/plc4x/plugins/codegenerator/model/fields/DefaultSwitchField.java
rename to sandbox/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/fields/DefaultSwitchField.java
index 48960af..c233df8 100644
--- a/sandbox/code-generation/plc4x-maven-plugin/src/main/java/org/apache/plc4x/plugins/codegenerator/model/fields/DefaultSwitchField.java
+++ b/sandbox/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/fields/DefaultSwitchField.java
@@ -17,10 +17,11 @@
  under the License.
  */
 
-package org.apache.plc4x.plugins.codegenerator.model.fields;
+package org.apache.plc4x.plugins.codegenerator.language.mspec.model.fields;
 
-import org.apache.plc4x.language.fields.SwitchField;
-import org.apache.plc4x.language.definitions.DiscriminatedComplexTypeDefinition;
+
+import org.apache.plc4x.plugins.codegenerator.types.definitions.DiscriminatedComplexTypeDefinition;
+import org.apache.plc4x.plugins.codegenerator.types.fields.SwitchField;
 
 import java.util.LinkedList;
 import java.util.List;
diff --git a/sandbox/code-generation/plc4x-maven-plugin/src/main/java/org/apache/plc4x/plugins/codegenerator/model/references/DefaultComplexTypeReference.java b/sandbox/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/references/DefaultComplexTypeReference.java
similarity index 86%
rename from sandbox/code-generation/plc4x-maven-plugin/src/main/java/org/apache/plc4x/plugins/codegenerator/model/references/DefaultComplexTypeReference.java
rename to sandbox/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/references/DefaultComplexTypeReference.java
index 8a6ac69..90a1260 100644
--- a/sandbox/code-generation/plc4x-maven-plugin/src/main/java/org/apache/plc4x/plugins/codegenerator/model/references/DefaultComplexTypeReference.java
+++ b/sandbox/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/references/DefaultComplexTypeReference.java
@@ -17,9 +17,9 @@
  under the License.
  */
 
-package org.apache.plc4x.plugins.codegenerator.model.references;
+package org.apache.plc4x.plugins.codegenerator.language.mspec.model.references;
 
-import org.apache.plc4x.language.references.ComplexTypeReference;
+import org.apache.plc4x.plugins.codegenerator.types.references.ComplexTypeReference;
 
 public class DefaultComplexTypeReference implements ComplexTypeReference {
 
diff --git a/sandbox/code-generation/plc4x-maven-plugin/src/main/java/org/apache/plc4x/plugins/codegenerator/model/references/DefaultSimpleTypeReference.java b/sandbox/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/references/DefaultSimpleTypeReference.java
similarity index 88%
rename from sandbox/code-generation/plc4x-maven-plugin/src/main/java/org/apache/plc4x/plugins/codegenerator/model/references/DefaultSimpleTypeReference.java
rename to sandbox/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/references/DefaultSimpleTypeReference.java
index 56f1a54..a1f3aea 100644
--- a/sandbox/code-generation/plc4x-maven-plugin/src/main/java/org/apache/plc4x/plugins/codegenerator/model/references/DefaultSimpleTypeReference.java
+++ b/sandbox/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/references/DefaultSimpleTypeReference.java
@@ -17,9 +17,9 @@
  under the License.
  */
 
-package org.apache.plc4x.plugins.codegenerator.model.references;
+package org.apache.plc4x.plugins.codegenerator.language.mspec.model.references;
 
-import org.apache.plc4x.language.references.SimpleTypeReference;
+import org.apache.plc4x.plugins.codegenerator.types.references.SimpleTypeReference;
 
 public class DefaultSimpleTypeReference implements SimpleTypeReference {
 
diff --git a/sandbox/code-generation/plc4x-maven-plugin/src/main/java/org/apache/plc4x/plugins/codegenerator/model/references/DefaultSimpleVarLengthTypeReference.java b/sandbox/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/references/DefaultSimpleVarLengthTypeReference.java
similarity index 85%
rename from sandbox/code-generation/plc4x-maven-plugin/src/main/java/org/apache/plc4x/plugins/codegenerator/model/references/DefaultSimpleVarLengthTypeReference.java
rename to sandbox/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/references/DefaultSimpleVarLengthTypeReference.java
index 5ac1d3a..dd3f8e4 100644
--- a/sandbox/code-generation/plc4x-maven-plugin/src/main/java/org/apache/plc4x/plugins/codegenerator/model/references/DefaultSimpleVarLengthTypeReference.java
+++ b/sandbox/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/references/DefaultSimpleVarLengthTypeReference.java
@@ -17,9 +17,9 @@
  under the License.
  */
 
-package org.apache.plc4x.plugins.codegenerator.model.references;
+package org.apache.plc4x.plugins.codegenerator.language.mspec.model.references;
 
-import org.apache.plc4x.language.references.SimpleVarLengthTypeReference;
+import org.apache.plc4x.plugins.codegenerator.types.references.SimpleVarLengthTypeReference;
 
 public class DefaultSimpleVarLengthTypeReference extends DefaultSimpleTypeReference implements SimpleVarLengthTypeReference {
 
diff --git a/sandbox/code-generation/plc4x-maven-plugin/src/main/java/org/apache/plc4x/plugins/codegenerator/parser/MessageFormatListener.java b/sandbox/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/parser/MessageFormatListener.java
similarity index 71%
rename from sandbox/code-generation/plc4x-maven-plugin/src/main/java/org/apache/plc4x/plugins/codegenerator/parser/MessageFormatListener.java
rename to sandbox/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/parser/MessageFormatListener.java
index f2b098b..71e9765 100644
--- a/sandbox/code-generation/plc4x-maven-plugin/src/main/java/org/apache/plc4x/plugins/codegenerator/parser/MessageFormatListener.java
+++ b/sandbox/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/parser/MessageFormatListener.java
@@ -17,31 +17,31 @@
  under the License.
  */
 
-package org.apache.plc4x.plugins.codegenerator.parser;
+package org.apache.plc4x.plugins.codegenerator.language.mspec.parser;
 
 import org.apache.commons.io.IOUtils;
-import org.apache.plc4x.codegenerator.parser.imaginary.ImaginaryBaseListener;
-import org.apache.plc4x.codegenerator.parser.imaginary.ImaginaryParser;
-import org.apache.plc4x.language.definitions.Argument;
-import org.apache.plc4x.language.expressions.terms.Term;
-import org.apache.plc4x.language.fields.ArrayField;
-import org.apache.plc4x.language.fields.Field;
-import org.apache.plc4x.language.fields.SwitchField;
-import org.apache.plc4x.language.references.SimpleTypeReference;
-import org.apache.plc4x.language.references.TypeReference;
-import org.apache.plc4x.language.definitions.ComplexTypeDefinition;
-import org.apache.plc4x.language.definitions.DiscriminatedComplexTypeDefinition;
-import org.apache.plc4x.plugins.codegenerator.expression.ExpressionStringParser;
-import org.apache.plc4x.plugins.codegenerator.model.definitions.DefaultComplexTypeDefinition;
-import org.apache.plc4x.plugins.codegenerator.model.definitions.DefaultDiscriminatedComplexTypeDefinition;
-import org.apache.plc4x.plugins.codegenerator.model.references.DefaultComplexTypeReference;
-import org.apache.plc4x.plugins.codegenerator.model.references.DefaultSimpleTypeReference;
-import org.apache.plc4x.plugins.codegenerator.model.fields.*;
+import org.apache.plc4x.plugins.codegenerator.language.mspec.MSpecBaseListener;
+import org.apache.plc4x.plugins.codegenerator.language.mspec.MSpecParser;
+import org.apache.plc4x.plugins.codegenerator.language.mspec.expression.ExpressionStringParser;
+import org.apache.plc4x.plugins.codegenerator.language.mspec.model.definitions.DefaultComplexTypeDefinition;
+import org.apache.plc4x.plugins.codegenerator.language.mspec.model.definitions.DefaultDiscriminatedComplexTypeDefinition;
+import org.apache.plc4x.plugins.codegenerator.language.mspec.model.fields.*;
+import org.apache.plc4x.plugins.codegenerator.language.mspec.model.references.DefaultComplexTypeReference;
+import org.apache.plc4x.plugins.codegenerator.language.mspec.model.references.DefaultSimpleTypeReference;
+import org.apache.plc4x.plugins.codegenerator.types.definitions.Argument;
+import org.apache.plc4x.plugins.codegenerator.types.definitions.ComplexTypeDefinition;
+import org.apache.plc4x.plugins.codegenerator.types.definitions.DiscriminatedComplexTypeDefinition;
+import org.apache.plc4x.plugins.codegenerator.types.fields.ArrayField;
+import org.apache.plc4x.plugins.codegenerator.types.fields.Field;
+import org.apache.plc4x.plugins.codegenerator.types.fields.SwitchField;
+import org.apache.plc4x.plugins.codegenerator.types.references.SimpleTypeReference;
+import org.apache.plc4x.plugins.codegenerator.types.references.TypeReference;
+import org.apache.plc4x.plugins.codegenerator.types.terms.Term;
 
 import java.io.InputStream;
 import java.util.*;
 
-public class MessageFormatListener extends ImaginaryBaseListener {
+public class MessageFormatListener extends MSpecBaseListener {
 
     private Stack<List<Field>> parserContexts;
     private Map<String, ComplexTypeDefinition> complexTypes;
@@ -51,19 +51,19 @@ public class MessageFormatListener extends ImaginaryBaseListener {
     }
 
     @Override
-    public void enterFile(ImaginaryParser.FileContext ctx) {
+    public void enterFile(MSpecParser.FileContext ctx) {
         parserContexts = new Stack<>();
         complexTypes = new HashMap<>();
     }
 
     @Override
-    public void enterComplexType(ImaginaryParser.ComplexTypeContext ctx) {
+    public void enterComplexType(MSpecParser.ComplexTypeContext ctx) {
         List<Field> parserContext = new LinkedList<>();
         parserContexts.push(parserContext);
     }
 
     @Override
-    public void exitComplexType(ImaginaryParser.ComplexTypeContext ctx) {
+    public void exitComplexType(MSpecParser.ComplexTypeContext ctx) {
         String typeName = ctx.name.id.getText();
         Argument[] parserArguments = null;
         if(ctx.params != null) {
@@ -90,7 +90,7 @@ public class MessageFormatListener extends ImaginaryBaseListener {
     }
 
     @Override
-    public void enterArrayField(ImaginaryParser.ArrayFieldContext ctx) {
+    public void enterArrayField(MSpecParser.ArrayFieldContext ctx) {
         TypeReference type = getTypeReference(ctx.type);
         String name = ctx.name.id.getText();
         ArrayField.LengthType lengthType;
@@ -103,13 +103,13 @@ public class MessageFormatListener extends ImaginaryBaseListener {
         InputStream inputStream = IOUtils.toInputStream(lengthExpressionString);
         ExpressionStringParser parser = new ExpressionStringParser();
         Term lengthExpression =  parser.parse(inputStream);
-        String[] params = getFieldParams((ImaginaryParser.FieldDefinitionContext) ctx.parent.parent);
+        String[] params = getFieldParams((MSpecParser.FieldDefinitionContext) ctx.parent.parent);
         Field field = new DefaultArrayField(type, name, lengthType, lengthExpression, params);
         parserContexts.peek().add(field);
     }
 
     @Override
-    public void enterConstField(ImaginaryParser.ConstFieldContext ctx) {
+    public void enterConstField(MSpecParser.ConstFieldContext ctx) {
         SimpleTypeReference type = getSimpleTypeReference(ctx.type);
         String name = ctx.name.id.getText();
         String expected = ctx.expected.expr.getText();
@@ -118,7 +118,7 @@ public class MessageFormatListener extends ImaginaryBaseListener {
     }
 
     @Override
-    public void enterDiscriminatorField(ImaginaryParser.DiscriminatorFieldContext ctx) {
+    public void enterDiscriminatorField(MSpecParser.DiscriminatorFieldContext ctx) {
         SimpleTypeReference type = getSimpleTypeReference(ctx.type);
         String name = ctx.name.id.getText();
         Field field = new DefaultDiscriminatorField(type, name);
@@ -126,16 +126,16 @@ public class MessageFormatListener extends ImaginaryBaseListener {
     }
 
     @Override
-    public void enterSimpleField(ImaginaryParser.SimpleFieldContext ctx) {
+    public void enterSimpleField(MSpecParser.SimpleFieldContext ctx) {
         TypeReference type = getTypeReference(ctx.type);
         String name = ctx.name.id.getText();
-        String[] params = getFieldParams((ImaginaryParser.FieldDefinitionContext) ctx.parent.parent);
+        String[] params = getFieldParams((MSpecParser.FieldDefinitionContext) ctx.parent.parent);
         Field field = new DefaultSimpleField(type, name, params);
         parserContexts.peek().add(field);
     }
 
     @Override
-    public void enterImplicitField(ImaginaryParser.ImplicitFieldContext ctx) {
+    public void enterImplicitField(MSpecParser.ImplicitFieldContext ctx) {
         SimpleTypeReference type = getSimpleTypeReference(ctx.type);
         String name = ctx.name.id.getText();
         String serializationExpressionString = ctx.serializationExpression.expr.getText();
@@ -147,20 +147,20 @@ public class MessageFormatListener extends ImaginaryBaseListener {
     }
 
     @Override
-    public void enterOptionalField(ImaginaryParser.OptionalFieldContext ctx) {
+    public void enterOptionalField(MSpecParser.OptionalFieldContext ctx) {
         TypeReference type = getTypeReference(ctx.type);
         String name = ctx.name.id.getText();
         String conditionExpressionString = ctx.condition.expr.getText();
         InputStream inputStream = IOUtils.toInputStream(conditionExpressionString);
         ExpressionStringParser parser = new ExpressionStringParser();
         Term conditionExpression =  parser.parse(inputStream);
-        String[] params = getFieldParams((ImaginaryParser.FieldDefinitionContext) ctx.parent.parent);
+        String[] params = getFieldParams((MSpecParser.FieldDefinitionContext) ctx.parent.parent);
         Field field = new DefaultOptionalField(type, name, conditionExpression, params);
         parserContexts.peek().add(field);
     }
 
     @Override
-    public void enterReservedField(ImaginaryParser.ReservedFieldContext ctx) {
+    public void enterReservedField(MSpecParser.ReservedFieldContext ctx) {
         SimpleTypeReference type = getSimpleTypeReference(ctx.type);
         String expected = ctx.expected.expr.getText();
         Field field = new DefaultReservedField(type, expected);
@@ -168,7 +168,7 @@ public class MessageFormatListener extends ImaginaryBaseListener {
     }
 
     @Override
-    public void enterTypeSwitchField(ImaginaryParser.TypeSwitchFieldContext ctx) {
+    public void enterTypeSwitchField(MSpecParser.TypeSwitchFieldContext ctx) {
         int numDiscriminators = ctx.discriminators.expression().size();
         String[] discriminatorNames = new String[numDiscriminators];
         for(int i = 0; i < numDiscriminators; i++) {
@@ -179,21 +179,21 @@ public class MessageFormatListener extends ImaginaryBaseListener {
     }
 
     @Override
-    public void enterCaseStatement(ImaginaryParser.CaseStatementContext ctx) {
+    public void enterCaseStatement(MSpecParser.CaseStatementContext ctx) {
         List<Field> parserContext = new LinkedList<>();
         parserContexts.push(parserContext);
     }
 
     @Override
-    public void exitCaseStatement(ImaginaryParser.CaseStatementContext ctx) {
+    public void exitCaseStatement(MSpecParser.CaseStatementContext ctx) {
         String typeName = ctx.name.getText();
         Argument[] parserArguments = null;
-        if(((ImaginaryParser.ComplexTypeContext) ctx.parent.parent.parent.parent).params != null) {
+        if(((MSpecParser.ComplexTypeContext) ctx.parent.parent.parent.parent).params != null) {
             parserArguments = getParserArguments(
-                ((ImaginaryParser.ComplexTypeContext) ctx.parent.parent.parent.parent).params.argument());
+                ((MSpecParser.ComplexTypeContext) ctx.parent.parent.parent.parent).params.argument());
         }
 
-        List<ImaginaryParser.ExpressionContext> expressions = ctx.discriminatorValues.expression();
+        List<MSpecParser.ExpressionContext> expressions = ctx.discriminatorValues.expression();
         String[] discriminatorValues = new String[expressions.size()];
         for (int i = 0; i < expressions.size(); i++) {
             discriminatorValues[i] = expressions.get(i).expr.getText();
@@ -214,12 +214,12 @@ public class MessageFormatListener extends ImaginaryBaseListener {
     }
 
     /*@Override
-    public void exitExpression(ImaginaryParser.ExpressionContext ctx) {
-        ImaginaryParser.InnerExpressionContext expressionContext = ctx.innerExpression();
+    public void exitExpression(MSpecParser.ExpressionContext ctx) {
+        MSpecParser.InnerExpressionContext expressionContext = ctx.innerExpression();
         super.exitExpression(ctx);
     }*/
 
-    private TypeReference getTypeReference(ImaginaryParser.TypeReferenceContext ctx) {
+    private TypeReference getTypeReference(MSpecParser.TypeReferenceContext ctx) {
         if(ctx.simpleTypeReference != null) {
             SimpleTypeReference.SimpleBaseType simpleBaseType = SimpleTypeReference.SimpleBaseType.valueOf(
                 ctx.simpleTypeReference.base.getText().toUpperCase());
@@ -234,7 +234,7 @@ public class MessageFormatListener extends ImaginaryBaseListener {
         }
     }
 
-    private SimpleTypeReference getSimpleTypeReference(ImaginaryParser.DataTypeContext ctx) {
+    private SimpleTypeReference getSimpleTypeReference(MSpecParser.DataTypeContext ctx) {
         SimpleTypeReference.SimpleBaseType simpleBaseType =
             SimpleTypeReference.SimpleBaseType.valueOf(ctx.base.getText().toUpperCase());
         if(ctx.size != null) {
@@ -254,7 +254,7 @@ public class MessageFormatListener extends ImaginaryBaseListener {
         return null;
     }
 
-    private Argument[] getParserArguments(List<ImaginaryParser.ArgumentContext> params) {
+    private Argument[] getParserArguments(List<MSpecParser.ArgumentContext> params) {
         Argument[] parserArguments = new Argument[params.size()];
         for (int i = 0; i < params.size(); i++) {
             TypeReference type = getTypeReference(params.get(i).type);
@@ -264,7 +264,7 @@ public class MessageFormatListener extends ImaginaryBaseListener {
         return parserArguments;
     }
 
-    private String[] getFieldParams(ImaginaryParser.FieldDefinitionContext parentCtx) {
+    private String[] getFieldParams(MSpecParser.FieldDefinitionContext parentCtx) {
         String[] params = null;
         if(parentCtx.params != null) {
             params = new String[parentCtx.params.expression().size()];
diff --git a/sandbox/code-generation/plc4x-maven-plugin/src/main/java/org/apache/plc4x/plugins/codegenerator/parser/MessageFormatParser.java b/sandbox/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/parser/MessageFormatParser.java
similarity index 78%
rename from sandbox/code-generation/plc4x-maven-plugin/src/main/java/org/apache/plc4x/plugins/codegenerator/parser/MessageFormatParser.java
rename to sandbox/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/parser/MessageFormatParser.java
index 425a698..2295d3a 100644
--- a/sandbox/code-generation/plc4x-maven-plugin/src/main/java/org/apache/plc4x/plugins/codegenerator/parser/MessageFormatParser.java
+++ b/sandbox/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/parser/MessageFormatParser.java
@@ -17,15 +17,15 @@
  under the License.
  */
 
-package org.apache.plc4x.plugins.codegenerator.parser;
+package org.apache.plc4x.plugins.codegenerator.language.mspec.parser;
 
 import org.antlr.v4.runtime.CharStreams;
 import org.antlr.v4.runtime.CommonTokenStream;
 import org.antlr.v4.runtime.tree.ParseTree;
 import org.antlr.v4.runtime.tree.ParseTreeWalker;
-import org.apache.plc4x.codegenerator.parser.imaginary.ImaginaryLexer;
-import org.apache.plc4x.codegenerator.parser.imaginary.ImaginaryParser;
-import org.apache.plc4x.language.definitions.ComplexTypeDefinition;
+import org.apache.plc4x.plugins.codegenerator.language.mspec.MSpecLexer;
+import org.apache.plc4x.plugins.codegenerator.language.mspec.MSpecParser;
+import org.apache.plc4x.plugins.codegenerator.types.definitions.ComplexTypeDefinition;
 
 import java.io.IOException;
 import java.io.InputStream;
@@ -35,9 +35,9 @@ public class MessageFormatParser {
 
     public Map<String, ComplexTypeDefinition> parse(InputStream source) {
         try {
-            ImaginaryLexer lexer = new ImaginaryLexer(CharStreams.fromStream(source));
+            MSpecLexer lexer = new MSpecLexer(CharStreams.fromStream(source));
             CommonTokenStream tokens = new CommonTokenStream(lexer);
-            ImaginaryParser parser = new ImaginaryParser(tokens);
+            MSpecParser parser = new MSpecParser(tokens);
             ParseTree tree = parser.file();
             ParseTreeWalker walker = new ParseTreeWalker();
             MessageFormatListener listener = new MessageFormatListener();
diff --git a/sandbox/code-generation/plc4x-maven-plugin/remote-resources/LICENSE b/sandbox/code-generation/protocol-base-mspec/src/remote-resources/LICENSE
similarity index 100%
rename from sandbox/code-generation/plc4x-maven-plugin/remote-resources/LICENSE
rename to sandbox/code-generation/protocol-base-mspec/src/remote-resources/LICENSE
diff --git a/sandbox/code-generation/plc4x-maven-plugin/remote-resources/UNLICENSE b/sandbox/code-generation/protocol-base-mspec/src/remote-resources/UNLICENSE
similarity index 100%
rename from sandbox/code-generation/plc4x-maven-plugin/remote-resources/UNLICENSE
rename to sandbox/code-generation/protocol-base-mspec/src/remote-resources/UNLICENSE
diff --git a/sandbox/code-generation/protocol-s7/pom.xml b/sandbox/code-generation/protocol-s7/pom.xml
index 73c9f56..5449eb3 100644
--- a/sandbox/code-generation/protocol-s7/pom.xml
+++ b/sandbox/code-generation/protocol-s7/pom.xml
@@ -24,7 +24,7 @@
   <parent>
     <groupId>org.apache.plc4x.plugins</groupId>
     <artifactId>plc4x-code-generaton</artifactId>
-    <version>1.0.0-SNAPSHOT</version>
+    <version>0.5.0-SNAPSHOT</version>
   </parent>
 
   <artifactId>plc4x-code-generation-protocol-s7</artifactId>
@@ -38,6 +38,11 @@
       <artifactId>plc4x-code-generation-protocol-base</artifactId>
       <version>1.0.0-SNAPSHOT</version>
     </dependency>
+    <dependency>
+      <groupId>org.apache.plc4x.plugins</groupId>
+      <artifactId>plc4x-code-generation-protocol-base-mspec</artifactId>
+      <version>0.5.0-SNAPSHOT</version>
+    </dependency>
   </dependencies>
 
 </project>
\ No newline at end of file
diff --git a/sandbox/code-generation/protocol-s7/src/main/java/org/apache/plc4x/protocol/s7/S7Protocol.java b/sandbox/code-generation/protocol-s7/src/main/java/org/apache/plc4x/protocol/s7/S7Protocol.java
index 3319489..96b3a31 100644
--- a/sandbox/code-generation/protocol-s7/src/main/java/org/apache/plc4x/protocol/s7/S7Protocol.java
+++ b/sandbox/code-generation/protocol-s7/src/main/java/org/apache/plc4x/protocol/s7/S7Protocol.java
@@ -19,9 +19,13 @@
 
 package org.apache.plc4x.protocol.s7;
 
-import org.apache.plc4x.protocol.Protocol;
+import org.apache.plc4x.plugins.codegenerator.language.mspec.parser.MessageFormatParser;
+import org.apache.plc4x.plugins.codegenerator.protocol.Protocol;
+import org.apache.plc4x.plugins.codegenerator.types.definitions.ComplexTypeDefinition;
+import org.apache.plc4x.plugins.codegenerator.types.exceptions.GenerationException;
 
 import java.io.InputStream;
+import java.util.Map;
 
 public class S7Protocol implements Protocol {
 
@@ -31,8 +35,12 @@ public class S7Protocol implements Protocol {
     }
 
     @Override
-    public InputStream getMessageFormatSchema() {
-        return S7Protocol.class.getResourceAsStream("/protocols/s7/protocol.spec");
+    public Map<String, ComplexTypeDefinition> getTypeDefinitions() throws GenerationException {
+        InputStream schemaInputStream = S7Protocol.class.getResourceAsStream("/protocols/s7/protocol.spec");
+        if(schemaInputStream == null) {
+            throw new GenerationException("Error loading message-format schema for protocol '" + getName() + "'");
+        }
+        return new MessageFormatParser().parse(schemaInputStream);
     }
 
 }
diff --git a/sandbox/code-generation/protocol-s7/src/main/resources/META-INF/services/org.apache.plc4x.protocol.Protocol b/sandbox/code-generation/protocol-s7/src/main/resources/META-INF/services/org.apache.plc4x.plugins.codegenerator.protocol.Protocol
similarity index 100%
rename from sandbox/code-generation/protocol-s7/src/main/resources/META-INF/services/org.apache.plc4x.protocol.Protocol
rename to sandbox/code-generation/protocol-s7/src/main/resources/META-INF/services/org.apache.plc4x.plugins.codegenerator.protocol.Protocol
diff --git a/sandbox/pom.xml b/sandbox/pom.xml
index 30fbe1b..6935f75 100644
--- a/sandbox/pom.xml
+++ b/sandbox/pom.xml
@@ -39,6 +39,7 @@
     <module>dynamic-driver-knxnet-ip</module>
     <module>dynamic-driver-s7</module>
     <module>code-gen</module>
+    <module>code-generation</module>
   </modules>
 
   <dependencyManagement>