You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@plc4x.apache.org by cd...@apache.org on 2023/10/29 12:14:52 UTC

(plc4x) 01/01: feat(plc4j): Rewrote the configuration for all java drivers to generally support overwriting (WIP)

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

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

commit af88a3786ef6d877fd5c00c5db8e211bded7064a
Author: Christofer Dutz <cd...@apache.org>
AuthorDate: Sun Oct 29 13:14:42 2023 +0100

    feat(plc4j): Rewrote the configuration for all java drivers to generally support overwriting (WIP)
---
 .../abeth/configuration/AbEthConfiguration.java    |  26 ++++--
 .../AbEthTcpTransportConfiguration.java}           |  18 ++--
 .../java/ads/configuration/AdsConfiguration.java   |  47 +++++++---
 .../AdsTcpTransportConfiguration.java}             |  18 ++--
 .../configuration/BacNetIpConfiguration.java       | 100 ++++++++-------------
 .../BacNetPcapReplayTransportConfiguration.java    |  58 ++++++++++++
 .../BacNetRawSocketTransportConfiguration.java     |  58 ++++++++++++
 .../BacNetUdpTransportConfiguration.java}          |  19 ++--
 .../java/cbus/configuration/CBusConfiguration.java |  25 +++++-
 .../CBusTcpTransportConfiguration.java}            |  18 ++--
 .../configuration/GenericCANConfiguration.java     |  27 +++++-
 .../configuration/CANOpenConfiguration.java        |  27 +++++-
 .../eip/base/configuration/EIPConfiguration.java   |  26 +++++-
 .../EipTcpTransportConfiguration.java}             |  18 ++--
 .../logix/configuration/LogixConfiguration.java    |   4 -
 .../configuration/FirmataConfiguration.java        |  30 +++++--
 .../configuration/Iec608705014Configuration.java   |  30 +++++--
 .../Iec608705014TcpTransportConfiguration.java}    |  18 ++--
 .../configuration/KnxNetIpConfiguration.java       |  66 +++++++-------
 .../KnxNetIpPcapReplayTransportConfiguration.java} |  27 +++---
 .../KnxNetIpRawSocketTransportConfiguration.java}  |  27 +++---
 .../KnxNetIpUdpTransportConfiguration.java}        |  18 ++--
 plc4j/drivers/modbus/pom.xml                       |   1 -
 .../ascii/config/ModbusAsciiConfiguration.java     |  41 +++++++--
 .../modbus/rtu/config/ModbusRtuConfiguration.java  |  41 +++++++--
 .../modbus/tcp/config/ModbusTcpConfiguration.java  |  26 ++++--
 .../config/ModbusTcpTransportConfiguration.java}   |  18 ++--
 .../java/opcua/config/OpcuaConfiguration.java      |  26 +++++-
 .../config/OpenProtocolConfiguration.java          |  26 ++++--
 ... => OpenProtocolTcpTransportConfiguration.java} |  14 +--
 .../java/plc4x/config/Plc4xConfiguration.java      |  26 ++++--
 .../config/Plc4xTcpTransportConfiguration.java}    |  18 ++--
 .../profinet/config/ProfinetConfiguration.java     |  45 +++++-----
 .../ProfinetRawSocketTransportConfiguration.java}  |  19 ++--
 .../profinet/config/ProfinetConfiguration.java     |  52 +++++------
 .../ProfinetRawSocketTransportConfiguration.java}  |  19 ++--
 .../readwrite/configuration/S7Configuration.java   |  29 +++---
 .../S7TcpTransportConfiguration.java}              |  18 ++--
 .../ComplexConfigurationParameter.java}            |  21 ++---
 ...plexConfigurationParameterDefaultOverride.java} |  15 +---
 ...lexConfigurationParameterRequiredOverride.java} |  15 +---
 .../transport/TransportConfigurationProvider.java} |  16 +---
 .../can/DefaultCANTransportConfiguration.java}     |  16 +---
 ...> DefaultPcapReplayTransportConfiguration.java} |  21 +++--
 .../PcapReplayTransportConfiguration.java          |  11 +--
 .../pcap/DefaultPcapTransportConfiguration.java}   |  38 ++++----
 .../transport/pcap/PcapTransportConfiguration.java |  12 +--
 .../DefaultRawSocketTransportConfiguration.java}   |  33 +++----
 .../rawsocket/RawSocketTransportConfiguration.java |  10 +--
 .../DefaultSerialTransportConfiguration.java       |  79 ++++++++++++++++
 .../serial/SerialTransportConfiguration.java       |  13 +--
 .../tcp/DefaultTcpTransportConfiguration.java      |  67 ++++++++++++++
 .../transport/tcp/TcpTransportConfiguration.java   |  12 +--
 .../udp/DefaultUdpTransportConfiguration.java      |  26 +++---
 .../java/df1/configuration/Df1Configuration.java   |  42 ++++++++-
 55 files changed, 1015 insertions(+), 556 deletions(-)

diff --git a/plc4j/drivers/ab-eth/src/main/java/org/apache/plc4x/java/abeth/configuration/AbEthConfiguration.java b/plc4j/drivers/ab-eth/src/main/java/org/apache/plc4x/java/abeth/configuration/AbEthConfiguration.java
index f7ae054b5a..d929c1bfe7 100644
--- a/plc4j/drivers/ab-eth/src/main/java/org/apache/plc4x/java/abeth/configuration/AbEthConfiguration.java
+++ b/plc4j/drivers/ab-eth/src/main/java/org/apache/plc4x/java/abeth/configuration/AbEthConfiguration.java
@@ -18,16 +18,20 @@
  */
 package org.apache.plc4x.java.abeth.configuration;
 
-import org.apache.plc4x.java.abeth.AbEthDriver;
 import org.apache.plc4x.java.spi.configuration.Configuration;
+import org.apache.plc4x.java.spi.configuration.annotations.ComplexConfigurationParameter;
 import org.apache.plc4x.java.spi.configuration.annotations.ConfigurationParameter;
-import org.apache.plc4x.java.transport.tcp.TcpTransportConfiguration;
+import org.apache.plc4x.java.spi.transport.TransportConfiguration;
+import org.apache.plc4x.java.spi.transport.TransportConfigurationProvider;
 
-public class AbEthConfiguration implements Configuration, TcpTransportConfiguration {
+public class AbEthConfiguration implements Configuration, TransportConfigurationProvider {
 
     @ConfigurationParameter
     private int station;
 
+    @ComplexConfigurationParameter(prefix = "tcp", defaultOverrides = {}, requiredOverrides = {})
+    private AbEthTcpTransportConfiguration tcpTransportConfiguration;
+
     public int getStation() {
         return station;
     }
@@ -36,9 +40,21 @@ public class AbEthConfiguration implements Configuration, TcpTransportConfigurat
         this.station = station;
     }
 
+    public AbEthTcpTransportConfiguration getTcpTransportConfiguration() {
+        return tcpTransportConfiguration;
+    }
+
+    public void setTcpTransportConfiguration(AbEthTcpTransportConfiguration tcpTransportConfiguration) {
+        this.tcpTransportConfiguration = tcpTransportConfiguration;
+    }
+
     @Override
-    public int getDefaultPort() {
-        return AbEthDriver.AB_ETH_PORT;
+    public TransportConfiguration getTransportConfiguration(String transportCode) {
+        switch (transportCode) {
+            case "tcp":
+                return tcpTransportConfiguration;
+        }
+        return null;
     }
 
 }
diff --git a/plc4j/transports/pcap-replay/src/main/java/org/apache/plc4x/java/transport/pcapreplay/PcapReplayTransportConfiguration.java b/plc4j/drivers/ab-eth/src/main/java/org/apache/plc4x/java/abeth/configuration/AbEthTcpTransportConfiguration.java
similarity index 66%
copy from plc4j/transports/pcap-replay/src/main/java/org/apache/plc4x/java/transport/pcapreplay/PcapReplayTransportConfiguration.java
copy to plc4j/drivers/ab-eth/src/main/java/org/apache/plc4x/java/abeth/configuration/AbEthTcpTransportConfiguration.java
index fe08010f72..39e79e7734 100644
--- a/plc4j/transports/pcap-replay/src/main/java/org/apache/plc4x/java/transport/pcapreplay/PcapReplayTransportConfiguration.java
+++ b/plc4j/drivers/ab-eth/src/main/java/org/apache/plc4x/java/abeth/configuration/AbEthTcpTransportConfiguration.java
@@ -7,7 +7,7 @@
  * "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
+ *   http://www.apache.org/licenses/LICENSE-2.0
  *
  * Unless required by applicable law or agreed to in writing,
  * software distributed under the License is distributed on an
@@ -16,19 +16,17 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.plc4x.java.transport.pcapreplay;
 
-import org.apache.plc4x.java.transport.pcap.PcapTransportConfiguration;
+package org.apache.plc4x.java.abeth.configuration;
 
-public interface PcapReplayTransportConfiguration extends PcapTransportConfiguration {
+import org.apache.plc4x.java.abeth.AbEthDriver;
+import org.apache.plc4x.java.transport.tcp.DefaultTcpTransportConfiguration;
 
-    default float getReplaySpeedFactor() {
-        return 1;
-    }
+public class AbEthTcpTransportConfiguration extends DefaultTcpTransportConfiguration {
 
-    default boolean isLoop() {
-        return false;
+    @Override
+    public int getDefaultPort() {
+        return AbEthDriver.AB_ETH_PORT;
     }
 
-    default String getFilter() { return "";}
 }
diff --git a/plc4j/drivers/ads/src/main/java/org/apache/plc4x/java/ads/configuration/AdsConfiguration.java b/plc4j/drivers/ads/src/main/java/org/apache/plc4x/java/ads/configuration/AdsConfiguration.java
index 2d74033c81..205984ad7e 100644
--- a/plc4j/drivers/ads/src/main/java/org/apache/plc4x/java/ads/configuration/AdsConfiguration.java
+++ b/plc4j/drivers/ads/src/main/java/org/apache/plc4x/java/ads/configuration/AdsConfiguration.java
@@ -19,22 +19,20 @@
 package org.apache.plc4x.java.ads.configuration;
 
 import org.apache.commons.lang3.ArrayUtils;
-import org.apache.plc4x.java.ads.readwrite.AdsConstants;
 import org.apache.plc4x.java.ads.readwrite.AmsNetId;
 import org.apache.plc4x.java.spi.configuration.Configuration;
 import org.apache.plc4x.java.spi.configuration.ConfigurationParameterConverter;
-import org.apache.plc4x.java.spi.configuration.annotations.ConfigurationParameter;
-import org.apache.plc4x.java.spi.configuration.annotations.ParameterConverter;
-import org.apache.plc4x.java.spi.configuration.annotations.Required;
+import org.apache.plc4x.java.spi.configuration.annotations.*;
 import org.apache.plc4x.java.spi.configuration.annotations.defaults.BooleanDefaultValue;
 import org.apache.plc4x.java.spi.configuration.annotations.defaults.IntDefaultValue;
-import org.apache.plc4x.java.transport.serial.SerialTransportConfiguration;
-import org.apache.plc4x.java.transport.tcp.TcpTransportConfiguration;
+import org.apache.plc4x.java.spi.transport.TransportConfiguration;
+import org.apache.plc4x.java.spi.transport.TransportConfigurationProvider;
+import org.apache.plc4x.java.transport.serial.DefaultSerialTransportConfiguration;
 
 import java.util.regex.Pattern;
 import java.util.stream.Stream;
 
-public class AdsConfiguration implements Configuration, TcpTransportConfiguration, SerialTransportConfiguration {
+public class AdsConfiguration implements Configuration, TransportConfigurationProvider {
 
     public static final Pattern AMS_NET_ID_PATTERN =
         Pattern.compile("\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}");
@@ -69,6 +67,12 @@ public class AdsConfiguration implements Configuration, TcpTransportConfiguratio
     @BooleanDefaultValue(true)
     protected boolean loadSymbolAndDataTypeTables;
 
+    @ComplexConfigurationParameter(prefix = "tcp", defaultOverrides = {}, requiredOverrides = {})
+    private AdsTcpTransportConfiguration tcpTransportConfiguration;
+
+    @ComplexConfigurationParameter(prefix = "serial", defaultOverrides = {}, requiredOverrides = {})
+    private DefaultSerialTransportConfiguration serialTransportConfiguration;
+
     public AmsNetId getTargetAmsNetId() {
         return targetAmsNetId;
     }
@@ -125,14 +129,20 @@ public class AdsConfiguration implements Configuration, TcpTransportConfiguratio
         this.loadSymbolAndDataTypeTables = loadSymbolAndDataTypeTables;
     }
 
-    @Override
-    public int getDefaultPort() {
-        return AdsConstants.ADSTCPDEFAULTPORT;
+    public AdsTcpTransportConfiguration getTcpTransportConfiguration() {
+        return tcpTransportConfiguration;
     }
 
-    @Override
-    public int getBaudRate() {
-        return 57600;
+    public void setTcpTransportConfiguration(AdsTcpTransportConfiguration tcpTransportConfiguration) {
+        this.tcpTransportConfiguration = tcpTransportConfiguration;
+    }
+
+    public DefaultSerialTransportConfiguration getSerialTransportConfiguration() {
+        return serialTransportConfiguration;
+    }
+
+    public void setSerialTransportConfiguration(DefaultSerialTransportConfiguration serialTransportConfiguration) {
+        this.serialTransportConfiguration = serialTransportConfiguration;
     }
 
     public static class AmsNetIdConverter implements ConfigurationParameterConverter<AmsNetId> {
@@ -157,4 +167,15 @@ public class AdsConfiguration implements Configuration, TcpTransportConfiguratio
         return new AmsNetId(shorts[0], shorts[1], shorts[2], shorts[3], shorts[4], shorts[5]);
     }
 
+    @Override
+    public TransportConfiguration getTransportConfiguration(String transportCode) {
+        switch (transportCode) {
+            case "tcp":
+                return tcpTransportConfiguration;
+            case "serial":
+                return serialTransportConfiguration;
+        }
+        return null;
+    }
+
 }
diff --git a/plc4j/transports/pcap-replay/src/main/java/org/apache/plc4x/java/transport/pcapreplay/PcapReplayTransportConfiguration.java b/plc4j/drivers/ads/src/main/java/org/apache/plc4x/java/ads/configuration/AdsTcpTransportConfiguration.java
similarity index 64%
copy from plc4j/transports/pcap-replay/src/main/java/org/apache/plc4x/java/transport/pcapreplay/PcapReplayTransportConfiguration.java
copy to plc4j/drivers/ads/src/main/java/org/apache/plc4x/java/ads/configuration/AdsTcpTransportConfiguration.java
index fe08010f72..c77c5e8b5d 100644
--- a/plc4j/transports/pcap-replay/src/main/java/org/apache/plc4x/java/transport/pcapreplay/PcapReplayTransportConfiguration.java
+++ b/plc4j/drivers/ads/src/main/java/org/apache/plc4x/java/ads/configuration/AdsTcpTransportConfiguration.java
@@ -7,7 +7,7 @@
  * "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
+ *   http://www.apache.org/licenses/LICENSE-2.0
  *
  * Unless required by applicable law or agreed to in writing,
  * software distributed under the License is distributed on an
@@ -16,19 +16,17 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.plc4x.java.transport.pcapreplay;
 
-import org.apache.plc4x.java.transport.pcap.PcapTransportConfiguration;
+package org.apache.plc4x.java.ads.configuration;
 
-public interface PcapReplayTransportConfiguration extends PcapTransportConfiguration {
+import org.apache.plc4x.java.ads.readwrite.AdsConstants;
+import org.apache.plc4x.java.transport.tcp.DefaultTcpTransportConfiguration;
 
-    default float getReplaySpeedFactor() {
-        return 1;
-    }
+public class AdsTcpTransportConfiguration extends DefaultTcpTransportConfiguration {
 
-    default boolean isLoop() {
-        return false;
+    @Override
+    public int getDefaultPort() {
+        return AdsConstants.ADSTCPDEFAULTPORT;
     }
 
-    default String getFilter() { return "";}
 }
diff --git a/plc4j/drivers/bacnet/src/main/java/org/apache/plc4x/java/bacnetip/configuration/BacNetIpConfiguration.java b/plc4j/drivers/bacnet/src/main/java/org/apache/plc4x/java/bacnetip/configuration/BacNetIpConfiguration.java
index 46cfab6793..1c46dc5446 100644
--- a/plc4j/drivers/bacnet/src/main/java/org/apache/plc4x/java/bacnetip/configuration/BacNetIpConfiguration.java
+++ b/plc4j/drivers/bacnet/src/main/java/org/apache/plc4x/java/bacnetip/configuration/BacNetIpConfiguration.java
@@ -18,18 +18,14 @@
  */
 package org.apache.plc4x.java.bacnetip.configuration;
 
-import org.apache.plc4x.java.bacnetip.readwrite.BacnetConstants;
 import org.apache.plc4x.java.spi.configuration.Configuration;
+import org.apache.plc4x.java.spi.configuration.annotations.ComplexConfigurationParameter;
+import org.apache.plc4x.java.spi.configuration.annotations.ComplexConfigurationParameterDefaultOverride;
 import org.apache.plc4x.java.spi.configuration.annotations.ConfigurationParameter;
-import org.apache.plc4x.java.spi.configuration.annotations.defaults.DoubleDefaultValue;
-import org.apache.plc4x.java.spi.configuration.annotations.defaults.StringDefaultValue;
-import org.apache.plc4x.java.transport.pcapreplay.PcapReplayTransportConfiguration;
-import org.apache.plc4x.java.transport.rawsocket.RawSocketTransportConfiguration;
-import org.apache.plc4x.java.transport.udp.UdpTransportConfiguration;
-import org.apache.plc4x.java.utils.pcap.netty.handlers.PacketHandler;
-import org.pcap4j.packet.Dot1qVlanTagPacket;
+import org.apache.plc4x.java.spi.transport.TransportConfiguration;
+import org.apache.plc4x.java.spi.transport.TransportConfigurationProvider;
 
-public class BacNetIpConfiguration implements Configuration, UdpTransportConfiguration, RawSocketTransportConfiguration, PcapReplayTransportConfiguration {
+public class BacNetIpConfiguration implements Configuration, TransportConfigurationProvider {
 
     // Path to a single EDE file.
     @ConfigurationParameter("ede-file-path")
@@ -39,18 +35,18 @@ public class BacNetIpConfiguration implements Configuration, UdpTransportConfigu
     @ConfigurationParameter("ede-directory-path")
     private String edeDirectoryPath;
 
-    // The speed in which the pcap file is replayed:
-    // - 1.0 being the original speed
-    // - 0   being as fast as possible (no delays between the packets)
-    // - 0.5 being double speed
-    // - 2.0 being half speed
-    @ConfigurationParameter("pcap-replay-speed")
-    @DoubleDefaultValue(1.0F)
-    private double pcapReplaySpeed;
+    @ComplexConfigurationParameter(prefix = "udp", defaultOverrides = {}, requiredOverrides = {})
+    private BacNetUdpTransportConfiguration udpTransportConfiguration;
 
-    @ConfigurationParameter("filter")
-    @StringDefaultValue("")
-    private String filter = "";
+    @ComplexConfigurationParameter(prefix = "pcap", defaultOverrides = {
+        @ComplexConfigurationParameterDefaultOverride(name = "support-vlans", value = "true")
+    }, requiredOverrides = {})
+    private BacNetPcapReplayTransportConfiguration pcapReplayTransportConfiguration;
+
+    @ComplexConfigurationParameter(prefix = "raw", defaultOverrides = {
+        @ComplexConfigurationParameterDefaultOverride(name = "resolve-mac-address", value = "true")
+    }, requiredOverrides = {})
+    private BacNetRawSocketTransportConfiguration rawSocketTransportConfiguration;
 
     public String getEdeFilePath() {
         return edeFilePath;
@@ -68,61 +64,41 @@ public class BacNetIpConfiguration implements Configuration, UdpTransportConfigu
         this.edeDirectoryPath = edeDirectoryPath;
     }
 
-    public void setPcapReplaySpeed(double pcapReplaySpeed) {
-        this.pcapReplaySpeed = pcapReplaySpeed;
+    public BacNetUdpTransportConfiguration getUdpTransportConfiguration() {
+        return udpTransportConfiguration;
     }
 
-    @Override
-    public float getReplaySpeedFactor() {
-        return (float) pcapReplaySpeed;
-    }
-
-    @Override
-    public boolean getSupportVlans() {
-        return true;
+    public void setUdpTransportConfiguration(BacNetUdpTransportConfiguration udpTransportConfiguration) {
+        this.udpTransportConfiguration = udpTransportConfiguration;
     }
 
-    @Override
-    public int getDefaultPort() {
-        return BacnetConstants.BACNETUDPDEFAULTPORT;
+    public BacNetPcapReplayTransportConfiguration getPcapReplayTransportConfiguration() {
+        return pcapReplayTransportConfiguration;
     }
 
-    @Override
-    public Integer getProtocolId() {
-        return null;
+    public void setPcapReplayTransportConfiguration(BacNetPcapReplayTransportConfiguration pcapReplayTransportConfiguration) {
+        this.pcapReplayTransportConfiguration = pcapReplayTransportConfiguration;
     }
 
-    @Override
-    public String getFilter() {
-        return filter;
+    public BacNetRawSocketTransportConfiguration getRawSocketTransportConfiguration() {
+        return rawSocketTransportConfiguration;
     }
 
-    public void setFilter(String filter) {
-        this.filter = filter;
+    public void setRawSocketTransportConfiguration(BacNetRawSocketTransportConfiguration rawSocketTransportConfiguration) {
+        this.rawSocketTransportConfiguration = rawSocketTransportConfiguration;
     }
 
-    /**
-     * Packet handler to use when running in PCAP mode.
-     * In this case all packets are Ethernet frames and we need to first get the
-     * IP packet and then the UDP packet and then the raw data from that.
-     *
-     * @return payload of the packet.
-     */
     @Override
-    public PacketHandler getPcapPacketHandler() {
-        return packet -> {
-            // If it's a VLan packet, we need to go one level deeper.
-            if (packet.getPayload() instanceof Dot1qVlanTagPacket) {
-                return packet.getPayload().getPayload().getPayload().getPayload().getRawData();
-            }
-            // This is a normal udp packet.
-            else {
-                if ((packet.getPayload() != null) && (packet.getPayload().getPayload() != null) && (packet.getPayload().getPayload().getPayload() != null)) {
-                    return packet.getPayload().getPayload().getPayload().getRawData();
-                }
-            }
-            return null;
-        };
+    public TransportConfiguration getTransportConfiguration(String transportCode) {
+        switch (transportCode) {
+            case "udp":
+                return udpTransportConfiguration;
+            case "raw":
+                return rawSocketTransportConfiguration;
+            case "pcap":
+                return pcapReplayTransportConfiguration;
+        }
+        return null;
     }
 
 }
diff --git a/plc4j/drivers/bacnet/src/main/java/org/apache/plc4x/java/bacnetip/configuration/BacNetPcapReplayTransportConfiguration.java b/plc4j/drivers/bacnet/src/main/java/org/apache/plc4x/java/bacnetip/configuration/BacNetPcapReplayTransportConfiguration.java
new file mode 100644
index 0000000000..a2e61e8ead
--- /dev/null
+++ b/plc4j/drivers/bacnet/src/main/java/org/apache/plc4x/java/bacnetip/configuration/BacNetPcapReplayTransportConfiguration.java
@@ -0,0 +1,58 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.plc4x.java.bacnetip.configuration;
+
+import org.apache.plc4x.java.bacnetip.readwrite.BacnetConstants;
+import org.apache.plc4x.java.transport.pcapreplay.DefaultPcapReplayTransportConfiguration;
+import org.apache.plc4x.java.utils.pcap.netty.handlers.PacketHandler;
+import org.pcap4j.packet.Dot1qVlanTagPacket;
+
+public class BacNetPcapReplayTransportConfiguration extends DefaultPcapReplayTransportConfiguration {
+
+    @Override
+    public int getDefaultPort() {
+        return BacnetConstants.BACNETUDPDEFAULTPORT;
+    }
+
+    /**
+     * Packet handler to use when running in PCAP mode.
+     * In this case all packets are Ethernet frames and we need to first get the
+     * IP packet and then the UDP packet and then the raw data from that.
+     *
+     * @return payload of the packet.
+     */
+    @Override
+    public PacketHandler getPcapPacketHandler() {
+        return packet -> {
+            // If it's a VLan packet, we need to go one level deeper.
+            if (packet.getPayload() instanceof Dot1qVlanTagPacket) {
+                return packet.getPayload().getPayload().getPayload().getPayload().getRawData();
+            }
+            // This is a normal udp packet.
+            else {
+                if ((packet.getPayload() != null) && (packet.getPayload().getPayload() != null) && (packet.getPayload().getPayload().getPayload() != null)) {
+                    return packet.getPayload().getPayload().getPayload().getRawData();
+                }
+            }
+            return null;
+        };
+    }
+
+}
diff --git a/plc4j/drivers/bacnet/src/main/java/org/apache/plc4x/java/bacnetip/configuration/BacNetRawSocketTransportConfiguration.java b/plc4j/drivers/bacnet/src/main/java/org/apache/plc4x/java/bacnetip/configuration/BacNetRawSocketTransportConfiguration.java
new file mode 100644
index 0000000000..f93789ce9a
--- /dev/null
+++ b/plc4j/drivers/bacnet/src/main/java/org/apache/plc4x/java/bacnetip/configuration/BacNetRawSocketTransportConfiguration.java
@@ -0,0 +1,58 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.plc4x.java.bacnetip.configuration;
+
+import org.apache.plc4x.java.bacnetip.readwrite.BacnetConstants;
+import org.apache.plc4x.java.transport.rawsocket.DefaultRawSocketTransportConfiguration;
+import org.apache.plc4x.java.utils.pcap.netty.handlers.PacketHandler;
+import org.pcap4j.packet.Dot1qVlanTagPacket;
+
+public class BacNetRawSocketTransportConfiguration extends DefaultRawSocketTransportConfiguration {
+
+    @Override
+    public int getDefaultPort() {
+        return BacnetConstants.BACNETUDPDEFAULTPORT;
+    }
+
+    /**
+     * Packet handler to use when running in PCAP mode.
+     * In this case all packets are Ethernet frames and we need to first get the
+     * IP packet and then the UDP packet and then the raw data from that.
+     *
+     * @return payload of the packet.
+     */
+    @Override
+    public PacketHandler getPcapPacketHandler() {
+        return packet -> {
+            // If it's a VLan packet, we need to go one level deeper.
+            if (packet.getPayload() instanceof Dot1qVlanTagPacket) {
+                return packet.getPayload().getPayload().getPayload().getPayload().getRawData();
+            }
+            // This is a normal udp packet.
+            else {
+                if ((packet.getPayload() != null) && (packet.getPayload().getPayload() != null) && (packet.getPayload().getPayload().getPayload() != null)) {
+                    return packet.getPayload().getPayload().getPayload().getRawData();
+                }
+            }
+            return null;
+        };
+    }
+
+}
diff --git a/plc4j/transports/raw-socket/src/main/java/org/apache/plc4x/java/transport/rawsocket/RawSocketTransportConfiguration.java b/plc4j/drivers/bacnet/src/main/java/org/apache/plc4x/java/bacnetip/configuration/BacNetUdpTransportConfiguration.java
similarity index 64%
copy from plc4j/transports/raw-socket/src/main/java/org/apache/plc4x/java/transport/rawsocket/RawSocketTransportConfiguration.java
copy to plc4j/drivers/bacnet/src/main/java/org/apache/plc4x/java/bacnetip/configuration/BacNetUdpTransportConfiguration.java
index 4cc17707a5..4fb778a3ec 100644
--- a/plc4j/transports/raw-socket/src/main/java/org/apache/plc4x/java/transport/rawsocket/RawSocketTransportConfiguration.java
+++ b/plc4j/drivers/bacnet/src/main/java/org/apache/plc4x/java/bacnetip/configuration/BacNetUdpTransportConfiguration.java
@@ -7,7 +7,7 @@
  * "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
+ *   http://www.apache.org/licenses/LICENSE-2.0
  *
  * Unless required by applicable law or agreed to in writing,
  * software distributed under the License is distributed on an
@@ -16,20 +16,17 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.plc4x.java.transport.rawsocket;
 
-import org.apache.plc4x.java.transport.pcap.PcapTransportConfiguration;
+package org.apache.plc4x.java.bacnetip.configuration;
 
-public interface RawSocketTransportConfiguration extends PcapTransportConfiguration {
+import org.apache.plc4x.java.bacnetip.readwrite.BacnetConstants;
+import org.apache.plc4x.java.transport.udp.DefaultUdpTransportConfiguration;
 
-    int NO_DEFAULT_PORT = -1;
+public class BacNetUdpTransportConfiguration extends DefaultUdpTransportConfiguration {
 
-    default int getDefaultPort() {
-        return NO_DEFAULT_PORT;
-    }
-
-    default boolean isResolveMacAccess() {
-        return false;
+    @Override
+    public int getDefaultPort() {
+        return BacnetConstants.BACNETUDPDEFAULTPORT;
     }
 
 }
diff --git a/plc4j/drivers/c-bus/src/main/java/org/apache/plc4x/java/cbus/configuration/CBusConfiguration.java b/plc4j/drivers/c-bus/src/main/java/org/apache/plc4x/java/cbus/configuration/CBusConfiguration.java
index 53fb49e57c..ea3b4d1ef9 100644
--- a/plc4j/drivers/c-bus/src/main/java/org/apache/plc4x/java/cbus/configuration/CBusConfiguration.java
+++ b/plc4j/drivers/c-bus/src/main/java/org/apache/plc4x/java/cbus/configuration/CBusConfiguration.java
@@ -19,16 +19,21 @@
 package org.apache.plc4x.java.cbus.configuration;
 
 import org.apache.plc4x.java.spi.configuration.Configuration;
+import org.apache.plc4x.java.spi.configuration.annotations.ComplexConfigurationParameter;
 import org.apache.plc4x.java.spi.configuration.annotations.ConfigurationParameter;
 import org.apache.plc4x.java.spi.configuration.annotations.defaults.BooleanDefaultValue;
-import org.apache.plc4x.java.transport.tcp.TcpTransportConfiguration;
+import org.apache.plc4x.java.spi.transport.TransportConfiguration;
+import org.apache.plc4x.java.spi.transport.TransportConfigurationProvider;
 
-public class CBusConfiguration implements Configuration, TcpTransportConfiguration {
+public class CBusConfiguration implements Configuration, TransportConfigurationProvider {
 
     @ConfigurationParameter("srchk")
     @BooleanDefaultValue(false)
     public boolean srchk = false;
 
+    @ComplexConfigurationParameter(prefix = "tcp", defaultOverrides = {}, requiredOverrides = {})
+    private CBusTcpTransportConfiguration tcpTransportConfiguration;
+
     public boolean isSrchk() {
         return srchk;
     }
@@ -37,9 +42,21 @@ public class CBusConfiguration implements Configuration, TcpTransportConfigurati
         this.srchk = srchk;
     }
 
+    public CBusTcpTransportConfiguration getTcpTransportConfiguration() {
+        return tcpTransportConfiguration;
+    }
+
+    public void setTcpTransportConfiguration(CBusTcpTransportConfiguration tcpTransportConfiguration) {
+        this.tcpTransportConfiguration = tcpTransportConfiguration;
+    }
+
     @Override
-    public int getDefaultPort() {
-        return 123;//CBusDriver.C_BUS_TCP_PORT;
+    public TransportConfiguration getTransportConfiguration(String transportCode) {
+        switch (transportCode) {
+            case "tcp":
+                return tcpTransportConfiguration;
+        }
+        return null;
     }
 
     @Override
diff --git a/plc4j/transports/raw-socket/src/main/java/org/apache/plc4x/java/transport/rawsocket/RawSocketTransportConfiguration.java b/plc4j/drivers/c-bus/src/main/java/org/apache/plc4x/java/cbus/configuration/CBusTcpTransportConfiguration.java
similarity index 66%
copy from plc4j/transports/raw-socket/src/main/java/org/apache/plc4x/java/transport/rawsocket/RawSocketTransportConfiguration.java
copy to plc4j/drivers/c-bus/src/main/java/org/apache/plc4x/java/cbus/configuration/CBusTcpTransportConfiguration.java
index 4cc17707a5..b29407603c 100644
--- a/plc4j/transports/raw-socket/src/main/java/org/apache/plc4x/java/transport/rawsocket/RawSocketTransportConfiguration.java
+++ b/plc4j/drivers/c-bus/src/main/java/org/apache/plc4x/java/cbus/configuration/CBusTcpTransportConfiguration.java
@@ -7,7 +7,7 @@
  * "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
+ *   http://www.apache.org/licenses/LICENSE-2.0
  *
  * Unless required by applicable law or agreed to in writing,
  * software distributed under the License is distributed on an
@@ -16,20 +16,16 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.plc4x.java.transport.rawsocket;
 
-import org.apache.plc4x.java.transport.pcap.PcapTransportConfiguration;
+package org.apache.plc4x.java.cbus.configuration;
 
-public interface RawSocketTransportConfiguration extends PcapTransportConfiguration {
+import org.apache.plc4x.java.transport.tcp.DefaultTcpTransportConfiguration;
 
-    int NO_DEFAULT_PORT = -1;
+public class CBusTcpTransportConfiguration extends DefaultTcpTransportConfiguration {
 
-    default int getDefaultPort() {
-        return NO_DEFAULT_PORT;
-    }
-
-    default boolean isResolveMacAccess() {
-        return false;
+    @Override
+    public int getDefaultPort() {
+        return 123;
     }
 
 }
diff --git a/plc4j/drivers/can/src/main/java/org/apache/plc4x/java/can/generic/configuration/GenericCANConfiguration.java b/plc4j/drivers/can/src/main/java/org/apache/plc4x/java/can/generic/configuration/GenericCANConfiguration.java
index 95dd52d28a..d24be4e464 100644
--- a/plc4j/drivers/can/src/main/java/org/apache/plc4x/java/can/generic/configuration/GenericCANConfiguration.java
+++ b/plc4j/drivers/can/src/main/java/org/apache/plc4x/java/can/generic/configuration/GenericCANConfiguration.java
@@ -19,11 +19,14 @@
 package org.apache.plc4x.java.can.generic.configuration;
 
 import org.apache.plc4x.java.spi.configuration.Configuration;
+import org.apache.plc4x.java.spi.configuration.annotations.ComplexConfigurationParameter;
 import org.apache.plc4x.java.spi.configuration.annotations.ConfigurationParameter;
 import org.apache.plc4x.java.spi.configuration.annotations.defaults.IntDefaultValue;
-import org.apache.plc4x.java.transport.can.CANTransportConfiguration;
+import org.apache.plc4x.java.spi.transport.TransportConfiguration;
+import org.apache.plc4x.java.spi.transport.TransportConfigurationProvider;
+import org.apache.plc4x.java.transport.can.DefaultCANTransportConfiguration;
 
-public class GenericCANConfiguration implements Configuration, CANTransportConfiguration {
+public class GenericCANConfiguration implements Configuration, TransportConfigurationProvider {
 
     @ConfigurationParameter
     private int nodeId;
@@ -32,6 +35,9 @@ public class GenericCANConfiguration implements Configuration, CANTransportConfi
     @IntDefaultValue(1000)
     private int requestTimeout;
 
+    @ComplexConfigurationParameter(prefix = "can", defaultOverrides = {}, requiredOverrides = {})
+    private DefaultCANTransportConfiguration canTransportConfiguration;
+
     public int getNodeId() {
         return nodeId;
     }
@@ -48,4 +54,21 @@ public class GenericCANConfiguration implements Configuration, CANTransportConfi
         this.requestTimeout = requestTimeout;
     }
 
+    public DefaultCANTransportConfiguration getCanTransportConfiguration() {
+        return canTransportConfiguration;
+    }
+
+    public void setCanTransportConfiguration(DefaultCANTransportConfiguration canTransportConfiguration) {
+        this.canTransportConfiguration = canTransportConfiguration;
+    }
+
+    @Override
+    public TransportConfiguration getTransportConfiguration(String transportCode) {
+        switch (transportCode) {
+            case "can":
+                return canTransportConfiguration;
+        }
+        return null;
+    }
+
 }
diff --git a/plc4j/drivers/canopen/src/main/java/org/apache/plc4x/java/canopen/configuration/CANOpenConfiguration.java b/plc4j/drivers/canopen/src/main/java/org/apache/plc4x/java/canopen/configuration/CANOpenConfiguration.java
index e6e61065cc..3355e26144 100644
--- a/plc4j/drivers/canopen/src/main/java/org/apache/plc4x/java/canopen/configuration/CANOpenConfiguration.java
+++ b/plc4j/drivers/canopen/src/main/java/org/apache/plc4x/java/canopen/configuration/CANOpenConfiguration.java
@@ -19,11 +19,14 @@
 package org.apache.plc4x.java.canopen.configuration;
 
 import org.apache.plc4x.java.spi.configuration.Configuration;
+import org.apache.plc4x.java.spi.configuration.annotations.ComplexConfigurationParameter;
 import org.apache.plc4x.java.spi.configuration.annotations.ConfigurationParameter;
 import org.apache.plc4x.java.spi.configuration.annotations.defaults.IntDefaultValue;
-import org.apache.plc4x.java.transport.can.CANTransportConfiguration;
+import org.apache.plc4x.java.spi.transport.TransportConfiguration;
+import org.apache.plc4x.java.spi.transport.TransportConfigurationProvider;
+import org.apache.plc4x.java.transport.can.DefaultCANTransportConfiguration;
 
-public class CANOpenConfiguration implements Configuration, CANTransportConfiguration {
+public class CANOpenConfiguration implements Configuration, TransportConfigurationProvider {
 
     @ConfigurationParameter
     private int nodeId;
@@ -35,6 +38,9 @@ public class CANOpenConfiguration implements Configuration, CANTransportConfigur
     @IntDefaultValue(1000)
     private int requestTimeout;
 
+    @ComplexConfigurationParameter(prefix = "can", defaultOverrides = {}, requiredOverrides = {})
+    private DefaultCANTransportConfiguration canTransportConfiguration;
+
     public int getNodeId() {
         return nodeId;
     }
@@ -59,4 +65,21 @@ public class CANOpenConfiguration implements Configuration, CANTransportConfigur
         this.requestTimeout = requestTimeout;
     }
 
+    public DefaultCANTransportConfiguration getCanTransportConfiguration() {
+        return canTransportConfiguration;
+    }
+
+    public void setCanTransportConfiguration(DefaultCANTransportConfiguration canTransportConfiguration) {
+        this.canTransportConfiguration = canTransportConfiguration;
+    }
+
+    @Override
+    public TransportConfiguration getTransportConfiguration(String transportCode) {
+        switch (transportCode) {
+            case "can":
+                return canTransportConfiguration;
+        }
+        return null;
+    }
+
 }
diff --git a/plc4j/drivers/eip/src/main/java/org/apache/plc4x/java/eip/base/configuration/EIPConfiguration.java b/plc4j/drivers/eip/src/main/java/org/apache/plc4x/java/eip/base/configuration/EIPConfiguration.java
index 25e8f69e53..969bbf6006 100644
--- a/plc4j/drivers/eip/src/main/java/org/apache/plc4x/java/eip/base/configuration/EIPConfiguration.java
+++ b/plc4j/drivers/eip/src/main/java/org/apache/plc4x/java/eip/base/configuration/EIPConfiguration.java
@@ -18,13 +18,14 @@
  */
 package org.apache.plc4x.java.eip.base.configuration;
 
-import org.apache.plc4x.java.eip.base.EIPDriver;
 import org.apache.plc4x.java.spi.configuration.Configuration;
+import org.apache.plc4x.java.spi.configuration.annotations.ComplexConfigurationParameter;
 import org.apache.plc4x.java.spi.configuration.annotations.ConfigurationParameter;
 import org.apache.plc4x.java.spi.generation.ByteOrder;
-import org.apache.plc4x.java.transport.tcp.TcpTransportConfiguration;
+import org.apache.plc4x.java.spi.transport.TransportConfiguration;
+import org.apache.plc4x.java.spi.transport.TransportConfigurationProvider;
 
-public class EIPConfiguration implements Configuration, TcpTransportConfiguration {
+public class EIPConfiguration implements Configuration, TransportConfigurationProvider {
 
     @ConfigurationParameter
     private int backplane = 1;
@@ -35,6 +36,9 @@ public class EIPConfiguration implements Configuration, TcpTransportConfiguratio
     @ConfigurationParameter
     private boolean bigEndian = true;
 
+    @ComplexConfigurationParameter(prefix = "tcp", defaultOverrides = {}, requiredOverrides = {})
+    private EipTcpTransportConfiguration tcpTransportConfiguration;
+
     public int getBackplane() {
         return backplane;
     }
@@ -59,7 +63,21 @@ public class EIPConfiguration implements Configuration, TcpTransportConfiguratio
         this.bigEndian = byteOrder == ByteOrder.BIG_ENDIAN;
     }
 
+    public EipTcpTransportConfiguration getTcpTransportConfiguration() {
+        return tcpTransportConfiguration;
+    }
+
+    public void setTcpTransportConfiguration(EipTcpTransportConfiguration tcpTransportConfiguration) {
+        this.tcpTransportConfiguration = tcpTransportConfiguration;
+    }
+
     @Override
-    public int getDefaultPort(){return EIPDriver.PORT;}
+    public TransportConfiguration getTransportConfiguration(String transportCode) {
+        switch (transportCode) {
+            case "tcp":
+                return tcpTransportConfiguration;
+        }
+        return null;
+    }
 
 }
diff --git a/plc4j/transports/pcap-replay/src/main/java/org/apache/plc4x/java/transport/pcapreplay/PcapReplayTransportConfiguration.java b/plc4j/drivers/eip/src/main/java/org/apache/plc4x/java/eip/base/configuration/EipTcpTransportConfiguration.java
similarity index 64%
copy from plc4j/transports/pcap-replay/src/main/java/org/apache/plc4x/java/transport/pcapreplay/PcapReplayTransportConfiguration.java
copy to plc4j/drivers/eip/src/main/java/org/apache/plc4x/java/eip/base/configuration/EipTcpTransportConfiguration.java
index fe08010f72..13914e887d 100644
--- a/plc4j/transports/pcap-replay/src/main/java/org/apache/plc4x/java/transport/pcapreplay/PcapReplayTransportConfiguration.java
+++ b/plc4j/drivers/eip/src/main/java/org/apache/plc4x/java/eip/base/configuration/EipTcpTransportConfiguration.java
@@ -7,7 +7,7 @@
  * "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
+ *   http://www.apache.org/licenses/LICENSE-2.0
  *
  * Unless required by applicable law or agreed to in writing,
  * software distributed under the License is distributed on an
@@ -16,19 +16,17 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.plc4x.java.transport.pcapreplay;
 
-import org.apache.plc4x.java.transport.pcap.PcapTransportConfiguration;
+package org.apache.plc4x.java.eip.base.configuration;
 
-public interface PcapReplayTransportConfiguration extends PcapTransportConfiguration {
+import org.apache.plc4x.java.eip.base.EIPDriver;
+import org.apache.plc4x.java.transport.tcp.DefaultTcpTransportConfiguration;
 
-    default float getReplaySpeedFactor() {
-        return 1;
-    }
+public class EipTcpTransportConfiguration extends DefaultTcpTransportConfiguration {
 
-    default boolean isLoop() {
-        return false;
+    @Override
+    public int getDefaultPort() {
+        return EIPDriver.PORT;
     }
 
-    default String getFilter() { return "";}
 }
diff --git a/plc4j/drivers/eip/src/main/java/org/apache/plc4x/java/eip/logix/configuration/LogixConfiguration.java b/plc4j/drivers/eip/src/main/java/org/apache/plc4x/java/eip/logix/configuration/LogixConfiguration.java
index 992413a265..c1f424a392 100644
--- a/plc4j/drivers/eip/src/main/java/org/apache/plc4x/java/eip/logix/configuration/LogixConfiguration.java
+++ b/plc4j/drivers/eip/src/main/java/org/apache/plc4x/java/eip/logix/configuration/LogixConfiguration.java
@@ -18,7 +18,6 @@
  */
 package org.apache.plc4x.java.eip.logix.configuration;
 
-import org.apache.plc4x.java.eip.base.EIPDriver;
 import org.apache.plc4x.java.eip.base.configuration.EIPConfiguration;
 import org.apache.plc4x.java.spi.configuration.annotations.ConfigurationParameter;
 
@@ -27,9 +26,6 @@ public class LogixConfiguration extends EIPConfiguration {
     @ConfigurationParameter
     private String communicationPath;
 
-    @Override
-    public int getDefaultPort(){return EIPDriver.PORT;}
-
     public String getCommunicationPath() { return this.communicationPath; }
 
     public void setCommunicationPath(String routingAddress) { this.communicationPath = communicationPath; }
diff --git a/plc4j/drivers/firmata/src/main/java/org/apache/plc4x/java/firmata/readwrite/configuration/FirmataConfiguration.java b/plc4j/drivers/firmata/src/main/java/org/apache/plc4x/java/firmata/readwrite/configuration/FirmataConfiguration.java
index 075418f47f..9ed895ba2f 100644
--- a/plc4j/drivers/firmata/src/main/java/org/apache/plc4x/java/firmata/readwrite/configuration/FirmataConfiguration.java
+++ b/plc4j/drivers/firmata/src/main/java/org/apache/plc4x/java/firmata/readwrite/configuration/FirmataConfiguration.java
@@ -19,17 +19,31 @@
 package org.apache.plc4x.java.firmata.readwrite.configuration;
 
 import org.apache.plc4x.java.spi.configuration.Configuration;
-import org.apache.plc4x.java.transport.serial.SerialTransportConfiguration;
+import org.apache.plc4x.java.spi.configuration.annotations.ComplexConfigurationParameter;
+import org.apache.plc4x.java.spi.transport.TransportConfiguration;
+import org.apache.plc4x.java.spi.transport.TransportConfigurationProvider;
+import org.apache.plc4x.java.transport.serial.DefaultSerialTransportConfiguration;
 
-public class FirmataConfiguration implements Configuration, SerialTransportConfiguration {
+public class FirmataConfiguration implements Configuration, TransportConfigurationProvider {
+
+    @ComplexConfigurationParameter(prefix = "serial", defaultOverrides = {}, requiredOverrides = {})
+    private DefaultSerialTransportConfiguration serialTransportConfiguration;
+
+    public DefaultSerialTransportConfiguration getSerialTransportConfiguration() {
+        return serialTransportConfiguration;
+    }
+
+    public void setSerialTransportConfiguration(DefaultSerialTransportConfiguration serialTransportConfiguration) {
+        this.serialTransportConfiguration = serialTransportConfiguration;
+    }
 
-    /**
-     * The StandardFirmata sketch uses 57600 baud per default.
-     * @return 57600 as this is what the Arduino uses.
-     */
     @Override
-    public int getBaudRate() {
-        return 57600;
+    public TransportConfiguration getTransportConfiguration(String transportCode) {
+        switch (transportCode) {
+            case "serial":
+                return serialTransportConfiguration;
+        }
+        return null;
     }
 
 }
diff --git a/plc4j/drivers/iec-60870/src/main/java/org/apache/plc4x/java/iec608705104/readwrite/configuration/Iec608705014Configuration.java b/plc4j/drivers/iec-60870/src/main/java/org/apache/plc4x/java/iec608705104/readwrite/configuration/Iec608705014Configuration.java
index 44e8514ff3..4c9fea9f5b 100644
--- a/plc4j/drivers/iec-60870/src/main/java/org/apache/plc4x/java/iec608705104/readwrite/configuration/Iec608705014Configuration.java
+++ b/plc4j/drivers/iec-60870/src/main/java/org/apache/plc4x/java/iec608705104/readwrite/configuration/Iec608705014Configuration.java
@@ -19,22 +19,21 @@
 
 package org.apache.plc4x.java.iec608705104.readwrite.configuration;
 
-import org.apache.plc4x.java.iec608705104.readwrite.IEC608705104Constants;
 import org.apache.plc4x.java.spi.configuration.Configuration;
+import org.apache.plc4x.java.spi.configuration.annotations.ComplexConfigurationParameter;
 import org.apache.plc4x.java.spi.configuration.annotations.ConfigurationParameter;
 import org.apache.plc4x.java.spi.configuration.annotations.defaults.IntDefaultValue;
-import org.apache.plc4x.java.transport.tcp.TcpTransportConfiguration;
+import org.apache.plc4x.java.spi.transport.TransportConfiguration;
+import org.apache.plc4x.java.spi.transport.TransportConfigurationProvider;
 
-public class Iec608705014Configuration implements Configuration, TcpTransportConfiguration {
+public class Iec608705014Configuration implements Configuration, TransportConfigurationProvider {
 
     @ConfigurationParameter("timeout-request")
     @IntDefaultValue(4000)
     protected int timeoutRequest;
 
-    @Override
-    public int getDefaultPort() {
-        return IEC608705104Constants.DEFAULTPORT;
-    }
+    @ComplexConfigurationParameter(prefix = "tcp", defaultOverrides = {}, requiredOverrides = {})
+    private Iec608705014TcpTransportConfiguration tcpTransportConfiguration;
 
     public int getTimeoutRequest() {
         return timeoutRequest;
@@ -44,4 +43,21 @@ public class Iec608705014Configuration implements Configuration, TcpTransportCon
         this.timeoutRequest = timeoutRequest;
     }
 
+    public Iec608705014TcpTransportConfiguration getTcpTransportConfiguration() {
+        return tcpTransportConfiguration;
+    }
+
+    public void setTcpTransportConfiguration(Iec608705014TcpTransportConfiguration tcpTransportConfiguration) {
+        this.tcpTransportConfiguration = tcpTransportConfiguration;
+    }
+
+    @Override
+    public TransportConfiguration getTransportConfiguration(String transportCode) {
+        switch (transportCode) {
+            case "tcp":
+                return tcpTransportConfiguration;
+        }
+        return null;
+    }
+
 }
diff --git a/plc4j/transports/pcap-replay/src/main/java/org/apache/plc4x/java/transport/pcapreplay/PcapReplayTransportConfiguration.java b/plc4j/drivers/iec-60870/src/main/java/org/apache/plc4x/java/iec608705104/readwrite/configuration/Iec608705014TcpTransportConfiguration.java
similarity index 62%
copy from plc4j/transports/pcap-replay/src/main/java/org/apache/plc4x/java/transport/pcapreplay/PcapReplayTransportConfiguration.java
copy to plc4j/drivers/iec-60870/src/main/java/org/apache/plc4x/java/iec608705104/readwrite/configuration/Iec608705014TcpTransportConfiguration.java
index fe08010f72..a3bee8ad9e 100644
--- a/plc4j/transports/pcap-replay/src/main/java/org/apache/plc4x/java/transport/pcapreplay/PcapReplayTransportConfiguration.java
+++ b/plc4j/drivers/iec-60870/src/main/java/org/apache/plc4x/java/iec608705104/readwrite/configuration/Iec608705014TcpTransportConfiguration.java
@@ -7,7 +7,7 @@
  * "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
+ *   http://www.apache.org/licenses/LICENSE-2.0
  *
  * Unless required by applicable law or agreed to in writing,
  * software distributed under the License is distributed on an
@@ -16,19 +16,17 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.plc4x.java.transport.pcapreplay;
 
-import org.apache.plc4x.java.transport.pcap.PcapTransportConfiguration;
+package org.apache.plc4x.java.iec608705104.readwrite.configuration;
 
-public interface PcapReplayTransportConfiguration extends PcapTransportConfiguration {
+import org.apache.plc4x.java.iec608705104.readwrite.IEC608705104Constants;
+import org.apache.plc4x.java.transport.tcp.DefaultTcpTransportConfiguration;
 
-    default float getReplaySpeedFactor() {
-        return 1;
-    }
+public class Iec608705014TcpTransportConfiguration extends DefaultTcpTransportConfiguration {
 
-    default boolean isLoop() {
-        return false;
+    @Override
+    public int getDefaultPort() {
+        return IEC608705104Constants.DEFAULTPORT;
     }
 
-    default String getFilter() { return "";}
 }
diff --git a/plc4j/drivers/knxnetip/src/main/java/org/apache/plc4x/java/knxnetip/configuration/KnxNetIpConfiguration.java b/plc4j/drivers/knxnetip/src/main/java/org/apache/plc4x/java/knxnetip/configuration/KnxNetIpConfiguration.java
index b203f756db..e6bc525bbc 100644
--- a/plc4j/drivers/knxnetip/src/main/java/org/apache/plc4x/java/knxnetip/configuration/KnxNetIpConfiguration.java
+++ b/plc4j/drivers/knxnetip/src/main/java/org/apache/plc4x/java/knxnetip/configuration/KnxNetIpConfiguration.java
@@ -18,22 +18,17 @@
  */
 package org.apache.plc4x.java.knxnetip.configuration;
 
-import org.apache.plc4x.java.knxnetip.KnxNetIpDriver;
 import org.apache.plc4x.java.knxnetip.readwrite.KnxLayer;
 import org.apache.plc4x.java.spi.configuration.Configuration;
+import org.apache.plc4x.java.spi.configuration.annotations.ComplexConfigurationParameter;
 import org.apache.plc4x.java.spi.configuration.annotations.ConfigurationParameter;
-import org.apache.plc4x.java.spi.configuration.annotations.defaults.BooleanDefaultValue;
-import org.apache.plc4x.java.spi.configuration.annotations.defaults.FloatDefaultValue;
 import org.apache.plc4x.java.spi.configuration.annotations.defaults.IntDefaultValue;
 import org.apache.plc4x.java.spi.configuration.annotations.defaults.StringDefaultValue;
 import org.apache.plc4x.java.spi.configuration.exceptions.ConfigurationException;
-import org.apache.plc4x.java.transport.pcapreplay.PcapReplayTransportConfiguration;
-import org.apache.plc4x.java.transport.rawsocket.RawSocketTransportConfiguration;
-import org.apache.plc4x.java.transport.udp.UdpTransportConfiguration;
-import org.apache.plc4x.java.utils.pcap.netty.config.PcapChannelConfig;
-import org.apache.plc4x.java.utils.pcap.netty.handlers.PacketHandler;
+import org.apache.plc4x.java.spi.transport.TransportConfiguration;
+import org.apache.plc4x.java.spi.transport.TransportConfigurationProvider;
 
-public class KnxNetIpConfiguration implements Configuration, UdpTransportConfiguration, PcapReplayTransportConfiguration, RawSocketTransportConfiguration {
+public class KnxNetIpConfiguration implements Configuration, TransportConfigurationProvider {
 
     @ConfigurationParameter("knxproj-file-path")
     public String knxprojFilePath;
@@ -49,13 +44,14 @@ public class KnxNetIpConfiguration implements Configuration, UdpTransportConfigu
     @StringDefaultValue("LINK_LAYER")
     public String connectionType = "LINK_LAYER";
 
-    @ConfigurationParameter("replay-speed-factor")
-    @FloatDefaultValue(1.0f)
-    public float replaySpeedFactor = 1.0f;
+    @ComplexConfigurationParameter(prefix = "udp", defaultOverrides = {}, requiredOverrides = {})
+    private KnxNetIpUdpTransportConfiguration udpTransportConfiguration;
 
-    @ConfigurationParameter("loop")
-    @BooleanDefaultValue(false)
-    public boolean loop = false;
+    @ComplexConfigurationParameter(prefix = "pcap", defaultOverrides = {}, requiredOverrides = {})
+    private KnxNetIpPcapReplayTransportConfiguration pcapReplayTransportConfiguration;
+
+    @ComplexConfigurationParameter(prefix = "raw", defaultOverrides = {}, requiredOverrides = {})
+    private KnxNetIpRawSocketTransportConfiguration rawSocketTransportConfiguration;
 
     public String getKnxprojFilePath() {
         return knxprojFilePath;
@@ -96,37 +92,41 @@ public class KnxNetIpConfiguration implements Configuration, UdpTransportConfigu
         this.connectionType = connectionType.toUpperCase();
     }
 
-    @Override
-    public float getReplaySpeedFactor() {
-        return replaySpeedFactor;
+    public KnxNetIpUdpTransportConfiguration getUdpTransportConfiguration() {
+        return udpTransportConfiguration;
     }
 
-    public void setReplaySpeedFactor(float replaySpeedFactor) {
-        this.replaySpeedFactor = replaySpeedFactor;
+    public void setUdpTransportConfiguration(KnxNetIpUdpTransportConfiguration udpTransportConfiguration) {
+        this.udpTransportConfiguration = udpTransportConfiguration;
     }
 
-    @Override
-    public boolean isLoop() {
-        return loop;
+    public KnxNetIpPcapReplayTransportConfiguration getPcapReplayTransportConfiguration() {
+        return pcapReplayTransportConfiguration;
     }
 
-    public void setLoop(boolean loop) {
-        this.loop = loop;
+    public void setPcapReplayTransportConfiguration(KnxNetIpPcapReplayTransportConfiguration pcapReplayTransportConfiguration) {
+        this.pcapReplayTransportConfiguration = pcapReplayTransportConfiguration;
     }
 
-    @Override
-    public int getDefaultPort() {
-        return KnxNetIpDriver.KNXNET_IP_PORT;
+    public KnxNetIpRawSocketTransportConfiguration getRawSocketTransportConfiguration() {
+        return rawSocketTransportConfiguration;
     }
 
-    @Override
-    public Integer getProtocolId() {
-        return PcapChannelConfig.ALL_PROTOCOLS;
+    public void setRawSocketTransportConfiguration(KnxNetIpRawSocketTransportConfiguration rawSocketTransportConfiguration) {
+        this.rawSocketTransportConfiguration = rawSocketTransportConfiguration;
     }
 
     @Override
-    public PacketHandler getPcapPacketHandler() {
-        return packet -> packet.getPayload().getPayload().getPayload().getRawData();
+    public TransportConfiguration getTransportConfiguration(String transportCode) {
+        switch (transportCode) {
+            case "udp":
+                return udpTransportConfiguration;
+            case "pcap":
+                return pcapReplayTransportConfiguration;
+            case "raw":
+                return rawSocketTransportConfiguration;
+        }
+        return null;
     }
 
     @Override
diff --git a/plc4j/transports/pcap-shared/src/main/java/org/apache/plc4x/java/transport/pcap/PcapTransportConfiguration.java b/plc4j/drivers/knxnetip/src/main/java/org/apache/plc4x/java/knxnetip/configuration/KnxNetIpPcapReplayTransportConfiguration.java
similarity index 58%
copy from plc4j/transports/pcap-shared/src/main/java/org/apache/plc4x/java/transport/pcap/PcapTransportConfiguration.java
copy to plc4j/drivers/knxnetip/src/main/java/org/apache/plc4x/java/knxnetip/configuration/KnxNetIpPcapReplayTransportConfiguration.java
index 8924393e28..1b75a631b7 100644
--- a/plc4j/transports/pcap-shared/src/main/java/org/apache/plc4x/java/transport/pcap/PcapTransportConfiguration.java
+++ b/plc4j/drivers/knxnetip/src/main/java/org/apache/plc4x/java/knxnetip/configuration/KnxNetIpPcapReplayTransportConfiguration.java
@@ -7,7 +7,7 @@
  * "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
+ *   http://www.apache.org/licenses/LICENSE-2.0
  *
  * Unless required by applicable law or agreed to in writing,
  * software distributed under the License is distributed on an
@@ -16,26 +16,23 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.plc4x.java.transport.pcap;
 
-import org.apache.plc4x.java.spi.transport.TransportConfiguration;
-import org.apache.plc4x.java.utils.pcap.netty.config.PcapChannelConfig;
-import org.apache.plc4x.java.utils.pcap.netty.handlers.PacketHandler;
+package org.apache.plc4x.java.knxnetip.configuration;
 
-public interface PcapTransportConfiguration extends TransportConfiguration {
+import org.apache.plc4x.java.knxnetip.KnxNetIpDriver;
+import org.apache.plc4x.java.transport.pcapreplay.DefaultPcapReplayTransportConfiguration;
+import org.apache.plc4x.java.utils.pcap.netty.handlers.PacketHandler;
 
-    default boolean getSupportVlans() {
-        return false;
-    }
+public class KnxNetIpPcapReplayTransportConfiguration extends DefaultPcapReplayTransportConfiguration {
 
-    default int getDefaultPort() {
-        return PcapChannelConfig.ALL_PORTS;
+    @Override
+    public int getDefaultPort() {
+        return KnxNetIpDriver.KNXNET_IP_PORT;
     }
 
-    default Integer getProtocolId() {
-        return PcapChannelConfig.ALL_PROTOCOLS;
+    @Override
+    public PacketHandler getPcapPacketHandler() {
+        return packet -> packet.getPayload().getPayload().getPayload().getRawData();
     }
 
-    PacketHandler getPcapPacketHandler();
-
 }
diff --git a/plc4j/transports/pcap-shared/src/main/java/org/apache/plc4x/java/transport/pcap/PcapTransportConfiguration.java b/plc4j/drivers/knxnetip/src/main/java/org/apache/plc4x/java/knxnetip/configuration/KnxNetIpRawSocketTransportConfiguration.java
similarity index 59%
copy from plc4j/transports/pcap-shared/src/main/java/org/apache/plc4x/java/transport/pcap/PcapTransportConfiguration.java
copy to plc4j/drivers/knxnetip/src/main/java/org/apache/plc4x/java/knxnetip/configuration/KnxNetIpRawSocketTransportConfiguration.java
index 8924393e28..cb4454ee7a 100644
--- a/plc4j/transports/pcap-shared/src/main/java/org/apache/plc4x/java/transport/pcap/PcapTransportConfiguration.java
+++ b/plc4j/drivers/knxnetip/src/main/java/org/apache/plc4x/java/knxnetip/configuration/KnxNetIpRawSocketTransportConfiguration.java
@@ -7,7 +7,7 @@
  * "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
+ *   http://www.apache.org/licenses/LICENSE-2.0
  *
  * Unless required by applicable law or agreed to in writing,
  * software distributed under the License is distributed on an
@@ -16,26 +16,23 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.plc4x.java.transport.pcap;
 
-import org.apache.plc4x.java.spi.transport.TransportConfiguration;
-import org.apache.plc4x.java.utils.pcap.netty.config.PcapChannelConfig;
-import org.apache.plc4x.java.utils.pcap.netty.handlers.PacketHandler;
+package org.apache.plc4x.java.knxnetip.configuration;
 
-public interface PcapTransportConfiguration extends TransportConfiguration {
+import org.apache.plc4x.java.knxnetip.KnxNetIpDriver;
+import org.apache.plc4x.java.transport.rawsocket.DefaultRawSocketTransportConfiguration;
+import org.apache.plc4x.java.utils.pcap.netty.handlers.PacketHandler;
 
-    default boolean getSupportVlans() {
-        return false;
-    }
+public class KnxNetIpRawSocketTransportConfiguration extends DefaultRawSocketTransportConfiguration {
 
-    default int getDefaultPort() {
-        return PcapChannelConfig.ALL_PORTS;
+    @Override
+    public int getDefaultPort() {
+        return KnxNetIpDriver.KNXNET_IP_PORT;
     }
 
-    default Integer getProtocolId() {
-        return PcapChannelConfig.ALL_PROTOCOLS;
+    @Override
+    public PacketHandler getPcapPacketHandler() {
+        return packet -> packet.getPayload().getPayload().getPayload().getRawData();
     }
 
-    PacketHandler getPcapPacketHandler();
-
 }
diff --git a/plc4j/transports/pcap-replay/src/main/java/org/apache/plc4x/java/transport/pcapreplay/PcapReplayTransportConfiguration.java b/plc4j/drivers/knxnetip/src/main/java/org/apache/plc4x/java/knxnetip/configuration/KnxNetIpUdpTransportConfiguration.java
similarity index 64%
copy from plc4j/transports/pcap-replay/src/main/java/org/apache/plc4x/java/transport/pcapreplay/PcapReplayTransportConfiguration.java
copy to plc4j/drivers/knxnetip/src/main/java/org/apache/plc4x/java/knxnetip/configuration/KnxNetIpUdpTransportConfiguration.java
index fe08010f72..e630d802af 100644
--- a/plc4j/transports/pcap-replay/src/main/java/org/apache/plc4x/java/transport/pcapreplay/PcapReplayTransportConfiguration.java
+++ b/plc4j/drivers/knxnetip/src/main/java/org/apache/plc4x/java/knxnetip/configuration/KnxNetIpUdpTransportConfiguration.java
@@ -7,7 +7,7 @@
  * "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
+ *   http://www.apache.org/licenses/LICENSE-2.0
  *
  * Unless required by applicable law or agreed to in writing,
  * software distributed under the License is distributed on an
@@ -16,19 +16,17 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.plc4x.java.transport.pcapreplay;
 
-import org.apache.plc4x.java.transport.pcap.PcapTransportConfiguration;
+package org.apache.plc4x.java.knxnetip.configuration;
 
-public interface PcapReplayTransportConfiguration extends PcapTransportConfiguration {
+import org.apache.plc4x.java.knxnetip.KnxNetIpDriver;
+import org.apache.plc4x.java.transport.udp.DefaultUdpTransportConfiguration;
 
-    default float getReplaySpeedFactor() {
-        return 1;
-    }
+public class KnxNetIpUdpTransportConfiguration extends DefaultUdpTransportConfiguration {
 
-    default boolean isLoop() {
-        return false;
+    @Override
+    public int getDefaultPort() {
+        return KnxNetIpDriver.KNXNET_IP_PORT;
     }
 
-    default String getFilter() { return "";}
 }
diff --git a/plc4j/drivers/modbus/pom.xml b/plc4j/drivers/modbus/pom.xml
index 216908e72b..d4ff9d7bf9 100644
--- a/plc4j/drivers/modbus/pom.xml
+++ b/plc4j/drivers/modbus/pom.xml
@@ -102,7 +102,6 @@
         <artifactId>maven-dependency-plugin</artifactId>
         <configuration>
           <usedDependencies combine.children="append">
-            <usedDependency>org.apache.plc4x:plc4j-transport-serial</usedDependency>
             <usedDependency>org.apache.plc4x:plc4j-transport-raw-socket</usedDependency>
             <usedDependency>org.apache.plc4x:plc4x-code-generation-language-java</usedDependency>
             <usedDependency>org.apache.plc4x:plc4x-protocols-modbus</usedDependency>
diff --git a/plc4j/drivers/modbus/src/main/java/org/apache/plc4x/java/modbus/ascii/config/ModbusAsciiConfiguration.java b/plc4j/drivers/modbus/src/main/java/org/apache/plc4x/java/modbus/ascii/config/ModbusAsciiConfiguration.java
index 7f89832adc..be89759c48 100644
--- a/plc4j/drivers/modbus/src/main/java/org/apache/plc4x/java/modbus/ascii/config/ModbusAsciiConfiguration.java
+++ b/plc4j/drivers/modbus/src/main/java/org/apache/plc4x/java/modbus/ascii/config/ModbusAsciiConfiguration.java
@@ -18,13 +18,16 @@
  */
 package org.apache.plc4x.java.modbus.ascii.config;
 
-import org.apache.plc4x.java.modbus.readwrite.ModbusConstants;
+import org.apache.plc4x.java.modbus.tcp.config.ModbusTcpTransportConfiguration;
 import org.apache.plc4x.java.spi.configuration.Configuration;
+import org.apache.plc4x.java.spi.configuration.annotations.ComplexConfigurationParameter;
 import org.apache.plc4x.java.spi.configuration.annotations.ConfigurationParameter;
 import org.apache.plc4x.java.spi.configuration.annotations.defaults.IntDefaultValue;
-import org.apache.plc4x.java.transport.tcp.TcpTransportConfiguration;
+import org.apache.plc4x.java.spi.transport.TransportConfiguration;
+import org.apache.plc4x.java.spi.transport.TransportConfigurationProvider;
+import org.apache.plc4x.java.transport.serial.DefaultSerialTransportConfiguration;
 
-public class ModbusAsciiConfiguration implements Configuration, TcpTransportConfiguration {
+public class ModbusAsciiConfiguration implements Configuration, TransportConfigurationProvider {
 
     @ConfigurationParameter("request-timeout")
     @IntDefaultValue(5_000)
@@ -34,6 +37,12 @@ public class ModbusAsciiConfiguration implements Configuration, TcpTransportConf
     @IntDefaultValue(1)
     private int unitIdentifier;
 
+    @ComplexConfigurationParameter(prefix = "tcp", defaultOverrides = {}, requiredOverrides = {})
+    private ModbusTcpTransportConfiguration tcpTransportConfiguration;
+
+    @ComplexConfigurationParameter(prefix = "serial", defaultOverrides = {}, requiredOverrides = {})
+    private DefaultSerialTransportConfiguration serialTransportConfiguration;
+
     public int getRequestTimeout() {
         return requestTimeout;
     }
@@ -50,9 +59,31 @@ public class ModbusAsciiConfiguration implements Configuration, TcpTransportConf
         this.unitIdentifier = unitIdentifier;
     }
 
+    public ModbusTcpTransportConfiguration getTcpTransportConfiguration() {
+        return tcpTransportConfiguration;
+    }
+
+    public void setTcpTransportConfiguration(ModbusTcpTransportConfiguration tcpTransportConfiguration) {
+        this.tcpTransportConfiguration = tcpTransportConfiguration;
+    }
+
+    public DefaultSerialTransportConfiguration getSerialTransportConfiguration() {
+        return serialTransportConfiguration;
+    }
+
+    public void setSerialTransportConfiguration(DefaultSerialTransportConfiguration serialTransportConfiguration) {
+        this.serialTransportConfiguration = serialTransportConfiguration;
+    }
+
     @Override
-    public int getDefaultPort() {
-        return ModbusConstants.MODBUSTCPDEFAULTPORT;
+    public TransportConfiguration getTransportConfiguration(String transportCode) {
+        switch (transportCode) {
+            case "tcp":
+                return tcpTransportConfiguration;
+            case "serial":
+                return serialTransportConfiguration;
+        }
+        return null;
     }
 
     @Override
diff --git a/plc4j/drivers/modbus/src/main/java/org/apache/plc4x/java/modbus/rtu/config/ModbusRtuConfiguration.java b/plc4j/drivers/modbus/src/main/java/org/apache/plc4x/java/modbus/rtu/config/ModbusRtuConfiguration.java
index 8fd01427d7..4af23227c6 100644
--- a/plc4j/drivers/modbus/src/main/java/org/apache/plc4x/java/modbus/rtu/config/ModbusRtuConfiguration.java
+++ b/plc4j/drivers/modbus/src/main/java/org/apache/plc4x/java/modbus/rtu/config/ModbusRtuConfiguration.java
@@ -18,13 +18,16 @@
  */
 package org.apache.plc4x.java.modbus.rtu.config;
 
-import org.apache.plc4x.java.modbus.readwrite.ModbusConstants;
+import org.apache.plc4x.java.modbus.tcp.config.ModbusTcpTransportConfiguration;
 import org.apache.plc4x.java.spi.configuration.Configuration;
+import org.apache.plc4x.java.spi.configuration.annotations.ComplexConfigurationParameter;
 import org.apache.plc4x.java.spi.configuration.annotations.ConfigurationParameter;
 import org.apache.plc4x.java.spi.configuration.annotations.defaults.IntDefaultValue;
-import org.apache.plc4x.java.transport.tcp.TcpTransportConfiguration;
+import org.apache.plc4x.java.spi.transport.TransportConfiguration;
+import org.apache.plc4x.java.spi.transport.TransportConfigurationProvider;
+import org.apache.plc4x.java.transport.serial.DefaultSerialTransportConfiguration;
 
-public class ModbusRtuConfiguration implements Configuration, TcpTransportConfiguration {
+public class ModbusRtuConfiguration implements Configuration, TransportConfigurationProvider {
 
     @ConfigurationParameter("request-timeout")
     @IntDefaultValue(5_000)
@@ -34,6 +37,12 @@ public class ModbusRtuConfiguration implements Configuration, TcpTransportConfig
     @IntDefaultValue(1)
     private int unitIdentifier;
 
+    @ComplexConfigurationParameter(prefix = "tcp", defaultOverrides = {}, requiredOverrides = {})
+    private ModbusTcpTransportConfiguration tcpTransportConfiguration;
+
+    @ComplexConfigurationParameter(prefix = "serial", defaultOverrides = {}, requiredOverrides = {})
+    private DefaultSerialTransportConfiguration serialTransportConfiguration;
+
     public int getRequestTimeout() {
         return requestTimeout;
     }
@@ -50,9 +59,31 @@ public class ModbusRtuConfiguration implements Configuration, TcpTransportConfig
         this.unitIdentifier = unitIdentifier;
     }
 
+    public ModbusTcpTransportConfiguration getTcpTransportConfiguration() {
+        return tcpTransportConfiguration;
+    }
+
+    public void setTcpTransportConfiguration(ModbusTcpTransportConfiguration tcpTransportConfiguration) {
+        this.tcpTransportConfiguration = tcpTransportConfiguration;
+    }
+
+    public DefaultSerialTransportConfiguration getSerialTransportConfiguration() {
+        return serialTransportConfiguration;
+    }
+
+    public void setSerialTransportConfiguration(DefaultSerialTransportConfiguration serialTransportConfiguration) {
+        this.serialTransportConfiguration = serialTransportConfiguration;
+    }
+
     @Override
-    public int getDefaultPort() {
-        return ModbusConstants.MODBUSTCPDEFAULTPORT;
+    public TransportConfiguration getTransportConfiguration(String transportCode) {
+        switch (transportCode) {
+            case "tcp":
+                return tcpTransportConfiguration;
+            case "serial":
+                return serialTransportConfiguration;
+        }
+        return null;
     }
 
     @Override
diff --git a/plc4j/drivers/modbus/src/main/java/org/apache/plc4x/java/modbus/tcp/config/ModbusTcpConfiguration.java b/plc4j/drivers/modbus/src/main/java/org/apache/plc4x/java/modbus/tcp/config/ModbusTcpConfiguration.java
index 0a7d4a477d..da68706d20 100644
--- a/plc4j/drivers/modbus/src/main/java/org/apache/plc4x/java/modbus/tcp/config/ModbusTcpConfiguration.java
+++ b/plc4j/drivers/modbus/src/main/java/org/apache/plc4x/java/modbus/tcp/config/ModbusTcpConfiguration.java
@@ -18,13 +18,14 @@
  */
 package org.apache.plc4x.java.modbus.tcp.config;
 
-import org.apache.plc4x.java.modbus.readwrite.ModbusConstants;
 import org.apache.plc4x.java.spi.configuration.Configuration;
+import org.apache.plc4x.java.spi.configuration.annotations.ComplexConfigurationParameter;
 import org.apache.plc4x.java.spi.configuration.annotations.ConfigurationParameter;
 import org.apache.plc4x.java.spi.configuration.annotations.defaults.IntDefaultValue;
-import org.apache.plc4x.java.transport.tcp.TcpTransportConfiguration;
+import org.apache.plc4x.java.spi.transport.TransportConfiguration;
+import org.apache.plc4x.java.spi.transport.TransportConfigurationProvider;
 
-public class ModbusTcpConfiguration implements Configuration, TcpTransportConfiguration {
+public class ModbusTcpConfiguration implements Configuration, TransportConfigurationProvider {
 
     @ConfigurationParameter("request-timeout")
     @IntDefaultValue(5_000)
@@ -34,6 +35,9 @@ public class ModbusTcpConfiguration implements Configuration, TcpTransportConfig
     @IntDefaultValue(1)
     private int unitIdentifier;
 
+    @ComplexConfigurationParameter(prefix = "tcp", defaultOverrides = {}, requiredOverrides = {})
+    private ModbusTcpTransportConfiguration tcpTransportConfiguration;
+
     public int getRequestTimeout() {
         return requestTimeout;
     }
@@ -50,9 +54,21 @@ public class ModbusTcpConfiguration implements Configuration, TcpTransportConfig
         this.unitIdentifier = unitIdentifier;
     }
 
+    public ModbusTcpTransportConfiguration getTcpTransportConfiguration() {
+        return tcpTransportConfiguration;
+    }
+
+    public void setTcpTransportConfiguration(ModbusTcpTransportConfiguration tcpTransportConfiguration) {
+        this.tcpTransportConfiguration = tcpTransportConfiguration;
+    }
+
     @Override
-    public int getDefaultPort() {
-        return ModbusConstants.MODBUSTCPDEFAULTPORT;
+    public TransportConfiguration getTransportConfiguration(String transportCode) {
+        switch (transportCode) {
+            case "tcp":
+                return tcpTransportConfiguration;
+        }
+        return null;
     }
 
     @Override
diff --git a/plc4j/transports/pcap-replay/src/main/java/org/apache/plc4x/java/transport/pcapreplay/PcapReplayTransportConfiguration.java b/plc4j/drivers/modbus/src/main/java/org/apache/plc4x/java/modbus/tcp/config/ModbusTcpTransportConfiguration.java
similarity index 64%
copy from plc4j/transports/pcap-replay/src/main/java/org/apache/plc4x/java/transport/pcapreplay/PcapReplayTransportConfiguration.java
copy to plc4j/drivers/modbus/src/main/java/org/apache/plc4x/java/modbus/tcp/config/ModbusTcpTransportConfiguration.java
index fe08010f72..a2d649ea3c 100644
--- a/plc4j/transports/pcap-replay/src/main/java/org/apache/plc4x/java/transport/pcapreplay/PcapReplayTransportConfiguration.java
+++ b/plc4j/drivers/modbus/src/main/java/org/apache/plc4x/java/modbus/tcp/config/ModbusTcpTransportConfiguration.java
@@ -7,7 +7,7 @@
  * "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
+ *   http://www.apache.org/licenses/LICENSE-2.0
  *
  * Unless required by applicable law or agreed to in writing,
  * software distributed under the License is distributed on an
@@ -16,19 +16,17 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.plc4x.java.transport.pcapreplay;
 
-import org.apache.plc4x.java.transport.pcap.PcapTransportConfiguration;
+package org.apache.plc4x.java.modbus.tcp.config;
 
-public interface PcapReplayTransportConfiguration extends PcapTransportConfiguration {
+import org.apache.plc4x.java.modbus.readwrite.ModbusConstants;
+import org.apache.plc4x.java.transport.tcp.DefaultTcpTransportConfiguration;
 
-    default float getReplaySpeedFactor() {
-        return 1;
-    }
+public class ModbusTcpTransportConfiguration extends DefaultTcpTransportConfiguration {
 
-    default boolean isLoop() {
-        return false;
+    @Override
+    public int getDefaultPort() {
+        return ModbusConstants.MODBUSTCPDEFAULTPORT;
     }
 
-    default String getFilter() { return "";}
 }
diff --git a/plc4j/drivers/opcua/src/main/java/org/apache/plc4x/java/opcua/config/OpcuaConfiguration.java b/plc4j/drivers/opcua/src/main/java/org/apache/plc4x/java/opcua/config/OpcuaConfiguration.java
index 4905694a4e..a34784dcc8 100644
--- a/plc4j/drivers/opcua/src/main/java/org/apache/plc4x/java/opcua/config/OpcuaConfiguration.java
+++ b/plc4j/drivers/opcua/src/main/java/org/apache/plc4x/java/opcua/config/OpcuaConfiguration.java
@@ -19,12 +19,15 @@
 package org.apache.plc4x.java.opcua.config;
 
 import org.apache.plc4x.java.spi.configuration.Configuration;
+import org.apache.plc4x.java.spi.configuration.annotations.ComplexConfigurationParameter;
 import org.apache.plc4x.java.spi.configuration.annotations.ConfigurationParameter;
 import org.apache.plc4x.java.spi.configuration.annotations.defaults.BooleanDefaultValue;
 import org.apache.plc4x.java.spi.configuration.annotations.defaults.StringDefaultValue;
-import org.apache.plc4x.java.transport.tcp.TcpTransportConfiguration;
+import org.apache.plc4x.java.spi.transport.TransportConfiguration;
+import org.apache.plc4x.java.spi.transport.TransportConfigurationProvider;
+import org.apache.plc4x.java.transport.tcp.DefaultTcpTransportConfiguration;
 
-public class OpcuaConfiguration implements Configuration, TcpTransportConfiguration {
+public class OpcuaConfiguration implements Configuration, TransportConfigurationProvider {
 
     @ConfigurationParameter("protocolCode")
     private String protocolCode;
@@ -58,6 +61,9 @@ public class OpcuaConfiguration implements Configuration, TcpTransportConfigurat
     @ConfigurationParameter("keyStorePassword")
     private String keyStorePassword;
 
+    @ComplexConfigurationParameter(prefix = "tcp", defaultOverrides = {}, requiredOverrides = {})
+    private DefaultTcpTransportConfiguration tcpTransportConfiguration;
+
     public String getProtocolCode() {
         return protocolCode;
     }
@@ -98,6 +104,22 @@ public class OpcuaConfiguration implements Configuration, TcpTransportConfigurat
         return keyStorePassword;
     }
 
+    public DefaultTcpTransportConfiguration getTcpTransportConfiguration() {
+        return tcpTransportConfiguration;
+    }
+
+    public void setTcpTransportConfiguration(DefaultTcpTransportConfiguration tcpTransportConfiguration) {
+        this.tcpTransportConfiguration = tcpTransportConfiguration;
+    }
+
+    @Override
+    public TransportConfiguration getTransportConfiguration(String transportCode) {
+        switch (transportCode) {
+            case "tcp":
+                return tcpTransportConfiguration;
+        }
+        return null;
+    }
 
     @Override
     public String toString() {
diff --git a/plc4j/drivers/open-protocol/src/main/java/org/apache/plc4x/java/openprotocol/config/OpenProtocolConfiguration.java b/plc4j/drivers/open-protocol/src/main/java/org/apache/plc4x/java/openprotocol/config/OpenProtocolConfiguration.java
index 18252b2a3a..6b00c0f66a 100644
--- a/plc4j/drivers/open-protocol/src/main/java/org/apache/plc4x/java/openprotocol/config/OpenProtocolConfiguration.java
+++ b/plc4j/drivers/open-protocol/src/main/java/org/apache/plc4x/java/openprotocol/config/OpenProtocolConfiguration.java
@@ -18,15 +18,31 @@
  */
 package org.apache.plc4x.java.openprotocol.config;
 
-import org.apache.plc4x.java.openprotocol.readwrite.Constants;
 import org.apache.plc4x.java.spi.configuration.Configuration;
-import org.apache.plc4x.java.transport.tcp.TcpTransportConfiguration;
+import org.apache.plc4x.java.spi.configuration.annotations.ComplexConfigurationParameter;
+import org.apache.plc4x.java.spi.transport.TransportConfiguration;
+import org.apache.plc4x.java.spi.transport.TransportConfigurationProvider;
 
-public class OpenProtocolConfiguration implements Configuration, TcpTransportConfiguration {
+public class OpenProtocolConfiguration implements Configuration, TransportConfigurationProvider {
+
+    @ComplexConfigurationParameter(prefix = "tcp", defaultOverrides = {}, requiredOverrides = {})
+    private OpenProtocolTcpTransportConfiguration tcpTransportConfiguration;
+
+    public OpenProtocolTcpTransportConfiguration getTcpTransportConfiguration() {
+        return tcpTransportConfiguration;
+    }
+
+    public void setTcpTransportConfiguration(OpenProtocolTcpTransportConfiguration tcpTransportConfiguration) {
+        this.tcpTransportConfiguration = tcpTransportConfiguration;
+    }
 
     @Override
-    public int getDefaultPort() {
-        return Constants.TCPDEFAULTPORT;
+    public TransportConfiguration getTransportConfiguration(String transportCode) {
+        switch (transportCode) {
+            case "tcp":
+                return tcpTransportConfiguration;
+        }
+        return null;
     }
 
     @Override
diff --git a/plc4j/drivers/open-protocol/src/main/java/org/apache/plc4x/java/openprotocol/config/OpenProtocolConfiguration.java b/plc4j/drivers/open-protocol/src/main/java/org/apache/plc4x/java/openprotocol/config/OpenProtocolTcpTransportConfiguration.java
similarity index 71%
copy from plc4j/drivers/open-protocol/src/main/java/org/apache/plc4x/java/openprotocol/config/OpenProtocolConfiguration.java
copy to plc4j/drivers/open-protocol/src/main/java/org/apache/plc4x/java/openprotocol/config/OpenProtocolTcpTransportConfiguration.java
index 18252b2a3a..fd1303c1d2 100644
--- a/plc4j/drivers/open-protocol/src/main/java/org/apache/plc4x/java/openprotocol/config/OpenProtocolConfiguration.java
+++ b/plc4j/drivers/open-protocol/src/main/java/org/apache/plc4x/java/openprotocol/config/OpenProtocolTcpTransportConfiguration.java
@@ -7,7 +7,7 @@
  * "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
+ *   http://www.apache.org/licenses/LICENSE-2.0
  *
  * Unless required by applicable law or agreed to in writing,
  * software distributed under the License is distributed on an
@@ -16,23 +16,17 @@
  * specific language governing permissions and limitations
  * under the License.
  */
+
 package org.apache.plc4x.java.openprotocol.config;
 
 import org.apache.plc4x.java.openprotocol.readwrite.Constants;
-import org.apache.plc4x.java.spi.configuration.Configuration;
-import org.apache.plc4x.java.transport.tcp.TcpTransportConfiguration;
+import org.apache.plc4x.java.transport.tcp.DefaultTcpTransportConfiguration;
 
-public class OpenProtocolConfiguration implements Configuration, TcpTransportConfiguration {
+public class OpenProtocolTcpTransportConfiguration extends DefaultTcpTransportConfiguration {
 
     @Override
     public int getDefaultPort() {
         return Constants.TCPDEFAULTPORT;
     }
 
-    @Override
-    public String toString() {
-        return "OpenProtocolConfiguration{" +
-            '}';
-    }
-
 }
diff --git a/plc4j/drivers/plc4x/src/main/java/org/apache/plc4x/java/plc4x/config/Plc4xConfiguration.java b/plc4j/drivers/plc4x/src/main/java/org/apache/plc4x/java/plc4x/config/Plc4xConfiguration.java
index e869e046ca..9f8ffcf7a7 100644
--- a/plc4j/drivers/plc4x/src/main/java/org/apache/plc4x/java/plc4x/config/Plc4xConfiguration.java
+++ b/plc4j/drivers/plc4x/src/main/java/org/apache/plc4x/java/plc4x/config/Plc4xConfiguration.java
@@ -18,13 +18,14 @@
  */
 package org.apache.plc4x.java.plc4x.config;
 
-import org.apache.plc4x.java.plc4x.readwrite.Plc4xConstants;
 import org.apache.plc4x.java.spi.configuration.Configuration;
+import org.apache.plc4x.java.spi.configuration.annotations.ComplexConfigurationParameter;
 import org.apache.plc4x.java.spi.configuration.annotations.ConfigurationParameter;
 import org.apache.plc4x.java.spi.configuration.annotations.defaults.IntDefaultValue;
-import org.apache.plc4x.java.transport.tcp.TcpTransportConfiguration;
+import org.apache.plc4x.java.spi.transport.TransportConfiguration;
+import org.apache.plc4x.java.spi.transport.TransportConfigurationProvider;
 
-public class Plc4xConfiguration implements Configuration, TcpTransportConfiguration {
+public class Plc4xConfiguration implements Configuration, TransportConfigurationProvider {
 
     @ConfigurationParameter("remote-connection-string")
     private String remoteConnectionString;
@@ -33,6 +34,9 @@ public class Plc4xConfiguration implements Configuration, TcpTransportConfigurat
     @IntDefaultValue(5_000)
     private int requestTimeout;
 
+    @ComplexConfigurationParameter(prefix = "tcp", defaultOverrides = {}, requiredOverrides = {})
+    private Plc4xTcpTransportConfiguration tcpTransportConfiguration;
+
     public String getRemoteConnectionString() {
         return remoteConnectionString;
     }
@@ -49,9 +53,21 @@ public class Plc4xConfiguration implements Configuration, TcpTransportConfigurat
         this.requestTimeout = requestTimeout;
     }
 
+    public Plc4xTcpTransportConfiguration getTcpTransportConfiguration() {
+        return tcpTransportConfiguration;
+    }
+
+    public void setTcpTransportConfiguration(Plc4xTcpTransportConfiguration tcpTransportConfiguration) {
+        this.tcpTransportConfiguration = tcpTransportConfiguration;
+    }
+
     @Override
-    public int getDefaultPort() {
-        return Plc4xConstants.PLC4XTCPDEFAULTPORT;
+    public TransportConfiguration getTransportConfiguration(String transportCode) {
+        switch (transportCode) {
+            case "tcp":
+                return tcpTransportConfiguration;
+        }
+        return null;
     }
 
 }
diff --git a/plc4j/transports/pcap-replay/src/main/java/org/apache/plc4x/java/transport/pcapreplay/PcapReplayTransportConfiguration.java b/plc4j/drivers/plc4x/src/main/java/org/apache/plc4x/java/plc4x/config/Plc4xTcpTransportConfiguration.java
similarity index 66%
copy from plc4j/transports/pcap-replay/src/main/java/org/apache/plc4x/java/transport/pcapreplay/PcapReplayTransportConfiguration.java
copy to plc4j/drivers/plc4x/src/main/java/org/apache/plc4x/java/plc4x/config/Plc4xTcpTransportConfiguration.java
index fe08010f72..5f7c4a20c6 100644
--- a/plc4j/transports/pcap-replay/src/main/java/org/apache/plc4x/java/transport/pcapreplay/PcapReplayTransportConfiguration.java
+++ b/plc4j/drivers/plc4x/src/main/java/org/apache/plc4x/java/plc4x/config/Plc4xTcpTransportConfiguration.java
@@ -7,7 +7,7 @@
  * "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
+ *   http://www.apache.org/licenses/LICENSE-2.0
  *
  * Unless required by applicable law or agreed to in writing,
  * software distributed under the License is distributed on an
@@ -16,19 +16,17 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.plc4x.java.transport.pcapreplay;
 
-import org.apache.plc4x.java.transport.pcap.PcapTransportConfiguration;
+package org.apache.plc4x.java.plc4x.config;
 
-public interface PcapReplayTransportConfiguration extends PcapTransportConfiguration {
+import org.apache.plc4x.java.plc4x.readwrite.Plc4xConstants;
+import org.apache.plc4x.java.transport.tcp.DefaultTcpTransportConfiguration;
 
-    default float getReplaySpeedFactor() {
-        return 1;
-    }
+public class Plc4xTcpTransportConfiguration extends DefaultTcpTransportConfiguration {
 
-    default boolean isLoop() {
-        return false;
+    @Override
+    public int getDefaultPort() {
+        return Plc4xConstants.PLC4XTCPDEFAULTPORT;
     }
 
-    default String getFilter() { return "";}
 }
diff --git a/plc4j/drivers/profinet-ng/src/main/java/org/apache/plc4x/java/profinet/config/ProfinetConfiguration.java b/plc4j/drivers/profinet-ng/src/main/java/org/apache/plc4x/java/profinet/config/ProfinetConfiguration.java
index fbaa23a9cd..7744c3221f 100644
--- a/plc4j/drivers/profinet-ng/src/main/java/org/apache/plc4x/java/profinet/config/ProfinetConfiguration.java
+++ b/plc4j/drivers/profinet-ng/src/main/java/org/apache/plc4x/java/profinet/config/ProfinetConfiguration.java
@@ -22,11 +22,13 @@ package org.apache.plc4x.java.profinet.config;
 import com.fasterxml.jackson.dataformat.xml.XmlMapper;
 import org.apache.plc4x.java.profinet.gsdml.ProfinetISO15745Profile;
 import org.apache.plc4x.java.spi.configuration.Configuration;
+import org.apache.plc4x.java.spi.configuration.annotations.ComplexConfigurationParameter;
+import org.apache.plc4x.java.spi.configuration.annotations.ComplexConfigurationParameterDefaultOverride;
 import org.apache.plc4x.java.spi.configuration.annotations.ConfigurationParameter;
 import org.apache.plc4x.java.spi.configuration.annotations.Required;
 import org.apache.plc4x.java.spi.configuration.annotations.defaults.StringDefaultValue;
-import org.apache.plc4x.java.transport.rawsocket.RawSocketTransportConfiguration;
-import org.apache.plc4x.java.utils.pcap.netty.handlers.PacketHandler;
+import org.apache.plc4x.java.spi.transport.TransportConfiguration;
+import org.apache.plc4x.java.spi.transport.TransportConfigurationProvider;
 
 import java.io.IOException;
 import java.nio.file.DirectoryStream;
@@ -34,7 +36,7 @@ import java.nio.file.Files;
 import java.nio.file.Path;
 import java.nio.file.Paths;
 
-public class ProfinetConfiguration implements Configuration, RawSocketTransportConfiguration {
+public class ProfinetConfiguration implements Configuration, TransportConfigurationProvider {
 
     @Required
     @ConfigurationParameter("gsd-directory")
@@ -44,29 +46,17 @@ public class ProfinetConfiguration implements Configuration, RawSocketTransportC
     @ConfigurationParameter("dap-id")
     public String dapId;
 
-    @Override
-    public boolean getSupportVlans() {
-        return RawSocketTransportConfiguration.super.getSupportVlans();
-    }
-
-    @Override
-    public int getDefaultPort() {
-        return 34964;
-    }
-
-    @Override
-    public Integer getProtocolId() {
-        return RawSocketTransportConfiguration.super.getProtocolId();
-    }
+    @ComplexConfigurationParameter(prefix = "raw", defaultOverrides = {
+        @ComplexConfigurationParameterDefaultOverride(name = "resolve-mac-address", value = "true")
+    }, requiredOverrides = {})
+    private ProfinetRawSocketTransportConfiguration rawSocketTransportConfiguration;
 
-    @Override
-    public PacketHandler getPcapPacketHandler() {
-        return null;
+    public ProfinetRawSocketTransportConfiguration getRawSocketTransportConfiguration() {
+        return rawSocketTransportConfiguration;
     }
 
-    @Override
-    public boolean isResolveMacAccess() {
-        return true;
+    public void setRawSocketTransportConfiguration(ProfinetRawSocketTransportConfiguration rawSocketTransportConfiguration) {
+        this.rawSocketTransportConfiguration = rawSocketTransportConfiguration;
     }
 
     public ProfinetISO15745Profile getGsdProfile(int vendorId, int deviceId) {
@@ -108,4 +98,13 @@ public class ProfinetConfiguration implements Configuration, RawSocketTransportC
         return null;
     }
 
+    @Override
+    public TransportConfiguration getTransportConfiguration(String transportCode) {
+        switch (transportCode) {
+            case "raw":
+                return rawSocketTransportConfiguration;
+        }
+        return null;
+    }
+
 }
diff --git a/plc4j/drivers/open-protocol/src/main/java/org/apache/plc4x/java/openprotocol/config/OpenProtocolConfiguration.java b/plc4j/drivers/profinet-ng/src/main/java/org/apache/plc4x/java/profinet/config/ProfinetRawSocketTransportConfiguration.java
similarity index 61%
copy from plc4j/drivers/open-protocol/src/main/java/org/apache/plc4x/java/openprotocol/config/OpenProtocolConfiguration.java
copy to plc4j/drivers/profinet-ng/src/main/java/org/apache/plc4x/java/profinet/config/ProfinetRawSocketTransportConfiguration.java
index 18252b2a3a..b1a7deaa4f 100644
--- a/plc4j/drivers/open-protocol/src/main/java/org/apache/plc4x/java/openprotocol/config/OpenProtocolConfiguration.java
+++ b/plc4j/drivers/profinet-ng/src/main/java/org/apache/plc4x/java/profinet/config/ProfinetRawSocketTransportConfiguration.java
@@ -7,7 +7,7 @@
  * "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
+ *   http://www.apache.org/licenses/LICENSE-2.0
  *
  * Unless required by applicable law or agreed to in writing,
  * software distributed under the License is distributed on an
@@ -16,23 +16,22 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.plc4x.java.openprotocol.config;
 
-import org.apache.plc4x.java.openprotocol.readwrite.Constants;
-import org.apache.plc4x.java.spi.configuration.Configuration;
-import org.apache.plc4x.java.transport.tcp.TcpTransportConfiguration;
+package org.apache.plc4x.java.profinet.config;
 
-public class OpenProtocolConfiguration implements Configuration, TcpTransportConfiguration {
+import org.apache.plc4x.java.transport.rawsocket.DefaultRawSocketTransportConfiguration;
+import org.apache.plc4x.java.utils.pcap.netty.handlers.PacketHandler;
+
+public class ProfinetRawSocketTransportConfiguration extends DefaultRawSocketTransportConfiguration {
 
     @Override
     public int getDefaultPort() {
-        return Constants.TCPDEFAULTPORT;
+        return 34964;
     }
 
     @Override
-    public String toString() {
-        return "OpenProtocolConfiguration{" +
-            '}';
+    public PacketHandler getPcapPacketHandler() {
+        return null;
     }
 
 }
diff --git a/plc4j/drivers/profinet/src/main/java/org/apache/plc4x/java/profinet/config/ProfinetConfiguration.java b/plc4j/drivers/profinet/src/main/java/org/apache/plc4x/java/profinet/config/ProfinetConfiguration.java
index 040da32943..48a7f7b3fe 100644
--- a/plc4j/drivers/profinet/src/main/java/org/apache/plc4x/java/profinet/config/ProfinetConfiguration.java
+++ b/plc4j/drivers/profinet/src/main/java/org/apache/plc4x/java/profinet/config/ProfinetConfiguration.java
@@ -23,12 +23,10 @@ import org.apache.plc4x.java.profinet.device.GsdFileMap;
 import org.apache.plc4x.java.profinet.gsdml.ProfinetISO15745Profile;
 import org.apache.plc4x.java.spi.configuration.Configuration;
 import org.apache.plc4x.java.spi.configuration.ConfigurationParameterConverter;
-import org.apache.plc4x.java.spi.configuration.annotations.ConfigurationParameter;
-import org.apache.plc4x.java.spi.configuration.annotations.ParameterConverter;
-import org.apache.plc4x.java.spi.configuration.annotations.Required;
+import org.apache.plc4x.java.spi.configuration.annotations.*;
 import org.apache.plc4x.java.spi.configuration.annotations.defaults.IntDefaultValue;
-import org.apache.plc4x.java.transport.rawsocket.RawSocketTransportConfiguration;
-import org.apache.plc4x.java.utils.pcap.netty.handlers.PacketHandler;
+import org.apache.plc4x.java.spi.transport.TransportConfiguration;
+import org.apache.plc4x.java.spi.transport.TransportConfigurationProvider;
 
 import java.io.IOException;
 import java.nio.file.DirectoryStream;
@@ -40,27 +38,7 @@ import java.util.Map;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 
-public class ProfinetConfiguration implements Configuration, RawSocketTransportConfiguration {
-
-    @Override
-    public boolean getSupportVlans() {
-        return RawSocketTransportConfiguration.super.getSupportVlans();
-    }
-
-    @Override
-    public int getDefaultPort() {
-        return 34964;
-    }
-
-    @Override
-    public Integer getProtocolId() {
-        return RawSocketTransportConfiguration.super.getProtocolId();
-    }
-
-    @Override
-    public PacketHandler getPcapPacketHandler() {
-        return null;
-    }
+public class ProfinetConfiguration implements Configuration, TransportConfigurationProvider {
 
     @Required
     @ConfigurationParameter
@@ -88,6 +66,19 @@ public class ProfinetConfiguration implements Configuration, RawSocketTransportC
     @IntDefaultValue(50)
     private int dataHoldFactor;
 
+    @ComplexConfigurationParameter(prefix = "raw", defaultOverrides = {
+        @ComplexConfigurationParameterDefaultOverride(name = "resolve-mac-address", value = "true")
+    }, requiredOverrides = {})
+    private ProfinetRawSocketTransportConfiguration rawSocketTransportConfiguration;
+
+    public ProfinetRawSocketTransportConfiguration getRawSocketTransportConfiguration() {
+        return rawSocketTransportConfiguration;
+    }
+
+    public void setRawSocketTransportConfiguration(ProfinetRawSocketTransportConfiguration rawSocketTransportConfiguration) {
+        this.rawSocketTransportConfiguration = rawSocketTransportConfiguration;
+    }
+
     public static class ProfinetDeviceConvertor implements ConfigurationParameterConverter<ProfinetDevices> {
 
         public static final String DEVICE_STRING = "((?<devicename>[\\w- ]+)[, ]+(?<deviceaccess>[\\w ]+)[, ]+\\((?<submodules>[\\w, ]*)\\)[, ]*(?<ipaddress>\\d+\\.\\d+\\.\\d+\\.\\d+)?)";
@@ -203,6 +194,15 @@ public class ProfinetConfiguration implements Configuration, RawSocketTransportC
         return gsdFiles;
     }
 
+    @Override
+    public TransportConfiguration getTransportConfiguration(String transportCode) {
+        switch (transportCode) {
+            case "raw":
+                return rawSocketTransportConfiguration;
+        }
+        return null;
+    }
+
     @Override
     public String toString() {
         return "Configuration{" +
diff --git a/plc4j/drivers/open-protocol/src/main/java/org/apache/plc4x/java/openprotocol/config/OpenProtocolConfiguration.java b/plc4j/drivers/profinet/src/main/java/org/apache/plc4x/java/profinet/config/ProfinetRawSocketTransportConfiguration.java
similarity index 61%
copy from plc4j/drivers/open-protocol/src/main/java/org/apache/plc4x/java/openprotocol/config/OpenProtocolConfiguration.java
copy to plc4j/drivers/profinet/src/main/java/org/apache/plc4x/java/profinet/config/ProfinetRawSocketTransportConfiguration.java
index 18252b2a3a..b1a7deaa4f 100644
--- a/plc4j/drivers/open-protocol/src/main/java/org/apache/plc4x/java/openprotocol/config/OpenProtocolConfiguration.java
+++ b/plc4j/drivers/profinet/src/main/java/org/apache/plc4x/java/profinet/config/ProfinetRawSocketTransportConfiguration.java
@@ -7,7 +7,7 @@
  * "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
+ *   http://www.apache.org/licenses/LICENSE-2.0
  *
  * Unless required by applicable law or agreed to in writing,
  * software distributed under the License is distributed on an
@@ -16,23 +16,22 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.plc4x.java.openprotocol.config;
 
-import org.apache.plc4x.java.openprotocol.readwrite.Constants;
-import org.apache.plc4x.java.spi.configuration.Configuration;
-import org.apache.plc4x.java.transport.tcp.TcpTransportConfiguration;
+package org.apache.plc4x.java.profinet.config;
 
-public class OpenProtocolConfiguration implements Configuration, TcpTransportConfiguration {
+import org.apache.plc4x.java.transport.rawsocket.DefaultRawSocketTransportConfiguration;
+import org.apache.plc4x.java.utils.pcap.netty.handlers.PacketHandler;
+
+public class ProfinetRawSocketTransportConfiguration extends DefaultRawSocketTransportConfiguration {
 
     @Override
     public int getDefaultPort() {
-        return Constants.TCPDEFAULTPORT;
+        return 34964;
     }
 
     @Override
-    public String toString() {
-        return "OpenProtocolConfiguration{" +
-            '}';
+    public PacketHandler getPcapPacketHandler() {
+        return null;
     }
 
 }
diff --git a/plc4j/drivers/s7/src/main/java/org/apache/plc4x/java/s7/readwrite/configuration/S7Configuration.java b/plc4j/drivers/s7/src/main/java/org/apache/plc4x/java/s7/readwrite/configuration/S7Configuration.java
index 4a5db34664..5d6db13e9e 100644
--- a/plc4j/drivers/s7/src/main/java/org/apache/plc4x/java/s7/readwrite/configuration/S7Configuration.java
+++ b/plc4j/drivers/s7/src/main/java/org/apache/plc4x/java/s7/readwrite/configuration/S7Configuration.java
@@ -18,14 +18,15 @@
  */
 package org.apache.plc4x.java.s7.readwrite.configuration;
 
-import org.apache.plc4x.java.s7.readwrite.S7Driver;
 import org.apache.plc4x.java.spi.configuration.Configuration;
+import org.apache.plc4x.java.spi.configuration.annotations.ComplexConfigurationParameter;
 import org.apache.plc4x.java.spi.configuration.annotations.ConfigurationParameter;
 import org.apache.plc4x.java.spi.configuration.annotations.defaults.BooleanDefaultValue;
 import org.apache.plc4x.java.spi.configuration.annotations.defaults.IntDefaultValue;
-import org.apache.plc4x.java.transport.tcp.TcpTransportConfiguration;
+import org.apache.plc4x.java.spi.transport.TransportConfiguration;
+import org.apache.plc4x.java.spi.transport.TransportConfigurationProvider;
 
-public class S7Configuration implements Configuration, TcpTransportConfiguration {
+public class S7Configuration implements Configuration, TransportConfigurationProvider {
 
     @ConfigurationParameter("local-rack")
     @IntDefaultValue(1)
@@ -91,6 +92,8 @@ public class S7Configuration implements Configuration, TcpTransportConfiguration
     @IntDefaultValue(4)
     public int retryTime = 4;
 
+    @ComplexConfigurationParameter(prefix = "tcp", defaultOverrides = {}, requiredOverrides = {})
+    private S7TcpTransportConfiguration tcpTransportConfiguration;
 
     public int getLocalRack() {
         return localRack;
@@ -220,15 +223,21 @@ public class S7Configuration implements Configuration, TcpTransportConfiguration
         this.retryTime = retryTime;
     }
 
+    public S7TcpTransportConfiguration getTcpTransportConfiguration() {
+        return tcpTransportConfiguration;
+    }
+
+    public void setTcpTransportConfiguration(S7TcpTransportConfiguration tcpTransportConfiguration) {
+        this.tcpTransportConfiguration = tcpTransportConfiguration;
+    }
 
-    /**
-     * Per default port for the S7 protocol is 102.
-     *
-     * @return 102
-     */
     @Override
-    public int getDefaultPort() {
-        return S7Driver.ISO_ON_TCP_PORT;
+    public TransportConfiguration getTransportConfiguration(String transportCode) {
+        switch (transportCode) {
+            case "tcp":
+                return tcpTransportConfiguration;
+        }
+        return null;
     }
 
     @Override
diff --git a/plc4j/transports/pcap-replay/src/main/java/org/apache/plc4x/java/transport/pcapreplay/PcapReplayTransportConfiguration.java b/plc4j/drivers/s7/src/main/java/org/apache/plc4x/java/s7/readwrite/configuration/S7TcpTransportConfiguration.java
similarity index 64%
copy from plc4j/transports/pcap-replay/src/main/java/org/apache/plc4x/java/transport/pcapreplay/PcapReplayTransportConfiguration.java
copy to plc4j/drivers/s7/src/main/java/org/apache/plc4x/java/s7/readwrite/configuration/S7TcpTransportConfiguration.java
index fe08010f72..84aa408cdf 100644
--- a/plc4j/transports/pcap-replay/src/main/java/org/apache/plc4x/java/transport/pcapreplay/PcapReplayTransportConfiguration.java
+++ b/plc4j/drivers/s7/src/main/java/org/apache/plc4x/java/s7/readwrite/configuration/S7TcpTransportConfiguration.java
@@ -7,7 +7,7 @@
  * "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
+ *   http://www.apache.org/licenses/LICENSE-2.0
  *
  * Unless required by applicable law or agreed to in writing,
  * software distributed under the License is distributed on an
@@ -16,19 +16,17 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.plc4x.java.transport.pcapreplay;
 
-import org.apache.plc4x.java.transport.pcap.PcapTransportConfiguration;
+package org.apache.plc4x.java.s7.readwrite.configuration;
 
-public interface PcapReplayTransportConfiguration extends PcapTransportConfiguration {
+import org.apache.plc4x.java.s7.readwrite.S7Driver;
+import org.apache.plc4x.java.transport.tcp.DefaultTcpTransportConfiguration;
 
-    default float getReplaySpeedFactor() {
-        return 1;
-    }
+public class S7TcpTransportConfiguration extends DefaultTcpTransportConfiguration {
 
-    default boolean isLoop() {
-        return false;
+    @Override
+    public int getDefaultPort() {
+        return S7Driver.ISO_ON_TCP_PORT;
     }
 
-    default String getFilter() { return "";}
 }
diff --git a/plc4j/transports/raw-socket/src/main/java/org/apache/plc4x/java/transport/rawsocket/RawSocketTransportConfiguration.java b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/configuration/annotations/ComplexConfigurationParameter.java
similarity index 61%
copy from plc4j/transports/raw-socket/src/main/java/org/apache/plc4x/java/transport/rawsocket/RawSocketTransportConfiguration.java
copy to plc4j/spi/src/main/java/org/apache/plc4x/java/spi/configuration/annotations/ComplexConfigurationParameter.java
index 4cc17707a5..ca5b916c30 100644
--- a/plc4j/transports/raw-socket/src/main/java/org/apache/plc4x/java/transport/rawsocket/RawSocketTransportConfiguration.java
+++ b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/configuration/annotations/ComplexConfigurationParameter.java
@@ -16,20 +16,21 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.plc4x.java.transport.rawsocket;
+package org.apache.plc4x.java.spi.configuration.annotations;
 
-import org.apache.plc4x.java.transport.pcap.PcapTransportConfiguration;
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
 
-public interface RawSocketTransportConfiguration extends PcapTransportConfiguration {
+@Target(ElementType.FIELD)
+@Retention(RetentionPolicy.RUNTIME)
+public @interface ComplexConfigurationParameter {
 
-    int NO_DEFAULT_PORT = -1;
+    String prefix() default "";
 
-    default int getDefaultPort() {
-        return NO_DEFAULT_PORT;
-    }
+    ComplexConfigurationParameterDefaultOverride[] defaultOverrides();
 
-    default boolean isResolveMacAccess() {
-        return false;
-    }
+    ComplexConfigurationParameterRequiredOverride[] requiredOverrides();
 
 }
diff --git a/plc4j/transports/pcap-replay/src/main/java/org/apache/plc4x/java/transport/pcapreplay/PcapReplayTransportConfiguration.java b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/configuration/annotations/ComplexConfigurationParameterDefaultOverride.java
similarity index 68%
copy from plc4j/transports/pcap-replay/src/main/java/org/apache/plc4x/java/transport/pcapreplay/PcapReplayTransportConfiguration.java
copy to plc4j/spi/src/main/java/org/apache/plc4x/java/spi/configuration/annotations/ComplexConfigurationParameterDefaultOverride.java
index fe08010f72..0184308b81 100644
--- a/plc4j/transports/pcap-replay/src/main/java/org/apache/plc4x/java/transport/pcapreplay/PcapReplayTransportConfiguration.java
+++ b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/configuration/annotations/ComplexConfigurationParameterDefaultOverride.java
@@ -16,19 +16,12 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.plc4x.java.transport.pcapreplay;
+package org.apache.plc4x.java.spi.configuration.annotations;
 
-import org.apache.plc4x.java.transport.pcap.PcapTransportConfiguration;
+public @interface ComplexConfigurationParameterDefaultOverride {
 
-public interface PcapReplayTransportConfiguration extends PcapTransportConfiguration {
+    String name() default "";
 
-    default float getReplaySpeedFactor() {
-        return 1;
-    }
+    String value() default "";
 
-    default boolean isLoop() {
-        return false;
-    }
-
-    default String getFilter() { return "";}
 }
diff --git a/plc4j/transports/pcap-replay/src/main/java/org/apache/plc4x/java/transport/pcapreplay/PcapReplayTransportConfiguration.java b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/configuration/annotations/ComplexConfigurationParameterRequiredOverride.java
similarity index 68%
copy from plc4j/transports/pcap-replay/src/main/java/org/apache/plc4x/java/transport/pcapreplay/PcapReplayTransportConfiguration.java
copy to plc4j/spi/src/main/java/org/apache/plc4x/java/spi/configuration/annotations/ComplexConfigurationParameterRequiredOverride.java
index fe08010f72..72559b6e3d 100644
--- a/plc4j/transports/pcap-replay/src/main/java/org/apache/plc4x/java/transport/pcapreplay/PcapReplayTransportConfiguration.java
+++ b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/configuration/annotations/ComplexConfigurationParameterRequiredOverride.java
@@ -16,19 +16,12 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.plc4x.java.transport.pcapreplay;
+package org.apache.plc4x.java.spi.configuration.annotations;
 
-import org.apache.plc4x.java.transport.pcap.PcapTransportConfiguration;
+public @interface ComplexConfigurationParameterRequiredOverride {
 
-public interface PcapReplayTransportConfiguration extends PcapTransportConfiguration {
+    String name() default "";
 
-    default float getReplaySpeedFactor() {
-        return 1;
-    }
+    boolean required() default false;
 
-    default boolean isLoop() {
-        return false;
-    }
-
-    default String getFilter() { return "";}
 }
diff --git a/plc4j/transports/pcap-replay/src/main/java/org/apache/plc4x/java/transport/pcapreplay/PcapReplayTransportConfiguration.java b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/transport/TransportConfigurationProvider.java
similarity index 63%
copy from plc4j/transports/pcap-replay/src/main/java/org/apache/plc4x/java/transport/pcapreplay/PcapReplayTransportConfiguration.java
copy to plc4j/spi/src/main/java/org/apache/plc4x/java/spi/transport/TransportConfigurationProvider.java
index fe08010f72..ab70373e2b 100644
--- a/plc4j/transports/pcap-replay/src/main/java/org/apache/plc4x/java/transport/pcapreplay/PcapReplayTransportConfiguration.java
+++ b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/transport/TransportConfigurationProvider.java
@@ -7,7 +7,7 @@
  * "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
+ *   http://www.apache.org/licenses/LICENSE-2.0
  *
  * Unless required by applicable law or agreed to in writing,
  * software distributed under the License is distributed on an
@@ -16,19 +16,11 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.plc4x.java.transport.pcapreplay;
 
-import org.apache.plc4x.java.transport.pcap.PcapTransportConfiguration;
+package org.apache.plc4x.java.spi.transport;
 
-public interface PcapReplayTransportConfiguration extends PcapTransportConfiguration {
+public interface TransportConfigurationProvider {
 
-    default float getReplaySpeedFactor() {
-        return 1;
-    }
+    TransportConfiguration getTransportConfiguration(String transportCode);
 
-    default boolean isLoop() {
-        return false;
-    }
-
-    default String getFilter() { return "";}
 }
diff --git a/plc4j/transports/pcap-replay/src/main/java/org/apache/plc4x/java/transport/pcapreplay/PcapReplayTransportConfiguration.java b/plc4j/transports/can/src/main/java/org/apache/plc4x/java/transport/can/DefaultCANTransportConfiguration.java
similarity index 63%
copy from plc4j/transports/pcap-replay/src/main/java/org/apache/plc4x/java/transport/pcapreplay/PcapReplayTransportConfiguration.java
copy to plc4j/transports/can/src/main/java/org/apache/plc4x/java/transport/can/DefaultCANTransportConfiguration.java
index fe08010f72..18fac82528 100644
--- a/plc4j/transports/pcap-replay/src/main/java/org/apache/plc4x/java/transport/pcapreplay/PcapReplayTransportConfiguration.java
+++ b/plc4j/transports/can/src/main/java/org/apache/plc4x/java/transport/can/DefaultCANTransportConfiguration.java
@@ -7,7 +7,7 @@
  * "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
+ *   http://www.apache.org/licenses/LICENSE-2.0
  *
  * Unless required by applicable law or agreed to in writing,
  * software distributed under the License is distributed on an
@@ -16,19 +16,9 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.plc4x.java.transport.pcapreplay;
 
-import org.apache.plc4x.java.transport.pcap.PcapTransportConfiguration;
+package org.apache.plc4x.java.transport.can;
 
-public interface PcapReplayTransportConfiguration extends PcapTransportConfiguration {
+public class DefaultCANTransportConfiguration implements CANTransportConfiguration {
 
-    default float getReplaySpeedFactor() {
-        return 1;
-    }
-
-    default boolean isLoop() {
-        return false;
-    }
-
-    default String getFilter() { return "";}
 }
diff --git a/plc4j/transports/pcap-replay/src/main/java/org/apache/plc4x/java/transport/pcapreplay/PcapReplayTransportConfiguration.java b/plc4j/transports/pcap-replay/src/main/java/org/apache/plc4x/java/transport/pcapreplay/DefaultPcapReplayTransportConfiguration.java
similarity index 64%
copy from plc4j/transports/pcap-replay/src/main/java/org/apache/plc4x/java/transport/pcapreplay/PcapReplayTransportConfiguration.java
copy to plc4j/transports/pcap-replay/src/main/java/org/apache/plc4x/java/transport/pcapreplay/DefaultPcapReplayTransportConfiguration.java
index fe08010f72..21922fc360 100644
--- a/plc4j/transports/pcap-replay/src/main/java/org/apache/plc4x/java/transport/pcapreplay/PcapReplayTransportConfiguration.java
+++ b/plc4j/transports/pcap-replay/src/main/java/org/apache/plc4x/java/transport/pcapreplay/DefaultPcapReplayTransportConfiguration.java
@@ -7,7 +7,7 @@
  * "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
+ *   http://www.apache.org/licenses/LICENSE-2.0
  *
  * Unless required by applicable law or agreed to in writing,
  * software distributed under the License is distributed on an
@@ -16,19 +16,26 @@
  * specific language governing permissions and limitations
  * under the License.
  */
+
 package org.apache.plc4x.java.transport.pcapreplay;
 
-import org.apache.plc4x.java.transport.pcap.PcapTransportConfiguration;
+import org.apache.plc4x.java.transport.pcap.DefaultPcapTransportConfiguration;
 
-public interface PcapReplayTransportConfiguration extends PcapTransportConfiguration {
+public abstract class DefaultPcapReplayTransportConfiguration extends DefaultPcapTransportConfiguration implements PcapReplayTransportConfiguration {
 
-    default float getReplaySpeedFactor() {
-        return 1;
+    @Override
+    public float getReplaySpeedFactor() {
+        return 1.0f;
     }
 
-    default boolean isLoop() {
+    @Override
+    public boolean isLoop() {
         return false;
     }
 
-    default String getFilter() { return "";}
+    @Override
+    public String getFilter() {
+        return "";
+    }
+
 }
diff --git a/plc4j/transports/pcap-replay/src/main/java/org/apache/plc4x/java/transport/pcapreplay/PcapReplayTransportConfiguration.java b/plc4j/transports/pcap-replay/src/main/java/org/apache/plc4x/java/transport/pcapreplay/PcapReplayTransportConfiguration.java
index fe08010f72..1f9c9a1b8f 100644
--- a/plc4j/transports/pcap-replay/src/main/java/org/apache/plc4x/java/transport/pcapreplay/PcapReplayTransportConfiguration.java
+++ b/plc4j/transports/pcap-replay/src/main/java/org/apache/plc4x/java/transport/pcapreplay/PcapReplayTransportConfiguration.java
@@ -22,13 +22,10 @@ import org.apache.plc4x.java.transport.pcap.PcapTransportConfiguration;
 
 public interface PcapReplayTransportConfiguration extends PcapTransportConfiguration {
 
-    default float getReplaySpeedFactor() {
-        return 1;
-    }
+    float getReplaySpeedFactor();
 
-    default boolean isLoop() {
-        return false;
-    }
+    boolean isLoop();
+
+    String getFilter();
 
-    default String getFilter() { return "";}
 }
diff --git a/plc4j/drivers/c-bus/src/main/java/org/apache/plc4x/java/cbus/configuration/CBusConfiguration.java b/plc4j/transports/pcap-shared/src/main/java/org/apache/plc4x/java/transport/pcap/DefaultPcapTransportConfiguration.java
similarity index 57%
copy from plc4j/drivers/c-bus/src/main/java/org/apache/plc4x/java/cbus/configuration/CBusConfiguration.java
copy to plc4j/transports/pcap-shared/src/main/java/org/apache/plc4x/java/transport/pcap/DefaultPcapTransportConfiguration.java
index 53fb49e57c..ce87b08f29 100644
--- a/plc4j/drivers/c-bus/src/main/java/org/apache/plc4x/java/cbus/configuration/CBusConfiguration.java
+++ b/plc4j/transports/pcap-shared/src/main/java/org/apache/plc4x/java/transport/pcap/DefaultPcapTransportConfiguration.java
@@ -7,7 +7,7 @@
  * "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
+ *   http://www.apache.org/licenses/LICENSE-2.0
  *
  * Unless required by applicable law or agreed to in writing,
  * software distributed under the License is distributed on an
@@ -16,37 +16,39 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.plc4x.java.cbus.configuration;
 
-import org.apache.plc4x.java.spi.configuration.Configuration;
+package org.apache.plc4x.java.transport.pcap;
+
 import org.apache.plc4x.java.spi.configuration.annotations.ConfigurationParameter;
 import org.apache.plc4x.java.spi.configuration.annotations.defaults.BooleanDefaultValue;
-import org.apache.plc4x.java.transport.tcp.TcpTransportConfiguration;
+import org.apache.plc4x.java.spi.configuration.annotations.defaults.IntDefaultValue;
 
-public class CBusConfiguration implements Configuration, TcpTransportConfiguration {
+public abstract class DefaultPcapTransportConfiguration implements PcapTransportConfiguration {
 
-    @ConfigurationParameter("srchk")
+    @ConfigurationParameter("support-vlans")
     @BooleanDefaultValue(false)
-    public boolean srchk = false;
+    private boolean supportVlans;
+
+    @ConfigurationParameter("protocol-id")
+    @IntDefaultValue(-1)
+    private int protocolId;
 
-    public boolean isSrchk() {
-        return srchk;
+    @Override
+    public boolean getSupportVlans() {
+        return supportVlans;
     }
 
-    public void setSrchk(boolean srchk) {
-        this.srchk = srchk;
+    public void setSupportVlans(boolean supportVlans) {
+        this.supportVlans = supportVlans;
     }
 
     @Override
-    public int getDefaultPort() {
-        return 123;//CBusDriver.C_BUS_TCP_PORT;
+    public int getProtocolId() {
+        return protocolId;
     }
 
-    @Override
-    public String toString() {
-        return "Configuration{" +
-            "srchk=" + srchk +
-            '}';
+    public void setProtocolId(int protocolId) {
+        this.protocolId = protocolId;
     }
 
 }
diff --git a/plc4j/transports/pcap-shared/src/main/java/org/apache/plc4x/java/transport/pcap/PcapTransportConfiguration.java b/plc4j/transports/pcap-shared/src/main/java/org/apache/plc4x/java/transport/pcap/PcapTransportConfiguration.java
index 8924393e28..a49994bc60 100644
--- a/plc4j/transports/pcap-shared/src/main/java/org/apache/plc4x/java/transport/pcap/PcapTransportConfiguration.java
+++ b/plc4j/transports/pcap-shared/src/main/java/org/apache/plc4x/java/transport/pcap/PcapTransportConfiguration.java
@@ -19,22 +19,18 @@
 package org.apache.plc4x.java.transport.pcap;
 
 import org.apache.plc4x.java.spi.transport.TransportConfiguration;
-import org.apache.plc4x.java.utils.pcap.netty.config.PcapChannelConfig;
 import org.apache.plc4x.java.utils.pcap.netty.handlers.PacketHandler;
 
 public interface PcapTransportConfiguration extends TransportConfiguration {
+    int NO_DEFAULT_PORT = -1;
 
-    default boolean getSupportVlans() {
-        return false;
-    }
+    boolean getSupportVlans();
 
     default int getDefaultPort() {
-        return PcapChannelConfig.ALL_PORTS;
+        return NO_DEFAULT_PORT;
     }
 
-    default Integer getProtocolId() {
-        return PcapChannelConfig.ALL_PROTOCOLS;
-    }
+    int getProtocolId();
 
     PacketHandler getPcapPacketHandler();
 
diff --git a/plc4j/drivers/c-bus/src/main/java/org/apache/plc4x/java/cbus/configuration/CBusConfiguration.java b/plc4j/transports/raw-socket/src/main/java/org/apache/plc4x/java/transport/rawsocket/DefaultRawSocketTransportConfiguration.java
similarity index 57%
copy from plc4j/drivers/c-bus/src/main/java/org/apache/plc4x/java/cbus/configuration/CBusConfiguration.java
copy to plc4j/transports/raw-socket/src/main/java/org/apache/plc4x/java/transport/rawsocket/DefaultRawSocketTransportConfiguration.java
index 53fb49e57c..424e0bea82 100644
--- a/plc4j/drivers/c-bus/src/main/java/org/apache/plc4x/java/cbus/configuration/CBusConfiguration.java
+++ b/plc4j/transports/raw-socket/src/main/java/org/apache/plc4x/java/transport/rawsocket/DefaultRawSocketTransportConfiguration.java
@@ -7,7 +7,7 @@
  * "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
+ *   http://www.apache.org/licenses/LICENSE-2.0
  *
  * Unless required by applicable law or agreed to in writing,
  * software distributed under the License is distributed on an
@@ -16,37 +16,26 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.plc4x.java.cbus.configuration;
 
-import org.apache.plc4x.java.spi.configuration.Configuration;
+package org.apache.plc4x.java.transport.rawsocket;
+
 import org.apache.plc4x.java.spi.configuration.annotations.ConfigurationParameter;
 import org.apache.plc4x.java.spi.configuration.annotations.defaults.BooleanDefaultValue;
-import org.apache.plc4x.java.transport.tcp.TcpTransportConfiguration;
+import org.apache.plc4x.java.transport.pcap.DefaultPcapTransportConfiguration;
 
-public class CBusConfiguration implements Configuration, TcpTransportConfiguration {
+public abstract class DefaultRawSocketTransportConfiguration extends DefaultPcapTransportConfiguration implements RawSocketTransportConfiguration {
 
-    @ConfigurationParameter("srchk")
+    @ConfigurationParameter("resolve-mac-address")
     @BooleanDefaultValue(false)
-    public boolean srchk = false;
-
-    public boolean isSrchk() {
-        return srchk;
-    }
-
-    public void setSrchk(boolean srchk) {
-        this.srchk = srchk;
-    }
+    private boolean resolveMacAddress;
 
     @Override
-    public int getDefaultPort() {
-        return 123;//CBusDriver.C_BUS_TCP_PORT;
+    public boolean isResolveMacAccess() {
+        return resolveMacAddress;
     }
 
-    @Override
-    public String toString() {
-        return "Configuration{" +
-            "srchk=" + srchk +
-            '}';
+    public void setResolveMacAddress(boolean resolveMacAddress) {
+        this.resolveMacAddress = resolveMacAddress;
     }
 
 }
diff --git a/plc4j/transports/raw-socket/src/main/java/org/apache/plc4x/java/transport/rawsocket/RawSocketTransportConfiguration.java b/plc4j/transports/raw-socket/src/main/java/org/apache/plc4x/java/transport/rawsocket/RawSocketTransportConfiguration.java
index 4cc17707a5..05cf71ff42 100644
--- a/plc4j/transports/raw-socket/src/main/java/org/apache/plc4x/java/transport/rawsocket/RawSocketTransportConfiguration.java
+++ b/plc4j/transports/raw-socket/src/main/java/org/apache/plc4x/java/transport/rawsocket/RawSocketTransportConfiguration.java
@@ -22,14 +22,6 @@ import org.apache.plc4x.java.transport.pcap.PcapTransportConfiguration;
 
 public interface RawSocketTransportConfiguration extends PcapTransportConfiguration {
 
-    int NO_DEFAULT_PORT = -1;
-
-    default int getDefaultPort() {
-        return NO_DEFAULT_PORT;
-    }
-
-    default boolean isResolveMacAccess() {
-        return false;
-    }
+    boolean isResolveMacAccess();
 
 }
diff --git a/plc4j/transports/serial/src/main/java/org/apache/plc4x/java/transport/serial/DefaultSerialTransportConfiguration.java b/plc4j/transports/serial/src/main/java/org/apache/plc4x/java/transport/serial/DefaultSerialTransportConfiguration.java
new file mode 100644
index 0000000000..5fd46e3b5e
--- /dev/null
+++ b/plc4j/transports/serial/src/main/java/org/apache/plc4x/java/transport/serial/DefaultSerialTransportConfiguration.java
@@ -0,0 +1,79 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.plc4x.java.transport.serial;
+
+import org.apache.plc4x.java.spi.configuration.annotations.ConfigurationParameter;
+import org.apache.plc4x.java.spi.configuration.annotations.defaults.IntDefaultValue;
+
+public class DefaultSerialTransportConfiguration implements SerialTransportConfiguration {
+
+    @ConfigurationParameter("baud-rate")
+    @IntDefaultValue(57600)
+    private int baudRate;
+
+    @ConfigurationParameter("num-data-bits")
+    @IntDefaultValue(8)
+    private int numDataBits;
+
+    @ConfigurationParameter("num-stop-bits")
+    @IntDefaultValue(1)
+    private int numStopBits;
+
+    @ConfigurationParameter("parity-bits")
+    @IntDefaultValue(0)
+    private int parityBits;
+
+    @Override
+    public int getBaudRate() {
+        return baudRate;
+    }
+
+    public void setBaudRate(int baudRate) {
+        this.baudRate = baudRate;
+    }
+
+    @Override
+    public int getNumDataBits() {
+        return numDataBits;
+    }
+
+    public void setNumDataBits(int numDataBits) {
+        this.numDataBits = numDataBits;
+    }
+
+    @Override
+    public int getNumStopBits() {
+        return numStopBits;
+    }
+
+    public void setNumStopBits(int numStopBits) {
+        this.numStopBits = numStopBits;
+    }
+
+    @Override
+    public int getParityBits() {
+        return parityBits;
+    }
+
+    public void setParityBits(int parityBits) {
+        this.parityBits = parityBits;
+    }
+
+}
diff --git a/plc4j/transports/serial/src/main/java/org/apache/plc4x/java/transport/serial/SerialTransportConfiguration.java b/plc4j/transports/serial/src/main/java/org/apache/plc4x/java/transport/serial/SerialTransportConfiguration.java
index 46f2506ae0..3522eaeefc 100644
--- a/plc4j/transports/serial/src/main/java/org/apache/plc4x/java/transport/serial/SerialTransportConfiguration.java
+++ b/plc4j/transports/serial/src/main/java/org/apache/plc4x/java/transport/serial/SerialTransportConfiguration.java
@@ -18,23 +18,16 @@
  */
 package org.apache.plc4x.java.transport.serial;
 
-import com.fazecast.jSerialComm.SerialPort;
 import org.apache.plc4x.java.spi.transport.TransportConfiguration;
 
 public interface SerialTransportConfiguration extends TransportConfiguration {
 
     int getBaudRate();
 
-    default int getNumDataBits() {
-        return 8;
-    }
+    int getNumDataBits();
 
-    default int getNumStopBits() {
-        return SerialPort.ONE_STOP_BIT;
-    }
+    int getNumStopBits();
 
-    default int getParityBits() {
-        return SerialPort.NO_PARITY;
-    }
+    int getParityBits();
 
 }
diff --git a/plc4j/transports/tcp/src/main/java/org/apache/plc4x/java/transport/tcp/DefaultTcpTransportConfiguration.java b/plc4j/transports/tcp/src/main/java/org/apache/plc4x/java/transport/tcp/DefaultTcpTransportConfiguration.java
new file mode 100644
index 0000000000..62040749bc
--- /dev/null
+++ b/plc4j/transports/tcp/src/main/java/org/apache/plc4x/java/transport/tcp/DefaultTcpTransportConfiguration.java
@@ -0,0 +1,67 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.plc4x.java.transport.tcp;
+
+import org.apache.plc4x.java.spi.configuration.annotations.ConfigurationParameter;
+import org.apache.plc4x.java.spi.configuration.annotations.defaults.BooleanDefaultValue;
+import org.apache.plc4x.java.spi.configuration.annotations.defaults.IntDefaultValue;
+
+public abstract class DefaultTcpTransportConfiguration implements TcpTransportConfiguration {
+
+    @ConfigurationParameter("keep-alive")
+    @BooleanDefaultValue(false)
+    private boolean keepAlive;
+
+    @ConfigurationParameter("no-delay")
+    @BooleanDefaultValue(true)
+    private boolean noDelay;
+
+    @ConfigurationParameter("default-timeout")
+    @IntDefaultValue(1000)
+    private int connectTimeout;
+
+    @Override
+    public boolean isKeepAlive() {
+        return keepAlive;
+    }
+
+    public void setKeepAlive(boolean keepAlive) {
+        this.keepAlive = keepAlive;
+    }
+
+    @Override
+    public boolean isNoDelay() {
+        return noDelay;
+    }
+
+    public void setNoDelay(boolean noDelay) {
+        this.noDelay = noDelay;
+    }
+
+    @Override
+    public int getConnectTimeout() {
+        return connectTimeout;
+    }
+
+    public void setConnectTimeout(int connectTimeout) {
+        this.connectTimeout = connectTimeout;
+    }
+
+}
diff --git a/plc4j/transports/tcp/src/main/java/org/apache/plc4x/java/transport/tcp/TcpTransportConfiguration.java b/plc4j/transports/tcp/src/main/java/org/apache/plc4x/java/transport/tcp/TcpTransportConfiguration.java
index 81a64b073e..f101d88c7f 100644
--- a/plc4j/transports/tcp/src/main/java/org/apache/plc4x/java/transport/tcp/TcpTransportConfiguration.java
+++ b/plc4j/transports/tcp/src/main/java/org/apache/plc4x/java/transport/tcp/TcpTransportConfiguration.java
@@ -33,16 +33,10 @@ public interface TcpTransportConfiguration extends TransportConfiguration {
         return NO_DEFAULT_PORT;
     }
 
-    default boolean isKeepAlive() {
-        return false;
-    }
+    boolean isKeepAlive();
 
-    default boolean isNoDelay() {
-        return true;
-    }
+    boolean isNoDelay();
 
-    default int getConnectTimeout() {
-        return 1000;
-    }
+    int getConnectTimeout();
 
 }
diff --git a/sandbox/test-java-df1-driver/src/main/java/org/apache/plc4x/java/df1/configuration/Df1Configuration.java b/plc4j/transports/udp/src/main/java/org/apache/plc4x/java/transport/udp/DefaultUdpTransportConfiguration.java
similarity index 62%
copy from sandbox/test-java-df1-driver/src/main/java/org/apache/plc4x/java/df1/configuration/Df1Configuration.java
copy to plc4j/transports/udp/src/main/java/org/apache/plc4x/java/transport/udp/DefaultUdpTransportConfiguration.java
index 7af218c86f..60a98717a6 100644
--- a/sandbox/test-java-df1-driver/src/main/java/org/apache/plc4x/java/df1/configuration/Df1Configuration.java
+++ b/plc4j/transports/udp/src/main/java/org/apache/plc4x/java/transport/udp/DefaultUdpTransportConfiguration.java
@@ -7,7 +7,7 @@
  * "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
+ *   http://www.apache.org/licenses/LICENSE-2.0
  *
  * Unless required by applicable law or agreed to in writing,
  * software distributed under the License is distributed on an
@@ -16,23 +16,25 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.plc4x.java.df1.configuration;
 
-import org.apache.plc4x.java.spi.configuration.Configuration;
-import org.apache.plc4x.java.spi.configuration.annotations.ConfigurationParameter;
-import org.apache.plc4x.java.transport.serial.SerialTransportConfiguration;
+package org.apache.plc4x.java.transport.udp;
 
-public class Df1Configuration implements Configuration, SerialTransportConfiguration {
+import org.apache.plc4x.java.spi.configuration.annotations.ConfigurationParameter;
+import org.apache.plc4x.java.spi.configuration.annotations.defaults.IntDefaultValue;
 
-    @ConfigurationParameter("local-addr")
-    private short localAddr;
+public abstract class DefaultUdpTransportConfiguration implements UdpTransportConfiguration {
 
-    @ConfigurationParameter("remote-addr")
-    private short remoteAddr;
+    @ConfigurationParameter("local-port")
+    @IntDefaultValue(-1)
+    private int localPort;
 
     @Override
-    public int getBaudRate() {
-        return 57600;
+    public int getLocalPort() {
+        return localPort;
+    }
+
+    public void setLocalPort(int localPort) {
+        this.localPort = localPort;
     }
 
 }
diff --git a/sandbox/test-java-df1-driver/src/main/java/org/apache/plc4x/java/df1/configuration/Df1Configuration.java b/sandbox/test-java-df1-driver/src/main/java/org/apache/plc4x/java/df1/configuration/Df1Configuration.java
index 7af218c86f..6516f45213 100644
--- a/sandbox/test-java-df1-driver/src/main/java/org/apache/plc4x/java/df1/configuration/Df1Configuration.java
+++ b/sandbox/test-java-df1-driver/src/main/java/org/apache/plc4x/java/df1/configuration/Df1Configuration.java
@@ -19,10 +19,13 @@
 package org.apache.plc4x.java.df1.configuration;
 
 import org.apache.plc4x.java.spi.configuration.Configuration;
+import org.apache.plc4x.java.spi.configuration.annotations.ComplexConfigurationParameter;
 import org.apache.plc4x.java.spi.configuration.annotations.ConfigurationParameter;
-import org.apache.plc4x.java.transport.serial.SerialTransportConfiguration;
+import org.apache.plc4x.java.spi.transport.TransportConfiguration;
+import org.apache.plc4x.java.spi.transport.TransportConfigurationProvider;
+import org.apache.plc4x.java.transport.serial.DefaultSerialTransportConfiguration;
 
-public class Df1Configuration implements Configuration, SerialTransportConfiguration {
+public class Df1Configuration implements Configuration, TransportConfigurationProvider {
 
     @ConfigurationParameter("local-addr")
     private short localAddr;
@@ -30,9 +33,40 @@ public class Df1Configuration implements Configuration, SerialTransportConfigura
     @ConfigurationParameter("remote-addr")
     private short remoteAddr;
 
+    @ComplexConfigurationParameter(prefix = "serial", defaultOverrides = {}, requiredOverrides = {})
+    private DefaultSerialTransportConfiguration serialTransportConfiguration;
+
+    public short getLocalAddr() {
+        return localAddr;
+    }
+
+    public void setLocalAddr(short localAddr) {
+        this.localAddr = localAddr;
+    }
+
+    public short getRemoteAddr() {
+        return remoteAddr;
+    }
+
+    public void setRemoteAddr(short remoteAddr) {
+        this.remoteAddr = remoteAddr;
+    }
+
+    public DefaultSerialTransportConfiguration getSerialTransportConfiguration() {
+        return serialTransportConfiguration;
+    }
+
+    public void setSerialTransportConfiguration(DefaultSerialTransportConfiguration serialTransportConfiguration) {
+        this.serialTransportConfiguration = serialTransportConfiguration;
+    }
+
     @Override
-    public int getBaudRate() {
-        return 57600;
+    public TransportConfiguration getTransportConfiguration(String transportCode) {
+        switch (transportCode) {
+            case "serial":
+                return serialTransportConfiguration;
+        }
+        return null;
     }
 
 }