[WIP] Upgrade ONOS to karaf version 4.2.1

Change-Id: I7cd40c995bdf1c80f94b1895fb3344e32404c7fa
diff --git a/core/net/src/main/java/org/onosproject/cluster/impl/ClusterManager.java b/core/net/src/main/java/org/onosproject/cluster/impl/ClusterManager.java
index edbd1f7..240fa24 100644
--- a/core/net/src/main/java/org/onosproject/cluster/impl/ClusterManager.java
+++ b/core/net/src/main/java/org/onosproject/cluster/impl/ClusterManager.java
@@ -15,16 +15,6 @@
  */
 package org.onosproject.cluster.impl;
 
-import java.time.Instant;
-import java.util.Set;
-import java.util.concurrent.atomic.AtomicReference;
-
-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.apache.felix.scr.annotations.Service;
 import org.apache.karaf.system.SystemService;
 import org.onlab.packet.IpAddress;
 import org.onosproject.cluster.ClusterAdminService;
@@ -42,8 +32,17 @@
 import org.onosproject.cluster.NodeId;
 import org.onosproject.core.Version;
 import org.onosproject.event.AbstractListenerManager;
+import org.osgi.service.component.annotations.Activate;
+import org.osgi.service.component.annotations.Component;
+import org.osgi.service.component.annotations.Deactivate;
+import org.osgi.service.component.annotations.Reference;
+import org.osgi.service.component.annotations.ReferenceCardinality;
 import org.slf4j.Logger;
 
+import java.time.Instant;
+import java.util.Set;
+import java.util.concurrent.atomic.AtomicReference;
+
 import static com.google.common.base.Preconditions.checkArgument;
 import static com.google.common.base.Preconditions.checkNotNull;
 import static org.onosproject.security.AppGuard.checkPermission;
@@ -53,8 +52,7 @@
 /**
  * Implementation of the cluster service.
  */
-@Component(immediate = true)
-@Service
+@Component(immediate = true, service = {ClusterService.class, ClusterAdminService.class})
 public class ClusterManager
         extends AbstractListenerManager<ClusterEvent, ClusterEventListener>
         implements ClusterService, ClusterAdminService {
@@ -65,10 +63,10 @@
 
     private ClusterStoreDelegate delegate = new InternalStoreDelegate();
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected ClusterStore store;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected SystemService systemService;
 
     private final AtomicReference<ClusterMetadata> currentMetadata = new AtomicReference<>();
diff --git a/core/net/src/main/java/org/onosproject/cluster/impl/ClusterMetadataManager.java b/core/net/src/main/java/org/onosproject/cluster/impl/ClusterMetadataManager.java
index 7dbf139..b242a3c 100644
--- a/core/net/src/main/java/org/onosproject/cluster/impl/ClusterMetadataManager.java
+++ b/core/net/src/main/java/org/onosproject/cluster/impl/ClusterMetadataManager.java
@@ -15,20 +15,8 @@
  */
 package org.onosproject.cluster.impl;
 
-import java.net.Inet4Address;
-import java.net.InetAddress;
-import java.net.MalformedURLException;
-import java.net.NetworkInterface;
-import java.net.SocketException;
-import java.net.URL;
-import java.net.UnknownHostException;
-import java.util.Enumeration;
-
-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.Service;
 import org.onlab.packet.IpAddress;
+import org.onlab.util.Tools;
 import org.onosproject.cluster.ClusterMetadata;
 import org.onosproject.cluster.ClusterMetadataAdminService;
 import org.onosproject.cluster.ClusterMetadataEvent;
@@ -41,11 +29,26 @@
 import org.onosproject.cluster.DefaultControllerNode;
 import org.onosproject.cluster.NodeId;
 import org.onosproject.cluster.PartitionId;
+import org.onosproject.event.EventDeliveryService;
 import org.onosproject.net.provider.AbstractListenerProviderRegistry;
 import org.onosproject.net.provider.AbstractProviderService;
 import org.onosproject.store.service.Versioned;
+import org.osgi.service.component.annotations.Activate;
+import org.osgi.service.component.annotations.Component;
+import org.osgi.service.component.annotations.Deactivate;
+import org.osgi.service.component.annotations.Reference;
+import org.osgi.service.component.annotations.ReferenceCardinality;
 import org.slf4j.Logger;
 
+import java.net.Inet4Address;
+import java.net.InetAddress;
+import java.net.MalformedURLException;
+import java.net.NetworkInterface;
+import java.net.SocketException;
+import java.net.URL;
+import java.net.UnknownHostException;
+import java.util.Enumeration;
+
 import static com.google.common.base.Preconditions.checkNotNull;
 import static org.onosproject.security.AppGuard.checkPermission;
 import static org.onosproject.security.AppPermission.Type.CLUSTER_READ;
@@ -54,8 +57,7 @@
 /**
  * Implementation of ClusterMetadataService.
  */
-@Component(immediate = true)
-@Service
+@Component(immediate = true, service = {ClusterMetadataService.class, ClusterMetadataAdminService.class, ClusterMetadataProviderRegistry.class})
 public class ClusterMetadataManager
     extends AbstractListenerProviderRegistry<ClusterMetadataEvent,
                                              ClusterMetadataEventListener,
@@ -63,6 +65,9 @@
                                              ClusterMetadataProviderService>
     implements ClusterMetadataService, ClusterMetadataAdminService, ClusterMetadataProviderRegistry {
 
+    private static final int MAX_WAIT_TRIES = 600;
+    private static final int MAX_WAIT_MS = 100;
+
     private final Logger log = getLogger(getClass());
     private ControllerNode localNode;
 
@@ -82,10 +87,21 @@
     @Override
     public ClusterMetadata getClusterMetadata() {
         checkPermission(CLUSTER_READ);
+        waitForAvailableProvider();
         Versioned<ClusterMetadata> metadata = getProvider().getClusterMetadata();
         return metadata.value();
     }
 
+    // FIXME: Temporary hack to navigate around bootstrap timing issue
+    private void waitForAvailableProvider() {
+        for (int i = 0; i < MAX_WAIT_TRIES && getProvider() == null; i++) {
+            Tools.delay(MAX_WAIT_MS);
+        }
+        if (getProvider() == null) {
+            log.error("Unable to find cluster metadata provider");
+            throw new IllegalStateException("Unable to find cluster metadata provider");
+        }
+    }
 
     @Override
     protected ClusterMetadataProviderService createProviderService(
diff --git a/core/net/src/main/java/org/onosproject/cluster/impl/ComponentsMonitor.java b/core/net/src/main/java/org/onosproject/cluster/impl/ComponentsMonitor.java
index 063101e..7a0295e 100644
--- a/core/net/src/main/java/org/onosproject/cluster/impl/ComponentsMonitor.java
+++ b/core/net/src/main/java/org/onosproject/cluster/impl/ComponentsMonitor.java
@@ -16,12 +16,12 @@
 
 package org.onosproject.cluster.impl;
 
-import org.apache.felix.scr.Component;
-import org.apache.felix.scr.ScrService;
-import org.apache.felix.scr.annotations.Activate;
-import org.apache.felix.scr.annotations.Deactivate;
-import org.apache.felix.scr.annotations.Reference;
-import org.apache.felix.scr.annotations.ReferenceCardinality;
+import org.osgi.service.component.runtime.ServiceComponentRuntime;
+import org.osgi.service.component.annotations.Activate;
+import org.osgi.service.component.annotations.Component;
+import org.osgi.service.component.annotations.Deactivate;
+import org.osgi.service.component.annotations.Reference;
+import org.osgi.service.component.annotations.ReferenceCardinality;
 import org.apache.karaf.features.Feature;
 import org.apache.karaf.features.FeaturesService;
 import org.onlab.util.SharedScheduledExecutors;
@@ -29,6 +29,7 @@
 import org.osgi.framework.Bundle;
 import org.osgi.framework.BundleContext;
 import org.osgi.service.component.ComponentContext;
+import org.osgi.service.component.runtime.dto.ComponentDescriptionDTO;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -40,20 +41,20 @@
  * are properly activated and keeps the cluster node service appropriately
  * updated.
  */
-@org.apache.felix.scr.annotations.Component(immediate = true)
+@Component(immediate = true)
 public class ComponentsMonitor {
 
     private Logger log = LoggerFactory.getLogger(getClass());
 
     private static final long PERIOD = 2500;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected FeaturesService featuresService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
-    protected ScrService scrService;
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
+    protected ServiceComponentRuntime scrService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected ClusterAdminService clusterAdminService;
 
     private BundleContext bundleContext;
@@ -85,18 +86,22 @@
      * @return true if all bundles and their components are active
      */
     private boolean isFullyStarted() {
-        for (Feature feature : featuresService.listInstalledFeatures()) {
-            if (!isFullyStarted(feature)) {
-                return false;
+        try {
+            for (Feature feature : featuresService.listInstalledFeatures()) {
+                if (!isFullyStarted(feature)) {
+                    return false;
+                }
             }
+            return true;
+        } catch (Exception ex) {
+            return false;
         }
-        return true;
     }
 
     private boolean isFullyStarted(Feature feature) {
         try {
             return feature.getBundles().stream()
-                    .map(info -> bundleContext.getBundle(info.getLocation()))
+                    .map(info -> bundleContext.getBundle())
                     .allMatch(this::isFullyStarted);
         } catch (NullPointerException npe) {
             // FIXME: Remove this catch block when Felix fixes the bug
@@ -107,21 +112,12 @@
     }
 
     private boolean isFullyStarted(Bundle bundle) {
-        Component[] components = scrService.getComponents(bundle);
-        if (components != null) {
-            for (Component component : components) {
-                if (!isFullyStarted(component)) {
-                    return false;
-                }
+        for (ComponentDescriptionDTO component : scrService.getComponentDescriptionDTOs(bundle)) {
+            if (!scrService.isComponentEnabled(component)) {
+                return false;
             }
         }
         return true;
     }
 
-    private boolean isFullyStarted(Component component) {
-        int state = component.getState();
-        return state == Component.STATE_ACTIVE || state == Component.STATE_DISABLED ||
-                (state == Component.STATE_REGISTERED && !component.isImmediate());
-    }
-
 }
diff --git a/core/net/src/main/java/org/onosproject/cluster/impl/ConfigFileBasedClusterMetadataProvider.java b/core/net/src/main/java/org/onosproject/cluster/impl/ConfigFileBasedClusterMetadataProvider.java
index d5ef232..8cd2d13 100644
--- a/core/net/src/main/java/org/onosproject/cluster/impl/ConfigFileBasedClusterMetadataProvider.java
+++ b/core/net/src/main/java/org/onosproject/cluster/impl/ConfigFileBasedClusterMetadataProvider.java
@@ -30,11 +30,14 @@
 import com.fasterxml.jackson.databind.ObjectMapper;
 import com.google.common.collect.Sets;
 import com.google.common.io.Files;
-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.osgi.service.component.annotations.Activate;
+import org.osgi.service.component.annotations.Component;
+import org.osgi.service.component.annotations.Deactivate;
+import org.osgi.service.component.annotations.Reference;
+import org.osgi.service.component.annotations.ReferenceCardinality;
+import org.onlab.packet.IpAddress;
+
 import org.onosproject.cluster.ClusterMetadata;
 import org.onosproject.cluster.ClusterMetadataProvider;
 import org.onosproject.cluster.ClusterMetadataProviderRegistry;
@@ -64,7 +67,7 @@
     private static final String CONFIG_FILE_NAME = "cluster.json";
     private static final File CONFIG_FILE = new File(CONFIG_DIR, CONFIG_FILE_NAME);
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected ClusterMetadataProviderRegistry providerRegistry;
 
     private static final ProviderId PROVIDER_ID = new ProviderId("file", "none");
diff --git a/core/net/src/main/java/org/onosproject/cluster/impl/DefaultClusterMetadataProvider.java b/core/net/src/main/java/org/onosproject/cluster/impl/DefaultClusterMetadataProvider.java
index a6f24ae..153bd65 100644
--- a/core/net/src/main/java/org/onosproject/cluster/impl/DefaultClusterMetadataProvider.java
+++ b/core/net/src/main/java/org/onosproject/cluster/impl/DefaultClusterMetadataProvider.java
@@ -24,11 +24,11 @@
 import java.util.function.Function;
 
 import com.google.common.collect.ImmutableSet;
-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.osgi.service.component.annotations.Activate;
+import org.osgi.service.component.annotations.Component;
+import org.osgi.service.component.annotations.Deactivate;
+import org.osgi.service.component.annotations.Reference;
+import org.osgi.service.component.annotations.ReferenceCardinality;
 import org.onlab.packet.IpAddress;
 import org.onosproject.cluster.ClusterMetadata;
 import org.onosproject.cluster.ClusterMetadataProvider;
@@ -53,10 +53,10 @@
 
     private final Logger log = getLogger(getClass());
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected ClusterMetadataProviderRegistry providerRegistry;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected VersionService versionService;
 
     private static final String ONOS_IP = "ONOS_IP";
diff --git a/core/net/src/main/java/org/onosproject/cluster/impl/LeadershipManager.java b/core/net/src/main/java/org/onosproject/cluster/impl/LeadershipManager.java
index 07d8419..5d02b5d 100644
--- a/core/net/src/main/java/org/onosproject/cluster/impl/LeadershipManager.java
+++ b/core/net/src/main/java/org/onosproject/cluster/impl/LeadershipManager.java
@@ -15,18 +15,8 @@
  */
 package org.onosproject.cluster.impl;
 
-import static org.slf4j.LoggerFactory.getLogger;
-
-import java.util.Map;
-import java.util.Set;
-
 import com.google.common.base.Objects;
-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.apache.felix.scr.annotations.Service;
+import com.google.common.collect.Maps;
 import org.onosproject.cluster.ClusterService;
 import org.onosproject.cluster.Leadership;
 import org.onosproject.cluster.LeadershipAdminService;
@@ -37,15 +27,22 @@
 import org.onosproject.cluster.LeadershipStoreDelegate;
 import org.onosproject.cluster.NodeId;
 import org.onosproject.event.AbstractListenerManager;
+import org.osgi.service.component.annotations.Activate;
+import org.osgi.service.component.annotations.Component;
+import org.osgi.service.component.annotations.Deactivate;
+import org.osgi.service.component.annotations.Reference;
+import org.osgi.service.component.annotations.ReferenceCardinality;
 import org.slf4j.Logger;
 
-import com.google.common.collect.Maps;
+import java.util.Map;
+import java.util.Set;
+
+import static org.slf4j.LoggerFactory.getLogger;
 
 /**
  * Implementation of {@link LeadershipService} and {@link LeadershipAdminService}.
  */
-@Component(immediate = true)
-@Service
+@Component(immediate = true, service = {LeadershipService.class, LeadershipAdminService.class})
 public class LeadershipManager
     extends AbstractListenerManager<LeadershipEvent, LeadershipEventListener>
     implements LeadershipService, LeadershipAdminService {
@@ -54,10 +51,10 @@
 
     private LeadershipStoreDelegate delegate = this::post;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected ClusterService clusterService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected LeadershipStore store;
 
     private NodeId localNodeId;
diff --git a/core/net/src/main/java/org/onosproject/cluster/impl/MastershipManager.java b/core/net/src/main/java/org/onosproject/cluster/impl/MastershipManager.java
index 5dea660..369b65b 100644
--- a/core/net/src/main/java/org/onosproject/cluster/impl/MastershipManager.java
+++ b/core/net/src/main/java/org/onosproject/cluster/impl/MastershipManager.java
@@ -20,14 +20,6 @@
 import com.google.common.collect.Lists;
 import com.google.common.collect.Sets;
 import com.google.common.util.concurrent.Futures;
-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.Modified;
-import org.apache.felix.scr.annotations.Property;
-import org.apache.felix.scr.annotations.Reference;
-import org.apache.felix.scr.annotations.ReferenceCardinality;
-import org.apache.felix.scr.annotations.Service;
 import org.onlab.metrics.MetricsService;
 import org.onosproject.cfg.ComponentConfigService;
 import org.onosproject.cfg.ConfigProperty;
@@ -53,6 +45,12 @@
 import org.onosproject.upgrade.UpgradeEvent;
 import org.onosproject.upgrade.UpgradeEventListener;
 import org.onosproject.upgrade.UpgradeService;
+import org.osgi.service.component.annotations.Activate;
+import org.osgi.service.component.annotations.Component;
+import org.osgi.service.component.annotations.Deactivate;
+import org.osgi.service.component.annotations.Modified;
+import org.osgi.service.component.annotations.Reference;
+import org.osgi.service.component.annotations.ReferenceCardinality;
 import org.slf4j.Logger;
 
 import java.util.ArrayList;
@@ -82,8 +80,8 @@
 /**
  * Component providing the node-device mastership service.
  */
-@Component(immediate = true)
-@Service
+@Component(immediate = true, service = {MastershipService.class, MastershipAdminService.class, MastershipTermService.class,
+        MetricsHelper.class})
 public class MastershipManager
         extends AbstractListenerManager<MastershipEvent, MastershipListener>
         implements MastershipService, MastershipAdminService, MastershipTermService,
@@ -98,36 +96,36 @@
     private final MastershipStoreDelegate delegate = new InternalDelegate();
     private final UpgradeEventListener upgradeEventListener = new InternalUpgradeEventListener();
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected MastershipStore store;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected ClusterService clusterService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected MetricsService metricsService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected RegionService regionService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected ComponentConfigService cfgService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected UpgradeService upgradeService;
 
     private NodeId localNodeId;
     private Timer requestRoleTimer;
 
     static final boolean DEFAULT_USE_REGION_FOR_BALANCE_ROLES = false;
-    @Property(name = "useRegionForBalanceRoles", boolValue = DEFAULT_USE_REGION_FOR_BALANCE_ROLES,
-            label = "Use Regions for balancing roles")
+    //@Property(name = "useRegionForBalanceRoles", boolValue = DEFAULT_USE_REGION_FOR_BALANCE_ROLES,
+    //        label = "Use Regions for balancing roles")
     protected boolean useRegionForBalanceRoles;
 
     private static final boolean DEFAULT_REBALANCE_ROLES_ON_UPGRADE = true;
-    @Property(name = "rebalanceRolesOnUpgrade",
-            boolValue = DEFAULT_REBALANCE_ROLES_ON_UPGRADE,
-            label = "Automatically rebalance roles following an upgrade")
+    //@Property(name = "rebalanceRolesOnUpgrade",
+    //        boolValue = DEFAULT_REBALANCE_ROLES_ON_UPGRADE,
+    //        label = "Automatically rebalance roles following an upgrade")
     protected boolean rebalanceRolesOnUpgrade = DEFAULT_REBALANCE_ROLES_ON_UPGRADE;
 
     @Activate
@@ -146,9 +144,11 @@
     @Modified
     public void modified() {
         Set<ConfigProperty> configProperties = cfgService.getProperties(getClass().getCanonicalName());
-        for (ConfigProperty property : configProperties) {
-            if ("useRegionForBalanceRoles".equals(property.name())) {
-                useRegionForBalanceRoles = property.asBoolean();
+        if (configProperties != null) {
+            for (ConfigProperty property : configProperties) {
+                if ("useRegionForBalanceRoles".equals(property.name())) {
+                    useRegionForBalanceRoles = property.asBoolean();
+                }
             }
         }
     }
diff --git a/core/net/src/main/java/org/onosproject/cluster/impl/MastershipProxyManager.java b/core/net/src/main/java/org/onosproject/cluster/impl/MastershipProxyManager.java
index 96cbe3a..41f11d9 100644
--- a/core/net/src/main/java/org/onosproject/cluster/impl/MastershipProxyManager.java
+++ b/core/net/src/main/java/org/onosproject/cluster/impl/MastershipProxyManager.java
@@ -15,6 +15,27 @@
  */
 package org.onosproject.cluster.impl;
 
+import com.google.common.collect.ImmutableSet;
+import com.google.common.collect.Maps;
+import org.onlab.util.OrderedExecutor;
+import org.onlab.util.Tools;
+import org.onosproject.cluster.ClusterService;
+import org.onosproject.cluster.NodeId;
+import org.onosproject.mastership.MastershipProxyFactory;
+import org.onosproject.mastership.MastershipProxyService;
+import org.onosproject.mastership.MastershipService;
+import org.onosproject.net.DeviceId;
+import org.onosproject.store.cluster.messaging.ClusterCommunicationService;
+import org.onosproject.store.serializers.KryoNamespaces;
+import org.onosproject.store.service.Serializer;
+import org.osgi.service.component.annotations.Activate;
+import org.osgi.service.component.annotations.Component;
+import org.osgi.service.component.annotations.Deactivate;
+import org.osgi.service.component.annotations.Reference;
+import org.osgi.service.component.annotations.ReferenceCardinality;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
 import java.lang.reflect.Method;
 import java.lang.reflect.Proxy;
 import java.util.Map;
@@ -27,28 +48,6 @@
 import java.util.concurrent.Executors;
 import java.util.function.Function;
 
-import com.google.common.collect.ImmutableSet;
-import com.google.common.collect.Maps;
-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.apache.felix.scr.annotations.Service;
-import org.onlab.util.OrderedExecutor;
-import org.onlab.util.Tools;
-import org.onosproject.cluster.ClusterService;
-import org.onosproject.cluster.NodeId;
-import org.onosproject.mastership.MastershipProxyFactory;
-import org.onosproject.mastership.MastershipProxyService;
-import org.onosproject.mastership.MastershipService;
-import org.onosproject.net.DeviceId;
-import org.onosproject.store.cluster.messaging.ClusterCommunicationService;
-import org.onosproject.store.serializers.KryoNamespaces;
-import org.onosproject.store.service.Serializer;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
 import static com.google.common.base.Preconditions.checkArgument;
 import static org.onlab.util.Tools.groupedThreads;
 
@@ -58,8 +57,7 @@
  * This implementation wraps both the proxy service and the generated proxy instance in additional proxies which check
  * mastership and route calls to the appropriate proxy instances.
  */
-@Component(immediate = true)
-@Service
+@Component(immediate = true, service = MastershipProxyService.class)
 public class MastershipProxyManager extends AbstractProxyManager implements MastershipProxyService {
 
     private static final Serializer REQUEST_SERIALIZER =
@@ -68,13 +66,13 @@
 
     private final Logger log = LoggerFactory.getLogger(getClass());
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected MastershipService mastershipService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected ClusterService clusterService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected ClusterCommunicationService clusterCommunicator;
 
     private final ExecutorService proxyServiceExecutor =
diff --git a/core/net/src/main/java/org/onosproject/cluster/impl/MembershipManager.java b/core/net/src/main/java/org/onosproject/cluster/impl/MembershipManager.java
index 5daa03e..db125bf 100644
--- a/core/net/src/main/java/org/onosproject/cluster/impl/MembershipManager.java
+++ b/core/net/src/main/java/org/onosproject/cluster/impl/MembershipManager.java
@@ -15,21 +15,8 @@
  */
 package org.onosproject.cluster.impl;
 
-import java.util.Collection;
-import java.util.Map;
-import java.util.Objects;
-import java.util.Optional;
-import java.util.Set;
-import java.util.stream.Collectors;
-
 import com.google.common.collect.Maps;
 import com.google.common.collect.Sets;
-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.apache.felix.scr.annotations.Service;
 import org.onosproject.cluster.ClusterService;
 import org.onosproject.cluster.ControllerNode;
 import org.onosproject.cluster.Member;
@@ -37,20 +24,31 @@
 import org.onosproject.cluster.MembershipService;
 import org.onosproject.cluster.NodeId;
 import org.onosproject.core.Version;
+import org.osgi.service.component.annotations.Activate;
+import org.osgi.service.component.annotations.Component;
+import org.osgi.service.component.annotations.Deactivate;
+import org.osgi.service.component.annotations.Reference;
+import org.osgi.service.component.annotations.ReferenceCardinality;
 import org.slf4j.Logger;
 
+import java.util.Collection;
+import java.util.Map;
+import java.util.Objects;
+import java.util.Optional;
+import java.util.Set;
+import java.util.stream.Collectors;
+
 import static org.slf4j.LoggerFactory.getLogger;
 
 /**
  * Cluster membership manager.
  */
-@Component(immediate = true)
-@Service
+@Component(immediate = true, service = MembershipService.class)
 public class MembershipManager implements MembershipService {
 
     private final Logger log = getLogger(getClass());
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected ClusterService clusterService;
 
     private Member localMember;
diff --git a/core/net/src/main/java/org/onosproject/cluster/impl/ProxyManager.java b/core/net/src/main/java/org/onosproject/cluster/impl/ProxyManager.java
index 945172a..4ddca9f 100644
--- a/core/net/src/main/java/org/onosproject/cluster/impl/ProxyManager.java
+++ b/core/net/src/main/java/org/onosproject/cluster/impl/ProxyManager.java
@@ -15,6 +15,21 @@
  */
 package org.onosproject.cluster.impl;
 
+import com.google.common.collect.Maps;
+import org.onlab.util.OrderedExecutor;
+import org.onosproject.cluster.NodeId;
+import org.onosproject.cluster.ProxyFactory;
+import org.onosproject.cluster.ProxyService;
+import org.onosproject.store.cluster.messaging.ClusterCommunicationService;
+import org.onosproject.store.service.Serializer;
+import org.osgi.service.component.annotations.Activate;
+import org.osgi.service.component.annotations.Component;
+import org.osgi.service.component.annotations.Deactivate;
+import org.osgi.service.component.annotations.Reference;
+import org.osgi.service.component.annotations.ReferenceCardinality;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
 import java.lang.reflect.Method;
 import java.lang.reflect.Proxy;
 import java.util.Map;
@@ -25,37 +40,20 @@
 import java.util.concurrent.Executors;
 import java.util.function.Function;
 
-import com.google.common.collect.Maps;
-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.apache.felix.scr.annotations.Service;
-import org.onlab.util.OrderedExecutor;
-import org.onosproject.cluster.NodeId;
-import org.onosproject.cluster.ProxyFactory;
-import org.onosproject.cluster.ProxyService;
-import org.onosproject.store.cluster.messaging.ClusterCommunicationService;
-import org.onosproject.store.service.Serializer;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
 import static com.google.common.base.Preconditions.checkArgument;
 import static org.onlab.util.Tools.groupedThreads;
 
 /**
  * Implementation of the proxy service.
  */
-@Component(immediate = true)
-@Service
+@Component(immediate = true, service = ProxyService.class)
 public class ProxyManager extends AbstractProxyManager implements ProxyService {
 
     private final Logger log = LoggerFactory.getLogger(getClass());
 
     private static final String MESSAGE_PREFIX = "proxy";
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected ClusterCommunicationService clusterCommunicator;
 
     private final ExecutorService proxyServiceExecutor =