diff --git a/core/net/src/test/java/org/onosproject/net/host/impl/HostManagerTest.java b/core/net/src/test/java/org/onosproject/net/host/impl/HostManagerTest.java
index 2a461bf..1780cd4 100644
--- a/core/net/src/test/java/org/onosproject/net/host/impl/HostManagerTest.java
+++ b/core/net/src/test/java/org/onosproject/net/host/impl/HostManagerTest.java
@@ -70,11 +70,17 @@
     private static final VlanId VLAN2 = VlanId.vlanId((short) 2);
     private static final MacAddress MAC1 = MacAddress.valueOf("00:00:11:00:00:01");
     private static final MacAddress MAC2 = MacAddress.valueOf("00:00:22:00:00:02");
+    private static final MacAddress MAC3 = MacAddress.valueOf("00:00:33:00:00:03");
+    private static final MacAddress MAC4 = MacAddress.valueOf("00:00:44:00:00:04");
     private static final HostId HID1 = HostId.hostId(MAC1, VLAN1);
     private static final HostId HID2 = HostId.hostId(MAC2, VLAN1);
+    private static final HostId HID3 = HostId.hostId(MAC3, VLAN1);
+    private static final HostId HID4 = HostId.hostId(MAC4, VLAN1);
 
     private static final IpAddress IP1 = IpAddress.valueOf("10.0.0.1");
     private static final IpAddress IP2 = IpAddress.valueOf("10.0.0.2");
+    private static final IpAddress IP3 = IpAddress.valueOf("2001::1");
+    private static final IpAddress IP4 = IpAddress.valueOf("2001::2");
 
     private static final DeviceId DID1 = DeviceId.deviceId("of:001");
     private static final DeviceId DID2 = DeviceId.deviceId("of:002");
@@ -94,6 +100,15 @@
     private static final InterfaceIpAddress IA3 =
         new InterfaceIpAddress(IpAddress.valueOf("10.3.3.3"),
                                IpPrefix.valueOf("10.3.3.0/24"));
+    private static final InterfaceIpAddress IA4 =
+        new InterfaceIpAddress(IpAddress.valueOf("2001:100::1"),
+                               IpPrefix.valueOf("2001:100::/56"));
+    private static final InterfaceIpAddress IA5 =
+        new InterfaceIpAddress(IpAddress.valueOf("2001:200::1"),
+                               IpPrefix.valueOf("2001:200::/48"));
+    private static final InterfaceIpAddress IA6 =
+        new InterfaceIpAddress(IpAddress.valueOf("2001:300::1"),
+                               IpPrefix.valueOf("2001:300::/56"));
 
     private HostManager mgr;
 
@@ -169,6 +184,28 @@
     }
 
     @Test
+    public void hostDetectedIPv6() {
+        assertNull("host shouldn't be found", mgr.getHost(HID3));
+
+        // host addition
+        detect(HID3, MAC3, VLAN1, LOC1, IP3);
+        assertEquals("exactly one should be found", 1, mgr.getHostCount());
+        detect(HID4, MAC4, VLAN2, LOC2, IP3);
+        assertEquals("two hosts should be found", 2, mgr.getHostCount());
+        validateEvents(HOST_ADDED, HOST_ADDED);
+
+        // host motion
+        detect(HID3, MAC3, VLAN1, LOC2, IP3);
+        validateEvents(HOST_MOVED);
+        assertEquals("only two hosts should be found", 2, mgr.getHostCount());
+
+        // host update
+        detect(HID3, MAC3, VLAN1, LOC2, IP4);
+        validateEvents(HOST_UPDATED);
+        assertEquals("only two hosts should be found", 2, mgr.getHostCount());
+    }
+
+    @Test
     public void hostVanished() {
         detect(HID1, MAC1, VLAN1, LOC1, IP1);
         providerService.hostVanished(HID1);
@@ -177,6 +214,15 @@
         assertNull("host should have been removed", mgr.getHost(HID1));
     }
 
+    @Test
+    public void hostVanishedIPv6() {
+        detect(HID3, MAC3, VLAN1, LOC1, IP3);
+        providerService.hostVanished(HID3);
+        validateEvents(HOST_ADDED, HOST_REMOVED);
+
+        assertNull("host should have been removed", mgr.getHost(HID3));
+    }
+
     private void validateHosts(
             String msg, Iterable<Host> hosts, HostId... ids) {
         Set<HostId> hids = Sets.newHashSet(ids);
@@ -199,6 +245,19 @@
         assertTrue("incorrect host location", mgr.getConnectedHosts(DID2).isEmpty());
     }
 
+    @Test
+    public void getHostsIPv6() {
+        detect(HID3, MAC3, VLAN1, LOC1, IP3);
+        detect(HID4, MAC4, VLAN1, LOC2, IP4);
+
+        validateHosts("host not properly stored", mgr.getHosts(), HID3, HID4);
+        validateHosts("can't get hosts by VLAN", mgr.getHostsByVlan(VLAN1), HID3, HID4);
+        validateHosts("can't get hosts by MAC", mgr.getHostsByMac(MAC3), HID3);
+        validateHosts("can't get hosts by IP", mgr.getHostsByIp(IP3), HID3);
+        validateHosts("can't get hosts by location", mgr.getConnectedHosts(LOC1), HID3);
+        assertTrue("incorrect host location", mgr.getConnectedHosts(DID2).isEmpty());
+    }
+
     private static class TestHostProvider extends AbstractProvider
             implements HostProvider {
 
@@ -263,6 +322,40 @@
     }
 
     @Test
+    public void bindAddressesToPortIPv6() {
+        PortAddresses add1 =
+                new PortAddresses(CP1, Sets.newHashSet(IA4, IA5), MAC3, VlanId.NONE);
+
+        mgr.bindAddressesToPort(add1);
+        Set<PortAddresses> storedAddresses = mgr.getAddressBindingsForPort(CP1);
+
+        assertEquals(1, storedAddresses.size());
+        assertTrue(storedAddresses.contains(add1));
+
+        // Add some more addresses and check that they're added correctly
+        PortAddresses add2 =
+                new PortAddresses(CP1, Sets.newHashSet(IA6),  null,
+                        VlanId.vlanId((short) 2));
+
+        mgr.bindAddressesToPort(add2);
+        storedAddresses = mgr.getAddressBindingsForPort(CP1);
+
+        assertEquals(2, storedAddresses.size());
+        assertTrue(storedAddresses.contains(add1));
+        assertTrue(storedAddresses.contains(add2));
+
+        PortAddresses add3 = new PortAddresses(CP1, null, MAC4, VlanId.NONE);
+
+        mgr.bindAddressesToPort(add3);
+        storedAddresses = mgr.getAddressBindingsForPort(CP1);
+
+        assertEquals(3, storedAddresses.size());
+        assertTrue(storedAddresses.contains(add1));
+        assertTrue(storedAddresses.contains(add2));
+        assertTrue(storedAddresses.contains(add3));
+    }
+
+    @Test
     public void unbindAddressesFromPort() {
         PortAddresses add1 =
             new PortAddresses(CP1, Sets.newHashSet(IA1, IA2), MAC1, VlanId.NONE);
@@ -291,6 +384,34 @@
     }
 
     @Test
+    public void unbindAddressesFromPortIPv6() {
+        PortAddresses add1 =
+                new PortAddresses(CP1, Sets.newHashSet(IA4, IA5), MAC3, VlanId.NONE);
+
+        mgr.bindAddressesToPort(add1);
+        Set<PortAddresses> storedAddresses = mgr.getAddressBindingsForPort(CP1);
+
+        assertEquals(1, storedAddresses.size());
+        assertTrue(storedAddresses.contains(add1));
+
+        PortAddresses rem1 =
+                new PortAddresses(CP1, Sets.newHashSet(IA4), null, VlanId.NONE);
+
+        mgr.unbindAddressesFromPort(rem1);
+        storedAddresses = mgr.getAddressBindingsForPort(CP1);
+
+        // It shouldn't have been removed because it didn't match the originally
+        // submitted address object
+        assertEquals(1, storedAddresses.size());
+        assertTrue(storedAddresses.contains(add1));
+
+        mgr.unbindAddressesFromPort(add1);
+        storedAddresses = mgr.getAddressBindingsForPort(CP1);
+
+        assertTrue(storedAddresses.isEmpty());
+    }
+
+    @Test
     public void clearAddresses() {
         PortAddresses add1 =
             new PortAddresses(CP1, Sets.newHashSet(IA1, IA2), MAC1, VlanId.NONE);
@@ -308,6 +429,23 @@
     }
 
     @Test
+    public void clearAddressesIPv6() {
+        PortAddresses add1 =
+                new PortAddresses(CP1, Sets.newHashSet(IA4, IA5), MAC3, VlanId.NONE);
+
+        mgr.bindAddressesToPort(add1);
+        Set<PortAddresses> storedAddresses = mgr.getAddressBindingsForPort(CP1);
+
+        assertEquals(1, storedAddresses.size());
+        assertTrue(storedAddresses.contains(add1));
+
+        mgr.clearAddresses(CP1);
+        storedAddresses = mgr.getAddressBindingsForPort(CP1);
+
+        assertTrue(storedAddresses.isEmpty());
+    }
+
+    @Test
     public void getAddressBindingsForPort() {
         PortAddresses add1 =
             new PortAddresses(CP1, Sets.newHashSet(IA1, IA2), MAC1, VlanId.NONE);
@@ -320,6 +458,18 @@
     }
 
     @Test
+    public void getAddressBindingsForPortIPv6() {
+        PortAddresses add1 =
+                new PortAddresses(CP1, Sets.newHashSet(IA4, IA5), MAC3, VlanId.NONE);
+
+        mgr.bindAddressesToPort(add1);
+        Set<PortAddresses> storedAddresses = mgr.getAddressBindingsForPort(CP1);
+
+        assertEquals(1, storedAddresses.size());
+        assertTrue(storedAddresses.contains(add1));
+    }
+
+    @Test
     public void getAddressBindings() {
         Set<PortAddresses> storedAddresses = mgr.getAddressBindings();
 
@@ -344,4 +494,30 @@
         assertTrue(storedAddresses.size() == 2);
         assertTrue(storedAddresses.equals(Sets.newHashSet(add1, add2)));
     }
+
+    @Test
+    public void getAddressBindingsIPv6() {
+        Set<PortAddresses> storedAddresses = mgr.getAddressBindings();
+
+        assertTrue(storedAddresses.isEmpty());
+
+        PortAddresses add1 =
+                new PortAddresses(CP1, Sets.newHashSet(IA4, IA5), MAC3, VlanId.NONE);
+
+        mgr.bindAddressesToPort(add1);
+
+        storedAddresses = mgr.getAddressBindings();
+
+        assertTrue(storedAddresses.size() == 1);
+
+        PortAddresses add2 =
+                new PortAddresses(CP2, Sets.newHashSet(IA5), MAC4, VlanId.NONE);
+
+        mgr.bindAddressesToPort(add2);
+
+        storedAddresses = mgr.getAddressBindings();
+
+        assertTrue(storedAddresses.size() == 2);
+        assertTrue(storedAddresses.equals(Sets.newHashSet(add1, add2)));
+    }
 }
