diff --git a/core/api/src/main/java/org/onlab/onos/net/DefaultPort.java b/core/api/src/main/java/org/onlab/onos/net/DefaultPort.java
index c6d6cb3..d2570b6 100644
--- a/core/api/src/main/java/org/onlab/onos/net/DefaultPort.java
+++ b/core/api/src/main/java/org/onlab/onos/net/DefaultPort.java
@@ -6,7 +6,7 @@
 import java.util.Objects;
 import java.util.Set;
 
-import org.onlab.packet.IpAddress;
+import org.onlab.packet.IpPrefix;
 
 /**
  * Default port implementation.
@@ -18,7 +18,7 @@
     private final boolean isEnabled;
 
     // Attributes
-    private final Set<IpAddress> ipAddresses;
+    private final Set<IpPrefix> ipAddresses;
 
     /**
      * Creates a network element attributed to the specified provider.
@@ -41,7 +41,7 @@
      * @param ipAddresses set of IP addresses assigned to the port
      */
     public DefaultPort(Element element, PortNumber number,
-                       boolean isEnabled, Set<IpAddress> ipAddresses) {
+                       boolean isEnabled, Set<IpPrefix> ipAddresses) {
         this.element = element;
         this.number = number;
         this.isEnabled = isEnabled;
@@ -90,7 +90,7 @@
     }
 
     @Override
-    public Set<IpAddress> ipAddresses() {
+    public Set<IpPrefix> ipAddresses() {
         return ipAddresses;
     }
 
diff --git a/core/api/src/main/java/org/onlab/onos/net/Port.java b/core/api/src/main/java/org/onlab/onos/net/Port.java
index aab10d7..45b816b 100644
--- a/core/api/src/main/java/org/onlab/onos/net/Port.java
+++ b/core/api/src/main/java/org/onlab/onos/net/Port.java
@@ -2,7 +2,7 @@
 
 import java.util.Set;
 
-import org.onlab.packet.IpAddress;
+import org.onlab.packet.IpPrefix;
 
 /**
  * Abstraction of a network port.
@@ -39,5 +39,5 @@
      * @return the set of IP addresses configured on the port. The set is empty
      * if no addresses are configured.
      */
-    Set<IpAddress> ipAddresses();
+    Set<IpPrefix> ipAddresses();
 }
diff --git a/core/api/src/main/java/org/onlab/onos/net/host/HostService.java b/core/api/src/main/java/org/onlab/onos/net/host/HostService.java
index 39f63c0..3717bea 100644
--- a/core/api/src/main/java/org/onlab/onos/net/host/HostService.java
+++ b/core/api/src/main/java/org/onlab/onos/net/host/HostService.java
@@ -1,5 +1,7 @@
 package org.onlab.onos.net.host;
 
+import java.util.Set;
+
 import org.onlab.onos.net.ConnectPoint;
 import org.onlab.onos.net.DeviceId;
 import org.onlab.onos.net.Host;
@@ -8,8 +10,6 @@
 import org.onlab.packet.MacAddress;
 import org.onlab.packet.VlanId;
 
-import java.util.Set;
-
 /**
  * Service for interacting with the inventory of end-station hosts.
  */
@@ -82,6 +82,22 @@
     Set<Host> getConnectedHosts(DeviceId deviceId);
 
     /**
+     * Requests the host service to monitor hosts with the given IP address and
+     * notify listeners of changes.
+     *
+     * @param ip IP address of the host to monitor
+     */
+    void monitorIp(IpPrefix ip);
+
+    /**
+     * Stops the host service from monitoring an IP address.
+     *
+     * @param ip IP address to stop monitoring
+     */
+    // TODO clients can cancel other client's requests
+    void stopMonitoringIp(IpPrefix ip);
+
+    /**
      * Adds the specified host listener.
      *
      * @param listener host listener
diff --git a/core/api/src/test/java/org/onlab/onos/net/host/HostServiceAdapter.java b/core/api/src/test/java/org/onlab/onos/net/host/HostServiceAdapter.java
index 682e349..6a270cd 100644
--- a/core/api/src/test/java/org/onlab/onos/net/host/HostServiceAdapter.java
+++ b/core/api/src/test/java/org/onlab/onos/net/host/HostServiceAdapter.java
@@ -1,5 +1,7 @@
 package org.onlab.onos.net.host;
 
+import java.util.Set;
+
 import org.onlab.onos.net.ConnectPoint;
 import org.onlab.onos.net.DeviceId;
 import org.onlab.onos.net.Host;
@@ -8,8 +10,6 @@
 import org.onlab.packet.MacAddress;
 import org.onlab.packet.VlanId;
 
-import java.util.Set;
-
 /**
  * Test adapter for host service.
  */
@@ -55,6 +55,14 @@
     }
 
     @Override
+    public void monitorIp(IpPrefix ip) {
+    }
+
+    @Override
+    public void stopMonitoringIp(IpPrefix ip) {
+    }
+
+    @Override
     public void addListener(HostListener listener) {
     }
 
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) {
+
+    }
+}
