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

[plc4x] 01/02: Some refactorings.

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

jfeinauer pushed a commit to branch feature/code-gen
in repository https://gitbox.apache.org/repos/asf/plc4x.git

commit 264a616fd62f6daa9ecbb934832d56634667efbb
Author: Julian Feinauer <j....@pragmaticminds.de>
AuthorDate: Sun May 5 10:17:03 2019 +0200

    Some refactorings.
---
 sandbox/code-gen/pom.xml                           |   5 +
 .../java/org/apache/plc4x/codegen/DFDLUtil.java    |  50 ++
 .../codegen/{version2 => ast}/AbstractNode.java    |   2 +-
 .../{version2 => ast}/AssignementExpression.java   |   2 +-
 .../{version2 => ast}/BinaryExpression.java        |   2 +-
 .../plc4x/codegen/{version2 => ast}/Block.java     |   2 +-
 .../codegen/{version2 => ast}/CallExpression.java  |   2 +-
 .../codegen/{version2 => ast}/ClassDefinition.java |   2 +-
 .../codegen/{version2 => ast}/CodeWriter.java      |   2 +-
 .../{version2 => ast}/ConditionalStatement.java    |   2 +-
 .../codegen/{version2 => ast}/ConstantNode.java    |   2 +-
 .../{version2 => ast}/ConstructorDeclaration.java  |   2 +-
 .../{version2 => ast}/DeclarationStatement.java    |   2 +-
 .../codegen/{version2 => ast}/Expression.java      |   2 +-
 .../{version2 => ast}/FieldDeclaration.java        |   2 +-
 .../codegen/{version2 => ast}/FieldReference.java  |   2 +-
 .../plc4x/codegen/{version2 => ast}/FileNode.java  |   2 +-
 .../plc4x/codegen/{version2 => ast}/Generator.java |   2 +-
 .../codegen/{version2 => ast}/IfStatement.java     |   2 +-
 .../codegen/{version2 => ast}/JavaGenerator.java   |   2 +-
 .../codegen/{version2 => ast}/LineComment.java     |   2 +-
 .../plc4x/codegen/{version2 => ast}/Method.java    |   2 +-
 .../{version2 => ast}/MethodDefinition.java        |   2 +-
 .../codegen/{version2 => ast}/NewExpression.java   |   2 +-
 .../plc4x/codegen/{version2 => ast}/NoOp.java      |   2 +-
 .../plc4x/codegen/{version2 => ast}/Node.java      |   2 +-
 .../codegen/{version2 => ast}/NodeVisitor.java     |   2 +-
 .../{version2 => ast}/ParameterExpression.java     |   2 +-
 .../codegen/{version2 => ast}/PhpGenerator.java    |   2 +-
 .../codegen/{version2 => ast}/PojoFactory.java     |   2 +-
 .../plc4x/codegen/{version2 => ast}/Primitive.java |   2 +-
 .../codegen/{version2 => ast}/PythonGenerator.java |   2 +-
 .../codegen/{version2 => ast}/ReturnStatement.java |   2 +-
 .../plc4x/codegen/{version2 => ast}/Statement.java |   2 +-
 .../plc4x/codegen/{version2 => ast}/TypeNode.java  |   2 +-
 .../plc4x/codegen/{version2 => ast}/TypeUtil.java  |   2 +-
 .../codegen/{ => python}/AbstractNodeVisitor.java  |   2 +-
 .../apache/plc4x/codegen/{ => python}/AddNode.java |   2 +-
 .../plc4x/codegen/{ => python}/AliasNode.java      |   2 +-
 .../codegen/{ => python}/AnnAssignerNode.java      |   2 +-
 .../apache/plc4x/codegen/{ => python}/ArgNode.java |   2 +-
 .../plc4x/codegen/{ => python}/ArgumentsNode.java  |   2 +-
 .../plc4x/codegen/{ => python}/AssignNode.java     |   2 +-
 .../plc4x/codegen/{ => python}/AttributeNode.java  |   2 +-
 .../plc4x/codegen/{ => python}/AugAssignNode.java  |   2 +-
 .../plc4x/codegen/{ => python}/BinOpNode.java      |   2 +-
 .../plc4x/codegen/{ => python}/CallNode.java       |   2 +-
 .../plc4x/codegen/{ => python}/ClassDefNode.java   |   2 +-
 .../plc4x/codegen/{ => python}/CodePrinter.java    |   2 +-
 .../plc4x/codegen/{ => python}/CompareNode.java    |   2 +-
 .../plc4x/codegen/{ => python}/ContextNode.java    |   2 +-
 .../apache/plc4x/codegen/{ => python}/EqNode.java  |   2 +-
 .../plc4x/codegen/{ => python}/ExprNode.java       |   2 +-
 .../codegen/{ => python}/FunctionDefNode.java      |   2 +-
 .../apache/plc4x/codegen/{ => python}/IfNode.java  |   2 +-
 .../plc4x/codegen/{ => python}/ImportFromNode.java |   2 +-
 .../plc4x/codegen/{ => python}/KeywordNode.java    |   2 +-
 .../plc4x/codegen/{ => python}/LineEntryNode.java  |   2 +-
 .../plc4x/codegen/{ => python}/ListNode.java       |   2 +-
 .../plc4x/codegen/{ => python}/LoadNode.java       |   2 +-
 .../plc4x/codegen/{ => python}/ModuleNode.java     |   2 +-
 .../plc4x/codegen/{ => python}/MultNode.java       |   2 +-
 .../codegen/{ => python}/NameConstantNode.java     |   2 +-
 .../plc4x/codegen/{ => python}/NameNode.java       |   2 +-
 .../apache/plc4x/codegen/{ => python}/Node.java    |   2 +-
 .../plc4x/codegen/{ => python}/NodeVisitor.java    |   2 +-
 .../plc4x/codegen/{ => python}/NotEqNode.java      |   2 +-
 .../apache/plc4x/codegen/{ => python}/NumNode.java |   2 +-
 .../plc4x/codegen/{ => python}/PassNode.java       |   2 +-
 .../plc4x/codegen/{ => python}/ReturnNode.java     |   2 +-
 .../plc4x/codegen/{ => python}/StoreNode.java      |   2 +-
 .../apache/plc4x/codegen/{ => python}/StrNode.java |   2 +-
 .../plc4x/codegen/{ => python}/TupleNode.java      |   2 +-
 .../plc4x/codegen/{ => python}/WhileNode.java      |   2 +-
 .../org/apache/plc4x/codegen/DFDLUtilTest.java     |  22 +
 .../org/apache/plc4x/codegen/ModuleNodeTest.java   |  37 +-
 .../java/org/apache/plc4x/codegen/PojoBuilder.java |  17 +
 .../{version2 => ast}/JavaGeneratorTest.java       |   2 +-
 .../{version2 => ast}/PhpGeneratorTest.java        |   2 +-
 .../codegen/{version2 => ast}/PojoFactoryTest.java |   6 +-
 .../{version2 => ast}/PythonGeneratorTest.java     |   2 +-
 .../code-gen/src/test/resources/protocol.dfdl.xsd  | 909 +++++++++++++++++++++
 82 files changed, 1115 insertions(+), 81 deletions(-)

diff --git a/sandbox/code-gen/pom.xml b/sandbox/code-gen/pom.xml
index 4aa7a12..e7390ae 100644
--- a/sandbox/code-gen/pom.xml
+++ b/sandbox/code-gen/pom.xml
@@ -20,6 +20,11 @@
       <artifactId>jackson-databind</artifactId>
     </dependency>
     <dependency>
+      <groupId>org.dom4j</groupId>
+      <artifactId>dom4j</artifactId>
+      <version>2.1.1</version>
+    </dependency>
+    <dependency>
       <groupId>org.junit.vintage</groupId>
       <artifactId>junit-vintage-engine</artifactId>
       <scope>test</scope>
diff --git a/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/DFDLUtil.java b/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/DFDLUtil.java
new file mode 100644
index 0000000..08331b3
--- /dev/null
+++ b/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/DFDLUtil.java
@@ -0,0 +1,50 @@
+package org.apache.plc4x.codegen;
+
+import org.dom4j.Document;
+import org.dom4j.DocumentException;
+import org.dom4j.Element;
+import org.dom4j.Namespace;
+import org.dom4j.QName;
+import org.dom4j.io.SAXReader;
+
+import java.io.File;
+import java.util.Iterator;
+
+/**
+ * Util to create a POJO from a DFDL file.
+ */
+public class DFDLUtil {
+
+    private static final Namespace xsNamespace = new Namespace("xs", "http://www.w3.org/2001/XMLSchema");
+    private static final QName complexType = new QName("complexType", xsNamespace);
+
+    public void transform(File dfdlSchemaFile, File outputDir) {
+        assert outputDir.exists();
+        assert outputDir.isDirectory();
+
+
+        final Document schema = parseDFDLSchema(dfdlSchemaFile);
+
+        final Iterator<Element> iterator = getMainTypes(schema);
+
+        while (iterator.hasNext()) {
+            final Element element = iterator.next();
+            System.out.println(element);
+        }
+    }
+
+    private Document parseDFDLSchema(File schemaFile) {
+        try {
+            SAXReader reader = new SAXReader();
+            return reader.read(schemaFile);
+        } catch (DocumentException e) {
+            // Do something
+            throw new RuntimeException("Unable to read DFDL Schema File", e);
+        }
+    }
+
+    private Iterator<Element> getMainTypes(Document dfdlSchema) {
+        Element rootElement = dfdlSchema.getRootElement();
+        return rootElement.elementIterator(complexType);
+    }
+}
diff --git a/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/version2/AbstractNode.java b/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/ast/AbstractNode.java
similarity index 84%
rename from sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/version2/AbstractNode.java
rename to sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/ast/AbstractNode.java
index abf44ae..ad9d3c1 100644
--- a/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/version2/AbstractNode.java
+++ b/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/ast/AbstractNode.java
@@ -1,4 +1,4 @@
-package org.apache.plc4x.codegen.version2;
+package org.apache.plc4x.codegen.ast;
 
 public abstract class AbstractNode implements Node {
 
diff --git a/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/version2/AssignementExpression.java b/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/ast/AssignementExpression.java
similarity index 93%
rename from sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/version2/AssignementExpression.java
rename to sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/ast/AssignementExpression.java
index 9544eed..f6cf445 100644
--- a/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/version2/AssignementExpression.java
+++ b/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/ast/AssignementExpression.java
@@ -1,4 +1,4 @@
-package org.apache.plc4x.codegen.version2;
+package org.apache.plc4x.codegen.ast;
 
 public class AssignementExpression extends Expression {
 
diff --git a/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/version2/BinaryExpression.java b/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/ast/BinaryExpression.java
similarity index 94%
rename from sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/version2/BinaryExpression.java
rename to sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/ast/BinaryExpression.java
index 0aef957..e40807b 100644
--- a/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/version2/BinaryExpression.java
+++ b/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/ast/BinaryExpression.java
@@ -1,4 +1,4 @@
-package org.apache.plc4x.codegen.version2;
+package org.apache.plc4x.codegen.ast;
 
 public class BinaryExpression extends Expression {
 
diff --git a/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/version2/Block.java b/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/ast/Block.java
similarity index 92%
rename from sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/version2/Block.java
rename to sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/ast/Block.java
index dff5888..5236f64 100644
--- a/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/version2/Block.java
+++ b/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/ast/Block.java
@@ -1,4 +1,4 @@
-package org.apache.plc4x.codegen.version2;
+package org.apache.plc4x.codegen.ast;
 
 import java.util.Arrays;
 import java.util.List;
diff --git a/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/version2/CallExpression.java b/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/ast/CallExpression.java
similarity index 95%
rename from sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/version2/CallExpression.java
rename to sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/ast/CallExpression.java
index d3060a7..0efbc16 100644
--- a/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/version2/CallExpression.java
+++ b/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/ast/CallExpression.java
@@ -1,4 +1,4 @@
-package org.apache.plc4x.codegen.version2;
+package org.apache.plc4x.codegen.ast;
 
 import java.util.Arrays;
 import java.util.List;
diff --git a/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/version2/ClassDefinition.java b/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/ast/ClassDefinition.java
similarity index 97%
rename from sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/version2/ClassDefinition.java
rename to sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/ast/ClassDefinition.java
index ce212a3..1d4bd5c 100644
--- a/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/version2/ClassDefinition.java
+++ b/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/ast/ClassDefinition.java
@@ -1,4 +1,4 @@
-package org.apache.plc4x.codegen.version2;
+package org.apache.plc4x.codegen.ast;
 
 import java.util.List;
 
diff --git a/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/version2/CodeWriter.java b/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/ast/CodeWriter.java
similarity index 96%
rename from sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/version2/CodeWriter.java
rename to sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/ast/CodeWriter.java
index a2e897e..bac3964 100644
--- a/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/version2/CodeWriter.java
+++ b/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/ast/CodeWriter.java
@@ -1,4 +1,4 @@
-package org.apache.plc4x.codegen.version2;
+package org.apache.plc4x.codegen.ast;
 
 import java.util.stream.IntStream;
 
diff --git a/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/version2/ConditionalStatement.java b/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/ast/ConditionalStatement.java
similarity index 86%
rename from sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/version2/ConditionalStatement.java
rename to sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/ast/ConditionalStatement.java
index 9a381b1..227ae44 100644
--- a/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/version2/ConditionalStatement.java
+++ b/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/ast/ConditionalStatement.java
@@ -1,4 +1,4 @@
-package org.apache.plc4x.codegen.version2;
+package org.apache.plc4x.codegen.ast;
 
 public class ConditionalStatement extends Expression {
 
diff --git a/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/version2/ConstantNode.java b/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/ast/ConstantNode.java
similarity index 91%
rename from sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/version2/ConstantNode.java
rename to sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/ast/ConstantNode.java
index df43f3c..43068f9 100644
--- a/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/version2/ConstantNode.java
+++ b/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/ast/ConstantNode.java
@@ -1,4 +1,4 @@
-package org.apache.plc4x.codegen.version2;
+package org.apache.plc4x.codegen.ast;
 
 public class ConstantNode extends Expression {
 
diff --git a/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/version2/ConstructorDeclaration.java b/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/ast/ConstructorDeclaration.java
similarity index 91%
rename from sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/version2/ConstructorDeclaration.java
rename to sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/ast/ConstructorDeclaration.java
index 084d548..df5b02b 100644
--- a/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/version2/ConstructorDeclaration.java
+++ b/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/ast/ConstructorDeclaration.java
@@ -1,4 +1,4 @@
-package org.apache.plc4x.codegen.version2;
+package org.apache.plc4x.codegen.ast;
 
 import java.util.List;
 
diff --git a/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/version2/DeclarationStatement.java b/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/ast/DeclarationStatement.java
similarity index 95%
rename from sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/version2/DeclarationStatement.java
rename to sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/ast/DeclarationStatement.java
index cfc5b06..36d3b66 100644
--- a/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/version2/DeclarationStatement.java
+++ b/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/ast/DeclarationStatement.java
@@ -1,4 +1,4 @@
-package org.apache.plc4x.codegen.version2;
+package org.apache.plc4x.codegen.ast;
 
 public class DeclarationStatement extends Statement {
 
diff --git a/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/version2/Expression.java b/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/ast/Expression.java
similarity index 75%
rename from sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/version2/Expression.java
rename to sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/ast/Expression.java
index 77bd812..c57b9a5 100644
--- a/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/version2/Expression.java
+++ b/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/ast/Expression.java
@@ -1,4 +1,4 @@
-package org.apache.plc4x.codegen.version2;
+package org.apache.plc4x.codegen.ast;
 
 public abstract class Expression extends AbstractNode {
 
diff --git a/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/version2/FieldDeclaration.java b/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/ast/FieldDeclaration.java
similarity index 90%
rename from sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/version2/FieldDeclaration.java
rename to sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/ast/FieldDeclaration.java
index c4f8790..df13db2 100644
--- a/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/version2/FieldDeclaration.java
+++ b/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/ast/FieldDeclaration.java
@@ -1,4 +1,4 @@
-package org.apache.plc4x.codegen.version2;
+package org.apache.plc4x.codegen.ast;
 
 public class FieldDeclaration implements Node {
 
diff --git a/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/version2/FieldReference.java b/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/ast/FieldReference.java
similarity index 89%
rename from sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/version2/FieldReference.java
rename to sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/ast/FieldReference.java
index 7ae8759..8e88319 100644
--- a/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/version2/FieldReference.java
+++ b/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/ast/FieldReference.java
@@ -1,4 +1,4 @@
-package org.apache.plc4x.codegen.version2;
+package org.apache.plc4x.codegen.ast;
 
 public class FieldReference extends ParameterExpression {
 
diff --git a/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/version2/FileNode.java b/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/ast/FileNode.java
similarity index 93%
rename from sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/version2/FileNode.java
rename to sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/ast/FileNode.java
index 36cc3a7..e3036cb 100644
--- a/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/version2/FileNode.java
+++ b/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/ast/FileNode.java
@@ -1,4 +1,4 @@
-package org.apache.plc4x.codegen.version2;
+package org.apache.plc4x.codegen.ast;
 
 import java.util.List;
 
diff --git a/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/version2/Generator.java b/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/ast/Generator.java
similarity index 97%
rename from sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/version2/Generator.java
rename to sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/ast/Generator.java
index 24fef5c..25a34e2 100644
--- a/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/version2/Generator.java
+++ b/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/ast/Generator.java
@@ -1,4 +1,4 @@
-package org.apache.plc4x.codegen.version2;
+package org.apache.plc4x.codegen.ast;
 
 import java.util.List;
 
diff --git a/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/version2/IfStatement.java b/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/ast/IfStatement.java
similarity index 94%
rename from sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/version2/IfStatement.java
rename to sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/ast/IfStatement.java
index e984f9b..24949d2 100644
--- a/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/version2/IfStatement.java
+++ b/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/ast/IfStatement.java
@@ -1,4 +1,4 @@
-package org.apache.plc4x.codegen.version2;
+package org.apache.plc4x.codegen.ast;
 
 public class IfStatement extends Statement {
 
diff --git a/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/version2/JavaGenerator.java b/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/ast/JavaGenerator.java
similarity index 99%
rename from sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/version2/JavaGenerator.java
rename to sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/ast/JavaGenerator.java
index 8c79c24..875fa1c 100644
--- a/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/version2/JavaGenerator.java
+++ b/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/ast/JavaGenerator.java
@@ -1,4 +1,4 @@
-package org.apache.plc4x.codegen.version2;
+package org.apache.plc4x.codegen.ast;
 
 import java.util.List;
 
diff --git a/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/version2/LineComment.java b/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/ast/LineComment.java
similarity index 91%
rename from sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/version2/LineComment.java
rename to sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/ast/LineComment.java
index 0b89d74..85e3b4d 100644
--- a/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/version2/LineComment.java
+++ b/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/ast/LineComment.java
@@ -1,4 +1,4 @@
-package org.apache.plc4x.codegen.version2;
+package org.apache.plc4x.codegen.ast;
 
 /**
  * Comment over one Line
diff --git a/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/version2/Method.java b/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/ast/Method.java
similarity index 96%
rename from sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/version2/Method.java
rename to sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/ast/Method.java
index 9cfdd0c..05dd023 100644
--- a/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/version2/Method.java
+++ b/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/ast/Method.java
@@ -1,4 +1,4 @@
-package org.apache.plc4x.codegen.version2;
+package org.apache.plc4x.codegen.ast;
 
 import java.util.List;
 
diff --git a/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/version2/MethodDefinition.java b/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/ast/MethodDefinition.java
similarity index 97%
rename from sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/version2/MethodDefinition.java
rename to sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/ast/MethodDefinition.java
index 884b123..76f0346 100644
--- a/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/version2/MethodDefinition.java
+++ b/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/ast/MethodDefinition.java
@@ -1,4 +1,4 @@
-package org.apache.plc4x.codegen.version2;
+package org.apache.plc4x.codegen.ast;
 
 import java.util.Collections;
 import java.util.List;
diff --git a/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/version2/NewExpression.java b/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/ast/NewExpression.java
similarity index 92%
rename from sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/version2/NewExpression.java
rename to sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/ast/NewExpression.java
index 1e4c467..012e321 100644
--- a/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/version2/NewExpression.java
+++ b/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/ast/NewExpression.java
@@ -1,4 +1,4 @@
-package org.apache.plc4x.codegen.version2;
+package org.apache.plc4x.codegen.ast;
 
 import java.util.Arrays;
 import java.util.List;
diff --git a/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/version2/NoOp.java b/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/ast/NoOp.java
similarity index 87%
rename from sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/version2/NoOp.java
rename to sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/ast/NoOp.java
index e8f5099..c59a87f 100644
--- a/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/version2/NoOp.java
+++ b/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/ast/NoOp.java
@@ -1,4 +1,4 @@
-package org.apache.plc4x.codegen.version2;
+package org.apache.plc4x.codegen.ast;
 
 /**
  * Do Nothing command;
diff --git a/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/version2/Node.java b/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/ast/Node.java
similarity index 71%
rename from sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/version2/Node.java
rename to sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/ast/Node.java
index e569b05..f8dc47a 100644
--- a/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/version2/Node.java
+++ b/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/ast/Node.java
@@ -1,4 +1,4 @@
-package org.apache.plc4x.codegen.version2;
+package org.apache.plc4x.codegen.ast;
 
 public interface Node {
 
diff --git a/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/version2/NodeVisitor.java b/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/ast/NodeVisitor.java
similarity index 81%
rename from sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/version2/NodeVisitor.java
rename to sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/ast/NodeVisitor.java
index dc690d6..55fd6ad 100644
--- a/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/version2/NodeVisitor.java
+++ b/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/ast/NodeVisitor.java
@@ -1,4 +1,4 @@
-package org.apache.plc4x.codegen.version2;
+package org.apache.plc4x.codegen.ast;
 
 public interface NodeVisitor<T> {
 
diff --git a/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/version2/ParameterExpression.java b/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/ast/ParameterExpression.java
similarity index 91%
rename from sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/version2/ParameterExpression.java
rename to sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/ast/ParameterExpression.java
index 8216e70..fda0db0 100644
--- a/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/version2/ParameterExpression.java
+++ b/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/ast/ParameterExpression.java
@@ -1,4 +1,4 @@
-package org.apache.plc4x.codegen.version2;
+package org.apache.plc4x.codegen.ast;
 
 public class ParameterExpression extends Expression {
 
diff --git a/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/version2/PhpGenerator.java b/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/ast/PhpGenerator.java
similarity index 98%
rename from sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/version2/PhpGenerator.java
rename to sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/ast/PhpGenerator.java
index 325d4c9..f0fe64c 100644
--- a/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/version2/PhpGenerator.java
+++ b/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/ast/PhpGenerator.java
@@ -1,4 +1,4 @@
-package org.apache.plc4x.codegen.version2;
+package org.apache.plc4x.codegen.ast;
 
 import java.util.List;
 
diff --git a/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/version2/PojoFactory.java b/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/ast/PojoFactory.java
similarity index 98%
rename from sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/version2/PojoFactory.java
rename to sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/ast/PojoFactory.java
index 857bbed..bfe345f 100644
--- a/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/version2/PojoFactory.java
+++ b/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/ast/PojoFactory.java
@@ -1,4 +1,4 @@
-package org.apache.plc4x.codegen.version2;
+package org.apache.plc4x.codegen.ast;
 
 import java.util.ArrayList;
 import java.util.Arrays;
diff --git a/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/version2/Primitive.java b/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/ast/Primitive.java
similarity index 91%
rename from sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/version2/Primitive.java
rename to sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/ast/Primitive.java
index 67f11bb..fcfeef9 100644
--- a/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/version2/Primitive.java
+++ b/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/ast/Primitive.java
@@ -1,4 +1,4 @@
-package org.apache.plc4x.codegen.version2;
+package org.apache.plc4x.codegen.ast;
 
 public class Primitive extends TypeNode {
 
diff --git a/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/version2/PythonGenerator.java b/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/ast/PythonGenerator.java
similarity index 99%
rename from sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/version2/PythonGenerator.java
rename to sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/ast/PythonGenerator.java
index 9430b53..898cefb 100644
--- a/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/version2/PythonGenerator.java
+++ b/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/ast/PythonGenerator.java
@@ -1,4 +1,4 @@
-package org.apache.plc4x.codegen.version2;
+package org.apache.plc4x.codegen.ast;
 
 import java.util.List;
 
diff --git a/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/version2/ReturnStatement.java b/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/ast/ReturnStatement.java
similarity index 90%
rename from sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/version2/ReturnStatement.java
rename to sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/ast/ReturnStatement.java
index 0e87d6f..295dd5e 100644
--- a/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/version2/ReturnStatement.java
+++ b/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/ast/ReturnStatement.java
@@ -1,4 +1,4 @@
-package org.apache.plc4x.codegen.version2;
+package org.apache.plc4x.codegen.ast;
 
 public class ReturnStatement extends Statement {
 
diff --git a/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/version2/Statement.java b/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/ast/Statement.java
similarity index 55%
rename from sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/version2/Statement.java
rename to sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/ast/Statement.java
index 128baa8..10dc159 100644
--- a/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/version2/Statement.java
+++ b/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/ast/Statement.java
@@ -1,4 +1,4 @@
-package org.apache.plc4x.codegen.version2;
+package org.apache.plc4x.codegen.ast;
 
 public abstract class Statement implements Node {
 }
diff --git a/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/version2/TypeNode.java b/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/ast/TypeNode.java
similarity index 91%
rename from sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/version2/TypeNode.java
rename to sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/ast/TypeNode.java
index 36fe9c7..07df5e6 100644
--- a/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/version2/TypeNode.java
+++ b/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/ast/TypeNode.java
@@ -1,4 +1,4 @@
-package org.apache.plc4x.codegen.version2;
+package org.apache.plc4x.codegen.ast;
 
 /**
  * Stub for the Type System.
diff --git a/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/version2/TypeUtil.java b/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/ast/TypeUtil.java
similarity index 85%
rename from sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/version2/TypeUtil.java
rename to sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/ast/TypeUtil.java
index fd6a010..27e6fe3 100644
--- a/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/version2/TypeUtil.java
+++ b/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/ast/TypeUtil.java
@@ -1,4 +1,4 @@
-package org.apache.plc4x.codegen.version2;
+package org.apache.plc4x.codegen.ast;
 
 public class TypeUtil {
 
diff --git a/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/AbstractNodeVisitor.java b/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/python/AbstractNodeVisitor.java
similarity index 99%
rename from sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/AbstractNodeVisitor.java
rename to sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/python/AbstractNodeVisitor.java
index d6b9e62..3e8a04d 100644
--- a/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/AbstractNodeVisitor.java
+++ b/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/python/AbstractNodeVisitor.java
@@ -1,4 +1,4 @@
-package org.apache.plc4x.codegen;
+package org.apache.plc4x.codegen.python;
 
 
 public class AbstractNodeVisitor<T> implements NodeVisitor<T> {
diff --git a/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/AddNode.java b/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/python/AddNode.java
similarity index 84%
rename from sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/AddNode.java
rename to sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/python/AddNode.java
index 3e794c5..b00576b 100644
--- a/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/AddNode.java
+++ b/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/python/AddNode.java
@@ -1,4 +1,4 @@
-package org.apache.plc4x.codegen;
+package org.apache.plc4x.codegen.python;
 
 import com.fasterxml.jackson.annotation.JsonTypeName;
 
diff --git a/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/AliasNode.java b/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/python/AliasNode.java
similarity index 94%
rename from sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/AliasNode.java
rename to sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/python/AliasNode.java
index 21d7247..97f1c1b 100644
--- a/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/AliasNode.java
+++ b/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/python/AliasNode.java
@@ -1,4 +1,4 @@
-package org.apache.plc4x.codegen;
+package org.apache.plc4x.codegen.python;
 
 import com.fasterxml.jackson.annotation.JsonProperty;
 import com.fasterxml.jackson.annotation.JsonTypeName;
diff --git a/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/AnnAssignerNode.java b/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/python/AnnAssignerNode.java
similarity index 96%
rename from sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/AnnAssignerNode.java
rename to sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/python/AnnAssignerNode.java
index 70143b5..b827741 100644
--- a/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/AnnAssignerNode.java
+++ b/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/python/AnnAssignerNode.java
@@ -1,4 +1,4 @@
-package org.apache.plc4x.codegen;
+package org.apache.plc4x.codegen.python;
 
 import com.fasterxml.jackson.annotation.JsonProperty;
 import com.fasterxml.jackson.annotation.JsonTypeName;
diff --git a/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/ArgNode.java b/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/python/ArgNode.java
similarity index 94%
rename from sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/ArgNode.java
rename to sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/python/ArgNode.java
index 7dc1757..abb910f 100644
--- a/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/ArgNode.java
+++ b/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/python/ArgNode.java
@@ -1,4 +1,4 @@
-package org.apache.plc4x.codegen;
+package org.apache.plc4x.codegen.python;
 
 import com.fasterxml.jackson.annotation.JsonProperty;
 import com.fasterxml.jackson.annotation.JsonTypeName;
diff --git a/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/ArgumentsNode.java b/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/python/ArgumentsNode.java
similarity index 94%
rename from sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/ArgumentsNode.java
rename to sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/python/ArgumentsNode.java
index 8f4ea38..a9d6273 100644
--- a/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/ArgumentsNode.java
+++ b/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/python/ArgumentsNode.java
@@ -1,4 +1,4 @@
-package org.apache.plc4x.codegen;
+package org.apache.plc4x.codegen.python;
 
 import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
 import com.fasterxml.jackson.annotation.JsonProperty;
diff --git a/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/AssignNode.java b/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/python/AssignNode.java
similarity index 94%
rename from sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/AssignNode.java
rename to sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/python/AssignNode.java
index 1211b42..2b8f775 100644
--- a/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/AssignNode.java
+++ b/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/python/AssignNode.java
@@ -1,4 +1,4 @@
-package org.apache.plc4x.codegen;
+package org.apache.plc4x.codegen.python;
 
 import com.fasterxml.jackson.annotation.JsonProperty;
 import com.fasterxml.jackson.annotation.JsonTypeName;
diff --git a/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/AttributeNode.java b/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/python/AttributeNode.java
similarity index 95%
rename from sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/AttributeNode.java
rename to sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/python/AttributeNode.java
index 648ad7b..955f70e 100644
--- a/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/AttributeNode.java
+++ b/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/python/AttributeNode.java
@@ -1,4 +1,4 @@
-package org.apache.plc4x.codegen;
+package org.apache.plc4x.codegen.python;
 
 import com.fasterxml.jackson.annotation.JsonProperty;
 import com.fasterxml.jackson.annotation.JsonTypeName;
diff --git a/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/AugAssignNode.java b/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/python/AugAssignNode.java
similarity index 95%
rename from sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/AugAssignNode.java
rename to sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/python/AugAssignNode.java
index 658f14c..30817b6 100644
--- a/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/AugAssignNode.java
+++ b/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/python/AugAssignNode.java
@@ -1,4 +1,4 @@
-package org.apache.plc4x.codegen;
+package org.apache.plc4x.codegen.python;
 
 import com.fasterxml.jackson.annotation.JsonProperty;
 import com.fasterxml.jackson.annotation.JsonTypeName;
diff --git a/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/BinOpNode.java b/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/python/BinOpNode.java
similarity index 95%
rename from sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/BinOpNode.java
rename to sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/python/BinOpNode.java
index aa126a5..0b097a7 100644
--- a/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/BinOpNode.java
+++ b/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/python/BinOpNode.java
@@ -1,4 +1,4 @@
-package org.apache.plc4x.codegen;
+package org.apache.plc4x.codegen.python;
 
 import com.fasterxml.jackson.annotation.JsonProperty;
 import com.fasterxml.jackson.annotation.JsonTypeName;
diff --git a/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/CallNode.java b/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/python/CallNode.java
similarity index 95%
rename from sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/CallNode.java
rename to sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/python/CallNode.java
index 5fd598a..71935bc 100644
--- a/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/CallNode.java
+++ b/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/python/CallNode.java
@@ -1,4 +1,4 @@
-package org.apache.plc4x.codegen;
+package org.apache.plc4x.codegen.python;
 
 import com.fasterxml.jackson.annotation.JsonProperty;
 import com.fasterxml.jackson.annotation.JsonTypeName;
diff --git a/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/ClassDefNode.java b/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/python/ClassDefNode.java
similarity index 96%
rename from sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/ClassDefNode.java
rename to sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/python/ClassDefNode.java
index 0445741..ec8ed45 100644
--- a/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/ClassDefNode.java
+++ b/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/python/ClassDefNode.java
@@ -1,4 +1,4 @@
-package org.apache.plc4x.codegen;
+package org.apache.plc4x.codegen.python;
 
 import com.fasterxml.jackson.annotation.JsonCreator;
 import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
diff --git a/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/CodePrinter.java b/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/python/CodePrinter.java
similarity index 96%
rename from sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/CodePrinter.java
rename to sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/python/CodePrinter.java
index 7040542..e97aafb 100644
--- a/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/CodePrinter.java
+++ b/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/python/CodePrinter.java
@@ -1,4 +1,4 @@
-package org.apache.plc4x.codegen;
+package org.apache.plc4x.codegen.python;
 
 import java.util.stream.IntStream;
 
diff --git a/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/CompareNode.java b/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/python/CompareNode.java
similarity index 95%
rename from sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/CompareNode.java
rename to sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/python/CompareNode.java
index 12378a5..bda8e88 100644
--- a/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/CompareNode.java
+++ b/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/python/CompareNode.java
@@ -1,4 +1,4 @@
-package org.apache.plc4x.codegen;
+package org.apache.plc4x.codegen.python;
 
 import com.fasterxml.jackson.annotation.JsonProperty;
 import com.fasterxml.jackson.annotation.JsonTypeName;
diff --git a/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/ContextNode.java b/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/python/ContextNode.java
similarity index 55%
rename from sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/ContextNode.java
rename to sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/python/ContextNode.java
index 5239760..395c483 100644
--- a/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/ContextNode.java
+++ b/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/python/ContextNode.java
@@ -1,4 +1,4 @@
-package org.apache.plc4x.codegen;
+package org.apache.plc4x.codegen.python;
 
 public abstract class ContextNode extends Node {
 }
diff --git a/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/EqNode.java b/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/python/EqNode.java
similarity index 83%
rename from sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/EqNode.java
rename to sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/python/EqNode.java
index 04b84d7..302e09d 100644
--- a/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/EqNode.java
+++ b/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/python/EqNode.java
@@ -1,4 +1,4 @@
-package org.apache.plc4x.codegen;
+package org.apache.plc4x.codegen.python;
 
 import com.fasterxml.jackson.annotation.JsonTypeName;
 
diff --git a/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/ExprNode.java b/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/python/ExprNode.java
similarity index 91%
rename from sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/ExprNode.java
rename to sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/python/ExprNode.java
index 1f8fa79..3f5f1a7 100644
--- a/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/ExprNode.java
+++ b/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/python/ExprNode.java
@@ -1,4 +1,4 @@
-package org.apache.plc4x.codegen;
+package org.apache.plc4x.codegen.python;
 
 import com.fasterxml.jackson.annotation.JsonProperty;
 import com.fasterxml.jackson.annotation.JsonTypeName;
diff --git a/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/FunctionDefNode.java b/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/python/FunctionDefNode.java
similarity index 96%
rename from sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/FunctionDefNode.java
rename to sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/python/FunctionDefNode.java
index 188bf68..4913a6c 100644
--- a/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/FunctionDefNode.java
+++ b/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/python/FunctionDefNode.java
@@ -1,4 +1,4 @@
-package org.apache.plc4x.codegen;
+package org.apache.plc4x.codegen.python;
 
 import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
 import com.fasterxml.jackson.annotation.JsonProperty;
diff --git a/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/IfNode.java b/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/python/IfNode.java
similarity index 95%
rename from sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/IfNode.java
rename to sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/python/IfNode.java
index 5deef16..5748faf 100644
--- a/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/IfNode.java
+++ b/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/python/IfNode.java
@@ -1,4 +1,4 @@
-package org.apache.plc4x.codegen;
+package org.apache.plc4x.codegen.python;
 
 import com.fasterxml.jackson.annotation.JsonProperty;
 import com.fasterxml.jackson.annotation.JsonTypeName;
diff --git a/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/ImportFromNode.java b/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/python/ImportFromNode.java
similarity index 95%
rename from sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/ImportFromNode.java
rename to sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/python/ImportFromNode.java
index fc572c1..e7a29b0 100644
--- a/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/ImportFromNode.java
+++ b/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/python/ImportFromNode.java
@@ -1,4 +1,4 @@
-package org.apache.plc4x.codegen;
+package org.apache.plc4x.codegen.python;
 
 import com.fasterxml.jackson.annotation.JsonProperty;
 import com.fasterxml.jackson.annotation.JsonTypeName;
diff --git a/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/KeywordNode.java b/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/python/KeywordNode.java
similarity index 93%
rename from sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/KeywordNode.java
rename to sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/python/KeywordNode.java
index 0dfe54a..2853614 100644
--- a/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/KeywordNode.java
+++ b/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/python/KeywordNode.java
@@ -1,4 +1,4 @@
-package org.apache.plc4x.codegen;
+package org.apache.plc4x.codegen.python;
 
 import com.fasterxml.jackson.annotation.JsonProperty;
 import com.fasterxml.jackson.annotation.JsonTypeName;
diff --git a/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/LineEntryNode.java b/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/python/LineEntryNode.java
similarity index 92%
rename from sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/LineEntryNode.java
rename to sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/python/LineEntryNode.java
index 017ded2..cd3b0d1 100644
--- a/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/LineEntryNode.java
+++ b/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/python/LineEntryNode.java
@@ -1,4 +1,4 @@
-package org.apache.plc4x.codegen;
+package org.apache.plc4x.codegen.python;
 
 import com.fasterxml.jackson.annotation.JsonProperty;
 
diff --git a/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/ListNode.java b/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/python/ListNode.java
similarity index 94%
rename from sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/ListNode.java
rename to sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/python/ListNode.java
index 32f6e90..0b6b83f 100644
--- a/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/ListNode.java
+++ b/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/python/ListNode.java
@@ -1,4 +1,4 @@
-package org.apache.plc4x.codegen;
+package org.apache.plc4x.codegen.python;
 
 import com.fasterxml.jackson.annotation.JsonProperty;
 import com.fasterxml.jackson.annotation.JsonTypeName;
diff --git a/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/LoadNode.java b/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/python/LoadNode.java
similarity index 84%
rename from sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/LoadNode.java
rename to sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/python/LoadNode.java
index cdf5327..70cab16 100644
--- a/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/LoadNode.java
+++ b/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/python/LoadNode.java
@@ -1,4 +1,4 @@
-package org.apache.plc4x.codegen;
+package org.apache.plc4x.codegen.python;
 
 import com.fasterxml.jackson.annotation.JsonTypeName;
 
diff --git a/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/ModuleNode.java b/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/python/ModuleNode.java
similarity index 92%
rename from sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/ModuleNode.java
rename to sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/python/ModuleNode.java
index b17ea2d..c802813 100644
--- a/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/ModuleNode.java
+++ b/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/python/ModuleNode.java
@@ -1,4 +1,4 @@
-package org.apache.plc4x.codegen;
+package org.apache.plc4x.codegen.python;
 
 import com.fasterxml.jackson.annotation.JsonProperty;
 import com.fasterxml.jackson.annotation.JsonTypeName;
diff --git a/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/MultNode.java b/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/python/MultNode.java
similarity index 84%
rename from sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/MultNode.java
rename to sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/python/MultNode.java
index 1cecd78..f254afb 100644
--- a/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/MultNode.java
+++ b/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/python/MultNode.java
@@ -1,4 +1,4 @@
-package org.apache.plc4x.codegen;
+package org.apache.plc4x.codegen.python;
 
 import com.fasterxml.jackson.annotation.JsonTypeName;
 
diff --git a/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/NameConstantNode.java b/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/python/NameConstantNode.java
similarity index 92%
rename from sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/NameConstantNode.java
rename to sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/python/NameConstantNode.java
index 13decf1..0d69905 100644
--- a/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/NameConstantNode.java
+++ b/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/python/NameConstantNode.java
@@ -1,4 +1,4 @@
-package org.apache.plc4x.codegen;
+package org.apache.plc4x.codegen.python;
 
 import com.fasterxml.jackson.annotation.JsonProperty;
 import com.fasterxml.jackson.annotation.JsonTypeName;
diff --git a/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/NameNode.java b/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/python/NameNode.java
similarity index 93%
rename from sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/NameNode.java
rename to sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/python/NameNode.java
index c2a5d2f..dfc617f 100644
--- a/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/NameNode.java
+++ b/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/python/NameNode.java
@@ -1,4 +1,4 @@
-package org.apache.plc4x.codegen;
+package org.apache.plc4x.codegen.python;
 
 import com.fasterxml.jackson.annotation.JsonProperty;
 import com.fasterxml.jackson.annotation.JsonTypeName;
diff --git a/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/Node.java b/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/python/Node.java
similarity index 84%
rename from sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/Node.java
rename to sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/python/Node.java
index d8918ce..c31838f 100644
--- a/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/Node.java
+++ b/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/python/Node.java
@@ -1,4 +1,4 @@
-package org.apache.plc4x.codegen;
+package org.apache.plc4x.codegen.python;
 
 import com.fasterxml.jackson.annotation.JsonTypeInfo;
 
diff --git a/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/NodeVisitor.java b/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/python/NodeVisitor.java
similarity index 96%
rename from sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/NodeVisitor.java
rename to sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/python/NodeVisitor.java
index f712f05..2384118 100644
--- a/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/NodeVisitor.java
+++ b/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/python/NodeVisitor.java
@@ -1,4 +1,4 @@
-package org.apache.plc4x.codegen;
+package org.apache.plc4x.codegen.python;
 
 public interface NodeVisitor<T> {
 
diff --git a/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/NotEqNode.java b/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/python/NotEqNode.java
similarity index 84%
rename from sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/NotEqNode.java
rename to sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/python/NotEqNode.java
index 60476f9..54844b8 100644
--- a/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/NotEqNode.java
+++ b/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/python/NotEqNode.java
@@ -1,4 +1,4 @@
-package org.apache.plc4x.codegen;
+package org.apache.plc4x.codegen.python;
 
 import com.fasterxml.jackson.annotation.JsonTypeName;
 
diff --git a/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/NumNode.java b/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/python/NumNode.java
similarity index 91%
rename from sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/NumNode.java
rename to sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/python/NumNode.java
index 57c6f9d..dd152f6 100644
--- a/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/NumNode.java
+++ b/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/python/NumNode.java
@@ -1,4 +1,4 @@
-package org.apache.plc4x.codegen;
+package org.apache.plc4x.codegen.python;
 
 import com.fasterxml.jackson.annotation.JsonProperty;
 import com.fasterxml.jackson.annotation.JsonTypeName;
diff --git a/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/PassNode.java b/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/python/PassNode.java
similarity index 84%
rename from sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/PassNode.java
rename to sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/python/PassNode.java
index ca5b611..09ba0b4 100644
--- a/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/PassNode.java
+++ b/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/python/PassNode.java
@@ -1,4 +1,4 @@
-package org.apache.plc4x.codegen;
+package org.apache.plc4x.codegen.python;
 
 import com.fasterxml.jackson.annotation.JsonTypeName;
 
diff --git a/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/ReturnNode.java b/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/python/ReturnNode.java
similarity index 91%
rename from sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/ReturnNode.java
rename to sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/python/ReturnNode.java
index 22235fa..0c08323 100644
--- a/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/ReturnNode.java
+++ b/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/python/ReturnNode.java
@@ -1,4 +1,4 @@
-package org.apache.plc4x.codegen;
+package org.apache.plc4x.codegen.python;
 
 import com.fasterxml.jackson.annotation.JsonProperty;
 import com.fasterxml.jackson.annotation.JsonTypeName;
diff --git a/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/StoreNode.java b/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/python/StoreNode.java
similarity index 84%
rename from sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/StoreNode.java
rename to sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/python/StoreNode.java
index 8ac8205..4752108 100644
--- a/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/StoreNode.java
+++ b/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/python/StoreNode.java
@@ -1,4 +1,4 @@
-package org.apache.plc4x.codegen;
+package org.apache.plc4x.codegen.python;
 
 import com.fasterxml.jackson.annotation.JsonTypeName;
 
diff --git a/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/StrNode.java b/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/python/StrNode.java
similarity index 91%
rename from sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/StrNode.java
rename to sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/python/StrNode.java
index 5bf0854..f2c7c9a 100644
--- a/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/StrNode.java
+++ b/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/python/StrNode.java
@@ -1,4 +1,4 @@
-package org.apache.plc4x.codegen;
+package org.apache.plc4x.codegen.python;
 
 import com.fasterxml.jackson.annotation.JsonProperty;
 import com.fasterxml.jackson.annotation.JsonTypeName;
diff --git a/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/TupleNode.java b/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/python/TupleNode.java
similarity index 94%
rename from sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/TupleNode.java
rename to sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/python/TupleNode.java
index 0c06728..e24aab5 100644
--- a/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/TupleNode.java
+++ b/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/python/TupleNode.java
@@ -1,4 +1,4 @@
-package org.apache.plc4x.codegen;
+package org.apache.plc4x.codegen.python;
 
 import com.fasterxml.jackson.annotation.JsonProperty;
 import com.fasterxml.jackson.annotation.JsonTypeName;
diff --git a/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/WhileNode.java b/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/python/WhileNode.java
similarity index 95%
rename from sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/WhileNode.java
rename to sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/python/WhileNode.java
index 19e19dc..14866e9 100644
--- a/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/WhileNode.java
+++ b/sandbox/code-gen/src/main/java/org/apache/plc4x/codegen/python/WhileNode.java
@@ -1,4 +1,4 @@
-package org.apache.plc4x.codegen;
+package org.apache.plc4x.codegen.python;
 
 import com.fasterxml.jackson.annotation.JsonProperty;
 import com.fasterxml.jackson.annotation.JsonTypeName;
diff --git a/sandbox/code-gen/src/test/java/org/apache/plc4x/codegen/DFDLUtilTest.java b/sandbox/code-gen/src/test/java/org/apache/plc4x/codegen/DFDLUtilTest.java
new file mode 100644
index 0000000..df89b0c
--- /dev/null
+++ b/sandbox/code-gen/src/test/java/org/apache/plc4x/codegen/DFDLUtilTest.java
@@ -0,0 +1,22 @@
+package org.apache.plc4x.codegen;
+
+import org.junit.Test;
+
+import java.io.File;
+
+import static org.junit.Assert.*;
+
+public class DFDLUtilTest {
+
+    @Test
+    public void loadDFDL() {
+        final File schema = new File("src/test/resources/protocol.dfdl.xsd");
+        final File outDir = new File("/tmp/");
+
+        System.out.println(schema.getAbsolutePath().toString());
+
+        final DFDLUtil util = new DFDLUtil();
+
+        util.transform(schema, outDir);
+    }
+}
\ No newline at end of file
diff --git a/sandbox/code-gen/src/test/java/org/apache/plc4x/codegen/ModuleNodeTest.java b/sandbox/code-gen/src/test/java/org/apache/plc4x/codegen/ModuleNodeTest.java
index 1ba9fa3..08e6723 100644
--- a/sandbox/code-gen/src/test/java/org/apache/plc4x/codegen/ModuleNodeTest.java
+++ b/sandbox/code-gen/src/test/java/org/apache/plc4x/codegen/ModuleNodeTest.java
@@ -1,9 +1,44 @@
 package org.apache.plc4x.codegen;
 
 import com.fasterxml.jackson.databind.ObjectMapper;
+import org.apache.plc4x.codegen.python.AbstractNodeVisitor;
+import org.apache.plc4x.codegen.python.AddNode;
+import org.apache.plc4x.codegen.python.AliasNode;
+import org.apache.plc4x.codegen.python.AnnAssignerNode;
+import org.apache.plc4x.codegen.python.ArgNode;
+import org.apache.plc4x.codegen.python.ArgumentsNode;
+import org.apache.plc4x.codegen.python.AssignNode;
+import org.apache.plc4x.codegen.python.AttributeNode;
+import org.apache.plc4x.codegen.python.AugAssignNode;
+import org.apache.plc4x.codegen.python.BinOpNode;
+import org.apache.plc4x.codegen.python.CallNode;
+import org.apache.plc4x.codegen.python.ClassDefNode;
+import org.apache.plc4x.codegen.python.CodePrinter;
+import org.apache.plc4x.codegen.python.CompareNode;
+import org.apache.plc4x.codegen.python.EqNode;
+import org.apache.plc4x.codegen.python.ExprNode;
+import org.apache.plc4x.codegen.python.FunctionDefNode;
+import org.apache.plc4x.codegen.python.IfNode;
+import org.apache.plc4x.codegen.python.ImportFromNode;
+import org.apache.plc4x.codegen.python.KeywordNode;
+import org.apache.plc4x.codegen.python.ListNode;
+import org.apache.plc4x.codegen.python.LoadNode;
+import org.apache.plc4x.codegen.python.ModuleNode;
+import org.apache.plc4x.codegen.python.MultNode;
+import org.apache.plc4x.codegen.python.NameConstantNode;
+import org.apache.plc4x.codegen.python.NameNode;
+import org.apache.plc4x.codegen.python.Node;
+import org.apache.plc4x.codegen.python.NodeVisitor;
+import org.apache.plc4x.codegen.python.NotEqNode;
+import org.apache.plc4x.codegen.python.NumNode;
+import org.apache.plc4x.codegen.python.PassNode;
+import org.apache.plc4x.codegen.python.ReturnNode;
+import org.apache.plc4x.codegen.python.StoreNode;
+import org.apache.plc4x.codegen.python.StrNode;
+import org.apache.plc4x.codegen.python.TupleNode;
+import org.apache.plc4x.codegen.python.WhileNode;
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
-import org.junit.platform.commons.util.Preconditions;
 
 import java.io.File;
 import java.io.IOException;
diff --git a/sandbox/code-gen/src/test/java/org/apache/plc4x/codegen/PojoBuilder.java b/sandbox/code-gen/src/test/java/org/apache/plc4x/codegen/PojoBuilder.java
new file mode 100644
index 0000000..ffb86ad
--- /dev/null
+++ b/sandbox/code-gen/src/test/java/org/apache/plc4x/codegen/PojoBuilder.java
@@ -0,0 +1,17 @@
+package org.apache.plc4x.codegen;
+
+/**
+ * Build POJOs (awesome)
+ */
+public class PojoBuilder {
+
+    private final String namespace;
+    private final String className;
+
+    public PojoBuilder(String namespace, String className) {
+        this.namespace = namespace;
+        this.className = className;
+    }
+
+
+}
diff --git a/sandbox/code-gen/src/test/java/org/apache/plc4x/codegen/version2/JavaGeneratorTest.java b/sandbox/code-gen/src/test/java/org/apache/plc4x/codegen/ast/JavaGeneratorTest.java
similarity index 99%
rename from sandbox/code-gen/src/test/java/org/apache/plc4x/codegen/version2/JavaGeneratorTest.java
rename to sandbox/code-gen/src/test/java/org/apache/plc4x/codegen/ast/JavaGeneratorTest.java
index ad1738a..329b10f 100644
--- a/sandbox/code-gen/src/test/java/org/apache/plc4x/codegen/version2/JavaGeneratorTest.java
+++ b/sandbox/code-gen/src/test/java/org/apache/plc4x/codegen/ast/JavaGeneratorTest.java
@@ -1,4 +1,4 @@
-package org.apache.plc4x.codegen.version2;
+package org.apache.plc4x.codegen.ast;
 
 import org.junit.Before;
 import org.junit.Test;
diff --git a/sandbox/code-gen/src/test/java/org/apache/plc4x/codegen/version2/PhpGeneratorTest.java b/sandbox/code-gen/src/test/java/org/apache/plc4x/codegen/ast/PhpGeneratorTest.java
similarity index 92%
rename from sandbox/code-gen/src/test/java/org/apache/plc4x/codegen/version2/PhpGeneratorTest.java
rename to sandbox/code-gen/src/test/java/org/apache/plc4x/codegen/ast/PhpGeneratorTest.java
index 863c3c1..f5ba88f 100644
--- a/sandbox/code-gen/src/test/java/org/apache/plc4x/codegen/version2/PhpGeneratorTest.java
+++ b/sandbox/code-gen/src/test/java/org/apache/plc4x/codegen/ast/PhpGeneratorTest.java
@@ -1,4 +1,4 @@
-package org.apache.plc4x.codegen.version2;
+package org.apache.plc4x.codegen.ast;
 
 import org.junit.Test;
 
diff --git a/sandbox/code-gen/src/test/java/org/apache/plc4x/codegen/version2/PojoFactoryTest.java b/sandbox/code-gen/src/test/java/org/apache/plc4x/codegen/ast/PojoFactoryTest.java
similarity index 92%
rename from sandbox/code-gen/src/test/java/org/apache/plc4x/codegen/version2/PojoFactoryTest.java
rename to sandbox/code-gen/src/test/java/org/apache/plc4x/codegen/ast/PojoFactoryTest.java
index 2d1abea..c5a5700 100644
--- a/sandbox/code-gen/src/test/java/org/apache/plc4x/codegen/version2/PojoFactoryTest.java
+++ b/sandbox/code-gen/src/test/java/org/apache/plc4x/codegen/ast/PojoFactoryTest.java
@@ -1,11 +1,7 @@
-package org.apache.plc4x.codegen.version2;
+package org.apache.plc4x.codegen.ast;
 
 import org.junit.Test;
 
-import java.sql.SQLOutput;
-
-import static org.junit.Assert.*;
-
 public class PojoFactoryTest {
 
     @Test
diff --git a/sandbox/code-gen/src/test/java/org/apache/plc4x/codegen/version2/PythonGeneratorTest.java b/sandbox/code-gen/src/test/java/org/apache/plc4x/codegen/ast/PythonGeneratorTest.java
similarity index 97%
rename from sandbox/code-gen/src/test/java/org/apache/plc4x/codegen/version2/PythonGeneratorTest.java
rename to sandbox/code-gen/src/test/java/org/apache/plc4x/codegen/ast/PythonGeneratorTest.java
index 53bcc8c..f7ed106 100644
--- a/sandbox/code-gen/src/test/java/org/apache/plc4x/codegen/version2/PythonGeneratorTest.java
+++ b/sandbox/code-gen/src/test/java/org/apache/plc4x/codegen/ast/PythonGeneratorTest.java
@@ -1,4 +1,4 @@
-package org.apache.plc4x.codegen.version2;
+package org.apache.plc4x.codegen.ast;
 
 import org.junit.Before;
 import org.junit.Test;
diff --git a/sandbox/code-gen/src/test/resources/protocol.dfdl.xsd b/sandbox/code-gen/src/test/resources/protocol.dfdl.xsd
new file mode 100644
index 0000000..1cb2922
--- /dev/null
+++ b/sandbox/code-gen/src/test/resources/protocol.dfdl.xsd
@@ -0,0 +1,909 @@
+<!--
+  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.
+  -->
+<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
+           xmlns:dfdl="http://www.ogf.org/dfdl/dfdl-1.0/"
+           xmlns:s7="http://plc4x.apache.org/s7"
+           xmlns:fn="http://www.w3.org/2005/xpath-functions"
+           targetNamespace="http://plc4x.apache.org/s7">
+
+    <xs:annotation>
+        <xs:appinfo source="http://www.ogf.org/dfdl/">
+            <dfdl:defineVariable name="messageType" type="xs:string"/>
+            <dfdl:defineFormat name="s7FullFormat">
+                <dfdl:format representation="binary"
+                             binaryNumberRep="binary"
+                             byteOrder="bigEndian"
+                             lengthKind="implicit" lengthUnits="bytes" length="0"
+                             occursCountKind="implicit"
+                             textOutputMinLength="0"
+                             alignment="1" alignmentUnits="bits"
+                             leadingSkip="0" trailingSkip="0"
+                             textPadKind="none" ignoreCase="no"
+                             textBidi="no" floating="no"
+                             encoding="utf-8" truncateSpecifiedLengthString="no"
+                             initiator="" terminator=""
+                             sequenceKind="ordered" separator=""
+                             escapeSchemeRef="" initiatedContent="no"
+                             encodingErrorPolicy="replace"/>
+            </dfdl:defineFormat>
+            <dfdl:format ref="s7:s7FullFormat"/>
+        </xs:appinfo>
+    </xs:annotation>
+
+    <!--
+
+        Simple type definition.
+
+    -->
+
+    <xs:simpleType name="bit" dfdl:lengthUnits="bits" dfdl:length="1" dfdl:lengthKind="explicit">
+        <xs:restriction base="xs:boolean"/>
+    </xs:simpleType>
+
+    <xs:simpleType name="byte" dfdl:lengthUnits="bytes" dfdl:length="1" dfdl:lengthKind="explicit">
+        <xs:restriction base="xs:unsignedByte"/>
+    </xs:simpleType>
+
+    <xs:simpleType name="short" dfdl:lengthUnits="bytes" dfdl:length="2" dfdl:lengthKind="explicit">
+        <xs:restriction base="xs:unsignedShort"/>
+    </xs:simpleType>
+
+    <xs:simpleType name="hexByte" dfdl:lengthUnits="bytes" dfdl:length="1" dfdl:lengthKind="explicit">
+        <xs:restriction base="xs:hexBinary"/>
+    </xs:simpleType>
+
+    <!--
+
+        TPKT - Iso-On-TCP
+
+    -->
+
+    <xs:element name="TpktMessage" type="s7:TpktMessageType"/>
+
+    <xs:complexType name="TpktMessageType">
+        <xs:sequence>
+            <!-- TPKT Magic Byte always 0x03 -->
+            <xs:element name="magicByte" type="s7:byte">
+                <xs:annotation>
+                    <xs:appinfo source="http://www.ogf.org/dfdl/">
+                        <dfdl:assert message="Magic number was not 0x03."
+                                     test="{. eq 3}"/>
+                    </xs:appinfo>
+                </xs:annotation>
+            </xs:element>
+            <xs:element name="reserved" type="s7:byte"/>
+            <xs:element name="length" type="s7:short"/>
+            <xs:element name="userData" type="s7:CotpMessageType"/>
+        </xs:sequence>
+    </xs:complexType>
+
+    <!--
+
+        ISO 8073/X.224 - ISO-TP - COTP - Connection-Oriented Transport Protocol Messages
+
+    -->
+
+    <xs:simpleType name="CotpTpduType">
+        <xs:restriction base="xs:unsignedByte">
+            <xs:enumeration id="tpduTypeConnectionRequest" value="224">
+                <xs:annotation>
+                    <xs:appinfo source="http://plc4x.apache.org/">ConnectionRequest</xs:appinfo>
+                </xs:annotation>
+            </xs:enumeration>
+            <xs:enumeration id="tpduTypeConnectionResponse" value="208">
+                <xs:annotation>
+                    <xs:appinfo source="http://plc4x.apache.org/">ConnectionResponse</xs:appinfo>
+                </xs:annotation>
+            </xs:enumeration>
+            <xs:enumeration value="128">
+                <xs:annotation>
+                    <xs:appinfo source="http://plc4x.apache.org/">DisconnectRequest</xs:appinfo>
+                </xs:annotation>
+            </xs:enumeration>
+            <xs:enumeration value="192">
+                <xs:annotation>
+                    <xs:appinfo source="http://plc4x.apache.org/">DisconnectResponse</xs:appinfo>
+                </xs:annotation>
+            </xs:enumeration>
+            <xs:enumeration value="112">
+                <xs:annotation>
+                    <xs:appinfo source="http://plc4x.apache.org/">Error</xs:appinfo>
+                </xs:annotation>
+            </xs:enumeration>
+            <xs:enumeration value="240">
+                <xs:annotation>
+                    <xs:appinfo source="http://plc4x.apache.org/">Data</xs:appinfo>
+                </xs:annotation>
+            </xs:enumeration>
+        </xs:restriction>
+    </xs:simpleType>
+
+    <xs:simpleType name="CotpParameterType">
+        <xs:restriction base="xs:unsignedByte">
+            <xs:enumeration value="192">
+                <xs:annotation>
+                    <xs:appinfo source="http://plc4x.apache.org/">TpduSize</xs:appinfo>
+                </xs:annotation>
+            </xs:enumeration>
+            <xs:enumeration value="193">
+                <xs:annotation>
+                    <xs:appinfo source="http://plc4x.apache.org/">CallingTsap</xs:appinfo>
+                </xs:annotation>
+            </xs:enumeration>
+            <xs:enumeration value="194">
+                <xs:annotation>
+                    <xs:appinfo source="http://plc4x.apache.org/">CalledTsap</xs:appinfo>
+                </xs:annotation>
+            </xs:enumeration>
+            <xs:enumeration value="195">
+                <xs:annotation>
+                    <xs:appinfo source="http://plc4x.apache.org/">Checksum</xs:appinfo>
+                </xs:annotation>
+            </xs:enumeration>
+            <xs:enumeration value="224">
+                <xs:annotation>
+                    <xs:appinfo source="http://plc4x.apache.org/">DisconnectAdditionalInformation</xs:appinfo>
+                </xs:annotation>
+            </xs:enumeration>
+        </xs:restriction>
+    </xs:simpleType>
+
+    <xs:complexType name="CotpMessageType">
+        <xs:sequence>
+            <!-- Length of the COTP header data -->
+            <xs:element name="headerLength" type="s7:byte"/>
+            <xs:element name="type" type="s7:CotpTpduType"/>
+            <xs:choice dfdl:choiceDispatchKey="{xs:string(type)}">
+                <xs:element dfdl:choiceBranchKey="224" ref="s7:CotpTpduConnectionRequest"/>
+                <xs:element dfdl:choiceBranchKey="208" ref="s7:CotpTpduConnectionResponse"/>
+                <xs:element dfdl:choiceBranchKey="128" ref="s7:CotpTpduDisconnectRequest"/>
+                <xs:element dfdl:choiceBranchKey="192" ref="s7:CotpTpduDisconnectResponse"/>
+                <xs:element dfdl:choiceBranchKey="112" ref="s7:CotpTpduError"/>
+                <xs:element dfdl:choiceBranchKey="240" ref="s7:CotpTpduData"/>
+            </xs:choice>
+            <xs:element name="userData" type="s7:S7MessageType" minOccurs="0"
+                        dfdl:occursCountKind="expression"
+                        dfdl:occursCount="{if((../../length - (../headerLength + 5)) gt 0) then 1 else 0}"/>
+        </xs:sequence>
+    </xs:complexType>
+
+    <xs:element name="CotpTpduConnectionRequest">
+        <xs:complexType>
+            <xs:sequence>
+                <xs:element name="destinationReference" type="s7:short"/>
+                <xs:element name="sourceReference" type="s7:short"/>
+                <xs:element name="protocolClass" type="s7:byte"/>
+                <xs:element ref="s7:parameters" minOccurs="0"
+                            dfdl:lengthKind="explicit" dfdl:lengthUnits="bytes" dfdl:length="{../../headerLength - 6}"
+                            dfdl:occursCountKind="expression"
+                            dfdl:occursCount="{if(../../headerLength gt 6) then 1 else 0}"/>
+            </xs:sequence>
+        </xs:complexType>
+    </xs:element>
+
+    <xs:element name="CotpTpduConnectionResponse">
+        <xs:complexType>
+            <xs:sequence>
+                <xs:element name="destinationReference" type="s7:short"/>
+                <xs:element name="sourceReference" type="s7:short"/>
+                <xs:element name="protocolClass" type="s7:byte"/>
+                <xs:element ref="s7:parameters" minOccurs="0"
+                            dfdl:lengthKind="explicit" dfdl:lengthUnits="bytes" dfdl:length="{../../headerLength - 6}"
+                            dfdl:occursCountKind="expression"
+                            dfdl:occursCount="{if(../../headerLength gt 6) then 1 else 0}"/>
+            </xs:sequence>
+        </xs:complexType>
+    </xs:element>
+
+    <xs:element name="CotpTpduDisconnectRequest">
+        <xs:complexType>
+            <xs:sequence>
+                <xs:element name="destinationReference" type="s7:short"/>
+                <xs:element name="sourceReference" type="s7:short"/>
+                <xs:element name="disconnectReason" type="s7:byte"/>
+                <xs:element ref="s7:parameters" minOccurs="0"
+                            dfdl:lengthKind="explicit" dfdl:lengthUnits="bytes" dfdl:length="{../../headerLength - 6}"
+                            dfdl:occursCountKind="expression"
+                            dfdl:occursCount="{if(../../headerLength gt 6) then 1 else 0}"/>
+            </xs:sequence>
+        </xs:complexType>
+    </xs:element>
+
+    <xs:element name="CotpTpduDisconnectResponse">
+        <xs:complexType>
+            <xs:sequence>
+                <xs:element name="destinationReference" type="s7:short"/>
+                <xs:element name="sourceReference" type="s7:short"/>
+                <xs:element ref="s7:parameters" minOccurs="0"
+                            dfdl:lengthKind="explicit" dfdl:lengthUnits="bytes" dfdl:length="{../../headerLength - 5}"
+                            dfdl:occursCountKind="expression"
+                            dfdl:occursCount="{if(../../headerLength gt 5) then 1 else 0}"/>
+            </xs:sequence>
+        </xs:complexType>
+    </xs:element>
+
+    <xs:element name="CotpTpduError">
+        <xs:complexType>
+            <xs:sequence>
+                <xs:element name="destinationReference" type="s7:short"/>
+                <xs:element name="rejectCause" type="s7:byte"/>
+                <xs:element ref="s7:parameters" minOccurs="0"
+                            dfdl:lengthKind="explicit" dfdl:lengthUnits="bytes" dfdl:length="{../../headerLength - 4}"
+                            dfdl:occursCountKind="expression"
+                            dfdl:occursCount="{if(../../headerLength gt 4) then 1 else 0}"/>
+            </xs:sequence>
+        </xs:complexType>
+    </xs:element>
+
+    <xs:element name="CotpTpduData">
+        <xs:complexType>
+            <xs:sequence>
+                <xs:element name="endOfTransmission" type="xs:unsignedInt"
+                            dfdl:lengthKind="explicit" dfdl:lengthUnits="bits" dfdl:length="1"/>
+                <xs:element name="tpduRef" type="xs:unsignedInt"
+                            dfdl:lengthKind="explicit" dfdl:lengthUnits="bits" dfdl:length="7"/>
+            </xs:sequence>
+        </xs:complexType>
+    </xs:element>
+
+    <xs:element name="parameters">
+        <xs:complexType>
+            <xs:sequence>
+                <xs:element name="parameter" maxOccurs="unbounded">
+                    <xs:complexType>
+                        <xs:sequence>
+                            <xs:element name="type" type="s7:CotpParameterType"/>
+                            <xs:element name="parameterLength" type="s7:byte"/>
+                            <xs:choice dfdl:choiceDispatchKey="{xs:string(type)}">
+                                <xs:element dfdl:choiceBranchKey="192" ref="s7:CotpParameterTpduSize"/>
+                                <xs:element dfdl:choiceBranchKey="193" ref="s7:CotpParameterCallingTsap"/>
+                                <xs:element dfdl:choiceBranchKey="194" ref="s7:CotpParameterCalledTsap"/>
+                                <xs:element dfdl:choiceBranchKey="195" ref="s7:CotpParameterChecksum"/>
+                                <xs:element dfdl:choiceBranchKey="224"
+                                            ref="s7:CotpParameterDisconnectAdditionalInformation"/>
+                            </xs:choice>
+                        </xs:sequence>
+                    </xs:complexType>
+                </xs:element>
+            </xs:sequence>
+        </xs:complexType>
+    </xs:element>
+
+    <xs:element name="CotpParameterTpduSize">
+        <xs:complexType>
+            <xs:sequence>
+                <xs:element name="tpduSize" type="s7:byte"/>
+            </xs:sequence>
+        </xs:complexType>
+    </xs:element>
+
+    <xs:element name="CotpParameterCallingTsap">
+        <xs:complexType>
+            <xs:sequence>
+                <xs:element name="tsapId" type="s7:short"/>
+            </xs:sequence>
+        </xs:complexType>
+    </xs:element>
+
+    <xs:element name="CotpParameterCalledTsap">
+        <xs:complexType>
+            <xs:sequence>
+                <xs:element name="tsapId" type="s7:short"/>
+            </xs:sequence>
+        </xs:complexType>
+    </xs:element>
+
+    <xs:element name="CotpParameterChecksum">
+        <xs:complexType>
+            <xs:sequence>
+                <xs:element name="checksum" type="s7:byte"/>
+            </xs:sequence>
+        </xs:complexType>
+    </xs:element>
+
+    <xs:element name="CotpParameterDisconnectAdditionalInformation">
+        <xs:complexType>
+            <xs:sequence>
+                <xs:element name="data" type="xs:hexBinary"
+                            dfdl:byteOrder="bigEndian" dfdl:lengthUnits="bytes" dfdl:lengthKind="explicit"
+                            dfdl:length="{../../parameterLength}"/>
+            </xs:sequence>
+        </xs:complexType>
+    </xs:element>
+
+    <!--
+
+        S7 Types
+
+    -->
+
+    <xs:complexType name="S7MessageType">
+        <xs:sequence>
+            <!-- S7 Magic Byte always 0x32 -->
+            <xs:element name="magicByte" type="s7:byte">
+                <xs:annotation>
+                    <xs:appinfo source="http://www.ogf.org/dfdl/">
+                        <dfdl:assert message="Magic number was not 0x32."
+                                     test="{. eq 50}"/>
+                    </xs:appinfo>
+                </xs:annotation>
+            </xs:element>
+            <xs:element name="type" type="s7:byte"/>
+            <!--
+                Unfortunately the response for a CPU Functions request follows the rules of a
+                response, however has the header structure of a request
+                (no error code or error class). As mapping to the same type is not allowed,
+                we map to strings and use that as choice-key.
+            -->
+            <xs:choice dfdl:choiceDispatchKey="{xs:string(type)}">
+                <xs:element dfdl:choiceBranchKey="1" ref="s7:S7RequestMessage"/>
+                <xs:element dfdl:choiceBranchKey="3" ref="s7:S7ResponseMessage"/>
+                <xs:element dfdl:choiceBranchKey="7" ref="s7:S7UserDataMessage"/>
+            </xs:choice>
+        </xs:sequence>
+    </xs:complexType>
+
+    <xs:element name="S7RequestMessage">
+        <xs:complexType>
+            <xs:sequence>
+                <!-- Reserved value always 0x0000 -->
+                <xs:element name="reserved" type="s7:short" fixed="0"/>
+                <xs:element name="tpduReference" type="s7:short"/>
+                <xs:element name="parametersLength" type="s7:short"/>
+                <xs:element name="payloadsLength" type="s7:short"/>
+                <xs:element name="parameters" minOccurs="0"
+                            dfdl:lengthKind="explicit" dfdl:lengthUnits="bytes" dfdl:length="{../parametersLength}"
+                            dfdl:occursCountKind="expression"
+                            dfdl:occursCount="{if(../parametersLength gt 0) then 1 else 0}">
+                    <xs:complexType>
+                        <xs:sequence>
+                            <xs:element name="parameter" maxOccurs="unbounded">
+                                <xs:complexType>
+                                    <xs:sequence>
+                                        <xs:element name="type" type="s7:byte"/>
+                                        <xs:choice dfdl:choiceDispatchKey="{xs:string(type)}">
+                                            <xs:element dfdl:choiceBranchKey="240"
+                                                        ref="s7:S7GeneralParameterSetupCommunication"/>
+                                            <xs:element dfdl:choiceBranchKey="4" ref="s7:S7RequestParameterReadVar"/>
+                                            <xs:element dfdl:choiceBranchKey="5" ref="s7:S7RequestParameterWriteVar"/>
+                                        </xs:choice>
+                                    </xs:sequence>
+                                </xs:complexType>
+                            </xs:element>
+                        </xs:sequence>
+                    </xs:complexType>
+                </xs:element>
+                <!--
+                   As we might be outputting an empty payload block for a parameter that might not have a payload,
+                   we have to output this element if the parameters are not empty. The case that the payloads are
+                   not empty but the parameters are can't happen during normal operation.
+               -->
+                <xs:element name="payloads" minOccurs="0"
+                            dfdl:lengthKind="explicit" dfdl:lengthUnits="bytes" dfdl:length="{../payloadsLength}"
+                            dfdl:occursCountKind="expression"
+                            dfdl:occursCount="{if(../parametersLength gt 0) then 1 else 0}">
+                    <xs:complexType>
+                        <xs:sequence>
+                            <!--
+                                For every parameter we'll be outputting a payload block, even if this might be empty.
+                                This is required in order to find the matching parameter for every payload we might
+                                be having. We need to match these as otherwise we couldn't determine the type of a
+                                payload as this has no type information and we need to be able to access the number
+                                of items for a read/write request in order to process the correct number of items in
+                                the payload.
+                            -->
+                            <xs:element name="payload" maxOccurs="unbounded"
+                                        dfdl:occursCountKind="expression"
+                                        dfdl:occursCount="{fn:count(../../parameters[1]/parameter)}">
+                                <xs:complexType>
+                                    <xs:sequence>
+                                        <xs:choice
+                                            dfdl:choiceDispatchKey="{xs:string(../../parameters[1]/parameter[dfdl:occursIndex()]/type)}">
+                                            <xs:element dfdl:choiceBranchKey="240"
+                                                        ref="s7:S7GeneralPayloadSetupCommunication"/>
+                                            <xs:element dfdl:choiceBranchKey="4" ref="s7:S7RequestPayloadReadVar"/>
+                                            <xs:element dfdl:choiceBranchKey="5" ref="s7:S7RequestPayloadWriteVar"/>
+                                        </xs:choice>
+                                    </xs:sequence>
+                                </xs:complexType>
+                            </xs:element>
+                        </xs:sequence>
+                    </xs:complexType>
+                </xs:element>
+            </xs:sequence>
+        </xs:complexType>
+    </xs:element>
+
+    <xs:element name="S7ResponseMessage">
+        <xs:complexType>
+            <xs:sequence>
+                <!-- Reserved value always 0x0000 -->
+                <xs:element name="reserved" type="s7:short" fixed="0"/>
+                <xs:element name="tpduReference" type="s7:short"/>
+                <xs:element name="parametersLength" type="s7:short"/>
+                <xs:element name="payloadsLength" type="s7:short"/>
+                <!-- UserData (type 7) responses don't have the error class and code -->
+                <xs:element name="errorClass" type="s7:byte" minOccurs="0"
+                            dfdl:occursCountKind="expression" dfdl:occursCount="{if(../../type eq 3) then 1 else 0}"/>
+                <xs:element name="errorCode" type="s7:byte" minOccurs="0"
+                            dfdl:occursCountKind="expression" dfdl:occursCount="{if(../../type eq 3) then 1 else 0}"/>
+                <xs:element name="parameters" minOccurs="0"
+                            dfdl:lengthKind="explicit" dfdl:lengthUnits="bytes" dfdl:length="{../parametersLength}"
+                            dfdl:occursCountKind="expression"
+                            dfdl:occursCount="{if(../parametersLength gt 0) then 1 else 0}">
+                    <xs:complexType>
+                        <xs:sequence>
+                            <xs:element name="parameter" maxOccurs="unbounded">
+                                <xs:complexType>
+                                    <xs:sequence>
+                                        <xs:element name="type" type="s7:byte"/>
+                                        <xs:choice dfdl:choiceDispatchKey="{xs:string(type)}">
+                                            <xs:element dfdl:choiceBranchKey="240"
+                                                        ref="s7:S7GeneralParameterSetupCommunication"/>
+                                            <xs:element dfdl:choiceBranchKey="4" ref="s7:S7ResponseParameterReadVar"/>
+                                            <xs:element dfdl:choiceBranchKey="5" ref="s7:S7ResponseParameterWriteVar"/>
+                                        </xs:choice>
+                                    </xs:sequence>
+                                </xs:complexType>
+                            </xs:element>
+                        </xs:sequence>
+                    </xs:complexType>
+                </xs:element>
+                <!--
+                    As we might be outputting an empty payload block for a parameter that might not have a payload,
+                    we have to output this element if the parameters are not empty. The case that the payloads are
+                    not empty but the parameters are can't happen during normal operation.
+                -->
+                <xs:element name="payloads" minOccurs="0"
+                            dfdl:lengthKind="explicit" dfdl:lengthUnits="bytes" dfdl:length="{../payloadsLength}"
+                            dfdl:occursCountKind="expression"
+                            dfdl:occursCount="{if(../parametersLength gt 0) then 1 else 0}">
+                    <xs:complexType>
+                        <xs:sequence>
+                            <!--
+                                For every parameter we'll be outputting a payload block, even if this might be empty.
+                                This is required in order to find the matching parameter for every payload we might
+                                be having. We need to match these as otherwise we couldn't determin the type of a
+                                payload as this has no type information and we need to be able to access the number
+                                of items for a read/write request in order to process the correct number of items in
+                                the payload.
+                            -->
+                            <xs:element name="payload" maxOccurs="unbounded"
+                                        dfdl:occursCountKind="expression"
+                                        dfdl:occursCount="{fn:count(../../parameters[1]/parameter)}">
+                                <xs:complexType>
+                                    <xs:sequence>
+                                        <xs:choice
+                                            dfdl:choiceDispatchKey="{xs:string(../../parameters[1]/parameter[dfdl:occursIndex()]/type)}">
+                                            <xs:element dfdl:choiceBranchKey="240"
+                                                        ref="s7:S7GeneralPayloadSetupCommunication"/>
+                                            <xs:element dfdl:choiceBranchKey="4" ref="s7:S7ResponsePayloadReadVar"/>
+                                            <xs:element dfdl:choiceBranchKey="5" ref="s7:S7ResponsePayloadWriteVar"/>
+                                        </xs:choice>
+                                    </xs:sequence>
+                                </xs:complexType>
+                            </xs:element>
+                        </xs:sequence>
+                    </xs:complexType>
+                </xs:element>
+            </xs:sequence>
+        </xs:complexType>
+    </xs:element>
+
+
+    <xs:element name="S7UserDataMessage">
+        <xs:complexType>
+            <xs:sequence>
+                <!-- Reserved value always 0x0000 -->
+                <xs:element name="reserved" type="s7:short" fixed="0"/>
+                <xs:element name="tpduReference" type="s7:short"/>
+                <xs:element name="parametersLength" type="s7:short"/>
+                <xs:element name="payloadsLength" type="s7:short"/>
+                <xs:element name="parameters" minOccurs="0"
+                            dfdl:lengthKind="explicit" dfdl:lengthUnits="bytes" dfdl:length="{../parametersLength}"
+                            dfdl:occursCountKind="expression"
+                            dfdl:occursCount="{if(../parametersLength gt 0) then 1 else 0}">
+                    <xs:complexType>
+                        <xs:sequence>
+                            <xs:element name="parameter" maxOccurs="unbounded">
+                                <xs:complexType>
+                                    <xs:sequence>
+                                        <xs:element name="type" type="s7:byte"/>
+                                        <xs:choice dfdl:choiceDispatchKey="{xs:string(type)}">
+                                            <xs:element dfdl:choiceBranchKey="0"
+                                                        ref="s7:S7UserDataParameterCPUService"/>
+                                        </xs:choice>
+                                    </xs:sequence>
+                                </xs:complexType>
+                            </xs:element>
+                        </xs:sequence>
+                    </xs:complexType>
+                </xs:element>
+                <!--
+                   As we might be outputting an empty payload block for a parameter that might not have a payload,
+                   we have to output this element if the parameters are not empty. The case that the payloads are
+                   not empty but the parameters are can't happen during normal operation.
+               -->
+                <xs:element name="payloads" minOccurs="0"
+                            dfdl:lengthKind="explicit" dfdl:lengthUnits="bytes" dfdl:length="{../payloadsLength}"
+                            dfdl:occursCountKind="expression"
+                            dfdl:occursCount="{if(../parametersLength gt 0) then 1 else 0}">
+                    <xs:complexType>
+                        <xs:sequence>
+                            <!--
+                                For every parameter we'll be outputting a payload block, even if this might be empty.
+                                This is required in order to find the matching parameter for every payload we might
+                                be having. We need to match these as otherwise we couldn't determine the type of a
+                                payload as this has no type information and we need to be able to access the number
+                                of items for a read/write request in order to process the correct number of items in
+                                the payload.
+                            -->
+                            <xs:element name="payload" maxOccurs="unbounded"
+                                        dfdl:occursCountKind="expression"
+                                        dfdl:occursCount="{fn:count(../../parameters[1]/parameter)}">
+                                <xs:complexType>
+                                    <xs:sequence>
+                                        <xs:choice
+                                            dfdl:choiceDispatchKey="{xs:string(../../parameters[1]/parameter[dfdl:occursIndex()]/type)}">
+                                            <xs:element dfdl:choiceBranchKey="0"
+                                                        ref="s7:S7UserDataPayloadCpuServices"/>
+                                        </xs:choice>
+                                    </xs:sequence>
+                                </xs:complexType>
+                            </xs:element>
+                        </xs:sequence>
+                    </xs:complexType>
+                </xs:element>
+            </xs:sequence>
+        </xs:complexType>
+    </xs:element>
+
+    <!--
+
+        Parameters.
+
+    -->
+
+    <xs:element name="S7GeneralParameterSetupCommunication">
+        <xs:complexType>
+            <xs:sequence>
+                <!-- Reserved value always 0x00 -->
+                <xs:element name="reserved" type="s7:byte" fixed="0"/>
+                <xs:element name="maxAmqCaller" type="s7:short"/>
+                <xs:element name="maxAmqCallee" type="s7:short"/>
+                <xs:element name="pduLength" type="s7:short"/>
+            </xs:sequence>
+        </xs:complexType>
+    </xs:element>
+
+    <xs:element name="S7UserDataParameterCPUService">
+        <xs:complexType>
+            <xs:sequence>
+                <!-- Fixed header 0x0112 274 -> -->
+                <xs:element name="header" type="s7:short"/><!-- fixed="274"-->
+                <xs:element name="paramLength" type="s7:byte"/><!-- fixed="4"-->
+                <!-- Request: 0x11 -> 17 -->
+                <xs:element name="typeCode" type="s7:byte"/><!-- fixed="17"-->
+                <xs:element name="type" type="xs:unsignedByte" dfdl:lengthKind="explicit" dfdl:lengthUnits="bits"
+                            dfdl:length="4"/>
+                <!-- First 4 bits: Request 0x40, last 4 bits: Function Group 0x04 = 0x44 -> 68 -->
+                <xs:element name="functionGroup" type="xs:unsignedByte" dfdl:lengthKind="explicit"
+                            dfdl:lengthUnits="bits" dfdl:length="4"/><!-- fixed="68"-->
+                <!-- READ SSL = 0x01 -->
+                <xs:element name="subFunctionGroup" type="s7:byte"/><!-- fixed="1"-->
+                <xs:element name="sequenceNumber" type="s7:byte"/>
+                <xs:element name="dataUnitReferenceNumber" type="s7:byte" minOccurs="0"
+                            dfdl:occursCountKind="expression"
+                            dfdl:occursCount="{if(../sequenceNumber eq 2) then 1 else 0}"/>
+                <xs:element name="lastDataUnit" type="s7:byte" minOccurs="0"
+                            dfdl:occursCountKind="expression"
+                            dfdl:occursCount="{if(../sequenceNumber eq 2) then 1 else 0}"/>
+                <xs:element name="errorCode" type="s7:short" minOccurs="0"
+                            dfdl:occursCountKind="expression"
+                            dfdl:occursCount="{if(../sequenceNumber eq 2) then 1 else 0}"/>
+            </xs:sequence>
+        </xs:complexType>
+    </xs:element>
+
+    <xs:element name="S7RequestParameterReadVar">
+        <xs:complexType>
+            <xs:sequence>
+                <xs:element name="numItems" type="s7:byte"/>
+                <xs:element name="items" minOccurs="0"
+                            dfdl:occursCountKind="expression" dfdl:occursCount="{if(../numItems gt 0) then 1 else 0}">
+                    <xs:complexType>
+                        <xs:sequence>
+                            <xs:element name="item" minOccurs="0" maxOccurs="unbounded"
+                                        dfdl:occursCountKind="expression" dfdl:occursCount="{../../numItems}">
+                                <xs:complexType>
+                                    <xs:sequence>
+                                        <xs:element name="type" type="s7:byte"/>
+                                        <xs:choice dfdl:choiceDispatchKey="{xs:string(type)}">
+                                            <xs:element dfdl:choiceBranchKey="18"
+                                                        ref="s7:S7RequestParameterReadVarAnyItem"/>
+                                        </xs:choice>
+                                    </xs:sequence>
+                                </xs:complexType>
+                            </xs:element>
+                        </xs:sequence>
+                    </xs:complexType>
+                </xs:element>
+            </xs:sequence>
+        </xs:complexType>
+    </xs:element>
+
+    <xs:element name="S7RequestParameterReadVarAnyItem">
+        <xs:complexType>
+            <xs:sequence>
+                <xs:element name="paramLength" type="s7:byte"/><!-- fixed="10"-->
+                <!-- Addressing Mode: Any 0x10 -> 16 -->
+                <xs:element name="addressingMode" type="s7:byte"/><!-- fixed="16"-->
+                <xs:element name="dataType" type="s7:byte"/>
+                <xs:element name="numElements" type="s7:short"/>
+                <xs:element name="dataBlockNumber" type="s7:short"/>
+                <xs:element name="memoryArea" type="s7:byte"/>
+                <!--
+                 The next 3 bytes (24 bits) contain the byte- and bit-offset,
+                 were the last byte contains the bit-offset in the last 3 bits
+                 and the byteOffset is encoded in the higher level 21 bits
+                -->
+                <xs:element name="byteOffset" type="xs:unsignedInt"
+                            dfdl:lengthKind="explicit" dfdl:lengthUnits="bits" dfdl:length="21"/>
+                <xs:element name="bitOffset" type="xs:unsignedInt"
+                            dfdl:lengthKind="explicit" dfdl:lengthUnits="bits" dfdl:length="3"/>
+            </xs:sequence>
+        </xs:complexType>
+    </xs:element>
+
+    <xs:element name="S7ResponseParameterReadVar">
+        <xs:complexType>
+            <xs:sequence>
+                <xs:element name="numItems" type="s7:byte"/>
+            </xs:sequence>
+        </xs:complexType>
+    </xs:element>
+
+    <xs:element name="S7RequestParameterWriteVar">
+        <xs:complexType>
+            <xs:sequence>
+                <xs:element name="numItems" type="s7:byte"/>
+                <xs:element name="items" minOccurs="0"
+                            dfdl:occursCountKind="expression" dfdl:occursCount="{if(../numItems gt 0) then 1 else 0}">
+                    <xs:complexType>
+                        <xs:sequence>
+                            <xs:element name="item" minOccurs="0" maxOccurs="unbounded"
+                                        dfdl:occursCountKind="expression" dfdl:occursCount="{../../numItems}">
+                                <xs:complexType>
+                                    <xs:sequence>
+                                        <xs:element name="type" type="s7:byte"/>
+                                        <xs:choice dfdl:choiceDispatchKey="{xs:string(type)}">
+                                            <xs:element dfdl:choiceBranchKey="18"
+                                                        ref="s7:S7RequestParameterWriteVarAnyItem"/>
+                                        </xs:choice>
+                                    </xs:sequence>
+                                </xs:complexType>
+                            </xs:element>
+                        </xs:sequence>
+                    </xs:complexType>
+                </xs:element>
+            </xs:sequence>
+        </xs:complexType>
+    </xs:element>
+
+    <xs:element name="S7RequestParameterWriteVarAnyItem">
+        <xs:complexType>
+            <xs:sequence>
+                <xs:element name="itemLength" type="s7:byte"/><!-- fixed="10"-->
+                <!-- Addressing Mode: Any 0x10 -> 16 -->
+                <xs:element name="addressingMode" type="s7:byte"/><!-- fixed="16"-->
+                <xs:element name="dataType" type="s7:byte"/>
+                <xs:element name="numElements" type="s7:short"/>
+                <xs:element name="dataBlockNumber" type="s7:short"/>
+                <xs:element name="memoryArea" type="s7:byte"/>
+                <!--
+                 The next 3 bytes (24 bits) contain the byte- and bit-offset,
+                 were the last byte contains the bit-offset in the last 3 bits
+                 and the byteOffset is encoded in the higher level 21 bits
+                -->
+                <xs:element name="byteOffset" type="xs:unsignedInt"
+                            dfdl:lengthKind="explicit" dfdl:lengthUnits="bits" dfdl:length="21"/>
+                <xs:element name="bitOffset" type="xs:unsignedInt"
+                            dfdl:lengthKind="explicit" dfdl:lengthUnits="bits" dfdl:length="3"/>
+            </xs:sequence>
+        </xs:complexType>
+    </xs:element>
+
+    <xs:element name="S7ResponseParameterWriteVar">
+        <xs:complexType>
+            <xs:sequence>
+                <xs:element name="numItems" type="s7:byte"/>
+            </xs:sequence>
+        </xs:complexType>
+    </xs:element>
+
+    <!--
+
+        Payloads.
+
+    -->
+
+    <xs:element name="S7GeneralPayloadSetupCommunication"
+                type="xs:hexBinary" dfdl:lengthKind="explicit" dfdl:length="0"/>
+
+    <xs:element name="S7UserDataPayloadCpuServices">
+        <xs:complexType>
+            <xs:sequence>
+                <xs:element name="returnCode" type="s7:byte"/>
+                <xs:element name="transportSize" type="s7:byte"/><!-- fixed="9"-->
+                <xs:element name="length" type="s7:short"/>
+                <xs:element name="sslId" type="s7:short" minOccurs="0"
+                            dfdl:occursCountKind="expression"
+                            dfdl:occursCount="{if(../returnCode eq 255) then 1 else 0}"/>
+                <xs:element name="sslIndex" type="s7:short" minOccurs="0"
+                            dfdl:occursCountKind="expression"
+                            dfdl:occursCount="{if(../returnCode eq 255) then 1 else 0}"/>
+                <xs:element name="partialList" minOccurs="0"
+                            dfdl:occursCountKind="expression" dfdl:occursCount="{if((../returnCode eq 255) and (../length gt 4)) then 1 else 0}">
+                    <xs:complexType>
+                        <xs:sequence>
+                            <xs:element name="partialListLengthInBytes" type="s7:short"/>
+                            <xs:element name="partialListCount" type="s7:short"/>
+                            <xs:element name="sslDataRecords">
+                                <xs:complexType>
+                                    <xs:sequence>
+                                        <xs:element name="sslDataRecord" maxOccurs="unbounded"
+                                                    dfdl:occursCountKind="expression" dfdl:occursCount="{../../partialListCount}">
+                                            <xs:complexType>
+                                                <xs:sequence>
+                                                    <xs:choice dfdl:choiceDispatchKey="{xs:string(../../../sslId[1])}">
+                                                        <xs:element dfdl:choiceBranchKey="17"
+                                                                    ref="s7:S7ResponsePayloadCpuServicesSslDataRecordModuleIdentification"/>
+                                                    </xs:choice>
+                                                </xs:sequence>
+                                            </xs:complexType>
+                                        </xs:element>
+                                    </xs:sequence>
+                                </xs:complexType>
+                            </xs:element>
+                        </xs:sequence>
+                    </xs:complexType>
+                </xs:element>
+            </xs:sequence>
+        </xs:complexType>
+    </xs:element>
+
+    <xs:element name="S7ResponsePayloadCpuServicesSslDataRecordModuleIdentification">
+        <xs:complexType>
+            <xs:sequence>
+                <xs:element name="index" type="s7:short"/>
+                <xs:element name="articleNumber" type="xs:string" dfdl:textTrimKind="none" dfdl:alignmentUnits="bytes"
+                            dfdl:lengthKind="explicit" dfdl:lengthUnits="bytes" dfdl:length="20"/>
+                <xs:element name="bgType" type="s7:short"/>
+                <xs:element name="moduleOrOsVersion" type="s7:short"/>
+                <xs:element name="pgDescriptionFileVersion" type="s7:short"/>
+            </xs:sequence>
+        </xs:complexType>
+    </xs:element>
+
+    <xs:element name="S7RequestPayloadReadVar"
+                type="xs:hexBinary" dfdl:lengthKind="explicit" dfdl:length="0"/>
+
+    <xs:element name="S7ResponsePayloadReadVar">
+        <xs:complexType>
+            <xs:sequence>
+                <!-- The number of items which should be read is transmitted in the matching parameter -->
+                <xs:element name="numItems" type="s7:byte"
+                            dfdl:inputValueCalc="{
+                                ../../../../parameters[1]/parameter[dfdl:occursIndex()]/s7:S7ResponseParameterReadVar/numItems
+                            }"/>
+                <xs:element name="item" minOccurs="0" maxOccurs="unbounded"
+                            dfdl:occursCountKind="expression" dfdl:occursCount="{../numItems}">
+                    <xs:complexType>
+                        <xs:sequence>
+                            <xs:element name="returnCode" type="s7:byte"/>
+                            <xs:element name="transportSize" type="s7:byte"/>
+                            <xs:element name="rawLength" type="s7:short"/>
+                            <!--
+                                For some reason the types BIT, BYTE_WORD_DWORD and INTEGER are transferred in "bits",
+                                the rest is transferred in "bytes"
+                            -->
+                            <xs:element name="lengthInBytes" type="s7:short" dfdl:inputValueCalc="{
+                                    xs:unsignedShort(if((../transportSize eq 3) or (../transportSize eq 4) or (../transportSize eq 5))
+                                            then fn:ceiling(xs:double(../rawLength div 8))
+                                            else ../rawLength)}"/>
+                            <xs:element name="data" type="xs:hexBinary"
+                                        dfdl:byteOrder="bigEndian" dfdl:lengthUnits="bytes" dfdl:lengthKind="explicit"
+                                        dfdl:length="{../lengthInBytes}"/>
+                            <!--
+                                Transport sizes: BIT, BYTE_WORD_DWORD and OCTET_STRING require a blank byte.
+                                However only if this is not the last item in the result.
+                            -->
+                            <xs:element name="fillByte" type="s7:byte" minOccurs="0"
+                                        dfdl:occursCountKind="expression" dfdl:occursCount="{
+                                            if(((../lengthInBytes mod 2) eq 1) and
+                                                (dfdl:occursIndex() ne ../../numItems)) then 1 else 0}"/>
+                        </xs:sequence>
+                    </xs:complexType>
+                </xs:element>
+            </xs:sequence>
+        </xs:complexType>
+    </xs:element>
+
+    <xs:element name="S7RequestPayloadWriteVar">
+        <xs:complexType>
+            <xs:sequence>
+                <!-- The number of items which should be read is transmitted in the matching parameter -->
+                <xs:element name="numItems" type="s7:byte"
+                            dfdl:inputValueCalc="{
+                                ../../../../parameters[1]/parameter[dfdl:occursIndex()]/s7:S7RequestParameterWriteVar/numItems
+                            }"/>
+                <xs:element name="item" minOccurs="0" maxOccurs="unbounded"
+                            dfdl:occursCountKind="expression" dfdl:occursCount="{../numItems}">
+                    <xs:complexType>
+                        <xs:sequence>
+                            <xs:element name="returnCode" type="s7:byte"/>
+                            <xs:element name="transportSize" type="s7:byte"/>
+                            <xs:element name="rawLength" type="s7:short"/>
+                            <!--
+                                For some reason the types BIT, BYTE_WORD_DWORD and INTEGER are transferred in "bits",
+                                the rest is transferred in "bytes"
+                            -->
+                            <xs:element name="lengthInBytes" type="s7:short" dfdl:inputValueCalc="{
+                                    xs:unsignedShort(if((../transportSize eq 3) or (../transportSize eq 4) or (../transportSize eq 5))
+                                            then fn:ceiling(../rawLength div 8)
+                                            else ../rawLength)}"/>
+                            <xs:element name="data" type="xs:hexBinary"
+                                        dfdl:byteOrder="bigEndian" dfdl:lengthUnits="bytes" dfdl:lengthKind="explicit"
+                                        dfdl:length="{../lengthInBytes}"/>
+                            <!--
+                                It seems that the item payload must always be an even number of bytes. So if it's
+                                not an even number, add a fill byte.
+                            -->
+                            <xs:element name="fillByte" type="s7:byte" minOccurs="0"
+                                        dfdl:occursCountKind="expression" dfdl:occursCount="{
+                                            if(((../lengthInBytes mod 2) eq 1) and
+                                                (dfdl:occursIndex() ne ../../numItems)) then 1 else 0}"/>
+                        </xs:sequence>
+                    </xs:complexType>
+                </xs:element>
+            </xs:sequence>
+        </xs:complexType>
+    </xs:element>
+
+    <xs:element name="S7ResponsePayloadWriteVar">
+        <xs:complexType>
+            <xs:sequence>
+                <!-- The number of items which should be read is transmitted in the matching parameter -->
+                <xs:element name="numItems" type="s7:byte"
+                            dfdl:inputValueCalc="{
+                                ../../../../parameters[1]/parameter[dfdl:occursIndex()]/s7:S7ResponseParameterWriteVar/numItems
+                            }"/>
+                <xs:element name="item" minOccurs="0" maxOccurs="unbounded"
+                            dfdl:occursCountKind="expression" dfdl:occursCount="{../numItems}">
+                    <xs:complexType>
+                        <xs:sequence>
+                            <xs:element name="returnCode" type="s7:byte"/>
+                        </xs:sequence>
+                    </xs:complexType>
+                </xs:element>
+            </xs:sequence>
+        </xs:complexType>
+    </xs:element>
+
+</xs:schema>
\ No newline at end of file