diff --git a/core/trivial/src/main/java/org/onlab/onos/net/trivial/host/impl/SimpleHostManager.java b/core/trivial/src/main/java/org/onlab/onos/net/trivial/host/impl/SimpleHostManager.java
index 109d238..5aae395 100644
--- a/core/trivial/src/main/java/org/onlab/onos/net/trivial/host/impl/SimpleHostManager.java
+++ b/core/trivial/src/main/java/org/onlab/onos/net/trivial/host/impl/SimpleHostManager.java
@@ -1,5 +1,10 @@
 package org.onlab.onos.net.trivial.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;
@@ -28,11 +33,6 @@
 import org.onlab.packet.VlanId;
 import org.slf4j.Logger;
 
-import java.util.Set;
-
-import static com.google.common.base.Preconditions.checkNotNull;
-import static org.slf4j.LoggerFactory.getLogger;
-
 /**
  * Provides basic implementation of the host SB &amp; NB APIs.
  */
@@ -118,6 +118,16 @@
     }
 
     @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);
     }
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) {
+
+    }
+}
