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/01/16 11:17:48 UTC

[plc4x] branch feature/cdutz/connection-cache-and-scraper-ng updated: refactor(plc4j/api): Updated the PlcDriverManager API

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

cdutz pushed a commit to branch feature/cdutz/connection-cache-and-scraper-ng
in repository https://gitbox.apache.org/repos/asf/plc4x.git


The following commit(s) were added to refs/heads/feature/cdutz/connection-cache-and-scraper-ng by this push:
     new edd1243120 refactor(plc4j/api): Updated the PlcDriverManager API
edd1243120 is described below

commit edd1243120348758c91955ffcf6173486122f5f8
Author: Christofer Dutz <ch...@c-ware.de>
AuthorDate: Mon Jan 16 12:17:38 2023 +0100

    refactor(plc4j/api): Updated the PlcDriverManager API
    
    - Created 2 new interfaces PlcConnectionManager and PlcDriverManager
    - Renamed the previous PlcDriverManager to DefaultPlcDriverManager
---
 ...erManager.java => DefaultPlcDriverManager.java} | 17 ++++---
 .../java/org/apache/plc4x/java/api/PlcDriver.java  |  9 +---
 .../apache/plc4x/java/api/PlcDriverManager.java}   | 25 +++++----
 .../apache/plc4x/java/PlcDriverManagerTest.java    | 10 ++--
 .../org/apache/plc4x/protocol/ads/Scanner.java     |  5 +-
 .../java/can/generic/GenericCANDriverTest.java     |  7 +--
 .../java/org/apache/plc4x/java/canopen/Main.java   |  4 +-
 .../apache/plc4x/java/knxnetip/ManualKnxNetIp.java |  4 +-
 .../java/modbus/ManualModbusDiscoveryTest.java     |  4 +-
 .../apache/plc4x/java/opcua/ManualPLC4XOpcua.java  |  4 +-
 .../plc4x/java/opcua/OpcuaPlcDriverTest.java       | 12 ++---
 .../protocol/OpcuaSubscriptionHandleTest.java      |  4 +-
 .../apache/plc4x/java/plc4x/Plc4xReadClient.java   |  4 +-
 .../apache/plc4x/java/plc4x/Plc4xWriteClient.java  |  4 +-
 .../profinet/ManualProfinetIoDiscoveryTest.java    |  4 +-
 .../plc4x/java/profinet/ManualProfinetIoTest.java  |  4 +-
 .../plc4x/java/s7/readwrite/DatatypesTest.java     |  4 +-
 .../helloads/telemetry/HelloAdsTelemetry.java      |  4 +-
 .../cloud/azure/S7PlcToAzureIoTHubSample.java      |  4 +-
 .../cloud/google/S7PlcToGoogleIoTCoreSample.java   |  4 +-
 .../examples/connectivity/mqtt/MqttConnector.java  |  4 +-
 .../examples/hellodiscovery/HelloDiscovery.java    |  4 +-
 .../java/examples/helloinflux/HelloInflux.java     |  4 +-
 .../plc4x/java/examples/hellonats/HelloNats.java   |  1 -
 .../examples/hellowebservice/HelloWebservice.java  |  4 +-
 .../java/examples/hellokotlin/ReadModbusPal.kt     |  4 +-
 .../HelloPlc4xDiscoverAndBrowse.java               |  8 +--
 .../examples/helloplc4x/read/HelloPlc4xRead.java   |  4 +-
 .../subscribe/HelloPlc4xSubscription.java          |  4 +-
 .../examples/helloplc4x/write/HelloPlc4xWrite.java |  4 +-
 .../examples/plc4j/s7event/EventSubscription.java  |  4 +-
 .../plc4x/java/examples/pollloop/PollLoop.java     |  5 +-
 .../java/org/apache/plc4x/kafka/config/Sink.java   |  5 +-
 .../java/org/apache/plc4x/kafka/config/Source.java |  9 ++--
 .../opcuaserver/backend/Plc4xCommunication.java    |  6 +--
 .../java/opcuaserver/backend/Plc4xNamespace.java   |  4 +-
 .../plc4x/java/opcuaserver/OpcuaPlcDriverTest.java | 10 ++--
 .../utils/cache/CachedPlcConnectionManager.java    |  4 +-
 .../apache/plc4x/java/utils/cache/ManualTest.java  |  4 +-
 .../plc4x/java/opm/PlcEntityInterceptor.java       | 59 +++++++++++-----------
 .../apache/plc4x/java/opm/PlcEntityManager.java    | 16 +++---
 .../apache/plc4x/java/opm/ConnectedEntityTest.java |  6 +--
 .../plc4x/java/opm/PlcEntityInterceptorTest.java   | 24 +++++----
 .../java/opm/PlcEntityManagerComplexTest.java      | 10 ++--
 .../plc4x/java/opm/PlcEntityManagerTest.java       | 14 ++---
 .../triggeredscraper/TriggeredScraperImpl.java     |  9 ++--
 .../triggeredscraper/TriggeredScraperTask.java     |  1 -
 .../triggerhandler/TriggerConfiguration.java       |  4 +-
 .../apache/plc4x/java/scraper/ScraperTaskTest.java | 17 ++++---
 .../org/apache/plc4x/java/scraper/ScraperTest.java |  8 +--
 .../triggeredscraper/TriggeredScraperImplTest.java |  6 +--
 .../org/apache/plc4x/java/ui/FxmlController.java   |  6 +--
 .../test/driver/internal/ConnectionManager.java    |  7 +--
 .../org/apache/plc4x/test/manual/ManualTest.java   |  4 +-
 .../apache/plc4x/protocol/df1/EndToEndTest.java    |  4 +-
 55 files changed, 216 insertions(+), 208 deletions(-)

diff --git a/plc4j/api/src/main/java/org/apache/plc4x/java/PlcDriverManager.java b/plc4j/api/src/main/java/org/apache/plc4x/java/DefaultPlcDriverManager.java
similarity index 93%
rename from plc4j/api/src/main/java/org/apache/plc4x/java/PlcDriverManager.java
rename to plc4j/api/src/main/java/org/apache/plc4x/java/DefaultPlcDriverManager.java
index 5c25b61d0d..cc3a5d6740 100644
--- a/plc4j/api/src/main/java/org/apache/plc4x/java/PlcDriverManager.java
+++ b/plc4j/api/src/main/java/org/apache/plc4x/java/DefaultPlcDriverManager.java
@@ -20,9 +20,10 @@ package org.apache.plc4x.java;
 
 import org.apache.plc4x.java.api.PlcConnection;
 import org.apache.plc4x.java.api.PlcConnectionManager;
+import org.apache.plc4x.java.api.PlcDriver;
+import org.apache.plc4x.java.api.PlcDriverManager;
 import org.apache.plc4x.java.api.authentication.PlcAuthentication;
 import org.apache.plc4x.java.api.exceptions.PlcConnectionException;
-import org.apache.plc4x.java.api.PlcDriver;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -33,19 +34,19 @@ import java.util.Map;
 import java.util.ServiceLoader;
 import java.util.Set;
 
-public class PlcDriverManager implements PlcConnectionManager {
+public class DefaultPlcDriverManager implements PlcDriverManager, PlcConnectionManager {
 
-    private static final Logger LOGGER = LoggerFactory.getLogger(PlcDriverManager.class);
+    private static final Logger LOGGER = LoggerFactory.getLogger(org.apache.plc4x.java.DefaultPlcDriverManager.class);
 
     protected ClassLoader classLoader;
 
     private Map<String, PlcDriver> driverMap;
 
-    public PlcDriverManager() {
+    public DefaultPlcDriverManager() {
         this(Thread.currentThread().getContextClassLoader());
     }
 
-    public PlcDriverManager(ClassLoader classLoader) {
+    public DefaultPlcDriverManager(ClassLoader classLoader) {
         LOGGER.info("Instantiating new PLC Driver Manager with class loader {}", classLoader);
         this.classLoader = classLoader;
         driverMap = new HashMap<>();
@@ -143,4 +144,8 @@ public class PlcDriverManager implements PlcConnectionManager {
         }
     }
 
-}
\ No newline at end of file
+    public PlcConnectionManager getConnectionManager() {
+        return this;
+    }
+
+}
diff --git a/plc4j/api/src/main/java/org/apache/plc4x/java/api/PlcDriver.java b/plc4j/api/src/main/java/org/apache/plc4x/java/api/PlcDriver.java
index 8ffeb83028..7ace7ad223 100644
--- a/plc4j/api/src/main/java/org/apache/plc4x/java/api/PlcDriver.java
+++ b/plc4j/api/src/main/java/org/apache/plc4x/java/api/PlcDriver.java
@@ -28,7 +28,7 @@ import org.apache.plc4x.java.api.model.PlcTag;
 
 /**
  * General interface defining the minimal methods required for adding a new type of driver to the PLC4J system.
- *
+ * <br>
  * <b>Note that each driver has to add a service file called org.apache.plc4x.java.spi.PlcDriver to
  * src/main/resources/META-INF which contains the fully qualified classname in order to get loaded
  * by the PlcDriverManager instances.</b>
@@ -49,12 +49,7 @@ public interface PlcDriver {
      * Provides driver metadata.
      */
     default PlcDriverMetadata getMetadata() {
-        return new PlcDriverMetadata() {
-            @Override
-            public boolean canDiscover() {
-                return false;
-            }
-        };
+        return () -> false;
     }
 
     /**
diff --git a/plc4j/drivers/profinet/src/test/java/org/apache/plc4x/java/profinet/ManualProfinetIoDiscoveryTest.java b/plc4j/api/src/main/java/org/apache/plc4x/java/api/PlcDriverManager.java
similarity index 59%
copy from plc4j/drivers/profinet/src/test/java/org/apache/plc4x/java/profinet/ManualProfinetIoDiscoveryTest.java
copy to plc4j/api/src/main/java/org/apache/plc4x/java/api/PlcDriverManager.java
index b5b2967d4a..388abc7578 100644
--- a/plc4j/drivers/profinet/src/test/java/org/apache/plc4x/java/profinet/ManualProfinetIoDiscoveryTest.java
+++ b/plc4j/api/src/main/java/org/apache/plc4x/java/api/PlcDriverManager.java
@@ -16,18 +16,25 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.plc4x.java.profinet;
+package org.apache.plc4x.java.api;
 
-import org.apache.plc4x.java.PlcDriverManager;
-import org.apache.plc4x.java.api.PlcDriver;
-import org.apache.plc4x.java.api.messages.PlcDiscoveryResponse;
+import org.apache.plc4x.java.DefaultPlcDriverManager;
+import org.apache.plc4x.java.api.exceptions.PlcConnectionException;
 
-public class ManualProfinetIoDiscoveryTest {
+import java.util.Set;
 
-    public static void main(String[] args) throws Exception {
-        final PlcDriver profinetDriver = new PlcDriverManager().getDriver("profinet");
-        final PlcDiscoveryResponse plcDiscoveryResponse = profinetDriver.discoveryRequestBuilder().build().execute().get();
-        System.out.println(plcDiscoveryResponse);
+public interface PlcDriverManager {
+
+    static PlcDriverManager getDefault() {
+        return new DefaultPlcDriverManager();
     }
 
+    Set<String> listDrivers();
+
+    PlcDriver getDriver(String protocolCode) throws PlcConnectionException;
+
+    PlcDriver getDriverForUrl(String url) throws PlcConnectionException;
+
+    PlcConnectionManager getConnectionManager();
+
 }
diff --git a/plc4j/api/src/test/java/org/apache/plc4x/java/PlcDriverManagerTest.java b/plc4j/api/src/test/java/org/apache/plc4x/java/PlcDriverManagerTest.java
index 0e3551de1d..9dddd1e729 100644
--- a/plc4j/api/src/test/java/org/apache/plc4x/java/PlcDriverManagerTest.java
+++ b/plc4j/api/src/test/java/org/apache/plc4x/java/PlcDriverManagerTest.java
@@ -45,7 +45,7 @@ public class PlcDriverManagerTest {
      */
     @Test
     public void getExistingDriverTest() throws PlcException {
-        MockPlcConnection mockConnection = (MockPlcConnection) new PlcDriverManager().getConnection("api-mock://some-cool-url");
+        MockPlcConnection mockConnection = (MockPlcConnection) new DefaultPlcDriverManager().getConnection("api-mock://some-cool-url");
 
         assertThat(mockConnection.getAuthentication(), nullValue());
         assertThat(mockConnection.isConnected(), is(true));
@@ -60,7 +60,7 @@ public class PlcDriverManagerTest {
     public void getExistingDriverWithAuthenticationTest() throws PlcException {
         PlcUsernamePasswordAuthentication authentication =
             new PlcUsernamePasswordAuthentication("user", "pass");
-        MockPlcConnection mockConnection = (MockPlcConnection) new PlcDriverManager().getConnection("api-mock://some-cool-url", authentication);
+        MockPlcConnection mockConnection = (MockPlcConnection) new DefaultPlcDriverManager().getConnection("api-mock://some-cool-url", authentication);
 
         assertThat(mockConnection.getAuthentication(), notNullValue());
         assertThat(mockConnection.getAuthentication(), instanceOf(PlcUsernamePasswordAuthentication.class));
@@ -75,7 +75,7 @@ public class PlcDriverManagerTest {
     @Test
     public void getNotExistingDriverTest() {
         assertThrows(PlcConnectionException.class,
-            () -> new PlcDriverManager().getConnection("non-existing-protocol://some-cool-url"));
+            () -> new DefaultPlcDriverManager().getConnection("non-existing-protocol://some-cool-url"));
     }
 
     /**
@@ -86,7 +86,7 @@ public class PlcDriverManagerTest {
     @Test
     public void getInvalidUriTest() throws PlcConnectionException {
         assertThrows(PlcConnectionException.class,
-            () -> new PlcDriverManager().getConnection("The quick brown fox jumps over the lazy dog"));
+            () -> new DefaultPlcDriverManager().getConnection("The quick brown fox jumps over the lazy dog"));
     }
 
     /**
@@ -108,7 +108,7 @@ public class PlcDriverManagerTest {
 
         // expect exception
         assertThrows(IllegalStateException.class,
-            () -> new PlcDriverManager(fakeClassLoader).getConnection("api-mock://some-cool-url"));
+            () -> new DefaultPlcDriverManager(fakeClassLoader).getConnection("api-mock://some-cool-url"));
     }
 
 }
diff --git a/plc4j/drivers/ads/src/test/java/org/apache/plc4x/protocol/ads/Scanner.java b/plc4j/drivers/ads/src/test/java/org/apache/plc4x/protocol/ads/Scanner.java
index 197126d8f3..84efe71d36 100644
--- a/plc4j/drivers/ads/src/test/java/org/apache/plc4x/protocol/ads/Scanner.java
+++ b/plc4j/drivers/ads/src/test/java/org/apache/plc4x/protocol/ads/Scanner.java
@@ -24,7 +24,8 @@ import java.nio.charset.StandardCharsets;
 import java.util.Arrays;
 import java.util.List;
 import java.util.stream.Collectors;
-import org.apache.plc4x.java.PlcDriverManager;
+
+import org.apache.plc4x.java.DefaultPlcDriverManager;
 import org.apache.plc4x.java.ads.readwrite.AdsDataType;
 import org.apache.plc4x.java.api.PlcConnection;
 import org.apache.plc4x.java.api.messages.PlcReadRequest;
@@ -58,7 +59,7 @@ public class Scanner {
         System.out.println("Launching connection " + connectionString);
 
         // Establish a connection to the plc using the url provided as first argument
-        try (PlcConnection plcConnection = new PlcDriverManager().getConnection(connectionString)) {
+        try (PlcConnection plcConnection = new DefaultPlcDriverManager().getConnection(connectionString)) {
             PlcConnectionMetadata metadata = plcConnection.getMetadata();
             System.out.println("read: " + metadata.canRead());
             System.out.println("write: " + metadata.canWrite());
diff --git a/plc4j/drivers/can/src/test/java/org/apache/plc4x/java/can/generic/GenericCANDriverTest.java b/plc4j/drivers/can/src/test/java/org/apache/plc4x/java/can/generic/GenericCANDriverTest.java
index e42bd3ebbb..cbd1e09d30 100644
--- a/plc4j/drivers/can/src/test/java/org/apache/plc4x/java/can/generic/GenericCANDriverTest.java
+++ b/plc4j/drivers/can/src/test/java/org/apache/plc4x/java/can/generic/GenericCANDriverTest.java
@@ -21,7 +21,8 @@ package org.apache.plc4x.java.can.generic;
 import java.util.concurrent.CountDownLatch;
 import java.util.concurrent.atomic.AtomicReference;
 import java.util.function.Consumer;
-import org.apache.plc4x.java.PlcDriverManager;
+
+import org.apache.plc4x.java.DefaultPlcDriverManager;
 import org.apache.plc4x.java.api.PlcConnection;
 import org.apache.plc4x.java.api.exceptions.PlcConnectionException;
 import org.apache.plc4x.java.api.messages.PlcSubscriptionEvent;
@@ -34,7 +35,7 @@ public class GenericCANDriverTest {
 
     @Test
     void testConnection() throws PlcConnectionException {
-        PlcConnection connection = new PlcDriverManager().getConnection("genericcan:virtualcan://");
+        PlcConnection connection = new DefaultPlcDriverManager().getConnection("genericcan:virtualcan://");
 
         assertNotNull(connection);
         assertTrue(connection.isConnected());
@@ -48,7 +49,7 @@ public class GenericCANDriverTest {
     void testSubscribeAndWrite() throws Exception {
 //        PlcConnection connection1 = new PlcDriverManager().getConnection("genericcan:socketcan://vcan0");
 //        PlcConnection connection2 = new PlcDriverManager().getConnection("genericcan:socketcan://vcan0");
-        PlcConnection connection1 = new PlcDriverManager().getConnection("genericcan:virtualcan://");
+        PlcConnection connection1 = new DefaultPlcDriverManager().getConnection("genericcan:virtualcan://");
         PlcConnection connection2 = connection1;
 
         CountDownLatch latch = new CountDownLatch(1);
diff --git a/plc4j/drivers/canopen/src/test/java/org/apache/plc4x/java/canopen/Main.java b/plc4j/drivers/canopen/src/test/java/org/apache/plc4x/java/canopen/Main.java
index e3fcdadf4f..6b29b396cc 100644
--- a/plc4j/drivers/canopen/src/test/java/org/apache/plc4x/java/canopen/Main.java
+++ b/plc4j/drivers/canopen/src/test/java/org/apache/plc4x/java/canopen/Main.java
@@ -18,7 +18,7 @@
  */
 package org.apache.plc4x.java.canopen;
 
-import org.apache.plc4x.java.PlcDriverManager;
+import org.apache.plc4x.java.DefaultPlcDriverManager;
 import org.apache.plc4x.java.api.PlcConnection;
 import org.apache.plc4x.java.api.messages.PlcReadRequest;
 import org.apache.plc4x.java.api.messages.PlcReadResponse;
@@ -35,7 +35,7 @@ import java.util.concurrent.CompletableFuture;
 public class Main {
 
     public static void main(String[] args) throws Exception {
-        PlcDriverManager driverManager = new PlcDriverManager();
+        DefaultPlcDriverManager driverManager = new DefaultPlcDriverManager();
 
         CANOpenDriverContext.CALLBACK.addCallback(new Callback() {
             @Override
diff --git a/plc4j/drivers/knxnetip/src/test/java/org/apache/plc4x/java/knxnetip/ManualKnxNetIp.java b/plc4j/drivers/knxnetip/src/test/java/org/apache/plc4x/java/knxnetip/ManualKnxNetIp.java
index 3d20215b1a..2d6dc800e8 100644
--- a/plc4j/drivers/knxnetip/src/test/java/org/apache/plc4x/java/knxnetip/ManualKnxNetIp.java
+++ b/plc4j/drivers/knxnetip/src/test/java/org/apache/plc4x/java/knxnetip/ManualKnxNetIp.java
@@ -18,7 +18,7 @@
  */
 package org.apache.plc4x.java.knxnetip;
 
-import org.apache.plc4x.java.PlcDriverManager;
+import org.apache.plc4x.java.DefaultPlcDriverManager;
 import org.apache.plc4x.java.api.PlcConnection;
 import org.apache.plc4x.java.api.exceptions.PlcRuntimeException;
 import org.apache.plc4x.java.api.messages.PlcSubscriptionRequest;
@@ -39,7 +39,7 @@ public class ManualKnxNetIp {
 
     public static void main(String[] args) throws Exception {
         //final PlcConnection connection = new PlcDriverManager().getConnection("knxnet-ip://192.168.42.11?knxproj-file-path=/Users/christofer.dutz/Projects/Apache/PLC4X-Documents/KNX/Stettiner%20Str.%2013/StettinerStr-Soll-Ist-Temperatur.knxproj");
-        final PlcConnection connection = new PlcDriverManager().getConnection("knxnet-ip:pcap:///Users/christofer.dutz/Projects/Apache/PLC4X-Documents/KNX/Recording-01.03.2020-2.pcapng?knxproj-file-path=/Users/christofer.dutz/Projects/Apache/PLC4X-Documents/KNX/Stettiner%20Str.%2013/StettinerStr-Soll-Ist-Temperatur.knxproj");
+        final PlcConnection connection = new DefaultPlcDriverManager().getConnection("knxnet-ip:pcap:///Users/christofer.dutz/Projects/Apache/PLC4X-Documents/KNX/Recording-01.03.2020-2.pcapng?knxproj-file-path=/Users/christofer.dutz/Projects/Apache/PLC4X-Documents/KNX/Stettiner%20Str.%2013/StettinerStr-Soll-Ist-Temperatur.knxproj");
         // Make sure we hang up correctly when terminating.
         Runtime.getRuntime().addShutdownHook(new Thread(() -> {
             try {
diff --git a/plc4j/drivers/modbus/src/test/java/org/apache/plc4x/java/modbus/ManualModbusDiscoveryTest.java b/plc4j/drivers/modbus/src/test/java/org/apache/plc4x/java/modbus/ManualModbusDiscoveryTest.java
index 89007ee331..0e3342c141 100644
--- a/plc4j/drivers/modbus/src/test/java/org/apache/plc4x/java/modbus/ManualModbusDiscoveryTest.java
+++ b/plc4j/drivers/modbus/src/test/java/org/apache/plc4x/java/modbus/ManualModbusDiscoveryTest.java
@@ -18,7 +18,7 @@
  */
 package org.apache.plc4x.java.modbus;
 
-import org.apache.plc4x.java.PlcDriverManager;
+import org.apache.plc4x.java.DefaultPlcDriverManager;
 import org.apache.plc4x.java.api.PlcDriver;
 import org.apache.plc4x.java.api.messages.PlcDiscoveryResponse;
 import org.junit.jupiter.api.Disabled;
@@ -27,7 +27,7 @@ import org.junit.jupiter.api.Disabled;
 public class ManualModbusDiscoveryTest {
 
     public static void main(String[] args) throws Exception {
-        final PlcDriver modbusDriver = new PlcDriverManager().getDriver("modbus-tcp");
+        final PlcDriver modbusDriver = new DefaultPlcDriverManager().getDriver("modbus-tcp");
         final PlcDiscoveryResponse plcDiscoveryResponse = modbusDriver.discoveryRequestBuilder().build().execute().get();
         System.out.println(plcDiscoveryResponse);
     }
diff --git a/plc4j/drivers/opcua/src/test/java/org/apache/plc4x/java/opcua/ManualPLC4XOpcua.java b/plc4j/drivers/opcua/src/test/java/org/apache/plc4x/java/opcua/ManualPLC4XOpcua.java
index f9ab1cb59c..b39eab511f 100644
--- a/plc4j/drivers/opcua/src/test/java/org/apache/plc4x/java/opcua/ManualPLC4XOpcua.java
+++ b/plc4j/drivers/opcua/src/test/java/org/apache/plc4x/java/opcua/ManualPLC4XOpcua.java
@@ -18,7 +18,7 @@
  */
 package org.apache.plc4x.java.opcua;
 
-import org.apache.plc4x.java.PlcDriverManager;
+import org.apache.plc4x.java.DefaultPlcDriverManager;
 import org.apache.plc4x.java.api.PlcConnection;
 import org.apache.plc4x.java.api.exceptions.PlcConnectionException;
 import org.apache.plc4x.java.api.exceptions.PlcRuntimeException;
@@ -101,7 +101,7 @@ public class ManualPLC4XOpcua {
         OpcuaPlcTagHandler tagH = new OpcuaPlcTagHandler();
         PlcTag tag = tagH.parseTag(BOOL_IDENTIFIER);
         try {
-            opcuaConnection = new PlcDriverManager().getConnection("opcua:tcp://127.0.0.1:12686/milo?discovery=false");
+            opcuaConnection = new DefaultPlcDriverManager().getConnection("opcua:tcp://127.0.0.1:12686/milo?discovery=false");
 
         } catch (PlcConnectionException e) {
             throw new PlcRuntimeException(e);
diff --git a/plc4j/drivers/opcua/src/test/java/org/apache/plc4x/java/opcua/OpcuaPlcDriverTest.java b/plc4j/drivers/opcua/src/test/java/org/apache/plc4x/java/opcua/OpcuaPlcDriverTest.java
index 3f92f6dd93..616218c8d1 100644
--- a/plc4j/drivers/opcua/src/test/java/org/apache/plc4x/java/opcua/OpcuaPlcDriverTest.java
+++ b/plc4j/drivers/opcua/src/test/java/org/apache/plc4x/java/opcua/OpcuaPlcDriverTest.java
@@ -19,7 +19,7 @@
 package org.apache.plc4x.java.opcua;
 
 import io.vavr.collection.List;
-import org.apache.plc4x.java.PlcDriverManager;
+import org.apache.plc4x.java.DefaultPlcDriverManager;
 import org.apache.plc4x.java.api.PlcConnection;
 import org.apache.plc4x.java.api.exceptions.PlcConnectionException;
 import org.apache.plc4x.java.api.messages.PlcReadRequest;
@@ -156,7 +156,7 @@ public class OpcuaPlcDriverTest {
     public void connectionNoParams() {
         connectionStringValidSet.forEach(connectionString -> {
             try {
-                PlcConnection opcuaConnection = new PlcDriverManager().getConnection(connectionString);
+                PlcConnection opcuaConnection = new DefaultPlcDriverManager().getConnection(connectionString);
                 Condition<PlcConnection> is_connected = new Condition<>(PlcConnection::isConnected, "is connected");
                 assertThat(opcuaConnection).is(is_connected);
                 opcuaConnection.close();
@@ -175,7 +175,7 @@ public class OpcuaPlcDriverTest {
             discoveryParamValidSet.forEach(discoveryParam -> {
                 String connectionString = connectionAddress + paramSectionDivider + discoveryParam;
                 try {
-                    PlcConnection opcuaConnection = new PlcDriverManager().getConnection(connectionString);
+                    PlcConnection opcuaConnection = new DefaultPlcDriverManager().getConnection(connectionString);
                     Condition<PlcConnection> is_connected = new Condition<>(PlcConnection::isConnected, "is connected");
                     assertThat(opcuaConnection).is(is_connected);
                     opcuaConnection.close();
@@ -192,7 +192,7 @@ public class OpcuaPlcDriverTest {
     @Test
     public void readVariables() {
         try {
-            PlcConnection opcuaConnection = new PlcDriverManager().getConnection(tcpConnectionAddress);
+            PlcConnection opcuaConnection = new DefaultPlcDriverManager().getConnection(tcpConnectionAddress);
             Condition<PlcConnection> is_connected = new Condition<>(PlcConnection::isConnected, "is connected");
             assertThat(opcuaConnection).is(is_connected);
 
@@ -269,7 +269,7 @@ public class OpcuaPlcDriverTest {
 
     @Test
     public void writeVariables() throws Exception {
-        PlcConnection opcuaConnection = new PlcDriverManager().getConnection(tcpConnectionAddress);
+        PlcConnection opcuaConnection = new DefaultPlcDriverManager().getConnection(tcpConnectionAddress);
         Condition<PlcConnection> is_connected = new Condition<>(PlcConnection::isConnected, "is connected");
         assertThat(opcuaConnection).is(is_connected);
 
@@ -433,7 +433,7 @@ public class OpcuaPlcDriverTest {
 
 
         try {
-            PlcConnection opcuaConnection = new PlcDriverManager().getConnection(tcpConnectionAddress);
+            PlcConnection opcuaConnection = new DefaultPlcDriverManager().getConnection(tcpConnectionAddress);
             Condition<PlcConnection> is_connected = new Condition<>(PlcConnection::isConnected, "is connected");
             assertThat(opcuaConnection).is(is_connected);
 
diff --git a/plc4j/drivers/opcua/src/test/java/org/apache/plc4x/java/opcua/protocol/OpcuaSubscriptionHandleTest.java b/plc4j/drivers/opcua/src/test/java/org/apache/plc4x/java/opcua/protocol/OpcuaSubscriptionHandleTest.java
index ca8d011787..868576385f 100644
--- a/plc4j/drivers/opcua/src/test/java/org/apache/plc4x/java/opcua/protocol/OpcuaSubscriptionHandleTest.java
+++ b/plc4j/drivers/opcua/src/test/java/org/apache/plc4x/java/opcua/protocol/OpcuaSubscriptionHandleTest.java
@@ -18,7 +18,7 @@
  */
 package org.apache.plc4x.java.opcua.protocol;
 
-import org.apache.plc4x.java.PlcDriverManager;
+import org.apache.plc4x.java.DefaultPlcDriverManager;
 import org.apache.plc4x.java.api.PlcConnection;
 import org.apache.plc4x.java.api.messages.PlcSubscriptionRequest;
 import org.apache.plc4x.java.api.messages.PlcSubscriptionResponse;
@@ -97,7 +97,7 @@ public class OpcuaSubscriptionHandleTest {
             exampleServer = new ExampleServer();
             exampleServer.startup().get();
             //Connect
-            opcuaConnection = new PlcDriverManager().getConnection(tcpConnectionAddress);
+            opcuaConnection = new DefaultPlcDriverManager().getConnection(tcpConnectionAddress);
             assert opcuaConnection.isConnected();
         } catch (Exception e) {
             e.printStackTrace();
diff --git a/plc4j/drivers/plc4x/src/test/java/org/apache/plc4x/java/plc4x/Plc4xReadClient.java b/plc4j/drivers/plc4x/src/test/java/org/apache/plc4x/java/plc4x/Plc4xReadClient.java
index 98bd3db7c4..09a2f4d4ed 100644
--- a/plc4j/drivers/plc4x/src/test/java/org/apache/plc4x/java/plc4x/Plc4xReadClient.java
+++ b/plc4j/drivers/plc4x/src/test/java/org/apache/plc4x/java/plc4x/Plc4xReadClient.java
@@ -18,7 +18,7 @@
  */
 package org.apache.plc4x.java.plc4x;
 
-import org.apache.plc4x.java.PlcDriverManager;
+import org.apache.plc4x.java.DefaultPlcDriverManager;
 import org.apache.plc4x.java.api.PlcConnection;
 import org.apache.plc4x.java.api.messages.PlcReadRequest;
 import org.apache.plc4x.java.api.messages.PlcReadResponse;
@@ -26,7 +26,7 @@ import org.apache.plc4x.java.api.messages.PlcReadResponse;
 public class Plc4xReadClient {
 
     public static void main(String[] args) throws Exception {
-        try (final PlcConnection connection = new PlcDriverManager().getConnection("plc4x://localhost?remote-connection-string=simulated%3A%2F%2Flocalhost")) {
+        try (final PlcConnection connection = new DefaultPlcDriverManager().getConnection("plc4x://localhost?remote-connection-string=simulated%3A%2F%2Flocalhost")) {
             final PlcReadRequest.Builder requestBuilder = connection.readRequestBuilder();
             requestBuilder.addTagAddress("test-BOOL", "RANDOM/foo:BOOL");
             requestBuilder.addTagAddress("test-BYTE", "RANDOM/foo:BYTE");
diff --git a/plc4j/drivers/plc4x/src/test/java/org/apache/plc4x/java/plc4x/Plc4xWriteClient.java b/plc4j/drivers/plc4x/src/test/java/org/apache/plc4x/java/plc4x/Plc4xWriteClient.java
index 061cc98eb7..84f473c5cb 100644
--- a/plc4j/drivers/plc4x/src/test/java/org/apache/plc4x/java/plc4x/Plc4xWriteClient.java
+++ b/plc4j/drivers/plc4x/src/test/java/org/apache/plc4x/java/plc4x/Plc4xWriteClient.java
@@ -18,7 +18,7 @@
  */
 package org.apache.plc4x.java.plc4x;
 
-import org.apache.plc4x.java.PlcDriverManager;
+import org.apache.plc4x.java.DefaultPlcDriverManager;
 import org.apache.plc4x.java.api.PlcConnection;
 import org.apache.plc4x.java.api.messages.PlcWriteRequest;
 import org.apache.plc4x.java.api.messages.PlcWriteResponse;
@@ -28,7 +28,7 @@ import java.math.BigInteger;
 public class Plc4xWriteClient {
 
     public static void main(String[] args) throws Exception {
-        try (final PlcConnection connection = new PlcDriverManager().getConnection("plc4x://localhost?remote-connection-string=simulated%3A%2F%2Flocalhost")) {
+        try (final PlcConnection connection = new DefaultPlcDriverManager().getConnection("plc4x://localhost?remote-connection-string=simulated%3A%2F%2Flocalhost")) {
             final PlcWriteRequest.Builder requestBuilder = connection.writeRequestBuilder();
             requestBuilder.addTagAddress("test-BOOL", "STDOUT/foo:BOOL", true);
             requestBuilder.addTagAddress("test-BYTE", "STDOUT/foo:BYTE", new boolean[] {true, true, false, true, false, true, false, true});
diff --git a/plc4j/drivers/profinet/src/test/java/org/apache/plc4x/java/profinet/ManualProfinetIoDiscoveryTest.java b/plc4j/drivers/profinet/src/test/java/org/apache/plc4x/java/profinet/ManualProfinetIoDiscoveryTest.java
index b5b2967d4a..c0f25a6e0c 100644
--- a/plc4j/drivers/profinet/src/test/java/org/apache/plc4x/java/profinet/ManualProfinetIoDiscoveryTest.java
+++ b/plc4j/drivers/profinet/src/test/java/org/apache/plc4x/java/profinet/ManualProfinetIoDiscoveryTest.java
@@ -18,14 +18,14 @@
  */
 package org.apache.plc4x.java.profinet;
 
-import org.apache.plc4x.java.PlcDriverManager;
+import org.apache.plc4x.java.DefaultPlcDriverManager;
 import org.apache.plc4x.java.api.PlcDriver;
 import org.apache.plc4x.java.api.messages.PlcDiscoveryResponse;
 
 public class ManualProfinetIoDiscoveryTest {
 
     public static void main(String[] args) throws Exception {
-        final PlcDriver profinetDriver = new PlcDriverManager().getDriver("profinet");
+        final PlcDriver profinetDriver = new DefaultPlcDriverManager().getDriver("profinet");
         final PlcDiscoveryResponse plcDiscoveryResponse = profinetDriver.discoveryRequestBuilder().build().execute().get();
         System.out.println(plcDiscoveryResponse);
     }
diff --git a/plc4j/drivers/profinet/src/test/java/org/apache/plc4x/java/profinet/ManualProfinetIoTest.java b/plc4j/drivers/profinet/src/test/java/org/apache/plc4x/java/profinet/ManualProfinetIoTest.java
index c68927164f..8d3fe5b07b 100644
--- a/plc4j/drivers/profinet/src/test/java/org/apache/plc4x/java/profinet/ManualProfinetIoTest.java
+++ b/plc4j/drivers/profinet/src/test/java/org/apache/plc4x/java/profinet/ManualProfinetIoTest.java
@@ -18,7 +18,7 @@
  */
 package org.apache.plc4x.java.profinet;
 
-import org.apache.plc4x.java.PlcDriverManager;
+import org.apache.plc4x.java.DefaultPlcDriverManager;
 import org.apache.plc4x.java.api.PlcConnection;
 import org.apache.plc4x.java.api.messages.PlcReadRequest;
 import org.apache.plc4x.java.api.messages.PlcReadResponse;
@@ -26,7 +26,7 @@ import org.apache.plc4x.java.api.messages.PlcReadResponse;
 public class ManualProfinetIoTest {
 
     public static void main(String[] args) throws Exception {
-        final PlcConnection connection = new PlcDriverManager().getConnection("profinet://192.168.24.31");
+        final PlcConnection connection = new DefaultPlcDriverManager().getConnection("profinet://192.168.24.31");
         final PlcReadRequest readRequest = connection.readRequestBuilder().addTagAddress("test", "").build();
         final PlcReadResponse plcReadResponse = readRequest.execute().get();
         System.out.println(plcReadResponse);
diff --git a/plc4j/drivers/s7/src/test/java/org/apache/plc4x/java/s7/readwrite/DatatypesTest.java b/plc4j/drivers/s7/src/test/java/org/apache/plc4x/java/s7/readwrite/DatatypesTest.java
index 08f210f615..2eff79c283 100644
--- a/plc4j/drivers/s7/src/test/java/org/apache/plc4x/java/s7/readwrite/DatatypesTest.java
+++ b/plc4j/drivers/s7/src/test/java/org/apache/plc4x/java/s7/readwrite/DatatypesTest.java
@@ -18,7 +18,7 @@
  */
 package org.apache.plc4x.java.s7.readwrite;
 
-import org.apache.plc4x.java.PlcDriverManager;
+import org.apache.plc4x.java.DefaultPlcDriverManager;
 import org.apache.plc4x.java.api.PlcConnection;
 import org.apache.plc4x.java.api.messages.PlcReadRequest;
 import org.apache.plc4x.java.api.messages.PlcReadResponse;
@@ -26,7 +26,7 @@ import org.apache.plc4x.java.api.messages.PlcReadResponse;
 public class DatatypesTest {
 
     public static void main(String[] args) throws Exception {
-        try (PlcConnection connection = new PlcDriverManager().getConnection("s7://192.168.23.30")) {
+        try (PlcConnection connection = new DefaultPlcDriverManager().getConnection("s7://192.168.23.30")) {
             final PlcReadRequest.Builder builder = connection.readRequestBuilder();
             builder.addTagAddress("bool-value-1", "%DB2:0.0:BOOL"); // true
             builder.addTagAddress("bool-value-2", "%DB2:2.1:BOOL"); // false
diff --git a/plc4j/examples/hello-ads-telemetry/src/main/java/org/apache/plc4x/java/examples/helloads/telemetry/HelloAdsTelemetry.java b/plc4j/examples/hello-ads-telemetry/src/main/java/org/apache/plc4x/java/examples/helloads/telemetry/HelloAdsTelemetry.java
index 850a393928..ef4eb86b7f 100644
--- a/plc4j/examples/hello-ads-telemetry/src/main/java/org/apache/plc4x/java/examples/helloads/telemetry/HelloAdsTelemetry.java
+++ b/plc4j/examples/hello-ads-telemetry/src/main/java/org/apache/plc4x/java/examples/helloads/telemetry/HelloAdsTelemetry.java
@@ -18,8 +18,8 @@
  */
 package org.apache.plc4x.java.examples.helloads.telemetry;
 
-import org.apache.plc4x.java.PlcDriverManager;
 import org.apache.plc4x.java.api.PlcConnection;
+import org.apache.plc4x.java.api.PlcDriverManager;
 import org.apache.plc4x.java.api.messages.PlcReadResponse;
 import org.apache.plc4x.java.api.types.PlcResponseCode;
 import org.slf4j.Logger;
@@ -75,7 +75,7 @@ public class HelloAdsTelemetry {
 
         String remoteIp = args[0];
         String localIp = args[1];
-        try (PlcConnection connection = new PlcDriverManager().getConnection(String.format("ads:tcp://%s?targetAmsNetId=%s.1.1&targetAmsPort=10000&sourceAmsNetId=%s.1.1&sourceAmsPort=65534&load-symbol-and-data-type-tables=false", remoteIp, remoteIp, localIp))) {
+        try (PlcConnection connection = PlcDriverManager.getDefault().getConnectionManager().getConnection(String.format("ads:tcp://%s?targetAmsNetId=%s.1.1&targetAmsPort=10000&sourceAmsNetId=%s.1.1&sourceAmsPort=65534&load-symbol-and-data-type-tables=false", remoteIp, remoteIp, localIp))) {
             // Load the number of modules:
             int numModules = connection.readRequestBuilder().addTagAddress("numberOfModules", "0x0000F302/0xF0200000:UINT").build().execute().get().getInteger("numberOfModules");
 
diff --git a/plc4j/examples/hello-cloud-azure/src/main/java/org/apache/plc4x/java/examples/cloud/azure/S7PlcToAzureIoTHubSample.java b/plc4j/examples/hello-cloud-azure/src/main/java/org/apache/plc4x/java/examples/cloud/azure/S7PlcToAzureIoTHubSample.java
index ed118a5933..1c97a84685 100644
--- a/plc4j/examples/hello-cloud-azure/src/main/java/org/apache/plc4x/java/examples/cloud/azure/S7PlcToAzureIoTHubSample.java
+++ b/plc4j/examples/hello-cloud-azure/src/main/java/org/apache/plc4x/java/examples/cloud/azure/S7PlcToAzureIoTHubSample.java
@@ -21,8 +21,8 @@ package org.apache.plc4x.java.examples.cloud.azure;
 import com.microsoft.azure.sdk.iot.device.DeviceClient;
 import com.microsoft.azure.sdk.iot.device.IotHubClientProtocol;
 import com.microsoft.azure.sdk.iot.device.Message;
-import org.apache.plc4x.java.PlcDriverManager;
 import org.apache.plc4x.java.api.PlcConnection;
+import org.apache.plc4x.java.api.PlcDriverManager;
 import org.apache.plc4x.java.api.messages.PlcReadRequest;
 import org.apache.plc4x.java.api.messages.PlcReadResponse;
 import org.slf4j.Logger;
@@ -54,7 +54,7 @@ public class S7PlcToAzureIoTHubSample {
 
         // Open both a connection to the remote PLC and the cloud service.
         DeviceClient client = new DeviceClient(options.getIotHubConnectionString(), IotHubClientProtocol.MQTT);
-        try (PlcConnection plcConnection = new PlcDriverManager().getConnection(options.getPlc4xConnectionString())) {
+        try (PlcConnection plcConnection = PlcDriverManager.getDefault().getConnectionManager().getConnection(options.getPlc4xConnectionString())) {
 
             LOGGER.info("Connected");
 
diff --git a/plc4j/examples/hello-cloud-google/src/main/java/org/apache/plc4x/java/examples/cloud/google/S7PlcToGoogleIoTCoreSample.java b/plc4j/examples/hello-cloud-google/src/main/java/org/apache/plc4x/java/examples/cloud/google/S7PlcToGoogleIoTCoreSample.java
index 7bbf5c760e..2f7943ef17 100644
--- a/plc4j/examples/hello-cloud-google/src/main/java/org/apache/plc4x/java/examples/cloud/google/S7PlcToGoogleIoTCoreSample.java
+++ b/plc4j/examples/hello-cloud-google/src/main/java/org/apache/plc4x/java/examples/cloud/google/S7PlcToGoogleIoTCoreSample.java
@@ -21,8 +21,8 @@ package org.apache.plc4x.java.examples.cloud.google;
 import io.jsonwebtoken.JwtBuilder;
 import io.jsonwebtoken.Jwts;
 import io.jsonwebtoken.SignatureAlgorithm;
-import org.apache.plc4x.java.PlcDriverManager;
 import org.apache.plc4x.java.api.PlcConnection;
+import org.apache.plc4x.java.api.PlcDriverManager;
 import org.apache.plc4x.java.api.messages.PlcReadRequest;
 import org.apache.plc4x.java.api.messages.PlcReadResponse;
 import org.eclipse.paho.client.mqttv3.*;
@@ -236,7 +236,7 @@ public class S7PlcToGoogleIoTCoreSample {
 
         // Connect to Plc
         logger.info("Connecting to Plc");
-        try (PlcConnection plcConnection = new PlcDriverManager().getConnection("s7://10.10.64.20/1/1")) {
+        try (PlcConnection plcConnection = PlcDriverManager.getDefault().getConnectionManager().getConnection("s7://10.10.64.20/1/1")) {
             logger.info("Connected");
 
             PlcReadRequest readRequest = plcConnection.readRequestBuilder().addTagAddress("outputs", "OUTPUTS/0").build();
diff --git a/plc4j/examples/hello-connectivity-mqtt/src/main/java/org/apache/plc4x/java/examples/connectivity/mqtt/MqttConnector.java b/plc4j/examples/hello-connectivity-mqtt/src/main/java/org/apache/plc4x/java/examples/connectivity/mqtt/MqttConnector.java
index 5a92e47e7c..54c2b203c4 100644
--- a/plc4j/examples/hello-connectivity-mqtt/src/main/java/org/apache/plc4x/java/examples/connectivity/mqtt/MqttConnector.java
+++ b/plc4j/examples/hello-connectivity-mqtt/src/main/java/org/apache/plc4x/java/examples/connectivity/mqtt/MqttConnector.java
@@ -31,8 +31,8 @@ import com.hivemq.client.mqtt.mqtt3.message.publish.Mqtt3PublishResult;
 import io.reactivex.Flowable;
 import io.reactivex.Single;
 import org.apache.commons.lang3.StringUtils;
-import org.apache.plc4x.java.PlcDriverManager;
 import org.apache.plc4x.java.api.PlcConnection;
+import org.apache.plc4x.java.api.PlcDriverManager;
 import org.apache.plc4x.java.api.exceptions.PlcException;
 import org.apache.plc4x.java.api.messages.PlcReadRequest;
 import org.apache.plc4x.java.api.messages.PlcReadResponse;
@@ -83,7 +83,7 @@ public class MqttConnector {
         final Single<Mqtt3ConnAck> connAckSingle = client.connect().timeout(10, TimeUnit.SECONDS);
 
         // Connect to the PLC.
-        try (PlcConnection plcConnection = new PlcDriverManager().getConnection(config.getPlcConfig().getConnection())) {
+        try (PlcConnection plcConnection = PlcDriverManager.getDefault().getConnectionManager().getConnection(config.getPlcConfig().getConnection())) {
 
             // Check if this connection support reading of data.
             if (!plcConnection.getMetadata().canRead()) {
diff --git a/plc4j/examples/hello-discovery/src/main/java/org/apache/plc4x/java/examples/hellodiscovery/HelloDiscovery.java b/plc4j/examples/hello-discovery/src/main/java/org/apache/plc4x/java/examples/hellodiscovery/HelloDiscovery.java
index 33fdcf947e..0c89513883 100644
--- a/plc4j/examples/hello-discovery/src/main/java/org/apache/plc4x/java/examples/hellodiscovery/HelloDiscovery.java
+++ b/plc4j/examples/hello-discovery/src/main/java/org/apache/plc4x/java/examples/hellodiscovery/HelloDiscovery.java
@@ -18,8 +18,8 @@
  */
 package org.apache.plc4x.java.examples.hellodiscovery;
 
-import org.apache.plc4x.java.PlcDriverManager;
 import org.apache.plc4x.java.api.PlcDriver;
+import org.apache.plc4x.java.api.PlcDriverManager;
 import org.apache.plc4x.java.api.messages.*;
 import org.apache.plc4x.java.api.types.PlcResponseCode;
 import org.slf4j.Logger;
@@ -44,7 +44,7 @@ public class HelloDiscovery {
             System.exit(1);
         }
 
-        PlcDriverManager plcDriverManager = new PlcDriverManager();
+        PlcDriverManager plcDriverManager = PlcDriverManager.getDefault();
         Set<String> driverCodes = plcDriverManager.listDrivers();
         for (String driverCode : driverCodes) {
             logger.info("Executing Discovery for Driver: {}", driverCode);
diff --git a/plc4j/examples/hello-influx-data-collection/src/main/java/org/apache/plc4x/java/examples/helloinflux/HelloInflux.java b/plc4j/examples/hello-influx-data-collection/src/main/java/org/apache/plc4x/java/examples/helloinflux/HelloInflux.java
index 989e7180f2..d89e4d35ea 100644
--- a/plc4j/examples/hello-influx-data-collection/src/main/java/org/apache/plc4x/java/examples/helloinflux/HelloInflux.java
+++ b/plc4j/examples/hello-influx-data-collection/src/main/java/org/apache/plc4x/java/examples/helloinflux/HelloInflux.java
@@ -26,7 +26,7 @@ import com.influxdb.client.write.Point;
 import org.apache.commons.configuration2.Configuration;
 import org.apache.commons.configuration2.builder.fluent.Configurations;
 import org.apache.commons.configuration2.ex.ConfigurationException;
-import org.apache.plc4x.java.PlcDriverManager;
+import org.apache.plc4x.java.DefaultPlcDriverManager;
 import org.apache.plc4x.java.api.PlcConnection;
 import org.apache.plc4x.java.api.exceptions.PlcException;
 import org.apache.plc4x.java.api.exceptions.PlcRuntimeException;
@@ -141,7 +141,7 @@ public class HelloInflux {
 
     private PlcConnection connectToPlc() throws PlcException {
         final PlcConnection connection =
-            new PlcDriverManager().getConnection(configuration.getString("plc.connectionString"));
+            new DefaultPlcDriverManager().getConnection(configuration.getString("plc.connectionString"));
         connection.connect();
         return connection;
     }
diff --git a/plc4j/examples/hello-nats/src/main/java/org/apache/plc4x/java/examples/hellonats/HelloNats.java b/plc4j/examples/hello-nats/src/main/java/org/apache/plc4x/java/examples/hellonats/HelloNats.java
index 303dbee3c6..07af104397 100644
--- a/plc4j/examples/hello-nats/src/main/java/org/apache/plc4x/java/examples/hellonats/HelloNats.java
+++ b/plc4j/examples/hello-nats/src/main/java/org/apache/plc4x/java/examples/hellonats/HelloNats.java
@@ -23,7 +23,6 @@ import io.nats.client.api.StorageType;
 import io.nats.client.api.StreamConfiguration;
 import io.nats.client.api.StreamInfo;
 import io.nats.client.support.JsonUtils;
-import org.apache.plc4x.java.PlcDriverManager;
 import org.apache.plc4x.java.api.PlcConnection;
 import org.apache.plc4x.java.api.messages.PlcReadRequest;
 import org.apache.plc4x.java.api.messages.PlcReadResponse;
diff --git a/plc4j/examples/hello-webservice/src/main/java/org/apache/plc4x/java/examples/hellowebservice/HelloWebservice.java b/plc4j/examples/hello-webservice/src/main/java/org/apache/plc4x/java/examples/hellowebservice/HelloWebservice.java
index 2d9eeccda9..4ed3f4ba70 100644
--- a/plc4j/examples/hello-webservice/src/main/java/org/apache/plc4x/java/examples/hellowebservice/HelloWebservice.java
+++ b/plc4j/examples/hello-webservice/src/main/java/org/apache/plc4x/java/examples/hellowebservice/HelloWebservice.java
@@ -27,8 +27,8 @@ import org.apache.http.entity.StringEntity;
 import org.apache.http.impl.client.CloseableHttpClient;
 import org.apache.http.impl.client.HttpClients;
 import org.apache.http.util.EntityUtils;
-import org.apache.plc4x.java.PlcDriverManager;
 import org.apache.plc4x.java.api.PlcConnection;
+import org.apache.plc4x.java.api.PlcDriverManager;
 import org.apache.plc4x.java.api.messages.PlcSubscriptionEvent;
 import org.apache.plc4x.java.api.messages.PlcSubscriptionRequest;
 import org.apache.plc4x.java.api.messages.PlcSubscriptionResponse;
@@ -56,7 +56,7 @@ public class HelloWebservice {
 
     public void run() throws Exception {
         // Establish a connection to the plc.
-        try (PlcConnection plcConnection = new PlcDriverManager().getConnection(options.getConnectionString())) {
+        try (PlcConnection plcConnection = PlcDriverManager.getDefault().getConnectionManager().getConnection(options.getConnectionString())) {
 
             // Check if this connection support subscriptions.
             if (!plcConnection.getMetadata().canSubscribe()) {
diff --git a/plc4j/examples/hello-world-kotlin/src/main/kotlin/org/apache/plc4x/java/examples/hellokotlin/ReadModbusPal.kt b/plc4j/examples/hello-world-kotlin/src/main/kotlin/org/apache/plc4x/java/examples/hellokotlin/ReadModbusPal.kt
index 4438308a89..7df03417cb 100644
--- a/plc4j/examples/hello-world-kotlin/src/main/kotlin/org/apache/plc4x/java/examples/hellokotlin/ReadModbusPal.kt
+++ b/plc4j/examples/hello-world-kotlin/src/main/kotlin/org/apache/plc4x/java/examples/hellokotlin/ReadModbusPal.kt
@@ -18,13 +18,13 @@
  */
 package org.apache.plc4x.java.examples.hellokotlin;
 
-import org.apache.plc4x.java.PlcDriverManager
+import org.apache.plc4x.java.DefaultPlcDriverManager
 import org.apache.plc4x.java.api.types.PlcResponseCode
 import java.util.concurrent.TimeUnit
 import kotlin.system.exitProcess
 
 fun main() {
-    PlcDriverManager()
+    DefaultPlcDriverManager()
         .getConnection("modbus-tcp://localhost:502")
         .use { conn ->
             if (!conn.metadata.canRead()) {
diff --git a/plc4j/examples/hello-world-plc4x-discover-and-browse/src/main/java/org/apache/plc4x/java/examples/helloplc4x/discoverandbrowse/HelloPlc4xDiscoverAndBrowse.java b/plc4j/examples/hello-world-plc4x-discover-and-browse/src/main/java/org/apache/plc4x/java/examples/helloplc4x/discoverandbrowse/HelloPlc4xDiscoverAndBrowse.java
index 1bad000c88..11d4b5c68d 100644
--- a/plc4j/examples/hello-world-plc4x-discover-and-browse/src/main/java/org/apache/plc4x/java/examples/helloplc4x/discoverandbrowse/HelloPlc4xDiscoverAndBrowse.java
+++ b/plc4j/examples/hello-world-plc4x-discover-and-browse/src/main/java/org/apache/plc4x/java/examples/helloplc4x/discoverandbrowse/HelloPlc4xDiscoverAndBrowse.java
@@ -19,9 +19,10 @@
 package org.apache.plc4x.java.examples.helloplc4x.discoverandbrowse;
 
 import org.apache.commons.lang3.StringUtils;
-import org.apache.plc4x.java.PlcDriverManager;
 import org.apache.plc4x.java.api.PlcConnection;
+import org.apache.plc4x.java.api.PlcConnectionManager;
 import org.apache.plc4x.java.api.PlcDriver;
+import org.apache.plc4x.java.api.PlcDriverManager;
 import org.apache.plc4x.java.api.messages.PlcBrowseItem;
 import org.apache.plc4x.java.api.messages.PlcBrowseRequest;
 import org.apache.plc4x.java.api.messages.PlcDiscoveryRequest;
@@ -34,7 +35,8 @@ public class HelloPlc4xDiscoverAndBrowse {
 
     public static void main(String[] args) throws Exception {
         // Iterate over all installed drivers and execute their browse functionality (If they support it)
-        PlcDriverManager driverManager = new PlcDriverManager();
+        PlcDriverManager driverManager = PlcDriverManager.getDefault();
+        PlcConnectionManager connectionManager = driverManager.getConnectionManager();
         for (String protocolCode : driverManager.listDrivers()) {
             PlcDriver driver = driverManager.getDriver(protocolCode);
             if (driver.getMetadata().canDiscover()) {
@@ -44,7 +46,7 @@ public class HelloPlc4xDiscoverAndBrowse {
 
                 discoveryRequest.executeWithHandler(discoveryItem -> {
                     logger.info(" - Found device with connection-url {}", discoveryItem.getConnectionUrl());
-                    try (PlcConnection connection = driverManager.getConnection(discoveryItem.getConnectionUrl())) {
+                    try (PlcConnection connection = connectionManager.getConnection(discoveryItem.getConnectionUrl())) {
                         if (connection.getMetadata().canBrowse()) {
                             PlcBrowseRequest browseRequest = connection.browseRequestBuilder().build();
                             browseRequest.execute().whenComplete((browseResponse, throwable) -> {
diff --git a/plc4j/examples/hello-world-plc4x-read/src/main/java/org/apache/plc4x/java/examples/helloplc4x/read/HelloPlc4xRead.java b/plc4j/examples/hello-world-plc4x-read/src/main/java/org/apache/plc4x/java/examples/helloplc4x/read/HelloPlc4xRead.java
index f0a345a570..922cf3acef 100644
--- a/plc4j/examples/hello-world-plc4x-read/src/main/java/org/apache/plc4x/java/examples/helloplc4x/read/HelloPlc4xRead.java
+++ b/plc4j/examples/hello-world-plc4x-read/src/main/java/org/apache/plc4x/java/examples/helloplc4x/read/HelloPlc4xRead.java
@@ -18,8 +18,8 @@
  */
 package org.apache.plc4x.java.examples.helloplc4x.read;
 
-import org.apache.plc4x.java.PlcDriverManager;
 import org.apache.plc4x.java.api.PlcConnection;
+import org.apache.plc4x.java.api.PlcDriverManager;
 import org.apache.plc4x.java.api.messages.PlcReadRequest;
 import org.apache.plc4x.java.api.messages.PlcReadResponse;
 import org.apache.plc4x.java.api.types.PlcResponseCode;
@@ -46,7 +46,7 @@ public class HelloPlc4xRead {
         }
 
         // Establish a connection to the plc using the url provided as first argument
-        try (PlcConnection plcConnection = new PlcDriverManager().getConnection(options.getConnectionString())) {
+        try (PlcConnection plcConnection = PlcDriverManager.getDefault().getConnectionManager().getConnection(options.getConnectionString())) {
 
             // Check if this connection support reading of data.
             if (!plcConnection.getMetadata().canRead()) {
diff --git a/plc4j/examples/hello-world-plc4x-subscribe/src/main/java/org/apache/plc4x/java/examples/helloplc4x/subscribe/HelloPlc4xSubscription.java b/plc4j/examples/hello-world-plc4x-subscribe/src/main/java/org/apache/plc4x/java/examples/helloplc4x/subscribe/HelloPlc4xSubscription.java
index 33eca3cb6c..b6bb81feed 100644
--- a/plc4j/examples/hello-world-plc4x-subscribe/src/main/java/org/apache/plc4x/java/examples/helloplc4x/subscribe/HelloPlc4xSubscription.java
+++ b/plc4j/examples/hello-world-plc4x-subscribe/src/main/java/org/apache/plc4x/java/examples/helloplc4x/subscribe/HelloPlc4xSubscription.java
@@ -18,8 +18,8 @@
  */
 package org.apache.plc4x.java.examples.helloplc4x.subscribe;
 
-import org.apache.plc4x.java.PlcDriverManager;
 import org.apache.plc4x.java.api.PlcConnection;
+import org.apache.plc4x.java.api.PlcDriverManager;
 import org.apache.plc4x.java.api.messages.PlcSubscriptionEvent;
 import org.apache.plc4x.java.api.messages.PlcSubscriptionRequest;
 import org.apache.plc4x.java.api.messages.PlcSubscriptionResponse;
@@ -43,7 +43,7 @@ public class HelloPlc4xSubscription {
 
     public void run() throws Exception {
         // Establish a connection to the plc.
-        try (PlcConnection plcConnection = new PlcDriverManager().getConnection(options.getConnectionString())) {
+        try (PlcConnection plcConnection = PlcDriverManager.getDefault().getConnectionManager().getConnection(options.getConnectionString())) {
 
             // Check if this connection support subscriptions.
             if (!plcConnection.getMetadata().canSubscribe()) {
diff --git a/plc4j/examples/hello-world-plc4x-write/src/main/java/org/apache/plc4x/java/examples/helloplc4x/write/HelloPlc4xWrite.java b/plc4j/examples/hello-world-plc4x-write/src/main/java/org/apache/plc4x/java/examples/helloplc4x/write/HelloPlc4xWrite.java
index b885039563..8f743f1424 100644
--- a/plc4j/examples/hello-world-plc4x-write/src/main/java/org/apache/plc4x/java/examples/helloplc4x/write/HelloPlc4xWrite.java
+++ b/plc4j/examples/hello-world-plc4x-write/src/main/java/org/apache/plc4x/java/examples/helloplc4x/write/HelloPlc4xWrite.java
@@ -18,8 +18,8 @@
  */
 package org.apache.plc4x.java.examples.helloplc4x.write;
 
-import org.apache.plc4x.java.PlcDriverManager;
 import org.apache.plc4x.java.api.PlcConnection;
+import org.apache.plc4x.java.api.PlcDriverManager;
 import org.apache.plc4x.java.api.messages.*;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -36,7 +36,7 @@ public class HelloPlc4xWrite {
 
     public void run() throws Exception {
         // Establish a connection to the plc.
-        try (PlcConnection plcConnection = new PlcDriverManager().getConnection(options.getConnectionString())) {
+        try (PlcConnection plcConnection = PlcDriverManager.getDefault().getConnectionManager().getConnection(options.getConnectionString())) {
 
             // Check if this connection support subscriptions.
             if (!plcConnection.getMetadata().canWrite()) {
diff --git a/plc4j/examples/plc4j-s7event/src/main/java/org/apache/plc4x/examples/plc4j/s7event/EventSubscription.java b/plc4j/examples/plc4j-s7event/src/main/java/org/apache/plc4x/examples/plc4j/s7event/EventSubscription.java
index 30b5f47c68..242bf4704f 100644
--- a/plc4j/examples/plc4j-s7event/src/main/java/org/apache/plc4x/examples/plc4j/s7event/EventSubscription.java
+++ b/plc4j/examples/plc4j-s7event/src/main/java/org/apache/plc4x/examples/plc4j/s7event/EventSubscription.java
@@ -20,7 +20,7 @@ package org.apache.plc4x.examples.plc4j.s7event;
 
 import java.util.Map;
 
-import org.apache.plc4x.java.PlcDriverManager;
+import org.apache.plc4x.java.DefaultPlcDriverManager;
 import org.apache.plc4x.java.api.PlcConnection;
 import org.apache.plc4x.java.api.messages.PlcSubscriptionRequest;
 import org.apache.plc4x.java.api.messages.PlcSubscriptionResponse;
@@ -42,7 +42,7 @@ public class EventSubscription {
      * @param args the command line arguments
      */
     public static void main(String[] args) throws Exception {
-        try (PlcConnection connection = new PlcDriverManager().getConnection("s7://192.168.1.51?remote-rack=0&remote-slot=3&controller-type=S7_400")) {
+        try (PlcConnection connection = new DefaultPlcDriverManager().getConnection("s7://192.168.1.51?remote-rack=0&remote-slot=3&controller-type=S7_400")) {
             final PlcSubscriptionRequest.Builder subscription = connection.subscriptionRequestBuilder();
 
             subscription.addEventTagAddress("myMODE", "MODE");
diff --git a/plc4j/examples/poll-loop/src/main/java/org/apache/plc4x/java/examples/pollloop/PollLoop.java b/plc4j/examples/poll-loop/src/main/java/org/apache/plc4x/java/examples/pollloop/PollLoop.java
index a65e379901..1a1bdb02dd 100644
--- a/plc4j/examples/poll-loop/src/main/java/org/apache/plc4x/java/examples/pollloop/PollLoop.java
+++ b/plc4j/examples/poll-loop/src/main/java/org/apache/plc4x/java/examples/pollloop/PollLoop.java
@@ -26,8 +26,9 @@ import java.util.concurrent.TimeoutException;
 import java.util.concurrent.atomic.AtomicBoolean;
 import java.util.logging.Level;
 import java.util.logging.Logger;
-import org.apache.plc4x.java.PlcDriverManager;
+
 import org.apache.plc4x.java.api.PlcConnection;
+import org.apache.plc4x.java.api.PlcDriverManager;
 import org.apache.plc4x.java.api.exceptions.PlcConnectionException;
 import org.apache.plc4x.java.api.messages.PlcReadRequest;
 import org.apache.plc4x.java.api.messages.PlcReadResponse;
@@ -157,7 +158,7 @@ public class PollLoop {
             }
 
             try {
-                plcConnection = new PlcDriverManager().getConnection(connectionString);
+                plcConnection = PlcDriverManager.getDefault().getConnectionManager().getConnection(connectionString);
                 // in osgi/karaf uses this instead
 //                switch (plcType) {
 //                    case PLC4JTYPE_SIEMENS:
diff --git a/plc4j/integrations/apache-kafka/src/main/java/org/apache/plc4x/kafka/config/Sink.java b/plc4j/integrations/apache-kafka/src/main/java/org/apache/plc4x/kafka/config/Sink.java
index 6d08488c23..be7bb3f237 100644
--- a/plc4j/integrations/apache-kafka/src/main/java/org/apache/plc4x/kafka/config/Sink.java
+++ b/plc4j/integrations/apache-kafka/src/main/java/org/apache/plc4x/kafka/config/Sink.java
@@ -18,11 +18,10 @@
  */
 package org.apache.plc4x.kafka.config;
 
-import org.apache.plc4x.java.PlcDriverManager;
-
 import org.apache.kafka.common.config.AbstractConfig;
 import org.apache.kafka.common.config.ConfigDef;
 import org.apache.kafka.common.config.ConfigException;
+import org.apache.plc4x.java.DefaultPlcDriverManager;
 
 import java.util.Map;
 import java.util.ArrayList;
@@ -57,7 +56,7 @@ public class Sink extends AbstractConfig{
                 String.format("Connection string shouldn't be null for source %s ", this.name));
         }
         try {
-            new PlcDriverManager().getDriverForUrl(connectionString);
+            new DefaultPlcDriverManager().getDriverForUrl(connectionString);
         } catch (Exception e) {
             throw new ConfigException(
                 String.format("Connection String format is incorrect %s ", Constants.SINKS_CONFIG + "." + this.name + "." + Constants.CONNECTION_STRING_CONFIG + "=" + connectionString));
diff --git a/plc4j/integrations/apache-kafka/src/main/java/org/apache/plc4x/kafka/config/Source.java b/plc4j/integrations/apache-kafka/src/main/java/org/apache/plc4x/kafka/config/Source.java
index 6ffff8934f..cfe0003b97 100644
--- a/plc4j/integrations/apache-kafka/src/main/java/org/apache/plc4x/kafka/config/Source.java
+++ b/plc4j/integrations/apache-kafka/src/main/java/org/apache/plc4x/kafka/config/Source.java
@@ -18,16 +18,13 @@
  */
 package org.apache.plc4x.kafka.config;
 
-import org.apache.plc4x.java.PlcDriverManager;
-
 import org.apache.kafka.common.config.AbstractConfig;
 import org.apache.kafka.common.config.ConfigDef;
-import org.apache.kafka.common.config.Config;
 import org.apache.kafka.common.config.ConfigException;
-import org.apache.kafka.common.config.ConfigValue;
+import org.apache.plc4x.java.DefaultPlcDriverManager;
+
 import java.util.Map;
 import java.util.ArrayList;
-import java.util.HashMap;
 import java.util.List;
 
 public class Source extends AbstractConfig{
@@ -73,7 +70,7 @@ public class Source extends AbstractConfig{
                 String.format("Connection string shouldn't be null for source %s ", this.name));
         }
         try {
-            new PlcDriverManager().getDriverForUrl(connectionString);
+            new DefaultPlcDriverManager().getDriverForUrl(connectionString);
         } catch (Exception e) {
             throw new ConfigException(
                 String.format("Connection String format is incorrect %s ", SOURCES_CONFIG + "." + this.name + "." + CONNECTION_STRING_CONFIG + "=" + connectionString));
diff --git a/plc4j/integrations/opcua-server/src/main/java/org/apache/plc4x/java/opcuaserver/backend/Plc4xCommunication.java b/plc4j/integrations/opcua-server/src/main/java/org/apache/plc4x/java/opcuaserver/backend/Plc4xCommunication.java
index 0d4c406220..e2ff465107 100644
--- a/plc4j/integrations/opcua-server/src/main/java/org/apache/plc4x/java/opcuaserver/backend/Plc4xCommunication.java
+++ b/plc4j/integrations/opcua-server/src/main/java/org/apache/plc4x/java/opcuaserver/backend/Plc4xCommunication.java
@@ -18,8 +18,8 @@
  */
 package org.apache.plc4x.java.opcuaserver.backend;
 
-import org.apache.plc4x.java.PlcDriverManager;
 import org.apache.plc4x.java.api.PlcConnection;
+import org.apache.plc4x.java.api.PlcDriverManager;
 import org.apache.plc4x.java.api.exceptions.PlcConnectionException;
 import org.apache.plc4x.java.api.messages.PlcReadRequest;
 import org.apache.plc4x.java.api.messages.PlcReadResponse;
@@ -71,7 +71,7 @@ public class Plc4xCommunication extends AbstractLifecycle {
 
     @Override
     protected void onStartup() {
-        setDriverManager(new PlcDriverManager());
+        setDriverManager(PlcDriverManager.getDefault());
     }
 
     @Override
@@ -85,7 +85,7 @@ public class Plc4xCommunication extends AbstractLifecycle {
 
     public void setDriverManager(PlcDriverManager driverManager) {
         this.driverManager = driverManager;
-        this.cachedPlcConnectionManager = CachedPlcConnectionManager.getBuilder(driverManager).build();
+        this.cachedPlcConnectionManager = CachedPlcConnectionManager.getBuilder(driverManager.getConnectionManager()).build();
     }
 
     public PlcTag getTag(String tag, String connectionString) throws PlcConnectionException {
diff --git a/plc4j/integrations/opcua-server/src/main/java/org/apache/plc4x/java/opcuaserver/backend/Plc4xNamespace.java b/plc4j/integrations/opcua-server/src/main/java/org/apache/plc4x/java/opcuaserver/backend/Plc4xNamespace.java
index d47ea54625..fd4d6e9188 100644
--- a/plc4j/integrations/opcua-server/src/main/java/org/apache/plc4x/java/opcuaserver/backend/Plc4xNamespace.java
+++ b/plc4j/integrations/opcua-server/src/main/java/org/apache/plc4x/java/opcuaserver/backend/Plc4xNamespace.java
@@ -18,7 +18,7 @@
  */
 package org.apache.plc4x.java.opcuaserver.backend;
 
-import org.apache.plc4x.java.PlcDriverManager;
+import org.apache.plc4x.java.DefaultPlcDriverManager;
 import org.apache.plc4x.java.api.exceptions.PlcConnectionException;
 import org.apache.plc4x.java.opcuaserver.configuration.Configuration;
 import org.apache.plc4x.java.opcuaserver.configuration.DeviceConfiguration;
@@ -186,7 +186,7 @@ public class Plc4xNamespace extends ManagedNamespaceWithLifecycle {
 
             if (plc4xServer.getDriverManager() == null) {
                 plc4xServer.removeTag(item);
-                plc4xServer.setDriverManager(new PlcDriverManager());
+                plc4xServer.setDriverManager(new DefaultPlcDriverManager());
             }
         }
 
diff --git a/plc4j/integrations/opcua-server/src/test/java/org/apache/plc4x/java/opcuaserver/OpcuaPlcDriverTest.java b/plc4j/integrations/opcua-server/src/test/java/org/apache/plc4x/java/opcuaserver/OpcuaPlcDriverTest.java
index c5a6626cc7..8fb2a52f48 100644
--- a/plc4j/integrations/opcua-server/src/test/java/org/apache/plc4x/java/opcuaserver/OpcuaPlcDriverTest.java
+++ b/plc4j/integrations/opcua-server/src/test/java/org/apache/plc4x/java/opcuaserver/OpcuaPlcDriverTest.java
@@ -19,7 +19,7 @@
 package org.apache.plc4x.java.opcuaserver;
 
 import io.vavr.collection.List;
-import org.apache.plc4x.java.PlcDriverManager;
+import org.apache.plc4x.java.DefaultPlcDriverManager;
 import org.apache.plc4x.java.api.PlcConnection;
 import org.apache.plc4x.java.api.exceptions.PlcConnectionException;
 import org.apache.plc4x.java.api.messages.PlcReadRequest;
@@ -112,7 +112,7 @@ public class OpcuaPlcDriverTest {
         connectionStringValidSet.forEach(connectionAddress -> {
                 String connectionString = connectionAddress;
                 try {
-                    PlcConnection opcuaConnection = new PlcDriverManager().getConnection(connectionString);
+                    PlcConnection opcuaConnection = new DefaultPlcDriverManager().getConnection(connectionString);
                     assert opcuaConnection.isConnected();
                     opcuaConnection.close();
                     assert !opcuaConnection.isConnected();
@@ -132,7 +132,7 @@ public class OpcuaPlcDriverTest {
             discoveryParamValidSet.forEach(discoveryParam -> {
                 String connectionString = connectionAddress + paramSectionDivider + discoveryParam;
                 try {
-                    PlcConnection opcuaConnection = new PlcDriverManager().getConnection(connectionString);
+                    PlcConnection opcuaConnection = new DefaultPlcDriverManager().getConnection(connectionString);
                     assert opcuaConnection.isConnected();
                     opcuaConnection.close();
                     assert !opcuaConnection.isConnected();
@@ -150,7 +150,7 @@ public class OpcuaPlcDriverTest {
     @Test
     public void readVariables() throws Exception{
 
-            PlcConnection opcuaConnection = new PlcDriverManager().getConnection(tcpConnectionAddress);
+            PlcConnection opcuaConnection = new DefaultPlcDriverManager().getConnection(tcpConnectionAddress);
             assert opcuaConnection.isConnected();
 
             PlcReadRequest.Builder builder = opcuaConnection.readRequestBuilder();
@@ -199,7 +199,7 @@ public class OpcuaPlcDriverTest {
     @Test
     public void writeVariables() throws Exception {
 
-            PlcConnection opcuaConnection = new PlcDriverManager().getConnection(tcpConnectionAddress);
+            PlcConnection opcuaConnection = new DefaultPlcDriverManager().getConnection(tcpConnectionAddress);
             assert opcuaConnection.isConnected();
 
             PlcWriteRequest.Builder builder = opcuaConnection.writeRequestBuilder();
diff --git a/plc4j/tools/connection-cache/src/main/java/org/apache/plc4x/java/utils/cache/CachedPlcConnectionManager.java b/plc4j/tools/connection-cache/src/main/java/org/apache/plc4x/java/utils/cache/CachedPlcConnectionManager.java
index 1872f61505..650d976c85 100644
--- a/plc4j/tools/connection-cache/src/main/java/org/apache/plc4x/java/utils/cache/CachedPlcConnectionManager.java
+++ b/plc4j/tools/connection-cache/src/main/java/org/apache/plc4x/java/utils/cache/CachedPlcConnectionManager.java
@@ -18,7 +18,7 @@
  */
 package org.apache.plc4x.java.utils.cache;
 
-import org.apache.plc4x.java.PlcDriverManager;
+import org.apache.plc4x.java.DefaultPlcDriverManager;
 import org.apache.plc4x.java.api.PlcConnection;
 import org.apache.plc4x.java.api.PlcConnectionManager;
 import org.apache.plc4x.java.api.authentication.PlcAuthentication;
@@ -44,7 +44,7 @@ public class CachedPlcConnectionManager implements PlcConnectionManager {
     private final Map<String, ConnectionContainer> connectionContainers;
 
     public static Builder getBuilder() {
-        return new Builder(new PlcDriverManager());
+        return new Builder(new DefaultPlcDriverManager());
     }
 
     public static Builder getBuilder(PlcConnectionManager connectionManager) {
diff --git a/plc4j/tools/connection-cache/src/test/java/org/apache/plc4x/java/utils/cache/ManualTest.java b/plc4j/tools/connection-cache/src/test/java/org/apache/plc4x/java/utils/cache/ManualTest.java
index 0905f70b5c..60bc40dedd 100644
--- a/plc4j/tools/connection-cache/src/test/java/org/apache/plc4x/java/utils/cache/ManualTest.java
+++ b/plc4j/tools/connection-cache/src/test/java/org/apache/plc4x/java/utils/cache/ManualTest.java
@@ -18,14 +18,14 @@
  */
 package org.apache.plc4x.java.utils.cache;
 
-import org.apache.plc4x.java.PlcDriverManager;
+import org.apache.plc4x.java.DefaultPlcDriverManager;
 import org.apache.plc4x.java.api.PlcConnection;
 import org.apache.plc4x.java.api.messages.PlcReadResponse;
 
 public class ManualTest {
 
     public static void main(String[] args) {
-        CachedPlcConnectionManager cachedPlcConnectionManager = CachedPlcConnectionManager.getBuilder(new PlcDriverManager()).build();
+        CachedPlcConnectionManager cachedPlcConnectionManager = CachedPlcConnectionManager.getBuilder(new DefaultPlcDriverManager()).build();
         for (int i = 0; i < 100; i++){
             try (PlcConnection connection = cachedPlcConnectionManager.getConnection("ads:tcp://192.168.23.20?sourceAmsNetId=192.168.23.200.1.1&sourceAmsPort=65534&targetAmsNetId=192.168.23.20.1.1&targetAmsPort=851")) {
                 PlcReadResponse plcReadResponse = connection.readRequestBuilder().addTagAddress("var", "MAIN.hurz_REAL").build().execute().get();
diff --git a/plc4j/tools/opm/src/main/java/org/apache/plc4x/java/opm/PlcEntityInterceptor.java b/plc4j/tools/opm/src/main/java/org/apache/plc4x/java/opm/PlcEntityInterceptor.java
index ad769183e8..1a62c6f4c3 100644
--- a/plc4j/tools/opm/src/main/java/org/apache/plc4x/java/opm/PlcEntityInterceptor.java
+++ b/plc4j/tools/opm/src/main/java/org/apache/plc4x/java/opm/PlcEntityInterceptor.java
@@ -23,7 +23,6 @@ import org.apache.commons.configuration2.Configuration;
 import org.apache.commons.configuration2.SystemConfiguration;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.commons.lang3.Validate;
-import org.apache.plc4x.java.PlcDriverManager;
 import org.apache.plc4x.java.api.PlcConnection;
 import org.apache.plc4x.java.api.PlcConnectionManager;
 import org.apache.plc4x.java.api.exceptions.PlcConnectionException;
@@ -51,7 +50,7 @@ import java.util.concurrent.TimeoutException;
 
 /**
  * Interceptor for dynamic functionality of @{@link PlcEntity}.
- * Basically, its {@link #interceptGetter(Object, Method, Callable, String, PlcDriverManager, AliasRegistry, Map, Map)} method is called for each
+ * Basically, its {@link #interceptGetter(Object, Method, Callable, String, PlcConnectionManager, AliasRegistry, Map, Map)} method is called for each
  * invocation of a method on a connected @{@link PlcEntity} and does then the dynamic part.
  * <p>
  * For those not too familiar with the JVM's dispatch on can roughly imagine the intercept method being a "regular"
@@ -72,16 +71,16 @@ public class PlcEntityInterceptor {
     /**
      * Basic Intersector for all methods on the proxy object.
      * It checks if the invoked method is a getter and if so, only retrieves the requested tag, forwarding to
-     * the {@link #fetchAndSetValueForGetter(Object, Method, PlcDriverManager, String, AliasRegistry, Map)} method.
+     * the {@link #fetchAndSetValueForGetter(Object, Method, PlcConnectionManager, String, AliasRegistry, Map)} method.
      * <p>
-     * If the tag is no getter, then all tags are refreshed by calling {@link #refetchAllFields(Object, PlcDriverManager, String, AliasRegistry, Map)}
+     * If the tag is no getter, then all tags are refreshed by calling {@link #refetchAllFields(Object, PlcConnectionManager, String, AliasRegistry, Map)}
      * and then, the method is invoked.
      *
-     * @param proxy         Object to intercept
-     * @param method        Method that was intercepted
-     * @param callable      Callable to call the method after fetching the values
-     * @param address       Address of the plc (injected from private tag)
-     * @param driverManager DriverManager instance to use (injected from private tag)
+     * @param proxy             Object to intercept
+     * @param method            Method that was intercepted
+     * @param callable          Callable to call the method after fetching the values
+     * @param address           Address of the plc (injected from private tag)
+     * @param connectionManager PlcConnectionManager instance to use (injected from private tag)
      * @return possible result of the original methods invocation
      * @throws OPMException Problems with plc / proxying
      */
@@ -89,15 +88,15 @@ public class PlcEntityInterceptor {
     @RuntimeType
     public static Object interceptGetter(@This Object proxy, @Origin Method method, @SuperCall Callable<?> callable,
                                          @FieldValue(PlcEntityManager.PLC_ADDRESS_FIELD_NAME) String address,
-                                         @FieldValue(PlcEntityManager.DRIVER_MANAGER_FIELD_NAME) PlcDriverManager driverManager,
+                                         @FieldValue(PlcEntityManager.CONNECTION_MANAGER_FIELD_NAME) PlcConnectionManager connectionManager,
                                          @FieldValue(PlcEntityManager.ALIAS_REGISTRY) AliasRegistry registry,
                                          @FieldValue(PlcEntityManager.LAST_FETCHED) Map<String, Instant> lastFetched,
                                          @FieldValue(PlcEntityManager.LAST_WRITTEN) Map<String, Instant> lastWritten) throws OPMException {
         LOGGER.trace("Invoked method {} on connected PlcEntity {}", method.getName(), method.getDeclaringClass().getName());
 
         // If "detached" (i.e. _driverManager is null) simply forward the call
-        if (driverManager == null) {
-            LOGGER.trace("Entity not connected, simply fowarding call");
+        if (connectionManager == null) {
+            LOGGER.trace("Entity not connected, simply forwarding call");
             try {
                 return callable.call();
             } catch (Exception e) {
@@ -113,7 +112,7 @@ public class PlcEntityInterceptor {
             LOGGER.trace("Invoked method {} is getter, trying to find annotated tag and return requested value",
                 method.getName());
 
-            fetchAndSetValueForGetter(proxy, method, driverManager, address, registry, lastFetched);
+            fetchAndSetValueForGetter(proxy, method, connectionManager, address, registry, lastFetched);
             try {
                 return callable.call();
             } catch (Exception e) {
@@ -128,7 +127,7 @@ public class PlcEntityInterceptor {
             // Fetch single value
             LOGGER.trace("Invoked method {} is boolean flag method, trying to find annotated tag and return requested value",
                 method.getName());
-            fetchAndSetValueForIsGetter(proxy, method, driverManager, address, registry, lastFetched);
+            fetchAndSetValueForIsGetter(proxy, method, connectionManager, address, registry, lastFetched);
             try {
                 return callable.call();
             } catch (Exception e) {
@@ -136,13 +135,13 @@ public class PlcEntityInterceptor {
             }
         }
 
-        // Fetch all values, than invoke method
+        // Fetch all values then invoke method
         try {
             LOGGER.trace("Invoked method is no getter, refetch all tags and invoke method {} then", method.getName());
-            refetchAllFields(proxy, driverManager, address, registry, lastFetched);
+            refetchAllFields(proxy, connectionManager, address, registry, lastFetched);
             Object call = callable.call();
             // We write back
-            writeAllFields(proxy, driverManager, address, registry, lastWritten);
+            writeAllFields(proxy, connectionManager, address, registry, lastWritten);
             return call;
         } catch (Exception e) {
             throw new OPMException("Unable to forward invocation " + method.getName() + " on connected PlcEntity", e);
@@ -153,14 +152,14 @@ public class PlcEntityInterceptor {
     @RuntimeType
     public static Object interceptSetter(@This Object proxy, @Origin Method method, @SuperCall Callable<?> callable,
                                          @FieldValue(PlcEntityManager.PLC_ADDRESS_FIELD_NAME) String address,
-                                         @FieldValue(PlcEntityManager.DRIVER_MANAGER_FIELD_NAME) PlcDriverManager driverManager,
+                                         @FieldValue(PlcEntityManager.CONNECTION_MANAGER_FIELD_NAME) PlcConnectionManager connectionManager,
                                          @FieldValue(PlcEntityManager.ALIAS_REGISTRY) AliasRegistry registry,
                                          @FieldValue(PlcEntityManager.LAST_FETCHED) Map<String, Instant> lastFetched,
                                          @Argument(0) Object argument) throws OPMException {
         LOGGER.trace("Invoked method {} on connected PlcEntity {}", method.getName(), method.getDeclaringClass().getName());
 
         // If "detached" (i.e. _driverManager is null) simply forward the call
-        if (driverManager == null) {
+        if (connectionManager == null) {
             LOGGER.trace("Entity not connected, simply fowarding call");
             try {
                 return callable.call();
@@ -177,13 +176,13 @@ public class PlcEntityInterceptor {
             LOGGER.trace("Invoked method {} is setter, trying to find annotated tag and return requested value",
                 method.getName());
 
-            return setValueForSetter(proxy, method, callable, driverManager, address, registry, lastFetched, argument);
+            return setValueForSetter(proxy, method, callable, connectionManager, address, registry, lastFetched, argument);
         }
 
-        // Fetch all values, than invoke method
+        // Fetch all values then invoke method
         try {
             LOGGER.trace("Invoked method is no getter, refetch all tags and invoke method {} then", method.getName());
-            refetchAllFields(proxy, driverManager, address, registry, lastFetched);
+            refetchAllFields(proxy, connectionManager, address, registry, lastFetched);
             return callable.call();
         } catch (Exception e) {
             throw new OPMException("Unable to forward invocation " + method.getName() + " on connected PlcEntity", e);
@@ -335,15 +334,15 @@ public class PlcEntityInterceptor {
         return true;
     }
 
-    private static void fetchAndSetValueForIsGetter(Object proxy, Method m, PlcDriverManager driverManager, String address, AliasRegistry registry, Map<String, Instant> lastFetched) throws OPMException {
-        fetchAndSetValueForGetter(proxy, m, 2, driverManager, address, registry, lastFetched);
+    private static void fetchAndSetValueForIsGetter(Object proxy, Method m, PlcConnectionManager connectionManager, String address, AliasRegistry registry, Map<String, Instant> lastFetched) throws OPMException {
+        fetchAndSetValueForGetter(proxy, m, 2, connectionManager, address, registry, lastFetched);
     }
 
-    private static void fetchAndSetValueForGetter(Object proxy, Method m, PlcDriverManager driverManager, String address, AliasRegistry registry, Map<String, Instant> lastFetched) throws OPMException {
-        fetchAndSetValueForGetter(proxy, m, 3, driverManager, address, registry, lastFetched);
+    private static void fetchAndSetValueForGetter(Object proxy, Method m, PlcConnectionManager connectionManager, String address, AliasRegistry registry, Map<String, Instant> lastFetched) throws OPMException {
+        fetchAndSetValueForGetter(proxy, m, 3, connectionManager, address, registry, lastFetched);
     }
 
-    private static void fetchAndSetValueForGetter(Object proxy, Method m, int prefixLength, PlcDriverManager driverManager,
+    private static void fetchAndSetValueForGetter(Object proxy, Method m, int prefixLength, PlcConnectionManager connectionManager,
                                                   String address, AliasRegistry registry, Map<String, Instant> lastFetched) throws OPMException {
         String s = m.getName().substring(prefixLength);
         // First char to lower
@@ -365,7 +364,7 @@ public class PlcEntityInterceptor {
         if (!needsToBeSynced(lastFetched, field)) {
             return;
         }
-        try (PlcConnection connection = driverManager.getConnection(address)) {
+        try (PlcConnection connection = connectionManager.getConnection(address)) {
             // Catch the exception, if no reader present (see below)
 
             PlcReadRequest request = connection.readRequestBuilder()
@@ -395,7 +394,7 @@ public class PlcEntityInterceptor {
         }
     }
 
-    private static Object setValueForSetter(Object proxy, Method m, Callable<?> callable, PlcDriverManager driverManager,
+    private static Object setValueForSetter(Object proxy, Method m, Callable<?> callable, PlcConnectionManager connectionManager,
                                             String address, AliasRegistry registry, Map<String, Instant> lastFetched, Object object) throws OPMException {
         String s = m.getName().substring(3);
         // First char to lower
@@ -413,7 +412,7 @@ public class PlcEntityInterceptor {
         // Use Fully qualified Name as tag index
         String fqn = getFqn(field);
 
-        try (PlcConnection connection = driverManager.getConnection(address)) {
+        try (PlcConnection connection = connectionManager.getConnection(address)) {
             // Catch the exception, if no reader present (see below)
 
             PlcWriteRequest request = connection.writeRequestBuilder()
diff --git a/plc4j/tools/opm/src/main/java/org/apache/plc4x/java/opm/PlcEntityManager.java b/plc4j/tools/opm/src/main/java/org/apache/plc4x/java/opm/PlcEntityManager.java
index 32a2401805..4fe3423840 100644
--- a/plc4j/tools/opm/src/main/java/org/apache/plc4x/java/opm/PlcEntityManager.java
+++ b/plc4j/tools/opm/src/main/java/org/apache/plc4x/java/opm/PlcEntityManager.java
@@ -22,7 +22,7 @@ import net.bytebuddy.ByteBuddy;
 import net.bytebuddy.description.modifier.Visibility;
 import net.bytebuddy.implementation.MethodDelegation;
 import org.apache.commons.lang3.reflect.FieldUtils;
-import org.apache.plc4x.java.PlcDriverManager;
+import org.apache.plc4x.java.DefaultPlcDriverManager;
 import org.apache.plc4x.java.api.PlcConnectionManager;
 import org.apache.plc4x.java.api.exceptions.PlcRuntimeException;
 import org.apache.plc4x.java.api.messages.PlcReadRequest;
@@ -73,7 +73,7 @@ import static net.bytebuddy.matcher.ElementMatchers.not;
  * regular Pojo it was before.
  * <p>
  * All invocations on the getters are forwarded to the
- * {@link PlcEntityInterceptor#interceptGetter(Object, Method, Callable, String, PlcDriverManager, AliasRegistry, Map, Map)}
+ * {@link PlcEntityInterceptor#interceptGetter(Object, Method, Callable, String, PlcConnectionManager, AliasRegistry, Map, Map)}
  * method.
  */
 public class PlcEntityManager {
@@ -81,7 +81,7 @@ public class PlcEntityManager {
     private static final Logger LOGGER = LoggerFactory.getLogger(PlcEntityManager.class);
 
     public static final String PLC_ADDRESS_FIELD_NAME = "_plcAddress";
-    static final String DRIVER_MANAGER_FIELD_NAME = "_connectionManager";
+    static final String CONNECTION_MANAGER_FIELD_NAME = "_connectionManager";
     static final String ALIAS_REGISTRY = "_aliasRegistry";
     public static final String LAST_FETCHED = "_lastFetched";
     public static final String LAST_WRITTEN = "_lastWritten";
@@ -90,7 +90,7 @@ public class PlcEntityManager {
     private final SimpleAliasRegistry registry;
 
     public PlcEntityManager() {
-        this(new PlcDriverManager());
+        this(new DefaultPlcDriverManager());
     }
 
     public PlcEntityManager(PlcConnectionManager connectionManager) {
@@ -147,7 +147,7 @@ public class PlcEntityManager {
             T instance = new ByteBuddy()
                 .subclass(clazz)
                 .defineField(PLC_ADDRESS_FIELD_NAME, String.class, Visibility.PRIVATE)
-                .defineField(DRIVER_MANAGER_FIELD_NAME, PlcDriverManager.class, Visibility.PRIVATE)
+                .defineField(CONNECTION_MANAGER_FIELD_NAME, PlcConnectionManager.class, Visibility.PRIVATE)
                 .defineField(ALIAS_REGISTRY, AliasRegistry.class, Visibility.PRIVATE)
                 .defineField(LAST_FETCHED, Map.class, Visibility.PRIVATE)
                 .defineField(LAST_WRITTEN, Map.class, Visibility.PRIVATE)
@@ -159,7 +159,7 @@ public class PlcEntityManager {
                 .newInstance();
             // Set connection value into the private field
             FieldUtils.writeDeclaredField(instance, PLC_ADDRESS_FIELD_NAME, address, true);
-            FieldUtils.writeDeclaredField(instance, DRIVER_MANAGER_FIELD_NAME, connectionManager, true);
+            FieldUtils.writeDeclaredField(instance, CONNECTION_MANAGER_FIELD_NAME, connectionManager, true);
             FieldUtils.writeDeclaredField(instance, ALIAS_REGISTRY, registry, true);
             Map<String, Instant> lastFetched = new HashMap<>();
             FieldUtils.writeDeclaredField(instance, LAST_FETCHED, lastFetched, true);
@@ -212,11 +212,11 @@ public class PlcEntityManager {
             throw new OPMException("Unable to disconnect Object, is no entity!");
         }
         try {
-            Object manager = FieldUtils.readDeclaredField(entity, DRIVER_MANAGER_FIELD_NAME, true);
+            Object manager = FieldUtils.readDeclaredField(entity, CONNECTION_MANAGER_FIELD_NAME, true);
             if (manager == null) {
                 throw new OPMException("Instance is already disconnected!");
             }
-            FieldUtils.writeDeclaredField(entity, DRIVER_MANAGER_FIELD_NAME, null, true);
+            FieldUtils.writeDeclaredField(entity, CONNECTION_MANAGER_FIELD_NAME, null, true);
         } catch (IllegalAccessException e) {
             throw new OPMException("Unable to fetch driverManager instance on entity instance", e);
         }
diff --git a/plc4j/tools/opm/src/test/java/org/apache/plc4x/java/opm/ConnectedEntityTest.java b/plc4j/tools/opm/src/test/java/org/apache/plc4x/java/opm/ConnectedEntityTest.java
index e4c7de4a58..3724a65bc0 100644
--- a/plc4j/tools/opm/src/test/java/org/apache/plc4x/java/opm/ConnectedEntityTest.java
+++ b/plc4j/tools/opm/src/test/java/org/apache/plc4x/java/opm/ConnectedEntityTest.java
@@ -18,7 +18,7 @@
  */
 package org.apache.plc4x.java.opm;
 
-import org.apache.plc4x.java.PlcDriverManager;
+import org.apache.plc4x.java.DefaultPlcDriverManager;
 import org.apache.plc4x.java.api.types.PlcResponseCode;
 import org.apache.plc4x.java.spi.values.PlcSTRING;
 import org.apache.plc4x.java.mock.connection.MockConnection;
@@ -42,7 +42,7 @@ import static org.mockito.Mockito.*;
 @ExtendWith(MockitoExtension.class)
 public class ConnectedEntityTest {
 
-    PlcDriverManager driverManager;
+    DefaultPlcDriverManager driverManager;
 
     MockConnection connection;
 
@@ -53,7 +53,7 @@ public class ConnectedEntityTest {
 
     @BeforeEach
     void setUp() throws Exception {
-        driverManager = new PlcDriverManager();
+        driverManager = new DefaultPlcDriverManager();
         connection = (MockConnection) driverManager.getConnection("mock:cached");
         when(mockDevice.read(any()))
             .thenReturn(new ResponseItem<>(PlcResponseCode.OK, new PlcSTRING("hallo")));
diff --git a/plc4j/tools/opm/src/test/java/org/apache/plc4x/java/opm/PlcEntityInterceptorTest.java b/plc4j/tools/opm/src/test/java/org/apache/plc4x/java/opm/PlcEntityInterceptorTest.java
index 93e53c17f4..b18ea8dd63 100644
--- a/plc4j/tools/opm/src/test/java/org/apache/plc4x/java/opm/PlcEntityInterceptorTest.java
+++ b/plc4j/tools/opm/src/test/java/org/apache/plc4x/java/opm/PlcEntityInterceptorTest.java
@@ -18,7 +18,9 @@
  */
 package org.apache.plc4x.java.opm;
 
-import org.apache.plc4x.java.PlcDriverManager;
+import org.apache.plc4x.java.DefaultPlcDriverManager;
+import org.apache.plc4x.java.api.PlcConnectionManager;
+import org.apache.plc4x.java.api.PlcDriverManager;
 import org.apache.plc4x.java.api.exceptions.PlcRuntimeException;
 import org.apache.plc4x.java.api.messages.PlcReadRequest;
 import org.apache.plc4x.java.api.types.PlcResponseCode;
@@ -59,7 +61,7 @@ public class PlcEntityInterceptorTest implements WithAssertions {
 
     private static final Logger LOGGER = LoggerFactory.getLogger(PlcEntityInterceptorTest.class);
 
-    PlcDriverManager driverManager;
+    DefaultPlcDriverManager driverManager;
 
     MockConnection connection;
 
@@ -70,7 +72,7 @@ public class PlcEntityInterceptorTest implements WithAssertions {
 
     @BeforeEach
     void setUp() throws Exception {
-        driverManager = new PlcDriverManager();
+        driverManager = new DefaultPlcDriverManager();
         connection = (MockConnection) driverManager.getConnection("mock:test");
         connection.setDevice(mockDevice);
         entityManager = new PlcEntityManager(driverManager);
@@ -139,7 +141,7 @@ public class PlcEntityInterceptorTest implements WithAssertions {
         Callable callable;
 
         @Mock(answer = Answers.RETURNS_DEEP_STUBS)
-        PlcDriverManager plcDriverManager;
+        PlcConnectionManager connectionManager;
 
         class MiscEntity {
 
@@ -181,27 +183,27 @@ public class PlcEntityInterceptorTest implements WithAssertions {
             assertThatThrownBy(() -> PlcEntityInterceptor.interceptGetter(null, MiscEntity.class.getDeclaredMethod("something"), callable, null, null, null, lastFetched, lastWritten))
                 .isInstanceOf(OPMException.class)
                 .hasMessage("Exception during forwarding call");
-            assertThatThrownBy(() -> PlcEntityInterceptor.interceptGetter(null, MiscEntity.class.getDeclaredMethod("getTest", String.class), callable, null, plcDriverManager, null, lastFetched, lastWritten))
+            assertThatThrownBy(() -> PlcEntityInterceptor.interceptGetter(null, MiscEntity.class.getDeclaredMethod("getTest", String.class), callable, null, connectionManager, null, lastFetched, lastWritten))
                 .isInstanceOf(OPMException.class)
                 .hasMessage("Only getter with no arguments are supported");
-            assertThatThrownBy(() -> PlcEntityInterceptor.interceptGetter(null, MiscEntity.class.getDeclaredMethod("getOk"), callable, null, plcDriverManager, null, lastFetched, lastWritten))
+            assertThatThrownBy(() -> PlcEntityInterceptor.interceptGetter(null, MiscEntity.class.getDeclaredMethod("getOk"), callable, null, connectionManager, null, lastFetched, lastWritten))
                 .isInstanceOf(OPMException.class)
                 .hasMessageMatching("Unable to identify tag with name .*");
-            assertThatThrownBy(() -> PlcEntityInterceptor.interceptGetter(null, MiscEntity.class.getDeclaredMethod("getOk2"), callable, null, plcDriverManager, null, lastFetched, lastWritten))
+            assertThatThrownBy(() -> PlcEntityInterceptor.interceptGetter(null, MiscEntity.class.getDeclaredMethod("getOk2"), callable, null, connectionManager, null, lastFetched, lastWritten))
                 .isInstanceOf(OPMException.class)
                 .hasMessage("Problem during processing");
-            assertThatThrownBy(() -> PlcEntityInterceptor.interceptGetter(null, MiscEntity.class.getDeclaredMethod("getOk2"), callable, null, plcDriverManager, null, lastFetched, lastWritten))
+            assertThatThrownBy(() -> PlcEntityInterceptor.interceptGetter(null, MiscEntity.class.getDeclaredMethod("getOk2"), callable, null, connectionManager, null, lastFetched, lastWritten))
                 .isInstanceOf(OPMException.class)
                 .hasMessage("Problem during processing")
                 .hasStackTraceContaining(" Unable to read specified tag 'org.apache.plc4x.java.opm.PlcEntityInterceptorTest$Misc$MiscEntity.ok2', response code was 'null'");
-            assertThatThrownBy(() -> PlcEntityInterceptor.interceptSetter(null, MiscEntity.class.getDeclaredMethod("setOk2", String.class), callable, null, plcDriverManager, null, lastFetched, lastWritten))
+            assertThatThrownBy(() -> PlcEntityInterceptor.interceptSetter(null, MiscEntity.class.getDeclaredMethod("setOk2", String.class), callable, null, connectionManager, null, lastFetched, lastWritten))
                 .isInstanceOf(OPMException.class)
                 .hasMessage("Problem during processing")
                 .hasStackTraceContaining(" Unable to read specified tag 'org.apache.plc4x.java.opm.PlcEntityInterceptorTest$Misc$MiscEntity.ok2', response code was 'null'");
-            assertThatThrownBy(() -> PlcEntityInterceptor.interceptSetter(null, MiscEntity.class.getDeclaredMethod("setOkOk", String.class, String.class), callable, null, plcDriverManager, null, lastFetched, lastWritten))
+            assertThatThrownBy(() -> PlcEntityInterceptor.interceptSetter(null, MiscEntity.class.getDeclaredMethod("setOkOk", String.class, String.class), callable, null, connectionManager, null, lastFetched, lastWritten))
                 .isInstanceOf(OPMException.class)
                 .hasMessage("Only setter with one arguments are supported");
-            assertThatThrownBy(() -> PlcEntityInterceptor.interceptSetter(null, MiscEntity.class.getDeclaredMethod("someNotSetterMethod", String.class), callable, null, plcDriverManager, null, lastFetched, lastWritten))
+            assertThatThrownBy(() -> PlcEntityInterceptor.interceptSetter(null, MiscEntity.class.getDeclaredMethod("someNotSetterMethod", String.class), callable, null, connectionManager, null, lastFetched, lastWritten))
                 .isInstanceOf(OPMException.class)
                 .hasMessage("Unable to forward invocation someNotSetterMethod on connected PlcEntity");
         }
diff --git a/plc4j/tools/opm/src/test/java/org/apache/plc4x/java/opm/PlcEntityManagerComplexTest.java b/plc4j/tools/opm/src/test/java/org/apache/plc4x/java/opm/PlcEntityManagerComplexTest.java
index 797f0a3c1d..e10a89dbf7 100644
--- a/plc4j/tools/opm/src/test/java/org/apache/plc4x/java/opm/PlcEntityManagerComplexTest.java
+++ b/plc4j/tools/opm/src/test/java/org/apache/plc4x/java/opm/PlcEntityManagerComplexTest.java
@@ -19,7 +19,7 @@
 package org.apache.plc4x.java.opm;
 
 import org.apache.commons.lang3.reflect.FieldUtils;
-import org.apache.plc4x.java.PlcDriverManager;
+import org.apache.plc4x.java.DefaultPlcDriverManager;
 import org.apache.plc4x.java.api.PlcConnection;
 import org.apache.plc4x.java.api.exceptions.PlcConnectionException;
 import org.apache.plc4x.java.api.exceptions.PlcInvalidTagException;
@@ -62,7 +62,7 @@ import static org.mockito.Mockito.when;
 
 public class PlcEntityManagerComplexTest implements WithAssertions {
 
-    private PlcDriverManager driverManager;
+    private DefaultPlcDriverManager driverManager;
 
     @Test
     public void noEntity_throws() {
@@ -175,7 +175,7 @@ public class PlcEntityManagerComplexTest implements WithAssertions {
         manager.disconnect(connected);
 
         // Assert disconnected
-        Object o = FieldUtils.readDeclaredField(connected, PlcEntityManager.DRIVER_MANAGER_FIELD_NAME, true);
+        Object o = FieldUtils.readDeclaredField(connected, PlcEntityManager.CONNECTION_MANAGER_FIELD_NAME, true);
         assertNull(o);
 
         // Call a method and receive the result
@@ -197,8 +197,8 @@ public class PlcEntityManagerComplexTest implements WithAssertions {
     }
 
     private PlcEntityManager getPlcEntityManager(final Map<String, PlcValue> responses) throws PlcConnectionException {
-        driverManager = Mockito.mock(PlcDriverManager.class);
-        PlcDriverManager mock = driverManager;
+        driverManager = Mockito.mock(DefaultPlcDriverManager.class);
+        DefaultPlcDriverManager mock = driverManager;
         PlcConnection connection = Mockito.mock(PlcConnection.class);
         when(mock.getConnection(ArgumentMatchers.anyString())).thenReturn(connection);
         when(connection.getMetadata()).thenReturn(new PlcConnectionMetadata() {
diff --git a/plc4j/tools/opm/src/test/java/org/apache/plc4x/java/opm/PlcEntityManagerTest.java b/plc4j/tools/opm/src/test/java/org/apache/plc4x/java/opm/PlcEntityManagerTest.java
index 2cea1e6ea1..389f58335f 100644
--- a/plc4j/tools/opm/src/test/java/org/apache/plc4x/java/opm/PlcEntityManagerTest.java
+++ b/plc4j/tools/opm/src/test/java/org/apache/plc4x/java/opm/PlcEntityManagerTest.java
@@ -19,7 +19,7 @@
 package org.apache.plc4x.java.opm;
 
 import org.apache.commons.lang3.tuple.Pair;
-import org.apache.plc4x.java.PlcDriverManager;
+import org.apache.plc4x.java.DefaultPlcDriverManager;
 import org.apache.plc4x.java.api.exceptions.PlcConnectionException;
 import org.apache.plc4x.java.api.exceptions.PlcInvalidTagException;
 import org.apache.plc4x.java.api.types.PlcResponseCode;
@@ -49,7 +49,7 @@ public class PlcEntityManagerTest implements WithAssertions {
     class Read {
 
         @Mock(answer = Answers.RETURNS_DEEP_STUBS)
-        PlcDriverManager driverManager;
+        DefaultPlcDriverManager driverManager;
 
         @Test
         public void throwsInvalidTagException_rethrows() throws PlcConnectionException {
@@ -85,7 +85,7 @@ public class PlcEntityManagerTest implements WithAssertions {
         public void timeoutOnGet_throwsException() throws PlcConnectionException {
             // Prepare the Mock
             MockDevice mockDevice = Mockito.mock(MockDevice.class);
-            PlcDriverManager driverManager = new PlcDriverManager();
+            DefaultPlcDriverManager driverManager = new DefaultPlcDriverManager();
             MockConnection connection = (MockConnection) driverManager.getConnection("mock:test");
             when(mockDevice.read(any())).thenAnswer(invocation -> {
                 // Sleep for 3s
@@ -116,7 +116,7 @@ public class PlcEntityManagerTest implements WithAssertions {
             registry.register("alias", "real_tag");
 
             // Mock
-            PlcDriverManager driverManager = new PlcDriverManager();
+            DefaultPlcDriverManager driverManager = new DefaultPlcDriverManager();
             MockConnection connection = (MockConnection) driverManager.getConnection("mock:test");
             MockDevice mockDevice = Mockito.mock(MockDevice.class);
             when(mockDevice.read(any())).thenReturn(new ResponseItem<>(PlcResponseCode.OK, new PlcSTRING("value")));
@@ -165,7 +165,7 @@ public class PlcEntityManagerTest implements WithAssertions {
             registry.register("alias", "real_tag");
 
             // Mock
-            PlcDriverManager driverManager = new PlcDriverManager();
+            DefaultPlcDriverManager driverManager = new DefaultPlcDriverManager();
             MockConnection connection = (MockConnection) driverManager.getConnection("mock:test");
             MockDevice mockDevice = Mockito.mock(MockDevice.class);
             when(mockDevice.write(anyString(), any())).thenReturn(PlcResponseCode.OK);
@@ -195,7 +195,7 @@ public class PlcEntityManagerTest implements WithAssertions {
         @Test
         void simpleWrite_uses_getter() throws Exception {
             // Mock
-            PlcDriverManager driverManager = new PlcDriverManager();
+            DefaultPlcDriverManager driverManager = new DefaultPlcDriverManager();
             MockConnection connection = (MockConnection) driverManager.getConnection("mock:test");
             MockDevice mockDevice = Mockito.mock(MockDevice.class);
             when(mockDevice.read(any())).thenReturn(new ResponseItem<>(PlcResponseCode.OK, new PlcSTRING("value")));
@@ -228,7 +228,7 @@ public class PlcEntityManagerTest implements WithAssertions {
             registry.register("alias", "real_tag");
 
             // Mock
-            PlcDriverManager driverManager = new PlcDriverManager();
+            DefaultPlcDriverManager driverManager = new DefaultPlcDriverManager();
             MockConnection connection = (MockConnection) driverManager.getConnection("mock:test");
             MockDevice mockDevice = Mockito.mock(MockDevice.class);
             when(mockDevice.read(any())).thenReturn(new ResponseItem<>(PlcResponseCode.OK, new PlcSTRING("value")));
diff --git a/plc4j/tools/scraper/src/main/java/org/apache/plc4x/java/scraper/triggeredscraper/TriggeredScraperImpl.java b/plc4j/tools/scraper/src/main/java/org/apache/plc4x/java/scraper/triggeredscraper/TriggeredScraperImpl.java
index 09a443d1e3..7772b6f500 100644
--- a/plc4j/tools/scraper/src/main/java/org/apache/plc4x/java/scraper/triggeredscraper/TriggeredScraperImpl.java
+++ b/plc4j/tools/scraper/src/main/java/org/apache/plc4x/java/scraper/triggeredscraper/TriggeredScraperImpl.java
@@ -23,7 +23,6 @@ import org.apache.commons.collections4.multimap.ArrayListValuedHashMap;
 import org.apache.commons.lang3.Validate;
 import org.apache.commons.lang3.concurrent.BasicThreadFactory;
 import org.apache.commons.math3.stat.descriptive.DescriptiveStatistics;
-import org.apache.plc4x.java.PlcDriverManager;
 import org.apache.plc4x.java.api.PlcConnection;
 import org.apache.plc4x.java.api.PlcConnectionManager;
 import org.apache.plc4x.java.api.exceptions.PlcConnectionException;
@@ -323,20 +322,20 @@ public class TriggeredScraperImpl implements Scraper, TriggeredScraperMBean {
 
     /**
      * acquires a plc connection from connection pool
-     * @param plcDriverManager  Driver manager handling connection and pools
+     * @param plcConnectionManager  Connection manager handling connection and pools
      * @param connectionString  Connection string as defined in the regarding implementation of {@link PlcDriver}
      * @param executorService   ExecuterService holding a pool as threads handling requests and stuff
-     * @param requestTimeoutMs  maximum awaiting for the the future to return a result
+     * @param requestTimeoutMs  maximum waiting time for the future to return a result
      * @return the {@link PlcConnection} used for acquiring data from PLC endpoint
      * @throws InterruptedException something went wrong
      * @throws ExecutionException something went wrong
      * @throws TimeoutException something went wrong
      */
-    public static PlcConnection getPlcConnection(PlcDriverManager plcDriverManager,
+    public static PlcConnection getPlcConnection(PlcConnectionManager plcConnectionManager,
                                                  String connectionString,
                                                  ExecutorService executorService,
                                                  long requestTimeoutMs) throws InterruptedException, ExecutionException, TimeoutException {
-        return getPlcConnection(plcDriverManager,connectionString,executorService,requestTimeoutMs,"");
+        return getPlcConnection(plcConnectionManager,connectionString,executorService,requestTimeoutMs,"");
     }
 
     /**
diff --git a/plc4j/tools/scraper/src/main/java/org/apache/plc4x/java/scraper/triggeredscraper/TriggeredScraperTask.java b/plc4j/tools/scraper/src/main/java/org/apache/plc4x/java/scraper/triggeredscraper/TriggeredScraperTask.java
index f50797f54a..cd84143918 100644
--- a/plc4j/tools/scraper/src/main/java/org/apache/plc4x/java/scraper/triggeredscraper/TriggeredScraperTask.java
+++ b/plc4j/tools/scraper/src/main/java/org/apache/plc4x/java/scraper/triggeredscraper/TriggeredScraperTask.java
@@ -20,7 +20,6 @@ package org.apache.plc4x.java.scraper.triggeredscraper;
 
 import org.apache.commons.lang3.time.StopWatch;
 import org.apache.commons.math3.stat.descriptive.DescriptiveStatistics;
-import org.apache.plc4x.java.PlcDriverManager;
 import org.apache.plc4x.java.api.PlcConnection;
 import org.apache.plc4x.java.api.PlcConnectionManager;
 import org.apache.plc4x.java.api.messages.PlcReadRequest;
diff --git a/plc4j/tools/scraper/src/main/java/org/apache/plc4x/java/scraper/triggeredscraper/triggerhandler/TriggerConfiguration.java b/plc4j/tools/scraper/src/main/java/org/apache/plc4x/java/scraper/triggeredscraper/triggerhandler/TriggerConfiguration.java
index 1163cb2137..434c367656 100644
--- a/plc4j/tools/scraper/src/main/java/org/apache/plc4x/java/scraper/triggeredscraper/triggerhandler/TriggerConfiguration.java
+++ b/plc4j/tools/scraper/src/main/java/org/apache/plc4x/java/scraper/triggeredscraper/triggerhandler/TriggerConfiguration.java
@@ -18,7 +18,7 @@
  */
 package org.apache.plc4x.java.scraper.triggeredscraper.triggerhandler;
 
-import org.apache.plc4x.java.PlcDriverManager;
+import org.apache.plc4x.java.DefaultPlcDriverManager;
 import org.apache.plc4x.java.api.PlcDriver;
 import org.apache.plc4x.java.api.exceptions.PlcConnectionException;
 import org.apache.plc4x.java.api.model.PlcTag;
@@ -559,7 +559,7 @@ public class TriggerConfiguration{
         //I used this because the prepareField method is deprecated with generated drivers
         //So I need to create the tag using the connection string here
         private PlcTag parseTag(String tagAddress) throws PlcConnectionException {
-            PlcDriverManager driverManager = new PlcDriverManager();
+            DefaultPlcDriverManager driverManager = new DefaultPlcDriverManager();
             PlcDriver driver = driverManager.getDriverForUrl(plcConnectionString);
             return driver.prepareTag(tagAddress);
         }
diff --git a/plc4j/tools/scraper/src/test/java/org/apache/plc4x/java/scraper/ScraperTaskTest.java b/plc4j/tools/scraper/src/test/java/org/apache/plc4x/java/scraper/ScraperTaskTest.java
index fcc0142f2a..aebf65e16b 100644
--- a/plc4j/tools/scraper/src/test/java/org/apache/plc4x/java/scraper/ScraperTaskTest.java
+++ b/plc4j/tools/scraper/src/test/java/org/apache/plc4x/java/scraper/ScraperTaskTest.java
@@ -18,7 +18,8 @@
  */
 package org.apache.plc4x.java.scraper;
 
-import org.apache.plc4x.java.PlcDriverManager;
+import org.apache.plc4x.java.DefaultPlcDriverManager;
+import org.apache.plc4x.java.api.PlcConnectionManager;
 import org.apache.plc4x.java.api.exceptions.PlcConnectionException;
 import org.apache.plc4x.java.api.types.PlcResponseCode;
 import org.apache.plc4x.java.spi.values.PlcSTRING;
@@ -50,7 +51,7 @@ public class ScraperTaskTest implements WithAssertions {
 
     @Test
     public void scrape() throws PlcConnectionException {
-        PlcDriverManager driverManager = new PlcDriverManager();
+        DefaultPlcDriverManager driverManager = new DefaultPlcDriverManager();
         MockConnection connection = (MockConnection) driverManager.getConnection("mock:scraper");
         connection.setDevice(mockDevice);
         when(mockDevice.read(any())).thenReturn(new ResponseItem<>(PlcResponseCode.OK, new PlcSTRING("hallo")));
@@ -67,7 +68,7 @@ public class ScraperTaskTest implements WithAssertions {
         @Test
         public void badResponseCode_shouldHandleException() throws PlcConnectionException {
             // Given
-            PlcDriverManager driverManager = new PlcDriverManager();
+            DefaultPlcDriverManager driverManager = new DefaultPlcDriverManager();
             MockConnection connection = (MockConnection) driverManager.getConnection("mock:scraper");
             connection.setDevice(mockDevice);
             when(mockDevice.read(any())).thenReturn(new ResponseItem<>(PlcResponseCode.NOT_FOUND, new PlcSTRING("hallo")));
@@ -80,14 +81,14 @@ public class ScraperTaskTest implements WithAssertions {
         }
 
         @Mock
-        PlcDriverManager driverManager;
+        PlcConnectionManager connectionManager;
 
         @Test
         public void handleConnectionException() throws PlcConnectionException {
             // Given
-            when(driverManager.getConnection(anyString())).thenThrow(new PlcConnectionException("stfu"));
+            when(connectionManager.getConnection(anyString())).thenThrow(new PlcConnectionException("stfu"));
 
-            ScraperTask scraperTask = new ScraperTaskImpl(driverManager, "job1", "m1", "mock:scraper", Collections.singletonMap("a", "b"),
+            ScraperTask scraperTask = new ScraperTaskImpl(connectionManager, "job1", "m1", "mock:scraper", Collections.singletonMap("a", "b"),
                 1_000, ForkJoinPool.commonPool(), (j,a,m) -> {});
 
             ScraperTask spy = spy(scraperTask);
@@ -98,9 +99,9 @@ public class ScraperTaskTest implements WithAssertions {
 
         @Test
         void runByScheduler_handledGracefully() throws PlcConnectionException {
-            when(driverManager.getConnection(anyString())).thenThrow(new PlcConnectionException("stfu"));
+            when(connectionManager.getConnection(anyString())).thenThrow(new PlcConnectionException("stfu"));
             ScheduledExecutorService pool = Executors.newScheduledThreadPool(1);
-            ScraperTask scraperTask = new ScraperTaskImpl(driverManager, "job1", "m1", "mock:scraper", Collections.singletonMap("a", "b"),
+            ScraperTask scraperTask = new ScraperTaskImpl(connectionManager, "job1", "m1", "mock:scraper", Collections.singletonMap("a", "b"),
                 1_000, ForkJoinPool.commonPool(), (j,a,m) -> {});
 
             Future<?> future = pool.scheduleAtFixedRate(scraperTask, 0, 10, TimeUnit.MILLISECONDS);
diff --git a/plc4j/tools/scraper/src/test/java/org/apache/plc4x/java/scraper/ScraperTest.java b/plc4j/tools/scraper/src/test/java/org/apache/plc4x/java/scraper/ScraperTest.java
index 6b2a9c455d..c329d8a95f 100644
--- a/plc4j/tools/scraper/src/test/java/org/apache/plc4x/java/scraper/ScraperTest.java
+++ b/plc4j/tools/scraper/src/test/java/org/apache/plc4x/java/scraper/ScraperTest.java
@@ -18,7 +18,7 @@
  */
 package org.apache.plc4x.java.scraper;
 
-import org.apache.plc4x.java.PlcDriverManager;
+import org.apache.plc4x.java.DefaultPlcDriverManager;
 import org.apache.plc4x.java.api.PlcConnectionManager;
 import org.apache.plc4x.java.api.exceptions.PlcConnectionException;
 import org.apache.plc4x.java.api.types.PlcResponseCode;
@@ -79,7 +79,7 @@ class ScraperTest implements WithAssertions {
 
     @Test
     void scraper_schedulesJob() throws InterruptedException, PlcConnectionException {
-        PlcDriverManager driverManager = new PlcDriverManager();
+        DefaultPlcDriverManager driverManager = new DefaultPlcDriverManager();
         MockConnection connection = (MockConnection) driverManager.getConnection("mock:m1");
         connection.setDevice(mockDevice);
 
@@ -107,7 +107,7 @@ class ScraperTest implements WithAssertions {
 
     @Test
     void stop_stopsAllJobs() {
-        PlcDriverManager driverManager = new PlcDriverManager();
+        DefaultPlcDriverManager driverManager = new DefaultPlcDriverManager();
 
         Scraper scraper = new ScraperImpl((j, a, m) -> {}, driverManager, Collections.singletonList(
             new ScrapeJobImpl("job1",
@@ -130,7 +130,7 @@ class ScraperTest implements WithAssertions {
 
     @Test
     void restart_works() throws PlcConnectionException {
-        PlcDriverManager driverManager = new PlcDriverManager();
+        DefaultPlcDriverManager driverManager = new DefaultPlcDriverManager();
         MockConnection connection = (MockConnection) driverManager.getConnection("mock:m1");
         connection.setDevice(mockDevice);
 
diff --git a/plc4j/tools/scraper/src/test/java/org/apache/plc4x/java/scraper/triggeredscraper/TriggeredScraperImplTest.java b/plc4j/tools/scraper/src/test/java/org/apache/plc4x/java/scraper/triggeredscraper/TriggeredScraperImplTest.java
index 4c794123a3..e109009e82 100644
--- a/plc4j/tools/scraper/src/test/java/org/apache/plc4x/java/scraper/triggeredscraper/TriggeredScraperImplTest.java
+++ b/plc4j/tools/scraper/src/test/java/org/apache/plc4x/java/scraper/triggeredscraper/TriggeredScraperImplTest.java
@@ -18,7 +18,7 @@
  */
 package org.apache.plc4x.java.scraper.triggeredscraper;
 
-import org.apache.plc4x.java.PlcDriverManager;
+import org.apache.plc4x.java.DefaultPlcDriverManager;
 import org.apache.plc4x.java.api.types.PlcResponseCode;
 import org.apache.plc4x.java.mock.connection.MockConnection;
 import org.apache.plc4x.java.mock.connection.MockDevice;
@@ -44,13 +44,13 @@ import static org.mockito.Mockito.when;
 
 class TriggeredScraperImplTest {
 
-    private PlcDriverManager driverManager;
+    private DefaultPlcDriverManager driverManager;
     private MockDevice mockDevice1;
     private MockDevice mockDevice2;
 
     @BeforeEach
     public void setUp() throws Exception {
-        driverManager = new PlcDriverManager();
+        driverManager = new DefaultPlcDriverManager();
         MockConnection mock1Connection = ((MockConnection) driverManager.getConnection("mock:1"));
         MockConnection mock2Connection = ((MockConnection) driverManager.getConnection("mock:2"));
 
diff --git a/plc4j/tools/ui/src/main/java/org/apache/plc4x/java/ui/FxmlController.java b/plc4j/tools/ui/src/main/java/org/apache/plc4x/java/ui/FxmlController.java
index 4da3f36109..4b6c2db5f1 100644
--- a/plc4j/tools/ui/src/main/java/org/apache/plc4x/java/ui/FxmlController.java
+++ b/plc4j/tools/ui/src/main/java/org/apache/plc4x/java/ui/FxmlController.java
@@ -28,9 +28,9 @@ import javafx.scene.input.MouseEvent;
 import javafx.scene.paint.Paint;
 
 import javafx.util.StringConverter;
-import org.apache.plc4x.java.PlcDriverManager;
 import org.apache.plc4x.java.api.PlcConnection;
 import org.apache.plc4x.java.api.PlcDriver;
+import org.apache.plc4x.java.api.PlcDriverManager;
 import org.apache.plc4x.java.api.exceptions.PlcConnectionException;
 import org.apache.plc4x.java.api.messages.PlcDiscoveryItem;
 import org.apache.plc4x.java.api.messages.PlcDiscoveryResponse;
@@ -55,7 +55,7 @@ public class FxmlController {
     public TabPane connectionTabs;
 
     public FxmlController() {
-        driverManager = new PlcDriverManager();
+        driverManager = PlcDriverManager.getDefault();
     }
 
     @FXML
@@ -121,7 +121,7 @@ public class FxmlController {
                     if(mouseEvent.getButton().equals(MouseButton.PRIMARY) && mouseEvent.getClickCount() == 2) {
                         String connectionString = selectedItem.getCode();
                         try {
-                            PlcConnection connection = driverManager.getConnection(connectionString);
+                            PlcConnection connection = driverManager.getConnectionManager().getConnection(connectionString);
                             FXMLLoader loader = new FXMLLoader(Objects.requireNonNull(getClass().getResource("connection-tab.fxml")));
 
                             Tab connectionTab = loader.load();
diff --git a/plc4j/utils/test-utils/src/main/java/org/apache/plc4x/test/driver/internal/ConnectionManager.java b/plc4j/utils/test-utils/src/main/java/org/apache/plc4x/test/driver/internal/ConnectionManager.java
index 1bb5fcd4e2..00481eced3 100644
--- a/plc4j/utils/test-utils/src/main/java/org/apache/plc4x/test/driver/internal/ConnectionManager.java
+++ b/plc4j/utils/test-utils/src/main/java/org/apache/plc4x/test/driver/internal/ConnectionManager.java
@@ -20,8 +20,9 @@ package org.apache.plc4x.test.driver.internal;
 
 import io.netty.channel.Channel;
 import io.netty.channel.embedded.Plc4xEmbeddedChannel;
-import org.apache.plc4x.java.PlcDriverManager;
+import org.apache.plc4x.java.DefaultPlcDriverManager;
 import org.apache.plc4x.java.api.PlcConnection;
+import org.apache.plc4x.java.api.PlcDriverManager;
 import org.apache.plc4x.java.api.exceptions.PlcConnectionException;
 import org.apache.plc4x.java.api.exceptions.PlcRuntimeException;
 import org.apache.plc4x.java.spi.connection.ChannelExposingConnection;
@@ -34,7 +35,7 @@ public class ConnectionManager {
     PlcDriverManager plcDriverManager;
 
     public ConnectionManager() {
-        this.plcDriverManager = new PlcDriverManager();
+        this.plcDriverManager = new DefaultPlcDriverManager();
     }
 
     public PlcConnection getConnection(String driverName, Map<String, String> driverParameters) throws DriverTestsuiteException {
@@ -48,7 +49,7 @@ public class ConnectionManager {
             if (sb.length() > 0) {
                 sb.replace(0, 1, "?");
             }
-            return plcDriverManager.getConnection(driverName + ":test://hurz" + sb);
+            return plcDriverManager.getConnectionManager().getConnection(driverName + ":test://hurz" + sb);
         } catch (PlcConnectionException e) {
             throw new DriverTestsuiteException("Error loading driver", e);
         }
diff --git a/plc4j/utils/test-utils/src/main/java/org/apache/plc4x/test/manual/ManualTest.java b/plc4j/utils/test-utils/src/main/java/org/apache/plc4x/test/manual/ManualTest.java
index ea2ccef4e4..85cfd2f849 100644
--- a/plc4j/utils/test-utils/src/main/java/org/apache/plc4x/test/manual/ManualTest.java
+++ b/plc4j/utils/test-utils/src/main/java/org/apache/plc4x/test/manual/ManualTest.java
@@ -18,7 +18,7 @@
  */
 package org.apache.plc4x.test.manual;
 
-import org.apache.plc4x.java.PlcDriverManager;
+import org.apache.plc4x.java.DefaultPlcDriverManager;
 import org.apache.plc4x.java.api.PlcConnection;
 import org.apache.plc4x.java.api.messages.PlcReadRequest;
 import org.apache.plc4x.java.api.messages.PlcReadResponse;
@@ -56,7 +56,7 @@ public abstract class ManualTest {
     }
 
     public void run() throws Exception {
-        try (PlcConnection plcConnection = new PlcDriverManager().getConnection(connectionString)) {
+        try (PlcConnection plcConnection = new DefaultPlcDriverManager().getConnection(connectionString)) {
             System.out.println("Reading all types in separate requests");
             // Run all entries separately:
             for (TestCase testCase : testCases) {
diff --git a/sandbox/test-java-df1-driver/src/test/java/org/apache/plc4x/protocol/df1/EndToEndTest.java b/sandbox/test-java-df1-driver/src/test/java/org/apache/plc4x/protocol/df1/EndToEndTest.java
index 523d32e36e..0717772c5b 100644
--- a/sandbox/test-java-df1-driver/src/test/java/org/apache/plc4x/protocol/df1/EndToEndTest.java
+++ b/sandbox/test-java-df1-driver/src/test/java/org/apache/plc4x/protocol/df1/EndToEndTest.java
@@ -18,7 +18,7 @@
  */
 package org.apache.plc4x.protocol.df1;
 
-import org.apache.plc4x.java.PlcDriverManager;
+import org.apache.plc4x.java.DefaultPlcDriverManager;
 import org.apache.plc4x.java.api.PlcConnection;
 import org.apache.plc4x.java.api.messages.PlcReadRequest;
 import org.apache.plc4x.java.api.messages.PlcReadResponse;
@@ -32,7 +32,7 @@ public class EndToEndTest {
     @Test
     @Disabled("Seems to cause problems on Windows if no COM4 is available")
     public void helloDf1() {
-        try (PlcConnection plcConnection = new PlcDriverManager().getConnection("df1:serial:///COM4")) {
+        try (PlcConnection plcConnection = new DefaultPlcDriverManager().getConnection("df1:serial:///COM4")) {
             PlcReadRequest request = plcConnection.readRequestBuilder()
                 .addTagAddress("hurz", "5:INTEGER")
                 .build();