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 e5d641f..09829fe 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,23 +8,26 @@
 import java.util.Set;
 
 import org.onlab.onos.net.provider.ProviderId;
-import org.onlab.packet.IPv4;
+import org.onlab.packet.IPAddress;
 import org.onlab.packet.MACAddress;
 
+/**
+ * A basic implementation of a Host.
+ */
 public class DefaultHost extends AbstractElement implements Host {
 
     private final MACAddress mac;
     private final short vlan;
     private final HostLocation location;
-    private final Set<IPv4> ips;
+    private final Set<IPAddress> ips;
 
     public DefaultHost(ProviderId providerId, ElementId id, MACAddress mac,
-            short vlan, HostLocation loc, Set<IPv4> ips) {
+            short vlan, HostLocation loc, Set<IPAddress> ips) {
         super(providerId, id);
         this.mac = mac;
         this.vlan = vlan;
         this.location = loc;
-        this.ips = new HashSet<IPv4>(ips);
+        this.ips = new HashSet<IPAddress>(ips);
     }
 
     @Override
@@ -38,7 +41,7 @@
     }
 
     @Override
-    public Set<IPv4> ipAddresses() {
+    public Set<IPAddress> ipAddresses() {
         return Collections.unmodifiableSet(ips);
     }
 
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 667bb88..55c13cd 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,6 +1,6 @@
 package org.onlab.onos.net;
 
-import org.onlab.packet.IPv4;
+import org.onlab.packet.IPAddress;
 import org.onlab.packet.MACAddress;
 
 import java.util.Set;
@@ -15,6 +15,7 @@
      *
      * @return host id
      */
+    @Override
     HostId id();
 
     /**
@@ -36,7 +37,7 @@
      *
      * @return set of IP addresses; empty if no IP address is bound
      */
-    Set<IPv4> 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/host/DefaultHostDescription.java b/core/api/src/main/java/org/onlab/onos/net/host/DefaultHostDescription.java
index c3653e6..2acdc75 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,7 +6,7 @@
 import java.util.Set;
 
 import org.onlab.onos.net.HostLocation;
-import org.onlab.packet.IPv4;
+import org.onlab.packet.IPAddress;
 import org.onlab.packet.MACAddress;
 
 import com.google.common.collect.ImmutableSet;
@@ -16,14 +16,14 @@
     private final MACAddress mac;
     private final short vlan;
     private final HostLocation location;
-    private final Set<IPv4> ips;
+    private final Set<IPAddress> ips;
 
     public DefaultHostDescription(MACAddress mac, short vlan,
-            HostLocation loc, Set<IPv4> ips) {
+            HostLocation loc, Set<IPAddress> ips) {
         this.mac = mac;
         this.vlan = vlan;
         this.location = loc;
-        this.ips = new HashSet<IPv4>(ips);
+        this.ips = new HashSet<IPAddress>(ips);
     }
 
     @Override
@@ -42,7 +42,7 @@
     }
 
     @Override
-    public Set<IPv4> 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 62a4c9a..6b0831c 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,7 +4,7 @@
 
 import org.onlab.onos.net.Description;
 import org.onlab.onos.net.HostLocation;
-import org.onlab.packet.IPv4;
+import org.onlab.packet.IPAddress;
 import org.onlab.packet.MACAddress;
 
 /**
@@ -38,6 +38,6 @@
      *
      * @return a set of IP addresses.
      */
-    Set<IPv4> 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 9ffa58a..b4f5b1f 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,7 +4,7 @@
 import org.onlab.onos.net.DeviceId;
 import org.onlab.onos.net.Host;
 import org.onlab.onos.net.HostId;
-import org.onlab.packet.IPv4;
+import org.onlab.packet.IPAddress;
 import org.onlab.packet.MACAddress;
 
 import java.util.Set;
@@ -59,7 +59,7 @@
      * @param ip ip address
      * @return set of hosts with the given IP
      */
-    Set<Host> getHostsByIp(IPv4 ip);
+    Set<Host> getHostsByIp(IPAddress ip);
 
     /**
      * Returns the set of hosts whose most recent location is the specified
diff --git a/core/trivial/src/main/java/org/onlab/onos/net/trivial/impl/SimpleHostManager.java b/core/trivial/src/main/java/org/onlab/onos/net/trivial/impl/SimpleHostManager.java
index 3152209..6f0b39e 100644
--- a/core/trivial/src/main/java/org/onlab/onos/net/trivial/impl/SimpleHostManager.java
+++ b/core/trivial/src/main/java/org/onlab/onos/net/trivial/impl/SimpleHostManager.java
@@ -21,7 +21,7 @@
 import org.onlab.onos.net.host.HostService;
 import org.onlab.onos.net.provider.AbstractProviderRegistry;
 import org.onlab.onos.net.provider.AbstractProviderService;
-import org.onlab.packet.IPv4;
+import org.onlab.packet.IPAddress;
 import org.onlab.packet.MACAddress;
 import org.slf4j.Logger;
 
@@ -96,7 +96,7 @@
     }
 
     @Override
-    public Set<Host> getHostsByIp(IPv4 ip) {
+    public Set<Host> getHostsByIp(IPAddress ip) {
         checkNotNull(ip, "IP address cannot be null");
         return store.getHosts(ip);
     }
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 11499eb..e142de7 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
@@ -8,7 +8,7 @@
 import org.onlab.onos.net.host.HostDescription;
 import org.onlab.onos.net.host.HostEvent;
 import org.onlab.onos.net.provider.ProviderId;
-import org.onlab.packet.IPv4;
+import org.onlab.packet.IPAddress;
 import org.onlab.packet.MACAddress;
 
 import com.google.common.collect.HashMultimap;
@@ -62,7 +62,7 @@
                 descr.vlan(),
                 descr.location(),
                 descr.ipAddresses());
-        synchronized(this) {
+        synchronized (this) {
             hosts.put(hostId, newhost);
             locations.put(descr.location(), newhost);
         }
@@ -104,7 +104,7 @@
      * @return remove even or null if host was not found
      */
     HostEvent removeHost(HostId hostId) {
-        synchronized(this) {
+        synchronized (this) {
             Host host = hosts.remove(hostId);
             if (host != null) {
                 locations.remove((host.location()), host);
@@ -180,7 +180,7 @@
      * @param ip ip address
      * @return set of hosts with the given IP
      */
-    Set<Host> getHosts(IPv4 ip) {
+    Set<Host> getHosts(IPAddress ip) {
         Set<Host> ipset = new HashSet<>();
         for (Host h : hosts.values()) {
             if (h.ipAddresses().contains(ip)) {
@@ -216,4 +216,4 @@
         return hostset;
     }
 
-}
\ No newline at end of file
+}
