diff --git a/core/net/src/main/java/org/onosproject/net/driver/impl/DriverManager.java b/core/net/src/main/java/org/onosproject/net/driver/impl/DriverManager.java
index 9718610..30fedf5 100644
--- a/core/net/src/main/java/org/onosproject/net/driver/impl/DriverManager.java
+++ b/core/net/src/main/java/org/onosproject/net/driver/impl/DriverManager.java
@@ -15,9 +15,6 @@
  */
 package org.onosproject.net.driver.impl;
 
-import com.google.common.collect.ImmutableSet;
-import com.google.common.collect.Maps;
-import com.google.common.collect.Sets;
 import org.apache.felix.scr.annotations.Activate;
 import org.apache.felix.scr.annotations.Component;
 import org.apache.felix.scr.annotations.Deactivate;
@@ -32,46 +29,42 @@
 import org.onosproject.net.driver.Behaviour;
 import org.onosproject.net.driver.DefaultDriverData;
 import org.onosproject.net.driver.DefaultDriverHandler;
-import org.onosproject.net.driver.DefaultDriverProvider;
 import org.onosproject.net.driver.Driver;
-import org.onosproject.net.driver.DriverAdminService;
 import org.onosproject.net.driver.DriverHandler;
-import org.onosproject.net.driver.DriverProvider;
+import org.onosproject.net.driver.DriverRegistry;
+import org.onosproject.net.driver.DriverService;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import java.util.Map;
-import java.util.Optional;
 import java.util.Set;
 import java.util.stream.Collectors;
 
 import static org.onlab.util.Tools.nullIsNotFound;
 import static org.onosproject.net.AnnotationKeys.DRIVER;
 import static org.onosproject.security.AppGuard.checkPermission;
-import static org.onosproject.security.AppPermission.Type.*;
-
-
+import static org.onosproject.security.AppPermission.Type.DRIVER_READ;
+import static org.onosproject.security.AppPermission.Type.DRIVER_WRITE;
 
 /**
  * Manages inventory of device drivers.
  */
-@Component(immediate = true)
 @Service
-public class DriverManager extends DefaultDriverProvider implements DriverAdminService {
+// Not enabled by default to allow the DriverRegistryManager to enable it only
+// when all the required drivers are available.
+@Component(immediate = true, enabled = false)
+public class DriverManager implements DriverService {
 
     private final Logger log = LoggerFactory.getLogger(getClass());
 
     private static final String NO_DRIVER = "Driver not found";
     private static final String NO_DEVICE = "Device not found";
-    private static final String DEFAULT = "default";
+
+    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    protected DriverRegistry registry;
 
     @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
     protected DeviceService deviceService;
 
-    private Set<DriverProvider> providers = Sets.newConcurrentHashSet();
-    private Map<String, Driver> driverByKey = Maps.newConcurrentMap();
-    private Map<String, Class<? extends Behaviour>> classes = Maps.newConcurrentMap();
-
     @Activate
     protected void activate() {
         AbstractProjectableModel.setDriverService(null, this);
@@ -81,61 +74,19 @@
     @Deactivate
     protected void deactivate() {
         AbstractProjectableModel.setDriverService(this, null);
-        providers.clear();
-        driverByKey.clear();
-        classes.clear();
         log.info("Stopped");
     }
 
     @Override
-    public Set<DriverProvider> getProviders() {
-        return ImmutableSet.copyOf(providers);
-    }
-
-    @Override
-    public void registerProvider(DriverProvider provider) {
-        provider.getDrivers().forEach(driver -> {
-            Driver d = addDriver(driver);
-            driverByKey.put(key(driver.manufacturer(),
-                                driver.hwVersion(),
-                                driver.swVersion()), d);
-            d.behaviours().forEach(b -> {
-                Class<? extends Behaviour> implementation = d.implementation(b);
-                classes.put(b.getName(), b);
-                classes.put(implementation.getName(), implementation);
-            });
-        });
-        providers.add(provider);
-    }
-
-    @Override
-    public void unregisterProvider(DriverProvider provider) {
-        provider.getDrivers().forEach(driver -> {
-            removeDriver(driver);
-            driverByKey.remove(key(driver.manufacturer(),
-                                   driver.hwVersion(),
-                                   driver.swVersion()));
-        });
-        providers.remove(provider);
-    }
-
-    @Override
-    public Class<? extends Behaviour> getBehaviourClass(String className) {
-        return classes.get(className);
-    }
-
-    @Override
     public Set<Driver> getDrivers() {
         checkPermission(DRIVER_READ);
-        ImmutableSet.Builder<Driver> builder = ImmutableSet.builder();
-        drivers.values().forEach(builder::add);
-        return builder.build();
+        return registry.getDrivers();
     }
 
     @Override
     public Set<Driver> getDrivers(Class<? extends Behaviour> withBehaviour) {
         checkPermission(DRIVER_READ);
-        return drivers.values().stream()
+        return registry.getDrivers().stream()
                 .filter(d -> d.hasBehaviour(withBehaviour))
                 .collect(Collectors.toSet());
     }
@@ -143,34 +94,13 @@
     @Override
     public Driver getDriver(String driverName) {
         checkPermission(DRIVER_READ);
-        return nullIsNotFound(drivers.get(driverName), NO_DRIVER);
+        return registry.getDriver(driverName);
     }
 
     @Override
     public Driver getDriver(String mfr, String hw, String sw) {
         checkPermission(DRIVER_READ);
-
-        // First attempt a literal search.
-        Driver driver = driverByKey.get(key(mfr, hw, sw));
-        if (driver != null) {
-            return driver;
-        }
-
-        // Otherwise, sweep through the key space and attempt to match using
-        // regular expression matching.
-        Optional<Driver> optional = driverByKey.values().stream()
-                .filter(d -> matches(d, mfr, hw, sw)).findFirst();
-
-        // If no matching driver is found, return default.
-        return optional.orElse(drivers.get(DEFAULT));
-    }
-
-    // Matches the given driver using ERE matching against the given criteria.
-    private boolean matches(Driver d, String mfr, String hw, String sw) {
-        // TODO: consider pre-compiling the expressions in the future
-        return mfr.matches(d.manufacturer()) &&
-                hw.matches(d.hwVersion()) &&
-                sw.matches(d.swVersion());
+        return registry.getDriver(mfr, hw, sw);
     }
 
     @Override
@@ -199,8 +129,4 @@
         return new DefaultDriverHandler(new DefaultDriverData(driver, deviceId));
     }
 
-    // Produces a composite driver key using the specified components.
-    private String key(String mfr, String hw, String sw) {
-        return String.format("%s-%s-%s", mfr, hw, sw);
-    }
 }
diff --git a/core/net/src/main/java/org/onosproject/net/driver/impl/DriverRegistryManager.java b/core/net/src/main/java/org/onosproject/net/driver/impl/DriverRegistryManager.java
new file mode 100644
index 0000000..a034887
--- /dev/null
+++ b/core/net/src/main/java/org/onosproject/net/driver/impl/DriverRegistryManager.java
@@ -0,0 +1,228 @@
+/*
+ * Copyright 2017-present Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.onosproject.net.driver.impl;
+
+import com.google.common.collect.ImmutableSet;
+import com.google.common.collect.Maps;
+import com.google.common.collect.Sets;
+import org.apache.felix.scr.annotations.Activate;
+import org.apache.felix.scr.annotations.Component;
+import org.apache.felix.scr.annotations.Deactivate;
+import org.apache.felix.scr.annotations.Modified;
+import org.apache.felix.scr.annotations.Property;
+import org.apache.felix.scr.annotations.Reference;
+import org.apache.felix.scr.annotations.ReferenceCardinality;
+import org.apache.felix.scr.annotations.Service;
+import org.onosproject.cfg.ComponentConfigService;
+import org.onosproject.incubator.component.ComponentService;
+import org.onosproject.net.device.DeviceService;
+import org.onosproject.net.driver.Behaviour;
+import org.onosproject.net.driver.DefaultDriverProvider;
+import org.onosproject.net.driver.Driver;
+import org.onosproject.net.driver.DriverAdminService;
+import org.onosproject.net.driver.DriverProvider;
+import org.osgi.service.component.ComponentContext;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.util.Dictionary;
+import java.util.Map;
+import java.util.Optional;
+import java.util.Properties;
+import java.util.Set;
+
+import static com.google.common.base.Strings.isNullOrEmpty;
+import static org.onlab.util.Tools.get;
+import static org.onlab.util.Tools.nullIsNotFound;
+import static org.onosproject.security.AppGuard.checkPermission;
+import static org.onosproject.security.AppPermission.Type.DRIVER_READ;
+
+
+/**
+ * Manages inventory of device drivers.
+ */
+@Service
+@Component(immediate = true, enabled = true)
+public class DriverRegistryManager extends DefaultDriverProvider implements DriverAdminService {
+
+    private static final String DRIVER_COMPONENT = "org.onosproject.net.driver.impl.DriverManager";
+
+    private final Logger log = LoggerFactory.getLogger(getClass());
+
+    private static final String FORMAT = "Required drivers: {}";
+    private static final String COMMA = ",";
+    private static final String NO_DRIVER = "Driver not found";
+    private static final String DEFAULT = "default";
+
+    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    protected DeviceService deviceService;
+
+    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    protected ComponentConfigService componentConfigService;
+
+    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    protected ComponentService componenService;
+
+
+    private static final String DEFAULT_REQUIRED_DRIVERS = "default";
+    @Property(name = "requiredDrivers", value = DEFAULT_REQUIRED_DRIVERS,
+            label = "Comma-separated list of drivers that must be registered before starting driver subsystem")
+    private String requiredDrivers = DEFAULT_REQUIRED_DRIVERS;
+    private Set<String> requiredDriverSet;
+
+    private Set<DriverProvider> providers = Sets.newConcurrentHashSet();
+    private Map<String, Driver> driverByKey = Maps.newConcurrentMap();
+    private Map<String, Class<? extends Behaviour>> classes = Maps.newConcurrentMap();
+
+    private boolean isStarted = false;
+
+    @Activate
+    protected void activate(ComponentContext context) {
+        componentConfigService.registerProperties(getClass());
+        modified(context);
+        log.info("Started");
+    }
+
+    @Deactivate
+    protected void deactivate() {
+        componentConfigService.unregisterProperties(getClass(), false);
+        providers.clear();
+        driverByKey.clear();
+        classes.clear();
+        log.info("Stopped");
+    }
+
+    @Modified
+    public void modified(ComponentContext context) {
+        Dictionary<?, ?> properties = context != null ? context.getProperties() : new Properties();
+        if (context != null) {
+            requiredDrivers = get(properties, "requiredDrivers");
+        }
+        requiredDriverSet = isNullOrEmpty(requiredDrivers) ?
+                ImmutableSet.of() : ImmutableSet.copyOf(requiredDrivers.split(COMMA));
+        log.info(FORMAT, requiredDrivers);
+        checkRequiredDrivers();
+    }
+
+    @Override
+    public Set<DriverProvider> getProviders() {
+        return ImmutableSet.copyOf(providers);
+    }
+
+    @Override
+    public void registerProvider(DriverProvider provider) {
+        provider.getDrivers().forEach(driver -> {
+            Driver d = addDriver(driver);
+            driverByKey.put(key(driver.manufacturer(),
+                                driver.hwVersion(),
+                                driver.swVersion()), d);
+            d.behaviours().forEach(b -> {
+                Class<? extends Behaviour> implementation = d.implementation(b);
+                classes.put(b.getName(), b);
+                classes.put(implementation.getName(), implementation);
+            });
+        });
+        providers.add(provider);
+        checkRequiredDrivers();
+    }
+
+    @Override
+    public void unregisterProvider(DriverProvider provider) {
+        provider.getDrivers().forEach(driver -> {
+            removeDriver(driver);
+            driverByKey.remove(key(driver.manufacturer(),
+                                   driver.hwVersion(),
+                                   driver.swVersion()));
+        });
+        providers.remove(provider);
+        checkRequiredDrivers();
+    }
+
+    // Checks for the minimum required drivers and when available, activate
+    // the driver manager components; deactivate otherwise.
+    private synchronized void checkRequiredDrivers() {
+        Set<String> driverSet = registeredDrivers();
+        boolean isReady = driverSet.containsAll(requiredDriverSet);
+        if (isReady && !isStarted) {
+            log.info("Starting driver subsystem");
+            componenService.activate(null, DRIVER_COMPONENT);
+            isStarted = true;
+        } else if (!isReady && isStarted) {
+            log.info("Stopping driver subsystem");
+            componenService.deactivate(null, DRIVER_COMPONENT);
+            isStarted = false;
+        }
+    }
+
+    private Set<String> registeredDrivers() {
+        ImmutableSet.Builder<String> builder = ImmutableSet.builder();
+        for (DriverProvider dp : providers) {
+            dp.getDrivers().stream().map(Driver::name).forEach(builder::add);
+        }
+        return builder.build();
+    }
+
+    @Override
+    public Class<? extends Behaviour> getBehaviourClass(String className) {
+        return classes.get(className);
+    }
+
+    @Override
+    public Set<Driver> getDrivers() {
+        checkPermission(DRIVER_READ);
+        ImmutableSet.Builder<Driver> builder = ImmutableSet.builder();
+        drivers.values().forEach(builder::add);
+        return builder.build();
+    }
+
+    @Override
+    public Driver getDriver(String mfr, String hw, String sw) {
+        checkPermission(DRIVER_READ);
+
+        // First attempt a literal search.
+        Driver driver = driverByKey.get(key(mfr, hw, sw));
+        if (driver != null) {
+            return driver;
+        }
+
+        // Otherwise, sweep through the key space and attempt to match using
+        // regular expression matching.
+        Optional<Driver> optional = driverByKey.values().stream()
+                .filter(d -> matches(d, mfr, hw, sw)).findFirst();
+
+        // If no matching driver is found, return default.
+        return optional.orElse(drivers.get(DEFAULT));
+    }
+
+    @Override
+    public Driver getDriver(String driverName) {
+        checkPermission(DRIVER_READ);
+        return nullIsNotFound(drivers.get(driverName), NO_DRIVER);
+    }
+
+    // Matches the given driver using ERE matching against the given criteria.
+    private boolean matches(Driver d, String mfr, String hw, String sw) {
+        // TODO: consider pre-compiling the expressions in the future
+        return mfr.matches(d.manufacturer()) &&
+                hw.matches(d.hwVersion()) &&
+                sw.matches(d.swVersion());
+    }
+
+    // Produces a composite driver key using the specified components.
+    static String key(String mfr, String hw, String sw) {
+        return String.format("%s-%s-%s", mfr, hw, sw);
+    }
+}
diff --git a/core/net/src/main/java/org/onosproject/net/flowobjective/impl/FlowObjectiveManager.java b/core/net/src/main/java/org/onosproject/net/flowobjective/impl/FlowObjectiveManager.java
index 37bf9d2..47b63ed 100644
--- a/core/net/src/main/java/org/onosproject/net/flowobjective/impl/FlowObjectiveManager.java
+++ b/core/net/src/main/java/org/onosproject/net/flowobjective/impl/FlowObjectiveManager.java
@@ -38,7 +38,6 @@
 import org.onosproject.net.device.DeviceEvent;
 import org.onosproject.net.device.DeviceListener;
 import org.onosproject.net.device.DeviceService;
-import org.onosproject.net.driver.DefaultDriverProviderService;
 import org.onosproject.net.driver.DriverHandler;
 import org.onosproject.net.driver.DriverService;
 import org.onosproject.net.flow.FlowRuleService;
@@ -117,12 +116,6 @@
     @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
     protected ComponentConfigService cfgService;
 
-    // Note: This must remain an optional dependency to allow re-install of default drivers.
-    // Note: For now disabled until we can move to OPTIONAL_UNARY dependency
-    // @Reference(cardinality = ReferenceCardinality.OPTIONAL_UNARY, policy = ReferencePolicy.DYNAMIC)
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
-    protected DefaultDriverProviderService defaultDriverService;
-
     private final FlowObjectiveStoreDelegate delegate = new InternalStoreDelegate();
 
     private final Map<DeviceId, DriverHandler> driverHandlers = Maps.newConcurrentMap();
diff --git a/core/net/src/main/java/org/onosproject/net/flowobjective/impl/composition/FlowObjectiveCompositionManager.java b/core/net/src/main/java/org/onosproject/net/flowobjective/impl/composition/FlowObjectiveCompositionManager.java
index c33a2f4..3e0d2eb 100644
--- a/core/net/src/main/java/org/onosproject/net/flowobjective/impl/composition/FlowObjectiveCompositionManager.java
+++ b/core/net/src/main/java/org/onosproject/net/flowobjective/impl/composition/FlowObjectiveCompositionManager.java
@@ -36,7 +36,6 @@
 import org.onosproject.net.device.DeviceEvent;
 import org.onosproject.net.device.DeviceListener;
 import org.onosproject.net.device.DeviceService;
-import org.onosproject.net.driver.DefaultDriverProviderService;
 import org.onosproject.net.driver.DriverHandler;
 import org.onosproject.net.driver.DriverService;
 import org.onosproject.net.flow.FlowRuleService;
@@ -119,12 +118,6 @@
     @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
     protected FlowObjectiveStore flowObjectiveStore;
 
-    // Note: This must remain an optional dependency to allow re-install of default drivers.
-    // Note: For now disabled until we can move to OPTIONAL_UNARY dependency
-    // @Reference(cardinality = ReferenceCardinality.OPTIONAL_UNARY, policy = ReferencePolicy.DYNAMIC)
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
-    protected DefaultDriverProviderService defaultDriverService;
-
     private final FlowObjectiveStoreDelegate delegate = new InternalStoreDelegate();
 
     private final Map<DeviceId, DriverHandler> driverHandlers = Maps.newConcurrentMap();
@@ -282,16 +275,10 @@
 
     // Retrieves the device pipeline behaviour from the cache.
     private Pipeliner getDevicePipeliner(DeviceId deviceId) {
-        Pipeliner pipeliner = pipeliners.get(deviceId);
-        return pipeliner;
+        return pipeliners.get(deviceId);
     }
 
     private void setupPipelineHandler(DeviceId deviceId) {
-        if (defaultDriverService == null) {
-            // We're not ready to go to work yet.
-            return;
-        }
-
         // Attempt to lookup the handler in the cache
         DriverHandler handler = driverHandlers.get(deviceId);
         if (handler == null) {
diff --git a/core/net/src/test/java/org/onosproject/net/flow/impl/FlowRuleManagerTest.java b/core/net/src/test/java/org/onosproject/net/flow/impl/FlowRuleManagerTest.java
index 88a7e7a..b3df232 100644
--- a/core/net/src/test/java/org/onosproject/net/flow/impl/FlowRuleManagerTest.java
+++ b/core/net/src/test/java/org/onosproject/net/flow/impl/FlowRuleManagerTest.java
@@ -42,7 +42,9 @@
 import org.onosproject.net.device.DeviceServiceAdapter;
 import org.onosproject.net.driver.AbstractHandlerBehaviour;
 import org.onosproject.net.driver.DefaultDriver;
+import org.onosproject.net.driver.DriverRegistry;
 import org.onosproject.net.driver.impl.DriverManager;
+import org.onosproject.net.driver.impl.DriverRegistryManager;
 import org.onosproject.net.flow.CompletedBatchOperation;
 import org.onosproject.net.flow.DefaultFlowEntry;
 import org.onosproject.net.flow.DefaultFlowRule;
@@ -118,7 +120,6 @@
 
     private TestDriverManager driverService;
 
-
     @Before
     public void setUp() {
         mgr = new FlowRuleManager();
@@ -133,19 +134,20 @@
         service = mgr;
         registry = mgr;
 
-        driverService = new TestDriverManager();
-        driverService.addDriver(new DefaultDriver("foo", ImmutableList.of(), "", "", "",
-                                                  ImmutableMap.of(FlowRuleProgrammable.class,
-                                                                  TestFlowRuleProgrammable.class),
-                                                  ImmutableMap.of()));
+        DriverRegistryManager driverRegistry = new DriverRegistryManager();
+        driverService = new TestDriverManager(driverRegistry);
+        driverRegistry.addDriver(new DefaultDriver("foo", ImmutableList.of(), "", "", "",
+                                                   ImmutableMap.of(FlowRuleProgrammable.class,
+                                                                   TestFlowRuleProgrammable.class),
+                                                   ImmutableMap.of()));
 
         mgr.activate(null);
         mgr.addListener(listener);
         provider = new TestProvider(PID);
-        providerService = registry.register(provider);
+        providerService = this.registry.register(provider);
         appId = new TestApplicationId(0, "FlowRuleManagerTest");
         assertTrue("provider should be registered",
-                   registry.getProviders().contains(provider.id()));
+                   this.registry.getProviders().contains(provider.id()));
     }
 
     @After
@@ -270,7 +272,7 @@
         FlowEntry fe3 = new DefaultFlowEntry(f3);
         providerService.pushFlowMetrics(DID, ImmutableList.of(fe1, fe2, fe3));
         validateEvents(RULE_ADD_REQUESTED, RULE_ADD_REQUESTED, RULE_ADD_REQUESTED,
-                RULE_ADDED, RULE_ADDED, RULE_ADDED);
+                       RULE_ADDED, RULE_ADDED, RULE_ADDED);
         mgr.purgeFlowRules(DID);
         assertEquals("0 rule should exist", 0, flowCount());
     }
@@ -697,7 +699,8 @@
     }
 
     private class TestDriverManager extends DriverManager {
-        TestDriverManager() {
+        TestDriverManager(DriverRegistry registry) {
+            this.registry = registry;
             this.deviceService = mgr.deviceService;
             activate();
         }
diff --git a/core/net/src/test/java/org/onosproject/net/flowobjective/impl/FlowObjectiveManagerTest.java b/core/net/src/test/java/org/onosproject/net/flowobjective/impl/FlowObjectiveManagerTest.java
index f4a12a9..5e03b7e 100644
--- a/core/net/src/test/java/org/onosproject/net/flowobjective/impl/FlowObjectiveManagerTest.java
+++ b/core/net/src/test/java/org/onosproject/net/flowobjective/impl/FlowObjectiveManagerTest.java
@@ -15,9 +15,6 @@
  */
 package org.onosproject.net.flowobjective.impl;
 
-import java.util.ArrayList;
-import java.util.List;
-
 import org.junit.After;
 import org.junit.Before;
 import org.junit.Test;
@@ -36,11 +33,9 @@
 import org.onosproject.net.device.DeviceEvent;
 import org.onosproject.net.device.DeviceListener;
 import org.onosproject.net.device.DeviceServiceAdapter;
-import org.onosproject.net.driver.AbstractDriverLoader;
 import org.onosproject.net.driver.Behaviour;
 import org.onosproject.net.driver.DefaultDriverData;
 import org.onosproject.net.driver.DefaultDriverHandler;
-import org.onosproject.net.driver.DefaultDriverProviderService;
 import org.onosproject.net.driver.Driver;
 import org.onosproject.net.driver.DriverAdapter;
 import org.onosproject.net.driver.DriverData;
@@ -61,6 +56,9 @@
 import org.onosproject.net.flowobjective.ObjectiveEvent;
 import org.onosproject.net.intent.TestTools;
 
+import java.util.ArrayList;
+import java.util.List;
+
 import static org.hamcrest.CoreMatchers.hasItem;
 import static org.hamcrest.MatcherAssert.assertThat;
 import static org.hamcrest.Matchers.hasSize;
@@ -125,12 +123,6 @@
 
     }
 
-    private class TestDriversLoader extends AbstractDriverLoader implements DefaultDriverProviderService {
-        public TestDriversLoader() {
-            super("/onos-drivers.xml");
-        }
-    }
-
     private class TestDriver extends DriverAdapter {
 
         @Override
@@ -192,7 +184,6 @@
         manager = new FlowObjectiveManager();
         manager.flowObjectiveStore = new TestFlowObjectiveStore();
         manager.deviceService = new TestDeviceService();
-        manager.defaultDriverService = new TestDriversLoader();
         manager.driverService = new TestDriverService();
         manager.cfgService = new TestComponentConfigService();
 
diff --git a/core/net/src/test/java/org/onosproject/net/group/impl/GroupManagerTest.java b/core/net/src/test/java/org/onosproject/net/group/impl/GroupManagerTest.java
index a85046b..42b4863 100644
--- a/core/net/src/test/java/org/onosproject/net/group/impl/GroupManagerTest.java
+++ b/core/net/src/test/java/org/onosproject/net/group/impl/GroupManagerTest.java
@@ -37,7 +37,9 @@
 import org.onosproject.net.device.DeviceServiceAdapter;
 import org.onosproject.net.driver.AbstractHandlerBehaviour;
 import org.onosproject.net.driver.DefaultDriver;
+import org.onosproject.net.driver.DriverRegistry;
 import org.onosproject.net.driver.impl.DriverManager;
+import org.onosproject.net.driver.impl.DriverRegistryManager;
 import org.onosproject.net.flow.DefaultTrafficTreatment;
 import org.onosproject.net.flow.TrafficTreatment;
 import org.onosproject.net.group.DefaultGroup;
@@ -112,11 +114,12 @@
         mgr.activate(null);
         mgr.addListener(listener);
 
-        driverService = new TestDriverManager();
-        driverService.addDriver(new DefaultDriver("foo", ImmutableList.of(), "", "", "",
-                                                  ImmutableMap.of(GroupProgrammable.class,
-                                                                  TestGroupProgrammable.class),
-                                                  ImmutableMap.of()));
+        DriverRegistryManager driverRegistry = new DriverRegistryManager();
+        driverService = new TestDriverManager(driverRegistry);
+        driverRegistry.addDriver(new DefaultDriver("foo", ImmutableList.of(), "", "", "",
+                                                   ImmutableMap.of(GroupProgrammable.class,
+                                                                   TestGroupProgrammable.class),
+                                                   ImmutableMap.of()));
 
         internalProvider = new TestGroupProvider(PID);
         provider = internalProvider;
@@ -747,7 +750,8 @@
     }
 
     private class TestDriverManager extends DriverManager {
-        TestDriverManager() {
+        TestDriverManager(DriverRegistry registry) {
+            this.registry = registry;
             this.deviceService = mgr.deviceService;
             activate();
         }
@@ -773,7 +777,7 @@
 
         assertEquals(lastDeviceIdProgrammable, expectedDeviceId);
         assertTrue(groupOperations.containsAll(expectedGroupOps) &&
-                   expectedGroupOps.containsAll(groupOperations));
+                           expectedGroupOps.containsAll(groupOperations));
 
         groupOperations.clear();
         lastDeviceIdProgrammable = null;
diff --git a/core/net/src/test/java/org/onosproject/net/packet/impl/PacketManagerTest.java b/core/net/src/test/java/org/onosproject/net/packet/impl/PacketManagerTest.java
index 5e0a432..095d797 100644
--- a/core/net/src/test/java/org/onosproject/net/packet/impl/PacketManagerTest.java
+++ b/core/net/src/test/java/org/onosproject/net/packet/impl/PacketManagerTest.java
@@ -33,7 +33,9 @@
 import org.onosproject.net.device.DeviceServiceAdapter;
 import org.onosproject.net.driver.AbstractHandlerBehaviour;
 import org.onosproject.net.driver.DefaultDriver;
+import org.onosproject.net.driver.DriverRegistry;
 import org.onosproject.net.driver.impl.DriverManager;
+import org.onosproject.net.driver.impl.DriverRegistryManager;
 import org.onosproject.net.flow.DefaultTrafficTreatment;
 import org.onosproject.net.packet.DefaultOutboundPacket;
 import org.onosproject.net.packet.OutboundPacket;
@@ -84,11 +86,13 @@
         mgr.coreService = new TestCoreService();
         providerRegistry = mgr;
         mgr.activate();
-        driverService = new TestDriverManager();
-        driverService.addDriver(new DefaultDriver("foo", ImmutableList.of(), "", "", "",
-                                                  ImmutableMap.of(PacketProgrammable.class,
-                                                                  TestPacketProgrammable.class),
-                                                  ImmutableMap.of()));
+
+        DriverRegistryManager driverRegistry = new DriverRegistryManager();
+        driverService = new TestDriverManager(driverRegistry);
+        driverRegistry.addDriver(new DefaultDriver("foo", ImmutableList.of(), "", "", "",
+                                                   ImmutableMap.of(PacketProgrammable.class,
+                                                                   TestPacketProgrammable.class),
+                                                   ImmutableMap.of()));
     }
 
     /**
@@ -140,7 +144,8 @@
     }
 
     private class TestDriverManager extends DriverManager {
-        TestDriverManager() {
+        TestDriverManager(DriverRegistry registry) {
+            this.registry = registry;
             this.deviceService = mgr.deviceService;
             activate();
         }
