feat(plc4j)!: Improve stability of code through stricter compiler checks of generated contents.

BREAKING CHANGE: Removed `staticParse(io, ... args)` methods.

Signed-off-by: Łukasz Dywicki <luke@code-house.org>
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 6a200a4..8c4ae7c 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
@@ -580,32 +580,6 @@
         return lengthInBits;
     }
 
-<#-- The parse and serialize methods here are just proxies for forwardning the requests to static counterparts -->
-    <#if !type.isDiscriminatedChildTypeDefinition()>
-    public static ${type.name} staticParse(ReadBuffer readBuffer, Object... args) throws ParseException {
-        PositionAware positionAware = readBuffer;
-        <#if parserArguments?has_content>
-        if((args == null) || (args.length != ${parserArguments?size})) {
-            throw new PlcRuntimeException("Wrong number of arguments, expected ${parserArguments?size}, but got " + args.length);
-        }
-            <#list parserArguments as parserArgument>
-                <#assign languageName=helper.getLanguageTypeNameForTypeReference(parserArgument.type, false)>
-        ${languageName} ${parserArgument.name};
-        if(args[${parserArgument?index}] instanceof ${languageName}) {
-            ${parserArgument.name} = (${languageName}) args[${parserArgument?index}];
-                <#if parserArgument.type.isSimpleTypeReference() || parserArgument.type.isEnumTypeReference()>
-        } else if (args[${parserArgument?index}] instanceof String) {
-            ${parserArgument.name} = ${languageName}.valueOf((String) args[${parserArgument?index}]);
-                </#if>
-        } else {
-            throw new PlcRuntimeException("Argument ${parserArgument?index} expected to be of type ${languageName} or a string which is parseable but was " + args[${parserArgument?index}].getClass().getName());
-        }
-            </#list>
-        </#if>
-        return staticParse(readBuffer<#if parserArguments?has_content>, <#list parserArguments as parserArgument>${parserArgument.name}<#sep>, </#sep></#list></#if>);
-    }
-
-    </#if>
 <#-- Here come the actual parse and serialize methods that actually do the parsing and serlaizing -->
     <#assign hasParserArguments=parserArguments?has_content/>
     <#assign parserArgumentList><#if hasParserArguments><#list parserArguments as parserArgument>${helper.getLanguageTypeNameForTypeReference(parserArgument.type, false)} ${parserArgument.name}<#sep>, </#sep></#list></#if></#assign>
diff --git a/plc4j/drivers/c-bus/src/main/java/org/apache/plc4x/java/cbus/CBusDriver.java b/plc4j/drivers/c-bus/src/main/java/org/apache/plc4x/java/cbus/CBusDriver.java
index a8239c0..300ffa9 100644
--- a/plc4j/drivers/c-bus/src/main/java/org/apache/plc4x/java/cbus/CBusDriver.java
+++ b/plc4j/drivers/c-bus/src/main/java/org/apache/plc4x/java/cbus/CBusDriver.java
@@ -19,6 +19,9 @@
 package org.apache.plc4x.java.cbus;
 
 import io.netty.buffer.ByteBuf;
+import org.apache.plc4x.java.cbus.readwrite.CBusMessage;
+import org.apache.plc4x.java.cbus.readwrite.CBusOptions;
+import org.apache.plc4x.java.cbus.readwrite.RequestContext;
 import org.apache.plc4x.java.spi.configuration.PlcConnectionConfiguration;
 import org.apache.plc4x.java.spi.configuration.PlcTransportConfiguration;
 import org.apache.plc4x.java.api.value.PlcValueHandler;
@@ -92,7 +95,8 @@
 
     @Override
     protected ProtocolStackConfigurer<CBusCommand> getStackConfigurer() {
-        return SingleProtocolStackConfigurer.builder(CBusCommand.class, CBusCommand::staticParse)
+        return SingleProtocolStackConfigurer.builder(CBusCommand.class, io ->
+                CBusCommand.staticParse(io, new CBusOptions(false, false, false, false, false, false, false, false, false)))
             .withProtocol(CBusProtocolLogic.class)
             .withDriverContext(CBusDriverContext.class)
             .withPacketSizeEstimator(ByteLengthEstimator.class)
diff --git a/plc4j/drivers/canopen/src/main/java/org/apache/plc4x/java/canopen/transport/CANOpenFrameDataHandler.java b/plc4j/drivers/canopen/src/main/java/org/apache/plc4x/java/canopen/transport/CANOpenFrameDataHandler.java
index afe400a..ec52a77 100644
--- a/plc4j/drivers/canopen/src/main/java/org/apache/plc4x/java/canopen/transport/CANOpenFrameDataHandler.java
+++ b/plc4j/drivers/canopen/src/main/java/org/apache/plc4x/java/canopen/transport/CANOpenFrameDataHandler.java
@@ -48,7 +48,7 @@
     public CANOpenFrame fromCAN(FrameData frame) {
         CANOpenService service = StaticHelper.serviceId((short) frame.getNodeId());
         int nodeId = Math.abs(service.getMin() - frame.getNodeId());
-        return new CANOpenFrame((short) nodeId, service, frame.read(CANOpenPayload::staticParse, service));
+        return new CANOpenFrame((short) nodeId, service, frame.read(io -> CANOpenPayload.staticParse(io, service)));
     }
 
     @Override
diff --git a/plc4j/drivers/canopen/src/test/java/org/apache/plc4x/java/canopen/transport/CANOpenFrameDataAdapter.java b/plc4j/drivers/canopen/src/test/java/org/apache/plc4x/java/canopen/transport/CANOpenFrameDataAdapter.java
index a2b44ec..62f3c41 100644
--- a/plc4j/drivers/canopen/src/test/java/org/apache/plc4x/java/canopen/transport/CANOpenFrameDataAdapter.java
+++ b/plc4j/drivers/canopen/src/test/java/org/apache/plc4x/java/canopen/transport/CANOpenFrameDataAdapter.java
@@ -43,7 +43,7 @@
             }
 
             @Override
-            public <T extends Message> T read(MessageInput<T> input, Object... args) {
+            public <T extends Message> T read(MessageInput<T> input) {
                 return (T) frame.getPayload();
             }
 
diff --git a/plc4j/drivers/eip/src/main/java/org/apache/plc4x/java/eip/base/EIPDriver.java b/plc4j/drivers/eip/src/main/java/org/apache/plc4x/java/eip/base/EIPDriver.java
index e4d0e43..2f85009 100644
--- a/plc4j/drivers/eip/src/main/java/org/apache/plc4x/java/eip/base/EIPDriver.java
+++ b/plc4j/drivers/eip/src/main/java/org/apache/plc4x/java/eip/base/EIPDriver.java
@@ -120,10 +120,9 @@
 
     @Override
     protected ProtocolStackConfigurer<EipPacket> getStackConfigurer() {
-        return SingleProtocolStackConfigurer.builder(EipPacket.class, EipPacket::staticParse)
+        return SingleProtocolStackConfigurer.builder(EipPacket.class, io -> EipPacket.staticParse(io, true))
             .withProtocol(EipProtocolLogic.class)
             .withPacketSizeEstimator(ByteLengthEstimator.class)
-            .withParserArgs(true)
             .withCorruptPacketRemover(CorruptPackageCleaner.class)
             .byteOrder(this.configuration.getByteOrder())
             .build();
diff --git a/plc4j/drivers/eip/src/main/java/org/apache/plc4x/java/eip/logix/LogixDriver.java b/plc4j/drivers/eip/src/main/java/org/apache/plc4x/java/eip/logix/LogixDriver.java
index 6b5229e..b8bb251 100644
--- a/plc4j/drivers/eip/src/main/java/org/apache/plc4x/java/eip/logix/LogixDriver.java
+++ b/plc4j/drivers/eip/src/main/java/org/apache/plc4x/java/eip/logix/LogixDriver.java
@@ -99,10 +99,9 @@
 
     @Override
     protected ProtocolStackConfigurer<EipPacket> getStackConfigurer() {
-        return SingleProtocolStackConfigurer.builder(EipPacket.class, EipPacket::staticParse)
+        return SingleProtocolStackConfigurer.builder(EipPacket.class, io -> EipPacket.staticParse(io, true))
             .withProtocol(EipProtocolLogic.class)
             .withPacketSizeEstimator(ByteLengthEstimator.class)
-            .withParserArgs(true)
             .withCorruptPacketRemover(CorruptPackageCleaner.class)
             .littleEndian()
             .build();
diff --git a/plc4j/drivers/firmata/src/main/java/org/apache/plc4x/java/firmata/readwrite/FirmataDriver.java b/plc4j/drivers/firmata/src/main/java/org/apache/plc4x/java/firmata/readwrite/FirmataDriver.java
index ee2547f..de49415 100644
--- a/plc4j/drivers/firmata/src/main/java/org/apache/plc4x/java/firmata/readwrite/FirmataDriver.java
+++ b/plc4j/drivers/firmata/src/main/java/org/apache/plc4x/java/firmata/readwrite/FirmataDriver.java
@@ -96,13 +96,11 @@
 
     @Override
     protected ProtocolStackConfigurer<FirmataMessage> getStackConfigurer() {
-        return SingleProtocolStackConfigurer.builder(FirmataMessage.class, FirmataMessage::staticParse)
+        return SingleProtocolStackConfigurer.builder(FirmataMessage.class, io -> FirmataMessage.staticParse(io, true))
             .withProtocol(FirmataProtocolLogic.class)
             .withDriverContext(FirmataDriverContext.class)
             .withPacketSizeEstimator(ByteLengthEstimator.class)
             .withCorruptPacketRemover(CorruptPackageCleaner.class)
-            // Every incoming message is to be treated as a response.
-            .withParserArgs(true)
             .build();
     }
 
diff --git a/plc4j/drivers/modbus/src/main/java/org/apache/plc4x/java/modbus/ascii/ModbusAsciiDriver.java b/plc4j/drivers/modbus/src/main/java/org/apache/plc4x/java/modbus/ascii/ModbusAsciiDriver.java
index 071b637..d1a1ddd 100644
--- a/plc4j/drivers/modbus/src/main/java/org/apache/plc4x/java/modbus/ascii/ModbusAsciiDriver.java
+++ b/plc4j/drivers/modbus/src/main/java/org/apache/plc4x/java/modbus/ascii/ModbusAsciiDriver.java
@@ -133,13 +133,10 @@
 
     @Override
     protected ProtocolStackConfigurer<ModbusAsciiADU> getStackConfigurer() {
-        return SingleProtocolStackConfigurer.builder(ModbusAsciiADU.class,
-                new ModbusAsciiInput(), new ModbusAsciiOutput())
+        return SingleProtocolStackConfigurer.builder(ModbusAsciiADU.class, new ModbusAsciiInput(), new ModbusAsciiOutput())
             .withProtocol(ModbusAsciiProtocolLogic.class)
             .withPacketSizeEstimator(ModbusAsciiDriver.ByteLengthEstimator.class)
             .withCorruptPacketRemover(ModbusAsciiDriver.CorruptPackageCleaner.class)
-            // Every incoming message is to be treated as a response.
-            .withParserArgs(DriverType.MODBUS_ASCII, true)
             .build();
     }
 
@@ -160,7 +157,7 @@
                 // Try to parse the buffer content.
                 try {
                     ModbusAsciiInput input = new ModbusAsciiInput();
-                    ModbusAsciiADU modbusADU = input.parse(reader, DriverType.MODBUS_ASCII, true);
+                    ModbusAsciiADU modbusADU = input.parse(reader);
 
                     // Make sure we only read one message.
                     return (modbusADU.getLengthInBytes() * 2) + 3;
@@ -198,7 +195,7 @@
 
     public static class ModbusAsciiInput implements MessageInput<ModbusAsciiADU> {
         @Override
-        public ModbusAsciiADU parse(ReadBuffer io, Object... args) throws ParseException {
+        public ModbusAsciiADU parse(ReadBuffer io) throws ParseException {
             // A Modbus ASCII message starts with an ASCII character ":" and is ended by two characters CRLF
             // (Carriage-Return + Line-Feed)
             // The actual payload is that each byte of the message is encoded by a string representation of it's
@@ -228,7 +225,7 @@
 
     public static class ModbusAsciiOutput implements MessageOutput<ModbusAsciiADU> {
         @Override
-        public WriteBufferByteBased serialize(ModbusAsciiADU value, Object... args) throws SerializationException {
+        public WriteBufferByteBased serialize(ModbusAsciiADU value) throws SerializationException {
             // First serialize the packet the normal way.
             WriteBufferByteBased writeBufferByteBased = new WriteBufferByteBased(value.getLengthInBytes());
             value.serialize(writeBufferByteBased);
diff --git a/plc4j/drivers/modbus/src/main/java/org/apache/plc4x/java/modbus/rtu/ModbusRtuDriver.java b/plc4j/drivers/modbus/src/main/java/org/apache/plc4x/java/modbus/rtu/ModbusRtuDriver.java
index 0d96a37..a3763b6 100644
--- a/plc4j/drivers/modbus/src/main/java/org/apache/plc4x/java/modbus/rtu/ModbusRtuDriver.java
+++ b/plc4j/drivers/modbus/src/main/java/org/apache/plc4x/java/modbus/rtu/ModbusRtuDriver.java
@@ -32,6 +32,7 @@
 import org.apache.plc4x.java.spi.connection.GeneratedDriverBase;
 import org.apache.plc4x.java.spi.connection.ProtocolStackConfigurer;
 import org.apache.plc4x.java.spi.connection.SingleProtocolStackConfigurer;
+import org.apache.plc4x.java.spi.generation.MessageInput;
 import org.apache.plc4x.java.spi.generation.ParseException;
 import org.apache.plc4x.java.spi.generation.ReadBufferByteBased;
 import org.apache.plc4x.java.spi.optimizer.BaseOptimizer;
@@ -129,12 +130,9 @@
 
     @Override
     protected ProtocolStackConfigurer<ModbusRtuADU> getStackConfigurer() {
-        return SingleProtocolStackConfigurer.builder(ModbusRtuADU.class,
-                (io, args) -> (ModbusRtuADU) ModbusRtuADU.staticParse(io, args))
+        return SingleProtocolStackConfigurer.builder(ModbusRtuADU.class, io -> (ModbusRtuADU) ModbusRtuADU.staticParse(io, DriverType.MODBUS_RTU, true))
             .withProtocol(ModbusRtuProtocolLogic.class)
             .withPacketSizeEstimator(ModbusRtuDriver.ByteLengthEstimator.class)
-            // Every incoming message is to be treated as a response.
-            .withParserArgs(DriverType.MODBUS_RTU, true)
             .build();
     }
 
diff --git a/plc4j/drivers/modbus/src/main/java/org/apache/plc4x/java/modbus/tcp/ModbusTcpDriver.java b/plc4j/drivers/modbus/src/main/java/org/apache/plc4x/java/modbus/tcp/ModbusTcpDriver.java
index 9a5cb59..2d4c8fc 100644
--- a/plc4j/drivers/modbus/src/main/java/org/apache/plc4x/java/modbus/tcp/ModbusTcpDriver.java
+++ b/plc4j/drivers/modbus/src/main/java/org/apache/plc4x/java/modbus/tcp/ModbusTcpDriver.java
@@ -134,12 +134,9 @@
 
     @Override
     protected ProtocolStackConfigurer<ModbusTcpADU> getStackConfigurer() {
-        return SingleProtocolStackConfigurer.builder(ModbusTcpADU.class,
-                (io, args) -> (ModbusTcpADU) ModbusTcpADU.staticParse(io, args))
+        return SingleProtocolStackConfigurer.builder(ModbusTcpADU.class, (io) -> (ModbusTcpADU) ModbusTcpADU.staticParse(io, DriverType.MODBUS_TCP, true))
             .withProtocol(ModbusTcpProtocolLogic.class)
             .withPacketSizeEstimator(ByteLengthEstimator.class)
-            // Every incoming message is to be treated as a response.
-            .withParserArgs(DriverType.MODBUS_TCP, true)
             .build();
     }
 
diff --git a/plc4j/drivers/opcua/src/main/java/org/apache/plc4x/java/opcua/OpcuaPlcDriver.java b/plc4j/drivers/opcua/src/main/java/org/apache/plc4x/java/opcua/OpcuaPlcDriver.java
index 7901f29..6d083cf 100644
--- a/plc4j/drivers/opcua/src/main/java/org/apache/plc4x/java/opcua/OpcuaPlcDriver.java
+++ b/plc4j/drivers/opcua/src/main/java/org/apache/plc4x/java/opcua/OpcuaPlcDriver.java
@@ -107,10 +107,9 @@
 
     @Override
     protected ProtocolStackConfigurer<OpcuaAPU> getStackConfigurer() {
-        return SingleProtocolStackConfigurer.builder(OpcuaAPU.class, OpcuaAPU::staticParse)
+        return SingleProtocolStackConfigurer.builder(OpcuaAPU.class, io -> OpcuaAPU.staticParse(io, true))
             .withProtocol(OpcuaProtocolLogic.class)
             .withPacketSizeEstimator(ByteLengthEstimator.class)
-            .withParserArgs(true)
             .withDriverContext(OpcuaDriverContext.class)
             .littleEndian()
             .build();
diff --git a/plc4j/drivers/opcua/src/main/java/org/apache/plc4x/java/opcua/protocol/chunk/PayloadConverter.java b/plc4j/drivers/opcua/src/main/java/org/apache/plc4x/java/opcua/protocol/chunk/PayloadConverter.java
index c84d858..2ae7f37 100644
--- a/plc4j/drivers/opcua/src/main/java/org/apache/plc4x/java/opcua/protocol/chunk/PayloadConverter.java
+++ b/plc4j/drivers/opcua/src/main/java/org/apache/plc4x/java/opcua/protocol/chunk/PayloadConverter.java
@@ -81,9 +81,9 @@
         return Payload.staticParse(buffer, extensible, (long) (extensible ? -1 : payload.length - 8));
     }
 
-    public static MessagePDU fromStream(ByteBuffer chunkBuffer, boolean response, boolean encrypted) throws ParseException {
+    public static MessagePDU fromStream(ByteBuffer chunkBuffer, boolean response) throws ParseException {
         ReadBufferByteBased buffer = new ReadBufferByteBased(chunkBuffer.array(), ByteOrder.LITTLE_ENDIAN);
-        return MessagePDU.staticParse(buffer, response, encrypted);
+        return MessagePDU.staticParse(buffer, response);
     }
 
     public static MessagePDU pduFromStream(byte[] message, boolean response) throws ParseException {
diff --git a/plc4j/drivers/open-protocol/src/main/java/org/apache/plc4x/java/openprotocol/OpenProtocolDriver.java b/plc4j/drivers/open-protocol/src/main/java/org/apache/plc4x/java/openprotocol/OpenProtocolDriver.java
index 7c96d26..6bdf9d6 100644
--- a/plc4j/drivers/open-protocol/src/main/java/org/apache/plc4x/java/openprotocol/OpenProtocolDriver.java
+++ b/plc4j/drivers/open-protocol/src/main/java/org/apache/plc4x/java/openprotocol/OpenProtocolDriver.java
@@ -112,8 +112,7 @@
 
     @Override
     protected ProtocolStackConfigurer<OpenProtocolMessage> getStackConfigurer() {
-        return SingleProtocolStackConfigurer.builder(OpenProtocolMessage.class,
-                OpenProtocolMessage::staticParse)
+        return SingleProtocolStackConfigurer.builder(OpenProtocolMessage.class, io -> OpenProtocolMessage.staticParse(io, 1))
             .withProtocol(OpenProtocolProtocolLogic.class)
             .withPacketSizeEstimator(ByteLengthEstimator.class)
             .build();
diff --git a/plc4j/drivers/profinet/src/main/java/org/apache/plc4x/java/profinet/ProfinetDriver.java b/plc4j/drivers/profinet/src/main/java/org/apache/plc4x/java/profinet/ProfinetDriver.java
index d38a046..60de10c 100644
--- a/plc4j/drivers/profinet/src/main/java/org/apache/plc4x/java/profinet/ProfinetDriver.java
+++ b/plc4j/drivers/profinet/src/main/java/org/apache/plc4x/java/profinet/ProfinetDriver.java
@@ -151,7 +151,6 @@
             .withProtocol(ProfinetProtocolLogic.class)
             .withDriverContext(ProfinetDriverContext.class)
             // Every incoming message is to be treated as a response.
-            .withParserArgs(true)
             .build();
     }
 
diff --git a/plc4j/drivers/s7/src/main/java/org/apache/plc4x/java/s7/readwrite/protocol/S7HSingleProtocolStackConfigurer.java b/plc4j/drivers/s7/src/main/java/org/apache/plc4x/java/s7/readwrite/protocol/S7HSingleProtocolStackConfigurer.java
index 61adcbc..afb71d3 100644
--- a/plc4j/drivers/s7/src/main/java/org/apache/plc4x/java/s7/readwrite/protocol/S7HSingleProtocolStackConfigurer.java
+++ b/plc4j/drivers/s7/src/main/java/org/apache/plc4x/java/s7/readwrite/protocol/S7HSingleProtocolStackConfigurer.java
@@ -60,7 +60,6 @@
     private final Class<? extends ToIntFunction<ByteBuf>> packetSizeEstimatorClass;
     private final Class<? extends Consumer<ByteBuf>> corruptPacketRemoverClass;
     private final MessageToMessageCodec<ByteBuf, ByteBuf> encryptionHandler;
-    private final Object[] parserArgs;
 
     private Plc4xProtocolBase<BASE_PACKET_CLASS> protocol = null;
 
@@ -77,7 +76,6 @@
      */
     S7HSingleProtocolStackConfigurer(Class<BASE_PACKET_CLASS> basePacketClass,
                                      ByteOrder byteOrder,
-                                     Object[] parserArgs,
                                      Class<? extends Plc4xProtocolBase<BASE_PACKET_CLASS>> protocol,
                                      Class<? extends DriverContext> driverContextClass,
                                      MessageInput<BASE_PACKET_CLASS> messageInput,
@@ -87,7 +85,6 @@
                                      MessageToMessageCodec<ByteBuf, ByteBuf> encryptionHandler) {
         this.basePacketClass = basePacketClass;
         this.byteOrder = byteOrder;
-        this.parserArgs = parserArgs;
         this.protocolClass = protocol;
         this.driverContextClass = driverContextClass;
         this.messageInput = messageInput;
@@ -98,7 +95,7 @@
     }
 
     private ChannelHandler getMessageCodec(PlcConnectionConfiguration configuration) {
-        return new GeneratedProtocolMessageCodec<>(basePacketClass, messageInput, messageOutput, byteOrder, parserArgs,
+        return new GeneratedProtocolMessageCodec<>(basePacketClass, messageInput, messageOutput, byteOrder,
             packetSizeEstimatorClass != null ? configure(configuration, createInstance(packetSizeEstimatorClass)) : null,
             corruptPacketRemoverClass != null ? configure(configuration, createInstance(corruptPacketRemoverClass)) : null);
     }
@@ -154,7 +151,6 @@
         private final MessageOutput<BASE_PACKET_CLASS> messageOutput;
         private Class<? extends DriverContext> driverContextClass;
         private ByteOrder byteOrder = ByteOrder.BIG_ENDIAN;
-        private Object[] parserArgs;
         private Class<? extends Plc4xProtocolBase<BASE_PACKET_CLASS>> protocol;
         private Class<? extends ToIntFunction<ByteBuf>> packetSizeEstimator;
         private Class<? extends Consumer<ByteBuf>> corruptPacketRemover;
@@ -186,11 +182,6 @@
             return this;
         }
 
-        public S7HSingleProtocolStackBuilder<BASE_PACKET_CLASS> withParserArgs(Object... parserArgs) {
-            this.parserArgs = parserArgs;
-            return this;
-        }
-
         public S7HSingleProtocolStackBuilder<BASE_PACKET_CLASS> withProtocol(Class<? extends Plc4xProtocolBase<BASE_PACKET_CLASS>> protocol) {
             this.protocol = protocol;
             return this;
@@ -213,7 +204,7 @@
 
         public S7HSingleProtocolStackConfigurer<BASE_PACKET_CLASS> build() {
             assert this.protocol != null;
-            return new S7HSingleProtocolStackConfigurer<>(basePacketClass, byteOrder, parserArgs, protocol,
+            return new S7HSingleProtocolStackConfigurer<>(basePacketClass, byteOrder, protocol,
                 driverContextClass, messageInput, messageOutput, packetSizeEstimator, corruptPacketRemover,
                 encryptionHandler);
         }
diff --git a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/GeneratedDriverByteToMessageCodec.java b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/GeneratedDriverByteToMessageCodec.java
index a8ed314..d3dac42 100644
--- a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/GeneratedDriverByteToMessageCodec.java
+++ b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/GeneratedDriverByteToMessageCodec.java
@@ -33,17 +33,15 @@
     private static final Logger LOGGER = LoggerFactory.getLogger(GeneratedDriverByteToMessageCodec.class);
 
     private final ByteOrder byteOrder;
-    private final Object[] parserArgs;
     private final MessageInput<T> messageInput;
     private final MessageOutput<T> messageOutput;
 
     protected GeneratedDriverByteToMessageCodec(MessageInput<T> messageInput, MessageOutput<T> messageOutput,
-                                                Class<T> outboundMessageType, ByteOrder byteOrder, Object[] parserArgs) {
+                                                Class<T> outboundMessageType, ByteOrder byteOrder) {
         super(outboundMessageType);
         this.messageInput = messageInput;
         this.messageOutput = messageOutput;
         this.byteOrder = byteOrder;
-        this.parserArgs = parserArgs;
     }
 
     @Override
@@ -84,7 +82,7 @@
                 ReadBuffer readBuffer = new ReadBufferByteBased(bytes, byteOrder);
 
                 // Parse the packet.
-                T packet = messageInput.parse(readBuffer, parserArgs);
+                T packet = messageInput.parse(readBuffer);
 
                 // Pass the packet to the pipeline.
                 out.add(packet);
diff --git a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/connection/CustomProtocolStackConfigurer.java b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/connection/CustomProtocolStackConfigurer.java
index 2fc9c59..c61c25e 100644
--- a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/connection/CustomProtocolStackConfigurer.java
+++ b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/connection/CustomProtocolStackConfigurer.java
@@ -84,7 +84,7 @@
     }
 
     private ChannelHandler getMessageCodec(PlcConnectionConfiguration configuration) {
-        return new GeneratedProtocolMessageCodec<>(basePacketClass, protocolIO.apply(configuration), byteOrder, parserArgs,
+        return new GeneratedProtocolMessageCodec<>(basePacketClass, protocolIO.apply(configuration), byteOrder,
             packetSizeEstimator == null ? null : packetSizeEstimator.apply(configuration),
             corruptPacketRemover == null ? null : corruptPacketRemover.apply(configuration));
     }
diff --git a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/connection/GeneratedProtocolMessageCodec.java b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/connection/GeneratedProtocolMessageCodec.java
index 41d8a4d..f7521f5 100644
--- a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/connection/GeneratedProtocolMessageCodec.java
+++ b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/connection/GeneratedProtocolMessageCodec.java
@@ -34,10 +34,9 @@
         Class<BASE_PACKET_CLASS> basePacketClass,
         MessageInput<BASE_PACKET_CLASS> messageInput,
         ByteOrder byteOrder,
-        Object[] parserArgs,
         ToIntFunction<ByteBuf> packetSizeEstimator,
         Consumer<ByteBuf> corruptPackageRemover) {
-        super(messageInput, null, basePacketClass, byteOrder, parserArgs);
+        super(messageInput, null, basePacketClass, byteOrder);
         this.packetSizeEstimator = packetSizeEstimator;
         this.corruptPackageRemover = corruptPackageRemover;
     }
@@ -47,10 +46,9 @@
         MessageInput<BASE_PACKET_CLASS> messageInput,
         MessageOutput<BASE_PACKET_CLASS> messageOutput,
         ByteOrder byteOrder,
-        Object[] parserArgs,
         ToIntFunction<ByteBuf> packetSizeEstimator,
         Consumer<ByteBuf> corruptPackageRemover) {
-        super(messageInput, messageOutput, basePacketClass, byteOrder, parserArgs);
+        super(messageInput, messageOutput, basePacketClass, byteOrder);
         this.packetSizeEstimator = packetSizeEstimator;
         this.corruptPackageRemover = corruptPackageRemover;
     }
diff --git a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/connection/SingleProtocolStackConfigurer.java b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/connection/SingleProtocolStackConfigurer.java
index 8252eec..5ea017c 100644
--- a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/connection/SingleProtocolStackConfigurer.java
+++ b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/connection/SingleProtocolStackConfigurer.java
@@ -57,7 +57,6 @@
     private final Class<? extends ToIntFunction<ByteBuf>> packetSizeEstimatorClass;
     private final Class<? extends Consumer<ByteBuf>> corruptPacketRemoverClass;
     private final MessageToMessageCodec<ByteBuf, ByteBuf> encryptionHandler;
-    private final Object[] parserArgs;
 
     public static <BPC extends Message> SingleProtocolStackBuilder<BPC> builder(Class<BPC> basePacketClass, MessageInput<BPC> messageInput) {
         return new SingleProtocolStackBuilder<>(basePacketClass, messageInput, null);
@@ -72,7 +71,6 @@
      */
     SingleProtocolStackConfigurer(Class<BASE_PACKET_CLASS> basePacketClass,
                                   ByteOrder byteOrder,
-                                  Object[] parserArgs,
                                   Class<? extends Plc4xProtocolBase<BASE_PACKET_CLASS>> protocol,
                                   Class<? extends DriverContext> driverContextClass,
                                   MessageInput<BASE_PACKET_CLASS> messageInput,
@@ -82,7 +80,6 @@
                                   MessageToMessageCodec<ByteBuf, ByteBuf> encryptionHandler) {
         this.basePacketClass = basePacketClass;
         this.byteOrder = byteOrder;
-        this.parserArgs = parserArgs;
         this.protocolClass = protocol;
         this.driverContextClass = driverContextClass;
         this.messageInput = messageInput;
@@ -93,7 +90,7 @@
     }
 
     private ChannelHandler getMessageCodec(PlcConnectionConfiguration configuration) {
-        return new GeneratedProtocolMessageCodec<>(basePacketClass, messageInput, messageOutput, byteOrder, parserArgs,
+        return new GeneratedProtocolMessageCodec<>(basePacketClass, messageInput, messageOutput, byteOrder,
             packetSizeEstimatorClass != null ? configure(configuration, createInstance(packetSizeEstimatorClass)) : null,
             corruptPacketRemoverClass != null ? configure(configuration, createInstance(corruptPacketRemoverClass)) : null);
     }
@@ -144,7 +141,6 @@
         private final MessageOutput<BASE_PACKET_CLASS> messageOutput;
         private Class<? extends DriverContext> driverContextClass;
         private ByteOrder byteOrder = ByteOrder.BIG_ENDIAN;
-        private Object[] parserArgs;
         private Class<? extends Plc4xProtocolBase<BASE_PACKET_CLASS>> protocol;
         private Class<? extends ToIntFunction<ByteBuf>> packetSizeEstimator;
         private Class<? extends Consumer<ByteBuf>> corruptPacketRemover;
@@ -176,11 +172,6 @@
             return this;
         }
 
-        public SingleProtocolStackBuilder<BASE_PACKET_CLASS> withParserArgs(Object... parserArgs) {
-            this.parserArgs = parserArgs;
-            return this;
-        }
-
         public SingleProtocolStackBuilder<BASE_PACKET_CLASS> withProtocol(Class<? extends Plc4xProtocolBase<BASE_PACKET_CLASS>> protocol) {
             this.protocol = protocol;
             return this;
@@ -203,7 +194,7 @@
 
         public SingleProtocolStackConfigurer<BASE_PACKET_CLASS> build() {
             assert this.protocol != null;
-            return new SingleProtocolStackConfigurer<>(basePacketClass, byteOrder, parserArgs, protocol,
+            return new SingleProtocolStackConfigurer<>(basePacketClass, byteOrder, protocol,
                 driverContextClass, messageInput, messageOutput, packetSizeEstimator, corruptPacketRemover,
                 encryptionHandler);
         }
diff --git a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/generation/MessageInput.java b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/generation/MessageInput.java
index 2d1ee1f..e6005a1 100644
--- a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/generation/MessageInput.java
+++ b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/generation/MessageInput.java
@@ -21,6 +21,6 @@
 @FunctionalInterface
 public interface MessageInput<PARSER_TYPE> {
 
-    PARSER_TYPE parse(ReadBuffer io, Object... args) throws ParseException;
+    PARSER_TYPE parse(ReadBuffer io) throws ParseException;
 
 }
diff --git a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/generation/MessageOutput.java b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/generation/MessageOutput.java
index a0147f5..e28d465 100644
--- a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/generation/MessageOutput.java
+++ b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/generation/MessageOutput.java
@@ -20,6 +20,6 @@
 
 public interface MessageOutput<SERIALIZER_TYPE> {
 
-    WriteBufferByteBased serialize(SERIALIZER_TYPE value, Object... args) throws SerializationException;
+    WriteBufferByteBased serialize(SERIALIZER_TYPE value) throws SerializationException;
 
 }
diff --git a/plc4j/transports/can/src/main/java/org/apache/plc4x/java/transport/can/FrameData.java b/plc4j/transports/can/src/main/java/org/apache/plc4x/java/transport/can/FrameData.java
index 05ec7c9..55795a0 100644
--- a/plc4j/transports/can/src/main/java/org/apache/plc4x/java/transport/can/FrameData.java
+++ b/plc4j/transports/can/src/main/java/org/apache/plc4x/java/transport/can/FrameData.java
@@ -25,7 +25,7 @@
 
     int getNodeId();
 
-    <T extends Message> T read(MessageInput<T> input, Object ... args);
+    <T extends Message> T read(MessageInput<T> input);
 
     int getDataLength();
     byte[] getData();
diff --git a/plc4j/transports/socketcan/src/main/java/org/apache/plc4x/java/transport/socketcan/SocketCANTransport.java b/plc4j/transports/socketcan/src/main/java/org/apache/plc4x/java/transport/socketcan/SocketCANTransport.java
index 57129e6..382bcfa 100644
--- a/plc4j/transports/socketcan/src/main/java/org/apache/plc4x/java/transport/socketcan/SocketCANTransport.java
+++ b/plc4j/transports/socketcan/src/main/java/org/apache/plc4x/java/transport/socketcan/SocketCANTransport.java
@@ -102,9 +102,9 @@
             }
 
             @Override
-            public <T extends Message> T read(MessageInput<T> input, Object... args) {
+            public <T extends Message> T read(MessageInput<T> input) {
                 try {
-                    return input.parse(new ReadBufferByteBased(frame.getData(), ByteOrder.LITTLE_ENDIAN), args);
+                    return input.parse(new ReadBufferByteBased(frame.getData(), ByteOrder.LITTLE_ENDIAN));
                 } catch (ParseException e) {
                     throw new PlcRuntimeException(e);
                 }
diff --git a/plc4j/transports/virtualcan/src/main/java/org/apache/plc4x/java/transport/virtualcan/VirtualCANFrame.java b/plc4j/transports/virtualcan/src/main/java/org/apache/plc4x/java/transport/virtualcan/VirtualCANFrame.java
index 1a5f137..f1992fb 100644
--- a/plc4j/transports/virtualcan/src/main/java/org/apache/plc4x/java/transport/virtualcan/VirtualCANFrame.java
+++ b/plc4j/transports/virtualcan/src/main/java/org/apache/plc4x/java/transport/virtualcan/VirtualCANFrame.java
@@ -37,7 +37,7 @@
     public final static MessageInput<VirtualCANFrame> PARSER = new MessageInput<VirtualCANFrame>() {
 
         @Override
-        public VirtualCANFrame parse(ReadBuffer io, Object... args) throws ParseException {
+        public VirtualCANFrame parse(ReadBuffer io) throws ParseException {
             WithOption withOption = WithOption.WithByteOrder(ByteOrder.LITTLE_ENDIAN);
 
             short length = io.readUnsignedShort("length", 8, withOption);
diff --git a/plc4j/transports/virtualcan/src/main/java/org/apache/plc4x/java/transport/virtualcan/VirtualCANTransport.java b/plc4j/transports/virtualcan/src/main/java/org/apache/plc4x/java/transport/virtualcan/VirtualCANTransport.java
index 343c48e..18322c9 100644
--- a/plc4j/transports/virtualcan/src/main/java/org/apache/plc4x/java/transport/virtualcan/VirtualCANTransport.java
+++ b/plc4j/transports/virtualcan/src/main/java/org/apache/plc4x/java/transport/virtualcan/VirtualCANTransport.java
@@ -95,9 +95,9 @@
             }
 
             @Override
-            public <T extends Message> T read(MessageInput<T> input, Object... args) {
+            public <T extends Message> T read(MessageInput<T> input) {
                 try {
-                    return input.parse(new ReadBufferByteBased(getData(), ByteOrder.LITTLE_ENDIAN), args);
+                    return input.parse(new ReadBufferByteBased(getData(), ByteOrder.LITTLE_ENDIAN));
                 } catch (ParseException e) {
                     throw new PlcRuntimeException(e);
                 }
diff --git a/plc4j/utils/plc-simulator/src/main/java/org/apache/plc4x/simulator/server/bacnet/BacnetServerModule.java b/plc4j/utils/plc-simulator/src/main/java/org/apache/plc4x/simulator/server/bacnet/BacnetServerModule.java
index 6a9b08a..6459a0c 100644
--- a/plc4j/utils/plc-simulator/src/main/java/org/apache/plc4x/simulator/server/bacnet/BacnetServerModule.java
+++ b/plc4j/utils/plc-simulator/src/main/java/org/apache/plc4x/simulator/server/bacnet/BacnetServerModule.java
@@ -103,7 +103,6 @@
                             })
                             .addLast(new GeneratedProtocolMessageCodec<>(BVLC.class,
                                 BVLC::staticParse, ByteOrder.BIG_ENDIAN,
-                                null,
                                 new BacNetIpDriver.ByteLengthEstimator(),
                                 new BacNetIpDriver.CorruptPackageCleaner()))
                             .addLast(new BacnetServerAdapter(context));
diff --git a/plc4j/utils/plc-simulator/src/main/java/org/apache/plc4x/simulator/server/cbus/CBusServerModule.java b/plc4j/utils/plc-simulator/src/main/java/org/apache/plc4x/simulator/server/cbus/CBusServerModule.java
index 0c2f177..1e6f8f0 100644
--- a/plc4j/utils/plc-simulator/src/main/java/org/apache/plc4x/simulator/server/cbus/CBusServerModule.java
+++ b/plc4j/utils/plc-simulator/src/main/java/org/apache/plc4x/simulator/server/cbus/CBusServerModule.java
@@ -33,6 +33,9 @@
 import org.apache.plc4x.java.cbus.readwrite.RequestContext;
 import org.apache.plc4x.java.spi.connection.GeneratedProtocolMessageCodec;
 import org.apache.plc4x.java.spi.generation.ByteOrder;
+import org.apache.plc4x.java.spi.generation.MessageInput;
+import org.apache.plc4x.java.spi.generation.ParseException;
+import org.apache.plc4x.java.spi.generation.ReadBuffer;
 import org.apache.plc4x.simulator.PlcSimulatorConfig;
 import org.apache.plc4x.simulator.exceptions.SimulatorException;
 import org.apache.plc4x.simulator.model.Context;
@@ -41,6 +44,10 @@
 
 public class CBusServerModule implements ServerModule {
 
+    public static final MessageInput<CBusMessage> MESSAGE_INPUT = io ->
+        CBusMessage.staticParse(io, false, new RequestContext(false),
+            new CBusOptions(false, false, false, false, false, false, false, false, false));
+
     private EventLoopGroup loopGroup;
     private EventLoopGroup workerGroup;
     private Context context;
@@ -79,8 +86,7 @@
                     public void initChannel(SocketChannel channel) {
                         ChannelPipeline pipeline = channel.pipeline();
                         pipeline.addLast(new GeneratedProtocolMessageCodec<>(CBusMessage.class,
-                            CBusMessage::staticParse, ByteOrder.BIG_ENDIAN,
-                            new Object[]{false, new RequestContext(false), new CBusOptions(false, false, false, false, false, false, false, false, false)},
+                            MESSAGE_INPUT, ByteOrder.BIG_ENDIAN,
                             new CBusDriver.ByteLengthEstimator(),
                             new CBusDriver.CorruptPackageCleaner()));
                         pipeline.addLast(new CBusServerAdapter(context));
diff --git a/plc4j/utils/plc-simulator/src/main/java/org/apache/plc4x/simulator/server/s7/S7ServerModule.java b/plc4j/utils/plc-simulator/src/main/java/org/apache/plc4x/simulator/server/s7/S7ServerModule.java
index e14b5ff..ea659ed 100644
--- a/plc4j/utils/plc-simulator/src/main/java/org/apache/plc4x/simulator/server/s7/S7ServerModule.java
+++ b/plc4j/utils/plc-simulator/src/main/java/org/apache/plc4x/simulator/server/s7/S7ServerModule.java
@@ -79,7 +79,7 @@
                     public void initChannel(SocketChannel channel) {
                         ChannelPipeline pipeline = channel.pipeline();
                         pipeline.addLast(new GeneratedProtocolMessageCodec<>(TPKTPacket.class,
-                            TPKTPacket::staticParse, ByteOrder.BIG_ENDIAN, null,
+                            TPKTPacket::staticParse, ByteOrder.BIG_ENDIAN,
                             new S7Driver.ByteLengthEstimator(),
                             new S7Driver.CorruptPackageCleaner()));
                         pipeline.addLast(new S7Step7ServerAdapter(context));
diff --git a/plc4j/utils/test-utils/src/main/java/org/apache/plc4x/test/driver/internal/handlers/IncomingPlcMessageHandler.java b/plc4j/utils/test-utils/src/main/java/org/apache/plc4x/test/driver/internal/handlers/IncomingPlcMessageHandler.java
index d52042c..84be246 100644
--- a/plc4j/utils/test-utils/src/main/java/org/apache/plc4x/test/driver/internal/handlers/IncomingPlcMessageHandler.java
+++ b/plc4j/utils/test-utils/src/main/java/org/apache/plc4x/test/driver/internal/handlers/IncomingPlcMessageHandler.java
@@ -54,9 +54,9 @@
     public byte[] getBytesFromXml(Element referenceXml, ByteOrder byteOrder) throws DriverTestsuiteException {
         // TODO: Find some smart way to find out how big the buffer should be.
         final WriteBufferByteBased writeBuffer = new WriteBufferByteBased(1024 * 100, byteOrder);
-        MessageInput messageInput = MessageResolver.getMessageInput(driverTestsuiteConfiguration.getOptions(), referenceXml.getName());
+        MessageInput messageInput = MessageResolver.getMessageInput(driverTestsuiteConfiguration.getOptions(), referenceXml.getName(), parserArguments);
         // Get Message and Validate
-        Message message = MessageValidatorAndMigrator.validateInboundMessageAndGet(messageInput, referenceXml, parserArguments);
+        Message message = MessageValidatorAndMigrator.validateInboundMessageAndGet(messageInput, referenceXml);
 
         // Get Bytes
         try {
diff --git a/plc4j/utils/test-utils/src/main/java/org/apache/plc4x/test/migration/MessageResolver.java b/plc4j/utils/test-utils/src/main/java/org/apache/plc4x/test/migration/MessageResolver.java
index 90f5ea8..4b2bdfc 100644
--- a/plc4j/utils/test-utils/src/main/java/org/apache/plc4x/test/migration/MessageResolver.java
+++ b/plc4j/utils/test-utils/src/main/java/org/apache/plc4x/test/migration/MessageResolver.java
@@ -42,71 +42,44 @@
      *
      * @param options Test framework options
      * @param name    name of the message
+     * @param parserArguments the parser arguments to create an instance of the message
      * @return the found MessageIO
      * @throws DriverTestsuiteException if a MessageIO couldn't be found.
      */
     @SuppressWarnings("rawtypes")
-    public static MessageInput<?> getMessageInput(Map<String, String> options, String name) throws DriverTestsuiteException {
+    public static MessageInput<?> getMessageInput(Map<String, String> options, String name, List<String> parserArguments) throws DriverTestsuiteException {
         try {
-            return MessageResolver.getMessageIOType(options, name).getMessageInput();
+            return MessageResolver.getMessageIOType(options, name, parserArguments);
         } catch (ClassNotFoundException e) {
             throw new DriverTestsuiteException(e);
         }
     }
 
-    public static MessageInput<?> getMessageIOStaticLinked(Map<String, String> options, String typeName) throws ParserSerializerTestsuiteException {
+    public static MessageInput<?> getMessageIOStaticLinked(Map<String, String> options, String typeName, List<String> parserArguments) throws ParserSerializerTestsuiteException {
         try {
-            TypeMessageInput typeMessageInput = getMessageIOType(options, typeName);
-            final List<Class<?>> parameterTypes = new LinkedList<>();
-            for (Method method : typeMessageInput.type.getMethods()) {
-                int parameterCount = method.getParameterCount();
-                boolean isNonGenericParse = parameterCount > 1 && method.getParameterTypes()[parameterCount - 1] != Object[].class;
-                if (method.getName().equals("staticParse") && Modifier.isStatic(method.getModifiers()) && isNonGenericParse) {
-                    // Get a list of additional parameter types for the parser.
-                    parameterTypes.addAll(Arrays.asList(method.getParameterTypes()).subList(1, parameterCount));
-                    break;
-                }
-            }
-            return (io, args) -> {
-                Object[] argValues = new Object[args.length];
-                for (int i = 0; i < args.length; i++) {
-                    String parameterValue = (String) args[i];
-                    Class<?> parameterType = parameterTypes.get(i);
-                    if (parameterType == Boolean.class) {
-                        argValues[i] = Boolean.parseBoolean(parameterValue);
-                    } else if (parameterType == Byte.class) {
-                        argValues[i] = Byte.parseByte(parameterValue);
-                    } else if (parameterType == Short.class) {
-                        argValues[i] = Short.parseShort(parameterValue);
-                    } else if (parameterType == Integer.class) {
-                        argValues[i] = Integer.parseInt(parameterValue);
-                    } else if (parameterType == Long.class) {
-                        argValues[i] = Long.parseLong(parameterValue);
-                    } else if (parameterType == Float.class) {
-                        argValues[i] = Float.parseFloat(parameterValue);
-                    } else if (parameterType == Double.class) {
-                        argValues[i] = Double.parseDouble(parameterValue);
-                    } else if (parameterType == String.class) {
-                        argValues[i] = parameterValue;
-                    } else if (Enum.class.isAssignableFrom(parameterType)) {
-                        argValues[i] = Enum.valueOf((Class<? extends Enum>) parameterType, parameterValue);
-                    } else {
-                        throw new ParseException("Currently unsupported parameter type");
-                    }
-                }
-                return typeMessageInput.getMessageInput().parse(io, argValues);
-            };
+            MessageInput<?> typeMessageInput = getMessageIOType(options, typeName, parserArguments);
+//            final List<Class<?>> parameterTypes = new LinkedList<>();
+//            for (Method method : typeMessageInput.type.getMethods()) {
+//                int parameterCount = method.getParameterCount();
+//                boolean isNonGenericParse = parameterCount > 1 && method.getParameterTypes()[parameterCount - 1] != Object[].class;
+//                if (method.getName().equals("staticParse") && Modifier.isStatic(method.getModifiers()) && isNonGenericParse) {
+//                    // Get a list of additional parameter types for the parser.
+//                    parameterTypes.addAll(Arrays.asList(method.getParameterTypes()).subList(1, parameterCount));
+//                    break;
+//                }
+//            }
+            return typeMessageInput;
         } catch (DriverTestsuiteException | ClassNotFoundException e) {
             throw new ParserSerializerTestsuiteException("Unable to instantiate IO component", e);
         }
     }
 
     @SuppressWarnings("unchecked")
-    private static TypeMessageInput getMessageIOType(Map<String, String> options, String typeName) throws DriverTestsuiteException, ClassNotFoundException {
+    private static MessageInput<?> getMessageIOType(Map<String, String> options, String typeName, List<String> parserArguments) throws DriverTestsuiteException, ClassNotFoundException {
         String extraMessage = "";
         if (options.containsKey("package")) {
             try {
-                return lookup(options.get("package"), typeName);
+                return lookup(options.get("package"), typeName, parserArguments);
             } catch (NoSuchMethodException e) {
                 extraMessage = "custom package '" + options.get("package") + "' and ";
             }
@@ -116,13 +89,13 @@
         String outputFlavor = options.get("outputFlavor");
         String classPackage = String.format("org.apache.plc4x.java.%s.%s", protocolName, StringUtils.replace(outputFlavor, "-", ""));
         try {
-            return lookup(classPackage, typeName);
+            return lookup(classPackage, typeName, parserArguments);
         } catch (NoSuchMethodException e) {
             throw new DriverTestsuiteException("Could not find " + typeName + " in " + extraMessage + "standard package '" + classPackage + "'");
         }
     }
 
-    private static TypeMessageInput lookup(String driverPackage, String typeName) throws ClassNotFoundException, NoSuchMethodException {
+    private static MessageInput<?> lookup(String driverPackage, String typeName, List<String> parserArguments) throws ClassNotFoundException, NoSuchMethodException {
         try {
             Package.getPackage(driverPackage);
         } catch (RuntimeException e) {
@@ -131,35 +104,82 @@
         String ioRootClassName = driverPackage.replace("-", "") + "." + typeName;
         // make sure both type and it's IO are present
         Class<? extends Message> messageType = (Class<? extends Message>) Class.forName(ioRootClassName);
-        Method staticParse = messageType.getMethod("staticParse", ReadBuffer.class, Object[].class);
-        return new TypeMessageInput(
-            messageType,
-            (io, args) -> {
-                try {
-                    return staticParse.invoke(null, io, args);
-                } catch (IllegalAccessException | InvocationTargetException e) {
-                    throw new RuntimeException(e);
+        Method parseMethod = null;
+        for (Method method : messageType.getMethods()) {
+            if (Modifier.isStatic(method.getModifiers()) && "staticParse".equals(method.getName()) && Message.class.isAssignableFrom(method.getReturnType())) {
+                // because we still have var-arg and non var-arg methods we have to be careful
+                // below is additional verification of staticParse method which refuses var-arg variant
+                if (method.getParameterCount() == 1) {
+                    parseMethod = method;
+                    break;
+                } else if (method.getParameterCount() >= 2  && method.getParameterTypes()[1] != Object[].class) {
+                    // TODO above if statement can be removed later on - when we get rid of var-args
+                     parseMethod = method;
+                    break;
                 }
             }
-        );
+        }
+        if (parseMethod == null) {
+            throw new DriverTestsuiteException("Could not find static parse method for " + typeName);
+        }
+        return new DeferredMessageInput(parseMethod, parserArguments);
     }
 
-    static class TypeMessageInput {
-        private final Class<? extends Message> type;
-        private final MessageInput<?> messageInput;
+    public static class DeferredMessageInput implements MessageInput<Message> {
 
-        TypeMessageInput(Class<? extends Message> type, MessageInput<?> messageInput) {
-            this.type = type;
-            this.messageInput = messageInput;
+        private final Method method;
+        private final List<String> args;
+
+        public DeferredMessageInput(Method method, List<String> args) {
+            this.method = method;
+            this.args = args;
         }
+        @Override
+        public Message parse(ReadBuffer io) throws ParseException {
+            Object[] argValues = new Object[args.size() + 1];
+            int index = 0;
+            argValues[index++] = io;
+            Class<?>[] parameterTypes = method.getParameterTypes();
 
-        Class<?> getType() {
-            return type;
-        }
+            if (parameterTypes.length - 1 != args.size()) {
+                String type = method.getDeclaringClass().getName();
+                int totalArgs = parameterTypes.length - 1;
+                int given = args.size();
+                throw new ParseException("Invalid parameters detected. Type " + type + " expected " + totalArgs + ", not " + given);
+            }
 
-        MessageInput<?> getMessageInput() {
-            return messageInput;
+            for (int i = 0; i < args.size(); i++) {
+                String parameterValue = args.get(i);
+                Class<?> parameterType = parameterTypes[index];
+                if (parameterType == Boolean.class) {
+                    argValues[index++] = Boolean.parseBoolean(parameterValue);
+                } else if (parameterType == Byte.class) {
+                    argValues[index++] = Byte.parseByte(parameterValue);
+                } else if (parameterType == Short.class) {
+                    argValues[index++] = Short.parseShort(parameterValue);
+                } else if (parameterType == Integer.class) {
+                    argValues[index++] = Integer.parseInt(parameterValue);
+                } else if (parameterType == Long.class) {
+                    argValues[index++] = Long.parseLong(parameterValue);
+                } else if (parameterType == Float.class) {
+                    argValues[index++] = Float.parseFloat(parameterValue);
+                } else if (parameterType == Double.class) {
+                    argValues[index++] = Double.parseDouble(parameterValue);
+                } else if (parameterType == String.class) {
+                    argValues[index++] = parameterValue;
+                } else if (Enum.class.isAssignableFrom(parameterType)) {
+                    argValues[index++] = Enum.valueOf((Class<? extends Enum>) parameterType, parameterValue);
+                } else {
+                    throw new ParseException("Currently unsupported parameter type");
+                }
+            }
+
+            try {
+                return (Message) method.invoke(null, argValues);
+            } catch (IllegalAccessException | InvocationTargetException e) {
+                throw new ParseException("Could not parse payload", e);
+            }
+
         }
     }
-
 }
diff --git a/plc4j/utils/test-utils/src/main/java/org/apache/plc4x/test/migration/MessageValidatorAndMigrator.java b/plc4j/utils/test-utils/src/main/java/org/apache/plc4x/test/migration/MessageValidatorAndMigrator.java
index df28e89..fd73fde 100644
--- a/plc4j/utils/test-utils/src/main/java/org/apache/plc4x/test/migration/MessageValidatorAndMigrator.java
+++ b/plc4j/utils/test-utils/src/main/java/org/apache/plc4x/test/migration/MessageValidatorAndMigrator.java
@@ -18,6 +18,7 @@
  */
 package org.apache.plc4x.test.migration;
 
+import java.util.Collections;
 import java.util.Map;
 
 import org.apache.commons.lang3.RegExUtils;
@@ -65,30 +66,30 @@
      */
     @SuppressWarnings({"rawtypes"})
     public static void validateOutboundMessageAndMigrate(String testCaseName, Map<String, String> options, Element referenceXml, List<String> parserArguments, byte[] data, ByteOrder byteOrder, boolean autoMigrate, URI siteURI) throws DriverTestsuiteException {
-        MessageInput<?> messageInput = MessageResolver.getMessageInput(options, referenceXml.getName());
-        validateOutboundMessageAndMigrate(testCaseName, messageInput, referenceXml, parserArguments, data, byteOrder, autoMigrate, siteURI);
+        MessageInput<?> messageInput = MessageResolver.getMessageInput(options, referenceXml.getName(), parserArguments);
+        validateOutboundMessageAndMigrate(testCaseName, messageInput, referenceXml, data, byteOrder, autoMigrate, siteURI);
     }
 
     /**
-     * Validates a outbound message and migrates it to the expectation if the parameter {@code autoMigrate} is set to true
+     * Validates a outbound message and migrates it to the expectation if the parameter
+     * {@code autoMigrate} is set to true
      *
-     * @param testCaseName    name of the testcase
-     * @param messageInput    the pre-constructed MessageInput
-     * @param referenceXml    the xml we expect the outbound message to be
-     * @param parserArguments the parser arguments to create an instance of the message
-     * @param data            the bytes of the message
-     * @param byteOrder       the byte-order being used
-     * @param autoMigrate     indicates if we want to migrate to a new version
-     * @param siteURI         the file which we want to auto migrate
+     * @param testCaseName name of the testcase
+     * @param messageInput the pre-constructed MessageInput
+     * @param referenceXml the xml we expect the outbound message to be
+     * @param data the bytes of the message
+     * @param byteOrder the byte-order being used
+     * @param autoMigrate indicates if we want to migrate to a new version
+     * @param siteURI the file which we want to auto migrate
      * @return true if migration happened
      * @throws DriverTestsuiteException if something goes wrong
      */
     @SuppressWarnings({"rawtypes", "unchecked"})
-    public static boolean validateOutboundMessageAndMigrate(String testCaseName, MessageInput<?> messageInput, Element referenceXml, List<String> parserArguments, byte[] data, ByteOrder byteOrder, boolean autoMigrate, URI siteURI) throws DriverTestsuiteException {
+    public static boolean validateOutboundMessageAndMigrate(String testCaseName, MessageInput<?> messageInput, Element referenceXml, byte[] data, ByteOrder byteOrder, boolean autoMigrate, URI siteURI) throws DriverTestsuiteException {
         final ReadBufferByteBased readBuffer = new ReadBufferByteBased(data, byteOrder);
 
         try {
-            final Message parsedOutput = (Message) messageInput.parse(readBuffer, parserArguments.toArray());
+            final Message parsedOutput = (Message) messageInput.parse(readBuffer);
             final String referenceXmlString = referenceXml.asXML();
             try {
                 // First try to use the native xml writer
@@ -189,13 +190,12 @@
      *                        and 'outputFlavor' (flavor of the output e.g read-write) which are used to construct
      *                        class lookup root package.
      * @param referenceXml    the xml we expect the outbound message
-     * @param parserArguments the parser arguments to create an instance of the message
      * @return the message if all went well
      */
     @SuppressWarnings("rawtypes")
-    public static Message validateInboundMessageAndGet(Map<String, String> options, Element referenceXml, List<String> parserArguments) {
-        MessageInput<?> messageIO = MessageResolver.getMessageInput(options, referenceXml.getName());
-        return validateInboundMessageAndGet(messageIO, referenceXml, parserArguments);
+    public static Message validateInboundMessageAndGet(Map<String, String> options, Element referenceXml) {
+        MessageInput<?> messageIO = MessageResolver.getMessageInput(options, referenceXml.getName(), Collections.emptyList());
+        return validateInboundMessageAndGet(messageIO, referenceXml);
     }
 
     /**
@@ -203,14 +203,13 @@
      *
      * @param messageInput    the pre-constructed MessageInput
      * @param referenceXml    the xml we expect the outbound messag
-     * @param parserArguments the parser arguments to create an instance of the message
      * @return the message if all went well
      */
     @SuppressWarnings({"rawtypes", "unchecked"})
-    public static Message validateInboundMessageAndGet(MessageInput messageInput, Element referenceXml, List<String> parserArguments) {
+    public static Message validateInboundMessageAndGet(MessageInput messageInput, Element referenceXml) {
         final String referenceXmlString = referenceXml.asXML();
         try {
-            return (Message) messageInput.parse(new ReadBufferXmlBased(new ByteArrayInputStream(referenceXmlString.getBytes(StandardCharsets.UTF_8))), parserArguments.toArray(new String[0]));
+            return (Message) messageInput.parse(new ReadBufferXmlBased(new ByteArrayInputStream(referenceXmlString.getBytes(StandardCharsets.UTF_8))));
         } catch (RuntimeException | ParseException e) {
             throw new DriverTestsuiteException(String.format("Error parsing message from:\n%s", referenceXmlString), e);
         }
diff --git a/plc4j/utils/test-utils/src/main/java/org/apache/plc4x/test/parserserializer/ParserSerializerTestsuiteRunner.java b/plc4j/utils/test-utils/src/main/java/org/apache/plc4x/test/parserserializer/ParserSerializerTestsuiteRunner.java
index 38ff095..d14e547 100644
--- a/plc4j/utils/test-utils/src/main/java/org/apache/plc4x/test/parserserializer/ParserSerializerTestsuiteRunner.java
+++ b/plc4j/utils/test-utils/src/main/java/org/apache/plc4x/test/parserserializer/ParserSerializerTestsuiteRunner.java
@@ -148,7 +148,8 @@
         try {
             MessageInput<?> messageInput = MessageResolver.getMessageIOStaticLinked(
                 testSuite.getOptions(),
-                testcase.getRootType()
+                testcase.getRootType(),
+                testcase.getParserArguments()
             );
 
             ////////////////////////////////////////////////////////////////////////////////////////////////////////////
@@ -156,7 +157,7 @@
             ////////////////////////////////////////////////////////////////////////////////////////////////////////////
 
             LOGGER.trace("Parsing message");
-            Message parsedOutput = (Message) messageInput.parse(readBuffer, testcase.getParserArguments().toArray());
+            Message parsedOutput = (Message) messageInput.parse(readBuffer);
             LOGGER.trace("Validating and migrating");
 
             ////////////////////////////////////////////////////////////////////////////////////////////////////////////
@@ -179,7 +180,6 @@
                 testcase.getName(),
                 messageInput,
                 testcase.getXml().elements().get(0),
-                testcase.getParserArguments(),
                 testcaseRaw,
                 testSuite.getByteOrder(),
                 autoMigrate,