Adding DeviceAdminService facade and tests for SimpleDeviceManager.
diff --git a/net/api/src/main/java/org/onlab/onos/net/device/DeviceAdminService.java b/net/api/src/main/java/org/onlab/onos/net/device/DeviceAdminService.java
new file mode 100644
index 0000000..8aec28a
--- /dev/null
+++ b/net/api/src/main/java/org/onlab/onos/net/device/DeviceAdminService.java
@@ -0,0 +1,28 @@
+package org.onlab.onos.net.device;
+
+import org.onlab.onos.net.DeviceId;
+import org.onlab.onos.net.MastershipRole;
+
+/**
+ * Service for administering the inventory of infrastructure devices.
+ */
+public interface DeviceAdminService {
+
+    /**
+     * Applies the current mastership role for the specified device.
+     *
+     * @param deviceId device identifier
+     * @param role     requested role
+     */
+    void setRole(DeviceId deviceId, MastershipRole role);
+
+    /**
+     * Removes the device with the specified identifier.
+     *
+     * @param deviceId device identifier
+     */
+    void removeDevice(DeviceId deviceId);
+
+    // TODO: add ability to administratively suspend/resume device
+
+}
diff --git a/net/api/src/main/java/org/onlab/onos/net/device/DeviceEvent.java b/net/api/src/main/java/org/onlab/onos/net/device/DeviceEvent.java
index 250e140..984f575 100644
--- a/net/api/src/main/java/org/onlab/onos/net/device/DeviceEvent.java
+++ b/net/api/src/main/java/org/onlab/onos/net/device/DeviceEvent.java
@@ -18,6 +18,12 @@
         DEVICE_ADDED,
 
         /**
+         * Signifies that some device attributes have changed; excludes
+         * availability changes.
+         */
+        DEVICE_UPDATED,
+
+        /**
          * Signifies that a device has been removed.
          */
         DEVICE_REMOVED,
diff --git a/net/api/src/main/java/org/onlab/onos/net/provider/AbstractProviderRegistry.java b/net/api/src/main/java/org/onlab/onos/net/provider/AbstractProviderRegistry.java
index 02a486e..f8cdb6b 100644
--- a/net/api/src/main/java/org/onlab/onos/net/provider/AbstractProviderRegistry.java
+++ b/net/api/src/main/java/org/onlab/onos/net/provider/AbstractProviderRegistry.java
@@ -18,6 +18,7 @@
 public abstract class AbstractProviderRegistry<P extends Provider, S extends ProviderService<P>>
         implements ProviderRegistry<P, S> {
 
+    private final Map<ProviderId, P> providers = new HashMap<>();
     private final Map<ProviderId, S> services = new HashMap<>();
 
     /**
@@ -34,6 +35,7 @@
         checkState(!services.containsKey(provider.id()), "Provider %s already registered", provider.id());
         S service = createProviderService(provider);
         services.put(provider.id(), service);
+        providers.put(provider.id(), provider);
         return service;
     }
 
@@ -44,6 +46,7 @@
         if (service != null && service instanceof AbstractProviderService) {
             ((AbstractProviderService) service).invalidate();
             services.remove(provider.id());
+            providers.remove(provider.id());
         }
     }
 
@@ -52,4 +55,14 @@
         return ImmutableSet.copyOf(services.keySet());
     }
 
+    /**
+     * Returns the provider registered with the specified provider ID.
+     *
+     * @param providerId provider identifier
+     * @return provider
+     */
+    protected synchronized P getProvider(ProviderId providerId) {
+        return providers.get(providerId);
+    }
+
 }