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:51 UTC

(plc4x) branch feature/transport-configuration-rework created (now af88a3786e)

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

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


      at af88a3786e feat(plc4j): Rewrote the configuration for all java drivers to generally support overwriting (WIP)

This branch includes the following new commits:

     new af88a3786e feat(plc4j): Rewrote the configuration for all java drivers to generally support overwriting (WIP)

The 1 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.



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

Posted by cd...@apache.org.
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;
     }
 
 }