simple device provider added
diff --git a/of/api/src/main/java/org/onlab/onos/of/controller/driver/AbstractOpenFlowSwitch.java b/of/api/src/main/java/org/onlab/onos/of/controller/driver/AbstractOpenFlowSwitch.java
index ce6365a..7ba5a5d 100644
--- a/of/api/src/main/java/org/onlab/onos/of/controller/driver/AbstractOpenFlowSwitch.java
+++ b/of/api/src/main/java/org/onlab/onos/of/controller/driver/AbstractOpenFlowSwitch.java
@@ -219,6 +219,7 @@
     @Override
     public void setRole(RoleState role) {
         try {
+            log.info("Sending role {} to switch {}", role, getStringId());
             if (this.roleMan.sendRoleRequest(role, RoleRecvStatus.MATCHED_SET_ROLE)) {
                 this.role = role;
             }
diff --git a/of/ctl/src/main/java/org/onlab/onos/of/controller/impl/internal/Controller.java b/of/ctl/src/main/java/org/onlab/onos/of/controller/impl/Controller.java
similarity index 98%
rename from of/ctl/src/main/java/org/onlab/onos/of/controller/impl/internal/Controller.java
rename to of/ctl/src/main/java/org/onlab/onos/of/controller/impl/Controller.java
index ab9315f..e2cb693 100644
--- a/of/ctl/src/main/java/org/onlab/onos/of/controller/impl/internal/Controller.java
+++ b/of/ctl/src/main/java/org/onlab/onos/of/controller/impl/Controller.java
@@ -15,7 +15,7 @@
  *    under the License.
  **/
 
-package org.onlab.onos.of.controller.impl.internal;
+package org.onlab.onos.of.controller.impl;
 
 import java.lang.management.ManagementFactory;
 import java.lang.management.RuntimeMXBean;
@@ -34,7 +34,7 @@
 import org.onlab.onos.of.controller.driver.OpenFlowSwitchDriver;
 import org.onlab.onos.of.controller.impl.annotations.LogMessageDoc;
 import org.onlab.onos.of.controller.impl.annotations.LogMessageDocs;
-import org.onlab.onos.of.drivers.DriverManager;
+import org.onlab.onos.of.drivers.impl.DriverManager;
 import org.projectfloodlight.openflow.protocol.OFDescStatsReply;
 import org.projectfloodlight.openflow.protocol.OFFactories;
 import org.projectfloodlight.openflow.protocol.OFFactory;
diff --git a/of/ctl/src/main/java/org/onlab/onos/of/controller/impl/internal/HandshakeTimeoutException.java b/of/ctl/src/main/java/org/onlab/onos/of/controller/impl/HandshakeTimeoutException.java
similarity index 94%
rename from of/ctl/src/main/java/org/onlab/onos/of/controller/impl/internal/HandshakeTimeoutException.java
rename to of/ctl/src/main/java/org/onlab/onos/of/controller/impl/HandshakeTimeoutException.java
index c199487..f3eac5f 100644
--- a/of/ctl/src/main/java/org/onlab/onos/of/controller/impl/internal/HandshakeTimeoutException.java
+++ b/of/ctl/src/main/java/org/onlab/onos/of/controller/impl/HandshakeTimeoutException.java
@@ -15,7 +15,7 @@
  *    under the License.
  **/
 
-package org.onlab.onos.of.controller.impl.internal;
+package org.onlab.onos.of.controller.impl;
 
 /**
  * Exception is thrown when the handshake fails to complete.
diff --git a/of/ctl/src/main/java/org/onlab/onos/of/controller/impl/internal/HandshakeTimeoutHandler.java b/of/ctl/src/main/java/org/onlab/onos/of/controller/impl/HandshakeTimeoutHandler.java
similarity index 98%
rename from of/ctl/src/main/java/org/onlab/onos/of/controller/impl/internal/HandshakeTimeoutHandler.java
rename to of/ctl/src/main/java/org/onlab/onos/of/controller/impl/HandshakeTimeoutHandler.java
index 10a42ca..de7853a 100644
--- a/of/ctl/src/main/java/org/onlab/onos/of/controller/impl/internal/HandshakeTimeoutHandler.java
+++ b/of/ctl/src/main/java/org/onlab/onos/of/controller/impl/HandshakeTimeoutHandler.java
@@ -15,7 +15,7 @@
 *    under the License.
 **/
 
-package org.onlab.onos.of.controller.impl.internal;
+package org.onlab.onos.of.controller.impl;
 
 import java.util.concurrent.TimeUnit;
 
diff --git a/of/ctl/src/main/java/org/onlab/onos/of/controller/impl/internal/IOFSwitchManager.java b/of/ctl/src/main/java/org/onlab/onos/of/controller/impl/IOFSwitchManager.java
similarity index 93%
rename from of/ctl/src/main/java/org/onlab/onos/of/controller/impl/internal/IOFSwitchManager.java
rename to of/ctl/src/main/java/org/onlab/onos/of/controller/impl/IOFSwitchManager.java
index 035c4ca..ec12ad5 100644
--- a/of/ctl/src/main/java/org/onlab/onos/of/controller/impl/internal/IOFSwitchManager.java
+++ b/of/ctl/src/main/java/org/onlab/onos/of/controller/impl/IOFSwitchManager.java
@@ -1,4 +1,4 @@
-package org.onlab.onos.of.controller.impl.internal;
+package org.onlab.onos.of.controller.impl;
 
 import org.onlab.onos.of.controller.driver.AbstractOpenFlowSwitch;
 import org.projectfloodlight.openflow.protocol.OFVersion;
diff --git a/of/ctl/src/main/java/org/onlab/onos/of/controller/impl/internal/OFChannelHandler.java b/of/ctl/src/main/java/org/onlab/onos/of/controller/impl/OFChannelHandler.java
similarity index 99%
rename from of/ctl/src/main/java/org/onlab/onos/of/controller/impl/internal/OFChannelHandler.java
rename to of/ctl/src/main/java/org/onlab/onos/of/controller/impl/OFChannelHandler.java
index 768362f..66c1e60 100644
--- a/of/ctl/src/main/java/org/onlab/onos/of/controller/impl/internal/OFChannelHandler.java
+++ b/of/ctl/src/main/java/org/onlab/onos/of/controller/impl/OFChannelHandler.java
@@ -1,5 +1,5 @@
 //CHECKSTYLE:OFF
-package org.onlab.onos.of.controller.impl.internal;
+package org.onlab.onos.of.controller.impl;
 
 import java.io.IOException;
 import java.nio.channels.ClosedChannelException;
@@ -415,17 +415,18 @@
                 OFDescStatsReply drep = (OFDescStatsReply) m;
                 // Here is where we differentiate between different kinds of switches
                 h.sw = h.controller.getOFSwitchInstance(h.thisdpid, drep, h.ofVersion);
+                h.sw.setOFVersion(h.ofVersion);
+                h.sw.setFeaturesReply(h.featuresReply);
+                h.sw.setPortDescReply(h.portDescReply);
+                h.sw.setConnected(true);
+                h.sw.setChannel(h.channel);
                 boolean success = h.sw.connectSwitch();
                 if (!success) {
                     disconnectDuplicate(h);
                     return;
                 }
                 // set switch information
-                h.sw.setOFVersion(h.ofVersion);
-                h.sw.setFeaturesReply(h.featuresReply);
-                h.sw.setPortDescReply(h.portDescReply);
-                h.sw.setConnected(true);
-                h.sw.setChannel(h.channel);
+
 
 
                 log.info("Switch {} bound to class {}, description {}",
diff --git a/of/ctl/src/main/java/org/onlab/onos/of/controller/impl/internal/OFMessageDecoder.java b/of/ctl/src/main/java/org/onlab/onos/of/controller/impl/OFMessageDecoder.java
similarity index 97%
rename from of/ctl/src/main/java/org/onlab/onos/of/controller/impl/internal/OFMessageDecoder.java
rename to of/ctl/src/main/java/org/onlab/onos/of/controller/impl/OFMessageDecoder.java
index 3035103..d310613 100644
--- a/of/ctl/src/main/java/org/onlab/onos/of/controller/impl/internal/OFMessageDecoder.java
+++ b/of/ctl/src/main/java/org/onlab/onos/of/controller/impl/OFMessageDecoder.java
@@ -15,7 +15,7 @@
  *    under the License.
  **/
 
-package org.onlab.onos.of.controller.impl.internal;
+package org.onlab.onos.of.controller.impl;
 
 
 import org.jboss.netty.buffer.ChannelBuffer;
diff --git a/of/ctl/src/main/java/org/onlab/onos/of/controller/impl/internal/OFMessageEncoder.java b/of/ctl/src/main/java/org/onlab/onos/of/controller/impl/OFMessageEncoder.java
similarity index 97%
rename from of/ctl/src/main/java/org/onlab/onos/of/controller/impl/internal/OFMessageEncoder.java
rename to of/ctl/src/main/java/org/onlab/onos/of/controller/impl/OFMessageEncoder.java
index 14a6db5..35d84b4 100644
--- a/of/ctl/src/main/java/org/onlab/onos/of/controller/impl/internal/OFMessageEncoder.java
+++ b/of/ctl/src/main/java/org/onlab/onos/of/controller/impl/OFMessageEncoder.java
@@ -15,7 +15,7 @@
  *    under the License.
  **/
 
-package org.onlab.onos.of.controller.impl.internal;
+package org.onlab.onos.of.controller.impl;
 
 import java.util.List;
 
diff --git a/of/ctl/src/main/java/org/onlab/onos/of/controller/impl/internal/OpenFlowControllerImpl.java b/of/ctl/src/main/java/org/onlab/onos/of/controller/impl/OpenFlowControllerImpl.java
similarity index 93%
rename from of/ctl/src/main/java/org/onlab/onos/of/controller/impl/internal/OpenFlowControllerImpl.java
rename to of/ctl/src/main/java/org/onlab/onos/of/controller/impl/OpenFlowControllerImpl.java
index b7ba4c7..ac10021 100644
--- a/of/ctl/src/main/java/org/onlab/onos/of/controller/impl/internal/OpenFlowControllerImpl.java
+++ b/of/ctl/src/main/java/org/onlab/onos/of/controller/impl/OpenFlowControllerImpl.java
@@ -1,4 +1,4 @@
-package org.onlab.onos.of.controller.impl.internal;
+package org.onlab.onos.of.controller.impl;
 
 import java.util.ArrayList;
 import java.util.concurrent.ConcurrentHashMap;
@@ -15,7 +15,6 @@
 import org.onlab.onos.of.controller.OpenFlowSwitchListener;
 import org.onlab.onos.of.controller.PacketListener;
 import org.onlab.onos.of.controller.RoleState;
-import org.onlab.onos.of.controller.driver.AbstractOpenFlowSwitch;
 import org.onlab.onos.of.controller.driver.OpenFlowAgent;
 import org.projectfloodlight.openflow.protocol.OFMessage;
 import org.slf4j.Logger;
@@ -68,17 +67,18 @@
 
     @Override
     public OpenFlowSwitch getSwitch(Dpid dpid) {
-        return connectedSwitches.get(dpid.value());
+        return connectedSwitches.get(dpid);
     }
 
     @Override
     public OpenFlowSwitch getMasterSwitch(Dpid dpid) {
-        return activeMasterSwitches.get(dpid.value());
+        return activeMasterSwitches.get(dpid);
     }
 
     @Override
     public OpenFlowSwitch getEqualSwitch(Dpid dpid) {
-        return activeEqualSwitches.get(dpid.value());    }
+        return activeEqualSwitches.get(dpid);
+    }
 
     @Override
     public void addListener(OpenFlowSwitchListener listener) {
@@ -116,9 +116,15 @@
 
     @Override
     public void setRole(Dpid dpid, RoleState role) {
-        ((AbstractOpenFlowSwitch) getSwitch(dpid)).setRole(role);
+        getSwitch(dpid).setRole(role);
     }
 
+    /**
+     * Implementation of an OpenFlow Agent which is responsible for
+     * keeping track of connected switches and the state in which
+     * they are.
+     *
+     */
     public class OpenFlowSwitchAgent implements OpenFlowAgent {
 
         private final Logger log = LoggerFactory.getLogger(OpenFlowSwitchAgent.class);
@@ -204,6 +210,7 @@
                             + "was not found in controller-cache", dpid);
                     return;
                 }
+                log.info("Transitioned switch {} to MASTER", dpid);
                 activeMasterSwitches.put(dpid, sw);
             } finally {
                 switchLock.unlock();
@@ -224,6 +231,7 @@
                             + "was not found in controller-cache", dpid);
                     return;
                 }
+                log.info("Transitioned switch {} to EQUAL", dpid);
                 activeEqualSwitches.put(dpid, sw);
             } finally {
                 switchLock.unlock();
diff --git a/of/ctl/src/main/java/org/onlab/onos/of/controller/impl/internal/OpenflowPipelineFactory.java b/of/ctl/src/main/java/org/onlab/onos/of/controller/impl/OpenflowPipelineFactory.java
similarity index 98%
rename from of/ctl/src/main/java/org/onlab/onos/of/controller/impl/internal/OpenflowPipelineFactory.java
rename to of/ctl/src/main/java/org/onlab/onos/of/controller/impl/OpenflowPipelineFactory.java
index 02e3520..1e34a3e 100644
--- a/of/ctl/src/main/java/org/onlab/onos/of/controller/impl/internal/OpenflowPipelineFactory.java
+++ b/of/ctl/src/main/java/org/onlab/onos/of/controller/impl/OpenflowPipelineFactory.java
@@ -15,7 +15,7 @@
 *    under the License.
 **/
 
-package org.onlab.onos.of.controller.impl.internal;
+package org.onlab.onos.of.controller.impl;
 
 import java.util.concurrent.ThreadPoolExecutor;
 
diff --git a/of/ctl/src/main/java/org/onlab/onos/of/controller/impl/internal/RoleManager.java b/of/ctl/src/main/java/org/onlab/onos/of/controller/impl/RoleManager.java
similarity index 99%
rename from of/ctl/src/main/java/org/onlab/onos/of/controller/impl/internal/RoleManager.java
rename to of/ctl/src/main/java/org/onlab/onos/of/controller/impl/RoleManager.java
index 235eb61..f82a46c 100644
--- a/of/ctl/src/main/java/org/onlab/onos/of/controller/impl/internal/RoleManager.java
+++ b/of/ctl/src/main/java/org/onlab/onos/of/controller/impl/RoleManager.java
@@ -1,4 +1,4 @@
-package org.onlab.onos.of.controller.impl.internal;
+package org.onlab.onos.of.controller.impl;
 
 import java.io.IOException;
 import java.util.Collections;
diff --git a/of/ctl/src/main/java/org/onlab/onos/of/drivers/DriverManager.java b/of/ctl/src/main/java/org/onlab/onos/of/drivers/impl/DriverManager.java
similarity index 98%
rename from of/ctl/src/main/java/org/onlab/onos/of/drivers/DriverManager.java
rename to of/ctl/src/main/java/org/onlab/onos/of/drivers/impl/DriverManager.java
index 97f94d3..2c72c17 100644
--- a/of/ctl/src/main/java/org/onlab/onos/of/drivers/DriverManager.java
+++ b/of/ctl/src/main/java/org/onlab/onos/of/drivers/impl/DriverManager.java
@@ -1,4 +1,4 @@
-package org.onlab.onos.of.drivers;
+package org.onlab.onos.of.drivers.impl;
 
 
 
diff --git a/of/ctl/src/main/java/org/onlab/onos/of/drivers/OFSwitchImplCPqD13.java b/of/ctl/src/main/java/org/onlab/onos/of/drivers/impl/OFSwitchImplCPqD13.java
similarity index 99%
rename from of/ctl/src/main/java/org/onlab/onos/of/drivers/OFSwitchImplCPqD13.java
rename to of/ctl/src/main/java/org/onlab/onos/of/drivers/impl/OFSwitchImplCPqD13.java
index b2881ba..e80b751 100644
--- a/of/ctl/src/main/java/org/onlab/onos/of/drivers/OFSwitchImplCPqD13.java
+++ b/of/ctl/src/main/java/org/onlab/onos/of/drivers/impl/OFSwitchImplCPqD13.java
@@ -1,4 +1,4 @@
-package org.onlab.onos.of.drivers;
+package org.onlab.onos.of.drivers.impl;
 
 import java.io.IOException;
 import java.util.ArrayList;
diff --git a/of/ctl/src/main/java/org/onlab/onos/of/drivers/OFSwitchImplOVS10.java b/of/ctl/src/main/java/org/onlab/onos/of/drivers/impl/OFSwitchImplOVS10.java
similarity index 97%
rename from of/ctl/src/main/java/org/onlab/onos/of/drivers/OFSwitchImplOVS10.java
rename to of/ctl/src/main/java/org/onlab/onos/of/drivers/impl/OFSwitchImplOVS10.java
index bc42636..0a311f3 100644
--- a/of/ctl/src/main/java/org/onlab/onos/of/drivers/OFSwitchImplOVS10.java
+++ b/of/ctl/src/main/java/org/onlab/onos/of/drivers/impl/OFSwitchImplOVS10.java
@@ -1,4 +1,4 @@
-package org.onlab.onos.of.drivers;
+package org.onlab.onos.of.drivers.impl;
 
 import java.util.List;
 
diff --git a/of/ctl/src/main/java/org/onlab/onos/of/drivers/OFSwitchImplOVS13.java b/of/ctl/src/main/java/org/onlab/onos/of/drivers/impl/OFSwitchImplOVS13.java
similarity index 98%
rename from of/ctl/src/main/java/org/onlab/onos/of/drivers/OFSwitchImplOVS13.java
rename to of/ctl/src/main/java/org/onlab/onos/of/drivers/impl/OFSwitchImplOVS13.java
index 40750f7..bb6bb23 100644
--- a/of/ctl/src/main/java/org/onlab/onos/of/drivers/OFSwitchImplOVS13.java
+++ b/of/ctl/src/main/java/org/onlab/onos/of/drivers/impl/OFSwitchImplOVS13.java
@@ -1,4 +1,4 @@
-package org.onlab.onos.of.drivers;
+package org.onlab.onos.of.drivers.impl;
 
 import java.util.List;
 import java.util.concurrent.atomic.AtomicBoolean;
diff --git a/providers/of/device/src/main/java/org/onlab/onos/provider/of/device/impl/OpenFlowDeviceProvider.java b/providers/of/device/src/main/java/org/onlab/onos/provider/of/device/impl/OpenFlowDeviceProvider.java
index f63b448..f7e3c95 100644
--- a/providers/of/device/src/main/java/org/onlab/onos/provider/of/device/impl/OpenFlowDeviceProvider.java
+++ b/providers/of/device/src/main/java/org/onlab/onos/provider/of/device/impl/OpenFlowDeviceProvider.java
@@ -1,22 +1,30 @@
 package org.onlab.onos.provider.of.device.impl;
 
+import static org.slf4j.LoggerFactory.getLogger;
+
+import java.net.URI;
+import java.net.URISyntaxException;
+
 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.onlab.onos.net.Device;
+import org.onlab.onos.net.DeviceId;
 import org.onlab.onos.net.MastershipRole;
+import org.onlab.onos.net.device.DeviceDescription;
 import org.onlab.onos.net.device.DeviceProvider;
 import org.onlab.onos.net.device.DeviceProviderRegistry;
 import org.onlab.onos.net.device.DeviceProviderService;
 import org.onlab.onos.net.provider.AbstractProvider;
 import org.onlab.onos.net.provider.ProviderId;
+import org.onlab.onos.of.controller.Dpid;
 import org.onlab.onos.of.controller.OpenFlowController;
+import org.onlab.onos.of.controller.OpenFlowSwitchListener;
+import org.onlab.onos.of.controller.RoleState;
 import org.slf4j.Logger;
 
-import static org.slf4j.LoggerFactory.getLogger;
-
 /**
  * Provider which uses an OpenFlow controller to detect network
  * infrastructure devices.
@@ -44,6 +52,7 @@
     @Activate
     public void activate() {
         providerService = providerRegistry.register(this);
+        controller.addListener(new InternalDeviceProvider());
         log.info("Started");
     }
 
@@ -61,7 +70,55 @@
 
     @Override
     public void roleChanged(Device device, MastershipRole newRole) {
+        switch (newRole) {
+        case MASTER:
+            controller.setRole(new Dpid(device.id().uri().getSchemeSpecificPart()),
+                    RoleState.MASTER);
+            break;
+        case STANDBY:
+            controller.setRole(new Dpid(device.id().uri().getSchemeSpecificPart()),
+                    RoleState.EQUAL);
+        case NONE:
+            controller.setRole(new Dpid(device.id().uri().getSchemeSpecificPart()),
+                    RoleState.SLAVE);
+            break;
+        default:
+            log.error("Unknown Mastership state : {}", newRole);
+
+        }
         log.info("Accepting mastership role change for device {}", device.id());
     }
 
+    private class InternalDeviceProvider implements OpenFlowSwitchListener {
+
+        @Override
+        public void switchAdded(final Dpid dpid) {
+            URI uri = buildURI(dpid);
+            providerService.deviceConnected(new DeviceId(uri), new DeviceDescription() {
+
+                @Override
+                public URI deviceURI() {
+                    return buildURI(dpid);
+                }
+            });
+        }
+
+        @Override
+        public void switchRemoved(Dpid dpid) {
+            URI uri = buildURI(dpid);
+            providerService.deviceDisconnected(new DeviceId(uri));
+        }
+
+        private URI buildURI(Dpid dpid) {
+            URI uri = null;
+            try {
+                uri = new URI("of", Long.toHexString(dpid.value()), null);
+            } catch (URISyntaxException e) {
+                log.warn("URI construction for device {} failed.", dpid);
+            }
+            return uri;
+        }
+
+    }
+
 }