diff --git a/cli/pom.xml b/cli/pom.xml
index 80e173d..cc1d9dd 100644
--- a/cli/pom.xml
+++ b/cli/pom.xml
@@ -23,6 +23,10 @@
             <artifactId>onos-api</artifactId>
         </dependency>
         <dependency>
+            <groupId>org.onlab.onos</groupId>
+            <artifactId>onlab-osgi</artifactId>
+        </dependency>
+        <dependency>
             <groupId>org.osgi</groupId>
             <artifactId>org.osgi.core</artifactId>
         </dependency>
diff --git a/cli/src/main/java/org/onlab/onos/cli/AbstractShellCommand.java b/cli/src/main/java/org/onlab/onos/cli/AbstractShellCommand.java
index e4f87ee..8c41b7f 100644
--- a/cli/src/main/java/org/onlab/onos/cli/AbstractShellCommand.java
+++ b/cli/src/main/java/org/onlab/onos/cli/AbstractShellCommand.java
@@ -1,8 +1,8 @@
 package org.onlab.onos.cli;
 
 import org.apache.karaf.shell.console.OsgiCommandSupport;
-import org.osgi.framework.BundleContext;
-import org.osgi.framework.FrameworkUtil;
+import org.onlab.osgi.DefaultServiceDirectory;
+import org.onlab.osgi.ServiceNotFoundException;
 
 /**
  * Base abstraction of Karaf shell commands.
@@ -17,8 +17,7 @@
      * @return service implementation
      */
     public static <T> T get(Class<T> serviceClass) {
-        BundleContext bc = FrameworkUtil.getBundle(AbstractShellCommand.class).getBundleContext();
-        return bc.getService(bc.getServiceReference(serviceClass));
+        return DefaultServiceDirectory.getService(serviceClass);
     }
 
     /**
@@ -41,4 +40,19 @@
         System.err.println(String.format(format, args));
     }
 
+    /**
+     * Executes this command.
+     */
+    protected abstract void execute();
+
+    @Override
+    protected Object doExecute() throws Exception {
+        try {
+            execute();
+        } catch (ServiceNotFoundException e) {
+            error(e.getMessage());
+        }
+        return null;
+    }
+
 }
diff --git a/cli/src/main/java/org/onlab/onos/cli/NodesListCommand.java b/cli/src/main/java/org/onlab/onos/cli/NodesListCommand.java
index 1057d6e..1e921b4 100644
--- a/cli/src/main/java/org/onlab/onos/cli/NodesListCommand.java
+++ b/cli/src/main/java/org/onlab/onos/cli/NodesListCommand.java
@@ -29,8 +29,8 @@
     };
 
     @Override
-    protected Object doExecute() throws Exception {
-        ClusterService service = getService(ClusterService.class);
+    protected void execute() {
+        ClusterService service = get(ClusterService.class);
         List<ControllerNode> nodes = newArrayList(service.getNodes());
         Collections.sort(nodes, ID_COMPARATOR);
         ControllerNode self = service.getLocalNode();
@@ -39,7 +39,6 @@
                   service.getState(node.id()),
                   node.equals(self) ? "*" : "");
         }
-        return null;
     }
 
 }
diff --git a/cli/src/main/java/org/onlab/onos/cli/net/ClusterDevicesCommand.java b/cli/src/main/java/org/onlab/onos/cli/net/ClusterDevicesCommand.java
index a6f3048..f0217de 100644
--- a/cli/src/main/java/org/onlab/onos/cli/net/ClusterDevicesCommand.java
+++ b/cli/src/main/java/org/onlab/onos/cli/net/ClusterDevicesCommand.java
@@ -31,7 +31,7 @@
     };
 
     @Override
-    protected Object doExecute() throws Exception {
+    protected void execute() {
         int cid = Integer.parseInt(id);
         init();
         TopologyCluster cluster = service.getCluster(topology, clusterId(cid));
@@ -44,8 +44,6 @@
                 print("%s", deviceId);
             }
         }
-
-        return null;
     }
 
 
diff --git a/cli/src/main/java/org/onlab/onos/cli/net/ClusterLinksCommand.java b/cli/src/main/java/org/onlab/onos/cli/net/ClusterLinksCommand.java
index be5105c..2bbfb46 100644
--- a/cli/src/main/java/org/onlab/onos/cli/net/ClusterLinksCommand.java
+++ b/cli/src/main/java/org/onlab/onos/cli/net/ClusterLinksCommand.java
@@ -20,7 +20,7 @@
     String id = null;
 
     @Override
-    protected Object doExecute() throws Exception {
+    protected void execute() {
         int cid = Integer.parseInt(id);
         init();
         TopologyCluster cluster = service.getCluster(topology, clusterId(cid));
@@ -31,7 +31,6 @@
                 print(linkString(link));
             }
         }
-        return null;
     }
 
 }
diff --git a/cli/src/main/java/org/onlab/onos/cli/net/ClustersListCommand.java b/cli/src/main/java/org/onlab/onos/cli/net/ClustersListCommand.java
index 6bd444a..fe67348 100644
--- a/cli/src/main/java/org/onlab/onos/cli/net/ClustersListCommand.java
+++ b/cli/src/main/java/org/onlab/onos/cli/net/ClustersListCommand.java
@@ -27,7 +27,7 @@
             };
 
     @Override
-    protected Object doExecute() throws Exception {
+    protected void execute() {
         init();
         List<TopologyCluster> clusters = Lists.newArrayList(service.getClusters(topology));
         Collections.sort(clusters, ID_COMPARATOR);
@@ -35,7 +35,6 @@
         for (TopologyCluster cluster : clusters) {
             print(FMT, cluster.id().index(), cluster.deviceCount(), cluster.linkCount());
         }
-        return null;
     }
 
 }
diff --git a/cli/src/main/java/org/onlab/onos/cli/net/DevicePortsListCommand.java b/cli/src/main/java/org/onlab/onos/cli/net/DevicePortsListCommand.java
index 8750424..9d68fb8 100644
--- a/cli/src/main/java/org/onlab/onos/cli/net/DevicePortsListCommand.java
+++ b/cli/src/main/java/org/onlab/onos/cli/net/DevicePortsListCommand.java
@@ -35,7 +35,7 @@
     };
 
     @Override
-    protected Object doExecute() throws Exception {
+    protected void execute() {
         DeviceService service = getService(DeviceService.class);
         if (uri == null) {
             for (Device device : getSortedDevices(service)) {
@@ -49,7 +49,6 @@
                 printDevice(service, device);
             }
         }
-        return null;
     }
 
     @Override
diff --git a/cli/src/main/java/org/onlab/onos/cli/net/DeviceRemoveCommand.java b/cli/src/main/java/org/onlab/onos/cli/net/DeviceRemoveCommand.java
index b4f2385..7cc55e6 100644
--- a/cli/src/main/java/org/onlab/onos/cli/net/DeviceRemoveCommand.java
+++ b/cli/src/main/java/org/onlab/onos/cli/net/DeviceRemoveCommand.java
@@ -18,9 +18,8 @@
     String uri = null;
 
     @Override
-    protected Object doExecute() throws Exception {
+    protected void execute() {
         getService(DeviceAdminService.class).removeDevice(DeviceId.deviceId(uri));
-        return null;
     }
 
 }
diff --git a/cli/src/main/java/org/onlab/onos/cli/net/DeviceRoleCommand.java b/cli/src/main/java/org/onlab/onos/cli/net/DeviceRoleCommand.java
index 32da169..ddccdaf 100644
--- a/cli/src/main/java/org/onlab/onos/cli/net/DeviceRoleCommand.java
+++ b/cli/src/main/java/org/onlab/onos/cli/net/DeviceRoleCommand.java
@@ -23,11 +23,10 @@
     String role = null;
 
     @Override
-    protected Object doExecute() throws Exception {
+    protected void execute() {
         MastershipRole mastershipRole = MastershipRole.valueOf(role.toUpperCase());
         getService(DeviceAdminService.class).setRole(DeviceId.deviceId(uri),
                                                      mastershipRole);
-        return null;
     }
 
 }
diff --git a/cli/src/main/java/org/onlab/onos/cli/net/DevicesListCommand.java b/cli/src/main/java/org/onlab/onos/cli/net/DevicesListCommand.java
index 9a90ef2..357d005 100644
--- a/cli/src/main/java/org/onlab/onos/cli/net/DevicesListCommand.java
+++ b/cli/src/main/java/org/onlab/onos/cli/net/DevicesListCommand.java
@@ -29,12 +29,11 @@
     };
 
     @Override
-    protected Object doExecute() throws Exception {
+    protected void execute() {
         DeviceService service = getService(DeviceService.class);
         for (Device device : getSortedDevices(service)) {
             printDevice(service, device);
         }
-        return null;
     }
 
     /**
diff --git a/cli/src/main/java/org/onlab/onos/cli/net/FlowsListCommand.java b/cli/src/main/java/org/onlab/onos/cli/net/FlowsListCommand.java
index 07d15e2..9e21642 100644
--- a/cli/src/main/java/org/onlab/onos/cli/net/FlowsListCommand.java
+++ b/cli/src/main/java/org/onlab/onos/cli/net/FlowsListCommand.java
@@ -34,14 +34,13 @@
     };
 
     @Override
-    protected Object doExecute() throws Exception {
+    protected void execute() {
         DeviceService deviceService = getService(DeviceService.class);
         FlowRuleService service = getService(FlowRuleService.class);
         Map<Device, List<FlowRule>> flows = getSortedFlows(deviceService, service);
         for (Device d : deviceService.getDevices()) {
             printFlows(d, flows.get(d));
         }
-        return null;
     }
 
 
diff --git a/cli/src/main/java/org/onlab/onos/cli/net/HostsListCommand.java b/cli/src/main/java/org/onlab/onos/cli/net/HostsListCommand.java
index 47aa688..c45470c 100644
--- a/cli/src/main/java/org/onlab/onos/cli/net/HostsListCommand.java
+++ b/cli/src/main/java/org/onlab/onos/cli/net/HostsListCommand.java
@@ -29,12 +29,11 @@
     };
 
     @Override
-    protected Object doExecute() throws Exception {
+    protected void execute() {
         HostService service = getService(HostService.class);
         for (Host host : getSortedHosts(service)) {
             printHost(host);
         }
-        return null;
     }
 
     /**
diff --git a/cli/src/main/java/org/onlab/onos/cli/net/LinksListCommand.java b/cli/src/main/java/org/onlab/onos/cli/net/LinksListCommand.java
index d74f9e4..2519bdd 100644
--- a/cli/src/main/java/org/onlab/onos/cli/net/LinksListCommand.java
+++ b/cli/src/main/java/org/onlab/onos/cli/net/LinksListCommand.java
@@ -23,14 +23,13 @@
     String uri = null;
 
     @Override
-    protected Object doExecute() throws Exception {
+    protected void execute() {
         LinkService service = getService(LinkService.class);
         Iterable<Link> links = uri != null ?
                 service.getDeviceLinks(deviceId(uri)) : service.getLinks();
         for (Link link : links) {
             print(linkString(link));
         }
-        return null;
     }
 
     /**
diff --git a/cli/src/main/java/org/onlab/onos/cli/net/PathListCommand.java b/cli/src/main/java/org/onlab/onos/cli/net/PathListCommand.java
index cdede0b..8bb808a 100644
--- a/cli/src/main/java/org/onlab/onos/cli/net/PathListCommand.java
+++ b/cli/src/main/java/org/onlab/onos/cli/net/PathListCommand.java
@@ -29,13 +29,12 @@
     String dst = null;
 
     @Override
-    protected Object doExecute() throws Exception {
+    protected void execute() {
         init();
         Set<Path> paths = service.getPaths(topology, deviceId(src), deviceId(dst));
         for (Path path : paths) {
             print(pathString(path));
         }
-        return null;
     }
 
     /**
diff --git a/cli/src/main/java/org/onlab/onos/cli/net/TopologyCommand.java b/cli/src/main/java/org/onlab/onos/cli/net/TopologyCommand.java
index 6c141ae..a258205 100644
--- a/cli/src/main/java/org/onlab/onos/cli/net/TopologyCommand.java
+++ b/cli/src/main/java/org/onlab/onos/cli/net/TopologyCommand.java
@@ -28,11 +28,10 @@
     }
 
     @Override
-    protected Object doExecute() throws Exception {
+    protected void execute() {
         init();
         print(FMT, topology.time(), topology.deviceCount(), topology.linkCount(),
               topology.clusterCount(), topology.pathCount());
-        return null;
     }
 
 }
diff --git a/cli/src/main/java/org/onlab/onos/cli/net/WipeOutCommand.java b/cli/src/main/java/org/onlab/onos/cli/net/WipeOutCommand.java
index 51a0fce..d0e6a70 100644
--- a/cli/src/main/java/org/onlab/onos/cli/net/WipeOutCommand.java
+++ b/cli/src/main/java/org/onlab/onos/cli/net/WipeOutCommand.java
@@ -16,7 +16,7 @@
 public class WipeOutCommand extends ClustersListCommand {
 
     @Override
-    protected Object doExecute() throws Exception {
+    protected void execute() {
         DeviceAdminService deviceAdminService = get(DeviceAdminService.class);
         DeviceService deviceService = get(DeviceService.class);
         for (Device device : deviceService.getDevices()) {
@@ -28,7 +28,6 @@
         for (Host host : hostService.getHosts()) {
             hostAdminService.removeHost(host.id());
         }
-        return null;
     }
 
 
diff --git a/core/api/src/main/java/org/onlab/onos/cluster/MastershipService.java b/core/api/src/main/java/org/onlab/onos/cluster/MastershipService.java
index 6a9b60e..8da4aa5 100644
--- a/core/api/src/main/java/org/onlab/onos/cluster/MastershipService.java
+++ b/core/api/src/main/java/org/onlab/onos/cluster/MastershipService.java
@@ -37,6 +37,9 @@
      */
     MastershipRole requestRoleFor(DeviceId deviceId);
 
+    // TODO: add facet for requesting a different master than the current one;
+    // abandon mastership (due to loss of connection)
+
     /**
      * Adds the specified mastership change listener.
      *
diff --git a/core/api/src/main/java/org/onlab/onos/net/DefaultPort.java b/core/api/src/main/java/org/onlab/onos/net/DefaultPort.java
index d07def8..534cbe4 100644
--- a/core/api/src/main/java/org/onlab/onos/net/DefaultPort.java
+++ b/core/api/src/main/java/org/onlab/onos/net/DefaultPort.java
@@ -2,13 +2,7 @@
 
 import static com.google.common.base.MoreObjects.toStringHelper;
 
-import java.util.Collections;
 import java.util.Objects;
-import java.util.Set;
-
-import org.onlab.packet.IpPrefix;
-
-import com.google.common.collect.ImmutableSet;
 
 /**
  * Default port implementation.
@@ -19,36 +13,18 @@
     private final PortNumber number;
     private final boolean isEnabled;
 
-    // Attributes
-    private final Set<IpPrefix> ipAddresses;
-
-    /**
-     * Creates a network element attributed to the specified provider.
-     *
-     * @param element   parent network element
-     * @param number    port number
-     * @param isEnabled indicator whether the port is up and active
-     */
-    public DefaultPort(Element element, PortNumber number,
-                       boolean isEnabled) {
-        this(element, number, isEnabled, null);
-    }
-
     /**
      * Creates a network element attributed to the specified provider.
      *
      * @param element     parent network element
      * @param number      port number
      * @param isEnabled   indicator whether the port is up and active
-     * @param ipAddresses set of IP addresses assigned to the port
      */
     public DefaultPort(Element element, PortNumber number,
-                       boolean isEnabled, Set<IpPrefix> ipAddresses) {
+                       boolean isEnabled) {
         this.element = element;
         this.number = number;
         this.isEnabled = isEnabled;
-        this.ipAddresses = (ipAddresses == null) ? Collections.<IpPrefix>emptySet() :
-            ImmutableSet.copyOf(ipAddresses);
     }
 
     @Override
@@ -94,9 +70,4 @@
         return element;
     }
 
-    @Override
-    public Set<IpPrefix> ipAddresses() {
-        return ipAddresses;
-    }
-
 }
diff --git a/core/api/src/main/java/org/onlab/onos/net/Port.java b/core/api/src/main/java/org/onlab/onos/net/Port.java
index 45b816b..2ebbd15 100644
--- a/core/api/src/main/java/org/onlab/onos/net/Port.java
+++ b/core/api/src/main/java/org/onlab/onos/net/Port.java
@@ -1,8 +1,5 @@
 package org.onlab.onos.net;
 
-import java.util.Set;
-
-import org.onlab.packet.IpPrefix;
 
 /**
  * Abstraction of a network port.
@@ -32,12 +29,4 @@
 
     // set of port attributes
 
-    /**
-     * Returns the set of IP addresses that are logically configured on this
-     * port.
-     *
-     * @return the set of IP addresses configured on the port. The set is empty
-     * if no addresses are configured.
-     */
-    Set<IpPrefix> ipAddresses();
 }
diff --git a/core/api/src/main/java/org/onlab/onos/net/device/DeviceAdminService.java b/core/api/src/main/java/org/onlab/onos/net/device/DeviceAdminService.java
index 23856ab..fbfec31 100644
--- a/core/api/src/main/java/org/onlab/onos/net/device/DeviceAdminService.java
+++ b/core/api/src/main/java/org/onlab/onos/net/device/DeviceAdminService.java
@@ -15,7 +15,7 @@
      * @param role     requested role
      * @deprecated Will be removed in favor of MastershipAdminService.setRole()
      */
-    @Deprecated
+//    @Deprecated
     void setRole(DeviceId deviceId, MastershipRole role);
 
     /**
diff --git a/core/api/src/main/java/org/onlab/onos/net/host/HostAdminService.java b/core/api/src/main/java/org/onlab/onos/net/host/HostAdminService.java
index d94449a..29f6c04 100644
--- a/core/api/src/main/java/org/onlab/onos/net/host/HostAdminService.java
+++ b/core/api/src/main/java/org/onlab/onos/net/host/HostAdminService.java
@@ -1,6 +1,11 @@
 package org.onlab.onos.net.host;
 
+import java.util.Set;
+
+import org.onlab.onos.net.ConnectPoint;
 import org.onlab.onos.net.HostId;
+import org.onlab.packet.IpAddress;
+import org.onlab.packet.MacAddress;
 
 /**
  * Service for administering the inventory of end-station hosts.
@@ -14,4 +19,42 @@
      */
     void removeHost(HostId hostId);
 
+    /**
+     * Binds an IP address and optional MAC address to the given connection
+     * point.
+     * <p/>
+     * This method will overwrite any previously held address information for
+     * the connection point.
+     *
+     * @param ip the IP address to bind to the connection point. This parameter
+     * is mandatory and cannot be null.
+     * @param mac the optional MAC address to bind to the connection point. Can
+     * be set to null if no MAC address needs to be bound.
+     * @param connectPoint the connection point to bind the addresses to
+     */
+    void bindAddressesToPort(IpAddress ip, MacAddress mac, ConnectPoint connectPoint);
+
+    /**
+     * Removes all address information for the given connection point.
+     *
+     * @param connectPoint the connection point to remove address information
+     */
+    void unbindAddressesFromPort(ConnectPoint connectPoint);
+
+    /**
+     * Returns the addresses information for all connection points.
+     *
+     * @return the set of address bindings for all connection points
+     */
+    Set<PortAddresses> getAddressBindings();
+
+    /**
+     * Retrieves the addresses that have been bound to the given connection
+     * point.
+     *
+     * @param connectPoint the connection point to retrieve address bindings
+     * for
+     * @return addresses bound to the port
+     */
+    PortAddresses getAddressBindingsForPort(ConnectPoint connectPoint);
 }
diff --git a/core/api/src/main/java/org/onlab/onos/net/host/HostService.java b/core/api/src/main/java/org/onlab/onos/net/host/HostService.java
index 3717bea..a0f51b3 100644
--- a/core/api/src/main/java/org/onlab/onos/net/host/HostService.java
+++ b/core/api/src/main/java/org/onlab/onos/net/host/HostService.java
@@ -6,6 +6,7 @@
 import org.onlab.onos.net.DeviceId;
 import org.onlab.onos.net.Host;
 import org.onlab.onos.net.HostId;
+import org.onlab.packet.IpAddress;
 import org.onlab.packet.IpPrefix;
 import org.onlab.packet.MacAddress;
 import org.onlab.packet.VlanId;
@@ -87,7 +88,7 @@
      *
      * @param ip IP address of the host to monitor
      */
-    void monitorIp(IpPrefix ip);
+    void startMonitoringIp(IpAddress ip);
 
     /**
      * Stops the host service from monitoring an IP address.
@@ -95,7 +96,18 @@
      * @param ip IP address to stop monitoring
      */
     // TODO clients can cancel other client's requests
-    void stopMonitoringIp(IpPrefix ip);
+    void stopMonitoringIp(IpAddress ip);
+
+    /**
+     * Requests the host service to resolve the MAC address for the given IP
+     * address.
+     * <p/>
+     * This will trigger a notification to the host listeners if the MAC
+     * address is found.
+     *
+     * @param ip IP address to find the MAC address for
+     */
+    void requestMac(IpAddress ip);
 
     /**
      * Adds the specified host listener.
diff --git a/core/api/src/main/java/org/onlab/onos/net/host/HostStore.java b/core/api/src/main/java/org/onlab/onos/net/host/HostStore.java
index ea316b2..e3667e3 100644
--- a/core/api/src/main/java/org/onlab/onos/net/host/HostStore.java
+++ b/core/api/src/main/java/org/onlab/onos/net/host/HostStore.java
@@ -1,5 +1,7 @@
 package org.onlab.onos.net.host;
 
+import java.util.Set;
+
 import org.onlab.onos.net.ConnectPoint;
 import org.onlab.onos.net.DeviceId;
 import org.onlab.onos.net.Host;
@@ -9,8 +11,6 @@
 import org.onlab.packet.MacAddress;
 import org.onlab.packet.VlanId;
 
-import java.util.Set;
-
 /**
  * Manages inventory of end-station hosts; not intended for direct use.
  */
@@ -98,4 +98,34 @@
      */
     Set<Host> getConnectedHosts(DeviceId deviceId);
 
+    /**
+     * Updates the address information for a given port.
+     *
+     * @param addresses the port and address information
+     */
+    void updateAddressBindings(PortAddresses addresses);
+
+    /**
+     * Removes any previously stored address information for a given connection
+     * point.
+     *
+     * @param connectPoint the connection point
+     */
+    void removeAddressBindings(ConnectPoint connectPoint);
+
+    /**
+     * Returns the address bindings stored for all connection points.
+     *
+     * @return the set of address bindings
+     */
+    Set<PortAddresses> getAddressBindings();
+
+    /**
+     * Returns the address bindings for a particular connection point.
+     *
+     * @param connectPoint the connection point to return address information
+     * for
+     * @return address information for the connection point
+     */
+    PortAddresses getAddressBindingsForPort(ConnectPoint connectPoint);
 }
diff --git a/core/api/src/main/java/org/onlab/onos/net/host/PortAddresses.java b/core/api/src/main/java/org/onlab/onos/net/host/PortAddresses.java
new file mode 100644
index 0000000..16cc2b1
--- /dev/null
+++ b/core/api/src/main/java/org/onlab/onos/net/host/PortAddresses.java
@@ -0,0 +1,32 @@
+package org.onlab.onos.net.host;
+
+import org.onlab.onos.net.ConnectPoint;
+import org.onlab.packet.IpAddress;
+import org.onlab.packet.MacAddress;
+
+/**
+ * Represents address information bound to a port.
+ */
+public interface PortAddresses {
+
+    /**
+     * Returns the connection point this address information is bound to.
+     *
+     * @return the connection point
+     */
+    ConnectPoint connectPoint();
+
+    /**
+     * Returns the IP address bound to the port.
+     *
+     * @return the IP address
+     */
+    IpAddress ip();
+
+    /**
+     * Returns the MAC address bound to the port.
+     *
+     * @return the MAC address if one is bound, otherwise null
+     */
+    MacAddress mac();
+}
diff --git a/core/api/src/test/java/org/onlab/onos/net/host/HostServiceAdapter.java b/core/api/src/test/java/org/onlab/onos/net/host/HostServiceAdapter.java
index 6a270cd..f03621c 100644
--- a/core/api/src/test/java/org/onlab/onos/net/host/HostServiceAdapter.java
+++ b/core/api/src/test/java/org/onlab/onos/net/host/HostServiceAdapter.java
@@ -6,6 +6,7 @@
 import org.onlab.onos.net.DeviceId;
 import org.onlab.onos.net.Host;
 import org.onlab.onos.net.HostId;
+import org.onlab.packet.IpAddress;
 import org.onlab.packet.IpPrefix;
 import org.onlab.packet.MacAddress;
 import org.onlab.packet.VlanId;
@@ -55,11 +56,15 @@
     }
 
     @Override
-    public void monitorIp(IpPrefix ip) {
+    public void startMonitoringIp(IpAddress ip) {
     }
 
     @Override
-    public void stopMonitoringIp(IpPrefix ip) {
+    public void stopMonitoringIp(IpAddress ip) {
+    }
+
+    @Override
+    public void requestMac(IpAddress ip) {
     }
 
     @Override
diff --git a/core/net/src/main/java/org/onlab/onos/net/host/impl/DefaultPortAddresses.java b/core/net/src/main/java/org/onlab/onos/net/host/impl/DefaultPortAddresses.java
new file mode 100644
index 0000000..fb656cf
--- /dev/null
+++ b/core/net/src/main/java/org/onlab/onos/net/host/impl/DefaultPortAddresses.java
@@ -0,0 +1,36 @@
+package org.onlab.onos.net.host.impl;
+
+import org.onlab.onos.net.ConnectPoint;
+import org.onlab.onos.net.host.PortAddresses;
+import org.onlab.packet.IpAddress;
+import org.onlab.packet.MacAddress;
+
+public class DefaultPortAddresses implements PortAddresses {
+
+    private final ConnectPoint connectPoint;
+    private final IpAddress ipAddress;
+    private final MacAddress macAddress;
+
+    public DefaultPortAddresses(ConnectPoint connectPoint,
+            IpAddress ip, MacAddress mac) {
+        this.connectPoint = connectPoint;
+        this.ipAddress = ip;
+        this.macAddress = mac;
+    }
+
+    @Override
+    public ConnectPoint connectPoint() {
+        return connectPoint;
+    }
+
+    @Override
+    public IpAddress ip() {
+        return ipAddress;
+    }
+
+    @Override
+    public MacAddress mac() {
+        return macAddress;
+    }
+
+}
diff --git a/core/net/src/main/java/org/onlab/onos/net/host/impl/HostManager.java b/core/net/src/main/java/org/onlab/onos/net/host/impl/HostManager.java
index 1c4cef7..3c1a499 100644
--- a/core/net/src/main/java/org/onlab/onos/net/host/impl/HostManager.java
+++ b/core/net/src/main/java/org/onlab/onos/net/host/impl/HostManager.java
@@ -26,8 +26,10 @@
 import org.onlab.onos.net.host.HostProviderService;
 import org.onlab.onos.net.host.HostService;
 import org.onlab.onos.net.host.HostStore;
+import org.onlab.onos.net.host.PortAddresses;
 import org.onlab.onos.net.provider.AbstractProviderRegistry;
 import org.onlab.onos.net.provider.AbstractProviderService;
+import org.onlab.packet.IpAddress;
 import org.onlab.packet.IpPrefix;
 import org.onlab.packet.MacAddress;
 import org.onlab.packet.VlanId;
@@ -118,13 +120,18 @@
     }
 
     @Override
-    public void monitorIp(IpPrefix ip) {
-        // TODO pass through to SimpleHostMonitor
+    public void startMonitoringIp(IpAddress ip) {
+        // TODO pass through to HostMonitor
     }
 
     @Override
-    public void stopMonitoringIp(IpPrefix ip) {
-        // TODO pass through to SimpleHostMonitor
+    public void stopMonitoringIp(IpAddress ip) {
+        // TODO pass through to HostMonitor
+    }
+
+    @Override
+    public void requestMac(IpAddress ip) {
+        // TODO Auto-generated method stub
     }
 
     @Override
@@ -147,6 +154,27 @@
         }
     }
 
+    @Override
+    public void bindAddressesToPort(IpAddress ip, MacAddress mac,
+            ConnectPoint connectPoint) {
+        store.updateAddressBindings(new DefaultPortAddresses(connectPoint, ip, mac));
+    }
+
+    @Override
+    public void unbindAddressesFromPort(ConnectPoint connectPoint) {
+        store.removeAddressBindings(connectPoint);
+    }
+
+    @Override
+    public Set<PortAddresses> getAddressBindings() {
+        return store.getAddressBindings();
+    }
+
+    @Override
+    public PortAddresses getAddressBindingsForPort(ConnectPoint connectPoint) {
+        return store.getAddressBindingsForPort(connectPoint);
+    }
+
     // Personalized host provider service issued to the supplied provider.
     private class InternalHostProviderService
             extends AbstractProviderService<HostProvider>
diff --git a/core/net/src/main/java/org/onlab/onos/net/host/impl/HostMonitor.java b/core/net/src/main/java/org/onlab/onos/net/host/impl/HostMonitor.java
index 551dec6..ecdb177 100644
--- a/core/net/src/main/java/org/onlab/onos/net/host/impl/HostMonitor.java
+++ b/core/net/src/main/java/org/onlab/onos/net/host/impl/HostMonitor.java
@@ -6,7 +6,6 @@
 
 import org.jboss.netty.util.Timeout;
 import org.jboss.netty.util.TimerTask;
-import org.onlab.onos.net.Device;
 import org.onlab.onos.net.Host;
 import org.onlab.onos.net.Port;
 import org.onlab.onos.net.device.DeviceService;
@@ -89,7 +88,7 @@
         // else (ip isn't in any configured subnet)
         //   send out all non-external edge ports
 
-        for (Device device : deviceService.getDevices()) {
+        /*for (Device device : deviceService.getDevices()) {
             for (Port port : deviceService.getPorts(device.id())) {
                 for (IpPrefix ip : port.ipAddresses()) {
                     if (ip.contains(targetIp)) {
@@ -98,7 +97,7 @@
                     }
                 }
             }
-        }
+        }*/
 
     }
 
diff --git a/core/net/src/test/java/org/onlab/onos/net/device/impl/DistributedDeviceManagerTest.java b/core/net/src/test/java/org/onlab/onos/net/device/impl/DistributedDeviceManagerTest.java
index 222216c..85246e9 100644
--- a/core/net/src/test/java/org/onlab/onos/net/device/impl/DistributedDeviceManagerTest.java
+++ b/core/net/src/test/java/org/onlab/onos/net/device/impl/DistributedDeviceManagerTest.java
@@ -1,10 +1,14 @@
 package org.onlab.onos.net.device.impl;
 
+import com.google.common.collect.Iterables;
+import com.hazelcast.config.Config;
+import com.hazelcast.core.Hazelcast;
 import com.hazelcast.core.HazelcastInstance;
 import org.junit.After;
 import org.junit.Before;
 import org.junit.Test;
 import org.onlab.onos.event.Event;
+import org.onlab.onos.event.impl.TestEventDispatcher;
 import org.onlab.onos.net.Device;
 import org.onlab.onos.net.DeviceId;
 import org.onlab.onos.net.MastershipRole;
@@ -23,13 +27,9 @@
 import org.onlab.onos.net.device.PortDescription;
 import org.onlab.onos.net.provider.AbstractProvider;
 import org.onlab.onos.net.provider.ProviderId;
-import org.onlab.onos.event.impl.TestEventDispatcher;
 import org.onlab.onos.store.StoreService;
 import org.onlab.onos.store.device.impl.DistributedDeviceStore;
-
-import com.google.common.collect.Iterables;
-import com.hazelcast.config.Config;
-import com.hazelcast.core.Hazelcast;
+import org.onlab.onos.store.impl.StoreManager;
 
 import java.util.ArrayList;
 import java.util.Iterator;
@@ -64,6 +64,7 @@
 
     private DeviceManager mgr;
 
+    protected StoreManager storeManager;
     protected DeviceService service;
     protected DeviceAdminService admin;
     protected DeviceProviderRegistry registry;
@@ -89,7 +90,11 @@
         config.getNetworkConfig().getJoin()
             .getMulticastConfig()
             .setEnabled(false);
-        dstore = new TestDistributedDeviceStore(Hazelcast.newHazelcastInstance(config));
+
+        storeManager = new TestStoreManager(Hazelcast.newHazelcastInstance(config));
+        storeManager.activate();
+
+        dstore = new TestDistributedDeviceStore(storeManager);
         dstore.activate();
         mgr.store = dstore;
         mgr.eventDispatcher = new TestEventDispatcher();
@@ -112,7 +117,7 @@
         mgr.deactivate();
 
         dstore.deactivate();
-        ((TestDistributedDeviceStore) dstore).shutdownHz();
+        storeManager.deactivate();
     }
 
     private void connectDevice(DeviceId deviceId, String swVersion) {
@@ -282,20 +287,19 @@
     }
 
     private class TestDistributedDeviceStore extends DistributedDeviceStore {
-        public TestDistributedDeviceStore(final HazelcastInstance hazelcastInstance) {
-            storeService = new StoreService() {
-                @Override
-                public HazelcastInstance getHazelcastInstance() {
-                    return hazelcastInstance;
-                }
-            };
+        public TestDistributedDeviceStore(StoreService storeService) {
+            this.storeService = storeService;
+        }
+    }
+
+    private class TestStoreManager extends StoreManager {
+        TestStoreManager(HazelcastInstance instance) {
+            this.instance = instance;
         }
 
-        /**
-         * Shutdowns the hazelcast instance.
-         */
-        public void shutdownHz() {
-            theInstance.shutdown();
+        @Override
+        public void activate() {
+            setupKryoPool();
         }
     }
 }
diff --git a/core/store/src/main/java/org/onlab/onos/store/StoreService.java b/core/store/src/main/java/org/onlab/onos/store/StoreService.java
index a672f54..b10cb7e 100644
--- a/core/store/src/main/java/org/onlab/onos/store/StoreService.java
+++ b/core/store/src/main/java/org/onlab/onos/store/StoreService.java
@@ -15,4 +15,22 @@
      */
     HazelcastInstance getHazelcastInstance();
 
+    /**
+     * Serializes the specified object into bytes using one of the
+     * pre-registered serializers.
+     *
+     * @param obj object to be serialized
+     * @return serialized bytes
+     */
+    public byte[] serialize(final Object obj);
+
+    /**
+     * Deserializes the specified bytes into an object using one of the
+     * pre-registered serializers.
+     *
+     * @param bytes bytes to be deserialized
+     * @return deserialized object
+     */
+    public <T> T deserialize(final byte[] bytes);
+
 }
diff --git a/core/store/src/main/java/org/onlab/onos/store/device/impl/DefaultPortSerializer.java b/core/store/src/main/java/org/onlab/onos/store/device/impl/DefaultPortSerializer.java
deleted file mode 100644
index bd0aa06..0000000
--- a/core/store/src/main/java/org/onlab/onos/store/device/impl/DefaultPortSerializer.java
+++ /dev/null
@@ -1,59 +0,0 @@
-package org.onlab.onos.store.device.impl;
-
-import java.util.ArrayList;
-import java.util.Collection;
-
-import org.onlab.onos.net.DefaultPort;
-import org.onlab.onos.net.Element;
-import org.onlab.onos.net.PortNumber;
-import org.onlab.packet.IpPrefix;
-
-import com.esotericsoftware.kryo.Kryo;
-import com.esotericsoftware.kryo.Serializer;
-import com.esotericsoftware.kryo.io.Input;
-import com.esotericsoftware.kryo.io.Output;
-import com.esotericsoftware.kryo.serializers.CollectionSerializer;
-import com.google.common.collect.ImmutableSet;
-
-// TODO move to util, etc.
-/**
- * Kryo Serializer for {@link DefaultPort}.
- */
-public final class DefaultPortSerializer extends
-        Serializer<DefaultPort> {
-
-    private final CollectionSerializer ipAddrSerializer
-        = new CollectionSerializer(IpPrefix.class,
-                            new IpPrefixSerializer(), false);
-
-    /**
-     * Default constructor.
-     */
-    public DefaultPortSerializer() {
-        // non-null, immutable
-        super(false, true);
-    }
-
-    @Override
-    public void write(Kryo kryo, Output output, DefaultPort object) {
-        kryo.writeClassAndObject(output, object.element());
-        kryo.writeObject(output, object.number());
-        output.writeBoolean(object.isEnabled());
-        kryo.writeObject(output, object.ipAddresses(),
-                ipAddrSerializer);
-    }
-
-    @Override
-    public DefaultPort read(Kryo kryo, Input input,
-            Class<DefaultPort> type) {
-        Element element = (Element) kryo.readClassAndObject(input);
-        PortNumber number = kryo.readObject(input, PortNumber.class);
-        boolean isEnabled = input.readBoolean();
-        @SuppressWarnings("unchecked")
-        Collection<IpPrefix> ipAddresses = kryo.readObject(
-                    input, ArrayList.class, ipAddrSerializer);
-
-        return new DefaultPort(element, number, isEnabled,
-                            ImmutableSet.copyOf(ipAddresses));
-    }
-}
diff --git a/core/store/src/main/java/org/onlab/onos/store/device/impl/DistributedDeviceStore.java b/core/store/src/main/java/org/onlab/onos/store/device/impl/DistributedDeviceStore.java
index 270557e..a4eb027 100644
--- a/core/store/src/main/java/org/onlab/onos/store/device/impl/DistributedDeviceStore.java
+++ b/core/store/src/main/java/org/onlab/onos/store/device/impl/DistributedDeviceStore.java
@@ -1,49 +1,5 @@
 package org.onlab.onos.store.device.impl;
 
-import static com.google.common.base.Preconditions.checkArgument;
-import static com.google.common.base.Preconditions.checkNotNull;
-import static org.onlab.onos.net.device.DeviceEvent.Type.DEVICE_AVAILABILITY_CHANGED;
-import static org.onlab.onos.net.device.DeviceEvent.Type.DEVICE_MASTERSHIP_CHANGED;
-import static org.onlab.onos.net.device.DeviceEvent.Type.DEVICE_REMOVED;
-import static org.onlab.onos.net.device.DeviceEvent.Type.PORT_ADDED;
-import static org.onlab.onos.net.device.DeviceEvent.Type.PORT_REMOVED;
-import static org.onlab.onos.net.device.DeviceEvent.Type.PORT_UPDATED;
-import static org.slf4j.LoggerFactory.getLogger;
-
-import java.net.URI;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-import java.util.Objects;
-import java.util.Set;
-
-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.Reference;
-import org.apache.felix.scr.annotations.ReferenceCardinality;
-import org.apache.felix.scr.annotations.Service;
-import org.onlab.onos.net.DefaultDevice;
-import org.onlab.onos.net.DefaultPort;
-import org.onlab.onos.net.Device;
-import org.onlab.onos.net.DeviceId;
-import org.onlab.onos.net.Element;
-import org.onlab.onos.net.MastershipRole;
-import org.onlab.onos.net.Port;
-import org.onlab.onos.net.PortNumber;
-import org.onlab.onos.net.device.DeviceDescription;
-import org.onlab.onos.net.device.DeviceEvent;
-import org.onlab.onos.net.device.DeviceStore;
-import org.onlab.onos.net.device.PortDescription;
-import org.onlab.onos.net.provider.ProviderId;
-import org.onlab.onos.store.StoreService;
-import org.onlab.util.KryoPool;
-import org.slf4j.Logger;
-
 import com.google.common.base.Optional;
 import com.google.common.cache.CacheBuilder;
 import com.google.common.cache.CacheLoader;
@@ -57,8 +13,42 @@
 import com.hazelcast.core.IMap;
 import com.hazelcast.core.ISet;
 import com.hazelcast.core.MapEvent;
+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.Reference;
+import org.apache.felix.scr.annotations.ReferenceCardinality;
+import org.apache.felix.scr.annotations.Service;
+import org.onlab.onos.net.DefaultDevice;
+import org.onlab.onos.net.DefaultPort;
+import org.onlab.onos.net.Device;
+import org.onlab.onos.net.DeviceId;
+import org.onlab.onos.net.MastershipRole;
+import org.onlab.onos.net.Port;
+import org.onlab.onos.net.PortNumber;
+import org.onlab.onos.net.device.DeviceDescription;
+import org.onlab.onos.net.device.DeviceEvent;
+import org.onlab.onos.net.device.DeviceStore;
+import org.onlab.onos.net.device.PortDescription;
+import org.onlab.onos.net.provider.ProviderId;
+import org.onlab.onos.store.StoreService;
+import org.onlab.onos.store.impl.AbsentInvalidatingLoadingCache;
+import org.slf4j.Logger;
 
-import de.javakaffee.kryoserializers.URISerializer;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+import java.util.Set;
+
+import static com.google.common.base.Preconditions.checkArgument;
+import static com.google.common.base.Preconditions.checkNotNull;
+import static org.onlab.onos.net.device.DeviceEvent.Type.*;
+import static org.slf4j.LoggerFactory.getLogger;
 
 
 /**
@@ -72,27 +62,6 @@
 
     public static final String DEVICE_NOT_FOUND = "Device with ID %s not found";
 
-    // FIXME Slice out types used in common to separate pool/namespace.
-    private static final KryoPool POOL = KryoPool.newBuilder()
-            .register(
-                    ArrayList.class,
-                    HashMap.class,
-
-                    Device.Type.class,
-
-                    DefaultDevice.class,
-                    MastershipRole.class,
-                    Port.class,
-                    Element.class
-                    )
-            .register(URI.class, new URISerializer())
-            .register(ProviderId.class, new ProviderIdSerializer())
-            .register(DeviceId.class, new DeviceIdSerializer())
-            .register(PortNumber.class, new PortNumberSerializer())
-            .register(DefaultPort.class, new DefaultPortSerializer())
-            .build()
-            .populate(10);
-
     // private IMap<DeviceId, DefaultDevice> cache;
     private IMap<byte[], byte[]> rawDevices;
     private LoadingCache<DeviceId, Optional<DefaultDevice>> devices;
@@ -126,33 +95,33 @@
 
         // TODO decide on Map name scheme to avoid collision
         rawDevices = theInstance.getMap("devices");
-        devices = new AbsentInvalidatingLoadingCache<DeviceId, DefaultDevice>(
+        devices = new AbsentInvalidatingLoadingCache<>(
                 CacheBuilder.newBuilder()
-                .build(new OptionalCacheLoader<DeviceId, DefaultDevice>(rawDevices)));
+                        .build(new OptionalCacheLoader<DeviceId, DefaultDevice>(rawDevices)));
         // refresh/populate cache based on notification from other instance
         rawDevices.addEntryListener(
-                new RemoteEventHandler<DeviceId, DefaultDevice>(devices),
+                new RemoteEventHandler<>(devices),
                 includeValue);
 
         rawRoles = theInstance.getMap("roles");
-        roles = new AbsentInvalidatingLoadingCache<DeviceId, MastershipRole>(
+        roles = new AbsentInvalidatingLoadingCache<>(
                 CacheBuilder.newBuilder()
-                .build(new OptionalCacheLoader<DeviceId, MastershipRole>(rawRoles)));
+                        .build(new OptionalCacheLoader<DeviceId, MastershipRole>(rawRoles)));
         // refresh/populate cache based on notification from other instance
         rawRoles.addEntryListener(
-                new RemoteEventHandler<DeviceId, MastershipRole>(roles),
+                new RemoteEventHandler<>(roles),
                 includeValue);
 
         // TODO cache avai
         availableDevices = theInstance.getSet("availableDevices");
 
         rawDevicePorts = theInstance.getMap("devicePorts");
-        devicePorts = new AbsentInvalidatingLoadingCache<DeviceId, Map<PortNumber, Port>>(
+        devicePorts = new AbsentInvalidatingLoadingCache<>(
                 CacheBuilder.newBuilder()
-                .build(new OptionalCacheLoader<DeviceId, Map<PortNumber, Port>>(rawDevicePorts)));
+                        .build(new OptionalCacheLoader<DeviceId, Map<PortNumber, Port>>(rawDevicePorts)));
         // refresh/populate cache based on notification from other instance
         rawDevicePorts.addEntryListener(
-                new RemoteEventHandler<DeviceId, Map<PortNumber, Port>>(devicePorts),
+                new RemoteEventHandler<>(devicePorts),
                 includeValue);
 
     }
@@ -181,7 +150,7 @@
 //        }
 
         // TODO builder v.s. copyOf. Guava semms to be using copyOf?
-        Builder<Device> builder = ImmutableSet.<Device>builder();
+        Builder<Device> builder = ImmutableSet.builder();
         for (Optional<DefaultDevice> e : devices.asMap().values()) {
             if (e.isPresent()) {
                 builder.add(e.get());
@@ -198,7 +167,7 @@
 
     @Override
     public DeviceEvent createOrUpdateDevice(ProviderId providerId, DeviceId deviceId,
-                                     DeviceDescription deviceDescription) {
+                                            DeviceDescription deviceDescription) {
         DefaultDevice device = devices.getUnchecked(deviceId).orNull();
         if (device == null) {
             return createDevice(providerId, deviceId, deviceDescription);
@@ -223,7 +192,7 @@
 
             // For now claim the device as a master automatically.
             rawRoles.put(deviceIdBytes, serialize(MastershipRole.MASTER));
-            roles.put(deviceId,  Optional.of(MastershipRole.MASTER));
+            roles.put(deviceId, Optional.of(MastershipRole.MASTER));
         }
         return new DeviceEvent(DeviceEvent.Type.DEVICE_ADDED, device, null);
     }
@@ -233,7 +202,7 @@
                                      DeviceDescription desc) {
         // We allow only certain attributes to trigger update
         if (!Objects.equals(device.hwVersion(), desc.hwVersion()) ||
-            !Objects.equals(device.swVersion(), desc.swVersion())) {
+                !Objects.equals(device.swVersion(), desc.swVersion())) {
 
             DefaultDevice updated = new DefaultDevice(providerId, device.id(),
                                                       desc.type(),
@@ -268,7 +237,7 @@
 
     @Override
     public List<DeviceEvent> updatePorts(DeviceId deviceId,
-                                  List<PortDescription> portDescriptions) {
+                                         List<PortDescription> portDescriptions) {
         List<DeviceEvent> events = new ArrayList<>();
         synchronized (this) {
             Device device = devices.getUnchecked(deviceId).orNull();
@@ -366,7 +335,7 @@
 
     @Override
     public DeviceEvent updatePortStatus(DeviceId deviceId,
-                                 PortDescription portDescription) {
+                                        PortDescription portDescription) {
         synchronized (this) {
             Device device = devices.getUnchecked(deviceId).orNull();
             checkArgument(device != null, DEVICE_NOT_FOUND, deviceId);
@@ -428,16 +397,12 @@
     }
 
     // TODO cache serialized DeviceID if we suffer from serialization cost
-
-    private static byte[] serialize(final Object obj) {
-        return POOL.serialize(obj);
+    private byte[] serialize(final Object obj) {
+        return storeService.serialize(obj);
     }
 
-    private static <T> T deserialize(final byte[] bytes) {
-        if (bytes == null) {
-            return null;
-        }
-        return POOL.deserialize(bytes);
+    private <T> T deserialize(final byte[] bytes) {
+        return storeService.deserialize(bytes);
     }
 
     /**
@@ -446,7 +411,7 @@
      * @param <K> IMap key type after deserialization
      * @param <V> IMap value type after deserialization
      */
-    public static final class RemoteEventHandler<K, V> extends
+    public final class RemoteEventHandler<K, V> extends
             EntryAdapter<byte[], byte[]> {
 
         private LoadingCache<K, Optional<V>> cache;
@@ -468,14 +433,13 @@
 
         @Override
         public void entryUpdated(EntryEvent<byte[], byte[]> event) {
-            cache.put(POOL.<K>deserialize(event.getKey()),
-                        Optional.of(POOL.<V>deserialize(
-                                        event.getValue())));
+            cache.put(storeService.<K>deserialize(event.getKey()),
+                      Optional.of(storeService.<V>deserialize(event.getValue())));
         }
 
         @Override
         public void entryRemoved(EntryEvent<byte[], byte[]> event) {
-            cache.invalidate(POOL.<DeviceId>deserialize(event.getKey()));
+            cache.invalidate(storeService.<DeviceId>deserialize(event.getKey()));
         }
 
         @Override
@@ -491,7 +455,7 @@
      * @param <K> IMap key type after deserialization
      * @param <V> IMap value type after deserialization
      */
-    public static final class OptionalCacheLoader<K, V> extends
+    public final class OptionalCacheLoader<K, V> extends
             CacheLoader<K, Optional<V>> {
 
         private IMap<byte[], byte[]> rawMap;
@@ -507,7 +471,7 @@
 
         @Override
         public Optional<V> load(K key) throws Exception {
-            byte[] keyBytes = serialize(key);
+            byte[] keyBytes = storeService.serialize(key);
             byte[] valBytes = rawMap.get(keyBytes);
             if (valBytes == null) {
                 return Optional.absent();
diff --git a/core/store/src/main/java/org/onlab/onos/store/device/impl/AbsentInvalidatingLoadingCache.java b/core/store/src/main/java/org/onlab/onos/store/impl/AbsentInvalidatingLoadingCache.java
similarity index 97%
rename from core/store/src/main/java/org/onlab/onos/store/device/impl/AbsentInvalidatingLoadingCache.java
rename to core/store/src/main/java/org/onlab/onos/store/impl/AbsentInvalidatingLoadingCache.java
index df88c31..1834a50 100644
--- a/core/store/src/main/java/org/onlab/onos/store/device/impl/AbsentInvalidatingLoadingCache.java
+++ b/core/store/src/main/java/org/onlab/onos/store/impl/AbsentInvalidatingLoadingCache.java
@@ -1,4 +1,4 @@
-package org.onlab.onos.store.device.impl;
+package org.onlab.onos.store.impl;
 
 import java.util.concurrent.Callable;
 import java.util.concurrent.ExecutionException;
diff --git a/core/store/src/main/java/org/onlab/onos/store/impl/StoreManager.java b/core/store/src/main/java/org/onlab/onos/store/impl/StoreManager.java
index c638177..2725175 100644
--- a/core/store/src/main/java/org/onlab/onos/store/impl/StoreManager.java
+++ b/core/store/src/main/java/org/onlab/onos/store/impl/StoreManager.java
@@ -2,14 +2,33 @@
 
 import com.hazelcast.core.Hazelcast;
 import com.hazelcast.core.HazelcastInstance;
+import de.javakaffee.kryoserializers.URISerializer;
 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.Service;
+import org.onlab.onos.net.DefaultDevice;
+import org.onlab.onos.net.DefaultPort;
+import org.onlab.onos.net.Device;
+import org.onlab.onos.net.DeviceId;
+import org.onlab.onos.net.Element;
+import org.onlab.onos.net.MastershipRole;
+import org.onlab.onos.net.Port;
+import org.onlab.onos.net.PortNumber;
+import org.onlab.onos.net.provider.ProviderId;
 import org.onlab.onos.store.StoreService;
+import org.onlab.onos.store.serializers.DefaultPortSerializer;
+import org.onlab.onos.store.serializers.DeviceIdSerializer;
+import org.onlab.onos.store.serializers.PortNumberSerializer;
+import org.onlab.onos.store.serializers.ProviderIdSerializer;
+import org.onlab.util.KryoPool;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import java.net.URI;
+import java.util.ArrayList;
+import java.util.HashMap;
+
 /**
  * Auxiliary bootstrap of distributed store.
  */
@@ -20,15 +39,45 @@
     private final Logger log = LoggerFactory.getLogger(getClass());
 
     protected HazelcastInstance instance;
+    private KryoPool serializerPool;
+
 
     @Activate
     public void activate() {
         instance = Hazelcast.newHazelcastInstance();
+        setupKryoPool();
         log.info("Started");
     }
 
+    /**
+     * Sets up the common serialzers pool.
+     */
+    protected void setupKryoPool() {
+        // FIXME Slice out types used in common to separate pool/namespace.
+        serializerPool = KryoPool.newBuilder()
+                .register(
+                        ArrayList.class,
+                        HashMap.class,
+
+                        Device.Type.class,
+
+                        DefaultDevice.class,
+                        MastershipRole.class,
+                        Port.class,
+                        Element.class
+                )
+                .register(URI.class, new URISerializer())
+                .register(ProviderId.class, new ProviderIdSerializer())
+                .register(DeviceId.class, new DeviceIdSerializer())
+                .register(PortNumber.class, new PortNumberSerializer())
+                .register(DefaultPort.class, new DefaultPortSerializer())
+                .build()
+                .populate(10);
+    }
+
     @Deactivate
     public void deactivate() {
+        instance.shutdown();
         log.info("Stopped");
     }
 
@@ -36,4 +85,19 @@
     public HazelcastInstance getHazelcastInstance() {
         return instance;
     }
+
+
+    @Override
+    public byte[] serialize(final Object obj) {
+        return serializerPool.serialize(obj);
+    }
+
+    @Override
+    public <T> T deserialize(final byte[] bytes) {
+        if (bytes == null) {
+            return null;
+        }
+        return serializerPool.deserialize(bytes);
+    }
+
 }
diff --git a/core/store/src/main/java/org/onlab/onos/store/serializers/DefaultPortSerializer.java b/core/store/src/main/java/org/onlab/onos/store/serializers/DefaultPortSerializer.java
new file mode 100644
index 0000000..836adea
--- /dev/null
+++ b/core/store/src/main/java/org/onlab/onos/store/serializers/DefaultPortSerializer.java
@@ -0,0 +1,43 @@
+package org.onlab.onos.store.serializers;
+
+import org.onlab.onos.net.DefaultPort;
+import org.onlab.onos.net.Element;
+import org.onlab.onos.net.PortNumber;
+
+import com.esotericsoftware.kryo.Kryo;
+import com.esotericsoftware.kryo.Serializer;
+import com.esotericsoftware.kryo.io.Input;
+import com.esotericsoftware.kryo.io.Output;
+
+// TODO move to util, etc.
+/**
+ * Kryo Serializer for {@link DefaultPort}.
+ */
+public final class DefaultPortSerializer extends
+        Serializer<DefaultPort> {
+
+    /**
+     * Default constructor.
+     */
+    public DefaultPortSerializer() {
+        // non-null, immutable
+        super(false, true);
+    }
+
+    @Override
+    public void write(Kryo kryo, Output output, DefaultPort object) {
+        kryo.writeClassAndObject(output, object.element());
+        kryo.writeObject(output, object.number());
+        output.writeBoolean(object.isEnabled());
+    }
+
+    @Override
+    public DefaultPort read(Kryo kryo, Input input,
+            Class<DefaultPort> type) {
+        Element element = (Element) kryo.readClassAndObject(input);
+        PortNumber number = kryo.readObject(input, PortNumber.class);
+        boolean isEnabled = input.readBoolean();
+
+        return new DefaultPort(element, number, isEnabled);
+    }
+}
diff --git a/core/store/src/main/java/org/onlab/onos/store/device/impl/DeviceIdSerializer.java b/core/store/src/main/java/org/onlab/onos/store/serializers/DeviceIdSerializer.java
similarity index 94%
rename from core/store/src/main/java/org/onlab/onos/store/device/impl/DeviceIdSerializer.java
rename to core/store/src/main/java/org/onlab/onos/store/serializers/DeviceIdSerializer.java
index 73d1d0b..709dce0 100644
--- a/core/store/src/main/java/org/onlab/onos/store/device/impl/DeviceIdSerializer.java
+++ b/core/store/src/main/java/org/onlab/onos/store/serializers/DeviceIdSerializer.java
@@ -1,4 +1,4 @@
-package org.onlab.onos.store.device.impl;
+package org.onlab.onos.store.serializers;
 
 import java.net.URI;
 
diff --git a/core/store/src/main/java/org/onlab/onos/store/device/impl/IpPrefixSerializer.java b/core/store/src/main/java/org/onlab/onos/store/serializers/IpPrefixSerializer.java
similarity index 95%
rename from core/store/src/main/java/org/onlab/onos/store/device/impl/IpPrefixSerializer.java
rename to core/store/src/main/java/org/onlab/onos/store/serializers/IpPrefixSerializer.java
index d6296a3..8ac6679 100644
--- a/core/store/src/main/java/org/onlab/onos/store/device/impl/IpPrefixSerializer.java
+++ b/core/store/src/main/java/org/onlab/onos/store/serializers/IpPrefixSerializer.java
@@ -1,4 +1,4 @@
-package org.onlab.onos.store.device.impl;
+package org.onlab.onos.store.serializers;
 
 import org.onlab.packet.IpPrefix;
 
diff --git a/core/store/src/main/java/org/onlab/onos/store/device/impl/PortNumberSerializer.java b/core/store/src/main/java/org/onlab/onos/store/serializers/PortNumberSerializer.java
similarity index 94%
rename from core/store/src/main/java/org/onlab/onos/store/device/impl/PortNumberSerializer.java
rename to core/store/src/main/java/org/onlab/onos/store/serializers/PortNumberSerializer.java
index ae11867..e89c379 100644
--- a/core/store/src/main/java/org/onlab/onos/store/device/impl/PortNumberSerializer.java
+++ b/core/store/src/main/java/org/onlab/onos/store/serializers/PortNumberSerializer.java
@@ -1,4 +1,4 @@
-package org.onlab.onos.store.device.impl;
+package org.onlab.onos.store.serializers;
 
 import org.onlab.onos.net.PortNumber;
 
diff --git a/core/store/src/main/java/org/onlab/onos/store/device/impl/ProviderIdSerializer.java b/core/store/src/main/java/org/onlab/onos/store/serializers/ProviderIdSerializer.java
similarity index 95%
rename from core/store/src/main/java/org/onlab/onos/store/device/impl/ProviderIdSerializer.java
rename to core/store/src/main/java/org/onlab/onos/store/serializers/ProviderIdSerializer.java
index 82b7a70..3abb784 100644
--- a/core/store/src/main/java/org/onlab/onos/store/device/impl/ProviderIdSerializer.java
+++ b/core/store/src/main/java/org/onlab/onos/store/serializers/ProviderIdSerializer.java
@@ -1,4 +1,4 @@
-package org.onlab.onos.store.device.impl;
+package org.onlab.onos.store.serializers;
 
 import org.onlab.onos.net.provider.ProviderId;
 
diff --git a/core/store/src/main/java/org/onlab/onos/store/serializers/package-info.java b/core/store/src/main/java/org/onlab/onos/store/serializers/package-info.java
new file mode 100644
index 0000000..55f9fcf
--- /dev/null
+++ b/core/store/src/main/java/org/onlab/onos/store/serializers/package-info.java
@@ -0,0 +1,4 @@
+/**
+ * Various Kryo serializers for use in distributed stores.
+ */
+package org.onlab.onos.store.serializers;
\ No newline at end of file
diff --git a/core/trivial/src/main/java/org/onlab/onos/net/trivial/impl/SimpleHostStore.java b/core/trivial/src/main/java/org/onlab/onos/net/trivial/impl/SimpleHostStore.java
index 4a4d6d3..6568d43 100644
--- a/core/trivial/src/main/java/org/onlab/onos/net/trivial/impl/SimpleHostStore.java
+++ b/core/trivial/src/main/java/org/onlab/onos/net/trivial/impl/SimpleHostStore.java
@@ -24,15 +24,16 @@
 import org.onlab.onos.net.host.HostDescription;
 import org.onlab.onos.net.host.HostEvent;
 import org.onlab.onos.net.host.HostStore;
+import org.onlab.onos.net.host.PortAddresses;
 import org.onlab.onos.net.provider.ProviderId;
 import org.onlab.packet.IpPrefix;
 import org.onlab.packet.MacAddress;
 import org.onlab.packet.VlanId;
+import org.slf4j.Logger;
 
 import com.google.common.collect.HashMultimap;
 import com.google.common.collect.ImmutableSet;
 import com.google.common.collect.Multimap;
-import org.slf4j.Logger;
 
 /**
  * Manages inventory of end-station hosts using trivial in-memory
@@ -50,6 +51,9 @@
     // Hosts tracked by their location
     private final Multimap<ConnectPoint, Host> locations = HashMultimap.create();
 
+    private final Map<ConnectPoint, PortAddresses> portAddresses =
+            new ConcurrentHashMap<>();
+
     @Activate
     public void activate() {
         log.info("Started");
@@ -192,4 +196,24 @@
         return hostset;
     }
 
+    @Override
+    public void updateAddressBindings(PortAddresses addresses) {
+        portAddresses.put(addresses.connectPoint(), addresses);
+    }
+
+    @Override
+    public void removeAddressBindings(ConnectPoint connectPoint) {
+        portAddresses.remove(connectPoint);
+    }
+
+    @Override
+    public Set<PortAddresses> getAddressBindings() {
+        return new HashSet<>(portAddresses.values());
+    }
+
+    @Override
+    public PortAddresses getAddressBindingsForPort(ConnectPoint connectPoint) {
+        return portAddresses.get(connectPoint);
+    }
+
 }
diff --git a/pom.xml b/pom.xml
index 21a8aef..dcd2a6b 100644
--- a/pom.xml
+++ b/pom.xml
@@ -172,6 +172,11 @@
             </dependency>
             <dependency>
                 <groupId>org.onlab.onos</groupId>
+                <artifactId>onlab-osgi</artifactId>
+                <version>${project.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.onlab.onos</groupId>
                 <artifactId>onlab-junit</artifactId>
                 <version>1.0.0-SNAPSHOT</version>
                 <scope>test</scope>
diff --git a/tools/dev/bash_profile b/tools/dev/bash_profile
index 8304bb2..94bb578 100644
--- a/tools/dev/bash_profile
+++ b/tools/dev/bash_profile
@@ -46,7 +46,8 @@
 # Test related conveniences
 
 # SSH to a specified ONOS instance
-alias sshctl=onos-ssh
+alias sshctl='onos-ssh'
+alias sshnet='onos-ssh $OCN'
 
 # Applies the settings in the specified cell file or lists current cell definition
 # if no cell file is given.
@@ -62,6 +63,7 @@
         env | egrep "ONOS_CELL"
         env | egrep "OCI"
         env | egrep "OC[0-9]+" | sort
+        env | egrep "OCN"
     fi
 }
 
diff --git a/tools/test/bin/onos-verify-cell b/tools/test/bin/onos-verify-cell
index 8e7fe99..9a5f5a9 100755
--- a/tools/test/bin/onos-verify-cell
+++ b/tools/test/bin/onos-verify-cell
@@ -6,6 +6,6 @@
 [ ! -d "$ONOS_ROOT" ] && echo "ONOS_ROOT is not defined" >&2 && exit 1
 . $ONOS_ROOT/tools/build/envDefaults
 
-for node in $(env | sort | egrep "OC[0-9]+" | cut -d= -f2); do
+for node in $(env | sort | egrep "OC[0-9N]+" | cut -d= -f2); do
     printf "%s: " $node; ssh -n -o PasswordAuthentication=no $ONOS_USER@$node date
 done
\ No newline at end of file
diff --git a/tools/test/cells/local b/tools/test/cells/local
index 37911dd..3d71a1e 100644
--- a/tools/test/cells/local
+++ b/tools/test/cells/local
@@ -1,7 +1,8 @@
-# Default virtual box ONOS instances 1,2 & 3
+# Default virtual box ONOS instances 1,2 & ONOS mininet box
 
 export OC1="192.168.56.101"
 export OC2="192.168.56.102"
-export OC3="192.168.56.103"
+
+export OCN="192.168.56.103"
 
 
diff --git a/utils/osgi/src/main/java/org/onlab/osgi/DefaultServiceDirectory.java b/utils/osgi/src/main/java/org/onlab/osgi/DefaultServiceDirectory.java
index b53b5fa..d483991 100644
--- a/utils/osgi/src/main/java/org/onlab/osgi/DefaultServiceDirectory.java
+++ b/utils/osgi/src/main/java/org/onlab/osgi/DefaultServiceDirectory.java
@@ -7,8 +7,15 @@
  * Default implementation of the service directory using OSGi framework utilities.
  */
 public class DefaultServiceDirectory implements ServiceDirectory {
-    @Override
-    public <T> T get(Class<T> serviceClass) {
+
+    /**
+     * Returns the reference to the implementation of the specified service.
+     *
+     * @param serviceClass service class
+     * @param <T>          type of service
+     * @return service implementation
+     */
+    public static <T> T getService(Class<T> serviceClass) {
         BundleContext bc = FrameworkUtil.getBundle(serviceClass).getBundleContext();
         T impl = bc.getService(bc.getServiceReference(serviceClass));
         if (impl == null) {
@@ -16,4 +23,10 @@
         }
         return impl;
     }
+
+    @Override
+    public <T> T get(Class<T> serviceClass) {
+        return getService(serviceClass);
+    }
+
 }
