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

cdutz pushed a commit to branch feature/external-types
in repository https://gitbox.apache.org/repos/asf/plc4x.git

commit 436041b0a2284b658f9724732824ed728cbf4bf8
Author: Christofer Dutz <[email protected]>
AuthorDate: Tue Oct 15 23:30:33 2024 +0200

    chore: Added support for "external-types" to the go code-generation 
templates.
---
 .../BaseFreemarkerLanguageTemplateHelper.java      |   7 +
 .../freemarker/FreemarkerLanguageOutput.java       |  14 +-
 .../apache/plc4x/language/c/CLanguageOutput.java   |   6 +-
 .../apache/plc4x/language/cs/CsLanguageOutput.java |   4 +-
 .../language/cs/CsLanguageTemplateHelper.java      |   4 +-
 .../apache/plc4x/language/go/GoLanguageOutput.java |   4 +-
 .../language/go/GoLanguageTemplateHelper.java      |  35 +-
 .../templates/go/data-io-template.go.ftlh          |  12 +-
 .../resources/templates/go/enum-template.go.ftlh   |  25 +-
 .../plc4x/language/java/JavaLanguageOutput.java    |   8 +-
 .../language/java/JavaLanguageTemplateHelper.java  |  12 +-
 .../templates/java/complex-type-template.java.ftlh |   1 +
 .../templates/java/data-io-template.java.ftlh      |   1 +
 .../templates/java/enum-template.java.ftlh         |   3 +-
 .../language/python/PythonLanguageOutput.java      |   2 +-
 .../plugins/codegenerator/language/mspec/MSpec.g4  |   4 +-
 .../mspec/parser/MessageFormatListener.java        |   4 +-
 plc4go/internal/ads/Connection.go                  |   2 +-
 plc4go/internal/ads/DriverContext.go               |   2 +-
 plc4go/internal/ads/Reader.go                      |   3 +-
 plc4go/internal/ads/TagHandler.go                  |   4 +-
 plc4go/internal/ads/Writer.go                      |   2 +-
 plc4go/internal/eip/Tag.go                         |   2 +-
 plc4go/internal/modbus/Tag.go                      |   2 +-
 plc4go/internal/opcua/Tag.go                       |   2 +-
 plc4go/internal/s7/Tag.go                          |   2 +-
 plc4go/internal/simulated/Tag.go                   |   2 +-
 plc4go/pkg/api/values/plc_value.go                 |   2 +-
 plc4go/pkg/api/values/value_test.go                |   2 +-
 plc4go/pom.xml                                     |   3 +
 .../protocols/ads/readwrite/model/AdsDataType.go   |  89 ++---
 plc4go/protocols/ads/readwrite/model/DataItem.go   | 120 +++----
 .../protocols/ads/readwrite/model/PlcValueType.go  | 387 ---------------------
 plc4j/drivers/ads/pom.xml                          |   3 +
 .../plc4x/java/ads/readwrite/AdsDataType.java      |   1 +
 .../apache/plc4x/java/ads/readwrite/DataItem.java  |   1 +
 .../plc4x/java/ads/readwrite/PlcValueType.java     |  84 -----
 .../plc4x/java/ads/protocol/AdsProtocolLogic.java  |   6 +-
 pom.xml                                            |   2 +-
 .../ads/src/main/resources/protocols/ads/ads.mspec |  55 +--
 40 files changed, 253 insertions(+), 671 deletions(-)

diff --git 
a/code-generation/language-base-freemarker/src/main/java/org/apache/plc4x/plugins/codegenerator/protocol/freemarker/BaseFreemarkerLanguageTemplateHelper.java
 
b/code-generation/language-base-freemarker/src/main/java/org/apache/plc4x/plugins/codegenerator/protocol/freemarker/BaseFreemarkerLanguageTemplateHelper.java
index 3518081c7e..8cb67dd16f 100644
--- 
a/code-generation/language-base-freemarker/src/main/java/org/apache/plc4x/plugins/codegenerator/protocol/freemarker/BaseFreemarkerLanguageTemplateHelper.java
+++ 
b/code-generation/language-base-freemarker/src/main/java/org/apache/plc4x/plugins/codegenerator/protocol/freemarker/BaseFreemarkerLanguageTemplateHelper.java
@@ -29,6 +29,7 @@ import 
org.apache.plc4x.plugins.codegenerator.types.definitions.*;
 import org.apache.plc4x.plugins.codegenerator.types.enums.EnumValue;
 import org.apache.plc4x.plugins.codegenerator.types.fields.*;
 import org.apache.plc4x.plugins.codegenerator.types.references.*;
+import org.apache.plc4x.plugins.codegenerator.types.terms.BooleanLiteral;
 import org.apache.plc4x.plugins.codegenerator.types.terms.Term;
 import org.apache.plc4x.plugins.codegenerator.types.terms.VariableLiteral;
 import org.slf4j.Logger;
@@ -373,4 +374,10 @@ public abstract class BaseFreemarkerLanguageTemplateHelper 
implements Freemarker
     public void info(String message, Object... objects) {
         LOGGER.info(message, objects);
     }
+
+    public boolean isExternal() {
+        Optional<Term> external = thisType.getAttribute("external");
+        return external.isPresent() && (external.get() instanceof 
BooleanLiteral) && ((BooleanLiteral) external.get()).getValue();
+    }
+
 }
diff --git 
a/code-generation/language-base-freemarker/src/main/java/org/apache/plc4x/plugins/codegenerator/protocol/freemarker/FreemarkerLanguageOutput.java
 
b/code-generation/language-base-freemarker/src/main/java/org/apache/plc4x/plugins/codegenerator/protocol/freemarker/FreemarkerLanguageOutput.java
index d69d13298b..68cc3e29fc 100644
--- 
a/code-generation/language-base-freemarker/src/main/java/org/apache/plc4x/plugins/codegenerator/protocol/freemarker/FreemarkerLanguageOutput.java
+++ 
b/code-generation/language-base-freemarker/src/main/java/org/apache/plc4x/plugins/codegenerator/protocol/freemarker/FreemarkerLanguageOutput.java
@@ -41,7 +41,9 @@ public abstract class FreemarkerLanguageOutput implements 
LanguageOutput {
     private static final Logger LOGGER = 
LoggerFactory.getLogger(FreemarkerLanguageOutput.class);
 
     @Override
-    public void generate(File outputDir, String version, String languageName, 
String protocolName, String outputFlavor, Map<String, TypeDefinition> types,
+    public void generate(File outputDir, String version, String languageName, 
String protocolName, String outputFlavor,
+                         Map<String, TypeDefinition> types,
+                         Map<String, String> externalTypes,
                          Map<String, String> options)
         throws GenerationException {
 
@@ -73,7 +75,7 @@ public abstract class FreemarkerLanguageOutput implements 
LanguageOutput {
             typeContext.put("languageName", languageName);
             typeContext.put("protocolName", protocolName);
             typeContext.put("outputFlavor", outputFlavor);
-            typeContext.put("helper", getHelper(null, protocolName, 
outputFlavor, types, options));
+            typeContext.put("helper", getHelper(null, protocolName, 
outputFlavor, types, options, externalTypes));
             typeContext.put("tracer", Tracer.start("global"));
             typeContext.putAll(options);
 
@@ -95,7 +97,7 @@ public abstract class FreemarkerLanguageOutput implements 
LanguageOutput {
             typeContext.put("outputFlavor", outputFlavor);
             typeContext.put("typeName", typeEntry.getKey());
             typeContext.put("type", typeEntry.getValue());
-            typeContext.put("helper", getHelper(typeEntry.getValue(), 
protocolName, outputFlavor, types, options));
+            typeContext.put("helper", getHelper(typeEntry.getValue(), 
protocolName, outputFlavor, types, externalTypes, options));
             typeContext.put("tracer", Tracer.start("types"));
 
             // Depending on the type, get the corresponding list of templates.
@@ -127,7 +129,7 @@ public abstract class FreemarkerLanguageOutput implements 
LanguageOutput {
             typeContext.put("languageName", languageName);
             typeContext.put("protocolName", protocolName);
             typeContext.put("outputFlavor", outputFlavor);
-            typeContext.put("helper", getHelper(null, protocolName, 
outputFlavor, types, options));
+            typeContext.put("helper", getHelper(null, protocolName, 
outputFlavor, types, options, externalTypes));
             typeContext.putAll(options);
 
             for (Template template : miscTemplateList) {
@@ -155,7 +157,7 @@ public abstract class FreemarkerLanguageOutput implements 
LanguageOutput {
             // Extract the output path from the first line of the generated 
content
             String outputFileName = input.readLine();
             // If there is no outputFileName, this file should be skipped.
-            if (outputFileName == null) {
+            if ((outputFileName == null) || outputFileName.isEmpty()) {
                 return;
             }
             File outputFile = new File(outputDir, outputFileName);
@@ -212,6 +214,6 @@ public abstract class FreemarkerLanguageOutput implements 
LanguageOutput {
     }
 
     protected abstract FreemarkerLanguageTemplateHelper 
getHelper(TypeDefinition thisType, String protocolName, String flavorName, 
Map<String, TypeDefinition> types,
-                                                                  Map<String, 
String> options);
+                                                                  Map<String, 
String> externalTypes, Map<String, String> options);
 
 }
diff --git 
a/code-generation/language-c/src/main/java/org/apache/plc4x/language/c/CLanguageOutput.java
 
b/code-generation/language-c/src/main/java/org/apache/plc4x/language/c/CLanguageOutput.java
index d16425df50..6c1df72675 100644
--- 
a/code-generation/language-c/src/main/java/org/apache/plc4x/language/c/CLanguageOutput.java
+++ 
b/code-generation/language-c/src/main/java/org/apache/plc4x/language/c/CLanguageOutput.java
@@ -75,8 +75,10 @@ public class CLanguageOutput extends 
FreemarkerLanguageOutput {
     }
 
     @Override
-    protected FreemarkerLanguageTemplateHelper getHelper(TypeDefinition 
thisType, String protocolName, String flavorName, Map<String, TypeDefinition> 
types,
-        Map<String, String> options) {
+    protected FreemarkerLanguageTemplateHelper getHelper(TypeDefinition 
thisType, String protocolName, String flavorName,
+                                                         Map<String, 
TypeDefinition> types,
+                                                         Map<String, String> 
externalTypes,
+                                                         Map<String, String> 
options) {
         return new CLanguageTemplateHelper(thisType, protocolName, flavorName, 
types);
     }
 
diff --git 
a/code-generation/language-cs/src/main/java/org/apache/plc4x/language/cs/CsLanguageOutput.java
 
b/code-generation/language-cs/src/main/java/org/apache/plc4x/language/cs/CsLanguageOutput.java
index 68d320442d..29ef5cd7c8 100644
--- 
a/code-generation/language-cs/src/main/java/org/apache/plc4x/language/cs/CsLanguageOutput.java
+++ 
b/code-generation/language-cs/src/main/java/org/apache/plc4x/language/cs/CsLanguageOutput.java
@@ -69,8 +69,8 @@ public class CsLanguageOutput extends 
FreemarkerLanguageOutput {
     }
 
     @Override
-    protected FreemarkerLanguageTemplateHelper getHelper(TypeDefinition 
thisType, String protocolName, String flavorName, Map<String, TypeDefinition> 
types, Map<String, String> options) {
-        return new CsLanguageTemplateHelper(thisType, protocolName, 
flavorName, types, options);
+    protected FreemarkerLanguageTemplateHelper getHelper(TypeDefinition 
thisType, String protocolName, String flavorName, Map<String, TypeDefinition> 
types, Map<String, String> externalTypes, Map<String, String> options) {
+        return new CsLanguageTemplateHelper(thisType, protocolName, 
flavorName, types, externalTypes, options);
     }
 
 }
diff --git 
a/code-generation/language-cs/src/main/java/org/apache/plc4x/language/cs/CsLanguageTemplateHelper.java
 
b/code-generation/language-cs/src/main/java/org/apache/plc4x/language/cs/CsLanguageTemplateHelper.java
index 8a4f5f3195..623ddd71a0 100644
--- 
a/code-generation/language-cs/src/main/java/org/apache/plc4x/language/cs/CsLanguageTemplateHelper.java
+++ 
b/code-generation/language-cs/src/main/java/org/apache/plc4x/language/cs/CsLanguageTemplateHelper.java
@@ -40,7 +40,7 @@ public class CsLanguageTemplateHelper extends 
BaseFreemarkerLanguageTemplateHelp
     private final Map<String, String> options;
 
     public CsLanguageTemplateHelper(TypeDefinition thisType, String 
protocolName, String flavorName, Map<String, TypeDefinition> types,
-                                      Map<String, String> options) {
+                                    Map<String, String> externalTypes, 
Map<String, String> options) {
         super(thisType, protocolName, flavorName, types);
         this.options = options;
     }
@@ -55,7 +55,7 @@ public class CsLanguageTemplateHelper extends 
BaseFreemarkerLanguageTemplateHelp
     }
 
     public String packageName(String protocolName, String languageName, String 
languageFlavorName) {
-        return Optional.ofNullable(options.get("package")).orElseGet(() ->
+        return Optional.ofNullable((String) 
options.get("package")).orElseGet(() ->
             "org.apache.plc4x." + String.join("", languageName.split("-")) + 
"." +
                 String.join("", protocolName.split("-")) + "." +
                 String.join("", languageFlavorName.split("-")));
diff --git 
a/code-generation/language-go/src/main/java/org/apache/plc4x/language/go/GoLanguageOutput.java
 
b/code-generation/language-go/src/main/java/org/apache/plc4x/language/go/GoLanguageOutput.java
index a9f05727cd..2472eb0af2 100644
--- 
a/code-generation/language-go/src/main/java/org/apache/plc4x/language/go/GoLanguageOutput.java
+++ 
b/code-generation/language-go/src/main/java/org/apache/plc4x/language/go/GoLanguageOutput.java
@@ -76,8 +76,8 @@ public class GoLanguageOutput extends 
FreemarkerLanguageOutput {
 
     @Override
     protected FreemarkerLanguageTemplateHelper getHelper(TypeDefinition 
thisType, String protocolName, String flavorName, Map<String, TypeDefinition> 
types,
-                                                         Map<String, String> 
options) {
-        return new GoLanguageTemplateHelper(thisType, protocolName, 
flavorName, types, options);
+                                                         Map<String, String> 
externalTypes, Map<String, String> options) {
+        return new GoLanguageTemplateHelper(thisType, protocolName, 
flavorName, types, externalTypes, options);
     }
 
 }
diff --git 
a/code-generation/language-go/src/main/java/org/apache/plc4x/language/go/GoLanguageTemplateHelper.java
 
b/code-generation/language-go/src/main/java/org/apache/plc4x/language/go/GoLanguageTemplateHelper.java
index fc709ff707..0ef938217f 100644
--- 
a/code-generation/language-go/src/main/java/org/apache/plc4x/language/go/GoLanguageTemplateHelper.java
+++ 
b/code-generation/language-go/src/main/java/org/apache/plc4x/language/go/GoLanguageTemplateHelper.java
@@ -46,6 +46,7 @@ public class GoLanguageTemplateHelper extends 
BaseFreemarkerLanguageTemplateHelp
     private static final Logger LOGGER = 
LoggerFactory.getLogger(GoLanguageTemplateHelper.class);
 
     private final Map<String, String> options;
+    private final Map<String, String> externalTypes;
 
     // TODO: we could condense it to one import set as these can be emitted 
per template and are not hardcoded anymore
 
@@ -54,9 +55,10 @@ public class GoLanguageTemplateHelper extends 
BaseFreemarkerLanguageTemplateHelp
     public final SortedSet<String> requiredImportsForDataIo = new TreeSet<>();
 
     public GoLanguageTemplateHelper(TypeDefinition thisType, String 
protocolName, String flavorName, Map<String, TypeDefinition> types,
-                                    Map<String, String> options) {
+                                    Map<String, String> externalTypes, 
Map<String, String> options) {
         super(thisType, protocolName, flavorName, types);
         this.options = options;
+        this.externalTypes = externalTypes;
     }
 
     public String fileName(String protocolName, String languageName, String 
languageFlavorName) {
@@ -111,6 +113,31 @@ public class GoLanguageTemplateHelper extends 
BaseFreemarkerLanguageTemplateHelp
 
     @Override
     public String getLanguageTypeNameForTypeReference(TypeReference 
typeReference) {
+        if(externalTypes != null) {
+            String typeName = null;
+            if(typeReference.isComplexTypeReference()) {
+                typeName = 
typeReference.asComplexTypeReference().orElseThrow().getName();
+            } else if(typeReference.isEnumTypeReference()) {
+                typeName = 
typeReference.asEnumTypeReference().orElseThrow().getName();
+            }
+            if((typeName != null) && externalTypes.containsKey(typeName)) {
+                String replacement = externalTypes.get(typeName);
+                String namespaceAlias;
+                if(replacement.contains(" ")) {
+                    namespaceAlias = replacement.split(" ")[0];
+                    String pkg = replacement.split(" ")[1];
+                    pkg = pkg.substring(1, pkg.length() - 1);
+                    emitDataIoRequiredImport(namespaceAlias, pkg);
+                    emitRequiredImport(namespaceAlias, pkg);
+                } else {
+                    String[] split = replacement.split("/");
+                    namespaceAlias = split[split.length - 1];
+                    emitDataIoRequiredImport(replacement);
+                    emitRequiredImport(replacement);
+                }
+                return namespaceAlias + "." + typeName;
+            }
+        }
         return getLanguageTypeNameForTypeReference(typeReference, null);
     }
 
@@ -1900,4 +1927,10 @@ public class GoLanguageTemplateHelper extends 
BaseFreemarkerLanguageTemplateHelp
         return options.getOrDefault("generate-properties-for-reserved-fields", 
"false").equals("true");
     }
 
+    public String getExternalTypeImports() {
+        StringBuilder imports = new StringBuilder();
+        externalTypes.forEach((mspecTypeName, javaTypeName) -> 
imports.append("import ").append(javaTypeName).append(";\n"));
+        return imports.toString();
+    }
+
 }
diff --git 
a/code-generation/language-go/src/main/resources/templates/go/data-io-template.go.ftlh
 
b/code-generation/language-go/src/main/resources/templates/go/data-io-template.go.ftlh
index 33df8eb5cc..3a727add68 100644
--- 
a/code-generation/language-go/src/main/resources/templates/go/data-io-template.go.ftlh
+++ 
b/code-generation/language-go/src/main/resources/templates/go/data-io-template.go.ftlh
@@ -93,7 +93,11 @@ func ${type.name}ParseWithBuffer(ctx context.Context, 
readBuffer utils.ReadBuffe
                         <#assign enumValue=helper.toParseExpression(null, 
parserArguments[discriminatorValueTerm?index].type, discriminatorValueTerm, 
parserArguments)>
                         <#assign 
enumValueWithoutTraces=tracer.removeTraces(enumValue)>
                         <#assign 
enumValueTraces=tracer.extractTraces(enumValue)>
-                        
${enumTypeTraces}${enumValueTraces}${enumTypeWithoutTraces}_${enumValueWithoutTraces?replace("Get","")?replace("()","")}
+                                               <#if 
enumTypeWithoutTraces?contains(".")>
+                                                       
${enumTypeTraces}${enumTypeWithoutTraces?split(".")[0]}.${enumValueWithoutTraces?replace("Get","")?replace("()","")}
+                                               <#else>
+                                                       
${enumTypeTraces}${enumValueTraces}${enumTypeWithoutTraces}_${enumValueWithoutTraces?replace("Get","")?replace("()","")}
+                                               </#if>
                                        <#else>
                                                
${helper.toParseExpression(null, 
parserArguments[discriminatorValueTerm?index].type, discriminatorValueTerm, 
parserArguments)}
                                        </#if>
@@ -353,7 +357,11 @@ func ${type.name}SerializeWithWriteBuffer(ctx 
context.Context, writeBuffer utils
                         <#assign enumValue=helper.toParseExpression(null, 
typeRef, discriminatorValueTerm, parserArguments)>
                         <#assign 
enumValueWithoutTraces=tracer.removeTraces(enumValue)>
                         <#assign 
enumValueTraces=tracer.extractTraces(enumValue)>
-                        
${enumTypeTraces}${enumValueTraces}${enumTypeWithoutTraces}_${enumValueWithoutTraces?replace("Get","")?replace("()","")}
+                                               <#if 
enumTypeWithoutTraces?contains(".")>
+                                                       
${enumTypeTraces}${enumTypeWithoutTraces?split(".")[0]}.${enumValueWithoutTraces?replace("Get","")?replace("()","")}
+                                               <#else>
+                                                       
${enumTypeTraces}${enumValueTraces}${enumTypeWithoutTraces}_${enumValueWithoutTraces?replace("Get","")?replace("()","")}
+                                               </#if>
                                        <#else>
                                                
${helper.toParseExpression(null, typeRef, discriminatorValueTerm, 
parserArguments)}
                                        </#if>
diff --git 
a/code-generation/language-go/src/main/resources/templates/go/enum-template.go.ftlh
 
b/code-generation/language-go/src/main/resources/templates/go/enum-template.go.ftlh
index 88a20f9bbb..cc2ee762b4 100644
--- 
a/code-generation/language-go/src/main/resources/templates/go/enum-template.go.ftlh
+++ 
b/code-generation/language-go/src/main/resources/templates/go/enum-template.go.ftlh
@@ -26,7 +26,7 @@
 <#-- @ftlvariable name="helper" 
type="org.apache.plc4x.language.go.GoLanguageTemplateHelper" -->
 <#-- @ftlvariable name="tracer" 
type="org.apache.plc4x.plugins.codegenerator.protocol.freemarker.Tracer" -->
 <#-- @ftlvariable name="type" 
type="org.apache.plc4x.plugins.codegenerator.types.definitions.EnumTypeDefinition"
 -->
-${helper.fileName(protocolName, languageName, outputFlavor)?replace(".", 
"/")}/model/${type.name}.go
+<#if !helper.isExternal()>${helper.fileName(protocolName, languageName, 
outputFlavor)?replace(".", "/")}/model/${type.name}.go</#if>
 /*
  * Licensed to the Apache Software Foundation (ASF) under one
  * or more contributor license agreements.  See the NOTICE file
@@ -48,16 +48,30 @@ ${helper.fileName(protocolName, languageName, 
outputFlavor)?replace(".", "/")}/m
 
 package model
 
+<#macro importSectionWithContentBelow>
+       <#local sectionContent><#nested></#local>
 import (
        "context"
        "fmt"
 
        "github.com/apache/plc4x/plc4go/spi/utils"
+       <#if helper.getRequiredImports()?has_content>
+               <#list helper.getRequiredImports() as import>
+                       ${import}
+               </#list>
+       </#if>
 
        "github.com/pkg/errors"
        "github.com/rs/zerolog"
 )
 
+       ${sectionContent}
+</#macro>
+
+<#macro emitImport import>${helper.emitDataIoRequiredImport(import)}</#macro>
+<#macro emitImportWithAlias alias 
import>${helper.emitDataIoRequiredImport(alias, import)}</#macro>
+
+<@importSectionWithContentBelow><@emitImport 
import="github.com/apache/plc4x/plc4go/spi/utils" /><@emitImport 
import="github.com/apache/plc4x/plc4go/spi/values" /><@emitImportWithAlias 
alias="api" import="github.com/apache/plc4x/plc4go/pkg/api/values" />
 // Code generated by code-generation. DO NOT EDIT.
 
 <#assign baseType><#if 
type.type.isPresent()>${helper.getLanguageTypeNameForTypeReference(type.type.orElseThrow())}<#else>string</#if></#assign>
@@ -108,7 +122,13 @@ func (e ${type.name}) ${constantName?cap_first}() 
${helper.getLanguageTypeNameFo
                case ${enumValue.value}: { /* '${enumValue.value}' */
                    <#if constantType.isNonSimpleTypeReference()>
                        <#if constantType.isEnumTypeReference()>
-                       return <#if helper.escapeEnumValue(constantType, 
constantValue) = "0">${helper.escapeEnumValue(constantType, 
constantValue)}<#else>${helper.getLanguageTypeNameForTypeReference(constantType)}_${helper.escapeEnumValue(constantType,
 constantValue)}</#if>
+                                       <#if 
helper.escapeEnumValue(constantType, constantValue) = "0">
+                                               return 
${helper.escapeEnumValue(constantType, constantValue)}
+                                       <#elseif 
helper.getLanguageTypeNameForTypeReference(constantType)?contains(".")>
+                                               return 
${helper.getLanguageTypeNameForTypeReference(constantType)?split(".")[0]}.${helper.escapeEnumValue(constantType,
 constantValue)}
+                                       <#else>
+                                               return 
${helper.getLanguageTypeNameForTypeReference(constantType)}_${helper.escapeEnumValue(constantType,
 constantValue)}
+                                       </#if>
                            <#else>
             return ${helper.escapeEnumValue(constantType, constantValue)}
                 </#if>
@@ -245,5 +265,6 @@ func (e ${type.name}) PLC4XEnumName() string {
 func (e ${type.name}) String() string {
        return e.PLC4XEnumName()
 }
+</@importSectionWithContentBelow>
 
 </#outputformat>
\ No newline at end of file
diff --git 
a/code-generation/language-java/src/main/java/org/apache/plc4x/language/java/JavaLanguageOutput.java
 
b/code-generation/language-java/src/main/java/org/apache/plc4x/language/java/JavaLanguageOutput.java
index cde7c11651..bdf8ed5385 100644
--- 
a/code-generation/language-java/src/main/java/org/apache/plc4x/language/java/JavaLanguageOutput.java
+++ 
b/code-generation/language-java/src/main/java/org/apache/plc4x/language/java/JavaLanguageOutput.java
@@ -53,7 +53,9 @@ public class JavaLanguageOutput extends 
FreemarkerLanguageOutput {
             // Generates additional properties to save parser arguments.
             "generate-properties-for-parser-arguments",
             // Generates additional properties to save values of reserved 
fields for the case that the value differs from the expected value.
-            "generate-properties-for-reserved-fields"));
+            "generate-properties-for-reserved-fields",
+            // Map containing the type-names for external types.
+            "external"));
     }
 
     @Override
@@ -85,8 +87,8 @@ public class JavaLanguageOutput extends 
FreemarkerLanguageOutput {
 
     @Override
     protected FreemarkerLanguageTemplateHelper getHelper(TypeDefinition 
thisType, String protocolName, String flavorName, Map<String, TypeDefinition> 
types,
-                                                         Map<String, String> 
options) {
-        return new JavaLanguageTemplateHelper(thisType, protocolName, 
flavorName, types, options);
+                                                         Map<String, String> 
externalTypes, Map<String, String> options) {
+        return new JavaLanguageTemplateHelper(thisType, protocolName, 
flavorName, types, externalTypes, options);
     }
 
     @Override
diff --git 
a/code-generation/language-java/src/main/java/org/apache/plc4x/language/java/JavaLanguageTemplateHelper.java
 
b/code-generation/language-java/src/main/java/org/apache/plc4x/language/java/JavaLanguageTemplateHelper.java
index da511586c2..a022f07830 100644
--- 
a/code-generation/language-java/src/main/java/org/apache/plc4x/language/java/JavaLanguageTemplateHelper.java
+++ 
b/code-generation/language-java/src/main/java/org/apache/plc4x/language/java/JavaLanguageTemplateHelper.java
@@ -42,10 +42,12 @@ import java.util.function.Function;
 public class JavaLanguageTemplateHelper extends 
BaseFreemarkerLanguageTemplateHelper {
 
     private final Map<String, String> options;
+    private final Map<String, String> externalTypes;
 
     public JavaLanguageTemplateHelper(TypeDefinition thisType, String 
protocolName, String flavorName, Map<String, TypeDefinition> types,
-                                      Map<String, String> options) {
+                                      Map<String, String> externalTypes, 
Map<String, String> options) {
         super(thisType, protocolName, flavorName, types);
+        this.externalTypes = externalTypes;
         this.options = options;
     }
 
@@ -54,7 +56,7 @@ public class JavaLanguageTemplateHelper extends 
BaseFreemarkerLanguageTemplateHe
     }
 
     public String packageName(String protocolName, String languageName, String 
languageFlavorName) {
-        return Optional.ofNullable(options.get("package")).orElseGet(() ->
+        return Optional.ofNullable((String) 
options.get("package")).orElseGet(() ->
             "org.apache.plc4x." + String.join("", languageName.split("-")) + 
"." +
                 String.join("", protocolName.split("-")) + "." +
                 String.join("", languageFlavorName.split("-")));
@@ -1392,4 +1394,10 @@ public class JavaLanguageTemplateHelper extends 
BaseFreemarkerLanguageTemplateHe
         return options.getOrDefault("generate-properties-for-reserved-fields", 
"false").equals("true");
     }
 
+    public String getExternalTypeImports() {
+        StringBuilder imports = new StringBuilder();
+        externalTypes.forEach((mspecTypeName, javaTypeName) -> 
imports.append("import ").append(javaTypeName).append(";\n"));
+        return imports.toString();
+    }
+
 }
diff --git 
a/code-generation/language-java/src/main/resources/templates/java/complex-type-template.java.ftlh
 
b/code-generation/language-java/src/main/resources/templates/java/complex-type-template.java.ftlh
index 142a1b2dd9..f242793551 100644
--- 
a/code-generation/language-java/src/main/resources/templates/java/complex-type-template.java.ftlh
+++ 
b/code-generation/language-java/src/main/resources/templates/java/complex-type-template.java.ftlh
@@ -63,6 +63,7 @@ import org.apache.plc4x.java.api.value.*;
 import java.time.*;
 import java.util.*;
 import java.math.BigInteger;
+${helper.getExternalTypeImports()}
 
 // Code generated by code-generation. DO NOT EDIT.
 
diff --git 
a/code-generation/language-java/src/main/resources/templates/java/data-io-template.java.ftlh
 
b/code-generation/language-java/src/main/resources/templates/java/data-io-template.java.ftlh
index 23cff0b306..52262e545e 100644
--- 
a/code-generation/language-java/src/main/resources/templates/java/data-io-template.java.ftlh
+++ 
b/code-generation/language-java/src/main/resources/templates/java/data-io-template.java.ftlh
@@ -71,6 +71,7 @@ import java.time.temporal.ChronoField;
 import java.util.*;
 import java.util.function.Supplier;
 import java.util.stream.Collectors;
+${helper.getExternalTypeImports()}
 
 // Code generated by code-generation. DO NOT EDIT.
 
diff --git 
a/code-generation/language-java/src/main/resources/templates/java/enum-template.java.ftlh
 
b/code-generation/language-java/src/main/resources/templates/java/enum-template.java.ftlh
index 2356c30846..1e2cde81ec 100644
--- 
a/code-generation/language-java/src/main/resources/templates/java/enum-template.java.ftlh
+++ 
b/code-generation/language-java/src/main/resources/templates/java/enum-template.java.ftlh
@@ -26,7 +26,7 @@
 <#-- @ftlvariable name="helper" 
type="org.apache.plc4x.language.java.JavaLanguageTemplateHelper" -->
 <#-- @ftlvariable name="tracer" 
type="org.apache.plc4x.plugins.codegenerator.protocol.freemarker.Tracer" -->
 <#-- @ftlvariable name="type" 
type="org.apache.plc4x.plugins.codegenerator.types.definitions.EnumTypeDefinition"
 -->
-${helper.packageName(protocolName, languageName, outputFlavor)?replace(".", 
"/")}/${type.name}.java
+<#if !helper.isExternal()>${helper.packageName(protocolName, languageName, 
outputFlavor)?replace(".", "/")}/${type.name}.java</#if>
 /*
  * Licensed to the Apache Software Foundation (ASF) under one
  * or more contributor license agreements.  See the NOTICE file
@@ -53,6 +53,7 @@ import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
+${helper.getExternalTypeImports()}
 
 // Code generated by code-generation. DO NOT EDIT.
 
diff --git 
a/code-generation/language-python/src/main/java/org/apache/plc4x/language/python/PythonLanguageOutput.java
 
b/code-generation/language-python/src/main/java/org/apache/plc4x/language/python/PythonLanguageOutput.java
index cf931494c4..e5909a40b8 100644
--- 
a/code-generation/language-python/src/main/java/org/apache/plc4x/language/python/PythonLanguageOutput.java
+++ 
b/code-generation/language-python/src/main/java/org/apache/plc4x/language/python/PythonLanguageOutput.java
@@ -181,7 +181,7 @@ public class PythonLanguageOutput extends 
FreemarkerLanguageOutput {
      */
     @Override
     protected FreemarkerLanguageTemplateHelper getHelper(TypeDefinition 
thisType, String protocolName, String flavorName, Map<String, TypeDefinition> 
types,
-                                                         Map<String, String> 
options) {
+                                                         Map<String, String> 
externalTypes, Map<String, String> options) {
         return new PythonLanguageTemplateHelper(thisType, protocolName, 
flavorName, types);
     }
 
diff --git 
a/code-generation/protocol-base-mspec/src/main/antlr4/org/apache/plc4x/plugins/codegenerator/language/mspec/MSpec.g4
 
b/code-generation/protocol-base-mspec/src/main/antlr4/org/apache/plc4x/plugins/codegenerator/language/mspec/MSpec.g4
index 9272c0cb6a..404925638d 100644
--- 
a/code-generation/protocol-base-mspec/src/main/antlr4/org/apache/plc4x/plugins/codegenerator/language/mspec/MSpec.g4
+++ 
b/code-generation/protocol-base-mspec/src/main/antlr4/org/apache/plc4x/plugins/codegenerator/language/mspec/MSpec.g4
@@ -28,8 +28,8 @@ complexTypeDefinition
 
 complexType
  : 'type' name=idExpression (LRBRACKET params=argumentList RRBRACKET)? 
attributes=attributeList (fieldDefinition|batchSetDefinition)*
- | 'discriminatedType' name=idExpression (LRBRACKET params=argumentList 
RRBRACKET)? attributes=attributeList (fieldDefinition|batchSetDefinition)+
- | 'enum' (type=dataType)? name=idExpression (LRBRACKET params=argumentList 
RRBRACKET)? attributes=attributeList enumValues=enumValueDefinition+
+ | 'discriminatedType' name=idExpression (LRBRACKET params=argumentList 
RRBRACKET)? attributes=attributeList (fieldDefinition|batchSetDefinition)*
+ | 'enum' (type=dataType)? name=idExpression (LRBRACKET params=argumentList 
RRBRACKET)? attributes=attributeList enumValues=enumValueDefinition*
  | 'dataIo' name=idExpression (LRBRACKET params=argumentList RRBRACKET)? 
(attributes=attributeList) dataIoTypeSwitch=dataIoDefinition
  ;
 
diff --git 
a/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/parser/MessageFormatListener.java
 
b/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/parser/MessageFormatListener.java
index 93aecc7984..209bc7a656 100644
--- 
a/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/parser/MessageFormatListener.java
+++ 
b/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/parser/MessageFormatListener.java
@@ -104,7 +104,7 @@ public class MessageFormatListener extends 
MSpecBaseListener implements LazyType
         // Make the new Map the top of the stack.
         batchSetAttributes.push(curBatchSetAttributes);
 
-        if (ctx.enumValues != null) {
+        if ("enum".equals(ctx.getChild(0).getText())) {
             List<EnumValue> enumContext = new LinkedList<>();
             enumContexts.push(enumContext);
         } else {
@@ -123,7 +123,7 @@ public class MessageFormatListener extends 
MSpecBaseListener implements LazyType
 
         final Map<String, Term> attributes = batchSetAttributes.peek();
         // Handle enum types.
-        if (ctx.enumValues != null) {
+        if ("enum".equals(ctx.getChild(0).getText())) {
             SimpleTypeReference type = (ctx.type != null) ? 
getSimpleTypeReference(ctx.type) : null;
             List<EnumValue> enumValues = getEnumValues();
             if (type == null) {
diff --git a/plc4go/internal/ads/Connection.go 
b/plc4go/internal/ads/Connection.go
index 1cd5d88078..2eb0cabc76 100644
--- a/plc4go/internal/ads/Connection.go
+++ b/plc4go/internal/ads/Connection.go
@@ -402,7 +402,7 @@ func (m *Connection) 
getPlcValueForAdsDataTypeTableEntry(entry readWriteModel.Ad
                }
                dataTypeName = "WSTRING"
        }
-       plcValueType, ok := apiValues.PlcValueByName(dataTypeName)
+       plcValueType, ok := apiValues.PlcValueTypeByName(dataTypeName)
        if !ok {
                return apiValues.NULL, -1
        }
diff --git a/plc4go/internal/ads/DriverContext.go 
b/plc4go/internal/ads/DriverContext.go
index a88ff41880..fb8ce10f12 100644
--- a/plc4go/internal/ads/DriverContext.go
+++ b/plc4go/internal/ads/DriverContext.go
@@ -132,7 +132,7 @@ func (m *DriverContext) 
getDataTypeForDataTypeTableEntry(entry driverModel.AdsDa
        } else if strings.HasPrefix(dataTypeName, "WSTRING(") {
                dataTypeName = "WSTRING"
        }
-       plcValueType, _ := apiValues.PlcValueByName(dataTypeName)
+       plcValueType, _ := apiValues.PlcValueTypeByName(dataTypeName)
        return plcValueType
 }
 
diff --git a/plc4go/internal/ads/Reader.go b/plc4go/internal/ads/Reader.go
index ef59b716e6..32d3536d75 100644
--- a/plc4go/internal/ads/Reader.go
+++ b/plc4go/internal/ads/Reader.go
@@ -307,7 +307,8 @@ func (m *Connection) parsePlcValue(dataType 
driverModel.AdsDataTypeTableEntry, a
                if valueType == apiValues.NULL {
                        return nil, errors.New(fmt.Sprintf("error converting %s 
into plc4x plc-value type", dataType.GetDataTypeName()))
                }
-               adsValueType, ok := 
driverModel.PlcValueTypeByName(valueType.String())
+
+               adsValueType, ok := 
apiValues.PlcValueTypeByName(valueType.String())
                if !ok {
                        return nil, errors.New(fmt.Sprintf("error converting 
plc4x plc-value type %s into ads plc-value type", valueType.String()))
                }
diff --git a/plc4go/internal/ads/TagHandler.go 
b/plc4go/internal/ads/TagHandler.go
index e52a876180..7ca6e1c617 100644
--- a/plc4go/internal/ads/TagHandler.go
+++ b/plc4go/internal/ads/TagHandler.go
@@ -107,7 +107,7 @@ func (m TagHandler) ParseTag(query string) 
(apiModel.PlcTag, error) {
                if adsDataTypeName == "" {
                        return nil, errors.Errorf("Missing ads data type")
                }
-               plcValueType, ok := apiValues.PlcValueByName(adsDataTypeName)
+               plcValueType, ok := 
apiValues.PlcValueTypeByName(adsDataTypeName)
                if !ok {
                        return nil, fmt.Errorf("invalid ads data type")
                }
@@ -214,7 +214,7 @@ func (m TagHandler) ParseTag(query string) 
(apiModel.PlcTag, error) {
                if adsDataTypeName == "" {
                        return nil, errors.Errorf("Missing ads data type")
                }
-               plcValueType, ok := apiValues.PlcValueByName(adsDataTypeName)
+               plcValueType, ok := 
apiValues.PlcValueTypeByName(adsDataTypeName)
                if !ok {
                        return nil, fmt.Errorf("invalid ads data type")
                }
diff --git a/plc4go/internal/ads/Writer.go b/plc4go/internal/ads/Writer.go
index e939bc9629..8b625ae544 100644
--- a/plc4go/internal/ads/Writer.go
+++ b/plc4go/internal/ads/Writer.go
@@ -298,7 +298,7 @@ func (m *Connection) serializePlcValue(dataType 
driverModel.AdsDataTypeTableEntr
                if valueType == apiValues.NULL {
                        return errors.New(fmt.Sprintf("error converting %s into 
plc4x plc-value type", dataType.GetDataTypeName()))
                }
-               adsValueType, ok := 
driverModel.PlcValueTypeByName(valueType.String())
+               adsValueType, ok := 
apiValues.PlcValueTypeByName(valueType.String())
                if !ok {
                        return errors.New(fmt.Sprintf("error converting plc4x 
plc-value type %s into ads plc-value type", valueType.String()))
                }
diff --git a/plc4go/internal/eip/Tag.go b/plc4go/internal/eip/Tag.go
index 1d6b96710a..112fa3e3b9 100644
--- a/plc4go/internal/eip/Tag.go
+++ b/plc4go/internal/eip/Tag.go
@@ -57,7 +57,7 @@ func (m plcTag) GetAddressString() string {
 }
 
 func (m plcTag) GetValueType() apiValues.PlcValueType {
-       if plcValueType, ok := apiValues.PlcValueByName(m.GetType().String()); 
!ok {
+       if plcValueType, ok := 
apiValues.PlcValueTypeByName(m.GetType().String()); !ok {
                return apiValues.NULL
        } else {
                return plcValueType
diff --git a/plc4go/internal/modbus/Tag.go b/plc4go/internal/modbus/Tag.go
index e7e26cfaee..12c3414b70 100644
--- a/plc4go/internal/modbus/Tag.go
+++ b/plc4go/internal/modbus/Tag.go
@@ -80,7 +80,7 @@ func (m modbusTag) GetAddressString() string {
 }
 
 func (m modbusTag) GetValueType() apiValues.PlcValueType {
-       if plcValueType, ok := apiValues.PlcValueByName(m.Datatype.String()); 
!ok {
+       if plcValueType, ok := 
apiValues.PlcValueTypeByName(m.Datatype.String()); !ok {
                return apiValues.NULL
        } else {
                return plcValueType
diff --git a/plc4go/internal/opcua/Tag.go b/plc4go/internal/opcua/Tag.go
index a8496d0681..5e98470e86 100644
--- a/plc4go/internal/opcua/Tag.go
+++ b/plc4go/internal/opcua/Tag.go
@@ -59,7 +59,7 @@ func (t *tag) GetAddressString() string {
 }
 
 func (t *tag) GetValueType() apiValues.PlcValueType {
-       valueType, ok := apiValues.PlcValueByName(t.dataType.PLC4XEnumName())
+       valueType, ok := 
apiValues.PlcValueTypeByName(t.dataType.PLC4XEnumName())
        if !ok {
                return 0xFF
        }
diff --git a/plc4go/internal/s7/Tag.go b/plc4go/internal/s7/Tag.go
index 54c3e47335..f2be4b13d8 100644
--- a/plc4go/internal/s7/Tag.go
+++ b/plc4go/internal/s7/Tag.go
@@ -91,7 +91,7 @@ func (m plcTag) GetAddressString() string {
 }
 
 func (m plcTag) GetValueType() apiValues.PlcValueType {
-       if plcValueByName, ok := apiValues.PlcValueByName(m.Datatype.String()); 
ok {
+       if plcValueByName, ok := 
apiValues.PlcValueTypeByName(m.Datatype.String()); ok {
                return plcValueByName
        }
        return apiValues.NULL
diff --git a/plc4go/internal/simulated/Tag.go b/plc4go/internal/simulated/Tag.go
index 78fd4cfeca..b0cfe7c34e 100644
--- a/plc4go/internal/simulated/Tag.go
+++ b/plc4go/internal/simulated/Tag.go
@@ -69,7 +69,7 @@ func (t simulatedTag) GetAddressString() string {
 }
 
 func (t simulatedTag) GetValueType() values.PlcValueType {
-       if plcValueType, ok := values.PlcValueByName(t.DataTypeSize.String()); 
ok {
+       if plcValueType, ok := 
values.PlcValueTypeByName(t.DataTypeSize.String()); ok {
                return plcValueType
        }
        return values.NULL
diff --git a/plc4go/pkg/api/values/plc_value.go 
b/plc4go/pkg/api/values/plc_value.go
index 673c5a30fc..184720251d 100644
--- a/plc4go/pkg/api/values/plc_value.go
+++ b/plc4go/pkg/api/values/plc_value.go
@@ -312,7 +312,7 @@ func (p PlcValueType) String() string {
        return "Unknown"
 }
 
-func PlcValueByName(value string) (valueType PlcValueType, ok bool) {
+func PlcValueTypeByName(value string) (valueType PlcValueType, ok bool) {
        switch value {
        case "NULL":
                return NULL, true
diff --git a/plc4go/pkg/api/values/value_test.go 
b/plc4go/pkg/api/values/value_test.go
index 3ae318c82b..5cfec8d0e6 100644
--- a/plc4go/pkg/api/values/value_test.go
+++ b/plc4go/pkg/api/values/value_test.go
@@ -65,7 +65,7 @@ func TestValues(t *testing.T) {
                t.Run(fmt.Sprintf("value %d", value), func(t *testing.T) {
                        valueString := value.String()
                        assert.NotEmpty(t, valueString)
-                       valueType, ok := PlcValueByName(valueString)
+                       valueType, ok := PlcValueTypeByName(valueString)
                        expectedValue := value
                        expectedOk := true
                        if value == 0xff {
diff --git a/plc4go/pom.xml b/plc4go/pom.xml
index b2a1324b5b..f78a47d63f 100644
--- a/plc4go/pom.xml
+++ b/plc4go/pom.xml
@@ -632,6 +632,9 @@
                   <languageName>go</languageName>
                   <outputFlavor>read-write</outputFlavor>
                   <outputDir>${project.basedir}/protocols</outputDir>
+                  <externalTypes>
+                    <PlcValueType>api 
"github.com/apache/plc4x/plc4go/pkg/api/values"</PlcValueType>
+                  </externalTypes>
                 </configuration>
               </execution>
               <execution>
diff --git a/plc4go/protocols/ads/readwrite/model/AdsDataType.go 
b/plc4go/protocols/ads/readwrite/model/AdsDataType.go
index 744f89cadf..f32322812b 100644
--- a/plc4go/protocols/ads/readwrite/model/AdsDataType.go
+++ b/plc4go/protocols/ads/readwrite/model/AdsDataType.go
@@ -26,6 +26,7 @@ import (
        "github.com/pkg/errors"
        "github.com/rs/zerolog"
 
+       api "github.com/apache/plc4x/plc4go/pkg/api/values"
        "github.com/apache/plc4x/plc4go/spi/utils"
 )
 
@@ -39,7 +40,7 @@ type IAdsDataType interface {
        utils.LengthAware
        utils.Serializable
        NumBytes() uint16
-       PlcValueType() PlcValueType
+       PlcValueType() api.PlcValueType
 }
 
 const (
@@ -311,167 +312,167 @@ func AdsDataTypeFirstEnumForFieldNumBytes(value uint16) 
(enum AdsDataType, ok bo
        return 0, false
 }
 
-func (e AdsDataType) PlcValueType() PlcValueType {
+func (e AdsDataType) PlcValueType() api.PlcValueType {
        switch e {
        case 0x01:
                { /* '0x01' */
-                       return PlcValueType_BOOL
+                       return api.BOOL
                }
        case 0x02:
                { /* '0x02' */
-                       return PlcValueType_BOOL
+                       return api.BOOL
                }
        case 0x03:
                { /* '0x03' */
-                       return PlcValueType_BYTE
+                       return api.BYTE
                }
        case 0x04:
                { /* '0x04' */
-                       return PlcValueType_BYTE
+                       return api.BYTE
                }
        case 0x05:
                { /* '0x05' */
-                       return PlcValueType_BYTE
+                       return api.BYTE
                }
        case 0x06:
                { /* '0x06' */
-                       return PlcValueType_WORD
+                       return api.WORD
                }
        case 0x07:
                { /* '0x07' */
-                       return PlcValueType_WORD
+                       return api.WORD
                }
        case 0x08:
                { /* '0x08' */
-                       return PlcValueType_DWORD
+                       return api.DWORD
                }
        case 0x09:
                { /* '0x09' */
-                       return PlcValueType_DWORD
+                       return api.DWORD
                }
        case 0x0A:
                { /* '0x0A' */
-                       return PlcValueType_SINT
+                       return api.SINT
                }
        case 0x0B:
                { /* '0x0B' */
-                       return PlcValueType_SINT
+                       return api.SINT
                }
        case 0x0C:
                { /* '0x0C' */
-                       return PlcValueType_USINT
+                       return api.USINT
                }
        case 0x0D:
                { /* '0x0D' */
-                       return PlcValueType_USINT
+                       return api.USINT
                }
        case 0x0E:
                { /* '0x0E' */
-                       return PlcValueType_INT
+                       return api.INT
                }
        case 0x0F:
                { /* '0x0F' */
-                       return PlcValueType_INT
+                       return api.INT
                }
        case 0x10:
                { /* '0x10' */
-                       return PlcValueType_UINT
+                       return api.UINT
                }
        case 0x11:
                { /* '0x11' */
-                       return PlcValueType_UINT
+                       return api.UINT
                }
        case 0x12:
                { /* '0x12' */
-                       return PlcValueType_DINT
+                       return api.DINT
                }
        case 0x13:
                { /* '0x13' */
-                       return PlcValueType_DINT
+                       return api.DINT
                }
        case 0x14:
                { /* '0x14' */
-                       return PlcValueType_UDINT
+                       return api.UDINT
                }
        case 0x15:
                { /* '0x15' */
-                       return PlcValueType_UDINT
+                       return api.UDINT
                }
        case 0x16:
                { /* '0x16' */
-                       return PlcValueType_LINT
+                       return api.LINT
                }
        case 0x17:
                { /* '0x17' */
-                       return PlcValueType_LINT
+                       return api.LINT
                }
        case 0x18:
                { /* '0x18' */
-                       return PlcValueType_ULINT
+                       return api.ULINT
                }
        case 0x19:
                { /* '0x19' */
-                       return PlcValueType_ULINT
+                       return api.ULINT
                }
        case 0x1A:
                { /* '0x1A' */
-                       return PlcValueType_REAL
+                       return api.REAL
                }
        case 0x1B:
                { /* '0x1B' */
-                       return PlcValueType_REAL
+                       return api.REAL
                }
        case 0x1C:
                { /* '0x1C' */
-                       return PlcValueType_LREAL
+                       return api.LREAL
                }
        case 0x1D:
                { /* '0x1D' */
-                       return PlcValueType_LREAL
+                       return api.LREAL
                }
        case 0x1E:
                { /* '0x1E' */
-                       return PlcValueType_CHAR
+                       return api.CHAR
                }
        case 0x1F:
                { /* '0x1F' */
-                       return PlcValueType_WCHAR
+                       return api.WCHAR
                }
        case 0x20:
                { /* '0x20' */
-                       return PlcValueType_STRING
+                       return api.STRING
                }
        case 0x21:
                { /* '0x21' */
-                       return PlcValueType_WSTRING
+                       return api.WSTRING
                }
        case 0x22:
                { /* '0x22' */
-                       return PlcValueType_TIME
+                       return api.TIME
                }
        case 0x23:
                { /* '0x23' */
-                       return PlcValueType_LTIME
+                       return api.LTIME
                }
        case 0x24:
                { /* '0x24' */
-                       return PlcValueType_DATE
+                       return api.DATE
                }
        case 0x25:
                { /* '0x25' */
-                       return PlcValueType_TIME_OF_DAY
+                       return api.TIME_OF_DAY
                }
        case 0x26:
                { /* '0x26' */
-                       return PlcValueType_TIME_OF_DAY
+                       return api.TIME_OF_DAY
                }
        case 0x27:
                { /* '0x27' */
-                       return PlcValueType_DATE_AND_TIME
+                       return api.DATE_AND_TIME
                }
        case 0x28:
                { /* '0x28' */
-                       return PlcValueType_DATE_AND_TIME
+                       return api.DATE_AND_TIME
                }
        default:
                {
@@ -480,7 +481,7 @@ func (e AdsDataType) PlcValueType() PlcValueType {
        }
 }
 
-func AdsDataTypeFirstEnumForFieldPlcValueType(value PlcValueType) (enum 
AdsDataType, ok bool) {
+func AdsDataTypeFirstEnumForFieldPlcValueType(value api.PlcValueType) (enum 
AdsDataType, ok bool) {
        for _, sizeValue := range AdsDataTypeValues {
                if sizeValue.PlcValueType() == value {
                        return sizeValue, true
@@ -727,7 +728,7 @@ func (e AdsDataType) GetValue() int8 {
 func (e AdsDataType) GetNumBytes() uint16 {
        return e.NumBytes()
 }
-func (e AdsDataType) GetPlcValueType() PlcValueType {
+func (e AdsDataType) GetPlcValueType() api.PlcValueType {
        return e.PlcValueType()
 }
 
diff --git a/plc4go/protocols/ads/readwrite/model/DataItem.go 
b/plc4go/protocols/ads/readwrite/model/DataItem.go
index 18199ebd24..233bb36d94 100644
--- a/plc4go/protocols/ads/readwrite/model/DataItem.go
+++ b/plc4go/protocols/ads/readwrite/model/DataItem.go
@@ -32,16 +32,16 @@ import (
 
 // Code generated by code-generation. DO NOT EDIT.
 
-func DataItemParse(ctx context.Context, theBytes []byte, plcValueType 
PlcValueType, stringLength int32) (api.PlcValue, error) {
+func DataItemParse(ctx context.Context, theBytes []byte, plcValueType 
api.PlcValueType, stringLength int32) (api.PlcValue, error) {
        return DataItemParseWithBuffer(ctx, 
utils.NewReadBufferByteBased(theBytes), plcValueType, stringLength)
 }
 
-func DataItemParseWithBuffer(ctx context.Context, readBuffer utils.ReadBuffer, 
plcValueType PlcValueType, stringLength int32) (api.PlcValue, error) {
+func DataItemParseWithBuffer(ctx context.Context, readBuffer utils.ReadBuffer, 
plcValueType api.PlcValueType, stringLength int32) (api.PlcValue, error) {
        log := zerolog.Ctx(ctx)
        _ = log
        readBuffer.PullContext("DataItem")
        switch {
-       case plcValueType == PlcValueType_BOOL: // BOOL
+       case plcValueType == api.BOOL: // BOOL
                // Reserved Field (Just skip the bytes)
                if _, _err := /*TODO: migrate me*/ /*TODO: migrate me*/ 
readBuffer.ReadUint8("reserved", 7); _err != nil {
                        return nil, errors.Wrap(_err, "Error parsing reserved 
field")
@@ -55,7 +55,7 @@ func DataItemParseWithBuffer(ctx context.Context, readBuffer 
utils.ReadBuffer, p
                _ = value // TODO: temporary till we fix TIME stuff in golang 
(see above in the template)
                readBuffer.CloseContext("DataItem")
                return values.NewPlcBOOL(value), nil
-       case plcValueType == PlcValueType_BYTE: // BYTE
+       case plcValueType == api.BYTE: // BYTE
                // Simple Field (value)
                value, _valueErr := /*TODO: migrate me*/ /*TODO: migrate me*/ 
readBuffer.ReadUint8("value", 8)
                if _valueErr != nil {
@@ -64,7 +64,7 @@ func DataItemParseWithBuffer(ctx context.Context, readBuffer 
utils.ReadBuffer, p
                _ = value // TODO: temporary till we fix TIME stuff in golang 
(see above in the template)
                readBuffer.CloseContext("DataItem")
                return values.NewPlcBYTE(value), nil
-       case plcValueType == PlcValueType_WORD: // WORD
+       case plcValueType == api.WORD: // WORD
                // Simple Field (value)
                value, _valueErr := /*TODO: migrate me*/ /*TODO: migrate me*/ 
readBuffer.ReadUint16("value", 16)
                if _valueErr != nil {
@@ -73,7 +73,7 @@ func DataItemParseWithBuffer(ctx context.Context, readBuffer 
utils.ReadBuffer, p
                _ = value // TODO: temporary till we fix TIME stuff in golang 
(see above in the template)
                readBuffer.CloseContext("DataItem")
                return values.NewPlcWORD(value), nil
-       case plcValueType == PlcValueType_DWORD: // DWORD
+       case plcValueType == api.DWORD: // DWORD
                // Simple Field (value)
                value, _valueErr := /*TODO: migrate me*/ /*TODO: migrate me*/ 
readBuffer.ReadUint32("value", 32)
                if _valueErr != nil {
@@ -82,7 +82,7 @@ func DataItemParseWithBuffer(ctx context.Context, readBuffer 
utils.ReadBuffer, p
                _ = value // TODO: temporary till we fix TIME stuff in golang 
(see above in the template)
                readBuffer.CloseContext("DataItem")
                return values.NewPlcDWORD(value), nil
-       case plcValueType == PlcValueType_LWORD: // LWORD
+       case plcValueType == api.LWORD: // LWORD
                // Simple Field (value)
                value, _valueErr := /*TODO: migrate me*/ /*TODO: migrate me*/ 
readBuffer.ReadUint64("value", 64)
                if _valueErr != nil {
@@ -91,7 +91,7 @@ func DataItemParseWithBuffer(ctx context.Context, readBuffer 
utils.ReadBuffer, p
                _ = value // TODO: temporary till we fix TIME stuff in golang 
(see above in the template)
                readBuffer.CloseContext("DataItem")
                return values.NewPlcLWORD(value), nil
-       case plcValueType == PlcValueType_SINT: // SINT
+       case plcValueType == api.SINT: // SINT
                // Simple Field (value)
                value, _valueErr := /*TODO: migrate me*/ /*TODO: migrate me*/ 
readBuffer.ReadInt8("value", 8)
                if _valueErr != nil {
@@ -100,7 +100,7 @@ func DataItemParseWithBuffer(ctx context.Context, 
readBuffer utils.ReadBuffer, p
                _ = value // TODO: temporary till we fix TIME stuff in golang 
(see above in the template)
                readBuffer.CloseContext("DataItem")
                return values.NewPlcSINT(value), nil
-       case plcValueType == PlcValueType_USINT: // USINT
+       case plcValueType == api.USINT: // USINT
                // Simple Field (value)
                value, _valueErr := /*TODO: migrate me*/ /*TODO: migrate me*/ 
readBuffer.ReadUint8("value", 8)
                if _valueErr != nil {
@@ -109,7 +109,7 @@ func DataItemParseWithBuffer(ctx context.Context, 
readBuffer utils.ReadBuffer, p
                _ = value // TODO: temporary till we fix TIME stuff in golang 
(see above in the template)
                readBuffer.CloseContext("DataItem")
                return values.NewPlcUSINT(value), nil
-       case plcValueType == PlcValueType_INT: // INT
+       case plcValueType == api.INT: // INT
                // Simple Field (value)
                value, _valueErr := /*TODO: migrate me*/ /*TODO: migrate me*/ 
readBuffer.ReadInt16("value", 16)
                if _valueErr != nil {
@@ -118,7 +118,7 @@ func DataItemParseWithBuffer(ctx context.Context, 
readBuffer utils.ReadBuffer, p
                _ = value // TODO: temporary till we fix TIME stuff in golang 
(see above in the template)
                readBuffer.CloseContext("DataItem")
                return values.NewPlcINT(value), nil
-       case plcValueType == PlcValueType_UINT: // UINT
+       case plcValueType == api.UINT: // UINT
                // Simple Field (value)
                value, _valueErr := /*TODO: migrate me*/ /*TODO: migrate me*/ 
readBuffer.ReadUint16("value", 16)
                if _valueErr != nil {
@@ -127,7 +127,7 @@ func DataItemParseWithBuffer(ctx context.Context, 
readBuffer utils.ReadBuffer, p
                _ = value // TODO: temporary till we fix TIME stuff in golang 
(see above in the template)
                readBuffer.CloseContext("DataItem")
                return values.NewPlcUINT(value), nil
-       case plcValueType == PlcValueType_DINT: // DINT
+       case plcValueType == api.DINT: // DINT
                // Simple Field (value)
                value, _valueErr := /*TODO: migrate me*/ /*TODO: migrate me*/ 
readBuffer.ReadInt32("value", 32)
                if _valueErr != nil {
@@ -136,7 +136,7 @@ func DataItemParseWithBuffer(ctx context.Context, 
readBuffer utils.ReadBuffer, p
                _ = value // TODO: temporary till we fix TIME stuff in golang 
(see above in the template)
                readBuffer.CloseContext("DataItem")
                return values.NewPlcDINT(value), nil
-       case plcValueType == PlcValueType_UDINT: // UDINT
+       case plcValueType == api.UDINT: // UDINT
                // Simple Field (value)
                value, _valueErr := /*TODO: migrate me*/ /*TODO: migrate me*/ 
readBuffer.ReadUint32("value", 32)
                if _valueErr != nil {
@@ -145,7 +145,7 @@ func DataItemParseWithBuffer(ctx context.Context, 
readBuffer utils.ReadBuffer, p
                _ = value // TODO: temporary till we fix TIME stuff in golang 
(see above in the template)
                readBuffer.CloseContext("DataItem")
                return values.NewPlcUDINT(value), nil
-       case plcValueType == PlcValueType_LINT: // LINT
+       case plcValueType == api.LINT: // LINT
                // Simple Field (value)
                value, _valueErr := /*TODO: migrate me*/ /*TODO: migrate me*/ 
readBuffer.ReadInt64("value", 64)
                if _valueErr != nil {
@@ -154,7 +154,7 @@ func DataItemParseWithBuffer(ctx context.Context, 
readBuffer utils.ReadBuffer, p
                _ = value // TODO: temporary till we fix TIME stuff in golang 
(see above in the template)
                readBuffer.CloseContext("DataItem")
                return values.NewPlcLINT(value), nil
-       case plcValueType == PlcValueType_ULINT: // ULINT
+       case plcValueType == api.ULINT: // ULINT
                // Simple Field (value)
                value, _valueErr := /*TODO: migrate me*/ /*TODO: migrate me*/ 
readBuffer.ReadUint64("value", 64)
                if _valueErr != nil {
@@ -163,7 +163,7 @@ func DataItemParseWithBuffer(ctx context.Context, 
readBuffer utils.ReadBuffer, p
                _ = value // TODO: temporary till we fix TIME stuff in golang 
(see above in the template)
                readBuffer.CloseContext("DataItem")
                return values.NewPlcULINT(value), nil
-       case plcValueType == PlcValueType_REAL: // REAL
+       case plcValueType == api.REAL: // REAL
                // Simple Field (value)
                value, _valueErr := /*TODO: migrate me*/ /*TODO: migrate me*/ 
readBuffer.ReadFloat32("value", 32)
                if _valueErr != nil {
@@ -172,7 +172,7 @@ func DataItemParseWithBuffer(ctx context.Context, 
readBuffer utils.ReadBuffer, p
                _ = value // TODO: temporary till we fix TIME stuff in golang 
(see above in the template)
                readBuffer.CloseContext("DataItem")
                return values.NewPlcREAL(value), nil
-       case plcValueType == PlcValueType_LREAL: // LREAL
+       case plcValueType == api.LREAL: // LREAL
                // Simple Field (value)
                value, _valueErr := /*TODO: migrate me*/ /*TODO: migrate me*/ 
readBuffer.ReadFloat64("value", 64)
                if _valueErr != nil {
@@ -181,7 +181,7 @@ func DataItemParseWithBuffer(ctx context.Context, 
readBuffer utils.ReadBuffer, p
                _ = value // TODO: temporary till we fix TIME stuff in golang 
(see above in the template)
                readBuffer.CloseContext("DataItem")
                return values.NewPlcLREAL(value), nil
-       case plcValueType == PlcValueType_CHAR: // CHAR
+       case plcValueType == api.CHAR: // CHAR
                // Simple Field (value)
                value, _valueErr := /*TODO: migrate me*/ /*TODO: migrate me*/ 
readBuffer.ReadString("value", uint32(8), utils.WithEncoding("Windows-1252"))
                if _valueErr != nil {
@@ -190,7 +190,7 @@ func DataItemParseWithBuffer(ctx context.Context, 
readBuffer utils.ReadBuffer, p
                _ = value // TODO: temporary till we fix TIME stuff in golang 
(see above in the template)
                readBuffer.CloseContext("DataItem")
                return values.NewPlcCHAR(value), nil
-       case plcValueType == PlcValueType_WCHAR: // WCHAR
+       case plcValueType == api.WCHAR: // WCHAR
                // Simple Field (value)
                value, _valueErr := /*TODO: migrate me*/ /*TODO: migrate me*/ 
readBuffer.ReadString("value", uint32(16), utils.WithEncoding("UTF-16LE"))
                if _valueErr != nil {
@@ -199,7 +199,7 @@ func DataItemParseWithBuffer(ctx context.Context, 
readBuffer utils.ReadBuffer, p
                _ = value // TODO: temporary till we fix TIME stuff in golang 
(see above in the template)
                readBuffer.CloseContext("DataItem")
                return values.NewPlcWCHAR(value), nil
-       case plcValueType == PlcValueType_STRING: // STRING
+       case plcValueType == api.STRING: // STRING
                // Simple Field (value)
                value, _valueErr := /*TODO: migrate me*/ /*TODO: migrate me*/ 
readBuffer.ReadString("value", uint32((stringLength)*(8)), 
utils.WithEncoding("Windows-1252"))
                if _valueErr != nil {
@@ -213,7 +213,7 @@ func DataItemParseWithBuffer(ctx context.Context, 
readBuffer utils.ReadBuffer, p
                }
                readBuffer.CloseContext("DataItem")
                return values.NewPlcSTRING(value), nil
-       case plcValueType == PlcValueType_WSTRING: // WSTRING
+       case plcValueType == api.WSTRING: // WSTRING
                // Simple Field (value)
                value, _valueErr := /*TODO: migrate me*/ /*TODO: migrate me*/ 
readBuffer.ReadString("value", uint32(((stringLength)*(8))*(2)), 
utils.WithEncoding("UTF-16LE"))
                if _valueErr != nil {
@@ -227,7 +227,7 @@ func DataItemParseWithBuffer(ctx context.Context, 
readBuffer utils.ReadBuffer, p
                }
                readBuffer.CloseContext("DataItem")
                return values.NewPlcWSTRING(value), nil
-       case plcValueType == PlcValueType_TIME: // TIME
+       case plcValueType == api.TIME: // TIME
                // Simple Field (milliseconds)
                milliseconds, _millisecondsErr := /*TODO: migrate me*/ /*TODO: 
migrate me*/ readBuffer.ReadUint32("milliseconds", 32)
                if _millisecondsErr != nil {
@@ -236,7 +236,7 @@ func DataItemParseWithBuffer(ctx context.Context, 
readBuffer utils.ReadBuffer, p
                _ = milliseconds // TODO: temporary till we fix TIME stuff in 
golang (see above in the template)
                readBuffer.CloseContext("DataItem")
                return values.NewPlcTIMEFromMilliseconds(int64(milliseconds)), 
nil
-       case plcValueType == PlcValueType_LTIME: // LTIME
+       case plcValueType == api.LTIME: // LTIME
                // Simple Field (nanoseconds)
                nanoseconds, _nanosecondsErr := /*TODO: migrate me*/ /*TODO: 
migrate me*/ readBuffer.ReadUint64("nanoseconds", 64)
                if _nanosecondsErr != nil {
@@ -245,7 +245,7 @@ func DataItemParseWithBuffer(ctx context.Context, 
readBuffer utils.ReadBuffer, p
                _ = nanoseconds // TODO: temporary till we fix TIME stuff in 
golang (see above in the template)
                readBuffer.CloseContext("DataItem")
                return values.NewPlcLTIMEFromNanoseconds(nanoseconds), nil
-       case plcValueType == PlcValueType_DATE: // DATE
+       case plcValueType == api.DATE: // DATE
                // Simple Field (secondsSinceEpoch)
                secondsSinceEpoch, _secondsSinceEpochErr := /*TODO: migrate 
me*/ /*TODO: migrate me*/ readBuffer.ReadUint32("secondsSinceEpoch", 32)
                if _secondsSinceEpochErr != nil {
@@ -254,7 +254,7 @@ func DataItemParseWithBuffer(ctx context.Context, 
readBuffer utils.ReadBuffer, p
                _ = secondsSinceEpoch // TODO: temporary till we fix TIME stuff 
in golang (see above in the template)
                readBuffer.CloseContext("DataItem")
                return 
values.NewPlcDATEFromSecondsSinceEpoch(uint32(secondsSinceEpoch)), nil
-       case plcValueType == PlcValueType_LDATE: // LDATE
+       case plcValueType == api.LDATE: // LDATE
                // Simple Field (nanosecondsSinceEpoch)
                nanosecondsSinceEpoch, _nanosecondsSinceEpochErr := /*TODO: 
migrate me*/ /*TODO: migrate me*/ 
readBuffer.ReadUint64("nanosecondsSinceEpoch", 64)
                if _nanosecondsSinceEpochErr != nil {
@@ -263,7 +263,7 @@ func DataItemParseWithBuffer(ctx context.Context, 
readBuffer utils.ReadBuffer, p
                _ = nanosecondsSinceEpoch // TODO: temporary till we fix TIME 
stuff in golang (see above in the template)
                readBuffer.CloseContext("DataItem")
                return 
values.NewPlcLDATEFromNanosecondsSinceEpoch(uint64(nanosecondsSinceEpoch)), nil
-       case plcValueType == PlcValueType_TIME_OF_DAY: // TIME_OF_DAY
+       case plcValueType == api.TIME_OF_DAY: // TIME_OF_DAY
                // Simple Field (millisecondsSinceMidnight)
                millisecondsSinceMidnight, _millisecondsSinceMidnightErr := 
/*TODO: migrate me*/ /*TODO: migrate me*/ 
readBuffer.ReadUint32("millisecondsSinceMidnight", 32)
                if _millisecondsSinceMidnightErr != nil {
@@ -272,7 +272,7 @@ func DataItemParseWithBuffer(ctx context.Context, 
readBuffer utils.ReadBuffer, p
                _ = millisecondsSinceMidnight // TODO: temporary till we fix 
TIME stuff in golang (see above in the template)
                readBuffer.CloseContext("DataItem")
                return 
values.NewPlcTIME_OF_DAYFromMillisecondsSinceMidnight(millisecondsSinceMidnight),
 nil
-       case plcValueType == PlcValueType_LTIME_OF_DAY: // LTIME_OF_DAY
+       case plcValueType == api.LTIME_OF_DAY: // LTIME_OF_DAY
                // Simple Field (nanosecondsSinceMidnight)
                nanosecondsSinceMidnight, _nanosecondsSinceMidnightErr := 
/*TODO: migrate me*/ /*TODO: migrate me*/ 
readBuffer.ReadUint64("nanosecondsSinceMidnight", 64)
                if _nanosecondsSinceMidnightErr != nil {
@@ -281,7 +281,7 @@ func DataItemParseWithBuffer(ctx context.Context, 
readBuffer utils.ReadBuffer, p
                _ = nanosecondsSinceMidnight // TODO: temporary till we fix 
TIME stuff in golang (see above in the template)
                readBuffer.CloseContext("DataItem")
                return 
values.NewPlcLTIME_OF_DAYFromNanosecondsSinceMidnight(nanosecondsSinceMidnight),
 nil
-       case plcValueType == PlcValueType_DATE_AND_TIME: // DATE_AND_TIME
+       case plcValueType == api.DATE_AND_TIME: // DATE_AND_TIME
                // Simple Field (secondsSinceEpoch)
                secondsSinceEpoch, _secondsSinceEpochErr := /*TODO: migrate 
me*/ /*TODO: migrate me*/ readBuffer.ReadUint32("secondsSinceEpoch", 32)
                if _secondsSinceEpochErr != nil {
@@ -290,7 +290,7 @@ func DataItemParseWithBuffer(ctx context.Context, 
readBuffer utils.ReadBuffer, p
                _ = secondsSinceEpoch // TODO: temporary till we fix TIME stuff 
in golang (see above in the template)
                readBuffer.CloseContext("DataItem")
                return 
values.NewPlcDATA_AND_TIMEFromSecondsSinceEpoch(secondsSinceEpoch), nil
-       case plcValueType == PlcValueType_LDATE_AND_TIME: // LDATE_AND_TIME
+       case plcValueType == api.LDATE_AND_TIME: // LDATE_AND_TIME
                // Simple Field (nanosecondsSinceEpoch)
                nanosecondsSinceEpoch, _nanosecondsSinceEpochErr := /*TODO: 
migrate me*/ /*TODO: migrate me*/ 
readBuffer.ReadUint64("nanosecondsSinceEpoch", 64)
                if _nanosecondsSinceEpochErr != nil {
@@ -304,7 +304,7 @@ func DataItemParseWithBuffer(ctx context.Context, 
readBuffer utils.ReadBuffer, p
        return nil, errors.New("unsupported type")
 }
 
-func DataItemSerialize(value api.PlcValue, plcValueType PlcValueType, 
stringLength int32) ([]byte, error) {
+func DataItemSerialize(value api.PlcValue, plcValueType api.PlcValueType, 
stringLength int32) ([]byte, error) {
        wb := utils.NewWriteBufferByteBased()
        if err := DataItemSerializeWithWriteBuffer(context.Background(), wb, 
value, plcValueType, stringLength); err != nil {
                return nil, err
@@ -313,11 +313,11 @@ func DataItemSerialize(value api.PlcValue, plcValueType 
PlcValueType, stringLeng
 }
 
 type _DataItem struct {
-       PlcValueType PlcValueType
+       PlcValueType api.PlcValueType
        StringLength int32
 }
 
-func (m _DataItem) GetPlcValueType() PlcValueType {
+func (m _DataItem) GetPlcValueType() api.PlcValueType {
        return m.PlcValueType
 }
 
@@ -325,7 +325,7 @@ func (m _DataItem) GetStringLength() int32 {
        return m.StringLength
 }
 
-func DataItemSerializeWithWriteBuffer(ctx context.Context, writeBuffer 
utils.WriteBuffer, value api.PlcValue, plcValueType PlcValueType, stringLength 
int32) error {
+func DataItemSerializeWithWriteBuffer(ctx context.Context, writeBuffer 
utils.WriteBuffer, value api.PlcValue, plcValueType api.PlcValueType, 
stringLength int32) error {
        log := zerolog.Ctx(ctx)
        _ = log
        m := _DataItem{
@@ -335,7 +335,7 @@ func DataItemSerializeWithWriteBuffer(ctx context.Context, 
writeBuffer utils.Wri
        _ = m
        writeBuffer.PushContext("DataItem")
        switch {
-       case plcValueType == PlcValueType_BOOL: // BOOL
+       case plcValueType == api.BOOL: // BOOL
                // Reserved Field (Just skip the bytes)
                if _err := /*TODO: migrate me*/ 
writeBuffer.WriteUint8("reserved", 7, uint8(uint8(0x00))); _err != nil {
                        return errors.Wrap(_err, "Error serializing reserved 
field")
@@ -345,87 +345,87 @@ func DataItemSerializeWithWriteBuffer(ctx 
context.Context, writeBuffer utils.Wri
                if _err := /*TODO: migrate me*/ writeBuffer.WriteBit("value", 
value.GetBool()); _err != nil {
                        return errors.Wrap(_err, "Error serializing 'value' 
field")
                }
-       case plcValueType == PlcValueType_BYTE: // BYTE
+       case plcValueType == api.BYTE: // BYTE
                // Simple Field (value)
                if _err := /*TODO: migrate me*/ writeBuffer.WriteUint8("value", 
8, uint8(value.GetUint8())); _err != nil {
                        return errors.Wrap(_err, "Error serializing 'value' 
field")
                }
-       case plcValueType == PlcValueType_WORD: // WORD
+       case plcValueType == api.WORD: // WORD
                // Simple Field (value)
                if _err := /*TODO: migrate me*/ 
writeBuffer.WriteUint16("value", 16, uint16(value.GetUint16())); _err != nil {
                        return errors.Wrap(_err, "Error serializing 'value' 
field")
                }
-       case plcValueType == PlcValueType_DWORD: // DWORD
+       case plcValueType == api.DWORD: // DWORD
                // Simple Field (value)
                if _err := /*TODO: migrate me*/ 
writeBuffer.WriteUint32("value", 32, uint32(value.GetUint32())); _err != nil {
                        return errors.Wrap(_err, "Error serializing 'value' 
field")
                }
-       case plcValueType == PlcValueType_LWORD: // LWORD
+       case plcValueType == api.LWORD: // LWORD
                // Simple Field (value)
                if _err := /*TODO: migrate me*/ 
writeBuffer.WriteUint64("value", 64, uint64(value.GetUint64())); _err != nil {
                        return errors.Wrap(_err, "Error serializing 'value' 
field")
                }
-       case plcValueType == PlcValueType_SINT: // SINT
+       case plcValueType == api.SINT: // SINT
                // Simple Field (value)
                if _err := /*TODO: migrate me*/ writeBuffer.WriteInt8("value", 
8, int8(value.GetInt8())); _err != nil {
                        return errors.Wrap(_err, "Error serializing 'value' 
field")
                }
-       case plcValueType == PlcValueType_USINT: // USINT
+       case plcValueType == api.USINT: // USINT
                // Simple Field (value)
                if _err := /*TODO: migrate me*/ writeBuffer.WriteUint8("value", 
8, uint8(value.GetUint8())); _err != nil {
                        return errors.Wrap(_err, "Error serializing 'value' 
field")
                }
-       case plcValueType == PlcValueType_INT: // INT
+       case plcValueType == api.INT: // INT
                // Simple Field (value)
                if _err := /*TODO: migrate me*/ writeBuffer.WriteInt16("value", 
16, int16(value.GetInt16())); _err != nil {
                        return errors.Wrap(_err, "Error serializing 'value' 
field")
                }
-       case plcValueType == PlcValueType_UINT: // UINT
+       case plcValueType == api.UINT: // UINT
                // Simple Field (value)
                if _err := /*TODO: migrate me*/ 
writeBuffer.WriteUint16("value", 16, uint16(value.GetUint16())); _err != nil {
                        return errors.Wrap(_err, "Error serializing 'value' 
field")
                }
-       case plcValueType == PlcValueType_DINT: // DINT
+       case plcValueType == api.DINT: // DINT
                // Simple Field (value)
                if _err := /*TODO: migrate me*/ writeBuffer.WriteInt32("value", 
32, int32(value.GetInt32())); _err != nil {
                        return errors.Wrap(_err, "Error serializing 'value' 
field")
                }
-       case plcValueType == PlcValueType_UDINT: // UDINT
+       case plcValueType == api.UDINT: // UDINT
                // Simple Field (value)
                if _err := /*TODO: migrate me*/ 
writeBuffer.WriteUint32("value", 32, uint32(value.GetUint32())); _err != nil {
                        return errors.Wrap(_err, "Error serializing 'value' 
field")
                }
-       case plcValueType == PlcValueType_LINT: // LINT
+       case plcValueType == api.LINT: // LINT
                // Simple Field (value)
                if _err := /*TODO: migrate me*/ writeBuffer.WriteInt64("value", 
64, int64(value.GetInt64())); _err != nil {
                        return errors.Wrap(_err, "Error serializing 'value' 
field")
                }
-       case plcValueType == PlcValueType_ULINT: // ULINT
+       case plcValueType == api.ULINT: // ULINT
                // Simple Field (value)
                if _err := /*TODO: migrate me*/ 
writeBuffer.WriteUint64("value", 64, uint64(value.GetUint64())); _err != nil {
                        return errors.Wrap(_err, "Error serializing 'value' 
field")
                }
-       case plcValueType == PlcValueType_REAL: // REAL
+       case plcValueType == api.REAL: // REAL
                // Simple Field (value)
                if _err := /*TODO: migrate me*/ 
writeBuffer.WriteFloat32("value", 32, value.GetFloat32()); _err != nil {
                        return errors.Wrap(_err, "Error serializing 'value' 
field")
                }
-       case plcValueType == PlcValueType_LREAL: // LREAL
+       case plcValueType == api.LREAL: // LREAL
                // Simple Field (value)
                if _err := /*TODO: migrate me*/ 
writeBuffer.WriteFloat64("value", 64, value.GetFloat64()); _err != nil {
                        return errors.Wrap(_err, "Error serializing 'value' 
field")
                }
-       case plcValueType == PlcValueType_CHAR: // CHAR
+       case plcValueType == api.CHAR: // CHAR
                // Simple Field (value)
                if _err := /*TODO: migrate me*/ 
writeBuffer.WriteString("value", uint32(8), value.GetString(), 
utils.WithEncoding("Windows-1252)")); _err != nil {
                        return errors.Wrap(_err, "Error serializing 'value' 
field")
                }
-       case plcValueType == PlcValueType_WCHAR: // WCHAR
+       case plcValueType == api.WCHAR: // WCHAR
                // Simple Field (value)
                if _err := /*TODO: migrate me*/ 
writeBuffer.WriteString("value", uint32(16), value.GetString(), 
utils.WithEncoding("UTF-16LE)")); _err != nil {
                        return errors.Wrap(_err, "Error serializing 'value' 
field")
                }
-       case plcValueType == PlcValueType_STRING: // STRING
+       case plcValueType == api.STRING: // STRING
                // Simple Field (value)
                if _err := /*TODO: migrate me*/ 
writeBuffer.WriteString("value", uint32((stringLength)*(8)), value.GetString(), 
utils.WithEncoding("Windows-1252)")); _err != nil {
                        return errors.Wrap(_err, "Error serializing 'value' 
field")
@@ -435,7 +435,7 @@ func DataItemSerializeWithWriteBuffer(ctx context.Context, 
writeBuffer utils.Wri
                if _err := /*TODO: migrate me*/ 
writeBuffer.WriteUint8("reserved", 8, uint8(uint8(0x00))); _err != nil {
                        return errors.Wrap(_err, "Error serializing reserved 
field")
                }
-       case plcValueType == PlcValueType_WSTRING: // WSTRING
+       case plcValueType == api.WSTRING: // WSTRING
                // Simple Field (value)
                if _err := /*TODO: migrate me*/ 
writeBuffer.WriteString("value", uint32(((stringLength)*(8))*(2)), 
value.GetString(), utils.WithEncoding("UTF-16LE)")); _err != nil {
                        return errors.Wrap(_err, "Error serializing 'value' 
field")
@@ -445,42 +445,42 @@ func DataItemSerializeWithWriteBuffer(ctx 
context.Context, writeBuffer utils.Wri
                if _err := /*TODO: migrate me*/ 
writeBuffer.WriteUint16("reserved", 16, uint16(uint16(0x0000))); _err != nil {
                        return errors.Wrap(_err, "Error serializing reserved 
field")
                }
-       case plcValueType == PlcValueType_TIME: // TIME
+       case plcValueType == api.TIME: // TIME
                // Simple Field (milliseconds)
                if _err := /*TODO: migrate me*/ 
writeBuffer.WriteUint32("milliseconds", 32, 
uint32(value.(values.PlcTIME).GetMilliseconds())); _err != nil {
                        return errors.Wrap(_err, "Error serializing 
'milliseconds' field")
                }
-       case plcValueType == PlcValueType_LTIME: // LTIME
+       case plcValueType == api.LTIME: // LTIME
                // Simple Field (nanoseconds)
                if _err := /*TODO: migrate me*/ 
writeBuffer.WriteUint64("nanoseconds", 64, 
uint64(value.(values.PlcLTIME).GetNanoseconds())); _err != nil {
                        return errors.Wrap(_err, "Error serializing 
'nanoseconds' field")
                }
-       case plcValueType == PlcValueType_DATE: // DATE
+       case plcValueType == api.DATE: // DATE
                // Simple Field (secondsSinceEpoch)
                if _err := /*TODO: migrate me*/ 
writeBuffer.WriteUint32("secondsSinceEpoch", 32, 
uint32(value.(values.PlcDATE).GetSecondsSinceEpoch())); _err != nil {
                        return errors.Wrap(_err, "Error serializing 
'secondsSinceEpoch' field")
                }
-       case plcValueType == PlcValueType_LDATE: // LDATE
+       case plcValueType == api.LDATE: // LDATE
                // Simple Field (nanosecondsSinceEpoch)
                if _err := /*TODO: migrate me*/ 
writeBuffer.WriteUint64("nanosecondsSinceEpoch", 64, 
uint64(value.(values.PlcLDATE).GetNanosecondsSinceEpoch())); _err != nil {
                        return errors.Wrap(_err, "Error serializing 
'nanosecondsSinceEpoch' field")
                }
-       case plcValueType == PlcValueType_TIME_OF_DAY: // TIME_OF_DAY
+       case plcValueType == api.TIME_OF_DAY: // TIME_OF_DAY
                // Simple Field (millisecondsSinceMidnight)
                if _err := /*TODO: migrate me*/ 
writeBuffer.WriteUint32("millisecondsSinceMidnight", 32, 
uint32(value.(values.PlcTIME_OF_DAY).GetMillisecondsSinceMidnight())); _err != 
nil {
                        return errors.Wrap(_err, "Error serializing 
'millisecondsSinceMidnight' field")
                }
-       case plcValueType == PlcValueType_LTIME_OF_DAY: // LTIME_OF_DAY
+       case plcValueType == api.LTIME_OF_DAY: // LTIME_OF_DAY
                // Simple Field (nanosecondsSinceMidnight)
                if _err := /*TODO: migrate me*/ 
writeBuffer.WriteUint64("nanosecondsSinceMidnight", 64, 
uint64(value.(values.PlcLTIME_OF_DAY).GetNanosecondsSinceMidnight())); _err != 
nil {
                        return errors.Wrap(_err, "Error serializing 
'nanosecondsSinceMidnight' field")
                }
-       case plcValueType == PlcValueType_DATE_AND_TIME: // DATE_AND_TIME
+       case plcValueType == api.DATE_AND_TIME: // DATE_AND_TIME
                // Simple Field (secondsSinceEpoch)
                if _err := /*TODO: migrate me*/ 
writeBuffer.WriteUint32("secondsSinceEpoch", 32, 
uint32(value.(values.PlcDATE_AND_TIME).GetSecondsSinceEpoch())); _err != nil {
                        return errors.Wrap(_err, "Error serializing 
'secondsSinceEpoch' field")
                }
-       case plcValueType == PlcValueType_LDATE_AND_TIME: // LDATE_AND_TIME
+       case plcValueType == api.LDATE_AND_TIME: // LDATE_AND_TIME
                // Simple Field (nanosecondsSinceEpoch)
                if _err := /*TODO: migrate me*/ 
writeBuffer.WriteUint64("nanosecondsSinceEpoch", 64, 
uint64(value.(values.PlcLDATE_AND_TIME).GetNanosecondsSinceEpoch())); _err != 
nil {
                        return errors.Wrap(_err, "Error serializing 
'nanosecondsSinceEpoch' field")
diff --git a/plc4go/protocols/ads/readwrite/model/PlcValueType.go 
b/plc4go/protocols/ads/readwrite/model/PlcValueType.go
deleted file mode 100644
index a7d553d6dd..0000000000
--- a/plc4go/protocols/ads/readwrite/model/PlcValueType.go
+++ /dev/null
@@ -1,387 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   https://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package model
-
-import (
-       "context"
-       "fmt"
-
-       "github.com/pkg/errors"
-       "github.com/rs/zerolog"
-
-       "github.com/apache/plc4x/plc4go/spi/utils"
-)
-
-// Code generated by code-generation. DO NOT EDIT.
-
-// PlcValueType is an enum
-type PlcValueType uint8
-
-type IPlcValueType interface {
-       fmt.Stringer
-       utils.LengthAware
-       utils.Serializable
-}
-
-const (
-       PlcValueType_NULL           PlcValueType = 0x00
-       PlcValueType_BOOL           PlcValueType = 0x01
-       PlcValueType_BYTE           PlcValueType = 0x02
-       PlcValueType_WORD           PlcValueType = 0x03
-       PlcValueType_DWORD          PlcValueType = 0x04
-       PlcValueType_LWORD          PlcValueType = 0x05
-       PlcValueType_USINT          PlcValueType = 0x11
-       PlcValueType_UINT           PlcValueType = 0x12
-       PlcValueType_UDINT          PlcValueType = 0x13
-       PlcValueType_ULINT          PlcValueType = 0x14
-       PlcValueType_SINT           PlcValueType = 0x21
-       PlcValueType_INT            PlcValueType = 0x22
-       PlcValueType_DINT           PlcValueType = 0x23
-       PlcValueType_LINT           PlcValueType = 0x24
-       PlcValueType_REAL           PlcValueType = 0x31
-       PlcValueType_LREAL          PlcValueType = 0x32
-       PlcValueType_CHAR           PlcValueType = 0x41
-       PlcValueType_WCHAR          PlcValueType = 0x42
-       PlcValueType_STRING         PlcValueType = 0x43
-       PlcValueType_WSTRING        PlcValueType = 0x44
-       PlcValueType_TIME           PlcValueType = 0x51
-       PlcValueType_LTIME          PlcValueType = 0x52
-       PlcValueType_DATE           PlcValueType = 0x53
-       PlcValueType_LDATE          PlcValueType = 0x54
-       PlcValueType_TIME_OF_DAY    PlcValueType = 0x55
-       PlcValueType_LTIME_OF_DAY   PlcValueType = 0x56
-       PlcValueType_DATE_AND_TIME  PlcValueType = 0x57
-       PlcValueType_LDATE_AND_TIME PlcValueType = 0x58
-       PlcValueType_Struct         PlcValueType = 0x61
-       PlcValueType_List           PlcValueType = 0x62
-       PlcValueType_RAW_BYTE_ARRAY PlcValueType = 0x71
-)
-
-var PlcValueTypeValues []PlcValueType
-
-func init() {
-       _ = errors.New
-       PlcValueTypeValues = []PlcValueType{
-               PlcValueType_NULL,
-               PlcValueType_BOOL,
-               PlcValueType_BYTE,
-               PlcValueType_WORD,
-               PlcValueType_DWORD,
-               PlcValueType_LWORD,
-               PlcValueType_USINT,
-               PlcValueType_UINT,
-               PlcValueType_UDINT,
-               PlcValueType_ULINT,
-               PlcValueType_SINT,
-               PlcValueType_INT,
-               PlcValueType_DINT,
-               PlcValueType_LINT,
-               PlcValueType_REAL,
-               PlcValueType_LREAL,
-               PlcValueType_CHAR,
-               PlcValueType_WCHAR,
-               PlcValueType_STRING,
-               PlcValueType_WSTRING,
-               PlcValueType_TIME,
-               PlcValueType_LTIME,
-               PlcValueType_DATE,
-               PlcValueType_LDATE,
-               PlcValueType_TIME_OF_DAY,
-               PlcValueType_LTIME_OF_DAY,
-               PlcValueType_DATE_AND_TIME,
-               PlcValueType_LDATE_AND_TIME,
-               PlcValueType_Struct,
-               PlcValueType_List,
-               PlcValueType_RAW_BYTE_ARRAY,
-       }
-}
-
-func PlcValueTypeByValue(value uint8) (enum PlcValueType, ok bool) {
-       switch value {
-       case 0x00:
-               return PlcValueType_NULL, true
-       case 0x01:
-               return PlcValueType_BOOL, true
-       case 0x02:
-               return PlcValueType_BYTE, true
-       case 0x03:
-               return PlcValueType_WORD, true
-       case 0x04:
-               return PlcValueType_DWORD, true
-       case 0x05:
-               return PlcValueType_LWORD, true
-       case 0x11:
-               return PlcValueType_USINT, true
-       case 0x12:
-               return PlcValueType_UINT, true
-       case 0x13:
-               return PlcValueType_UDINT, true
-       case 0x14:
-               return PlcValueType_ULINT, true
-       case 0x21:
-               return PlcValueType_SINT, true
-       case 0x22:
-               return PlcValueType_INT, true
-       case 0x23:
-               return PlcValueType_DINT, true
-       case 0x24:
-               return PlcValueType_LINT, true
-       case 0x31:
-               return PlcValueType_REAL, true
-       case 0x32:
-               return PlcValueType_LREAL, true
-       case 0x41:
-               return PlcValueType_CHAR, true
-       case 0x42:
-               return PlcValueType_WCHAR, true
-       case 0x43:
-               return PlcValueType_STRING, true
-       case 0x44:
-               return PlcValueType_WSTRING, true
-       case 0x51:
-               return PlcValueType_TIME, true
-       case 0x52:
-               return PlcValueType_LTIME, true
-       case 0x53:
-               return PlcValueType_DATE, true
-       case 0x54:
-               return PlcValueType_LDATE, true
-       case 0x55:
-               return PlcValueType_TIME_OF_DAY, true
-       case 0x56:
-               return PlcValueType_LTIME_OF_DAY, true
-       case 0x57:
-               return PlcValueType_DATE_AND_TIME, true
-       case 0x58:
-               return PlcValueType_LDATE_AND_TIME, true
-       case 0x61:
-               return PlcValueType_Struct, true
-       case 0x62:
-               return PlcValueType_List, true
-       case 0x71:
-               return PlcValueType_RAW_BYTE_ARRAY, true
-       }
-       return 0, false
-}
-
-func PlcValueTypeByName(value string) (enum PlcValueType, ok bool) {
-       switch value {
-       case "NULL":
-               return PlcValueType_NULL, true
-       case "BOOL":
-               return PlcValueType_BOOL, true
-       case "BYTE":
-               return PlcValueType_BYTE, true
-       case "WORD":
-               return PlcValueType_WORD, true
-       case "DWORD":
-               return PlcValueType_DWORD, true
-       case "LWORD":
-               return PlcValueType_LWORD, true
-       case "USINT":
-               return PlcValueType_USINT, true
-       case "UINT":
-               return PlcValueType_UINT, true
-       case "UDINT":
-               return PlcValueType_UDINT, true
-       case "ULINT":
-               return PlcValueType_ULINT, true
-       case "SINT":
-               return PlcValueType_SINT, true
-       case "INT":
-               return PlcValueType_INT, true
-       case "DINT":
-               return PlcValueType_DINT, true
-       case "LINT":
-               return PlcValueType_LINT, true
-       case "REAL":
-               return PlcValueType_REAL, true
-       case "LREAL":
-               return PlcValueType_LREAL, true
-       case "CHAR":
-               return PlcValueType_CHAR, true
-       case "WCHAR":
-               return PlcValueType_WCHAR, true
-       case "STRING":
-               return PlcValueType_STRING, true
-       case "WSTRING":
-               return PlcValueType_WSTRING, true
-       case "TIME":
-               return PlcValueType_TIME, true
-       case "LTIME":
-               return PlcValueType_LTIME, true
-       case "DATE":
-               return PlcValueType_DATE, true
-       case "LDATE":
-               return PlcValueType_LDATE, true
-       case "TIME_OF_DAY":
-               return PlcValueType_TIME_OF_DAY, true
-       case "LTIME_OF_DAY":
-               return PlcValueType_LTIME_OF_DAY, true
-       case "DATE_AND_TIME":
-               return PlcValueType_DATE_AND_TIME, true
-       case "LDATE_AND_TIME":
-               return PlcValueType_LDATE_AND_TIME, true
-       case "Struct":
-               return PlcValueType_Struct, true
-       case "List":
-               return PlcValueType_List, true
-       case "RAW_BYTE_ARRAY":
-               return PlcValueType_RAW_BYTE_ARRAY, true
-       }
-       return 0, false
-}
-
-func PlcValueTypeKnows(value uint8) bool {
-       for _, typeValue := range PlcValueTypeValues {
-               if uint8(typeValue) == value {
-                       return true
-               }
-       }
-       return false
-}
-
-func CastPlcValueType(structType any) PlcValueType {
-       castFunc := func(typ any) PlcValueType {
-               if sPlcValueType, ok := typ.(PlcValueType); ok {
-                       return sPlcValueType
-               }
-               return 0
-       }
-       return castFunc(structType)
-}
-
-func (m PlcValueType) GetLengthInBits(ctx context.Context) uint16 {
-       return 8
-}
-
-func (m PlcValueType) GetLengthInBytes(ctx context.Context) uint16 {
-       return m.GetLengthInBits(ctx) / 8
-}
-
-func PlcValueTypeParse(ctx context.Context, theBytes []byte) (PlcValueType, 
error) {
-       return PlcValueTypeParseWithBuffer(ctx, 
utils.NewReadBufferByteBased(theBytes))
-}
-
-func PlcValueTypeParseWithBuffer(ctx context.Context, readBuffer 
utils.ReadBuffer) (PlcValueType, error) {
-       log := zerolog.Ctx(ctx)
-       _ = log
-       val, err := /*TODO: migrate me*/ /*TODO: migrate me*/ 
readBuffer.ReadUint8("PlcValueType", 8)
-       if err != nil {
-               return 0, errors.Wrap(err, "error reading PlcValueType")
-       }
-       if enum, ok := PlcValueTypeByValue(val); !ok {
-               log.Debug().Interface("val", val).Msg("no value val found for 
PlcValueType")
-               return PlcValueType(val), nil
-       } else {
-               return enum, nil
-       }
-}
-
-func (e PlcValueType) Serialize() ([]byte, error) {
-       wb := utils.NewWriteBufferByteBased()
-       if err := e.SerializeWithWriteBuffer(context.Background(), wb); err != 
nil {
-               return nil, err
-       }
-       return wb.GetBytes(), nil
-}
-
-func (e PlcValueType) SerializeWithWriteBuffer(ctx context.Context, 
writeBuffer utils.WriteBuffer) error {
-       log := zerolog.Ctx(ctx)
-       _ = log
-       return /*TODO: migrate me*/ writeBuffer.WriteUint8("PlcValueType", 8, 
uint8(uint8(e)), utils.WithAdditionalStringRepresentation(e.PLC4XEnumName()))
-}
-
-func (e PlcValueType) GetValue() uint8 {
-       return uint8(e)
-}
-
-// PLC4XEnumName returns the name that is used in code to identify this enum
-func (e PlcValueType) PLC4XEnumName() string {
-       switch e {
-       case PlcValueType_NULL:
-               return "NULL"
-       case PlcValueType_BOOL:
-               return "BOOL"
-       case PlcValueType_BYTE:
-               return "BYTE"
-       case PlcValueType_WORD:
-               return "WORD"
-       case PlcValueType_DWORD:
-               return "DWORD"
-       case PlcValueType_LWORD:
-               return "LWORD"
-       case PlcValueType_USINT:
-               return "USINT"
-       case PlcValueType_UINT:
-               return "UINT"
-       case PlcValueType_UDINT:
-               return "UDINT"
-       case PlcValueType_ULINT:
-               return "ULINT"
-       case PlcValueType_SINT:
-               return "SINT"
-       case PlcValueType_INT:
-               return "INT"
-       case PlcValueType_DINT:
-               return "DINT"
-       case PlcValueType_LINT:
-               return "LINT"
-       case PlcValueType_REAL:
-               return "REAL"
-       case PlcValueType_LREAL:
-               return "LREAL"
-       case PlcValueType_CHAR:
-               return "CHAR"
-       case PlcValueType_WCHAR:
-               return "WCHAR"
-       case PlcValueType_STRING:
-               return "STRING"
-       case PlcValueType_WSTRING:
-               return "WSTRING"
-       case PlcValueType_TIME:
-               return "TIME"
-       case PlcValueType_LTIME:
-               return "LTIME"
-       case PlcValueType_DATE:
-               return "DATE"
-       case PlcValueType_LDATE:
-               return "LDATE"
-       case PlcValueType_TIME_OF_DAY:
-               return "TIME_OF_DAY"
-       case PlcValueType_LTIME_OF_DAY:
-               return "LTIME_OF_DAY"
-       case PlcValueType_DATE_AND_TIME:
-               return "DATE_AND_TIME"
-       case PlcValueType_LDATE_AND_TIME:
-               return "LDATE_AND_TIME"
-       case PlcValueType_Struct:
-               return "Struct"
-       case PlcValueType_List:
-               return "List"
-       case PlcValueType_RAW_BYTE_ARRAY:
-               return "RAW_BYTE_ARRAY"
-       }
-       return fmt.Sprintf("Unknown(%v)", uint8(e))
-}
-
-func (e PlcValueType) String() string {
-       return e.PLC4XEnumName()
-}
diff --git a/plc4j/drivers/ads/pom.xml b/plc4j/drivers/ads/pom.xml
index 1359d91633..72e291f64c 100644
--- a/plc4j/drivers/ads/pom.xml
+++ b/plc4j/drivers/ads/pom.xml
@@ -168,6 +168,9 @@
                   <languageName>java</languageName>
                   <outputFlavor>read-write</outputFlavor>
                   <outputDir>src/main/generated</outputDir>
+                  <externalTypes>
+                    
<PlcValueType>org.apache.plc4x.java.api.types.PlcValueType</PlcValueType>
+                  </externalTypes>
                 </configuration>
               </execution>
               <execution>
diff --git 
a/plc4j/drivers/ads/src/main/generated/org/apache/plc4x/java/ads/readwrite/AdsDataType.java
 
b/plc4j/drivers/ads/src/main/generated/org/apache/plc4x/java/ads/readwrite/AdsDataType.java
index 7d0dc5bb73..d825746e15 100644
--- 
a/plc4j/drivers/ads/src/main/generated/org/apache/plc4x/java/ads/readwrite/AdsDataType.java
+++ 
b/plc4j/drivers/ads/src/main/generated/org/apache/plc4x/java/ads/readwrite/AdsDataType.java
@@ -22,6 +22,7 @@ import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
+import org.apache.plc4x.java.api.types.PlcValueType;
 
 // Code generated by code-generation. DO NOT EDIT.
 
diff --git 
a/plc4j/drivers/ads/src/main/generated/org/apache/plc4x/java/ads/readwrite/DataItem.java
 
b/plc4j/drivers/ads/src/main/generated/org/apache/plc4x/java/ads/readwrite/DataItem.java
index f7126c8c74..d7d7f30832 100644
--- 
a/plc4j/drivers/ads/src/main/generated/org/apache/plc4x/java/ads/readwrite/DataItem.java
+++ 
b/plc4j/drivers/ads/src/main/generated/org/apache/plc4x/java/ads/readwrite/DataItem.java
@@ -29,6 +29,7 @@ import java.time.*;
 import java.time.temporal.ChronoField;
 import java.util.*;
 import org.apache.plc4x.java.api.exceptions.*;
+import org.apache.plc4x.java.api.types.PlcValueType;
 import org.apache.plc4x.java.api.value.*;
 import org.apache.plc4x.java.spi.codegen.*;
 import org.apache.plc4x.java.spi.codegen.fields.*;
diff --git 
a/plc4j/drivers/ads/src/main/generated/org/apache/plc4x/java/ads/readwrite/PlcValueType.java
 
b/plc4j/drivers/ads/src/main/generated/org/apache/plc4x/java/ads/readwrite/PlcValueType.java
deleted file mode 100644
index 44d3737931..0000000000
--- 
a/plc4j/drivers/ads/src/main/generated/org/apache/plc4x/java/ads/readwrite/PlcValueType.java
+++ /dev/null
@@ -1,84 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   https://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.plc4x.java.ads.readwrite;
-
-import java.util.HashMap;
-import java.util.Map;
-
-// Code generated by code-generation. DO NOT EDIT.
-
-public enum PlcValueType {
-  NULL((short) 0x00),
-  BOOL((short) 0x01),
-  BYTE((short) 0x02),
-  WORD((short) 0x03),
-  DWORD((short) 0x04),
-  LWORD((short) 0x05),
-  USINT((short) 0x11),
-  UINT((short) 0x12),
-  UDINT((short) 0x13),
-  ULINT((short) 0x14),
-  SINT((short) 0x21),
-  INT((short) 0x22),
-  DINT((short) 0x23),
-  LINT((short) 0x24),
-  REAL((short) 0x31),
-  LREAL((short) 0x32),
-  CHAR((short) 0x41),
-  WCHAR((short) 0x42),
-  STRING((short) 0x43),
-  WSTRING((short) 0x44),
-  TIME((short) 0x51),
-  LTIME((short) 0x52),
-  DATE((short) 0x53),
-  LDATE((short) 0x54),
-  TIME_OF_DAY((short) 0x55),
-  LTIME_OF_DAY((short) 0x56),
-  DATE_AND_TIME((short) 0x57),
-  LDATE_AND_TIME((short) 0x58),
-  Struct((short) 0x61),
-  List((short) 0x62),
-  RAW_BYTE_ARRAY((short) 0x71);
-  private static final Map<Short, PlcValueType> map;
-
-  static {
-    map = new HashMap<>();
-    for (PlcValueType value : PlcValueType.values()) {
-      map.put((short) value.getValue(), value);
-    }
-  }
-
-  private final short value;
-
-  PlcValueType(short value) {
-    this.value = value;
-  }
-
-  public short getValue() {
-    return value;
-  }
-
-  public static PlcValueType enumForValue(short value) {
-    return map.get(value);
-  }
-
-  public static Boolean isDefined(short value) {
-    return map.containsKey(value);
-  }
-}
diff --git 
a/plc4j/drivers/ads/src/main/java/org/apache/plc4x/java/ads/protocol/AdsProtocolLogic.java
 
b/plc4j/drivers/ads/src/main/java/org/apache/plc4x/java/ads/protocol/AdsProtocolLogic.java
index d0797ca2d1..e4edbe1ccc 100644
--- 
a/plc4j/drivers/ads/src/main/java/org/apache/plc4x/java/ads/protocol/AdsProtocolLogic.java
+++ 
b/plc4j/drivers/ads/src/main/java/org/apache/plc4x/java/ads/protocol/AdsProtocolLogic.java
@@ -37,6 +37,7 @@ import org.apache.plc4x.java.api.messages.*;
 import org.apache.plc4x.java.api.model.*;
 import org.apache.plc4x.java.api.types.PlcResponseCode;
 import org.apache.plc4x.java.api.types.PlcSubscriptionType;
+import org.apache.plc4x.java.api.types.PlcValueType;
 import org.apache.plc4x.java.api.value.PlcValue;
 import org.apache.plc4x.java.spi.ConversationContext;
 import org.apache.plc4x.java.spi.Plc4xProtocolBase;
@@ -505,8 +506,7 @@ public class AdsProtocolLogic extends 
Plc4xProtocolBase<AmsTCPPacket> implements
                 }
 
                 // Convert the plc value type from the ADS specific one to the 
PLC4X global one.
-                org.apache.plc4x.java.api.types.PlcValueType plc4xPlcValueType 
=
-                    
org.apache.plc4x.java.api.types.PlcValueType.valueOf(getPlcValueTypeForAdsDataTypeForBrowse(dataType).toString());
+                PlcValueType plcValueType = 
getPlcValueTypeForAdsDataTypeForBrowse(dataType);
 
                 // If this type has children, add entries for its children.
                 List<PlcBrowseItem> children = 
getBrowseItems(symbol.getName(), symbol.getGroup(), symbol.getOffset(), 
!symbol.getFlagReadOnly(), dataType);
@@ -530,7 +530,7 @@ public class AdsProtocolLogic extends 
Plc4xProtocolBase<AmsTCPPacket> implements
                     itemArrayInfo.add(new DefaultPlcBrowseItemArrayInfo(
                         adsDataTypeArrayInfo.getLowerBound(), 
adsDataTypeArrayInfo.getUpperBound()));
                 }
-                DefaultPlcBrowseItemList item = new 
DefaultPlcBrowseItemList(new SymbolicAdsTag(symbol.getName(), 
plc4xPlcValueType, arrayInfo), symbol.getName(),
+                DefaultPlcBrowseItemList item = new 
DefaultPlcBrowseItemList(new SymbolicAdsTag(symbol.getName(), plcValueType, 
arrayInfo), symbol.getName(),
                     true, !symbol.getFlagReadOnly(), true, false, childMap, 
options, itemArrayInfo);
 
                 // Check if this item should be added to the result
diff --git a/pom.xml b/pom.xml
index 72e63c71a4..ca89476dc5 100644
--- a/pom.xml
+++ b/pom.xml
@@ -99,7 +99,7 @@
     
<sonar.cfamily.build-wrapper-output>${project.basedir}/plc4c/target/build-wrapper-output
     </sonar.cfamily.build-wrapper-output>
 
-    <plc4x-code-generation.version>1.7.0</plc4x-code-generation.version>
+    
<plc4x-code-generation.version>1.8.0-SNAPSHOT</plc4x-code-generation.version>
 
     <antlr.version>4.13.2</antlr.version>
     <apiguardian.version>1.1.2</apiguardian.version>
diff --git a/protocols/ads/src/main/resources/protocols/ads/ads.mspec 
b/protocols/ads/src/main/resources/protocols/ads/ads.mspec
index b2d2516f3e..5835e7b690 100644
--- a/protocols/ads/src/main/resources/protocols/ads/ads.mspec
+++ b/protocols/ads/src/main/resources/protocols/ads/ads.mspec
@@ -21,6 +21,12 @@
     [const          uint 16     adsTcpDefaultPort 48898]
 ]
 
+////////////////////////////////////////////////////////////////
+// External types
+////////////////////////////////////////////////////////////////
+
+[enum PlcValueType external='true']
+
 ////////////////////////////////////////////////////////////////
 // AMS/TCP Packet
 ////////////////////////////////////////////////////////////////
@@ -512,55 +518,6 @@
     ]
 ]
 
-[enum uint 8 PlcValueType
-    ['0x00' NULL          ]
-
-    // Bit Strings
-    ['0x01' BOOL          ]
-    ['0x02' BYTE          ]
-    ['0x03' WORD          ]
-    ['0x04' DWORD         ]
-    ['0x05' LWORD         ]
-
-    // Unsigned Integers
-    ['0x11' USINT         ]
-    ['0x12' UINT          ]
-    ['0x13' UDINT         ]
-    ['0x14' ULINT         ]
-
-    // Signed Integers
-    ['0x21' SINT          ]
-    ['0x22' INT           ]
-    ['0x23' DINT          ]
-    ['0x24' LINT          ]
-
-    // Floating Point Values
-    ['0x31' REAL          ]
-    ['0x32' LREAL         ]
-
-    // Chars and Strings
-    ['0x41' CHAR          ]
-    ['0x42' WCHAR         ]
-    ['0x43' STRING        ]
-    ['0x44' WSTRING       ]
-
-    // Times and Dates
-    ['0x51' TIME          ]
-    ['0x52' LTIME         ]
-    ['0x53' DATE          ]
-    ['0x54' LDATE         ]
-    ['0x55' TIME_OF_DAY   ]
-    ['0x56' LTIME_OF_DAY  ]
-    ['0x57' DATE_AND_TIME ]
-    ['0x58' LDATE_AND_TIME]
-
-    // Complex types
-    ['0x61' Struct        ]
-    ['0x62' List          ]
-
-    ['0x71' RAW_BYTE_ARRAY]
-]
-
 [enum int 8 AdsDataType(uint 16 numBytes, PlcValueType plcValueType)
     ['0x01' BOOL           ['1',   'BOOL'         ]]
     ['0x02' BIT            ['1',   'BOOL'         ]]


Reply via email to