Began implementation of the a host monitor
diff --git a/core/trivial/src/main/java/org/onlab/onos/net/trivial/host/impl/SimpleHostMonitor.java b/core/trivial/src/main/java/org/onlab/onos/net/trivial/host/impl/SimpleHostMonitor.java
new file mode 100644
index 0000000..e4489dd
--- /dev/null
+++ b/core/trivial/src/main/java/org/onlab/onos/net/trivial/host/impl/SimpleHostMonitor.java
@@ -0,0 +1,108 @@
+package org.onlab.onos.net.trivial.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) {
+
+    }
+}