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();
 }
 
diff --git a/local/ce-central-office/pom.xml b/local/ce-central-office/pom.xml
index d8536e7..108623f 100644
--- a/local/ce-central-office/pom.xml
+++ b/local/ce-central-office/pom.xml
@@ -32,7 +32,7 @@
 
     <properties>
         <onos.app.name>org.opencord.ce.local.co</onos.app.name>
-        <onos.version>1.10.0</onos.version>
+        <onos.version>1.10.6</onos.version>
         <onos.app.title>ECORD Central-Office Fabric config</onos.app.title>
         <onos.app.url>http://opencord.org</onos.app.url>
     </properties>
@@ -54,6 +54,14 @@
         </plugins>
     </build>
 
+    <dependencies>
+        <dependency>
+            <groupId>com.google.code.gson</groupId>
+            <artifactId>gson</artifactId>
+            <version>2.6.2</version>
+        </dependency>
+    </dependencies>
+
     <repositories>
         <repository>
             <id>snapshots</id>
diff --git a/local/http-channel/src/main/java/org/opencord/ce/local/channel/client/HttpClientComponent.java b/local/http-channel/src/main/java/org/opencord/ce/local/channel/client/HttpClientComponent.java
index 17cfa4e..44227af 100644
--- a/local/http-channel/src/main/java/org/opencord/ce/local/channel/client/HttpClientComponent.java
+++ b/local/http-channel/src/main/java/org/opencord/ce/local/channel/client/HttpClientComponent.java
@@ -135,14 +135,14 @@
             switch (event.type()) {
                 case DEVICE_CREATED:
                     log.info("DEBUG: DEV_CREATED event");
-                    HttpClientInstance.INSTANCE.notifyBigSwitch(bigSwitchService.siteId());
+                    HttpClientInstance.INSTANCE.notifyBigSwitch(bigSwitchService.domainId());
                 case PORT_ADDED:
                 case PORT_UPDATED:
                 case PORT_REMOVED:
                     // the subject is port last updated / added port
                     // but we are not interested in it now
                     List<PortDescription> ports = event.allPorts();
-                    HttpClientInstance.INSTANCE.notifyBigSwitchPorts(bigSwitchService.siteId(), ports);
+                    HttpClientInstance.INSTANCE.notifyBigSwitchPorts(bigSwitchService.domainId(), ports);
                     break;
                 case DEVICE_REMOVED:
                     // TODO
