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
index 31e2e76..7d22877 100644
--- 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
@@ -1,6 +1,8 @@
 package org.onlab.onos.net.host;
 
+import java.util.Collections;
 import java.util.HashSet;
+import java.util.Objects;
 import java.util.Set;
 
 import org.onlab.onos.net.ConnectPoint;
@@ -29,7 +31,7 @@
     public PortAddresses(ConnectPoint connectPoint,
             Set<IpPrefix> ips, MacAddress mac) {
         this.connectPoint = connectPoint;
-        this.ipAddresses = (ips == null) ? null : new HashSet<>(ips);
+        this.ipAddresses = (ips == null) ? Collections.<IpPrefix>emptySet() : new HashSet<>(ips);
         this.macAddress = mac;
     }
 
@@ -60,4 +62,25 @@
         return macAddress;
     }
 
+    @Override
+    public boolean equals(Object other) {
+        if (this == other) {
+            return true;
+        }
+
+        if (!(other instanceof PortAddresses)) {
+            return false;
+        }
+
+        PortAddresses otherPa = (PortAddresses) other;
+
+        return Objects.equals(this.connectPoint, otherPa.connectPoint)
+                && Objects.equals(this.ipAddresses, otherPa.ipAddresses)
+                && Objects.equals(this.macAddress, otherPa.macAddress);
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(connectPoint, ipAddresses, macAddress);
+    }
 }
diff --git a/core/net/src/test/java/org/onlab/onos/net/host/impl/HostManagerTest.java b/core/net/src/test/java/org/onlab/onos/net/host/impl/HostManagerTest.java
index 661d2b5..49ac5b8 100644
--- a/core/net/src/test/java/org/onlab/onos/net/host/impl/HostManagerTest.java
+++ b/core/net/src/test/java/org/onlab/onos/net/host/impl/HostManagerTest.java
@@ -2,9 +2,13 @@
 
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertNull;
 import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertNull;
 import static org.junit.Assert.assertTrue;
+import static org.onlab.onos.net.host.HostEvent.Type.HOST_ADDED;
+import static org.onlab.onos.net.host.HostEvent.Type.HOST_MOVED;
+import static org.onlab.onos.net.host.HostEvent.Type.HOST_REMOVED;
+import static org.onlab.onos.net.host.HostEvent.Type.HOST_UPDATED;
 
 import java.util.List;
 import java.util.Set;
@@ -14,6 +18,7 @@
 import org.junit.Test;
 import org.onlab.onos.event.Event;
 import org.onlab.onos.event.impl.TestEventDispatcher;
+import org.onlab.onos.net.ConnectPoint;
 import org.onlab.onos.net.DeviceId;
 import org.onlab.onos.net.Host;
 import org.onlab.onos.net.HostId;
@@ -26,6 +31,7 @@
 import org.onlab.onos.net.host.HostProvider;
 import org.onlab.onos.net.host.HostProviderRegistry;
 import org.onlab.onos.net.host.HostProviderService;
+import org.onlab.onos.net.host.PortAddresses;
 import org.onlab.onos.net.provider.AbstractProvider;
 import org.onlab.onos.net.provider.ProviderId;
 import org.onlab.onos.net.trivial.impl.SimpleHostStore;
@@ -36,8 +42,6 @@
 import com.google.common.collect.Lists;
 import com.google.common.collect.Sets;
 
-import static org.onlab.onos.net.host.HostEvent.Type.*;
-
 /**
  * Test codifying the host service & host provider service contracts.
  */
@@ -63,6 +67,12 @@
     private static final PortNumber P2 = PortNumber.portNumber(200);
     private static final HostLocation LOC1 = new HostLocation(DID1, P1, 123L);
     private static final HostLocation LOC2 = new HostLocation(DID1, P2, 123L);
+    private static final ConnectPoint CP1 = new ConnectPoint(DID1, P1);
+    private static final ConnectPoint CP2 = new ConnectPoint(DID2, P2);
+
+    private static final IpPrefix PREFIX1 = IpPrefix.valueOf("10.0.1.0/24");
+    private static final IpPrefix PREFIX2 = IpPrefix.valueOf("10.1.0.0/16");
+    private static final IpPrefix PREFIX3 = IpPrefix.valueOf("5.8.2.0/23");
 
     private HostManager mgr;
 
@@ -196,4 +206,130 @@
         }
 
     }
+
+    @Test
+    public void bindAddressesToPort() {
+        PortAddresses add1 = new PortAddresses(CP1,
+                Sets.newHashSet(PREFIX1, PREFIX2), MAC1);
+
+        mgr.bindAddressesToPort(add1);
+        PortAddresses storedAddresses = mgr.getAddressBindingsForPort(CP1);
+
+        assertTrue(add1.ips().equals(storedAddresses.ips()));
+        assertTrue(add1.mac().equals(storedAddresses.mac()));
+
+        // Add some more addresses and check that they're added correctly
+        PortAddresses add2 = new PortAddresses(CP1, Sets.newHashSet(PREFIX3), null);
+
+        mgr.bindAddressesToPort(add2);
+        storedAddresses = mgr.getAddressBindingsForPort(CP1);
+
+        assertTrue(storedAddresses.ips().equals(
+                Sets.newHashSet(PREFIX1, PREFIX2, PREFIX3)));
+        assertTrue(storedAddresses.mac().equals(MAC1));
+
+        PortAddresses add3 = new PortAddresses(CP1, null, MAC2);
+
+        mgr.bindAddressesToPort(add3);
+        storedAddresses = mgr.getAddressBindingsForPort(CP1);
+
+        assertTrue(storedAddresses.ips().equals(
+                Sets.newHashSet(PREFIX1, PREFIX2, PREFIX3)));
+        assertTrue(storedAddresses.mac().equals(MAC2));
+    }
+
+    @Test
+    public void unbindAddressesFromPort() {
+        PortAddresses add1 = new PortAddresses(CP1,
+                Sets.newHashSet(PREFIX1, PREFIX2), MAC1);
+
+        mgr.bindAddressesToPort(add1);
+        PortAddresses storedAddresses = mgr.getAddressBindingsForPort(CP1);
+
+        assertTrue(storedAddresses.ips().size() == 2);
+        assertNotNull(storedAddresses.mac());
+
+        PortAddresses rem1 = new PortAddresses(CP1,
+                Sets.newHashSet(PREFIX1), null);
+
+        mgr.unbindAddressesFromPort(rem1);
+        storedAddresses = mgr.getAddressBindingsForPort(CP1);
+
+        assertTrue(storedAddresses.ips().equals(Sets.newHashSet(PREFIX2)));
+        assertTrue(storedAddresses.mac().equals(MAC1));
+
+        PortAddresses rem2 = new PortAddresses(CP1, null, MAC1);
+
+        mgr.unbindAddressesFromPort(rem2);
+        storedAddresses = mgr.getAddressBindingsForPort(CP1);
+
+        assertTrue(storedAddresses.ips().equals(Sets.newHashSet(PREFIX2)));
+        assertNull(storedAddresses.mac());
+
+        PortAddresses rem3 = new PortAddresses(CP1,
+                Sets.newHashSet(PREFIX2), MAC1);
+
+        mgr.unbindAddressesFromPort(rem3);
+        storedAddresses = mgr.getAddressBindingsForPort(CP1);
+
+        assertTrue(storedAddresses.ips().isEmpty());
+        assertNull(storedAddresses.mac());
+    }
+
+    @Test
+    public void clearAddresses() {
+        PortAddresses add1 = new PortAddresses(CP1,
+                Sets.newHashSet(PREFIX1, PREFIX2), MAC1);
+
+        mgr.bindAddressesToPort(add1);
+        PortAddresses storedAddresses = mgr.getAddressBindingsForPort(CP1);
+
+        assertTrue(storedAddresses.ips().size() == 2);
+        assertNotNull(storedAddresses.mac());
+
+        mgr.clearAddresses(CP1);
+        storedAddresses = mgr.getAddressBindingsForPort(CP1);
+
+        assertTrue(storedAddresses.ips().isEmpty());
+        assertNull(storedAddresses.mac());
+    }
+
+    @Test
+    public void getAddressBindingsForPort() {
+        PortAddresses add1 = new PortAddresses(CP1,
+                Sets.newHashSet(PREFIX1, PREFIX2), MAC1);
+
+        mgr.bindAddressesToPort(add1);
+        PortAddresses storedAddresses = mgr.getAddressBindingsForPort(CP1);
+
+        assertTrue(storedAddresses.connectPoint().equals(CP1));
+        assertTrue(storedAddresses.ips().equals(Sets.newHashSet(PREFIX1, PREFIX2)));
+        assertTrue(storedAddresses.mac().equals(MAC1));
+    }
+
+    @Test
+    public void getAddressBindings() {
+        Set<PortAddresses> storedAddresses = mgr.getAddressBindings();
+
+        assertTrue(storedAddresses.isEmpty());
+
+        PortAddresses add1 = new PortAddresses(CP1,
+                Sets.newHashSet(PREFIX1, PREFIX2), MAC1);
+
+        mgr.bindAddressesToPort(add1);
+
+        storedAddresses = mgr.getAddressBindings();
+
+        assertTrue(storedAddresses.size() == 1);
+
+        PortAddresses add2 = new PortAddresses(CP2,
+                Sets.newHashSet(PREFIX3), MAC2);
+
+        mgr.bindAddressesToPort(add2);
+
+        storedAddresses = mgr.getAddressBindings();
+
+        assertTrue(storedAddresses.size() == 2);
+        assertTrue(storedAddresses.equals(Sets.newHashSet(add1, add2)));
+    }
 }
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 be609a8..94a3f05 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
@@ -36,6 +36,7 @@
 import com.google.common.collect.HashMultimap;
 import com.google.common.collect.ImmutableSet;
 import com.google.common.collect.Multimap;
+import com.google.common.collect.Sets;
 
 /**
  * Manages inventory of end-station hosts using trivial in-memory
@@ -202,29 +203,75 @@
 
     @Override
     public void updateAddressBindings(PortAddresses addresses) {
-        // TODO portAddresses.put(addresses.connectPoint(), addresses);
+        synchronized (portAddresses) {
+            PortAddresses existing = portAddresses.get(addresses.connectPoint());
+            if (existing == null) {
+                portAddresses.put(addresses.connectPoint(), addresses);
+            } else {
+                Set<IpPrefix> union = Sets.union(existing.ips(), addresses.ips())
+                        .immutableCopy();
+
+                MacAddress newMac = (addresses.mac() == null) ? existing.mac()
+                        : addresses.mac();
+
+                PortAddresses newAddresses =
+                        new PortAddresses(addresses.connectPoint(), union, newMac);
+
+                portAddresses.put(newAddresses.connectPoint(), newAddresses);
+            }
+        }
     }
 
     @Override
     public void removeAddressBindings(PortAddresses addresses) {
-        // TODO Auto-generated method stub
+        synchronized (portAddresses) {
+            PortAddresses existing = portAddresses.get(addresses.connectPoint());
+            if (existing != null) {
+                Set<IpPrefix> difference =
+                        Sets.difference(existing.ips(), addresses.ips()).immutableCopy();
 
+                // If they removed the existing mac, set the new mac to null.
+                // Otherwise, keep the existing mac.
+                MacAddress newMac = existing.mac();
+                if (addresses.mac() != null && addresses.mac().equals(existing.mac())) {
+                    newMac = null;
+                }
+
+                PortAddresses newAddresses =
+                        new PortAddresses(addresses.connectPoint(), difference, newMac);
+
+                portAddresses.put(newAddresses.connectPoint(), newAddresses);
+            }
+        }
     }
 
     @Override
     public void clearAddressBindings(ConnectPoint connectPoint) {
-        // TODO Auto-generated method stub
-
+        synchronized (portAddresses) {
+            portAddresses.remove(connectPoint);
+        }
     }
 
     @Override
     public Set<PortAddresses> getAddressBindings() {
-        return new HashSet<>(portAddresses.values());
+        synchronized (portAddresses) {
+            return new HashSet<>(portAddresses.values());
+        }
     }
 
     @Override
     public PortAddresses getAddressBindingsForPort(ConnectPoint connectPoint) {
-        return portAddresses.get(connectPoint);
+        PortAddresses addresses;
+
+        synchronized (portAddresses) {
+            addresses = portAddresses.get(connectPoint);
+        }
+
+        if (addresses == null) {
+            addresses = new PortAddresses(connectPoint, null, null);
+        }
+
+        return addresses;
     }
 
 }
