diff --git a/apps/flowanalyzer/src/test/java/org/onosproject/flowanalyzer/MockLinkService.java b/apps/flowanalyzer/src/test/java/org/onosproject/flowanalyzer/MockLinkService.java
index 6ae2c2b..a922c16 100644
--- a/apps/flowanalyzer/src/test/java/org/onosproject/flowanalyzer/MockLinkService.java
+++ b/apps/flowanalyzer/src/test/java/org/onosproject/flowanalyzer/MockLinkService.java
@@ -1,27 +1,25 @@
 package org.onosproject.flowanalyzer;
 
-import org.onosproject.net.PortNumber;
-import org.onosproject.net.link.LinkServiceAdapter;
-import org.onosproject.net.topology.TopologyEdge;
 import org.onosproject.net.ConnectPoint;
+import org.onosproject.net.DefaultLink;
 import org.onosproject.net.DeviceId;
 import org.onosproject.net.ElementId;
 import org.onosproject.net.HostId;
 import org.onosproject.net.Link;
-import org.onosproject.net.Annotations;
-import org.onosproject.net.provider.ProviderId;
+import org.onosproject.net.PortNumber;
+import org.onosproject.net.link.LinkServiceAdapter;
+import org.onosproject.net.topology.TopologyEdge;
 import org.onosproject.net.topology.TopologyVertex;
 
-import java.util.Set;
 import java.util.ArrayList;
-import java.util.List;
 import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
 
 import static org.onosproject.net.Link.State.ACTIVE;
 
-
 /**
- * Created by nikcheerla on 7/21/15.
+ * Test fixture for the flow analyzer.
  */
 public class MockLinkService extends LinkServiceAdapter {
     DefaultMutableTopologyGraph createdGraph = new DefaultMutableTopologyGraph(new HashSet<>(), new HashSet<>());
@@ -47,7 +45,7 @@
     @Override
     public Set<Link> getDeviceEgressLinks(DeviceId deviceId) {
         Set<Link> setL = new HashSet<>();
-        for (Link l: links) {
+        for (Link l : links) {
             if (l.src().elementId() instanceof DeviceId && l.src().deviceId().equals(deviceId)) {
                 setL.add(l);
             }
@@ -58,7 +56,7 @@
     @Override
     public Set<Link> getDeviceIngressLinks(DeviceId deviceId) {
         Set<Link> setL = new HashSet<>();
-        for (Link l: links) {
+        for (Link l : links) {
             if (l.dst().elementId() instanceof DeviceId && l.dst().deviceId().equals(deviceId)) {
                 setL.add(l);
             }
@@ -70,7 +68,7 @@
     @Override
     public Set<Link> getEgressLinks(ConnectPoint pt) {
         Set<Link> setL = new HashSet<>();
-        for (Link l: links) {
+        for (Link l : links) {
             if (l.src().equals(pt)) {
                 setL.add(l);
             }
@@ -81,7 +79,7 @@
     @Override
     public Set<Link> getIngressLinks(ConnectPoint pt) {
         Set<Link> setL = new HashSet<>();
-        for (Link l: links) {
+        for (Link l : links) {
             if (l.dst().equals(pt)) {
                 setL.add(l);
             }
@@ -92,7 +90,7 @@
     @Override
     public Set<Link> getLinks(ConnectPoint pt) {
         Set<Link> setL = new HashSet<>();
-        for (Link l: links) {
+        for (Link l : links) {
             if (l.src().equals(pt) || l.dst().equals(pt)) {
                 setL.add(l);
             }
@@ -119,47 +117,7 @@
         ConnectPoint src = new ConnectPoint(d1, PortNumber.portNumber(port));
         ConnectPoint dst = new ConnectPoint(d2, PortNumber.portNumber(port2));
         Link curLink;
-        curLink = new Link() {
-            @Override
-            public ConnectPoint src() {
-                return src;
-            }
-
-            @Override
-            public ConnectPoint dst() {
-                return dst;
-            }
-
-            @Override
-            public boolean isDurable() {
-                return true;
-            }
-
-            @Override
-            public boolean isExpected() {
-                return false;
-            }
-
-            @Override
-            public Annotations annotations() {
-                return null;
-            }
-
-            @Override
-            public Type type() {
-                return null;
-            }
-
-            @Override
-            public ProviderId providerId() {
-                return null;
-            }
-
-            @Override
-            public State state() {
-                return ACTIVE;
-            }
-        };
+        curLink = DefaultLink.builder().src(src).dst(dst).state(ACTIVE).build();
         links.add(curLink);
         if (d1 instanceof DeviceId && d2 instanceof DeviceId) {
             TopologyVertex v1 = () -> (DeviceId) d1, v2 = () -> (DeviceId) d2;
diff --git a/core/api/src/main/java/org/onosproject/net/AbstractElement.java b/core/api/src/main/java/org/onosproject/net/AbstractElement.java
index 595e7b9..79170f9 100644
--- a/core/api/src/main/java/org/onosproject/net/AbstractElement.java
+++ b/core/api/src/main/java/org/onosproject/net/AbstractElement.java
@@ -20,7 +20,7 @@
 /**
  * Base implementation of network elements, i.e. devices or hosts.
  */
-public abstract class AbstractElement extends AbstractModel implements Element {
+public abstract class AbstractElement extends AbstractProjectableModel implements Element {
 
     protected final ElementId id;
 
diff --git a/core/api/src/main/java/org/onosproject/net/AbstractProjectableModel.java b/core/api/src/main/java/org/onosproject/net/AbstractProjectableModel.java
new file mode 100644
index 0000000..6fee974
--- /dev/null
+++ b/core/api/src/main/java/org/onosproject/net/AbstractProjectableModel.java
@@ -0,0 +1,185 @@
+/*
+ * Copyright 2014-2016 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;
+
+import com.google.common.annotations.Beta;
+import org.onlab.util.ItemNotFoundException;
+import org.onosproject.net.driver.Behaviour;
+import org.onosproject.net.driver.Driver;
+import org.onosproject.net.driver.DriverData;
+import org.onosproject.net.driver.DriverService;
+import org.onosproject.net.driver.Projectable;
+import org.onosproject.net.provider.ProviderId;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.util.Set;
+
+import static com.google.common.base.Preconditions.checkState;
+
+/**
+ * Base model entity, capable of being extended via projection mechanism.
+ */
+@Beta
+public abstract class AbstractProjectableModel extends AbstractModel implements Projectable {
+
+    private static Logger log = LoggerFactory.getLogger(AbstractProjectableModel.class);
+
+    protected static final String NO_DRIVER_SERVICE = "Driver service not bound yet";
+    protected static final String NO_DRIVER = "Driver has not been bound to %s";
+
+    // Static reference to the driver service; injected via setDriverService
+    private static DriverService driverService;
+
+    private Driver driver;
+
+    // For serialization
+    public AbstractProjectableModel() {
+    }
+
+    /**
+     * Creates a model entity attributed to the specified provider and
+     * optionally annotated.
+     *
+     * @param providerId  identity of the provider
+     * @param annotations optional key/value annotations
+     */
+    public AbstractProjectableModel(ProviderId providerId, Annotations[] annotations) {
+        super(providerId, annotations);
+    }
+
+    /**
+     * Injects the driver service reference for use during projections into
+     * various behaviours.
+     * <p>
+     * This is a privileged call; unauthorized invocations will result in
+     * illegal state exception
+     *
+     * @param key           opaque admin key object
+     * @param driverService injected driver service
+     * @throws IllegalStateException when invoked sans authorization
+     */
+    public static void setDriverService(Object key, DriverService driverService) {
+        // TODO: Rework this once we have means to enforce access to admin services in general
+        checkState(AbstractProjectableModel.driverService == key, "Unauthorized invocation");
+        AbstractProjectableModel.driverService = driverService;
+    }
+
+    /**
+     * Returns the currently bound driver service reference.
+     *
+     * @return driver service
+     */
+    protected static DriverService driverService() {
+        return driverService;
+    }
+
+    /**
+     * Returns the currently bound driver or null of no driver is bound.
+     *
+     * @return bound driver; null if none
+     */
+    protected Driver driver() {
+        return driver;
+    }
+
+    @Override
+    public <B extends Behaviour> B as(Class<B> projectionClass) {
+        checkState(driverService != null, NO_DRIVER_SERVICE);
+        if (driver == null) {
+            driver = locateDriver();
+        }
+        checkState(driver != null, NO_DRIVER, this);
+        return driver.createBehaviour(asData(), projectionClass);
+    }
+
+    @Override
+    public <B extends Behaviour> boolean is(Class<B> projectionClass) {
+        checkState(driverService != null, NO_DRIVER_SERVICE);
+        if (driver == null) {
+            driver = locateDriver();
+        }
+        checkState(driver != null, "Driver has not been bound to %s", this);
+        return driver.hasBehaviour(projectionClass);
+    }
+
+    /**
+     * Locates the driver to be used by this entity.
+     * <p>
+     * The default implementation derives the driver based on the {@code driver}
+     * annotation value.
+     *
+     * @return driver for alternate projections of this model entity or null
+     * if no driver is expected or driver is not found
+     */
+    protected Driver locateDriver() {
+        String driverName = annotations().value(AnnotationKeys.DRIVER);
+        if (driverName != null) {
+            try {
+                return driverService.getDriver(driverName);
+            } catch (ItemNotFoundException e) {
+                log.warn("Driver {} not found.", driverName);
+            }
+        }
+        return null;
+    }
+
+    /**
+     * Returns self as an immutable driver data instance.
+     *
+     * @return self as driver data
+     */
+    protected DriverData asData() {
+        return new AnnotationDriverData();
+    }
+
+
+    /**
+     * Projection of the parent entity as a driver data entity.
+     */
+    protected class AnnotationDriverData implements DriverData {
+        @Override
+        public Driver driver() {
+            return driver;
+        }
+
+        @Override
+        public DeviceId deviceId() {
+            throw new UnsupportedOperationException("Entity not a device");
+        }
+
+        @Override
+        public MutableAnnotations set(String key, String value) {
+            throw new UnsupportedOperationException("Entity is immutable");
+        }
+
+        @Override
+        public MutableAnnotations clear(String... keys) {
+            throw new UnsupportedOperationException("Entity is immutable");
+        }
+
+        @Override
+        public Set<String> keys() {
+            return annotations().keys();
+        }
+
+        @Override
+        public String value(String key) {
+            return annotations().value(key);
+        }
+    }
+
+}
diff --git a/core/api/src/main/java/org/onosproject/net/DefaultDevice.java b/core/api/src/main/java/org/onosproject/net/DefaultDevice.java
index f3f0fe7..401740a 100644
--- a/core/api/src/main/java/org/onosproject/net/DefaultDevice.java
+++ b/core/api/src/main/java/org/onosproject/net/DefaultDevice.java
@@ -15,12 +15,15 @@
  */
 package org.onosproject.net;
 
-import org.onosproject.net.provider.ProviderId;
 import org.onlab.packet.ChassisId;
+import org.onosproject.net.driver.Driver;
+import org.onosproject.net.driver.DriverData;
+import org.onosproject.net.provider.ProviderId;
 
 import java.util.Objects;
 
 import static com.google.common.base.MoreObjects.toStringHelper;
+import static org.onlab.util.Tools.nullIsNotFound;
 
 /**
  * Default infrastructure device model implementation.
@@ -105,6 +108,33 @@
         return chassisId;
     }
 
+    /**
+     * Returns self as an immutable driver data instance.
+     *
+     * @return self as driver data
+     */
+    protected DriverData asData() {
+        return new DeviceDriverData();
+    }
+
+    @Override
+    protected Driver locateDriver() {
+        Driver driver = super.locateDriver();
+        return driver != null ? driver :
+                nullIsNotFound(driverService().getDriver(manufacturer, hwVersion, swVersion),
+                               "Driver not found");
+    }
+
+    /**
+     * Projection of the parent entity as a driver data entity.
+     */
+    protected class DeviceDriverData extends AnnotationDriverData {
+        @Override
+        public DeviceId deviceId() {
+            return id();
+        }
+    }
+
     @Override
     public int hashCode() {
         return Objects.hash(id, type, manufacturer, hwVersion, swVersion, serialNumber);
@@ -136,6 +166,7 @@
                 .add("hwVersion", hwVersion)
                 .add("swVersion", swVersion)
                 .add("serialNumber", serialNumber)
+                .add("driver", driver() != null ? driver().name() : "")
                 .toString();
     }
 
diff --git a/core/api/src/main/java/org/onosproject/net/DefaultLink.java b/core/api/src/main/java/org/onosproject/net/DefaultLink.java
index 1876db6..5515175 100644
--- a/core/api/src/main/java/org/onosproject/net/DefaultLink.java
+++ b/core/api/src/main/java/org/onosproject/net/DefaultLink.java
@@ -24,11 +24,10 @@
 import static org.onosproject.net.DefaultAnnotations.EMPTY;
 import static com.google.common.base.Preconditions.checkNotNull;
 
-
 /**
  * Default infrastructure link model implementation.
  */
-public class DefaultLink extends AbstractModel implements Link {
+public class DefaultLink extends AbstractProjectableModel implements Link {
 
     private final ConnectPoint src;
     private final ConnectPoint dst;
@@ -60,7 +59,7 @@
      * @param dst         link destination
      * @param type        link type
      * @param state       link state
-     * @param isExpected   indicates if the link is preconfigured
+     * @param isExpected  indicates if the link is preconfigured
      * @param annotations optional key/value annotations
      */
     private DefaultLink(ProviderId providerId, ConnectPoint src, ConnectPoint dst,
diff --git a/core/api/src/main/java/org/onosproject/net/Element.java b/core/api/src/main/java/org/onosproject/net/Element.java
index 6cdab9e..b918ad9 100644
--- a/core/api/src/main/java/org/onosproject/net/Element.java
+++ b/core/api/src/main/java/org/onosproject/net/Element.java
@@ -15,10 +15,12 @@
  */
 package org.onosproject.net;
 
+import org.onosproject.net.driver.Projectable;
+
 /**
  * Base abstraction of a network element, i.e. an infrastructure device or an end-station host.
  */
-public interface Element extends Annotated, Provided {
+public interface Element extends Annotated, Provided, Projectable {
 
     /**
      * Returns the network element identifier.
diff --git a/core/api/src/main/java/org/onosproject/net/Link.java b/core/api/src/main/java/org/onosproject/net/Link.java
index eb09290..9209138 100644
--- a/core/api/src/main/java/org/onosproject/net/Link.java
+++ b/core/api/src/main/java/org/onosproject/net/Link.java
@@ -15,10 +15,12 @@
  */
 package org.onosproject.net;
 
+import org.onosproject.net.driver.Projectable;
+
 /**
  * Abstraction of a network infrastructure link.
  */
-public interface Link extends Annotated, Provided, NetworkResource {
+public interface Link extends Annotated, Provided, Projectable, NetworkResource {
 
     /**
      * Coarse representation of the link type.
diff --git a/core/api/src/main/java/org/onosproject/net/driver/AbstractBehaviour.java b/core/api/src/main/java/org/onosproject/net/driver/AbstractBehaviour.java
index 784e6c5..6bb246b 100644
--- a/core/api/src/main/java/org/onosproject/net/driver/AbstractBehaviour.java
+++ b/core/api/src/main/java/org/onosproject/net/driver/AbstractBehaviour.java
@@ -18,7 +18,7 @@
 import static com.google.common.base.Preconditions.checkState;
 
 /**
- * Base implementation of device driver behaviour.
+ * Base implementation of a driver behaviour.
  */
 public class AbstractBehaviour implements Behaviour {
 
diff --git a/core/api/src/main/java/org/onosproject/net/driver/AbstractHandlerBehaviour.java b/core/api/src/main/java/org/onosproject/net/driver/AbstractHandlerBehaviour.java
index 66b21ff..2ba8f87 100644
--- a/core/api/src/main/java/org/onosproject/net/driver/AbstractHandlerBehaviour.java
+++ b/core/api/src/main/java/org/onosproject/net/driver/AbstractHandlerBehaviour.java
@@ -18,7 +18,7 @@
 import static com.google.common.base.Preconditions.checkState;
 
 /**
- * Base implementation of device driver handler behaviour.
+ * Base implementation of a driver handler behaviour.
  */
 public class AbstractHandlerBehaviour
         extends AbstractBehaviour implements HandlerBehaviour {
diff --git a/core/api/src/main/java/org/onosproject/net/driver/Behaviour.java b/core/api/src/main/java/org/onosproject/net/driver/Behaviour.java
index 6e28aa8..49a984e 100644
--- a/core/api/src/main/java/org/onosproject/net/driver/Behaviour.java
+++ b/core/api/src/main/java/org/onosproject/net/driver/Behaviour.java
@@ -16,8 +16,8 @@
 package org.onosproject.net.driver;
 
 /**
- * Representation of a facet of device behaviour that can be used to talk about
- * a device (in context of {@link DriverData}) or to a device (in context of
+ * Representation of a facet of behaviour that can be used to talk about
+ * an entity (in context of {@link DriverData}) or to an entity (in context of
  * {@link DriverHandler}).
  */
 public interface Behaviour {
diff --git a/core/api/src/main/java/org/onosproject/net/driver/DefaultDriverData.java b/core/api/src/main/java/org/onosproject/net/driver/DefaultDriverData.java
index 76d7932..3ea3bb9 100644
--- a/core/api/src/main/java/org/onosproject/net/driver/DefaultDriverData.java
+++ b/core/api/src/main/java/org/onosproject/net/driver/DefaultDriverData.java
@@ -57,11 +57,6 @@
     }
 
     @Override
-    public <T extends Behaviour> T behaviour(Class<T> behaviourClass) {
-        return driver.createBehaviour(this, behaviourClass);
-    }
-
-    @Override
     public MutableAnnotations set(String key, String value) {
         properties.put(key, value);
         return this;
diff --git a/core/api/src/main/java/org/onosproject/net/driver/DriverData.java b/core/api/src/main/java/org/onosproject/net/driver/DriverData.java
index 64f1fd9..8f0eb97 100644
--- a/core/api/src/main/java/org/onosproject/net/driver/DriverData.java
+++ b/core/api/src/main/java/org/onosproject/net/driver/DriverData.java
@@ -19,7 +19,7 @@
 import org.onosproject.net.MutableAnnotations;
 
 /**
- * Container for data about a device. Data is stored using
+ * Container for data about an entity, e.g. device, link. Data is stored using
  * {@link org.onosproject.net.MutableAnnotations}.
  *
  * Note that only derivatives of {@link HandlerBehaviour} can expect mutability
@@ -45,10 +45,15 @@
     /**
      * Returns the specified facet of behaviour to access the device data.
      *
+     * Implementations are expected to defer to the backing driver for creation
+     * of the requested behaviour.
+     *
      * @param behaviourClass behaviour class
      * @param <T>            type of behaviour
      * @return requested behaviour or null if not supported
      */
-    <T extends Behaviour> T behaviour(Class<T> behaviourClass);
+    default <T extends Behaviour> T behaviour(Class<T> behaviourClass) {
+        return driver().createBehaviour(this, behaviourClass);
+    }
 
 }
diff --git a/core/api/src/main/java/org/onosproject/net/driver/HandlerBehaviour.java b/core/api/src/main/java/org/onosproject/net/driver/HandlerBehaviour.java
index b5771ac..c3bff33 100644
--- a/core/api/src/main/java/org/onosproject/net/driver/HandlerBehaviour.java
+++ b/core/api/src/main/java/org/onosproject/net/driver/HandlerBehaviour.java
@@ -16,8 +16,8 @@
 package org.onosproject.net.driver;
 
 /**
- * Representation of a facet of device behaviour that can be used to interact
- * with a device (in context of {@link org.onosproject.net.driver.DriverHandler}).
+ * Representation of a facet of behaviour that can be used to interact
+ * with an entity (in context of {@link org.onosproject.net.driver.DriverHandler}).
  */
 public interface HandlerBehaviour extends Behaviour {
 
diff --git a/core/api/src/main/java/org/onosproject/net/driver/Projectable.java b/core/api/src/main/java/org/onosproject/net/driver/Projectable.java
index 02dce7e..9cff6b4 100644
--- a/core/api/src/main/java/org/onosproject/net/driver/Projectable.java
+++ b/core/api/src/main/java/org/onosproject/net/driver/Projectable.java
@@ -38,7 +38,7 @@
      * Returns true if this entity is capable of being projected as the
      * specified class.
      *
-     * @param projectionClass projection class
+     * @param projectionClass requested projection class
      * @param <B> type of behaviour
      * @return true if the requested projection is supported
      */
diff --git a/core/api/src/main/java/org/onosproject/net/driver/package-info.java b/core/api/src/main/java/org/onosproject/net/driver/package-info.java
index fbc39a8..8306dfa 100644
--- a/core/api/src/main/java/org/onosproject/net/driver/package-info.java
+++ b/core/api/src/main/java/org/onosproject/net/driver/package-info.java
@@ -16,21 +16,23 @@
 
 /**
  * Set of facilities to allow the platform to be extended with
- * device specific behaviours and to allow modeling device behaviours while
- * hiding details of specific device driver implementations.
+ * device specific behaviours and to allow modeling device (and other entity)
+ * behaviours while hiding details of specific driver implementations.
+ * While primarily intended for devices, this subsystem can be used to abstract
+ * behaviours of other entities as well.
  * <p>
  * {@link org.onosproject.net.driver.Driver} is a representation of a
- * specific family of devices supports set of
+ * specific family of entities (devices, links, etc.) which supports set of
  * {@link org.onosproject.net.driver.Behaviour behaviour classes}. Default
  * implementation is provided by the platform and allows DriverProviders to
  * add different behaviour implementations via DriverService.
  * </p>
  * <p>
  * {@link org.onosproject.net.driver.DriverData} is a container for data
- * learned about a device. It is associated with a specific
+ * learned about an entity. It is associated with a specific
  * {@link org.onosproject.net.driver.Driver}
  * and provides set of {@link org.onosproject.net.driver.Behaviour behaviours}
- * for talking about a device. A default
+ * for talking about an entity. A default
  * implementation provided by platform and has mutable key/value store for use by
  * implementations of {@link org.onosproject.net.driver.Behaviour behaviours}.
  * </p>
diff --git a/core/api/src/test/java/org/onosproject/ui/topo/BiLinkTestBase.java b/core/api/src/test/java/org/onosproject/ui/topo/BiLinkTestBase.java
index bb7fc65..420ea7a 100644
--- a/core/api/src/test/java/org/onosproject/ui/topo/BiLinkTestBase.java
+++ b/core/api/src/test/java/org/onosproject/ui/topo/BiLinkTestBase.java
@@ -22,6 +22,7 @@
 import org.onosproject.net.Link;
 import org.onosproject.net.LinkKey;
 import org.onosproject.net.PortNumber;
+import org.onosproject.net.driver.Behaviour;
 import org.onosproject.net.provider.ProviderId;
 
 /**
@@ -63,6 +64,16 @@
         @Override public ProviderId providerId() {
             return null;
         }
+
+        @Override
+        public <B extends Behaviour> B as(Class<B> projectionClass) {
+            return null;
+        }
+
+        @Override
+        public <B extends Behaviour> boolean is(Class<B> projectionClass) {
+            return false;
+        }
     }
 
     protected static final DeviceId DEV_A_ID = DeviceId.deviceId("device-A");
diff --git a/core/api/src/test/java/org/onosproject/ui/topo/NodeSelectionTest.java b/core/api/src/test/java/org/onosproject/ui/topo/NodeSelectionTest.java
index 06a7858..09b088d 100644
--- a/core/api/src/test/java/org/onosproject/ui/topo/NodeSelectionTest.java
+++ b/core/api/src/test/java/org/onosproject/ui/topo/NodeSelectionTest.java
@@ -19,24 +19,18 @@
 import com.fasterxml.jackson.databind.ObjectMapper;
 import com.fasterxml.jackson.databind.node.ArrayNode;
 import com.fasterxml.jackson.databind.node.ObjectNode;
+import com.google.common.collect.ImmutableSet;
 import org.junit.Test;
-import org.onlab.packet.ChassisId;
-import org.onlab.packet.IpAddress;
-import org.onlab.packet.MacAddress;
-import org.onlab.packet.VlanId;
-import org.onosproject.net.Annotations;
+import org.onosproject.net.DefaultDevice;
+import org.onosproject.net.DefaultHost;
 import org.onosproject.net.Device;
 import org.onosproject.net.DeviceId;
 import org.onosproject.net.Host;
 import org.onosproject.net.HostId;
-import org.onosproject.net.HostLocation;
 import org.onosproject.net.device.DeviceService;
 import org.onosproject.net.device.DeviceServiceAdapter;
 import org.onosproject.net.host.HostService;
 import org.onosproject.net.host.HostServiceAdapter;
-import org.onosproject.net.provider.ProviderId;
-
-import java.util.Set;
 
 import static org.junit.Assert.*;
 
@@ -45,106 +39,18 @@
  */
 public class NodeSelectionTest {
 
-    private static class FakeDevice implements Device {
-
-        private final DeviceId id;
-
+    private static class FakeDevice extends DefaultDevice {
         FakeDevice(DeviceId id) {
-            this.id = id;
-        }
-
-        @Override
-        public DeviceId id() {
-            return id;
-        }
-
-        @Override
-        public Type type() {
-            return null;
-        }
-
-        @Override
-        public String manufacturer() {
-            return null;
-        }
-
-        @Override
-        public String hwVersion() {
-            return null;
-        }
-
-        @Override
-        public String swVersion() {
-            return null;
-        }
-
-        @Override
-        public String serialNumber() {
-            return null;
-        }
-
-        @Override
-        public ChassisId chassisId() {
-            return null;
-        }
-
-        @Override
-        public Annotations annotations() {
-            return null;
-        }
-
-        @Override
-        public ProviderId providerId() {
-            return null;
+            super(null, id, null, null, null, null, null, null);
         }
     }
 
-    private static class FakeHost implements Host {
-
-        private final HostId id;
-
+    private static class FakeHost extends DefaultHost {
         FakeHost(HostId id) {
-            this.id = id;
-        }
-
-        @Override
-        public HostId id() {
-            return id;
-        }
-
-        @Override
-        public MacAddress mac() {
-            return null;
-        }
-
-        @Override
-        public VlanId vlan() {
-            return null;
-        }
-
-        @Override
-        public Set<IpAddress> ipAddresses() {
-            return null;
-        }
-
-        @Override
-        public HostLocation location() {
-            return null;
-        }
-
-        @Override
-        public Annotations annotations() {
-            return null;
-        }
-
-        @Override
-        public ProviderId providerId() {
-            return null;
+            super(null, id, null, null, null, ImmutableSet.of());
         }
     }
 
-
-
     private final ObjectMapper mapper = new ObjectMapper();
 
     private static final String IDS = "ids";
diff --git a/core/common/src/main/java/org/onosproject/codec/impl/PortCodec.java b/core/common/src/main/java/org/onosproject/codec/impl/PortCodec.java
index c6f2ac7..ef865cc 100644
--- a/core/common/src/main/java/org/onosproject/codec/impl/PortCodec.java
+++ b/core/common/src/main/java/org/onosproject/codec/impl/PortCodec.java
@@ -21,6 +21,7 @@
 import org.onosproject.codec.CodecContext;
 import org.onosproject.net.Annotations;
 import org.onosproject.net.DefaultAnnotations;
+import org.onosproject.net.DefaultDevice;
 import org.onosproject.net.DefaultPort;
 import org.onosproject.net.Device;
 import org.onosproject.net.DeviceId;
@@ -99,62 +100,16 @@
     /**
      * Dummy Device which only holds DeviceId.
      */
-    private static final class DummyDevice implements Device {
-
-        private final DeviceId did;
-
+    private static final class DummyDevice extends DefaultDevice {
         /**
          * Constructs Dummy Device which only holds DeviceId.
          *
          * @param did device Id
          */
         public DummyDevice(DeviceId did) {
-            this.did = did;
-        }
-
-        @Override
-        public Annotations annotations() {
-            return DefaultAnnotations.EMPTY;
-        }
-
-        @Override
-        public ProviderId providerId() {
-            return new ProviderId(did.uri().getScheme(), "PortCodec");
-        }
-
-        @Override
-        public DeviceId id() {
-            return did;
-        }
-
-        @Override
-        public Type type() {
-            return Type.SWITCH;
-        }
-
-        @Override
-        public String manufacturer() {
-            return "dummy";
-        }
-
-        @Override
-        public String hwVersion() {
-            return "0";
-        }
-
-        @Override
-        public String swVersion() {
-            return "0";
-        }
-
-        @Override
-        public String serialNumber() {
-            return "0";
-        }
-
-        @Override
-        public ChassisId chassisId() {
-            return new ChassisId();
+            super(new ProviderId(did.uri().getScheme(), "PortCodec"), did,
+                  Type.SWITCH, "dummy", "0", "0", "0", new ChassisId(),
+                  DefaultAnnotations.EMPTY);
         }
     }
 }
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 72492db..53a9a68 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
@@ -25,6 +25,7 @@
 import org.apache.felix.scr.annotations.ReferenceCardinality;
 import org.apache.felix.scr.annotations.Service;
 import org.onlab.util.ItemNotFoundException;
+import org.onosproject.net.AbstractProjectableModel;
 import org.onosproject.net.Device;
 import org.onosproject.net.DeviceId;
 import org.onosproject.net.device.DeviceService;
@@ -72,15 +73,16 @@
 
     @Activate
     protected void activate() {
+        AbstractProjectableModel.setDriverService(null, this);
         log.info("Started");
     }
 
     @Deactivate
     protected void deactivate() {
+        AbstractProjectableModel.setDriverService(this, null);
         log.info("Stopped");
     }
 
-
     @Override
     public Set<DriverProvider> getProviders() {
         return ImmutableSet.copyOf(providers);
