diff --git a/core/net/src/main/java/org/onlab/onos/net/host/impl/SimpleHostManager.java b/core/net/src/main/java/org/onlab/onos/net/host/impl/SimpleHostManager.java
new file mode 100644
index 0000000..bc9312d
--- /dev/null
+++ b/core/net/src/main/java/org/onlab/onos/net/host/impl/SimpleHostManager.java
@@ -0,0 +1,190 @@
+package org.onlab.onos.net.host.impl;
+
+import static com.google.common.base.Preconditions.checkNotNull;
+import static org.slf4j.LoggerFactory.getLogger;
+
+import java.util.Set;
+
+import org.apache.felix.scr.annotations.Activate;
+import org.apache.felix.scr.annotations.Component;
+import org.apache.felix.scr.annotations.Deactivate;
+import org.apache.felix.scr.annotations.Reference;
+import org.apache.felix.scr.annotations.ReferenceCardinality;
+import org.apache.felix.scr.annotations.Service;
+import org.onlab.onos.event.AbstractListenerRegistry;
+import org.onlab.onos.event.EventDeliveryService;
+import org.onlab.onos.net.ConnectPoint;
+import org.onlab.onos.net.DeviceId;
+import org.onlab.onos.net.Host;
+import org.onlab.onos.net.HostId;
+import org.onlab.onos.net.host.HostAdminService;
+import org.onlab.onos.net.host.HostDescription;
+import org.onlab.onos.net.host.HostEvent;
+import org.onlab.onos.net.host.HostListener;
+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.HostService;
+import org.onlab.onos.net.host.HostStore;
+import org.onlab.onos.net.provider.AbstractProviderRegistry;
+import org.onlab.onos.net.provider.AbstractProviderService;
+import org.onlab.packet.IpPrefix;
+import org.onlab.packet.MacAddress;
+import org.onlab.packet.VlanId;
+import org.slf4j.Logger;
+
+/**
+ * Provides basic implementation of the host SB &amp; NB APIs.
+ */
+@Component(immediate = true)
+@Service
+public class SimpleHostManager
+        extends AbstractProviderRegistry<HostProvider, HostProviderService>
+        implements HostService, HostAdminService, HostProviderRegistry {
+
+    public static final String HOST_ID_NULL = "Host ID cannot be null";
+    private final Logger log = getLogger(getClass());
+
+    private final AbstractListenerRegistry<HostEvent, HostListener>
+            listenerRegistry = new AbstractListenerRegistry<>();
+
+    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    protected HostStore store;
+
+    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    protected EventDeliveryService eventDispatcher;
+
+
+    @Activate
+    public void activate() {
+        eventDispatcher.addSink(HostEvent.class, listenerRegistry);
+        log.info("Started");
+    }
+
+    @Deactivate
+    public void deactivate() {
+        eventDispatcher.removeSink(HostEvent.class);
+        log.info("Stopped");
+    }
+
+    @Override
+    protected HostProviderService createProviderService(HostProvider provider) {
+        return new InternalHostProviderService(provider);
+    }
+
+    @Override
+    public int getHostCount() {
+        return store.getHostCount();
+    }
+
+    @Override
+    public Iterable<Host> getHosts() {
+        return store.getHosts();
+    }
+
+    @Override
+    public Host getHost(HostId hostId) {
+        checkNotNull(hostId, HOST_ID_NULL);
+        return store.getHost(hostId);
+    }
+
+    @Override
+    public Set<Host> getHostsByVlan(VlanId vlanId) {
+        return store.getHosts(vlanId);
+    }
+
+    @Override
+    public Set<Host> getHostsByMac(MacAddress mac) {
+        checkNotNull(mac, "MAC address cannot be null");
+        return store.getHosts(mac);
+    }
+
+    @Override
+    public Set<Host> getHostsByIp(IpPrefix ip) {
+        checkNotNull(ip, "IP address cannot be null");
+        return store.getHosts(ip);
+    }
+
+    @Override
+    public Set<Host> getConnectedHosts(ConnectPoint connectPoint) {
+        checkNotNull(connectPoint, "Connection point cannot be null");
+        return store.getConnectedHosts(connectPoint);
+    }
+
+    @Override
+    public Set<Host> getConnectedHosts(DeviceId deviceId) {
+        checkNotNull(deviceId, "Device ID cannot be null");
+        return store.getConnectedHosts(deviceId);
+    }
+
+    @Override
+    public void monitorIp(IpPrefix ip) {
+        // TODO pass through to SimpleHostMonitor
+    }
+
+    @Override
+    public void stopMonitoringIp(IpPrefix ip) {
+        // TODO pass through to SimpleHostMonitor
+    }
+
+    @Override
+    public void addListener(HostListener listener) {
+        listenerRegistry.addListener(listener);
+    }
+
+    @Override
+    public void removeListener(HostListener listener) {
+        listenerRegistry.removeListener(listener);
+    }
+
+    @Override
+    public void removeHost(HostId hostId) {
+        checkNotNull(hostId, HOST_ID_NULL);
+        HostEvent event = store.removeHost(hostId);
+        if (event != null) {
+            log.info("Host {} administratively removed", hostId);
+            post(event);
+        }
+    }
+
+    // Personalized host provider service issued to the supplied provider.
+    private class InternalHostProviderService
+            extends AbstractProviderService<HostProvider>
+            implements HostProviderService {
+
+        InternalHostProviderService(HostProvider provider) {
+            super(provider);
+        }
+
+        @Override
+        public void hostDetected(HostId hostId, HostDescription hostDescription) {
+            checkNotNull(hostId, HOST_ID_NULL);
+            checkValidity();
+            HostEvent event = store.createOrUpdateHost(provider().id(), hostId,
+                                                       hostDescription);
+            if (event != null) {
+                log.debug("Host {} detected", hostId);
+                post(event);
+            }
+        }
+
+        @Override
+        public void hostVanished(HostId hostId) {
+            checkNotNull(hostId, HOST_ID_NULL);
+            checkValidity();
+            HostEvent event = store.removeHost(hostId);
+            if (event != null) {
+                log.debug("Host {} vanished", hostId);
+                post(event);
+            }
+        }
+    }
+
+    // Posts the specified event to the local event dispatcher.
+    private void post(HostEvent event) {
+        if (event != null) {
+            eventDispatcher.post(event);
+        }
+    }
+
+}
diff --git a/core/net/src/main/java/org/onlab/onos/net/host/impl/SimpleHostMonitor.java b/core/net/src/main/java/org/onlab/onos/net/host/impl/SimpleHostMonitor.java
new file mode 100644
index 0000000..4849466
--- /dev/null
+++ b/core/net/src/main/java/org/onlab/onos/net/host/impl/SimpleHostMonitor.java
@@ -0,0 +1,108 @@
+package org.onlab.onos.net.host.impl;
+
+import java.util.HashSet;
+import java.util.Set;
+import java.util.concurrent.TimeUnit;
+
+import org.jboss.netty.util.Timeout;
+import org.jboss.netty.util.TimerTask;
+import org.onlab.onos.net.Device;
+import org.onlab.onos.net.Host;
+import org.onlab.onos.net.Port;
+import org.onlab.onos.net.device.DeviceService;
+import org.onlab.onos.net.host.HostProvider;
+import org.onlab.onos.net.host.HostService;
+import org.onlab.onos.net.packet.PacketProvider;
+import org.onlab.onos.net.topology.TopologyService;
+import org.onlab.packet.IpPrefix;
+import org.onlab.util.Timer;
+
+public class SimpleHostMonitor implements TimerTask {
+
+    private final HostService hostService;
+    private final TopologyService topologyService;
+    private final DeviceService deviceService;
+    private final HostProvider hostProvider;
+    private final PacketProvider packetProvider;
+
+    private final Set<IpPrefix> monitoredAddresses;
+
+    private final long probeRate;
+
+    private Timeout timeout;
+
+    public SimpleHostMonitor(HostService hostService, TopologyService topologyService,
+            DeviceService deviceService,
+            HostProvider hostProvider, PacketProvider packetProvider) {
+        this.hostService = hostService;
+        this.topologyService = topologyService;
+        this.deviceService = deviceService;
+        this.hostProvider = hostProvider;
+        this.packetProvider = packetProvider;
+
+        monitoredAddresses = new HashSet<>();
+
+        probeRate = 30000; // milliseconds
+
+        timeout = Timer.getTimer().newTimeout(this, 0, TimeUnit.MILLISECONDS);
+    }
+
+    public void addMonitoringFor(IpPrefix ip) {
+        monitoredAddresses.add(ip);
+    }
+
+    public void stopMonitoring(IpPrefix ip) {
+        monitoredAddresses.remove(ip);
+    }
+
+    public void shutdown() {
+        timeout.cancel();
+    }
+
+    @Override
+    public void run(Timeout timeout) throws Exception {
+        for (IpPrefix ip : monitoredAddresses) {
+            Set<Host> hosts = hostService.getHostsByIp(ip);
+
+            if (hosts.isEmpty()) {
+                sendArpRequest(ip);
+            } else {
+                for (Host host : hosts) {
+                    hostProvider.triggerProbe(host);
+                }
+            }
+        }
+
+        timeout = Timer.getTimer().newTimeout(this, probeRate, TimeUnit.MILLISECONDS);
+    }
+
+    /**
+     * Sends an ARP request for the given IP address.
+     *
+     * @param targetIp IP address to ARP for
+     */
+    private void sendArpRequest(IpPrefix targetIp) {
+        // emit ARP packet out appropriate ports
+
+        // if ip in one of the configured (external) subnets
+        //   sent out that port
+        // else (ip isn't in any configured subnet)
+        //   send out all non-external edge ports
+
+        for (Device device : deviceService.getDevices()) {
+            for (Port port : deviceService.getPorts(device.id())) {
+                for (IpPrefix ip : port.ipAddresses()) {
+                    if (ip.contains(targetIp)) {
+                        sendProbe(port, targetIp);
+                        continue;
+                    }
+                }
+            }
+        }
+
+    }
+
+    private void sendProbe(Port port, IpPrefix targetIp) {
+
+    }
+}
diff --git a/core/net/src/main/java/org/onlab/onos/net/host/impl/package-info.java b/core/net/src/main/java/org/onlab/onos/net/host/impl/package-info.java
new file mode 100644
index 0000000..55370d3
--- /dev/null
+++ b/core/net/src/main/java/org/onlab/onos/net/host/impl/package-info.java
@@ -0,0 +1,4 @@
+/**
+ * Core subsystem for tracking global inventory of end-station hosts.
+ */
+package org.onlab.onos.net.host.impl;
