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 b6b38db..e5d641f 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
@@ -18,7 +18,7 @@
     private final HostLocation location;
     private final Set<IPv4> ips;
 
-    protected DefaultHost(ProviderId providerId, ElementId id, MACAddress mac,
+    public DefaultHost(ProviderId providerId, ElementId id, MACAddress mac,
             short vlan, HostLocation loc, Set<IPv4> ips) {
         super(providerId, id);
         this.mac = mac;
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 2129082..c3653e6 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
@@ -2,7 +2,6 @@
 
 import static com.google.common.base.MoreObjects.toStringHelper;
 
-import java.util.Collections;
 import java.util.HashSet;
 import java.util.Set;
 
@@ -10,6 +9,8 @@
 import org.onlab.packet.IPv4;
 import org.onlab.packet.MACAddress;
 
+import com.google.common.collect.ImmutableSet;
+
 public class DefaultHostDescription implements HostDescription {
 
     private final MACAddress mac;
@@ -42,7 +43,7 @@
 
     @Override
     public Set<IPv4> ipAddresses() {
-        return Collections.unmodifiableSet(ips);
+        return ImmutableSet.copyOf(ips);
     }
 
     @Override
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 127aad1..11499eb 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
@@ -1,6 +1,7 @@
 package org.onlab.onos.net.trivial.impl;
 
 import org.onlab.onos.net.ConnectPoint;
+import org.onlab.onos.net.DefaultHost;
 import org.onlab.onos.net.DeviceId;
 import org.onlab.onos.net.Host;
 import org.onlab.onos.net.HostId;
@@ -10,10 +11,21 @@
 import org.onlab.packet.IPv4;
 import org.onlab.packet.MACAddress;
 
+import com.google.common.collect.HashMultimap;
+import com.google.common.collect.ImmutableSet;
+import com.google.common.collect.Multimap;
+
+import java.util.Collections;
+import java.util.HashSet;
 import java.util.Map;
 import java.util.Set;
 import java.util.concurrent.ConcurrentHashMap;
 
+import static org.onlab.onos.net.host.HostEvent.Type.HOST_REMOVED;
+import static org.onlab.onos.net.host.HostEvent.Type.HOST_ADDED;
+import static org.onlab.onos.net.host.HostEvent.Type.HOST_UPDATED;
+import static org.onlab.onos.net.host.HostEvent.Type.HOST_MOVED;
+
 /**
  * Manages inventory of end-station hosts using trivial in-memory
  * implementation.
@@ -22,6 +34,8 @@
 
     private final Map<HostId, Host> hosts = new ConcurrentHashMap<>();
 
+    // hosts sorted based on their location
+    private final Multimap<ConnectPoint, Host> locations = HashMultimap.create();
     /**
      * Creates a new host or updates the existing one based on the specified
      * description.
@@ -33,7 +47,54 @@
      */
     HostEvent createOrUpdateHost(ProviderId providerId, HostId hostId,
                                  HostDescription hostDescription) {
-        return null;
+        Host host = hosts.get(hostId);
+        if (host == null) {
+            return createHost(providerId, hostId, hostDescription);
+        }
+        return updateHost(providerId, host, hostDescription);
+    }
+
+    // creates a new host and sends HOST_ADDED
+    private HostEvent createHost(ProviderId providerId, HostId hostId,
+            HostDescription descr) {
+        DefaultHost newhost = new DefaultHost(providerId, hostId,
+                descr.hwAddress(),
+                descr.vlan(),
+                descr.location(),
+                descr.ipAddresses());
+        synchronized(this) {
+            hosts.put(hostId, newhost);
+            locations.put(descr.location(), newhost);
+        }
+        return new HostEvent(HOST_ADDED, newhost);
+    }
+
+    // checks for type of update to host, sends appropriate event
+    private HostEvent updateHost(ProviderId providerId, Host host,
+            HostDescription descr) {
+        DefaultHost updated;
+        HostEvent event;
+        if (host.location().equals(descr.location())) {
+            updated = new DefaultHost(providerId, host.id(),
+                    host.mac(),
+                    host.vlan(),
+                    host.location(),
+                    descr.ipAddresses());
+            event = new HostEvent(HOST_UPDATED, updated);
+        } else {
+            updated = new DefaultHost(providerId, host.id(),
+                    host.mac(),
+                    host.vlan(),
+                    descr.location(),
+                    host.ipAddresses());
+            event = new HostEvent(HOST_MOVED, updated);
+        }
+        synchronized (this) {
+            hosts.put(host.id(), updated);
+            locations.remove(host.location(), host);
+            locations.put(updated.location(), updated);
+        }
+        return event;
     }
 
     /**
@@ -43,7 +104,14 @@
      * @return remove even or null if host was not found
      */
     HostEvent removeHost(HostId hostId) {
-        return null;
+        synchronized(this) {
+            Host host = hosts.remove(hostId);
+            if (host != null) {
+                locations.remove((host.location()), host);
+                return new HostEvent(HOST_REMOVED, host);
+            }
+            return null;
+        }
     }
 
     /**
@@ -61,7 +129,7 @@
      * @return iterable collection of all hosts
      */
     Iterable<Host> getHosts() {
-        return null;
+        return Collections.unmodifiableSet(new HashSet<Host>(hosts.values()));
     }
 
     /**
@@ -71,7 +139,7 @@
      * @return host or null if not found
      */
     Host getHost(HostId hostId) {
-        return null;
+        return hosts.get(hostId);
     }
 
     /**
@@ -81,7 +149,13 @@
      * @return set of hosts in the vlan
      */
     Set<Host> getHosts(long vlanId) {
-        return null;
+        Set<Host> vlanset = new HashSet<Host>();
+        for (Host h : hosts.values()) {
+            if (h.vlan() == vlanId) {
+                vlanset.add(h);
+            }
+        }
+        return vlanset;
     }
 
     /**
@@ -91,7 +165,13 @@
      * @return set of hosts with the given mac
      */
     Set<Host> getHosts(MACAddress mac) {
-        return null;
+        Set<Host> macset = new HashSet<>();
+        for (Host h : hosts.values()) {
+            if (h.mac().equals(mac)) {
+                macset.add(h);
+            }
+        }
+        return macset;
     }
 
     /**
@@ -101,7 +181,13 @@
      * @return set of hosts with the given IP
      */
     Set<Host> getHosts(IPv4 ip) {
-        return null;
+        Set<Host> ipset = new HashSet<>();
+        for (Host h : hosts.values()) {
+            if (h.ipAddresses().contains(ip)) {
+                ipset.add(h);
+            }
+        }
+        return ipset;
     }
 
     /**
@@ -111,7 +197,7 @@
      * @return set of hosts
      */
     Set<Host> getConnectedHosts(ConnectPoint connectPoint) {
-        return null;
+        return ImmutableSet.copyOf(locations.get(connectPoint));
     }
 
     /**
@@ -121,7 +207,13 @@
      * @return set of hosts
      */
     public Set<Host> getConnectedHosts(DeviceId deviceId) {
-        return null;
+        Set<Host> hostset = new HashSet<>();
+        for (ConnectPoint p : locations.keySet()) {
+            if (p.deviceId().equals(deviceId)) {
+                hostset.addAll(locations.get(p));
+            }
+        }
+        return hostset;
     }
 
-}
+}
\ No newline at end of file
