diff --git a/core/api/src/main/java/org/onlab/onos/net/DefaultHost.java b/core/api/src/main/java/org/onlab/onos/net/DefaultHost.java
index f1ec27e..ed26e14 100644
--- a/core/api/src/main/java/org/onlab/onos/net/DefaultHost.java
+++ b/core/api/src/main/java/org/onlab/onos/net/DefaultHost.java
@@ -8,27 +8,27 @@
 import java.util.Set;
 
 import org.onlab.onos.net.provider.ProviderId;
-import org.onlab.packet.IPAddress;
-import org.onlab.packet.MACAddress;
-import org.onlab.packet.VLANID;
+import org.onlab.packet.IpAddress;
+import org.onlab.packet.MacAddress;
+import org.onlab.packet.VlanId;
 
 /**
  * A basic implementation of a Host.
  */
 public class DefaultHost extends AbstractElement implements Host {
 
-    private final MACAddress mac;
-    private final VLANID vlan;
+    private final MacAddress mac;
+    private final VlanId vlan;
     private final HostLocation location;
-    private final Set<IPAddress> ips;
+    private final Set<IpAddress> ips;
 
-    public DefaultHost(ProviderId providerId, HostId id, MACAddress mac,
-            VLANID vlan, HostLocation loc, Set<IPAddress> ips) {
+    public DefaultHost(ProviderId providerId, HostId id, MacAddress mac,
+            VlanId vlan, HostLocation loc, Set<IpAddress> ips) {
         super(providerId, id);
         this.mac = mac;
         this.vlan = vlan;
         this.location = loc;
-        this.ips = new HashSet<IPAddress>(ips);
+        this.ips = new HashSet<IpAddress>(ips);
     }
 
     @Override
@@ -37,12 +37,12 @@
     }
 
     @Override
-    public MACAddress mac() {
+    public MacAddress mac() {
         return mac;
     }
 
     @Override
-    public Set<IPAddress> ipAddresses() {
+    public Set<IpAddress> ipAddresses() {
         return Collections.unmodifiableSet(ips);
     }
 
@@ -52,7 +52,7 @@
     }
 
     @Override
-    public VLANID vlan() {
+    public VlanId vlan() {
         return vlan;
     }
 
diff --git a/core/api/src/main/java/org/onlab/onos/net/Host.java b/core/api/src/main/java/org/onlab/onos/net/Host.java
index b56c2f9..9d08591 100644
--- a/core/api/src/main/java/org/onlab/onos/net/Host.java
+++ b/core/api/src/main/java/org/onlab/onos/net/Host.java
@@ -1,8 +1,8 @@
 package org.onlab.onos.net;
 
-import org.onlab.packet.IPAddress;
-import org.onlab.packet.MACAddress;
-import org.onlab.packet.VLANID;
+import org.onlab.packet.IpAddress;
+import org.onlab.packet.MacAddress;
+import org.onlab.packet.VlanId;
 
 import java.util.Set;
 
@@ -24,21 +24,21 @@
      *
      * @return mac address
      */
-    MACAddress mac();
+    MacAddress mac();
 
     /**
      * Returns the VLAN ID tied to this host.
      *
      * @return VLAN ID value
      */
-    VLANID vlan();
+    VlanId vlan();
 
     /**
      * Returns set of IP addresses currently bound to the host MAC address.
      *
      * @return set of IP addresses; empty if no IP address is bound
      */
-    Set<IPAddress> ipAddresses();
+    Set<IpAddress> ipAddresses();
 
     /**
      * Returns the most recent host location where the host attaches to the
diff --git a/core/api/src/main/java/org/onlab/onos/net/HostId.java b/core/api/src/main/java/org/onlab/onos/net/HostId.java
index c6ba53f..1768f24 100644
--- a/core/api/src/main/java/org/onlab/onos/net/HostId.java
+++ b/core/api/src/main/java/org/onlab/onos/net/HostId.java
@@ -1,7 +1,7 @@
 package org.onlab.onos.net;
 
-import org.onlab.packet.MACAddress;
-import org.onlab.packet.VLANID;
+import org.onlab.packet.MacAddress;
+import org.onlab.packet.VlanId;
 
 import java.net.URI;
 
@@ -42,7 +42,7 @@
      * @param vlanId vlan identifier
      * @return host identifier
      */
-    public static HostId hostId(MACAddress mac, VLANID vlanId) {
+    public static HostId hostId(MacAddress mac, VlanId vlanId) {
         // FIXME: use more efficient means of encoding
         return hostId("nic" + ":" + mac + "-" + vlanId);
     }
@@ -53,8 +53,8 @@
      * @param mac mac address
      * @return host identifier
      */
-    public static HostId hostId(MACAddress mac) {
-        return hostId(mac, VLANID.vlanId(VLANID.UNTAGGED));
+    public static HostId hostId(MacAddress mac) {
+        return hostId(mac, VlanId.vlanId(VlanId.UNTAGGED));
     }
 
 }
diff --git a/core/api/src/main/java/org/onlab/onos/net/flow/criteria/Criteria.java b/core/api/src/main/java/org/onlab/onos/net/flow/criteria/Criteria.java
index 41fcd74..9cae5f9 100644
--- a/core/api/src/main/java/org/onlab/onos/net/flow/criteria/Criteria.java
+++ b/core/api/src/main/java/org/onlab/onos/net/flow/criteria/Criteria.java
@@ -2,9 +2,9 @@
 
 import org.onlab.onos.net.PortNumber;
 import org.onlab.onos.net.flow.criteria.Criterion.Type;
-import org.onlab.packet.IPAddress;
-import org.onlab.packet.MACAddress;
-import org.onlab.packet.VLANID;
+import org.onlab.packet.IpAddress;
+import org.onlab.packet.MacAddress;
+import org.onlab.packet.VlanId;
 
 /**
  * Factory class to create various traffic selection criteria.
@@ -34,7 +34,7 @@
      * @param macValue MAC address value or wildcard mask
      * @return match criterion
      */
-    public static Criterion matchEthSrc(MACAddress mac) {
+    public static Criterion matchEthSrc(MacAddress mac) {
         return new EthCriterion(mac, Type.ETH_SRC);
     }
 
@@ -45,7 +45,7 @@
      * @param macValue MAC address value or wildcard mask
      * @return match criterion
      */
-    public static Criterion matchEthDst(MACAddress mac) {
+    public static Criterion matchEthDst(MacAddress mac) {
         return new EthCriterion(mac, Type.ETH_DST);
     }
 
@@ -65,7 +65,7 @@
      * @param vlanId vlan id value
      * @return match criterion
      */
-    public static Criterion matchVlanId(VLANID vlanId) {
+    public static Criterion matchVlanId(VlanId vlanId) {
         return new VlanIdCriterion(vlanId);
     }
 
@@ -95,7 +95,7 @@
      * @param ip ip src value
      * @return match criterion
      */
-    public static Criterion matchIPSrc(IPAddress ip) {
+    public static Criterion matchIPSrc(IpAddress ip) {
         return new IPCriterion(ip, Type.IPV4_SRC);
     }
 
@@ -105,7 +105,7 @@
      * @param ip ip src value
      * @return match criterion
      */
-    public static Criterion matchIPDst(IPAddress ip) {
+    public static Criterion matchIPDst(IpAddress ip) {
         return new IPCriterion(ip, Type.IPV4_DST);
     }
 
@@ -133,10 +133,10 @@
 
 
     public static final class EthCriterion implements Criterion {
-        private final MACAddress mac;
+        private final MacAddress mac;
         private final Type type;
 
-        public EthCriterion(MACAddress mac, Type type) {
+        public EthCriterion(MacAddress mac, Type type) {
             this.mac = mac;
             this.type = type;
         }
@@ -146,7 +146,7 @@
             return this.type;
         }
 
-        public MACAddress mac() {
+        public MacAddress mac() {
             return this.mac;
         }
     }
@@ -173,10 +173,10 @@
 
     public static final class IPCriterion implements Criterion {
 
-        private final IPAddress ip;
+        private final IpAddress ip;
         private final Type type;
 
-        public IPCriterion(IPAddress ip, Type type) {
+        public IPCriterion(IpAddress ip, Type type) {
             this.ip = ip;
             this.type = type;
         }
@@ -186,7 +186,7 @@
             return this.type;
         }
 
-        public IPAddress ip() {
+        public IpAddress ip() {
             return this.ip;
         }
 
@@ -237,9 +237,9 @@
     public static final class VlanIdCriterion implements Criterion {
 
 
-        private final VLANID vlanId;
+        private final VlanId vlanId;
 
-        public VlanIdCriterion(VLANID vlanId) {
+        public VlanIdCriterion(VlanId vlanId) {
             this.vlanId = vlanId;
         }
 
@@ -248,7 +248,7 @@
             return Type.VLAN_VID;
         }
 
-        public VLANID vlanId() {
+        public VlanId vlanId() {
             return vlanId;
         }
 
diff --git a/core/api/src/main/java/org/onlab/onos/net/flow/instructions/Instructions.java b/core/api/src/main/java/org/onlab/onos/net/flow/instructions/Instructions.java
index 894942c..439db77 100644
--- a/core/api/src/main/java/org/onlab/onos/net/flow/instructions/Instructions.java
+++ b/core/api/src/main/java/org/onlab/onos/net/flow/instructions/Instructions.java
@@ -7,9 +7,10 @@
 import org.onlab.onos.net.flow.instructions.L2ModificationInstruction.ModEtherInstruction;
 import org.onlab.onos.net.flow.instructions.L3ModificationInstruction.L3SubType;
 import org.onlab.onos.net.flow.instructions.L3ModificationInstruction.ModIPInstruction;
-import org.onlab.packet.IPAddress;
-import org.onlab.packet.MACAddress;
-import org.onlab.packet.VLANID;
+import org.onlab.packet.IpAddress;
+import org.onlab.packet.MacAddress;
+import org.onlab.packet.VlanId;
+
 /**
  * Factory class for creating various traffic treatment instructions.
  */
@@ -44,7 +45,7 @@
      * @param addr the mac address to modify to.
      * @return a l2 modification
      */
-    public static L2ModificationInstruction modL2Src(MACAddress addr) {
+    public static L2ModificationInstruction modL2Src(MacAddress addr) {
         checkNotNull(addr, "Src l2 address cannot be null");
         return new ModEtherInstruction(L2SubType.L2_SRC, addr);
     }
@@ -54,7 +55,7 @@
      * @param addr the mac address to modify to.
      * @return a L2 modification
      */
-    public static L2ModificationInstruction modL2Dst(MACAddress addr) {
+    public static L2ModificationInstruction modL2Dst(MacAddress addr) {
         checkNotNull(addr, "Dst l2 address cannot be null");
         return new L2ModificationInstruction.ModEtherInstruction(L2SubType.L2_DST, addr);
     }
@@ -64,7 +65,7 @@
      * @param vlanId the vlan id to modify to.
      * @return a L2 modification
      */
-    public static L2ModificationInstruction modVlanId(VLANID vlanId) {
+    public static L2ModificationInstruction modVlanId(VlanId vlanId) {
         checkNotNull(vlanId, "VLAN id cannot be null");
         return new L2ModificationInstruction.ModVlanIdInstruction(vlanId);
     }
@@ -84,7 +85,7 @@
      * @param addr the ip address to modify to.
      * @return a L3 modification
      */
-    public static L3ModificationInstruction modL3Src(IPAddress addr) {
+    public static L3ModificationInstruction modL3Src(IpAddress addr) {
         checkNotNull(addr, "Src l3 address cannot be null");
         return new ModIPInstruction(L3SubType.L3_SRC, addr);
     }
@@ -94,7 +95,7 @@
      * @param addr the ip address to modify to.
      * @return a L3 modification
      */
-    public static L3ModificationInstruction modL3Dst(IPAddress addr) {
+    public static L3ModificationInstruction modL3Dst(IpAddress addr) {
         checkNotNull(addr, "Dst l3 address cannot be null");
         return new ModIPInstruction(L3SubType.L3_DST, addr);
     }
diff --git a/core/api/src/main/java/org/onlab/onos/net/flow/instructions/L2ModificationInstruction.java b/core/api/src/main/java/org/onlab/onos/net/flow/instructions/L2ModificationInstruction.java
index 9019efb..78eaaa9 100644
--- a/core/api/src/main/java/org/onlab/onos/net/flow/instructions/L2ModificationInstruction.java
+++ b/core/api/src/main/java/org/onlab/onos/net/flow/instructions/L2ModificationInstruction.java
@@ -1,7 +1,7 @@
 package org.onlab.onos.net.flow.instructions;
 
-import org.onlab.packet.MACAddress;
-import org.onlab.packet.VLANID;
+import org.onlab.packet.MacAddress;
+import org.onlab.packet.VlanId;
 
 /**
  * Abstraction of a single traffic treatment step.
@@ -50,9 +50,10 @@
     public static final class ModEtherInstruction extends L2ModificationInstruction {
 
         private final L2SubType subtype;
-        private final MACAddress mac;
+        private final MacAddress mac;
 
-        public ModEtherInstruction(L2SubType subType, MACAddress addr) {
+        public ModEtherInstruction(L2SubType subType, MacAddress addr) {
+
             this.subtype = subType;
             this.mac = addr;
         }
@@ -62,7 +63,7 @@
             return this.subtype;
         }
 
-        public MACAddress mac() {
+        public MacAddress mac() {
             return this.mac;
         }
 
@@ -73,9 +74,9 @@
      */
     public static final class ModVlanIdInstruction extends L2ModificationInstruction {
 
-        public final VLANID vlanId;
+        public final VlanId vlanId;
 
-        public ModVlanIdInstruction(VLANID vlanId) {
+        public ModVlanIdInstruction(VlanId vlanId) {
             this.vlanId = vlanId;
         }
 
@@ -84,7 +85,7 @@
             return L2SubType.VLAN_ID;
         }
 
-        public VLANID vlanId() {
+        public VlanId vlanId() {
             return this.vlanId;
         }
 
diff --git a/core/api/src/main/java/org/onlab/onos/net/flow/instructions/L3ModificationInstruction.java b/core/api/src/main/java/org/onlab/onos/net/flow/instructions/L3ModificationInstruction.java
index c5cb7a6..cf25f10 100644
--- a/core/api/src/main/java/org/onlab/onos/net/flow/instructions/L3ModificationInstruction.java
+++ b/core/api/src/main/java/org/onlab/onos/net/flow/instructions/L3ModificationInstruction.java
@@ -1,6 +1,6 @@
 package org.onlab.onos.net.flow.instructions;
 
-import org.onlab.packet.IPAddress;
+import org.onlab.packet.IpAddress;
 
 /**
  * Abstraction of a single traffic treatment step.
@@ -42,9 +42,10 @@
     public static final class ModIPInstruction extends L3ModificationInstruction {
 
         private final L3SubType subtype;
-        private final IPAddress ip;
+        private final IpAddress ip;
 
-        public ModIPInstruction(L3SubType subType, IPAddress addr) {
+        public ModIPInstruction(L3SubType subType, IpAddress addr) {
+
             this.subtype = subType;
             this.ip = addr;
         }
@@ -54,7 +55,7 @@
             return this.subtype;
         }
 
-        public IPAddress ip() {
+        public IpAddress ip() {
             return this.ip;
         }
 
diff --git a/core/api/src/main/java/org/onlab/onos/net/host/DefaultHostDescription.java b/core/api/src/main/java/org/onlab/onos/net/host/DefaultHostDescription.java
index a06a92e..68795bd 100644
--- a/core/api/src/main/java/org/onlab/onos/net/host/DefaultHostDescription.java
+++ b/core/api/src/main/java/org/onlab/onos/net/host/DefaultHostDescription.java
@@ -6,42 +6,42 @@
 import java.util.Set;
 
 import org.onlab.onos.net.HostLocation;
-import org.onlab.packet.IPAddress;
-import org.onlab.packet.MACAddress;
-import org.onlab.packet.VLANID;
+import org.onlab.packet.IpAddress;
+import org.onlab.packet.MacAddress;
+import org.onlab.packet.VlanId;
 
 import com.google.common.collect.ImmutableSet;
 
 public class DefaultHostDescription implements HostDescription {
 
-    private final MACAddress mac;
-    private final VLANID vlan;
+    private final MacAddress mac;
+    private final VlanId vlan;
     private final HostLocation location;
-    private final Set<IPAddress> ips;
+    private final Set<IpAddress> ips;
 
-    public DefaultHostDescription(MACAddress mac, VLANID vlan,
+    public DefaultHostDescription(MacAddress mac, VlanId vlan,
             HostLocation loc) {
         this.mac = mac;
         this.vlan = vlan;
         this.location = loc;
-        this.ips = new HashSet<IPAddress>();
+        this.ips = new HashSet<IpAddress>();
     }
 
-    public DefaultHostDescription(MACAddress mac, VLANID vlan,
-            HostLocation loc, Set<IPAddress> ips) {
+    public DefaultHostDescription(MacAddress mac, VlanId vlan,
+            HostLocation loc, Set<IpAddress> ips) {
         this.mac = mac;
         this.vlan = vlan;
         this.location = loc;
-        this.ips = new HashSet<IPAddress>(ips);
+        this.ips = new HashSet<IpAddress>(ips);
     }
 
     @Override
-    public MACAddress hwAddress() {
+    public MacAddress hwAddress() {
         return mac;
     }
 
     @Override
-    public VLANID vlan() {
+    public VlanId vlan() {
         return vlan;
     }
 
@@ -51,7 +51,7 @@
     }
 
     @Override
-    public Set<IPAddress> ipAddresses() {
+    public Set<IpAddress> ipAddresses() {
         return ImmutableSet.copyOf(ips);
     }
 
diff --git a/core/api/src/main/java/org/onlab/onos/net/host/HostDescription.java b/core/api/src/main/java/org/onlab/onos/net/host/HostDescription.java
index 313a403..5917bef 100644
--- a/core/api/src/main/java/org/onlab/onos/net/host/HostDescription.java
+++ b/core/api/src/main/java/org/onlab/onos/net/host/HostDescription.java
@@ -4,9 +4,9 @@
 
 import org.onlab.onos.net.Description;
 import org.onlab.onos.net.HostLocation;
-import org.onlab.packet.IPAddress;
-import org.onlab.packet.MACAddress;
-import org.onlab.packet.VLANID;
+import org.onlab.packet.IpAddress;
+import org.onlab.packet.MacAddress;
+import org.onlab.packet.VlanId;
 
 /**
  * Information describing host and its location.
@@ -18,14 +18,14 @@
      *
      * @return the MAC address of this host
      */
-    MACAddress hwAddress();
+    MacAddress hwAddress();
 
     /**
      * Returns the VLAN associated with this host.
      *
      * @return the VLAN ID value
      */
-    VLANID vlan();
+    VlanId vlan();
 
     /**
      * Returns the location of the host on the network edge.
@@ -39,6 +39,6 @@
      *
      * @return a set of IP addresses.
      */
-    Set<IPAddress> ipAddresses();
+    Set<IpAddress> ipAddresses();
 
 }
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 1a94471..357fb61 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
@@ -4,9 +4,9 @@
 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.MACAddress;
-import org.onlab.packet.VLANID;
+import org.onlab.packet.IpAddress;
+import org.onlab.packet.MacAddress;
+import org.onlab.packet.VlanId;
 
 import java.util.Set;
 
@@ -44,7 +44,7 @@
      * @return set of hosts in the given vlan id
      */
     // FIXME: change long to VLanId
-    Set<Host> getHostsByVlan(VLANID vlanId);
+    Set<Host> getHostsByVlan(VlanId vlanId);
 
     /**
      * Returns the set of hosts that have the specified MAC address.
@@ -52,7 +52,7 @@
      * @param mac mac address
      * @return set of hosts with the given mac
      */
-    Set<Host> getHostsByMac(MACAddress mac);
+    Set<Host> getHostsByMac(MacAddress mac);
 
     /**
      * Returns the set of hosts that have the specified IP address.
@@ -60,7 +60,7 @@
      * @param ip ip address
      * @return set of hosts with the given IP
      */
-    Set<Host> getHostsByIp(IPAddress ip);
+    Set<Host> getHostsByIp(IpAddress ip);
 
     /**
      * Returns the set of hosts whose most recent location is the specified
diff --git a/core/api/src/main/java/org/onlab/onos/net/path/PathService.java b/core/api/src/main/java/org/onlab/onos/net/topology/PathService.java
similarity index 92%
rename from core/api/src/main/java/org/onlab/onos/net/path/PathService.java
rename to core/api/src/main/java/org/onlab/onos/net/topology/PathService.java
index efbd484..f1b4542 100644
--- a/core/api/src/main/java/org/onlab/onos/net/path/PathService.java
+++ b/core/api/src/main/java/org/onlab/onos/net/topology/PathService.java
@@ -1,8 +1,7 @@
-package org.onlab.onos.net.path;
+package org.onlab.onos.net.topology;
 
 import org.onlab.onos.net.ElementId;
 import org.onlab.onos.net.Path;
-import org.onlab.onos.net.topology.LinkWeight;
 
 import java.util.Set;
 
diff --git a/core/api/src/test/java/org/onlab/onos/net/HostIdTest.java b/core/api/src/test/java/org/onlab/onos/net/HostIdTest.java
index d79f616..712f6b2 100644
--- a/core/api/src/test/java/org/onlab/onos/net/HostIdTest.java
+++ b/core/api/src/test/java/org/onlab/onos/net/HostIdTest.java
@@ -3,8 +3,8 @@
 import com.google.common.testing.EqualsTester;
 
 import org.junit.Test;
-import org.onlab.packet.MACAddress;
-import org.onlab.packet.VLANID;
+import org.onlab.packet.MacAddress;
+import org.onlab.packet.VlanId;
 
 import static org.onlab.onos.net.HostId.hostId;
 
@@ -13,10 +13,10 @@
  */
 public class HostIdTest extends ElementIdTest {
 
-    private static final MACAddress MAC1 = MACAddress.valueOf("00:11:00:00:00:01");
-    private static final MACAddress MAC2 = MACAddress.valueOf("00:22:00:00:00:02");
-    private static final VLANID VLAN1 = VLANID.vlanId((short) 11);
-    private static final VLANID VLAN2 = VLANID.vlanId((short) 22);
+    private static final MacAddress MAC1 = MacAddress.valueOf("00:11:00:00:00:01");
+    private static final MacAddress MAC2 = MacAddress.valueOf("00:22:00:00:00:02");
+    private static final VlanId VLAN1 = VlanId.vlanId((short) 11);
+    private static final VlanId VLAN2 = VlanId.vlanId((short) 22);
 
     @Override
     @Test
diff --git a/core/api/src/test/java/org/onlab/onos/net/TestDeviceParams.java b/core/api/src/test/java/org/onlab/onos/net/TestDeviceParams.java
index 930cb3b..afaf23e 100644
--- a/core/api/src/test/java/org/onlab/onos/net/TestDeviceParams.java
+++ b/core/api/src/test/java/org/onlab/onos/net/TestDeviceParams.java
@@ -5,9 +5,9 @@
 import java.util.Set;
 
 import org.onlab.onos.net.provider.ProviderId;
-import org.onlab.packet.IPAddress;
-import org.onlab.packet.MACAddress;
-import org.onlab.packet.VLANID;
+import org.onlab.packet.IpAddress;
+import org.onlab.packet.MacAddress;
+import org.onlab.packet.VlanId;
 
 import com.google.common.collect.Sets;
 
@@ -20,13 +20,13 @@
     protected static final ProviderId PID = new ProviderId("foo");
     protected static final DeviceId DID1 = deviceId("of:foo");
     protected static final DeviceId DID2 = deviceId("of:bar");
-    protected static final MACAddress MAC1 = MACAddress.valueOf("00:11:00:00:00:01");
-    protected static final MACAddress MAC2 = MACAddress.valueOf("00:22:00:00:00:02");
-    protected static final VLANID VLAN1 = VLANID.vlanId((short) 11);
-    protected static final VLANID VLAN2 = VLANID.vlanId((short) 22);
-    protected static final IPAddress IP1 = IPAddress.valueOf("10.0.0.1");
-    protected static final IPAddress IP2 = IPAddress.valueOf("10.0.0.2");
-    protected static final IPAddress IP3 = IPAddress.valueOf("10.0.0.3");
+    protected static final MacAddress MAC1 = MacAddress.valueOf("00:11:00:00:00:01");
+    protected static final MacAddress MAC2 = MacAddress.valueOf("00:22:00:00:00:02");
+    protected static final VlanId VLAN1 = VlanId.vlanId((short) 11);
+    protected static final VlanId VLAN2 = VlanId.vlanId((short) 22);
+    protected static final IpAddress IP1 = IpAddress.valueOf("10.0.0.1");
+    protected static final IpAddress IP2 = IpAddress.valueOf("10.0.0.2");
+    protected static final IpAddress IP3 = IpAddress.valueOf("10.0.0.3");
 
     protected static final PortNumber P1 = PortNumber.portNumber(100);
     protected static final PortNumber P2 = PortNumber.portNumber(200);
@@ -34,7 +34,7 @@
     protected static final HostId HID2 = HostId.hostId(MAC2, VLAN2);
     protected static final HostLocation LOC1 = new HostLocation(DID1, P1, 123L);
     protected static final HostLocation LOC2 = new HostLocation(DID2, P2, 123L);
-    protected static final Set<IPAddress> IPSET1 = Sets.newHashSet(IP1, IP2);
-    protected static final Set<IPAddress> IPSET2 = Sets.newHashSet(IP1, IP3);
+    protected static final Set<IpAddress> IPSET1 = Sets.newHashSet(IP1, IP2);
+    protected static final Set<IpAddress> IPSET2 = Sets.newHashSet(IP1, IP3);
 
 }
diff --git a/core/api/src/test/java/org/onlab/onos/net/host/DefualtHostDecriptionTest.java b/core/api/src/test/java/org/onlab/onos/net/host/DefualtHostDecriptionTest.java
index 5ef9bf8..6ce39f5 100644
--- a/core/api/src/test/java/org/onlab/onos/net/host/DefualtHostDecriptionTest.java
+++ b/core/api/src/test/java/org/onlab/onos/net/host/DefualtHostDecriptionTest.java
@@ -9,9 +9,9 @@
 import org.onlab.onos.net.DeviceId;
 import org.onlab.onos.net.HostLocation;
 import org.onlab.onos.net.PortNumber;
-import org.onlab.packet.IPAddress;
-import org.onlab.packet.MACAddress;
-import org.onlab.packet.VLANID;
+import org.onlab.packet.IpAddress;
+import org.onlab.packet.MacAddress;
+import org.onlab.packet.VlanId;
 
 import com.google.common.collect.Sets;
 
@@ -20,16 +20,16 @@
  */
 public class DefualtHostDecriptionTest {
 
-    private static final MACAddress MAC = MACAddress.valueOf("00:00:11:00:00:01");
-    private static final VLANID VLAN = VLANID.vlanId((short) 10);
+    private static final MacAddress MAC = MacAddress.valueOf("00:00:11:00:00:01");
+    private static final VlanId VLAN = VlanId.vlanId((short) 10);
     private static final HostLocation LOC = new HostLocation(
                 DeviceId.deviceId("of:foo"),
                 PortNumber.portNumber(100),
                 123L
             );
-    private static final Set<IPAddress> IPS = Sets.newHashSet(
-                IPAddress.valueOf("10.0.0.1"),
-                IPAddress.valueOf("10.0.0.2")
+    private static final Set<IpAddress> IPS = Sets.newHashSet(
+                IpAddress.valueOf("10.0.0.1"),
+                IpAddress.valueOf("10.0.0.2")
             );
 
     @Test
diff --git a/core/api/src/test/java/org/onlab/onos/net/host/HostEventTest.java b/core/api/src/test/java/org/onlab/onos/net/host/HostEventTest.java
index 633928e..a0d6848 100644
--- a/core/api/src/test/java/org/onlab/onos/net/host/HostEventTest.java
+++ b/core/api/src/test/java/org/onlab/onos/net/host/HostEventTest.java
@@ -11,25 +11,25 @@
 import org.onlab.onos.net.HostLocation;
 import org.onlab.onos.net.PortNumber;
 import org.onlab.onos.net.provider.ProviderId;
-import org.onlab.packet.IPAddress;
-import org.onlab.packet.MACAddress;
-import org.onlab.packet.VLANID;
+import org.onlab.packet.IpAddress;
+import org.onlab.packet.MacAddress;
+import org.onlab.packet.VlanId;
 
 import com.google.common.collect.Sets;
 
 public class HostEventTest extends AbstractEventTest {
 
     private Host createHost() {
-        MACAddress mac = MACAddress.valueOf("00:00:11:00:00:01");
-        VLANID vlan = VLANID.vlanId((short) 10);
+        MacAddress mac = MacAddress.valueOf("00:00:11:00:00:01");
+        VlanId vlan = VlanId.vlanId((short) 10);
         HostLocation loc = new HostLocation(
                     DeviceId.deviceId("of:foo"),
                     PortNumber.portNumber(100),
                     123L
                 );
-        Set<IPAddress> ipset = Sets.newHashSet(
-                    IPAddress.valueOf("10.0.0.1"),
-                    IPAddress.valueOf("10.0.0.2")
+        Set<IpAddress> ipset = Sets.newHashSet(
+                    IpAddress.valueOf("10.0.0.1"),
+                    IpAddress.valueOf("10.0.0.2")
                 );
         HostId hid = HostId.hostId(mac, vlan);
 
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 54a630e..a8ec8bd 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
@@ -4,9 +4,9 @@
 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.MACAddress;
-import org.onlab.packet.VLANID;
+import org.onlab.packet.IpAddress;
+import org.onlab.packet.MacAddress;
+import org.onlab.packet.VlanId;
 
 import java.util.Set;
 
@@ -30,17 +30,17 @@
     }
 
     @Override
-    public Set<Host> getHostsByVlan(VLANID vlanId) {
+    public Set<Host> getHostsByVlan(VlanId vlanId) {
         return null;
     }
 
     @Override
-    public Set<Host> getHostsByMac(MACAddress mac) {
+    public Set<Host> getHostsByMac(MacAddress mac) {
         return null;
     }
 
     @Override
-    public Set<Host> getHostsByIp(IPAddress ip) {
+    public Set<Host> getHostsByIp(IpAddress ip) {
         return null;
     }
 
diff --git a/core/api/src/test/java/org/onlab/onos/net/topology/ClusterIdTest.java b/core/api/src/test/java/org/onlab/onos/net/topology/ClusterIdTest.java
new file mode 100644
index 0000000..39dc6a5
--- /dev/null
+++ b/core/api/src/test/java/org/onlab/onos/net/topology/ClusterIdTest.java
@@ -0,0 +1,26 @@
+package org.onlab.onos.net.topology;
+
+import com.google.common.testing.EqualsTester;
+import org.junit.Test;
+
+import static org.junit.Assert.*;
+import static org.onlab.onos.net.topology.ClusterId.clusterId;
+
+/**
+ * Test of the cluster ID.
+ */
+public class ClusterIdTest {
+
+    @Test
+    public void testEquals() {
+        new EqualsTester()
+                .addEqualityGroup(clusterId(1), clusterId(1))
+                .addEqualityGroup(clusterId(3), clusterId(3)).testEquals();
+    }
+
+    @Test
+    public void basics() {
+        assertEquals("incorrect index", 123, clusterId(123).index());
+    }
+
+}
\ No newline at end of file
diff --git a/core/api/src/test/java/org/onlab/onos/net/topology/DefaultTopologyClusterTest.java b/core/api/src/test/java/org/onlab/onos/net/topology/DefaultTopologyClusterTest.java
new file mode 100644
index 0000000..f4c5df6
--- /dev/null
+++ b/core/api/src/test/java/org/onlab/onos/net/topology/DefaultTopologyClusterTest.java
@@ -0,0 +1,38 @@
+package org.onlab.onos.net.topology;
+
+import com.google.common.testing.EqualsTester;
+import org.junit.Test;
+
+import static org.junit.Assert.assertEquals;
+import static org.onlab.onos.net.DeviceId.deviceId;
+import static org.onlab.onos.net.topology.ClusterId.clusterId;
+
+/**
+ * Test of the default topology cluster implementation.
+ */
+public class DefaultTopologyClusterTest {
+
+    @Test
+    public void testEquals() {
+        new EqualsTester()
+                .addEqualityGroup(cluster(3, 2, 1, "of:1"), cluster(3, 2, 1, "of:1"))
+                .addEqualityGroup(cluster(3, 2, 1, "of:2"), cluster(3, 2, 1, "of:2"))
+                .addEqualityGroup(cluster(0, 2, 1, "of:1"), cluster(0, 2, 1, "of:1"))
+                .addEqualityGroup(cluster(3, 3, 1, "of:1"), cluster(3, 3, 1, "of:1"))
+                .testEquals();
+    }
+
+    @Test
+    public void basics() {
+        TopologyCluster cluster = cluster(6, 5, 4, "of:111");
+        assertEquals("incorrect id", clusterId(6), cluster.id());
+        assertEquals("incorrect id", 5, cluster.deviceCount());
+        assertEquals("incorrect id", 4, cluster.linkCount());
+        assertEquals("incorrect id", deviceId("of:111"), cluster.root());
+
+    }
+
+    private TopologyCluster cluster(int id, int dc, int lc, String root) {
+        return new DefaultTopologyCluster(clusterId(id), dc, lc, deviceId(root));
+    }
+}
\ No newline at end of file
