diff --git a/local/bigswitch/pom.xml b/local/bigswitch/pom.xml
index 00baf3c..71f0179 100644
--- a/local/bigswitch/pom.xml
+++ b/local/bigswitch/pom.xml
@@ -44,7 +44,6 @@
             <artifactId>onos-core-serializers</artifactId>
             <version>${onos.version}</version>
         </dependency>
-
         <dependency>
             <groupId>org.onosproject</groupId>
             <artifactId>onos-cli</artifactId>
@@ -56,9 +55,16 @@
             <version>3.0.5</version>
             <scope>provided</scope>
         </dependency>
+        <dependency>
+            <groupId>org.osgi</groupId>
+            <artifactId>org.osgi.compendium</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.felix</groupId>
+            <artifactId>org.apache.felix.scr.annotations</artifactId>
+        </dependency>
     </dependencies>
 
-
     <build>
         <plugins>
             <plugin>
diff --git a/local/bigswitch/src/main/java/org/opencord/ce/local/bigswitch/BigSwitchManager.java b/local/bigswitch/src/main/java/org/opencord/ce/local/bigswitch/BigSwitchManager.java
index ebe2179..010c54d 100644
--- a/local/bigswitch/src/main/java/org/opencord/ce/local/bigswitch/BigSwitchManager.java
+++ b/local/bigswitch/src/main/java/org/opencord/ce/local/bigswitch/BigSwitchManager.java
@@ -16,6 +16,7 @@
 
 package org.opencord.ce.local.bigswitch;
 
+import com.google.common.base.Strings;
 import com.google.common.cache.CacheBuilder;
 import com.google.common.cache.CacheLoader;
 import com.google.common.cache.LoadingCache;
@@ -48,9 +49,6 @@
 import org.onosproject.net.device.DeviceService;
 import org.onosproject.net.device.PortDescription;
 import org.onosproject.net.domain.DomainId;
-import org.onosproject.net.edge.EdgePortEvent;
-import org.onosproject.net.edge.EdgePortListener;
-import org.onosproject.net.edge.EdgePortService;
 import org.onosproject.store.serializers.KryoNamespaces;
 import org.onosproject.store.service.AtomicCounter;
 import org.onosproject.store.service.ConsistentMap;
@@ -71,15 +69,13 @@
 import java.util.concurrent.Executors;
 import java.util.stream.Collectors;
 
-import static com.google.common.base.Strings.isNullOrEmpty;
 import static org.onlab.util.Tools.get;
 import static org.onosproject.net.config.basics.SubjectFactories.APP_SUBJECT_FACTORY;
-import static org.opencord.ce.api.services.channel.Symbols.DOMAIN_ID;
 import static org.opencord.ce.api.services.channel.Symbols.MEF_PORT_TYPE;
 import static org.opencord.ce.local.bigswitch.MefPortsConfig.INTERLINK_ID;
 import static org.opencord.ce.local.bigswitch.MefPortsConfig.MEF_PORTS;
-import static org.slf4j.LoggerFactory.getLogger;
 import static org.opencord.ce.local.bigswitch.MefPortsConfig.MefPortConfig;
+import static org.slf4j.LoggerFactory.getLogger;
 
 /**
  * Listens for edge and port changes in the underlying data path and
@@ -93,7 +89,6 @@
     private static final Logger log = getLogger(BigSwitchManager.class);
     private static final String APP_NAME = "org.opencord.ce.local.bigswitch";
 
-    public static final String REALIZED_BY = "bigswitch:realizedBy";
     public static final String DEFAULT_DOMAIN_ID = "local-domain";
 
     private static final String PORT_MAP = "ecord-port-map";
@@ -103,6 +98,9 @@
     private final NetworkConfigListener configListener = new InternalConfigListener();
 
     @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    protected ComponentConfigService componentConfigService;
+
+    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
     protected CoreService coreService;
 
     @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
@@ -112,24 +110,14 @@
     protected DeviceService deviceService;
 
     @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
-    protected EdgePortService edgePortService;
-
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
     protected StorageService storageService;
 
     @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
     protected NetworkConfigService networkConfigService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
-    protected ComponentConfigService componentConfigService;
-
-    @Property(name = "domainId", value = DEFAULT_DOMAIN_ID, label = "Domain ID where this ONOS is running")
-    private String siteId = DEFAULT_DOMAIN_ID;
-
-    private static final String PROP_ENABLED = "enabled";
-    @Property(name = PROP_ENABLED, boolValue = true,
-            label = "If false, DEVICE_CREATED event is never triggered")
-    private boolean enabled = true;
+    private static final String DOMAIN_ID = "domainId";
+    @Property(name = DOMAIN_ID, value = DEFAULT_DOMAIN_ID, label = "Domain ID where this ONOS is running")
+    private String domainId = DEFAULT_DOMAIN_ID;
 
     private final ExecutorService executorService =
             Executors.newSingleThreadExecutor();
@@ -154,7 +142,6 @@
     private LoadingCache<ConnectPoint, Long> p2vMap;
 
     // TODO: Add other listeners once we decide what an edge really is
-    private EdgePortListener edgeListener = new InternalEdgeListener();
     private DeviceListener deviceListener = new InternalDeviceListener();
 
     private final ConfigFactory<ApplicationId, MefPortsConfig> configFactory =
@@ -172,7 +159,6 @@
         componentConfigService.registerProperties(getClass());
         configRegistry.registerConfigFactory(configFactory);
         networkConfigService.addListener(configListener);
-        //deviceService = opticalView(deviceService);
         portMap = storageService.<ConnectPoint, Long>consistentMapBuilder()
                 .withName(PORT_MAP)
                 .withSerializer(SERIALIZER)
@@ -187,7 +173,6 @@
 
         eventDispatcher.addSink(BigSwitchEvent.class, listenerRegistry);
         portCounter.compareAndSet(0, 1);
-       // edgePortService.addListener(edgeListener);
         deviceService.addListener(deviceListener);
         log.info("Started");
     }
@@ -196,7 +181,6 @@
     public void deactivate() {
         networkConfigService.removeListener(configListener);
         configRegistry.unregisterConfigFactory(configFactory);
-        //edgePortService.removeListener(edgeListener);
         deviceService.removeListener(deviceListener);
         componentConfigService.unregisterProperties(getClass(), false);
         log.info("Stopped");
@@ -206,33 +190,13 @@
     public void modified(ComponentContext context) {
         Dictionary<?, ?> properties = context != null ? context.getProperties() : new Properties();
 
-        boolean newEnabled;
-        String newSiteId;
-
-        try {
-            String s = get(properties, PROP_ENABLED);
-            newEnabled = isNullOrEmpty(s) || Boolean.parseBoolean(s.trim());
-
-            s = get(properties, DOMAIN_ID);
-            newSiteId = s;
-
-        } catch (NumberFormatException e) {
-            log.warn("Component configuration had invalid values", e);
-
-            newEnabled = enabled;
-            newSiteId = siteId;
+        String d = get(properties, DOMAIN_ID);
+        if (!Strings.isNullOrEmpty(d)) {
+            // TODO: signal new domain id to global
+            domainId = d;
         }
 
-        if (enabled && !newEnabled) {
-            disable();
-        } else if (!enabled && newEnabled) {
-            enable();
-        }
-        enabled = newEnabled;
-
-        // TODO: manage new site ID
-        siteId = newSiteId;
-        log.info("siteId {}", siteId);
+        log.info("Domain ID set to {}", domainId());
     }
 
     @Override
@@ -245,7 +209,7 @@
 
     @Override
     public PortNumber getPort(ConnectPoint port) {
-        // XXX error-check and seriously think about a better method definition.
+        // FIXME: error-check and seriously think about a better method definition.
         Versioned<Long> portNo = portMap.get(port);
         if (Versioned.valueOrNull(portNo) != null) {
             return PortNumber.portNumber(portNo.value());
@@ -264,9 +228,8 @@
     }
 
     @Override
-    public DomainId siteId() {
-        log.info("siteId {}", siteId);
-        return DomainId.domainId(siteId);
+    public DomainId domainId() {
+        return DomainId.domainId(domainId);
     }
 
     /**
@@ -284,7 +247,7 @@
         DefaultAnnotations.Builder annot = DefaultAnnotations.builder();
         p.annotations().keys()
                 .forEach(k -> annot.set(k, p.annotations().value(k)));
-        annot.set(DOMAIN_ID, siteId);
+        annot.set(DOMAIN_ID, domainId);
         // add annotation about underlying physical connect-point
         Device device = deviceService.getDevice(cp.deviceId());
         if (device.annotations().keys()
@@ -344,7 +307,7 @@
     private void readConfig() {
         mefPortConfigs = configRegistry.getConfig(appId, MefPortsConfig.class).mefPortConfigs();
 
-        if (enabled && mefPortConfigs != null) {
+        if (mefPortConfigs != null) {
             buildPorts();
             log.info("Notifying Bigswitch presence..");
             if (portMap.size() > 0) {
@@ -353,56 +316,6 @@
         }
     }
 
-    private void disable() {
-       // TODO
-    }
-
-    private void enable() {
-        if (mefPortConfigs != null && portMap.size() > 0) {
-            post(new BigSwitchEvent(BigSwitchEvent.Type.DEVICE_CREATED, null, getPorts()));
-        }
-    }
-
-
-    private class InternalEdgeListener implements EdgePortListener {
-        @Override
-        public boolean isRelevant(EdgePortEvent event) {
-            // Only listen for real devices
-            Device d = deviceService.getDevice(event.subject().deviceId());
-
-            return d != null && !d.type().equals(Device.Type.VIRTUAL) &&
-                    isPortRelevant(event.subject());
-        }
-
-        @Override
-        public void event(EdgePortEvent event) {
-            log.info("Edge event {} {}", event.subject(), event.type());
-            BigSwitchEvent.Type bigSwitchEvent;
-
-            switch (event.type()) {
-                case EDGE_PORT_ADDED:
-                    portMap.put(event.subject(), getVirtualPortNumber(event.subject()));
-                    bigSwitchEvent = BigSwitchEvent.Type.PORT_ADDED;
-                    break;
-                case EDGE_PORT_REMOVED:
-                    portMap.remove(event.subject());
-                    bigSwitchEvent = BigSwitchEvent.Type.PORT_REMOVED;
-                    break;
-                default:
-                    return;
-            }
-
-            if (mefPortConfigs != null) {
-                PortDescription descr;
-                descr = toVirtualPortDescription(event.subject());
-                if (descr != null) {
-                    post(new BigSwitchEvent(bigSwitchEvent, descr, getPorts()));
-                }
-            }
-        }
-    }
-
-
     private class InternalDeviceListener implements DeviceListener {
         @Override
         public boolean isRelevant(DeviceEvent event) {
diff --git a/local/bigswitch/src/main/java/org/opencord/ce/local/bigswitch/BigSwitchService.java b/local/bigswitch/src/main/java/org/opencord/ce/local/bigswitch/BigSwitchService.java
index 47880ff..172f2ee 100644
--- a/local/bigswitch/src/main/java/org/opencord/ce/local/bigswitch/BigSwitchService.java
+++ b/local/bigswitch/src/main/java/org/opencord/ce/local/bigswitch/BigSwitchService.java
@@ -54,10 +54,10 @@
     Optional<ConnectPoint> connectPointFromVirtPort(PortNumber portNumber);
 
     /**
-     * Returns the local site/domain ID of this biw switch.
+     * Returns the local domain ID of this bigswitch.
      *
-     * @return domain/site ID
+     * @return domain ID
      */
-    DomainId siteId();
+    DomainId domainId();
 }
 
