Merge branch 'master' into dev-karaf-4.2.1

Change-Id: I32f624941b0ac6725786166a932f2be39cb6a2f0
diff --git a/.bazelrc b/.bazelrc
index 3a1c95b..3bd8166 100644
--- a/.bazelrc
+++ b/.bazelrc
@@ -3,10 +3,6 @@
 test --test_summary=terse
 test --test_output=errors
 test --test_verbose_timeout_warnings
-build --host_javabase=@local_jdk//:jdk
-build --javabase=@local_jdk//:jdk
-build --java_toolchain=@bazel_tools//tools/jdk:toolchain_hostjdk8
-build --host_javabase=@local_jdk//:jdk
-build --distinct_host_configuration=false
+
 #build --disk_cache=~/bazel-cache
 #build --remote_http_cache=http://10.1.10.224:80/cache
diff --git a/.buckconfig b/.buckconfig
deleted file mode 100644
index 3c88483..0000000
--- a/.buckconfig
+++ /dev/null
@@ -1,23 +0,0 @@
-[buildfile]
-  includes = //buck-tools/default.defs
-
-[plugins]
-  directory = //bin/plugins
-
-[java]
-  source_level = 8
-  target_level = 8
-
-[alias]
-    onos = //tools/package:onos-package
-    onos-local = //tools/package:onos-run
-
-[download]
-  in_build = true
-
-[maven_repositories]
-  central = https://repo1.maven.org/maven2
-
-[project]
-  ide = intellij
-  ignore = .git, bazel-bin, bazel-genfiles, bazel-onos-next, bazel-out, bazel-testlogs
diff --git a/.dockerignore b/.dockerignore
index 05151e2..bd28f8b 100644
--- a/.dockerignore
+++ b/.dockerignore
@@ -5,11 +5,6 @@
 **/.idea
 .javacp*
 
-.buckd
-buck-out
-bucklets/plugins
-bin
-
 web/gui/src/main/webapp/tests/node_modules
 web/gui/src/test/_karma/node_modules
 web/gui/src/main/webapp/node_modules
diff --git a/.gitreview b/.gitreview
index 328aec6..b86ceb3 100644
--- a/.gitreview
+++ b/.gitreview
@@ -3,4 +3,4 @@
 port=29418
 project=onos.git
 defaultremote=origin
-defaultbranch=master
+defaultbranch=dev-karaf-4.2.1
diff --git a/BUCK b/BUCK
deleted file mode 100644
index 9b02eb6..0000000
--- a/BUCK
+++ /dev/null
@@ -1,75 +0,0 @@
-java_library(
-    name = 'core',
-    visibility = ['PUBLIC'],
-    deps = CORE,
-)
-
-java_library(
-    name = 'apps',
-    visibility = ['PUBLIC'],
-    deps = APPS + APP_JARS,
-)
-
-java_library(
-    name = 'onos',
-    visibility = ['PUBLIC'],
-    deps = [ ':core', ':apps' ]
-)
-
-INSTALL = [
-    '//utils/misc:onlab-misc-install',
-    '//utils/osgi:onlab-osgi-install',
-    '//utils/rest:onlab-rest-install',
-
-    '//core/api:onos-api-install',
-    '//incubator/api:onos-incubator-api-install',
-
-    '//core/net:onos-core-net-install',
-    '//core/common:onos-core-common-install',
-    '//core/store/dist:onos-core-dist-install',
-    '//core/store/primitives:onos-core-primitives-install',
-    '//core/store/persistence:onos-core-persistence-install',
-    '//core/store/serializers:onos-core-serializers-install',
-
-    '//incubator/net:onos-incubator-net-install',
-    '//incubator/store:onos-incubator-store-install',
-    '//incubator/rpc:onos-incubator-rpc-install',
-
-    '//core/security:onos-security-install',
-
-    '//web/api:onos-rest-install',
-    '//web/gui:onos-gui-install',
-    '//cli:onos-cli-install',
-]
-java_library(
-    name = 'install',
-    visibility = ['PUBLIC'],
-    deps = INSTALL
-)
-
-tar_file(
-    name = 'onos-test',
-    root = 'onos-test-%s' % ONOS_VERSION,
-    srcs = glob(['tools/test/**/*']) + [
-               'tools/dev/bash_profile',
-               'tools/dev/bin/onos-create-app',
-               'tools/build/envDefaults'
-           ],
-    other_tars = [ '//tools/package:onos-package-runtime' ],
-)
-
-tar_file(
-    name = 'onos-admin',
-    root = 'onos-admin-%s' % ONOS_VERSION,
-    srcs = [
-        'tools/dev/bin/onos-create-app',
-        'tools/test/bin/onos',
-    ],
-    other_tars = [ '//tools/package:onos-package-runtime' ],
-    flat = True,
-)
-
-
-
-
-
diff --git a/BUILD b/BUILD
index 18d867b..dd60f38 100644
--- a/BUILD
+++ b/BUILD
@@ -1,5 +1,5 @@
-load("//tools/build/bazel:generate_workspace.bzl", "ONOS_VERSION")
-load(":modules.bzl", "APPS", "CORE", "FEATURES")
+load("//tools/build/bazel:variables.bzl", "ONOS_VERSION")
+load("//tools/build/bazel:modules.bzl", "APPS", "CORE", "FEATURES")
 
 filegroup(
     name = "onos",
@@ -14,8 +14,6 @@
 
 KARAF = "@apache_karaf//:apache_karaf"
 
-PATCHES = "@apache_karaf_patches//:apache_karaf_patches"
-
 BRANDING = "//tools/package/branding:onos-tools-package-branding"
 
 # Generates auxiliary karaf.zip file; branded and augmented with ONOS runtime tools
@@ -23,7 +21,6 @@
     name = "onos-karaf",
     srcs = [
         KARAF,
-        PATCHES,
         BRANDING,
     ] + glob([
         "tools/package/bin/*",
@@ -32,8 +29,8 @@
         "tools/package/runtime/bin/*",
     ]),
     outs = ["karaf.zip"],
-    cmd = "$(location tools/package/onos-prep-karaf) $(location karaf.zip) $(location %s) %s $(location %s) $(location %s) tools/package" %
-          (KARAF, ONOS_VERSION, BRANDING, PATCHES),
+    cmd = "$(location tools/package/onos-prep-karaf) $(location karaf.zip) $(location %s) %s $(location %s) '' tools/package" %
+          (KARAF, ONOS_VERSION, BRANDING),
     tools = ["tools/package/onos-prep-karaf"],
 )
 
diff --git a/Jenkinsfile b/Jenkinsfile
deleted file mode 100644
index 11b889a..0000000
--- a/Jenkinsfile
+++ /dev/null
@@ -1,54 +0,0 @@
-#!groovy
-
-pipeline {
-
-    agent any
-
-    stages {
-        stage('pull') {
-            steps {
-                git url: 'https://gerrit.onosproject.org/onos'
-            }
-        }
-
-        stage('build') {
-            steps {
-                sh '''#!/bin/bash -l
-                    ONOS_ROOT=`pwd`
-                    source tools/build/envDefaults
-                    onos-buck build onos
-                '''
-            }
-        }
-
-        stage('test') {
-            steps {
-                parallel (
-                    "unit-tests": {
-                        sh '''#!/bin/bash -l
-                            ONOS_ROOT=`pwd`
-                            source tools/build/envDefaults
-                            onos-buck test
-                        '''
-                    },
-                    "javadocs": {
-                        sh '''#!/bin/bash -l
-                            ONOS_ROOT=`pwd`
-                            source tools/build/envDefaults
-                            onos-buck build //docs:external //docs:internal --show-output
-                        '''
-                    },
-                    "docker-image": {
-                        sh '''#!/bin/bash -l
-                            ONOS_ROOT=`pwd`
-                            source tools/build/envDefaults
-                            docker build -t onosproject/onos-test-docker .
-                        '''
-                    },
-                )
-            }
-        }
-    }
-
-}
-
diff --git a/apps/acl/BUCK b/apps/acl/BUCK
deleted file mode 100644
index bbe0f16..0000000
--- a/apps/acl/BUCK
+++ /dev/null
@@ -1,30 +0,0 @@
-COMPILE_DEPS = [
-    '//lib:CORE_DEPS',
-    '//lib:JACKSON',
-    '//lib:KRYO',
-    '//lib:javax.ws.rs-api',
-    '//utils/rest:onlab-rest',
-    '//core/store/serializers:onos-core-serializers',
-]
-
-TEST_DEPS = [
-    '//lib:TEST_REST',
-    '//lib:jersey-server',
-]
-
-osgi_jar_with_tests (
-    deps = COMPILE_DEPS,
-    test_deps = TEST_DEPS,
-    web_context = '/onos/v1/acl',
-    api_title = 'ACL API',
-    api_version = '1.0',
-    api_description = 'REST API for ACL app',
-    api_package = 'org.onosproject.acl',
-)
-
-onos_app (
-    title = 'Access Control Lists',
-    category = 'Security',
-    url = 'http://onosproject.org',
-    description = 'ONOS ACL application.',
-)
diff --git a/apps/acl/src/main/java/org/onosproject/acl/impl/AclManager.java b/apps/acl/src/main/java/org/onosproject/acl/impl/AclManager.java
index d7e7748..8b39661 100644
--- a/apps/acl/src/main/java/org/onosproject/acl/impl/AclManager.java
+++ b/apps/acl/src/main/java/org/onosproject/acl/impl/AclManager.java
@@ -29,12 +29,6 @@
 import org.onosproject.acl.AclRule;
 import org.onosproject.acl.AclService;
 import org.onosproject.acl.AclStore;
-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.acl.RuleId;
 import org.onosproject.core.ApplicationId;
 import org.onosproject.core.CoreService;
@@ -56,6 +50,11 @@
 import org.onosproject.net.host.HostEvent;
 import org.onosproject.net.host.HostListener;
 import org.onosproject.net.host.HostService;
+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.HashSet;
@@ -67,20 +66,19 @@
 /**
  * Implementation of the ACL service.
  */
-@Component(immediate = true)
-@Service
+@Component(immediate = true, service = AclService.class)
 public class AclManager implements AclService {
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected CoreService coreService;
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected FlowRuleService flowRuleService;
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected HostService hostService;
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected MastershipService mastershipService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected AclStore aclStore;
 
     private final Logger log = getLogger(getClass());
diff --git a/apps/acl/src/main/java/org/onosproject/acl/impl/DistributedAclStore.java b/apps/acl/src/main/java/org/onosproject/acl/impl/DistributedAclStore.java
index e37d30c..0dbb718 100644
--- a/apps/acl/src/main/java/org/onosproject/acl/impl/DistributedAclStore.java
+++ b/apps/acl/src/main/java/org/onosproject/acl/impl/DistributedAclStore.java
@@ -21,15 +21,9 @@
 package org.onosproject.acl.impl;
 
 import com.google.common.collect.Collections2;
+import org.onlab.util.KryoNamespace;
 import org.onosproject.acl.AclRule;
 import org.onosproject.acl.AclStore;
-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.KryoNamespace;
 import org.onosproject.acl.RuleId;
 import org.onosproject.core.ApplicationId;
 import org.onosproject.core.CoreService;
@@ -41,6 +35,11 @@
 import org.onosproject.store.service.Serializer;
 import org.onosproject.store.service.StorageService;
 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.util.ArrayList;
@@ -53,8 +52,7 @@
 /**
  * Implementation of the ACL store service.
  */
-@Component(immediate = true)
-@Service
+@Component(immediate = true, service = AclStore.class)
 public class DistributedAclStore extends AbstractStore implements AclStore {
 
     private final Logger log = getLogger(getClass());
@@ -66,9 +64,9 @@
     private ConsistentMap<RuleId, Set<FlowRule>> ruleToFlow;
     private ConsistentMap<RuleId, List<RuleId>> denyRuleToAllowRule;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected StorageService storageService;
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected CoreService coreService;
 
     @Activate
diff --git a/apps/actn-mdsc/BUCK b/apps/actn-mdsc/BUCK
deleted file mode 100644
index 0961e47..0000000
--- a/apps/actn-mdsc/BUCK
+++ /dev/null
@@ -1,15 +0,0 @@
-BUNDLES = [
-    '//apps/tetunnel/api:onos-apps-tetunnel-api',
-    '//apps/tetopology/api:onos-apps-tetopology-api',
-    '//apps/actn-mdsc/tetunnel-ctl:onos-apps-actn-mdsc-tetunnel-ctl',
-    '//apps/actn-mdsc/tetunnel-pce:onos-apps-actn-mdsc-tetunnel-pce',
-]
-
-onos_app (
-    title = 'ACTN MDSC',
-    category = 'Traffic Engineering',
-    url = 'http://onosproject.org',
-    included_bundles = BUNDLES,
-    description = 'ACTN MDSC APP.',
-)
-
diff --git a/apps/actn-mdsc/actn-mdscapp/app.xml b/apps/actn-mdsc/actn-mdscapp/app.xml
deleted file mode 100644
index 575ea64..0000000
--- a/apps/actn-mdsc/actn-mdscapp/app.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-  ~ Copyright 2016-present Open Networking Foundation
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~     http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License.
-  -->
-<app name="org.onosproject.actn.mdsc" origin="Huawei" version="${project.version}"
-     category="default" url="http://onosproject.org" title="ACTN MDSC App"
-     featuresRepo="mvn:${project.groupId}/${project.artifactId}/${project.version}/xml/features"
-     features="${project.artifactId}">
-    <description>${project.description}</description>
-    <artifact>mvn:${project.groupId}/onos-actn-mdsc-tetunnel-pce/${project.version}</artifact>
-    <artifact>mvn:${project.groupId}/onos-actn-mdsc-tetunnel-ctl/${project.version}</artifact>
-    <apps>org.onosproject.tetopology, org.onosproject.tetunnel</apps>
-</app>
diff --git a/apps/actn-mdsc/actn-mdscapp/features.xml b/apps/actn-mdsc/actn-mdscapp/features.xml
deleted file mode 100644
index 7466bc9..0000000
--- a/apps/actn-mdsc/actn-mdscapp/features.xml
+++ /dev/null
@@ -1,26 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
-<!--
-  ~ Copyright 2016-present Open Networking Foundation
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~     http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License.
-  -->
-<features xmlns="http://karaf.apache.org/xmlns/features/v1.2.0" name="${project.artifactId}-${project.version}">
-    <feature name="${project.artifactId}" version="${project.version}"
-             description="${project.description}">
-        <feature>onos-api</feature>
-        <feature>onos-apps-tetopology-app</feature>
-        <feature>onos-apps-tetunnel-app</feature>
-        <bundle>mvn:${project.groupId}/onos-actn-mdsc-tetunnel-pce/${project.version}</bundle>
-        <bundle>mvn:${project.groupId}/onos-actn-mdsc-tetunnel-ctl/${project.version}</bundle>
-    </feature>
-</features>
diff --git a/apps/actn-mdsc/tetunnel-ctl/BUCK b/apps/actn-mdsc/tetunnel-ctl/BUCK
deleted file mode 100644
index 5cf5a66..0000000
--- a/apps/actn-mdsc/tetunnel-ctl/BUCK
+++ /dev/null
@@ -1,17 +0,0 @@
-COMPILE_DEPS = [
-    '//lib:CORE_DEPS',
-    '//apps/tetunnel/api:onos-apps-tetunnel-api',
-    '//apps/actn-mdsc/tetunnel-pce:onos-apps-actn-mdsc-tetunnel-pce',
-    '//apps/tetopology/api:onos-apps-tetopology-api',
-    '//incubator/api:onos-incubator-api'
- ]
-
-TEST_DEPS = [
-    '//lib:TEST_ADAPTERS',
-]
-
-osgi_jar_with_tests (
-    deps = COMPILE_DEPS,
-    test_deps = TEST_DEPS,
-)
-
diff --git a/apps/actn-mdsc/tetunnel-ctl/src/main/java/org/onosproject/actn/mdsc/tetunnelctl/TeTunnelCtl.java b/apps/actn-mdsc/tetunnel-ctl/src/main/java/org/onosproject/actn/mdsc/tetunnelctl/TeTunnelCtl.java
index 77961ed..c725a01 100644
--- a/apps/actn-mdsc/tetunnel-ctl/src/main/java/org/onosproject/actn/mdsc/tetunnelctl/TeTunnelCtl.java
+++ b/apps/actn-mdsc/tetunnel-ctl/src/main/java/org/onosproject/actn/mdsc/tetunnelctl/TeTunnelCtl.java
@@ -16,11 +16,11 @@
 package org.onosproject.actn.mdsc.tetunnelctl;
 
 import com.google.common.collect.Lists;
-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.onosproject.actn.mdsc.pce.TeTunnelPceService;
 import org.onosproject.incubator.net.tunnel.Tunnel;
 import org.onosproject.incubator.net.tunnel.TunnelAdminService;
@@ -63,22 +63,22 @@
 
     private final TunnelListener tunnelListener = new InternalTunnelListener();
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected TunnelService tunnelService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected TunnelAdminService tunnelAdminService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected TeTunnelService teTunnelService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected TeTunnelAdminService teTunnelAdminService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected TeTopologyService teTopologyService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected TeTunnelPceService teTunnelPceService;
 
     @Activate
diff --git a/apps/actn-mdsc/tetunnel-pce/BUCK b/apps/actn-mdsc/tetunnel-pce/BUCK
deleted file mode 100644
index a040010..0000000
--- a/apps/actn-mdsc/tetunnel-pce/BUCK
+++ /dev/null
@@ -1,15 +0,0 @@
-COMPILE_DEPS = [
-    '//lib:CORE_DEPS',
-    '//apps/tetunnel/api:onos-apps-tetunnel-api',
-
- ]
-
-TEST_DEPS = [
-    '//lib:TEST_ADAPTERS',
-]
-
-osgi_jar_with_tests (
-    deps = COMPILE_DEPS,
-    test_deps = TEST_DEPS,
-)
-
diff --git a/apps/actn-mdsc/tetunnel-pce/src/main/java/org/onosproject/actn/mdsc/pce/impl/TeTunnelPceManager.java b/apps/actn-mdsc/tetunnel-pce/src/main/java/org/onosproject/actn/mdsc/pce/impl/TeTunnelPceManager.java
index b0efe80..a87aaa9 100644
--- a/apps/actn-mdsc/tetunnel-pce/src/main/java/org/onosproject/actn/mdsc/pce/impl/TeTunnelPceManager.java
+++ b/apps/actn-mdsc/tetunnel-pce/src/main/java/org/onosproject/actn/mdsc/pce/impl/TeTunnelPceManager.java
@@ -18,10 +18,9 @@
 
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.Lists;
-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.osgi.service.component.annotations.Activate;
+import org.osgi.service.component.annotations.Component;
+import org.osgi.service.component.annotations.Deactivate;
 import org.onosproject.actn.mdsc.pce.TeTunnelPce;
 import org.onosproject.actn.mdsc.pce.TeTunnelPceService;
 import org.onosproject.tetunnel.api.tunnel.TeTunnel;
@@ -35,8 +34,7 @@
 /**
  * Implementation of Te Tunnel PCE service.
  */
-@Component(immediate = true)
-@Service
+@Component(immediate = true, service = TeTunnelPceService.class)
 public class TeTunnelPceManager implements TeTunnelPceService {
 
     private static final Logger log = getLogger(TeTunnelPceManager.class);
diff --git a/apps/artemis/BUCK b/apps/artemis/BUCK
deleted file mode 100755
index 450f73e..0000000
--- a/apps/artemis/BUCK
+++ /dev/null
@@ -1,100 +0,0 @@
-COMPILE_DEPS = [
-    '//lib:CORE_DEPS',
-    '//lib:JACKSON',
-    '//lib:NETTY',
-    '//lib:io_netty_netty',
-    '//lib:io_netty_netty_transport',
-    '//lib:org.apache.karaf.shell.console',
-    '//cli:onos-cli',
-    '//apps/routing-api:onos-apps-routing-api',
-    '//apps/routing/common:onos-apps-routing-common',
-    '//protocols/ovsdb/api:onos-protocols-ovsdb-api',
-    '//apps/intentsync:onos-apps-intentsync',
-    '//apps/route-service/api:onos-apps-route-service-api',
-    '//protocols/ovsdb/rfc:onos-protocols-ovsdb-rfc',
-    '//lib:okhttp',
-    '//lib:okio',
-    ':commons-net',
-    ':io.socket-client',
-    ':json',
-    ':engine.io-client'
- ]
-
-BUNDLES = [
-    '//apps/artemis:onos-apps-artemis',
-    '//apps/routing-api:onos-apps-routing-api',
-    '//apps/routing/common:onos-apps-routing-common',
-    '//protocols/ovsdb/api:onos-protocols-ovsdb-api',
-    '//apps/route-service/api:onos-apps-route-service-api',
-    '//protocols/ovsdb/rfc:onos-protocols-ovsdb-rfc'
-]
-
-TEST_DEPS = [
-    '//lib:TEST_ADAPTERS'
-]
-
-EXCLUDED_BUNDLES = [
-    '//lib:okhttp',
-    '//lib:okio',
-    ':commons-net',
-    ':io.socket-client',
-    ':json',
-    ':engine.io-client'
-]
-
-osgi_jar_with_tests (
-    deps = COMPILE_DEPS,
-    test_deps = TEST_DEPS,
-)
-
-onos_app (
-    app_name = 'org.onosproject.artemis',
-    title = 'Artemis',
-    category = 'Monitoring',
-    url = 'http://onosproject.org',
-    description = 'Artemis',
-    included_bundles = BUNDLES,
-    excluded_bundles = EXCLUDED_BUNDLES,
-    required_apps = [
-        'org.onosproject.sdnip',
-        'org.onosproject.openflow',
-        'org.onosproject.ovsdb',
-        'org.onosproject.drivers.ovsdb'
-    ],
-)
-
-remote_jar (
-  name = 'commons-net',
-  out = 'commons-net-3.5.jar',
-  url = 'mvn:commons-net:commons-net:jar:3.5',
-  sha1 = '342fc284019f590e1308056990fdb24a08f06318',
-  maven_coords = 'commons-net:commons-net:3.5',
-  visibility = [ 'PUBLIC' ],
-)
-
-remote_jar (
-  name = 'io.socket-client',
-  out = 'socket.io-client-0.8.3.jar',
-  url = 'mvn:io.socket:socket.io-client:jar:0.8.3',
-  sha1 = 'b30500232ff0668a47c9f91f02e6935457a52fb5',
-  maven_coords = 'io.socket:socket.io-client:jar:NON-OSGI:0.8.3',
-  visibility = [ 'PUBLIC' ],
-)
-
-remote_jar (
-  name = 'json',
-  out = 'json-20090211.jar',
-  url = 'mvn:org.json:json:jar:20090211',
-  sha1 = 'c183aa3a2a6250293808bba12262c8920ce5a51c',
-  maven_coords = 'org.json:json:jar:NON-OSGI:20090211',
-  visibility = [ 'PUBLIC' ],
-)
-
-remote_jar (
-  name = 'engine.io-client',
-  out = 'engine.io-client-0.8.3.jar',
-  url = 'mvn:io.socket:engine.io-client:jar:0.8.3',
-  sha1 = '854b49396e1e9f9bb0ab025062ddb49c4ed65ca1',
-  maven_coords = 'io.socket:engine.io-client:jar:NON-OSGI:0.8.3',
-  visibility = [ 'PUBLIC' ],
-)
\ No newline at end of file
diff --git a/apps/artemis/src/main/java/org/onosproject/artemis/impl/ArtemisDeaggregatorImpl.java b/apps/artemis/src/main/java/org/onosproject/artemis/impl/ArtemisDeaggregatorImpl.java
index d9141f4..a26ae30 100644
--- a/apps/artemis/src/main/java/org/onosproject/artemis/impl/ArtemisDeaggregatorImpl.java
+++ b/apps/artemis/src/main/java/org/onosproject/artemis/impl/ArtemisDeaggregatorImpl.java
@@ -23,12 +23,6 @@
 import io.netty.buffer.Unpooled;
 import io.netty.channel.ChannelHandlerContext;
 import io.netty.util.CharsetUtil;
-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.json.JSONObject;
 import org.onlab.packet.IpAddress;
 import org.onlab.packet.IpPrefix;
@@ -65,6 +59,11 @@
 import org.onosproject.ovsdb.controller.OvsdbController;
 import org.onosproject.ovsdb.controller.OvsdbInterface;
 import org.onosproject.routing.bgp.BgpInfoService;
+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;
 
@@ -74,36 +73,35 @@
 
 import static org.onlab.packet.Ethernet.TYPE_IPV4;
 
-@Component(immediate = true)
-@Service
+@Component(immediate = true, service = ArtemisDeaggregator.class)
 public class ArtemisDeaggregatorImpl implements ArtemisDeaggregator {
 
     private final Logger log = LoggerFactory.getLogger(getClass());
     private static final int PRIORITY = 1000;
 
     /* Services */
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     private BgpInfoService bgpInfoService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     private ArtemisService artemisService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     private OvsdbController ovsdbController;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     private DeviceService deviceService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     private InterfaceService interfaceService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     private FlowObjectiveService flowObjectiveService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     private FlowRuleService flowRuleService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     private CoreService coreService;
 
     /* Variables */
diff --git a/apps/artemis/src/main/java/org/onosproject/artemis/impl/ArtemisDetectorImpl.java b/apps/artemis/src/main/java/org/onosproject/artemis/impl/ArtemisDetectorImpl.java
index 09a8d2c..02f9cd2 100644
--- a/apps/artemis/src/main/java/org/onosproject/artemis/impl/ArtemisDetectorImpl.java
+++ b/apps/artemis/src/main/java/org/onosproject/artemis/impl/ArtemisDetectorImpl.java
@@ -17,12 +17,6 @@
 package org.onosproject.artemis.impl;
 
 import org.apache.commons.lang.exception.ExceptionUtils;
-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.json.JSONArray;
 import org.json.JSONException;
 import org.json.JSONObject;
@@ -32,22 +26,26 @@
 import org.onosproject.artemis.ArtemisService;
 import org.onosproject.core.CoreService;
 import org.onosproject.event.EventDeliveryService;
+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;
 
-@Component(immediate = true)
-@Service
+@Component(immediate = true, service = ArtemisDetector.class)
 public class ArtemisDetectorImpl implements ArtemisDetector {
     private final Logger log = LoggerFactory.getLogger(getClass());
 
     /* Services */
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     private CoreService coreService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     private ArtemisService artemisService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected EventDeliveryService eventDispatcher;
 
     private final ArtemisEventListener artemisEventListener = this::handleArtemisEvent;
diff --git a/apps/artemis/src/main/java/org/onosproject/artemis/impl/ArtemisManager.java b/apps/artemis/src/main/java/org/onosproject/artemis/impl/ArtemisManager.java
index c714b05..a0872e5 100644
--- a/apps/artemis/src/main/java/org/onosproject/artemis/impl/ArtemisManager.java
+++ b/apps/artemis/src/main/java/org/onosproject/artemis/impl/ArtemisManager.java
@@ -16,12 +16,6 @@
 
 package org.onosproject.artemis.impl;
 
-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.artemis.ArtemisEventListener;
 import org.onosproject.artemis.ArtemisService;
 import org.onosproject.core.ApplicationId;
@@ -33,13 +27,17 @@
 import org.onosproject.net.config.NetworkConfigRegistry;
 import org.onosproject.net.config.NetworkConfigService;
 import org.onosproject.net.config.basics.SubjectFactories;
+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.util.Optional;
 
-@Component(immediate = true)
-@Service
+@Component(immediate = true, service = ArtemisService.class)
 public class ArtemisManager
         extends AbstractListenerManager<ArtemisEvent, ArtemisEventListener>
         implements ArtemisService {
@@ -51,13 +49,13 @@
     private final InternalNetworkConfigListener configListener =
             new InternalNetworkConfigListener();
     /* Services */
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     private NetworkConfigRegistry registry;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     private NetworkConfigService configService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     private CoreService coreService;
 
     /* Variables */
diff --git a/apps/artemis/src/main/java/org/onosproject/artemis/impl/ArtemisMonitorImpl.java b/apps/artemis/src/main/java/org/onosproject/artemis/impl/ArtemisMonitorImpl.java
index 1f4d757..b050448 100755
--- a/apps/artemis/src/main/java/org/onosproject/artemis/impl/ArtemisMonitorImpl.java
+++ b/apps/artemis/src/main/java/org/onosproject/artemis/impl/ArtemisMonitorImpl.java
@@ -17,12 +17,6 @@
 
 import com.google.common.collect.Sets;
 import io.netty.channel.ChannelHandlerContext;
-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.json.JSONObject;
 import org.onlab.packet.IpPrefix;
 import org.onosproject.artemis.ArtemisMonitor;
@@ -32,6 +26,11 @@
 import org.onosproject.net.config.NetworkConfigEvent;
 import org.onosproject.net.config.NetworkConfigListener;
 import org.onosproject.net.config.NetworkConfigService;
+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;
 
@@ -39,16 +38,15 @@
 import java.util.Set;
 import java.util.stream.Collectors;
 
-@Component(immediate = true)
-@Service
+@Component(immediate = true, service = ArtemisMonitor.class)
 public class ArtemisMonitorImpl implements ArtemisMonitor {
     private final Logger log = LoggerFactory.getLogger(getClass());
     private static final Class<ArtemisConfig> CONFIG_CLASS = ArtemisConfig.class;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected EventDeliveryService eventDispatcher;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     private NetworkConfigService configService;
 
     /* Variables */
diff --git a/apps/artemis/src/main/resources/OSGI-INF/blueprint/shell-config.xml b/apps/artemis/src/main/resources/OSGI-INF/blueprint/shell-config.xml
deleted file mode 100755
index af1af5a..0000000
--- a/apps/artemis/src/main/resources/OSGI-INF/blueprint/shell-config.xml
+++ /dev/null
@@ -1,21 +0,0 @@
-<!--
-  ~ Copyright 2015 Open Networking Foundation
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~     http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License.
-  -->
-<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0">
-
-    <command-bundle xmlns="http://karaf.apache.org/xmlns/shell/v1.1.0">
-    </command-bundle>
-
-</blueprint>
diff --git a/apps/bgprouter/BUCK b/apps/bgprouter/BUCK
deleted file mode 100644
index 436c6b6..0000000
--- a/apps/bgprouter/BUCK
+++ /dev/null
@@ -1,25 +0,0 @@
-COMPILE_DEPS = [
-    '//lib:CORE_DEPS',
-    '//lib:JACKSON',
-    '//incubator/api:onos-incubator-api',
-    '//apps/routing-api:onos-apps-routing-api',
-]
-
-BUNDLES = [
-    '//apps/routing-api:onos-apps-routing-api',
-    '//apps/routing/common:onos-apps-routing-common',
-    '//apps/bgprouter:onos-apps-bgprouter',
-]
-
-osgi_jar (
-    deps = COMPILE_DEPS,
-)
-
-onos_app (
-    title = 'BGP Router',
-    category = 'Traffic Engineering',
-    url = 'http://onosproject.org',
-    description = 'BGP router application.',
-    included_bundles = BUNDLES,
-    required_apps = [ 'org.onosproject.fibinstaller', 'org.onosproject.route-service' ],
-)
diff --git a/apps/bgprouter/app.xml b/apps/bgprouter/app.xml
deleted file mode 100644
index c1c2aa7..0000000
--- a/apps/bgprouter/app.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-  ~ Copyright 2015-present Open Networking Foundation
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~     http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License.
-  -->
-<app name="org.onosproject.bgprouter" origin="Open Networking Foundation" version="${project.version}"
-     category="Traffic Steering" url="http://onosproject.org" title="BGP Router App"
-     featuresRepo="mvn:${project.groupId}/${project.artifactId}/${project.version}/xml/features"
-     features="${project.artifactId}" apps="fibinstaller">
-    <description>${project.description}</description>
-    <artifact>mvn:${project.groupId}/${project.artifactId}/${project.version}</artifact>
-    <artifact>mvn:${project.groupId}/onos-apps-routing-api/${project.version}</artifact>
-    <artifact>mvn:${project.groupId}/onos-apps-routing-common/${project.version}</artifact>
-</app>
diff --git a/apps/bgprouter/features.xml b/apps/bgprouter/features.xml
deleted file mode 100644
index aeba2fd..0000000
--- a/apps/bgprouter/features.xml
+++ /dev/null
@@ -1,26 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
-<!--
-  ~ Copyright 2015-present Open Networking Foundation
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~     http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License.
-  -->
-<features xmlns="http://karaf.apache.org/xmlns/features/v1.2.0" name="${project.artifactId}-${project.version}">
-    <feature name="${project.artifactId}" version="${project.version}"
-             description="${project.description}">
-        <feature>onos-api</feature>
-        <bundle>mvn:${project.groupId}/onos-apps-routing-api/${project.version}</bundle>
-        <bundle>mvn:${project.groupId}/onos-apps-proxyarp/${project.version}</bundle>
-        <bundle>mvn:${project.groupId}/onos-apps-bgprouter/${project.version}</bundle>
-        <bundle>mvn:${project.groupId}/onos-apps-routing-common/${project.version}</bundle>
-    </feature>
-</features>
diff --git a/apps/bgprouter/src/main/java/org/onosproject/bgprouter/BgpRouter.java b/apps/bgprouter/src/main/java/org/onosproject/bgprouter/BgpRouter.java
index 4341645..6ee27a3 100644
--- a/apps/bgprouter/src/main/java/org/onosproject/bgprouter/BgpRouter.java
+++ b/apps/bgprouter/src/main/java/org/onosproject/bgprouter/BgpRouter.java
@@ -15,11 +15,11 @@
  */
 package org.onosproject.bgprouter;
 
-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.onosproject.core.ApplicationId;
 import org.onosproject.core.CoreService;
 import org.onosproject.component.ComponentService;
@@ -51,25 +51,25 @@
 
     public static final String BGP_ROUTER_APP = "org.onosproject.bgprouter";
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected CoreService coreService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected InterfaceService interfaceService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected NetworkConfigRegistry networkConfigService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected PacketService packetService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected FlowObjectiveService flowObjectiveService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected DeviceService deviceService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected ComponentService componentService;
 
     private ApplicationId appId;
diff --git a/apps/castor/BUCK b/apps/castor/BUCK
deleted file mode 100644
index 9b305ec..0000000
--- a/apps/castor/BUCK
+++ /dev/null
@@ -1,44 +0,0 @@
-COMPILE_DEPS = [
-  '//lib:CORE_DEPS',
-  '//lib:JACKSON',
-  '//lib:KRYO',
-  '//core/api:onos-api',
-  '//lib:javax.ws.rs-api',
-  '//lib:jersey-server',
-  '//utils/rest:onlab-rest',
-  '//core/store/serializers:onos-core-serializers',
-  '//incubator/api:onos-incubator-api',
-  '//apps/routing-api:onos-apps-routing-api',
-  '//apps/intentsync:onos-apps-intentsync',
-]
-
-BUNDLES = [
-  '//apps/castor:onos-apps-castor',
-  '//apps/routing-api:onos-apps-routing-api',
-  '//apps/routing/common:onos-apps-routing-common',
-]
-
-TEST_DEPS = [
-  '//lib:TEST_ADAPTERS',
-  '//incubator/api:onos-incubator-api-tests',
-  '//apps/routing-api:onos-apps-routing-api-tests',
-]
-
-osgi_jar_with_tests (
-  deps = COMPILE_DEPS,
-  test_deps = TEST_DEPS,
-  web_context = '/onos/castor',
-  api_title = 'Castor',
-  api_version = '1.0',
-  api_description = 'REST API for Castor',
-  api_package = 'org.onosproject.castor',
-)
-
-onos_app (
-  title = 'Castor',
-  category = 'Utility',
-  url = 'http://onosproject.org',
-  included_bundles = BUNDLES,
-  description = 'Castor application',
-  required_apps = [ 'org.onosproject.intentsynchronizer' ],
-)
diff --git a/apps/castor/app.xml b/apps/castor/app.xml
deleted file mode 100644
index fe1aab7..0000000
--- a/apps/castor/app.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-  ~ Copyright 2016-present Open Networking Foundation
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~     http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License.
-  -->
-<app name="org.onosproject.castor" origin="Open Networking Foundation" version="${project.version}"
-     category="default" url="http://onosproject.org"
-     featuresRepo="mvn:${project.groupId}/${project.artifactId}/${project.version}/xml/features"
-     features="${project.artifactId}">
-    <description>${project.description}</description>
-    <artifact>mvn:${project.groupId}/${project.artifactId}/${project.version}</artifact>
-    <artifact>mvn:${project.groupId}/onos-apps-routing-api/${project.version}</artifact>
-    <artifact>mvn:${project.groupId}/onos-apps-routing-common/${project.version}</artifact>
-</app>
diff --git a/apps/castor/features.xml b/apps/castor/features.xml
deleted file mode 100644
index 0ddd35b..0000000
--- a/apps/castor/features.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
-<!--
-  ~ Copyright 2016-present Open Networking Foundation
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~     http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License.
-  -->
-<features xmlns="http://karaf.apache.org/xmlns/features/v1.2.0" name="${project.artifactId}-${project.version}">
-    <feature name="onos-apps-castor" version="${project.version}"
-             description="${project.description}">
-        <feature>onos-api</feature>
-        <bundle>mvn:${project.groupId}/onos-apps-castor/${project.version}</bundle>
-        <bundle>mvn:${project.groupId}/onos-apps-routing-api/${project.version}</bundle>
-        <bundle>mvn:${project.groupId}/onos-apps-routing-common/${project.version}</bundle>
-    </feature>
-</features>
diff --git a/apps/castor/src/main/java/org/onosproject/castor/Castor.java b/apps/castor/src/main/java/org/onosproject/castor/Castor.java
index 7b32f2a..d190d2a 100644
--- a/apps/castor/src/main/java/org/onosproject/castor/Castor.java
+++ b/apps/castor/src/main/java/org/onosproject/castor/Castor.java
@@ -15,11 +15,11 @@
  */
 package org.onosproject.castor;
 
-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.onosproject.app.ApplicationService;
 import org.onosproject.core.ApplicationId;
 import org.onosproject.core.CoreService;
@@ -38,13 +38,13 @@
     public static final String CASTOR_APP = "org.onosproject.castor";
     private final Logger log = getLogger(getClass());
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected CoreService coreService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected ApplicationService applicationService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected IntentSynchronizationService intentSynchronizer;
 
     private ApplicationId appId;
diff --git a/apps/castor/src/main/java/org/onosproject/castor/CastorArpManager.java b/apps/castor/src/main/java/org/onosproject/castor/CastorArpManager.java
index f1d336f..3d6e7d0 100644
--- a/apps/castor/src/main/java/org/onosproject/castor/CastorArpManager.java
+++ b/apps/castor/src/main/java/org/onosproject/castor/CastorArpManager.java
@@ -15,12 +15,6 @@
  */
 package org.onosproject.castor;
 
-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.packet.ARP;
 import org.onlab.packet.Ethernet;
 import org.onlab.packet.Ip4Address;
@@ -40,6 +34,11 @@
 import org.onosproject.net.packet.PacketContext;
 import org.onosproject.net.packet.PacketProcessor;
 import org.onosproject.net.packet.PacketService;
+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.nio.ByteBuffer;
@@ -54,20 +53,19 @@
  * Component for managing the ARPs.
  */
 
-@Component(immediate = true, enabled = true)
-@Service
+@Component(immediate = true, service = ArpService.class)
 public class CastorArpManager implements ArpService  {
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected ConnectivityManagerService connectivityManager;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected PacketService packetService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected CoreService coreService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected CastorStore castorStore;
 
     private ProxyArpProcessor processor = new ProxyArpProcessor();
diff --git a/apps/castor/src/main/java/org/onosproject/castor/ConnectivityManager.java b/apps/castor/src/main/java/org/onosproject/castor/ConnectivityManager.java
index a9a986ee..5125ce3 100644
--- a/apps/castor/src/main/java/org/onosproject/castor/ConnectivityManager.java
+++ b/apps/castor/src/main/java/org/onosproject/castor/ConnectivityManager.java
@@ -14,12 +14,7 @@
  * limitations under the License.
  */
 package org.onosproject.castor;
-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.packet.Ethernet;
 import org.onlab.packet.IPv4;
 import org.onlab.packet.IPv6;
@@ -29,6 +24,7 @@
 import org.onlab.packet.TpPort;
 import org.onosproject.core.ApplicationId;
 import org.onosproject.core.CoreService;
+import org.onosproject.intentsync.IntentSynchronizationService;
 import org.onosproject.net.ConnectPoint;
 import org.onosproject.net.FilteredConnectPoint;
 import org.onosproject.net.flow.DefaultTrafficSelector;
@@ -38,7 +34,11 @@
 import org.onosproject.net.intent.Key;
 import org.onosproject.net.intent.MultiPointToSinglePointIntent;
 import org.onosproject.net.intent.PointToPointIntent;
-import org.onosproject.intentsync.IntentSynchronizationService;
+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;
 
@@ -56,17 +56,16 @@
 /**
  * Manages the connectivity requirements between peers.
  */
-@Component(immediate = true, enabled = true)
-@Service
+@Component(immediate = true, service = ConnectivityManagerService.class)
 public class ConnectivityManager implements ConnectivityManagerService {
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected IntentSynchronizationService intentSynchronizer;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected CoreService coreService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected CastorStore castorStore;
 
     private static final int PRIORITY_OFFSET = 1000;
diff --git a/apps/castor/src/main/java/org/onosproject/castor/DistributedCastorStore.java b/apps/castor/src/main/java/org/onosproject/castor/DistributedCastorStore.java
index 681756e..3a1a98c 100644
--- a/apps/castor/src/main/java/org/onosproject/castor/DistributedCastorStore.java
+++ b/apps/castor/src/main/java/org/onosproject/castor/DistributedCastorStore.java
@@ -16,24 +16,23 @@
 package org.onosproject.castor;
 
 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.apache.felix.scr.annotations.Service;
 import org.onlab.packet.IpAddress;
 import org.onlab.packet.MacAddress;
 import org.onlab.util.KryoNamespace;
 import org.onosproject.net.intent.Key;
 import org.onosproject.net.intent.MultiPointToSinglePointIntent;
 import org.onosproject.net.intent.PointToPointIntent;
+import org.onosproject.store.serializers.KryoNamespaces;
 import org.onosproject.store.service.ConsistentMap;
 import org.onosproject.store.service.DistributedSet;
 import org.onosproject.store.service.Serializer;
 import org.onosproject.store.service.StorageService;
 import org.onosproject.store.service.Versioned;
-import org.onosproject.store.serializers.KryoNamespaces;
+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;
 
@@ -45,13 +44,12 @@
  * Distributed Store for Castor.
  */
 
-@Component(immediate = true)
-@Service
+@Component(immediate = true, service = CastorStore.class)
 public class DistributedCastorStore implements CastorStore {
 
     private final Logger log = LoggerFactory.getLogger(getClass());
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected StorageService storageService;
 
     private ConsistentMap<IpAddress, MacAddress> addressMap;
diff --git a/apps/cfm/BUCK b/apps/cfm/BUCK
deleted file mode 100644
index 17e3059..0000000
--- a/apps/cfm/BUCK
+++ /dev/null
@@ -1,13 +0,0 @@
-BUNDLES = [
-    '//apps/cfm/api:onos-apps-cfm-api',
-    '//apps/cfm/app:onos-apps-cfm-app',
-    '//apps/cfm/nbi:onos-apps-cfm-nbi',
-]
-
-onos_app (
-    title = 'Layer 2 Monitoring CFM Application',
-    category = 'Monitoring',
-    url = 'http://onosproject.org',
-    description = 'Layer 2 Monitoring Connectivity Fault Management App',
-    included_bundles = BUNDLES,
-)
diff --git a/apps/cfm/api/BUCK b/apps/cfm/api/BUCK
deleted file mode 100644
index ab6251e..0000000
--- a/apps/cfm/api/BUCK
+++ /dev/null
@@ -1,14 +0,0 @@
-COMPILE_DEPS = [
-    '//lib:CORE_DEPS',
-]
-
-TEST_DEPS = [
-    '//lib:TEST_ADAPTERS',
-]
-
-osgi_jar_with_tests (
-    deps = COMPILE_DEPS,
-    test_deps = TEST_DEPS,
-    visibility = ['PUBLIC'],
-)
-
diff --git a/apps/cfm/app/BUCK b/apps/cfm/app/BUCK
deleted file mode 100644
index 93d3d70..0000000
--- a/apps/cfm/app/BUCK
+++ /dev/null
@@ -1,17 +0,0 @@
-COMPILE_DEPS = [
-    '//lib:CORE_DEPS',
-    '//lib:KRYO',
-    '//core/store/serializers:onos-core-serializers',
-    '//apps/cfm/api:onos-apps-cfm-api',
-]
-
-TEST_DEPS = [
-    '//lib:TEST_ADAPTERS',
-    '//utils/osgi:onlab-osgi-tests',
-]
-
-osgi_jar_with_tests (
-    deps = COMPILE_DEPS,
-    test_deps = TEST_DEPS,
-)
-
diff --git a/apps/cfm/app/src/main/java/org/onosproject/incubator/net/l2monitoring/cfm/impl/CfmMdManager.java b/apps/cfm/app/src/main/java/org/onosproject/incubator/net/l2monitoring/cfm/impl/CfmMdManager.java
index b18d2f6..5c5a12c 100644
--- a/apps/cfm/app/src/main/java/org/onosproject/incubator/net/l2monitoring/cfm/impl/CfmMdManager.java
+++ b/apps/cfm/app/src/main/java/org/onosproject/incubator/net/l2monitoring/cfm/impl/CfmMdManager.java
@@ -15,15 +15,6 @@
  */
 package org.onosproject.incubator.net.l2monitoring.cfm.impl;
 
-import java.util.Collection;
-import java.util.Optional;
-
-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.core.ApplicationId;
 import org.onosproject.core.CoreService;
 import org.onosproject.event.AbstractListenerManager;
@@ -38,14 +29,21 @@
 import org.onosproject.incubator.net.l2monitoring.cfm.service.MdListener;
 import org.onosproject.incubator.net.l2monitoring.cfm.service.MdStore;
 import org.onosproject.incubator.net.l2monitoring.cfm.service.MdStoreDelegate;
+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.util.Collection;
+import java.util.Optional;
+
 /**
  * Manager of Cfm Md Service - persists Maintenance Domain in distributed store.
  */
-@Component(immediate = true)
-@Service
+@Component(immediate = true, service = CfmMdService.class)
 public class CfmMdManager extends AbstractListenerManager<MdEvent, MdListener>
         implements CfmMdService {
 
@@ -54,10 +52,10 @@
 
     protected ApplicationId appId;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected CoreService coreService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected MdStore store;
 
     protected final MdStoreDelegate delegate = new InternalStoreDelegate();
diff --git a/apps/cfm/app/src/main/java/org/onosproject/incubator/net/l2monitoring/cfm/impl/CfmMepManager.java b/apps/cfm/app/src/main/java/org/onosproject/incubator/net/l2monitoring/cfm/impl/CfmMepManager.java
index e58a570..e641f3c 100644
--- a/apps/cfm/app/src/main/java/org/onosproject/incubator/net/l2monitoring/cfm/impl/CfmMepManager.java
+++ b/apps/cfm/app/src/main/java/org/onosproject/incubator/net/l2monitoring/cfm/impl/CfmMepManager.java
@@ -15,28 +15,6 @@
  */
 package org.onosproject.incubator.net.l2monitoring.cfm.impl;
 
-import static org.onlab.util.Tools.groupedThreads;
-import static org.slf4j.LoggerFactory.getLogger;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Optional;
-import java.util.Set;
-import java.util.concurrent.ConcurrentLinkedQueue;
-import java.util.concurrent.Executors;
-import java.util.concurrent.ScheduledExecutorService;
-import java.util.concurrent.ScheduledFuture;
-import java.util.concurrent.TimeUnit;
-
-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.core.CoreService;
 import org.onosproject.core.IdGenerator;
 import org.onosproject.event.AbstractListenerManager;
@@ -66,13 +44,33 @@
 import org.onosproject.net.device.DeviceEvent;
 import org.onosproject.net.device.DeviceListener;
 import org.onosproject.net.device.DeviceService;
+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.ArrayList;
+import java.util.Collection;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Optional;
+import java.util.Set;
+import java.util.concurrent.ConcurrentLinkedQueue;
+import java.util.concurrent.Executors;
+import java.util.concurrent.ScheduledExecutorService;
+import java.util.concurrent.ScheduledFuture;
+import java.util.concurrent.TimeUnit;
+
+import static org.onlab.util.Tools.groupedThreads;
+import static org.slf4j.LoggerFactory.getLogger;
+
 /**
  * Provides implementation of the CFM North and South Bound Interfaces.
  */
-@Component(immediate = true)
-@Service
+@Component(immediate = true, service = CfmMepService.class)
 public class CfmMepManager
     extends AbstractListenerManager<CfmMepEvent, CfmMepListener>
     implements CfmMepService {
@@ -82,16 +80,16 @@
     private InternalDeviceListener deviceListener = null;
     private InternalMdListener mdListener = null;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected DeviceService deviceService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected CoreService coreService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected MastershipService mastershipService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected CfmMdService cfmMdService;
 
     private static final int DEFAULT_POLL_FREQUENCY = 30;
@@ -116,7 +114,7 @@
 
     private IdGenerator idGenerator;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected MepStore mepStore;
 
     protected final MepStoreDelegate delegate = new InternalStoreDelegate();
diff --git a/apps/cfm/app/src/main/java/org/onosproject/incubator/net/l2monitoring/cfm/impl/DistributedMdStore.java b/apps/cfm/app/src/main/java/org/onosproject/incubator/net/l2monitoring/cfm/impl/DistributedMdStore.java
index 81813f8..f12be55 100644
--- a/apps/cfm/app/src/main/java/org/onosproject/incubator/net/l2monitoring/cfm/impl/DistributedMdStore.java
+++ b/apps/cfm/app/src/main/java/org/onosproject/incubator/net/l2monitoring/cfm/impl/DistributedMdStore.java
@@ -17,12 +17,6 @@
 
 import com.google.common.net.InternetDomainName;
 import org.apache.commons.lang3.tuple.ImmutablePair;
-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.packet.MacAddress;
 import org.onlab.util.Identifier;
 import org.onlab.util.KryoNamespace;
@@ -47,13 +41,18 @@
 import org.onosproject.incubator.net.l2monitoring.cfm.service.MdEvent;
 import org.onosproject.incubator.net.l2monitoring.cfm.service.MdStore;
 import org.onosproject.incubator.net.l2monitoring.cfm.service.MdStoreDelegate;
-import org.onosproject.store.serializers.KryoNamespaces;
 import org.onosproject.store.AbstractStore;
+import org.onosproject.store.serializers.KryoNamespaces;
 import org.onosproject.store.service.ConsistentMap;
 import org.onosproject.store.service.MapEvent;
 import org.onosproject.store.service.MapEventListener;
 import org.onosproject.store.service.Serializer;
 import org.onosproject.store.service.StorageService;
+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;
 
@@ -66,14 +65,13 @@
 /**
  * Maintenance Domain Store implementation backed by consistent map.
  */
-@Component(immediate = true)
-@Service
+@Component(immediate = true, service = MdStore.class)
 public class DistributedMdStore extends AbstractStore<MdEvent, MdStoreDelegate>
     implements MdStore {
 
     private final Logger log = LoggerFactory.getLogger(getClass());
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected StorageService storageService;
 
     private ConsistentMap<MdId, MaintenanceDomain> maintenanceDomainConsistentMap;
diff --git a/apps/cfm/app/src/main/java/org/onosproject/incubator/net/l2monitoring/cfm/impl/DistributedMepStore.java b/apps/cfm/app/src/main/java/org/onosproject/incubator/net/l2monitoring/cfm/impl/DistributedMepStore.java
index c21166a..444ca9c 100644
--- a/apps/cfm/app/src/main/java/org/onosproject/incubator/net/l2monitoring/cfm/impl/DistributedMepStore.java
+++ b/apps/cfm/app/src/main/java/org/onosproject/incubator/net/l2monitoring/cfm/impl/DistributedMepStore.java
@@ -15,12 +15,6 @@
  */
 package org.onosproject.incubator.net.l2monitoring.cfm.impl;
 
-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.packet.IpAddress;
 import org.onlab.packet.VlanId;
 import org.onlab.util.KryoNamespace;
@@ -52,6 +46,11 @@
 import org.onosproject.store.service.MapEventListener;
 import org.onosproject.store.service.Serializer;
 import org.onosproject.store.service.StorageService;
+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;
 
@@ -64,14 +63,13 @@
 /**
  * MEP Store implementation backed by consistent map.
  */
-@Component(immediate = true)
-@Service
+@Component(immediate = true, service = MepStore.class)
 public class DistributedMepStore extends AbstractStore<CfmMepEvent, MepStoreDelegate>
     implements MepStore {
 
     private final Logger log = LoggerFactory.getLogger(getClass());
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected StorageService storageService;
 
     private ConsistentMap<MepKeyId, Mep> mepConsistentMap;
diff --git a/apps/cfm/app/src/main/java/org/onosproject/incubator/net/l2monitoring/soam/impl/SoamManager.java b/apps/cfm/app/src/main/java/org/onosproject/incubator/net/l2monitoring/soam/impl/SoamManager.java
index 79a6480..8738041 100644
--- a/apps/cfm/app/src/main/java/org/onosproject/incubator/net/l2monitoring/soam/impl/SoamManager.java
+++ b/apps/cfm/app/src/main/java/org/onosproject/incubator/net/l2monitoring/soam/impl/SoamManager.java
@@ -15,15 +15,6 @@
  */
 package org.onosproject.incubator.net.l2monitoring.soam.impl;
 
-import java.util.Collection;
-import java.util.Optional;
-
-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.core.ApplicationId;
 import org.onosproject.core.CoreService;
 import org.onosproject.incubator.net.l2monitoring.cfm.MepEntry;
@@ -46,14 +37,21 @@
 import org.onosproject.incubator.net.l2monitoring.soam.loss.LossMeasurementStatCurrent;
 import org.onosproject.net.DeviceId;
 import org.onosproject.net.device.DeviceService;
+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.util.Collection;
+import java.util.Optional;
+
 /**
  * ONOS application component.
  */
-@Component(immediate = true)
-@Service
+@Component(immediate = true, service = SoamService.class)
 public class SoamManager implements SoamService {
 
     private final Logger log = LoggerFactory.getLogger(getClass());
@@ -61,13 +59,13 @@
 
     private ApplicationId appId;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected DeviceService deviceService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected CoreService coreService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected CfmMepService cfmMepService;
 
     @Activate
diff --git a/apps/cfm/nbi/BUCK b/apps/cfm/nbi/BUCK
deleted file mode 100644
index fd493f4..0000000
--- a/apps/cfm/nbi/BUCK
+++ /dev/null
@@ -1,25 +0,0 @@
-COMPILE_DEPS = [
-    '//lib:CORE_DEPS',
-    '//lib:javax.ws.rs-api',
-    '//utils/rest:onlab-rest',
-    '//lib:JACKSON',
-    '//cli:onos-cli',
-    '//lib:org.apache.karaf.shell.console',
-    '//apps/cfm/api:onos-apps-cfm-api',
-]
-
-TEST_DEPS = [
-    '//lib:TEST_REST',
-    '//utils/osgi:onlab-osgi-tests',
-    '//web/api:onos-rest-tests',
-]
-
-osgi_jar_with_tests (
-    deps = COMPILE_DEPS,
-    test_deps = TEST_DEPS,
-    web_context = '/onos/cfm',
-    api_title = 'L2 Monitoring CFM',
-    api_version = '1.0',
-    api_description = 'REST API for L2 Monitoring CFM',
-    api_package = 'org.onosproject.soam.rest',
-)
diff --git a/apps/cfm/nbi/BUILD b/apps/cfm/nbi/BUILD
index c28e664..d86f380 100644
--- a/apps/cfm/nbi/BUILD
+++ b/apps/cfm/nbi/BUILD
@@ -13,6 +13,10 @@
     api_title = "L2 Monitoring CFM",
     api_version = "1.0",
     exclude_tests = ["org/onosproject/cfm/impl/CfmResourceTest"],
+    karaf_command_packages = [
+        "org.onosproject.cfm.cli",
+        "org.onosproject.cfm.cli.completer",
+    ],
     test_deps = TEST_DEPS,
     web_context = "/onos/cfm",
     deps = COMPILE_DEPS,
diff --git a/apps/cfm/nbi/src/main/java/org/onosproject/cfm/CfmWebComponent.java b/apps/cfm/nbi/src/main/java/org/onosproject/cfm/CfmWebComponent.java
index a31a407..0cef175 100644
--- a/apps/cfm/nbi/src/main/java/org/onosproject/cfm/CfmWebComponent.java
+++ b/apps/cfm/nbi/src/main/java/org/onosproject/cfm/CfmWebComponent.java
@@ -15,11 +15,11 @@
  */
 package org.onosproject.cfm;
 
-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.VlanId;
 import org.onosproject.cfm.web.ComponentCodec;
 import org.onosproject.cfm.web.FngAddressCodec;
@@ -90,7 +90,7 @@
 public class CfmWebComponent {
     private final Logger log = LoggerFactory.getLogger(getClass());
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected CodecService codecService;
 
     /**
diff --git a/apps/cfm/nbi/src/main/java/org/onosproject/cfm/cli/CfmMaAddCommand.java b/apps/cfm/nbi/src/main/java/org/onosproject/cfm/cli/CfmMaAddCommand.java
index 1fec9f3..3f16c77 100644
--- a/apps/cfm/nbi/src/main/java/org/onosproject/cfm/cli/CfmMaAddCommand.java
+++ b/apps/cfm/nbi/src/main/java/org/onosproject/cfm/cli/CfmMaAddCommand.java
@@ -15,10 +15,16 @@
  */
 package org.onosproject.cfm.cli;
 
-import org.apache.karaf.shell.commands.Argument;
-import org.apache.karaf.shell.commands.Command;
+import org.apache.karaf.shell.api.action.Argument;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.Completion;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onlab.packet.VlanId;
+import org.onosproject.cfm.cli.completer.CfmMaCcmIntervalCompleter;
+import org.onosproject.cfm.cli.completer.CfmMaNameTypeCompleter;
+import org.onosproject.cfm.cli.completer.CfmMdNameCompleter;
 import org.onosproject.cli.AbstractShellCommand;
+import org.onosproject.cli.PlaceholderCompleter;
 import org.onosproject.incubator.net.l2monitoring.cfm.Component;
 import org.onosproject.incubator.net.l2monitoring.cfm.DefaultComponent;
 import org.onosproject.incubator.net.l2monitoring.cfm.DefaultMaintenanceAssociation;
@@ -32,28 +38,33 @@
 /**
  * Adds a Maintenance Association to a Maintenance Domain.
  */
+@Service
 @Command(scope = "onos", name = "cfm-ma-add",
         description = "Add a CFM Maintenance Association to a Maintenance Domain.")
 public class CfmMaAddCommand extends AbstractShellCommand {
     @Argument(name = "name",
             description = "Maintenance Domain name and type (in brackets)",
             required = true)
+    @Completion(CfmMdNameCompleter.class)
     private String mdName = null;
 
     @Argument(index = 1, name = "name-type",
-            description = "Maintenance Assocation name type",
+            description = "Maintenance Association name type",
             required = true)
+    @Completion(CfmMaNameTypeCompleter.class)
     private String nameType = null;
 
     @Argument(index = 2, name = "name",
             description = "Maintenance Assocation name. Restrictions apply depending " +
                     "on name-type",
             required = true)
+    @Completion(PlaceholderCompleter.class)
     private String name = null;
 
     @Argument(index = 3, name = "ccm-interval",
             description = "CCM Interval values from list",
             required = true)
+    @Completion(CfmMaCcmIntervalCompleter.class)
     private String ccmInterval = null;
 
     @Argument(index = 4, name = "numeric-id",
@@ -86,7 +97,7 @@
     private String[] rmepArray = null;
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         CfmMdService service = get(CfmMdService.class);
 
         String[] mdNameParts = mdName.split("[()]");
diff --git a/apps/cfm/nbi/src/main/java/org/onosproject/cfm/cli/CfmMaDeleteCommand.java b/apps/cfm/nbi/src/main/java/org/onosproject/cfm/cli/CfmMaDeleteCommand.java
index b28a35e..6e0943e 100644
--- a/apps/cfm/nbi/src/main/java/org/onosproject/cfm/cli/CfmMaDeleteCommand.java
+++ b/apps/cfm/nbi/src/main/java/org/onosproject/cfm/cli/CfmMaDeleteCommand.java
@@ -15,8 +15,11 @@
  */
 package org.onosproject.cfm.cli;
 
-import org.apache.karaf.shell.commands.Argument;
-import org.apache.karaf.shell.commands.Command;
+import org.apache.karaf.shell.api.action.Argument;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.Completion;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
+import org.onosproject.cfm.cli.completer.CfmMaNameCompleter;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.incubator.net.l2monitoring.cfm.identifier.MaIdShort;
 import org.onosproject.incubator.net.l2monitoring.cfm.identifier.MdId;
@@ -26,6 +29,7 @@
 /**
  * Delete a Maintenance Association from the existing list of a Maintenance Domain.
  */
+@Service
 @Command(scope = "onos", name = "cfm-ma-delete",
         description = "Delete a CFM Maintenance Association and its children.")
 public class CfmMaDeleteCommand extends AbstractShellCommand {
@@ -35,10 +39,11 @@
             description = "Maintenance Domain name and type (in brackets) " +
                     "and the Maintenance Association name and type (in brackets)",
             required = true)
+    @Completion(CfmMaNameCompleter.class)
     private String name = null;
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         CfmMdService service = get(CfmMdService.class);
 
         String[] nameParts = name.split("[()]");
diff --git a/apps/cfm/nbi/src/main/java/org/onosproject/cfm/cli/CfmMdAddCommand.java b/apps/cfm/nbi/src/main/java/org/onosproject/cfm/cli/CfmMdAddCommand.java
index c73fff3..5c7cc91 100644
--- a/apps/cfm/nbi/src/main/java/org/onosproject/cfm/cli/CfmMdAddCommand.java
+++ b/apps/cfm/nbi/src/main/java/org/onosproject/cfm/cli/CfmMdAddCommand.java
@@ -15,9 +15,14 @@
  */
 package org.onosproject.cfm.cli;
 
-import org.apache.karaf.shell.commands.Command;
-import org.apache.karaf.shell.commands.Argument;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.Argument;
+import org.apache.karaf.shell.api.action.Completion;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
+import org.onosproject.cfm.cli.completer.CfmMdLevelCompleter;
+import org.onosproject.cfm.cli.completer.CfmMdNameTypeCompleter;
 import org.onosproject.cli.AbstractShellCommand;
+import org.onosproject.cli.PlaceholderCompleter;
 import org.onosproject.incubator.net.l2monitoring.cfm.DefaultMaintenanceDomain;
 import org.onosproject.incubator.net.l2monitoring.cfm.MaintenanceDomain;
 import org.onosproject.incubator.net.l2monitoring.cfm.identifier.MdId;
@@ -27,6 +32,7 @@
 /**
  * Adds a Maintenance Domain to the existing list.
  */
+@Service
 @Command(scope = "onos", name = "cfm-md-add",
         description = "Add a CFM Maintenance Domain.")
 public class CfmMdAddCommand extends AbstractShellCommand {
@@ -34,25 +40,29 @@
     @Argument(name = "name-type",
             description = "Maintenance Domain name type",
             required = true)
+    @Completion(CfmMdNameTypeCompleter.class)
     private String nameType = null;
 
     @Argument(index = 1, name = "name",
             description = "Maintenance Domain name. Restrictions apply depending " +
                     "on name-type. Leave empty if name type is none",
             required = true)
+    @Completion(PlaceholderCompleter.class)
     private String name = null;
 
     @Argument(index = 2, name = "level",
             description = "Maintenance Domain level LEVEL0-LEVEL7",
             required = true)
+    @Completion(CfmMdLevelCompleter.class)
     private String level = null;
 
     @Argument(index = 3, name = "numeric-id",
             description = "An optional numeric id for Maintenance Domain [1-65535]")
+    @Completion(PlaceholderCompleter.class)
     private Short numericId = null;
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         CfmMdService service = get(CfmMdService.class);
         MdId mdId = CfmMdListMdCommand.parseMdName(name + "(" + nameType + ")");
 
diff --git a/apps/cfm/nbi/src/main/java/org/onosproject/cfm/cli/CfmMdDeleteCommand.java b/apps/cfm/nbi/src/main/java/org/onosproject/cfm/cli/CfmMdDeleteCommand.java
index 85f47eb..3b48d41 100644
--- a/apps/cfm/nbi/src/main/java/org/onosproject/cfm/cli/CfmMdDeleteCommand.java
+++ b/apps/cfm/nbi/src/main/java/org/onosproject/cfm/cli/CfmMdDeleteCommand.java
@@ -15,8 +15,11 @@
  */
 package org.onosproject.cfm.cli;
 
-import org.apache.karaf.shell.commands.Argument;
-import org.apache.karaf.shell.commands.Command;
+import org.apache.karaf.shell.api.action.Argument;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.Completion;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
+import org.onosproject.cfm.cli.completer.CfmMdNameCompleter;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.incubator.net.l2monitoring.cfm.identifier.MdId;
 import org.onosproject.incubator.net.l2monitoring.cfm.service.CfmConfigException;
@@ -25,6 +28,7 @@
 /**
  * Deletes a Maintenance Domain from the existing list.
  */
+@Service
 @Command(scope = "onos", name = "cfm-md-delete",
         description = "Delete a CFM Maintenance Domain and its children.")
 public class CfmMdDeleteCommand extends AbstractShellCommand {
@@ -32,10 +36,11 @@
     @Argument(name = "name",
             description = "Maintenance Domain name and type (in brackets)",
             required = true)
+    @Completion(CfmMdNameCompleter.class)
     private String name = null;
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         CfmMdService service = get(CfmMdService.class);
 
         String[] nameParts = name.split("[()]");
diff --git a/apps/cfm/nbi/src/main/java/org/onosproject/cfm/cli/CfmMdListMdCommand.java b/apps/cfm/nbi/src/main/java/org/onosproject/cfm/cli/CfmMdListMdCommand.java
index 7965113..be97f28 100644
--- a/apps/cfm/nbi/src/main/java/org/onosproject/cfm/cli/CfmMdListMdCommand.java
+++ b/apps/cfm/nbi/src/main/java/org/onosproject/cfm/cli/CfmMdListMdCommand.java
@@ -15,8 +15,11 @@
  */
 package org.onosproject.cfm.cli;
 
-import org.apache.karaf.shell.commands.Argument;
-import org.apache.karaf.shell.commands.Command;
+import org.apache.karaf.shell.api.action.Argument;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.Completion;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
+import org.onosproject.cfm.cli.completer.CfmMdNameCompleter;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.incubator.net.l2monitoring.cfm.MaintenanceAssociation;
 import org.onosproject.incubator.net.l2monitoring.cfm.MaintenanceDomain;
@@ -28,15 +31,17 @@
 /**
  * Lists a particular Maintenance Domain.
  */
+@Service
 @Command(scope = "onos", name = "cfm-md-list",
         description = "Lists a single CFM Maintenance Domain or all if none specified.")
 public class CfmMdListMdCommand extends AbstractShellCommand {
     @Argument(name = "name",
             description = "Maintenance Domain name and type (in brackets)")
+    @Completion(CfmMdNameCompleter.class)
     private String name = null;
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         CfmMdService service;
         service = get(CfmMdService.class);
 
diff --git a/apps/cfm/nbi/src/main/java/org/onosproject/cfm/cli/CfmMepListCommand.java b/apps/cfm/nbi/src/main/java/org/onosproject/cfm/cli/CfmMepListCommand.java
index 55ed5ef..23eed3e 100644
--- a/apps/cfm/nbi/src/main/java/org/onosproject/cfm/cli/CfmMepListCommand.java
+++ b/apps/cfm/nbi/src/main/java/org/onosproject/cfm/cli/CfmMepListCommand.java
@@ -15,8 +15,11 @@
  */
 package org.onosproject.cfm.cli;
 
-import org.apache.karaf.shell.commands.Argument;
-import org.apache.karaf.shell.commands.Command;
+import org.apache.karaf.shell.api.action.Argument;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.Completion;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
+import org.onosproject.cfm.cli.completer.CfmMepIdCompleter;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.incubator.net.l2monitoring.cfm.MepEntry;
 import org.onosproject.incubator.net.l2monitoring.cfm.identifier.MaIdShort;
@@ -35,12 +38,14 @@
 /**
  * Lists a particular Maintenance Domain.
  */
+@Service
 @Command(scope = "onos", name = "cfm-mep-list",
         description = "Lists a filtered set of MEPs or all if no parameters specified.")
 public class CfmMepListCommand extends AbstractShellCommand {
     private final Logger log = getLogger(getClass());
     @Argument(name = "md",
             description = "Maintenance Domain name and type (in brackets) - will use all MDs if not specified")
+    @Completion(CfmMepIdCompleter.class)
     private String mdStr = null;
     @Argument(index = 1, name = "ma",
             description = "Maintenance Association name and type (in brackets) - requires MD")
@@ -50,7 +55,7 @@
     private String mepStr = null;
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         CfmMepService mepService = get(CfmMepService.class);
         CfmMdService mdService = get(CfmMdService.class);
 
diff --git a/apps/cfm/nbi/src/main/java/org/onosproject/cfm/cli/CfmMepListDeviceCommand.java b/apps/cfm/nbi/src/main/java/org/onosproject/cfm/cli/CfmMepListDeviceCommand.java
index 5067cc1..bdff1e8 100644
--- a/apps/cfm/nbi/src/main/java/org/onosproject/cfm/cli/CfmMepListDeviceCommand.java
+++ b/apps/cfm/nbi/src/main/java/org/onosproject/cfm/cli/CfmMepListDeviceCommand.java
@@ -15,8 +15,11 @@
  */
 package org.onosproject.cfm.cli;
 
-import org.apache.karaf.shell.commands.Argument;
-import org.apache.karaf.shell.commands.Command;
+import org.apache.karaf.shell.api.action.Argument;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.Completion;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
+import org.onosproject.cfm.cli.completer.CfmDeviceIdCompleter;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.incubator.net.l2monitoring.cfm.Mep;
 import org.onosproject.incubator.net.l2monitoring.cfm.service.CfmConfigException;
@@ -26,16 +29,18 @@
 /**
  * Lists all the MEPs on a particular device.
  */
+@Service
 @Command(scope = "onos", name = "cfm-mep-device-list",
         description = "Lists a set of MEPs filtered by device.")
 public class CfmMepListDeviceCommand extends AbstractShellCommand {
     @Argument(name = "device",
             description = "Device Id",
             required = true)
+    @Completion(CfmDeviceIdCompleter.class)
     private String deviceStr = null;
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         CfmMepService mepService = get(CfmMepService.class);
         if (deviceStr != null) {
             DeviceId deviceId = DeviceId.deviceId(deviceStr);
diff --git a/apps/cfm/nbi/src/main/java/org/onosproject/cfm/cli/completer/CfmCompMhfCompleter.java b/apps/cfm/nbi/src/main/java/org/onosproject/cfm/cli/completer/CfmCompMhfCompleter.java
index 499b84d..2d5019b 100644
--- a/apps/cfm/nbi/src/main/java/org/onosproject/cfm/cli/completer/CfmCompMhfCompleter.java
+++ b/apps/cfm/nbi/src/main/java/org/onosproject/cfm/cli/completer/CfmCompMhfCompleter.java
@@ -15,6 +15,7 @@
  */
 package org.onosproject.cfm.cli.completer;
 
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.cli.AbstractChoicesCompleter;
 import org.onosproject.incubator.net.l2monitoring.cfm.Component;
 
@@ -24,6 +25,7 @@
 /**
  * CLI completer for Component MEP Half Function creation.
  */
+@Service
 public class CfmCompMhfCompleter extends AbstractChoicesCompleter {
     @Override
     public List<String> choices() {
diff --git a/apps/cfm/nbi/src/main/java/org/onosproject/cfm/cli/completer/CfmCompTagTypeCompleter.java b/apps/cfm/nbi/src/main/java/org/onosproject/cfm/cli/completer/CfmCompTagTypeCompleter.java
index d919780..b0c8dd3 100644
--- a/apps/cfm/nbi/src/main/java/org/onosproject/cfm/cli/completer/CfmCompTagTypeCompleter.java
+++ b/apps/cfm/nbi/src/main/java/org/onosproject/cfm/cli/completer/CfmCompTagTypeCompleter.java
@@ -15,6 +15,7 @@
  */
 package org.onosproject.cfm.cli.completer;
 
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.cli.AbstractChoicesCompleter;
 import org.onosproject.incubator.net.l2monitoring.cfm.Component;
 
@@ -24,6 +25,7 @@
 /**
  * CLI completer for Component TagType creation.
  */
+@Service
 public class CfmCompTagTypeCompleter extends AbstractChoicesCompleter {
     @Override
     public List<String> choices() {
diff --git a/apps/cfm/nbi/src/main/java/org/onosproject/cfm/cli/completer/CfmDeviceIdCompleter.java b/apps/cfm/nbi/src/main/java/org/onosproject/cfm/cli/completer/CfmDeviceIdCompleter.java
index 6e2e29f..aab96bd 100644
--- a/apps/cfm/nbi/src/main/java/org/onosproject/cfm/cli/completer/CfmDeviceIdCompleter.java
+++ b/apps/cfm/nbi/src/main/java/org/onosproject/cfm/cli/completer/CfmDeviceIdCompleter.java
@@ -15,8 +15,11 @@
  */
 package org.onosproject.cfm.cli.completer;
 
-import org.apache.karaf.shell.console.Completer;
-import org.apache.karaf.shell.console.completer.StringsCompleter;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
+import org.apache.karaf.shell.api.console.CommandLine;
+import org.apache.karaf.shell.api.console.Completer;
+import org.apache.karaf.shell.api.console.Session;
+import org.apache.karaf.shell.support.completers.StringsCompleter;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.incubator.net.l2monitoring.cfm.service.CfmMepProgrammable;
 import org.onosproject.net.Device;
@@ -29,9 +32,10 @@
 /**
  * CLI completer for Devices that support Meps.
  */
+@Service
 public class CfmDeviceIdCompleter implements Completer {
     @Override
-    public int complete(String buffer, int cursor, List<String> candidates) {
+    public int complete(Session session, CommandLine commandLine, List<String> candidates) {
         // Delegate string completer
         StringsCompleter delegate = new StringsCompleter();
 
@@ -47,6 +51,6 @@
         }
 
         // Now let the completer do the work for figuring out what to offer.
-        return delegate.complete(buffer, cursor, candidates);
+        return delegate.complete(session, commandLine, candidates);
     }
 }
diff --git a/apps/cfm/nbi/src/main/java/org/onosproject/cfm/cli/completer/CfmMaCcmIntervalCompleter.java b/apps/cfm/nbi/src/main/java/org/onosproject/cfm/cli/completer/CfmMaCcmIntervalCompleter.java
index 6599ed3..9a47323 100644
--- a/apps/cfm/nbi/src/main/java/org/onosproject/cfm/cli/completer/CfmMaCcmIntervalCompleter.java
+++ b/apps/cfm/nbi/src/main/java/org/onosproject/cfm/cli/completer/CfmMaCcmIntervalCompleter.java
@@ -15,6 +15,7 @@
  */
 package org.onosproject.cfm.cli.completer;
 
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.cli.AbstractChoicesCompleter;
 import org.onosproject.incubator.net.l2monitoring.cfm.MaintenanceAssociation;
 
@@ -24,6 +25,7 @@
 /**
  * CLI completer for Ccm Interval creation.
  */
+@Service
 public class CfmMaCcmIntervalCompleter extends AbstractChoicesCompleter {
     @Override
     public List<String> choices() {
diff --git a/apps/cfm/nbi/src/main/java/org/onosproject/cfm/cli/completer/CfmMaNameCompleter.java b/apps/cfm/nbi/src/main/java/org/onosproject/cfm/cli/completer/CfmMaNameCompleter.java
index 1463804..e1f6a6d 100644
--- a/apps/cfm/nbi/src/main/java/org/onosproject/cfm/cli/completer/CfmMaNameCompleter.java
+++ b/apps/cfm/nbi/src/main/java/org/onosproject/cfm/cli/completer/CfmMaNameCompleter.java
@@ -15,6 +15,7 @@
  */
 package org.onosproject.cfm.cli.completer;
 
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.cli.AbstractChoicesCompleter;
 import org.onosproject.incubator.net.l2monitoring.cfm.service.CfmMdService;
 
@@ -26,6 +27,7 @@
 /**
  * CLI completer for MA Name creation.
  */
+@Service
 public class CfmMaNameCompleter extends AbstractChoicesCompleter {
     @Override
     public List<String> choices() {
diff --git a/apps/cfm/nbi/src/main/java/org/onosproject/cfm/cli/completer/CfmMaNameTypeCompleter.java b/apps/cfm/nbi/src/main/java/org/onosproject/cfm/cli/completer/CfmMaNameTypeCompleter.java
index d59a5c8..fc13b26 100644
--- a/apps/cfm/nbi/src/main/java/org/onosproject/cfm/cli/completer/CfmMaNameTypeCompleter.java
+++ b/apps/cfm/nbi/src/main/java/org/onosproject/cfm/cli/completer/CfmMaNameTypeCompleter.java
@@ -15,8 +15,11 @@
  */
 package org.onosproject.cfm.cli.completer;
 
-import org.apache.karaf.shell.console.Completer;
-import org.apache.karaf.shell.console.completer.StringsCompleter;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
+import org.apache.karaf.shell.api.console.CommandLine;
+import org.apache.karaf.shell.api.console.Completer;
+import org.apache.karaf.shell.api.console.Session;
+import org.apache.karaf.shell.support.completers.StringsCompleter;
 import org.onosproject.incubator.net.l2monitoring.cfm.identifier.MaIdShort;
 
 import java.util.List;
@@ -25,9 +28,10 @@
 /**
  * CLI completer for MA name type creation.
  */
+@Service
 public class CfmMaNameTypeCompleter implements Completer {
     @Override
-    public int complete(String buffer, int cursor, List<String> candidates) {
+    public int complete(Session session, CommandLine commandLine, List<String> candidates) {
         // Delegate string completer
         StringsCompleter delegate = new StringsCompleter();
         SortedSet<String> strings = delegate.getStrings();
@@ -37,7 +41,7 @@
         }
 
         // Now let the completer do the work for figuring out what to offer.
-        return delegate.complete(buffer, cursor, candidates);
+        return delegate.complete(session, commandLine, candidates);
     }
 
 }
diff --git a/apps/cfm/nbi/src/main/java/org/onosproject/cfm/cli/completer/CfmMdLevelCompleter.java b/apps/cfm/nbi/src/main/java/org/onosproject/cfm/cli/completer/CfmMdLevelCompleter.java
index 374e549..a006850 100644
--- a/apps/cfm/nbi/src/main/java/org/onosproject/cfm/cli/completer/CfmMdLevelCompleter.java
+++ b/apps/cfm/nbi/src/main/java/org/onosproject/cfm/cli/completer/CfmMdLevelCompleter.java
@@ -15,6 +15,7 @@
  */
 package org.onosproject.cfm.cli.completer;
 
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.cli.AbstractChoicesCompleter;
 import org.onosproject.incubator.net.l2monitoring.cfm.MaintenanceDomain;
 
@@ -24,6 +25,7 @@
 /**
  * CLI completer for MD Level creation.
  */
+@Service
 public class CfmMdLevelCompleter extends AbstractChoicesCompleter {
     @Override
     public List<String> choices() {
diff --git a/apps/cfm/nbi/src/main/java/org/onosproject/cfm/cli/completer/CfmMdNameCompleter.java b/apps/cfm/nbi/src/main/java/org/onosproject/cfm/cli/completer/CfmMdNameCompleter.java
index 7a336e7..7badb1b 100644
--- a/apps/cfm/nbi/src/main/java/org/onosproject/cfm/cli/completer/CfmMdNameCompleter.java
+++ b/apps/cfm/nbi/src/main/java/org/onosproject/cfm/cli/completer/CfmMdNameCompleter.java
@@ -15,6 +15,7 @@
  */
 package org.onosproject.cfm.cli.completer;
 
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.cli.AbstractChoicesCompleter;
 import static org.onosproject.cli.AbstractShellCommand.get;
 import org.onosproject.incubator.net.l2monitoring.cfm.service.CfmMdService;
@@ -25,6 +26,7 @@
 /**
  * CLI completer for MD Name creation.
  */
+@Service
 public class CfmMdNameCompleter extends AbstractChoicesCompleter {
     @Override
     public List<String> choices() {
diff --git a/apps/cfm/nbi/src/main/java/org/onosproject/cfm/cli/completer/CfmMdNameTypeCompleter.java b/apps/cfm/nbi/src/main/java/org/onosproject/cfm/cli/completer/CfmMdNameTypeCompleter.java
index 6e24fc7..659d537 100644
--- a/apps/cfm/nbi/src/main/java/org/onosproject/cfm/cli/completer/CfmMdNameTypeCompleter.java
+++ b/apps/cfm/nbi/src/main/java/org/onosproject/cfm/cli/completer/CfmMdNameTypeCompleter.java
@@ -15,8 +15,11 @@
  */
 package org.onosproject.cfm.cli.completer;
 
-import org.apache.karaf.shell.console.Completer;
-import org.apache.karaf.shell.console.completer.StringsCompleter;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
+import org.apache.karaf.shell.api.console.CommandLine;
+import org.apache.karaf.shell.api.console.Completer;
+import org.apache.karaf.shell.api.console.Session;
+import org.apache.karaf.shell.support.completers.StringsCompleter;
 import org.onosproject.incubator.net.l2monitoring.cfm.identifier.MdId;
 
 import java.util.List;
@@ -25,9 +28,10 @@
 /**
  * CLI completer for MD Name Type creation.
  */
+@Service
 public class CfmMdNameTypeCompleter implements Completer {
     @Override
-    public int complete(String buffer, int cursor, List<String> candidates) {
+    public int complete(Session session, CommandLine commandLine, List<String> candidates) {
         // Delegate string completer
         StringsCompleter delegate = new StringsCompleter();
         SortedSet<String> strings = delegate.getStrings();
@@ -37,7 +41,7 @@
         }
 
         // Now let the completer do the work for figuring out what to offer.
-        return delegate.complete(buffer, cursor, candidates);
+        return delegate.complete(session, commandLine, candidates);
     }
 
 }
diff --git a/apps/cfm/nbi/src/main/java/org/onosproject/cfm/cli/completer/CfmMepIdCompleter.java b/apps/cfm/nbi/src/main/java/org/onosproject/cfm/cli/completer/CfmMepIdCompleter.java
index a26a460..23aa324 100644
--- a/apps/cfm/nbi/src/main/java/org/onosproject/cfm/cli/completer/CfmMepIdCompleter.java
+++ b/apps/cfm/nbi/src/main/java/org/onosproject/cfm/cli/completer/CfmMepIdCompleter.java
@@ -15,6 +15,7 @@
  */
 package org.onosproject.cfm.cli.completer;
 
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.cli.AbstractChoicesCompleter;
 import org.onosproject.incubator.net.l2monitoring.cfm.service.CfmConfigException;
 import org.onosproject.incubator.net.l2monitoring.cfm.service.CfmMdService;
@@ -30,6 +31,7 @@
 /**
  * CLI completer for Mep Id creation.
  */
+@Service
 public class CfmMepIdCompleter extends AbstractChoicesCompleter {
     private final Logger log = getLogger(getClass());
 
diff --git a/apps/cfm/nbi/src/main/resources/OSGI-INF/blueprint/shell-config.xml b/apps/cfm/nbi/src/main/resources/OSGI-INF/blueprint/shell-config.xml
deleted file mode 100644
index fcd66a0..0000000
--- a/apps/cfm/nbi/src/main/resources/OSGI-INF/blueprint/shell-config.xml
+++ /dev/null
@@ -1,88 +0,0 @@
-<!--
-  ~ Copyright 2017-present Open Networking Foundation
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~     http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License.
-  -->
-<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0">
-
-    <command-bundle xmlns="http://karaf.apache.org/xmlns/shell/v1.1.0">
-        <command>
-            <action class="org.onosproject.cfm.cli.CfmMdAddCommand"/>
-            <completers>
-                <ref component-id="mdNameTypeCompleter"/>
-                <ref component-id="placeholderCompleter"/>
-                <ref component-id="mdLevelCompleter"/>
-                <ref component-id="placeholderCompleter"/>
-            </completers>
-        </command>
-        <command>
-            <action class="org.onosproject.cfm.cli.CfmMdDeleteCommand"/>
-            <completers>
-                <ref component-id="mdNameCompleter"/>
-            </completers>
-        </command>
-        <command>
-            <action class="org.onosproject.cfm.cli.CfmMdListMdCommand"/>
-            <completers>
-                <ref component-id="mdNameCompleter"/>
-            </completers>
-        </command>
-        <command>
-            <action class="org.onosproject.cfm.cli.CfmMaAddCommand"/>
-            <completers>
-                <ref component-id="mdNameCompleter"/>
-                <ref component-id="maNameTypeCompleter"/>
-                <ref component-id="placeholderCompleter"/>
-                <ref component-id="maCcmIntervalCompleter"/>
-                <ref component-id="placeholderCompleter"/>
-                <ref component-id="placeholderCompleter"/>
-                <ref component-id="compTagTypeCompleter"/>
-                <ref component-id="compMhfCompleter"/>
-                <ref component-id="placeholderCompleter"/>
-            </completers>
-        </command>
-        <command>
-            <action class="org.onosproject.cfm.cli.CfmMaDeleteCommand"/>
-            <completers>
-                <ref component-id="maNameCompleter"/>
-            </completers>
-        </command>
-        <command>
-            <action class="org.onosproject.cfm.cli.CfmMepListCommand"/>
-            <completers>
-                <ref component-id="mepIdCompleter"/>
-            </completers>
-        </command>
-        <command>
-            <action class="org.onosproject.cfm.cli.CfmMepListDeviceCommand"/>
-            <completers>
-                <ref component-id="mepDeviceIdCompleter"/>
-            </completers>
-        </command>
-    </command-bundle>
-
-    <bean id="placeholderCompleter" class="org.onosproject.cli.PlaceholderCompleter"/>
-    <bean id="mdNameTypeCompleter" class="org.onosproject.cfm.cli.completer.CfmMdNameTypeCompleter"/>
-    <bean id="maNameTypeCompleter" class="org.onosproject.cfm.cli.completer.CfmMaNameTypeCompleter"/>
-    <bean id="mdNameCompleter" class="org.onosproject.cfm.cli.completer.CfmMdNameCompleter"/>
-    <bean id="maNameCompleter" class="org.onosproject.cfm.cli.completer.CfmMaNameCompleter"/>
-    <bean id="mdLevelCompleter" class="org.onosproject.cfm.cli.completer.CfmMdLevelCompleter"/>
-    <bean id="maCcmIntervalCompleter" class="org.onosproject.cfm.cli.completer.CfmMaCcmIntervalCompleter"/>
-    <bean id="compTagTypeCompleter" class="org.onosproject.cfm.cli.completer.CfmCompTagTypeCompleter"/>
-    <bean id="compMhfCompleter" class="org.onosproject.cfm.cli.completer.CfmCompMhfCompleter"/>
-    <bean id="mepIdCompleter" class="org.onosproject.cfm.cli.completer.CfmMepIdCompleter"/>
-    <bean id="mepDeviceIdCompleter" class="org.onosproject.cfm.cli.completer.CfmDeviceIdCompleter"/>
-
-</blueprint>
-
-
diff --git a/apps/cip/BUCK b/apps/cip/BUCK
deleted file mode 100644
index a7590d9..0000000
--- a/apps/cip/BUCK
+++ /dev/null
@@ -1,14 +0,0 @@
-COMPILE_DEPS = [
-    '//lib:CORE_DEPS',
-]
-
-osgi_jar_with_tests (
-    deps = COMPILE_DEPS,
-)
-
-onos_app (
-    title = 'Cluster IP Alias',
-    category = 'Utility',
-    url = 'http://onosproject.org',
-    description = 'ONOS Cluster IP alias application.',
-)
diff --git a/apps/cip/src/main/java/org/onosproject/cip/ClusterIpManager.java b/apps/cip/src/main/java/org/onosproject/cip/ClusterIpManager.java
index 5dff893..fd8bb40 100644
--- a/apps/cip/src/main/java/org/onosproject/cip/ClusterIpManager.java
+++ b/apps/cip/src/main/java/org/onosproject/cip/ClusterIpManager.java
@@ -16,14 +16,6 @@
 package org.onosproject.cip;
 
 import com.google.common.io.ByteStreams;
-
-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.onosproject.cfg.ComponentConfigService;
 import org.onosproject.cluster.ClusterService;
 import org.onosproject.cluster.LeadershipEvent;
@@ -31,6 +23,12 @@
 import org.onosproject.cluster.LeadershipService;
 import org.onosproject.cluster.NodeId;
 import org.osgi.service.component.ComponentContext;
+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 org.slf4j.LoggerFactory;
 
@@ -41,6 +39,12 @@
 
 import static com.google.common.base.Strings.isNullOrEmpty;
 import static org.onlab.util.Tools.get;
+import static org.onosproject.cip.OsgiPropertyConstants.ALIAS_ADAPTER;
+import static org.onosproject.cip.OsgiPropertyConstants.ALIAS_ADAPTER_DEFAULT;
+import static org.onosproject.cip.OsgiPropertyConstants.ALIAS_IP;
+import static org.onosproject.cip.OsgiPropertyConstants.ALIAS_IP_DEFAULT;
+import static org.onosproject.cip.OsgiPropertyConstants.ALIAS_MASK;
+import static org.onosproject.cip.OsgiPropertyConstants.ALIAS_MASK_DEFAULT;
 
 /**
  * Manages cluster IP address alias.
@@ -56,20 +60,27 @@
  * This will make sure that if the process is killed abruptly, the IP alias
  * will be dropped upon respawn.
  */
-@Component(immediate = true)
+@Component(
+    immediate = true,
+    property = {
+        ALIAS_IP + "=" + ALIAS_IP_DEFAULT,
+        ALIAS_MASK + "=" + ALIAS_MASK_DEFAULT,
+        ALIAS_ADAPTER + "=" + ALIAS_ADAPTER_DEFAULT
+    }
+)
 public class ClusterIpManager {
 
     private final Logger log = LoggerFactory.getLogger(getClass());
 
     private static final String CLUSTER_IP = "cluster/ip";
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected ClusterService clusterService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected LeadershipService leadershipService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected ComponentConfigService cfgService;
 
     private final LeadershipEventListener listener = new InternalLeadershipListener();
@@ -77,17 +88,14 @@
     private NodeId localId;
     private boolean wasLeader = false;
 
-    // By default there is no IP; this has to be configured
-    @Property(name = "aliasIp", value = "", label = "Alias IP address")
-    private String aliasIp = "";
+    /** Alias IP address. */
+    private String aliasIp = ALIAS_IP_DEFAULT;
 
-    public static final String DEFAULT_MASK = "255.255.0.0";
-    @Property(name = "aliasMask", value = DEFAULT_MASK, label = "Alias IP mask")
-    private String aliasMask = DEFAULT_MASK;
+    /** Alias IP mask. */
+    private String aliasMask = ALIAS_MASK_DEFAULT;
 
-    public static final String ETH_0 = "eth0:0";
-    @Property(name = "aliasAdapter", value = ETH_0, label = "Alias IP adapter")
-    private String aliasAdapter = ETH_0;
+    /** Alias IP adapter. */
+    private String aliasAdapter = ALIAS_ADAPTER_DEFAULT;
 
     @Activate
     protected void activate(ComponentContext context) {
@@ -116,9 +124,9 @@
     protected void modified(ComponentContext context) {
         log.info("Received configuration change...");
         Dictionary<?, ?> properties = context != null ? context.getProperties() : new Properties();
-        String newIp = get(properties, "aliasIp");
-        String newMask = get(properties, "aliasMask");
-        String newAdapter = get(properties, "aliasAdapter");
+        String newIp = get(properties, ALIAS_IP);
+        String newMask = get(properties, ALIAS_MASK);
+        String newAdapter = get(properties, ALIAS_ADAPTER);
 
         // Process any changes in the parameters...
         if (!Objects.equals(newIp, aliasIp) ||
diff --git a/apps/cip/src/main/java/org/onosproject/cip/OsgiPropertyConstants.java b/apps/cip/src/main/java/org/onosproject/cip/OsgiPropertyConstants.java
new file mode 100644
index 0000000..c6bcb52
--- /dev/null
+++ b/apps/cip/src/main/java/org/onosproject/cip/OsgiPropertyConstants.java
@@ -0,0 +1,31 @@
+/*
+ * Copyright 2018-present Open Networking Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.onosproject.cip;
+
+public final class OsgiPropertyConstants {
+    private OsgiPropertyConstants() {
+    }
+
+    static final String ALIAS_IP = "aliasIp";
+    static final String ALIAS_IP_DEFAULT = "";
+
+    static final String ALIAS_MASK = "aliasMask";
+    static final String ALIAS_MASK_DEFAULT = "255.255.0.0";
+
+    static final String ALIAS_ADAPTER = "aliasAdapter";
+    static final String ALIAS_ADAPTER_DEFAULT = "eth0:0";
+}
diff --git a/apps/config/BUCK b/apps/config/BUCK
deleted file mode 100644
index dac73d6..0000000
--- a/apps/config/BUCK
+++ /dev/null
@@ -1,28 +0,0 @@
-APPS = [
-    'org.onosproject.yang',
-]
-
-COMPILE_DEPS = [
-    '//lib:CORE_DEPS',
-    '//lib:KRYO',
-    '//lib:org.apache.karaf.shell.console',
-    '//lib:onos-yang-model',
-    '//core/store/serializers:onos-core-serializers',
-    '//cli:onos-cli',
-    '//lib:commons-text',
-]
-
-osgi_jar_with_tests (
-    deps = COMPILE_DEPS,
-)
-
-onos_app (
-    title = 'Dynamic Configuration',
-    category = 'Utility',
-    url = 'http://onosproject.org',
-    description = 'Provides means to track and distribute service and device configuration data ' +
-        'throughout the ONOS cluster. It works with the YANG runtime to ensure that the tracked ' +
-        'data adheres to the registered YANG models. Applications can traverse and access this ' +
-        'data which is organized in a logically unified tree.<p/>(Under development)',
-    required_apps = APPS,
-)
diff --git a/apps/config/src/main/java/org/onosproject/config/impl/DistributedDynamicConfigStore.java b/apps/config/src/main/java/org/onosproject/config/impl/DistributedDynamicConfigStore.java
index f74e26c..62cd86d 100644
--- a/apps/config/src/main/java/org/onosproject/config/impl/DistributedDynamicConfigStore.java
+++ b/apps/config/src/main/java/org/onosproject/config/impl/DistributedDynamicConfigStore.java
@@ -16,12 +16,6 @@
 package org.onosproject.config.impl;
 
 import com.google.common.annotations.Beta;
-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.KryoNamespace;
 import org.onosproject.config.DynamicConfigEvent;
 import org.onosproject.config.DynamicConfigStore;
@@ -56,6 +50,11 @@
 import org.onosproject.yang.model.NodeKey;
 import org.onosproject.yang.model.ResourceId;
 import org.onosproject.yang.model.SchemaId;
+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;
 
@@ -66,6 +65,7 @@
 import java.util.Optional;
 import java.util.concurrent.CompletableFuture;
 import java.util.concurrent.ExecutionException;
+
 import static org.onosproject.config.DynamicConfigEvent.Type.NODE_ADDED;
 import static org.onosproject.config.DynamicConfigEvent.Type.NODE_DELETED;
 import static org.onosproject.config.DynamicConfigEvent.Type.NODE_UPDATED;
@@ -76,15 +76,14 @@
  * Implementation of the dynamic config store.
  */
 @Beta
-@Component(immediate = true)
-@Service
+@Component(immediate = true, service = DynamicConfigStore.class)
 public class DistributedDynamicConfigStore
         extends AbstractStore<DynamicConfigEvent, DynamicConfigStoreDelegate>
         implements DynamicConfigStore {
 
     private final Logger log = LoggerFactory.getLogger(getClass());
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected StorageService storageService;
 
     // FIXME transactionally mutate the 2 or consolidate into 1 AsyncDocTree
diff --git a/apps/config/src/main/java/org/onosproject/config/impl/DynamicConfigManager.java b/apps/config/src/main/java/org/onosproject/config/impl/DynamicConfigManager.java
index 944cd02..074f8d4 100644
--- a/apps/config/src/main/java/org/onosproject/config/impl/DynamicConfigManager.java
+++ b/apps/config/src/main/java/org/onosproject/config/impl/DynamicConfigManager.java
@@ -15,17 +15,6 @@
  */
 package org.onosproject.config.impl;
 
-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.config.RpcExecutor;
-import org.onosproject.config.RpcMessageId;
-import org.onosproject.d.config.DeviceResourceIds;
-import org.onosproject.d.config.ResourceIds;
-import org.onosproject.event.AbstractListenerManager;
 import org.onosproject.config.DynamicConfigEvent;
 import org.onosproject.config.DynamicConfigListener;
 import org.onosproject.config.DynamicConfigService;
@@ -33,23 +22,33 @@
 import org.onosproject.config.DynamicConfigStoreDelegate;
 import org.onosproject.config.FailedException;
 import org.onosproject.config.Filter;
-import org.onosproject.yang.model.RpcInput;
-import org.onosproject.yang.model.RpcOutput;
+import org.onosproject.config.RpcExecutor;
+import org.onosproject.config.RpcMessageId;
+import org.onosproject.d.config.DeviceResourceIds;
+import org.onosproject.d.config.ResourceIds;
+import org.onosproject.event.AbstractListenerManager;
 import org.onosproject.yang.model.DataNode;
 import org.onosproject.yang.model.DataNode.Type;
 import org.onosproject.yang.model.InnerNode;
 import org.onosproject.yang.model.ResourceId;
 import org.onosproject.yang.model.RpcContext;
+import org.onosproject.yang.model.RpcInput;
+import org.onosproject.yang.model.RpcOutput;
 import org.onosproject.yang.model.RpcRegistry;
 import org.onosproject.yang.model.RpcService;
 import org.onosproject.yang.model.SchemaContextProvider;
+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.HashSet;
 import java.util.Map;
 import java.util.Set;
 import java.util.concurrent.CompletableFuture;
 import java.util.concurrent.ConcurrentHashMap;
-import org.slf4j.Logger;
 
 import static com.google.common.base.Preconditions.checkNotNull;
 import static org.onosproject.d.config.DeviceResourceIds.DCS_NAMESPACE;
@@ -59,8 +58,7 @@
  * Implementation of the Dynamic Config Service.
  *
  */
-@Component(immediate = true)
-@Service
+@Component(immediate = true, service = { DynamicConfigService.class, RpcRegistry.class })
 public class DynamicConfigManager
         extends AbstractListenerManager<DynamicConfigEvent, DynamicConfigListener>
         implements DynamicConfigService, RpcRegistry {
@@ -68,10 +66,10 @@
     private final Logger log = getLogger(getClass());
     private final DynamicConfigStoreDelegate storeDelegate = new InternalStoreDelegate();
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected DynamicConfigStore store;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected SchemaContextProvider contextProvider;
 
     // FIXME is it OK this is not using the Store?
diff --git a/apps/configsync-netconf/BUCK b/apps/configsync-netconf/BUCK
deleted file mode 100644
index 2fc0e10..0000000
--- a/apps/configsync-netconf/BUCK
+++ /dev/null
@@ -1,31 +0,0 @@
-APPS = [
-    'org.onosproject.configsync',
-    'org.onosproject.yang',
-    'org.onosproject.netconf',
-]
-
-COMPILE_DEPS = [
-    '//lib:CORE_DEPS',
-    '//lib:onos-yang-model',
-    '//lib:onos-yang-runtime',
-    '//protocols/netconf/api:onos-protocols-netconf-api',
-    '//apps/config:onos-apps-config',
-    '//apps/configsync:onos-apps-configsync',
-]
-
-TEST_DEPS = [
-    '//lib:TEST_ADAPTERS',
-]
-
-osgi_jar_with_tests (
-    deps = COMPILE_DEPS,
-    test_deps = TEST_DEPS,
-)
-
-onos_app (
-    title = 'Dynamic Configuration Synchronizer for NETCONF',
-    category = 'Utility',
-    url = 'http://onosproject.org',
-    description = 'Application to support the Dynamic configuration service.',
-    required_apps = APPS,
-)
diff --git a/apps/configsync-netconf/src/main/java/org/onosproject/d/config/sync/impl/netconf/NetconfDeviceConfigSynchronizerComponent.java b/apps/configsync-netconf/src/main/java/org/onosproject/d/config/sync/impl/netconf/NetconfDeviceConfigSynchronizerComponent.java
index e3ec5c7..d107da7 100644
--- a/apps/configsync-netconf/src/main/java/org/onosproject/d/config/sync/impl/netconf/NetconfDeviceConfigSynchronizerComponent.java
+++ b/apps/configsync-netconf/src/main/java/org/onosproject/d/config/sync/impl/netconf/NetconfDeviceConfigSynchronizerComponent.java
@@ -15,11 +15,11 @@
  */
 package org.onosproject.d.config.sync.impl.netconf;
 
-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.onosproject.d.config.sync.DeviceConfigSynchronizationProviderRegistry;
 import org.onosproject.d.config.sync.DeviceConfigSynchronizationProviderService;
 import org.onosproject.net.device.DeviceService;
@@ -51,19 +51,19 @@
     public static final ProviderId PID =
             new ProviderId("netconf", "org.onosproject.d.config.sync.netconf");
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected DeviceConfigSynchronizationProviderRegistry registry;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected NetconfController netconfController;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected YangRuntimeService yangRuntimeService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected SchemaContextProvider schemaContextProvider;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected DeviceService deviceService;
 
     private NetconfDeviceConfigSynchronizerProvider provider;
diff --git a/apps/configsync/BUCK b/apps/configsync/BUCK
deleted file mode 100644
index aa9caf1..0000000
--- a/apps/configsync/BUCK
+++ /dev/null
@@ -1,22 +0,0 @@
-APPS = [
-    # dynamic config
-    'org.onosproject.config',
-]
-
-COMPILE_DEPS = [
-    '//lib:CORE_DEPS',
-    '//apps/config:onos-apps-config',
-    '//lib:onos-yang-model',
-]
-
-osgi_jar_with_tests (
-    deps = COMPILE_DEPS,
-)
-
-onos_app (
-    title = 'Dynamic Configuration Synchronizer',
-    category = 'Utility',
-    url = 'http://onosproject.org',
-    description = 'Application to support the Dynamic configuration service.',
-    required_apps = APPS,
-)
diff --git a/apps/configsync/src/main/java/org/onosproject/d/config/sync/impl/DynamicDeviceConfigSynchronizer.java b/apps/configsync/src/main/java/org/onosproject/d/config/sync/impl/DynamicDeviceConfigSynchronizer.java
index c2f9a9e..ab094fc 100644
--- a/apps/configsync/src/main/java/org/onosproject/d/config/sync/impl/DynamicDeviceConfigSynchronizer.java
+++ b/apps/configsync/src/main/java/org/onosproject/d/config/sync/impl/DynamicDeviceConfigSynchronizer.java
@@ -15,27 +15,9 @@
  */
 package org.onosproject.d.config.sync.impl;
 
-import static java.util.concurrent.CompletableFuture.completedFuture;
-import static org.onosproject.d.config.DeviceResourceIds.isUnderDeviceRootNode;
-import static org.onosproject.d.config.DeviceResourceIds.toDeviceId;
-import static org.onosproject.d.config.DeviceResourceIds.toResourceId;
-import static org.onosproject.d.config.sync.operation.SetResponse.response;
-import static org.slf4j.LoggerFactory.getLogger;
-
-import java.time.Duration;
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.concurrent.CompletableFuture;
-import java.util.stream.Collectors;
-
-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.annotations.Beta;
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableMap;
 import org.onlab.util.Tools;
 import org.onosproject.config.DynamicConfigEvent;
 import org.onosproject.config.DynamicConfigEvent.Type;
@@ -58,11 +40,27 @@
 import org.onosproject.store.primitives.TransactionId;
 import org.onosproject.yang.model.DataNode;
 import org.onosproject.yang.model.ResourceId;
+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.annotations.Beta;
-import com.google.common.collect.ImmutableList;
-import com.google.common.collect.ImmutableMap;
+import java.time.Duration;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.concurrent.CompletableFuture;
+import java.util.stream.Collectors;
+
+import static java.util.concurrent.CompletableFuture.completedFuture;
+import static org.onosproject.d.config.DeviceResourceIds.isUnderDeviceRootNode;
+import static org.onosproject.d.config.DeviceResourceIds.toDeviceId;
+import static org.onosproject.d.config.DeviceResourceIds.toResourceId;
+import static org.onosproject.d.config.sync.operation.SetResponse.response;
+import static org.slf4j.LoggerFactory.getLogger;
 
 /**
  * Component to bridge Dynamic Config store and the Device configuration state.
@@ -73,8 +71,7 @@
  * </ul>
  */
 @Beta
-@Component(immediate = true)
-@Service
+@Component(immediate = true, service = DeviceConfigSynchronizationProviderRegistry.class)
 public class DynamicDeviceConfigSynchronizer
     extends AbstractProviderRegistry<DeviceConfigSynchronizationProvider,
                                      DeviceConfigSynchronizationProviderService>
@@ -82,10 +79,10 @@
 
     private static final Logger log = getLogger(DynamicDeviceConfigSynchronizer.class);
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected DynamicConfigService dynConfigService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected NetworkConfigService netcfgService;
 
     private DynamicConfigListener listener = new InnerDyConListener();
diff --git a/apps/cord-support/BUCK b/apps/cord-support/BUCK
deleted file mode 100644
index 2caced2..0000000
--- a/apps/cord-support/BUCK
+++ /dev/null
@@ -1,29 +0,0 @@
-COMPILE_DEPS = [
-  '//lib:CORE_DEPS',
-  '//lib:JACKSON',
-  '//lib:javax.ws.rs-api',
-  '//utils/rest:onlab-rest',
-  '//core/store/serializers:onos-core-serializers',
-]
-
-TEST_DEPS = [
-  '//lib:TEST_REST',
-  '//lib:jersey-server',
-]
-
-osgi_jar_with_tests (
-  deps = COMPILE_DEPS,
-  test_deps = TEST_DEPS,
-  web_context = '/onos/cord-support',
-  api_title = 'CORD Support',
-  api_version = '1.0',
-  api_description = 'REST API for CORD inquiry to ONOS topology',
-  api_package = 'org.onosproject.cordsupport',
-)
-
-onos_app (
-  title = 'CORD Support',
-  category = 'Integration',
-  url = 'http://onosproject.org',
-  description = 'CORD Support application.',
-)
diff --git a/apps/cpman/api/BUCK b/apps/cpman/api/BUCK
deleted file mode 100644
index 4cb1ba0..0000000
--- a/apps/cpman/api/BUCK
+++ /dev/null
@@ -1,14 +0,0 @@
-COMPILE_DEPS = [
-    '//lib:CORE_DEPS',
-    '//core/store/serializers:onos-core-serializers',
- ]
-
-TEST_DEPS = [
-    '//lib:TEST_ADAPTERS',
-]
-
-osgi_jar_with_tests (
-    deps = COMPILE_DEPS,
-    test_deps = TEST_DEPS,
-)
-
diff --git a/apps/cpman/app/BUCK b/apps/cpman/app/BUCK
deleted file mode 100644
index ea4dda7..0000000
--- a/apps/cpman/app/BUCK
+++ /dev/null
@@ -1,48 +0,0 @@
-COMPILE_DEPS = [
-    '//lib:CORE_DEPS',
-    '//lib:JACKSON',
-    '//lib:METRICS',
-    '//lib:KRYO',
-    '//lib:org.apache.karaf.shell.console',
-    '//lib:javax.ws.rs-api',
-    '//lib:rrd4j',
-    '//apps/cpman/api:onos-apps-cpman-api',
-    '//utils/rest:onlab-rest',
-    '//cli:onos-cli',
-    '//core/store/serializers:onos-core-serializers',
-]
-
-TEST_DEPS = [
-    '//lib:TEST_REST',
-    '//web/api:onos-rest-tests',
-]
-
-BUNDLES = [
-    '//apps/cpman/api:onos-apps-cpman-api',
-    ':onos-apps-cpman-app',
-]
-
-EXCLUDED_BUNDLES = [
-    '//lib:rrd4j',
-]
-
-osgi_jar_with_tests (
-    deps = COMPILE_DEPS,
-    test_deps = TEST_DEPS,
-    web_context = '/onos/cpman',
-    api_title = 'Control Plane Manager API',
-    api_version = '1.0',
-    api_description = 'REST API for Control Plane Manager',
-    api_package = 'org.onosproject.cpman.rest',
-)
-
-onos_app (
-    app_name = 'org.onosproject.cpman',
-    title = 'Control Plane Manager',
-    category = 'Monitoring',
-    url = 'http://onosproject.org',
-    description = 'Control Plane Management application for monitoring the health of the ONOS cluster',
-    included_bundles = BUNDLES,
-    excluded_bundles = EXCLUDED_BUNDLES,
-    required_apps = [ 'org.onosproject.openflow-message' ],
-)
diff --git a/apps/cpman/app/BUILD b/apps/cpman/app/BUILD
index 5ff2a6e..02d33cc 100644
--- a/apps/cpman/app/BUILD
+++ b/apps/cpman/app/BUILD
@@ -23,6 +23,7 @@
     api_package = "org.onosproject.cpman.rest",
     api_title = "Control Plane Manager API",
     api_version = "1.0",
+    karaf_command_packages = ["org.onosproject.cpman.cli"],
     test_deps = TEST_DEPS,
     web_context = "/onos/cpman",
     deps = COMPILE_DEPS,
diff --git a/apps/cpman/app/app.xml b/apps/cpman/app/app.xml
deleted file mode 100644
index 6e602ad..0000000
--- a/apps/cpman/app/app.xml
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-  ~ Copyright 2016-present Open Networking Foundation
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~     http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License.
-  -->
-<app name="org.onosproject.cpman" origin="Open Networking Foundation" version="${project.version}"
-     category="Monitoring" url="http://onosproject.org" title="Control Plane Management App"
-     featuresRepo="mvn:${project.groupId}/${project.artifactId}/${project.version}/xml/features"
-     features="${project.artifactId}" apps="org.onosproject.openflow-message">
-    <description>${project.description}</description>
-    <artifact>mvn:${project.groupId}/onos-apps-cpman-app/${project.version}</artifact>
-    <artifact>mvn:${project.groupId}/onos-apps-cpman-api/${project.version}</artifact>
-</app>
diff --git a/apps/cpman/app/features.xml b/apps/cpman/app/features.xml
deleted file mode 100644
index 5e845e5..0000000
--- a/apps/cpman/app/features.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
-<!--
-  ~ Copyright 2016-present Open Networking Foundation
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~     http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License.
-  -->
-<features xmlns="http://karaf.apache.org/xmlns/features/v1.2.0" name="${project.artifactId}-${project.version}">
-    <feature name="${project.artifactId}" version="${project.version}"
-             description="${project.description}">
-        <feature>onos-api</feature>
-        <bundle>mvn:${project.groupId}/onos-apps-cpman-api/${project.version}</bundle>
-        <bundle>mvn:${project.groupId}/onos-apps-cpman/${project.version}</bundle>
-        <bundle>wrap:mvn:org.rrd4j/rrd4j/3.1$Bundle-SymbolicName=rrd4j&amp;Bundle-Version=3.1</bundle>
-    </feature>
-</features>
diff --git a/apps/cpman/app/src/main/java/org/onosproject/cpman/cli/ControlMetricsStatsListCommand.java b/apps/cpman/app/src/main/java/org/onosproject/cpman/cli/ControlMetricsStatsListCommand.java
index 30d1a18..d545094 100644
--- a/apps/cpman/app/src/main/java/org/onosproject/cpman/cli/ControlMetricsStatsListCommand.java
+++ b/apps/cpman/app/src/main/java/org/onosproject/cpman/cli/ControlMetricsStatsListCommand.java
@@ -15,9 +15,12 @@
  */
 package org.onosproject.cpman.cli;
 
-import org.apache.karaf.shell.commands.Argument;
-import org.apache.karaf.shell.commands.Command;
+import org.apache.karaf.shell.api.action.Argument;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.Completion;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.cli.AbstractShellCommand;
+import org.onosproject.cli.NodeIdCompleter;
 import org.onosproject.cluster.NodeId;
 import org.onosproject.cpman.ControlLoadSnapshot;
 import org.onosproject.cpman.ControlMetricType;
@@ -36,6 +39,7 @@
 /**
  * Lists all stats information of control plane metrics.
  */
+@Service
 @Command(scope = "onos", name = "cpman-stats-list",
         description = "Lists control metrics statistics")
 public class ControlMetricsStatsListCommand extends AbstractShellCommand {
@@ -46,19 +50,22 @@
 
     @Argument(index = 0, name = "node", description = "ONOS node identifier",
             required = true, multiValued = false)
+    @Completion(NodeIdCompleter.class)
     String node = null;
 
     @Argument(index = 1, name = "type",
             description = "Resource type (cpu|memory|disk|network|control_message)",
             required = true, multiValued = false)
+    @Completion(ControlResourceTypeCompleter.class)
     String type = null;
 
     @Argument(index = 2, name = "name", description = "Resource name (or Device Id)",
             required = false, multiValued = false)
+    @Completion(ResourceNameCompleter.class)
     String name = null;
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         ControlPlaneMonitorService service = get(ControlPlaneMonitorService.class);
         NodeId nodeId = NodeId.nodeId(node);
         switch (type) {
diff --git a/apps/cpman/app/src/main/java/org/onosproject/cpman/cli/ControlResourceTypeCompleter.java b/apps/cpman/app/src/main/java/org/onosproject/cpman/cli/ControlResourceTypeCompleter.java
index 0236237..1118dc5 100644
--- a/apps/cpman/app/src/main/java/org/onosproject/cpman/cli/ControlResourceTypeCompleter.java
+++ b/apps/cpman/app/src/main/java/org/onosproject/cpman/cli/ControlResourceTypeCompleter.java
@@ -16,6 +16,7 @@
 package org.onosproject.cpman.cli;
 
 import com.google.common.collect.ImmutableList;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.cli.AbstractChoicesCompleter;
 
 import java.util.List;
@@ -26,6 +27,7 @@
 /**
  * Control resource type completer.
  */
+@Service
 public class ControlResourceTypeCompleter extends AbstractChoicesCompleter {
 
     private static final List<Type> RESOURCE_TYPES =
diff --git a/apps/cpman/app/src/main/java/org/onosproject/cpman/cli/ResourceNameCompleter.java b/apps/cpman/app/src/main/java/org/onosproject/cpman/cli/ResourceNameCompleter.java
index 467b46b..337cd1c 100644
--- a/apps/cpman/app/src/main/java/org/onosproject/cpman/cli/ResourceNameCompleter.java
+++ b/apps/cpman/app/src/main/java/org/onosproject/cpman/cli/ResourceNameCompleter.java
@@ -17,8 +17,10 @@
 
 import com.google.common.collect.ImmutableSet;
 import com.google.common.collect.Sets;
-import org.apache.karaf.shell.console.completer.ArgumentCompleter;
-import org.apache.karaf.shell.console.completer.StringsCompleter;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
+import org.apache.karaf.shell.api.console.CommandLine;
+import org.apache.karaf.shell.api.console.Session;
+import org.apache.karaf.shell.support.completers.StringsCompleter;
 import org.onosproject.cli.AbstractCompleter;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.cluster.NodeId;
@@ -34,6 +36,7 @@
 /**
  * Resource name completer.
  */
+@Service
 public class ResourceNameCompleter extends AbstractCompleter {
 
     private final Logger log = LoggerFactory.getLogger(getClass());
@@ -46,14 +49,13 @@
 
 
     @Override
-    public int complete(String buffer, int cursor, List<String> candidates) {
+    public int complete(Session session, CommandLine commandLine, List<String> candidates) {
         // delegate string completer
         StringsCompleter delegate = new StringsCompleter();
 
         // Resource type is the second argument.
-        ArgumentCompleter.ArgumentList list = getArgumentList();
-        String nodeId = list.getArguments()[1];
-        String type = list.getArguments()[2];
+        String nodeId = commandLine.getArguments()[1];
+        String type = commandLine.getArguments()[2];
 
         if (resourceTypes.contains(type)) {
             ControlPlaneMonitorService monitorService =
@@ -85,6 +87,6 @@
             }
         }
 
-        return delegate.complete(buffer, cursor, candidates);
+        return delegate.complete(session, commandLine, candidates);
     }
 }
diff --git a/apps/cpman/app/src/main/java/org/onosproject/cpman/gui/CpmanUI.java b/apps/cpman/app/src/main/java/org/onosproject/cpman/gui/CpmanUI.java
index 0d8f140..097c245 100644
--- a/apps/cpman/app/src/main/java/org/onosproject/cpman/gui/CpmanUI.java
+++ b/apps/cpman/app/src/main/java/org/onosproject/cpman/gui/CpmanUI.java
@@ -16,16 +16,15 @@
 package org.onosproject.cpman.gui;
 
 import com.google.common.collect.ImmutableList;
-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.ui.UiExtension;
 import org.onosproject.ui.UiExtensionService;
 import org.onosproject.ui.UiMessageHandlerFactory;
 import org.onosproject.ui.UiView;
+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;
 
@@ -36,8 +35,7 @@
 /**
  * Mechanism to stream data to the GUI.
  */
-@Component(immediate = true, enabled = true)
-@Service(value = CpmanUI.class)
+@Component(immediate = true, service = CpmanUI.class)
 public class CpmanUI {
     private static final String CPMAN_ID = "cpman";
     private static final String CPMAN_TEXT = "Control Plane Manager";
@@ -46,7 +44,7 @@
 
     private final Logger log = LoggerFactory.getLogger(getClass());
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected UiExtensionService uiExtensionService;
 
     // Factory for UI message handlers
diff --git a/apps/cpman/app/src/main/java/org/onosproject/cpman/impl/ControlPlaneManager.java b/apps/cpman/app/src/main/java/org/onosproject/cpman/impl/ControlPlaneManager.java
index d4139f3..96dde25 100644
--- a/apps/cpman/app/src/main/java/org/onosproject/cpman/impl/ControlPlaneManager.java
+++ b/apps/cpman/app/src/main/java/org/onosproject/cpman/impl/ControlPlaneManager.java
@@ -15,11 +15,11 @@
  */
 package org.onosproject.cpman.impl;
 
-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.onosproject.core.ApplicationId;
 import org.onosproject.core.CoreService;
 import org.onosproject.cpman.ControlMessage;
@@ -45,13 +45,13 @@
 
     private final Logger log = LoggerFactory.getLogger(getClass());
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected CoreService coreService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected ControlMessageService messageService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected ControlPlaneMonitorService monitorService;
 
     private final ControlMessageListener messageListener =
diff --git a/apps/cpman/app/src/main/java/org/onosproject/cpman/impl/ControlPlaneMonitor.java b/apps/cpman/app/src/main/java/org/onosproject/cpman/impl/ControlPlaneMonitor.java
index dbc8082..ea2dabc 100644
--- a/apps/cpman/app/src/main/java/org/onosproject/cpman/impl/ControlPlaneMonitor.java
+++ b/apps/cpman/app/src/main/java/org/onosproject/cpman/impl/ControlPlaneMonitor.java
@@ -19,12 +19,6 @@
 import com.google.common.collect.ImmutableSet;
 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.onlab.util.KryoNamespace;
 import org.onosproject.cluster.ClusterService;
 import org.onosproject.cluster.NodeId;
@@ -42,6 +36,11 @@
 import org.onosproject.store.cluster.messaging.MessageSubject;
 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;
 
@@ -63,8 +62,7 @@
 /**
  * Control plane monitoring service class.
  */
-@Component(immediate = true)
-@Service
+@Component(immediate = true, service = ControlPlaneMonitorService.class)
 public class ControlPlaneMonitor implements ControlPlaneMonitorService {
 
     private final Logger log = LoggerFactory.getLogger(getClass());
@@ -74,10 +72,10 @@
     private Map<String, MetricsDatabase> diskMetricsMap;
     private Map<String, MetricsDatabase> networkMetricsMap;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected ClusterService clusterService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected ClusterCommunicationService communicationService;
 
     private static final String DEFAULT_RESOURCE = "default";
diff --git a/apps/cpman/app/src/main/java/org/onosproject/cpman/impl/message/ControlMessageManager.java b/apps/cpman/app/src/main/java/org/onosproject/cpman/impl/message/ControlMessageManager.java
index 2b491b4..bb92c1b 100644
--- a/apps/cpman/app/src/main/java/org/onosproject/cpman/impl/message/ControlMessageManager.java
+++ b/apps/cpman/app/src/main/java/org/onosproject/cpman/impl/message/ControlMessageManager.java
@@ -15,12 +15,6 @@
  */
 package org.onosproject.cpman.impl.message;
 
-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.cpman.ControlMessage;
 import org.onosproject.cpman.message.ControlMessageAdminService;
 import org.onosproject.cpman.message.ControlMessageEvent;
@@ -34,6 +28,11 @@
 import org.onosproject.net.DeviceId;
 import org.onosproject.net.provider.AbstractListenerProviderRegistry;
 import org.onosproject.net.provider.AbstractProviderService;
+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.Set;
@@ -44,8 +43,8 @@
 /**
  * Provides implementation of the control message SB &amp; NB APIs.
  */
-@Component(immediate = true)
-@Service
+@Component(immediate = true, service = { ControlMessageService.class, ControlMessageAdminService.class,
+        ControlMessageProviderRegistry.class })
 public class ControlMessageManager
         extends AbstractListenerProviderRegistry<ControlMessageEvent, ControlMessageListener,
         ControlMessageProvider, ControlMessageProviderService>
@@ -58,7 +57,7 @@
 
     private final ControlMessageStoreDelegate delegate = new InternalStoreDelegate();
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected ControlMessageStore store;
 
     @Activate
diff --git a/apps/cpman/app/src/main/java/org/onosproject/cpman/impl/message/DefaultControlMessageStore.java b/apps/cpman/app/src/main/java/org/onosproject/cpman/impl/message/DefaultControlMessageStore.java
index 660d9f0..eda361a 100644
--- a/apps/cpman/app/src/main/java/org/onosproject/cpman/impl/message/DefaultControlMessageStore.java
+++ b/apps/cpman/app/src/main/java/org/onosproject/cpman/impl/message/DefaultControlMessageStore.java
@@ -15,10 +15,6 @@
  */
 package org.onosproject.cpman.impl.message;
 
-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.onosproject.cpman.ControlMessage;
 import org.onosproject.cpman.message.ControlMessageEvent;
 import org.onosproject.cpman.message.ControlMessageStore;
@@ -26,6 +22,9 @@
 import org.onosproject.net.DeviceId;
 import org.onosproject.net.provider.ProviderId;
 import org.onosproject.store.AbstractStore;
+import org.osgi.service.component.annotations.Activate;
+import org.osgi.service.component.annotations.Component;
+import org.osgi.service.component.annotations.Deactivate;
 import org.slf4j.Logger;
 
 import java.util.Set;
@@ -36,8 +35,7 @@
  * Manages inventory of control message using trivial in-memory structures
  * implementation.
  */
-@Component(immediate = true)
-@Service
+@Component(immediate = true, service = ControlMessageStore.class)
 public class DefaultControlMessageStore
         extends AbstractStore<ControlMessageEvent, ControlMessageStoreDelegate>
         implements ControlMessageStore {
diff --git a/apps/cpman/app/src/main/java/org/onosproject/cpman/rest/CPManCodecRegistrator.java b/apps/cpman/app/src/main/java/org/onosproject/cpman/rest/CPManCodecRegistrator.java
index c49da94..961f4b1 100644
--- a/apps/cpman/app/src/main/java/org/onosproject/cpman/rest/CPManCodecRegistrator.java
+++ b/apps/cpman/app/src/main/java/org/onosproject/cpman/rest/CPManCodecRegistrator.java
@@ -15,11 +15,11 @@
  */
 package org.onosproject.cpman.rest;
 
-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.onosproject.codec.CodecService;
 import org.onosproject.cpman.ControlLoadSnapshot;
 import org.onosproject.cpman.codec.ControlLoadSnapshotCodec;
@@ -35,7 +35,7 @@
 
     private final Logger log = getLogger(getClass());
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected CodecService codecService;
 
     @Activate
diff --git a/apps/cpman/app/src/main/resources/OSGI-INF/blueprint/shell-config.xml b/apps/cpman/app/src/main/resources/OSGI-INF/blueprint/shell-config.xml
deleted file mode 100644
index 592b69e..0000000
--- a/apps/cpman/app/src/main/resources/OSGI-INF/blueprint/shell-config.xml
+++ /dev/null
@@ -1,32 +0,0 @@
-<!--
-  ~ Copyright 2016-present Open Networking Foundation
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~     http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License.
-  -->
-<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0">
-
-    <command-bundle xmlns="http://karaf.apache.org/xmlns/shell/v1.1.0">
-        <command>
-            <action class="org.onosproject.cpman.cli.ControlMetricsStatsListCommand"/>
-            <completers>
-                <ref component-id="nodeIdCompleter"/>
-                <ref component-id="controlResourceTypeCompleter"/>
-                <ref component-id="resourceNameCompleter"/>
-            </completers>
-        </command>
-    </command-bundle>
-
-    <bean id="nodeIdCompleter" class="org.onosproject.cli.NodeIdCompleter"/>
-    <bean id="controlResourceTypeCompleter" class="org.onosproject.cpman.cli.ControlResourceTypeCompleter"/>
-    <bean id="resourceNameCompleter" class="org.onosproject.cpman.cli.ResourceNameCompleter"/>
-</blueprint>
\ No newline at end of file
diff --git a/apps/dhcp/BUCK b/apps/dhcp/BUCK
deleted file mode 100644
index fbbb126..0000000
--- a/apps/dhcp/BUCK
+++ /dev/null
@@ -1,11 +0,0 @@
-BUNDLES = [
-    '//apps/dhcp/api:onos-apps-dhcp-api',
-    '//apps/dhcp/app:onos-apps-dhcp-app',
-]
-
-onos_app (
-  title = 'DHCP Server',
-  category = 'Utility',
-  url = 'http://onosproject.org',
-  included_bundles = BUNDLES,
-)
diff --git a/apps/dhcp/api/BUCK b/apps/dhcp/api/BUCK
deleted file mode 100644
index ee55792..0000000
--- a/apps/dhcp/api/BUCK
+++ /dev/null
@@ -1,7 +0,0 @@
-COMPILE_DEPS = [
-    '//lib:CORE_DEPS',
-]
-
-osgi_jar_with_tests (
-    deps = COMPILE_DEPS,
-)
\ No newline at end of file
diff --git a/apps/dhcp/app/BUCK b/apps/dhcp/app/BUCK
deleted file mode 100644
index 7dd3a0e..0000000
--- a/apps/dhcp/app/BUCK
+++ /dev/null
@@ -1,25 +0,0 @@
-COMPILE_DEPS = [
-    '//lib:CORE_DEPS',
-    '//lib:JACKSON',
-    '//lib:KRYO',
-    '//lib:javax.ws.rs-api',
-    '//lib:org.apache.karaf.shell.console',
-    '//apps/dhcp/api:onos-apps-dhcp-api',
-    '//utils/rest:onlab-rest',
-    '//core/store/serializers:onos-core-serializers',
-    '//cli:onos-cli',
-]
-
-TEST_DEPS = [
-    '//lib:TEST_ADAPTERS',
-]
-
-osgi_jar_with_tests (
-    deps = COMPILE_DEPS,
-    test_deps = TEST_DEPS,
-    web_context = '/onos/dhcp',
-    api_title = 'DHCP Server',
-    api_version = '1.0',
-    api_description = 'REST API for DHCP Server',
-    api_package = 'org.onosproject.dhcp.rest',
-)
diff --git a/apps/dhcp/app/BUILD b/apps/dhcp/app/BUILD
index a19dd53..5d9634c 100644
--- a/apps/dhcp/app/BUILD
+++ b/apps/dhcp/app/BUILD
@@ -8,6 +8,7 @@
     api_package = "org.onosproject.dhcp.rest",
     api_title = "DHCP Server",
     api_version = "1.0",
+    karaf_command_packages = ["org.onosproject.dhcp.cli"],
     test_deps = TEST_ADAPTERS,
     web_context = "/onos/dhcp",
     deps = COMPILE_DEPS,
diff --git a/apps/dhcp/app/app.xml b/apps/dhcp/app/app.xml
deleted file mode 100644
index 575ed41..0000000
--- a/apps/dhcp/app/app.xml
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-  ~ Copyright 2015-present Open Networking Foundation
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~     http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License.
-  -->
-<app name="org.onosproject.dhcp" origin="Open Networking Foundation" version="${project.version}"
-     category="Utility" url="http://onosproject.org" title="DHCP App"
-     featuresRepo="mvn:${project.groupId}/${project.artifactId}/${project.version}/xml/features"
-     features="${project.artifactId}">
-    <description>${project.description}</description>
-    <artifact>mvn:${project.groupId}/${project.artifactId}/${project.version}</artifact>
-    <artifact>mvn:${project.groupId}/onos-apps-dhcp-api/${project.version}</artifact>
-</app>
diff --git a/apps/dhcp/app/features.xml b/apps/dhcp/app/features.xml
deleted file mode 100644
index 11a6a7e..0000000
--- a/apps/dhcp/app/features.xml
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
-<!--
-  ~ Copyright 2015-present Open Networking Foundation
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~     http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License.
-  -->
-<features xmlns="http://karaf.apache.org/xmlns/features/v1.2.0" name="${project.artifactId}-${project.version}">
-    <feature name="${project.artifactId}" version="${project.version}"
-             description="${project.description}">
-        <feature>onos-api</feature>
-        <bundle>mvn:${project.groupId}/onos-apps-dhcp-api/${project.version}</bundle>
-        <bundle>mvn:${project.groupId}/onos-apps-dhcp/${project.version}</bundle>
-    </feature>
-</features>
diff --git a/apps/dhcp/app/src/main/java/org/onosproject/dhcp/cli/DhcpLeaseDetails.java b/apps/dhcp/app/src/main/java/org/onosproject/dhcp/cli/DhcpLeaseDetails.java
index 161bf10..aee02b2 100644
--- a/apps/dhcp/app/src/main/java/org/onosproject/dhcp/cli/DhcpLeaseDetails.java
+++ b/apps/dhcp/app/src/main/java/org/onosproject/dhcp/cli/DhcpLeaseDetails.java
@@ -15,20 +15,22 @@
  */
 package org.onosproject.dhcp.cli;
 
-import org.apache.karaf.shell.commands.Command;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.dhcp.DhcpService;
 
 /**
  * Lists all the default lease parameters offered by the DHCP Server.
  */
+@Service
 @Command(scope = "onos", name = "dhcp-lease",
         description = "Lists all the default lease parameters offered by the DHCP Server")
 public class DhcpLeaseDetails extends AbstractShellCommand {
     private static final String DHCP_LEASE_FORMAT = "Lease Time: %ds\nRenewal Time: %ds\nRebinding Time: %ds";
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         DhcpService dhcpService = AbstractShellCommand.get(DhcpService.class);
         int leaseTime = dhcpService.getLeaseTime();
         int renewTime = dhcpService.getRenewalTime();
diff --git a/apps/dhcp/app/src/main/java/org/onosproject/dhcp/cli/DhcpListAllMappings.java b/apps/dhcp/app/src/main/java/org/onosproject/dhcp/cli/DhcpListAllMappings.java
index 754cfca..4fba0f0 100644
--- a/apps/dhcp/app/src/main/java/org/onosproject/dhcp/cli/DhcpListAllMappings.java
+++ b/apps/dhcp/app/src/main/java/org/onosproject/dhcp/cli/DhcpListAllMappings.java
@@ -15,7 +15,8 @@
  */
 package org.onosproject.dhcp.cli;
 
-import org.apache.karaf.shell.commands.Command;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.dhcp.DhcpService;
 import org.onosproject.dhcp.IpAssignment;
@@ -26,13 +27,14 @@
 /**
  * Lists all the MacAddress to IP Address mappings held by the DHCP Server.
  */
+@Service
 @Command(scope = "onos", name = "dhcp-list",
         description = "Lists all the MAC to IP mappings held by the DHCP Server")
 public class DhcpListAllMappings extends AbstractShellCommand {
 
     private static final String DHCP_MAPPING_FORMAT = "MAC ID: %s -> IP ASSIGNED %s";
     @Override
-    protected void execute() {
+    protected void doExecute() {
 
         DhcpService dhcpService = AbstractShellCommand.get(DhcpService.class);
         Map<HostId, IpAssignment> allocationMap = dhcpService.listMapping();
diff --git a/apps/dhcp/app/src/main/java/org/onosproject/dhcp/cli/DhcpRemoveStaticMapping.java b/apps/dhcp/app/src/main/java/org/onosproject/dhcp/cli/DhcpRemoveStaticMapping.java
index adfecaa..a6989d2 100644
--- a/apps/dhcp/app/src/main/java/org/onosproject/dhcp/cli/DhcpRemoveStaticMapping.java
+++ b/apps/dhcp/app/src/main/java/org/onosproject/dhcp/cli/DhcpRemoveStaticMapping.java
@@ -15,8 +15,10 @@
  */
 package org.onosproject.dhcp.cli;
 
-import org.apache.karaf.shell.commands.Argument;
-import org.apache.karaf.shell.commands.Command;
+import org.apache.karaf.shell.api.action.Argument;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.Completion;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onlab.packet.MacAddress;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.dhcp.DhcpService;
@@ -24,6 +26,7 @@
 /**
  * Removes a static MAC Address to IP Mapping from the DHCP Server.
  */
+@Service
 @Command(scope = "onos", name = "dhcp-remove-static-mapping",
         description = "Removes a static MAC Address to IP Mapping from the DHCP Server")
 public class DhcpRemoveStaticMapping extends AbstractShellCommand {
@@ -31,6 +34,7 @@
     @Argument(index = 0, name = "macAddr",
             description = "MAC Address of the client",
             required = true, multiValued = false)
+    @Completion(MacIdCompleter.class)
     String macAddr = null;
 
     private static final String DHCP_SUCCESS = "Static Mapping Successfully Removed.";
@@ -38,7 +42,7 @@
                                                 "Either the mapping does not exist or it is not static.";
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         DhcpService dhcpService = AbstractShellCommand.get(DhcpService.class);
 
         try {
diff --git a/apps/dhcp/app/src/main/java/org/onosproject/dhcp/cli/DhcpSetStaticMapping.java b/apps/dhcp/app/src/main/java/org/onosproject/dhcp/cli/DhcpSetStaticMapping.java
index 763b534..ee59b30 100644
--- a/apps/dhcp/app/src/main/java/org/onosproject/dhcp/cli/DhcpSetStaticMapping.java
+++ b/apps/dhcp/app/src/main/java/org/onosproject/dhcp/cli/DhcpSetStaticMapping.java
@@ -15,8 +15,10 @@
  */
 package org.onosproject.dhcp.cli;
 
-import org.apache.karaf.shell.commands.Argument;
-import org.apache.karaf.shell.commands.Command;
+import org.apache.karaf.shell.api.action.Argument;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.Completion;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onlab.packet.Ip4Address;
 import org.onlab.packet.MacAddress;
 import org.onosproject.cli.AbstractShellCommand;
@@ -30,6 +32,7 @@
 /**
  * Registers a static MAC Address to IP Mapping with the DHCP Server.
  */
+@Service
 @Command(scope = "onos", name = "dhcp-set-static-mapping",
         description = "Registers a static MAC Address to IP Mapping with the DHCP Server")
 public class DhcpSetStaticMapping extends AbstractShellCommand {
@@ -37,17 +40,19 @@
     @Argument(index = 0, name = "macAddr",
             description = "MAC Address of the client",
             required = true, multiValued = false)
+    @Completion(MacIdCompleter.class)
     String macAddr = null;
 
     @Argument(index = 1, name = "ipAddr",
             description = "IP Address requested for static mapping",
             required = true, multiValued = false)
+    @Completion(FreeIpCompleter.class)
     String ipAddr = null;
 
     private static final String DHCP_SUCCESS = "Static Mapping Successfully Added.";
     private static final String DHCP_FAILURE = "Static Mapping Failed. The IP maybe unavailable.";
     @Override
-    protected void execute() {
+    protected void doExecute() {
         DhcpService dhcpService = AbstractShellCommand.get(DhcpService.class);
 
         try {
diff --git a/apps/dhcp/app/src/main/java/org/onosproject/dhcp/cli/FreeIpCompleter.java b/apps/dhcp/app/src/main/java/org/onosproject/dhcp/cli/FreeIpCompleter.java
index e2cbf12..7d8fa7e 100644
--- a/apps/dhcp/app/src/main/java/org/onosproject/dhcp/cli/FreeIpCompleter.java
+++ b/apps/dhcp/app/src/main/java/org/onosproject/dhcp/cli/FreeIpCompleter.java
@@ -15,8 +15,11 @@
  */
 package org.onosproject.dhcp.cli;
 
-import org.apache.karaf.shell.console.Completer;
-import org.apache.karaf.shell.console.completer.StringsCompleter;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
+import org.apache.karaf.shell.api.console.CommandLine;
+import org.apache.karaf.shell.api.console.Completer;
+import org.apache.karaf.shell.api.console.Session;
+import org.apache.karaf.shell.support.completers.StringsCompleter;
 import org.onlab.packet.Ip4Address;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.dhcp.DhcpService;
@@ -28,10 +31,11 @@
 /**
  * Free IP Completer.
  */
+@Service
 public class FreeIpCompleter implements Completer {
 
     @Override
-    public int complete(String buffer, int cursor, List<String> candidates) {
+    public int complete(Session session, CommandLine commandLine, List<String> candidates) {
         // Delegate string completer
         StringsCompleter delegate = new StringsCompleter();
         DhcpService dhcpService = AbstractShellCommand.get(DhcpService.class);
@@ -43,6 +47,6 @@
         }
 
         // Now let the completer do the work for figuring out what to offer.
-        return delegate.complete(buffer, cursor, candidates);
+        return delegate.complete(session, commandLine, candidates);
     }
 }
diff --git a/apps/dhcp/app/src/main/java/org/onosproject/dhcp/cli/MacIdCompleter.java b/apps/dhcp/app/src/main/java/org/onosproject/dhcp/cli/MacIdCompleter.java
index 16b17b5..acd7983 100644
--- a/apps/dhcp/app/src/main/java/org/onosproject/dhcp/cli/MacIdCompleter.java
+++ b/apps/dhcp/app/src/main/java/org/onosproject/dhcp/cli/MacIdCompleter.java
@@ -15,8 +15,11 @@
  */
 package org.onosproject.dhcp.cli;
 
-import org.apache.karaf.shell.console.Completer;
-import org.apache.karaf.shell.console.completer.StringsCompleter;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
+import org.apache.karaf.shell.api.console.CommandLine;
+import org.apache.karaf.shell.api.console.Completer;
+import org.apache.karaf.shell.api.console.Session;
+import org.apache.karaf.shell.support.completers.StringsCompleter;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.net.Host;
 import org.onosproject.net.host.HostService;
@@ -28,10 +31,11 @@
 /**
  * MAC ID Completer.
  */
+@Service
 public class MacIdCompleter implements Completer {
 
     @Override
-    public int complete(String buffer, int cursor, List<String> candidates) {
+    public int complete(Session session, CommandLine commandLine, List<String> candidates) {
         // Delegate string completer
         StringsCompleter delegate = new StringsCompleter();
         HostService service = AbstractShellCommand.get(HostService.class);
@@ -43,6 +47,6 @@
         }
 
         // Now let the completer do the work for figuring out what to offer.
-        return delegate.complete(buffer, cursor, candidates);
+        return delegate.complete(session, commandLine, candidates);
     }
 }
diff --git a/apps/dhcp/app/src/main/java/org/onosproject/dhcp/impl/DhcpManager.java b/apps/dhcp/app/src/main/java/org/onosproject/dhcp/impl/DhcpManager.java
index f18b861..6480e2b 100644
--- a/apps/dhcp/app/src/main/java/org/onosproject/dhcp/impl/DhcpManager.java
+++ b/apps/dhcp/app/src/main/java/org/onosproject/dhcp/impl/DhcpManager.java
@@ -17,15 +17,6 @@
 
 import com.google.common.base.Strings;
 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.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.packet.ARP;
 import org.onlab.packet.DHCP;
 import org.onlab.packet.Ethernet;
@@ -69,6 +60,12 @@
 import org.onosproject.net.provider.AbstractProvider;
 import org.onosproject.net.provider.ProviderId;
 import org.osgi.service.component.ComponentContext;
+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 org.slf4j.LoggerFactory;
 
@@ -77,7 +74,6 @@
 import java.util.Date;
 import java.util.Dictionary;
 import java.util.HashSet;
-
 import java.util.List;
 import java.util.Map;
 import java.util.Objects;
@@ -92,18 +88,23 @@
 import static org.onlab.packet.MacAddress.valueOf;
 import static org.onosproject.dhcp.IpAssignment.AssignmentStatus.Option_RangeNotEnforced;
 import static org.onosproject.dhcp.IpAssignment.AssignmentStatus.Option_Requested;
+import static org.onosproject.dhcp.impl.OsgiPropertyConstants.ALLOW_HOST_DISCOVERY;
+import static org.onosproject.dhcp.impl.OsgiPropertyConstants.ALLOW_HOST_DISCOVERY_DEFAULT;
 import static org.onosproject.net.config.basics.SubjectFactories.APP_SUBJECT_FACTORY;
 
 /**
  * Skeletal ONOS DHCP Server application.
  */
-@Component(immediate = true)
-@Service
+@Component(
+    immediate = true,
+    service = DhcpService.class,
+    property = {
+        ALLOW_HOST_DISCOVERY + "=" + ALLOW_HOST_DISCOVERY_DEFAULT
+    }
+)
 public class DhcpManager implements DhcpService {
 
     private static final ProviderId PID = new ProviderId("of", "org.onosproject.dhcp", true);
-    private static final String ALLOW_HOST_DISCOVERY = "allowHostDiscovery";
-    private static final boolean DEFAULT_ALLOW_HOST_DISCOVERY = false;
 
     private final Logger log = LoggerFactory.getLogger(getClass());
 
@@ -119,29 +120,28 @@
                 }
             }
     );
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected NetworkConfigRegistry cfgService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected PacketService packetService;
 
     private DhcpPacketProcessor processor = new DhcpPacketProcessor();
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected CoreService coreService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected DhcpStore dhcpStore;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected HostProviderRegistry hostProviderRegistry;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected ComponentConfigService componentConfigService;
 
-    @Property(name = ALLOW_HOST_DISCOVERY, boolValue = DEFAULT_ALLOW_HOST_DISCOVERY,
-            label = "Allow host discovery from DHCP request")
-    private boolean allowHostDiscovery = DEFAULT_ALLOW_HOST_DISCOVERY;
+    /** Allow host discovery from DHCP request. */
+    private boolean allowHostDiscovery = ALLOW_HOST_DISCOVERY_DEFAULT;
 
     protected HostProviderService hostProviderService;
     private final HostProvider hostProvider = new InternalHostProvider();
diff --git a/apps/dhcp/app/src/main/java/org/onosproject/dhcp/impl/DhcpUi.java b/apps/dhcp/app/src/main/java/org/onosproject/dhcp/impl/DhcpUi.java
index 0369dde..908099c 100644
--- a/apps/dhcp/app/src/main/java/org/onosproject/dhcp/impl/DhcpUi.java
+++ b/apps/dhcp/app/src/main/java/org/onosproject/dhcp/impl/DhcpUi.java
@@ -16,16 +16,15 @@
 package org.onosproject.dhcp.impl;
 
 import com.google.common.collect.ImmutableList;
-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.ui.UiExtension;
 import org.onosproject.ui.UiExtensionService;
 import org.onosproject.ui.UiMessageHandlerFactory;
 import org.onosproject.ui.UiView;
+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;
 
@@ -36,14 +35,13 @@
 /**
  * Mechanism to stream data to the GUI.
  */
-@Component(immediate = true, enabled = true)
-@Service(value = DhcpUi.class)
+@Component(immediate = true, service = DhcpUi.class)
 public class DhcpUi {
 
     private final Logger log = LoggerFactory.getLogger(getClass());
     private static final ClassLoader CL = DhcpUi.class.getClassLoader();
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected UiExtensionService uiExtensionService;
 
     private final UiMessageHandlerFactory messageHandlerFactory =
diff --git a/apps/dhcp/app/src/main/java/org/onosproject/dhcp/impl/DistributedDhcpStore.java b/apps/dhcp/app/src/main/java/org/onosproject/dhcp/impl/DistributedDhcpStore.java
index 94b0ddc..e8ce2cc 100644
--- a/apps/dhcp/app/src/main/java/org/onosproject/dhcp/impl/DistributedDhcpStore.java
+++ b/apps/dhcp/app/src/main/java/org/onosproject/dhcp/impl/DistributedDhcpStore.java
@@ -16,12 +16,6 @@
 package org.onosproject.dhcp.impl;
 
 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.apache.felix.scr.annotations.Service;
 import org.onlab.packet.Ip4Address;
 import org.onlab.packet.MacAddress;
 import org.onlab.util.KryoNamespace;
@@ -34,12 +28,17 @@
 import org.onosproject.store.service.Serializer;
 import org.onosproject.store.service.StorageService;
 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 org.slf4j.LoggerFactory;
 
 import java.util.Date;
-import java.util.Map;
 import java.util.HashMap;
+import java.util.Map;
 
 import static org.onosproject.dhcp.IpAssignment.AssignmentStatus.Option_Assigned;
 import static org.onosproject.dhcp.IpAssignment.AssignmentStatus.Option_RangeNotEnforced;
@@ -49,13 +48,12 @@
  * Remembers the mapping between MAC ID and IP Addresses assigned.
  */
 
-@Component(immediate = true)
-@Service
+@Component(immediate = true, service = DhcpStore.class)
 public class DistributedDhcpStore implements DhcpStore {
 
     private final Logger log = LoggerFactory.getLogger(getClass());
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected StorageService storageService;
 
     private ConsistentMap<HostId, IpAssignment> allocationMap;
diff --git a/apps/dhcp/app/src/main/java/org/onosproject/dhcp/impl/OsgiPropertyConstants.java b/apps/dhcp/app/src/main/java/org/onosproject/dhcp/impl/OsgiPropertyConstants.java
new file mode 100644
index 0000000..d7909a9
--- /dev/null
+++ b/apps/dhcp/app/src/main/java/org/onosproject/dhcp/impl/OsgiPropertyConstants.java
@@ -0,0 +1,25 @@
+/*
+ * Copyright 2018-present Open Networking Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.onosproject.dhcp.impl;
+
+public final class OsgiPropertyConstants {
+    private OsgiPropertyConstants() {
+    }
+
+    static final String ALLOW_HOST_DISCOVERY = "allowHostDiscovery";
+    static final boolean ALLOW_HOST_DISCOVERY_DEFAULT = false;
+}
diff --git a/apps/dhcp/app/src/main/resources/OSGI-INF/blueprint/shell-config.xml b/apps/dhcp/app/src/main/resources/OSGI-INF/blueprint/shell-config.xml
deleted file mode 100644
index e93d2a2..0000000
--- a/apps/dhcp/app/src/main/resources/OSGI-INF/blueprint/shell-config.xml
+++ /dev/null
@@ -1,43 +0,0 @@
-<!--
-  ~ Copyright 2015-present Open Networking Foundation
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~     http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License.
-  -->
-<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0">
-
-    <command-bundle xmlns="http://karaf.apache.org/xmlns/shell/v1.1.0">
-        <command>
-            <action class="org.onosproject.dhcp.cli.DhcpListAllMappings"/>
-        </command>
-        <command>
-            <action class="org.onosproject.dhcp.cli.DhcpLeaseDetails"/>
-        </command>
-        <command>
-            <action class="org.onosproject.dhcp.cli.DhcpSetStaticMapping"/>
-            <completers>
-                <ref component-id="macIDCompleter"/>
-                <ref component-id="freeIPCompleter"/>
-            </completers>
-        </command>
-        <command>
-            <action class="org.onosproject.dhcp.cli.DhcpRemoveStaticMapping"/>
-            <completers>
-                <ref component-id="macIDCompleter"/>
-            </completers>
-        </command>
-    </command-bundle>
-
-    <bean id="macIDCompleter" class="org.onosproject.dhcp.cli.MacIdCompleter"/>
-    <bean id="freeIPCompleter" class="org.onosproject.dhcp.cli.FreeIpCompleter"/>
-
-</blueprint>
\ No newline at end of file
diff --git a/apps/dhcprelay/app/BUILD b/apps/dhcprelay/app/BUILD
index 29e4908..811ed84 100644
--- a/apps/dhcprelay/app/BUILD
+++ b/apps/dhcprelay/app/BUILD
@@ -10,6 +10,7 @@
 ]
 
 osgi_jar_with_tests(
+    karaf_command_packages = ["org.onosproject.dhcprelay.cli"],
     test_deps = TEST_DEPS,
     deps = COMPILE_DEPS,
 )
diff --git a/apps/dhcprelay/app/src/main/java/org/onosproject/dhcprelay/Dhcp4HandlerImpl.java b/apps/dhcprelay/app/src/main/java/org/onosproject/dhcprelay/Dhcp4HandlerImpl.java
index 59310b5..8decb7f 100644
--- a/apps/dhcprelay/app/src/main/java/org/onosproject/dhcprelay/Dhcp4HandlerImpl.java
+++ b/apps/dhcprelay/app/src/main/java/org/onosproject/dhcprelay/Dhcp4HandlerImpl.java
@@ -23,14 +23,6 @@
 import com.google.common.collect.Multimap;
 import com.google.common.collect.Multimaps;
 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.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.packet.BasePacket;
 import org.onlab.packet.DHCP;
 import org.onlab.packet.Ethernet;
@@ -54,44 +46,50 @@
 import org.onosproject.dhcprelay.config.IgnoreDhcpConfig;
 import org.onosproject.dhcprelay.store.DhcpRecord;
 import org.onosproject.dhcprelay.store.DhcpRelayStore;
+import org.onosproject.net.ConnectPoint;
 import org.onosproject.net.Device;
 import org.onosproject.net.DeviceId;
+import org.onosproject.net.Host;
+import org.onosproject.net.HostId;
+import org.onosproject.net.HostLocation;
 import org.onosproject.net.behaviour.Pipeliner;
 import org.onosproject.net.device.DeviceService;
 import org.onosproject.net.flow.DefaultTrafficSelector;
+import org.onosproject.net.flow.DefaultTrafficTreatment;
 import org.onosproject.net.flow.TrafficSelector;
+import org.onosproject.net.flow.TrafficTreatment;
 import org.onosproject.net.flowobjective.DefaultForwardingObjective;
 import org.onosproject.net.flowobjective.FlowObjectiveService;
 import org.onosproject.net.flowobjective.ForwardingObjective;
 import org.onosproject.net.flowobjective.Objective;
 import org.onosproject.net.flowobjective.ObjectiveContext;
 import org.onosproject.net.flowobjective.ObjectiveError;
+import org.onosproject.net.host.DefaultHostDescription;
+import org.onosproject.net.host.HostDescription;
 import org.onosproject.net.host.HostEvent;
 import org.onosproject.net.host.HostListener;
 import org.onosproject.net.host.HostProvider;
 import org.onosproject.net.host.HostProviderRegistry;
 import org.onosproject.net.host.HostProviderService;
-import org.onosproject.net.intf.Interface;
-import org.onosproject.net.intf.InterfaceService;
-import org.onosproject.net.packet.PacketPriority;
-import org.onosproject.net.provider.ProviderId;
-import org.onosproject.routeservice.Route;
-import org.onosproject.routeservice.RouteStore;
-import org.onosproject.net.ConnectPoint;
-import org.onosproject.net.Host;
-import org.onosproject.net.HostId;
-import org.onosproject.net.HostLocation;
-import org.onosproject.net.flow.DefaultTrafficTreatment;
-import org.onosproject.net.flow.TrafficTreatment;
-import org.onosproject.net.host.DefaultHostDescription;
-import org.onosproject.net.host.HostDescription;
 import org.onosproject.net.host.HostService;
 import org.onosproject.net.host.InterfaceIpAddress;
+import org.onosproject.net.intf.Interface;
+import org.onosproject.net.intf.InterfaceService;
 import org.onosproject.net.packet.DefaultOutboundPacket;
 import org.onosproject.net.packet.OutboundPacket;
 import org.onosproject.net.packet.PacketContext;
+import org.onosproject.net.packet.PacketPriority;
 import org.onosproject.net.packet.PacketService;
+import org.onosproject.net.provider.ProviderId;
+import org.onosproject.routeservice.Route;
+import org.onosproject.routeservice.RouteStore;
 import org.osgi.service.component.ComponentContext;
+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 org.slf4j.LoggerFactory;
 
@@ -117,21 +115,25 @@
 import static org.onlab.packet.MacAddress.valueOf;
 import static org.onlab.packet.dhcp.DhcpRelayAgentOption.RelayAgentInfoOptions.CIRCUIT_ID;
 import static org.onlab.util.Tools.groupedThreads;
+import static org.onosproject.dhcprelay.OsgiPropertyConstants.LEARN_ROUTE_FROM_LEASE_QUERY;
+import static org.onosproject.dhcprelay.OsgiPropertyConstants.LEARN_ROUTE_FROM_LEASE_QUERY_DEFAULT;
 import static org.onosproject.net.flowobjective.Objective.Operation.ADD;
 import static org.onosproject.net.flowobjective.Objective.Operation.REMOVE;
 
 
-@Component
-@Service
-@Property(name = "version", value = "4")
+@Component(
+    service = { DhcpHandler.class, HostProvider.class },
+    property = {
+        "version:Integer = 4",
+        LEARN_ROUTE_FROM_LEASE_QUERY + ":Boolean=" + LEARN_ROUTE_FROM_LEASE_QUERY_DEFAULT
+    }
+)
 public class Dhcp4HandlerImpl implements DhcpHandler, HostProvider {
     public static final String DHCP_V4_RELAY_APP = "org.onosproject.Dhcp4HandlerImpl";
     public static final ProviderId PROVIDER_ID = new ProviderId("dhcp4", DHCP_V4_RELAY_APP);
     private static final String BROADCAST_IP = "255.255.255.255";
     private static final int IGNORE_CONTROL_PRIORITY = PacketPriority.CONTROL.priorityValue() + 1000;
 
-    private static final String LQ_ROUTE_PROPERTY_NAME = "learnRouteFromLeasequery";
-
     private static final TrafficSelector CLIENT_SERVER_SELECTOR = DefaultTrafficSelector.builder()
             .matchEthType(Ethernet.TYPE_IPV4)
             .matchIPProtocol(IPv4.PROTOCOL_UDP)
@@ -152,34 +154,34 @@
     );
     private static Logger log = LoggerFactory.getLogger(Dhcp4HandlerImpl.class);
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected DhcpRelayStore dhcpRelayStore;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected PacketService packetService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected RouteStore routeStore;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected InterfaceService interfaceService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected HostService hostService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected HostProviderRegistry providerRegistry;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected CoreService coreService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected DeviceService deviceService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected FlowObjectiveService flowObjectiveService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected ComponentConfigService cfgService;
 
     protected HostProviderService providerService;
@@ -190,9 +192,8 @@
     private List<DhcpServerInfo> defaultServerInfoList = new CopyOnWriteArrayList<>();
     private List<DhcpServerInfo> indirectServerInfoList = new CopyOnWriteArrayList<>();
 
-    @Property(name = Dhcp4HandlerImpl.LQ_ROUTE_PROPERTY_NAME, boolValue = false,
-            label = "Enable learning routing information from LQ")
-    private Boolean learnRouteFromLeasequery = Boolean.TRUE;
+    /** Enable learning routing information from LQ. */
+    private Boolean learnRouteFromLeasequery = LEARN_ROUTE_FROM_LEASE_QUERY_DEFAULT;
 
     private Executor hostEventExecutor = newSingleThreadExecutor(
         groupedThreads("dhcp4-event-host", "%d", log));
@@ -223,7 +224,7 @@
     protected void modified(ComponentContext context) {
         Dictionary<?, ?> properties = context.getProperties();
         Boolean flag;
-        flag = Tools.isPropertyEnabled(properties, Dhcp4HandlerImpl.LQ_ROUTE_PROPERTY_NAME);
+        flag = Tools.isPropertyEnabled(properties, LEARN_ROUTE_FROM_LEASE_QUERY);
         if (flag != null) {
             learnRouteFromLeasequery = flag;
             log.info("Learning routes from DHCP leasequery is {}",
diff --git a/apps/dhcprelay/app/src/main/java/org/onosproject/dhcprelay/Dhcp6HandlerImpl.java b/apps/dhcprelay/app/src/main/java/org/onosproject/dhcprelay/Dhcp6HandlerImpl.java
index a5a9eb5..a30d685 100644
--- a/apps/dhcprelay/app/src/main/java/org/onosproject/dhcprelay/Dhcp6HandlerImpl.java
+++ b/apps/dhcprelay/app/src/main/java/org/onosproject/dhcprelay/Dhcp6HandlerImpl.java
@@ -22,14 +22,12 @@
 import com.google.common.collect.Multimaps;
 import com.google.common.collect.Sets;
 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.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.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.onlab.packet.BasePacket;
 import org.onlab.packet.DHCP6;
 import org.onlab.packet.IPv6;
@@ -122,19 +120,25 @@
 import static com.google.common.base.Preconditions.checkState;
 import static java.util.concurrent.Executors.newSingleThreadExecutor;
 import static org.onlab.util.Tools.groupedThreads;
+import static org.onosproject.dhcprelay.OsgiPropertyConstants.LEARN_ROUTE_FROM_LEASE_QUERY;
+import static org.onosproject.dhcprelay.OsgiPropertyConstants.LEARN_ROUTE_FROM_LEASE_QUERY_DEFAULT;
 import static org.onosproject.net.flowobjective.Objective.Operation.ADD;
 import static org.onosproject.net.flowobjective.Objective.Operation.REMOVE;
 import java.util.concurrent.Semaphore;
 
-@Component
-@Service
-@Property(name = "version", value = "6")
+@Component(
+    service = { DhcpHandler.class, HostProvider.class },
+    property = {
+        "version:Integer=6",
+        LEARN_ROUTE_FROM_LEASE_QUERY + ":Boolean=" + LEARN_ROUTE_FROM_LEASE_QUERY_DEFAULT
+    }
+)
+
 public class Dhcp6HandlerImpl implements DhcpHandler, HostProvider {
     public static final String DHCP_V6_RELAY_APP = "org.onosproject.Dhcp6HandlerImpl";
     public static final ProviderId PROVIDER_ID = new ProviderId("dhcp6", DHCP_V6_RELAY_APP);
     private static final int IGNORE_CONTROL_PRIORITY = PacketPriority.CONTROL.priorityValue() + 1000;
     private String gCount = "global";
-    private static final String LQ_ROUTE_PROPERTY_NAME = "learnRouteFromLeasequery";
     private static final TrafficSelector CLIENT_SERVER_SELECTOR = DefaultTrafficSelector.builder()
             .matchEthType(Ethernet.TYPE_IPV6)
             .matchIPProtocol(IPv6.PROTOCOL_UDP)
@@ -164,45 +168,44 @@
     );
     private static Logger log = LoggerFactory.getLogger(Dhcp6HandlerImpl.class);
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected DhcpRelayStore dhcpRelayStore;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected DhcpRelayCountersStore dhcpRelayCountersStore;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected PacketService packetService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected RouteStore routeStore;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected InterfaceService interfaceService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected HostService hostService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected HostProviderRegistry providerRegistry;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected CoreService coreService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected DhcpFpmPrefixStore dhcpFpmPrefixStore;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected DeviceService deviceService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected FlowObjectiveService flowObjectiveService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected ComponentConfigService cfgService;
 
-    @Property(name = Dhcp6HandlerImpl.LQ_ROUTE_PROPERTY_NAME, boolValue = false,
-            label = "Enable learning routing information from LQ")
-    private Boolean learnRouteFromLeasequery = Boolean.TRUE;
+    /** Enable learning routing information from LQ. */
+    private Boolean learnRouteFromLeasequery = LEARN_ROUTE_FROM_LEASE_QUERY_DEFAULT;
 
     protected HostProviderService providerService;
     protected ApplicationId appId;
@@ -270,7 +273,7 @@
     protected void modified(ComponentContext context) {
         Dictionary<?, ?> properties = context.getProperties();
         Boolean flag;
-        flag = Tools.isPropertyEnabled(properties, Dhcp6HandlerImpl.LQ_ROUTE_PROPERTY_NAME);
+        flag = Tools.isPropertyEnabled(properties, LEARN_ROUTE_FROM_LEASE_QUERY);
         if (flag != null) {
             learnRouteFromLeasequery = flag;
             log.info("Learning routes from DHCP leasequery is {}",
diff --git a/apps/dhcprelay/app/src/main/java/org/onosproject/dhcprelay/DhcpRelayManager.java b/apps/dhcprelay/app/src/main/java/org/onosproject/dhcprelay/DhcpRelayManager.java
index f2ca330..bb5a794 100644
--- a/apps/dhcprelay/app/src/main/java/org/onosproject/dhcprelay/DhcpRelayManager.java
+++ b/apps/dhcprelay/app/src/main/java/org/onosproject/dhcprelay/DhcpRelayManager.java
@@ -15,37 +15,19 @@
  */
 package org.onosproject.dhcprelay;
 
-import java.nio.ByteBuffer;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.Dictionary;
-import java.util.List;
-import java.util.Objects;
-import java.util.Optional;
-import java.util.Set;
-import java.util.stream.Collectors;
-import java.util.stream.Stream;
-
 import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableSet;
 import com.google.common.collect.Streams;
-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.packet.ARP;
 import org.onlab.packet.DHCP;
 import org.onlab.packet.DHCP6;
-import org.onlab.packet.IPacket;
-import org.onlab.packet.IPv6;
 import org.onlab.packet.Ethernet;
+import org.onlab.packet.IPacket;
 import org.onlab.packet.IPv4;
+import org.onlab.packet.IPv6;
 import org.onlab.packet.Ip4Address;
-import org.onlab.packet.MacAddress;
 import org.onlab.packet.IpPrefix;
+import org.onlab.packet.MacAddress;
 import org.onlab.packet.UDP;
 import org.onlab.packet.VlanId;
 import org.onlab.util.Tools;
@@ -58,56 +40,82 @@
 import org.onosproject.dhcprelay.config.DefaultDhcpRelayConfig;
 import org.onosproject.dhcprelay.config.DhcpServerConfig;
 import org.onosproject.dhcprelay.config.EnableDhcpFpmConfig;
-import org.onosproject.dhcprelay.config.IndirectDhcpRelayConfig;
 import org.onosproject.dhcprelay.config.IgnoreDhcpConfig;
+import org.onosproject.dhcprelay.config.IndirectDhcpRelayConfig;
+import org.onosproject.dhcprelay.store.DhcpFpmPrefixStore;
 import org.onosproject.dhcprelay.store.DhcpRecord;
 import org.onosproject.dhcprelay.store.DhcpRelayStore;
-import org.onosproject.dhcprelay.store.DhcpFpmPrefixStore;
-import org.onosproject.routing.fpm.api.FpmRecord;
+import org.onosproject.net.ConnectPoint;
 import org.onosproject.net.Device;
 import org.onosproject.net.Host;
-import org.onosproject.net.config.Config;
-import org.onosproject.net.device.DeviceEvent;
-import org.onosproject.net.device.DeviceListener;
-import org.onosproject.net.device.DeviceService;
-import org.onosproject.net.intf.Interface;
-import org.onosproject.net.intf.InterfaceService;
-import org.onosproject.net.ConnectPoint;
 import org.onosproject.net.HostId;
+import org.onosproject.net.config.Config;
 import org.onosproject.net.config.ConfigFactory;
 import org.onosproject.net.config.NetworkConfigEvent;
 import org.onosproject.net.config.NetworkConfigListener;
 import org.onosproject.net.config.NetworkConfigRegistry;
+import org.onosproject.net.device.DeviceEvent;
+import org.onosproject.net.device.DeviceListener;
+import org.onosproject.net.device.DeviceService;
 import org.onosproject.net.flow.DefaultTrafficSelector;
 import org.onosproject.net.flow.DefaultTrafficTreatment;
 import org.onosproject.net.flow.TrafficSelector;
 import org.onosproject.net.flow.TrafficTreatment;
 import org.onosproject.net.host.HostService;
+import org.onosproject.net.intf.Interface;
+import org.onosproject.net.intf.InterfaceService;
 import org.onosproject.net.packet.DefaultOutboundPacket;
 import org.onosproject.net.packet.OutboundPacket;
 import org.onosproject.net.packet.PacketContext;
 import org.onosproject.net.packet.PacketPriority;
 import org.onosproject.net.packet.PacketProcessor;
 import org.onosproject.net.packet.PacketService;
-
+import org.onosproject.routing.fpm.api.FpmRecord;
 import org.osgi.service.component.ComponentContext;
+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 org.slf4j.LoggerFactory;
+
+import java.nio.ByteBuffer;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.Dictionary;
+import java.util.List;
+import java.util.Objects;
+import java.util.Optional;
+import java.util.Set;
 import java.util.concurrent.Executors;
 import java.util.concurrent.ScheduledExecutorService;
 import java.util.concurrent.TimeUnit;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
+
 import static org.onlab.util.Tools.groupedThreads;
-
-
-import com.google.common.collect.ImmutableSet;
-
+import static org.onosproject.dhcprelay.OsgiPropertyConstants.ARP_ENABLED;
+import static org.onosproject.dhcprelay.OsgiPropertyConstants.ARP_ENABLED_DEFAULT;
+import static org.onosproject.dhcprelay.OsgiPropertyConstants.DHCP_FPM_ENABLED;
+import static org.onosproject.dhcprelay.OsgiPropertyConstants.DHCP_FPM_ENABLED_DEFAULT;
+import static org.onosproject.dhcprelay.OsgiPropertyConstants.DHCP_POLL_INTERVAL;
+import static org.onosproject.dhcprelay.OsgiPropertyConstants.DHCP_POLL_INTERVAL_DEFAULT;
 import static org.onosproject.net.config.basics.SubjectFactories.APP_SUBJECT_FACTORY;
 
 /**
  * DHCP Relay Agent Application Component.
  */
-@Component(immediate = true)
-@Service
+@Component(
+    immediate = true,
+    service = DhcpRelayService.class,
+    property = {
+        ARP_ENABLED + ":Boolean=" + ARP_ENABLED_DEFAULT,
+        DHCP_POLL_INTERVAL + ":Integer=" + DHCP_POLL_INTERVAL_DEFAULT,
+        DHCP_FPM_ENABLED + ":Boolean=" + DHCP_FPM_ENABLED_DEFAULT
+    }
+)
 public class DhcpRelayManager implements DhcpRelayService {
     public static final String DHCP_RELAY_APP = "org.onosproject.dhcprelay";
     public static final String ROUTE_STORE_IMPL =
@@ -159,52 +167,49 @@
     );
 
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected NetworkConfigRegistry cfgService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected CoreService coreService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected PacketService packetService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected HostService hostService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected InterfaceService interfaceService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected DhcpRelayStore dhcpRelayStore;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected ComponentConfigService compCfgService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected DeviceService deviceService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected DhcpFpmPrefixStore dhcpFpmPrefixStore;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY,
+    @Reference(cardinality = ReferenceCardinality.MANDATORY,
             target = "(version=4)")
     protected DhcpHandler v4Handler;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY,
+    @Reference(cardinality = ReferenceCardinality.MANDATORY,
             target = "(version=6)")
     protected DhcpHandler v6Handler;
 
-    @Property(name = "arpEnabled", boolValue = true,
-            label = "Enable Address resolution protocol")
-    protected boolean arpEnabled = true;
+    /** Enable Address resolution protocol. */
+    protected boolean arpEnabled = ARP_ENABLED_DEFAULT;
 
-    @Property(name = "dhcpPollInterval", intValue = 24 * 3600,
-            label = "dhcp relay poll interval")
-    protected int dhcpPollInterval = 24 * 3600;
+    /** dhcp relay poll interval. */
+    protected int dhcpPollInterval = DHCP_POLL_INTERVAL_DEFAULT;
 
-    @Property(name = "dhcpFpmEnabled", boolValue = false,
-            label = "Enable DhcpRelay Fpm")
-    protected boolean dhcpFpmEnabled = false;
+    /** Enable DhcpRelay Fpm. */
+    protected boolean dhcpFpmEnabled = DHCP_FPM_ENABLED_DEFAULT;
 
     private ScheduledExecutorService timerExecutor;
 
@@ -275,7 +280,7 @@
         Dictionary<?, ?> properties = context.getProperties();
         Boolean flag;
 
-        flag = Tools.isPropertyEnabled(properties, "arpEnabled");
+        flag = Tools.isPropertyEnabled(properties, ARP_ENABLED);
         if (flag != null) {
             arpEnabled = flag;
             log.info("Address resolution protocol is {}",
@@ -288,7 +293,7 @@
             cancelArpPackets();
         }
 
-        int intervalVal = Tools.getIntegerProperty(properties, "dhcpPollInterval");
+        int intervalVal = Tools.getIntegerProperty(properties, DHCP_POLL_INTERVAL);
         log.info("DhcpRelay poll interval new {} old {}", intervalVal, dhcpPollInterval);
         if (intervalVal !=  dhcpPollInterval) {
             timerExecutor.shutdown();
@@ -303,7 +308,7 @@
             v6Handler.setDhcp6PollInterval(dhcpPollInterval);
         }
 
-        flag = Tools.isPropertyEnabled(properties, "dhcpFpmEnabled");
+        flag = Tools.isPropertyEnabled(properties, DHCP_FPM_ENABLED);
         if (flag != null) {
             boolean oldValue = dhcpFpmEnabled;
             dhcpFpmEnabled = flag;
diff --git a/apps/dhcprelay/app/src/main/java/org/onosproject/dhcprelay/OsgiPropertyConstants.java b/apps/dhcprelay/app/src/main/java/org/onosproject/dhcprelay/OsgiPropertyConstants.java
new file mode 100644
index 0000000..7e794fe
--- /dev/null
+++ b/apps/dhcprelay/app/src/main/java/org/onosproject/dhcprelay/OsgiPropertyConstants.java
@@ -0,0 +1,34 @@
+/*
+ * Copyright 2018-present Open Networking Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.onosproject.dhcprelay;
+
+public final class OsgiPropertyConstants {
+    private OsgiPropertyConstants() {
+    }
+
+    static final String ARP_ENABLED = "arpEnabled";
+    static final boolean ARP_ENABLED_DEFAULT = true;
+
+    static final String DHCP_POLL_INTERVAL = "dhcpPollInterval";
+    static final int DHCP_POLL_INTERVAL_DEFAULT = 86400;
+
+    static final String DHCP_FPM_ENABLED = "dhcpFpmEnabled";
+    static final boolean DHCP_FPM_ENABLED_DEFAULT = false;
+
+    static final String LEARN_ROUTE_FROM_LEASE_QUERY = "learnRouteFromLeasequery";
+    static final boolean LEARN_ROUTE_FROM_LEASE_QUERY_DEFAULT = false;
+}
diff --git a/apps/dhcprelay/app/src/main/java/org/onosproject/dhcprelay/cli/DhcpFpmAddCommand.java b/apps/dhcprelay/app/src/main/java/org/onosproject/dhcprelay/cli/DhcpFpmAddCommand.java
index fd886b9..db1abde 100644
--- a/apps/dhcprelay/app/src/main/java/org/onosproject/dhcprelay/cli/DhcpFpmAddCommand.java
+++ b/apps/dhcprelay/app/src/main/java/org/onosproject/dhcprelay/cli/DhcpFpmAddCommand.java
@@ -16,10 +16,11 @@
 
 package org.onosproject.dhcprelay.cli;
 
-//import org.apache.karaf.shell.commands.Argument;
-import org.apache.karaf.shell.commands.Command;
+//import org.apache.karaf.shell.api.action.Argument;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.cli.AbstractShellCommand;
-import org.apache.karaf.shell.commands.Argument;
+import org.apache.karaf.shell.api.action.Argument;
 import org.onlab.packet.IpPrefix;
 import org.onlab.packet.IpAddress;
 import org.onosproject.routing.fpm.api.FpmRecord;
@@ -28,6 +29,7 @@
 /**
  * Prints Dhcp FPM Routes information.
  */
+@Service
 @Command(scope = "onos", name = "dhcp-fpm-add",
          description = "Add DHCP FPM prefix in dhcp-fpm-store.")
 public class DhcpFpmAddCommand extends AbstractShellCommand {
@@ -45,7 +47,7 @@
     String nextHopString = null;
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
 
         IpPrefix prefix = IpPrefix.valueOf(prefixString);
         IpAddress nextHop = IpAddress.valueOf(nextHopString);
diff --git a/apps/dhcprelay/app/src/main/java/org/onosproject/dhcprelay/cli/DhcpFpmDeleteCommand.java b/apps/dhcprelay/app/src/main/java/org/onosproject/dhcprelay/cli/DhcpFpmDeleteCommand.java
index 244bcf8..1925003 100644
--- a/apps/dhcprelay/app/src/main/java/org/onosproject/dhcprelay/cli/DhcpFpmDeleteCommand.java
+++ b/apps/dhcprelay/app/src/main/java/org/onosproject/dhcprelay/cli/DhcpFpmDeleteCommand.java
@@ -16,15 +16,17 @@
 
 package org.onosproject.dhcprelay.cli;
 
-import org.apache.karaf.shell.commands.Command;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.cli.AbstractShellCommand;
-import org.apache.karaf.shell.commands.Argument;
+import org.apache.karaf.shell.api.action.Argument;
 import org.onlab.packet.IpPrefix;
 import org.onosproject.dhcprelay.api.DhcpRelayService;
 
 /**
  * Prints Dhcp FPM Routes information.
  */
+@Service
 @Command(scope = "onos", name = "dhcp-fpm-delete",
          description = "delete DHCP FPM prefix in dhcp-fpm-store")
 public class DhcpFpmDeleteCommand extends AbstractShellCommand {
@@ -37,7 +39,7 @@
     String prefixString = null;
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         IpPrefix prefix = IpPrefix.valueOf(prefixString);
 
         DHCP_RELAY_SERVICE.removeFpmRecord(prefix);
diff --git a/apps/dhcprelay/app/src/main/java/org/onosproject/dhcprelay/cli/DhcpFpmRoutesCommand.java b/apps/dhcprelay/app/src/main/java/org/onosproject/dhcprelay/cli/DhcpFpmRoutesCommand.java
index 9aacac3..c9bf364 100644
--- a/apps/dhcprelay/app/src/main/java/org/onosproject/dhcprelay/cli/DhcpFpmRoutesCommand.java
+++ b/apps/dhcprelay/app/src/main/java/org/onosproject/dhcprelay/cli/DhcpFpmRoutesCommand.java
@@ -16,8 +16,9 @@
 
 package org.onosproject.dhcprelay.cli;
 
-//import org.apache.karaf.shell.commands.Argument;
-import org.apache.karaf.shell.commands.Command;
+//import org.apache.karaf.shell.api.action.Argument;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.cli.AbstractShellCommand;
 
 import org.onosproject.dhcprelay.api.DhcpRelayService;
@@ -28,6 +29,7 @@
 /**
  * Prints Dhcp FPM Routes information.
  */
+@Service
 @Command(scope = "onos", name = "dhcp-fpm-routes",
          description = "DHCP FPM routes cli.")
 public class DhcpFpmRoutesCommand extends AbstractShellCommand {
@@ -39,7 +41,7 @@
     private static final DhcpRelayService DHCP_RELAY_SERVICE = get(DhcpRelayService.class);
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
 
             print("Dhcp Fpm Feature is %s !", DHCP_RELAY_SERVICE.isDhcpFpmEnabled() ? "enabled" : "disabled");
             print("\n");
diff --git a/apps/dhcprelay/app/src/main/java/org/onosproject/dhcprelay/cli/DhcpRelayAggCountersCommand.java b/apps/dhcprelay/app/src/main/java/org/onosproject/dhcprelay/cli/DhcpRelayAggCountersCommand.java
index a91a53a..d0bdad1 100644
--- a/apps/dhcprelay/app/src/main/java/org/onosproject/dhcprelay/cli/DhcpRelayAggCountersCommand.java
+++ b/apps/dhcprelay/app/src/main/java/org/onosproject/dhcprelay/cli/DhcpRelayAggCountersCommand.java
@@ -16,8 +16,10 @@
 
 package org.onosproject.dhcprelay.cli;
 
-import org.apache.karaf.shell.commands.Argument;
-import org.apache.karaf.shell.commands.Command;
+import org.apache.karaf.shell.api.action.Argument;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.Completion;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.dhcprelay.api.DhcpRelayService;
 import org.onosproject.dhcprelay.store.DhcpRelayCounters;
@@ -30,12 +32,14 @@
 /**
  * Prints Dhcp FPM Routes information.
  */
+@Service
 @Command(scope = "onos", name = "dhcp-relay-agg-counters",
          description = "DHCP Relay Aggregate Counters cli.")
 public class DhcpRelayAggCountersCommand extends AbstractShellCommand {
     @Argument(index = 0, name = "reset",
             description = "reset counters or not",
             required = false, multiValued = false)
+    @Completion(DhcpRelayResetCompleter.class)
     String reset = null;
 
     private static final String HEADER = "DHCP Relay Aggregate Counters :";
@@ -43,7 +47,7 @@
     private static final DhcpRelayService DHCP_RELAY_SERVICE = get(DhcpRelayService.class);
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         boolean toResetFlag;
 
         if (reset != null) {
diff --git a/apps/dhcprelay/app/src/main/java/org/onosproject/dhcprelay/cli/DhcpRelayCommand.java b/apps/dhcprelay/app/src/main/java/org/onosproject/dhcprelay/cli/DhcpRelayCommand.java
index 90816b0..4145cd2 100644
--- a/apps/dhcprelay/app/src/main/java/org/onosproject/dhcprelay/cli/DhcpRelayCommand.java
+++ b/apps/dhcprelay/app/src/main/java/org/onosproject/dhcprelay/cli/DhcpRelayCommand.java
@@ -17,8 +17,10 @@
 package org.onosproject.dhcprelay.cli;
 
 
-import org.apache.karaf.shell.commands.Argument;
-import org.apache.karaf.shell.commands.Command;
+import org.apache.karaf.shell.api.action.Argument;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.Completion;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onlab.packet.IpAddress;
 import org.onlab.packet.MacAddress;
 import org.onlab.packet.VlanId;
@@ -41,16 +43,19 @@
 /**
  * Prints DHCP server and DHCP relay status.
  */
+@Service
 @Command(scope = "onos", name = "dhcp-relay", description = "DHCP relay app cli.")
 public class DhcpRelayCommand extends AbstractShellCommand {
     @Argument(index = 0, name = "counter",
             description = "shows counter values",
             required = false, multiValued = false)
+    @Completion(DhcpRelayCounterCompleter.class)
     String counter = null;
 
     @Argument(index = 1, name = "reset",
             description = "reset counters or not",
             required = false, multiValued = false)
+    @Completion(DhcpRelayResetCompleter.class)
     String reset = null;
 
 
@@ -80,7 +85,7 @@
 
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         List<DhcpServerInfo> defaultDhcpServerInfoList = DHCP_RELAY_SERVICE.getDefaultDhcpServerInfoList();
         List<DhcpServerInfo> indirectDhcpServerInfoList = DHCP_RELAY_SERVICE.getIndirectDhcpServerInfoList();
 
diff --git a/apps/dhcprelay/app/src/main/java/org/onosproject/dhcprelay/cli/DhcpRelayCounterCompleter.java b/apps/dhcprelay/app/src/main/java/org/onosproject/dhcprelay/cli/DhcpRelayCounterCompleter.java
index 8b024a5..2157af4 100644
--- a/apps/dhcprelay/app/src/main/java/org/onosproject/dhcprelay/cli/DhcpRelayCounterCompleter.java
+++ b/apps/dhcprelay/app/src/main/java/org/onosproject/dhcprelay/cli/DhcpRelayCounterCompleter.java
@@ -15,8 +15,11 @@
  */
 package org.onosproject.dhcprelay.cli;
 
-import org.apache.karaf.shell.console.Completer;
-import org.apache.karaf.shell.console.completer.StringsCompleter;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
+import org.apache.karaf.shell.api.console.CommandLine;
+import org.apache.karaf.shell.api.console.Completer;
+import org.apache.karaf.shell.api.console.Session;
+import org.apache.karaf.shell.support.completers.StringsCompleter;
 
 import java.util.List;
 import java.util.SortedSet;
@@ -24,16 +27,17 @@
 /**
  * Dhcp Relay counter completer.
  */
+@Service
 public class DhcpRelayCounterCompleter implements Completer {
 
     @Override
-    public int complete(String buffer, int cursor, List<String> candidates) {
+    public int complete(Session session, CommandLine commandLine, List<String> candidates) {
         // Delegate string completer
         StringsCompleter delegate = new StringsCompleter();
         SortedSet<String> strings = delegate.getStrings();
         strings.add("counter");
 
         // Now let the completer do the work for figuring out what to offer.
-        return delegate.complete(buffer, cursor, candidates);
+        return delegate.complete(session, commandLine, candidates);
     }
 }
diff --git a/apps/dhcprelay/app/src/main/java/org/onosproject/dhcprelay/cli/DhcpRelayResetCompleter.java b/apps/dhcprelay/app/src/main/java/org/onosproject/dhcprelay/cli/DhcpRelayResetCompleter.java
index 3eb4404..48cf125 100644
--- a/apps/dhcprelay/app/src/main/java/org/onosproject/dhcprelay/cli/DhcpRelayResetCompleter.java
+++ b/apps/dhcprelay/app/src/main/java/org/onosproject/dhcprelay/cli/DhcpRelayResetCompleter.java
@@ -15,8 +15,11 @@
  */
 package org.onosproject.dhcprelay.cli;
 
-import org.apache.karaf.shell.console.Completer;
-import org.apache.karaf.shell.console.completer.StringsCompleter;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
+import org.apache.karaf.shell.api.console.CommandLine;
+import org.apache.karaf.shell.api.console.Completer;
+import org.apache.karaf.shell.api.console.Session;
+import org.apache.karaf.shell.support.completers.StringsCompleter;
 
 import java.util.List;
 import java.util.SortedSet;
@@ -24,16 +27,17 @@
 /**
  * Dhcp Relay reset completer.
  */
+@Service
 public class DhcpRelayResetCompleter implements Completer {
 
     @Override
-    public int complete(String buffer, int cursor, List<String> candidates) {
+    public int complete(Session session, CommandLine commandLine, List<String> candidates) {
         // Delegate string completer
         StringsCompleter delegate = new StringsCompleter();
         SortedSet<String> strings = delegate.getStrings();
         strings.add("reset");
 
         // Now let the completer do the work for figuring out what to offer.
-        return delegate.complete(buffer, cursor, candidates);
+        return delegate.complete(session, commandLine, candidates);
     }
 }
diff --git a/apps/dhcprelay/app/src/main/java/org/onosproject/dhcprelay/store/DistributedDhcpRelayCountersStore.java b/apps/dhcprelay/app/src/main/java/org/onosproject/dhcprelay/store/DistributedDhcpRelayCountersStore.java
index 4b7b26c..a668463 100644
--- a/apps/dhcprelay/app/src/main/java/org/onosproject/dhcprelay/store/DistributedDhcpRelayCountersStore.java
+++ b/apps/dhcprelay/app/src/main/java/org/onosproject/dhcprelay/store/DistributedDhcpRelayCountersStore.java
@@ -15,34 +15,31 @@
  */
 package org.onosproject.dhcprelay.store;
 
-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.KryoNamespace;
 import org.onosproject.core.ApplicationId;
 import org.onosproject.core.CoreService;
+import org.onosproject.store.serializers.KryoNamespaces;
 import org.onosproject.store.service.ConsistentMap;
 import org.onosproject.store.service.Serializer;
 import org.onosproject.store.service.StorageService;
+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 org.slf4j.LoggerFactory;
-import org.onosproject.store.serializers.KryoNamespaces;
 
 import java.util.HashSet;
 import java.util.Map;
 import java.util.Optional;
 import java.util.Set;
 import java.util.concurrent.ConcurrentHashMap;
-import org.onosproject.store.service.Versioned;
 
 import static com.google.common.base.Preconditions.checkNotNull;
 
-@Component(immediate = true)
-@Service
+@Component(immediate = true, service = DhcpRelayCountersStore.class)
 public class DistributedDhcpRelayCountersStore implements DhcpRelayCountersStore {
     private static final KryoNamespace.Builder APP_KYRO = KryoNamespace.newBuilder()
             .register(KryoNamespaces.API)
@@ -51,10 +48,10 @@
     private Logger log = LoggerFactory.getLogger(getClass());
     private ConsistentMap<String, DhcpRelayCounters> counters;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected StorageService storageService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected CoreService coreService;
 
 
diff --git a/apps/dhcprelay/app/src/main/java/org/onosproject/dhcprelay/store/DistributedDhcpRelayStore.java b/apps/dhcprelay/app/src/main/java/org/onosproject/dhcprelay/store/DistributedDhcpRelayStore.java
index 884d9cc..c622be2 100644
--- a/apps/dhcprelay/app/src/main/java/org/onosproject/dhcprelay/store/DistributedDhcpRelayStore.java
+++ b/apps/dhcprelay/app/src/main/java/org/onosproject/dhcprelay/store/DistributedDhcpRelayStore.java
@@ -16,12 +16,6 @@
 
 package org.onosproject.dhcprelay.store;
 
-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.packet.DHCP;
 import org.onlab.packet.DHCP6;
 import org.onlab.util.KryoNamespace;
@@ -33,6 +27,11 @@
 import org.onosproject.store.service.EventuallyConsistentMapListener;
 import org.onosproject.store.service.StorageService;
 import org.onosproject.store.service.WallClockTimestamp;
+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;
@@ -44,8 +43,7 @@
 /**
  * Distributed DHCP relay store.
  */
-@Component(immediate = true)
-@Service
+@Component(immediate = true, service = DhcpRelayStore.class)
 public class DistributedDhcpRelayStore implements DhcpRelayStore {
     private static final KryoNamespace APP_KRYO = KryoNamespace.newBuilder()
             .register(KryoNamespaces.API)
@@ -60,7 +58,7 @@
     private EventuallyConsistentMap<HostId, DhcpRecord> dhcpRecords;
     private EventuallyConsistentMapListener<HostId, DhcpRecord> listener;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected StorageService storageService;
 
     @Activate
diff --git a/apps/dhcprelay/app/src/main/java/org/onosproject/dhcprelay/store/DistributedFpmPrefixStore.java b/apps/dhcprelay/app/src/main/java/org/onosproject/dhcprelay/store/DistributedFpmPrefixStore.java
index bc95d0b..bec99e1 100644
--- a/apps/dhcprelay/app/src/main/java/org/onosproject/dhcprelay/store/DistributedFpmPrefixStore.java
+++ b/apps/dhcprelay/app/src/main/java/org/onosproject/dhcprelay/store/DistributedFpmPrefixStore.java
@@ -16,45 +16,40 @@
 
 package org.onosproject.dhcprelay.store;
 
-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.felix.scr.annotations.Property;
-import org.onlab.util.KryoNamespace;
-import org.onosproject.store.StoreDelegate;
 import org.onlab.packet.IpPrefix;
+import org.onlab.util.KryoNamespace;
+import org.onosproject.routing.fpm.api.FpmPrefixStoreEvent;
+import org.onosproject.routing.fpm.api.FpmRecord;
+import org.onosproject.store.StoreDelegate;
 import org.onosproject.store.serializers.KryoNamespaces;
 import org.onosproject.store.service.EventuallyConsistentMap;
 import org.onosproject.store.service.EventuallyConsistentMapEvent;
 import org.onosproject.store.service.EventuallyConsistentMapListener;
 import org.onosproject.store.service.StorageService;
 import org.onosproject.store.service.WallClockTimestamp;
-import org.onosproject.routing.fpm.api.FpmRecord;
-import org.onosproject.routing.fpm.api.FpmPrefixStoreEvent;
-
-
-
-
+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.Optional;
 
-
-
-
 import static com.google.common.base.Preconditions.checkNotNull;
 import static org.slf4j.LoggerFactory.getLogger;
 
 /**
  * Persistent Fpm Prefix Store with Listener.
  */
-@Component(immediate = true)
-@Property(name = "fpm_type", value = "DHCP")
-@Service
+@Component(
+    immediate = true,
+    service = DhcpFpmPrefixStore.class,
+    property = {
+        "fpm_type=DHCP"
+    }
+)
 public class DistributedFpmPrefixStore implements DhcpFpmPrefixStore {
 
     private static final KryoNamespace APP_KRYO = KryoNamespace.newBuilder()
@@ -68,7 +63,7 @@
     private EventuallyConsistentMap<IpPrefix, FpmRecord> dhcpFpmRecords;
     private EventuallyConsistentMapListener<IpPrefix, FpmRecord> listener;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected StorageService storageService;
 
     @Activate
diff --git a/apps/dhcprelay/app/src/main/resources/OSGI-INF/blueprint/shell-config.xml b/apps/dhcprelay/app/src/main/resources/OSGI-INF/blueprint/shell-config.xml
deleted file mode 100644
index c0a4b6f..0000000
--- a/apps/dhcprelay/app/src/main/resources/OSGI-INF/blueprint/shell-config.xml
+++ /dev/null
@@ -1,44 +0,0 @@
-<!--
-  ~ Copyright 2014-present Open Networking Foundation
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~     http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-        ~ limitations under the License.
-  -->
-<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0">
-
-    <command-bundle xmlns="http://karaf.apache.org/xmlns/shell/v1.1.0">
-        <command>
-            <action class="org.onosproject.dhcprelay.cli.DhcpRelayCommand"/>
-            <completers>
-                <ref component-id="dhcpRelayCounterCompleter"/>
-                <ref component-id="dhcpRelayResetCompleter"/>
-            </completers>
-        </command>
-        <command>
-            <action class="org.onosproject.dhcprelay.cli.DhcpFpmRoutesCommand"/>
-        </command>
-        <command>
-            <action class="org.onosproject.dhcprelay.cli.DhcpFpmAddCommand"/>
-        </command>
-        <command>
-            <action class="org.onosproject.dhcprelay.cli.DhcpFpmDeleteCommand"/>
-        </command>
-        <command>
-            <action class="org.onosproject.dhcprelay.cli.DhcpRelayAggCountersCommand"/>
-            <completers>
-                <ref component-id="dhcpRelayResetCompleter"/>
-            </completers>
-        </command>
-    </command-bundle>
-    <bean id="dhcpRelayCounterCompleter" class="org.onosproject.dhcprelay.cli.DhcpRelayCounterCompleter"/>
-    <bean id="dhcpRelayResetCompleter" class="org.onosproject.dhcprelay.cli.DhcpRelayResetCompleter"/>
-</blueprint>
diff --git a/apps/drivermatrix/BUCK b/apps/drivermatrix/BUCK
deleted file mode 100644
index fa94a8b..0000000
--- a/apps/drivermatrix/BUCK
+++ /dev/null
@@ -1,21 +0,0 @@
-COMPILE_DEPS = [
-    '//lib:CORE_DEPS',
-    '//lib:JACKSON',
-    '//lib:org.apache.karaf.shell.console',
-    '//cli:onos-cli',
-]
-
-osgi_jar_with_tests (
-    deps = COMPILE_DEPS,
-    resources_root = 'src/main/resources',
-    resources = glob(['src/main/resources/**']),
-)
-
-onos_app (
-    title = 'Driver Support Matrix',
-    category = 'GUI',
-    url = 'http://onosproject.org',
-    description = 'Extends the ONOS GUI with a view that allows the operator to visualize ' +
-        'the currently loaded drivers.',
-)
-
diff --git a/apps/drivermatrix/src/main/java/org/onosproject/drivermatrix/DriverViewComponent.java b/apps/drivermatrix/src/main/java/org/onosproject/drivermatrix/DriverViewComponent.java
index 7fedcc1..a505755 100644
--- a/apps/drivermatrix/src/main/java/org/onosproject/drivermatrix/DriverViewComponent.java
+++ b/apps/drivermatrix/src/main/java/org/onosproject/drivermatrix/DriverViewComponent.java
@@ -16,11 +16,11 @@
 package org.onosproject.drivermatrix;
 
 import com.google.common.collect.ImmutableList;
-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.onosproject.ui.UiExtension;
 import org.onosproject.ui.UiExtensionService;
 import org.onosproject.ui.UiMessageHandlerFactory;
@@ -42,7 +42,7 @@
 
     private final Logger log = LoggerFactory.getLogger(getClass());
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected UiExtensionService uiExtensionService;
 
     // List of application views
diff --git a/apps/events/BUCK b/apps/events/BUCK
deleted file mode 100644
index 12e888b..0000000
--- a/apps/events/BUCK
+++ /dev/null
@@ -1,21 +0,0 @@
-COMPILE_DEPS = [
-    '//lib:CORE_DEPS',
-    '//lib:JACKSON',
-    '//lib:org.apache.karaf.shell.console',
-    '//cli:onos-cli',
-]
-
-osgi_jar_with_tests (
-    deps = COMPILE_DEPS,
-    resources_root = 'src/main/resources',
-    resources = glob(['src/main/resources/**']),
-)
-
-onos_app (
-    title = 'Event History',
-    category = 'Test Utility',
-    url = 'http://onosproject.org',
-    description = 'Allows recording and tracking of otherwise ephemeral ONOS core events. ' +
-        'It is primarily aimed for supporting various system tests and to assure that expected ' +
-        'events are raised and broadcast to applications that have requested them.',
-)
diff --git a/apps/events/BUILD b/apps/events/BUILD
index d5d9ebf..52b97c7 100644
--- a/apps/events/BUILD
+++ b/apps/events/BUILD
@@ -1,6 +1,7 @@
 COMPILE_DEPS = CORE_DEPS + JACKSON + CLI
 
 osgi_jar_with_tests(
+    karaf_command_packages = ["org.onosproject.events"],
     resources = glob(["src/main/resources/**"]),
     resources_root = "src/main/resources",
     deps = COMPILE_DEPS,
diff --git a/apps/events/src/main/java/org/onosproject/events/EventHistoryManager.java b/apps/events/src/main/java/org/onosproject/events/EventHistoryManager.java
index 0bdd94b..f99dd15 100644
--- a/apps/events/src/main/java/org/onosproject/events/EventHistoryManager.java
+++ b/apps/events/src/main/java/org/onosproject/events/EventHistoryManager.java
@@ -15,22 +15,6 @@
  */
 package org.onosproject.events;
 
-import static java.util.concurrent.Executors.newSingleThreadScheduledExecutor;
-import static org.onlab.util.Tools.groupedThreads;
-import static org.onlab.util.Tools.minPriority;
-
-import java.util.Deque;
-import java.util.concurrent.ConcurrentLinkedDeque;
-import java.util.concurrent.ScheduledExecutorService;
-import java.util.concurrent.TimeUnit;
-
-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.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.util.UnmodifiableDeque;
 import org.onosproject.cluster.ClusterService;
 import org.onosproject.core.ApplicationId;
@@ -47,56 +31,78 @@
 import org.onosproject.net.intent.IntentService;
 import org.onosproject.net.link.LinkService;
 import org.onosproject.net.topology.TopologyService;
+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.util.Deque;
+import java.util.concurrent.ConcurrentLinkedDeque;
+import java.util.concurrent.ScheduledExecutorService;
+import java.util.concurrent.TimeUnit;
+
+import static java.util.concurrent.Executors.newSingleThreadScheduledExecutor;
+import static org.onlab.util.Tools.groupedThreads;
+import static org.onlab.util.Tools.minPriority;
+import static org.onosproject.events.OsgiPropertyConstants.EXCLUDE_STATS_EVENT;
+import static org.onosproject.events.OsgiPropertyConstants.EXCLUDE_STATS_EVENT_DEFAULT;
+import static org.onosproject.events.OsgiPropertyConstants.SIZE_LIMIT;
+import static org.onosproject.events.OsgiPropertyConstants.SIZE_LIMIT_DEFAULT;
+
 /**
  * Application to store history of instance local ONOS Events.
  */
-@Component(immediate = true)
-@Service
+@Component(
+    immediate = true,
+    service = EventHistoryService.class,
+    property = {
+        EXCLUDE_STATS_EVENT + "=" + EXCLUDE_STATS_EVENT_DEFAULT,
+        SIZE_LIMIT + "=" + SIZE_LIMIT_DEFAULT
+    }
+)
 public class EventHistoryManager
     implements EventHistoryService {
 
     private final Logger log = LoggerFactory.getLogger(getClass());
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected CoreService coreService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected MastershipService mastershipService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected DeviceService deviceService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected LinkService linkService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected TopologyService topologyService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected HostService hostService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected ClusterService clusterService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected EdgePortService edgeService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected IntentService intentService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected NetworkConfigService netcfgService;
 
-    @Property(name = "excludeStatsEvent", boolValue = true,
-              label = "Exclude stats related events")
-    private boolean excludeStatsEvent = true;
+    /** Exclude stats related events. */
+    private boolean excludeStatsEvent = EXCLUDE_STATS_EVENT_DEFAULT;
 
-    @Property(name = "sizeLimit", intValue = 10_000,
-              label = "Number of event history to store")
-    private int sizeLimit = 10_000;
+    /** Number of event history to store. */
+    private int sizeLimit = SIZE_LIMIT_DEFAULT;
 
     private ApplicationId appId;
 
diff --git a/apps/events/src/main/java/org/onosproject/events/EventsCommand.java b/apps/events/src/main/java/org/onosproject/events/EventsCommand.java
index 2664344..f21cd52 100644
--- a/apps/events/src/main/java/org/onosproject/events/EventsCommand.java
+++ b/apps/events/src/main/java/org/onosproject/events/EventsCommand.java
@@ -22,8 +22,9 @@
 import java.util.stream.Collector;
 import java.util.stream.Stream;
 
-import org.apache.karaf.shell.commands.Command;
-import org.apache.karaf.shell.commands.Option;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.Option;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onlab.util.Tools;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.cluster.ClusterEvent;
@@ -49,6 +50,7 @@
 /**
  * Command to print history of instance local ONOS Events.
  */
+@Service
 @Command(scope = "onos", name = "events",
          description = "Command to print history of instance local ONOS Events")
 public class EventsCommand
@@ -101,7 +103,7 @@
     private long maxSize = -1;
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         EventHistoryService eventHistoryService = get(EventHistoryService.class);
 
         Stream<Event<?, ?>> events = eventHistoryService.history().stream();
diff --git a/apps/events/src/main/java/org/onosproject/events/OsgiPropertyConstants.java b/apps/events/src/main/java/org/onosproject/events/OsgiPropertyConstants.java
new file mode 100644
index 0000000..bc5110f
--- /dev/null
+++ b/apps/events/src/main/java/org/onosproject/events/OsgiPropertyConstants.java
@@ -0,0 +1,28 @@
+/*
+ * Copyright 2018-present Open Networking Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.onosproject.events;
+
+public final class OsgiPropertyConstants {
+    private OsgiPropertyConstants() {
+    }
+
+    static final String EXCLUDE_STATS_EVENT = "excludeStatsEvent";
+    static final boolean EXCLUDE_STATS_EVENT_DEFAULT = true;
+
+    static final String SIZE_LIMIT = "sizeLimit";
+    static final int SIZE_LIMIT_DEFAULT = 10000;
+}
diff --git a/apps/events/src/main/resources/OSGI-INF/blueprint/shell-config.xml b/apps/events/src/main/resources/OSGI-INF/blueprint/shell-config.xml
deleted file mode 100644
index 2a6a46e..0000000
--- a/apps/events/src/main/resources/OSGI-INF/blueprint/shell-config.xml
+++ /dev/null
@@ -1,24 +0,0 @@
-<!--
-  ~ Copyright 2016-present Open Networking Foundation
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~     http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License.
-  -->
-<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0">
-
-    <command-bundle xmlns="http://karaf.apache.org/xmlns/shell/v1.1.0">
-        <command>
-            <action class="org.onosproject.events.EventsCommand"/>
-        </command>
-    </command-bundle>
-
-</blueprint>
diff --git a/apps/evpn-route-service/BUCK b/apps/evpn-route-service/BUCK
deleted file mode 100644
index c571d1f..0000000
--- a/apps/evpn-route-service/BUCK
+++ /dev/null
@@ -1,11 +0,0 @@
-BUNDLES = [
-    '//apps/evpn-route-service/api:onos-apps-evpn-route-service-api',
-    '//apps/evpn-route-service/app:onos-apps-evpn-route-service-app',
-]
-
-onos_app (
-    title = 'EVPN Routing',
-    category = 'Traffic Engineering',
-    url = 'http://onosproject.org',
-    included_bundles = BUNDLES,
-)
diff --git a/apps/evpn-route-service/api/BUCK b/apps/evpn-route-service/api/BUCK
deleted file mode 100644
index 68eeacf..0000000
--- a/apps/evpn-route-service/api/BUCK
+++ /dev/null
@@ -1,13 +0,0 @@
-COMPILE_DEPS = [
-    '//lib:CORE_DEPS',
-]
-
-TEST_DEPS = [
-    '//lib:TEST',
-    '//core/api:onos-api-tests',
-]
-
-osgi_jar_with_tests (
-    deps = COMPILE_DEPS,
-    test_deps = TEST_DEPS,
-)
diff --git a/apps/evpn-route-service/app/BUCK b/apps/evpn-route-service/app/BUCK
deleted file mode 100644
index 0f7b609..0000000
--- a/apps/evpn-route-service/app/BUCK
+++ /dev/null
@@ -1,17 +0,0 @@
-COMPILE_DEPS = [
-    '//lib:CORE_DEPS',
-    '//lib:KRYO',
-    '//utils/misc:onlab-misc',
-    '//core/store/serializers:onos-core-serializers',
-    '//apps/evpn-route-service/api:onos-apps-evpn-route-service-api',
-]
-
-TEST_DEPS = [
-    '//lib:TEST',
-    '//core/api:onos-api-tests',
-]
-
-osgi_jar_with_tests (
-    deps = COMPILE_DEPS,
-    test_deps = TEST_DEPS,
-)
diff --git a/apps/evpn-route-service/app/src/main/java/org/onosproject/evpnrouteservice/impl/EvpnRouteManager.java b/apps/evpn-route-service/app/src/main/java/org/onosproject/evpnrouteservice/impl/EvpnRouteManager.java
index 3c9f223..f13b89a 100644
--- a/apps/evpn-route-service/app/src/main/java/org/onosproject/evpnrouteservice/impl/EvpnRouteManager.java
+++ b/apps/evpn-route-service/app/src/main/java/org/onosproject/evpnrouteservice/impl/EvpnRouteManager.java
@@ -16,23 +16,6 @@
 
 package org.onosproject.evpnrouteservice.impl;
 
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.Map;
-import java.util.concurrent.BlockingQueue;
-import java.util.concurrent.ExecutorService;
-import java.util.concurrent.LinkedBlockingQueue;
-import java.util.concurrent.ThreadFactory;
-
-import javax.annotation.concurrent.GuardedBy;
-
-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.evpnrouteservice.EvpnInternalRouteEvent;
 import org.onosproject.evpnrouteservice.EvpnRoute;
 import org.onosproject.evpnrouteservice.EvpnRouteAdminService;
@@ -43,23 +26,36 @@
 import org.onosproject.evpnrouteservice.EvpnRouteStore;
 import org.onosproject.evpnrouteservice.EvpnRouteStoreDelegate;
 import org.onosproject.evpnrouteservice.EvpnRouteTableId;
+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 javax.annotation.concurrent.GuardedBy;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.concurrent.BlockingQueue;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.LinkedBlockingQueue;
+import java.util.concurrent.ThreadFactory;
+
 import static java.util.concurrent.Executors.newSingleThreadExecutor;
 import static org.onlab.util.Tools.groupedThreads;
 
 /**
  * Implementation of the EVPN route service.
  */
-@Service
-@Component
+@Component(service = { EvpnRouteService.class, EvpnRouteAdminService.class })
 public class EvpnRouteManager implements EvpnRouteService,
         EvpnRouteAdminService {
 
     private final Logger log = LoggerFactory.getLogger(getClass());
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected EvpnRouteStore evpnRouteStore;
 
     @GuardedBy(value = "this")
diff --git a/apps/evpn-route-service/app/src/main/java/org/onosproject/evpnrouteservice/store/DistributedEvpnRouteStore.java b/apps/evpn-route-service/app/src/main/java/org/onosproject/evpnrouteservice/store/DistributedEvpnRouteStore.java
index de1dbd6..8917325 100644
--- a/apps/evpn-route-service/app/src/main/java/org/onosproject/evpnrouteservice/store/DistributedEvpnRouteStore.java
+++ b/apps/evpn-route-service/app/src/main/java/org/onosproject/evpnrouteservice/store/DistributedEvpnRouteStore.java
@@ -17,12 +17,6 @@
 package org.onosproject.evpnrouteservice.store;
 
 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.apache.felix.scr.annotations.Service;
 import org.onlab.packet.IpAddress;
 import org.onlab.util.KryoNamespace;
 import org.onosproject.evpnrouteservice.EvpnInternalRouteEvent;
@@ -38,6 +32,11 @@
 import org.onosproject.store.service.SetEvent;
 import org.onosproject.store.service.SetEventListener;
 import org.onosproject.store.service.StorageService;
+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;
 
@@ -54,8 +53,7 @@
 /**
  * Route store based on distributed storage.
  */
-@Service
-@Component
+@Component(service = EvpnRouteStore.class)
 public class DistributedEvpnRouteStore extends
         AbstractStore<EvpnInternalRouteEvent,
                 EvpnRouteStoreDelegate>
@@ -64,7 +62,7 @@
     private static final Logger log = LoggerFactory
             .getLogger(DistributedEvpnRouteStore.class);
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     public StorageService storageService;
 
     private static final EvpnRouteTableId EVPN_IPV4 = new EvpnRouteTableId("evpn_ipv4");
diff --git a/apps/evpnopenflow/BUCK b/apps/evpnopenflow/BUCK
deleted file mode 100644
index 47f66a5..0000000
--- a/apps/evpnopenflow/BUCK
+++ /dev/null
@@ -1,33 +0,0 @@
-COMPILE_DEPS = [
-  '//lib:CORE_DEPS',
-  '//lib:JACKSON',
-  '//lib:KRYO',
-  '//lib:org.apache.karaf.shell.console',
-  '//cli:onos-cli',
-  '//incubator/api:onos-incubator-api',
-  '//core/store/serializers:onos-core-serializers',
-  '//apps/gluon:onos-apps-gluon',
-  '//apps/vtn/vtnrsc:onos-apps-vtn-vtnrsc',
-  '//apps/route-service/api:onos-apps-route-service-api',
-  '//apps/evpn-route-service/api:onos-apps-evpn-route-service-api',
-]
-
-TEST_DEPS = [
-  '//lib:TEST_ADAPTERS',
-  '//lib:TEST',
-]
-
-osgi_jar_with_tests(
-  deps = COMPILE_DEPS,
-  test_deps = TEST_DEPS,
-)
-
-onos_app(
-  title = 'EVPN OpenFlow',
-  category = 'Traffic Engineering',
-  url = 'http://onosproject.org',
-  description = 'Ethernet VPN (EVPN) introduces a new model for Ethernet services delivery.' +
-  'It enables integrated Layer 2 service over Ethernet with multihoming.',
-  required_apps = [ 'org.onosproject.route-service', 'org.onosproject.evpn-route-service',
-                    'org.onosproject.gluon', 'org.onosproject.vtn' ],
-)
diff --git a/apps/evpnopenflow/BUILD b/apps/evpnopenflow/BUILD
index 73d982b..13bb813 100644
--- a/apps/evpnopenflow/BUILD
+++ b/apps/evpnopenflow/BUILD
@@ -8,6 +8,7 @@
 ]
 
 osgi_jar_with_tests(
+    karaf_command_packages = ["org.onosproject.evpnopenflow.rsc.cli"],
     deps = COMPILE_DEPS,
 )
 
diff --git a/apps/evpnopenflow/src/main/java/org/onosproject/evpnopenflow/manager/impl/EvpnManager.java b/apps/evpnopenflow/src/main/java/org/onosproject/evpnopenflow/manager/impl/EvpnManager.java
index 7a87fd5..edfbfd0 100644
--- a/apps/evpnopenflow/src/main/java/org/onosproject/evpnopenflow/manager/impl/EvpnManager.java
+++ b/apps/evpnopenflow/src/main/java/org/onosproject/evpnopenflow/manager/impl/EvpnManager.java
@@ -18,12 +18,6 @@
 
 import com.fasterxml.jackson.databind.JsonNode;
 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.onlab.osgi.DefaultServiceDirectory;
 import org.onlab.packet.EthType;
 import org.onlab.packet.IpAddress;
@@ -45,11 +39,6 @@
 import org.onosproject.evpnopenflow.rsc.vpnport.VpnPortEvent;
 import org.onosproject.evpnopenflow.rsc.vpnport.VpnPortListener;
 import org.onosproject.evpnopenflow.rsc.vpnport.VpnPortService;
-import org.onosproject.gluon.rsc.GluonConfig;
-import org.onosproject.incubator.net.resource.label.LabelResource;
-import org.onosproject.incubator.net.resource.label.LabelResourceAdminService;
-import org.onosproject.incubator.net.resource.label.LabelResourceId;
-import org.onosproject.incubator.net.resource.label.LabelResourceService;
 import org.onosproject.evpnrouteservice.EvpnInstanceName;
 import org.onosproject.evpnrouteservice.EvpnInstanceNextHop;
 import org.onosproject.evpnrouteservice.EvpnInstancePrefix;
@@ -66,6 +55,11 @@
 import org.onosproject.evpnrouteservice.Label;
 import org.onosproject.evpnrouteservice.RouteDistinguisher;
 import org.onosproject.evpnrouteservice.VpnRouteTarget;
+import org.onosproject.gluon.rsc.GluonConfig;
+import org.onosproject.incubator.net.resource.label.LabelResource;
+import org.onosproject.incubator.net.resource.label.LabelResourceAdminService;
+import org.onosproject.incubator.net.resource.label.LabelResourceId;
+import org.onosproject.incubator.net.resource.label.LabelResourceService;
 import org.onosproject.mastership.MastershipService;
 import org.onosproject.net.AnnotationKeys;
 import org.onosproject.net.Device;
@@ -94,6 +88,11 @@
 import org.onosproject.net.host.HostEvent;
 import org.onosproject.net.host.HostListener;
 import org.onosproject.net.host.HostService;
+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.ArrayList;
@@ -151,56 +150,55 @@
 /**
  * Implementation of the EVPN service.
  */
-@Component(immediate = true)
-@Service
+@Component(immediate = true, service = EvpnService.class)
 public class EvpnManager implements EvpnService {
     private final Logger log = getLogger(getClass());
     private static final EthType.EtherType ARP_TYPE = EthType.EtherType.ARP;
 
     protected ApplicationId appId;
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected HostService hostService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected CoreService coreService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected EvpnRouteService evpnRouteService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected EvpnRouteStore evpnRouteStore;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected DeviceService deviceService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected EvpnRouteAdminService evpnRouteAdminService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected MastershipService mastershipService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected LabelResourceAdminService labelAdminService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected LabelResourceService labelService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected VpnInstanceService vpnInstanceService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected FlowObjectiveService flowObjectiveService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected DriverService driverService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected VpnPortService vpnPortService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected VpnAfConfigService vpnAfConfigService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected NetworkConfigService configService;
 
     public Set<EvpnInstanceRoute> evpnInstanceRoutes = new HashSet<>();
diff --git a/apps/evpnopenflow/src/main/java/org/onosproject/evpnopenflow/rsc/baseport/impl/BasePortManager.java b/apps/evpnopenflow/src/main/java/org/onosproject/evpnopenflow/rsc/baseport/impl/BasePortManager.java
index 29c4d66..27f9fd7 100644
--- a/apps/evpnopenflow/src/main/java/org/onosproject/evpnopenflow/rsc/baseport/impl/BasePortManager.java
+++ b/apps/evpnopenflow/src/main/java/org/onosproject/evpnopenflow/rsc/baseport/impl/BasePortManager.java
@@ -18,12 +18,6 @@
 
 import com.fasterxml.jackson.databind.JsonNode;
 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.onlab.packet.IpAddress;
 import org.onlab.packet.MacAddress;
 import org.onlab.util.KryoNamespace;
@@ -55,6 +49,11 @@
 import org.onosproject.vtnrsc.TenantNetwork;
 import org.onosproject.vtnrsc.TenantNetworkId;
 import org.onosproject.vtnrsc.TenantRouter;
+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;
 
@@ -77,8 +76,7 @@
 /**
  * Provides implementation of the BasePort APIs.
  */
-@Component(immediate = true)
-@Service
+@Component(immediate = true, service = BasePortService.class)
 public class BasePortManager implements BasePortService {
 
     private final Set<BasePortListener> listeners = Sets
@@ -105,10 +103,10 @@
     protected EventuallyConsistentMap<BasePortId, BasePort> vPortStore;
     protected ApplicationId appId;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected StorageService storageService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected CoreService coreService;
 
     @Activate
diff --git a/apps/evpnopenflow/src/main/java/org/onosproject/evpnopenflow/rsc/cli/EvpnPrivateRouteListCommand.java b/apps/evpnopenflow/src/main/java/org/onosproject/evpnopenflow/rsc/cli/EvpnPrivateRouteListCommand.java
index f4ddf15..d069bc3 100644
--- a/apps/evpnopenflow/src/main/java/org/onosproject/evpnopenflow/rsc/cli/EvpnPrivateRouteListCommand.java
+++ b/apps/evpnopenflow/src/main/java/org/onosproject/evpnopenflow/rsc/cli/EvpnPrivateRouteListCommand.java
@@ -16,7 +16,8 @@
 
 package org.onosproject.evpnopenflow.rsc.cli;
 
-import org.apache.karaf.shell.commands.Command;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.evpnopenflow.manager.EvpnService;
 import org.onosproject.evpnopenflow.manager.impl.EvpnManager;
@@ -29,6 +30,7 @@
 /**
  * Support for displaying EVPN private routes.
  */
+@Service
 @Command(scope = "onos", name = "evpn-private-routes", description = "Lists" +
         " all EVPN private routes")
 public class EvpnPrivateRouteListCommand extends AbstractShellCommand {
@@ -36,7 +38,7 @@
             "   VPN name            Prefix         Next Hop";
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         EvpnService service = AbstractShellCommand.get(EvpnService.class);
         EvpnManager evpnManager = (EvpnManager) service;
         Collection<EvpnInstanceRoute> evpnRoutes = evpnManager.evpnInstanceRoutes;
diff --git a/apps/evpnopenflow/src/main/java/org/onosproject/evpnopenflow/rsc/cli/EvpnPublicRouteListCommand.java b/apps/evpnopenflow/src/main/java/org/onosproject/evpnopenflow/rsc/cli/EvpnPublicRouteListCommand.java
index 2ce5fb8..809090d 100644
--- a/apps/evpnopenflow/src/main/java/org/onosproject/evpnopenflow/rsc/cli/EvpnPublicRouteListCommand.java
+++ b/apps/evpnopenflow/src/main/java/org/onosproject/evpnopenflow/rsc/cli/EvpnPublicRouteListCommand.java
@@ -16,7 +16,8 @@
 
 package org.onosproject.evpnopenflow.rsc.cli;
 
-import org.apache.karaf.shell.commands.Command;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.evpnrouteservice.EvpnRoute;
 import org.onosproject.evpnrouteservice.EvpnRouteSet;
@@ -29,6 +30,7 @@
 /**
  * Support for displaying EVPN public routes.
  */
+@Service
 @Command(scope = "onos", name = "evpn-public-routes", description = "Lists" +
         " all EVPN public routes")
 public class EvpnPublicRouteListCommand extends AbstractShellCommand {
@@ -36,7 +38,7 @@
             "   MAC                  Prefix          Next Hop";
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         EvpnRouteStore evpnRouteStore = AbstractShellCommand.get(EvpnRouteStore.class);
 
         evpnRouteStore.getRouteTables().forEach(routeTableId -> {
diff --git a/apps/evpnopenflow/src/main/java/org/onosproject/evpnopenflow/rsc/cli/VpnInstListCommand.java b/apps/evpnopenflow/src/main/java/org/onosproject/evpnopenflow/rsc/cli/VpnInstListCommand.java
index 320c848..33074f7 100644
--- a/apps/evpnopenflow/src/main/java/org/onosproject/evpnopenflow/rsc/cli/VpnInstListCommand.java
+++ b/apps/evpnopenflow/src/main/java/org/onosproject/evpnopenflow/rsc/cli/VpnInstListCommand.java
@@ -16,7 +16,8 @@
 
 package org.onosproject.evpnopenflow.rsc.cli;
 
-import org.apache.karaf.shell.commands.Command;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.evpnopenflow.rsc.EvpnConstants;
 import org.onosproject.evpnopenflow.rsc.VpnInstance;
@@ -27,12 +28,13 @@
 /**
  * Support for displaying EVPN VPN instances.
  */
+@Service
 @Command(scope = "onos", name = "evpn-instance-list", description = "Lists " +
         "all EVPN instances")
 public class VpnInstListCommand extends AbstractShellCommand {
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         VpnInstanceService service = get(VpnInstanceService.class);
         Collection<VpnInstance> vpnInstances = service
                 .getInstances();
diff --git a/apps/evpnopenflow/src/main/java/org/onosproject/evpnopenflow/rsc/cli/VpnPortListCommand.java b/apps/evpnopenflow/src/main/java/org/onosproject/evpnopenflow/rsc/cli/VpnPortListCommand.java
index 366ead5..a4c7da8 100644
--- a/apps/evpnopenflow/src/main/java/org/onosproject/evpnopenflow/rsc/cli/VpnPortListCommand.java
+++ b/apps/evpnopenflow/src/main/java/org/onosproject/evpnopenflow/rsc/cli/VpnPortListCommand.java
@@ -16,7 +16,8 @@
 
 package org.onosproject.evpnopenflow.rsc.cli;
 
-import org.apache.karaf.shell.commands.Command;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.evpnopenflow.rsc.VpnPort;
 import org.onosproject.evpnopenflow.rsc.vpnport.VpnPortService;
@@ -28,12 +29,13 @@
 /**
  * Support for displaying EVPN VPN ports.
  */
+@Service
 @Command(scope = "onos", name = "evpn-port-list", description = "Lists all" +
         "EVPN ports")
 public class VpnPortListCommand extends AbstractShellCommand {
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         VpnPortService portService = get(VpnPortService.class);
         Collection<VpnPort> ports = portService.getPorts();
         ports.forEach(port -> {
diff --git a/apps/evpnopenflow/src/main/java/org/onosproject/evpnopenflow/rsc/vpnafconfig/impl/VpnAfConfigManager.java b/apps/evpnopenflow/src/main/java/org/onosproject/evpnopenflow/rsc/vpnafconfig/impl/VpnAfConfigManager.java
index 7645c2e..a2ee02c 100644
--- a/apps/evpnopenflow/src/main/java/org/onosproject/evpnopenflow/rsc/vpnafconfig/impl/VpnAfConfigManager.java
+++ b/apps/evpnopenflow/src/main/java/org/onosproject/evpnopenflow/rsc/vpnafconfig/impl/VpnAfConfigManager.java
@@ -18,12 +18,6 @@
 
 import com.fasterxml.jackson.databind.JsonNode;
 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.onlab.util.KryoNamespace;
 import org.onosproject.core.CoreService;
 import org.onosproject.evpnopenflow.rsc.DefaultVpnAfConfig;
@@ -36,6 +30,11 @@
 import org.onosproject.store.service.EventuallyConsistentMap;
 import org.onosproject.store.service.StorageService;
 import org.onosproject.store.service.WallClockTimestamp;
+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;
 
@@ -75,8 +74,7 @@
 /**
  * Provides implementation of the VPN af config APIs.
  */
-@Component(immediate = true)
-@Service
+@Component(immediate = true, service = VpnAfConfigService.class)
 public class VpnAfConfigManager implements VpnAfConfigService {
     private final Logger log = LoggerFactory.getLogger(getClass());
     private final Set<VpnAfConfigListener> listeners = Sets
@@ -84,10 +82,10 @@
 
     protected EventuallyConsistentMap<VpnRouteTarget, VpnAfConfig>
             vpnAfConfigStore;
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected StorageService storageService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected CoreService coreService;
 
     @Activate
diff --git a/apps/evpnopenflow/src/main/java/org/onosproject/evpnopenflow/rsc/vpninstance/impl/VpnInstanceManager.java b/apps/evpnopenflow/src/main/java/org/onosproject/evpnopenflow/rsc/vpninstance/impl/VpnInstanceManager.java
index 20c6d15..91eba1d 100644
--- a/apps/evpnopenflow/src/main/java/org/onosproject/evpnopenflow/rsc/vpninstance/impl/VpnInstanceManager.java
+++ b/apps/evpnopenflow/src/main/java/org/onosproject/evpnopenflow/rsc/vpninstance/impl/VpnInstanceManager.java
@@ -18,12 +18,6 @@
 
 import com.fasterxml.jackson.databind.JsonNode;
 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.onlab.util.KryoNamespace;
 import org.onosproject.core.ApplicationId;
 import org.onosproject.core.CoreService;
@@ -34,13 +28,18 @@
 import org.onosproject.evpnopenflow.rsc.vpnafconfig.VpnAfConfigService;
 import org.onosproject.evpnopenflow.rsc.vpninstance.VpnInstanceService;
 import org.onosproject.evpnrouteservice.EvpnInstanceName;
-import org.onosproject.routeservice.RouteAdminService;
 import org.onosproject.evpnrouteservice.RouteDistinguisher;
 import org.onosproject.evpnrouteservice.VpnRouteTarget;
+import org.onosproject.routeservice.RouteAdminService;
 import org.onosproject.store.serializers.KryoNamespaces;
 import org.onosproject.store.service.EventuallyConsistentMap;
 import org.onosproject.store.service.StorageService;
 import org.onosproject.store.service.WallClockTimestamp;
+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;
 
@@ -80,8 +79,7 @@
 /**
  * Provides implementation of the VpnInstance APIs.
  */
-@Component(immediate = true)
-@Service
+@Component(immediate = true, service = VpnInstanceService.class)
 public class VpnInstanceManager implements VpnInstanceService {
 
     private final Logger log = LoggerFactory.getLogger(getClass());
@@ -89,16 +87,16 @@
     protected EventuallyConsistentMap<VpnInstanceId, VpnInstance> vpnInstanceStore;
     protected ApplicationId appId;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected StorageService storageService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected RouteAdminService routeService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected CoreService coreService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected VpnAfConfigService vpnAfConfigService;
 
     @Activate
diff --git a/apps/evpnopenflow/src/main/java/org/onosproject/evpnopenflow/rsc/vpnport/impl/VpnPortManager.java b/apps/evpnopenflow/src/main/java/org/onosproject/evpnopenflow/rsc/vpnport/impl/VpnPortManager.java
index 2babba6..b62d034 100644
--- a/apps/evpnopenflow/src/main/java/org/onosproject/evpnopenflow/rsc/vpnport/impl/VpnPortManager.java
+++ b/apps/evpnopenflow/src/main/java/org/onosproject/evpnopenflow/rsc/vpnport/impl/VpnPortManager.java
@@ -18,12 +18,6 @@
 
 import com.fasterxml.jackson.databind.JsonNode;
 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.onlab.packet.IpAddress;
 import org.onlab.packet.IpPrefix;
 import org.onlab.packet.MacAddress;
@@ -64,6 +58,11 @@
 import org.onosproject.vtnrsc.subnet.SubnetService;
 import org.onosproject.vtnrsc.tenantnetwork.TenantNetworkService;
 import org.onosproject.vtnrsc.virtualport.VirtualPortService;
+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;
 
@@ -100,8 +99,7 @@
 /**
  * Provides implementation of the VpnPort service.
  */
-@Component(immediate = true)
-@Service
+@Component(immediate = true, service = VpnPortService.class)
 public class VpnPortManager implements VpnPortService {
 
     private final Logger log = LoggerFactory.getLogger(getClass());
@@ -111,22 +109,22 @@
     protected EventuallyConsistentMap<VpnPortId, VpnPort> vpnPortStore;
     protected ApplicationId appId;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected StorageService storageService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected CoreService coreService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected BasePortService basePortService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected VirtualPortService virtualPortService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected TenantNetworkService tenantNetworkService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected SubnetService subnetService;
 
     @Activate
diff --git a/apps/evpnopenflow/src/main/resources/OSGI-INF/blueprint/shell-config.xml b/apps/evpnopenflow/src/main/resources/OSGI-INF/blueprint/shell-config.xml
deleted file mode 100644
index fcc09bf..0000000
--- a/apps/evpnopenflow/src/main/resources/OSGI-INF/blueprint/shell-config.xml
+++ /dev/null
@@ -1,33 +0,0 @@
-<!--
-  ~ Copyright 2017-present Open Networking Foundation
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~     http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License.
-  -->
-
-<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0">
-
-    <command-bundle xmlns="http://karaf.apache.org/xmlns/shell/v1.1.0">
-        <command>
-            <action class="org.onosproject.evpnopenflow.rsc.cli.EvpnPublicRouteListCommand"/>
-        </command>
-        <command>
-            <action class="org.onosproject.evpnopenflow.rsc.cli.EvpnPrivateRouteListCommand"/>
-        </command>
-        <command>
-            <action class="org.onosproject.evpnopenflow.rsc.cli.VpnPortListCommand"/>
-        </command>
-        <command>
-            <action class="org.onosproject.evpnopenflow.rsc.cli.VpnInstListCommand"/>
-        </command>
-    </command-bundle>
-</blueprint>
diff --git a/apps/faultmanagement/BUCK b/apps/faultmanagement/BUCK
deleted file mode 100644
index ce1199c..0000000
--- a/apps/faultmanagement/BUCK
+++ /dev/null
@@ -1,16 +0,0 @@
-BUNDLES = [
-    '//apps/faultmanagement/fmcli:onos-apps-faultmanagement-fmcli',
-    '//apps/faultmanagement/fmgui:onos-apps-faultmanagement-fmgui',
-    '//apps/faultmanagement/fmmgr:onos-apps-faultmanagement-fmmgr',
-    '//apps/faultmanagement/fmweb:onos-apps-faultmanagement-fmweb',
-]
-
-onos_app(
-    title = 'Fault Management',
-    origin = 'BTI Systems',
-    description = 'Provides managements of alarms. Stores retrieved alarms from devices. ' +
-        'Offers CLI, UI and REST integration to obtain and display them from ONOS.',
-    category = 'Monitoring',
-    url = 'https://wiki.onosproject.org/display/ONOS/Fault+Management',
-    included_bundles = BUNDLES,
-)
diff --git a/apps/faultmanagement/app/app.xml b/apps/faultmanagement/app/app.xml
deleted file mode 100644
index 33c2653..0000000
--- a/apps/faultmanagement/app/app.xml
+++ /dev/null
@@ -1,26 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-  ~ Copyright 2015-present Open Networking Foundation
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~     http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License.
-  -->
-<app name="org.onosproject.faultmanagement" origin="BTI Systems" version="${project.version}"
-     category="Monitoring" url="https://wiki.onosproject.org/display/ONOS/Fault+Management" title="Fault Management App"
-     featuresRepo="mvn:${project.groupId}/${project.artifactId}/${project.version}/xml/features"
-     features="${project.artifactId}">
-    <description>${project.description}</description>
-    <artifact>mvn:${project.groupId}/onos-apps-faultmanagement-fmmgr/${project.version}</artifact>
-    <artifact>mvn:${project.groupId}/onos-apps-faultmanagement-fmweb/${project.version}</artifact>
-    <artifact>mvn:${project.groupId}/onos-apps-faultmanagement-fmgui/${project.version}</artifact>
-    <artifact>mvn:${project.groupId}/onos-apps-faultmanagement-fmcli/${project.version}</artifact>
-</app>
diff --git a/apps/faultmanagement/app/features.xml b/apps/faultmanagement/app/features.xml
deleted file mode 100644
index 313e46d..0000000
--- a/apps/faultmanagement/app/features.xml
+++ /dev/null
@@ -1,27 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
-<!--
-  ~ Copyright 2015-present Open Networking Foundation
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~     http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License.
-  -->
-<features xmlns="http://karaf.apache.org/xmlns/features/v1.2.0" name="${project.artifactId}-${project.version}">
-    <feature name="${project.artifactId}" version="${project.version}"
-             description="${project.description}">
-        <feature>onos-api</feature>
-        <feature>onos-drivers-default</feature>
-        <bundle>mvn:${project.groupId}/onos-apps-faultmanagement-fmmgr/${project.version}</bundle>
-        <bundle>mvn:${project.groupId}/onos-apps-faultmanagement-fmweb/${project.version}</bundle>
-        <bundle>mvn:${project.groupId}/onos-apps-faultmanagement-fmgui/${project.version}</bundle>
-        <bundle>mvn:${project.groupId}/onos-apps-faultmanagement-fmcli/${project.version}</bundle>
-    </feature>
-</features>
diff --git a/apps/faultmanagement/fmcli/BUCK b/apps/faultmanagement/fmcli/BUCK
deleted file mode 100644
index 37b1da6..0000000
--- a/apps/faultmanagement/fmcli/BUCK
+++ /dev/null
@@ -1,17 +0,0 @@
-COMPILE_DEPS = [
-    '//lib:CORE_DEPS',
-    '//lib:org.apache.karaf.shell.console',
-    '//incubator/api:onos-incubator-api',
-    '//cli:onos-cli',
-    '//utils/rest:onlab-rest',
-    '//lib:javax.ws.rs-api',
-    '//utils/osgi:onlab-osgi',
-    '//core/store/serializers:onos-core-serializers',
-    '//apps/faultmanagement/fmmgr:onos-apps-faultmanagement-fmmgr'
-]
-
-
-osgi_jar_with_tests (
-    deps = COMPILE_DEPS,
-    import_packages = '*,org.onosproject.cli.net',
-)
diff --git a/apps/faultmanagement/fmcli/BUILD b/apps/faultmanagement/fmcli/BUILD
index d71db6d..c86b7f3 100644
--- a/apps/faultmanagement/fmcli/BUILD
+++ b/apps/faultmanagement/fmcli/BUILD
@@ -4,6 +4,6 @@
 ]
 
 osgi_jar_with_tests(
-    import_packages = "*,org.onosproject.cli.net",
+    karaf_command_packages = ["org.onosproject.faultmanagement.alarms.cli"],
     deps = COMPILE_DEPS,
 )
diff --git a/apps/faultmanagement/fmcli/src/main/java/org/onosproject/faultmanagement/alarms/cli/CreateAlarm.java b/apps/faultmanagement/fmcli/src/main/java/org/onosproject/faultmanagement/alarms/cli/CreateAlarm.java
index e6bc0bc..0ccb986 100644
--- a/apps/faultmanagement/fmcli/src/main/java/org/onosproject/faultmanagement/alarms/cli/CreateAlarm.java
+++ b/apps/faultmanagement/fmcli/src/main/java/org/onosproject/faultmanagement/alarms/cli/CreateAlarm.java
@@ -16,8 +16,9 @@
 
 package org.onosproject.faultmanagement.alarms.cli;
 
-import org.apache.karaf.shell.commands.Argument;
-import org.apache.karaf.shell.commands.Command;
+import org.apache.karaf.shell.api.action.Argument;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.faultmanagement.api.AlarmStore;
 import org.onosproject.incubator.net.faultmanagement.alarm.Alarm;
@@ -31,6 +32,7 @@
 /**
  * Creates a default alarm on a device.
  */
+@Service
 @Command(scope = "onos", name = "alarm-create",
         description = "Creates an alarm")
 public class CreateAlarm extends AbstractShellCommand {
@@ -56,7 +58,7 @@
     private DeviceService deviceManager = AbstractShellCommand.get(DeviceService.class);
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         DeviceId deviceId = DeviceId.deviceId(deviceIdStr);
         if (!deviceManager.isAvailable(deviceId)) {
             throw new IllegalArgumentException("Device " + deviceIdStr + " is not available");
diff --git a/apps/faultmanagement/fmcli/src/main/java/org/onosproject/faultmanagement/alarms/cli/GetAllAlarms.java b/apps/faultmanagement/fmcli/src/main/java/org/onosproject/faultmanagement/alarms/cli/GetAllAlarms.java
index 65614dc..1c48dfb 100644
--- a/apps/faultmanagement/fmcli/src/main/java/org/onosproject/faultmanagement/alarms/cli/GetAllAlarms.java
+++ b/apps/faultmanagement/fmcli/src/main/java/org/onosproject/faultmanagement/alarms/cli/GetAllAlarms.java
@@ -17,10 +17,13 @@
 
 import org.apache.commons.lang3.builder.ToStringBuilder;
 import org.apache.commons.lang3.builder.ToStringStyle;
-import org.apache.karaf.shell.commands.Argument;
-import org.apache.karaf.shell.commands.Command;
-import org.apache.karaf.shell.commands.Option;
+import org.apache.karaf.shell.api.action.Argument;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.Completion;
+import org.apache.karaf.shell.api.action.Option;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.cli.AbstractShellCommand;
+import org.onosproject.cli.net.DeviceIdCompleter;
 import org.onosproject.incubator.net.faultmanagement.alarm.Alarm;
 import org.onosproject.incubator.net.faultmanagement.alarm.AlarmService;
 import org.onosproject.net.DeviceId;
@@ -30,6 +33,7 @@
 /**
  * Lists alarms across all devices.
  */
+@Service
 @Command(scope = "onos", name = "alarms",
         description = "Lists alarms")
 public class GetAllAlarms extends AbstractShellCommand {
@@ -40,13 +44,14 @@
 
     @Argument(index = 0, name = "deviceId", description = "Device identity",
             required = false, multiValued = false)
+    @Completion(DeviceIdCompleter.class)
     String deviceId = null;
 
     private AlarmService alarmService = AbstractShellCommand.get(AlarmService.class);
     private Set<Alarm> alarms;
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         if (deviceId != null) {
             if (activeOnly) {
                 alarms = alarmService.getActiveAlarms(DeviceId.deviceId(deviceId));
diff --git a/apps/faultmanagement/fmcli/src/main/java/org/onosproject/faultmanagement/alarms/cli/GetAllAlarmsCounts.java b/apps/faultmanagement/fmcli/src/main/java/org/onosproject/faultmanagement/alarms/cli/GetAllAlarmsCounts.java
index 8ff412a..1ce2ed2 100644
--- a/apps/faultmanagement/fmcli/src/main/java/org/onosproject/faultmanagement/alarms/cli/GetAllAlarmsCounts.java
+++ b/apps/faultmanagement/fmcli/src/main/java/org/onosproject/faultmanagement/alarms/cli/GetAllAlarmsCounts.java
@@ -17,10 +17,13 @@
 
 import static java.util.Comparator.comparingInt;
 
-import org.apache.karaf.shell.commands.Argument;
-import org.apache.karaf.shell.commands.Command;
-import org.apache.karaf.shell.commands.Option;
+import org.apache.karaf.shell.api.action.Argument;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.Completion;
+import org.apache.karaf.shell.api.action.Option;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.cli.AbstractShellCommand;
+import org.onosproject.cli.net.DeviceIdCompleter;
 import org.onosproject.incubator.net.faultmanagement.alarm.Alarm;
 import org.onosproject.incubator.net.faultmanagement.alarm.AlarmService;
 import org.onosproject.net.DeviceId;
@@ -31,6 +34,7 @@
 /**
  * Lists alarm counts across all devices.
  */
+@Service
 @Command(scope = "onos", name = "alarms-counts",
         description = "Lists the count of alarms for each severity")
 public class GetAllAlarmsCounts extends AbstractShellCommand {
@@ -41,13 +45,14 @@
 
     @Argument(index = 0, name = "deviceId", description = "Device identity",
             required = false, multiValued = false)
+    @Completion(DeviceIdCompleter.class)
     String deviceId = null;
 
     private AlarmService alarmService = AbstractShellCommand.get(AlarmService.class);
     private Map<Alarm.SeverityLevel, Long> alarmCounts;
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         if (deviceId != null) {
             if (activeOnly) {
                 alarmCounts = alarmService.getActiveAlarms(DeviceId.deviceId(deviceId))
diff --git a/apps/faultmanagement/fmcli/src/main/java/org/onosproject/faultmanagement/alarms/cli/RemoveAlarm.java b/apps/faultmanagement/fmcli/src/main/java/org/onosproject/faultmanagement/alarms/cli/RemoveAlarm.java
index 600e057..3f3cdfe 100644
--- a/apps/faultmanagement/fmcli/src/main/java/org/onosproject/faultmanagement/alarms/cli/RemoveAlarm.java
+++ b/apps/faultmanagement/fmcli/src/main/java/org/onosproject/faultmanagement/alarms/cli/RemoveAlarm.java
@@ -16,8 +16,8 @@
 
 package org.onosproject.faultmanagement.alarms.cli;
 
-import org.apache.karaf.shell.commands.Argument;
-import org.apache.karaf.shell.commands.Command;
+import org.apache.karaf.shell.api.action.Argument;
+import org.apache.karaf.shell.api.action.Command;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.faultmanagement.api.AlarmStore;
 import org.onosproject.incubator.net.faultmanagement.alarm.AlarmId;
@@ -35,7 +35,7 @@
     private AlarmStore alarmStore = AbstractShellCommand.get(AlarmStore.class);
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         alarmStore.removeAlarm(AlarmId.alarmId(alarmId));
     }
 }
diff --git a/apps/faultmanagement/fmcli/src/main/java/org/onosproject/faultmanagement/alarms/cli/UpdateAlarm.java b/apps/faultmanagement/fmcli/src/main/java/org/onosproject/faultmanagement/alarms/cli/UpdateAlarm.java
index 5766ed7..f92f8d0 100644
--- a/apps/faultmanagement/fmcli/src/main/java/org/onosproject/faultmanagement/alarms/cli/UpdateAlarm.java
+++ b/apps/faultmanagement/fmcli/src/main/java/org/onosproject/faultmanagement/alarms/cli/UpdateAlarm.java
@@ -16,8 +16,9 @@
 
 package org.onosproject.faultmanagement.alarms.cli;
 
-import org.apache.karaf.shell.commands.Argument;
-import org.apache.karaf.shell.commands.Command;
+import org.apache.karaf.shell.api.action.Argument;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.faultmanagement.api.AlarmStore;
 import org.onosproject.incubator.net.faultmanagement.alarm.Alarm;
@@ -32,6 +33,7 @@
  */
 @Command(scope = "onos", name = "alarm-update",
         description = "Updates an alarm")
+@Service
 public class UpdateAlarm extends AbstractShellCommand {
 
     @Argument(index = 0, name = "alarmId", description = "Unique alarm id",
@@ -49,7 +51,7 @@
     private AlarmStore alarmStore = AbstractShellCommand.get(AlarmStore.class);
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         Alarm existing = alarmStore.getAlarm(AlarmId.alarmId(alarmId));
 
         DefaultAlarm.Builder newAlarmBuilder = new DefaultAlarm.Builder(existing);
diff --git a/apps/faultmanagement/fmcli/src/main/java/org/onosproject/faultmanagement/alarms/cli/completer/AlarmFieldValueCompleter.java b/apps/faultmanagement/fmcli/src/main/java/org/onosproject/faultmanagement/alarms/cli/completer/AlarmFieldValueCompleter.java
index e1dcb64..b698d56 100644
--- a/apps/faultmanagement/fmcli/src/main/java/org/onosproject/faultmanagement/alarms/cli/completer/AlarmFieldValueCompleter.java
+++ b/apps/faultmanagement/fmcli/src/main/java/org/onosproject/faultmanagement/alarms/cli/completer/AlarmFieldValueCompleter.java
@@ -16,9 +16,7 @@
 
 package org.onosproject.faultmanagement.alarms.cli.completer;
 
-import org.apache.felix.service.command.CommandSession;
-import org.apache.karaf.shell.console.CommandSessionHolder;
-import org.apache.karaf.shell.console.completer.ArgumentCompleter;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.cli.AbstractChoicesCompleter;
 import org.onosproject.faultmanagement.alarms.cli.UpdateAlarm;
 
@@ -29,16 +27,13 @@
 /**
  * CLI completer for Alarm Field values.
  */
+@Service
 public class AlarmFieldValueCompleter extends AbstractChoicesCompleter {
     @Override
     protected List<String> choices() {
 
         List<String> choices = new ArrayList<>();
-        CommandSession session = CommandSessionHolder.getSession();
-
-        ArgumentCompleter.ArgumentList list =
-                (ArgumentCompleter.ArgumentList) session.get(ArgumentCompleter.ARGUMENTS_LIST);
-        UpdateAlarm.AlarmField field = UpdateAlarm.AlarmField.valueOf(list.getArguments()[2]);
+        UpdateAlarm.AlarmField field = UpdateAlarm.AlarmField.valueOf(commandLine.getArguments()[2]);
 
         switch (field) {
             case ACKNOWLEDGED:
diff --git a/apps/faultmanagement/fmcli/src/main/resources/OSGI-INF/blueprint/shell-config.xml b/apps/faultmanagement/fmcli/src/main/resources/OSGI-INF/blueprint/shell-config.xml
deleted file mode 100644
index f9aad59..0000000
--- a/apps/faultmanagement/fmcli/src/main/resources/OSGI-INF/blueprint/shell-config.xml
+++ /dev/null
@@ -1,61 +0,0 @@
-<!--
-~ Copyright 2015-present Open Networking Foundation
-~
-~ Licensed under the Apache License, Version 2.0 (the "License");
-~ you may not use this file except in compliance with the License.
-~ You may obtain a copy of the License at
-~
-~     http://www.apache.org/licenses/LICENSE-2.0
-~
-~ Unless required by applicable law or agreed to in writing, software
-~ distributed under the License is distributed on an "AS IS" BASIS,
-~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-~ See the License for the specific language governing permissions and
-~ limitations under the License.
--->
-<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0">
-
-    <command-bundle xmlns="http://karaf.apache.org/xmlns/shell/v1.1.0">
-
-        <command>
-            <action class="org.onosproject.faultmanagement.alarms.cli.GetAllAlarms"/>
-            <completers>
-                <ref component-id="deviceIdCompleter"/>
-            </completers>
-        </command>
-        <command>
-            <action class="org.onosproject.faultmanagement.alarms.cli.GetAllAlarmsCounts"/>
-            <completers>
-                <ref component-id="deviceIdCompleter"/>
-            </completers>
-        </command>
-        <command>
-            <action class="org.onosproject.faultmanagement.alarms.cli.CreateAlarm"/>
-            <completers>
-                <ref component-id="deviceIdCompleter"/>
-                <ref component-id="alarmSeverityCompleter"/>
-            </completers>
-        </command>
-        <command>
-            <action class="org.onosproject.faultmanagement.alarms.cli.UpdateAlarm"/>
-            <completers>
-                <ref component-id="alarmIdCompleter"/>
-                <ref component-id="alarmFieldCompleter"/>
-                <ref component-id="alarmFieldValueCompleter"/>
-            </completers>
-        </command>
-        <command>
-            <action class="org.onosproject.faultmanagement.alarms.cli.RemoveAlarm"/>
-            <completers>
-                <ref component-id="alarmIdCompleter"/>
-            </completers>
-        </command>
-    </command-bundle>
-
-    <bean id="deviceIdCompleter" class="org.onosproject.cli.net.DeviceIdCompleter"/>
-    <bean id="alarmIdCompleter" class="org.onosproject.faultmanagement.alarms.cli.completer.AlarmIdCompleter"/>
-    <bean id="alarmSeverityCompleter" class="org.onosproject.faultmanagement.alarms.cli.completer.AlarmSeverityCompleter"/>
-    <bean id="alarmFieldCompleter" class="org.onosproject.faultmanagement.alarms.cli.completer.AlarmFieldCompleter"/>
-    <bean id="alarmFieldValueCompleter" class="org.onosproject.faultmanagement.alarms.cli.completer.AlarmFieldValueCompleter"/>
-
-</blueprint>
diff --git a/apps/faultmanagement/fmgui/BUCK b/apps/faultmanagement/fmgui/BUCK
deleted file mode 100644
index 96c7835..0000000
--- a/apps/faultmanagement/fmgui/BUCK
+++ /dev/null
@@ -1,11 +0,0 @@
-COMPILE_DEPS = [
-    '//lib:CORE_DEPS',
-    '//lib:JACKSON',
-    '//lib:org.apache.karaf.shell.console',
-    '//incubator/api:onos-incubator-api',
-    '//cli:onos-cli',
-]
-
-osgi_jar_with_tests (
-    deps = COMPILE_DEPS,
-)
diff --git a/apps/faultmanagement/fmgui/BUILD b/apps/faultmanagement/fmgui/BUILD
index 667b034..6b5c757 100644
--- a/apps/faultmanagement/fmgui/BUILD
+++ b/apps/faultmanagement/fmgui/BUILD
@@ -1,7 +1,6 @@
-COMPILE_DEPS = CORE_DEPS + JACKSON + [
+COMPILE_DEPS = CORE_DEPS + JACKSON + CLI + [
     "//incubator/api:onos-incubator-api",
     "//apps/faultmanagement/fmmgr:onos-apps-faultmanagement-fmmgr",
-    "//cli:onos-cli",
 ]
 
 osgi_jar_with_tests(
diff --git a/apps/faultmanagement/fmgui/src/main/java/org/onosproject/faultmanagement/alarms/gui/AlarmTableComponent.java b/apps/faultmanagement/fmgui/src/main/java/org/onosproject/faultmanagement/alarms/gui/AlarmTableComponent.java
index 927de45..3ab3d15 100644
--- a/apps/faultmanagement/fmgui/src/main/java/org/onosproject/faultmanagement/alarms/gui/AlarmTableComponent.java
+++ b/apps/faultmanagement/fmgui/src/main/java/org/onosproject/faultmanagement/alarms/gui/AlarmTableComponent.java
@@ -16,11 +16,11 @@
 package org.onosproject.faultmanagement.alarms.gui;
 
 import com.google.common.collect.ImmutableList;
-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.onosproject.ui.UiExtension;
 import org.onosproject.ui.UiExtensionService;
 import org.onosproject.ui.UiMessageHandlerFactory;
@@ -43,7 +43,7 @@
 
     private final Logger log = LoggerFactory.getLogger(getClass());
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected UiExtensionService uiExtensionService;
 
     // List of application views
diff --git a/apps/faultmanagement/fmgui/src/main/java/org/onosproject/faultmanagement/alarms/gui/AlarmTopovComponent.java b/apps/faultmanagement/fmgui/src/main/java/org/onosproject/faultmanagement/alarms/gui/AlarmTopovComponent.java
index 1c136d3..9e4092e 100644
--- a/apps/faultmanagement/fmgui/src/main/java/org/onosproject/faultmanagement/alarms/gui/AlarmTopovComponent.java
+++ b/apps/faultmanagement/fmgui/src/main/java/org/onosproject/faultmanagement/alarms/gui/AlarmTopovComponent.java
@@ -16,11 +16,11 @@
 package org.onosproject.faultmanagement.alarms.gui;
 
 import com.google.common.collect.ImmutableList;
-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.onosproject.ui.UiExtension;
 import org.onosproject.ui.UiExtensionService;
 import org.onosproject.ui.UiMessageHandlerFactory;
@@ -43,7 +43,7 @@
 
     private final Logger log = LoggerFactory.getLogger(getClass());
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected UiExtensionService uiExtensionService;
 
     // List of application views
diff --git a/apps/faultmanagement/fmmgr/BUCK b/apps/faultmanagement/fmmgr/BUCK
deleted file mode 100644
index b9c59f8..0000000
--- a/apps/faultmanagement/fmmgr/BUCK
+++ /dev/null
@@ -1,17 +0,0 @@
-COMPILE_DEPS = [
-    '//lib:CORE_DEPS',
-    '//lib:KRYO',
-    '//incubator/api:onos-incubator-api',
-    '//core/store/serializers:onos-core-serializers',
-]
-
-TEST_DEPS = [
-    '//lib:TEST_ADAPTERS',
-    '//utils/osgi:onlab-osgi-tests',
-    '//incubator/api:onos-incubator-api-tests',
-]
-
-osgi_jar_with_tests (
-    deps = COMPILE_DEPS,
-    test_deps = TEST_DEPS,
-)
diff --git a/apps/faultmanagement/fmmgr/src/main/java/org/onosproject/faultmanagement/impl/AlarmManager.java b/apps/faultmanagement/fmmgr/src/main/java/org/onosproject/faultmanagement/impl/AlarmManager.java
index 74ed2c2..8d1a5a5 100644
--- a/apps/faultmanagement/fmmgr/src/main/java/org/onosproject/faultmanagement/impl/AlarmManager.java
+++ b/apps/faultmanagement/fmmgr/src/main/java/org/onosproject/faultmanagement/impl/AlarmManager.java
@@ -16,13 +16,6 @@
 package org.onosproject.faultmanagement.impl;
 
 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.Modified;
-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.ItemNotFoundException;
 import org.onosproject.faultmanagement.api.AlarmStore;
 import org.onosproject.faultmanagement.api.AlarmStoreDelegate;
@@ -44,6 +37,11 @@
 import org.onosproject.net.device.DeviceService;
 import org.onosproject.net.provider.AbstractListenerProviderRegistry;
 import org.onosproject.net.provider.AbstractProviderService;
+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;
@@ -59,21 +57,20 @@
 /**
  * Implementation of the Alarm service.
  */
-@Component(immediate = true)
-@Service
+@Component(immediate = true, service = { AlarmService.class, AlarmProviderRegistry.class })
 public class AlarmManager
         extends AbstractListenerProviderRegistry<AlarmEvent, AlarmListener, AlarmProvider, AlarmProviderService>
         implements AlarmService, AlarmProviderRegistry {
 
     private final Logger log = getLogger(getClass());
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected DeviceService deviceService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected MastershipService mastershipService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected AlarmStore store;
 
     protected AlarmStoreDelegate delegate = this::post;
@@ -101,12 +98,6 @@
         log.info("Stopped");
     }
 
-    @Modified
-    public boolean modified() {
-        log.info("Modified");
-        return true;
-    }
-
     @Override
     public Alarm updateBookkeepingFields(AlarmId id, boolean clear, boolean isAcknowledged,
                                          String assignedUser) {
diff --git a/apps/faultmanagement/fmmgr/src/main/java/org/onosproject/faultmanagement/impl/DistributedAlarmStore.java b/apps/faultmanagement/fmmgr/src/main/java/org/onosproject/faultmanagement/impl/DistributedAlarmStore.java
index 4a91749..ca5c7eb 100644
--- a/apps/faultmanagement/fmmgr/src/main/java/org/onosproject/faultmanagement/impl/DistributedAlarmStore.java
+++ b/apps/faultmanagement/fmmgr/src/main/java/org/onosproject/faultmanagement/impl/DistributedAlarmStore.java
@@ -17,13 +17,6 @@
 package org.onosproject.faultmanagement.impl;
 
 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.Modified;
-import org.apache.felix.scr.annotations.Reference;
-import org.apache.felix.scr.annotations.ReferenceCardinality;
-import org.apache.felix.scr.annotations.Service;
 import org.onosproject.faultmanagement.api.AlarmStore;
 import org.onosproject.faultmanagement.api.AlarmStoreDelegate;
 import org.onosproject.incubator.net.faultmanagement.alarm.Alarm;
@@ -39,6 +32,11 @@
 import org.onosproject.store.service.MapEventListener;
 import org.onosproject.store.service.Serializer;
 import org.onosproject.store.service.StorageService;
+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;
@@ -52,8 +50,7 @@
  * Manages information of alarms using gossip protocol to distribute
  * information.
  */
-@Component(immediate = true)
-@Service
+@Component(immediate = true, service = AlarmStore.class)
 public class DistributedAlarmStore
         extends AbstractStore<AlarmEvent, AlarmStoreDelegate>
         implements AlarmStore {
@@ -62,7 +59,7 @@
     private ConsistentMap<AlarmId, Alarm> alarms;
     private Map<AlarmId, Alarm> alarmsMap;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected StorageService storageService;
 
     private final MapEventListener<AlarmId, Alarm> listener = new InternalListener();
@@ -90,12 +87,6 @@
         log.info("Stopped");
     }
 
-    @Modified
-    public boolean modified() {
-        log.info("Modified");
-        return true;
-    }
-
     @Override
     public Alarm getAlarm(AlarmId alarmId) {
         return alarmsMap.get(alarmId);
diff --git a/apps/faultmanagement/fmmgr/src/main/java/org/onosproject/faultmanagement/impl/OsgiPropertyConstants.java b/apps/faultmanagement/fmmgr/src/main/java/org/onosproject/faultmanagement/impl/OsgiPropertyConstants.java
new file mode 100644
index 0000000..e552a49
--- /dev/null
+++ b/apps/faultmanagement/fmmgr/src/main/java/org/onosproject/faultmanagement/impl/OsgiPropertyConstants.java
@@ -0,0 +1,28 @@
+/*
+ * Copyright 2018-present Open Networking Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.onosproject.faultmanagement.impl;
+
+public final class OsgiPropertyConstants {
+    private OsgiPropertyConstants() {
+    }
+
+    static final String POLL_FREQUENCY_SECONDS = "alarmPollFrequencySeconds";
+    static final int POLL_FREQUENCY_SECONDS_DEFAULT = 60;
+
+    static final String CLEAR_FREQUENCY_SECONDS = "clearedAlarmPurgeFrequencySeconds";
+    static final int CLEAR_FREQUENCY_SECONDS_DEFAULT = 500;
+}
diff --git a/apps/faultmanagement/fmmgr/src/main/java/org/onosproject/faultmanagement/impl/PollingAlarmProvider.java b/apps/faultmanagement/fmmgr/src/main/java/org/onosproject/faultmanagement/impl/PollingAlarmProvider.java
index c74934c..bceaf3f 100644
--- a/apps/faultmanagement/fmmgr/src/main/java/org/onosproject/faultmanagement/impl/PollingAlarmProvider.java
+++ b/apps/faultmanagement/fmmgr/src/main/java/org/onosproject/faultmanagement/impl/PollingAlarmProvider.java
@@ -15,13 +15,6 @@
  */
 package org.onosproject.faultmanagement.impl;
 
-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.onosproject.cfg.ComponentConfigService;
 import org.onosproject.incubator.net.faultmanagement.alarm.AlarmConsumer;
 import org.onosproject.incubator.net.faultmanagement.alarm.AlarmProvider;
@@ -38,6 +31,12 @@
 import org.onosproject.net.provider.AbstractProvider;
 import org.onosproject.net.provider.ProviderId;
 import org.osgi.service.component.ComponentContext;
+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.Dictionary;
@@ -51,27 +50,37 @@
 import static java.util.concurrent.Executors.newScheduledThreadPool;
 import static org.onlab.util.Tools.get;
 import static org.onlab.util.Tools.groupedThreads;
+import static org.onosproject.faultmanagement.impl.OsgiPropertyConstants.CLEAR_FREQUENCY_SECONDS;
+import static org.onosproject.faultmanagement.impl.OsgiPropertyConstants.CLEAR_FREQUENCY_SECONDS_DEFAULT;
+import static org.onosproject.faultmanagement.impl.OsgiPropertyConstants.POLL_FREQUENCY_SECONDS;
+import static org.onosproject.faultmanagement.impl.OsgiPropertyConstants.POLL_FREQUENCY_SECONDS_DEFAULT;
 import static org.slf4j.LoggerFactory.getLogger;
 
 /**
  * Alarm provider capable of polling the environment using the device driver
  * {@link AlarmConsumer} behaviour.
  */
-@Component(immediate = true)
+@Component(
+    immediate = true,
+    property = {
+        POLL_FREQUENCY_SECONDS + "=" + POLL_FREQUENCY_SECONDS_DEFAULT,
+        CLEAR_FREQUENCY_SECONDS + "=" + CLEAR_FREQUENCY_SECONDS_DEFAULT
+    }
+)
 public class PollingAlarmProvider extends AbstractProvider implements AlarmProvider {
 
     private final Logger log = getLogger(getClass());
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected DeviceService deviceService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected MastershipService mastershipService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected AlarmProviderRegistry providerRegistry;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected ComponentConfigService cfgService;
 
     protected AlarmProviderService providerService;
@@ -88,16 +97,11 @@
 
     private static final int CORE_POOL_SIZE = 10;
 
-    private static final int DEFAULT_POLL_FREQUENCY_SECONDS = 60;
-    @Property(name = "alarmPollFrequencySeconds", intValue = DEFAULT_POLL_FREQUENCY_SECONDS,
-            label = "Frequency (in seconds) for polling alarm from devices")
-    protected int alarmPollFrequencySeconds = DEFAULT_POLL_FREQUENCY_SECONDS;
+    /** Frequency (in seconds) for polling alarm from devices. */
+    protected int alarmPollFrequencySeconds = POLL_FREQUENCY_SECONDS_DEFAULT;
 
-    // TODO implement purging of old alarms.
-    private static final int DEFAULT_CLEAR_FREQUENCY_SECONDS = 500;
-    @Property(name = "clearedAlarmPurgeSeconds", intValue = DEFAULT_CLEAR_FREQUENCY_SECONDS,
-            label = "Frequency (in seconds) for deleting cleared alarms")
-    private int clearedAlarmPurgeFrequencySeconds = DEFAULT_CLEAR_FREQUENCY_SECONDS;
+    /** Frequency (in seconds) for deleting cleared alarms. */
+    private int clearedAlarmPurgeFrequencySeconds = CLEAR_FREQUENCY_SECONDS_DEFAULT;
 
     public PollingAlarmProvider() {
         super(new ProviderId("default", "org.onosproject.core"));
@@ -120,7 +124,7 @@
         mastershipService.addListener(mastershipListener);
 
         if (context == null) {
-            alarmPollFrequencySeconds = DEFAULT_POLL_FREQUENCY_SECONDS;
+            alarmPollFrequencySeconds = POLL_FREQUENCY_SECONDS_DEFAULT;
             log.info("No component configuration");
         } else {
             Dictionary<?, ?> properties = context.getProperties();
@@ -168,10 +172,10 @@
     private int getNewPollFrequency(Dictionary<?, ?> properties, int pollFrequency) {
         int newPollFrequency;
         try {
-            String s = get(properties, "pollFrequency");
+            String s = get(properties, POLL_FREQUENCY_SECONDS);
             newPollFrequency = isNullOrEmpty(s) ? pollFrequency : Integer.parseInt(s.trim());
         } catch (NumberFormatException | ClassCastException e) {
-            newPollFrequency = DEFAULT_POLL_FREQUENCY_SECONDS;
+            newPollFrequency = POLL_FREQUENCY_SECONDS_DEFAULT;
         }
         return newPollFrequency;
     }
diff --git a/apps/faultmanagement/fmmgr/src/test/java/org/onosproject/faultmanagement/impl/PollingAlarmProviderTest.java b/apps/faultmanagement/fmmgr/src/test/java/org/onosproject/faultmanagement/impl/PollingAlarmProviderTest.java
index 0ebd4cc..d6c14ce 100644
--- a/apps/faultmanagement/fmmgr/src/test/java/org/onosproject/faultmanagement/impl/PollingAlarmProviderTest.java
+++ b/apps/faultmanagement/fmmgr/src/test/java/org/onosproject/faultmanagement/impl/PollingAlarmProviderTest.java
@@ -307,7 +307,7 @@
 
         @Override
         public Object get(Object key) {
-            if ("pollFrequency".equals(key)) {
+            if (OsgiPropertyConstants.POLL_FREQUENCY_SECONDS.equals(key)) {
                 return "1";
             }
             return null;
diff --git a/apps/faultmanagement/fmweb/BUCK b/apps/faultmanagement/fmweb/BUCK
deleted file mode 100644
index 3a20d8e..0000000
--- a/apps/faultmanagement/fmweb/BUCK
+++ /dev/null
@@ -1,26 +0,0 @@
-COMPILE_DEPS = [
-    '//lib:CORE_DEPS',
-    '//lib:JACKSON',
-    '//incubator/api:onos-incubator-api',
-    '//utils/rest:onlab-rest',
-    '//lib:javax.ws.rs-api',
-]
-
-TEST_DEPS = [
-    '//lib:TEST_ADAPTERS',
-    '//lib:jersey-test-framework-core',
-    '//lib:jersey-test-framework-jetty',
-    '//utils/osgi:onlab-osgi-tests',
-    '//web/api:onos-rest-tests',
-    '//incubator/api:onos-incubator-api-tests',
-]
-
-osgi_jar_with_tests (
-    deps = COMPILE_DEPS,
-    test_deps = TEST_DEPS,
-    web_context = '/onos/v1/fm',
-    api_title = 'Fault Management Rest API',
-    api_version = '1.0',
-    api_description = 'REST API for Fault Management',
-    api_package = 'org.onosproject.faultmanagement'
-)
diff --git a/apps/faultmanagement/fmweb/src/main/java/org/onosproject/faultmanagement/web/AlarmCodecRegistrator.java b/apps/faultmanagement/fmweb/src/main/java/org/onosproject/faultmanagement/web/AlarmCodecRegistrator.java
index b6bccd0..0a2120a 100644
--- a/apps/faultmanagement/fmweb/src/main/java/org/onosproject/faultmanagement/web/AlarmCodecRegistrator.java
+++ b/apps/faultmanagement/fmweb/src/main/java/org/onosproject/faultmanagement/web/AlarmCodecRegistrator.java
@@ -15,11 +15,11 @@
  */
 package org.onosproject.faultmanagement.web;
 
-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.onosproject.codec.CodecService;
 import org.onosproject.incubator.net.faultmanagement.alarm.Alarm;
 
@@ -34,7 +34,7 @@
 
     private static final Logger log = LoggerFactory.getLogger(AlarmCodecRegistrator.class);
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected CodecService codecService;
 
     @Activate
diff --git a/apps/flowanalyzer/BUCK b/apps/flowanalyzer/BUCK
deleted file mode 100644
index 2f5461f..0000000
--- a/apps/flowanalyzer/BUCK
+++ /dev/null
@@ -1,23 +0,0 @@
-COMPILE_DEPS = [
-    '//lib:CORE_DEPS',
-    '//lib:org.apache.karaf.shell.console',
-    '//cli:onos-cli',
-]
-
-TEST_DEPS = [
-    '//lib:TEST_ADAPTERS',
-]
-
-osgi_jar_with_tests (
-    deps = COMPILE_DEPS,
-    test_deps = TEST_DEPS,
-    resources_root = 'src/main/resources',
-    resources = glob(['src/main/resources/**']),
-)
-
-onos_app (
-    title = 'Flow Space Analysis',
-    category = 'Monitoring',
-    url = 'http://onosproject.org',
-    description = 'Simple flow space analyzer.',
-)
diff --git a/apps/flowanalyzer/BUILD b/apps/flowanalyzer/BUILD
index 422f1be..e7b7764 100644
--- a/apps/flowanalyzer/BUILD
+++ b/apps/flowanalyzer/BUILD
@@ -1,6 +1,7 @@
 COMPILE_DEPS = CORE_DEPS + CLI
 
 osgi_jar_with_tests(
+    karaf_command_packages = ["org.onosproject.flowanalyzer"],
     resources = glob(["src/main/resources/**"]),
     resources_root = "src/main/resources",
     test_deps = TEST_ADAPTERS,
diff --git a/apps/flowanalyzer/src/main/java/org/onosproject/flowanalyzer/FlowAnalysisCommand.java b/apps/flowanalyzer/src/main/java/org/onosproject/flowanalyzer/FlowAnalysisCommand.java
index 35cb5ef..7d83e08 100644
--- a/apps/flowanalyzer/src/main/java/org/onosproject/flowanalyzer/FlowAnalysisCommand.java
+++ b/apps/flowanalyzer/src/main/java/org/onosproject/flowanalyzer/FlowAnalysisCommand.java
@@ -15,18 +15,20 @@
  */
 package org.onosproject.flowanalyzer;
 
-import org.apache.karaf.shell.commands.Command;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.cli.AbstractShellCommand;
 
 /**
  * Analyzes flows for cycles and black holes.
  */
+@Service
 @Command(scope = "onos", name = "flow-analysis",
          description = "Analyzes flows for cycles and black holes")
 public class FlowAnalysisCommand extends AbstractShellCommand {
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         FlowAnalyzer service = get(FlowAnalyzer.class);
         print(service.analyze());
     }
diff --git a/apps/flowanalyzer/src/main/java/org/onosproject/flowanalyzer/FlowAnalyzer.java b/apps/flowanalyzer/src/main/java/org/onosproject/flowanalyzer/FlowAnalyzer.java
index 9f899ac..990ec45 100644
--- a/apps/flowanalyzer/src/main/java/org/onosproject/flowanalyzer/FlowAnalyzer.java
+++ b/apps/flowanalyzer/src/main/java/org/onosproject/flowanalyzer/FlowAnalyzer.java
@@ -15,34 +15,33 @@
  */
 package org.onosproject.flowanalyzer;
 
-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.net.ConnectPoint;
+import org.onosproject.net.DeviceId;
+import org.onosproject.net.HostId;
+import org.onosproject.net.Link;
 import org.onosproject.net.PortNumber;
 import org.onosproject.net.flow.FlowEntry;
 import org.onosproject.net.flow.FlowRuleService;
-import org.onosproject.net.DeviceId;
-import org.onosproject.net.HostId;
 import org.onosproject.net.flow.criteria.Criteria;
 import org.onosproject.net.flow.criteria.Criterion;
 import org.onosproject.net.flow.criteria.PortCriterion;
 import org.onosproject.net.flow.instructions.Instruction;
 import org.onosproject.net.flow.instructions.Instructions;
-import org.onosproject.net.topology.TopologyService;
-import org.onosproject.net.topology.TopologyGraph;
 import org.onosproject.net.link.LinkService;
-import org.onosproject.net.Link;
+import org.onosproject.net.topology.TopologyGraph;
+import org.onosproject.net.topology.TopologyService;
 import org.onosproject.net.topology.TopologyVertex;
 import org.osgi.service.component.ComponentContext;
+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.HashMap;
 import java.util.HashSet;
 import java.util.List;
-import java.util.HashMap;
 import java.util.Map;
 import java.util.Set;
 
@@ -51,19 +50,18 @@
 /**
  * Simple flow space analyzer app.
  */
-@Component(immediate = true)
-@Service(value = FlowAnalyzer.class)
+@Component(immediate = true, service = FlowAnalyzer.class)
 public class FlowAnalyzer {
 
     private final Logger log = getLogger(getClass());
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected FlowRuleService flowRuleService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected TopologyService topologyService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected LinkService linkService;
 
     @Activate
diff --git a/apps/flowanalyzer/src/main/resources/OSGI-INF/blueprint/shell-config.xml b/apps/flowanalyzer/src/main/resources/OSGI-INF/blueprint/shell-config.xml
deleted file mode 100644
index d14ebbe..0000000
--- a/apps/flowanalyzer/src/main/resources/OSGI-INF/blueprint/shell-config.xml
+++ /dev/null
@@ -1,23 +0,0 @@
-<!--
-  ~ Copyright 2015-present Open Networking Foundation
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~     http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License.
-  -->
-<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0">
-    <command-bundle xmlns="http://karaf.apache.org/xmlns/shell/v1.1.0">
-        <command>
-            <action class="org.onosproject.flowanalyzer.FlowAnalysisCommand"/>
-        </command>
-
-    </command-bundle>
-</blueprint>
diff --git a/apps/flowspec-api/BUCK b/apps/flowspec-api/BUCK
deleted file mode 100644
index 01efc7a..0000000
--- a/apps/flowspec-api/BUCK
+++ /dev/null
@@ -1,11 +0,0 @@
-BUNDLES = [
-    '//apps/flowspec-api/flowapi:onos-apps-flowspec-api-flowapi',
-
-]
-
-onos_app (
-  title = 'Flowspec API',
-  url = 'http://onosproject.org',
-  included_bundles = BUNDLES,
-  description = 'ONOS framework applications',
-)
diff --git a/apps/flowspec-api/flowapi/BUCK b/apps/flowspec-api/flowapi/BUCK
deleted file mode 100644
index 835b939..0000000
--- a/apps/flowspec-api/flowapi/BUCK
+++ /dev/null
@@ -1,18 +0,0 @@
-COMPILE_DEPS = [
-    '//utils/osgi:onlab-osgi',
-    '//utils/misc:onlab-misc',
-    '//lib:commons-io',
-    '//lib:com_google_guava_guava',
-    '//lib:kryo',
-    '//lib:slf4j-api',
-]
-
-TEST_DEPS = [
-    '//lib:TEST_ADAPTERS',
-]
-
-osgi_jar_with_tests (
-    deps = COMPILE_DEPS,
-    test_deps = TEST_DEPS,
-    visibility = ['PUBLIC'],
-)
diff --git a/apps/fwd/BUCK b/apps/fwd/BUCK
deleted file mode 100644
index 6a877fd..0000000
--- a/apps/fwd/BUCK
+++ /dev/null
@@ -1,27 +0,0 @@
-COMPILE_DEPS = [
-    '//lib:CORE_DEPS',
-    '//lib:KRYO',
-    '//core/store/serializers:onos-core-serializers',
-    '//core/store/primitives:onos-core-primitives',
-    '//core/api:onos-api',
-    '//lib:org.apache.karaf.shell.console',
-    '//cli:onos-cli',
-]
-
-osgi_jar_with_tests (
-    deps = COMPILE_DEPS,
-)
-
-onos_app (
-    title = 'Reactive Forwarding',
-    category = 'Traffic Engineering',
-    url = 'http://onosproject.org',
-    description = 'Provisions traffic between end-stations using hop-by-hop flow programming by ' +
-        'intercepting packets for which there are currently no matching flow objectives on the ' +
-        'data plane. The paths paved in this manner are short-lived, i.e. they expire a few ' +
-        'seconds after the flow on whose behalf they were programmed stops.\n\n' +
-        'The application relies on the ONOS path service to compute the shortest paths. ' +
-        'In the event of negative topology events (link loss, device disconnect, etc.), ' +
-        'the application will proactively invalidate any paths that it had programmed to lead ' +
-        'through the resources that are no longer available.',
-)
diff --git a/apps/fwd/BUILD b/apps/fwd/BUILD
index f2f4bc4..40d5216 100644
--- a/apps/fwd/BUILD
+++ b/apps/fwd/BUILD
@@ -4,6 +4,7 @@
 ]
 
 osgi_jar_with_tests(
+    karaf_command_packages = ["org.onosproject.fwd"],
     deps = COMPILE_DEPS,
 )
 
diff --git a/apps/fwd/src/main/java/org/onosproject/fwd/MacAddressCompleter.java b/apps/fwd/src/main/java/org/onosproject/fwd/MacAddressCompleter.java
index 780f9e5..6ce6ae1 100644
--- a/apps/fwd/src/main/java/org/onosproject/fwd/MacAddressCompleter.java
+++ b/apps/fwd/src/main/java/org/onosproject/fwd/MacAddressCompleter.java
@@ -14,8 +14,11 @@
  * limitations under the License.
  */
 package org.onosproject.fwd;
-import org.apache.karaf.shell.console.Completer;
-import org.apache.karaf.shell.console.completer.StringsCompleter;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
+import org.apache.karaf.shell.api.console.CommandLine;
+import org.apache.karaf.shell.api.console.Completer;
+import org.apache.karaf.shell.api.console.Session;
+import org.apache.karaf.shell.support.completers.StringsCompleter;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.store.service.EventuallyConsistentMap;
 import java.util.List;
@@ -25,9 +28,10 @@
 /**
  * Sample reactive forwarding application.
  */
+@Service
 public class MacAddressCompleter implements Completer {
     @Override
-    public int complete(String buffer, int cursor, List<String> candidates) {
+    public int complete(Session session, CommandLine commandLine, List<String> candidates) {
         // Delegate string completer
         StringsCompleter delegate = new StringsCompleter();
         EventuallyConsistentMap<MacAddress, ReactiveForwardMetrics> macAddress;
@@ -39,6 +43,6 @@
             strings.add(key.toString());
         }
         // Now let the completer do the work for figuring out what to offer.
-        return delegate.complete(buffer, cursor, candidates);
+        return delegate.complete(session, commandLine, candidates);
     }
 }
diff --git a/apps/fwd/src/main/java/org/onosproject/fwd/OsgiPropertyConstants.java b/apps/fwd/src/main/java/org/onosproject/fwd/OsgiPropertyConstants.java
new file mode 100644
index 0000000..e4c795a
--- /dev/null
+++ b/apps/fwd/src/main/java/org/onosproject/fwd/OsgiPropertyConstants.java
@@ -0,0 +1,67 @@
+/*
+ * Copyright 2018-present Open Networking Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.onosproject.fwd;
+
+public final class OsgiPropertyConstants {
+    private OsgiPropertyConstants() {
+    }
+
+    static final String PACKET_OUT_ONLY = "packetOutOnly";
+    static final boolean PACKET_OUT_ONLY_DEFAULT  = false;
+
+    static final String  PACKET_OUT_OFPP_TABLE  = "packetOutOfppTable";
+    static final boolean PACKET_OUT_OFPP_TABLE_DEFAULT = false;
+
+    static final String FLOW_TIMEOUT = "flowTimeout";
+    static final int FLOW_TIMEOUT_DEFAULT = 10;
+
+    static final String FLOW_PRIORITY = "flowPriority";
+    static final int FLOW_PRIORITY_DEFAULT = 10;
+
+    static final String IPV6_FORWARDING = "ipv6Forwarding";
+    static final boolean IPV6_FORWARDING_DEFAULT = false;
+
+    static final String MATCH_DST_MAC_ONLY = "matchDstMacOnly";
+    static final boolean MATCH_DST_MAC_ONLY_DEFAULT = false;
+
+    static final String MATCH_VLAN_ID = "matchVlanId";
+    static final boolean MATCH_VLAN_ID_DEFAULT = false;
+
+    static final String MATCH_IPV4_ADDRESS = "matchIpv4Address";
+    static final boolean MATCH_IPV4_ADDRESS_DEFAULT = false;
+
+    static final String MATCH_IPV4_DSCP = "matchIpv4Dscp";
+    static final boolean MATCH_IPV4_DSCP_DEFAULT = false;
+
+    static final String MATCH_IPV6_ADDRESS = "matchIpv6Address";
+    static final boolean MATCH_IPV6_ADDRESS_DEFAULT = false;
+
+    static final String MATCH_IPV6_FLOW_LABEL = "matchIpv6FlowLabel";
+    static final boolean MATCH_IPV6_FLOW_LABEL_DEFAULT = false;
+
+    static final String MATCH_TCP_UDP_PORTS = "matchTcpUdpPorts";
+    static final boolean MATCH_TCP_UDP_PORTS_DEFAULT = false;
+
+    static final String MATCH_ICMP_FIELDS = "matchIcmpFields";
+    static final boolean MATCH_ICMP_FIELDS_DEFAULT = false;
+
+    static final String IGNORE_IPV4_MCAST_PACKETS = "ignoreIPv4Multicast";
+    static final boolean IGNORE_IPV4_MCAST_PACKETS_DEFAULT = false;
+
+    static final String RECORD_METRICS = "recordMetrics";
+    static final boolean RECORD_METRICS_DEFAULT = false;
+}
diff --git a/apps/fwd/src/main/java/org/onosproject/fwd/ReactiveForwarding.java b/apps/fwd/src/main/java/org/onosproject/fwd/ReactiveForwarding.java
index 9917a85..83dc3bc 100644
--- a/apps/fwd/src/main/java/org/onosproject/fwd/ReactiveForwarding.java
+++ b/apps/fwd/src/main/java/org/onosproject/fwd/ReactiveForwarding.java
@@ -16,14 +16,6 @@
 package org.onosproject.fwd;
 
 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.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.packet.Ethernet;
 import org.onlab.packet.ICMP;
 import org.onlab.packet.ICMP6;
@@ -79,6 +71,12 @@
 import org.onosproject.store.service.StorageService;
 import org.onosproject.store.service.WallClockTimestamp;
 import org.osgi.service.component.ComponentContext;
+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.Dictionary;
@@ -91,42 +89,88 @@
 
 import static java.util.concurrent.Executors.newSingleThreadExecutor;
 import static org.onlab.util.Tools.groupedThreads;
+import static org.onosproject.fwd.OsgiPropertyConstants.FLOW_PRIORITY;
+import static org.onosproject.fwd.OsgiPropertyConstants.FLOW_PRIORITY_DEFAULT;
+import static org.onosproject.fwd.OsgiPropertyConstants.FLOW_TIMEOUT;
+import static org.onosproject.fwd.OsgiPropertyConstants.FLOW_TIMEOUT_DEFAULT;
+import static org.onosproject.fwd.OsgiPropertyConstants.IGNORE_IPV4_MCAST_PACKETS;
+import static org.onosproject.fwd.OsgiPropertyConstants.IGNORE_IPV4_MCAST_PACKETS_DEFAULT;
+import static org.onosproject.fwd.OsgiPropertyConstants.IPV6_FORWARDING;
+import static org.onosproject.fwd.OsgiPropertyConstants.IPV6_FORWARDING_DEFAULT;
+import static org.onosproject.fwd.OsgiPropertyConstants.MATCH_DST_MAC_ONLY;
+import static org.onosproject.fwd.OsgiPropertyConstants.MATCH_DST_MAC_ONLY_DEFAULT;
+import static org.onosproject.fwd.OsgiPropertyConstants.MATCH_ICMP_FIELDS;
+import static org.onosproject.fwd.OsgiPropertyConstants.MATCH_ICMP_FIELDS_DEFAULT;
+import static org.onosproject.fwd.OsgiPropertyConstants.MATCH_IPV4_ADDRESS;
+import static org.onosproject.fwd.OsgiPropertyConstants.MATCH_IPV4_ADDRESS_DEFAULT;
+import static org.onosproject.fwd.OsgiPropertyConstants.MATCH_IPV4_DSCP;
+import static org.onosproject.fwd.OsgiPropertyConstants.MATCH_IPV4_DSCP_DEFAULT;
+import static org.onosproject.fwd.OsgiPropertyConstants.MATCH_IPV6_ADDRESS;
+import static org.onosproject.fwd.OsgiPropertyConstants.MATCH_IPV6_ADDRESS_DEFAULT;
+import static org.onosproject.fwd.OsgiPropertyConstants.MATCH_IPV6_FLOW_LABEL;
+import static org.onosproject.fwd.OsgiPropertyConstants.MATCH_IPV6_FLOW_LABEL_DEFAULT;
+import static org.onosproject.fwd.OsgiPropertyConstants.MATCH_TCP_UDP_PORTS;
+import static org.onosproject.fwd.OsgiPropertyConstants.MATCH_TCP_UDP_PORTS_DEFAULT;
+import static org.onosproject.fwd.OsgiPropertyConstants.MATCH_VLAN_ID;
+import static org.onosproject.fwd.OsgiPropertyConstants.MATCH_VLAN_ID_DEFAULT;
+import static org.onosproject.fwd.OsgiPropertyConstants.PACKET_OUT_OFPP_TABLE;
+import static org.onosproject.fwd.OsgiPropertyConstants.PACKET_OUT_OFPP_TABLE_DEFAULT;
+import static org.onosproject.fwd.OsgiPropertyConstants.PACKET_OUT_ONLY;
+import static org.onosproject.fwd.OsgiPropertyConstants.PACKET_OUT_ONLY_DEFAULT;
+import static org.onosproject.fwd.OsgiPropertyConstants.RECORD_METRICS;
+import static org.onosproject.fwd.OsgiPropertyConstants.RECORD_METRICS_DEFAULT;
 import static org.slf4j.LoggerFactory.getLogger;
 
 /**
  * Sample reactive forwarding application.
  */
-@Component(immediate = true)
-@Service(value = ReactiveForwarding.class)
+@Component(
+    immediate = true,
+    service = ReactiveForwarding.class,
+    property = {
+        PACKET_OUT_ONLY + ":Boolean=" + PACKET_OUT_ONLY_DEFAULT,
+        PACKET_OUT_OFPP_TABLE + ":Boolean=" + PACKET_OUT_OFPP_TABLE_DEFAULT,
+        FLOW_TIMEOUT + ":Integer=" + FLOW_TIMEOUT_DEFAULT,
+        FLOW_PRIORITY  + ":Integer=" + FLOW_PRIORITY_DEFAULT,
+        IPV6_FORWARDING + ":Boolean=" + IPV6_FORWARDING_DEFAULT,
+        MATCH_DST_MAC_ONLY + ":Boolean=" + MATCH_DST_MAC_ONLY_DEFAULT,
+        MATCH_VLAN_ID + ":Boolean=" + MATCH_VLAN_ID_DEFAULT,
+        MATCH_IPV4_ADDRESS + ":Boolean=" + MATCH_IPV4_ADDRESS_DEFAULT,
+        MATCH_IPV4_DSCP + ":Boolean=" + MATCH_IPV4_DSCP_DEFAULT,
+        MATCH_IPV6_ADDRESS + ":Boolean=" + MATCH_IPV6_ADDRESS_DEFAULT,
+        MATCH_IPV6_FLOW_LABEL + ":Boolean=" + MATCH_IPV6_FLOW_LABEL_DEFAULT,
+        MATCH_TCP_UDP_PORTS + ":Boolean=" + MATCH_TCP_UDP_PORTS_DEFAULT,
+        MATCH_ICMP_FIELDS + ":Boolean=" + MATCH_ICMP_FIELDS_DEFAULT,
+        IGNORE_IPV4_MCAST_PACKETS + ":Boolean=" + IGNORE_IPV4_MCAST_PACKETS_DEFAULT,
+        RECORD_METRICS + ":Boolean=" + RECORD_METRICS_DEFAULT
+    }
+)
 public class ReactiveForwarding {
 
-    private static final int DEFAULT_TIMEOUT = 10;
-    private static final int DEFAULT_PRIORITY = 10;
-
     private final Logger log = getLogger(getClass());
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected TopologyService topologyService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected PacketService packetService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected HostService hostService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected FlowRuleService flowRuleService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected FlowObjectiveService flowObjectiveService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected CoreService coreService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected ComponentConfigService cfgService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected StorageService storageService;
 
     private ReactivePacketProcessor processor = new ReactivePacketProcessor();
@@ -135,70 +179,50 @@
 
     private ApplicationId appId;
 
-    @Property(name = "packetOutOnly", boolValue = false,
-            label = "Enable packet-out only forwarding; default is false")
-    private boolean packetOutOnly = false;
+    /** Enable packet-out only forwarding; default is false. */
+    private boolean packetOutOnly = PACKET_OUT_ONLY_DEFAULT;
 
-    @Property(name = "packetOutOfppTable", boolValue = false,
-            label = "Enable first packet forwarding using OFPP_TABLE port " +
-                    "instead of PacketOut with actual port; default is false")
-    private boolean packetOutOfppTable = false;
+    /** Enable first packet forwarding using OFPP_TABLE port instead of PacketOut with actual port; default is false. */
+    private boolean packetOutOfppTable = PACKET_OUT_OFPP_TABLE_DEFAULT;
 
-    @Property(name = "flowTimeout", intValue = DEFAULT_TIMEOUT,
-            label = "Configure Flow Timeout for installed flow rules; " +
-                    "default is 10 sec")
-    private int flowTimeout = DEFAULT_TIMEOUT;
+    /** Configure Flow Timeout for installed flow rules; default is 10 sec. */
+    private int flowTimeout = FLOW_TIMEOUT_DEFAULT;
 
-    @Property(name = "flowPriority", intValue = DEFAULT_PRIORITY,
-            label = "Configure Flow Priority for installed flow rules; " +
-                    "default is 10")
-    private int flowPriority = DEFAULT_PRIORITY;
+    /** Configure Flow Priority for installed flow rules; default is 10. */
+    private int flowPriority = FLOW_PRIORITY_DEFAULT;
 
-    @Property(name = "ipv6Forwarding", boolValue = false,
-            label = "Enable IPv6 forwarding; default is false")
-    private boolean ipv6Forwarding = false;
+    /** Enable IPv6 forwarding; default is false. */
+    private boolean ipv6Forwarding = IPV6_FORWARDING_DEFAULT;
 
-    @Property(name = "matchDstMacOnly", boolValue = false,
-            label = "Enable matching Dst Mac Only; default is false")
-    private boolean matchDstMacOnly = false;
+    /** Enable matching Dst Mac Only; default is false. */
+    private boolean matchDstMacOnly = MATCH_DST_MAC_ONLY_DEFAULT;
 
-    @Property(name = "matchVlanId", boolValue = false,
-            label = "Enable matching Vlan ID; default is false")
-    private boolean matchVlanId = false;
+    /** Enable matching Vlan ID; default is false. */
+    private boolean matchVlanId = MATCH_VLAN_ID_DEFAULT;
 
-    @Property(name = "matchIpv4Address", boolValue = false,
-            label = "Enable matching IPv4 Addresses; default is false")
-    private boolean matchIpv4Address = false;
+    /** Enable matching IPv4 Addresses; default is false. */
+    private boolean matchIpv4Address = MATCH_IPV4_ADDRESS_DEFAULT;
 
-    @Property(name = "matchIpv4Dscp", boolValue = false,
-            label = "Enable matching IPv4 DSCP and ECN; default is false")
-    private boolean matchIpv4Dscp = false;
+    /** Enable matching IPv4 DSCP and ECN; default is false. */
+    private boolean matchIpv4Dscp = MATCH_IPV4_DSCP_DEFAULT;
 
-    @Property(name = "matchIpv6Address", boolValue = false,
-            label = "Enable matching IPv6 Addresses; default is false")
-    private boolean matchIpv6Address = false;
+    /** Enable matching IPv6 Addresses; default is false. */
+    private boolean matchIpv6Address = MATCH_IPV6_ADDRESS_DEFAULT;
 
-    @Property(name = "matchIpv6FlowLabel", boolValue = false,
-            label = "Enable matching IPv6 FlowLabel; default is false")
-    private boolean matchIpv6FlowLabel = false;
+    /** Enable matching IPv6 FlowLabel; default is false. */
+    private boolean matchIpv6FlowLabel = MATCH_IPV6_FLOW_LABEL_DEFAULT;
 
-    @Property(name = "matchTcpUdpPorts", boolValue = false,
-            label = "Enable matching TCP/UDP ports; default is false")
-    private boolean matchTcpUdpPorts = false;
+    /** Enable matching TCP/UDP ports; default is false. */
+    private boolean matchTcpUdpPorts = MATCH_TCP_UDP_PORTS_DEFAULT;
 
-    @Property(name = "matchIcmpFields", boolValue = false,
-            label = "Enable matching ICMPv4 and ICMPv6 fields; " +
-                    "default is false")
-    private boolean matchIcmpFields = false;
+    /** Enable matching ICMPv4 and ICMPv6 fields; default is false. */
+    private boolean matchIcmpFields = MATCH_ICMP_FIELDS_DEFAULT;
 
+    /** Ignore (do not forward) IPv4 multicast packets; default is false. */
+    private boolean ignoreIpv4McastPackets = IGNORE_IPV4_MCAST_PACKETS_DEFAULT;
 
-    @Property(name = "ignoreIPv4Multicast", boolValue = false,
-            label = "Ignore (do not forward) IPv4 multicast packets; default is false")
-    private boolean ignoreIpv4McastPackets = false;
-
-    @Property(name = "recordMetrics", boolValue = false,
-            label = "Enable record metrics for reactive forwarding")
-    private boolean recordMetrics = false;
+    /** Enable record metrics for reactive forwarding. */
+    private boolean recordMetrics = RECORD_METRICS_DEFAULT;
 
     private final TopologyListener topologyListener = new InternalTopologyListener();
 
@@ -288,7 +312,7 @@
         Dictionary<?, ?> properties = context.getProperties();
 
         Boolean packetOutOnlyEnabled =
-                Tools.isPropertyEnabled(properties, "packetOutOnly");
+                Tools.isPropertyEnabled(properties, PACKET_OUT_ONLY);
         if (packetOutOnlyEnabled == null) {
             log.info("Packet-out is not configured, " +
                      "using current value of {}", packetOutOnly);
@@ -299,7 +323,7 @@
         }
 
         Boolean packetOutOfppTableEnabled =
-                Tools.isPropertyEnabled(properties, "packetOutOfppTable");
+                Tools.isPropertyEnabled(properties, PACKET_OUT_OFPP_TABLE);
         if (packetOutOfppTableEnabled == null) {
             log.info("OFPP_TABLE port is not configured, " +
                      "using current value of {}", packetOutOfppTable);
@@ -310,7 +334,7 @@
         }
 
         Boolean ipv6ForwardingEnabled =
-                Tools.isPropertyEnabled(properties, "ipv6Forwarding");
+                Tools.isPropertyEnabled(properties, IPV6_FORWARDING);
         if (ipv6ForwardingEnabled == null) {
             log.info("IPv6 forwarding is not configured, " +
                      "using current value of {}", ipv6Forwarding);
@@ -321,7 +345,7 @@
         }
 
         Boolean matchDstMacOnlyEnabled =
-                Tools.isPropertyEnabled(properties, "matchDstMacOnly");
+                Tools.isPropertyEnabled(properties, MATCH_DST_MAC_ONLY);
         if (matchDstMacOnlyEnabled == null) {
             log.info("Match Dst MAC is not configured, " +
                      "using current value of {}", matchDstMacOnly);
@@ -332,7 +356,7 @@
         }
 
         Boolean matchVlanIdEnabled =
-                Tools.isPropertyEnabled(properties, "matchVlanId");
+                Tools.isPropertyEnabled(properties, MATCH_VLAN_ID);
         if (matchVlanIdEnabled == null) {
             log.info("Matching Vlan ID is not configured, " +
                      "using current value of {}", matchVlanId);
@@ -343,7 +367,7 @@
         }
 
         Boolean matchIpv4AddressEnabled =
-                Tools.isPropertyEnabled(properties, "matchIpv4Address");
+                Tools.isPropertyEnabled(properties, MATCH_IPV4_ADDRESS);
         if (matchIpv4AddressEnabled == null) {
             log.info("Matching IPv4 Address is not configured, " +
                      "using current value of {}", matchIpv4Address);
@@ -354,7 +378,7 @@
         }
 
         Boolean matchIpv4DscpEnabled =
-                Tools.isPropertyEnabled(properties, "matchIpv4Dscp");
+                Tools.isPropertyEnabled(properties, MATCH_IPV4_DSCP);
         if (matchIpv4DscpEnabled == null) {
             log.info("Matching IPv4 DSCP and ECN is not configured, " +
                      "using current value of {}", matchIpv4Dscp);
@@ -365,7 +389,7 @@
         }
 
         Boolean matchIpv6AddressEnabled =
-                Tools.isPropertyEnabled(properties, "matchIpv6Address");
+                Tools.isPropertyEnabled(properties, MATCH_IPV6_ADDRESS);
         if (matchIpv6AddressEnabled == null) {
             log.info("Matching IPv6 Address is not configured, " +
                      "using current value of {}", matchIpv6Address);
@@ -376,7 +400,7 @@
         }
 
         Boolean matchIpv6FlowLabelEnabled =
-                Tools.isPropertyEnabled(properties, "matchIpv6FlowLabel");
+                Tools.isPropertyEnabled(properties, MATCH_IPV6_FLOW_LABEL);
         if (matchIpv6FlowLabelEnabled == null) {
             log.info("Matching IPv6 FlowLabel is not configured, " +
                      "using current value of {}", matchIpv6FlowLabel);
@@ -387,7 +411,7 @@
         }
 
         Boolean matchTcpUdpPortsEnabled =
-                Tools.isPropertyEnabled(properties, "matchTcpUdpPorts");
+                Tools.isPropertyEnabled(properties, MATCH_TCP_UDP_PORTS);
         if (matchTcpUdpPortsEnabled == null) {
             log.info("Matching TCP/UDP fields is not configured, " +
                      "using current value of {}", matchTcpUdpPorts);
@@ -398,7 +422,7 @@
         }
 
         Boolean matchIcmpFieldsEnabled =
-                Tools.isPropertyEnabled(properties, "matchIcmpFields");
+                Tools.isPropertyEnabled(properties, MATCH_ICMP_FIELDS);
         if (matchIcmpFieldsEnabled == null) {
             log.info("Matching ICMP (v4 and v6) fields is not configured, " +
                      "using current value of {}", matchIcmpFields);
@@ -409,7 +433,7 @@
         }
 
         Boolean ignoreIpv4McastPacketsEnabled =
-                Tools.isPropertyEnabled(properties, "ignoreIpv4McastPackets");
+                Tools.isPropertyEnabled(properties, IGNORE_IPV4_MCAST_PACKETS);
         if (ignoreIpv4McastPacketsEnabled == null) {
             log.info("Ignore IPv4 multi-cast packet is not configured, " +
                      "using current value of {}", ignoreIpv4McastPackets);
@@ -419,7 +443,7 @@
                     ignoreIpv4McastPackets ? "enabled" : "disabled");
         }
         Boolean recordMetricsEnabled =
-                Tools.isPropertyEnabled(properties, "recordMetrics");
+                Tools.isPropertyEnabled(properties, RECORD_METRICS);
         if (recordMetricsEnabled == null) {
             log.info("IConfigured. Ignore record metrics  is {} ," +
                     "using current value of {}", recordMetrics);
@@ -429,10 +453,10 @@
                     recordMetrics ? "enabled" : "disabled");
         }
 
-        flowTimeout = Tools.getIntegerProperty(properties, "flowTimeout", DEFAULT_TIMEOUT);
+        flowTimeout = Tools.getIntegerProperty(properties, FLOW_TIMEOUT, FLOW_TIMEOUT_DEFAULT);
         log.info("Configured. Flow Timeout is configured to {} seconds", flowTimeout);
 
-        flowPriority = Tools.getIntegerProperty(properties, "flowPriority", DEFAULT_PRIORITY);
+        flowPriority = Tools.getIntegerProperty(properties, FLOW_PRIORITY, FLOW_PRIORITY_DEFAULT);
         log.info("Configured. Flow Priority is configured to {}", flowPriority);
     }
 
diff --git a/apps/fwd/src/main/java/org/onosproject/fwd/ReactiveForwardingCommand.java b/apps/fwd/src/main/java/org/onosproject/fwd/ReactiveForwardingCommand.java
index 3f4e0c0..0355b64 100644
--- a/apps/fwd/src/main/java/org/onosproject/fwd/ReactiveForwardingCommand.java
+++ b/apps/fwd/src/main/java/org/onosproject/fwd/ReactiveForwardingCommand.java
@@ -14,22 +14,26 @@
  * limitations under the License.
  */
 package org.onosproject.fwd;
-import org.apache.karaf.shell.commands.Command;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.Completion;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.cli.AbstractShellCommand;
-import org.apache.karaf.shell.commands.Argument;
+import org.apache.karaf.shell.api.action.Argument;
 import org.onlab.packet.MacAddress;
 
 /**
  * Sample reactive forwarding application.
  */
+@Service
 @Command(scope = "onos", name = "reactive-fwd-metrics",
         description = "List all the metrics of reactive fwd app based on mac address")
 public class ReactiveForwardingCommand extends AbstractShellCommand {
     @Argument(index = 0, name = "mac", description = "One Mac Address",
             required = false, multiValued = false)
+    @Completion(MacAddressCompleter.class)
     String mac = null;
     @Override
-    protected void execute() {
+    protected void doExecute() {
         ReactiveForwarding reactiveForwardingService = AbstractShellCommand.get(ReactiveForwarding.class);
         MacAddress macAddress = null;
         if (mac != null) {
diff --git a/apps/fwd/src/main/resources/OSGI-INF/blueprint/shell-config.xml b/apps/fwd/src/main/resources/OSGI-INF/blueprint/shell-config.xml
deleted file mode 100644
index 482b04b..0000000
--- a/apps/fwd/src/main/resources/OSGI-INF/blueprint/shell-config.xml
+++ /dev/null
@@ -1,27 +0,0 @@
-<!--
-+  ~ Copyright 2017-present Open Networking Foundation
-+  ~
-+  ~ Licensed under the Apache License, Version 2.0 (the "License");
-+  ~ you may not use this file except in compliance with the License.
-+  ~ You may obtain a copy of the License at
-+  ~
-+  ~     http://www.apache.org/licenses/LICENSE-2.0
-+  ~
-+  ~ Unless required by applicable law or agreed to in writing, software
-+  ~ distributed under the License is distributed on an "AS IS" BASIS,
-+  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+  ~ See the License for the specific language governing permissions and
-+  ~ limitations under the License.
-+  -->
-<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0">
-    <command-bundle xmlns="http://karaf.apache.org/xmlns/shell/v1.1.0">
-        <command>
-            <action class="org.onosproject.fwd.ReactiveForwardingCommand"/>
-            <completers>
-            <ref component-id="MacAddressCompleter"/>
-            </completers>
-        </command>
-    </command-bundle>
-    <bean id="MacAddressCompleter" class="org.onosproject.fwd.MacAddressCompleter"/>
-</blueprint>
-
diff --git a/apps/gangliametrics/BUCK b/apps/gangliametrics/BUCK
deleted file mode 100644
index 3dc67f4..0000000
--- a/apps/gangliametrics/BUCK
+++ /dev/null
@@ -1,25 +0,0 @@
-COMPILE_DEPS = [
-    '//lib:CORE_DEPS',
-    '//lib:METRICS',
-    '//lib:gmetric4j',
-    '//lib:metrics-ganglia',
-    '//lib:remotetea-oncrpc',
-]
-
-EXCLUDED_BUNDLES = [
-    '//lib:gmetric4j',
-    '//lib:metrics-ganglia',
-    '//lib:remotetea-oncrpc',
-]
-
-osgi_jar_with_tests (
-    deps = COMPILE_DEPS,
-)
-
-onos_app (
-    title = 'Ganglia Report and Query',
-    category = 'Monitoring',
-    url = 'http://onosproject.org',
-    description = 'Performance metric service reporter',
-    excluded_bundles = EXCLUDED_BUNDLES,
-)
diff --git a/apps/gangliametrics/features.xml b/apps/gangliametrics/features.xml
deleted file mode 100644
index 07a5d42..0000000
--- a/apps/gangliametrics/features.xml
+++ /dev/null
@@ -1,27 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
-<!--
-  ~ Copyright 2016-present Open Networking Foundation
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~     http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License.
-  -->
-<features xmlns="http://karaf.apache.org/xmlns/features/v1.2.0" name="${project.artifactId}-${project.version}">
-    <feature name="${project.artifactId}" version="${project.version}"
-             description="${project.description}">
-        <feature>onos-api</feature>
-        <bundle>mvn:${project.groupId}/onos-apps-gangliametrics/${project.version}</bundle>
-        <bundle>mvn:io.dropwizard.metrics/metrics-core/3.1.2</bundle>
-        <bundle>mvn:io.dropwizard.metrics/metrics-ganglia/3.1.2</bundle>
-        <bundle>mvn:info.ganglia.gmetric4j/gmetric4j/1.0.10</bundle>
-        <bundle>mvn:org.acplt.remotetea/remotetea-oncrpc/1.1.3</bundle>
-    </feature>
-</features>
diff --git a/apps/gangliametrics/src/main/java/org/onosproject/gangliametrics/DefaultGangliaMetricsReporter.java b/apps/gangliametrics/src/main/java/org/onosproject/gangliametrics/DefaultGangliaMetricsReporter.java
index b3c7dfc..f74133e 100644
--- a/apps/gangliametrics/src/main/java/org/onosproject/gangliametrics/DefaultGangliaMetricsReporter.java
+++ b/apps/gangliametrics/src/main/java/org/onosproject/gangliametrics/DefaultGangliaMetricsReporter.java
@@ -19,30 +19,48 @@
 import com.codahale.metrics.ganglia.GangliaReporter;
 import info.ganglia.gmetric4j.gmetric.GMetric;
 import org.apache.commons.lang.StringUtils;
-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.onlab.metrics.MetricsService;
 import org.onlab.util.Tools;
 import org.onosproject.cfg.ComponentConfigService;
 import org.onosproject.core.CoreService;
 import org.osgi.service.component.ComponentContext;
+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.io.IOException;
 import java.util.Dictionary;
 import java.util.concurrent.TimeUnit;
 
+import static org.onosproject.gangliametrics.OsgiPropertyConstants.ADDRESS;
+import static org.onosproject.gangliametrics.OsgiPropertyConstants.ADDRESS_DEFAULT;
+import static org.onosproject.gangliametrics.OsgiPropertyConstants.METRIC_NAMES;
+import static org.onosproject.gangliametrics.OsgiPropertyConstants.METRIC_NAMES_DEFAULT;
+import static org.onosproject.gangliametrics.OsgiPropertyConstants.MONITOR_ALL;
+import static org.onosproject.gangliametrics.OsgiPropertyConstants.MONITOR_ALL_DEFAULT;
+import static org.onosproject.gangliametrics.OsgiPropertyConstants.PORT;
+import static org.onosproject.gangliametrics.OsgiPropertyConstants.PORT_DEFAULT;
+import static org.onosproject.gangliametrics.OsgiPropertyConstants.TTL;
+import static org.onosproject.gangliametrics.OsgiPropertyConstants.TTL_DEFAULT;
 import static org.slf4j.LoggerFactory.getLogger;
 
 /**
  * A metric report that reports all metrics value to ganglia monitoring server.
  */
-@Component(immediate = true)
+@Component(
+    immediate = true,
+    property = {
+        MONITOR_ALL + ":Boolean=" + MONITOR_ALL_DEFAULT,
+        METRIC_NAMES + "=" + METRIC_NAMES_DEFAULT,
+        ADDRESS + "=" + ADDRESS_DEFAULT,
+        PORT + ":Integer=" + PORT_DEFAULT,
+        TTL + ":Integer=" + TTL_DEFAULT
+    }
+)
 public class DefaultGangliaMetricsReporter implements GangliaMetricsReporter {
     private final Logger log = getLogger(getClass());
 
@@ -52,39 +70,29 @@
     private static final int REPORT_PERIOD = 1;
     private static final TimeUnit REPORT_TIME_UNIT = TimeUnit.MINUTES;
 
-    private static final String DEFAULT_ADDRESS = "localhost";
-    private static final int DEFAULT_PORT = 8649;
-    private static final int DEFAULT_TTL = 1;
-    private static final String DEFAULT_METRIC_NAMES = "default";
-
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected CoreService coreService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected MetricsService metricsService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected ComponentConfigService cfgService;
 
-    @Property(name = "monitorAll", boolValue = true,
-              label = "Enable to monitor all of metrics stored in metric registry default is true")
-    protected boolean monitorAll = true;
+    /** Enable to monitor all of metrics stored in metric registry default is true. */
+    protected boolean monitorAll = MONITOR_ALL_DEFAULT;
 
-    @Property(name = "metricNames", value = DEFAULT_METRIC_NAMES,
-              label = "Names of metric to be monitored; default metric names are 'default'")
-    protected String metricNames = DEFAULT_METRIC_NAMES;
+    /** Names of metric to be monitored; default metric names are 'default'. */
+    protected String metricNames = METRIC_NAMES_DEFAULT;
 
-    @Property(name = "address", value = DEFAULT_ADDRESS,
-              label = "IP address of ganglia monitoring server; default is localhost")
-    protected String address = DEFAULT_ADDRESS;
+    /** IP address of ganglia monitoring server; default is localhost. */
+    protected String address = ADDRESS_DEFAULT;
 
-    @Property(name = "port", intValue = DEFAULT_PORT,
-              label = "Port number of ganglia monitoring server; default is 8649")
-    protected int port = DEFAULT_PORT;
+    /** Port number of ganglia monitoring server; default is 8649. */
+    protected int port = PORT_DEFAULT;
 
-    @Property(name = "ttl", intValue = DEFAULT_TTL,
-              label = "TTL value of ganglia monitoring server; default is 1")
-    protected int ttl = DEFAULT_TTL;
+    /** TTL value of ganglia monitoring server; default is 1. */
+    protected int ttl = TTL_DEFAULT;
 
     private GMetric ganglia;
     private GangliaReporter gangliaReporter;
@@ -202,33 +210,33 @@
     private void readComponentConfiguration(ComponentContext context) {
         Dictionary<?, ?> properties = context.getProperties();
 
-        String addressStr = Tools.get(properties, "address");
-        address = addressStr != null ? addressStr : DEFAULT_ADDRESS;
+        String addressStr = Tools.get(properties, ADDRESS);
+        address = addressStr != null ? addressStr : ADDRESS_DEFAULT;
         log.info("Configured. Ganglia server address is {}", address);
 
-        String metricNameStr = Tools.get(properties, "metricNames");
-        metricNames = metricNameStr != null ? metricNameStr : DEFAULT_METRIC_NAMES;
+        String metricNameStr = Tools.get(properties, METRIC_NAMES);
+        metricNames = metricNameStr != null ? metricNameStr : METRIC_NAMES_DEFAULT;
         log.info("Configured. Metric name is {}", metricNames);
 
-        Integer portConfigured = Tools.getIntegerProperty(properties, "port");
+        Integer portConfigured = Tools.getIntegerProperty(properties, PORT);
         if (portConfigured == null) {
-            port = DEFAULT_PORT;
+            port = PORT_DEFAULT;
             log.info("Ganglia port is not configured, default value is {}", port);
         } else {
             port = portConfigured;
             log.info("Configured. Ganglia port is configured to {}", port);
         }
 
-        Integer ttlConfigured = Tools.getIntegerProperty(properties, "ttl");
+        Integer ttlConfigured = Tools.getIntegerProperty(properties, TTL);
         if (ttlConfigured == null) {
-            ttl = DEFAULT_TTL;
+            ttl = TTL_DEFAULT;
             log.info("Ganglia TTL is not configured, default value is {}", ttl);
         } else {
             ttl = ttlConfigured;
             log.info("Configured. Ganglia TTL is configured to {}", ttl);
         }
 
-        Boolean monitorAllEnabled = Tools.isPropertyEnabled(properties, "monitorAll");
+        Boolean monitorAllEnabled = Tools.isPropertyEnabled(properties, MONITOR_ALL);
         if (monitorAllEnabled == null) {
             log.info("Monitor all metrics is not configured, " +
                      "using current value of {}", monitorAll);
diff --git a/apps/gangliametrics/src/main/java/org/onosproject/gangliametrics/OsgiPropertyConstants.java b/apps/gangliametrics/src/main/java/org/onosproject/gangliametrics/OsgiPropertyConstants.java
new file mode 100644
index 0000000..0a349ab
--- /dev/null
+++ b/apps/gangliametrics/src/main/java/org/onosproject/gangliametrics/OsgiPropertyConstants.java
@@ -0,0 +1,37 @@
+/*
+ * Copyright 2018-present Open Networking Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.onosproject.gangliametrics;
+
+public final class OsgiPropertyConstants {
+    private OsgiPropertyConstants() {
+    }
+
+    static final String MONITOR_ALL = "monitorAll";
+    static final boolean MONITOR_ALL_DEFAULT = true;
+
+    static final String METRIC_NAMES = "metricNames";
+    static final String METRIC_NAMES_DEFAULT = "default";
+
+    static final String ADDRESS = "address";
+    static final String ADDRESS_DEFAULT = "localhost";
+
+    static final String PORT = "port";
+    static final int PORT_DEFAULT = 8649;
+
+    static final String TTL = "ttl";
+    static final int TTL_DEFAULT = 1;
+}
diff --git a/apps/gluon/BUCK b/apps/gluon/BUCK
deleted file mode 100644
index a11d2b6..0000000
--- a/apps/gluon/BUCK
+++ /dev/null
@@ -1,37 +0,0 @@
-COMPILE_DEPS = [
-    '//lib:CORE_DEPS',
-    '//lib:JACKSON',
-    '//cli:onos-cli',
-    '//lib:httpclient-osgi',
-    '//lib:httpcore-osgi',
-    '//lib:org.apache.httpcomponents.httpasyncclient-osgi',
-    '//lib:org.apache.httpcomponents.httpcore-nio',
-    '//lib:org.apache.karaf.shell.console',
-    '//lib:org.apache.karaf.jaas',
-
-]
-TEST_DEPS = [
-  '//lib:TEST',
-]
-
-BUNDLES = [
-  ':onos-apps-gluon',
-  '//lib:httpclient-osgi',
-  '//lib:httpcore-osgi',
-  '//lib:org.apache.httpcomponents.httpasyncclient-osgi',
-  '//lib:org.apache.httpcomponents.httpcore-nio',
-]
-
-osgi_jar_with_tests (
-    deps = COMPILE_DEPS,
-    test_deps = TEST_DEPS,
-)
-
-onos_app (
-    app_name = 'org.onosproject.gluon',
-    title = 'Gluon Shim',
-    category = 'Monitoring',
-    url = 'http://onosproject.org',
-    included_bundles = BUNDLES,
-    description = 'To fetch data from Gluon Server over Http session.',
-)
diff --git a/apps/gluon/BUILD b/apps/gluon/BUILD
index 183f9cb..4e4099f 100644
--- a/apps/gluon/BUILD
+++ b/apps/gluon/BUILD
@@ -15,6 +15,7 @@
 ]
 
 osgi_jar_with_tests(
+    karaf_command_packages = ["org.onosproject.gluon.rsc.cli"],
     deps = COMPILE_DEPS,
 )
 
diff --git a/apps/gluon/features.xml b/apps/gluon/features.xml
deleted file mode 100644
index ae6bf2b..0000000
--- a/apps/gluon/features.xml
+++ /dev/null
@@ -1,22 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
-<!--
-  ~ Copyright 2017-present Open Networking Foundation
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~     http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License.
-  -->
-<features xmlns="http://karaf.apache.org/xmlns/features/v1.2.0" name="${project.artifactId}-${project.version}">
-    <feature name="${project.artifactId}" version="${project.version}"
-             description="${project.description}">
-        <feature>onos-api</feature>
-    </feature>
-</features>
diff --git a/apps/gluon/src/main/java/org/onosproject/gluon/manager/GluonManager.java b/apps/gluon/src/main/java/org/onosproject/gluon/manager/GluonManager.java
index c0a4b67..1d8b32a 100644
--- a/apps/gluon/src/main/java/org/onosproject/gluon/manager/GluonManager.java
+++ b/apps/gluon/src/main/java/org/onosproject/gluon/manager/GluonManager.java
@@ -15,11 +15,11 @@
  */
 package org.onosproject.gluon.manager;
 
-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.onosproject.core.CoreService;
 import org.onosproject.gluon.rsc.GluonConfig;
 import org.onosproject.gluon.rsc.GluonServer;
@@ -41,10 +41,10 @@
     private final Logger log = LoggerFactory.getLogger(getClass());
     private static final String APP_ID = "org.onosproject.gluon";
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected CoreService coreService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected NetworkConfigRegistry configRegistry;
 
 
diff --git a/apps/gluon/src/main/java/org/onosproject/gluon/rsc/cli/GluonServerCommand.java b/apps/gluon/src/main/java/org/onosproject/gluon/rsc/cli/GluonServerCommand.java
index 6dec71f..e5fdab7 100644
--- a/apps/gluon/src/main/java/org/onosproject/gluon/rsc/cli/GluonServerCommand.java
+++ b/apps/gluon/src/main/java/org/onosproject/gluon/rsc/cli/GluonServerCommand.java
@@ -15,8 +15,9 @@
  */
 package org.onosproject.gluon.rsc.cli;
 
-import org.apache.karaf.shell.commands.Command;
-import org.apache.karaf.shell.commands.Option;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.Option;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.gluon.rsc.GluonServer;
 
@@ -46,6 +47,7 @@
 /**
  * To monitor Gluon etcd server.
  */
+@Service
 @Command(scope = "onos", name = "gluon",
         description = "Support for reading Gluon data via etcd client")
 public class GluonServerCommand extends AbstractShellCommand {
@@ -72,7 +74,7 @@
     public String version = null;
 
     @Override
-    public void execute() {
+    protected void doExecute() {
         try {
             if (ipAddress != null && isValidIP(ipAddress) && isValidPort(port)
                     && isValidMode(mode) && isValidProtonKey(protonKey)
diff --git a/apps/gluon/src/main/java/org/onosproject/gluon/rsc/cli/GluonServerListCommand.java b/apps/gluon/src/main/java/org/onosproject/gluon/rsc/cli/GluonServerListCommand.java
index 3ef4a43..a4df5ce 100644
--- a/apps/gluon/src/main/java/org/onosproject/gluon/rsc/cli/GluonServerListCommand.java
+++ b/apps/gluon/src/main/java/org/onosproject/gluon/rsc/cli/GluonServerListCommand.java
@@ -15,8 +15,9 @@
  */
 package org.onosproject.gluon.rsc.cli;
 
-import org.apache.karaf.shell.commands.Command;
-import org.apache.karaf.shell.commands.Option;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.Option;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.gluon.manager.GluonManager;
 import org.onosproject.gluon.rsc.GluonServer;
@@ -32,6 +33,7 @@
 /**
  * Supports for querying Gluon Servers list and statistics.
  */
+@Service
 @Command(scope = "onos", name = "gluon-server-list",
         description = "Gluon server list")
 public class GluonServerListCommand extends AbstractShellCommand {
@@ -54,7 +56,7 @@
 
 
     @Override
-    public void execute() {
+    protected void doExecute() {
         try {
             String serverUrl = GLUON_HTTP + ipAddress + ":" + port;
             if (ipAddress != null && checkServerPool(serverUrl)) {
diff --git a/apps/gluon/src/main/resources/OSGI-INF/blueprint/shell-config.xml b/apps/gluon/src/main/resources/OSGI-INF/blueprint/shell-config.xml
deleted file mode 100644
index 82809d2..0000000
--- a/apps/gluon/src/main/resources/OSGI-INF/blueprint/shell-config.xml
+++ /dev/null
@@ -1,27 +0,0 @@
-<!--
-  ~ Copyright 2017-present Open Networking Foundation
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~     http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License.
-  -->
-<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0">
-
-  <command-bundle xmlns="http://karaf.apache.org/xmlns/shell/v1.1.0">
-    <command>
-      <action class="org.onosproject.gluon.rsc.cli.GluonServerCommand"/>
-    </command>
-
-    <command>
-      <action class="org.onosproject.gluon.rsc.cli.GluonServerListCommand"/>
-    </command>
-  </command-bundle>
-</blueprint>
diff --git a/apps/graphitemetrics/BUCK b/apps/graphitemetrics/BUCK
deleted file mode 100644
index d8e4441..0000000
--- a/apps/graphitemetrics/BUCK
+++ /dev/null
@@ -1,29 +0,0 @@
-COMPILE_DEPS = [
-    '//lib:CORE_DEPS',
-    '//lib:METRICS',
-    '//lib:gmetric4j',
-    '//lib:metrics-graphite',
-]
-
-EXCLUDED_BUNDLES = [
-    '//lib:gmetric4j',
-    '//lib:metrics-graphite',
-]
-
-TEST_DEPS = [
-    '//lib:TEST',
-    '//core/api:onos-api-tests',
-]
-
-osgi_jar_with_tests (
-    deps = COMPILE_DEPS,
-    test_deps = TEST_DEPS,
-)
-
-onos_app (
-    title = 'Graphite Report and Query',
-    category = 'Monitoring',
-    url = 'http://onosproject.org',
-    description = 'Performance metric service reporter and retriever for graphite',
-    excluded_bundles = EXCLUDED_BUNDLES,
-)
diff --git a/apps/graphitemetrics/features.xml b/apps/graphitemetrics/features.xml
deleted file mode 100644
index 12a9934..0000000
--- a/apps/graphitemetrics/features.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
-<!--
-  ~ Copyright 2016-present Open Networking Foundation
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~     http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License.
-  -->
-<features xmlns="http://karaf.apache.org/xmlns/features/v1.2.0" name="${project.artifactId}-${project.version}">
-    <feature name="${project.artifactId}" version="${project.version}"
-             description="${project.description}">
-        <feature>onos-api</feature>
-        <bundle>mvn:${project.groupId}/onos-apps-graphitemetrics/${project.version}</bundle>
-        <bundle>mvn:io.dropwizard.metrics/metrics-core/3.2.2</bundle>
-        <bundle>mvn:io.dropwizard.metrics/metrics-graphite/3.2.2</bundle>
-    </feature>
-</features>
diff --git a/apps/graphitemetrics/src/main/java/org/onosproject/graphitemetrics/DefaultGraphiteMetricsReporter.java b/apps/graphitemetrics/src/main/java/org/onosproject/graphitemetrics/DefaultGraphiteMetricsReporter.java
index c4995a5..518c1ff 100644
--- a/apps/graphitemetrics/src/main/java/org/onosproject/graphitemetrics/DefaultGraphiteMetricsReporter.java
+++ b/apps/graphitemetrics/src/main/java/org/onosproject/graphitemetrics/DefaultGraphiteMetricsReporter.java
@@ -20,75 +20,83 @@
 import com.codahale.metrics.graphite.Graphite;
 import com.codahale.metrics.graphite.GraphiteReporter;
 import org.apache.commons.lang.StringUtils;
-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.onlab.metrics.MetricsService;
 import org.onlab.util.Tools;
 import org.onosproject.cfg.ComponentConfigService;
 import org.onosproject.core.CoreService;
 import org.osgi.service.component.ComponentContext;
+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.net.InetSocketAddress;
 import java.util.Dictionary;
 import java.util.concurrent.TimeUnit;
 
+import static org.onosproject.graphitemetrics.OsgiPropertyConstants.ADDRESS;
+import static org.onosproject.graphitemetrics.OsgiPropertyConstants.ADDRESS_DEFAULT;
+import static org.onosproject.graphitemetrics.OsgiPropertyConstants.METRIC_NAMES;
+import static org.onosproject.graphitemetrics.OsgiPropertyConstants.METRIC_NAMES_DEFAULT;
+import static org.onosproject.graphitemetrics.OsgiPropertyConstants.METRIC_NAME_PREFIX;
+import static org.onosproject.graphitemetrics.OsgiPropertyConstants.METRIC_NAME_PREFIX_DEFAULT;
+import static org.onosproject.graphitemetrics.OsgiPropertyConstants.MONITOR_ALL;
+import static org.onosproject.graphitemetrics.OsgiPropertyConstants.MONITOR_ALL_DEFAULT;
+import static org.onosproject.graphitemetrics.OsgiPropertyConstants.PORT;
+import static org.onosproject.graphitemetrics.OsgiPropertyConstants.PORT_DEFAULT;
+import static org.onosproject.graphitemetrics.OsgiPropertyConstants.REPORT_PERIOD;
+import static org.onosproject.graphitemetrics.OsgiPropertyConstants.REPORT_PERIOD_DEFAULT;
 import static org.slf4j.LoggerFactory.getLogger;
 
 /**
  * A metric report that reports all metrics value to graphite monitoring server.
  */
-@Component(immediate = true)
+@Component(
+    immediate = true,
+    property = {
+        MONITOR_ALL + ":Boolean=" + MONITOR_ALL_DEFAULT,
+        METRIC_NAMES + "=" + METRIC_NAMES_DEFAULT,
+        ADDRESS + "=" + ADDRESS_DEFAULT,
+        PORT + ":Integer=" + PORT_DEFAULT,
+        REPORT_PERIOD + ":Integer=" + REPORT_PERIOD_DEFAULT,
+        METRIC_NAME_PREFIX + "=" + METRIC_NAME_PREFIX_DEFAULT
+    }
+)
 public class DefaultGraphiteMetricsReporter implements GraphiteMetricsReporter {
 
     private final Logger log = getLogger(getClass());
 
     private static final TimeUnit REPORT_TIME_UNIT = TimeUnit.MINUTES;
-    private static final int DEFAULT_REPORT_PERIOD = 1;
 
-    private static final String DEFAULT_METRIC_NAMES = "default";
-    private static final String DEFAULT_ADDRESS = "localhost";
-    private static final int DEFAULT_PORT = 2003;
-    private static final String DEFAULT_METRIC_NAME_PREFIX = "onos";
-
-
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected CoreService coreService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected MetricsService metricsService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected ComponentConfigService cfgService;
 
-    @Property(name = "monitorAll", boolValue = true,
-            label = "Enable to monitor all of metrics stored in metric registry default is true")
-    protected boolean monitorAll = true;
+    /** Enable to monitor all of metrics stored in metric registry default is true. */
+    protected boolean monitorAll = MONITOR_ALL_DEFAULT;
 
-    @Property(name = "metricNames", value = DEFAULT_METRIC_NAMES,
-            label = "Names of metric to be monitored; default metric names are 'default'")
-    protected String metricNames = DEFAULT_METRIC_NAMES;
+    /** Names of metric to be monitored; default metric names are 'default'. */
+    protected String metricNames = METRIC_NAMES_DEFAULT;
 
-    @Property(name = "address", value = DEFAULT_ADDRESS,
-            label = "IP address of graphite monitoring server; default is localhost")
-    protected String address = DEFAULT_ADDRESS;
+    /** IP address of graphite monitoring server; default is localhost. */
+    protected String address = ADDRESS_DEFAULT;
 
-    @Property(name = "port", intValue = DEFAULT_PORT,
-            label = "Port number of graphite monitoring server; default is 2003")
-    protected int port = DEFAULT_PORT;
+    /** Port number of graphite monitoring server; default is 2003. */
+    protected int port = PORT_DEFAULT;
 
-    @Property(name = "reportPeriod", intValue = DEFAULT_REPORT_PERIOD,
-            label = "Reporting period of graphite monitoring server; default is 1")
-    protected int reportPeriod = DEFAULT_REPORT_PERIOD;
+    /** Reporting period of graphite monitoring server; default is 1. */
+    protected int reportPeriod = REPORT_PERIOD_DEFAULT;
 
-    @Property(name = "metricNamePrefix", value = DEFAULT_METRIC_NAME_PREFIX,
-            label = "Prefix of metric name for graphite back-end server; default is 'onos'")
-    protected String metricNamePrefix = DEFAULT_METRIC_NAME_PREFIX;
+    /** Prefix of metric name for graphite back-end server; default is 'onos'. */
+    protected String metricNamePrefix = METRIC_NAME_PREFIX_DEFAULT;
 
     private Graphite graphite;
     private GraphiteReporter graphiteReporter;
@@ -206,7 +214,7 @@
     private void readComponentConfiguration(ComponentContext context) {
         Dictionary<?, ?> properties = context.getProperties();
 
-        Boolean newMonitorAll = Tools.isPropertyEnabled(properties, "monitorAll");
+        Boolean newMonitorAll = Tools.isPropertyEnabled(properties, MONITOR_ALL);
         if (newMonitorAll == null) {
             log.info("Monitor all metrics is not configured, " +
                     "using current value of {}", monitorAll);
@@ -216,26 +224,26 @@
                     monitorAll ? "enabled" : "disabled");
         }
 
-        String newMetricNames = Tools.get(properties, "metricNames");
-        metricNames = newMetricNames != null ? newMetricNames : DEFAULT_METRIC_NAMES;
+        String newMetricNames = Tools.get(properties, METRIC_NAMES);
+        metricNames = newMetricNames != null ? newMetricNames : METRIC_NAMES_DEFAULT;
         log.info("Configured. Metric name is {}", metricNames);
 
-        String newAddress = Tools.get(properties, "address");
-        address = newAddress != null ? newAddress : DEFAULT_ADDRESS;
+        String newAddress = Tools.get(properties, ADDRESS);
+        address = newAddress != null ? newAddress : ADDRESS_DEFAULT;
         log.info("Configured. Graphite monitoring server address is {}", address);
 
-        Integer newPort = Tools.getIntegerProperty(properties, "port");
+        Integer newPort = Tools.getIntegerProperty(properties, PORT);
         if (newPort == null) {
-            port = DEFAULT_PORT;
+            port = PORT_DEFAULT;
             log.info("Graphite port is not configured, default value is {}", port);
         } else {
             port = newPort;
             log.info("Configured. Graphite port is configured to {}", port);
         }
 
-        Integer newReportPeriod = Tools.getIntegerProperty(properties, "reportPeriod");
+        Integer newReportPeriod = Tools.getIntegerProperty(properties, REPORT_PERIOD);
         if (newReportPeriod == null) {
-            reportPeriod = DEFAULT_REPORT_PERIOD;
+            reportPeriod = REPORT_PERIOD_DEFAULT;
             log.info("Report period of graphite server is not configured, " +
                     "default value is {}", reportPeriod);
         } else {
@@ -244,9 +252,9 @@
                     " is configured to {}", reportPeriod);
         }
 
-        String newMetricNamePrefix = Tools.get(properties, "metricNamePrefix");
+        String newMetricNamePrefix = Tools.get(properties, METRIC_NAME_PREFIX);
         metricNamePrefix = newMetricNamePrefix != null ?
-                newMetricNamePrefix : DEFAULT_METRIC_NAME_PREFIX;
+                newMetricNamePrefix : METRIC_NAME_PREFIX_DEFAULT;
 
     }
 
diff --git a/apps/graphitemetrics/src/main/java/org/onosproject/graphitemetrics/OsgiPropertyConstants.java b/apps/graphitemetrics/src/main/java/org/onosproject/graphitemetrics/OsgiPropertyConstants.java
new file mode 100644
index 0000000..89aecc0
--- /dev/null
+++ b/apps/graphitemetrics/src/main/java/org/onosproject/graphitemetrics/OsgiPropertyConstants.java
@@ -0,0 +1,40 @@
+/*
+ * Copyright 2018-present Open Networking Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.onosproject.graphitemetrics;
+
+public final class OsgiPropertyConstants {
+    private OsgiPropertyConstants() {
+    }
+
+    static final String MONITOR_ALL = "monitorAll";
+    static final boolean MONITOR_ALL_DEFAULT = true;
+
+    static final String METRIC_NAMES = "metricNames";
+    static final String METRIC_NAMES_DEFAULT = "default";
+
+    static final String ADDRESS = "address";
+    static final String ADDRESS_DEFAULT = "localhost";
+
+    static final String PORT = "port";
+    static final int PORT_DEFAULT = 2003;
+
+    static final String REPORT_PERIOD = "reportPeriod";
+    static final int REPORT_PERIOD_DEFAULT = 1;
+
+    static final String METRIC_NAME_PREFIX = "metricNamePrefix";
+    static final String METRIC_NAME_PREFIX_DEFAULT = "onos";
+}
diff --git a/apps/imr/BUCK b/apps/imr/BUCK
deleted file mode 100644
index ffd56b2..0000000
--- a/apps/imr/BUCK
+++ /dev/null
@@ -1,12 +0,0 @@
-BUNDLES = [
-    '//apps/imr/api:onos-apps-imr-api',
-    '//apps/imr/app:onos-apps-imr-app',
-]
-
-onos_app (
-    title = 'Intent Monitoring and Rerouting',
-    category = 'Traffic Engineering',
-    url = 'http://onosproject.org', # link alla wiki su wiki.onosproject.org
-    description = 'Intent Monitoring and Rerouting application.',
-    included_bundles = BUNDLES,
-)
diff --git a/apps/imr/api/BUCK b/apps/imr/api/BUCK
deleted file mode 100644
index a6a3885..0000000
--- a/apps/imr/api/BUCK
+++ /dev/null
@@ -1,22 +0,0 @@
-COMPILE_DEPS = [
-    '//lib:CORE_DEPS',
-    '//lib:JACKSON',
-    '//lib:javax.ws.rs-api',
-    '//utils/rest:onlab-rest',
-    '//lib:jersey-server',
-    '//core/store/serializers:onos-core-serializers',
-    '//apps/imr/app:onos-apps-imr-app',
-    '//cli:onos-cli',
-    '//lib:org.apache.karaf.shell.console',
-]
-
-
-osgi_jar_with_tests (
-    deps = COMPILE_DEPS,
-    web_context = '/onos/v1/imr',
-    api_title = 'IMR REST API',
-    api_version = '1.0',
-    api_description = 'REST API for IMR Application',
-    api_package = 'org.onosproject.imr.rest',
-)
-
diff --git a/apps/imr/api/BUILD b/apps/imr/api/BUILD
index a08f18c..990169b 100644
--- a/apps/imr/api/BUILD
+++ b/apps/imr/api/BUILD
@@ -8,6 +8,7 @@
     api_package = "org.onosproject.imr.rest",
     api_title = "IMR REST API",
     api_version = "1.0",
+    karaf_command_packages = ["org.onosproject.imr.cli"],
     web_context = "/onos/v1/imr",
     deps = COMPILE_DEPS,
 )
diff --git a/apps/imr/api/src/main/java/org/onosproject/imr/cli/ApplicationIdImrCompleter.java b/apps/imr/api/src/main/java/org/onosproject/imr/cli/ApplicationIdImrCompleter.java
index 010c133..154b95d 100644
--- a/apps/imr/api/src/main/java/org/onosproject/imr/cli/ApplicationIdImrCompleter.java
+++ b/apps/imr/api/src/main/java/org/onosproject/imr/cli/ApplicationIdImrCompleter.java
@@ -16,8 +16,11 @@
 
 package org.onosproject.imr.cli;
 
-import org.apache.karaf.shell.console.Completer;
-import org.apache.karaf.shell.console.completer.StringsCompleter;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
+import org.apache.karaf.shell.api.console.CommandLine;
+import org.apache.karaf.shell.api.console.Completer;
+import org.apache.karaf.shell.api.console.Session;
+import org.apache.karaf.shell.support.completers.StringsCompleter;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.net.intent.IntentService;
 
@@ -27,10 +30,11 @@
 /**
  * Application ID completer.
  */
+@Service
 public class ApplicationIdImrCompleter implements Completer {
 
     @Override
-    public int complete(String buffer, int cursor, List<String> candidates) {
+    public int complete(Session session, CommandLine commandLine, List<String> candidates) {
         // Delegate string completer
         StringsCompleter delegate = new StringsCompleter();
 
@@ -43,7 +47,7 @@
                                  strings.add(Short.toString(intent.appId().id())));
 
         // Now let the completer do the work for figuring out what to offer.
-        return delegate.complete(buffer, cursor, candidates);
+        return delegate.complete(session, commandLine, candidates);
     }
 
 }
\ No newline at end of file
diff --git a/apps/imr/api/src/main/java/org/onosproject/imr/cli/ApplicationNameImrCompleter.java b/apps/imr/api/src/main/java/org/onosproject/imr/cli/ApplicationNameImrCompleter.java
index d5f7bd4..56571c1 100644
--- a/apps/imr/api/src/main/java/org/onosproject/imr/cli/ApplicationNameImrCompleter.java
+++ b/apps/imr/api/src/main/java/org/onosproject/imr/cli/ApplicationNameImrCompleter.java
@@ -16,8 +16,11 @@
 
 package org.onosproject.imr.cli;
 
-import org.apache.karaf.shell.console.Completer;
-import org.apache.karaf.shell.console.completer.StringsCompleter;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
+import org.apache.karaf.shell.api.console.CommandLine;
+import org.apache.karaf.shell.api.console.Completer;
+import org.apache.karaf.shell.api.console.Session;
+import org.apache.karaf.shell.support.completers.StringsCompleter;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.net.intent.IntentService;
 
@@ -27,9 +30,10 @@
 /**
  * Application name completer.
  */
+@Service
 public class ApplicationNameImrCompleter implements Completer {
     @Override
-    public int complete(String buffer, int cursor, List<String> candidates) {
+    public int complete(Session session, CommandLine commandLine, List<String> candidates) {
         // Delegate string completer
         StringsCompleter delegate = new StringsCompleter();
 
@@ -42,7 +46,7 @@
                                  strings.add(intent.appId().name()));
 
         // Now let the completer do the work for figuring out what to offer.
-        return delegate.complete(buffer, cursor, candidates);
+        return delegate.complete(session, commandLine, candidates);
     }
 
 }
diff --git a/apps/imr/api/src/main/java/org/onosproject/imr/cli/IntentKeyImrCompleter.java b/apps/imr/api/src/main/java/org/onosproject/imr/cli/IntentKeyImrCompleter.java
index 8b5b150..29fd328 100644
--- a/apps/imr/api/src/main/java/org/onosproject/imr/cli/IntentKeyImrCompleter.java
+++ b/apps/imr/api/src/main/java/org/onosproject/imr/cli/IntentKeyImrCompleter.java
@@ -16,8 +16,11 @@
 
 package org.onosproject.imr.cli;
 
-import org.apache.karaf.shell.console.Completer;
-import org.apache.karaf.shell.console.completer.StringsCompleter;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
+import org.apache.karaf.shell.api.console.CommandLine;
+import org.apache.karaf.shell.api.console.Completer;
+import org.apache.karaf.shell.api.console.Session;
+import org.apache.karaf.shell.support.completers.StringsCompleter;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.net.intent.IntentService;
 import org.onosproject.net.intent.LinkCollectionIntent;
@@ -26,14 +29,14 @@
 import java.util.List;
 import java.util.SortedSet;
 
-
 /**
  * Intent Key completer for IMR cli command.
  */
+@Service
 public class IntentKeyImrCompleter implements Completer {
 
     @Override
-    public int complete(String buffer, int cursor, List<String> candidates) {
+    public int complete(Session session, CommandLine commandLine, List<String> candidates) {
         // Delegate string completer
         StringsCompleter delegate = new StringsCompleter();
 
@@ -48,7 +51,7 @@
         });
 
         // Now let the completer do the work for figuring out what to offer.
-        return delegate.complete(buffer, cursor, candidates);
+        return delegate.complete(session, commandLine, candidates);
     }
 
 }
diff --git a/apps/imr/api/src/main/java/org/onosproject/imr/cli/StartMonitorCommand.java b/apps/imr/api/src/main/java/org/onosproject/imr/cli/StartMonitorCommand.java
index dfba41c..d4acfca 100644
--- a/apps/imr/api/src/main/java/org/onosproject/imr/cli/StartMonitorCommand.java
+++ b/apps/imr/api/src/main/java/org/onosproject/imr/cli/StartMonitorCommand.java
@@ -16,9 +16,11 @@
 
 package org.onosproject.imr.cli;
 
-import org.apache.karaf.shell.commands.Argument;
-import org.apache.karaf.shell.commands.Command;
-import org.apache.karaf.shell.commands.Option;
+import org.apache.karaf.shell.api.action.Argument;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.Completion;
+import org.apache.karaf.shell.api.action.Option;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.core.DefaultApplicationId;
 import org.onosproject.imr.IntentMonitorAndRerouteService;
@@ -29,6 +31,7 @@
 /**
  * Starts monitoring of an intent submitting its key to the IMR service.
  */
+@Service
 @Command(scope = "imr", name = "startmon",
         description = "Submit an intent to the IMR application to start monitoring")
 public class StartMonitorCommand extends AbstractShellCommand {
@@ -40,23 +43,26 @@
     @Argument(index = 0, name = "applicationId",
             description = "Application ID that submitted the intent",
             required = true)
+    @Completion(ApplicationIdImrCompleter.class)
     private Short appId;
 
     @Argument(index = 1, name = "applicationName",
             description = "Application Name that submitted the intent",
             required = true)
+    @Completion(ApplicationNameImrCompleter.class)
     private String appName;
 
     @Argument(index = 2, name = "intentKey",
             description = "String representation of the key of the intent",
             required = false)
+    @Completion(IntentKeyImrCompleter.class)
     private String key;
 
     private IntentMonitorAndRerouteService imrService;
     private IntentService intentService;
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         imrService = get(IntentMonitorAndRerouteService.class);
         intentService = get(IntentService.class);
 
diff --git a/apps/imr/api/src/main/java/org/onosproject/imr/cli/StopMonitorCommand.java b/apps/imr/api/src/main/java/org/onosproject/imr/cli/StopMonitorCommand.java
index 933b4be..d71e507 100644
--- a/apps/imr/api/src/main/java/org/onosproject/imr/cli/StopMonitorCommand.java
+++ b/apps/imr/api/src/main/java/org/onosproject/imr/cli/StopMonitorCommand.java
@@ -16,9 +16,11 @@
 
 package org.onosproject.imr.cli;
 
-import org.apache.karaf.shell.commands.Argument;
-import org.apache.karaf.shell.commands.Command;
-import org.apache.karaf.shell.commands.Option;
+import org.apache.karaf.shell.api.action.Argument;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.Completion;
+import org.apache.karaf.shell.api.action.Option;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.core.DefaultApplicationId;
 import org.onosproject.imr.IntentMonitorAndRerouteService;
@@ -28,6 +30,7 @@
 /**
  * Stops monitoring of an intent by the IMR service.
  */
+@Service
 @Command(scope = "imr", name = "stopmon",
         description = "Stop monitoring and intent already submitted to the IMR")
 public class StopMonitorCommand extends AbstractShellCommand {
@@ -39,23 +42,26 @@
     @Argument(index = 0, name = "applicationId",
             description = "Application ID that submitted the intent",
             required = true)
+    @Completion(ApplicationIdImrCompleter.class)
     private Short appId = null;
 
     @Argument(index = 1, name = "applicationName",
             description = "Application Name that submitted the intent",
             required = true)
+    @Completion(ApplicationNameImrCompleter.class)
     private String appName = null;
 
     @Argument(index = 2, name = "intentKey",
             description = "String representation of the key of the intent",
             required = false)
+    @Completion(IntentKeyImrCompleter.class)
     private String key = null;
 
     private IntentMonitorAndRerouteService imrService;
     private IntentService intentService;
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         imrService = get(IntentMonitorAndRerouteService.class);
         intentService = get(IntentService.class);
 
diff --git a/apps/imr/api/src/main/resources/OSGI-INF/blueprint/shell-config.xml b/apps/imr/api/src/main/resources/OSGI-INF/blueprint/shell-config.xml
deleted file mode 100644
index fdddc88..0000000
--- a/apps/imr/api/src/main/resources/OSGI-INF/blueprint/shell-config.xml
+++ /dev/null
@@ -1,29 +0,0 @@
-<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0">
-
-    <command-bundle xmlns="http://karaf.apache.org/xmlns/shell/v1.1.0">
-
-        <command>
-            <action class="org.onosproject.imr.cli.StartMonitorCommand"/>
-            <completers>
-                <ref component-id="applicationIdCompleter"/>
-                <ref component-id="applicationNameCompleter"/>
-                <ref component-id="intentKeyImrCompleter"/>
-            </completers>
-        </command>
-
-        <command>
-            <action class="org.onosproject.imr.cli.StopMonitorCommand"/>
-            <completers>
-                <ref component-id="applicationIdCompleter"/>
-                <ref component-id="applicationNameCompleter"/>
-                <ref component-id="intentKeyImrCompleter"/>
-            </completers>
-        </command>
-
-    </command-bundle>
-
-    <bean id="applicationIdCompleter" class="org.onosproject.imr.cli.ApplicationIdImrCompleter"/>
-    <bean id="applicationNameCompleter" class="org.onosproject.imr.cli.ApplicationNameImrCompleter"/>
-    <bean id="intentKeyImrCompleter" class="org.onosproject.imr.cli.IntentKeyImrCompleter"/>
-
-</blueprint>
diff --git a/apps/imr/app/BUCK b/apps/imr/app/BUCK
deleted file mode 100644
index 4f39ad8..0000000
--- a/apps/imr/app/BUCK
+++ /dev/null
@@ -1,17 +0,0 @@
-COMPILE_DEPS = [
-    '//lib:CORE_DEPS',
-    '//core/store/dist:onos-core-dist',
-    '//core/store/serializers:onos-core-serializers',
-    '//incubator/api:onos-incubator-api',
-    '//lib:KRYO',
-    '//lib:JACKSON',
-]
-
-TEST_DEPS = [
-    '//lib:TEST_ADAPTERS',
-]
-
-osgi_jar_with_tests (
-    deps = COMPILE_DEPS,
-    test_deps = TEST_DEPS,
-)
diff --git a/apps/imr/app/src/main/java/org/onosproject/imr/IntentMonitorAndRerouteManager.java b/apps/imr/app/src/main/java/org/onosproject/imr/IntentMonitorAndRerouteManager.java
index 9b5d070..187ef19 100644
--- a/apps/imr/app/src/main/java/org/onosproject/imr/IntentMonitorAndRerouteManager.java
+++ b/apps/imr/app/src/main/java/org/onosproject/imr/IntentMonitorAndRerouteManager.java
@@ -18,12 +18,6 @@
 
 import com.google.common.collect.ImmutableSet;
 import org.apache.commons.lang3.tuple.Pair;
-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.KryoNamespace;
 import org.onosproject.core.ApplicationId;
 import org.onosproject.imr.data.Path;
@@ -61,6 +55,11 @@
 import org.onosproject.store.service.DistributedSet;
 import org.onosproject.store.service.Serializer;
 import org.onosproject.store.service.StorageService;
+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;
 
@@ -82,8 +81,7 @@
 /**
  * Manager of Intent Monitor and Reroute.
  */
-@Component(immediate = true)
-@Service
+@Component(immediate = true, service = IntentMonitorAndRerouteService.class)
 public class IntentMonitorAndRerouteManager implements IntentMonitorAndRerouteService {
 
     private final Logger log = LoggerFactory.getLogger(getClass());
@@ -93,22 +91,22 @@
 
     private DistributedSet<Key> toBeMonitoredIntents;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected IntentService intentService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected FlowRuleService flowRuleService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected LinkService linkService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected HostService hostService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected FlowStatisticStore statsStore;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected StorageService storageService;
 
     private InternalIntentListener intentListener = new InternalIntentListener();
diff --git a/apps/inbandtelemetry/api/BUCK b/apps/inbandtelemetry/api/BUCK
deleted file mode 100644
index 97564d9..0000000
--- a/apps/inbandtelemetry/api/BUCK
+++ /dev/null
@@ -1,14 +0,0 @@
-COMPILE_DEPS = [
-    '//lib:CORE_DEPS',
-    '//lib:KRYO',
-    '//core/store/serializers:onos-core-serializers',
-]
-
-TEST_DEPS = [
-    '//lib:TEST_ADAPTERS',
-]
-
-osgi_jar_with_tests (
-    deps = COMPILE_DEPS,
-    test_deps = TEST_DEPS,
-)
diff --git a/apps/inbandtelemetry/app/BUCK b/apps/inbandtelemetry/app/BUCK
deleted file mode 100644
index a5d7b9e..0000000
--- a/apps/inbandtelemetry/app/BUCK
+++ /dev/null
@@ -1,32 +0,0 @@
-BUNDLES = [
-    '//apps/inbandtelemetry/api:onos-apps-inbandtelemetry-api',
-    '//apps/inbandtelemetry/impl:onos-apps-inbandtelemetry-impl',
-    '//apps/inbandtelemetry/app:onos-apps-inbandtelemetry-app',
-]
-
-COMPILE_DEPS = [
-    '//lib:CORE_DEPS',
-    '//lib:KRYO',
-    '//lib:JACKSON',
-    '//core/store/serializers:onos-core-serializers',
-    '//apps/inbandtelemetry/api:onos-apps-inbandtelemetry-api',
-]
-
-TEST_DEPS = [
-    '//lib:TEST_REST',
-]
-
-osgi_jar_with_tests(
-    deps = COMPILE_DEPS,
-    test_deps = TEST_DEPS,
-)
-
-onos_app (
-    app_name = 'org.onosproject.inbandtelemetry.app',
-    title = 'P4 In-band Network Telemetry Sample Application',
-    category = 'Monitoring',
-    url = 'http://onosproject.org',
-    description = 'Provides managements of INT-capable devices. Specifies flows to enable INT and' +
-    'types of metadata to collect. Sets up INT-related information.',
-    included_bundles = BUNDLES,
-)
\ No newline at end of file
diff --git a/apps/inbandtelemetry/app/src/main/java/org/onosproject/inbandtelemetry/app/ui/IntAppUiComponent.java b/apps/inbandtelemetry/app/src/main/java/org/onosproject/inbandtelemetry/app/ui/IntAppUiComponent.java
index 94c823e..9769bb0 100644
--- a/apps/inbandtelemetry/app/src/main/java/org/onosproject/inbandtelemetry/app/ui/IntAppUiComponent.java
+++ b/apps/inbandtelemetry/app/src/main/java/org/onosproject/inbandtelemetry/app/ui/IntAppUiComponent.java
@@ -16,11 +16,11 @@
 package org.onosproject.inbandtelemetry.app.ui;
 
 import com.google.common.collect.ImmutableList;
-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.onosproject.ui.UiExtension;
 import org.onosproject.ui.UiExtensionService;
 import org.onosproject.ui.UiMessageHandlerFactory;
@@ -41,7 +41,7 @@
 
     private final Logger log = LoggerFactory.getLogger(getClass());
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected UiExtensionService uiExtensionService;
 
     // List of application views
diff --git a/apps/inbandtelemetry/impl/BUCK b/apps/inbandtelemetry/impl/BUCK
deleted file mode 100644
index 9c87c92..0000000
--- a/apps/inbandtelemetry/impl/BUCK
+++ /dev/null
@@ -1,28 +0,0 @@
-BUNDLES = [
-    '//apps/inbandtelemetry/api:onos-apps-inbandtelemetry-api',
-    ':onos-apps-inbandtelemetry-impl'
-]
-COMPILE_DEPS = [
-    '//lib:CORE_DEPS',
-    '//lib:KRYO',
-    '//core/store/serializers:onos-core-serializers',
-    '//pipelines/basic:onos-pipelines-basic',
-    '//apps/inbandtelemetry/api:onos-apps-inbandtelemetry-api',
-]
-
-TEST_DEPS = [
-    '//lib:TEST_ADAPTERS',
-]
-
-osgi_jar_with_tests (
-    deps = COMPILE_DEPS,
-    test_deps = TEST_DEPS,
-)
-
-onos_app(
-    title = 'P4 In-band Network Telemetry Service',
-    description = 'Provides managements of INT-capable devices. Specifies flows to enable INT and' +
-    'types of metadata to collect. Sets up INT-related information.',
-    category = 'Monitoring',
-    included_bundles = BUNDLES,
-)
\ No newline at end of file
diff --git a/apps/inbandtelemetry/impl/src/main/java/org/onosproject/inbandtelemetry/impl/SimpleIntManager.java b/apps/inbandtelemetry/impl/src/main/java/org/onosproject/inbandtelemetry/impl/SimpleIntManager.java
index 56ee52b..5481997 100644
--- a/apps/inbandtelemetry/impl/src/main/java/org/onosproject/inbandtelemetry/impl/SimpleIntManager.java
+++ b/apps/inbandtelemetry/impl/src/main/java/org/onosproject/inbandtelemetry/impl/SimpleIntManager.java
@@ -17,12 +17,6 @@
 
 import com.google.common.collect.Maps;
 import com.google.common.util.concurrent.Striped;
-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.KryoNamespace;
 import org.onlab.util.SharedScheduledExecutors;
 import org.onosproject.core.ApplicationId;
@@ -56,6 +50,11 @@
 import org.onosproject.store.service.Serializer;
 import org.onosproject.store.service.StorageService;
 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.util.Collection;
@@ -84,8 +83,7 @@
  * configures a device by cleaning-up any previous state and applying the new
  * one.
  */
-@Component(immediate = true)
-@Service
+@Component(immediate = true, service = IntService.class)
 public class SimpleIntManager implements IntService {
 
     private final Logger log = getLogger(getClass());
@@ -94,19 +92,19 @@
 
     private static final String APP_NAME = "org.onosproject.inbandtelemetry";
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     private CoreService coreService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     private DeviceService deviceService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     private StorageService storageService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     private MastershipService mastershipService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     private HostService hostService;
 
     private final Striped<Lock> deviceLocks = Striped.lock(10);
diff --git a/apps/influxdbmetrics/BUCK b/apps/influxdbmetrics/BUCK
deleted file mode 100644
index ed47e12..0000000
--- a/apps/influxdbmetrics/BUCK
+++ /dev/null
@@ -1,46 +0,0 @@
-COMPILE_DEPS = [
-    '//lib:CORE_DEPS',
-    '//lib:METRICS',
-    '//lib:org.apache.karaf.shell.console',
-    '//lib:metrics-influxdb',
-    '//lib:influxdb-java',
-    '//lib:commons-codec',
-    '//lib:retrofit',
-    '//lib:okhttp',
-    '//lib:logging-interceptor',
-    '//lib:okio',
-    '//lib:moshi',
-    '//lib:converter-moshi',
-    '//lib:com_google_code_gson_gson',
-    '//cli:onos-cli',
-]
-
-EXCLUDED_BUNDLES = [
-    '//lib:metrics-influxdb',
-    '//lib:influxdb-java',
-    '//lib:commons-codec',
-    '//lib:retrofit',
-    '//lib:okhttp',
-    '//lib:logging-interceptor',
-    '//lib:com_google_code_gson_gson',
-    '//lib:okio',
-    '//lib:moshi',
-    '//lib:converter-moshi',
-]
-
-TEST_DEPS = [
-    '//lib:TEST_ADAPTERS',
-]
-
-osgi_jar_with_tests (
-    deps = COMPILE_DEPS,
-    test_deps = TEST_DEPS,
-)
-
-onos_app (
-    title = 'InfluxDB Report and Query',
-    category = 'Monitoring',
-    url = 'http://onosproject.org',
-    description = 'Performance metric service reporter and retriever for influxDB.',
-    excluded_bundles = EXCLUDED_BUNDLES,
-)
diff --git a/apps/influxdbmetrics/features.xml b/apps/influxdbmetrics/features.xml
deleted file mode 100644
index 5cd8850..0000000
--- a/apps/influxdbmetrics/features.xml
+++ /dev/null
@@ -1,30 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
-<!--
-  ~ Copyright 2016-present Open Networking Foundation
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~     http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License.
-  -->
-<features xmlns="http://karaf.apache.org/xmlns/features/v1.2.0" name="${project.artifactId}-${project.version}">
-    <feature name="${project.artifactId}" version="${project.version}"
-             description="${project.description}">
-        <feature>onos-api</feature>
-        <bundle>mvn:${project.groupId}/onos-apps-influxdbmetrics/${project.version}</bundle>
-        <bundle>wrap:mvn:com.izettle/metrics-influxdb/1.1.1$Bundle-SymbolicName=metrics-influxdb&amp;Bundle-Version=1.1.1</bundle>
-        <bundle>mvn:commons-codec/commons-codec/1.10</bundle>
-        <bundle>wrap:mvn:org.influxdb/influxdb-java/2.1$Bundle-SymbolicName=influxdb-java&amp;Bundle-Version=2.1</bundle>
-        <bundle>wrap:mvn:com.squareup.retrofit/retrofit/1.9.0$Bundle-SymbolicName=retrofit&amp;Bundle-Version=1.9.0</bundle>
-        <bundle>wrap:mvn:com.squareup.okhttp/okhttp/2.4.0$Bundle-SymbolicName=okhttp&amp;Bundle-Version=2.4.0</bundle>
-        <bundle>wrap:mvn:com.squareup.okio/okio/1.4.0$Bundle-SymbolicName=okio&amp;Bundle-Version=1.4.0</bundle>
-        <bundle>mvn:com.google.code.gson/gson/2.3.1</bundle>
-    </feature>
-</features>
diff --git a/apps/influxdbmetrics/src/main/java/org/onosproject/influxdbmetrics/DefaultInfluxDbMetricsReporter.java b/apps/influxdbmetrics/src/main/java/org/onosproject/influxdbmetrics/DefaultInfluxDbMetricsReporter.java
index 1425f79..cce6102 100644
--- a/apps/influxdbmetrics/src/main/java/org/onosproject/influxdbmetrics/DefaultInfluxDbMetricsReporter.java
+++ b/apps/influxdbmetrics/src/main/java/org/onosproject/influxdbmetrics/DefaultInfluxDbMetricsReporter.java
@@ -19,14 +19,6 @@
 import com.izettle.metrics.influxdb.InfluxDbHttpSender;
 import com.izettle.metrics.influxdb.InfluxDbReporter;
 import org.apache.commons.lang.StringUtils;
-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.onlab.util.Tools;
 import org.onosproject.cfg.ComponentConfigService;
@@ -34,18 +26,34 @@
 import org.onosproject.cluster.ControllerNode;
 import org.onosproject.core.CoreService;
 import org.osgi.service.component.ComponentContext;
+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.Dictionary;
 import java.util.concurrent.TimeUnit;
 
+import static org.onosproject.influxdbmetrics.OsgiPropertyConstants.METRIC_NAMES;
+import static org.onosproject.influxdbmetrics.OsgiPropertyConstants.METRIC_NAMES_DEFAULT;
+import static org.onosproject.influxdbmetrics.OsgiPropertyConstants.MONITOR_ALL;
+import static org.onosproject.influxdbmetrics.OsgiPropertyConstants.MONITOR_ALL_DEFAULT;
 import static org.slf4j.LoggerFactory.getLogger;
 
 /**
  * A Metric reporter that reports all metrics value to influxDB server.
  */
-@Component(immediate = true)
-@Service
+@Component(
+    immediate = true,
+    service = InfluxDbMetricsReporter.class,
+    property = {
+        MONITOR_ALL + ":Boolean=" + MONITOR_ALL_DEFAULT,
+        METRIC_NAMES + "=" + METRIC_NAMES_DEFAULT
+    }
+)
 public class DefaultInfluxDbMetricsReporter implements InfluxDbMetricsReporter {
     private final Logger log = getLogger(getClass());
 
@@ -53,32 +61,28 @@
     private static final TimeUnit REPORT_TIME_UNIT = TimeUnit.MINUTES;
 
     private static final String DEFAULT_PROTOCOL = "http";
-    private static final String DEFAULT_METRIC_NAMES = "default";
+
     private static final String SEPARATOR = ":";
     private static final int DEFAULT_CONN_TIMEOUT = 1000;
     private static final int DEFAULT_READ_TIMEOUT = 1000;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected CoreService coreService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected MetricsService metricsService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected ComponentConfigService cfgService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected ClusterService clusterService;
 
-    @Property(name = "monitorAll", boolValue = true,
-            label = "Enable to monitor all of metrics stored in metric registry " +
-                    "default is true")
-    protected boolean monitorAll = true;
+    /** Enable to monitor all of metrics stored in metric registry default is true. */
+    protected boolean monitorAll = MONITOR_ALL_DEFAULT;
 
-    @Property(name = "metricNames", value = DEFAULT_METRIC_NAMES,
-            label = "Names of metric to be monitored in third party monitoring " +
-                    "server; default metric names are 'default'")
-    protected String metricNames = DEFAULT_METRIC_NAMES;
+    /** Names of metric to be monitored in third party monitoring server; default metric names are 'default'. */
+    protected String metricNames = METRIC_NAMES_DEFAULT;
 
     protected String address;
     protected int port;
@@ -227,11 +231,11 @@
     private void readComponentConfiguration(ComponentContext context) {
         Dictionary<?, ?> properties = context.getProperties();
 
-        String metricNameStr = Tools.get(properties, "metricNames");
-        metricNames = metricNameStr != null ? metricNameStr : DEFAULT_METRIC_NAMES;
+        String metricNameStr = Tools.get(properties, METRIC_NAMES);
+        metricNames = metricNameStr != null ? metricNameStr : METRIC_NAMES_DEFAULT;
         log.info("Configured. Metric name is {}", metricNames);
 
-        Boolean monitorAllEnabled = Tools.isPropertyEnabled(properties, "monitorAll");
+        Boolean monitorAllEnabled = Tools.isPropertyEnabled(properties, MONITOR_ALL);
         if (monitorAllEnabled == null) {
             log.info("Monitor all metrics is not configured, " +
                     "using current value of {}", monitorAll);
diff --git a/apps/influxdbmetrics/src/main/java/org/onosproject/influxdbmetrics/DefaultInfluxDbMetricsRetriever.java b/apps/influxdbmetrics/src/main/java/org/onosproject/influxdbmetrics/DefaultInfluxDbMetricsRetriever.java
index a174925..1871b5a 100644
--- a/apps/influxdbmetrics/src/main/java/org/onosproject/influxdbmetrics/DefaultInfluxDbMetricsRetriever.java
+++ b/apps/influxdbmetrics/src/main/java/org/onosproject/influxdbmetrics/DefaultInfluxDbMetricsRetriever.java
@@ -21,18 +21,17 @@
 import com.google.common.collect.Maps;
 import com.google.common.collect.Sets;
 import org.apache.commons.lang.StringUtils;
-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.influxdb.InfluxDB;
 import org.influxdb.InfluxDBFactory;
 import org.influxdb.dto.Query;
 import org.influxdb.dto.QueryResult;
 import org.onosproject.cluster.NodeId;
 import org.onosproject.core.CoreService;
+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.List;
@@ -45,8 +44,7 @@
 /**
  * A Metric retriever implementation for querying metrics from influxDB server.
  */
-@Component(immediate = true)
-@Service
+@Component(immediate = true, service = InfluxDbMetricsRetriever.class)
 public class DefaultInfluxDbMetricsRetriever implements InfluxDbMetricsRetriever {
 
     private final Logger log = getLogger(getClass());
@@ -72,7 +70,7 @@
         TIME_UNIT_MAP.put(TimeUnit.SECONDS, "s");
     }
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected CoreService coreService;
 
     protected String database;
diff --git a/apps/influxdbmetrics/src/main/java/org/onosproject/influxdbmetrics/InfluxDbMetricsConfig.java b/apps/influxdbmetrics/src/main/java/org/onosproject/influxdbmetrics/InfluxDbMetricsConfig.java
index 499e4b9..12038f2 100644
--- a/apps/influxdbmetrics/src/main/java/org/onosproject/influxdbmetrics/InfluxDbMetricsConfig.java
+++ b/apps/influxdbmetrics/src/main/java/org/onosproject/influxdbmetrics/InfluxDbMetricsConfig.java
@@ -15,69 +15,76 @@
  */
 package org.onosproject.influxdbmetrics;
 
-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.onlab.util.Tools;
 import org.onosproject.cfg.ComponentConfigService;
 import org.onosproject.core.CoreService;
 import org.osgi.service.component.ComponentContext;
+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.Dictionary;
 
+import static org.onosproject.influxdbmetrics.OsgiPropertyConstants.ADDRESS;
+import static org.onosproject.influxdbmetrics.OsgiPropertyConstants.ADDRESS_DEFAULT;
+import static org.onosproject.influxdbmetrics.OsgiPropertyConstants.DATABASE;
+import static org.onosproject.influxdbmetrics.OsgiPropertyConstants.DATABASE_DEFAULT;
+import static org.onosproject.influxdbmetrics.OsgiPropertyConstants.PASSWORD;
+import static org.onosproject.influxdbmetrics.OsgiPropertyConstants.PASSWORD_DEFAULT;
+import static org.onosproject.influxdbmetrics.OsgiPropertyConstants.PORT;
+import static org.onosproject.influxdbmetrics.OsgiPropertyConstants.PORT_DEFAULT;
+import static org.onosproject.influxdbmetrics.OsgiPropertyConstants.USERNAME;
+import static org.onosproject.influxdbmetrics.OsgiPropertyConstants.USERNAME_DEFAULT;
 import static org.slf4j.LoggerFactory.getLogger;
 
 /**
  * A configuration service for InfluxDB metrics.
  * Both InfluxDbMetrics Reporter and Retriever rely on this configuration service.
  */
-@Component(immediate = true)
+@Component(
+    immediate = true,
+    property = {
+        ADDRESS + "=" + ADDRESS_DEFAULT,
+        PORT + ":Integer=" + PORT_DEFAULT,
+        DATABASE + "=" + DATABASE_DEFAULT,
+        USERNAME + "=" + USERNAME_DEFAULT,
+        PASSWORD + "=" + PASSWORD_DEFAULT
+    }
+)
 public class InfluxDbMetricsConfig {
 
     private final Logger log = getLogger(getClass());
 
-    private static final String DEFAULT_ADDRESS = "localhost";
-    private static final int DEFAULT_PORT = 8086;
-    private static final String DEFAULT_DATABASE = "onos";
-    private static final String DEFAULT_USERNAME = "onos";
-    private static final String DEFAULT_PASSWORD = "onos.password";
-
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected CoreService coreService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected InfluxDbMetricsReporter influxDbMetricsReporter;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected InfluxDbMetricsRetriever influxDbMetricsRetriever;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected ComponentConfigService cfgService;
 
-    @Property(name = "address", value = DEFAULT_ADDRESS,
-            label = "IP address of influxDB server; default is localhost")
-    protected String address = DEFAULT_ADDRESS;
+    /** IP address of influxDB server; default is localhost. */
+    protected String address = ADDRESS_DEFAULT;
 
-    @Property(name = "port", intValue = DEFAULT_PORT,
-            label = "Port number of influxDB server; default is 8086")
-    protected int port = DEFAULT_PORT;
+    /** Port number of influxDB server; default is 8086. */
+    protected int port = PORT_DEFAULT;
 
-    @Property(name = "database", value = DEFAULT_DATABASE,
-            label = "Database name of influxDB server; default is onos")
-    protected String database = DEFAULT_DATABASE;
+    /** Database name of influxDB server; default is onos. */
+    protected String database = DATABASE_DEFAULT;
 
-    @Property(name = "username", value = DEFAULT_USERNAME,
-            label = "Username of influxDB server; default is onos")
-    protected String username = DEFAULT_USERNAME;
+    /** Username of influxDB server; default is onos. */
+    protected String username = USERNAME_DEFAULT;
 
-    @Property(name = "password", value = DEFAULT_PASSWORD,
-            label = "Password of influxDB server; default is onos.password")
-    protected String password = DEFAULT_PASSWORD;
+    /** Password of influxDB server; default is onos.password. */
+    protected String password = PASSWORD_DEFAULT;
 
     @Activate
     public void activate() {
@@ -124,25 +131,25 @@
     private void readComponentConfiguration(ComponentContext context) {
         Dictionary<?, ?> properties = context.getProperties();
 
-        String addressStr = Tools.get(properties, "address");
-        address = addressStr != null ? addressStr : DEFAULT_ADDRESS;
+        String addressStr = Tools.get(properties, ADDRESS);
+        address = addressStr != null ? addressStr : ADDRESS_DEFAULT;
         log.info("Configured. InfluxDB server address is {}", address);
 
-        String databaseStr = Tools.get(properties, "database");
-        database = databaseStr != null ? databaseStr : DEFAULT_DATABASE;
+        String databaseStr = Tools.get(properties, DATABASE);
+        database = databaseStr != null ? databaseStr : DATABASE_DEFAULT;
         log.info("Configured. InfluxDB server database is {}", database);
 
-        String usernameStr = Tools.get(properties, "username");
-        username = usernameStr != null ? usernameStr : DEFAULT_USERNAME;
+        String usernameStr = Tools.get(properties, USERNAME);
+        username = usernameStr != null ? usernameStr : USERNAME_DEFAULT;
         log.info("Configured. InfluxDB server username is {}", username);
 
-        String passwordStr = Tools.get(properties, "password");
-        password = passwordStr != null ? passwordStr : DEFAULT_PASSWORD;
+        String passwordStr = Tools.get(properties, PASSWORD);
+        password = passwordStr != null ? passwordStr : PASSWORD_DEFAULT;
         log.info("Configured. InfluxDB server password is {}", password);
 
-        Integer portConfigured = Tools.getIntegerProperty(properties, "port");
+        Integer portConfigured = Tools.getIntegerProperty(properties, PORT);
         if (portConfigured == null) {
-            port = DEFAULT_PORT;
+            port = PORT_DEFAULT;
             log.info("InfluxDB port is not configured, default value is {}", port);
         } else {
             port = portConfigured;
diff --git a/apps/influxdbmetrics/src/main/java/org/onosproject/influxdbmetrics/OsgiPropertyConstants.java b/apps/influxdbmetrics/src/main/java/org/onosproject/influxdbmetrics/OsgiPropertyConstants.java
new file mode 100644
index 0000000..46428ff
--- /dev/null
+++ b/apps/influxdbmetrics/src/main/java/org/onosproject/influxdbmetrics/OsgiPropertyConstants.java
@@ -0,0 +1,43 @@
+/*
+ * Copyright 2018-present Open Networking Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.onosproject.influxdbmetrics;
+
+public final class OsgiPropertyConstants {
+    private OsgiPropertyConstants() {
+    }
+
+    static final String ADDRESS = "address";
+    static final String ADDRESS_DEFAULT = "localhost";
+
+    static final String PORT = "port";
+    static final int PORT_DEFAULT = 8086;
+
+    static final String DATABASE = "database";
+    static final String DATABASE_DEFAULT = "onos";
+
+    static final String USERNAME = "username";
+    static final String USERNAME_DEFAULT = "onos";
+
+    static final String PASSWORD = "password";
+    static final String PASSWORD_DEFAULT = "onos.password";
+
+    static final String MONITOR_ALL = "monitorAll";
+    static final boolean MONITOR_ALL_DEFAULT = true;
+
+    static final String METRIC_NAMES = "metricNames";
+    static final String METRIC_NAMES_DEFAULT = "default";
+}
diff --git a/apps/intentsync/BUCK b/apps/intentsync/BUCK
deleted file mode 100644
index 685cd74..0000000
--- a/apps/intentsync/BUCK
+++ /dev/null
@@ -1,22 +0,0 @@
-COMPILE_DEPS = [
-    '//lib:CORE_DEPS',
-    '//lib:org.apache.karaf.shell.console',
-    '//cli:onos-cli'
-]
-
-TEST_DEPS = [
-    '//lib:TEST_ADAPTERS',
-]
-
-osgi_jar_with_tests (
-    deps = COMPILE_DEPS,
-    test_deps = TEST_DEPS,
-)
-
-onos_app (
-  app_name = 'org.onosproject.intentsynchronizer',
-  title = 'Intent Synchronizer',
-  category = 'Utility',
-  url = 'http://onosproject.org',
-  description = 'Synchronizes intents to the intent framework from a single instance',
-)
diff --git a/apps/intentsync/BUILD b/apps/intentsync/BUILD
index 1928de8..09fd864 100644
--- a/apps/intentsync/BUILD
+++ b/apps/intentsync/BUILD
@@ -1,6 +1,7 @@
 COMPILE_DEPS = CORE_DEPS + CLI
 
 osgi_jar_with_tests(
+    karaf_command_packages = ["org.onosproject.intentsync.cli"],
     deps = COMPILE_DEPS,
 )
 
diff --git a/apps/intentsync/src/main/java/org/onosproject/intentsync/IntentSynchronizer.java b/apps/intentsync/src/main/java/org/onosproject/intentsync/IntentSynchronizer.java
index c15ea3c..1f33976 100644
--- a/apps/intentsync/src/main/java/org/onosproject/intentsync/IntentSynchronizer.java
+++ b/apps/intentsync/src/main/java/org/onosproject/intentsync/IntentSynchronizer.java
@@ -16,12 +16,6 @@
 
 package org.onosproject.intentsync;
 
-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.LeadershipEvent;
 import org.onosproject.cluster.LeadershipEventListener;
@@ -34,6 +28,11 @@
 import org.onosproject.net.intent.IntentState;
 import org.onosproject.net.intent.IntentUtils;
 import org.onosproject.net.intent.Key;
+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;
 
@@ -51,8 +50,8 @@
 /**
  * Synchronizes intents between an in-memory intent store and the IntentService.
  */
-@Service
-@Component(immediate = true)
+@Component(immediate = true, service = { IntentSynchronizationService.class,
+        IntentSynchronizationAdminService.class })
 public class IntentSynchronizer implements IntentSynchronizationService,
         IntentSynchronizationAdminService {
 
@@ -60,16 +59,16 @@
 
     private static final String APP_NAME = "org.onosproject.intentsynchronizer";
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected CoreService coreService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected LeadershipService leadershipService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected ClusterService clusterService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected IntentService intentService;
 
     private NodeId localNodeId;
diff --git a/apps/intentsync/src/main/java/org/onosproject/intentsync/cli/PrimaryChangeCommand.java b/apps/intentsync/src/main/java/org/onosproject/intentsync/cli/PrimaryChangeCommand.java
index e54dbcb..b7416d4 100644
--- a/apps/intentsync/src/main/java/org/onosproject/intentsync/cli/PrimaryChangeCommand.java
+++ b/apps/intentsync/src/main/java/org/onosproject/intentsync/cli/PrimaryChangeCommand.java
@@ -15,14 +15,16 @@
  */
 package org.onosproject.intentsync.cli;
 
-import org.apache.karaf.shell.commands.Argument;
-import org.apache.karaf.shell.commands.Command;
+import org.apache.karaf.shell.api.action.Argument;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.intentsync.IntentSynchronizationAdminService;
 
 /**
  * Command to change whether this instance's intent synchronizer is primary.
  */
+@Service
 @Command(scope = "onos", name = "sdnip-set-primary",
          description = "Changes the primary status of this SDN-IP instance")
 public class PrimaryChangeCommand extends AbstractShellCommand {
@@ -33,7 +35,7 @@
     boolean isPrimary = false;
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         AbstractShellCommand.get(IntentSynchronizationAdminService.class).modifyPrimary(isPrimary);
     }
 
diff --git a/apps/intentsync/src/main/resources/OSGI-INF/blueprint/shell-config.xml b/apps/intentsync/src/main/resources/OSGI-INF/blueprint/shell-config.xml
deleted file mode 100644
index 9564379..0000000
--- a/apps/intentsync/src/main/resources/OSGI-INF/blueprint/shell-config.xml
+++ /dev/null
@@ -1,23 +0,0 @@
-<!--
-  ~ Copyright 2017-present Open Networking Foundation
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~     http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License.
-  -->
-<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0">
-
-  <command-bundle xmlns="http://karaf.apache.org/xmlns/shell/v1.1.0">
-    <command>
-      <action class="org.onosproject.intentsync.cli.PrimaryChangeCommand"/>
-    </command>
-  </command-bundle>
-</blueprint>
diff --git a/apps/iptopology-api/BUCK b/apps/iptopology-api/BUCK
deleted file mode 100644
index 3cc9301..0000000
--- a/apps/iptopology-api/BUCK
+++ /dev/null
@@ -1,8 +0,0 @@
-COMPILE_DEPS = [
-    '//lib:CORE_DEPS',
-]
-
-osgi_jar_with_tests (
-    deps = COMPILE_DEPS,
-)
-
diff --git a/apps/kafka-integration/BUCK b/apps/kafka-integration/BUCK
deleted file mode 100644
index ecb06ff..0000000
--- a/apps/kafka-integration/BUCK
+++ /dev/null
@@ -1,17 +0,0 @@
-BUNDLES = [
-    '//lib:kafka-clients',
-    '//lib:protobuf-java-3.2.0',
-    '//incubator/protobuf/models:onos-incubator-protobuf-models',
-    '//incubator/protobuf/models:onos-incubator-protobuf-models-proto',
-    '//apps/kafka-integration/api:onos-apps-kafka-integration-api',
-    '//apps/kafka-integration/app:onos-apps-kafka-integration-app',
-]
-
-onos_app (
-  title = 'Kafka Integration',
-  category = 'Integration',
-  url = 'http://onosproject.org',
-  description = 'Provides integration of ONOS and Kafka message bus so that internal ONOS events ' +
-    'can be broadcast over the Kafka message bus to off-platform applications.',
-  included_bundles = BUNDLES,
-)
diff --git a/apps/kafka-integration/api/BUCK b/apps/kafka-integration/api/BUCK
deleted file mode 100644
index 4609fe9..0000000
--- a/apps/kafka-integration/api/BUCK
+++ /dev/null
@@ -1,8 +0,0 @@
-COMPILE_DEPS = [
-    '//lib:CORE_DEPS',
-    '//lib:kafka-clients',
-]
-
-osgi_jar_with_tests (
-    deps = COMPILE_DEPS,
-)
\ No newline at end of file
diff --git a/apps/kafka-integration/app/BUCK b/apps/kafka-integration/app/BUCK
deleted file mode 100644
index 46cc863..0000000
--- a/apps/kafka-integration/app/BUCK
+++ /dev/null
@@ -1,30 +0,0 @@
-COMPILE_DEPS = [
-    '//lib:CORE_DEPS',
-    '//lib:JACKSON',
-    '//lib:KRYO',
-    '//lib:javax.ws.rs-api',
-    '//lib:org.apache.karaf.shell.console',
-    '//apps/kafka-integration/api:onos-apps-kafka-integration-api',
-    '//utils/rest:onlab-rest',
-    '//core/store/serializers:onos-core-serializers',
-    '//cli:onos-cli',
-    '//lib:kafka-clients',
-    '//lib:protobuf-java-3.2.0',
-    '//lib:GRPC_1.3',
-    '//incubator/protobuf/models:onos-incubator-protobuf-models',
-    '//incubator/protobuf/models:onos-incubator-protobuf-models-proto',
-]
-
-TEST_DEPS = [
-    '//lib:TEST_ADAPTERS',
-]
-
-osgi_jar_with_tests (
-    deps = COMPILE_DEPS,
-    test_deps = TEST_DEPS,
-    web_context = '/onos/kafka-integration',
-    api_title = 'Kafka Integration',
-    api_version = '1.0',
-    api_description = 'REST API for Kafka Integration',
-    api_package = 'org.onosproject.kafkaintegration.rest',
-)
diff --git a/apps/kafka-integration/app/app.xml b/apps/kafka-integration/app/app.xml
deleted file mode 100644
index 1cfbf18..0000000
--- a/apps/kafka-integration/app/app.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-  ~ Copyright 2016-present Open Networking Foundation
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~     http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License.
-  -->
-<app name="org.onosproject.kafkaintegration" origin="Calix" version="${project.version}"
-     category="Utility" url="http://onosproject.org" title="Kafka Integration Application"
-     featuresRepo="mvn:${project.groupId}/${project.artifactId}/${project.version}/xml/features"
-     features="${project.artifactId}" apps="org.onosproject.incubator.protobuf">
-    <description>${project.description}</description>
-    <artifact>mvn:${project.groupId}/onos-apps-kafka-integration-api/${project.version}</artifact>
-    <artifact>mvn:${project.groupId}/onos-apps-kafka-integration-app/${project.version}</artifact>
-    <artifact>mvn:org.apache.servicemix.bundles/org.apache.servicemix.bundles.kafka-clients/0.8.2.2_1</artifact>
-</app>
diff --git a/apps/kafka-integration/app/features.xml b/apps/kafka-integration/app/features.xml
deleted file mode 100644
index 924d868..0000000
--- a/apps/kafka-integration/app/features.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
-<!--
-  ~ Copyright 2016-present Open Networking Foundation
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~     http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License.
-  -->
-<features xmlns="http://karaf.apache.org/xmlns/features/v1.2.0" name="${project.artifactId}-${project.version}">
-    <feature name="${project.artifactId}" version="${project.version}"
-             description="${project.description}">
-        <feature>onos-api</feature>
-        <bundle>mvn:${project.groupId}/onos-apps-kafka-integration-api/${project.version}</bundle>
-        <bundle>mvn:${project.groupId}/onos-apps-kafka-integration-app/${project.version}</bundle>
-        <bundle>mvn:org.apache.servicemix.bundles/org.apache.servicemix.bundles.kafka-clients/0.8.2.2_1</bundle>
-    </feature>
-</features>
diff --git a/apps/kafka-integration/app/src/main/java/org/onosproject/kafkaintegration/impl/EventConversionManager.java b/apps/kafka-integration/app/src/main/java/org/onosproject/kafkaintegration/impl/EventConversionManager.java
index c96b81b..5c90325 100644
--- a/apps/kafka-integration/app/src/main/java/org/onosproject/kafkaintegration/impl/EventConversionManager.java
+++ b/apps/kafka-integration/app/src/main/java/org/onosproject/kafkaintegration/impl/EventConversionManager.java
@@ -16,10 +16,9 @@
 
 package org.onosproject.kafkaintegration.impl;
 
-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.osgi.service.component.annotations.Activate;
+import org.osgi.service.component.annotations.Component;
+import org.osgi.service.component.annotations.Deactivate;
 import org.onosproject.event.Event;
 import org.onosproject.kafkaintegration.api.EventConversionService;
 import org.onosproject.kafkaintegration.api.dto.OnosEvent;
@@ -38,8 +37,7 @@
  * Implementation of Event Conversion Service.
  *
  */
-@Component(immediate = true)
-@Service
+@Component(immediate = true, service = EventConversionService.class)
 public class EventConversionManager implements EventConversionService {
 
     private final Logger log = LoggerFactory.getLogger(getClass());
diff --git a/apps/kafka-integration/app/src/main/java/org/onosproject/kafkaintegration/impl/EventSubscriptionManager.java b/apps/kafka-integration/app/src/main/java/org/onosproject/kafkaintegration/impl/EventSubscriptionManager.java
index fdb7ed5..3671abb 100644
--- a/apps/kafka-integration/app/src/main/java/org/onosproject/kafkaintegration/impl/EventSubscriptionManager.java
+++ b/apps/kafka-integration/app/src/main/java/org/onosproject/kafkaintegration/impl/EventSubscriptionManager.java
@@ -15,19 +15,7 @@
  */
 package org.onosproject.kafkaintegration.impl;
 
-import static com.google.common.base.Preconditions.checkNotNull;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Map;
-import java.util.UUID;
-
-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.ImmutableList;
 import org.onosproject.core.ApplicationId;
 import org.onosproject.core.CoreService;
 import org.onosproject.kafkaintegration.api.EventSubscriptionService;
@@ -35,25 +23,34 @@
 import org.onosproject.kafkaintegration.api.dto.DefaultEventSubscriber;
 import org.onosproject.kafkaintegration.api.dto.EventSubscriber;
 import org.onosproject.kafkaintegration.api.dto.EventSubscriberGroupId;
-import org.onosproject.kafkaintegration.api.dto.RegistrationResponse;
 import org.onosproject.kafkaintegration.api.dto.OnosEvent;
 import org.onosproject.kafkaintegration.api.dto.OnosEvent.Type;
+import org.onosproject.kafkaintegration.api.dto.RegistrationResponse;
 import org.onosproject.kafkaintegration.errors.InvalidApplicationException;
 import org.onosproject.kafkaintegration.errors.InvalidGroupIdException;
 import org.onosproject.store.serializers.KryoNamespaces;
 import org.onosproject.store.service.Serializer;
 import org.onosproject.store.service.StorageService;
+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 com.google.common.collect.ImmutableList;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.UUID;
+
+import static com.google.common.base.Preconditions.checkNotNull;
 
 /**
  * Implementation of Event Subscription Manager.
  *
  */
-@Component(immediate = true)
-@Service
+@Component(immediate = true, service = EventSubscriptionService.class)
 public class EventSubscriptionManager implements EventSubscriptionService {
 
     private final Logger log = LoggerFactory.getLogger(getClass());
@@ -67,13 +64,13 @@
 
     private static final String SUBSCRIBED_APPS = "event-subscriptions";
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected CoreService coreService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected StorageService storageService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected KafkaConfigService kafkaConfigService;
 
     private ApplicationId appId;
diff --git a/apps/kafka-integration/app/src/main/java/org/onosproject/kafkaintegration/impl/KafkaCodecRegistrator.java b/apps/kafka-integration/app/src/main/java/org/onosproject/kafkaintegration/impl/KafkaCodecRegistrator.java
index 4af3f50..4ab9a0d 100644
--- a/apps/kafka-integration/app/src/main/java/org/onosproject/kafkaintegration/impl/KafkaCodecRegistrator.java
+++ b/apps/kafka-integration/app/src/main/java/org/onosproject/kafkaintegration/impl/KafkaCodecRegistrator.java
@@ -15,11 +15,11 @@
  */
 package org.onosproject.kafkaintegration.impl;
 
-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.onosproject.codec.CodecService;
 import org.onosproject.kafkaintegration.api.dto.EventSubscriber;
 import org.slf4j.Logger;
@@ -32,7 +32,7 @@
 public class KafkaCodecRegistrator {
     private static Logger log = LoggerFactory.getLogger(KafkaCodecRegistrator
                                                                 .class);
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected CodecService codecService;
 
     @Activate
diff --git a/apps/kafka-integration/app/src/main/java/org/onosproject/kafkaintegration/impl/KafkaStorageManager.java b/apps/kafka-integration/app/src/main/java/org/onosproject/kafkaintegration/impl/KafkaStorageManager.java
index 19e58ca..138db2b 100644
--- a/apps/kafka-integration/app/src/main/java/org/onosproject/kafkaintegration/impl/KafkaStorageManager.java
+++ b/apps/kafka-integration/app/src/main/java/org/onosproject/kafkaintegration/impl/KafkaStorageManager.java
@@ -15,12 +15,6 @@
  */
 package org.onosproject.kafkaintegration.impl;
 
-import org.apache.felix.scr.annotations.Activate;
-import org.apache.felix.scr.annotations.Component;
-import org.apache.felix.scr.annotations.Service;
-import org.apache.felix.scr.annotations.Deactivate;
-import org.apache.felix.scr.annotations.Reference;
-import org.apache.felix.scr.annotations.ReferenceCardinality;
 import org.onosproject.kafkaintegration.api.KafkaEventStorageService;
 import org.onosproject.kafkaintegration.api.dto.OnosEvent;
 import org.onosproject.store.serializers.KryoNamespaces;
@@ -28,17 +22,21 @@
 import org.onosproject.store.service.StorageService;
 import org.onosproject.store.service.Task;
 import org.onosproject.store.service.WorkQueue;
+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.util.concurrent.CompletableFuture;
 import java.util.concurrent.ExecutionException;
 
-@Component(immediate = false)
-@Service
+@Component(service = KafkaEventStorageService.class)
 public class KafkaStorageManager implements KafkaEventStorageService {
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected StorageService storageService;
 
     private final Logger log = LoggerFactory.getLogger(getClass());
diff --git a/apps/kafka-integration/app/src/main/java/org/onosproject/kafkaintegration/kafka/EventListener.java b/apps/kafka-integration/app/src/main/java/org/onosproject/kafkaintegration/kafka/EventListener.java
index 1b53c2a..18baccb 100644
--- a/apps/kafka-integration/app/src/main/java/org/onosproject/kafkaintegration/kafka/EventListener.java
+++ b/apps/kafka-integration/app/src/main/java/org/onosproject/kafkaintegration/kafka/EventListener.java
@@ -16,13 +16,13 @@
 
 package org.onosproject.kafkaintegration.kafka;
 
-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.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.onosproject.cluster.ClusterService;
 import org.onosproject.cluster.NodeId;
-import org.apache.felix.scr.annotations.ReferenceCardinality;
+import org.osgi.service.component.annotations.ReferenceCardinality;
 import org.onosproject.cluster.LeadershipService;
 import org.onosproject.kafkaintegration.api.EventConversionService;
 import org.onosproject.kafkaintegration.api.EventSubscriptionService;
@@ -53,25 +53,25 @@
 public class EventListener {
     private final Logger log = LoggerFactory.getLogger(getClass());
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected EventSubscriptionService eventSubscriptionService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected EventConversionService eventConversionService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected DeviceService deviceService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected LinkService linkService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected KafkaEventStorageService kafkaStoreService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected LeadershipService leadershipService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected ClusterService clusterService;
 
     private final DeviceListener deviceListener = new InternalDeviceListener();
diff --git a/apps/kafka-integration/app/src/main/java/org/onosproject/kafkaintegration/kafka/EventPublisher.java b/apps/kafka-integration/app/src/main/java/org/onosproject/kafkaintegration/kafka/EventPublisher.java
index a42e56a..86d1d72 100644
--- a/apps/kafka-integration/app/src/main/java/org/onosproject/kafkaintegration/kafka/EventPublisher.java
+++ b/apps/kafka-integration/app/src/main/java/org/onosproject/kafkaintegration/kafka/EventPublisher.java
@@ -15,11 +15,11 @@
  */
 package org.onosproject.kafkaintegration.kafka;
 
-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.apache.kafka.clients.producer.ProducerRecord;
 import org.onosproject.cluster.ClusterService;
 import org.onosproject.cluster.LeadershipService;
@@ -42,19 +42,19 @@
 
     private final Logger log = LoggerFactory.getLogger(getClass());
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected LeadershipService leadershipService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected ClusterService clusterService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected KafkaConfigService kafkaConfigService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected KafkaEventStorageService kafkaStore;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected KafkaPublisherService kafkaPublisher;
 
     protected ScheduledExecutorService exService;
diff --git a/apps/kafka-integration/app/src/main/java/org/onosproject/kafkaintegration/kafka/KafkaConfigManager.java b/apps/kafka-integration/app/src/main/java/org/onosproject/kafkaintegration/kafka/KafkaConfigManager.java
index 79d7baf..aed8ba8 100644
--- a/apps/kafka-integration/app/src/main/java/org/onosproject/kafkaintegration/kafka/KafkaConfigManager.java
+++ b/apps/kafka-integration/app/src/main/java/org/onosproject/kafkaintegration/kafka/KafkaConfigManager.java
@@ -15,37 +15,35 @@
  */
 package org.onosproject.kafkaintegration.kafka;
 
-import static com.google.common.base.Strings.isNullOrEmpty;
-import static org.onlab.util.Tools.get;
-
-import java.util.Dictionary;
-
-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.onosproject.cfg.ComponentConfigService;
 import org.onosproject.kafkaintegration.api.KafkaConfigService;
 import org.onosproject.kafkaintegration.api.KafkaPublisherAdminService;
 import org.onosproject.kafkaintegration.api.dto.KafkaServerConfig;
 import org.osgi.service.component.ComponentContext;
+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.Property;
+import org.osgi.service.component.annotations.Reference;
+import org.osgi.service.component.annotations.ReferenceCardinality;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-@Component(immediate = true)
-@Service
+import java.util.Dictionary;
+
+import static com.google.common.base.Strings.isNullOrEmpty;
+import static org.onlab.util.Tools.get;
+
+@Component(immediate = true, service = KafkaConfigService.class)
 public class KafkaConfigManager implements KafkaConfigService {
 
     private final Logger log = LoggerFactory.getLogger(getClass());
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected ComponentConfigService componentConfigService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected KafkaPublisherAdminService kafkaPublisherAdminService;
 
     public static final String BOOTSTRAP_SERVERS = "localhost:9092";
diff --git a/apps/kafka-integration/app/src/main/java/org/onosproject/kafkaintegration/kafka/PublishManager.java b/apps/kafka-integration/app/src/main/java/org/onosproject/kafkaintegration/kafka/PublishManager.java
index b3064b1f..5110001 100644
--- a/apps/kafka-integration/app/src/main/java/org/onosproject/kafkaintegration/kafka/PublishManager.java
+++ b/apps/kafka-integration/app/src/main/java/org/onosproject/kafkaintegration/kafka/PublishManager.java
@@ -16,27 +16,25 @@
 
 package org.onosproject.kafkaintegration.kafka;
 
-import java.util.Properties;
-import java.util.concurrent.Future;
-
-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.apache.kafka.clients.producer.KafkaProducer;
 import org.apache.kafka.clients.producer.ProducerRecord;
 import org.apache.kafka.clients.producer.RecordMetadata;
-import org.onosproject.kafkaintegration.api.KafkaPublisherService;
 import org.onosproject.kafkaintegration.api.KafkaPublisherAdminService;
+import org.onosproject.kafkaintegration.api.KafkaPublisherService;
 import org.onosproject.kafkaintegration.api.dto.KafkaServerConfig;
+import org.osgi.service.component.annotations.Activate;
+import org.osgi.service.component.annotations.Component;
+import org.osgi.service.component.annotations.Deactivate;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import java.util.Properties;
+import java.util.concurrent.Future;
+
 /**
  * Implementation of a Kafka Producer.
  */
-@Component
-@Service
+@Component(service = { KafkaPublisherService.class, KafkaPublisherAdminService.class })
 public class PublishManager implements KafkaPublisherService, KafkaPublisherAdminService {
     private KafkaProducer<String, byte[]> kafkaProducer = null;
 
diff --git a/apps/l3vpn/BUCK b/apps/l3vpn/BUCK
deleted file mode 100644
index d663a65..0000000
--- a/apps/l3vpn/BUCK
+++ /dev/null
@@ -1,46 +0,0 @@
-COMPILE_DEPS = [
-    '//lib:CORE_DEPS',
-    '//lib:KRYO',
-    '//models/l3vpn:onos-models-l3vpn',
-    '//apps/config:onos-apps-config',
-    '//core/store/serializers:onos-core-serializers',
-    '//lib:onos-yang-model',
-    '//lib:onos-yang-runtime',
-    '//apps/yang:onos-apps-yang',
-    '//apps/pce/app:onos-apps-pce-app',
-    '//incubator/api:onos-incubator-api',
-    '//models/common:onos-models-common',
-]
-
-TEST_DEPS = [
-    '//lib:TEST_ADAPTERS',
-    '//utils/osgi:onlab-osgi-tests',
-]
-
-APPS = [
-    'org.onosproject.yang',
-    'org.onosproject.yang-gui',
-    'org.onosproject.config',
-    'org.onosproject.restconf',
-    'org.onosproject.protocols.restconfserver',
-    'org.onosproject.netconf',
-    'org.onosproject.netconfsb',
-    'org.onosproject.models.common',
-    'org.onosproject.models.l3vpn',
-    'org.onosproject.bgpcep',
-]
-
-osgi_jar_with_tests(
-    deps = COMPILE_DEPS,
-    test_deps = TEST_DEPS,
-)
-
-onos_app(
-    app_name = 'org.onosproject.l3vpn',
-    title = 'YANG L3VPN',
-    category = 'Traffic Engineering',
-    url = 'http://onosproject.org',
-    description = 'L3VPN YANG Application',
-    required_apps = APPS,
-)
-
diff --git a/apps/l3vpn/src/main/java/org/onosproject/l3vpn/netl3vpn/impl/DistributedNetL3VpnStore.java b/apps/l3vpn/src/main/java/org/onosproject/l3vpn/netl3vpn/impl/DistributedNetL3VpnStore.java
index 28a90da..5178d5e 100644
--- a/apps/l3vpn/src/main/java/org/onosproject/l3vpn/netl3vpn/impl/DistributedNetL3VpnStore.java
+++ b/apps/l3vpn/src/main/java/org/onosproject/l3vpn/netl3vpn/impl/DistributedNetL3VpnStore.java
@@ -16,12 +16,6 @@
 package org.onosproject.l3vpn.netl3vpn.impl;
 
 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.apache.felix.scr.annotations.Service;
 import org.onlab.util.KryoNamespace;
 import org.onosproject.l3vpn.netl3vpn.AccessInfo;
 import org.onosproject.l3vpn.netl3vpn.BgpInfo;
@@ -47,6 +41,11 @@
 import org.onosproject.yang.model.NodeKey;
 import org.onosproject.yang.model.ResourceId;
 import org.onosproject.yang.model.SchemaId;
+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.Map;
@@ -59,8 +58,7 @@
  * Manages the pool of available VPN instances and its associated devices
  * and interface information.
  */
-@Component(immediate = true)
-@Service
+@Component(immediate = true, service = NetL3VpnStore.class)
 public class DistributedNetL3VpnStore implements NetL3VpnStore {
 
     private static final Serializer L3VPN_SERIALIZER = Serializer
@@ -95,7 +93,7 @@
 
     private final Logger log = getLogger(getClass());
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected StorageService storageService;
 
     /**
diff --git a/apps/l3vpn/src/main/java/org/onosproject/l3vpn/netl3vpn/impl/NetL3VpnManager.java b/apps/l3vpn/src/main/java/org/onosproject/l3vpn/netl3vpn/impl/NetL3VpnManager.java
index b7d4ddd..7c1ccf8 100644
--- a/apps/l3vpn/src/main/java/org/onosproject/l3vpn/netl3vpn/impl/NetL3VpnManager.java
+++ b/apps/l3vpn/src/main/java/org/onosproject/l3vpn/netl3vpn/impl/NetL3VpnManager.java
@@ -15,11 +15,11 @@
  */
 package org.onosproject.l3vpn.netl3vpn.impl;
 
-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.util.AbstractAccumulator;
 import org.onlab.util.Accumulator;
 import org.onosproject.cluster.ClusterService;
@@ -154,31 +154,31 @@
     private final InternalLeadershipListener leadershipEventListener =
             new InternalLeadershipListener();
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected CoreService coreService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected DriverService driverService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected DeviceService deviceService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected ModelConverter modelConverter;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected DynamicConfigService configService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected NetL3VpnStore l3VpnStore;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected LeadershipService leadershipService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected ClusterService clusterService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected PceService pceService;
 
     protected IdGenerator l3VpnIdGen;
diff --git a/apps/layout/BUCK b/apps/layout/BUCK
deleted file mode 100644
index a24c4ea..0000000
--- a/apps/layout/BUCK
+++ /dev/null
@@ -1,19 +0,0 @@
-COMPILE_DEPS = [
-    '//lib:CORE_DEPS',
-    '//lib:JACKSON',
-    '//lib:org.apache.karaf.shell.console',
-    '//core/common:onos-core-common',
-    '//cli:onos-cli',
-]
-
-osgi_jar_with_tests (
-    deps = COMPILE_DEPS,
-)
-
-onos_app (
-    title = 'UI Auto-Layout',
-    category = 'GUI',
-    url = 'http://onosproject.org',
-    description = 'Automatically lays out the network topology using roles assigned to each ' +
-        'network element via the network configuration. Supports multiple layout variants.',
-)
diff --git a/apps/layout/BUILD b/apps/layout/BUILD
index 12d33e9..18159a4 100644
--- a/apps/layout/BUILD
+++ b/apps/layout/BUILD
@@ -3,6 +3,7 @@
 ]
 
 osgi_jar_with_tests(
+    karaf_command_packages = ["org.onosproject.layout"],
     deps = COMPILE_DEPS,
 )
 
diff --git a/apps/layout/src/main/java/org/onosproject/layout/AutoLayoutCommand.java b/apps/layout/src/main/java/org/onosproject/layout/AutoLayoutCommand.java
index 0f53371..5f928c5 100644
--- a/apps/layout/src/main/java/org/onosproject/layout/AutoLayoutCommand.java
+++ b/apps/layout/src/main/java/org/onosproject/layout/AutoLayoutCommand.java
@@ -15,13 +15,15 @@
  */
 package org.onosproject.layout;
 
-import org.apache.karaf.shell.commands.Argument;
-import org.apache.karaf.shell.commands.Command;
+import org.apache.karaf.shell.api.action.Argument;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.cli.AbstractShellCommand;
 
 /**
  * Lays out the elements in the topology using the specified algorithm.
  */
+@Service
 @Command(scope = "onos", name = "topo-layout",
         description = "Lays out the elements in the topology using the specified algorithm")
 public class AutoLayoutCommand extends AbstractShellCommand {
@@ -31,7 +33,7 @@
     String algorithm = "access";
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         RoleBasedLayoutManager mgr = get(RoleBasedLayoutManager.class);
         switch (algorithm) {
             case "access":
diff --git a/apps/layout/src/main/java/org/onosproject/layout/RoleBasedLayoutManager.java b/apps/layout/src/main/java/org/onosproject/layout/RoleBasedLayoutManager.java
index 932e626..ce01c98 100644
--- a/apps/layout/src/main/java/org/onosproject/layout/RoleBasedLayoutManager.java
+++ b/apps/layout/src/main/java/org/onosproject/layout/RoleBasedLayoutManager.java
@@ -17,12 +17,6 @@
 package org.onosproject.layout;
 
 import com.google.common.collect.ImmutableList;
-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.net.config.NetworkConfigService;
 import org.onosproject.net.device.DeviceService;
 import org.onosproject.net.host.HostService;
@@ -34,6 +28,11 @@
 import org.onosproject.ui.UiTopoOverlayFactory;
 import org.onosproject.ui.UiView;
 import org.onosproject.ui.UiViewHidden;
+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;
 
@@ -44,8 +43,7 @@
  * supported layout variants using roles assigned to network elements using
  * network configuration.
  */
-@Component(immediate = true)
-@Service(value = RoleBasedLayoutManager.class)
+@Component(immediate = true, service = RoleBasedLayoutManager.class)
 public class RoleBasedLayoutManager {
 
     private Logger log = LoggerFactory.getLogger(getClass());
@@ -74,19 +72,19 @@
                     .topoOverlayFactory(topoOverlayFactory)
                     .build();
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected NetworkConfigService networkConfigService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected DeviceService deviceService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected HostService hostService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected LinkService linkService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected UiExtensionService uiExtensionService;
 
     @Activate
diff --git a/apps/layout/src/main/resources/OSGI-INF/blueprint/shell-config.xml b/apps/layout/src/main/resources/OSGI-INF/blueprint/shell-config.xml
deleted file mode 100644
index 6562fd5..0000000
--- a/apps/layout/src/main/resources/OSGI-INF/blueprint/shell-config.xml
+++ /dev/null
@@ -1,23 +0,0 @@
-<!--
-  ~ Copyright 2018-present Open Networking Foundation
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~     http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License.
-  -->
-<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0">
-
-    <command-bundle xmlns="http://karaf.apache.org/xmlns/shell/v1.1.0">
-        <command>
-            <action class="org.onosproject.layout.AutoLayoutCommand"/>
-        </command>
-    </command-bundle>
-</blueprint>
\ No newline at end of file
diff --git a/apps/learning-switch/BUCK b/apps/learning-switch/BUCK
deleted file mode 100644
index 61399c3..0000000
--- a/apps/learning-switch/BUCK
+++ /dev/null
@@ -1,17 +0,0 @@
-COMPILE_DEPS = [
-    '//lib:CORE_DEPS',
-    '//lib:slf4j-api',
-    '//lib:org.apache.felix.scr.annotations',
-    '//lib:junit',
-]
-
-osgi_jar_with_tests (
-    deps = COMPILE_DEPS,
-)
-
-onos_app (
-    title = 'Learning Switch Tutorial',
-    category = 'Tutorial',
-    url = 'http://onosproject.org',
-    description = 'Tutorial to help user create a learning switch',
-)
\ No newline at end of file
diff --git a/apps/learning-switch/src/main/java/org/onosproject/learningswitch/LearningSwitchSolution.java b/apps/learning-switch/src/main/java/org/onosproject/learningswitch/LearningSwitchSolution.java
index 621d16d..8dd07fd 100644
--- a/apps/learning-switch/src/main/java/org/onosproject/learningswitch/LearningSwitchSolution.java
+++ b/apps/learning-switch/src/main/java/org/onosproject/learningswitch/LearningSwitchSolution.java
@@ -16,11 +16,11 @@
 package org.onosproject.learningswitch;
 
 import com.google.common.collect.Maps;
-import org.apache.felix.scr.annotations.Activate;
-import org.apache.felix.scr.annotations.Deactivate;
-import org.apache.felix.scr.annotations.Component;
-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.Deactivate;
+import org.osgi.service.component.annotations.Component;
+import org.osgi.service.component.annotations.Reference;
+import org.osgi.service.component.annotations.ReferenceCardinality;
 import org.onlab.packet.Ethernet;
 import org.onlab.packet.MacAddress;
 import org.onosproject.core.ApplicationId;
@@ -52,13 +52,13 @@
 public class LearningSwitchSolution {
 
     // Instantiates the relevant services.
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected PacketService packetService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected FlowRuleService flowRuleService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected CoreService coreService;
 
     private final Logger log = LoggerFactory.getLogger(getClass());
diff --git a/apps/learning-switch/src/main/java/org/onosproject/learningswitch/LearningSwitchTutorial.java b/apps/learning-switch/src/main/java/org/onosproject/learningswitch/LearningSwitchTutorial.java
index 3a9c8b7..1cfd876 100644
--- a/apps/learning-switch/src/main/java/org/onosproject/learningswitch/LearningSwitchTutorial.java
+++ b/apps/learning-switch/src/main/java/org/onosproject/learningswitch/LearningSwitchTutorial.java
@@ -16,11 +16,11 @@
 package org.onosproject.learningswitch;
 
 import com.google.common.collect.Maps;
-import org.apache.felix.scr.annotations.Activate;
-import org.apache.felix.scr.annotations.Deactivate;
-import org.apache.felix.scr.annotations.Component;
-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.Deactivate;
+import org.osgi.service.component.annotations.Component;
+import org.osgi.service.component.annotations.Reference;
+import org.osgi.service.component.annotations.ReferenceCardinality;
 import org.onlab.packet.Ethernet;
 import org.onlab.packet.MacAddress;
 import org.onosproject.core.ApplicationId;
@@ -48,13 +48,13 @@
 public class LearningSwitchTutorial {
     // Instantiates the relevant services.
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected PacketService packetService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected FlowRuleService flowRuleService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected CoreService coreService;
 
     private final Logger log = LoggerFactory.getLogger(getClass());
diff --git a/apps/linkprops/BUCK b/apps/linkprops/BUCK
deleted file mode 100644
index 324bd22..0000000
--- a/apps/linkprops/BUCK
+++ /dev/null
@@ -1,16 +0,0 @@
-COMPILE_DEPS = [
-    '//lib:CORE_DEPS',
-    '//lib:JACKSON',
-    '//incubator/api:onos-incubator-api'
-]
-
-osgi_jar_with_tests (
-    deps = COMPILE_DEPS,
-)
-
-onos_app (
-  title = 'Link Properties',
-  description = 'Shows more link properties',
-  category = 'Monitoring',
-  url = 'https://onosproject.org/',
-)
diff --git a/apps/linkprops/src/main/java/org/onosproject/linkprops/LinkPropApp.java b/apps/linkprops/src/main/java/org/onosproject/linkprops/LinkPropApp.java
index e3c577c..3e0cd89 100644
--- a/apps/linkprops/src/main/java/org/onosproject/linkprops/LinkPropApp.java
+++ b/apps/linkprops/src/main/java/org/onosproject/linkprops/LinkPropApp.java
@@ -16,11 +16,11 @@
 package org.onosproject.linkprops;
 
 import com.google.common.collect.ImmutableList;
-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.onosproject.ui.UiExtension;
 import org.onosproject.ui.UiExtensionService;
 import org.onosproject.ui.UiMessageHandlerFactory;
@@ -43,7 +43,7 @@
 
     private final Logger log = LoggerFactory.getLogger(getClass());
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected UiExtensionService uiExtensionService;
 
     // List of application views
diff --git a/apps/mappingmanagement/BUCK b/apps/mappingmanagement/BUCK
deleted file mode 100644
index 529962b..0000000
--- a/apps/mappingmanagement/BUCK
+++ /dev/null
@@ -1,14 +0,0 @@
-BUNDLES = [
-    '//apps/mappingmanagement/api:onos-apps-mappingmanagement-api',
-    '//apps/mappingmanagement/cli:onos-apps-mappingmanagement-cli',
-    '//apps/mappingmanagement/mgr:onos-apps-mappingmanagement-mgr',
-    '//apps/mappingmanagement/web:onos-apps-mappingmanagement-web',
-]
-
-onos_app (
-  title = 'Mapping Management',
-  description = 'ONOS mapping management application',
-  category = 'Monitoring',
-  url = 'https://onosproject.org/',
-  included_bundles = BUNDLES,
-)
diff --git a/apps/mappingmanagement/api/BUCK b/apps/mappingmanagement/api/BUCK
deleted file mode 100644
index 0e5b8c5..0000000
--- a/apps/mappingmanagement/api/BUCK
+++ /dev/null
@@ -1,15 +0,0 @@
-COMPILE_DEPS = [
-    '//lib:CORE_DEPS',
-    '//lib:JACKSON',
-    '//lib:KRYO',
-    '//core/store/serializers:onos-core-serializers',
- ]
-
-TEST_DEPS = [
-    '//lib:TEST_ADAPTERS',
-]
-
-osgi_jar_with_tests (
-    deps = COMPILE_DEPS,
-    test_deps = TEST_DEPS,
-)
diff --git a/apps/mappingmanagement/api/src/main/java/org/onosproject/mapping/MappingCodecRegistrator.java b/apps/mappingmanagement/api/src/main/java/org/onosproject/mapping/MappingCodecRegistrator.java
index 1bd5f96..83f9e09 100644
--- a/apps/mappingmanagement/api/src/main/java/org/onosproject/mapping/MappingCodecRegistrator.java
+++ b/apps/mappingmanagement/api/src/main/java/org/onosproject/mapping/MappingCodecRegistrator.java
@@ -15,11 +15,11 @@
  */
 package org.onosproject.mapping;
 
-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.onosproject.codec.CodecService;
 import org.onosproject.mapping.actions.MappingAction;
 import org.onosproject.mapping.addresses.MappingAddress;
@@ -43,7 +43,7 @@
 
     private final Logger log = getLogger(getClass());
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     public CodecService codecService;
 
     @Activate
diff --git a/apps/mappingmanagement/app/app.xml b/apps/mappingmanagement/app/app.xml
deleted file mode 100644
index 78ac759..0000000
--- a/apps/mappingmanagement/app/app.xml
+++ /dev/null
@@ -1,26 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-  ~ Copyright 2017-present Open Networking Foundation
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~     http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License.
-  -->
-<app name="org.onosproject.mapping" origin="ON.Lab" version="${project.version}"
-     category="Monitoring" url="https://onosproject.org/" title="Mapping Management App"
-     featuresRepo="mvn:${project.groupId}/${project.artifactId}/${project.version}/xml/features"
-     features="${project.artifactId}">
-    <description>${project.description}</description>
-    <artifact>mvn:${project.groupId}/onos-apps-mappingmanagement-api/${project.version}</artifact>
-    <artifact>mvn:${project.groupId}/onos-apps-mappingmanagement-mgr/${project.version}</artifact>
-    <artifact>mvn:${project.groupId}/onos-apps-mappingmanagement-web/${project.version}</artifact>
-    <artifact>mvn:${project.groupId}/onos-apps-mappingmanagement-cli/${project.version}</artifact>
-</app>
diff --git a/apps/mappingmanagement/app/features.xml b/apps/mappingmanagement/app/features.xml
deleted file mode 100644
index a3deefd..0000000
--- a/apps/mappingmanagement/app/features.xml
+++ /dev/null
@@ -1,26 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
-<!--
-  ~ Copyright 2017-present Open Networking Foundation
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~     http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License.
-  -->
-<features xmlns="http://karaf.apache.org/xmlns/features/v1.2.0" name="${project.artifactId}-${project.version}">
-    <feature name="${project.artifactId}" version="${project.version}"
-             description="${project.description}">
-        <feature>onos-api</feature>
-        <bundle>mvn:${project.groupId}/onos-apps-mappingmanagement-api/${project.version}</bundle>
-        <bundle>mvn:${project.groupId}/onos-apps-mappingmanagement-mgr/${project.version}</bundle>
-        <bundle>mvn:${project.groupId}/onos-apps-mappingmanagement-web/${project.version}</bundle>
-        <bundle>mvn:${project.groupId}/onos-apps-mappingmanagement-cli/${project.version}</bundle>
-    </feature>
-</features>
diff --git a/apps/mappingmanagement/cli/BUCK b/apps/mappingmanagement/cli/BUCK
deleted file mode 100644
index 7fcbd24..0000000
--- a/apps/mappingmanagement/cli/BUCK
+++ /dev/null
@@ -1,18 +0,0 @@
-COMPILE_DEPS = [
-    '//lib:CORE_DEPS',
-    '//lib:JACKSON',
-    '//lib:org.apache.karaf.shell.console',
-    '//incubator/api:onos-incubator-api',
-    '//cli:onos-cli',
-    '//utils/rest:onlab-rest',
-    '//lib:javax.ws.rs-api',
-    '//utils/osgi:onlab-osgi',
-    '//apps/mappingmanagement/api:onos-apps-mappingmanagement-api',
-    '//core/store/serializers:onos-core-serializers',
-]
-
-
-osgi_jar_with_tests (
-    deps = COMPILE_DEPS,
-    import_packages = '*,org.onosproject.cli.net',
-)
diff --git a/apps/mappingmanagement/cli/BUILD b/apps/mappingmanagement/cli/BUILD
index 2eddaff..e0c5fef 100644
--- a/apps/mappingmanagement/cli/BUILD
+++ b/apps/mappingmanagement/cli/BUILD
@@ -5,6 +5,6 @@
 ]
 
 osgi_jar_with_tests(
-    import_packages = "*,org.onosproject.cli.net",
+    karaf_command_packages = ["org.onosproject.mapping.cli"],
     deps = COMPILE_DEPS,
 )
diff --git a/apps/mappingmanagement/cli/src/main/java/org/onosproject/mapping/cli/MappingStoreTypeCompleter.java b/apps/mappingmanagement/cli/src/main/java/org/onosproject/mapping/cli/MappingStoreTypeCompleter.java
index 552605c..eaa53ff 100644
--- a/apps/mappingmanagement/cli/src/main/java/org/onosproject/mapping/cli/MappingStoreTypeCompleter.java
+++ b/apps/mappingmanagement/cli/src/main/java/org/onosproject/mapping/cli/MappingStoreTypeCompleter.java
@@ -17,6 +17,7 @@
 
 import com.google.common.collect.ImmutableList;
 import org.apache.commons.lang3.StringUtils;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.cli.AbstractChoicesCompleter;
 import org.onosproject.mapping.MappingStore.Type;
 
@@ -26,6 +27,7 @@
 /**
  * Mapping store type completer.
  */
+@Service
 public class MappingStoreTypeCompleter extends AbstractChoicesCompleter {
 
     private static final List<Type> STORE_TYPES =
diff --git a/apps/mappingmanagement/cli/src/main/java/org/onosproject/mapping/cli/MappingsListCommand.java b/apps/mappingmanagement/cli/src/main/java/org/onosproject/mapping/cli/MappingsListCommand.java
index 9bfa7cc..b524159 100644
--- a/apps/mappingmanagement/cli/src/main/java/org/onosproject/mapping/cli/MappingsListCommand.java
+++ b/apps/mappingmanagement/cli/src/main/java/org/onosproject/mapping/cli/MappingsListCommand.java
@@ -19,10 +19,13 @@
 import com.fasterxml.jackson.databind.ObjectMapper;
 import com.fasterxml.jackson.databind.node.ArrayNode;
 import com.fasterxml.jackson.databind.node.ObjectNode;
-import org.apache.karaf.shell.commands.Argument;
-import org.apache.karaf.shell.commands.Command;
-import org.apache.karaf.shell.commands.Option;
+import org.apache.karaf.shell.api.action.Argument;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.Completion;
+import org.apache.karaf.shell.api.action.Option;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.cli.AbstractShellCommand;
+import org.onosproject.cli.net.DeviceIdCompleter;
 import org.onosproject.mapping.MappingEntry;
 import org.onosproject.mapping.MappingKey;
 import org.onosproject.mapping.MappingTreatment;
@@ -40,6 +43,7 @@
 /**
  * A command for querying mapping information.
  */
+@Service
 @Command(scope = "onos", name = "mappings",
         description = "Lists mappings")
 public class MappingsListCommand extends AbstractShellCommand {
@@ -65,10 +69,12 @@
     @Argument(index = 0, name = "type",
             description = "Shows mappings with specified type",
             required = true, multiValued = false)
+    @Completion(MappingStoreTypeCompleter.class)
     private String type = null;
 
     @Argument(index = 1, name = "deviceId", description = "Device identity",
             required = false, multiValued = false)
+    @Completion(DeviceIdCompleter.class)
     private String deviceId = null;
 
     @Option(name = "-s", aliases = "--short",
@@ -81,7 +87,7 @@
     private List<MappingEntry> mappings;
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
 
         MappingStore.Type typeEnum = getTypeEnum(type);
 
diff --git a/apps/mappingmanagement/cli/src/main/resources/OSGI-INF/blueprint/shell-config.xml b/apps/mappingmanagement/cli/src/main/resources/OSGI-INF/blueprint/shell-config.xml
deleted file mode 100644
index bcf44d8..0000000
--- a/apps/mappingmanagement/cli/src/main/resources/OSGI-INF/blueprint/shell-config.xml
+++ /dev/null
@@ -1,34 +0,0 @@
-<!--
-~ Copyright 2017-present Open Networking Foundation
-~
-~ Licensed under the Apache License, Version 2.0 (the "License");
-~ you may not use this file except in compliance with the License.
-~ You may obtain a copy of the License at
-~
-~     http://www.apache.org/licenses/LICENSE-2.0
-~
-~ Unless required by applicable law or agreed to in writing, software
-~ distributed under the License is distributed on an "AS IS" BASIS,
-~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-~ See the License for the specific language governing permissions and
-~ limitations under the License.
--->
-<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0">
-
-    <command-bundle xmlns="http://karaf.apache.org/xmlns/shell/v1.1.0">
-
-        <command>
-            <action class="org.onosproject.mapping.cli.MappingsListCommand"/>
-            <completers>
-                <ref component-id="mappingStoreTypeCompleter"/>
-                <ref component-id="deviceIdCompleter"/>
-            </completers>
-        </command>
-    </command-bundle>
-
-    <bean id="deviceIdCompleter"
-          class="org.onosproject.cli.net.DeviceIdCompleter"/>
-    <bean id="mappingStoreTypeCompleter"
-          class="org.onosproject.mapping.cli.MappingStoreTypeCompleter"/>
-
-</blueprint>
\ No newline at end of file
diff --git a/apps/mappingmanagement/mgr/BUCK b/apps/mappingmanagement/mgr/BUCK
deleted file mode 100644
index 5be1e7d..0000000
--- a/apps/mappingmanagement/mgr/BUCK
+++ /dev/null
@@ -1,16 +0,0 @@
-COMPILE_DEPS = [
-    '//lib:CORE_DEPS',
-    '//lib:KRYO',
-    '//apps/mappingmanagement/api:onos-apps-mappingmanagement-api',
-    '//core/store/serializers:onos-core-serializers',
-]
-
-TEST_DEPS = [
-    '//lib:TEST_ADAPTERS',
-    '//utils/osgi:onlab-osgi-tests',
-]
-
-osgi_jar_with_tests (
-    deps = COMPILE_DEPS,
-    test_deps = TEST_DEPS,
-)
diff --git a/apps/mappingmanagement/mgr/src/main/java/org/onosproject/mapping/impl/DistributedMappingStore.java b/apps/mappingmanagement/mgr/src/main/java/org/onosproject/mapping/impl/DistributedMappingStore.java
index 4fca6e0..45944d9 100644
--- a/apps/mappingmanagement/mgr/src/main/java/org/onosproject/mapping/impl/DistributedMappingStore.java
+++ b/apps/mappingmanagement/mgr/src/main/java/org/onosproject/mapping/impl/DistributedMappingStore.java
@@ -18,12 +18,6 @@
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.Iterables;
 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.onosproject.mapping.DefaultMapping;
 import org.onosproject.mapping.DefaultMappingEntry;
 import org.onosproject.mapping.Mapping;
@@ -47,6 +41,11 @@
 import org.onosproject.store.service.MapEventListener;
 import org.onosproject.store.service.Serializer;
 import org.onosproject.store.service.StorageService;
+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.Map;
@@ -58,8 +57,7 @@
 /**
  * Implementation of a distributed store for managing mapping information.
  */
-@Component(immediate = true)
-@Service
+@Component(immediate = true, service = MappingStore.class)
 public class DistributedMappingStore
         extends AbstractStore<MappingEvent, MappingStoreDelegate>
         implements MappingStore {
@@ -72,10 +70,10 @@
     private Map<MappingId, Mapping> databaseMap;
     private Map<MappingId, Mapping> cacheMap;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected StorageService storageService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected DeviceService deviceService;
 
     private final MapEventListener<MappingId, Mapping> listener = new InternalListener();
diff --git a/apps/mappingmanagement/mgr/src/main/java/org/onosproject/mapping/impl/MappingManager.java b/apps/mappingmanagement/mgr/src/main/java/org/onosproject/mapping/impl/MappingManager.java
index 0bbca3b..133c958 100644
--- a/apps/mappingmanagement/mgr/src/main/java/org/onosproject/mapping/impl/MappingManager.java
+++ b/apps/mappingmanagement/mgr/src/main/java/org/onosproject/mapping/impl/MappingManager.java
@@ -19,12 +19,6 @@
 import com.google.common.collect.Iterables;
 import com.google.common.collect.Lists;
 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.core.ApplicationId;
 import org.onosproject.mapping.MappingAdminService;
 import org.onosproject.mapping.MappingEntry;
@@ -44,6 +38,11 @@
 import org.onosproject.net.device.DeviceService;
 import org.onosproject.net.provider.AbstractListenerProviderRegistry;
 import org.onosproject.net.provider.AbstractProviderService;
+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.List;
@@ -54,8 +53,8 @@
 /**
  * Implementation of mapping management service.
  */
-@Component(immediate = true)
-@Service
+@Component(immediate = true,
+           service = { MappingService.class, MappingAdminService.class, MappingProviderRegistry.class })
 public class MappingManager
         extends AbstractListenerProviderRegistry<MappingEvent, MappingListener,
                                                  MappingProvider, MappingProviderService>
@@ -66,10 +65,10 @@
     private static final String MAPPING_OP_TOPIC = "mapping-ops-ids";
     private final MappingStoreDelegate delegate = new InternalStoreDelegate();
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected MappingStore store;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected DeviceService deviceService;
 
     @Activate
diff --git a/apps/mappingmanagement/mgr/src/main/java/org/onosproject/mapping/impl/SimpleMappingStore.java b/apps/mappingmanagement/mgr/src/main/java/org/onosproject/mapping/impl/SimpleMappingStore.java
index bdb898e..eed42ee 100644
--- a/apps/mappingmanagement/mgr/src/main/java/org/onosproject/mapping/impl/SimpleMappingStore.java
+++ b/apps/mappingmanagement/mgr/src/main/java/org/onosproject/mapping/impl/SimpleMappingStore.java
@@ -18,11 +18,6 @@
 import com.google.common.collect.FluentIterable;
 import com.google.common.collect.Lists;
 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.Modified;
-import org.apache.felix.scr.annotations.Service;
 import org.onosproject.mapping.DefaultMappingEntry;
 import org.onosproject.mapping.Mapping;
 import org.onosproject.mapping.MappingEntry;
@@ -35,6 +30,10 @@
 import org.onosproject.net.DeviceId;
 import org.onosproject.store.AbstractStore;
 import org.osgi.service.component.ComponentContext;
+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.slf4j.Logger;
 
 import java.util.Collections;
@@ -52,8 +51,7 @@
 /**
  * Manages inventory of mappings using trivial in-memory implementation.
  */
-@Component(immediate = true)
-@Service
+@Component(immediate = true, service = MappingStore.class)
 public class SimpleMappingStore
         extends AbstractStore<MappingEvent, MappingStoreDelegate>
         implements MappingStore {
diff --git a/apps/mappingmanagement/web/BUCK b/apps/mappingmanagement/web/BUCK
deleted file mode 100644
index 24eba23..0000000
--- a/apps/mappingmanagement/web/BUCK
+++ /dev/null
@@ -1,23 +0,0 @@
-COMPILE_DEPS = [
-    '//lib:CORE_DEPS',
-    '//lib:JACKSON',
-    '//utils/rest:onlab-rest',
-    '//lib:javax.ws.rs-api',
-    '//apps/mappingmanagement/api:onos-apps-mappingmanagement-api',
-]
-
-TEST_DEPS = [
-    '//lib:TEST_REST',
-    '//web/api:onos-rest-tests',
-    '//lib:minimal-json',
-]
-
-osgi_jar_with_tests (
-    deps = COMPILE_DEPS,
-    test_deps = TEST_DEPS,
-    web_context = '/onos/mappingmanagement',
-    api_title = 'Mapping Management API',
-    api_version = '1.0',
-    api_description = 'REST API for ONOS Mapping Management',
-    api_package = 'org.onosproject.mapping.web.api',
-)
diff --git a/apps/mappingmanagement/web/src/main/java/org/onosproject/mapping/web/gui/MappingsTopoUI.java b/apps/mappingmanagement/web/src/main/java/org/onosproject/mapping/web/gui/MappingsTopoUI.java
index 9de9277..eec5506 100644
--- a/apps/mappingmanagement/web/src/main/java/org/onosproject/mapping/web/gui/MappingsTopoUI.java
+++ b/apps/mappingmanagement/web/src/main/java/org/onosproject/mapping/web/gui/MappingsTopoUI.java
@@ -16,11 +16,11 @@
 package org.onosproject.mapping.web.gui;
 
 import com.google.common.collect.ImmutableList;
-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.onosproject.ui.UiExtension;
 import org.onosproject.ui.UiExtensionService;
 import org.onosproject.ui.UiMessageHandlerFactory;
@@ -44,7 +44,7 @@
 
     private final Logger log = LoggerFactory.getLogger(getClass());
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected UiExtensionService uiExtensionService;
 
     // Factory for UI message handlers
diff --git a/apps/mappingmanagement/web/src/main/java/org/onosproject/mapping/web/gui/MappingsUI.java b/apps/mappingmanagement/web/src/main/java/org/onosproject/mapping/web/gui/MappingsUI.java
index 9f87004..2b05988 100644
--- a/apps/mappingmanagement/web/src/main/java/org/onosproject/mapping/web/gui/MappingsUI.java
+++ b/apps/mappingmanagement/web/src/main/java/org/onosproject/mapping/web/gui/MappingsUI.java
@@ -16,17 +16,16 @@
 package org.onosproject.mapping.web.gui;
 
 import com.google.common.collect.ImmutableList;
-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.ui.UiExtension;
 import org.onosproject.ui.UiExtensionService;
 import org.onosproject.ui.UiMessageHandlerFactory;
 import org.onosproject.ui.UiView;
 import org.onosproject.ui.UiViewHidden;
+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;
 
@@ -35,8 +34,7 @@
 /**
  * Mechanism to stream data to the GUI.
  */
-@Component(immediate = true, enabled = true)
-@Service(value = MappingsUI.class)
+@Component(immediate = true, service = MappingsUI.class)
 public class MappingsUI {
     private static final String MAPPING_ID = "mapping";
     private static final String RES_PATH = "gui";
@@ -44,7 +42,7 @@
 
     private final Logger log = LoggerFactory.getLogger(getClass());
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected UiExtensionService uiExtensionService;
 
     // Factory for UI message handlers
diff --git a/apps/mcast/BUCK b/apps/mcast/BUCK
deleted file mode 100644
index 58f3dd7..0000000
--- a/apps/mcast/BUCK
+++ /dev/null
@@ -1,15 +0,0 @@
-BUNDLES = [
-    '//apps/mcast/cli:onos-apps-mcast-cli',
-    '//apps/mcast/impl:onos-apps-mcast-impl',
-    '//apps/mcast/web:onos-apps-mcast-web',
-    '//apps/mcast/api:onos-apps-mcast-api',
-]
-
-onos_app(
-    title = 'Multicast traffic control',
-    origin = 'ONF',
-    description = 'Provides handling of multicast traffic.',
-    category = 'Traffic Engineering',
-    url = 'https://wiki.onosproject.org/',
-    included_bundles = BUNDLES,
-)
diff --git a/apps/mcast/api/BUCK b/apps/mcast/api/BUCK
deleted file mode 100644
index db499cc..0000000
--- a/apps/mcast/api/BUCK
+++ /dev/null
@@ -1,15 +0,0 @@
-COMPILE_DEPS = [
-    '//lib:CORE_DEPS',
-    '//lib:KRYO',
-    '//core/store/serializers:onos-core-serializers',
-]
-
-TEST_DEPS = [
-    '//lib:TEST_ADAPTERS',
-    '//utils/osgi:onlab-osgi-tests',
-]
-
-osgi_jar_with_tests (
-    deps = COMPILE_DEPS,
-    test_deps = TEST_DEPS,
-)
diff --git a/apps/mcast/app/app.xml b/apps/mcast/app/app.xml
deleted file mode 100644
index ff42633..0000000
--- a/apps/mcast/app/app.xml
+++ /dev/null
@@ -1,26 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-  ~ Copyright 2018-present Open Networking Foundation
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~     http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License.
-  -->
-<app name="org.onosproject.mcast" origin="ONF" version="${project.version}"
-     category="Traffic Engineering" url="" title="Multicast App"
-     featuresRepo="mvn:${project.groupId}/${project.artifactId}/${project.version}/xml/features"
-     features="${project.artifactId}">
-    <description>${project.description}</description>
-    <artifact>mvn:${project.groupId}/onos-apps-mcast-api/${project.version}</artifact>
-    <artifact>mvn:${project.groupId}/onos-apps-mcast-impl/${project.version}</artifact>
-    <artifact>mvn:${project.groupId}/onos-apps-mcast-web/${project.version}</artifact>
-    <artifact>mvn:${project.groupId}/onos-apps-mcast-cli/${project.version}</artifact>
-</app>
diff --git a/apps/mcast/app/features.xml b/apps/mcast/app/features.xml
deleted file mode 100644
index 5f69b9b..0000000
--- a/apps/mcast/app/features.xml
+++ /dev/null
@@ -1,27 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
-<!--
-  ~ Copyright 2018-present Open Networking Foundation
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~     http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License.
-  -->
-<features xmlns="http://karaf.apache.org/xmlns/features/v1.2.0" name="${project.artifactId}-${project.version}">
-    <feature name="${project.artifactId}" version="${project.version}"
-             description="${project.description}">
-        <feature>onos-api</feature>
-        <feature>onos-drivers-default</feature>
-        <bundle>mvn:${project.groupId}/onos-apps-mcast-api/${project.version}</bundle>
-        <bundle>mvn:${project.groupId}/onos-apps-mcast-impl/${project.version}</bundle>
-        <bundle>mvn:${project.groupId}/onos-apps-mcast-web/${project.version}</bundle>
-        <bundle>mvn:${project.groupId}/onos-apps-mcast-cli/${project.version}</bundle>
-    </feature>
-</features>
diff --git a/apps/mcast/cli/BUCK b/apps/mcast/cli/BUCK
deleted file mode 100644
index df9991a..0000000
--- a/apps/mcast/cli/BUCK
+++ /dev/null
@@ -1,16 +0,0 @@
-COMPILE_DEPS = [
-    '//lib:CORE_DEPS',
-    '//lib:org.apache.karaf.shell.console',
-    '//cli:onos-cli',
-    '//utils/rest:onlab-rest',
-    '//lib:javax.ws.rs-api',
-    '//utils/osgi:onlab-osgi',
-    '//core/store/serializers:onos-core-serializers',
-    '//apps/mcast/api:onos-apps-mcast-api'
-]
-
-
-osgi_jar_with_tests (
-    deps = COMPILE_DEPS,
-    import_packages = '*,org.onosproject.cli.net',
-)
diff --git a/apps/mcast/cli/BUILD b/apps/mcast/cli/BUILD
index e692c4c..9a9d616 100644
--- a/apps/mcast/cli/BUILD
+++ b/apps/mcast/cli/BUILD
@@ -4,6 +4,6 @@
 ]
 
 osgi_jar(
-    import_packages = "*,org.onosproject.cli.net",
+    karaf_command_packages = ["org.onosproject.mcast.cli"],
     deps = COMPILE_DEPS,
 )
diff --git a/apps/mcast/cli/src/main/java/org/onosproject/mcast/cli/McastGroupCompleter.java b/apps/mcast/cli/src/main/java/org/onosproject/mcast/cli/McastGroupCompleter.java
index 9c4bddd..cf10dc5 100644
--- a/apps/mcast/cli/src/main/java/org/onosproject/mcast/cli/McastGroupCompleter.java
+++ b/apps/mcast/cli/src/main/java/org/onosproject/mcast/cli/McastGroupCompleter.java
@@ -16,6 +16,7 @@
 
 package org.onosproject.mcast.cli;
 
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onlab.packet.IpAddress;
 import org.onlab.util.Tools;
 import org.onosproject.cli.AbstractChoicesCompleter;
@@ -29,6 +30,7 @@
 /**
  * Mcast group Completer.
  */
+@Service
 public class McastGroupCompleter extends AbstractChoicesCompleter {
 
     @Override
diff --git a/apps/mcast/cli/src/main/java/org/onosproject/mcast/cli/McastHostJoinCommand.java b/apps/mcast/cli/src/main/java/org/onosproject/mcast/cli/McastHostJoinCommand.java
index 7650649..32a72e0 100644
--- a/apps/mcast/cli/src/main/java/org/onosproject/mcast/cli/McastHostJoinCommand.java
+++ b/apps/mcast/cli/src/main/java/org/onosproject/mcast/cli/McastHostJoinCommand.java
@@ -15,10 +15,13 @@
  */
 package org.onosproject.mcast.cli;
 
-import org.apache.karaf.shell.commands.Command;
-import org.apache.karaf.shell.commands.Option;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.Completion;
+import org.apache.karaf.shell.api.action.Option;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onlab.packet.IpAddress;
 import org.onosproject.cli.AbstractShellCommand;
+import org.onosproject.cli.net.HostIdCompleter;
 import org.onosproject.mcast.api.McastRoute;
 import org.onosproject.mcast.api.MulticastRouteService;
 import org.onosproject.net.HostId;
@@ -26,6 +29,7 @@
 /**
  * Installs a source, multicast group flow.
  */
+@Service
 @Command(scope = "onos", name = "mcast-host-join",
         description = "Installs a source, multicast group flow")
 public class McastHostJoinCommand extends AbstractShellCommand {
@@ -44,12 +48,14 @@
             description = "IP Address of the multicast group",
             valueToShowInHelp = "224.0.0.0",
             required = true, multiValued = false)
+    @Completion(McastGroupCompleter.class)
     String gAddr = null;
 
     @Option(name = "-srcs", aliases = "--sources",
             description = "Host sink format: MAC/VLAN",
             valueToShowInHelp = "00:00:00:00:00:00/None",
             multiValued = true)
+    @Completion(HostIdCompleter.class)
     String[] sources = null;
 
     @Option(name = "-sinks",
@@ -57,10 +63,11 @@
             description = "Host sink format: MAC/VLAN",
             valueToShowInHelp = "00:00:00:00:00:00/None",
             multiValued = true)
+    @Completion(HostIdCompleter.class)
     String[] sinks = null;
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         MulticastRouteService mcastRouteManager = get(MulticastRouteService.class);
 
         IpAddress sAddrIp = null;
diff --git a/apps/mcast/cli/src/main/java/org/onosproject/mcast/cli/McastRoutesListCommand.java b/apps/mcast/cli/src/main/java/org/onosproject/mcast/cli/McastRoutesListCommand.java
index 8e43911..3a1faa5 100644
--- a/apps/mcast/cli/src/main/java/org/onosproject/mcast/cli/McastRoutesListCommand.java
+++ b/apps/mcast/cli/src/main/java/org/onosproject/mcast/cli/McastRoutesListCommand.java
@@ -15,7 +15,8 @@
  */
 package org.onosproject.mcast.cli;
 
-import org.apache.karaf.shell.commands.Command;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onlab.packet.IpAddress;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.mcast.api.McastRoute;
@@ -30,6 +31,7 @@
 /**
  * Displays the source, multicast group flows entries.
  */
+@Service
 @Command(scope = "onos", name = "mcast-host-routes",
         description = "Lists routes in the mcast route store")
 public class McastRoutesListCommand extends AbstractShellCommand {
@@ -51,7 +53,7 @@
     private static final String SINKS = "Sinks";
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         // Get the service
         MulticastRouteService mcastService = get(MulticastRouteService.class);
         // Get the routes
diff --git a/apps/mcast/cli/src/main/java/org/onosproject/mcast/cli/McastShowHostCommand.java b/apps/mcast/cli/src/main/java/org/onosproject/mcast/cli/McastShowHostCommand.java
index dbf2ca6..7ab5da0 100644
--- a/apps/mcast/cli/src/main/java/org/onosproject/mcast/cli/McastShowHostCommand.java
+++ b/apps/mcast/cli/src/main/java/org/onosproject/mcast/cli/McastShowHostCommand.java
@@ -15,8 +15,10 @@
  */
 package org.onosproject.mcast.cli;
 
-import org.apache.karaf.shell.commands.Command;
-import org.apache.karaf.shell.commands.Option;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.Completion;
+import org.apache.karaf.shell.api.action.Option;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onlab.packet.IpAddress;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.mcast.api.McastRoute;
@@ -34,6 +36,7 @@
 /**
  * Displays the source, multicast group flows entries.
  */
+@Service
 @Command(scope = "onos", name = "mcast-host-show", description = "Displays the source, multicast group flows")
 public class McastShowHostCommand extends AbstractShellCommand {
 
@@ -44,10 +47,11 @@
             description = "IP Address of the multicast group",
             valueToShowInHelp = "224.0.0.0",
             required = false, multiValued = false)
+    @Completion(McastGroupCompleter.class)
     String gAddr = null;
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         // Get the service
         MulticastRouteService mcastService = get(MulticastRouteService.class);
         // Get the routes
diff --git a/apps/mcast/cli/src/main/java/org/onosproject/mcast/cli/McastSinkDeleteCommand.java b/apps/mcast/cli/src/main/java/org/onosproject/mcast/cli/McastSinkDeleteCommand.java
index 524fcb2..9c31111 100644
--- a/apps/mcast/cli/src/main/java/org/onosproject/mcast/cli/McastSinkDeleteCommand.java
+++ b/apps/mcast/cli/src/main/java/org/onosproject/mcast/cli/McastSinkDeleteCommand.java
@@ -15,10 +15,13 @@
  */
 package org.onosproject.mcast.cli;
 
-import org.apache.karaf.shell.commands.Command;
-import org.apache.karaf.shell.commands.Option;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.Completion;
+import org.apache.karaf.shell.api.action.Option;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onlab.packet.IpAddress;
 import org.onosproject.cli.AbstractShellCommand;
+import org.onosproject.cli.net.HostIdCompleter;
 import org.onosproject.mcast.api.McastRoute;
 import org.onosproject.mcast.api.MulticastRouteService;
 import org.onosproject.net.HostId;
@@ -26,6 +29,7 @@
 /**
  * Deletes a multicast route.
  */
+@Service
 @Command(scope = "onos", name = "mcast-sink-delete",
         description = "Delete a sink from multicast route flow. If no sin is specified removes the whole route.")
 public class McastSinkDeleteCommand extends AbstractShellCommand {
@@ -48,15 +52,17 @@
             description = "IP Address of the multicast group",
             valueToShowInHelp = "224.0.0.0",
             required = true, multiValued = false)
+    @Completion(McastGroupCompleter.class)
     String gAddr = null;
 
     @Option(name = "-s", aliases = "--sinks",
             description = "Host sink format: MAC/VLAN",
             valueToShowInHelp = "00:00:00:00:00:00/None")
+    @Completion(HostIdCompleter.class)
     String host = null;
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         MulticastRouteService mcastRouteManager = get(MulticastRouteService.class);
         // Clear all routes
         if ("*".equals(sAddr) && "*".equals(gAddr)) {
diff --git a/apps/mcast/cli/src/main/java/org/onosproject/mcast/cli/McastSourceDeleteCommand.java b/apps/mcast/cli/src/main/java/org/onosproject/mcast/cli/McastSourceDeleteCommand.java
index d1f646f..757829c 100644
--- a/apps/mcast/cli/src/main/java/org/onosproject/mcast/cli/McastSourceDeleteCommand.java
+++ b/apps/mcast/cli/src/main/java/org/onosproject/mcast/cli/McastSourceDeleteCommand.java
@@ -15,10 +15,13 @@
  */
 package org.onosproject.mcast.cli;
 
-import org.apache.karaf.shell.commands.Command;
-import org.apache.karaf.shell.commands.Option;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.Completion;
+import org.apache.karaf.shell.api.action.Option;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onlab.packet.IpAddress;
 import org.onosproject.cli.AbstractShellCommand;
+import org.onosproject.cli.net.HostIdCompleter;
 import org.onosproject.mcast.api.McastRoute;
 import org.onosproject.mcast.api.MulticastRouteService;
 import org.onosproject.net.HostId;
@@ -26,6 +29,7 @@
 /**
  * Deletes a multicast route.
  */
+@Service
 @Command(scope = "onos", name = "mcast-source-delete",
         description = "Delete a multicast route flow")
 public class McastSourceDeleteCommand extends AbstractShellCommand {
@@ -48,17 +52,19 @@
             description = "IP Address of the multicast group",
             valueToShowInHelp = "224.0.0.0",
             required = true, multiValued = false)
+    @Completion(McastGroupCompleter.class)
     String gAddr = null;
 
     @Option(name = "-src", aliases = "--connectPoint",
             description = "Host sink format: MAC/VLAN",
             valueToShowInHelp = "00:00:00:00:00:00/None",
             multiValued = true)
+    @Completion(HostIdCompleter.class)
     String[] sourceList = null;
 
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         MulticastRouteService mcastRouteManager = get(MulticastRouteService.class);
         // Clear all routes
         if ("*".equals(sAddr) && "*".equals(gAddr)) {
diff --git a/apps/mcast/cli/src/main/resources/OSGI-INF/blueprint/shell-config.xml b/apps/mcast/cli/src/main/resources/OSGI-INF/blueprint/shell-config.xml
deleted file mode 100644
index 7bf0fcb..0000000
--- a/apps/mcast/cli/src/main/resources/OSGI-INF/blueprint/shell-config.xml
+++ /dev/null
@@ -1,59 +0,0 @@
-<!--
-~ Copyright 2018-present Open Networking Foundation
-~
-~ Licensed under the Apache License, Version 2.0 (the "License");
-~ you may not use this file except in compliance with the License.
-~ You may obtain a copy of the License at
-~
-~     http://www.apache.org/licenses/LICENSE-2.0
-~
-~ Unless required by applicable law or agreed to in writing, software
-~ distributed under the License is distributed on an "AS IS" BASIS,
-~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-~ See the License for the specific language governing permissions and
-~ limitations under the License.
--->
-<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0">
-
-    <command-bundle xmlns="http://karaf.apache.org/xmlns/shell/v1.1.0">
-
-        <command>
-            <action class="org.onosproject.mcast.cli.McastHostJoinCommand"/>
-            <optional-completers>
-                <entry key="-gAddr" value-ref="mcastGroupCompleter"/>
-                <entry key="-srcs" value-ref="hostIdCompleter"/>
-                <entry key="-sinks" value-ref="hostIdCompleter"/>
-            </optional-completers>
-        </command>
-        <command>
-            <action class="org.onosproject.mcast.cli.McastShowHostCommand"/>
-            <optional-completers>
-                <entry key="-gAddr" value-ref="mcastGroupCompleter"/>
-            </optional-completers>
-        </command>
-        <command>
-            <action class="org.onosproject.mcast.cli.McastSinkDeleteCommand"/>
-            <optional-completers>
-                <entry key="-gAddr" value-ref="mcastGroupCompleter"/>
-                <entry key="-cps" value-ref="connectpointCompleter"/>
-                <entry key="-s" value-ref="hostIdCompleter"/>
-            </optional-completers>
-        </command>
-        <command>
-            <action class="org.onosproject.mcast.cli.McastSourceDeleteCommand"/>
-            <optional-completers>
-                <entry key="-gAddr" value-ref="mcastGroupCompleter"/>
-                <entry key="-src" value-ref="hostIdCompleter"/>
-            </optional-completers>
-        </command>
-        <command>
-            <action class="org.onosproject.mcast.cli.McastRoutesListCommand"/>
-        </command>
-    </command-bundle>
-
-    <bean id="hostIdCompleter" class="org.onosproject.cli.net.HostIdCompleter"/>
-    <bean id="connectpointCompleter" class="org.onosproject.cli.net.ConnectPointCompleter"/>
-    <bean id="mcastGroupCompleter" class="org.onosproject.mcast.cli.McastGroupCompleter"/>
-
-
-</blueprint>
diff --git a/apps/mcast/impl/BUCK b/apps/mcast/impl/BUCK
deleted file mode 100644
index c3d67ff..0000000
--- a/apps/mcast/impl/BUCK
+++ /dev/null
@@ -1,16 +0,0 @@
-COMPILE_DEPS = [
-    '//lib:CORE_DEPS',
-    '//lib:KRYO',
-    '//core/store/serializers:onos-core-serializers',
-    '//apps/mcast/api:onos-apps-mcast-api'
-]
-
-TEST_DEPS = [
-    '//lib:TEST_ADAPTERS',
-    '//utils/osgi:onlab-osgi-tests',
-]
-
-osgi_jar_with_tests(
-    deps = COMPILE_DEPS,
-    test_deps = TEST_DEPS,
-)
diff --git a/apps/mcast/impl/src/main/java/org/onosproject/mcast/impl/DistributedMcastRoutesStore.java b/apps/mcast/impl/src/main/java/org/onosproject/mcast/impl/DistributedMcastRoutesStore.java
index c9baac3..e3526c4 100644
--- a/apps/mcast/impl/src/main/java/org/onosproject/mcast/impl/DistributedMcastRoutesStore.java
+++ b/apps/mcast/impl/src/main/java/org/onosproject/mcast/impl/DistributedMcastRoutesStore.java
@@ -17,12 +17,6 @@
 
 
 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.apache.felix.scr.annotations.Service;
 import org.onlab.util.KryoNamespace;
 import org.onosproject.mcast.api.McastEvent;
 import org.onosproject.mcast.api.McastRoute;
@@ -39,6 +33,11 @@
 import org.onosproject.store.service.Serializer;
 import org.onosproject.store.service.StorageService;
 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.util.Collection;
@@ -56,8 +55,7 @@
  * New distributed mcast route store implementation. Routes are stored consistently
  * across the cluster.
  */
-@Component(immediate = true)
-@Service
+@Component(immediate = true, service = McastStore.class)
 public class DistributedMcastRoutesStore
         extends AbstractStore<McastEvent, McastStoreDelegate>
         implements McastStore {
@@ -65,7 +63,7 @@
     private static final String MCASTRIB = "onos-mcast-route-table";
     private Logger log = getLogger(getClass());
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected StorageService storageService;
 
     private Map<McastRoute, McastRouteData> mcastRoutes;
diff --git a/apps/mcast/impl/src/main/java/org/onosproject/mcast/impl/MulticastRouteManager.java b/apps/mcast/impl/src/main/java/org/onosproject/mcast/impl/MulticastRouteManager.java
index bc848d1..a004c8d 100644
--- a/apps/mcast/impl/src/main/java/org/onosproject/mcast/impl/MulticastRouteManager.java
+++ b/apps/mcast/impl/src/main/java/org/onosproject/mcast/impl/MulticastRouteManager.java
@@ -18,12 +18,6 @@
 import com.google.common.base.Objects;
 import com.google.common.collect.ImmutableSet;
 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.onlab.packet.IpAddress;
 import org.onosproject.event.AbstractListenerManager;
 import org.onosproject.mcast.api.McastEvent;
@@ -40,6 +34,11 @@
 import org.onosproject.net.host.HostEvent;
 import org.onosproject.net.host.HostListener;
 import org.onosproject.net.host.HostService;
+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.HashSet;
@@ -56,8 +55,7 @@
 /**
  * An implementation of a multicast route table.
  */
-@Component(immediate = true)
-@Service
+@Component(immediate = true, service = MulticastRouteService.class)
 public class MulticastRouteManager
         extends AbstractListenerManager<McastEvent, McastListener>
         implements MulticastRouteService {
@@ -67,10 +65,10 @@
 
     private final McastStoreDelegate delegate = new InternalMcastStoreDelegate();
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected McastStore store;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected HostService hostService;
 
     private HostListener hostListener = new InternalHostListener();
diff --git a/apps/mcast/web/BUCK b/apps/mcast/web/BUCK
deleted file mode 100644
index 7fdc057..0000000
--- a/apps/mcast/web/BUCK
+++ /dev/null
@@ -1,25 +0,0 @@
-COMPILE_DEPS = [
-    '//lib:CORE_DEPS',
-    '//lib:JACKSON',
-    '//utils/rest:onlab-rest',
-    '//lib:javax.ws.rs-api',
-    '//apps/mcast/api:onos-apps-mcast-api'
-]
-
-TEST_DEPS = [
-    '//lib:TEST_ADAPTERS',
-    '//lib:jersey-test-framework-core',
-    '//lib:jersey-test-framework-jetty',
-    '//utils/osgi:onlab-osgi-tests',
-    '//web/api:onos-rest-tests',
-]
-
-osgi_jar_with_tests (
-    deps = COMPILE_DEPS,
-    test_deps = TEST_DEPS,
-    web_context = '/onos/mcast',
-    api_title = 'Multicast API',
-    api_version = '1.0',
-    api_description = 'REST API for Multicast',
-    api_package = 'org.onosproject.mcast.web',
-)
diff --git a/apps/mcast/web/src/main/java/org/onosproject/mcast/web/McastServiceCodecRegistrator.java b/apps/mcast/web/src/main/java/org/onosproject/mcast/web/McastServiceCodecRegistrator.java
index 90ba170..ab0c990 100644
--- a/apps/mcast/web/src/main/java/org/onosproject/mcast/web/McastServiceCodecRegistrator.java
+++ b/apps/mcast/web/src/main/java/org/onosproject/mcast/web/McastServiceCodecRegistrator.java
@@ -15,11 +15,11 @@
  */
 package org.onosproject.mcast.web;
 
-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.onosproject.codec.CodecService;
 import org.onosproject.mcast.api.McastRoute;
 import org.slf4j.Logger;
@@ -34,7 +34,7 @@
 
     private static Logger log = LoggerFactory.getLogger(McastServiceCodecRegistrator.class);
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected CodecService codecService;
 
     @Activate
diff --git a/apps/metrics/BUCK b/apps/metrics/BUCK
deleted file mode 100644
index 81ee918..0000000
--- a/apps/metrics/BUCK
+++ /dev/null
@@ -1,20 +0,0 @@
-COMPILE_DEPS = [
-    '//lib:CORE_DEPS',
-    '//lib:JACKSON',
-    '//lib:METRICS',
-    '//lib:org.apache.karaf.shell.console',
-    '//lib:javax.ws.rs-api',
-    '//utils/rest:onlab-rest',
-    '//cli:onos-cli',
-]
-
-osgi_jar_with_tests (
-    deps = COMPILE_DEPS,
-)
-
-onos_app (
-    title = 'Topology &amp; Intent Metrics',
-    category = 'Monitoring',
-    url = 'http://onosproject.org',
-    description = 'Monitoring of various metrics related to topology mutation and intent programming.',
-)
diff --git a/apps/metrics/BUILD b/apps/metrics/BUILD
index 443c1d4..302e06a 100644
--- a/apps/metrics/BUILD
+++ b/apps/metrics/BUILD
@@ -1,6 +1,10 @@
 COMPILE_DEPS = CORE_DEPS + JACKSON + METRICS + CLI + REST
 
 osgi_jar_with_tests(
+    karaf_command_packages = [
+        "org.onosproject.metrics.intent.cli",
+        "org.onosproject.metrics.topology.cli",
+    ],
     deps = COMPILE_DEPS,
 )
 
diff --git a/apps/metrics/src/main/java/org/onosproject/metrics/intent/IntentMetrics.java b/apps/metrics/src/main/java/org/onosproject/metrics/intent/IntentMetrics.java
index b1d9188..8fa618a 100644
--- a/apps/metrics/src/main/java/org/onosproject/metrics/intent/IntentMetrics.java
+++ b/apps/metrics/src/main/java/org/onosproject/metrics/intent/IntentMetrics.java
@@ -15,18 +15,7 @@
  */
 package org.onosproject.metrics.intent;
 
-import static org.slf4j.LoggerFactory.getLogger;
-
-import java.util.LinkedList;
-import java.util.List;
-
 import com.google.common.collect.ImmutableList;
-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.metrics.EventMetric;
 import org.onlab.metrics.MetricsService;
 import org.onosproject.core.ApplicationId;
@@ -34,24 +23,33 @@
 import org.onosproject.net.intent.IntentEvent;
 import org.onosproject.net.intent.IntentListener;
 import org.onosproject.net.intent.IntentService;
+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.LinkedList;
+import java.util.List;
+
+import static org.slf4j.LoggerFactory.getLogger;
+
 /**
  * ONOS Intent Metrics Application that collects intent-related metrics.
  */
-@Component(immediate = true)
-@Service
+@Component(immediate = true, service = { IntentMetricsService.class, IntentListener.class })
 public class IntentMetrics implements IntentMetricsService,
                                       IntentListener {
     private static final Logger log = getLogger(IntentMetrics.class);
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected CoreService coreService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected IntentService intentService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected MetricsService metricsService;
 
     private ApplicationId appId;
diff --git a/apps/metrics/src/main/java/org/onosproject/metrics/intent/cli/IntentEventsListCommand.java b/apps/metrics/src/main/java/org/onosproject/metrics/intent/cli/IntentEventsListCommand.java
index d276785..4a441dd 100644
--- a/apps/metrics/src/main/java/org/onosproject/metrics/intent/cli/IntentEventsListCommand.java
+++ b/apps/metrics/src/main/java/org/onosproject/metrics/intent/cli/IntentEventsListCommand.java
@@ -21,7 +21,8 @@
 import com.fasterxml.jackson.databind.ObjectMapper;
 import com.fasterxml.jackson.databind.node.ArrayNode;
 import com.fasterxml.jackson.databind.node.ObjectNode;
-import org.apache.karaf.shell.commands.Command;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.metrics.intent.IntentMetricsService;
 import org.onosproject.net.intent.IntentEvent;
@@ -29,6 +30,7 @@
 /**
  * Command to show the list of last intent events.
  */
+@Service
 @Command(scope = "onos", name = "intents-events",
          description = "Lists the last intent events")
 public class IntentEventsListCommand extends AbstractShellCommand {
@@ -36,7 +38,7 @@
     private static final String FORMAT_EVENT = "Event=%s";
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         IntentMetricsService service = get(IntentMetricsService.class);
 
         if (outputJson()) {
diff --git a/apps/metrics/src/main/java/org/onosproject/metrics/intent/cli/IntentEventsMetricsCommand.java b/apps/metrics/src/main/java/org/onosproject/metrics/intent/cli/IntentEventsMetricsCommand.java
index 05cd181..9fa8fe0 100644
--- a/apps/metrics/src/main/java/org/onosproject/metrics/intent/cli/IntentEventsMetricsCommand.java
+++ b/apps/metrics/src/main/java/org/onosproject/metrics/intent/cli/IntentEventsMetricsCommand.java
@@ -25,7 +25,8 @@
 import com.fasterxml.jackson.databind.JsonNode;
 import com.fasterxml.jackson.databind.ObjectMapper;
 import com.fasterxml.jackson.databind.node.ObjectNode;
-import org.apache.karaf.shell.commands.Command;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onlab.metrics.EventMetric;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.metrics.intent.IntentMetricsService;
@@ -33,6 +34,7 @@
 /**
  * Command to show the intent events metrics.
  */
+@Service
 @Command(scope = "onos", name = "intents-events-metrics",
          description = "Lists intent events metrics")
 public class IntentEventsMetricsCommand extends AbstractShellCommand {
@@ -43,7 +45,7 @@
         "Intent %s Events count=%d rate(events/sec) mean=%f m1=%f m5=%f m15=%f";
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         IntentMetricsService service = get(IntentMetricsService.class);
 
         if (outputJson()) {
diff --git a/apps/metrics/src/main/java/org/onosproject/metrics/topology/TopologyMetrics.java b/apps/metrics/src/main/java/org/onosproject/metrics/topology/TopologyMetrics.java
index 1850ed8..77d8d5e 100644
--- a/apps/metrics/src/main/java/org/onosproject/metrics/topology/TopologyMetrics.java
+++ b/apps/metrics/src/main/java/org/onosproject/metrics/topology/TopologyMetrics.java
@@ -15,18 +15,7 @@
  */
 package org.onosproject.metrics.topology;
 
-import static org.slf4j.LoggerFactory.getLogger;
-
-import java.util.LinkedList;
-import java.util.List;
-
 import com.google.common.collect.ImmutableList;
-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.metrics.EventMetric;
 import org.onlab.metrics.MetricsService;
 import org.onosproject.core.ApplicationId;
@@ -44,32 +33,41 @@
 import org.onosproject.net.topology.TopologyEvent;
 import org.onosproject.net.topology.TopologyListener;
 import org.onosproject.net.topology.TopologyService;
+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.LinkedList;
+import java.util.List;
+
+import static org.slf4j.LoggerFactory.getLogger;
+
 /**
  * ONOS Topology Metrics Application that collects topology-related metrics.
  */
-@Component(immediate = true)
-@Service
+@Component(immediate = true, service = TopologyMetricsService.class)
 public class TopologyMetrics implements TopologyMetricsService {
     private static final Logger log = getLogger(TopologyMetrics.class);
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected CoreService coreService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected DeviceService deviceService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected HostService hostService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected LinkService linkService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected MetricsService metricsService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected TopologyService topologyService;
 
     private ApplicationId appId;
diff --git a/apps/metrics/src/main/java/org/onosproject/metrics/topology/cli/TopologyEventsListCommand.java b/apps/metrics/src/main/java/org/onosproject/metrics/topology/cli/TopologyEventsListCommand.java
index 7ddc463..2fdb5eb 100644
--- a/apps/metrics/src/main/java/org/onosproject/metrics/topology/cli/TopologyEventsListCommand.java
+++ b/apps/metrics/src/main/java/org/onosproject/metrics/topology/cli/TopologyEventsListCommand.java
@@ -21,7 +21,8 @@
 import com.fasterxml.jackson.databind.ObjectMapper;
 import com.fasterxml.jackson.databind.node.ArrayNode;
 import com.fasterxml.jackson.databind.node.ObjectNode;
-import org.apache.karaf.shell.commands.Command;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.event.Event;
 import org.onosproject.metrics.topology.TopologyMetricsService;
@@ -30,6 +31,7 @@
 /**
  * Command to show the list of last topology events.
  */
+@Service
 @Command(scope = "onos", name = "topology-events",
          description = "Lists the last topology events")
 public class TopologyEventsListCommand extends AbstractShellCommand {
@@ -38,7 +40,7 @@
     private static final String FORMAT_REASON = "    Reason=%s";
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         TopologyMetricsService service = get(TopologyMetricsService.class);
 
         if (outputJson()) {
diff --git a/apps/metrics/src/main/java/org/onosproject/metrics/topology/cli/TopologyEventsMetricsCommand.java b/apps/metrics/src/main/java/org/onosproject/metrics/topology/cli/TopologyEventsMetricsCommand.java
index c24d37c..39e0b7f 100644
--- a/apps/metrics/src/main/java/org/onosproject/metrics/topology/cli/TopologyEventsMetricsCommand.java
+++ b/apps/metrics/src/main/java/org/onosproject/metrics/topology/cli/TopologyEventsMetricsCommand.java
@@ -25,7 +25,8 @@
 import com.fasterxml.jackson.databind.JsonNode;
 import com.fasterxml.jackson.databind.ObjectMapper;
 import com.fasterxml.jackson.databind.node.ObjectNode;
-import org.apache.karaf.shell.commands.Command;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onlab.metrics.EventMetric;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.metrics.topology.TopologyMetricsService;
@@ -33,6 +34,7 @@
 /**
  * Command to show the topology events metrics.
  */
+@Service
 @Command(scope = "onos", name = "topology-events-metrics",
          description = "Lists topology events metrics")
 public class TopologyEventsMetricsCommand extends AbstractShellCommand {
@@ -43,7 +45,7 @@
         "Topology %s Events count=%d rate(events/sec) mean=%f m1=%f m5=%f m15=%f";
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         TopologyMetricsService service = get(TopologyMetricsService.class);
 
         if (outputJson()) {
diff --git a/apps/metrics/src/main/resources/OSGI-INF/blueprint/shell-config.xml b/apps/metrics/src/main/resources/OSGI-INF/blueprint/shell-config.xml
deleted file mode 100644
index 0b03a74..0000000
--- a/apps/metrics/src/main/resources/OSGI-INF/blueprint/shell-config.xml
+++ /dev/null
@@ -1,32 +0,0 @@
-<!--
-  ~ Copyright 2015-present Open Networking Foundation
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~     http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License.
-  -->
-<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0">
-    <command-bundle xmlns="http://karaf.apache.org/xmlns/shell/v1.1.0">
-        <command>
-            <action class="org.onosproject.metrics.intent.cli.IntentEventsListCommand"/>
-        </command>
-        <command>
-            <action class="org.onosproject.metrics.intent.cli.IntentEventsMetricsCommand"/>
-        </command>
-
-        <command>
-            <action class="org.onosproject.metrics.topology.cli.TopologyEventsListCommand"/>
-        </command>
-        <command>
-            <action class="org.onosproject.metrics.topology.cli.TopologyEventsMetricsCommand"/>
-        </command>
-    </command-bundle>
-</blueprint>
diff --git a/apps/mfwd/BUCK b/apps/mfwd/BUCK
deleted file mode 100644
index a2ed151..0000000
--- a/apps/mfwd/BUCK
+++ /dev/null
@@ -1,14 +0,0 @@
-COMPILE_DEPS = [
-    '//lib:CORE_DEPS',
-]
-
-osgi_jar_with_tests (
-    deps = COMPILE_DEPS,
-)
-
-onos_app (
-    title = 'Multicast Forwarding',
-    category = 'Traffic Engineering',
-    url = 'http://onosproject.org',
-    description = 'Multicast forwarding application.',
-)
diff --git a/apps/mfwd/src/main/java/org/onosproject/mfwd/impl/McastForwarding.java b/apps/mfwd/src/main/java/org/onosproject/mfwd/impl/McastForwarding.java
index 811c05d..d61a5e6 100644
--- a/apps/mfwd/src/main/java/org/onosproject/mfwd/impl/McastForwarding.java
+++ b/apps/mfwd/src/main/java/org/onosproject/mfwd/impl/McastForwarding.java
@@ -15,11 +15,11 @@
  */
 package org.onosproject.mfwd.impl;
 
-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.Ethernet;
 import org.onlab.packet.IPv4;
 import org.onlab.packet.Ip4Address;
@@ -68,16 +68,16 @@
 
     private final Logger log = getLogger(getClass());
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected PacketService packetService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected CoreService coreService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     private IntentService intentService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected MulticastRouteService mcastRouteManager;
 
     protected McastIntentManager mcastIntentManager;
diff --git a/apps/mlb/BUCK b/apps/mlb/BUCK
deleted file mode 100644
index eec3405..0000000
--- a/apps/mlb/BUCK
+++ /dev/null
@@ -1,16 +0,0 @@
-COMPILE_DEPS = [
-    '//lib:CORE_DEPS',
-]
-
-osgi_jar_with_tests (
-    deps = COMPILE_DEPS,
-)
-
-onos_app (
-    title = 'Mastership Load Balancer',
-    category = 'Utility',
-    url = 'http://onosproject.org',
-    description = 'Monitors distribution of mastership of network devices between the ONOS cluster ' +
-        'nodes and periodically re-assigns the mastership to achieve balanced distribution when ' +
-        'necessary and possible.',
-)
diff --git a/apps/mlb/src/main/java/org/onosproject/mlb/MastershipLoadBalancer.java b/apps/mlb/src/main/java/org/onosproject/mlb/MastershipLoadBalancer.java
index 3bd3cef..f9ed0da 100644
--- a/apps/mlb/src/main/java/org/onosproject/mlb/MastershipLoadBalancer.java
+++ b/apps/mlb/src/main/java/org/onosproject/mlb/MastershipLoadBalancer.java
@@ -16,13 +16,6 @@
 
 package org.onosproject.mlb;
 
-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.onlab.util.Tools;
 import org.onosproject.cfg.ComponentConfigService;
 import org.onosproject.cluster.ClusterService;
@@ -34,10 +27,16 @@
 import org.onosproject.mastership.MastershipEvent;
 import org.onosproject.mastership.MastershipListener;
 import org.onosproject.mastership.MastershipService;
-import org.osgi.service.component.ComponentContext;
 import org.onosproject.net.region.RegionEvent;
 import org.onosproject.net.region.RegionListener;
 import org.onosproject.net.region.RegionService;
+import org.osgi.service.component.ComponentContext;
+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.Dictionary;
@@ -49,6 +48,8 @@
 import java.util.concurrent.atomic.AtomicReference;
 
 import static org.onlab.util.Tools.groupedThreads;
+import static org.onosproject.mlb.OsgiPropertyConstants.SCHEDULE_PERIOD;
+import static org.onosproject.mlb.OsgiPropertyConstants.SCHEDULE_PERIOD_DEFAULT;
 import static org.slf4j.LoggerFactory.getLogger;
 
 /**
@@ -57,15 +58,18 @@
  * thread executor that must only have one thread due to issues that can occur is multiple balancing events occur in
  * parallel.
  */
-@Component(immediate = true)
+@Component(
+    immediate = true,
+    property = {
+        SCHEDULE_PERIOD + ":Integer=" + SCHEDULE_PERIOD_DEFAULT
+    }
+)
 public class MastershipLoadBalancer {
 
     private final Logger log = getLogger(getClass());
 
-    private static final int DEFAULT_SCHEDULE_PERIOD = 30;
-    @Property(name = "schedulePeriod", intValue = DEFAULT_SCHEDULE_PERIOD,
-            label = "Period to schedule balancing the mastership to be shared as evenly as by all online instances.")
-    private int schedulePeriod = DEFAULT_SCHEDULE_PERIOD;
+    /** Period to schedule balancing the mastership to be shared as evenly as by all online instances. */
+    private int schedulePeriod = SCHEDULE_PERIOD_DEFAULT;
 
     private static final String REBALANCE_MASTERSHIP = "rebalance/mastership";
 
@@ -75,22 +79,22 @@
 
     private AtomicReference<Future> nextTask = new AtomicReference<>();
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected MastershipService mastershipService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected MastershipAdminService mastershipAdminService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected LeadershipService leadershipService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected RegionService regionService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected ClusterService clusterService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected ComponentConfigService cfgService;
 
     private InnerLeadershipListener leadershipListener = new InnerLeadershipListener();
@@ -201,11 +205,11 @@
         Dictionary<?, ?> properties = context.getProperties();
 
         Integer newSchedulePeriod = Tools.getIntegerProperty(properties,
-                                                             "schedulePeriod");
+                                                             SCHEDULE_PERIOD);
         if (newSchedulePeriod == null) {
-            schedulePeriod = DEFAULT_SCHEDULE_PERIOD;
+            schedulePeriod = SCHEDULE_PERIOD_DEFAULT;
             log.info("Schedule period is not configured, default value is {}",
-                     DEFAULT_SCHEDULE_PERIOD);
+                     SCHEDULE_PERIOD_DEFAULT);
         } else {
             schedulePeriod = newSchedulePeriod;
             log.info("Configured. Schedule period is configured to {}", schedulePeriod);
diff --git a/apps/mlb/src/main/java/org/onosproject/mlb/OsgiPropertyConstants.java b/apps/mlb/src/main/java/org/onosproject/mlb/OsgiPropertyConstants.java
new file mode 100644
index 0000000..9c7aa12
--- /dev/null
+++ b/apps/mlb/src/main/java/org/onosproject/mlb/OsgiPropertyConstants.java
@@ -0,0 +1,25 @@
+/*
+ * Copyright 2018-present Open Networking Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.onosproject.mlb;
+
+public final class OsgiPropertyConstants {
+    private OsgiPropertyConstants() {
+    }
+
+    static final String SCHEDULE_PERIOD = "schedulePeriod";
+    static final int SCHEDULE_PERIOD_DEFAULT = 30;
+}
diff --git a/apps/mobility/BUCK b/apps/mobility/BUCK
deleted file mode 100644
index 38b0228..0000000
--- a/apps/mobility/BUCK
+++ /dev/null
@@ -1,14 +0,0 @@
-COMPILE_DEPS = [
-    '//lib:CORE_DEPS',
-]
-
-osgi_jar_with_tests (
-    deps = COMPILE_DEPS,
-)
-
-onos_app (
-    title = 'Host Mobility',
-    category = 'Utility',
-    url = 'http://onosproject.org',
-    description = 'Host mobility application.',
-)
diff --git a/apps/mobility/src/main/java/org/onosproject/mobility/HostMobility.java b/apps/mobility/src/main/java/org/onosproject/mobility/HostMobility.java
index 5c7343b..79da063 100644
--- a/apps/mobility/src/main/java/org/onosproject/mobility/HostMobility.java
+++ b/apps/mobility/src/main/java/org/onosproject/mobility/HostMobility.java
@@ -22,11 +22,11 @@
 import java.util.List;
 import java.util.concurrent.ExecutorService;
 
-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.onosproject.core.ApplicationId;
 import org.onosproject.core.CoreService;
 import org.onosproject.net.Device;
@@ -54,16 +54,16 @@
 
     private final Logger log = getLogger(getClass());
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected HostService hostService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected FlowRuleService flowRuleService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected DeviceService deviceService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected CoreService coreService;
 
     private ApplicationId appId;
diff --git a/apps/netconf/client/BUCK b/apps/netconf/client/BUCK
deleted file mode 100644
index 035b0b5..0000000
--- a/apps/netconf/client/BUCK
+++ /dev/null
@@ -1,29 +0,0 @@
-APPS = [
-    'org.onosproject.yang',
-    'org.onosproject.config',
-    'org.onosproject.netconf',
-]
-
-COMPILE_DEPS = [
-    '//lib:CORE_DEPS',
-    '//lib:onos-yang-model',
-    '//lib:onos-yang-runtime',
-    '//apps/config:onos-apps-config',
-    '//utils/misc:onlab-misc',
-    '//protocols/netconf/api:onos-protocols-netconf-api',
-    '//utils/osgi:onlab-osgi',
-]
-
-osgi_jar_with_tests(
-    deps = COMPILE_DEPS,
-)
-
-onos_app(
-    app_name = 'org.onosproject.netconfsb',
-    title = 'NETCONF Protocol Subsystem',
-    category = 'Protocol',
-    url = 'http://onosproject.org',
-    description = 'Exposes APIs to establish NETCONF connections to devices and to send and receive ' +
-        'messages and asynchronous notifications over such connection.',
-    required_apps = APPS,
-)
diff --git a/apps/netconf/client/src/main/java/org/onosproject/netconf/client/impl/NetconfActiveComponent.java b/apps/netconf/client/src/main/java/org/onosproject/netconf/client/impl/NetconfActiveComponent.java
index 33b52a4..7bf380c 100644
--- a/apps/netconf/client/src/main/java/org/onosproject/netconf/client/impl/NetconfActiveComponent.java
+++ b/apps/netconf/client/src/main/java/org/onosproject/netconf/client/impl/NetconfActiveComponent.java
@@ -17,11 +17,11 @@
 package org.onosproject.netconf.client.impl;
 
 import com.google.common.annotations.Beta;
-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.onosproject.config.DynamicConfigEvent;
 import org.onosproject.config.DynamicConfigListener;
 import org.onosproject.config.DynamicConfigService;
@@ -63,16 +63,16 @@
 public class NetconfActiveComponent implements DynamicConfigListener {
 
     private static final Logger log = LoggerFactory.getLogger(NetconfActiveComponent.class);
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected DynamicConfigService cfgService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected NetconfTranslator netconfTranslator;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected MastershipService mastershipService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected NetconfController controller;
 
     private final Accumulator<DynamicConfigEvent> accumulator = new InternalEventAccummulator();
diff --git a/apps/netconf/client/src/main/java/org/onosproject/netconf/client/impl/NetconfTranslatorImpl.java b/apps/netconf/client/src/main/java/org/onosproject/netconf/client/impl/NetconfTranslatorImpl.java
index f663fd0..84ae19b 100644
--- a/apps/netconf/client/src/main/java/org/onosproject/netconf/client/impl/NetconfTranslatorImpl.java
+++ b/apps/netconf/client/src/main/java/org/onosproject/netconf/client/impl/NetconfTranslatorImpl.java
@@ -17,12 +17,6 @@
 package org.onosproject.netconf.client.impl;
 
 import com.google.common.annotations.Beta;
-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.NodeId;
 import org.onosproject.net.DeviceId;
 import org.onosproject.netconf.NetconfController;
@@ -31,6 +25,7 @@
 import org.onosproject.netconf.NetconfSession;
 import org.onosproject.netconf.client.NetconfTranslator;
 import org.onosproject.yang.model.DataNode;
+import org.onosproject.yang.model.DefaultResourceData;
 import org.onosproject.yang.model.InnerNode;
 import org.onosproject.yang.model.KeyLeaf;
 import org.onosproject.yang.model.LeafListKey;
@@ -47,13 +42,17 @@
 import org.onosproject.yang.runtime.DefaultAnnotation;
 import org.onosproject.yang.runtime.DefaultCompositeData;
 import org.onosproject.yang.runtime.DefaultCompositeStream;
-import org.onosproject.yang.model.DefaultResourceData;
 import org.onosproject.yang.runtime.DefaultRuntimeContext;
 import org.onosproject.yang.runtime.DefaultYangSerializerContext;
+import org.onosproject.yang.runtime.SerializerHelper;
 import org.onosproject.yang.runtime.YangRuntimeService;
 import org.onosproject.yang.runtime.YangSerializerContext;
-import org.onosproject.yang.runtime.SerializerHelper;
 import org.osgi.service.component.ComponentContext;
+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;
 
@@ -89,8 +88,7 @@
  * will be no session available.
  */
 @Beta
-@Service
-@Component(immediate = true)
+@Component(immediate = true, service = NetconfTranslator.class)
 public class NetconfTranslatorImpl implements NetconfTranslator {
 
     private static final Logger log = LoggerFactory
@@ -120,13 +118,13 @@
     private static final String XMLNS_XC_SPECIFIER = "xmlns:xc";
     private static final String XMLNS_SPECIFIER = "xmlns";
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected NetconfController netconfController;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected YangRuntimeService yangRuntimeService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected SchemaContextProvider schemaContextProvider;
 
     @Activate
diff --git a/apps/network-troubleshoot/BUCK b/apps/network-troubleshoot/BUCK
deleted file mode 100644
index 66b12f4..0000000
--- a/apps/network-troubleshoot/BUCK
+++ /dev/null
@@ -1,13 +0,0 @@
-BUNDLES = [
-  '//apps/network-troubleshoot/api:onos-apps-network-troubleshoot-api',
-  '//apps/network-troubleshoot/cli:onos-apps-network-troubleshoot-cli',
-  '//apps/network-troubleshoot/core:onos-apps-network-troubleshoot-core',
-]
-
-onos_app (
-  title = 'Network Troubleshooter',
-  description = 'Provides various network troubleshooting utilities.',
-  category = 'Utility',
-  url = 'https://wiki.onosproject.org/display/ONOS/Network+TroubleShooting+Module',
-  included_bundles = BUNDLES,
-)
diff --git a/apps/network-troubleshoot/api/BUCK b/apps/network-troubleshoot/api/BUCK
deleted file mode 100644
index b6fdc64..0000000
--- a/apps/network-troubleshoot/api/BUCK
+++ /dev/null
@@ -1,12 +0,0 @@
-COMPILE_DEPS = [
-  '//lib:CORE_DEPS',
-]
-
-TEST_DEPS = [
-  '//lib:TEST_ADAPTERS',
-]
-
-osgi_jar_with_tests (
-  deps = COMPILE_DEPS,
-  test_deps = TEST_DEPS,
-)
diff --git a/apps/network-troubleshoot/app/app.xml b/apps/network-troubleshoot/app/app.xml
deleted file mode 100644
index eb60a81..0000000
--- a/apps/network-troubleshoot/app/app.xml
+++ /dev/null
@@ -1,30 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-  ~ Copyright 2015-present Open Networking Foundation
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~     http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License.
-  -->
-<app name="org.onosproject.fnl.Network.Troubleshoot" category="Core" version="${project.version}"
-     title="Network TroubleShoot SubSystem"
-     originUrl="http://www.bupt.edu.cn" origin="FNLab, BUPT"
-     features="${project.artifactId}"
-     featuresRepo="mvn:${project.groupId}/${project.artifactId}/${project.version}/xml/features"
-     url="https://wiki.onosproject.org/display/ONOS/Network+TroubleShooting+Module">
-
-    <description>${project.description}</description>
-
-    <artifact>mvn:${project.groupId}/onos-network-troubleshoot-api/${project.version}</artifact>
-    <artifact>mvn:${project.groupId}/onos-network-troubleshoot-core/${project.version}</artifact>
-    <artifact>mvn:${project.groupId}/onos-network-troubleshoot-cli/${project.version}</artifact>
-
-</app>
diff --git a/apps/network-troubleshoot/app/features.xml b/apps/network-troubleshoot/app/features.xml
deleted file mode 100644
index b0026e8..0000000
--- a/apps/network-troubleshoot/app/features.xml
+++ /dev/null
@@ -1,29 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
-<!--
-  ~ Copyright 2015-present Open Networking Foundation
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~     http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License.
-  -->
-<features xmlns="http://karaf.apache.org/xmlns/features/v1.2.0"
-          name="${project.artifactId}-${project.version}">
-
-    <feature name="${project.artifactId}" version="${project.version}"
-             description="${project.description}">
-
-        <bundle>mvn:${project.groupId}/onos-network-troubleshoot-api/${project.version}</bundle>
-        <bundle>mvn:${project.groupId}/onos-network-troubleshoot-core/${project.version}</bundle>
-        <bundle>mvn:${project.groupId}/onos-network-troubleshoot-cli/${project.version}</bundle>
-
-    </feature>
-
-</features>
diff --git a/apps/network-troubleshoot/cli/BUCK b/apps/network-troubleshoot/cli/BUCK
deleted file mode 100644
index 8f3fe1e..0000000
--- a/apps/network-troubleshoot/cli/BUCK
+++ /dev/null
@@ -1,18 +0,0 @@
-COMPILE_DEPS = [
-    '//lib:CORE_DEPS',
-    '//lib:org.apache.karaf.shell.console',
-    '//cli:onos-cli',
-#     '//lib:org.apache.karaf.shell.console',
-#     '//incubator/api:onos-incubator-api',
-#     '//cli:onos-cli',
-#     '//utils/rest:onlab-rest',
-#     '//lib:javax.ws.rs-api',
-#     '//utils/osgi:onlab-osgi',
-#     '//core/store/serializers:onos-core-serializers',
-    '//apps/network-troubleshoot/api:onos-apps-network-troubleshoot-api',
-]
-
-osgi_jar_with_tests (
-    deps = COMPILE_DEPS,
-    import_packages = '*,org.onosproject.cli.net',
-)
diff --git a/apps/network-troubleshoot/cli/BUILD b/apps/network-troubleshoot/cli/BUILD
index 5f68c98..3b32a84 100644
--- a/apps/network-troubleshoot/cli/BUILD
+++ b/apps/network-troubleshoot/cli/BUILD
@@ -3,6 +3,6 @@
 ]
 
 osgi_jar_with_tests(
-    import_packages = "*,org.onosproject.cli.net",
+    karaf_command_packages = ["org.onosproject.fnl.cli"],
     deps = COMPILE_DEPS,
 )
diff --git a/apps/network-troubleshoot/cli/src/main/java/org/onosproject/fnl/cli/TsAllAnomalies.java b/apps/network-troubleshoot/cli/src/main/java/org/onosproject/fnl/cli/TsAllAnomalies.java
index 584a5cf..8a903e0 100644
--- a/apps/network-troubleshoot/cli/src/main/java/org/onosproject/fnl/cli/TsAllAnomalies.java
+++ b/apps/network-troubleshoot/cli/src/main/java/org/onosproject/fnl/cli/TsAllAnomalies.java
@@ -15,13 +15,15 @@
  */
 package org.onosproject.fnl.cli;
 
-import org.apache.karaf.shell.commands.Command;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.fnl.intf.NetworkDiagnosticService;
 
 /**
  * Search for all types of network anomalies.
  */
+@Service
 @Command(scope = "onos",
         name = "ts-all-anomalies",
         description = "search all types of network anomalies once",
@@ -30,7 +32,7 @@
 public class TsAllAnomalies extends AbstractShellCommand {
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         NetworkDiagnosticService service = getService(NetworkDiagnosticService.class);
 
         service.findAnomalies().forEach(a -> print(a.toString()));
diff --git a/apps/network-troubleshoot/cli/src/main/java/org/onosproject/fnl/cli/TsCheckLoop.java b/apps/network-troubleshoot/cli/src/main/java/org/onosproject/fnl/cli/TsCheckLoop.java
index c38a79c..f2ac8f6 100644
--- a/apps/network-troubleshoot/cli/src/main/java/org/onosproject/fnl/cli/TsCheckLoop.java
+++ b/apps/network-troubleshoot/cli/src/main/java/org/onosproject/fnl/cli/TsCheckLoop.java
@@ -15,7 +15,8 @@
  */
 package org.onosproject.fnl.cli;
 
-import org.apache.karaf.shell.commands.Command;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.fnl.intf.NetworkDiagnostic;
 import org.onosproject.fnl.intf.NetworkDiagnosticService;
 import org.onosproject.cli.AbstractShellCommand;
@@ -27,6 +28,7 @@
 /**
  * Search for all potential routing loops.
  */
+@Service
 @Command(scope = "onos",
         name = "ts-check-loops",
         description = "Check if there are some routing loops in the network",
@@ -35,7 +37,7 @@
 public class TsCheckLoop extends AbstractShellCommand {
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         NetworkDiagnosticService service = getService(NetworkDiagnosticService.class);
 
         DeviceService ds = getService(DeviceService.class);
diff --git a/apps/network-troubleshoot/cli/src/main/resources/OSGI-INF/blueprint/shell-config.xml b/apps/network-troubleshoot/cli/src/main/resources/OSGI-INF/blueprint/shell-config.xml
deleted file mode 100644
index 4d1c429..0000000
--- a/apps/network-troubleshoot/cli/src/main/resources/OSGI-INF/blueprint/shell-config.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-<!--
-  ~ Copyright 2015-present Open Networking Foundation
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~     http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License.
-  -->
-<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0">
-    <command-bundle xmlns="http://karaf.apache.org/xmlns/shell/v1.1.0">
-        <command>
-            <action class="org.onosproject.fnl.cli.TsAllAnomalies" />
-        </command>
-        <command>
-            <action class="org.onosproject.fnl.cli.TsCheckLoop" />
-        </command>
-    </command-bundle>
-</blueprint>
diff --git a/apps/network-troubleshoot/core/BUCK b/apps/network-troubleshoot/core/BUCK
deleted file mode 100644
index 1174519..0000000
--- a/apps/network-troubleshoot/core/BUCK
+++ /dev/null
@@ -1,17 +0,0 @@
-COMPILE_DEPS = [
-  '//lib:CORE_DEPS',
-  '//incubator/api:onos-incubator-api',
-#   '//core/store/serializers:onos-core-serializers',
-  '//apps/network-troubleshoot/api:onos-apps-network-troubleshoot-api',
-]
-
-TEST_DEPS = [
-  '//lib:TEST_ADAPTERS',
-  '//utils/osgi:onlab-osgi-tests',
-  '//incubator/api:onos-incubator-api-tests',
-]
-
-osgi_jar_with_tests (
-  deps = COMPILE_DEPS,
-  test_deps = TEST_DEPS,
-)
diff --git a/apps/network-troubleshoot/core/src/main/java/org/onosproject/fnl/impl/NetworkDiagnosticManager.java b/apps/network-troubleshoot/core/src/main/java/org/onosproject/fnl/impl/NetworkDiagnosticManager.java
index db004e9..b787447 100644
--- a/apps/network-troubleshoot/core/src/main/java/org/onosproject/fnl/impl/NetworkDiagnosticManager.java
+++ b/apps/network-troubleshoot/core/src/main/java/org/onosproject/fnl/impl/NetworkDiagnosticManager.java
@@ -15,27 +15,25 @@
  */
 package org.onosproject.fnl.impl;
 
-import org.apache.felix.scr.annotations.Component;
-import org.apache.felix.scr.annotations.Modified;
-import org.apache.felix.scr.annotations.Reference;
-import org.apache.felix.scr.annotations.ReferenceCardinality;
-import org.apache.felix.scr.annotations.Service;
-import org.apache.felix.scr.annotations.Property;
-import org.apache.felix.scr.annotations.Activate;
-import org.apache.felix.scr.annotations.Deactivate;
 import org.onlab.util.Tools;
 import org.onosproject.cfg.ComponentConfigService;
+import org.onosproject.core.ApplicationId;
+import org.onosproject.core.CoreService;
 import org.onosproject.fnl.intf.NetworkAnomaly;
 import org.onosproject.fnl.intf.NetworkDiagnostic;
 import org.onosproject.fnl.intf.NetworkDiagnostic.Type;
 import org.onosproject.fnl.intf.NetworkDiagnosticService;
-import org.onosproject.core.ApplicationId;
-import org.onosproject.core.CoreService;
 import org.onosproject.net.device.DeviceService;
 import org.onosproject.net.flow.FlowRuleService;
 import org.onosproject.net.host.HostService;
 import org.onosproject.net.link.LinkService;
 import org.osgi.service.component.ComponentContext;
+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 org.slf4j.LoggerFactory;
 
@@ -46,14 +44,21 @@
 import java.util.concurrent.ConcurrentHashMap;
 
 import static com.google.common.base.Preconditions.checkNotNull;
+import static org.onosproject.fnl.impl.OsgiPropertyConstants.AUTO_REGISTER_DEFAULT_DIAGNOSTICS;
+import static org.onosproject.fnl.impl.OsgiPropertyConstants.AUTO_REGISTER_DEFAULT_DIAGNOSTICS_DEFAULT;
 
 /**
  * Default implementation of the Network Troubleshooting Core Service.
  *
  * It is simply modularized at present.
  */
-@Component(immediate = true)
-@Service
+@Component(
+    immediate = true,
+    service = NetworkDiagnosticService.class,
+    property = {
+        AUTO_REGISTER_DEFAULT_DIAGNOSTICS + ":Boolean=" + AUTO_REGISTER_DEFAULT_DIAGNOSTICS_DEFAULT
+    }
+)
 public class NetworkDiagnosticManager implements NetworkDiagnosticService {
 
     /**
@@ -62,36 +67,32 @@
     public static final String NTS_APP_NAME =
             "org.onosproject.FNL.Network-Troubleshoot";
 
-    private static final String PROPERTY_AUTO_REGISTER_DIAG =
-            "autoRegisterDefaultDiagnostics";
-
     private final Logger log = LoggerFactory.getLogger(getClass());
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected CoreService coreService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected ComponentConfigService cfgService;
 
 
     // ------ service below is for auto register ------
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected DeviceService ds;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected HostService hs;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected FlowRuleService frs;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected LinkService ls;
 
 
-    @Property(name = PROPERTY_AUTO_REGISTER_DIAG, boolValue = true,
-            label = "Automatically register all of default diagnostic modules.")
-    private boolean autoRegister = true;
+    /** Automatically register all of default diagnostic modules. */
+    private boolean autoRegisterDefaultDiagnostics = AUTO_REGISTER_DEFAULT_DIAGNOSTICS_DEFAULT;
 
 
     private ApplicationId appId;
@@ -135,19 +136,19 @@
         Dictionary<?, ?> properties =  context.getProperties();
 
         Boolean autoRegisterEnabled =
-                Tools.isPropertyEnabled(properties, PROPERTY_AUTO_REGISTER_DIAG);
+                Tools.isPropertyEnabled(properties, AUTO_REGISTER_DEFAULT_DIAGNOSTICS);
         if (autoRegisterEnabled == null) {
             log.warn("Auto Register is not configured, " +
-                    "using current value of {}", autoRegister);
+                    "using current value of {}", autoRegisterDefaultDiagnostics);
         } else {
-            autoRegister = autoRegisterEnabled;
+            autoRegisterDefaultDiagnostics = autoRegisterEnabled;
             log.info("Configured. Auto Register is {}",
-                    autoRegister ? "enabled" : "disabled");
+                    autoRegisterDefaultDiagnostics ? "enabled" : "disabled");
         }
     }
 
     private void autoRegisterDiagnostics() {
-        if (!autoRegister) {
+        if (!autoRegisterDefaultDiagnostics) {
             return;
         }
 
diff --git a/apps/network-troubleshoot/core/src/main/java/org/onosproject/fnl/impl/OsgiPropertyConstants.java b/apps/network-troubleshoot/core/src/main/java/org/onosproject/fnl/impl/OsgiPropertyConstants.java
new file mode 100644
index 0000000..9921413
--- /dev/null
+++ b/apps/network-troubleshoot/core/src/main/java/org/onosproject/fnl/impl/OsgiPropertyConstants.java
@@ -0,0 +1,25 @@
+/*
+ * Copyright 2018-present Open Networking Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.onosproject.fnl.impl;
+
+public final class OsgiPropertyConstants {
+    private OsgiPropertyConstants() {
+    }
+
+    static final String AUTO_REGISTER_DEFAULT_DIAGNOSTICS = "autoRegisterDefaultDiagnostics";
+    static final boolean AUTO_REGISTER_DEFAULT_DIAGNOSTICS_DEFAULT = true;
+}
diff --git a/apps/newoptical/BUCK b/apps/newoptical/BUCK
deleted file mode 100644
index 8a1345b..0000000
--- a/apps/newoptical/BUCK
+++ /dev/null
@@ -1,27 +0,0 @@
-COMPILE_DEPS = [
-  '//lib:CORE_DEPS',
-  '//lib:JACKSON',
-  '//lib:KRYO',
-  '//core/store/serializers:onos-core-serializers',
-  '//lib:org.apache.karaf.shell.console',
-  '//cli:onos-cli',
-  '//apps/optical-model:onos-apps-optical-model',
-]
-
-TEST_DEPS = [
-  '//lib:TEST_ADAPTERS',
-  '//utils/osgi:onlab-osgi-tests',
-]
-
-osgi_jar_with_tests (
-  deps = COMPILE_DEPS,
-  test_deps = TEST_DEPS,
-)
-
-onos_app (
-  title = 'Packet/Optical Use-Case',
-  category = 'Optical',
-  url = 'http://onosproject.org',
-  description = 'Packet/Optical use-case application.',
-  required_apps = [ 'org.onosproject.optical-model' ],
-)
diff --git a/apps/newoptical/BUILD b/apps/newoptical/BUILD
index c4c8d0b..fed6102 100644
--- a/apps/newoptical/BUILD
+++ b/apps/newoptical/BUILD
@@ -8,6 +8,7 @@
 ]
 
 osgi_jar_with_tests(
+    karaf_command_packages = ["org.onosproject.newoptical.cli"],
     test_deps = TEST_DEPS,
     deps = COMPILE_DEPS,
 )
diff --git a/apps/newoptical/src/main/java/org/onosproject/newoptical/OpticalPathProvisioner.java b/apps/newoptical/src/main/java/org/onosproject/newoptical/OpticalPathProvisioner.java
index e907cf5..59ee3d9 100644
--- a/apps/newoptical/src/main/java/org/onosproject/newoptical/OpticalPathProvisioner.java
+++ b/apps/newoptical/src/main/java/org/onosproject/newoptical/OpticalPathProvisioner.java
@@ -18,14 +18,12 @@
 import com.google.common.annotations.Beta;
 import com.google.common.collect.ImmutableList;
 import org.apache.commons.lang3.tuple.Pair;
-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.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.onlab.graph.DefaultEdgeWeigher;
 import org.onlab.graph.ScalarWeight;
 import org.onlab.graph.Weight;
@@ -109,13 +107,20 @@
 import static com.google.common.base.Preconditions.checkNotNull;
 import static org.onosproject.net.LinkKey.linkKey;
 import static org.onosproject.net.optical.device.OpticalDeviceServiceView.opticalView;
+import static org.onosproject.newoptical.OsgiPropertyConstants.MAX_PATHS;
+import static org.onosproject.newoptical.OsgiPropertyConstants.MAX_PATHS_DEFAULT;
 
 /**
  * Main component to configure optical connectivity.
  */
 @Beta
-@Service
-@Component(immediate = true)
+@Component(
+    immediate = true,
+    service = OpticalPathService.class,
+    property = {
+        MAX_PATHS + ":Integer=" + MAX_PATHS_DEFAULT
+    }
+)
 public class OpticalPathProvisioner
         extends AbstractListenerManager<OpticalPathEvent, OpticalPathListener>
         implements OpticalPathService {
@@ -132,41 +137,38 @@
     private static final String CONNECTIVITY_MAP_NAME = "newoptical-connectivity";
     private static final String CROSSCONNECTLINK_SET_NAME = "newoptical-crossconnectlink";
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected IntentService intentService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected TopologyService topologyService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected CoreService coreService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected LinkService linkService;
 
-    @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 DeviceService deviceService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected StorageService storageService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected NetworkConfigService networkConfigService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected ResourceService resourceService;
 
-    private static final String MAX_PATHS = "maxPaths";
-    private static final int DEFAULT_MAX_PATHS = 10;
-    @Property(name = MAX_PATHS, intValue = DEFAULT_MAX_PATHS,
-            label = "Maximum number of paths to consider for path provisioning")
-    private int maxPaths = DEFAULT_MAX_PATHS;
+    /** Maximum number of paths to consider for path provisioning. */
+    private int maxPaths = MAX_PATHS_DEFAULT;
 
     private ApplicationId appId;
 
@@ -265,7 +267,7 @@
      */
     private void readComponentConfiguration(ComponentContext context) {
         Dictionary<?, ?> properties = context.getProperties();
-        maxPaths = Tools.getIntegerProperty(properties, MAX_PATHS, DEFAULT_MAX_PATHS);
+        maxPaths = Tools.getIntegerProperty(properties, MAX_PATHS, MAX_PATHS_DEFAULT);
         log.info("Configured. Maximum paths to consider is configured to {}", maxPaths);
     }
 
diff --git a/apps/newoptical/src/main/java/org/onosproject/newoptical/OsgiPropertyConstants.java b/apps/newoptical/src/main/java/org/onosproject/newoptical/OsgiPropertyConstants.java
new file mode 100644
index 0000000..bf56d6f
--- /dev/null
+++ b/apps/newoptical/src/main/java/org/onosproject/newoptical/OsgiPropertyConstants.java
@@ -0,0 +1,25 @@
+/*
+ * Copyright 2018-present Open Networking Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.onosproject.newoptical;
+
+public final class OsgiPropertyConstants {
+    private OsgiPropertyConstants() {
+    }
+
+    static final String MAX_PATHS = "maxPaths";
+    static final int MAX_PATHS_DEFAULT = 10;
+}
diff --git a/apps/newoptical/src/main/java/org/onosproject/newoptical/cli/AddOpticalConnectivityCommand.java b/apps/newoptical/src/main/java/org/onosproject/newoptical/cli/AddOpticalConnectivityCommand.java
index 05e0070..dde909d 100644
--- a/apps/newoptical/src/main/java/org/onosproject/newoptical/cli/AddOpticalConnectivityCommand.java
+++ b/apps/newoptical/src/main/java/org/onosproject/newoptical/cli/AddOpticalConnectivityCommand.java
@@ -15,8 +15,10 @@
  */
 package org.onosproject.newoptical.cli;
 
-import org.apache.karaf.shell.commands.Argument;
-import org.apache.karaf.shell.commands.Command;
+import org.apache.karaf.shell.api.action.Argument;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.Completion;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onlab.util.Bandwidth;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.cli.net.ConnectPointCompleter;
@@ -28,6 +30,7 @@
 import org.onosproject.net.DeviceId;
 import org.onosproject.net.PortNumber;
 
+@Service
 @Command(scope = "onos", name = "add-optical-connectivity",
         description = "Configure optical domain connectivity")
 public class AddOpticalConnectivityCommand extends AbstractShellCommand {
@@ -39,10 +42,12 @@
 
     @Argument(index = 0, name = "ingress", description = "Ingress connect point",
             required = true, multiValued = false)
+    @Completion(ConnectPointCompleter.class)
     String ingressStr = null;
 
     @Argument(index = 1, name = "egress", description = "Egress connect point",
             required = true, multiValued = false)
+    @Completion(ConnectPointCompleter.class)
     String egressStr = null;
 
     @Argument(index = 2, name = "bandwidth", description = "Bandwidth",
@@ -56,7 +61,7 @@
 
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         OpticalPathService opticalPathService = get(OpticalPathService.class);
 
         ConnectPoint ingress = readConnectPoint(ingressStr);
diff --git a/apps/newoptical/src/main/java/org/onosproject/newoptical/cli/ListOpticalConnectivityCommand.java b/apps/newoptical/src/main/java/org/onosproject/newoptical/cli/ListOpticalConnectivityCommand.java
index 753832b..7ddd88a 100644
--- a/apps/newoptical/src/main/java/org/onosproject/newoptical/cli/ListOpticalConnectivityCommand.java
+++ b/apps/newoptical/src/main/java/org/onosproject/newoptical/cli/ListOpticalConnectivityCommand.java
@@ -18,18 +18,20 @@
 import java.util.Collection;
 import java.util.stream.Collectors;
 
-import org.apache.karaf.shell.commands.Command;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.net.LinkKey;
 import org.onosproject.newoptical.OpticalConnectivity;
 import org.onosproject.newoptical.api.OpticalPathService;
 
+@Service
 @Command(scope = "onos", name = "list-optical-connectivity",
         description = "List optical domain connectivity")
 public class ListOpticalConnectivityCommand extends AbstractShellCommand {
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         OpticalPathService opticalPathService = get(OpticalPathService.class);
 
         Collection<OpticalConnectivity> connectivities = opticalPathService.listConnectivity();
diff --git a/apps/newoptical/src/main/java/org/onosproject/newoptical/cli/OpticalConnectivityIdCompleter.java b/apps/newoptical/src/main/java/org/onosproject/newoptical/cli/OpticalConnectivityIdCompleter.java
index 96974db..ba7e0ea 100644
--- a/apps/newoptical/src/main/java/org/onosproject/newoptical/cli/OpticalConnectivityIdCompleter.java
+++ b/apps/newoptical/src/main/java/org/onosproject/newoptical/cli/OpticalConnectivityIdCompleter.java
@@ -18,6 +18,7 @@
 import java.util.List;
 import java.util.stream.Collectors;
 
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onlab.util.Identifier;
 import org.onosproject.cli.AbstractChoicesCompleter;
 import org.onosproject.newoptical.OpticalConnectivity;
@@ -28,6 +29,7 @@
 /**
  * Completer for OpticalConnectivityId.
  */
+@Service
 public class OpticalConnectivityIdCompleter extends AbstractChoicesCompleter {
 
     @Override
diff --git a/apps/newoptical/src/main/java/org/onosproject/newoptical/cli/RemoveOpticalConnectivityCommand.java b/apps/newoptical/src/main/java/org/onosproject/newoptical/cli/RemoveOpticalConnectivityCommand.java
index 02101cb..d8cb254 100644
--- a/apps/newoptical/src/main/java/org/onosproject/newoptical/cli/RemoveOpticalConnectivityCommand.java
+++ b/apps/newoptical/src/main/java/org/onosproject/newoptical/cli/RemoveOpticalConnectivityCommand.java
@@ -15,21 +15,25 @@
  */
 package org.onosproject.newoptical.cli;
 
-import org.apache.karaf.shell.commands.Argument;
-import org.apache.karaf.shell.commands.Command;
+import org.apache.karaf.shell.api.action.Argument;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.Completion;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.newoptical.api.OpticalConnectivityId;
 import org.onosproject.newoptical.api.OpticalPathService;
 
+@Service
 @Command(scope = "onos", name = "remove-optical-connectivity",
         description = "Remove optical domain connectivity")
 public class RemoveOpticalConnectivityCommand extends AbstractShellCommand {
     @Argument(index = 0, name = "id", description = "ID of optical connectivity",
             required = true, multiValued = false)
+    @Completion(OpticalConnectivityIdCompleter.class)
     String idStr = null;
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         OpticalPathService opticalPathService = get(OpticalPathService.class);
 
         OpticalConnectivityId id = OpticalConnectivityId.of(Long.valueOf(idStr));
diff --git a/apps/newoptical/src/main/resources/OSGI-INF/blueprint/shell-config.xml b/apps/newoptical/src/main/resources/OSGI-INF/blueprint/shell-config.xml
deleted file mode 100644
index 6fdf112..0000000
--- a/apps/newoptical/src/main/resources/OSGI-INF/blueprint/shell-config.xml
+++ /dev/null
@@ -1,47 +0,0 @@
-<!--
-  ~ Copyright 2016-present Open Networking Foundation
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~     http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License.
-  -->
-<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0">
-
-    <command-bundle xmlns="http://karaf.apache.org/xmlns/shell/v1.1.0">
-        <command>
-            <action class="org.onosproject.newoptical.cli.AddOpticalConnectivityCommand"/>
-            <completers>
-                <ref component-id="connectPointCompleter"/>
-                <ref component-id="connectPointCompleter"/>
-                <null/>
-            </completers>
-        </command>
-
-        <command>
-            <action class="org.onosproject.newoptical.cli.RemoveOpticalConnectivityCommand"/>
-            <completers>
-                <ref component-id="opticalConnectivityIdCompleter"/>
-                <null/>
-            </completers>
-        </command>
-
-        <command>
-            <action class="org.onosproject.newoptical.cli.ListOpticalConnectivityCommand"/>
-        </command>
-
-    </command-bundle>
-
-    <!-- TODO complete only applicable ports -->
-    <bean id="connectPointCompleter" class="org.onosproject.cli.net.ConnectPointCompleter"/>
-
-    <bean id="opticalConnectivityIdCompleter" class="org.onosproject.newoptical.cli.OpticalConnectivityIdCompleter"/>
-
-</blueprint>
diff --git a/apps/nodemetrics/BUCK b/apps/nodemetrics/BUCK
deleted file mode 100644
index de9c07e..0000000
--- a/apps/nodemetrics/BUCK
+++ /dev/null
@@ -1,17 +0,0 @@
-BUNDLES = [
-    '//apps/nodemetrics/api:onos-apps-nodemetrics-api',
-    '//apps/nodemetrics/mgr:onos-apps-nodemetrics-mgr',
-]
-
-onos_app(
-    app_name = 'org.onosproject.nodemetrics',
-    title = 'Controller Monitor Application',
-    description = '1.Nodemetrics Application uses, sigar library to fetch Controller information.'+
-    '2. The Sigar library uses Native libraries and currently It supports Windows, Linux and MacOs platform.'+
-    '3. The Native libraries like .so, .dll and .dylib are packed as jar along with sigar libs.'+
-    '4. If the Native libraries are corrupted because of any reason,'+
-    'so, the controller is vulnerable to crash of the entire JVM',
-    category = 'Monitoring',
-    url = 'http://samsung.com',
-    included_bundles = BUNDLES
-)
\ No newline at end of file
diff --git a/apps/nodemetrics/api/BUCK b/apps/nodemetrics/api/BUCK
deleted file mode 100644
index 42b99a6..0000000
--- a/apps/nodemetrics/api/BUCK
+++ /dev/null
@@ -1,9 +0,0 @@
-COMPILE_DEPS = [
-    '//lib:CORE_DEPS',
-    '//lib:sigar',
-
-]
-
-osgi_jar_with_tests(
-    deps = COMPILE_DEPS,
-)
\ No newline at end of file
diff --git a/apps/nodemetrics/mgr/BUCK b/apps/nodemetrics/mgr/BUCK
deleted file mode 100644
index 35d3657..0000000
--- a/apps/nodemetrics/mgr/BUCK
+++ /dev/null
@@ -1,13 +0,0 @@
-COMPILE_DEPS = [
-    '//lib:CORE_DEPS',
-    '//lib:sigar',
-    '//lib:org.apache.karaf.shell.console',
-    '//apps/nodemetrics/api:onos-apps-nodemetrics-api',
-    '//core/store/serializers:onos-core-serializers',
-    '//cli:onos-cli',
-    '//lib:KRYO',
-]
-
-osgi_jar_with_tests(
-    deps = COMPILE_DEPS,
-)
\ No newline at end of file
diff --git a/apps/nodemetrics/mgr/BUILD b/apps/nodemetrics/mgr/BUILD
index 9357978..375703b 100644
--- a/apps/nodemetrics/mgr/BUILD
+++ b/apps/nodemetrics/mgr/BUILD
@@ -5,5 +5,6 @@
 ]
 
 osgi_jar_with_tests(
+    karaf_command_packages = ["org.onosproject.nodemetrics.cli"],
     deps = COMPILE_DEPS,
 )
diff --git a/apps/nodemetrics/mgr/src/main/java/org/onosproject/nodemetrics/cli/ShowNodeCpuUsageCommand.java b/apps/nodemetrics/mgr/src/main/java/org/onosproject/nodemetrics/cli/ShowNodeCpuUsageCommand.java
index 12dd649..8b004a4 100644
--- a/apps/nodemetrics/mgr/src/main/java/org/onosproject/nodemetrics/cli/ShowNodeCpuUsageCommand.java
+++ b/apps/nodemetrics/mgr/src/main/java/org/onosproject/nodemetrics/cli/ShowNodeCpuUsageCommand.java
@@ -16,8 +16,9 @@
 
 package org.onosproject.nodemetrics.cli;
 
-import org.apache.karaf.shell.commands.Argument;
-import org.apache.karaf.shell.commands.Command;
+import org.apache.karaf.shell.api.action.Argument;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.cluster.NodeId;
 import org.onosproject.nodemetrics.NodeCpuUsage;
@@ -29,6 +30,7 @@
 /**
  * Lists cpu usage across nodes.
  */
+@Service
 @Command(scope = "onos", name = "node-cpu",
         description = "Lists all node cpu utilization")
 public class ShowNodeCpuUsageCommand extends AbstractShellCommand {
@@ -40,7 +42,7 @@
             .get(NodeMetricsService.class);
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         if (nodeId != null) {
             NodeCpuUsage cpu = nodeService.cpu(NodeId.nodeId(nodeId));
             if (Objects.nonNull(cpu)) {
diff --git a/apps/nodemetrics/mgr/src/main/java/org/onosproject/nodemetrics/cli/ShowNodeDiskUsageCommand.java b/apps/nodemetrics/mgr/src/main/java/org/onosproject/nodemetrics/cli/ShowNodeDiskUsageCommand.java
index 8dc0f09..7c9f4b8 100644
--- a/apps/nodemetrics/mgr/src/main/java/org/onosproject/nodemetrics/cli/ShowNodeDiskUsageCommand.java
+++ b/apps/nodemetrics/mgr/src/main/java/org/onosproject/nodemetrics/cli/ShowNodeDiskUsageCommand.java
@@ -16,8 +16,9 @@
 
 package org.onosproject.nodemetrics.cli;
 
-import org.apache.karaf.shell.commands.Argument;
-import org.apache.karaf.shell.commands.Command;
+import org.apache.karaf.shell.api.action.Argument;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.cluster.NodeId;
 import org.onosproject.nodemetrics.NodeDiskUsage;
@@ -29,6 +30,7 @@
 /**
  * Lists disk usage across nodes.
  */
+@Service
 @Command(scope = "onos", name = "node-disk",
         description = "Lists all node disk utilization")
 public class ShowNodeDiskUsageCommand extends AbstractShellCommand {
@@ -40,7 +42,7 @@
             .get(NodeMetricsService.class);
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         if (nodeId != null) {
             NodeDiskUsage disk = nodeService.disk(NodeId.nodeId(nodeId));
             if (Objects.nonNull(disk)) {
diff --git a/apps/nodemetrics/mgr/src/main/java/org/onosproject/nodemetrics/cli/ShowNodeMemoryUsageCommand.java b/apps/nodemetrics/mgr/src/main/java/org/onosproject/nodemetrics/cli/ShowNodeMemoryUsageCommand.java
index 2f18c43..6c87521 100644
--- a/apps/nodemetrics/mgr/src/main/java/org/onosproject/nodemetrics/cli/ShowNodeMemoryUsageCommand.java
+++ b/apps/nodemetrics/mgr/src/main/java/org/onosproject/nodemetrics/cli/ShowNodeMemoryUsageCommand.java
@@ -16,8 +16,9 @@
 
 package org.onosproject.nodemetrics.cli;
 
-import org.apache.karaf.shell.commands.Argument;
-import org.apache.karaf.shell.commands.Command;
+import org.apache.karaf.shell.api.action.Argument;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.cluster.NodeId;
 import org.onosproject.nodemetrics.NodeMemoryUsage;
@@ -29,6 +30,7 @@
 /**
  * Lists memory usage across nodes.
  */
+@Service
 @Command(scope = "onos", name = "node-memory",
         description = "Lists all node memory utilization")
 public class ShowNodeMemoryUsageCommand extends AbstractShellCommand {
@@ -40,7 +42,7 @@
             .get(NodeMetricsService.class);
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         if (nodeId != null) {
             NodeMemoryUsage memory = nodeService.memory(NodeId.nodeId(nodeId));
             if (Objects.nonNull(memory)) {
diff --git a/apps/nodemetrics/mgr/src/main/java/org/onosproject/nodemetrics/impl/NodeMetricsManager.java b/apps/nodemetrics/mgr/src/main/java/org/onosproject/nodemetrics/impl/NodeMetricsManager.java
index 812ebb7..eec2c65 100644
--- a/apps/nodemetrics/mgr/src/main/java/org/onosproject/nodemetrics/impl/NodeMetricsManager.java
+++ b/apps/nodemetrics/mgr/src/main/java/org/onosproject/nodemetrics/impl/NodeMetricsManager.java
@@ -15,16 +15,6 @@
  */
 package org.onosproject.nodemetrics.impl;
 
-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.osgi.service.component.ComponentContext;
-import org.onosproject.cfg.ComponentConfigService;
 import org.hyperic.sigar.CpuPerc;
 import org.hyperic.sigar.FileSystemUsage;
 import org.hyperic.sigar.Mem;
@@ -32,6 +22,7 @@
 import org.hyperic.sigar.SigarException;
 import org.onlab.util.KryoNamespace;
 import org.onlab.util.Tools;
+import org.onosproject.cfg.ComponentConfigService;
 import org.onosproject.cluster.ClusterService;
 import org.onosproject.cluster.NodeId;
 import org.onosproject.core.ApplicationId;
@@ -45,9 +36,17 @@
 import org.onosproject.store.service.EventuallyConsistentMap;
 import org.onosproject.store.service.LogicalClockService;
 import org.onosproject.store.service.StorageService;
+import org.osgi.service.component.ComponentContext;
+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 org.slf4j.LoggerFactory;
 
+import java.util.Dictionary;
 import java.util.Map;
 import java.util.Objects;
 import java.util.concurrent.Executors;
@@ -55,32 +54,39 @@
 import java.util.concurrent.ScheduledFuture;
 import java.util.concurrent.TimeUnit;
 import java.util.stream.Collectors;
-import java.util.Dictionary;
+
 import static org.onlab.util.Tools.getIntegerProperty;
+import static org.onosproject.nodemetrics.impl.OsgiPropertyConstants.METRIC_POLL_FREQUENCY_SECONDS;
+import static org.onosproject.nodemetrics.impl.OsgiPropertyConstants.METRIC_POLL_FREQUENCY_SECONDS_DEFAULT;
 
 
-@Service
-@Component(immediate = true)
+@Component(
+    immediate = true,
+    service = NodeMetricsService.class,
+    property = {
+        METRIC_POLL_FREQUENCY_SECONDS + ":Integer=" + METRIC_POLL_FREQUENCY_SECONDS_DEFAULT
+    }
+)
 public class NodeMetricsManager implements NodeMetricsService {
-    private static final int DEFAULT_POLL_FREQUENCY_SECONDS = 15;
+
     private static final String SLASH = "/";
     private static final Double PERCENTAGE_MULTIPLIER = 100.0;
     private final Logger log = LoggerFactory
             .getLogger(this.getClass());
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected CoreService coreService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected StorageService storageService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected ClusterService clusterService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected LogicalClockService clockService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected ComponentConfigService cfgService;
 
     private ScheduledExecutorService metricsExecutor;
@@ -95,9 +101,8 @@
 
     private Sigar sigar;
 
-    @Property(name = "metricPollFrequencySeconds", intValue = DEFAULT_POLL_FREQUENCY_SECONDS,
-            label = "Frequency (in seconds) for polling controller metrics")
-    protected int metricPollFrequencySeconds = DEFAULT_POLL_FREQUENCY_SECONDS;
+    /** Frequency (in seconds) for polling controller metrics. */
+    protected int metricPollFrequencySeconds = METRIC_POLL_FREQUENCY_SECONDS_DEFAULT;
 
     @Activate
     public void activate(ComponentContext context) {
@@ -208,11 +213,11 @@
     private int getNewPollFrequency(Dictionary<?, ?> properties) {
         int newPollFrequency;
         try {
-            newPollFrequency = getIntegerProperty(properties, "metricPollFrequencySeconds");
+            newPollFrequency = getIntegerProperty(properties, METRIC_POLL_FREQUENCY_SECONDS);
             //String s = getIntegerProperty(properties, "metricPollFrequencySeconds");
             //newPollFrequency = isNullOrEmpty(s) ? pollFrequency : Integer.parseInt(s.trim());
         } catch (NumberFormatException | ClassCastException e) {
-            newPollFrequency = DEFAULT_POLL_FREQUENCY_SECONDS;
+            newPollFrequency = METRIC_POLL_FREQUENCY_SECONDS_DEFAULT;
         }
         return newPollFrequency;
     }
diff --git a/apps/nodemetrics/mgr/src/main/java/org/onosproject/nodemetrics/impl/OsgiPropertyConstants.java b/apps/nodemetrics/mgr/src/main/java/org/onosproject/nodemetrics/impl/OsgiPropertyConstants.java
new file mode 100644
index 0000000..0eb0d71
--- /dev/null
+++ b/apps/nodemetrics/mgr/src/main/java/org/onosproject/nodemetrics/impl/OsgiPropertyConstants.java
@@ -0,0 +1,25 @@
+/*
+ * Copyright 2018-present Open Networking Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.onosproject.nodemetrics.impl;
+
+public final class OsgiPropertyConstants {
+    private OsgiPropertyConstants() {
+    }
+
+    static final int METRIC_POLL_FREQUENCY_SECONDS_DEFAULT = 15;
+    static final String METRIC_POLL_FREQUENCY_SECONDS = "metricPollFrequencySeconds";
+}
diff --git a/apps/nodemetrics/mgr/src/main/resources/OSGI-INF/blueprint/shell-config.xml b/apps/nodemetrics/mgr/src/main/resources/OSGI-INF/blueprint/shell-config.xml
deleted file mode 100644
index 8bb1d69..0000000
--- a/apps/nodemetrics/mgr/src/main/resources/OSGI-INF/blueprint/shell-config.xml
+++ /dev/null
@@ -1,34 +0,0 @@
-<!--
-  ~ /*
-  ~  * Copyright 2017-present Open Networking Foundation
-  ~  *
-  ~  * Licensed under the Apache License, Version 2.0 (the "License");
-  ~  * you may not use this file except in compliance with the License.
-  ~  * You may obtain a copy of the License at
-  ~  *
-  ~  *     http://www.apache.org/licenses/LICENSE-2.0
-  ~  *
-  ~  * Unless required by applicable law or agreed to in writing, software
-  ~  * distributed under the License is distributed on an "AS IS" BASIS,
-  ~  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~  * See the License for the specific language governing permissions and
-  ~  * limitations under the License.
-  ~  */
-  -->
-<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0">
-
-    <command-bundle xmlns="http://karaf.apache.org/xmlns/shell/v1.1.0">
-
-        <command>
-            <action class="org.onosproject.nodemetrics.cli.ShowNodeCpuUsageCommand"/>
-        </command>
-        <command>
-            <action class="org.onosproject.nodemetrics.cli.ShowNodeDiskUsageCommand"/>
-        </command>
-        <command>
-            <action class="org.onosproject.nodemetrics.cli.ShowNodeMemoryCommand"/>
-        </command>
-    </command-bundle>
-
-
-</blueprint>
\ No newline at end of file
diff --git a/apps/odtn/api/BUCK b/apps/odtn/api/BUCK
deleted file mode 100644
index 23ac161..0000000
--- a/apps/odtn/api/BUCK
+++ /dev/null
@@ -1,35 +0,0 @@
-COMPILE_DEPS = [
-    '//lib:CORE_DEPS',
-    '//lib:JACKSON',
-    '//lib:onos-yang-model',
-    '//lib:onos-yang-runtime',
-    '//models/tapi:onos-models-tapi',
-    '//models/openconfig:onos-models-openconfig',
-    '//apps/yang:onos-apps-yang',
-    '//apps/config:onos-apps-config',
-]
-
-TEST_DEPS = [
-    '//lib:TEST_ADAPTERS',
-]
-
-osgi_jar_with_tests (
-    deps = COMPILE_DEPS,
-    test_deps = TEST_DEPS,
-)
-
-APPS = [
-    'org.onosproject.yang',
-    'org.onosproject.models.tapi',
-    'org.onosproject.models.openconfig',
-]
-
-# TODO probably bucklet, etc. should escape title & description
-onos_app (
-    app_name = 'org.onosproject.odtn-api',
-    title = 'ODTN API &amp; Utilities Application',
-    category = 'Traffic Engineering',
-    url = 'http://onosproject.org',
-    description = 'ODTN API &amp; Utilities Application',
-    required_apps = APPS,
-)
diff --git a/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/YangToolUtil.java b/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/YangToolUtil.java
index b0d56cb..608209e 100644
--- a/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/YangToolUtil.java
+++ b/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/YangToolUtil.java
@@ -32,11 +32,11 @@
 import javax.xml.transform.dom.DOMSource;
 import javax.xml.transform.stream.StreamResult;
 
-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.osgi.DefaultServiceDirectory;
 import org.onosproject.yang.model.DataNode;
 import org.onosproject.yang.model.DefaultModelObjectData;
@@ -71,11 +71,11 @@
 public class YangToolUtil {
     private static final Logger log = getLogger(YangToolUtil.class);
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected YangRuntimeService yangRuntimeService;
     protected static YangRuntimeService yrs;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected ModelConverter modelConverter;
     protected static ModelConverter converter;
 
diff --git a/apps/odtn/service/BUCK b/apps/odtn/service/BUCK
deleted file mode 100644
index e85e574..0000000
--- a/apps/odtn/service/BUCK
+++ /dev/null
@@ -1,50 +0,0 @@
-COMPILE_DEPS = [
-    '//lib:CORE_DEPS',
-    '//apps/odtn/api:onos-apps-odtn-api',
-    '//lib:onos-yang-model',
-    '//lib:onos-yang-runtime',
-    '//apps/config:onos-apps-config',
-    '//models/tapi:onos-models-tapi',
-    '//models/openconfig:onos-models-openconfig',
-    '//apps/yang:onos-apps-yang',
-    '//incubator/api:onos-incubator-api',
-    '//lib:org.apache.karaf.shell.console',
-    '//cli:onos-cli',
-    '//lib:JACKSON',
-    '//protocols/netconf/api:onos-protocols-netconf-api'
-]
-
-TEST_DEPS = [
-    '//lib:TEST_ADAPTERS',
-]
-
-osgi_jar_with_tests (
-    deps = COMPILE_DEPS,
-    test_deps = TEST_DEPS,
-)
-
-APPS = [
-    'org.onosproject.yang',
-    'org.onosproject.config',
-    'org.onosproject.configsync',
-    'org.onosproject.models.tapi',
-    'org.onosproject.models.openconfig',
-    'org.onosproject.odtn-api',
-
-    # strictly speaking following are not mandatory
-    'org.onosproject.restconf',
-    'org.onosproject.drivers.netconf',# will need if using TemplateManager
-    'org.onosproject.drivers.odtn-driver',
-    'org.onosproject.netconf',
-    'org.onosproject.configsync-netconf',
-    'org.onosproject.protocols.restconfserver',
-]
-
-onos_app (
-    app_name = 'org.onosproject.odtn-service',
-    title = 'ODTN Service Application',
-    category = 'Traffic Engineering',
-    url = 'http://onosproject.org',
-    description = 'ODTN Service Application',
-    required_apps = APPS,
-)
diff --git a/apps/odtn/service/BUILD b/apps/odtn/service/BUILD
index 38f187e..5daed804 100644
--- a/apps/odtn/service/BUILD
+++ b/apps/odtn/service/BUILD
@@ -9,6 +9,7 @@
 ]
 
 osgi_jar_with_tests(
+    karaf_command_packages = ["org.onosproject.odtn.cli.impl"],
     test_deps = TEST_ADAPTERS,
     deps = COMPILE_DEPS,
 )
diff --git a/apps/odtn/service/src/main/java/org/onosproject/odtn/cli/impl/ModeCompleter.java b/apps/odtn/service/src/main/java/org/onosproject/odtn/cli/impl/ModeCompleter.java
index f00a3f8..7cb2be7 100644
--- a/apps/odtn/service/src/main/java/org/onosproject/odtn/cli/impl/ModeCompleter.java
+++ b/apps/odtn/service/src/main/java/org/onosproject/odtn/cli/impl/ModeCompleter.java
@@ -20,9 +20,11 @@
 import java.util.stream.Collectors;
 
 
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.cli.AbstractChoicesCompleter;
 import org.onosproject.odtn.cli.impl.OdtnManualTestCommand.Mode;
 
+@Service
 public class ModeCompleter extends AbstractChoicesCompleter {
 
     @Override
diff --git a/apps/odtn/service/src/main/java/org/onosproject/odtn/cli/impl/OdtnDcsModelCheckCommand.java b/apps/odtn/service/src/main/java/org/onosproject/odtn/cli/impl/OdtnDcsModelCheckCommand.java
index b7d08e2..bf7db2f 100644
--- a/apps/odtn/service/src/main/java/org/onosproject/odtn/cli/impl/OdtnDcsModelCheckCommand.java
+++ b/apps/odtn/service/src/main/java/org/onosproject/odtn/cli/impl/OdtnDcsModelCheckCommand.java
@@ -17,7 +17,8 @@
 package org.onosproject.odtn.cli.impl;
 
 import java.util.regex.Pattern;
-import org.apache.karaf.shell.commands.Command;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onlab.util.XmlString;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.config.DynamicConfigService;
@@ -38,7 +39,7 @@
 import org.slf4j.Logger;
 import static org.slf4j.LoggerFactory.getLogger;
 
-
+@Service
 @Command(scope = "onos", name = "odtn-show-tapi-context")
 public class OdtnDcsModelCheckCommand extends AbstractShellCommand {
 
@@ -52,7 +53,7 @@
     }
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         dcs = get(DynamicConfigService.class);
         modelConverter = get(ModelConverter.class);
         dumpDcsStore(DefaultContext.class);
diff --git a/apps/odtn/service/src/main/java/org/onosproject/odtn/cli/impl/OdtnManualTestCommand.java b/apps/odtn/service/src/main/java/org/onosproject/odtn/cli/impl/OdtnManualTestCommand.java
index 15dc248..249ad53 100644
--- a/apps/odtn/service/src/main/java/org/onosproject/odtn/cli/impl/OdtnManualTestCommand.java
+++ b/apps/odtn/service/src/main/java/org/onosproject/odtn/cli/impl/OdtnManualTestCommand.java
@@ -31,9 +31,11 @@
 import javax.xml.parsers.DocumentBuilderFactory;
 import javax.xml.parsers.ParserConfigurationException;
 
-import org.apache.karaf.shell.commands.Argument;
-import org.apache.karaf.shell.commands.Command;
-import org.apache.karaf.shell.commands.Option;
+import org.apache.karaf.shell.api.action.Argument;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.Completion;
+import org.apache.karaf.shell.api.action.Option;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onlab.util.XmlString;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.cli.net.DeviceIdCompleter;
@@ -58,7 +60,7 @@
 import com.google.common.collect.Lists;
 import com.google.common.io.CharSource;
 
-
+@Service
 @Command(scope = "onos", name = "odtn-manual-test",
          description = "ODTN manual test command")
 public class OdtnManualTestCommand extends AbstractShellCommand {
@@ -75,24 +77,24 @@
     ModeCompleter modeCompleter;
     @Argument(index = 0, name = "mode", description = "one of Mode see source",
               required = true)
+    @Completion(ModeCompleter.class)
     String modeStr = Mode.ENABLE_TRANSCEIVER.name();
     Mode mode;
 
-    // injecting dependency for OSGi package import generation purpose
-    DeviceIdCompleter uriCompleter;
     @Option(name = "--deviceId", description = "Device ID URI to send configuration to",
               required = false)
+    @Completion(DeviceIdCompleter.class)
     String uri = null;
 
-    // injecting dependency for OSGi package import generation purpose
-    PortNumberCompleter portNoCompleter;
     // Note: this will required Port information in device subystem
     @Option(name = "--cltPortNo", description = "Client-side PortNumber to send configuration to",
             required = false)
+    @Completion(PortNumberCompleter.class)
     String cltPortNo = null;
 
     @Option(name = "--linePortNo", description = "Line-side PortNumber to send configuration to",
             required = false)
+    @Completion(PortNumberCompleter.class)
     String linePortNo = null;
 
 
@@ -121,7 +123,7 @@
 
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         dcs = get(DynamicConfigService.class);
         deviceService = get(DeviceService.class);
 
diff --git a/apps/odtn/service/src/main/java/org/onosproject/odtn/cli/impl/OdtnTapiHandlersTestCommand.java b/apps/odtn/service/src/main/java/org/onosproject/odtn/cli/impl/OdtnTapiHandlersTestCommand.java
index 6131360..72d1a54 100644
--- a/apps/odtn/service/src/main/java/org/onosproject/odtn/cli/impl/OdtnTapiHandlersTestCommand.java
+++ b/apps/odtn/service/src/main/java/org/onosproject/odtn/cli/impl/OdtnTapiHandlersTestCommand.java
@@ -16,7 +16,7 @@
 
 package org.onosproject.odtn.cli.impl;
 
-import org.apache.karaf.shell.commands.Command;
+import org.apache.karaf.shell.api.action.Command;
 import org.onlab.util.XmlString;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.config.DynamicConfigService;
@@ -70,7 +70,7 @@
     private TapiContextHandler contextHandler;
 
     @Override
-    public void execute() {
+    public void doExecute() {
         dcs = get(DynamicConfigService.class);
         modelConverter = get(ModelConverter.class);
 
diff --git a/apps/odtn/service/src/main/java/org/onosproject/odtn/impl/ServiceApplicationComponent.java b/apps/odtn/service/src/main/java/org/onosproject/odtn/impl/ServiceApplicationComponent.java
index ff813e5..a77b5a3 100644
--- a/apps/odtn/service/src/main/java/org/onosproject/odtn/impl/ServiceApplicationComponent.java
+++ b/apps/odtn/service/src/main/java/org/onosproject/odtn/impl/ServiceApplicationComponent.java
@@ -20,11 +20,11 @@
 
 package org.onosproject.odtn.impl;
 
-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.onosproject.net.ConnectPoint;
 import org.onosproject.net.DeviceId;
 import org.onosproject.net.Link;
@@ -71,28 +71,28 @@
 
     private final Logger log = LoggerFactory.getLogger(getClass());
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected DynamicConfigService dynConfigService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected DeviceService deviceService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected LinkService linkService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected NetworkConfigService netcfgService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected NetworkConfigRegistry netcfgRegistry;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected RpcRegistry rpcRegistry;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected TapiTopologyManager tapiTopologyManager;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected TapiResolver resolver;
 
     // Listener for events from the DCS
diff --git a/apps/odtn/service/src/main/java/org/onosproject/odtn/internal/DcsBasedTapiTopologyManager.java b/apps/odtn/service/src/main/java/org/onosproject/odtn/internal/DcsBasedTapiTopologyManager.java
index b528f23..c5fd719 100644
--- a/apps/odtn/service/src/main/java/org/onosproject/odtn/internal/DcsBasedTapiTopologyManager.java
+++ b/apps/odtn/service/src/main/java/org/onosproject/odtn/internal/DcsBasedTapiTopologyManager.java
@@ -16,30 +16,22 @@
 
 package org.onosproject.odtn.internal;
 
-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.config.DynamicConfigService;
-
 import org.onosproject.net.ConnectPoint;
 import org.onosproject.net.Device;
 import org.onosproject.net.DeviceId;
 import org.onosproject.net.Link;
 import org.onosproject.net.Port;
-
 import org.onosproject.odtn.TapiResolver;
 import org.onosproject.odtn.TapiTopologyManager;
 import org.onosproject.odtn.utils.tapi.TapiConnectivityContextHandler;
-import org.onosproject.odtn.utils.tapi.TapiLinkHandler;
 import org.onosproject.odtn.utils.tapi.TapiCepHandler;
-import org.onosproject.odtn.utils.tapi.TapiNepRef;
-import org.onosproject.odtn.utils.tapi.TapiNodeRef;
 import org.onosproject.odtn.utils.tapi.TapiContextHandler;
+import org.onosproject.odtn.utils.tapi.TapiLinkHandler;
 import org.onosproject.odtn.utils.tapi.TapiNepHandler;
+import org.onosproject.odtn.utils.tapi.TapiNepRef;
 import org.onosproject.odtn.utils.tapi.TapiNodeHandler;
+import org.onosproject.odtn.utils.tapi.TapiNodeRef;
 import org.onosproject.odtn.utils.tapi.TapiSipHandler;
 import org.onosproject.odtn.utils.tapi.TapiTopologyContextHandler;
 import org.onosproject.odtn.utils.tapi.TapiTopologyHandler;
@@ -47,6 +39,11 @@
 import org.onosproject.yang.gen.v1.tapicommon.rev20181016.tapicommon.Uuid;
 import org.onosproject.yang.gen.v1.tapitopology.rev20181016.tapitopology.topologycontext.DefaultTopology;
 import org.onosproject.yang.model.ModelConverter;
+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 static org.slf4j.LoggerFactory.getLogger;
@@ -54,19 +51,18 @@
 /**
  * OSGi Component for ODTN TAPI topology manager application.
  */
-@Component(immediate = true)
-@Service
+@Component(immediate = true, service = TapiTopologyManager.class)
 public class DcsBasedTapiTopologyManager implements TapiTopologyManager {
 
     private final Logger log = getLogger(getClass());
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected DynamicConfigService dcs;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected ModelConverter modelConverter;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected TapiResolver tapiResolver;
 
     private DefaultContext context;
diff --git a/apps/odtn/service/src/main/java/org/onosproject/odtn/internal/DefaultTapiResolver.java b/apps/odtn/service/src/main/java/org/onosproject/odtn/internal/DefaultTapiResolver.java
index 6167377..abdabf5 100644
--- a/apps/odtn/service/src/main/java/org/onosproject/odtn/internal/DefaultTapiResolver.java
+++ b/apps/odtn/service/src/main/java/org/onosproject/odtn/internal/DefaultTapiResolver.java
@@ -16,6 +16,16 @@
 
 package org.onosproject.odtn.internal;
 
+import org.onosproject.net.ConnectPoint;
+import org.onosproject.net.ElementId;
+import org.onosproject.odtn.TapiResolver;
+import org.onosproject.odtn.utils.tapi.TapiNepRef;
+import org.onosproject.odtn.utils.tapi.TapiNodeRef;
+import org.osgi.service.component.annotations.Activate;
+import org.osgi.service.component.annotations.Component;
+import org.osgi.service.component.annotations.Deactivate;
+import org.slf4j.Logger;
+
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Map;
@@ -23,24 +33,13 @@
 import java.util.concurrent.CopyOnWriteArrayList;
 import java.util.stream.Collectors;
 import java.util.stream.Stream;
-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.onosproject.net.ConnectPoint;
-import org.onosproject.net.ElementId;
-import org.onosproject.odtn.TapiResolver;
-import org.onosproject.odtn.utils.tapi.TapiNepRef;
-import org.onosproject.odtn.utils.tapi.TapiNodeRef;
-import org.slf4j.Logger;
 
 import static org.slf4j.LoggerFactory.getLogger;
 
 /**
  * OSGi Component for ODTN TAPI resolver application.
  */
-@Component(immediate = true)
-@Service
+@Component(immediate = true, service = TapiResolver.class)
 public class DefaultTapiResolver implements TapiResolver {
 
     private final Logger log = getLogger(getClass());
diff --git a/apps/odtn/service/src/main/resources/OSGI-INF/blueprint/shell-config.xml b/apps/odtn/service/src/main/resources/OSGI-INF/blueprint/shell-config.xml
deleted file mode 100644
index 953a71e..0000000
--- a/apps/odtn/service/src/main/resources/OSGI-INF/blueprint/shell-config.xml
+++ /dev/null
@@ -1,47 +0,0 @@
-<!--
-  ~ Copyright 2018-present Open Networking Foundation
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~     http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License.
-  -->
-<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0">
-
-    <command-bundle xmlns="http://karaf.apache.org/xmlns/shell/v1.1.0">
-
-        <command>
-            <action class="org.onosproject.odtn.cli.impl.OdtnManualTestCommand"/>
-            <completers>
-                <ref component-id="modeCompleter"/>
-                <null/>
-            </completers>
-            <optional-completers>
-                <entry key="--deviceId" value-ref="deviceIdCompleter"/>
-                <entry key="--cltPortNo" value-ref="portNumberCompleter"/>
-                <entry key="--linePortNo" value-ref="portNumberCompleter"/>
-            </optional-completers>
-        </command>
-
-        <command>
-            <action class="org.onosproject.odtn.cli.impl.OdtnDcsModelCheckCommand"/>
-        </command>
-
-        <command>
-            <action class="org.onosproject.odtn.cli.impl.OdtnTapiHandlersTestCommand"/>
-        </command>
-
-    </command-bundle>
-
-    <bean id="deviceIdCompleter" class="org.onosproject.cli.net.DeviceIdCompleter"/>
-    <bean id="portNumberCompleter" class="org.onosproject.cli.net.PortNumberCompleter"/>
-    <bean id="modeCompleter" class="org.onosproject.odtn.cli.impl.ModeCompleter"/>
-
-</blueprint>
\ No newline at end of file
diff --git a/apps/ofagent/BUCK b/apps/ofagent/BUCK
deleted file mode 100644
index 1283bad..0000000
--- a/apps/ofagent/BUCK
+++ /dev/null
@@ -1,54 +0,0 @@
-COMPILE_DEPS = [
-    '//lib:CORE_DEPS',
-    '//lib:NETTY',
-    '//lib:JACKSON',
-    '//lib:KRYO',
-    '//core/store/serializers:onos-core-serializers',
-    '//core/common:onos-core-common',
-    '//incubator/api:onos-incubator-api',
-    '//cli:onos-cli',
-    '//lib:org.apache.karaf.shell.console',
-    '//lib:io_netty_netty_transport',
-    '//lib:io_netty_netty_buffer',
-    '//lib:io_netty_netty_codec',
-    '//lib:io_netty_netty_handler',
-    '//lib:openflowj',
-    '//lib:javax.ws.rs-api',
-    '//utils/rest:onlab-rest',
-    '//providers/openflow/flow:onos-providers-openflow-flow',
-    '//protocols/openflow/api:onos-protocols-openflow-api',
-]
-
-BUNDLES = [
-    '//apps/ofagent:onos-apps-ofagent',
-    '//providers/openflow/flow:onos-providers-openflow-flow',
-    '//protocols/openflow/api:onos-protocols-openflow-api',
-]
-
-TEST_DEPS = [
-    '//lib:TEST_ADAPTERS',
-    '//core/api:onos-api-tests',
-    '//core/common:onos-core-common-tests',
-    '//lib:TEST_REST',
-    '//lib:jersey-server',
-    '//web/api:onos-rest-tests',
-    '//lib:minimal-json',
-]
-
-osgi_jar_with_tests (
-    deps = COMPILE_DEPS,
-    test_deps = TEST_DEPS,
-    web_context = '/onos/ofagent',
-    api_title = 'OFAgent API',
-    api_version = '1.0',
-    api_description = 'REST API for OFAgent',
-    api_package = 'org.onosproject.ofagent.rest',
-)
-
-onos_app (
-    title = 'OpenFlow Agent',
-    category = 'Traffic Engineering',
-    url = 'http://onosproject.org',
-    included_bundles = BUNDLES,
-    description = 'OpenFlow agent application for virtualization subsystem.',
-)
diff --git a/apps/ofagent/BUILD b/apps/ofagent/BUILD
index e15e9c8..e5e805a 100644
--- a/apps/ofagent/BUILD
+++ b/apps/ofagent/BUILD
@@ -29,6 +29,7 @@
     api_package = "org.onosproject.ofagent.rest",
     api_title = "OFAgent API",
     api_version = "1.0",
+    karaf_command_packages = ["org.onosproject.ofagent.cli"],
     test_deps = TEST_DEPS,
     web_context = "/onos/ofagent",
     deps = COMPILE_DEPS,
diff --git a/apps/ofagent/src/main/java/org/onosproject/ofagent/cli/OFAgentAddControllerCommand.java b/apps/ofagent/src/main/java/org/onosproject/ofagent/cli/OFAgentAddControllerCommand.java
index d4a8406..52cfe23 100644
--- a/apps/ofagent/src/main/java/org/onosproject/ofagent/cli/OFAgentAddControllerCommand.java
+++ b/apps/ofagent/src/main/java/org/onosproject/ofagent/cli/OFAgentAddControllerCommand.java
@@ -15,8 +15,9 @@
  */
 package org.onosproject.ofagent.cli;
 
-import org.apache.karaf.shell.commands.Argument;
-import org.apache.karaf.shell.commands.Command;
+import org.apache.karaf.shell.api.action.Argument;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onlab.packet.IpAddress;
 import org.onlab.packet.TpPort;
 import org.onosproject.cli.AbstractShellCommand;
@@ -30,6 +31,7 @@
 /**
  * Adds a controller to the OFAgent.
  */
+@Service
 @Command(scope = "onos", name = "ofagent-controller-add",
         description = "Add a controller to the ofagent")
 public class OFAgentAddControllerCommand extends AbstractShellCommand {
@@ -46,7 +48,7 @@
     private String strCtrl;
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         if (!isValidController(strCtrl)) {
             error("Invalid controller string %s, must be IP:PORT", strCtrl);
             return;
diff --git a/apps/ofagent/src/main/java/org/onosproject/ofagent/cli/OFAgentCreateCommand.java b/apps/ofagent/src/main/java/org/onosproject/ofagent/cli/OFAgentCreateCommand.java
index b70d191..3088d3e 100644
--- a/apps/ofagent/src/main/java/org/onosproject/ofagent/cli/OFAgentCreateCommand.java
+++ b/apps/ofagent/src/main/java/org/onosproject/ofagent/cli/OFAgentCreateCommand.java
@@ -16,8 +16,9 @@
 package org.onosproject.ofagent.cli;
 
 import com.google.common.collect.Sets;
-import org.apache.karaf.shell.commands.Argument;
-import org.apache.karaf.shell.commands.Command;
+import org.apache.karaf.shell.api.action.Argument;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onlab.packet.IpAddress;
 import org.onlab.packet.TpPort;
 import org.onosproject.cli.AbstractShellCommand;
@@ -37,6 +38,7 @@
 /**
  * Creates a new OFAagent.
  */
+@Service
 @Command(scope = "onos", name = "ofagent-create", description = "Add a new ofagent")
 public class OFAgentCreateCommand extends AbstractShellCommand {
 
@@ -52,7 +54,7 @@
     private String[] strCtrls = {};
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         Set<OFController> ctrls = Sets.newHashSet();
         for (String strCtrl : strCtrls) {
             if (!isValidController(strCtrl)) {
diff --git a/apps/ofagent/src/main/java/org/onosproject/ofagent/cli/OFAgentDeleteControllerCommand.java b/apps/ofagent/src/main/java/org/onosproject/ofagent/cli/OFAgentDeleteControllerCommand.java
index 042df71..6134329 100644
--- a/apps/ofagent/src/main/java/org/onosproject/ofagent/cli/OFAgentDeleteControllerCommand.java
+++ b/apps/ofagent/src/main/java/org/onosproject/ofagent/cli/OFAgentDeleteControllerCommand.java
@@ -15,8 +15,9 @@
  */
 package org.onosproject.ofagent.cli;
 
-import org.apache.karaf.shell.commands.Argument;
-import org.apache.karaf.shell.commands.Command;
+import org.apache.karaf.shell.api.action.Argument;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onlab.packet.IpAddress;
 import org.onlab.packet.TpPort;
 import org.onosproject.cli.AbstractShellCommand;
@@ -30,6 +31,7 @@
 /**
  * Removes the controller from the OFAgent.
  */
+@Service
 @Command(scope = "onos", name = "ofagent-controller-delete",
         description = "Deletes a controller from the ofagent")
 public class OFAgentDeleteControllerCommand extends AbstractShellCommand {
@@ -46,7 +48,7 @@
     private String strCtrl;
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         if (!isValidController(strCtrl)) {
             error("Invalid controller string %s, must be IP:PORT", strCtrl);
             return;
diff --git a/apps/ofagent/src/main/java/org/onosproject/ofagent/cli/OFAgentListCommand.java b/apps/ofagent/src/main/java/org/onosproject/ofagent/cli/OFAgentListCommand.java
index be8d838..452faf0 100644
--- a/apps/ofagent/src/main/java/org/onosproject/ofagent/cli/OFAgentListCommand.java
+++ b/apps/ofagent/src/main/java/org/onosproject/ofagent/cli/OFAgentListCommand.java
@@ -15,7 +15,8 @@
  */
 package org.onosproject.ofagent.cli;
 
-import org.apache.karaf.shell.commands.Command;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.ofagent.api.OFAgentService;
 
@@ -25,6 +26,7 @@
 /**
  * Lists the existing OFAgents.
  */
+@Service
 @Command(scope = "onos", name = "ofagents", description = "Lists all ofagents")
 public class OFAgentListCommand extends AbstractShellCommand {
 
@@ -32,7 +34,7 @@
     private static final String CTRL = "%s:%s";
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         OFAgentService service = get(OFAgentService.class);
         print(FORMAT, "Network", "Status", "Controllers");
 
diff --git a/apps/ofagent/src/main/java/org/onosproject/ofagent/cli/OFAgentRemoveCommand.java b/apps/ofagent/src/main/java/org/onosproject/ofagent/cli/OFAgentRemoveCommand.java
index 8d3cc75..1ec25c0 100644
--- a/apps/ofagent/src/main/java/org/onosproject/ofagent/cli/OFAgentRemoveCommand.java
+++ b/apps/ofagent/src/main/java/org/onosproject/ofagent/cli/OFAgentRemoveCommand.java
@@ -15,8 +15,9 @@
  */
 package org.onosproject.ofagent.cli;
 
-import org.apache.karaf.shell.commands.Argument;
-import org.apache.karaf.shell.commands.Command;
+import org.apache.karaf.shell.api.action.Argument;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.incubator.net.virtual.NetworkId;
 import org.onosproject.ofagent.api.OFAgent;
@@ -25,6 +26,7 @@
 /**
  * Removes the existing OFAgent.
  */
+@Service
 @Command(scope = "onos", name = "ofagent-remove", description = "Removes the ofagent")
 public class OFAgentRemoveCommand extends AbstractShellCommand {
 
@@ -33,7 +35,7 @@
     private long networkId = NetworkId.NONE.id();
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         OFAgentAdminService adminService = get(OFAgentAdminService.class);
         OFAgent removed = adminService.removeAgent(NetworkId.networkId(networkId));
         if (removed != null) {
diff --git a/apps/ofagent/src/main/java/org/onosproject/ofagent/cli/OFAgentStartCommand.java b/apps/ofagent/src/main/java/org/onosproject/ofagent/cli/OFAgentStartCommand.java
index 390101e..a7c3fd0 100644
--- a/apps/ofagent/src/main/java/org/onosproject/ofagent/cli/OFAgentStartCommand.java
+++ b/apps/ofagent/src/main/java/org/onosproject/ofagent/cli/OFAgentStartCommand.java
@@ -15,8 +15,9 @@
  */
 package org.onosproject.ofagent.cli;
 
-import org.apache.karaf.shell.commands.Argument;
-import org.apache.karaf.shell.commands.Command;
+import org.apache.karaf.shell.api.action.Argument;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.incubator.net.virtual.NetworkId;
 import org.onosproject.ofagent.api.OFAgentAdminService;
@@ -24,6 +25,7 @@
 /**
  * Starts the OFAgent.
  */
+@Service
 @Command(scope = "onos", name = "ofagent-start", description = "Starts the ofagent")
 public class OFAgentStartCommand extends AbstractShellCommand {
 
@@ -32,7 +34,7 @@
     private long networkId = NetworkId.NONE.id();
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         OFAgentAdminService adminService = get(OFAgentAdminService.class);
         adminService.startAgent(NetworkId.networkId(networkId));
         print("Successfully started OFAgent for network %s", networkId);
diff --git a/apps/ofagent/src/main/java/org/onosproject/ofagent/cli/OFAgentStopCommand.java b/apps/ofagent/src/main/java/org/onosproject/ofagent/cli/OFAgentStopCommand.java
index 95367d9..bfbfbd3 100644
--- a/apps/ofagent/src/main/java/org/onosproject/ofagent/cli/OFAgentStopCommand.java
+++ b/apps/ofagent/src/main/java/org/onosproject/ofagent/cli/OFAgentStopCommand.java
@@ -15,8 +15,9 @@
  */
 package org.onosproject.ofagent.cli;
 
-import org.apache.karaf.shell.commands.Argument;
-import org.apache.karaf.shell.commands.Command;
+import org.apache.karaf.shell.api.action.Argument;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.incubator.net.virtual.NetworkId;
 import org.onosproject.ofagent.api.OFAgentAdminService;
@@ -24,6 +25,7 @@
 /**
  * Stops the OFAgent.
  */
+@Service
 @Command(scope = "onos", name = "ofagent-stop", description = "Stops the ofagent")
 public class OFAgentStopCommand extends AbstractShellCommand {
 
@@ -32,7 +34,7 @@
     private long networkId = NetworkId.NONE.id();
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         OFAgentAdminService adminService = get(OFAgentAdminService.class);
         adminService.stopAgent(NetworkId.networkId(networkId));
         print("Successfully stopped OFAgent for network %s", networkId);
diff --git a/apps/ofagent/src/main/java/org/onosproject/ofagent/cli/OFSwitchListCommand.java b/apps/ofagent/src/main/java/org/onosproject/ofagent/cli/OFSwitchListCommand.java
index 4ac5f15..d78f43e 100644
--- a/apps/ofagent/src/main/java/org/onosproject/ofagent/cli/OFSwitchListCommand.java
+++ b/apps/ofagent/src/main/java/org/onosproject/ofagent/cli/OFSwitchListCommand.java
@@ -15,8 +15,9 @@
  */
 package org.onosproject.ofagent.cli;
 
-import org.apache.karaf.shell.commands.Argument;
-import org.apache.karaf.shell.commands.Command;
+import org.apache.karaf.shell.api.action.Argument;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.incubator.net.virtual.NetworkId;
 import org.onosproject.ofagent.api.OFSwitch;
@@ -28,6 +29,7 @@
 /**
  * Lists virtual OF switches.
  */
+@Service
 @Command(scope = "onos", name = "ofagent-switches", description = "Lists all OF switches")
 public class OFSwitchListCommand extends AbstractShellCommand {
 
@@ -38,7 +40,7 @@
     private long networkId = NetworkId.NONE.id();
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         OFSwitchService service = get(OFSwitchService.class);
 
         Set<OFSwitch> ofSwitches;
diff --git a/apps/ofagent/src/main/java/org/onosproject/ofagent/impl/DistributedOFAgentStore.java b/apps/ofagent/src/main/java/org/onosproject/ofagent/impl/DistributedOFAgentStore.java
index 7e41243..4dd6a2a 100644
--- a/apps/ofagent/src/main/java/org/onosproject/ofagent/impl/DistributedOFAgentStore.java
+++ b/apps/ofagent/src/main/java/org/onosproject/ofagent/impl/DistributedOFAgentStore.java
@@ -16,12 +16,6 @@
 package org.onosproject.ofagent.impl;
 
 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.apache.felix.scr.annotations.Service;
 import org.onlab.util.KryoNamespace;
 import org.onosproject.core.ApplicationId;
 import org.onosproject.core.CoreService;
@@ -41,6 +35,11 @@
 import org.onosproject.store.service.Serializer;
 import org.onosproject.store.service.StorageService;
 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.util.Set;
@@ -51,15 +50,17 @@
 import static java.util.concurrent.Executors.newSingleThreadExecutor;
 import static org.onlab.util.Tools.groupedThreads;
 import static org.onosproject.ofagent.api.OFAgent.State.STARTED;
-import static org.onosproject.ofagent.api.OFAgentEvent.Type.*;
+import static org.onosproject.ofagent.api.OFAgentEvent.Type.OFAGENT_CONTROLLER_ADDED;
+import static org.onosproject.ofagent.api.OFAgentEvent.Type.OFAGENT_CONTROLLER_REMOVED;
+import static org.onosproject.ofagent.api.OFAgentEvent.Type.OFAGENT_STARTED;
+import static org.onosproject.ofagent.api.OFAgentEvent.Type.OFAGENT_STOPPED;
 import static org.onosproject.ofagent.api.OFAgentService.APPLICATION_NAME;
 import static org.slf4j.LoggerFactory.getLogger;
 
 /**
  * Implementation of the {@link OFAgentStore} with consistent map.
  */
-@Service
-@Component(immediate = true)
+@Component(immediate = true, service = OFAgentStore.class)
 public class DistributedOFAgentStore extends AbstractStore<OFAgentEvent, OFAgentStoreDelegate>
         implements OFAgentStore {
 
@@ -79,10 +80,10 @@
             .register(DefaultOFController.class)
             .build();
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected CoreService coreService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected StorageService storageService;
 
     private final ExecutorService eventExecutor = newSingleThreadExecutor(
diff --git a/apps/ofagent/src/main/java/org/onosproject/ofagent/impl/OFAgentManager.java b/apps/ofagent/src/main/java/org/onosproject/ofagent/impl/OFAgentManager.java
index e26841b..b5f6b43 100644
--- a/apps/ofagent/src/main/java/org/onosproject/ofagent/impl/OFAgentManager.java
+++ b/apps/ofagent/src/main/java/org/onosproject/ofagent/impl/OFAgentManager.java
@@ -15,12 +15,6 @@
  */
 package org.onosproject.ofagent.impl;
 
-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.LeadershipEvent;
 import org.onosproject.cluster.LeadershipEventListener;
@@ -40,6 +34,11 @@
 import org.onosproject.ofagent.api.OFAgentService;
 import org.onosproject.ofagent.api.OFAgentStore;
 import org.onosproject.ofagent.api.OFAgentStoreDelegate;
+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;
 
@@ -56,8 +55,7 @@
 /**
  * Implementation of OpenFlow agent service.
  */
-@Component(immediate = true)
-@Service
+@Component(immediate = true, service = { OFAgentService.class, OFAgentAdminService.class })
 public class OFAgentManager extends ListenerRegistry<OFAgentEvent, OFAgentListener>
         implements OFAgentService, OFAgentAdminService {
 
@@ -77,19 +75,19 @@
     private static final String ERR_NOT_EXIST = "does not exist";
     private static final String ERR_IN_USE = "is in start state, stop the agent first";
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected CoreService coreService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected LeadershipService leadershipService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected ClusterService clusterService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected VirtualNetworkService virtualNetService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected OFAgentStore ofAgentStore;
 
     private final ExecutorService eventExecutor = newSingleThreadExecutor(
diff --git a/apps/ofagent/src/main/java/org/onosproject/ofagent/impl/OFSwitchManager.java b/apps/ofagent/src/main/java/org/onosproject/ofagent/impl/OFSwitchManager.java
index aa9900d..dba63e2 100644
--- a/apps/ofagent/src/main/java/org/onosproject/ofagent/impl/OFSwitchManager.java
+++ b/apps/ofagent/src/main/java/org/onosproject/ofagent/impl/OFSwitchManager.java
@@ -19,12 +19,6 @@
 import com.google.common.collect.Lists;
 import io.netty.channel.ChannelOutboundInvoker;
 import io.netty.channel.nio.NioEventLoopGroup;
-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.LeadershipService;
 import org.onosproject.cluster.NodeId;
@@ -64,6 +58,11 @@
 import org.onosproject.ofagent.api.OFSwitch;
 import org.onosproject.ofagent.api.OFSwitchCapabilities;
 import org.onosproject.ofagent.api.OFSwitchService;
+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.projectfloodlight.openflow.types.DatapathId;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -87,8 +86,7 @@
 /**
  * Manages OF switches.
  */
-@Component(immediate = true)
-@Service
+@Component(immediate = true, service = OFSwitchService.class)
 public class OFSwitchManager implements OFSwitchService {
 
     private final Logger log = LoggerFactory.getLogger(getClass());
@@ -104,19 +102,19 @@
             .portBlocked()
             .build();
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected CoreService coreService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected LeadershipService leadershipService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected ClusterService clusterService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected VirtualNetworkService virtualNetService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected OFAgentService ofAgentService;
 
     private final ConcurrentHashMap<DeviceId, OFSwitch> ofSwitchMap = new ConcurrentHashMap<>();
diff --git a/apps/ofagent/src/main/resources/OSGI-INF/blueprint/shell-config.xml b/apps/ofagent/src/main/resources/OSGI-INF/blueprint/shell-config.xml
deleted file mode 100644
index 8e4c23e..0000000
--- a/apps/ofagent/src/main/resources/OSGI-INF/blueprint/shell-config.xml
+++ /dev/null
@@ -1,43 +0,0 @@
-<!--
-~ Copyright 2017-present Open Networking Foundation
-~
-~ Licensed under the Apache License, Version 2.0 (the "License");
-~ you may not use this file except in compliance with the License.
-~ You may obtain a copy of the License at
-~
-~     http://www.apache.org/licenses/LICENSE-2.0
-~
-~ Unless required by applicable law or agreed to in writing, software
-~ distributed under the License is distributed on an "AS IS" BASIS,
-~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-~ See the License for the specific language governing permissions and
-~ limitations under the License.
--->
-<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0">
-    <command-bundle xmlns="http://karaf.apache.org/xmlns/shell/v1.1.0">
-        <command>
-            <action class="org.onosproject.ofagent.cli.OFAgentListCommand"/>
-        </command>
-        <command>
-            <action class="org.onosproject.ofagent.cli.OFAgentCreateCommand"/>
-        </command>
-        <command>
-            <action class="org.onosproject.ofagent.cli.OFAgentRemoveCommand"/>
-        </command>
-        <command>
-            <action class="org.onosproject.ofagent.cli.OFAgentStartCommand"/>
-        </command>
-        <command>
-            <action class="org.onosproject.ofagent.cli.OFAgentStopCommand"/>
-        </command>
-        <command>
-            <action class="org.onosproject.ofagent.cli.OFAgentAddControllerCommand"/>
-        </command>
-        <command>
-            <action class="org.onosproject.ofagent.cli.OFAgentDeleteControllerCommand"/>
-        </command>
-        <command>
-            <action class="org.onosproject.ofagent.cli.OFSwitchListCommand"/>
-        </command>
-    </command-bundle>
-</blueprint>
diff --git a/apps/openroadm/BUCK b/apps/openroadm/BUCK
deleted file mode 100644
index d529c3b..0000000
--- a/apps/openroadm/BUCK
+++ /dev/null
@@ -1,25 +0,0 @@
-APPS = [
-  'org.onosproject.yang',
-  'org.onosproject.yang-gui',
-  'org.onosproject.config',
-  'org.onosproject.restconf',
-  'org.onosproject.protocols.restconfserver',
-  'org.onosproject.netconf',
-  'org.onosproject.netconfsb',
-  'org.onosproject.models.openroadm',
-]
-
-BUNDLES = [
-  '//apps/openroadm/service:onos-apps-openroadm-service',
-  '//apps/openroadm/network:onos-apps-openroadm-network',
-]
-
-onos_app(
-  app_name = 'org.onosproject.openroadm',
-  title = 'Open ROADM',
-  category = 'Optical',
-  url = 'http://onosproject.org',
-  included_bundles = BUNDLES,
-  description = 'Open ROADM Application',
-  required_apps = APPS,
-)
diff --git a/apps/openroadm/network/BUCK b/apps/openroadm/network/BUCK
deleted file mode 100644
index 7e8d0b2..0000000
--- a/apps/openroadm/network/BUCK
+++ /dev/null
@@ -1,9 +0,0 @@
-COMPILE_DEPS = [
-  '//lib:CORE_DEPS',
-  '//models/openroadm:onos-models-openroadm',
-  '//core/store/serializers:onos-core-serializers',
-] + YANG_TOOLS
-
-osgi_jar_with_tests (
-    deps = COMPILE_DEPS,
-)
diff --git a/apps/openroadm/network/src/main/java/org/onosproject/openroadm/network/OpenRoadmNetworkModelRegistrator.java b/apps/openroadm/network/src/main/java/org/onosproject/openroadm/network/OpenRoadmNetworkModelRegistrator.java
index 3854cef..0ff0d3d 100644
--- a/apps/openroadm/network/src/main/java/org/onosproject/openroadm/network/OpenRoadmNetworkModelRegistrator.java
+++ b/apps/openroadm/network/src/main/java/org/onosproject/openroadm/network/OpenRoadmNetworkModelRegistrator.java
@@ -16,7 +16,7 @@
 package org.onosproject.openroadm.network;
 
 import com.google.common.collect.ImmutableMap;
-import org.apache.felix.scr.annotations.Component;
+import org.osgi.service.component.annotations.Component;
 import org.onosproject.yang.AbstractYangModelRegistrator;
 import org.onosproject.yang.gen.v1.ietfinettypes.rev20130715.IetfInetTypes;
 import org.onosproject.yang.gen.v1.orgopenroadmcommontypes.rev20161014.OrgOpenroadmCommonTypes;
diff --git a/apps/openroadm/service/BUCK b/apps/openroadm/service/BUCK
deleted file mode 100644
index 7e8d0b2..0000000
--- a/apps/openroadm/service/BUCK
+++ /dev/null
@@ -1,9 +0,0 @@
-COMPILE_DEPS = [
-  '//lib:CORE_DEPS',
-  '//models/openroadm:onos-models-openroadm',
-  '//core/store/serializers:onos-core-serializers',
-] + YANG_TOOLS
-
-osgi_jar_with_tests (
-    deps = COMPILE_DEPS,
-)
diff --git a/apps/openroadm/service/src/main/java/org/onosproject/openroadm/service/OpenRoadmServiceModelRegistrator.java b/apps/openroadm/service/src/main/java/org/onosproject/openroadm/service/OpenRoadmServiceModelRegistrator.java
index daf4de6..1908a41 100644
--- a/apps/openroadm/service/src/main/java/org/onosproject/openroadm/service/OpenRoadmServiceModelRegistrator.java
+++ b/apps/openroadm/service/src/main/java/org/onosproject/openroadm/service/OpenRoadmServiceModelRegistrator.java
@@ -16,7 +16,7 @@
 package org.onosproject.openroadm.service;
 
 import com.google.common.collect.ImmutableMap;
-import org.apache.felix.scr.annotations.Component;
+import org.osgi.service.component.annotations.Component;
 import org.onosproject.yang.AbstractYangModelRegistrator;
 import org.onosproject.yang.gen.v1.ietfinettypes.rev20130715.IetfInetTypes;
 import org.onosproject.yang.gen.v1.ietfyangtypes.rev20130715.IetfYangTypes;
diff --git a/apps/openstacknetworking/BUCK b/apps/openstacknetworking/BUCK
deleted file mode 100644
index 01778ea..0000000
--- a/apps/openstacknetworking/BUCK
+++ /dev/null
@@ -1,19 +0,0 @@
-BUNDLES = [
-    '//apps/openstacknetworking/api:onos-apps-openstacknetworking-api',
-    '//apps/openstacknetworking/app:onos-apps-openstacknetworking-app',
-    '//lib:httpclient-osgi',
-    '//lib:httpcore-osgi',
-    '//lib:commons-codec',
-    '//lib:sshd-core',
-]
-
-onos_app (
-    title = 'OpenStack Networking Application',
-    category = 'Integration',
-    url = 'https://wiki.onosproject.org/display/ONOS/SONA%3A+DC+Network+Virtualization',
-    included_bundles = BUNDLES,
-    description = 'SONA Openstack Networking Application.',
-    required_apps = [
-        'org.onosproject.openstacknode'
-    ]
-)
diff --git a/apps/openstacknetworking/api/BUCK b/apps/openstacknetworking/api/BUCK
deleted file mode 100644
index 61b333d..0000000
--- a/apps/openstacknetworking/api/BUCK
+++ /dev/null
@@ -1,13 +0,0 @@
-include_defs('//apps/openstacknode/openstack4j.bucklet')
-
-COMPILE_DEPS = [
-    '//lib:CORE_DEPS',
-    '//lib:openstack4j-core',
-    "//apps/openstacknode/api:onos-apps-openstacknode-api",
-]
-
-osgi_jar_with_tests (
-    deps = COMPILE_DEPS,
-
-    import_packages = INCLUDE_PACKAGES + ',' + EXCLUDE_PACKAGES  + ',' + ALL_PACKAGES,
-)
diff --git a/apps/openstacknetworking/api/src/main/java/org/onosproject/openstacknetworking/api/Constants.java b/apps/openstacknetworking/api/src/main/java/org/onosproject/openstacknetworking/api/Constants.java
index ead7234..1be5b35 100644
--- a/apps/openstacknetworking/api/src/main/java/org/onosproject/openstacknetworking/api/Constants.java
+++ b/apps/openstacknetworking/api/src/main/java/org/onosproject/openstacknetworking/api/Constants.java
@@ -45,7 +45,6 @@
     public static final String ARP_PROXY_MODE = "proxy";
 
     public static final String DEFAULT_GATEWAY_MAC_STR = "fe:00:00:00:00:02";
-    public static final String DEFAULT_ARP_MODE_STR = ARP_PROXY_MODE;
     public static final MacAddress DEFAULT_GATEWAY_MAC = MacAddress.valueOf(DEFAULT_GATEWAY_MAC_STR);
     public static final MacAddress DEFAULT_EXTERNAL_ROUTER_MAC = MacAddress.valueOf("fe:00:00:00:00:01");
 
diff --git a/apps/openstacknetworking/app/BUCK b/apps/openstacknetworking/app/BUCK
deleted file mode 100644
index a227e74..0000000
--- a/apps/openstacknetworking/app/BUCK
+++ /dev/null
@@ -1,55 +0,0 @@
-include_defs('//apps/openstacknode/openstack4j.bucklet')
-
-COMPILE_DEPS = [
-    '//lib:CORE_DEPS',
-    '//lib:JACKSON',
-    '//lib:KRYO',
-    '//core/store/serializers:onos-core-serializers',
-    '//lib:org.apache.karaf.shell.console',
-    '//lib:javax.ws.rs-api',
-    '//utils/rest:onlab-rest',
-    '//cli:onos-cli',
-    '//apps/openstacknode/api:onos-apps-openstacknode-api',
-    '//apps/openstacknetworking/api:onos-apps-openstacknetworking-api',
-    '//protocols/ovsdb/api:onos-protocols-ovsdb-api',
-    '//protocols/ovsdb/rfc:onos-protocols-ovsdb-rfc',
-    '//lib:httpclient-osgi',
-    '//lib:httpcore-osgi',
-    '//lib:commons-codec',
-    '//lib:openstack4j-core',
-    '//lib:openstack4j-http-connector',
-    '//lib:openstack4j-httpclient',
-    '//lib:json-patch',
-    '//lib:jackson-coreutils',
-    '//lib:btf',
-    '//lib:msg-simple',
-    '//lib:snakeyaml',
-    '//lib:sshd-core',
-]
-
-EXCLUDED_BUNDLES = [
-  '//lib:sshd-core',
-]
-
-TEST_DEPS = [
-    '//lib:TEST_ADAPTERS',
-    '//core/api:onos-api-tests',
-    '//core/common:onos-core-common-tests',
-    '//web/api:onos-rest-tests',
-    '//lib:TEST_REST',
-    '//apps/openstacknode/api:onos-apps-openstacknode-api-tests',
-]
-
-osgi_jar_with_tests (
-    deps = COMPILE_DEPS,
-    test_deps = TEST_DEPS,
-    web_context = '/onos/openstacknetworking',
-    api_title = 'OpenStack Networking API',
-    api_version = '1.0',
-    api_description = 'REST API for OpenStack Networking',
-    api_package = 'org.onosproject.openstacknetworking.web',
-
-    # dependency embedding
-    import_packages = INCLUDE_PACKAGES + ',' + EXCLUDE_PACKAGES  + ',' + ALL_PACKAGES,
-    bundle_classpath = get_openstack4j_deps_path() + get_jackson_deps_path()
-)
\ No newline at end of file
diff --git a/apps/openstacknetworking/app/app.xml b/apps/openstacknetworking/app/app.xml
deleted file mode 100644
index 781a92c..0000000
--- a/apps/openstacknetworking/app/app.xml
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-  ~ Copyright 2018-present Open Networking Foundation
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~     http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License.
-  -->
-<app name="org.onosproject.openstacknetworking" origin="Open Networking Foundation" version="${project.version}"
-     category="Utility" url="https://wiki.onosproject.org/display/ONOS/SONA%3A+DC+Network+Virtualization"
-     title="OpenStack Networking App" features="${project.artifactId}" apps="org.onosproject.openstacknode"
-     featuresRepo="mvn:${project.groupId}/${project.artifactId}/${project.version}/xml/features">
-    <description>${project.description}</description>
-    <artifact>mvn:${project.groupId}/onos-apps-openstacknetworking-api/${project.version}</artifact>
-    <artifact>mvn:${project.groupId}/onos-apps-openstacknetworking-app/${project.version}</artifact>
-</app>
diff --git a/apps/openstacknetworking/app/features.xml b/apps/openstacknetworking/app/features.xml
deleted file mode 100644
index 51cb23f..0000000
--- a/apps/openstacknetworking/app/features.xml
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
-<!--
-  ~ Copyright 2018-present Open Networking Foundation
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~     http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License.
-  -->
-<features xmlns="http://karaf.apache.org/xmlns/features/v1.2.0" name="${project.artifactId}-${project.version}">
-    <feature name="${project.artifactId}" version="${project.version}"
-             description="${project.description}">
-        <feature>onos-api</feature>
-        <bundle>mvn:${project.groupId}/onos-apps-openstacknetworking-api/${project.version}</bundle>
-        <bundle>mvn:${project.groupId}/onos-apps-openstacknetworking-app/${project.version}</bundle>
-    </feature>
-</features>
diff --git a/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/cli/ArpModeCompleter.java b/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/cli/ArpModeCompleter.java
index 1edc547..b27eb3f 100644
--- a/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/cli/ArpModeCompleter.java
+++ b/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/cli/ArpModeCompleter.java
@@ -16,6 +16,7 @@
 package org.onosproject.openstacknetworking.cli;
 
 import com.google.common.collect.Lists;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.cli.AbstractChoicesCompleter;
 
 import java.util.List;
@@ -23,6 +24,7 @@
 /**
  * ARP mode completer.
  */
+@Service
 public class ArpModeCompleter extends AbstractChoicesCompleter {
 
     @Override
diff --git a/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/cli/DeleteExternalPeerRouterCommand.java b/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/cli/DeleteExternalPeerRouterCommand.java
index 0ef3861..25a7858 100644
--- a/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/cli/DeleteExternalPeerRouterCommand.java
+++ b/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/cli/DeleteExternalPeerRouterCommand.java
@@ -16,8 +16,9 @@
 package org.onosproject.openstacknetworking.cli;
 
 import com.google.common.collect.Lists;
-import org.apache.karaf.shell.commands.Argument;
-import org.apache.karaf.shell.commands.Command;
+import org.apache.karaf.shell.api.action.Argument;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.openstacknetworking.api.ExternalPeerRouter;
 import org.onosproject.openstacknetworking.api.OpenstackNetworkAdminService;
@@ -27,6 +28,7 @@
 /**
  * Deletes external peer router.
  */
+@Service
 @Command(scope = "onos", name = "openstack-delete-peer-router",
         description = "Delete external peer router")
 public class DeleteExternalPeerRouterCommand extends AbstractShellCommand {
@@ -38,7 +40,7 @@
     private static final String NO_ELEMENT = "There's no external peer router information with given ip address";
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         OpenstackNetworkAdminService service = AbstractShellCommand.get(OpenstackNetworkAdminService.class);
 
         if (service.externalPeerRouters().stream()
diff --git a/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/cli/DirectPortListCompleter.java b/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/cli/DirectPortListCompleter.java
index d44b8d4..f2b1e20 100644
--- a/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/cli/DirectPortListCompleter.java
+++ b/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/cli/DirectPortListCompleter.java
@@ -15,8 +15,11 @@
  */
 package org.onosproject.openstacknetworking.cli;
 
-import org.apache.karaf.shell.console.Completer;
-import org.apache.karaf.shell.console.completer.StringsCompleter;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
+import org.apache.karaf.shell.api.console.CommandLine;
+import org.apache.karaf.shell.api.console.Completer;
+import org.apache.karaf.shell.api.console.Session;
+import org.apache.karaf.shell.support.completers.StringsCompleter;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.openstacknetworking.api.OpenstackNetworkService;
 import org.openstack4j.model.network.Port;
@@ -32,10 +35,11 @@
 /**
  * Direct port completer.
  */
+@Service
 public class DirectPortListCompleter implements Completer {
 
     @Override
-    public int complete(String buffer, int cursor, List<String> candidates) {
+    public int complete(Session session, CommandLine commandLine, List<String> candidates) {
         StringsCompleter delegate = new StringsCompleter();
         OpenstackNetworkService osNetService = AbstractShellCommand.get(OpenstackNetworkService.class);
         Set<String> set = osNetService.ports().stream()
@@ -49,6 +53,6 @@
         while (it.hasNext()) {
             strings.add(it.next().toString());
         }
-        return delegate.complete(buffer, cursor, candidates);
+        return delegate.complete(session, commandLine, candidates);
     }
 }
diff --git a/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/cli/ExternalPeerRouterListCommand.java b/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/cli/ExternalPeerRouterListCommand.java
index 99a95c0..9f67ef9 100644
--- a/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/cli/ExternalPeerRouterListCommand.java
+++ b/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/cli/ExternalPeerRouterListCommand.java
@@ -18,7 +18,8 @@
 import com.fasterxml.jackson.databind.ObjectMapper;
 import com.fasterxml.jackson.databind.node.ArrayNode;
 import com.google.common.collect.Lists;
-import org.apache.karaf.shell.commands.Command;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.openstacknetworking.api.ExternalPeerRouter;
 import org.onosproject.openstacknetworking.api.OpenstackNetworkService;
@@ -30,6 +31,7 @@
 /**
  * Lists external peer router lists.
  */
+@Service
 @Command(scope = "onos", name = "openstack-peer-routers",
         description = "Lists external peer router lists")
 public class ExternalPeerRouterListCommand extends AbstractShellCommand {
@@ -37,7 +39,7 @@
     private static final String FORMAT = "%-20s%-20s%-20s";
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         OpenstackNetworkService service = AbstractShellCommand.get(OpenstackNetworkService.class);
         List<ExternalPeerRouter> routers = Lists.newArrayList(service.externalPeerRouters());
 
diff --git a/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/cli/InstanceIpAddressCompleter.java b/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/cli/InstanceIpAddressCompleter.java
index a41a643..708d4f6 100644
--- a/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/cli/InstanceIpAddressCompleter.java
+++ b/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/cli/InstanceIpAddressCompleter.java
@@ -15,8 +15,11 @@
  */
 package org.onosproject.openstacknetworking.cli;
 
-import org.apache.karaf.shell.console.Completer;
-import org.apache.karaf.shell.console.completer.StringsCompleter;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
+import org.apache.karaf.shell.api.console.CommandLine;
+import org.apache.karaf.shell.api.console.Completer;
+import org.apache.karaf.shell.api.console.Session;
+import org.apache.karaf.shell.support.completers.StringsCompleter;
 import org.onlab.packet.IpAddress;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.openstacknetworking.api.InstancePort;
@@ -31,11 +34,12 @@
 /**
  * Instance port ip address completer.
  */
+@Service
 public class InstanceIpAddressCompleter implements Completer {
     private static final String EXTERNAL_IP = "8.8.8.8";
 
     @Override
-    public int complete(String buffer, int cursor, List<String> candidates) {
+    public int complete(Session session, CommandLine commandLine, List<String> candidates) {
         StringsCompleter delegate = new StringsCompleter();
         InstancePortService instancePortService =
                 AbstractShellCommand.get(InstancePortService.class);
@@ -53,7 +57,7 @@
             strings.add(it.next().toString());
         }
 
-        return delegate.complete(buffer, cursor, candidates);
+        return delegate.complete(session, commandLine, candidates);
 
 
     }
diff --git a/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/cli/InstancePortIdCompleter.java b/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/cli/InstancePortIdCompleter.java
index c18a0a4..bf6a0e9 100644
--- a/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/cli/InstancePortIdCompleter.java
+++ b/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/cli/InstancePortIdCompleter.java
@@ -15,8 +15,11 @@
  */
 package org.onosproject.openstacknetworking.cli;
 
-import org.apache.karaf.shell.console.Completer;
-import org.apache.karaf.shell.console.completer.StringsCompleter;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
+import org.apache.karaf.shell.api.console.CommandLine;
+import org.apache.karaf.shell.api.console.Completer;
+import org.apache.karaf.shell.api.console.Session;
+import org.apache.karaf.shell.support.completers.StringsCompleter;
 import org.onosproject.openstacknetworking.api.InstancePort;
 import org.onosproject.openstacknetworking.api.InstancePortService;
 
@@ -30,10 +33,11 @@
 /**
  * Instance port ID completer.
  */
+@Service
 public class InstancePortIdCompleter implements Completer {
 
     @Override
-    public int complete(String buffer, int cursor, List<String> candidates) {
+    public int complete(Session session, CommandLine commandLine, List<String> candidates) {
         StringsCompleter delegate = new StringsCompleter();
 
         InstancePortService service = get(InstancePortService.class);
@@ -43,6 +47,6 @@
 
         strings.addAll(portIds);
 
-        return delegate.complete(buffer, cursor, candidates);
+        return delegate.complete(session, commandLine, candidates);
     }
 }
diff --git a/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/cli/InstancePortListCommand.java b/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/cli/InstancePortListCommand.java
index 8b0d111..e8c901c 100644
--- a/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/cli/InstancePortListCommand.java
+++ b/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/cli/InstancePortListCommand.java
@@ -18,7 +18,8 @@
 import com.fasterxml.jackson.databind.ObjectMapper;
 import com.fasterxml.jackson.databind.node.ArrayNode;
 import com.google.common.collect.Lists;
-import org.apache.karaf.shell.commands.Command;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.openstacknetworking.api.InstancePort;
 import org.onosproject.openstacknetworking.api.InstancePortService;
@@ -31,6 +32,7 @@
 /**
  * Lists OpenStack instance ports.
  */
+@Service
 @Command(scope = "onos", name = "openstack-instance-ports",
         description = "Lists all OpenStack instance ports")
 public class InstancePortListCommand extends AbstractShellCommand {
@@ -38,7 +40,7 @@
     private static final String FORMAT = "%-40s%-10s%-25s%-15s%-20s";
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         InstancePortService service = get(InstancePortService.class);
         List<InstancePort> instancePorts = Lists.newArrayList(service.instancePorts());
         instancePorts.sort(Comparator.comparing(InstancePort::portId));
diff --git a/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/cli/IpAddressCompleter.java b/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/cli/IpAddressCompleter.java
index bac877d..1dd3777 100644
--- a/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/cli/IpAddressCompleter.java
+++ b/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/cli/IpAddressCompleter.java
@@ -15,8 +15,11 @@
  */
 package org.onosproject.openstacknetworking.cli;
 
-import org.apache.karaf.shell.console.Completer;
-import org.apache.karaf.shell.console.completer.StringsCompleter;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
+import org.apache.karaf.shell.api.console.CommandLine;
+import org.apache.karaf.shell.api.console.Completer;
+import org.apache.karaf.shell.api.console.Session;
+import org.apache.karaf.shell.support.completers.StringsCompleter;
 import org.onlab.packet.IpAddress;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.openstacknetworking.api.ExternalPeerRouter;
@@ -31,10 +34,11 @@
 /**
  * IP Address Completer.
  */
+@Service
 public class IpAddressCompleter implements Completer {
 
     @Override
-    public int complete(String buffer, int cursor, List<String> candidates) {
+    public int complete(Session session, CommandLine commandLine, List<String> candidates) {
         StringsCompleter delegate = new StringsCompleter();
         OpenstackNetworkService osNetService = AbstractShellCommand.get(OpenstackNetworkService.class);
         Set<IpAddress> set = osNetService.externalPeerRouters().stream()
@@ -48,7 +52,7 @@
             strings.add(it.next().toString());
         }
 
-        return delegate.complete(buffer, cursor, candidates);
+        return delegate.complete(session, commandLine, candidates);
 
     }
 }
diff --git a/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/cli/MacAddressCompleter.java b/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/cli/MacAddressCompleter.java
index 3b6e475..d55d246 100644
--- a/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/cli/MacAddressCompleter.java
+++ b/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/cli/MacAddressCompleter.java
@@ -15,8 +15,11 @@
  */
 package org.onosproject.openstacknetworking.cli;
 
-import org.apache.karaf.shell.console.Completer;
-import org.apache.karaf.shell.console.completer.StringsCompleter;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
+import org.apache.karaf.shell.api.console.CommandLine;
+import org.apache.karaf.shell.api.console.Completer;
+import org.apache.karaf.shell.api.console.Session;
+import org.apache.karaf.shell.support.completers.StringsCompleter;
 import org.onlab.packet.MacAddress;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.openstacknetworking.api.ExternalPeerRouter;
@@ -31,10 +34,11 @@
 /**
  * Mac Address Completer.
  */
+@Service
 public class MacAddressCompleter implements Completer {
 
         @Override
-        public int complete(String buffer, int cursor, List<String> candidates) {
+        public int complete(Session session, CommandLine commandLine, List<String> candidates) {
         StringsCompleter delegate = new StringsCompleter();
         OpenstackNetworkService osNetService = AbstractShellCommand.get(OpenstackNetworkService.class);
         Set<MacAddress> set = osNetService.externalPeerRouters().stream()
@@ -48,7 +52,7 @@
             strings.add(it.next().toString());
         }
 
-        return delegate.complete(buffer, cursor, candidates);
+        return delegate.complete(session, commandLine, candidates);
 
     }
     }
diff --git a/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/cli/OpenstackAddAclCommand.java b/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/cli/OpenstackAddAclCommand.java
index 45a7658..0a527e0 100644
--- a/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/cli/OpenstackAddAclCommand.java
+++ b/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/cli/OpenstackAddAclCommand.java
@@ -15,8 +15,9 @@
  */
 package org.onosproject.openstacknetworking.cli;
 
-import org.apache.karaf.shell.commands.Argument;
-import org.apache.karaf.shell.commands.Command;
+import org.apache.karaf.shell.api.action.Argument;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onlab.packet.Ethernet;
 import org.onlab.packet.IPv4;
 import org.onlab.packet.IpAddress;
@@ -41,6 +42,7 @@
 /**
  * Add acl.
  */
+@Service
 @Command(scope = "onos", name = "openstack-add-acl",
         description = "Add acl rules to VM")
 public class OpenstackAddAclCommand extends AbstractShellCommand {
@@ -57,7 +59,7 @@
     private int dstPort = 0;
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
 
         OpenstackFlowRuleService flowRuleService = AbstractShellCommand.get(OpenstackFlowRuleService.class);
         CoreService coreService = AbstractShellCommand.get(CoreService.class);
diff --git a/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/cli/OpenstackConfigArpModeCommand.java b/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/cli/OpenstackConfigArpModeCommand.java
index 5f954ef..0b5d226 100644
--- a/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/cli/OpenstackConfigArpModeCommand.java
+++ b/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/cli/OpenstackConfigArpModeCommand.java
@@ -15,8 +15,9 @@
  */
 package org.onosproject.openstacknetworking.cli;
 
-import org.apache.karaf.shell.commands.Argument;
-import org.apache.karaf.shell.commands.Command;
+import org.apache.karaf.shell.api.action.Argument;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.cfg.ComponentConfigService;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.core.ApplicationId;
@@ -37,6 +38,7 @@
 /**
  * Configure ARP mode.
  */
+@Service
 @Command(scope = "onos", name = "openstack-config-arp-mode",
         description = "Re-configure ARP mode (proxy | broadcast)")
 public class OpenstackConfigArpModeCommand extends AbstractShellCommand {
@@ -49,7 +51,7 @@
     String arpMode = null;
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
 
         if (checkArpMode(arpMode)) {
             configArpMode(arpMode);
diff --git a/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/cli/OpenstackDirectPortAddCommand.java b/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/cli/OpenstackDirectPortAddCommand.java
index c6ff793..85da732 100644
--- a/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/cli/OpenstackDirectPortAddCommand.java
+++ b/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/cli/OpenstackDirectPortAddCommand.java
@@ -15,8 +15,9 @@
  */
 package org.onosproject.openstacknetworking.cli;
 
-import org.apache.karaf.shell.commands.Argument;
-import org.apache.karaf.shell.commands.Command;
+import org.apache.karaf.shell.api.action.Argument;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.net.device.DeviceService;
 import org.onosproject.openstacknetworking.api.OpenstackNetworkService;
@@ -36,6 +37,7 @@
  * VM is instantiated but the related VF port can't be added.
  * After recovering ovsdb connection, you can manually add VF ports by this CLI.
  */
+@Service
 @Command(scope = "onos", name = "openstack-direct-port-add",
         description = "Manually adds OpenStack direct ports to the device")
 public class OpenstackDirectPortAddCommand extends AbstractShellCommand {
@@ -43,7 +45,7 @@
     private String portId = null;
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         OpenstackNetworkService osNetService = AbstractShellCommand.get(OpenstackNetworkService.class);
         OpenstackNodeService osNodeService = AbstractShellCommand.get(OpenstackNodeService.class);
         DeviceService deviceService = AbstractShellCommand.get(DeviceService.class);
diff --git a/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/cli/OpenstackDirectPortListCommand.java b/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/cli/OpenstackDirectPortListCommand.java
index 9466481..55e7c39 100644
--- a/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/cli/OpenstackDirectPortListCommand.java
+++ b/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/cli/OpenstackDirectPortListCommand.java
@@ -15,7 +15,8 @@
  */
 package org.onosproject.openstacknetworking.cli;
 
-import org.apache.karaf.shell.commands.Command;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.openstacknetworking.api.OpenstackNetworkService;
 import org.openstack4j.model.network.IP;
@@ -32,6 +33,7 @@
 /**
  * Lists OpenStack direct ports.
  */
+@Service
 @Command(scope = "onos", name = "openstack-direct-ports",
         description = "Lists all OpenStack direct ports")
 public class OpenstackDirectPortListCommand extends AbstractShellCommand {
@@ -39,7 +41,7 @@
     private static final String FORMAT = "%-40s%-20s%-20s%-20s%-20s%-20s";
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         OpenstackNetworkService service = AbstractShellCommand.get(OpenstackNetworkService.class);
 
         List<Port> ports = service.ports().stream()
diff --git a/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/cli/OpenstackFloatingIpListCommand.java b/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/cli/OpenstackFloatingIpListCommand.java
index b30cf1e..9af9a1a 100644
--- a/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/cli/OpenstackFloatingIpListCommand.java
+++ b/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/cli/OpenstackFloatingIpListCommand.java
@@ -19,7 +19,8 @@
 import com.fasterxml.jackson.databind.node.ArrayNode;
 import com.google.common.base.Strings;
 import com.google.common.collect.Lists;
-import org.apache.karaf.shell.commands.Command;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.openstacknetworking.api.OpenstackRouterService;
 import org.openstack4j.model.network.NetFloatingIP;
@@ -34,6 +35,7 @@
 /**
  * Lists OpenStack floating IP addresses.
  */
+@Service
 @Command(scope = "onos", name = "openstack-floatingips",
         description = "Lists all OpenStack floating IP addresses")
 public class OpenstackFloatingIpListCommand extends AbstractShellCommand {
@@ -41,7 +43,7 @@
     private static final String FORMAT = "%-40s%-20s%-20s";
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         OpenstackRouterService service = AbstractShellCommand.get(OpenstackRouterService.class);
         List<NetFloatingIP> floatingIps = Lists.newArrayList(service.floatingIps());
         floatingIps.sort(Comparator.comparing(NetFloatingIP::getFloatingIpAddress));
diff --git a/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/cli/OpenstackFlowTraceCommand.java b/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/cli/OpenstackFlowTraceCommand.java
index bbaaaff..ad5ef21 100644
--- a/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/cli/OpenstackFlowTraceCommand.java
+++ b/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/cli/OpenstackFlowTraceCommand.java
@@ -15,8 +15,9 @@
  */
 package org.onosproject.openstacknetworking.cli;
 
-import org.apache.karaf.shell.commands.Argument;
-import org.apache.karaf.shell.commands.Command;
+import org.apache.karaf.shell.api.action.Argument;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.openstacknetworking.api.InstancePort;
 import org.onosproject.openstacknetworking.api.InstancePortAdminService;
@@ -32,6 +33,7 @@
 /**
  * Requests flow trace command.
  */
+@Service
 @Command(scope = "onos", name = "openstack-flow-trace",
         description = "Requests flow trace command")
 public class OpenstackFlowTraceCommand extends AbstractShellCommand {
@@ -50,7 +52,7 @@
 
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         OpenstackNodeAdminService osNodeService = AbstractShellCommand.get(OpenstackNodeAdminService.class);
         InstancePortAdminService instancePortService = AbstractShellCommand.get(InstancePortAdminService.class);
         OpenstackNetworkAdminService osNetService = AbstractShellCommand.get(OpenstackNetworkAdminService.class);
diff --git a/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/cli/OpenstackNetworkListCommand.java b/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/cli/OpenstackNetworkListCommand.java
index 3a68356..2c709f1 100644
--- a/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/cli/OpenstackNetworkListCommand.java
+++ b/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/cli/OpenstackNetworkListCommand.java
@@ -18,7 +18,8 @@
 import com.fasterxml.jackson.databind.ObjectMapper;
 import com.fasterxml.jackson.databind.node.ArrayNode;
 import com.google.common.collect.Lists;
-import org.apache.karaf.shell.commands.Command;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.openstacknetworking.api.OpenstackNetworkService;
 import org.openstack4j.model.network.Network;
@@ -35,6 +36,7 @@
 /**
  * Lists OpenStack networks.
  */
+@Service
 @Command(scope = "onos", name = "openstack-networks",
         description = "Lists all OpenStack networks")
 public class OpenstackNetworkListCommand extends AbstractShellCommand {
@@ -42,7 +44,7 @@
     private static final String FORMAT = "%-40s%-20s%-20s%-20s%-16s%-8s";
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         OpenstackNetworkService service = AbstractShellCommand.get(OpenstackNetworkService.class);
         List<Network> networks = Lists.newArrayList(service.networks());
         networks.sort(Comparator.comparing(Network::getName));
diff --git a/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/cli/OpenstackPortListCommand.java b/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/cli/OpenstackPortListCommand.java
index 1861f44..176d7f8 100644
--- a/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/cli/OpenstackPortListCommand.java
+++ b/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/cli/OpenstackPortListCommand.java
@@ -19,8 +19,9 @@
 import com.fasterxml.jackson.databind.node.ArrayNode;
 import com.google.common.base.Strings;
 import com.google.common.collect.Lists;
-import org.apache.karaf.shell.commands.Argument;
-import org.apache.karaf.shell.commands.Command;
+import org.apache.karaf.shell.api.action.Argument;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.openstacknetworking.api.OpenstackNetworkService;
 import org.openstack4j.model.network.IP;
@@ -38,6 +39,7 @@
 /**
  * Lists OpenStack ports.
  */
+@Service
 @Command(scope = "onos", name = "openstack-ports",
         description = "Lists all OpenStack ports")
 public class OpenstackPortListCommand extends AbstractShellCommand {
@@ -48,7 +50,7 @@
     private String networkId = null;
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         OpenstackNetworkService service = AbstractShellCommand.get(OpenstackNetworkService.class);
 
         List<Port> ports = Lists.newArrayList(service.ports());
diff --git a/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/cli/OpenstackPurgeRulesCommand.java b/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/cli/OpenstackPurgeRulesCommand.java
index be72076..707b5e6 100644
--- a/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/cli/OpenstackPurgeRulesCommand.java
+++ b/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/cli/OpenstackPurgeRulesCommand.java
@@ -15,7 +15,8 @@
  */
 package org.onosproject.openstacknetworking.cli;
 
-import org.apache.karaf.shell.commands.Command;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.core.ApplicationId;
 import org.onosproject.core.CoreService;
@@ -25,12 +26,13 @@
 /**
  * Purges all existing network states.
  */
+@Service
 @Command(scope = "onos", name = "openstack-purge-rules",
         description = "Purges all flow rules installed by OpenStack networking app")
 public class OpenstackPurgeRulesCommand extends AbstractShellCommand {
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         FlowRuleService flowRuleService = AbstractShellCommand.get(FlowRuleService.class);
         CoreService coreService = AbstractShellCommand.get(CoreService.class);
         ApplicationId appId = coreService.getAppId(Constants.OPENSTACK_NETWORKING_APP_ID);
diff --git a/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/cli/OpenstackPurgeStateCommand.java b/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/cli/OpenstackPurgeStateCommand.java
index 8601505..ad65e69 100644
--- a/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/cli/OpenstackPurgeStateCommand.java
+++ b/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/cli/OpenstackPurgeStateCommand.java
@@ -15,7 +15,8 @@
  */
 package org.onosproject.openstacknetworking.cli;
 
-import org.apache.karaf.shell.commands.Command;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.openstacknetworking.api.OpenstackNetworkAdminService;
 import org.onosproject.openstacknetworking.api.OpenstackRouterAdminService;
@@ -24,12 +25,13 @@
 /**
  * Purges all existing network states.
  */
+@Service
 @Command(scope = "onos", name = "openstack-purge-states",
         description = "Purges all OpenStack network states")
 public class OpenstackPurgeStateCommand extends AbstractShellCommand {
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         get(OpenstackRouterAdminService.class).clear();
         get(OpenstackNetworkAdminService.class).clear();
         get(OpenstackSecurityGroupAdminService.class).clear();
diff --git a/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/cli/OpenstackRemoveAclCommand.java b/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/cli/OpenstackRemoveAclCommand.java
index a34fe9e..70a2347 100644
--- a/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/cli/OpenstackRemoveAclCommand.java
+++ b/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/cli/OpenstackRemoveAclCommand.java
@@ -15,8 +15,9 @@
  */
 package org.onosproject.openstacknetworking.cli;
 
-import org.apache.karaf.shell.commands.Argument;
-import org.apache.karaf.shell.commands.Command;
+import org.apache.karaf.shell.api.action.Argument;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onlab.packet.Ethernet;
 import org.onlab.packet.IPv4;
 import org.onlab.packet.IpAddress;
@@ -38,6 +39,7 @@
 import static org.onosproject.openstacknetworking.api.Constants.OPENSTACK_NETWORKING_APP_ID;
 import static org.onosproject.openstacknetworking.api.Constants.PRIORITY_FORCED_ACL_RULE;
 
+@Service
 @Command(scope = "onos", name = "openstack-remove-acl",
         description = "Remove acl rules to VM")
 public class OpenstackRemoveAclCommand extends AbstractShellCommand {
@@ -54,7 +56,7 @@
     private int dstPort = 0;
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
 
         OpenstackFlowRuleService flowRuleService = AbstractShellCommand.get(OpenstackFlowRuleService.class);
         CoreService coreService = AbstractShellCommand.get(CoreService.class);
diff --git a/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/cli/OpenstackResetPortsCommand.java b/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/cli/OpenstackResetPortsCommand.java
index 86158e3..adfd5c2 100755
--- a/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/cli/OpenstackResetPortsCommand.java
+++ b/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/cli/OpenstackResetPortsCommand.java
@@ -15,9 +15,10 @@
  */
 package org.onosproject.openstacknetworking.cli;
 
-import org.apache.karaf.shell.commands.Argument;
-import org.apache.karaf.shell.commands.Command;
-import org.apache.karaf.shell.commands.Option;
+import org.apache.karaf.shell.api.action.Argument;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.Option;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.openstacknetworking.api.InstancePort;
 import org.onosproject.openstacknetworking.api.InstancePortAdminService;
@@ -28,6 +29,7 @@
 /**
  * Purges existing instance ports.
  */
+@Service
 @Command(scope = "onos", name = "openstack-reset-ports",
         description = "Reset existing instance ports created by OpenStack networking app")
 public class OpenstackResetPortsCommand extends AbstractShellCommand {
@@ -48,7 +50,7 @@
     private static final long SLEEP_MS = 1000; // we wait 1s for reset each port
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         InstancePortAdminService service = get(InstancePortAdminService.class);
 
         if ((!isAll && !isInactive && portIds == null) ||
diff --git a/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/cli/OpenstackRouterListCommand.java b/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/cli/OpenstackRouterListCommand.java
index a1aca70..f635131 100644
--- a/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/cli/OpenstackRouterListCommand.java
+++ b/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/cli/OpenstackRouterListCommand.java
@@ -18,7 +18,8 @@
 import com.fasterxml.jackson.databind.ObjectMapper;
 import com.fasterxml.jackson.databind.node.ArrayNode;
 import com.google.common.collect.Lists;
-import org.apache.karaf.shell.commands.Command;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.openstacknetworking.api.OpenstackNetworkService;
 import org.onosproject.openstacknetworking.api.OpenstackRouterService;
@@ -39,6 +40,7 @@
 /**
  * Lists OpenStack routers.
  */
+@Service
 @Command(scope = "onos", name = "openstack-routers",
         description = "Lists all OpenStack routers")
 public class OpenstackRouterListCommand extends AbstractShellCommand {
@@ -51,7 +53,7 @@
             AbstractShellCommand.get(OpenstackNetworkService.class);
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         List<Router> routers = Lists.newArrayList(routerService.routers());
         routers.sort(Comparator.comparing(Router::getName));
 
diff --git a/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/cli/OpenstackSecurityGroupListCommand.java b/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/cli/OpenstackSecurityGroupListCommand.java
index b20408c..e772840 100644
--- a/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/cli/OpenstackSecurityGroupListCommand.java
+++ b/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/cli/OpenstackSecurityGroupListCommand.java
@@ -18,8 +18,9 @@
 import com.fasterxml.jackson.databind.ObjectMapper;
 import com.fasterxml.jackson.databind.node.ArrayNode;
 import com.google.common.collect.Lists;
-import org.apache.karaf.shell.commands.Argument;
-import org.apache.karaf.shell.commands.Command;
+import org.apache.karaf.shell.api.action.Argument;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.openstacknetworking.api.OpenstackSecurityGroupService;
 import org.openstack4j.model.network.SecurityGroup;
@@ -34,6 +35,7 @@
 /**
  * Lists OpenStack security groups.
  */
+@Service
 @Command(scope = "onos", name = "openstack-security-groups",
         description = "Lists all OpenStack security groups")
 public class OpenstackSecurityGroupListCommand extends AbstractShellCommand {
@@ -44,7 +46,7 @@
     private String networkId = null;
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         OpenstackSecurityGroupService service =
                 AbstractShellCommand.get(OpenstackSecurityGroupService.class);
 
diff --git a/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/cli/OpenstackSubnetListCommand.java b/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/cli/OpenstackSubnetListCommand.java
index 69573e2..75bb1d5 100644
--- a/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/cli/OpenstackSubnetListCommand.java
+++ b/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/cli/OpenstackSubnetListCommand.java
@@ -18,7 +18,8 @@
 import com.fasterxml.jackson.databind.ObjectMapper;
 import com.fasterxml.jackson.databind.node.ArrayNode;
 import com.google.common.collect.Lists;
-import org.apache.karaf.shell.commands.Command;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.openstacknetworking.api.OpenstackNetworkService;
 import org.openstack4j.model.network.Subnet;
@@ -33,6 +34,7 @@
 /**
  * Lists OpenStack subnets.
  */
+@Service
 @Command(scope = "onos", name = "openstack-subnets",
         description = "Lists all OpenStack subnets")
 public class OpenstackSubnetListCommand extends AbstractShellCommand {
@@ -40,7 +42,7 @@
     private static final String FORMAT = "%-40s%-20s%-20s%-20s%-40s%-20s%-8s";
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         OpenstackNetworkService service = AbstractShellCommand.get(OpenstackNetworkService.class);
         List<Subnet> subnets = Lists.newArrayList(service.subnets());
         subnets.sort(Comparator.comparing(Subnet::getName));
diff --git a/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/cli/OpenstackSyncRulesCommand.java b/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/cli/OpenstackSyncRulesCommand.java
index f6ba119..350655f 100644
--- a/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/cli/OpenstackSyncRulesCommand.java
+++ b/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/cli/OpenstackSyncRulesCommand.java
@@ -15,7 +15,8 @@
  */
 package org.onosproject.openstacknetworking.cli;
 
-import org.apache.karaf.shell.commands.Command;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.openstacknode.api.NodeState;
 import org.onosproject.openstacknode.api.OpenstackNode;
@@ -27,6 +28,7 @@
 /**
  * Re-installs flow rules for OpenStack networking.
  */
+@Service
 @Command(scope = "onos", name = "openstack-sync-rules",
         description = "Re-installs flow rules for OpenStack networking")
 public class OpenstackSyncRulesCommand extends AbstractShellCommand {
@@ -34,7 +36,7 @@
     private static final long SLEEP_MS = 3000; // we wait 3s for init each node
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         // All handlers in this application reacts the node complete event and
         // tries to re-configure flow rules for the complete node.
         OpenstackNodeService osNodeService = AbstractShellCommand.get(OpenstackNodeService.class);
diff --git a/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/cli/OpenstackSyncStateCommand.java b/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/cli/OpenstackSyncStateCommand.java
index 37360b1..f7495d6 100644
--- a/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/cli/OpenstackSyncStateCommand.java
+++ b/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/cli/OpenstackSyncStateCommand.java
@@ -16,7 +16,8 @@
 package org.onosproject.openstacknetworking.cli;
 
 import com.google.common.base.Strings;
-import org.apache.karaf.shell.commands.Command;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.openstacknetworking.api.OpenstackNetworkAdminService;
 import org.onosproject.openstacknetworking.api.OpenstackRouterAdminService;
@@ -43,6 +44,7 @@
 /**
  * Synchronizes OpenStack network states.
  */
+@Service
 @Command(scope = "onos", name = "openstack-sync-states",
         description = "Synchronizes all OpenStack network states")
 public class OpenstackSyncStateCommand extends AbstractShellCommand {
@@ -58,7 +60,7 @@
     private static final String DEVICE_OWNER_IFACE = "network:router_interface";
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         OpenstackSecurityGroupAdminService osSgAdminService = get(OpenstackSecurityGroupAdminService.class);
         OpenstackNetworkAdminService osNetAdminService = get(OpenstackNetworkAdminService.class);
         OpenstackRouterAdminService osRouterAdminService = get(OpenstackRouterAdminService.class);
diff --git a/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/cli/PurgeInstancePortsCommand.java b/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/cli/PurgeInstancePortsCommand.java
index 08ccd45..6109a77 100644
--- a/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/cli/PurgeInstancePortsCommand.java
+++ b/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/cli/PurgeInstancePortsCommand.java
@@ -15,9 +15,10 @@
  */
 package org.onosproject.openstacknetworking.cli;
 
-import org.apache.karaf.shell.commands.Argument;
-import org.apache.karaf.shell.commands.Command;
-import org.apache.karaf.shell.commands.Option;
+import org.apache.karaf.shell.api.action.Argument;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.Option;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.openstacknetworking.api.InstancePort;
 import org.onosproject.openstacknetworking.api.InstancePortAdminService;
@@ -28,6 +29,7 @@
 /**
  * Purges existing instance ports.
  */
+@Service
 @Command(scope = "onos", name = "purge-instance-ports",
         description = "Purges existing instance ports created by OpenStack networking app")
 public class PurgeInstancePortsCommand extends AbstractShellCommand {
@@ -51,7 +53,7 @@
     private String[] portIds = null;
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         InstancePortAdminService service = get(InstancePortAdminService.class);
 
         if ((!isAll && !isInactive && !isPending && portIds == null) ||
diff --git a/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/cli/UpdateExternalPeerRouterCommand.java b/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/cli/UpdateExternalPeerRouterCommand.java
index c4090e0..81fcd8c 100644
--- a/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/cli/UpdateExternalPeerRouterCommand.java
+++ b/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/cli/UpdateExternalPeerRouterCommand.java
@@ -16,8 +16,9 @@
 package org.onosproject.openstacknetworking.cli;
 
 import com.google.common.collect.Lists;
-import org.apache.karaf.shell.commands.Argument;
-import org.apache.karaf.shell.commands.Command;
+import org.apache.karaf.shell.api.action.Argument;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onlab.packet.Ip4Address;
 import org.onlab.packet.IpAddress;
 import org.onlab.packet.MacAddress;
@@ -31,6 +32,7 @@
 /**
  * Updates external peer router.
  */
+@Service
 @Command(scope = "onos", name = "openstack-update-peer-router",
         description = "Update external peer router")
 public class UpdateExternalPeerRouterCommand extends AbstractShellCommand {
@@ -52,7 +54,7 @@
     private static final String NONE = "None";
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         OpenstackNetworkAdminService service = AbstractShellCommand.get(OpenstackNetworkAdminService.class);
 
         IpAddress externalPeerIpAddress = IpAddress.valueOf(
diff --git a/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/cli/UpdateExternalPeerRouterVlanCommand.java b/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/cli/UpdateExternalPeerRouterVlanCommand.java
index 79125b2..9e84ebc 100644
--- a/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/cli/UpdateExternalPeerRouterVlanCommand.java
+++ b/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/cli/UpdateExternalPeerRouterVlanCommand.java
@@ -16,8 +16,9 @@
 package org.onosproject.openstacknetworking.cli;
 
 import com.google.common.collect.Lists;
-import org.apache.karaf.shell.commands.Argument;
-import org.apache.karaf.shell.commands.Command;
+import org.apache.karaf.shell.api.action.Argument;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onlab.packet.Ip4Address;
 import org.onlab.packet.IpAddress;
 import org.onlab.packet.VlanId;
@@ -34,6 +35,7 @@
 /**
  * Updates external peer router macc address.
  */
+@Service
 @Command(scope = "onos", name = "openstack-update-peer-router-vlan",
         description = "Updates external peer router vlan")
 public class UpdateExternalPeerRouterVlanCommand extends AbstractShellCommand {
@@ -50,7 +52,7 @@
     private static final String NONE = "None";
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         OpenstackNetworkAdminService osNetAdminService = AbstractShellCommand.get(OpenstackNetworkAdminService.class);
         OpenstackRouterService osRouterService = AbstractShellCommand.get(OpenstackRouterService.class);
 
diff --git a/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/cli/VlanIdCompleter.java b/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/cli/VlanIdCompleter.java
index 8f64642..092a5f0 100644
--- a/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/cli/VlanIdCompleter.java
+++ b/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/cli/VlanIdCompleter.java
@@ -15,8 +15,11 @@
  */
 package org.onosproject.openstacknetworking.cli;
 
-import org.apache.karaf.shell.console.Completer;
-import org.apache.karaf.shell.console.completer.StringsCompleter;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
+import org.apache.karaf.shell.api.console.CommandLine;
+import org.apache.karaf.shell.api.console.Completer;
+import org.apache.karaf.shell.api.console.Session;
+import org.apache.karaf.shell.support.completers.StringsCompleter;
 import org.onlab.packet.VlanId;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.openstacknetworking.api.ExternalPeerRouter;
@@ -31,10 +34,11 @@
 /**
  * Vlan Id Completer.
  */
+@Service
 public class VlanIdCompleter implements Completer {
 
     @Override
-    public int complete(String buffer, int cursor, List<String> candidates) {
+    public int complete(Session session, CommandLine commandLine, List<String> candidates) {
         StringsCompleter delegate = new StringsCompleter();
         OpenstackNetworkService osNetService = AbstractShellCommand.get(OpenstackNetworkService.class);
         Set<VlanId> set = osNetService.externalPeerRouters().stream()
@@ -48,7 +52,7 @@
             strings.add(it.next().toString());
         }
 
-        return delegate.complete(buffer, cursor, candidates);
+        return delegate.complete(session, commandLine, candidates);
 
     }
 }
\ No newline at end of file
diff --git a/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/DistributedInstancePortStore.java b/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/DistributedInstancePortStore.java
index f48bdc3..3ad00b5 100644
--- a/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/DistributedInstancePortStore.java
+++ b/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/DistributedInstancePortStore.java
@@ -16,12 +16,6 @@
 package org.onosproject.openstacknetworking.impl;
 
 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.apache.felix.scr.annotations.Service;
 import org.onlab.util.KryoNamespace;
 import org.onosproject.core.ApplicationId;
 import org.onosproject.core.CoreService;
@@ -37,6 +31,11 @@
 import org.onosproject.store.service.Serializer;
 import org.onosproject.store.service.StorageService;
 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.util.Set;
@@ -63,8 +62,7 @@
 /**
  * Manages the inventory of openstack instance port using a {@code ConsistentMap}.
  */
-@Service
-@Component(immediate = true)
+@Component(immediate = true, service = InstancePortStore.class)
 public class DistributedInstancePortStore
         extends AbstractStore<InstancePortEvent, InstancePortStoreDelegate>
         implements InstancePortStore {
@@ -81,10 +79,10 @@
             .register(InstancePort.State.class)
             .build();
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected CoreService coreService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected StorageService storageService;
 
     private final ExecutorService eventExecutor = newSingleThreadExecutor(
diff --git a/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/DistributedOpenstackNetworkStore.java b/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/DistributedOpenstackNetworkStore.java
index b447b65..fba1599 100644
--- a/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/DistributedOpenstackNetworkStore.java
+++ b/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/DistributedOpenstackNetworkStore.java
@@ -17,12 +17,6 @@
 
 import com.google.common.collect.ImmutableList;
 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.apache.felix.scr.annotations.Service;
 import org.onlab.util.KryoNamespace;
 import org.onosproject.core.ApplicationId;
 import org.onosproject.core.CoreService;
@@ -53,6 +47,11 @@
 import org.openstack4j.openstack.networking.domain.NeutronPool;
 import org.openstack4j.openstack.networking.domain.NeutronPort;
 import org.openstack4j.openstack.networking.domain.NeutronSubnet;
+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.LinkedHashMap;
@@ -82,8 +81,7 @@
 /**
  * Manages the inventory of OpenStack network, subnet, and port using a {@code ConsistentMap}.
  */
-@Service
-@Component(immediate = true)
+@Component(immediate = true, service = OpenstackNetworkStore.class)
 public class DistributedOpenstackNetworkStore
         extends AbstractStore<OpenstackNetworkEvent, OpenstackNetworkStoreDelegate>
         implements OpenstackNetworkStore {
@@ -114,10 +112,10 @@
             .register(LinkedHashMap.class)
             .build();
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected CoreService coreService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected StorageService storageService;
 
     private final ExecutorService eventExecutor = newSingleThreadExecutor(
diff --git a/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/DistributedOpenstackRouterStore.java b/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/DistributedOpenstackRouterStore.java
index d16647c..c8bd925 100644
--- a/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/DistributedOpenstackRouterStore.java
+++ b/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/DistributedOpenstackRouterStore.java
@@ -17,11 +17,6 @@
 
 import com.google.common.base.Strings;
 import com.google.common.collect.ImmutableSet;
-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.KryoNamespace;
 import org.onosproject.core.ApplicationId;
 import org.onosproject.core.CoreService;
@@ -48,6 +43,10 @@
 import org.openstack4j.openstack.networking.domain.NeutronRouter;
 import org.openstack4j.openstack.networking.domain.NeutronRouterInterface;
 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.Set;
@@ -75,8 +74,7 @@
 /**
  * Manages the inventory of OpenStack router and floating IP using a {@code ConsistentMap}.
  */
-@Service
-@Component(immediate = true)
+@Component(immediate = true, service = OpenstackRouterStore.class)
 public class DistributedOpenstackRouterStore
         extends AbstractStore<OpenstackRouterEvent, OpenstackRouterStoreDelegate>
         implements OpenstackRouterStore {
@@ -100,13 +98,13 @@
             .register(NeutronFloatingIP.class)
             .build();
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected CoreService coreService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected StorageService storageService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected OpenstackNetworkService osNetworkService;
 
     private final ExecutorService eventExecutor = newSingleThreadExecutor(
diff --git a/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/DistributedSecurityGroupStore.java b/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/DistributedSecurityGroupStore.java
index 405479b..f4fbf52 100644
--- a/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/DistributedSecurityGroupStore.java
+++ b/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/DistributedSecurityGroupStore.java
@@ -16,12 +16,6 @@
 package org.onosproject.openstacknetworking.impl;
 
 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.apache.felix.scr.annotations.Service;
 import org.onlab.util.KryoNamespace;
 import org.onosproject.core.ApplicationId;
 import org.onosproject.core.CoreService;
@@ -40,6 +34,11 @@
 import org.openstack4j.model.network.SecurityGroupRule;
 import org.openstack4j.openstack.networking.domain.NeutronSecurityGroup;
 import org.openstack4j.openstack.networking.domain.NeutronSecurityGroupRule;
+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.Set;
@@ -60,8 +59,7 @@
  * Manages the inventory of OpenStack security group using a {@code ConsistentMap}.
  *
  */
-@Service
-@Component(immediate = true)
+@Component(immediate = true, service = OpenstackSecurityGroupStore.class)
 public class DistributedSecurityGroupStore
         extends AbstractStore<OpenstackSecurityGroupEvent, OpenstackSecurityGroupStoreDelegate>
         implements OpenstackSecurityGroupStore {
@@ -79,10 +77,10 @@
             .register(NeutronSecurityGroup.class)
             .build();
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected CoreService coreService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected StorageService storageService;
 
     private final ExecutorService eventExecutor = newSingleThreadExecutor(
diff --git a/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/InstancePortManager.java b/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/InstancePortManager.java
index 2ddb181..8263f63 100644
--- a/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/InstancePortManager.java
+++ b/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/InstancePortManager.java
@@ -18,12 +18,6 @@
 import com.google.common.base.Strings;
 import com.google.common.collect.ImmutableSet;
 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.onlab.packet.IpAddress;
 import org.onlab.packet.MacAddress;
 import org.onosproject.cluster.ClusterService;
@@ -48,6 +42,11 @@
 import org.onosproject.openstacknetworking.api.InstancePortStore;
 import org.onosproject.openstacknetworking.api.InstancePortStoreDelegate;
 import org.onosproject.openstacknetworking.api.OpenstackRouterService;
+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.Objects;
@@ -68,8 +67,7 @@
  * Provides implementation of administering and interfacing instance ports.
  * It also provides instance port events for the hosts mapped to OpenStack VM interface.
  */
-@Service
-@Component(immediate = true)
+@Component(immediate = true, service = { InstancePortService.class, InstancePortAdminService.class })
 public class InstancePortManager
         extends ListenerRegistry<InstancePortEvent, InstancePortListener>
         implements InstancePortService, InstancePortAdminService {
@@ -91,22 +89,22 @@
 
     private static final String ERR_IN_USE = " still in use";
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected CoreService coreService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected InstancePortStore instancePortStore;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected LeadershipService leadershipService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected ClusterService clusterService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected HostService hostService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected OpenstackRouterService routerService;
 
     private final InstancePortStoreDelegate
diff --git a/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/OpenStackSwitchingDirectPortProvider.java b/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/OpenStackSwitchingDirectPortProvider.java
index 75e6647..7a6253b 100644
--- a/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/OpenStackSwitchingDirectPortProvider.java
+++ b/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/OpenStackSwitchingDirectPortProvider.java
@@ -15,11 +15,11 @@
  */
 package org.onosproject.openstacknetworking.impl;
 
-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.onosproject.cluster.ClusterService;
 import org.onosproject.cluster.LeadershipService;
 import org.onosproject.cluster.NodeId;
@@ -66,28 +66,28 @@
     private static final String PORT_NAME = "portName";
     private static final long SLEEP_MS = 3000;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected CoreService coreService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected OpenstackNetworkService osNetworkService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected OpenstackNodeService osNodeService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected LeadershipService leadershipService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected ClusterService clusterService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected DeviceService deviceService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected InstancePortService instancePortService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected MastershipService mastershipService;
 
     private final OpenstackNetworkListener openstackNetworkListener = new InternalOpenstackNetworkListener();
diff --git a/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/OpenstackFlowRuleManager.java b/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/OpenstackFlowRuleManager.java
index 6aa0dae..0dc4db7 100644
--- a/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/OpenstackFlowRuleManager.java
+++ b/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/OpenstackFlowRuleManager.java
@@ -16,12 +16,6 @@
 
 package org.onosproject.openstacknetworking.impl;
 
-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.LeadershipService;
 import org.onosproject.cluster.NodeId;
@@ -43,6 +37,11 @@
 import org.onosproject.openstacknode.api.OpenstackNodeEvent;
 import org.onosproject.openstacknode.api.OpenstackNodeListener;
 import org.onosproject.openstacknode.api.OpenstackNodeService;
+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.Objects;
@@ -57,8 +56,7 @@
 /**
  * Sets flow rules directly using FlowRuleService.
  */
-@Service
-@Component(immediate = true)
+@Component(immediate = true, service = OpenstackFlowRuleService.class)
 public class OpenstackFlowRuleManager implements OpenstackFlowRuleService {
 
     private final Logger log = getLogger(getClass());
@@ -67,19 +65,19 @@
     private static final int HIGH_PRIORITY = 30000;
     private static final int TIMEOUT_SNAT_RULE = 60;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected FlowRuleService flowRuleService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected CoreService coreService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected ClusterService clusterService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected LeadershipService leadershipService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected OpenstackNodeService osNodeService;
 
     private final ExecutorService deviceEventExecutor =
diff --git a/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/OpenstackMetadataProxyHandler.java b/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/OpenstackMetadataProxyHandler.java
index e99651e..dd476de 100644
--- a/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/OpenstackMetadataProxyHandler.java
+++ b/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/OpenstackMetadataProxyHandler.java
@@ -18,11 +18,11 @@
 
 import com.google.common.collect.ImmutableSet;
 import org.apache.commons.lang.StringUtils;
-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.apache.http.Header;
 import org.apache.http.HttpEntityEnclosingRequest;
 import org.apache.http.HttpMessage;
@@ -121,28 +121,28 @@
     private static final String HTTP_PUT_METHOD = "PUT";
     private static final String HTTP_DELETE_METHOD = "DELETE";
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected CoreService coreService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected PacketService packetService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected ClusterService clusterService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected LeadershipService leadershipService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected OpenstackNetworkService osNetworkService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected OpenstackNodeService osNodeService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected InstancePortService instancePortService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected OpenstackFlowRuleService osFlowRuleService;
 
     private final PacketProcessor packetProcessor = new InternalPacketProcessor();
diff --git a/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/OpenstackNetworkManager.java b/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/OpenstackNetworkManager.java
index 1db1da1..3491450 100644
--- a/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/OpenstackNetworkManager.java
+++ b/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/OpenstackNetworkManager.java
@@ -18,12 +18,6 @@
 import com.google.common.base.Strings;
 import com.google.common.collect.ImmutableSet;
 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.onlab.packet.ARP;
 import org.onlab.packet.Ethernet;
 import org.onlab.packet.IpAddress;
@@ -61,6 +55,11 @@
 import org.openstack4j.model.network.Port;
 import org.openstack4j.model.network.Router;
 import org.openstack4j.model.network.Subnet;
+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.nio.ByteBuffer;
@@ -84,8 +83,7 @@
  * subnet, and port.
  */
 
-@Service
-@Component(immediate = true)
+@Component(immediate = true, service = { OpenstackNetworkAdminService.class, OpenstackNetworkService.class })
 public class OpenstackNetworkManager
         extends ListenerRegistry<OpenstackNetworkEvent, OpenstackNetworkListener>
         implements OpenstackNetworkAdminService, OpenstackNetworkService {
@@ -117,22 +115,22 @@
     private static final int PREFIX_LENGTH = 32;
 
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected CoreService coreService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected PacketService packetService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected DeviceService deviceService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected OpenstackNetworkStore osNetworkStore;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected StorageService storageService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected OpenstackNodeService osNodeService;
 
     private final OpenstackNetworkStoreDelegate delegate = new InternalNetworkStoreDelegate();
diff --git a/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/OpenstackRouterManager.java b/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/OpenstackRouterManager.java
index 658dc4f..242bdc8 100644
--- a/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/OpenstackRouterManager.java
+++ b/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/OpenstackRouterManager.java
@@ -17,12 +17,6 @@
 
 import com.google.common.base.Strings;
 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.apache.felix.scr.annotations.Service;
 import org.onosproject.core.CoreService;
 import org.onosproject.event.ListenerRegistry;
 import org.onosproject.openstacknetworking.api.Constants;
@@ -35,6 +29,11 @@
 import org.openstack4j.model.network.NetFloatingIP;
 import org.openstack4j.model.network.Router;
 import org.openstack4j.model.network.RouterInterface;
+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.Objects;
@@ -49,8 +48,7 @@
  * Provides implementation of administering and interfacing OpenStack router and
  * floating IP address.
  */
-@Service
-@Component(immediate = true)
+@Component(immediate = true, service = { OpenstackRouterAdminService.class, OpenstackRouterService.class })
 public class OpenstackRouterManager
         extends ListenerRegistry<OpenstackRouterEvent, OpenstackRouterListener>
         implements OpenstackRouterAdminService, OpenstackRouterService {
@@ -75,10 +73,10 @@
 
     private static final String ERR_IN_USE = " still in use";
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected CoreService coreService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected OpenstackRouterStore osRouterStore;
 
     private final OpenstackRouterStoreDelegate delegate = new InternalRouterStoreDelegate();
diff --git a/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/OpenstackRoutingArpHandler.java b/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/OpenstackRoutingArpHandler.java
index 6ae7100..2021aa8 100644
--- a/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/OpenstackRoutingArpHandler.java
+++ b/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/OpenstackRoutingArpHandler.java
@@ -18,13 +18,6 @@
 import com.google.common.base.Strings;
 import com.google.common.collect.ImmutableSet;
 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.Modified;
-import org.apache.felix.scr.annotations.Property;
-import org.apache.felix.scr.annotations.Reference;
-import org.apache.felix.scr.annotations.ReferenceCardinality;
 import org.onlab.packet.ARP;
 import org.onlab.packet.EthType;
 import org.onlab.packet.Ethernet;
@@ -78,6 +71,12 @@
 import org.openstack4j.model.network.Router;
 import org.openstack4j.model.network.RouterInterface;
 import org.osgi.service.component.ComponentContext;
+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.nio.ByteBuffer;
@@ -90,13 +89,14 @@
 import static org.onlab.util.Tools.groupedThreads;
 import static org.onosproject.openstacknetworking.api.Constants.ARP_BROADCAST_MODE;
 import static org.onosproject.openstacknetworking.api.Constants.ARP_PROXY_MODE;
-import static org.onosproject.openstacknetworking.api.Constants.DEFAULT_ARP_MODE_STR;
-import static org.onosproject.openstacknetworking.api.Constants.DEFAULT_GATEWAY_MAC_STR;
 import static org.onosproject.openstacknetworking.api.Constants.GW_COMMON_TABLE;
 import static org.onosproject.openstacknetworking.api.Constants.OPENSTACK_NETWORKING_APP_ID;
 import static org.onosproject.openstacknetworking.api.Constants.PRIORITY_ARP_CONTROL_RULE;
 import static org.onosproject.openstacknetworking.api.Constants.PRIORITY_ARP_GATEWAY_RULE;
 import static org.onosproject.openstacknetworking.api.OpenstackNetworkEvent.Type.OPENSTACK_PORT_PRE_REMOVE;
+import static org.onosproject.openstacknetworking.impl.OsgiPropertyConstants.ARP_MODE;
+import static org.onosproject.openstacknetworking.impl.OsgiPropertyConstants.ARP_MODE_DEFAULT;
+import static org.onosproject.openstacknetworking.impl.OsgiPropertyConstants.GATEWAY_MAC_DEFAULT;
 import static org.onosproject.openstacknetworking.util.OpenstackNetworkingUtil.associatedFloatingIp;
 import static org.onosproject.openstacknetworking.util.OpenstackNetworkingUtil.getGwByComputeDevId;
 import static org.onosproject.openstacknetworking.util.OpenstackNetworkingUtil.getGwByInstancePort;
@@ -111,7 +111,12 @@
 /**
  * Handle ARP requests from gateway nodes.
  */
-@Component(immediate = true)
+@Component(
+    immediate = true,
+    property = {
+        ARP_MODE + "=" + ARP_MODE_DEFAULT
+    }
+)
 public class OpenstackRoutingArpHandler {
 
     private final Logger log = getLogger(getClass());
@@ -120,47 +125,46 @@
     private static final String DEVICE_OWNER_FLOATING_IP = "network:floatingip";
     private static final String ARP_MODE = "arpMode";
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected CoreService coreService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected PacketService packetService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected OpenstackNetworkAdminService osNetworkAdminService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected OpenstackRouterAdminService osRouterAdminService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected OpenstackNodeService osNodeService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected InstancePortAdminService instancePortService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected ClusterService clusterService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected LeadershipService leadershipService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected OpenstackFlowRuleService osFlowRuleService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected OpenstackNetworkService osNetworkService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected ComponentConfigService configService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected PreCommitPortService preCommitPortService;
 
-    @Property(name = ARP_MODE, value = DEFAULT_ARP_MODE_STR,
-            label = "ARP processing mode, broadcast | proxy (default)")
-    protected String arpMode = DEFAULT_ARP_MODE_STR;
+    /** ARP processing mode, broadcast | proxy (default). **/
+    protected String arpMode = ARP_MODE_DEFAULT;
 
-    protected String gatewayMac = DEFAULT_GATEWAY_MAC_STR;
+    protected String gatewayMac = GATEWAY_MAC_DEFAULT;
 
     private final OpenstackRouterListener osRouterListener = new InternalRouterEventListener();
     private final OpenstackNodeListener osNodeListener = new InternalNodeEventListener();
diff --git a/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/OpenstackRoutingFloatingIpHandler.java b/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/OpenstackRoutingFloatingIpHandler.java
index 732275c..b2cb36e 100644
--- a/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/OpenstackRoutingFloatingIpHandler.java
+++ b/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/OpenstackRoutingFloatingIpHandler.java
@@ -18,11 +18,11 @@
 import com.google.common.base.Strings;
 import com.google.common.collect.ImmutableSet;
 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.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.Ethernet;
 import org.onlab.packet.IpAddress;
 import org.onlab.packet.MacAddress;
@@ -101,37 +101,37 @@
     private static final String ERR_FLOW = "Failed set flows for floating IP %s: ";
     private static final String ERR_UNSUPPORTED_NET_TYPE = "Unsupported network type %s";
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected CoreService coreService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected DeviceService deviceService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected LeadershipService leadershipService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected ClusterService clusterService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected OpenstackNodeService osNodeService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected InstancePortAdminService instancePortService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected OpenstackRouterAdminService osRouterAdminService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected OpenstackNetworkService osNetworkService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected OpenstackFlowRuleService osFlowRuleService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected PreCommitPortService preCommitPortService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected PacketService packetService;
 
     private final ExecutorService eventExecutor = newSingleThreadExecutor(
diff --git a/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/OpenstackRoutingHandler.java b/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/OpenstackRoutingHandler.java
index 89b50df..edcf6ed 100644
--- a/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/OpenstackRoutingHandler.java
+++ b/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/OpenstackRoutingHandler.java
@@ -18,13 +18,6 @@
 import com.google.common.base.Strings;
 import com.google.common.collect.ImmutableSet;
 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.Modified;
-import org.apache.felix.scr.annotations.Property;
-import org.apache.felix.scr.annotations.Reference;
-import org.apache.felix.scr.annotations.ReferenceCardinality;
 import org.onlab.packet.Ethernet;
 import org.onlab.packet.ICMP;
 import org.onlab.packet.IPv4;
@@ -73,6 +66,12 @@
 import org.openstack4j.model.network.RouterInterface;
 import org.openstack4j.model.network.Subnet;
 import org.osgi.service.component.ComponentContext;
+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 org.slf4j.LoggerFactory;
 
@@ -98,6 +97,8 @@
 import static org.onosproject.openstacknetworking.api.Constants.ROUTING_TABLE;
 import static org.onosproject.openstacknetworking.api.Constants.STAT_OUTBOUND_TABLE;
 import static org.onosproject.openstacknetworking.api.InstancePort.State.ACTIVE;
+import static org.onosproject.openstacknetworking.impl.OsgiPropertyConstants.USE_STATEFUL_SNAT;
+import static org.onosproject.openstacknetworking.impl.OsgiPropertyConstants.USE_STATEFUL_SNAT_DEFAULT;
 import static org.onosproject.openstacknetworking.util.RulePopulatorUtil.buildExtension;
 import static org.onosproject.openstacknode.api.OpenstackNode.NodeType.COMPUTE;
 import static org.onosproject.openstacknode.api.OpenstackNode.NodeType.GATEWAY;
@@ -105,7 +106,12 @@
 /**
  * Handles OpenStack router events.
  */
-@Component(immediate = true)
+@Component(
+    immediate = true,
+    property = {
+        USE_STATEFUL_SNAT + ":Boolean=" + USE_STATEFUL_SNAT_DEFAULT
+    }
+)
 public class OpenstackRoutingHandler {
 
     private final Logger log = LoggerFactory.getLogger(getClass());
@@ -113,46 +119,44 @@
     private static final String MSG_ENABLED = "Enabled ";
     private static final String MSG_DISABLED = "Disabled ";
     private static final String ERR_UNSUPPORTED_NET_TYPE = "Unsupported network type";
-    private static final boolean USE_STATEFUL_SNAT = false;
 
-    @Property(name = "useStatefulSnat", boolValue = USE_STATEFUL_SNAT,
-            label = "Use Stateful SNAT for source NATing")
-    private boolean useStatefulSnat = USE_STATEFUL_SNAT;
+    /** Use Stateful SNAT for source NATing. */
+    private boolean useStatefulSnat = USE_STATEFUL_SNAT_DEFAULT;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected CoreService coreService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected LeadershipService leadershipService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected ClusterService clusterService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected OpenstackNodeService osNodeService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected OpenstackNetworkAdminService osNetworkAdminService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected OpenstackRouterService osRouterService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected InstancePortService instancePortService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected DeviceService deviceService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected OpenstackFlowRuleService osFlowRuleService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected MastershipService mastershipService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected DriverService driverService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected ComponentConfigService configService;
 
     private final ExecutorService eventExecutor = newSingleThreadScheduledExecutor(
@@ -194,7 +198,7 @@
         Dictionary<?, ?> properties = context.getProperties();
         Boolean flag;
 
-        flag = Tools.isPropertyEnabled(properties, "useStatefulSnat");
+        flag = Tools.isPropertyEnabled(properties, USE_STATEFUL_SNAT);
         if (flag == null) {
             log.info("useStatefulSnat is not configured, " +
                     "using current value of {}", useStatefulSnat);
diff --git a/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/OpenstackRoutingIcmpHandler.java b/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/OpenstackRoutingIcmpHandler.java
index 9197082..1cc02b7 100644
--- a/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/OpenstackRoutingIcmpHandler.java
+++ b/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/OpenstackRoutingIcmpHandler.java
@@ -16,11 +16,11 @@
 package org.onosproject.openstacknetworking.impl;
 
 import com.google.common.base.Strings;
-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.Ethernet;
 import org.onlab.packet.ICMP;
 import org.onlab.packet.ICMPEcho;
@@ -96,25 +96,25 @@
     private static final String VXLAN = "VXLAN";
     private static final String VLAN = "VLAN";
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected CoreService coreService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected PacketService packetService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected StorageService storageService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected OpenstackNodeService osNodeService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected InstancePortService instancePortService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected OpenstackNetworkService osNetworkService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected OpenstackRouterService osRouterService;
 
     private final ExecutorService eventExecutor = newSingleThreadExecutor(
diff --git a/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/OpenstackRoutingSnatHandler.java b/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/OpenstackRoutingSnatHandler.java
index 17f4c55..4695338 100644
--- a/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/OpenstackRoutingSnatHandler.java
+++ b/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/OpenstackRoutingSnatHandler.java
@@ -15,11 +15,11 @@
  */
 package org.onosproject.openstacknetworking.impl;
 
-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.Ethernet;
 import org.onlab.packet.IPv4;
 import org.onlab.packet.IpAddress;
@@ -98,31 +98,31 @@
     private static final KryoNamespace.Builder NUMBER_SERIALIZER = KryoNamespace.newBuilder()
             .register(KryoNamespaces.API);
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected CoreService coreService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected PacketService packetService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected StorageService storageService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected DeviceService deviceService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected InstancePortService instancePortService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected OpenstackNodeService osNodeService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected OpenstackNetworkService osNetworkService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected OpenstackRouterService osRouterService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected OpenstackFlowRuleService osFlowRuleService;
 
     private final ExecutorService eventExecutor = newSingleThreadExecutor(
diff --git a/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/OpenstackSecurityGroupHandler.java b/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/OpenstackSecurityGroupHandler.java
index 83f75aa..dc734a9 100644
--- a/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/OpenstackSecurityGroupHandler.java
+++ b/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/OpenstackSecurityGroupHandler.java
@@ -19,13 +19,6 @@
 import com.google.common.base.Strings;
 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.Modified;
-import org.apache.felix.scr.annotations.Property;
-import org.apache.felix.scr.annotations.Reference;
-import org.apache.felix.scr.annotations.ReferenceCardinality;
 import org.onlab.packet.Ethernet;
 import org.onlab.packet.IPv4;
 import org.onlab.packet.Ip4Address;
@@ -79,6 +72,12 @@
 import org.openstack4j.openstack.networking.domain.NeutronPort;
 import org.openstack4j.openstack.networking.domain.NeutronSecurityGroupRule;
 import org.osgi.service.component.ComponentContext;
+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.Collections;
@@ -102,6 +101,8 @@
 import static org.onosproject.openstacknetworking.api.Constants.PRIORITY_CT_DROP_RULE;
 import static org.onosproject.openstacknetworking.api.Constants.PRIORITY_CT_HOOK_RULE;
 import static org.onosproject.openstacknetworking.api.Constants.PRIORITY_CT_RULE;
+import static org.onosproject.openstacknetworking.impl.OsgiPropertyConstants.USE_SECURITY_GROUP;
+import static org.onosproject.openstacknetworking.impl.OsgiPropertyConstants.USE_SECURITY_GROUP_DEFAULT;
 import static org.onosproject.openstacknetworking.util.OpenstackNetworkingUtil.swapStaleLocation;
 import static org.onosproject.openstacknetworking.util.RulePopulatorUtil.computeCtMaskFlag;
 import static org.onosproject.openstacknetworking.util.RulePopulatorUtil.computeCtStateFlag;
@@ -112,53 +113,55 @@
 /**
  * Populates flow rules to handle OpenStack SecurityGroups.
  */
-@Component(immediate = true)
+@Component(
+    immediate = true,
+    property = {
+        USE_SECURITY_GROUP + ":Boolean=" + USE_SECURITY_GROUP_DEFAULT
+    }
+)
 public class OpenstackSecurityGroupHandler {
 
     private final Logger log = getLogger(getClass());
 
-    private static final boolean USE_SECURITY_GROUP = false;
-
     private static final int VM_IP_PREFIX = 32;
 
-    @Property(name = "useSecurityGroup", boolValue = USE_SECURITY_GROUP,
-            label = "Apply OpenStack security group rule for VM traffic")
-    private boolean useSecurityGroup = USE_SECURITY_GROUP;
+    /** Apply OpenStack security group rule for VM traffic. */
+    private boolean useSecurityGroup = USE_SECURITY_GROUP_DEFAULT;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected CoreService coreService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected InstancePortAdminService instancePortService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected MastershipService mastershipService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected OpenstackNetworkService osNetService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected OpenstackSecurityGroupService securityGroupService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected OpenstackFlowRuleService osFlowRuleService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected ComponentConfigService configService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected OpenstackNodeService osNodeService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected DriverService driverService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected LeadershipService leadershipService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected ClusterService clusterService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected StorageService storageService;
 
     private static final KryoNamespace SERIALIZER_PORT = KryoNamespace.newBuilder()
@@ -250,7 +253,7 @@
         Dictionary<?, ?> properties = context.getProperties();
         Boolean flag;
 
-        flag = Tools.isPropertyEnabled(properties, "useSecurityGroup");
+        flag = Tools.isPropertyEnabled(properties, USE_SECURITY_GROUP);
         if (flag == null) {
             log.info("useSecurityGroup is not configured, " +
                     "using current value of {}", useSecurityGroup);
diff --git a/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/OpenstackSecurityGroupManager.java b/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/OpenstackSecurityGroupManager.java
index 03e1e98..e598413 100644
--- a/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/OpenstackSecurityGroupManager.java
+++ b/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/OpenstackSecurityGroupManager.java
@@ -16,12 +16,6 @@
 package org.onosproject.openstacknetworking.impl;
 
 import com.google.common.base.Strings;
-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.core.CoreService;
 import org.onosproject.event.ListenerRegistry;
 import org.onosproject.openstacknetworking.api.Constants;
@@ -34,6 +28,11 @@
 import org.openstack4j.model.network.SecurityGroup;
 import org.openstack4j.model.network.SecurityGroupRule;
 import org.openstack4j.openstack.networking.domain.NeutronSecurityGroup;
+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.List;
@@ -48,8 +47,8 @@
  * Provides implementation of administering and interfacing OpenStack security
  * groups.
  */
-@Service
-@Component(immediate = true)
+@Component(immediate = true,
+           service = { OpenstackSecurityGroupAdminService.class, OpenstackSecurityGroupService.class })
 public class OpenstackSecurityGroupManager
         extends ListenerRegistry<OpenstackSecurityGroupEvent, OpenstackSecurityGroupListener>
         implements OpenstackSecurityGroupAdminService, OpenstackSecurityGroupService {
@@ -71,10 +70,10 @@
 
     private boolean useSecurityGroup = false;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected CoreService coreService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected OpenstackSecurityGroupStore osSecurityGroupStore;
 
     private final OpenstackSecurityGroupStoreDelegate delegate = new InternalSecurityGroupStoreDelegate();
diff --git a/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/OpenstackSwitchingArpHandler.java b/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/OpenstackSwitchingArpHandler.java
index 8cbec2a..e2f8f92 100644
--- a/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/OpenstackSwitchingArpHandler.java
+++ b/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/OpenstackSwitchingArpHandler.java
@@ -16,13 +16,6 @@
 package org.onosproject.openstacknetworking.impl;
 
 import com.google.common.base.Strings;
-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.onlab.packet.ARP;
 import org.onlab.packet.EthType;
 import org.onlab.packet.Ethernet;
@@ -64,6 +57,12 @@
 import org.openstack4j.model.network.NetworkType;
 import org.openstack4j.model.network.Subnet;
 import org.osgi.service.component.ComponentContext;
+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 org.slf4j.LoggerFactory;
 
@@ -76,8 +75,6 @@
 import static org.onosproject.openstacknetworking.api.Constants.ARP_BROADCAST_MODE;
 import static org.onosproject.openstacknetworking.api.Constants.ARP_PROXY_MODE;
 import static org.onosproject.openstacknetworking.api.Constants.ARP_TABLE;
-import static org.onosproject.openstacknetworking.api.Constants.DEFAULT_ARP_MODE_STR;
-import static org.onosproject.openstacknetworking.api.Constants.DEFAULT_GATEWAY_MAC_STR;
 import static org.onosproject.openstacknetworking.api.Constants.OPENSTACK_NETWORKING_APP_ID;
 import static org.onosproject.openstacknetworking.api.Constants.PRIORITY_ARP_CONTROL_RULE;
 import static org.onosproject.openstacknetworking.api.Constants.PRIORITY_ARP_FLOOD_RULE;
@@ -85,6 +82,10 @@
 import static org.onosproject.openstacknetworking.api.Constants.PRIORITY_ARP_REPLY_RULE;
 import static org.onosproject.openstacknetworking.api.Constants.PRIORITY_ARP_REQUEST_RULE;
 import static org.onosproject.openstacknetworking.api.InstancePort.State.ACTIVE;
+import static org.onosproject.openstacknetworking.impl.OsgiPropertyConstants.ARP_MODE;
+import static org.onosproject.openstacknetworking.impl.OsgiPropertyConstants.ARP_MODE_DEFAULT;
+import static org.onosproject.openstacknetworking.impl.OsgiPropertyConstants.GATEWAY_MAC;
+import static org.onosproject.openstacknetworking.impl.OsgiPropertyConstants.GATEWAY_MAC_DEFAULT;
 import static org.onosproject.openstacknetworking.util.OpenstackNetworkingUtil.getPropertyValue;
 import static org.onosproject.openstacknetworking.util.OpenstackNetworkingUtil.swapStaleLocation;
 import static org.onosproject.openstacknetworking.util.RulePopulatorUtil.buildExtension;
@@ -93,54 +94,55 @@
 /**
  * Handles ARP packet from VMs.
  */
-@Component(immediate = true)
+@Component(
+    immediate = true,
+    property = {
+        GATEWAY_MAC + "=" + GATEWAY_MAC_DEFAULT,
+        ARP_MODE + "=" + ARP_MODE_DEFAULT,
+    }
+)
 public final class OpenstackSwitchingArpHandler {
 
     private final Logger log = LoggerFactory.getLogger(getClass());
 
-    private static final String GATEWAY_MAC = "gatewayMac";
-    private static final String ARP_MODE = "arpMode";
-
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     CoreService coreService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     PacketService packetService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     OpenstackFlowRuleService osFlowRuleService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     ComponentConfigService configService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     ClusterService clusterService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     LeadershipService leadershipService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     DeviceService deviceService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     MastershipService mastershipService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     InstancePortService instancePortService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     OpenstackNetworkService osNetworkService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected OpenstackNodeService osNodeService;
 
-    @Property(name = GATEWAY_MAC, value = DEFAULT_GATEWAY_MAC_STR,
-            label = "Fake MAC address for virtual network subnet gateway")
-    private String gatewayMac = DEFAULT_GATEWAY_MAC_STR;
+    /** Fake MAC address for virtual network subnet gateway. */
+    private String gatewayMac = GATEWAY_MAC_DEFAULT;
 
-    @Property(name = ARP_MODE, value = DEFAULT_ARP_MODE_STR,
-            label = "ARP processing mode, broadcast | proxy (default)")
-    protected String arpMode = DEFAULT_ARP_MODE_STR;
+    /** ARP processing mode, broadcast | proxy (default). */
+    protected String arpMode = ARP_MODE_DEFAULT;
 
     private final InternalPacketProcessor packetProcessor = new InternalPacketProcessor();
     private final InternalOpenstackNetworkListener osNetworkListener =
@@ -520,7 +522,7 @@
         Dictionary<?, ?> properties = context.getProperties();
 
         String updatedMac = Tools.get(properties, GATEWAY_MAC);
-        gatewayMac = updatedMac != null ? updatedMac : DEFAULT_GATEWAY_MAC_STR;
+        gatewayMac = updatedMac != null ? updatedMac : GATEWAY_MAC_DEFAULT;
         log.info("Configured. Gateway MAC is {}", gatewayMac);
     }
 
diff --git a/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/OpenstackSwitchingDhcpHandler.java b/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/OpenstackSwitchingDhcpHandler.java
index de4f8f2..71fa4d1 100644
--- a/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/OpenstackSwitchingDhcpHandler.java
+++ b/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/OpenstackSwitchingDhcpHandler.java
@@ -18,13 +18,6 @@
 import com.google.common.base.Strings;
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.Lists;
-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.onlab.packet.DHCP;
 import org.onlab.packet.Ethernet;
 import org.onlab.packet.IPv4;
@@ -66,6 +59,12 @@
 import org.openstack4j.model.network.Port;
 import org.openstack4j.model.network.Subnet;
 import org.osgi.service.component.ComponentContext;
+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.nio.ByteBuffer;
@@ -85,20 +84,25 @@
 import static org.onlab.packet.DHCP.DHCPOptionCode.OptionCode_SubnetMask;
 import static org.onlab.packet.DHCP.MsgType.DHCPACK;
 import static org.onlab.packet.DHCP.MsgType.DHCPOFFER;
-import static org.onosproject.openstacknetworking.api.Constants.DEFAULT_GATEWAY_MAC_STR;
 import static org.onosproject.openstacknetworking.api.Constants.DHCP_TABLE;
 import static org.onosproject.openstacknetworking.api.Constants.PRIORITY_DHCP_RULE;
+import static org.onosproject.openstacknetworking.impl.OsgiPropertyConstants.DHCP_SERVER_MAC;
+import static org.onosproject.openstacknetworking.impl.OsgiPropertyConstants.DHCP_SERVER_MAC_DEFAULT;
 import static org.onosproject.openstacknode.api.OpenstackNode.NodeType.COMPUTE;
 import static org.slf4j.LoggerFactory.getLogger;
 
 /**
  * Handles DHCP requests for the virtual instances.
  */
-@Component(immediate = true)
+@Component(
+    immediate = true,
+    property = {
+        DHCP_SERVER_MAC + "=" + DHCP_SERVER_MAC_DEFAULT
+    }
+)
 public class OpenstackSwitchingDhcpHandler {
     protected final Logger log = getLogger(getClass());
 
-    private static final String DHCP_SERVER_MAC = "dhcpServerMac";
     private static final Ip4Address DEFAULT_PRIMARY_DNS = Ip4Address.valueOf("8.8.8.8");
     private static final Ip4Address DEFAULT_SECONDARY_DNS = Ip4Address.valueOf("8.8.4.4");
     private static final byte PACKET_TTL = (byte) 127;
@@ -114,36 +118,35 @@
     private static final int V4_CIDR_UPPER_BOUND = 33;
     private static final int PADDING_SIZE = 4;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected CoreService coreService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected ComponentConfigService configService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected PacketService packetService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected InstancePortService instancePortService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected OpenstackNetworkService osNetworkService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected OpenstackNodeService osNodeService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected OpenstackFlowRuleService osFlowRuleService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected ClusterService clusterService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected LeadershipService leadershipService;
 
-    @Property(name = DHCP_SERVER_MAC, value = DEFAULT_GATEWAY_MAC_STR,
-            label = "Fake MAC address for virtual network subnet gateway")
-    private String dhcpServerMac = DEFAULT_GATEWAY_MAC_STR;
+    /** Fake MAC address for virtual network subnet gateway. */
+    private String dhcpServerMac = DHCP_SERVER_MAC_DEFAULT;
 
     private int dhcpDataMtu = DHCP_DATA_MTU_DEFAULT;
 
diff --git a/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/OpenstackSwitchingHandler.java b/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/OpenstackSwitchingHandler.java
index e63444f..f6977a3 100644
--- a/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/OpenstackSwitchingHandler.java
+++ b/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/OpenstackSwitchingHandler.java
@@ -17,11 +17,11 @@
 package org.onosproject.openstacknetworking.impl;
 
 import com.google.common.base.Strings;
-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.Ethernet;
 import org.onlab.packet.VlanId;
 import org.onosproject.cfg.ComponentConfigService;
@@ -96,40 +96,41 @@
     private static final String ARP_MODE = "arpMode";
     private static final String ERR_SET_FLOWS_VNI = "Failed to set flows for %s: Failed to get VNI for %s";
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected CoreService coreService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected MastershipService mastershipService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected DeviceService deviceService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected DriverService driverService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected ClusterService clusterService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected ComponentConfigService configService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
+
     protected LeadershipService leadershipService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected OpenstackFlowRuleService osFlowRuleService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected InstancePortService instancePortService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected OpenstackNetworkService osNetworkService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected OpenstackNodeService osNodeService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected OpenstackSecurityGroupService securityGroupService;
 
     private final ExecutorService eventExecutor = newSingleThreadExecutor(
diff --git a/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/OpenstackSwitchingHostProvider.java b/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/OpenstackSwitchingHostProvider.java
index 40413d7..92005cf 100644
--- a/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/OpenstackSwitchingHostProvider.java
+++ b/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/OpenstackSwitchingHostProvider.java
@@ -16,12 +16,6 @@
 package org.onosproject.openstacknetworking.impl;
 
 import com.google.common.base.Strings;
-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.packet.IpAddress;
 import org.onlab.packet.MacAddress;
 import org.onlab.packet.VlanId;
@@ -54,6 +48,11 @@
 import org.onosproject.openstacknode.api.OpenstackNodeService;
 import org.openstack4j.model.network.Network;
 import org.openstack4j.model.network.NetworkType;
+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;
 
@@ -76,8 +75,7 @@
 import static org.onosproject.openstacknetworking.util.OpenstackNetworkingUtil.vnicType;
 import static org.onosproject.openstacknode.api.OpenstackNode.NodeType.CONTROLLER;
 
-@Service
-@Component(immediate = true)
+@Component(immediate = true, service = HostProvider.class)
 public final class OpenstackSwitchingHostProvider
         extends AbstractProvider implements HostProvider {
 
@@ -86,25 +84,25 @@
     private static final String ERR_ADD_HOST = "Failed to add host: ";
     private static final String SONA_HOST_SCHEME = "sona";
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected CoreService coreService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected DeviceService deviceService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected HostProviderRegistry hostProviderRegistry;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected HostService hostService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected MastershipService mastershipService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected OpenstackNetworkService osNetworkService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected OpenstackNodeService osNodeService;
 
     private HostProviderService hostProviderService;
diff --git a/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/OsgiPropertyConstants.java b/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/OsgiPropertyConstants.java
new file mode 100644
index 0000000..154fe79
--- /dev/null
+++ b/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/OsgiPropertyConstants.java
@@ -0,0 +1,40 @@
+/*
+ * Copyright 2018-present Open Networking Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.onosproject.openstacknetworking.impl;
+
+/**
+ * Name/Value constants for properties.
+ */
+public final class OsgiPropertyConstants {
+    private OsgiPropertyConstants() {
+    }
+
+    static final String GATEWAY_MAC = "gatewayMac";
+    static final String GATEWAY_MAC_DEFAULT = "fe:00:00:00:00:02";
+
+    static final String ARP_MODE = "arpMode";
+    static final String ARP_MODE_DEFAULT = "proxy";
+
+    static final String USE_STATEFUL_SNAT = "useStatefulSnat";
+    static final boolean USE_STATEFUL_SNAT_DEFAULT = false;
+
+    static final String USE_SECURITY_GROUP = "useSecurityGroup";
+    static final boolean USE_SECURITY_GROUP_DEFAULT = false;
+
+    static final String DHCP_SERVER_MAC = "dhcpServerMac";
+    static final String DHCP_SERVER_MAC_DEFAULT = "fe:00:00:00:00:02";
+}
diff --git a/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/PreCommitPortManager.java b/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/PreCommitPortManager.java
index 2926072..2e506f3 100644
--- a/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/PreCommitPortManager.java
+++ b/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/PreCommitPortManager.java
@@ -15,12 +15,6 @@
  */
 package org.onosproject.openstacknetworking.impl;
 
-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.KryoNamespace;
 import org.onosproject.core.ApplicationId;
 import org.onosproject.core.CoreService;
@@ -33,6 +27,11 @@
 import org.onosproject.store.service.ConsistentMap;
 import org.onosproject.store.service.Serializer;
 import org.onosproject.store.service.StorageService;
+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.HashMap;
@@ -48,8 +47,7 @@
 /**
  * Implementation of pre-commit service.
  */
-@Service
-@Component(immediate = true)
+@Component(immediate = true, service = PreCommitPortService.class)
 public class PreCommitPortManager implements PreCommitPortService {
 
     protected final Logger log = getLogger(getClass());
@@ -59,10 +57,10 @@
             .register(OpenstackNetworkEvent.Type.class)
             .build();
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected CoreService coreService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected StorageService storageService;
 
     private ConsistentMap<String, Map<Type, Set<String>>> store;
diff --git a/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/web/OpenstackNetworkingCodecRegister.java b/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/web/OpenstackNetworkingCodecRegister.java
index 92167d0..632381a 100644
--- a/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/web/OpenstackNetworkingCodecRegister.java
+++ b/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/web/OpenstackNetworkingCodecRegister.java
@@ -15,11 +15,11 @@
  */
 package org.onosproject.openstacknetworking.web;
 
-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.onosproject.codec.CodecService;
 import org.onosproject.openstacknetworking.api.InstancePort;
 import org.onosproject.openstacknetworking.codec.InstancePortCodec;
@@ -35,7 +35,7 @@
 
     private final Logger log = getLogger(getClass());
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected CodecService codecService;
 
     @Activate
diff --git a/apps/openstacknetworking/app/src/main/resources/OSGI-INF/blueprint/shell-config.xml b/apps/openstacknetworking/app/src/main/resources/OSGI-INF/blueprint/shell-config.xml
deleted file mode 100644
index f21a250..0000000
--- a/apps/openstacknetworking/app/src/main/resources/OSGI-INF/blueprint/shell-config.xml
+++ /dev/null
@@ -1,122 +0,0 @@
-<!--
-~ Copyright 2017-present Open Networking Foundation
-~
-~ Licensed under the Apache License, Version 2.0 (the "License");
-~ you may not use this file except in compliance with the License.
-~ You may obtain a copy of the License at
-~
-~     http://www.apache.org/licenses/LICENSE-2.0
-~
-~ Unless required by applicable law or agreed to in writing, software
-~ distributed under the License is distributed on an "AS IS" BASIS,
-~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-~ See the License for the specific language governing permissions and
-~ limitations under the License.
--->
-<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0">
-    <command-bundle xmlns="http://karaf.apache.org/xmlns/shell/v1.1.0">
-        <command>
-            <action class="org.onosproject.openstacknetworking.cli.OpenstackNetworkListCommand"/>
-        </command>
-        <command>
-            <action class="org.onosproject.openstacknetworking.cli.OpenstackSubnetListCommand"/>
-        </command>
-        <command>
-            <action class="org.onosproject.openstacknetworking.cli.OpenstackPortListCommand"/>
-        </command>
-        <command>
-            <action class="org.onosproject.openstacknetworking.cli.OpenstackDirectPortListCommand"/>
-        </command>
-        <command>
-            <action class="org.onosproject.openstacknetworking.cli.OpenstackRouterListCommand"/>
-        </command>
-        <command>
-            <action class="org.onosproject.openstacknetworking.cli.OpenstackFloatingIpListCommand"/>
-        </command>
-        <command>
-            <action class="org.onosproject.openstacknetworking.cli.OpenstackPurgeStateCommand"/>
-        </command>
-        <command>
-            <action class="org.onosproject.openstacknetworking.cli.OpenstackSyncStateCommand"/>
-        </command>
-        <command>
-            <action class="org.onosproject.openstacknetworking.cli.OpenstackSecurityGroupListCommand"/>
-        </command>
-        <command>
-            <action class="org.onosproject.openstacknetworking.cli.OpenstackPurgeRulesCommand"/>
-        </command>
-        <command>
-            <action class="org.onosproject.openstacknetworking.cli.OpenstackSyncRulesCommand"/>
-        </command>
-        <command>
-            <action class="org.onosproject.openstacknetworking.cli.ExternalPeerRouterListCommand"/>
-        </command>
-        <command>
-            <action class="org.onosproject.openstacknetworking.cli.UpdateExternalPeerRouterCommand"/>
-            <completers>
-                <ref component-id="ipAddressCompleter"/>
-                <ref component-id="macAddressCompleter"/>
-                <ref component-id="vlanIdCompleter"/>
-            </completers>
-        </command>
-        <command>
-            <action class="org.onosproject.openstacknetworking.cli.UpdateExternalPeerRouterVlanCommand"/>
-            <completers>
-                <ref component-id="ipAddressCompleter"/>
-            </completers>
-        </command>
-        <command>
-            <action class="org.onosproject.openstacknetworking.cli.DeleteExternalPeerRouterCommand" />
-            <completers>
-                <ref component-id="ipAddressCompleter"/>
-            </completers>
-        </command>
-        <command>
-            <action class="org.onosproject.openstacknetworking.cli.OpenstackConfigArpModeCommand" />
-            <completers>
-                <ref component-id="arpModeCompleter"/>
-            </completers>
-        </command>
-        <command>
-            <action class="org.onosproject.openstacknetworking.cli.OpenstackAddAclCommand" />
-        </command>
-        <command>
-            <action class="org.onosproject.openstacknetworking.cli.OpenstackRemoveAclCommand" />
-        </command>
-        <command>
-            <action class="org.onosproject.openstacknetworking.cli.InstancePortListCommand" />
-        </command>
-        <command>
-            <action class="org.onosproject.openstacknetworking.cli.PurgeInstancePortsCommand" />
-            <completers>
-                <ref component-id="instancePortIdCompleter"/>
-            </completers>
-        </command>
-        <command>
-            <action class="org.onosproject.openstacknetworking.cli.OpenstackResetPortsCommand" />
-            <completers>
-                <ref component-id="instancePortIdCompleter"/>
-            </completers>
-        </command>
-        <command>
-            <action class="org.onosproject.openstacknetworking.cli.OpenstackDirectPortAddCommand" />
-            <completers>
-                <ref component-id="directPortCompleter"/>
-            </completers>
-        </command>
-        <command>
-            <action class="org.onosproject.openstacknetworking.cli.OpenstackFlowTraceCommand" />
-            <completers>
-                <ref component-id="instanceIpAddressCompleter"/>
-            </completers>
-        </command>
-    </command-bundle>
-
-    <bean id="ipAddressCompleter" class="org.onosproject.openstacknetworking.cli.IpAddressCompleter"/>
-    <bean id="directPortCompleter" class="org.onosproject.openstacknetworking.cli.DirectPortListCompleter"/>
-    <bean id="macAddressCompleter" class="org.onosproject.openstacknetworking.cli.MacAddressCompleter"/>
-    <bean id="vlanIdCompleter" class="org.onosproject.openstacknetworking.cli.VlanIdCompleter"/>
-    <bean id="arpModeCompleter" class="org.onosproject.openstacknetworking.cli.ArpModeCompleter"/>
-    <bean id="instancePortIdCompleter" class="org.onosproject.openstacknetworking.cli.InstancePortIdCompleter"/>
-    <bean id="instanceIpAddressCompleter" class="org.onosproject.openstacknetworking.cli.InstanceIpAddressCompleter"/>
-</blueprint>
diff --git a/apps/openstacknetworkingui/BUCK b/apps/openstacknetworkingui/BUCK
deleted file mode 100644
index 2f2fe68..0000000
--- a/apps/openstacknetworkingui/BUCK
+++ /dev/null
@@ -1,42 +0,0 @@
-COMPILE_DEPS = [
-  '//lib:CORE_DEPS',
-  '//lib:JACKSON',
-  '//core/store/serializers:onos-core-serializers',
-  '//lib:javax.ws.rs-api',
-  '//utils/rest:onlab-rest',
-  '//lib:jersey-client',
-  '//cli:onos-cli',
-  '//lib:org.apache.karaf.shell.console',
-  '//lib:sshd-core',
-  '//apps/openstacknode/api:onos-apps-openstacknode-api',
-  '//apps/openstacktelemetry/api:onos-apps-openstacktelemetry-api',
-  '//apps/openstacknetworking/api:onos-apps-openstacknetworking-api',
-  '//apps/openstacknetworking/app:onos-apps-openstacknetworking-app',
-]
-
-EXCLUDED_BUNDLES = [
-  '//lib:sshd-core',
-]
-
-TEST_DEPS = [
-    '//lib:TEST_ADAPTERS',
-    '//core/api:onos-api-tests',
-    '//core/common:onos-core-common-tests',
-]
-
-osgi_jar_with_tests (
-  deps = COMPILE_DEPS,
-  test_deps = TEST_DEPS,
-)
-
-onos_app (
-  app_name = 'org.onosproject.openstacknetworkingui',
-  title = 'Openstack Networking UI',
-  category = 'GUI',
-  url = 'http://onosproject.org',
-  description = 'Openstack Networking UI Service',
-  excluded_bundles = EXCLUDED_BUNDLES,
-  required_apps = [
-      'org.onosproject.openstacknetworking',
-  ]
-)
diff --git a/apps/openstacknetworkingui/src/main/java/org/onosproject/openstacknetworkingui/OpenstackNetworkingUiManager.java b/apps/openstacknetworkingui/src/main/java/org/onosproject/openstacknetworkingui/OpenstackNetworkingUiManager.java
index 848cfc7..4191503 100644
--- a/apps/openstacknetworkingui/src/main/java/org/onosproject/openstacknetworkingui/OpenstackNetworkingUiManager.java
+++ b/apps/openstacknetworkingui/src/main/java/org/onosproject/openstacknetworkingui/OpenstackNetworkingUiManager.java
@@ -17,12 +17,6 @@
 
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.Streams;
-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.net.ConnectPoint;
 import org.onosproject.net.Device;
 import org.onosproject.net.DeviceId;
@@ -39,6 +33,11 @@
 import org.onosproject.ui.UiTopoOverlayFactory;
 import org.onosproject.ui.UiView;
 import org.onosproject.ui.UiViewHidden;
+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;
 
@@ -53,8 +52,7 @@
 /**
  * Implementation of OpenStack Networking UI service.
  */
-@Service
-@Component(immediate = true)
+@Component(immediate = true, service = OpenstackNetworkingUiService.class)
 public class OpenstackNetworkingUiManager implements OpenstackNetworkingUiService {
 
     private static final ClassLoader CL = OpenstackNetworkingUiManager.class.getClassLoader();
@@ -66,13 +64,13 @@
 
     private final Logger log = LoggerFactory.getLogger(getClass());
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected UiExtensionService uiExtensionService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected DeviceService deviceService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected LinkStore linkStore;
 
     Set<Device> vDevices;
diff --git a/apps/openstacknetworkingui/src/main/resources/OSGI-INF/blueprint/shell-config.xml b/apps/openstacknetworkingui/src/main/resources/OSGI-INF/blueprint/shell-config.xml
deleted file mode 100644
index cebe471..0000000
--- a/apps/openstacknetworkingui/src/main/resources/OSGI-INF/blueprint/shell-config.xml
+++ /dev/null
@@ -1,19 +0,0 @@
-<!--
-~ Copyright 2017-present Open Networking Foundation
-~
-~ Licensed under the Apache License, Version 2.0 (the "License");
-~ you may not use this file except in compliance with the License.
-~ You may obtain a copy of the License at
-~
-~     http://www.apache.org/licenses/LICENSE-2.0
-~
-~ Unless required by applicable law or agreed to in writing, software
-~ distributed under the License is distributed on an "AS IS" BASIS,
-~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-~ See the License for the specific language governing permissions and
-~ limitations under the License.
--->
-<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0">
-    <command-bundle xmlns="http://karaf.apache.org/xmlns/shell/v1.1.0">
-    </command-bundle>
-</blueprint>
diff --git a/apps/openstacknode/BUCK b/apps/openstacknode/BUCK
deleted file mode 100644
index 6abc695..0000000
--- a/apps/openstacknode/BUCK
+++ /dev/null
@@ -1,13 +0,0 @@
-BUNDLES = [
-    '//apps/openstacknode/api:onos-apps-openstacknode-api',
-    '//apps/openstacknode/app:onos-apps-openstacknode-app',
-]
-
-onos_app (
-    title = 'OpenStack Node Bootstrap',
-    category = 'Integration',
-    url = 'http://onosproject.org',
-    included_bundles = BUNDLES,
-    description = 'SONA Openstack Node Bootstrap Application.',
-    required_apps = [ 'org.onosproject.ovsdb-base', 'org.onosproject.drivers.ovsdb' ]
-)
diff --git a/apps/openstacknode/api/BUCK b/apps/openstacknode/api/BUCK
deleted file mode 100644
index 02cd049..0000000
--- a/apps/openstacknode/api/BUCK
+++ /dev/null
@@ -1,23 +0,0 @@
-include_defs('//apps/openstacknode/openstack4j.bucklet')
-
-COMPILE_DEPS = [
-    '//lib:CORE_DEPS',
-    '//lib:org.apache.karaf.shell.console',
-    '//cli:onos-cli',
-    '//protocols/ovsdb/api:onos-protocols-ovsdb-api',
-    '//protocols/ovsdb/rfc:onos-protocols-ovsdb-rfc',
-    '//core/store/serializers:onos-core-serializers',
-]
-
-TEST_DEPS = [
-    '//lib:TEST_ADAPTERS',
-    '//core/api:onos-api-tests',
-    '//core/common:onos-core-common-tests',
-]
-
-osgi_jar_with_tests (
-    deps = COMPILE_DEPS,
-    test_deps = TEST_DEPS,
-
-    import_packages = INCLUDE_PACKAGES + ',' + EXCLUDE_PACKAGES  + ',' + ALL_PACKAGES,
-)
diff --git a/apps/openstacknode/app/BUCK b/apps/openstacknode/app/BUCK
deleted file mode 100644
index d670b42..0000000
--- a/apps/openstacknode/app/BUCK
+++ /dev/null
@@ -1,47 +0,0 @@
-include_defs('//apps/openstacknode/openstack4j.bucklet')
-
-COMPILE_DEPS = [
-    '//lib:CORE_DEPS',
-    '//lib:JACKSON',
-    '//lib:KRYO',
-    '//lib:org.apache.karaf.shell.console',
-    '//cli:onos-cli',
-    '//lib:javax.ws.rs-api',
-    '//utils/rest:onlab-rest',
-    '//protocols/ovsdb/api:onos-protocols-ovsdb-api',
-    '//protocols/ovsdb/rfc:onos-protocols-ovsdb-rfc',
-    '//core/store/serializers:onos-core-serializers',
-    '//apps/openstacknode/api:onos-apps-openstacknode-api',
-    '//lib:openstack4j-core',
-    '//lib:openstack4j-http-connector',
-    '//lib:openstack4j-httpclient',
-    '//lib:json-patch',
-    '//lib:jackson-coreutils',
-    '//lib:btf',
-    '//lib:msg-simple',
-    '//lib:snakeyaml',
-]
-
-TEST_DEPS = [
-    '//lib:TEST_ADAPTERS',
-    '//core/api:onos-api-tests',
-    '//apps/openstacknode/api:onos-apps-openstacknode-api-tests',
-    '//core/common:onos-core-common-tests',
-    '//web/api:onos-rest-tests',
-    '//lib:TEST_REST',
-]
-
-osgi_jar_with_tests (
-    deps = COMPILE_DEPS,
-    test_deps = TEST_DEPS,
-    web_context = '/onos/openstacknode',
-    api_title = 'OpenStack Node API',
-    api_version = '1.0',
-    api_description = 'REST API for OpenStack Node',
-    api_package = 'org.onosproject.openstacknode.web',
-
-    # dependency embedding
-    import_packages = INCLUDE_PACKAGES + ',' + EXCLUDE_PACKAGES  + ',' + ALL_PACKAGES,
-    bundle_classpath = get_openstack4j_deps_path() + get_jackson_deps_path()
-)
-
diff --git a/apps/openstacknode/app/app.xml b/apps/openstacknode/app/app.xml
deleted file mode 100644
index 6b78b5e..0000000
--- a/apps/openstacknode/app/app.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-  ~ Copyright 2018-present Open Networking Foundation
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~     http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License.
-  -->
-<app name="org.onosproject.openstacknode" origin="Open Networking Foundation" version="${project.version}"
-     category="Utility" url="https://wiki.onosproject.org/display/ONOS/SONA%3A+DC+Network+Virtualization"
-     title="OpenStack Node App" features="${project.artifactId}"
-     apps="org.onosproject.ovsdb-base,org.onosproject.drivers.ovsdb"
-     featuresRepo="mvn:${project.groupId}/${project.artifactId}/${project.version}/xml/features">
-    <description>${project.description}</description>
-    <artifact>mvn:${project.groupId}/onos-apps-openstacknode-api/${project.version}</artifact>
-    <artifact>mvn:${project.groupId}/onos-apps-openstacknode-app/${project.version}</artifact>
-</app>
diff --git a/apps/openstacknode/app/features.xml b/apps/openstacknode/app/features.xml
deleted file mode 100644
index fdd76cc..0000000
--- a/apps/openstacknode/app/features.xml
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
-<!--
-  ~ Copyright 2018-present Open Networking Foundation
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~     http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License.
-  -->
-<features xmlns="http://karaf.apache.org/xmlns/features/v1.2.0" name="${project.artifactId}-${project.version}">
-    <feature name="${project.artifactId}" version="${project.version}"
-             description="${project.description}">
-        <feature>onos-api</feature>
-        <bundle>mvn:${project.groupId}/onos-apps-openstacknode-api/${project.version}</bundle>
-        <bundle>mvn:${project.groupId}/onos-apps-openstacknode-app/${project.version}</bundle>
-    </feature>
-</features>
diff --git a/apps/openstacknode/app/src/main/java/org/onosproject/openstacknode/cli/OpenstackHostnameCompleter.java b/apps/openstacknode/app/src/main/java/org/onosproject/openstacknode/cli/OpenstackHostnameCompleter.java
index 1d08c0a..de8530e 100644
--- a/apps/openstacknode/app/src/main/java/org/onosproject/openstacknode/cli/OpenstackHostnameCompleter.java
+++ b/apps/openstacknode/app/src/main/java/org/onosproject/openstacknode/cli/OpenstackHostnameCompleter.java
@@ -15,8 +15,11 @@
  */
 package org.onosproject.openstacknode.cli;
 
-import org.apache.karaf.shell.console.Completer;
-import org.apache.karaf.shell.console.completer.StringsCompleter;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
+import org.apache.karaf.shell.api.console.CommandLine;
+import org.apache.karaf.shell.api.console.Completer;
+import org.apache.karaf.shell.api.console.Session;
+import org.apache.karaf.shell.support.completers.StringsCompleter;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.openstacknode.api.OpenstackNode;
 import org.onosproject.openstacknode.api.OpenstackNodeService;
@@ -29,10 +32,11 @@
 /**
  * Openstack host completer.
  */
+@Service
 public class OpenstackHostnameCompleter implements Completer {
 
     @Override
-    public int complete(String buffer, int cursor, List<String> candidates) {
+    public int complete(Session session, CommandLine commandLine, List<String> candidates) {
         StringsCompleter delegate = new StringsCompleter();
         OpenstackNodeService osNodeService = AbstractShellCommand.get(OpenstackNodeService.class);
 
@@ -43,6 +47,6 @@
 
         strings.addAll(hostnames);
 
-        return delegate.complete(buffer, cursor, candidates);
+        return delegate.complete(session, commandLine, candidates);
     }
 }
diff --git a/apps/openstacknode/app/src/main/java/org/onosproject/openstacknode/cli/OpenstackNodeCheckCommand.java b/apps/openstacknode/app/src/main/java/org/onosproject/openstacknode/cli/OpenstackNodeCheckCommand.java
index 23558c8..7f1d630 100644
--- a/apps/openstacknode/app/src/main/java/org/onosproject/openstacknode/cli/OpenstackNodeCheckCommand.java
+++ b/apps/openstacknode/app/src/main/java/org/onosproject/openstacknode/cli/OpenstackNodeCheckCommand.java
@@ -16,8 +16,9 @@
 
 package org.onosproject.openstacknode.cli;
 
-import org.apache.karaf.shell.commands.Argument;
-import org.apache.karaf.shell.commands.Command;
+import org.apache.karaf.shell.api.action.Argument;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.net.DeviceId;
 import org.onosproject.net.Port;
@@ -38,6 +39,7 @@
 /**
  * Checks detailed node init state.
  */
+@Service
 @Command(scope = "onos", name = "openstack-node-check",
         description = "Shows detailed node init state")
 public class OpenstackNodeCheckCommand extends AbstractShellCommand {
@@ -50,7 +52,7 @@
     private static final String MSG_ERROR = "ERROR";
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         OpenstackNodeService osNodeService = AbstractShellCommand.get(OpenstackNodeService.class);
         DeviceService deviceService = AbstractShellCommand.get(DeviceService.class);
 
diff --git a/apps/openstacknode/app/src/main/java/org/onosproject/openstacknode/cli/OpenstackNodeInitCommand.java b/apps/openstacknode/app/src/main/java/org/onosproject/openstacknode/cli/OpenstackNodeInitCommand.java
index d620e37..155ecfc 100644
--- a/apps/openstacknode/app/src/main/java/org/onosproject/openstacknode/cli/OpenstackNodeInitCommand.java
+++ b/apps/openstacknode/app/src/main/java/org/onosproject/openstacknode/cli/OpenstackNodeInitCommand.java
@@ -16,9 +16,10 @@
 
 package org.onosproject.openstacknode.cli;
 
-import org.apache.karaf.shell.commands.Argument;
-import org.apache.karaf.shell.commands.Command;
-import org.apache.karaf.shell.commands.Option;
+import org.apache.karaf.shell.api.action.Argument;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.Option;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.openstacknode.api.NodeState;
 import org.onosproject.openstacknode.api.OpenstackNode;
@@ -28,6 +29,7 @@
 /**
  * Initializes nodes for OpenStack node service.
  */
+@Service
 @Command(scope = "onos", name = "openstack-node-init",
         description = "Initializes nodes for OpenStack node service")
 public class OpenstackNodeInitCommand extends AbstractShellCommand {
@@ -46,7 +48,7 @@
     private String[] hostnames = null;
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         OpenstackNodeService osNodeService =
                 AbstractShellCommand.get(OpenstackNodeService.class);
         OpenstackNodeAdminService osNodeAdminService =
diff --git a/apps/openstacknode/app/src/main/java/org/onosproject/openstacknode/cli/OpenstackNodeListCommand.java b/apps/openstacknode/app/src/main/java/org/onosproject/openstacknode/cli/OpenstackNodeListCommand.java
index c54a136..a4400f7 100644
--- a/apps/openstacknode/app/src/main/java/org/onosproject/openstacknode/cli/OpenstackNodeListCommand.java
+++ b/apps/openstacknode/app/src/main/java/org/onosproject/openstacknode/cli/OpenstackNodeListCommand.java
@@ -19,7 +19,8 @@
 import com.fasterxml.jackson.databind.ObjectMapper;
 import com.fasterxml.jackson.databind.node.ArrayNode;
 import com.google.common.collect.Lists;
-import org.apache.karaf.shell.commands.Command;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.openstacknode.api.OpenstackNode;
 import org.onosproject.openstacknode.api.OpenstackNodeService;
@@ -33,6 +34,7 @@
 /**
  * Lists all nodes registered to the service.
  */
+@Service
 @Command(scope = "onos", name = "openstack-nodes",
         description = "Lists all nodes registered in OpenStack node service")
 public class OpenstackNodeListCommand extends AbstractShellCommand {
@@ -40,7 +42,7 @@
     private static final String FORMAT = "%-20s%-15s%-24s%-24s%-20s%-20s%-15s%-15s%-15s";
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         OpenstackNodeService osNodeService = AbstractShellCommand.get(OpenstackNodeService.class);
         List<OpenstackNode> osNodes = Lists.newArrayList(osNodeService.nodes());
         osNodes.sort(Comparator.comparing(OpenstackNode::hostname));
diff --git a/apps/openstacknode/app/src/main/java/org/onosproject/openstacknode/impl/DefaultOpenstackNodeHandler.java b/apps/openstacknode/app/src/main/java/org/onosproject/openstacknode/impl/DefaultOpenstackNodeHandler.java
index 54a0c19..9f3d220 100644
--- a/apps/openstacknode/app/src/main/java/org/onosproject/openstacknode/impl/DefaultOpenstackNodeHandler.java
+++ b/apps/openstacknode/app/src/main/java/org/onosproject/openstacknode/impl/DefaultOpenstackNodeHandler.java
@@ -16,13 +16,6 @@
 package org.onosproject.openstacknode.impl;
 
 import com.google.common.collect.Lists;
-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.onlab.packet.IpAddress;
 import org.onlab.util.Tools;
 import org.onosproject.cfg.ComponentConfigService;
@@ -65,6 +58,12 @@
 import org.onosproject.ovsdb.rfc.table.Interface;
 import org.openstack4j.api.OSClient;
 import org.osgi.service.component.ComponentContext;
+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.Collection;
@@ -91,6 +90,10 @@
 import static org.onosproject.openstacknode.api.OpenstackNode.NodeType.CONTROLLER;
 import static org.onosproject.openstacknode.api.OpenstackNode.NodeType.GATEWAY;
 import static org.onosproject.openstacknode.api.OpenstackNodeService.APP_ID;
+import static org.onosproject.openstacknode.impl.OsgiPropertyConstants.AUTO_RECOVERY;
+import static org.onosproject.openstacknode.impl.OsgiPropertyConstants.AUTO_RECOVERY_DEFAULT;
+import static org.onosproject.openstacknode.impl.OsgiPropertyConstants.OVSDB_PORT;
+import static org.onosproject.openstacknode.impl.OsgiPropertyConstants.OVSDB_PORT_NUM_DEFAULT;
 import static org.onosproject.openstacknode.util.OpenstackNodeUtil.addOrRemoveDpdkInterface;
 import static org.onosproject.openstacknode.util.OpenstackNodeUtil.addOrRemoveSystemInterface;
 import static org.onosproject.openstacknode.util.OpenstackNodeUtil.getBooleanProperty;
@@ -102,54 +105,52 @@
 /**
  * Service bootstraps openstack node based on its type.
  */
-@Component(immediate = true)
+@Component(immediate = true,
+    property = {
+        OVSDB_PORT + ":Integer=" + OVSDB_PORT_NUM_DEFAULT,
+        AUTO_RECOVERY + ":Boolean=" + AUTO_RECOVERY_DEFAULT
+    }
+)
 public class DefaultOpenstackNodeHandler implements OpenstackNodeHandler {
 
     private final Logger log = getLogger(getClass());
 
-    private static final String OVSDB_PORT = "ovsdbPortNum";
-    private static final String AUTO_RECOVERY = "autoRecovery";
     private static final String DEFAULT_OF_PROTO = "tcp";
-    private static final int DEFAULT_OVSDB_PORT = 6640;
     private static final int DEFAULT_OFPORT = 6653;
-    private static final boolean DEFAULT_AUTO_RECOVERY = true;
     private static final int DPID_BEGIN = 3;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected CoreService coreService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected LeadershipService leadershipService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected ClusterService clusterService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected DeviceService deviceService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected DeviceAdminService deviceAdminService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected OvsdbController ovsdbController;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected OpenstackNodeService osNodeService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected OpenstackNodeAdminService osNodeAdminService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected ComponentConfigService componentConfigService;
 
-    @Property(name = OVSDB_PORT, intValue = DEFAULT_OVSDB_PORT,
-            label = "OVSDB server listen port")
-    private int ovsdbPort = DEFAULT_OVSDB_PORT;
+    /** OVSDB server listen port. */
+    private int ovsdbPortNum = OVSDB_PORT_NUM_DEFAULT;
 
-    @Property(name = AUTO_RECOVERY, boolValue = DEFAULT_AUTO_RECOVERY,
-            label = "A flag which indicates whether auto-recover openstack " +
-                    "node status at the receiving of switch reconnecting event.")
-    private boolean autoRecovery = DEFAULT_AUTO_RECOVERY;
+    /** A flag which indicates whether auto-recover openstack node status on switch reconnecting event. */
+    private boolean autoRecovery = AUTO_RECOVERY_DEFAULT;
 
     private final ExecutorService eventExecutor = newSingleThreadExecutor(
             groupedThreads(this.getClass().getSimpleName(), "event-handler", log));
@@ -196,8 +197,8 @@
 
     @Override
     public void processInitState(OpenstackNode osNode) {
-        if (!isOvsdbConnected(osNode, ovsdbPort, ovsdbController, deviceService)) {
-            ovsdbController.connect(osNode.managementIp(), tpPort(ovsdbPort));
+        if (!isOvsdbConnected(osNode, ovsdbPortNum, ovsdbController, deviceService)) {
+            ovsdbController.connect(osNode.managementIp(), tpPort(ovsdbPortNum));
             return;
         }
         if (!deviceService.isAvailable(osNode.intgBridge())) {
@@ -211,8 +212,8 @@
     @Override
     public void processDeviceCreatedState(OpenstackNode osNode) {
         try {
-            if (!isOvsdbConnected(osNode, ovsdbPort, ovsdbController, deviceService)) {
-                ovsdbController.connect(osNode.managementIp(), tpPort(ovsdbPort));
+            if (!isOvsdbConnected(osNode, ovsdbPortNum, ovsdbController, deviceService)) {
+                ovsdbController.connect(osNode.managementIp(), tpPort(ovsdbPortNum));
                 return;
             }
 
@@ -230,12 +231,12 @@
                 osNode.dpdkConfig().dpdkIntfs().stream()
                         .filter(dpdkInterface -> dpdkInterface.deviceName().equals(TUNNEL_BRIDGE))
                         .forEach(dpdkInterface -> addOrRemoveDpdkInterface(
-                                osNode, dpdkInterface, ovsdbPort, ovsdbController, true));
+                                osNode, dpdkInterface, ovsdbPortNum, ovsdbController, true));
 
                 osNode.dpdkConfig().dpdkIntfs().stream()
                         .filter(dpdkInterface -> dpdkInterface.deviceName().equals(INTEGRATION_BRIDGE))
                         .forEach(dpdkInterface -> addOrRemoveDpdkInterface(
-                                osNode, dpdkInterface, ovsdbPort, ovsdbController, true));
+                                osNode, dpdkInterface, ovsdbPortNum, ovsdbController, true));
             }
 
             osNode.phyIntfs().forEach(i -> {
@@ -275,7 +276,7 @@
 
     private boolean dpdkTunnelBridgeCreated(OpenstackNode osNode) {
 
-        OvsdbClientService client = getOvsdbClient(osNode, ovsdbPort, ovsdbController);
+        OvsdbClientService client = getOvsdbClient(osNode, ovsdbPortNum, ovsdbController);
         if (client == null) {
             log.info("Failed to get ovsdb client");
             return false;
@@ -389,7 +390,7 @@
     private boolean isCurrentStateDone(OpenstackNode osNode) {
         switch (osNode.state()) {
             case INIT:
-                if (!isOvsdbConnected(osNode, ovsdbPort, ovsdbController, deviceService)) {
+                if (!isOvsdbConnected(osNode, ovsdbPortNum, ovsdbController, deviceService)) {
                     return false;
                 }
 
@@ -435,7 +436,7 @@
     }
 
     private boolean isDpdkIntfsCreated(OpenstackNode osNode, Collection<DpdkInterface> dpdkInterfaces) {
-        OvsdbClientService client = getOvsdbClient(osNode, ovsdbPort, ovsdbController);
+        OvsdbClientService client = getOvsdbClient(osNode, ovsdbPortNum, ovsdbController);
         if (client == null) {
             log.info("Failed to get ovsdb client");
             return false;
@@ -538,7 +539,7 @@
                                       String intfName,
                                       Optional<DpdkInterface> dpdkInterface) {
         if (dpdkInterface.isPresent()) {
-            addOrRemoveDpdkInterface(osNode, dpdkInterface.get(), ovsdbPort,
+            addOrRemoveDpdkInterface(osNode, dpdkInterface.get(), ovsdbPortNum,
                     ovsdbController, false);
         } else {
             addOrRemoveSystemInterface(osNode, INTEGRATION_BRIDGE, intfName, deviceService,
@@ -547,7 +548,7 @@
     }
 
     private void processOpenstackNodeRemoved(OpenstackNode osNode) {
-        OvsdbClientService client = getOvsdbClient(osNode, ovsdbPort, ovsdbController);
+        OvsdbClientService client = getOvsdbClient(osNode, ovsdbPortNum, ovsdbController);
         if (client == null) {
             log.info("Failed to get ovsdb client");
             return;
@@ -563,7 +564,7 @@
         if (osNode.dpdkConfig() != null) {
             osNode.dpdkConfig().dpdkIntfs().forEach(dpdkInterface -> {
                 if (isDpdkIntfsCreated(osNode, Lists.newArrayList(dpdkInterface))) {
-                    addOrRemoveDpdkInterface(osNode, dpdkInterface, ovsdbPort, ovsdbController, false);
+                    addOrRemoveDpdkInterface(osNode, dpdkInterface, ovsdbPortNum, ovsdbController, false);
                 }
             });
         }
@@ -612,17 +613,17 @@
 
         Integer ovsdbPortConfigured = Tools.getIntegerProperty(properties, OVSDB_PORT);
         if (ovsdbPortConfigured == null) {
-            ovsdbPort = DEFAULT_OVSDB_PORT;
-            log.info("OVSDB port is NOT configured, default value is {}", ovsdbPort);
+            ovsdbPortNum = OVSDB_PORT_NUM_DEFAULT;
+            log.info("OVSDB port is NOT configured, default value is {}", ovsdbPortNum);
         } else {
-            ovsdbPort = ovsdbPortConfigured;
-            log.info("Configured. OVSDB port is {}", ovsdbPort);
+            ovsdbPortNum = ovsdbPortConfigured;
+            log.info("Configured. OVSDB port is {}", ovsdbPortNum);
         }
 
         Boolean autoRecoveryConfigured =
                 getBooleanProperty(properties, AUTO_RECOVERY);
         if (autoRecoveryConfigured == null) {
-            autoRecovery = DEFAULT_AUTO_RECOVERY;
+            autoRecovery = AUTO_RECOVERY_DEFAULT;
             log.info("Auto recovery flag is NOT " +
                     "configured, default value is {}", autoRecovery);
         } else {
diff --git a/apps/openstacknode/app/src/main/java/org/onosproject/openstacknode/impl/DistributedOpenstackNodeStore.java b/apps/openstacknode/app/src/main/java/org/onosproject/openstacknode/impl/DistributedOpenstackNodeStore.java
index 92de9eb..188520f 100644
--- a/apps/openstacknode/app/src/main/java/org/onosproject/openstacknode/impl/DistributedOpenstackNodeStore.java
+++ b/apps/openstacknode/app/src/main/java/org/onosproject/openstacknode/impl/DistributedOpenstackNodeStore.java
@@ -16,12 +16,6 @@
 package org.onosproject.openstacknode.impl;
 
 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.apache.felix.scr.annotations.Service;
 import org.onlab.util.KryoNamespace;
 import org.onosproject.core.ApplicationId;
 import org.onosproject.core.CoreService;
@@ -50,6 +44,11 @@
 import org.onosproject.store.service.Serializer;
 import org.onosproject.store.service.StorageService;
 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.util.Collection;
@@ -74,8 +73,7 @@
 /**
  * Implementation of openstack node store using consistent map.
  */
-@Service
-@Component(immediate = true)
+@Component(immediate = true, service = OpenstackNodeStore.class)
 public class DistributedOpenstackNodeStore
         extends AbstractStore<OpenstackNodeEvent, OpenstackNodeStoreDelegate>
         implements OpenstackNodeStore {
@@ -109,10 +107,10 @@
             .register(Collection.class)
             .build();
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected CoreService coreService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected StorageService storageService;
 
     private final ExecutorService eventExecutor = newSingleThreadExecutor(
diff --git a/apps/openstacknode/app/src/main/java/org/onosproject/openstacknode/impl/OpenstackNodeManager.java b/apps/openstacknode/app/src/main/java/org/onosproject/openstacknode/impl/OpenstackNodeManager.java
index c2f8bc1..d990fae 100644
--- a/apps/openstacknode/app/src/main/java/org/onosproject/openstacknode/impl/OpenstackNodeManager.java
+++ b/apps/openstacknode/app/src/main/java/org/onosproject/openstacknode/impl/OpenstackNodeManager.java
@@ -17,14 +17,6 @@
 
 import com.google.common.base.Strings;
 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.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.util.Tools;
 import org.onosproject.cluster.ClusterService;
 import org.onosproject.cluster.LeadershipService;
@@ -44,6 +36,12 @@
 import org.onosproject.store.service.AtomicCounter;
 import org.onosproject.store.service.StorageService;
 import org.osgi.service.component.ComponentContext;
+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.Dictionary;
@@ -63,6 +61,8 @@
 import static org.onosproject.openstacknode.api.Constants.INTEGRATION_BRIDGE;
 import static org.onosproject.openstacknode.api.NodeState.COMPLETE;
 import static org.onosproject.openstacknode.api.OpenstackNode.NodeType.CONTROLLER;
+import static org.onosproject.openstacknode.impl.OsgiPropertyConstants.OVSDB_PORT;
+import static org.onosproject.openstacknode.impl.OsgiPropertyConstants.OVSDB_PORT_NUM_DEFAULT;
 import static org.onosproject.openstacknode.util.OpenstackNodeUtil.addOrRemoveSystemInterface;
 import static org.onosproject.openstacknode.util.OpenstackNodeUtil.genDpid;
 import static org.onosproject.openstacknode.util.OpenstackNodeUtil.isOvsdbConnected;
@@ -71,8 +71,13 @@
 /**
  * Service administering the inventory of openstack nodes.
  */
-@Service
-@Component(immediate = true)
+@Component(
+    immediate = true,
+    service = { OpenstackNodeService.class, OpenstackNodeAdminService.class },
+    property = {
+        OVSDB_PORT + ":Integer=" + OVSDB_PORT_NUM_DEFAULT
+    }
+)
 public class OpenstackNodeManager extends ListenerRegistry<OpenstackNodeEvent, OpenstackNodeListener>
         implements OpenstackNodeService, OpenstackNodeAdminService {
 
@@ -82,8 +87,6 @@
     private static final String MSG_CREATED = "created";
     private static final String MSG_UPDATED = "updated";
     private static final String MSG_REMOVED = "removed";
-    private static final String OVSDB_PORT = "ovsdbPortNum";
-    private static final int DEFAULT_OVSDB_PORT = 6640;
 
     private static final String DEVICE_ID_COUNTER_NAME = "device-id-counter";
 
@@ -93,30 +96,29 @@
 
     private static final String NOT_DUPLICATED_MSG = "% cannot be duplicated";
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected OpenstackNodeStore osNodeStore;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected CoreService coreService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected ClusterService clusterService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected LeadershipService leadershipService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected StorageService storageService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected OvsdbController ovsdbController;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected DeviceService deviceService;
 
-    @Property(name = OVSDB_PORT, intValue = DEFAULT_OVSDB_PORT,
-            label = "OVSDB server listen port")
-    private int ovsdbPort = DEFAULT_OVSDB_PORT;
+    /** OVSDB server listen port. */
+    private int ovsdbPortNum = OVSDB_PORT_NUM_DEFAULT;
 
     private final ExecutorService eventExecutor = newSingleThreadExecutor(
             groupedThreads(this.getClass().getSimpleName(), "event-handler", log));
@@ -153,8 +155,8 @@
     protected void modified(ComponentContext context) {
         Dictionary<?, ?> properties = context.getProperties();
         int updatedOvsdbPort = Tools.getIntegerProperty(properties, OVSDB_PORT);
-        if (!Objects.equals(updatedOvsdbPort, ovsdbPort)) {
-            ovsdbPort = updatedOvsdbPort;
+        if (!Objects.equals(updatedOvsdbPort, ovsdbPortNum)) {
+            ovsdbPortNum = updatedOvsdbPort;
         }
 
         log.info("Modified");
@@ -339,11 +341,11 @@
     }
 
     private void connectSwitch(OpenstackNode osNode) {
-        if (!isOvsdbConnected(osNode, ovsdbPort, ovsdbController, deviceService)) {
+        if (!isOvsdbConnected(osNode, ovsdbPortNum, ovsdbController, deviceService)) {
             log.warn("There's no ovsdb connection with the device {}. Try to connect the device...",
                     osNode.ovsdb().toString());
             try {
-                ovsdbController.connect(osNode.managementIp(), tpPort(ovsdbPort));
+                ovsdbController.connect(osNode.managementIp(), tpPort(ovsdbPortNum));
             } catch (Exception e) {
                 log.error("Failed to connect to the openstackNode via ovsdb protocol because of exception {}",
                         e.toString());
diff --git a/apps/openstacknode/app/src/main/java/org/onosproject/openstacknode/impl/OsgiPropertyConstants.java b/apps/openstacknode/app/src/main/java/org/onosproject/openstacknode/impl/OsgiPropertyConstants.java
new file mode 100644
index 0000000..9f22f27
--- /dev/null
+++ b/apps/openstacknode/app/src/main/java/org/onosproject/openstacknode/impl/OsgiPropertyConstants.java
@@ -0,0 +1,31 @@
+/*
+ * Copyright 2018-present Open Networking Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.onosproject.openstacknode.impl;
+
+/**
+ * Name/Value constants for properties.
+ */
+public final class OsgiPropertyConstants {
+    private OsgiPropertyConstants() {
+    }
+
+    static final String OVSDB_PORT = "ovsdbPortNum";
+    static final int OVSDB_PORT_NUM_DEFAULT = 6640;
+
+    static final String AUTO_RECOVERY = "autoRecovery";
+    static final boolean AUTO_RECOVERY_DEFAULT = true;
+}
diff --git a/apps/openstacknode/app/src/main/java/org/onosproject/openstacknode/web/OpenstackNodeCodecRegister.java b/apps/openstacknode/app/src/main/java/org/onosproject/openstacknode/web/OpenstackNodeCodecRegister.java
index bb92eb3..db0a4c0 100644
--- a/apps/openstacknode/app/src/main/java/org/onosproject/openstacknode/web/OpenstackNodeCodecRegister.java
+++ b/apps/openstacknode/app/src/main/java/org/onosproject/openstacknode/web/OpenstackNodeCodecRegister.java
@@ -15,11 +15,11 @@
  */
 package org.onosproject.openstacknode.web;
 
-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.onosproject.codec.CodecService;
 import org.onosproject.net.behaviour.ControllerInfo;
 import org.onosproject.openstacknode.api.DpdkConfig;
@@ -50,7 +50,7 @@
 
     private final org.slf4j.Logger log = getLogger(getClass());
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected CodecService codecService;
 
     @Activate
diff --git a/apps/openstacknode/app/src/main/resources/OSGI-INF/blueprint/shell-config.xml b/apps/openstacknode/app/src/main/resources/OSGI-INF/blueprint/shell-config.xml
deleted file mode 100644
index 19ec8e0..0000000
--- a/apps/openstacknode/app/src/main/resources/OSGI-INF/blueprint/shell-config.xml
+++ /dev/null
@@ -1,38 +0,0 @@
-<!--
-  ~ Copyright 2016-present Open Networking Foundation
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~     http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License.
-  -->
-<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0">
-
-    <command-bundle xmlns="http://karaf.apache.org/xmlns/shell/v1.1.0">
-        <command>
-            <action class="org.onosproject.openstacknode.cli.OpenstackNodeListCommand"/>
-        </command>
-        <command>
-            <action class="org.onosproject.openstacknode.cli.OpenstackNodeCheckCommand"/>
-            <completers>
-                <ref component-id="hostnameCompleter"/>
-            </completers>
-        </command>
-        <command>
-            <action class="org.onosproject.openstacknode.cli.OpenstackNodeInitCommand"/>
-            <completers>
-                <ref component-id="hostnameCompleter"/>
-            </completers>
-        </command>
-    </command-bundle>
-
-    <bean id="hostnameCompleter" class="org.onosproject.openstacknode.cli.OpenstackHostnameCompleter"/>
-
-</blueprint>
diff --git a/apps/openstacknode/openstack4j.bucklet b/apps/openstacknode/openstack4j.bucklet
deleted file mode 100644
index d9e16f4..0000000
--- a/apps/openstacknode/openstack4j.bucklet
+++ /dev/null
@@ -1,41 +0,0 @@
-INCLUDE_PACKAGES = 'com.google.common.net,com.google.common.io,com.fasterxml.jackson.annotation'
-EXCLUDE_PACKAGES = '!org.openstack4j,!org.openstack4j.*,!org.openstack4j.model.network'
-ALL_PACKAGES = '*'
-
-def get_openstack4j_deps_path():
-
-    WEB_INF_PATH = 'WEB-INF/classes/deps/'
-    OPENSTACK4J_DEPS = [
-        'openstack4j-core',
-        'openstack4j-http-connector',
-        'openstack4j-httpclient',
-    ]
-    OPENSTACK4J_VER = '3.1.0'
-
-    openstack_deps_path = ''
-
-    for dep in OPENSTACK4J_DEPS:
-        name = dep + '-' + OPENSTACK4J_VER + '.jar'
-        path = WEB_INF_PATH + name
-        openstack_deps_path = openstack_deps_path + path + ','
-
-    return openstack_deps_path
-
-def get_jackson_deps_path():
-
-    WEB_INF_PATH = 'WEB-INF/classes/deps/'
-    JACKSON_DEPS_WITH_VER = [
-        'json-patch-1.9.jar',
-        'jackson-coreutils-1.6.jar',
-        'msg-simple-1.1.jar',
-        'btf-1.2.jar',
-        'snakeyaml-1.15.jar'
-    ]
-
-    jackson_deps_path = ''
-
-    for dep in JACKSON_DEPS_WITH_VER:
-        path = WEB_INF_PATH + dep
-        jackson_deps_path = jackson_deps_path + path + ','
-
-    return jackson_deps_path
\ No newline at end of file
diff --git a/apps/openstacktelemetry/BUCK b/apps/openstacktelemetry/BUCK
deleted file mode 100644
index 3636bbb..0000000
--- a/apps/openstacktelemetry/BUCK
+++ /dev/null
@@ -1,43 +0,0 @@
-GRPC_VER = '1.3.1'
-
-BUNDLES = [
-    '//lib:kafka-clients',
-    '//lib:influxdb-java',
-    '//lib:simpleclient',
-    '//lib:simpleclient_common',
-    '//lib:simpleclient_hotspot',
-    '//lib:simpleclient_servlet',
-    '//lib:jetty-http',
-    '//lib:jetty-servlet',
-    '//lib:jetty-server',
-    '//lib:jetty-security',
-    '//lib:jetty-util',
-    '//lib:jetty-io',
-    '//lib:servlet-api',
-    '//lib:javax.ws.rs-api',
-    '//lib:jetty-websocket',
-    '//lib:commons-codec',
-    '//lib:retrofit',
-    '//lib:okhttp',
-    '//lib:logging-interceptor',
-    '//lib:com_google_code_gson_gson',
-    '//lib:okio',
-    '//lib:moshi',
-    '//lib:converter-moshi',
-    '//lib:protobuf-java-3.2.0',
-    '//incubator/grpc-dependencies:grpc-core-repkg-' + GRPC_VER,
-    '//lib:google-instrumentation-0.3.0',
-    '//apps/openstacktelemetry/api:onos-apps-openstacktelemetry-api',
-    '//apps/openstacktelemetry/app:onos-apps-openstacktelemetry-app',
-]
-
-onos_app (
-    title = 'OpenStack Telemetry Application',
-    category = 'Integration',
-    url = 'https://wiki.onosproject.org/display/ONOS/SONA%3A+DC+Network+Virtualization',
-    included_bundles = BUNDLES,
-    description = 'SONA Openstack Telemetry Application.',
-    required_apps = [
-        'org.onosproject.openstacknetworking'
-    ]
-)
diff --git a/apps/openstacktelemetry/api/BUCK b/apps/openstacktelemetry/api/BUCK
deleted file mode 100644
index bd27fb6..0000000
--- a/apps/openstacktelemetry/api/BUCK
+++ /dev/null
@@ -1,18 +0,0 @@
-COMPILE_DEPS = [
-    '//lib:CORE_DEPS',
-    '//lib:kafka-clients',
-    '//lib:jersey-client',
-    '//lib:javax.ws.rs-api',
-    '//lib:influxdb-java',
-]
-
-TEST_DEPS = [
-    '//lib:TEST_ADAPTERS',
-    '//core/api:onos-api-tests',
-    '//core/common:onos-core-common-tests',
-]
-
-osgi_jar_with_tests (
-    deps = COMPILE_DEPS,
-    test_deps = TEST_DEPS,
-)
diff --git a/apps/openstacktelemetry/api/src/main/java/org/onosproject/openstacktelemetry/api/Constants.java b/apps/openstacktelemetry/api/src/main/java/org/onosproject/openstacktelemetry/api/Constants.java
index 11b2774..44894db 100644
--- a/apps/openstacktelemetry/api/src/main/java/org/onosproject/openstacktelemetry/api/Constants.java
+++ b/apps/openstacktelemetry/api/src/main/java/org/onosproject/openstacktelemetry/api/Constants.java
@@ -27,48 +27,8 @@
 
     private static final String DEFAULT_SERVER_IP = "localhost";
 
-    // default configuration variables for gRPC
-    public static final String DEFAULT_GRPC_SERVER_IP = DEFAULT_SERVER_IP;
-    public static final int DEFAULT_GRPC_SERVER_PORT = 50051;
-    public static final boolean DEFAULT_GRPC_USE_PLAINTEXT = true;
-    public static final int DEFAULT_GRPC_MAX_INBOUND_MSG_SIZE = 4 * 1024 * 1024;
-
     // default configuration variables for InfluxDB
-    public static final String DEFAULT_INFLUXDB_SERVER_IP = DEFAULT_SERVER_IP;
-    public static final int DEFAULT_INFLUXDB_SERVER_PORT = 8086;
-    public static final String DEFAULT_INFLUXDB_USERNAME = "onos";
-    public static final String DEFAULT_INFLUXDB_PASSWORD = "onos";
-    public static final String DEFAULT_INFLUXDB_DATABASE = "onos";
     public static final String DEFAULT_INFLUXDB_MEASUREMENT = "sonaflow";
-    public static final boolean DEFAULT_INFLUXDB_ENABLE_BATCH = true;
-
-    // default configuration variables for Promethetus exporter
-    public static final String DEFAULT_PROMETHEUS_EXPORTER_IP = "0.0.0.0";
-    public static final int DEFAULT_PROMETHEUS_EXPORTER_PORT = 9501;
-
-    // default configuration variables for Kafka
-    public static final String DEFAULT_KAFKA_SERVER_IP = DEFAULT_SERVER_IP;
-    public static final int DEFAULT_KAFKA_SERVER_PORT = 9092;
-    public static final int DEFAULT_KAFKA_RETRIES = 0;
-    public static final String DEFAULT_KAFKA_REQUIRED_ACKS = "all";
-    public static final int DEFAULT_KAFKA_BATCH_SIZE = 16384;
-    public static final int DEFAULT_KAFKA_LINGER_MS = 1;
-    public static final int DEFAULT_KAFKA_MEMORY_BUFFER = 33554432;
-    public static final String DEFAULT_KAFKA_KEY_SERIALIZER =
-            "org.apache.kafka.common.serialization.StringSerializer";
-    public static final String DEFAULT_KAFKA_VALUE_SERIALIZER =
-            "org.apache.kafka.common.serialization.ByteArraySerializer";
-
-    // default configuration variables for REST API
-    public static final String DEFAULT_REST_SERVER_IP = DEFAULT_SERVER_IP;
-    public static final int DEFAULT_REST_SERVER_PORT = 80;
-    public static final String DEFAULT_REST_ENDPOINT = "telemetry";
-    public static final String DEFAULT_REST_METHOD = "POST";
-    public static final String DEFAULT_REST_REQUEST_MEDIA_TYPE = "application/json";
-    public static final String DEFAULT_REST_RESPONSE_MEDIA_TYPE = "application/json";
-
-    public static final boolean DEFAULT_DISABLE = false;
-    public static final boolean DEFAULT_ENABLE = true;
 
     public static final String VXLAN = "VXLAN";
     public static final String VLAN = "VLAN";
diff --git a/apps/openstacktelemetry/app/BUCK b/apps/openstacktelemetry/app/BUCK
deleted file mode 100644
index 0d8faa4..0000000
--- a/apps/openstacktelemetry/app/BUCK
+++ /dev/null
@@ -1,52 +0,0 @@
-GRPC_VER = '1.3.1'
-
-COMPILE_DEPS = [
-    '//lib:CORE_DEPS',
-    '//lib:JACKSON',
-    '//lib:KRYO',
-    '//core/store/serializers:onos-core-serializers',
-    '//lib:javax.ws.rs-api',
-    '//utils/rest:onlab-rest',
-    '//lib:jersey-client',
-    '//cli:onos-cli',
-    '//lib:org.apache.karaf.shell.console',
-    '//apps/openstacknode/api:onos-apps-openstacknode-api',
-    '//apps/openstacknetworking/api:onos-apps-openstacknetworking-api',
-    '//apps/openstacktelemetry/api:onos-apps-openstacktelemetry-api',
-    '//lib:kafka-clients',
-    '//lib:influxdb-java',
-    '//lib:simpleclient',
-    '//lib:simpleclient_common',
-    '//lib:simpleclient_hotspot',
-    '//lib:simpleclient_servlet',
-    '//lib:jetty-http',
-    '//lib:jetty-servlet',
-    '//lib:jetty-server',
-    '//lib:jetty-security',
-    '//lib:jetty-websocket',
-    '//lib:jetty-util',
-    '//lib:jetty-io',
-    '//lib:servlet-api',
-    '//lib:protobuf-java-3.2.0',
-    '//lib:GRPC_1.3',
-    '//incubator/grpc-dependencies:grpc-core-repkg-' + GRPC_VER,
-    '//lib:grpc-protobuf-lite-' + GRPC_VER,
-]
-
-TEST_DEPS = [
-    '//lib:TEST_ADAPTERS',
-    '//core/api:onos-api-tests',
-    '//core/common:onos-core-common-tests',
-    '//web/api:onos-rest-tests',
-    '//lib:TEST_REST',
-]
-
-osgi_jar_with_tests (
-    deps = COMPILE_DEPS,
-    test_deps = TEST_DEPS,
-    web_context = '/onos/openstacktelemetry',
-    api_title = 'OpenStack Network Telemetry REST API',
-    api_version = '1.0',
-    api_description = 'OpenStack Network Telemetry REST API',
-    api_package = 'org.onosproject.openstacktelemetry.web',
-)
diff --git a/apps/openstacktelemetry/app/app.xml b/apps/openstacktelemetry/app/app.xml
deleted file mode 100644
index 75a5b3f..0000000
--- a/apps/openstacktelemetry/app/app.xml
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-  ~ Copyright 2018-present Open Networking Foundation
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~     http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License.
-  -->
-<app name="org.onosproject.openstacktelemetry" origin="Open Networking Foundation"
-     version="${project.version}" category="Utility" title="OpenStack Telemetry App"
-     features="${project.artifactId}" apps="org.onosproject.openstacknetworking"
-     featuresRepo="mvn:${project.groupId}/${project.artifactId}/${project.version}/xml/features">
-    <description>${project.description}</description>
-    <artifact>mvn:${project.groupId}/onos-apps-openstacktelemetry-api/${project.version}</artifact>
-    <artifact>mvn:${project.groupId}/onos-apps-openstacktelemetry-app/${project.version}</artifact>
-</app>
diff --git a/apps/openstacktelemetry/app/features.xml b/apps/openstacktelemetry/app/features.xml
deleted file mode 100644
index 0949089..0000000
--- a/apps/openstacktelemetry/app/features.xml
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
-<!--
-  ~ Copyright 2018-present Open Networking Foundation
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~     http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License.
-  -->
-<features xmlns="http://karaf.apache.org/xmlns/features/v1.2.0" name="${project.artifactId}-${project.version}">
-    <feature name="${project.artifactId}" version="${project.version}"
-             description="${project.description}">
-        <feature>onos-api</feature>
-        <bundle>mvn:${project.groupId}/onos-apps-openstacktelemetry-api/${project.version}</bundle>
-        <bundle>mvn:${project.groupId}/onos-apps-openstacktelemetry-app/${project.version}</bundle>
-    </feature>
-</features>
diff --git a/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/gui/OpensteckTelemetryUI.java b/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/gui/OpensteckTelemetryUI.java
index bf8ae4b..3f09f6a 100644
--- a/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/gui/OpensteckTelemetryUI.java
+++ b/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/gui/OpensteckTelemetryUI.java
@@ -16,16 +16,15 @@
 package org.onosproject.openstacktelemetry.gui;
 
 import com.google.common.collect.ImmutableList;
-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.ui.UiExtension;
 import org.onosproject.ui.UiExtensionService;
 import org.onosproject.ui.UiMessageHandlerFactory;
 import org.onosproject.ui.UiView;
+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;
 
@@ -36,8 +35,7 @@
 /**
  * Mechanism to stream data to the GUI.
  */
-@Component(immediate = true, enabled = true)
-@Service(value = OpensteckTelemetryUI.class)
+@Component(immediate = true, enabled = true, service = OpensteckTelemetryUI.class)
 public class OpensteckTelemetryUI {
     private static final String OPENSTACKTELEMETRY_ID = "openstacktelemetry";
     private static final String OPENSTACKTELEMETRY_TEXT = "Openstack Telemetry";
@@ -46,7 +44,7 @@
 
     private final Logger log = LoggerFactory.getLogger(getClass());
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected UiExtensionService uiExtensionService;
 
     // Factory for UI message handlers
diff --git a/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/impl/GrpcTelemetryConfigManager.java b/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/impl/GrpcTelemetryConfigManager.java
index 60e851e..70b1d70 100644
--- a/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/impl/GrpcTelemetryConfigManager.java
+++ b/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/impl/GrpcTelemetryConfigManager.java
@@ -15,14 +15,6 @@
  */
 package org.onosproject.openstacktelemetry.impl;
 
-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.util.Tools;
 import org.onosproject.cfg.ComponentConfigService;
 import org.onosproject.openstacktelemetry.api.GrpcTelemetryAdminService;
@@ -30,6 +22,12 @@
 import org.onosproject.openstacktelemetry.api.config.TelemetryConfig;
 import org.onosproject.openstacktelemetry.config.DefaultGrpcTelemetryConfig;
 import org.osgi.service.component.ComponentContext;
+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 org.slf4j.LoggerFactory;
 
@@ -37,54 +35,57 @@
 
 import static org.onlab.util.Tools.get;
 import static org.onlab.util.Tools.getIntegerProperty;
-import static org.onosproject.openstacktelemetry.api.Constants.DEFAULT_DISABLE;
-import static org.onosproject.openstacktelemetry.api.Constants.DEFAULT_GRPC_MAX_INBOUND_MSG_SIZE;
-import static org.onosproject.openstacktelemetry.api.Constants.DEFAULT_GRPC_SERVER_IP;
-import static org.onosproject.openstacktelemetry.api.Constants.DEFAULT_GRPC_SERVER_PORT;
-import static org.onosproject.openstacktelemetry.api.Constants.DEFAULT_GRPC_USE_PLAINTEXT;
+import static org.onosproject.openstacktelemetry.impl.OsgiPropertyConstants.GRPC_ENABLE_SERVICE_DEFAULT;
+import static org.onosproject.openstacktelemetry.impl.OsgiPropertyConstants.GRPC_MAX_INBOUND_MSG_SIZE_DEFAULT;
+import static org.onosproject.openstacktelemetry.impl.OsgiPropertyConstants.GRPC_SERVER_ADDRESS_DEFAULT;
+import static org.onosproject.openstacktelemetry.impl.OsgiPropertyConstants.GRPC_SERVER_PORT_DEFAULT;
+import static org.onosproject.openstacktelemetry.impl.OsgiPropertyConstants.GRPC_USE_PLAINTEXT_DEFAULT;
+import static org.onosproject.openstacktelemetry.impl.OsgiPropertyConstants.PROP_GRPC_ENABLE_SERVICE;
+import static org.onosproject.openstacktelemetry.impl.OsgiPropertyConstants.PROP_GRPC_MAX_INBOUND_MSG_SIZE;
+import static org.onosproject.openstacktelemetry.impl.OsgiPropertyConstants.PROP_GRPC_SERVER_ADDRESS;
+import static org.onosproject.openstacktelemetry.impl.OsgiPropertyConstants.PROP_GRPC_SERVER_PORT;
+import static org.onosproject.openstacktelemetry.impl.OsgiPropertyConstants.PROP_GRPC_USE_PLAINTEXT;
 import static org.onosproject.openstacktelemetry.util.OpenstackTelemetryUtil.getBooleanProperty;
 import static org.onosproject.openstacktelemetry.util.OpenstackTelemetryUtil.initTelemetryService;
 
 /**
  * gRPC server configuration manager for publishing openstack telemetry.
  */
-@Component(immediate = true)
-@Service
+@Component(
+    immediate = true,
+    service = GrpcTelemetryConfigService.class,
+    property = {
+        PROP_GRPC_ENABLE_SERVICE + ":Boolean=" + GRPC_ENABLE_SERVICE_DEFAULT,
+        PROP_GRPC_SERVER_ADDRESS  + "=" + GRPC_SERVER_ADDRESS_DEFAULT,
+        PROP_GRPC_SERVER_PORT + ":Integer=" + GRPC_SERVER_PORT_DEFAULT,
+        PROP_GRPC_USE_PLAINTEXT + ":Boolean=" + GRPC_USE_PLAINTEXT_DEFAULT,
+        PROP_GRPC_MAX_INBOUND_MSG_SIZE + ":Integer=" + GRPC_MAX_INBOUND_MSG_SIZE_DEFAULT
+    }
+)
 public class GrpcTelemetryConfigManager implements GrpcTelemetryConfigService {
 
     private final Logger log = LoggerFactory.getLogger(getClass());
 
-    private static final String ENABLE_SERVICE = "enableService";
-    private static final String ADDRESS = "address";
-    private static final String PORT = "port";
-    private static final String USE_PLAINTEXT = "usePlaintext";
-    private static final String MAX_INBOUND_MSG_SIZE = "maxInboundMsgSize";
-
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected ComponentConfigService componentConfigService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected GrpcTelemetryAdminService grpcTelemetryAdminService;
 
-    @Property(name = ADDRESS, value = DEFAULT_GRPC_SERVER_IP,
-            label = "Default IP address to establish initial connection to gRPC server")
-    protected String address = DEFAULT_GRPC_SERVER_IP;
+    /** Default IP address to establish initial connection to gRPC server. */
+    protected String address = GRPC_SERVER_ADDRESS_DEFAULT;
 
-    @Property(name = PORT, intValue = DEFAULT_GRPC_SERVER_PORT,
-            label = "Default port number to establish initial connection to gRPC server")
-    protected Integer port = DEFAULT_GRPC_SERVER_PORT;
+    /** Default port number to establish initial connection to gRPC server. */
+    protected Integer port = GRPC_SERVER_PORT_DEFAULT;
 
-    @Property(name = USE_PLAINTEXT, boolValue = DEFAULT_GRPC_USE_PLAINTEXT,
-            label = "UsePlaintext flag value used for connecting to gRPC server")
-    protected Boolean usePlaintext = DEFAULT_GRPC_USE_PLAINTEXT;
+    /** UsePlaintext flag value used for connecting to gRPC server. */
+    protected Boolean usePlaintext = GRPC_USE_PLAINTEXT_DEFAULT;
 
-    @Property(name = MAX_INBOUND_MSG_SIZE, intValue = DEFAULT_GRPC_MAX_INBOUND_MSG_SIZE,
-            label = "Maximum inbound message size used for communicating with gRPC server")
-    protected Integer maxInboundMsgSize = DEFAULT_GRPC_MAX_INBOUND_MSG_SIZE;
+    /** Maximum inbound message size used for communicating with gRPC server. */
+    protected Integer maxInboundMsgSize = GRPC_MAX_INBOUND_MSG_SIZE_DEFAULT;
 
-    @Property(name = ENABLE_SERVICE, boolValue = DEFAULT_DISABLE,
-            label = "Specify the default behavior of telemetry service")
-    protected Boolean enableService = DEFAULT_DISABLE;
+    /** Specify the default behavior of telemetry service. */
+    protected Boolean enableService = GRPC_ENABLE_SERVICE_DEFAULT;
 
     @Activate
     protected void activate(ComponentContext context) {
@@ -131,13 +132,13 @@
     private void readComponentConfiguration(ComponentContext context) {
         Dictionary<?, ?> properties = context.getProperties();
 
-        String addressStr = get(properties, ADDRESS);
-        address = addressStr != null ? addressStr : DEFAULT_GRPC_SERVER_IP;
+        String addressStr = get(properties, PROP_GRPC_SERVER_ADDRESS);
+        address = addressStr != null ? addressStr : GRPC_SERVER_ADDRESS_DEFAULT;
         log.info("Configured. gRPC server address is {}", address);
 
-        Integer portConfigured = Tools.getIntegerProperty(properties, PORT);
+        Integer portConfigured = Tools.getIntegerProperty(properties, PROP_GRPC_SERVER_PORT);
         if (portConfigured == null) {
-            port = DEFAULT_GRPC_SERVER_PORT;
+            port = GRPC_SERVER_PORT_DEFAULT;
             log.info("gRPC server port is NOT configured, default value is {}", port);
         } else {
             port = portConfigured;
@@ -145,9 +146,9 @@
         }
 
         Boolean usePlaintextConfigured =
-                getBooleanProperty(properties, USE_PLAINTEXT);
+                getBooleanProperty(properties, PROP_GRPC_USE_PLAINTEXT);
         if (usePlaintextConfigured == null) {
-            usePlaintext = DEFAULT_GRPC_USE_PLAINTEXT;
+            usePlaintext = GRPC_USE_PLAINTEXT_DEFAULT;
             log.info("gRPC server use plaintext flag is NOT " +
                     "configured, default value is {}", usePlaintext);
         } else {
@@ -156,9 +157,9 @@
         }
 
         Integer maxInboundMsgSizeConfigured =
-                getIntegerProperty(properties, MAX_INBOUND_MSG_SIZE);
+                getIntegerProperty(properties, PROP_GRPC_MAX_INBOUND_MSG_SIZE);
         if (maxInboundMsgSizeConfigured == null) {
-            maxInboundMsgSize = DEFAULT_GRPC_MAX_INBOUND_MSG_SIZE;
+            maxInboundMsgSize = GRPC_MAX_INBOUND_MSG_SIZE_DEFAULT;
             log.info("gRPC server max inbound message size is NOT " +
                     "configured, default value is {}", maxInboundMsgSize);
         } else {
@@ -167,9 +168,9 @@
         }
 
         Boolean enableServiceConfigured =
-                getBooleanProperty(properties, ENABLE_SERVICE);
+                getBooleanProperty(properties, PROP_GRPC_ENABLE_SERVICE);
         if (enableServiceConfigured == null) {
-            enableService = DEFAULT_DISABLE;
+            enableService = GRPC_ENABLE_SERVICE_DEFAULT;
             log.info("gRPC service enable flag is NOT " +
                     "configured, default value is {}", enableService);
         } else {
diff --git a/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/impl/GrpcTelemetryManager.java b/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/impl/GrpcTelemetryManager.java
index 3fcf013..391b1d8 100644
--- a/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/impl/GrpcTelemetryManager.java
+++ b/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/impl/GrpcTelemetryManager.java
@@ -17,29 +17,27 @@
 
 import io.grpc.ManagedChannel;
 import io.grpc.ManagedChannelBuilder;
-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.openstacktelemetry.api.GrpcTelemetryAdminService;
 import org.onosproject.openstacktelemetry.api.OpenstackTelemetryService;
 import org.onosproject.openstacktelemetry.api.config.GrpcTelemetryConfig;
 import org.onosproject.openstacktelemetry.api.config.TelemetryConfig;
+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;
 
 /**
  * gRPC telemetry manager.
  */
-@Component(immediate = true)
-@Service
+@Component(immediate = true, service = GrpcTelemetryAdminService.class)
 public class GrpcTelemetryManager implements GrpcTelemetryAdminService {
 
     private final Logger log = LoggerFactory.getLogger(getClass());
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected OpenstackTelemetryService openstackTelemetryService;
 
     private ManagedChannel channel = null;
diff --git a/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/impl/InfluxDbTelemetryConfigManager.java b/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/impl/InfluxDbTelemetryConfigManager.java
index 52eac35..d9107ca 100644
--- a/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/impl/InfluxDbTelemetryConfigManager.java
+++ b/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/impl/InfluxDbTelemetryConfigManager.java
@@ -15,14 +15,6 @@
  */
 package org.onosproject.openstacktelemetry.impl;
 
-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.util.Tools;
 import org.onosproject.cfg.ComponentConfigService;
 import org.onosproject.openstacktelemetry.api.InfluxDbTelemetryAdminService;
@@ -30,77 +22,86 @@
 import org.onosproject.openstacktelemetry.api.config.TelemetryConfig;
 import org.onosproject.openstacktelemetry.config.DefaultInfluxDbTelemetryConfig;
 import org.osgi.service.component.ComponentContext;
+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 org.slf4j.LoggerFactory;
 
 import java.util.Dictionary;
 
-import static org.onosproject.openstacktelemetry.api.Constants.DEFAULT_DISABLE;
-import static org.onosproject.openstacktelemetry.api.Constants.DEFAULT_INFLUXDB_DATABASE;
-import static org.onosproject.openstacktelemetry.api.Constants.DEFAULT_INFLUXDB_ENABLE_BATCH;
-import static org.onosproject.openstacktelemetry.api.Constants.DEFAULT_INFLUXDB_MEASUREMENT;
-import static org.onosproject.openstacktelemetry.api.Constants.DEFAULT_INFLUXDB_PASSWORD;
-import static org.onosproject.openstacktelemetry.api.Constants.DEFAULT_INFLUXDB_SERVER_IP;
-import static org.onosproject.openstacktelemetry.api.Constants.DEFAULT_INFLUXDB_SERVER_PORT;
-import static org.onosproject.openstacktelemetry.api.Constants.DEFAULT_INFLUXDB_USERNAME;
+import static org.onosproject.openstacktelemetry.impl.OsgiPropertyConstants.PROP_INFLUXDB_DATABASE;
+import static org.onosproject.openstacktelemetry.impl.OsgiPropertyConstants.PROP_INFLUXDB_DATABASE_DEFAULT;
+import static org.onosproject.openstacktelemetry.impl.OsgiPropertyConstants.PROP_INFLUXDB_ENABLE_BATCH;
+import static org.onosproject.openstacktelemetry.impl.OsgiPropertyConstants.PROP_INFLUXDB_ENABLE_BATCH_DEFAULT;
+import static org.onosproject.openstacktelemetry.impl.OsgiPropertyConstants.PROP_INFLUXDB_ENABLE_SERVICE;
+import static org.onosproject.openstacktelemetry.impl.OsgiPropertyConstants.PROP_INFLUXDB_ENABLE_SERVICE_DEFAULT;
+import static org.onosproject.openstacktelemetry.impl.OsgiPropertyConstants.PROP_INFLUXDB_MEASUREMENT;
+import static org.onosproject.openstacktelemetry.impl.OsgiPropertyConstants.PROP_INFLUXDB_MEASUREMENT_DEFAULT;
+import static org.onosproject.openstacktelemetry.impl.OsgiPropertyConstants.PROP_INFLUXDB_PASSWORD;
+import static org.onosproject.openstacktelemetry.impl.OsgiPropertyConstants.PROP_INFLUXDB_PASSWORD_DEFAULT;
+import static org.onosproject.openstacktelemetry.impl.OsgiPropertyConstants.PROP_INFLUXDB_SERVER_ADDRESS;
+import static org.onosproject.openstacktelemetry.impl.OsgiPropertyConstants.PROP_INFLUXDB_SERVER_ADDRESS_DEFAULT;
+import static org.onosproject.openstacktelemetry.impl.OsgiPropertyConstants.PROP_INFLUXDB_SERVER_PORT;
+import static org.onosproject.openstacktelemetry.impl.OsgiPropertyConstants.PROP_INFLUXDB_SERVER_PORT_DEFAULT;
+import static org.onosproject.openstacktelemetry.impl.OsgiPropertyConstants.PROP_INFLUXDB_USERNAME;
+import static org.onosproject.openstacktelemetry.impl.OsgiPropertyConstants.PROP_INFLUXDB_USERNAME_DEFAULT;
 import static org.onosproject.openstacktelemetry.util.OpenstackTelemetryUtil.getBooleanProperty;
 import static org.onosproject.openstacktelemetry.util.OpenstackTelemetryUtil.initTelemetryService;
 
 /**
  * InfluxDB server configuration manager for publishing openstack telemetry.
  */
-@Component(immediate = true)
-@Service
+@Component(
+    immediate = true,
+    service = InfluxDbTelemetryConfigService.class,
+    property = {
+        PROP_INFLUXDB_ENABLE_SERVICE + ":Boolean=" + PROP_INFLUXDB_ENABLE_SERVICE_DEFAULT,
+        PROP_INFLUXDB_SERVER_ADDRESS + "=" + PROP_INFLUXDB_SERVER_ADDRESS_DEFAULT,
+        PROP_INFLUXDB_SERVER_PORT + ":Integer=" + PROP_INFLUXDB_SERVER_PORT_DEFAULT,
+        PROP_INFLUXDB_USERNAME + "=" + PROP_INFLUXDB_USERNAME_DEFAULT,
+        PROP_INFLUXDB_PASSWORD + "=" + PROP_INFLUXDB_PASSWORD_DEFAULT,
+        PROP_INFLUXDB_DATABASE + "=" + PROP_INFLUXDB_DATABASE_DEFAULT,
+        PROP_INFLUXDB_MEASUREMENT + "=" + PROP_INFLUXDB_MEASUREMENT_DEFAULT,
+        PROP_INFLUXDB_ENABLE_BATCH + ":Boolean=" + PROP_INFLUXDB_ENABLE_BATCH_DEFAULT
+    }
+)
 public class InfluxDbTelemetryConfigManager implements InfluxDbTelemetryConfigService {
 
     private final Logger log = LoggerFactory.getLogger(getClass());
 
-    private static final String ENABLE_SERVICE = "enableService";
-    private static final String ADDRESS = "address";
-    private static final String PORT = "port";
-    private static final String USERNAME = "username";
-    private static final String PASSWORD = "password";
-    private static final String DATABASE = "database";
-    private static final String MEASUREMENT = "measurement";
-    private static final String ENABLE_BATCH = "enableBatch";
-
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected ComponentConfigService componentConfigService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected InfluxDbTelemetryAdminService influxDbTelemetryAdminService;
 
-    @Property(name = ADDRESS, value = DEFAULT_INFLUXDB_SERVER_IP,
-            label = "Default IP address to establish initial connection to InfluxDB server")
-    protected String address = DEFAULT_INFLUXDB_SERVER_IP;
+    /** Default IP address to establish initial connection to InfluxDB server. */
+    protected String address = PROP_INFLUXDB_SERVER_ADDRESS_DEFAULT;
 
-    @Property(name = PORT, intValue = DEFAULT_INFLUXDB_SERVER_PORT,
-            label = "Default port number to establish initial connection to InfluxDB server")
-    protected Integer port = DEFAULT_INFLUXDB_SERVER_PORT;
+    /** Default port number to establish initial connection to InfluxDB server. */
+    protected Integer port = PROP_INFLUXDB_SERVER_PORT_DEFAULT;
 
-    @Property(name = USERNAME, value = DEFAULT_INFLUXDB_USERNAME,
-            label = "Username used for authenticating against InfluxDB server")
-    protected String username = DEFAULT_INFLUXDB_USERNAME;
+    /** Username used for authenticating against InfluxDB server. */
+    protected String username = PROP_INFLUXDB_USERNAME_DEFAULT;
 
-    @Property(name = PASSWORD, value = DEFAULT_INFLUXDB_PASSWORD,
-            label = "Password used for authenticating against InfluxDB server")
-    protected String password = DEFAULT_INFLUXDB_PASSWORD;
+    /** Password used for authenticating against InfluxDB server. */
+    protected String password = PROP_INFLUXDB_PASSWORD_DEFAULT;
 
-    @Property(name = DATABASE, value = DEFAULT_INFLUXDB_DATABASE,
-            label = "Database of InfluxDB server")
-    protected String database = DEFAULT_INFLUXDB_DATABASE;
+    /** Database of InfluxDB server. */
+    protected String database = PROP_INFLUXDB_DATABASE_DEFAULT;
 
-    @Property(name = MEASUREMENT, value = DEFAULT_INFLUXDB_MEASUREMENT,
-            label = "Measurement of InfluxDB server")
-    protected String measurement = DEFAULT_INFLUXDB_MEASUREMENT;
+    /** Measurement of InfluxDB server. */
+    protected String measurement = PROP_INFLUXDB_MEASUREMENT_DEFAULT;
 
-    @Property(name = ENABLE_BATCH, boolValue = DEFAULT_INFLUXDB_ENABLE_BATCH,
-            label = "Flag value of enabling batch mode of InfluxDB server")
-    protected Boolean enableBatch = DEFAULT_INFLUXDB_ENABLE_BATCH;
+    /** Flag value of enabling batch mode of InfluxDB server. */
+    protected Boolean enableBatch = PROP_INFLUXDB_ENABLE_SERVICE_DEFAULT;
 
-    @Property(name = ENABLE_SERVICE, boolValue = DEFAULT_DISABLE,
-            label = "Specify the default behavior of telemetry service")
-    protected Boolean enableService = DEFAULT_DISABLE;
+    /** Specify the default behavior of telemetry service. */
+    protected Boolean enableService = PROP_INFLUXDB_ENABLE_SERVICE_DEFAULT;
 
     @Activate
     protected void activate(ComponentContext context) {
@@ -150,38 +151,38 @@
     private void readComponentConfiguration(ComponentContext context) {
         Dictionary<?, ?> properties = context.getProperties();
 
-        String addressStr = Tools.get(properties, ADDRESS);
-        address = addressStr != null ? addressStr : DEFAULT_INFLUXDB_SERVER_IP;
+        String addressStr = Tools.get(properties, PROP_INFLUXDB_SERVER_ADDRESS);
+        address = addressStr != null ? addressStr : PROP_INFLUXDB_SERVER_ADDRESS_DEFAULT;
         log.info("Configured. InfluxDB server address is {}", address);
 
-        Integer portConfigured = Tools.getIntegerProperty(properties, PORT);
+        Integer portConfigured = Tools.getIntegerProperty(properties, PROP_INFLUXDB_SERVER_PORT);
         if (portConfigured == null) {
-            port = DEFAULT_INFLUXDB_SERVER_PORT;
+            port = PROP_INFLUXDB_SERVER_PORT_DEFAULT;
             log.info("InfluxDB server port is NOT configured, default value is {}", port);
         } else {
             port = portConfigured;
             log.info("Configured. InfluxDB server port is {}", port);
         }
 
-        String usernameStr = Tools.get(properties, USERNAME);
-        username = usernameStr != null ? usernameStr : DEFAULT_INFLUXDB_USERNAME;
+        String usernameStr = Tools.get(properties, PROP_INFLUXDB_USERNAME);
+        username = usernameStr != null ? usernameStr : PROP_INFLUXDB_USERNAME_DEFAULT;
         log.info("Configured. InfluxDB server username is {}", username);
 
-        String passwordStr = Tools.get(properties, PASSWORD);
-        password = passwordStr != null ? passwordStr : DEFAULT_INFLUXDB_PASSWORD;
+        String passwordStr = Tools.get(properties, PROP_INFLUXDB_PASSWORD);
+        password = passwordStr != null ? passwordStr : PROP_INFLUXDB_PASSWORD_DEFAULT;
         log.info("Configured. InfluxDB server password is {}", password);
 
-        String databaseStr = Tools.get(properties, DATABASE);
-        database = databaseStr != null ? databaseStr : DEFAULT_INFLUXDB_DATABASE;
+        String databaseStr = Tools.get(properties, PROP_INFLUXDB_DATABASE);
+        database = databaseStr != null ? databaseStr : PROP_INFLUXDB_DATABASE_DEFAULT;
         log.info("Configured. InfluxDB server database is {}", database);
 
-        String measurementStr = Tools.get(properties, MEASUREMENT);
-        measurement = measurementStr != null ? measurementStr : DEFAULT_INFLUXDB_MEASUREMENT;
+        String measurementStr = Tools.get(properties, PROP_INFLUXDB_MEASUREMENT);
+        measurement = measurementStr != null ? measurementStr : PROP_INFLUXDB_MEASUREMENT_DEFAULT;
         log.info("Configured. InfluxDB server measurement is {}", measurement);
 
-        Boolean enableBatchConfigured = getBooleanProperty(properties, ENABLE_BATCH);
+        Boolean enableBatchConfigured = getBooleanProperty(properties, PROP_INFLUXDB_ENABLE_BATCH);
         if (enableBatchConfigured == null) {
-            enableBatch = DEFAULT_INFLUXDB_ENABLE_BATCH;
+            enableBatch = PROP_INFLUXDB_ENABLE_BATCH_DEFAULT;
             log.info("InfluxDB server enable batch flag is " +
                     "NOT configured, default value is {}", enableBatch);
         } else {
@@ -190,9 +191,9 @@
         }
 
         Boolean enableServiceConfigured =
-                getBooleanProperty(properties, ENABLE_SERVICE);
+                getBooleanProperty(properties, PROP_INFLUXDB_ENABLE_SERVICE);
         if (enableServiceConfigured == null) {
-            enableService = DEFAULT_DISABLE;
+            enableService = PROP_INFLUXDB_ENABLE_SERVICE_DEFAULT;
             log.info("InfluxDB service enable flag is NOT " +
                     "configured, default value is {}", enableService);
         } else {
diff --git a/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/impl/InfluxDbTelemetryManager.java b/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/impl/InfluxDbTelemetryManager.java
index 41a318b..40528d4 100644
--- a/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/impl/InfluxDbTelemetryManager.java
+++ b/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/impl/InfluxDbTelemetryManager.java
@@ -15,12 +15,6 @@
  */
 package org.onosproject.openstacktelemetry.impl;
 
-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.influxdb.InfluxDB;
 import org.influxdb.InfluxDBFactory;
 import org.influxdb.dto.BatchPoints;
@@ -32,6 +26,11 @@
 import org.onosproject.openstacktelemetry.api.OpenstackTelemetryService;
 import org.onosproject.openstacktelemetry.api.config.InfluxDbTelemetryConfig;
 import org.onosproject.openstacktelemetry.api.config.TelemetryConfig;
+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;
 
@@ -40,8 +39,7 @@
 /**
  * InfluxDB telemetry manager.
  */
-@Component(immediate = true)
-@Service
+@Component(immediate = true, service = InfluxDbTelemetryAdminService.class)
 public class InfluxDbTelemetryManager implements InfluxDbTelemetryAdminService {
 
     private final Logger log = LoggerFactory.getLogger(getClass());
@@ -69,7 +67,7 @@
     private static final String ERROR_PKTS = "errorPkts";
     private static final String DROP_PKTS = "dropPkts";
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected OpenstackTelemetryService openstackTelemetryService;
 
     private static final String INFLUX_PROTOCOL = "http";
diff --git a/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/impl/KafkaTelemetryConfigManager.java b/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/impl/KafkaTelemetryConfigManager.java
index 956e275..6621e0b 100644
--- a/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/impl/KafkaTelemetryConfigManager.java
+++ b/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/impl/KafkaTelemetryConfigManager.java
@@ -15,14 +15,6 @@
  */
 package org.onosproject.openstacktelemetry.impl;
 
-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.util.Tools;
 import org.onosproject.cfg.ComponentConfigService;
 import org.onosproject.openstacktelemetry.api.KafkaTelemetryAdminService;
@@ -30,90 +22,98 @@
 import org.onosproject.openstacktelemetry.api.config.TelemetryConfig;
 import org.onosproject.openstacktelemetry.config.DefaultKafkaTelemetryConfig;
 import org.osgi.service.component.ComponentContext;
+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 org.slf4j.LoggerFactory;
 
 import java.util.Dictionary;
 
-import static org.onosproject.openstacktelemetry.api.Constants.DEFAULT_DISABLE;
-import static org.onosproject.openstacktelemetry.api.Constants.DEFAULT_KAFKA_BATCH_SIZE;
-import static org.onosproject.openstacktelemetry.api.Constants.DEFAULT_KAFKA_KEY_SERIALIZER;
-import static org.onosproject.openstacktelemetry.api.Constants.DEFAULT_KAFKA_LINGER_MS;
-import static org.onosproject.openstacktelemetry.api.Constants.DEFAULT_KAFKA_MEMORY_BUFFER;
-import static org.onosproject.openstacktelemetry.api.Constants.DEFAULT_KAFKA_REQUIRED_ACKS;
-import static org.onosproject.openstacktelemetry.api.Constants.DEFAULT_KAFKA_RETRIES;
-import static org.onosproject.openstacktelemetry.api.Constants.DEFAULT_KAFKA_SERVER_IP;
-import static org.onosproject.openstacktelemetry.api.Constants.DEFAULT_KAFKA_SERVER_PORT;
-import static org.onosproject.openstacktelemetry.api.Constants.DEFAULT_KAFKA_VALUE_SERIALIZER;
+import static org.onosproject.openstacktelemetry.impl.OsgiPropertyConstants.PROP_KAFKA_ADDRESS;
+import static org.onosproject.openstacktelemetry.impl.OsgiPropertyConstants.PROP_KAFKA_ADDRESS_DEFAULT;
+import static org.onosproject.openstacktelemetry.impl.OsgiPropertyConstants.PROP_KAFKA_BATCH_SIZE;
+import static org.onosproject.openstacktelemetry.impl.OsgiPropertyConstants.PROP_KAFKA_BATCH_SIZE_DEFAULT;
+import static org.onosproject.openstacktelemetry.impl.OsgiPropertyConstants.PROP_KAFKA_ENABLE_SERVICE;
+import static org.onosproject.openstacktelemetry.impl.OsgiPropertyConstants.PROP_KAFKA_ENABLE_SERVICE_DEFAULT;
+import static org.onosproject.openstacktelemetry.impl.OsgiPropertyConstants.PROP_KAFKA_KEY_SERIALIZER;
+import static org.onosproject.openstacktelemetry.impl.OsgiPropertyConstants.PROP_KAFKA_KEY_SERIALIZER_DEFAULT;
+import static org.onosproject.openstacktelemetry.impl.OsgiPropertyConstants.PROP_KAFKA_LINGER_MS;
+import static org.onosproject.openstacktelemetry.impl.OsgiPropertyConstants.PROP_KAFKA_LINGER_MS_DEFAULT;
+import static org.onosproject.openstacktelemetry.impl.OsgiPropertyConstants.PROP_KAFKA_MEMORY_BUFFER;
+import static org.onosproject.openstacktelemetry.impl.OsgiPropertyConstants.PROP_KAFKA_MEMORY_BUFFER_DEFAULT;
+import static org.onosproject.openstacktelemetry.impl.OsgiPropertyConstants.PROP_KAFKA_PORT;
+import static org.onosproject.openstacktelemetry.impl.OsgiPropertyConstants.PROP_KAFKA_PORT_DEFAULT;
+import static org.onosproject.openstacktelemetry.impl.OsgiPropertyConstants.PROP_KAFKA_REQUIRED_ACKS;
+import static org.onosproject.openstacktelemetry.impl.OsgiPropertyConstants.PROP_KAFKA_REQUIRED_ACKS_DEFAULT;
+import static org.onosproject.openstacktelemetry.impl.OsgiPropertyConstants.PROP_KAFKA_RETRIES;
+import static org.onosproject.openstacktelemetry.impl.OsgiPropertyConstants.PROP_KAFKA_RETRIES_DEFAULT;
+import static org.onosproject.openstacktelemetry.impl.OsgiPropertyConstants.PROP_KAFKA_VALUE_SERIALIZER;
+import static org.onosproject.openstacktelemetry.impl.OsgiPropertyConstants.PROP_KAFKA_VALUE_SERIALIZER_DEFAULT;
 import static org.onosproject.openstacktelemetry.util.OpenstackTelemetryUtil.getBooleanProperty;
 import static org.onosproject.openstacktelemetry.util.OpenstackTelemetryUtil.initTelemetryService;
 
 /**
  * Kafka server configuration manager for publishing openstack telemetry.
  */
-@Component(immediate = true)
-@Service
+@Component(
+    immediate = true,
+    service = KafkaTelemetryConfigService.class,
+    property = {
+        PROP_KAFKA_ADDRESS + "=" + PROP_KAFKA_ADDRESS_DEFAULT,
+        PROP_KAFKA_PORT + ":Integer=" + PROP_KAFKA_PORT_DEFAULT,
+        PROP_KAFKA_RETRIES + ":Integer=" + PROP_KAFKA_RETRIES_DEFAULT,
+        PROP_KAFKA_REQUIRED_ACKS + "=" + PROP_KAFKA_REQUIRED_ACKS_DEFAULT,
+        PROP_KAFKA_BATCH_SIZE + ":Integer=" + PROP_KAFKA_BATCH_SIZE_DEFAULT,
+        PROP_KAFKA_LINGER_MS + ":Integer=" + PROP_KAFKA_LINGER_MS_DEFAULT,
+        PROP_KAFKA_MEMORY_BUFFER + ":Integer=" + PROP_KAFKA_MEMORY_BUFFER_DEFAULT,
+        PROP_KAFKA_KEY_SERIALIZER + "=" + PROP_KAFKA_KEY_SERIALIZER_DEFAULT,
+        PROP_KAFKA_VALUE_SERIALIZER + "=" + PROP_KAFKA_VALUE_SERIALIZER_DEFAULT,
+        PROP_KAFKA_ENABLE_SERVICE + ":Boolean=" + PROP_KAFKA_ENABLE_SERVICE_DEFAULT
+    }
+)
 public class KafkaTelemetryConfigManager implements KafkaTelemetryConfigService {
 
     private final Logger log = LoggerFactory.getLogger(getClass());
 
-    private static final String ENABLE_SERVICE = "enableService";
-    private static final String ADDRESS = "address";
-    private static final String PORT = "port";
-    private static final String RETRIES = "retries";
-    private static final String REQUIRED_ACKS = "requiredAcks";
-    private static final String BATCH_SIZE = "batchSize";
-    private static final String LINGER_MS = "lingerMs";
-    private static final String MEMORY_BUFFER = "memoryBuffer";
-    private static final String KEY_SERIALIZER = "keySerializer";
-    private static final String VALUE_SERIALIZER = "valueSerializer";
-
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected ComponentConfigService componentConfigService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected KafkaTelemetryAdminService kafkaTelemetryAdminService;
 
-    @Property(name = ADDRESS, value = DEFAULT_KAFKA_SERVER_IP,
-            label = "Default IP address to establish initial connection to Kafka server")
-    protected String address = DEFAULT_KAFKA_SERVER_IP;
+    /** Default IP address to establish initial connection to Kafka server. */
+    protected String address = PROP_KAFKA_ADDRESS_DEFAULT;
 
-    @Property(name = PORT, intValue = DEFAULT_KAFKA_SERVER_PORT,
-            label = "Default port number to establish initial connection to Kafka server")
-    protected Integer port = DEFAULT_KAFKA_SERVER_PORT;
+    /** Default port number to establish initial connection to Kafka server. */
+    protected Integer port = PROP_KAFKA_PORT_DEFAULT;
 
-    @Property(name = RETRIES, intValue = DEFAULT_KAFKA_RETRIES,
-            label = "Number of times the producer can retry to send after first failure")
-    protected int retries = DEFAULT_KAFKA_RETRIES;
+    /** Number of times the producer can retry to send after first failure. */
+    protected int retries = PROP_KAFKA_RETRIES_DEFAULT;
 
-    @Property(name = REQUIRED_ACKS, value = DEFAULT_KAFKA_REQUIRED_ACKS,
-            label = "Producer will get an acknowledgement after the leader has replicated the data")
-    protected String requiredAcks = DEFAULT_KAFKA_REQUIRED_ACKS;
+    /** Producer will get an acknowledgement after the leader has replicated the data. */
+    protected String requiredAcks = PROP_KAFKA_REQUIRED_ACKS_DEFAULT;
 
-    @Property(name = BATCH_SIZE, intValue = DEFAULT_KAFKA_BATCH_SIZE,
-            label = "The largest record batch size allowed by Kafka")
-    protected Integer batchSize = DEFAULT_KAFKA_BATCH_SIZE;
+    /** The largest record batch size allowed by Kafka. */
+    protected Integer batchSize = PROP_KAFKA_BATCH_SIZE_DEFAULT;
 
-    @Property(name = LINGER_MS, intValue = DEFAULT_KAFKA_LINGER_MS,
-            label = "The producer groups together any records that arrive in " +
-                    "between request transmissions into a single batched request")
-    protected Integer lingerMs = DEFAULT_KAFKA_LINGER_MS;
+    /** The producer groups together any records that arrive between request transmissions into a single batch. */
+    protected Integer lingerMs = PROP_KAFKA_LINGER_MS_DEFAULT;
 
-    @Property(name = MEMORY_BUFFER, intValue = DEFAULT_KAFKA_MEMORY_BUFFER,
-            label = "The total memory used for log cleaner I/O buffers across all cleaner threads")
-    protected Integer memoryBuffer = DEFAULT_KAFKA_MEMORY_BUFFER;
+    /** The total memory used for log cleaner I/O buffers across all cleaner threads. */
+    protected Integer memoryBuffer = PROP_KAFKA_MEMORY_BUFFER_DEFAULT;
 
-    @Property(name = KEY_SERIALIZER, value = DEFAULT_KAFKA_KEY_SERIALIZER,
-            label = "Serializer class for key that implements the Serializer interface")
-    protected String keySerializer = DEFAULT_KAFKA_KEY_SERIALIZER;
+    /** Serializer class for key that implements the Serializer interface. */
+    protected String keySerializer = PROP_KAFKA_KEY_SERIALIZER_DEFAULT;
 
-    @Property(name = VALUE_SERIALIZER, value = DEFAULT_KAFKA_VALUE_SERIALIZER,
-            label = "Serializer class for value that implements the Serializer interface")
-    protected String valueSerializer = DEFAULT_KAFKA_VALUE_SERIALIZER;
+    /** Serializer class for value that implements the Serializer interface. */
+    protected String valueSerializer = PROP_KAFKA_VALUE_SERIALIZER_DEFAULT;
 
-    @Property(name = ENABLE_SERVICE, boolValue = DEFAULT_DISABLE,
-            label = "Specify the default behavior of telemetry service")
-    protected Boolean enableService = DEFAULT_DISABLE;
+    /** Specify the default behavior of telemetry service. */
+    protected Boolean enableService = PROP_KAFKA_ENABLE_SERVICE_DEFAULT;
 
     @Activate
     protected void activate(ComponentContext context) {
@@ -165,71 +165,71 @@
     private void readComponentConfiguration(ComponentContext context) {
         Dictionary<?, ?> properties = context.getProperties();
 
-        String addressStr = Tools.get(properties, ADDRESS);
-        address = addressStr != null ? addressStr : DEFAULT_KAFKA_SERVER_IP;
+        String addressStr = Tools.get(properties, PROP_KAFKA_ADDRESS);
+        address = addressStr != null ? addressStr : PROP_KAFKA_ADDRESS_DEFAULT;
         log.info("Configured. Kafka server address is {}", address);
 
-        Integer portConfigured = Tools.getIntegerProperty(properties, PORT);
+        Integer portConfigured = Tools.getIntegerProperty(properties, PROP_KAFKA_PORT);
         if (portConfigured == null) {
-            port = DEFAULT_KAFKA_SERVER_PORT;
+            port = PROP_KAFKA_PORT_DEFAULT;
             log.info("Kafka server port is NOT configured, default value is {}", port);
         } else {
             port = portConfigured;
             log.info("Configured. Kafka server port is {}", port);
         }
 
-        Integer retriesConfigured = Tools.getIntegerProperty(properties, RETRIES);
+        Integer retriesConfigured = Tools.getIntegerProperty(properties, PROP_KAFKA_RETRIES);
         if (retriesConfigured == null) {
-            retries = DEFAULT_KAFKA_RETRIES;
+            retries = PROP_KAFKA_RETRIES_DEFAULT;
             log.info("Kafka number of retries property is NOT configured, default value is {}", retries);
         } else {
             retries = retriesConfigured;
             log.info("Configured. Kafka number of retries is {}", retries);
         }
 
-        String requiredAcksStr = Tools.get(properties, REQUIRED_ACKS);
-        requiredAcks = requiredAcksStr != null ? requiredAcksStr : DEFAULT_KAFKA_REQUIRED_ACKS;
+        String requiredAcksStr = Tools.get(properties, PROP_KAFKA_REQUIRED_ACKS);
+        requiredAcks = requiredAcksStr != null ? requiredAcksStr : PROP_KAFKA_REQUIRED_ACKS_DEFAULT;
         log.info("Configured, Kafka required acknowledgement is {}", requiredAcks);
 
-        Integer batchSizeConfigured = Tools.getIntegerProperty(properties, BATCH_SIZE);
+        Integer batchSizeConfigured = Tools.getIntegerProperty(properties, PROP_KAFKA_BATCH_SIZE);
         if (batchSizeConfigured == null) {
-            batchSize = DEFAULT_KAFKA_BATCH_SIZE;
+            batchSize = PROP_KAFKA_BATCH_SIZE_DEFAULT;
             log.info("Kafka batch size property is NOT configured, default value is {}", batchSize);
         } else {
             batchSize = batchSizeConfigured;
             log.info("Configured. Kafka batch size is {}", batchSize);
         }
 
-        Integer lingerMsConfigured = Tools.getIntegerProperty(properties, LINGER_MS);
+        Integer lingerMsConfigured = Tools.getIntegerProperty(properties, PROP_KAFKA_LINGER_MS);
         if (lingerMsConfigured == null) {
-            lingerMs = DEFAULT_KAFKA_LINGER_MS;
+            lingerMs = PROP_KAFKA_LINGER_MS_DEFAULT;
             log.info("Kafka lingerMs property is NOT configured, default value is {}", lingerMs);
         } else {
             lingerMs = lingerMsConfigured;
             log.info("Configured. Kafka lingerMs is {}", lingerMs);
         }
 
-        Integer memoryBufferConfigured = Tools.getIntegerProperty(properties, MEMORY_BUFFER);
+        Integer memoryBufferConfigured = Tools.getIntegerProperty(properties, PROP_KAFKA_MEMORY_BUFFER);
         if (memoryBufferConfigured == null) {
-            memoryBuffer = DEFAULT_KAFKA_MEMORY_BUFFER;
+            memoryBuffer = PROP_KAFKA_MEMORY_BUFFER_DEFAULT;
             log.info("Kafka memory buffer property is NOT configured, default value is {}", memoryBuffer);
         } else {
             memoryBuffer = memoryBufferConfigured;
             log.info("Configured. Kafka memory buffer is {}", memoryBuffer);
         }
 
-        String keySerializerStr = Tools.get(properties, KEY_SERIALIZER);
-        keySerializer = keySerializerStr != null ? keySerializerStr : DEFAULT_KAFKA_KEY_SERIALIZER;
+        String keySerializerStr = Tools.get(properties, PROP_KAFKA_KEY_SERIALIZER);
+        keySerializer = keySerializerStr != null ? keySerializerStr : PROP_KAFKA_KEY_SERIALIZER_DEFAULT;
         log.info("Configured, Kafka key serializer is {}", keySerializer);
 
-        String valueSerializerStr = Tools.get(properties, VALUE_SERIALIZER);
-        valueSerializer = valueSerializerStr != null ? valueSerializerStr : DEFAULT_KAFKA_VALUE_SERIALIZER;
+        String valueSerializerStr = Tools.get(properties, PROP_KAFKA_VALUE_SERIALIZER);
+        valueSerializer = valueSerializerStr != null ? valueSerializerStr : PROP_KAFKA_VALUE_SERIALIZER_DEFAULT;
         log.info("Configured, Kafka value serializer is {}", valueSerializer);
 
         Boolean enableServiceConfigured =
-                getBooleanProperty(properties, ENABLE_SERVICE);
+                getBooleanProperty(properties, PROP_KAFKA_ENABLE_SERVICE);
         if (enableServiceConfigured == null) {
-            enableService = DEFAULT_DISABLE;
+            enableService = PROP_KAFKA_ENABLE_SERVICE_DEFAULT;
             log.info("Kafka service enable flag is NOT " +
                     "configured, default value is {}", enableService);
         } else {
diff --git a/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/impl/KafkaTelemetryManager.java b/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/impl/KafkaTelemetryManager.java
index 56a0e81..e895e46 100644
--- a/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/impl/KafkaTelemetryManager.java
+++ b/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/impl/KafkaTelemetryManager.java
@@ -15,12 +15,6 @@
  */
 package org.onosproject.openstacktelemetry.impl;
 
-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.kafka.clients.producer.KafkaProducer;
 import org.apache.kafka.clients.producer.Producer;
 import org.apache.kafka.clients.producer.ProducerRecord;
@@ -29,6 +23,11 @@
 import org.onosproject.openstacktelemetry.api.OpenstackTelemetryService;
 import org.onosproject.openstacktelemetry.api.config.KafkaTelemetryConfig;
 import org.onosproject.openstacktelemetry.api.config.TelemetryConfig;
+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;
 
@@ -38,8 +37,7 @@
 /**
  * Kafka telemetry manager.
  */
-@Component(immediate = true)
-@Service
+@Component(immediate = true, service = KafkaTelemetryAdminService.class)
 public class KafkaTelemetryManager implements KafkaTelemetryAdminService {
 
     private final Logger log = LoggerFactory.getLogger(getClass());
@@ -53,7 +51,7 @@
     private static final String KEY_SERIALIZER = "key.serializer";
     private static final String VALUE_SERIALIZER = "value.serializer";
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected OpenstackTelemetryService openstackTelemetryService;
 
     private Producer<String, byte[]> producer = null;
diff --git a/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/impl/OpenstackTelemetryManager.java b/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/impl/OpenstackTelemetryManager.java
index 3e629cc..783dbd6 100644
--- a/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/impl/OpenstackTelemetryManager.java
+++ b/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/impl/OpenstackTelemetryManager.java
@@ -17,12 +17,6 @@
 
 import com.google.common.collect.ImmutableSet;
 import com.google.common.collect.Lists;
-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.kafka.clients.producer.ProducerRecord;
 import org.onosproject.cfg.ComponentConfigService;
 import org.onosproject.openstacktelemetry.api.FlowInfo;
@@ -34,6 +28,11 @@
 import org.onosproject.openstacktelemetry.api.RestTelemetryService;
 import org.onosproject.openstacktelemetry.api.TelemetryService;
 import org.onosproject.openstacktelemetry.codec.TinaMessageByteBufferCodec;
+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;
 
@@ -49,15 +48,14 @@
 /**
  * Openstack telemetry manager.
  */
-@Component(immediate = true)
-@Service
+@Component(immediate = true, service = OpenstackTelemetryService.class)
 public class OpenstackTelemetryManager implements OpenstackTelemetryService {
 
     private final Logger log = LoggerFactory.getLogger(getClass());
 
     private static final String ENABLE_SERVICE = "enableService";
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected ComponentConfigService componentConfigService;
 
     private List<TelemetryService> telemetryServices = Lists.newArrayList();
diff --git a/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/impl/OsgiPropertyConstants.java b/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/impl/OsgiPropertyConstants.java
new file mode 100644
index 0000000..7be6973
--- /dev/null
+++ b/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/impl/OsgiPropertyConstants.java
@@ -0,0 +1,151 @@
+/*
+ * Copyright 2018-present Open Networking Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.onosproject.openstacktelemetry.impl;
+
+/**
+ * Name/Value constants for properties.
+ */
+public final class OsgiPropertyConstants {
+    private OsgiPropertyConstants() {
+    }
+
+    // REST telemetry
+
+    static final String PROP_REST_ENABLE_SERVICE = "enableService";
+    static final boolean PROP_REST_ENABLE_SERVICE_DEFAULT = false;
+
+    static final String PROP_REST_SERVER_ADDRESS = "address";
+    static final String PROP_REST_SERVER_ADDRESS_DEFAULT = "localhost";
+
+    static final String PROP_REST_SERVER_PORT = "port";
+    static final int PROP_REST_SERVER_PORT_DEFAULT = 80;
+
+    static final String PROP_REST_ENDPOINT = "endpoint";
+    static final String PROP_REST_ENDPOINT_DEFAULT = "telemetry";
+
+    static final String PROP_REST_METHOD = "method";
+    static final String PROP_REST_METHOD_DEFAULT = "POST";
+
+    static final String PROP_REST_REQUEST_MEDIA_TYPE = "requestMediaType";
+    static final String PROP_REST_REQUEST_MEDIA_TYPE_DEFAULT = "application/json";
+
+    static final String PROP_REST_RESPONSE_MEDIA_TYPE = "responseMediaType";
+    static final String PROP_REST_RESPONSE_MEDIA_TYPE_DEFAULT = "application/json";
+
+    // Kafka telemetry
+
+    static final String PROP_KAFKA_ENABLE_SERVICE = "enableService";
+    static final boolean PROP_KAFKA_ENABLE_SERVICE_DEFAULT = false;
+
+    static final String PROP_KAFKA_ADDRESS = "address";
+    static final String PROP_KAFKA_ADDRESS_DEFAULT = "localhost";
+
+    static final String PROP_KAFKA_PORT = "port";
+    static final int PROP_KAFKA_PORT_DEFAULT = 9092;
+
+    static final String PROP_KAFKA_RETRIES = "retries";
+    static final int PROP_KAFKA_RETRIES_DEFAULT = 0;
+
+    static final String PROP_KAFKA_REQUIRED_ACKS = "requiredAcks";
+    static final String PROP_KAFKA_REQUIRED_ACKS_DEFAULT = "all";
+
+    static final String PROP_KAFKA_BATCH_SIZE = "batchSize";
+    static final int PROP_KAFKA_BATCH_SIZE_DEFAULT = 16384;
+
+    static final String PROP_KAFKA_LINGER_MS = "lingerMs";
+    static final int PROP_KAFKA_LINGER_MS_DEFAULT = 1;
+
+    static final String PROP_KAFKA_MEMORY_BUFFER = "memoryBuffer";
+    static final int PROP_KAFKA_MEMORY_BUFFER_DEFAULT = 33554432;
+
+    static final String PROP_KAFKA_KEY_SERIALIZER = "keySerializer";
+    static final String PROP_KAFKA_KEY_SERIALIZER_DEFAULT =
+        "org.apache.kafka.common.serialization.StringSerializer";
+
+    static final String PROP_KAFKA_VALUE_SERIALIZER = "valueSerializer";
+    static final String PROP_KAFKA_VALUE_SERIALIZER_DEFAULT =
+        "org.apache.kafka.common.serialization.ByteArraySerializer";
+
+    // Stats flow rule manager
+
+    static final String PROP_REVERSE_PATH_STATS = "reversePathStats";
+    static final boolean PROP_REVERSE_PATH_STATS_DEFAULT = false;
+
+    static final String PROP_EGRESS_STATS = "egressStats";
+    static final boolean PROP_EGRESS_STATS_DEFAULT = false;
+
+    static final String PROP_PORT_STATS = "portStats";
+    static final boolean PROP_PORT_STATS_DEFAULT = true;
+
+    static final String PROP_MONITOR_OVERLAY = "monitorOverlay";
+    static final boolean PROP_MONITOR_OVERLAY_DEFAULT = true;
+
+    static final String PROP_MONITOR_UNDERLAY = "monitorUnderlay";
+    static final boolean PROP_MONITOR_UNDERLAY_DEFAULT = true;
+
+    // Influx DB Telemetry config manager
+
+    static final String PROP_INFLUXDB_ENABLE_SERVICE = "enableService";
+    static final boolean PROP_INFLUXDB_ENABLE_SERVICE_DEFAULT = false;
+
+    static final String PROP_INFLUXDB_SERVER_ADDRESS = "address";
+    static final String PROP_INFLUXDB_SERVER_ADDRESS_DEFAULT = "localhost";
+
+    static final String PROP_INFLUXDB_SERVER_PORT = "port";
+    static final int PROP_INFLUXDB_SERVER_PORT_DEFAULT = 8086;
+
+    static final String PROP_INFLUXDB_USERNAME = "username";
+    static final String PROP_INFLUXDB_USERNAME_DEFAULT = "onos";
+
+    static final String PROP_INFLUXDB_PASSWORD = "password";
+    static final String PROP_INFLUXDB_PASSWORD_DEFAULT = "onos";
+
+    static final String PROP_INFLUXDB_DATABASE = "database";
+    static final String PROP_INFLUXDB_DATABASE_DEFAULT = "onos";
+
+    static final String PROP_INFLUXDB_MEASUREMENT = "measurement";
+    static final String PROP_INFLUXDB_MEASUREMENT_DEFAULT = "sonaflow";
+
+    static final String PROP_INFLUXDB_ENABLE_BATCH = "enableBatch";
+    static final boolean PROP_INFLUXDB_ENABLE_BATCH_DEFAULT = true;
+
+    // GRPC Telemetry config manager
+    static final String PROP_GRPC_ENABLE_SERVICE = "enableService";
+    static final boolean GRPC_ENABLE_SERVICE_DEFAULT = false;
+
+    static final String PROP_GRPC_SERVER_ADDRESS = "address";
+    static final String GRPC_SERVER_ADDRESS_DEFAULT = "localhost";
+
+    static final String PROP_GRPC_SERVER_PORT = "port";
+    static final int GRPC_SERVER_PORT_DEFAULT = 50051;
+
+    static final String PROP_GRPC_USE_PLAINTEXT = "usePlaintext";
+    static final boolean GRPC_USE_PLAINTEXT_DEFAULT = true;
+
+    static final String PROP_GRPC_MAX_INBOUND_MSG_SIZE = "maxInboundMsgSize";
+    static final int GRPC_MAX_INBOUND_MSG_SIZE_DEFAULT = 4194304; //4 * 1024 * 1024;
+
+    // Prometheus Telemetry config manager
+    static final String PROP_PROMETHEUS_ENABLE_SERVICE = "enableService";
+    static final boolean PROMETHEUS_ENABLE_SERVICE_DEFAULT = false;
+
+    static final String PROP_PROMETHEUS_EXPORTER_ADDRESS = "address";
+    public static final String PROMETHEUS_EXPORTER_ADDRESS_DEFAULT = "localhost";
+
+    static final String PROP_PROMETHEUS_EXPORTER_PORT = "port";
+    public static final int PROMETHEUS_EXPORTER_PORT_DEFAULT = 50051;
+}
diff --git a/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/impl/PrometheusTelemetryConfigManager.java b/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/impl/PrometheusTelemetryConfigManager.java
index 23cc240..4405b97 100644
--- a/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/impl/PrometheusTelemetryConfigManager.java
+++ b/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/impl/PrometheusTelemetryConfigManager.java
@@ -15,14 +15,6 @@
  */
 package org.onosproject.openstacktelemetry.impl;
 
-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.util.Tools;
 import org.onosproject.cfg.ComponentConfigService;
 import org.onosproject.openstacktelemetry.api.PrometheusTelemetryAdminService;
@@ -30,48 +22,56 @@
 import org.onosproject.openstacktelemetry.api.config.TelemetryConfig;
 import org.onosproject.openstacktelemetry.config.DefaultPrometheusTelemetryConfig;
 import org.osgi.service.component.ComponentContext;
+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 org.slf4j.LoggerFactory;
 
 import java.util.Dictionary;
 
-import static org.onosproject.openstacktelemetry.api.Constants.DEFAULT_DISABLE;
-import static org.onosproject.openstacktelemetry.api.Constants.DEFAULT_ENABLE;
-import static org.onosproject.openstacktelemetry.api.Constants.DEFAULT_PROMETHEUS_EXPORTER_IP;
-import static org.onosproject.openstacktelemetry.api.Constants.DEFAULT_PROMETHEUS_EXPORTER_PORT;
+import static org.onosproject.openstacktelemetry.impl.OsgiPropertyConstants.PROMETHEUS_ENABLE_SERVICE_DEFAULT;
+import static org.onosproject.openstacktelemetry.impl.OsgiPropertyConstants.PROMETHEUS_EXPORTER_ADDRESS_DEFAULT;
+import static org.onosproject.openstacktelemetry.impl.OsgiPropertyConstants.PROMETHEUS_EXPORTER_PORT_DEFAULT;
+import static org.onosproject.openstacktelemetry.impl.OsgiPropertyConstants.PROP_PROMETHEUS_ENABLE_SERVICE;
+import static org.onosproject.openstacktelemetry.impl.OsgiPropertyConstants.PROP_PROMETHEUS_EXPORTER_ADDRESS;
+import static org.onosproject.openstacktelemetry.impl.OsgiPropertyConstants.PROP_PROMETHEUS_EXPORTER_PORT;
 import static org.onosproject.openstacktelemetry.util.OpenstackTelemetryUtil.getBooleanProperty;
 import static org.onosproject.openstacktelemetry.util.OpenstackTelemetryUtil.initTelemetryService;
 
 /**
  * Prometheus exporter configuration manager for publishing openstack telemetry.
  */
-@Component(immediate = true)
-@Service
+@Component(
+    immediate = true,
+    service = PrometheusTelemetryConfigService.class,
+    property = {
+        PROP_PROMETHEUS_ENABLE_SERVICE + ":Boolean=" + PROMETHEUS_ENABLE_SERVICE_DEFAULT,
+        PROP_PROMETHEUS_EXPORTER_ADDRESS + "=" + PROMETHEUS_EXPORTER_ADDRESS_DEFAULT,
+        PROP_PROMETHEUS_EXPORTER_PORT + ":Integer=" + PROMETHEUS_EXPORTER_PORT_DEFAULT
+    }
+)
 public class PrometheusTelemetryConfigManager implements PrometheusTelemetryConfigService {
 
     private final Logger log = LoggerFactory.getLogger(getClass());
 
-    private static final String ENABLE_SERVICE = "enableService";
-    private static final String ADDRESS = "address";
-    private static final String PORT = "port";
-
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected ComponentConfigService componentConfigService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected PrometheusTelemetryAdminService prometheusTelemetryAdminService;
 
-    @Property(name = ADDRESS, value = DEFAULT_PROMETHEUS_EXPORTER_IP,
-            label = "Default IP address of prometheus exporter")
-    protected String address = DEFAULT_PROMETHEUS_EXPORTER_IP;
+    /** Default IP address of prometheus exporter. */
+    protected String address = PROMETHEUS_EXPORTER_ADDRESS_DEFAULT;
 
-    @Property(name = PORT, intValue = DEFAULT_PROMETHEUS_EXPORTER_PORT,
-            label = "Default port number of prometheus exporter")
-    protected Integer port = DEFAULT_PROMETHEUS_EXPORTER_PORT;
+    /** Default port number of prometheus exporter. */
+    protected Integer port = PROMETHEUS_EXPORTER_PORT_DEFAULT;
 
-    @Property(name = ENABLE_SERVICE, boolValue = DEFAULT_ENABLE,
-            label = "Specify the default behavior of telemetry service")
-    protected Boolean enableService = DEFAULT_ENABLE;
+    /** Specify the default behavior of telemetry service. */
+    protected Boolean enableService = PROMETHEUS_ENABLE_SERVICE_DEFAULT;
 
     @Activate
     protected void activate(ComponentContext context) {
@@ -114,22 +114,22 @@
     private void readComponentConfiguration(ComponentContext context) {
         Dictionary<?, ?> properties = context.getProperties();
 
-        String addressStr = Tools.get(properties, ADDRESS);
-        address = addressStr != null ? addressStr : DEFAULT_PROMETHEUS_EXPORTER_IP;
+        String addressStr = Tools.get(properties, PROP_PROMETHEUS_EXPORTER_ADDRESS);
+        address = addressStr != null ? addressStr : PROMETHEUS_EXPORTER_ADDRESS_DEFAULT;
         log.info("Configured. Prometheus exporter address is {}", address);
 
-        Integer portConfigured = Tools.getIntegerProperty(properties, PORT);
+        Integer portConfigured = Tools.getIntegerProperty(properties, PROP_PROMETHEUS_EXPORTER_PORT);
         if (portConfigured == null) {
-            port = DEFAULT_PROMETHEUS_EXPORTER_PORT;
+            port = PROMETHEUS_EXPORTER_PORT_DEFAULT;
             log.info("Prometheus exporter port is NOT configured, default value is {}", port);
         } else {
             port = portConfigured;
             log.info("Configured. Prometheus exporter port is {}", port);
         }
 
-        Boolean enableServiceConfigured = getBooleanProperty(properties, ENABLE_SERVICE);
+        Boolean enableServiceConfigured = getBooleanProperty(properties, PROP_PROMETHEUS_ENABLE_SERVICE);
         if (enableServiceConfigured == null) {
-            enableService = DEFAULT_DISABLE;
+            enableService = PROMETHEUS_ENABLE_SERVICE_DEFAULT;
             log.info("Prometheus service enable flag is NOT " +
                              "configured, default value is {}", enableService);
         } else {
diff --git a/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/impl/PrometheusTelemetryManager.java b/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/impl/PrometheusTelemetryManager.java
index f06a961..f029fa4 100644
--- a/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/impl/PrometheusTelemetryManager.java
+++ b/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/impl/PrometheusTelemetryManager.java
@@ -15,17 +15,17 @@
  */
 package org.onosproject.openstacktelemetry.impl;
 
-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.openstacktelemetry.api.FlowInfo;
 import org.onosproject.openstacktelemetry.api.OpenstackTelemetryService;
 import org.onosproject.openstacktelemetry.api.PrometheusTelemetryAdminService;
+import org.onosproject.openstacktelemetry.api.PrometheusTelemetryService;
 import org.onosproject.openstacktelemetry.api.config.PrometheusTelemetryConfig;
 import org.onosproject.openstacktelemetry.api.config.TelemetryConfig;
+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;
 
@@ -39,8 +39,7 @@
 /**
  * Prometheus telemetry manager.
  */
-@Component(immediate = true)
-@Service
+@Component(immediate = true, service = PrometheusTelemetryService.class)
 public class PrometheusTelemetryManager implements PrometheusTelemetryAdminService {
 
     private final Logger log = LoggerFactory.getLogger(getClass());
@@ -106,7 +105,7 @@
                                     .help(HELP_MSG)
                                     .register();
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected OpenstackTelemetryService openstackTelemetryService;
 
     @Activate
diff --git a/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/impl/RestTelemetryConfigManager.java b/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/impl/RestTelemetryConfigManager.java
index 25c7afe..16b62cb 100644
--- a/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/impl/RestTelemetryConfigManager.java
+++ b/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/impl/RestTelemetryConfigManager.java
@@ -15,14 +15,6 @@
  */
 package org.onosproject.openstacktelemetry.impl;
 
-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.util.Tools;
 import org.onosproject.cfg.ComponentConfigService;
 import org.onosproject.openstacktelemetry.api.RestTelemetryAdminService;
@@ -30,71 +22,80 @@
 import org.onosproject.openstacktelemetry.api.config.TelemetryConfig;
 import org.onosproject.openstacktelemetry.config.DefaultRestTelemetryConfig;
 import org.osgi.service.component.ComponentContext;
+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 org.slf4j.LoggerFactory;
 
 import java.util.Dictionary;
 
-import static org.onosproject.openstacktelemetry.api.Constants.DEFAULT_DISABLE;
-import static org.onosproject.openstacktelemetry.api.Constants.DEFAULT_REST_ENDPOINT;
-import static org.onosproject.openstacktelemetry.api.Constants.DEFAULT_REST_METHOD;
-import static org.onosproject.openstacktelemetry.api.Constants.DEFAULT_REST_REQUEST_MEDIA_TYPE;
-import static org.onosproject.openstacktelemetry.api.Constants.DEFAULT_REST_RESPONSE_MEDIA_TYPE;
-import static org.onosproject.openstacktelemetry.api.Constants.DEFAULT_REST_SERVER_IP;
-import static org.onosproject.openstacktelemetry.api.Constants.DEFAULT_REST_SERVER_PORT;
+import static org.onosproject.openstacktelemetry.impl.OsgiPropertyConstants.PROP_REST_SERVER_ADDRESS;
+import static org.onosproject.openstacktelemetry.impl.OsgiPropertyConstants.PROP_REST_ENABLE_SERVICE;
+import static org.onosproject.openstacktelemetry.impl.OsgiPropertyConstants.PROP_REST_ENABLE_SERVICE_DEFAULT;
+import static org.onosproject.openstacktelemetry.impl.OsgiPropertyConstants.PROP_REST_ENDPOINT;
+import static org.onosproject.openstacktelemetry.impl.OsgiPropertyConstants.PROP_REST_METHOD;
+import static org.onosproject.openstacktelemetry.impl.OsgiPropertyConstants.PROP_REST_SERVER_PORT;
+import static org.onosproject.openstacktelemetry.impl.OsgiPropertyConstants.PROP_REST_REQUEST_MEDIA_TYPE;
+import static org.onosproject.openstacktelemetry.impl.OsgiPropertyConstants.PROP_REST_RESPONSE_MEDIA_TYPE;
+import static org.onosproject.openstacktelemetry.impl.OsgiPropertyConstants.PROP_REST_ENDPOINT_DEFAULT;
+import static org.onosproject.openstacktelemetry.impl.OsgiPropertyConstants.PROP_REST_METHOD_DEFAULT;
+import static org.onosproject.openstacktelemetry.impl.OsgiPropertyConstants.PROP_REST_REQUEST_MEDIA_TYPE_DEFAULT;
+import static org.onosproject.openstacktelemetry.impl.OsgiPropertyConstants.PROP_REST_RESPONSE_MEDIA_TYPE_DEFAULT;
+import static org.onosproject.openstacktelemetry.impl.OsgiPropertyConstants.PROP_REST_SERVER_ADDRESS_DEFAULT;
+import static org.onosproject.openstacktelemetry.impl.OsgiPropertyConstants.PROP_REST_SERVER_PORT_DEFAULT;
 import static org.onosproject.openstacktelemetry.util.OpenstackTelemetryUtil.getBooleanProperty;
 import static org.onosproject.openstacktelemetry.util.OpenstackTelemetryUtil.initTelemetryService;
 
 /**
  * REST server configuration manager for publishing openstack telemetry.
  */
-@Component(immediate = true)
-@Service
+@Component(
+    immediate = true,
+    service = RestTelemetryConfigService.class,
+    property = {
+        PROP_REST_ENABLE_SERVICE + ":Boolean=" + PROP_REST_ENABLE_SERVICE_DEFAULT,
+        PROP_REST_SERVER_ADDRESS + "=" + PROP_REST_SERVER_ADDRESS_DEFAULT,
+        PROP_REST_SERVER_PORT + ":Integer=" + PROP_REST_SERVER_PORT_DEFAULT,
+        PROP_REST_ENDPOINT + "=" + PROP_REST_ENDPOINT_DEFAULT,
+        PROP_REST_METHOD + "=" + PROP_REST_METHOD_DEFAULT,
+        PROP_REST_REQUEST_MEDIA_TYPE + "=" + PROP_REST_REQUEST_MEDIA_TYPE_DEFAULT,
+        PROP_REST_RESPONSE_MEDIA_TYPE + "=" + PROP_REST_RESPONSE_MEDIA_TYPE_DEFAULT
+    }
+)
 public class RestTelemetryConfigManager implements RestTelemetryConfigService {
 
     private final Logger log = LoggerFactory.getLogger(getClass());
 
-    private static final String ENABLE_SERVICE = "enableService";
-    private static final String ADDRESS = "address";
-    private static final String PORT = "port";
-    private static final String ENDPOINT = "endpoint";
-    private static final String METHOD = "method";
-    private static final String REQUEST_MEDIA_TYPE = "requestMediaType";
-    private static final String RESPONSE_MEDIA_TYPE = "responseMediaType";
-
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected ComponentConfigService componentConfigService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected RestTelemetryAdminService restTelemetryAdminService;
 
-    @Property(name = ADDRESS, value = DEFAULT_REST_SERVER_IP,
-            label = "Default IP address to establish initial connection to REST server")
-    protected String address = DEFAULT_REST_SERVER_IP;
+    /** Default IP address to establish initial connection to REST server. */
+    protected String address = PROP_REST_SERVER_ADDRESS_DEFAULT;
 
-    @Property(name = PORT, intValue = DEFAULT_REST_SERVER_PORT,
-            label = "Default port number to establish initial connection to REST server")
-    protected Integer port = DEFAULT_REST_SERVER_PORT;
+    /** Default port number to establish initial connection to REST server. */
+    protected Integer port = PROP_REST_SERVER_PORT_DEFAULT;
 
-    @Property(name = ENDPOINT, value = DEFAULT_REST_ENDPOINT,
-            label = "Endpoint of REST server")
-    protected String endpoint = DEFAULT_REST_ENDPOINT;
+    /** Endpoint of REST server. */
+    protected String endpoint = PROP_REST_ENDPOINT_DEFAULT;
 
-    @Property(name = METHOD, value = DEFAULT_REST_METHOD,
-            label = "HTTP method of REST server")
-    protected String method = DEFAULT_REST_METHOD;
+    /** HTTP method of REST server. */
+    protected String method = PROP_REST_METHOD_DEFAULT;
 
-    @Property(name = REQUEST_MEDIA_TYPE, value = DEFAULT_REST_REQUEST_MEDIA_TYPE,
-            label = "Request media type of REST server")
-    protected String requestMediaType = DEFAULT_REST_REQUEST_MEDIA_TYPE;
+    /** Request media type of REST server. */
+    protected String requestMediaType = PROP_REST_REQUEST_MEDIA_TYPE_DEFAULT;
 
-    @Property(name = RESPONSE_MEDIA_TYPE, value = DEFAULT_REST_RESPONSE_MEDIA_TYPE,
-            label = "Response media type of REST server")
-    protected String responseMediaType = DEFAULT_REST_RESPONSE_MEDIA_TYPE;
+    /** Response media type of REST server. */
+    protected String responseMediaType = PROP_REST_RESPONSE_MEDIA_TYPE_DEFAULT;
 
-    @Property(name = ENABLE_SERVICE, boolValue = DEFAULT_DISABLE,
-            label = "Specify the default behavior of telemetry service")
-    protected Boolean enableService = DEFAULT_DISABLE;
+    /** Specify the default behavior of telemetry service. */
+    protected Boolean enableService = PROP_REST_ENABLE_SERVICE_DEFAULT;
 
     @Activate
     protected void activate(ComponentContext context) {
@@ -143,41 +144,41 @@
     private void readComponentConfiguration(ComponentContext context) {
         Dictionary<?, ?> properties = context.getProperties();
 
-        String addressStr = Tools.get(properties, ADDRESS);
-        address = addressStr != null ? addressStr : DEFAULT_REST_SERVER_IP;
+        String addressStr = Tools.get(properties, PROP_REST_SERVER_ADDRESS);
+        address = addressStr != null ? addressStr : PROP_REST_SERVER_ADDRESS_DEFAULT;
         log.info("Configured. REST server address is {}", address);
 
-        Integer portConfigured = Tools.getIntegerProperty(properties, PORT);
+        Integer portConfigured = Tools.getIntegerProperty(properties, PROP_REST_SERVER_PORT);
         if (portConfigured == null) {
-            port = DEFAULT_REST_SERVER_PORT;
+            port = PROP_REST_SERVER_PORT_DEFAULT;
             log.info("REST server port is NOT configured, default value is {}", port);
         } else {
             port = portConfigured;
             log.info("Configured. REST server port is {}", port);
         }
 
-        String endpointStr = Tools.get(properties, ENDPOINT);
-        endpoint = endpointStr != null ? endpointStr : DEFAULT_REST_ENDPOINT;
+        String endpointStr = Tools.get(properties, PROP_REST_ENDPOINT);
+        endpoint = endpointStr != null ? endpointStr : PROP_REST_ENDPOINT_DEFAULT;
         log.info("Configured. REST server endpoint is {}", endpoint);
 
-        String methodStr = Tools.get(properties, METHOD);
-        method = methodStr != null ? methodStr : DEFAULT_REST_METHOD;
+        String methodStr = Tools.get(properties, PROP_REST_METHOD);
+        method = methodStr != null ? methodStr : PROP_REST_METHOD_DEFAULT;
         log.info("Configured. REST server default HTTP method is {}", method);
 
-        String requestMediaTypeStr = Tools.get(properties, REQUEST_MEDIA_TYPE);
+        String requestMediaTypeStr = Tools.get(properties, PROP_REST_REQUEST_MEDIA_TYPE);
         requestMediaType = requestMediaTypeStr != null ?
-                requestMediaTypeStr : DEFAULT_REST_REQUEST_MEDIA_TYPE;
+                requestMediaTypeStr : PROP_REST_REQUEST_MEDIA_TYPE_DEFAULT;
         log.info("Configured. REST server request media type is {}", requestMediaType);
 
-        String responseMediaTypeStr = Tools.get(properties, RESPONSE_MEDIA_TYPE);
+        String responseMediaTypeStr = Tools.get(properties, PROP_REST_RESPONSE_MEDIA_TYPE);
         responseMediaType = responseMediaTypeStr != null ?
-                responseMediaTypeStr : DEFAULT_REST_RESPONSE_MEDIA_TYPE;
+                responseMediaTypeStr : PROP_REST_RESPONSE_MEDIA_TYPE_DEFAULT;
         log.info("Configured. REST server response media type is {}", responseMediaType);
 
         Boolean enableServiceConfigured =
-                getBooleanProperty(properties, ENABLE_SERVICE);
+                getBooleanProperty(properties, PROP_REST_ENABLE_SERVICE);
         if (enableServiceConfigured == null) {
-            enableService = DEFAULT_DISABLE;
+            enableService = PROP_REST_ENABLE_SERVICE_DEFAULT;
             log.info("REST service enable flag is NOT " +
                     "configured, default value is {}", enableService);
         } else {
diff --git a/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/impl/RestTelemetryManager.java b/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/impl/RestTelemetryManager.java
index f94748c..9b4aaf9 100644
--- a/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/impl/RestTelemetryManager.java
+++ b/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/impl/RestTelemetryManager.java
@@ -15,16 +15,15 @@
  */
 package org.onosproject.openstacktelemetry.impl;
 
-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.openstacktelemetry.api.OpenstackTelemetryService;
 import org.onosproject.openstacktelemetry.api.RestTelemetryAdminService;
 import org.onosproject.openstacktelemetry.api.config.RestTelemetryConfig;
 import org.onosproject.openstacktelemetry.api.config.TelemetryConfig;
+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;
 
@@ -37,8 +36,7 @@
 /**
  * REST telemetry manager.
  */
-@Component(immediate = true)
-@Service
+@Component(immediate = true, service = RestTelemetryAdminService.class)
 public class RestTelemetryManager implements RestTelemetryAdminService {
 
     private final Logger log = LoggerFactory.getLogger(getClass());
@@ -47,7 +45,7 @@
     private static final String POST_METHOD = "POST";
     private static final String GET_METHOD  = "GET";
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected OpenstackTelemetryService openstackTelemetryService;
 
     private WebTarget target = null;
diff --git a/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/impl/StatsFlowRuleManager.java b/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/impl/StatsFlowRuleManager.java
index f1318de..4ddaf40 100644
--- a/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/impl/StatsFlowRuleManager.java
+++ b/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/impl/StatsFlowRuleManager.java
@@ -17,14 +17,6 @@
 
 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.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.packet.IpAddress;
 import org.onlab.packet.IpPrefix;
 import org.onlab.packet.MacAddress;
@@ -71,6 +63,12 @@
 import org.onosproject.openstacktelemetry.api.StatsFlowRuleAdminService;
 import org.onosproject.openstacktelemetry.api.StatsInfo;
 import org.osgi.service.component.ComponentContext;
+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 org.slf4j.LoggerFactory;
 
@@ -110,13 +108,32 @@
 import static org.onosproject.openstacktelemetry.api.Constants.OPENSTACK_TELEMETRY_APP_ID;
 import static org.onosproject.openstacktelemetry.api.Constants.VLAN;
 import static org.onosproject.openstacktelemetry.api.Constants.VXLAN;
+import static org.onosproject.openstacktelemetry.impl.OsgiPropertyConstants.PROP_EGRESS_STATS;
+import static org.onosproject.openstacktelemetry.impl.OsgiPropertyConstants.PROP_EGRESS_STATS_DEFAULT;
+import static org.onosproject.openstacktelemetry.impl.OsgiPropertyConstants.PROP_MONITOR_OVERLAY;
+import static org.onosproject.openstacktelemetry.impl.OsgiPropertyConstants.PROP_MONITOR_OVERLAY_DEFAULT;
+import static org.onosproject.openstacktelemetry.impl.OsgiPropertyConstants.PROP_MONITOR_UNDERLAY;
+import static org.onosproject.openstacktelemetry.impl.OsgiPropertyConstants.PROP_MONITOR_UNDERLAY_DEFAULT;
+import static org.onosproject.openstacktelemetry.impl.OsgiPropertyConstants.PROP_PORT_STATS;
+import static org.onosproject.openstacktelemetry.impl.OsgiPropertyConstants.PROP_PORT_STATS_DEFAULT;
+import static org.onosproject.openstacktelemetry.impl.OsgiPropertyConstants.PROP_REVERSE_PATH_STATS;
+import static org.onosproject.openstacktelemetry.impl.OsgiPropertyConstants.PROP_REVERSE_PATH_STATS_DEFAULT;
 import static org.onosproject.openstacktelemetry.util.OpenstackTelemetryUtil.getBooleanProperty;
 
 /**
  * Flow rule manager for network statistics of a VM.
  */
-@Component(immediate = true)
-@Service
+@Component(
+    immediate = true,
+    service = StatsFlowRuleAdminService.class,
+    property = {
+        PROP_REVERSE_PATH_STATS + ":Boolean=" + PROP_REVERSE_PATH_STATS_DEFAULT,
+        PROP_EGRESS_STATS  + ":Boolean=" + PROP_EGRESS_STATS_DEFAULT,
+        PROP_PORT_STATS + ":Boolean=" + PROP_PORT_STATS_DEFAULT,
+        PROP_MONITOR_OVERLAY  + ":Boolean=" + PROP_MONITOR_OVERLAY_DEFAULT,
+        PROP_MONITOR_UNDERLAY  + ":Boolean=" + PROP_MONITOR_UNDERLAY_DEFAULT
+    }
+)
 public class StatsFlowRuleManager implements StatsFlowRuleAdminService {
 
     private final Logger log = LoggerFactory.getLogger(getClass());
@@ -128,22 +145,8 @@
     private static final long REFRESH_INTERVAL = 5L;
     private static final TimeUnit TIME_UNIT_SECOND = TimeUnit.SECONDS;
 
-    private static final String REVERSE_PATH_STATS = "reversePathStats";
-    private static final String EGRESS_STATS = "egressStats";
-    private static final String PORT_STATS = "portStats";
-
-    private static final String MONITOR_OVERLAY = "monitorOverlay";
-    private static final String MONITOR_UNDERLAY = "monitorUnderlay";
-
     private static final String OVS_DRIVER_NAME = "ovs";
 
-    private static final boolean DEFAULT_REVERSE_PATH_STATS = false;
-    private static final boolean DEFAULT_EGRESS_STATS = false;
-    private static final boolean DEFAULT_PORT_STATS = true;
-
-    private static final boolean DEFAULT_MONITOR_OVERLAY = true;
-    private static final boolean DEFAULT_MONITOR_UNDERLAY = true;
-
     private static final String ARBITRARY_IP = "0.0.0.0/32";
     private static final int ARBITRARY_PROTOCOL = 0x0;
     private static final int ARBITRARY_LENGTH = 32;
@@ -155,60 +158,53 @@
 
     private static final boolean RECOVER_FROM_FAILURE = true;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected CoreService coreService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected FlowRuleService flowRuleService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected HostService hostService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected DeviceService deviceService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected DriverService driverService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected ComponentConfigService componentConfigService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected MastershipService mastershipService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected OpenstackNetworkService osNetworkService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected InstancePortService instPortService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected OpenstackNodeService osNodeService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected OpenstackTelemetryService telemetryService;
 
-    @Property(name = REVERSE_PATH_STATS, boolValue = DEFAULT_REVERSE_PATH_STATS,
-            label = "A flag which indicates whether to install the rules for " +
-                    "collecting the flow-based stats for reversed path.")
-    private boolean reversePathStats = DEFAULT_REVERSE_PATH_STATS;
+    /** A flag which indicates whether to install the rules for collecting the flow-based stats for reversed path. */
+    private boolean reversePathStats = PROP_REVERSE_PATH_STATS_DEFAULT;
 
-    @Property(name = EGRESS_STATS, boolValue = DEFAULT_EGRESS_STATS,
-            label = "A flag which indicates whether to install the rules for " +
-                    "collecting the flow-based stats for egress port.")
-    private boolean egressStats = DEFAULT_EGRESS_STATS;
+    /** A flag which indicates whether to install the rules for collecting the flow-based stats for egress port. */
+    private boolean egressStats = PROP_EGRESS_STATS_DEFAULT;
 
-    @Property(name = PORT_STATS, boolValue = DEFAULT_PORT_STATS,
-            label = "A flag which indicates whether to collect port TX & RX stats.")
-    private boolean portStats = DEFAULT_PORT_STATS;
+    /** A flag which indicates whether to collect port TX & RX stats. */
+    private boolean portStats = PROP_PORT_STATS_DEFAULT;
 
-    @Property(name = MONITOR_OVERLAY, boolValue = DEFAULT_MONITOR_OVERLAY,
-            label = "A flag which indicates whether to monitor overlay network port stats.")
-    private boolean monitorOverlay = DEFAULT_MONITOR_OVERLAY;
+    /** A flag which indicates whether to monitor overlay network port stats. */
+    private boolean monitorOverlay = PROP_MONITOR_OVERLAY_DEFAULT;
 
-    @Property(name = MONITOR_UNDERLAY, boolValue = DEFAULT_MONITOR_UNDERLAY,
-            label = "A flag which indicates whether to monitor underlay network port stats.")
-    private boolean monitorUnderlay = DEFAULT_MONITOR_UNDERLAY;
+    /** A flag which indicates whether to monitor underlay network port stats. */
+    private boolean monitorUnderlay = PROP_MONITOR_UNDERLAY_DEFAULT;
 
     private ApplicationId telemetryAppId;
     private TelemetryCollector collector;
@@ -989,9 +985,9 @@
         Dictionary<?, ?> properties = context.getProperties();
 
         Boolean reversePathStatsConfigured =
-                            getBooleanProperty(properties, REVERSE_PATH_STATS);
+                            getBooleanProperty(properties, PROP_REVERSE_PATH_STATS);
         if (reversePathStatsConfigured == null) {
-            reversePathStats = DEFAULT_REVERSE_PATH_STATS;
+            reversePathStats = PROP_REVERSE_PATH_STATS_DEFAULT;
             log.info("Reversed path stats flag is NOT " +
                      "configured, default value is {}", reversePathStats);
         } else {
@@ -999,9 +995,9 @@
             log.info("Configured. Reversed path stats flag is {}", reversePathStats);
         }
 
-        Boolean egressStatsConfigured = getBooleanProperty(properties, EGRESS_STATS);
+        Boolean egressStatsConfigured = getBooleanProperty(properties, PROP_EGRESS_STATS);
         if (egressStatsConfigured == null) {
-            egressStats = DEFAULT_EGRESS_STATS;
+            egressStats = PROP_EGRESS_STATS_DEFAULT;
             log.info("Egress stats flag is NOT " +
                      "configured, default value is {}", egressStats);
         } else {
@@ -1009,9 +1005,9 @@
             log.info("Configured. Egress stats flag is {}", egressStats);
         }
 
-        Boolean portStatsConfigured = getBooleanProperty(properties, PORT_STATS);
+        Boolean portStatsConfigured = getBooleanProperty(properties, PROP_PORT_STATS);
         if (portStatsConfigured == null) {
-            portStats = DEFAULT_PORT_STATS;
+            portStats = PROP_PORT_STATS_DEFAULT;
             log.info("Port stats flag is NOT " +
                     "configured, default value is {}", portStats);
         } else {
@@ -1019,9 +1015,9 @@
             log.info("Configured. Port stats flag is {}", portStats);
         }
 
-        Boolean monitorOverlayConfigured = getBooleanProperty(properties, MONITOR_OVERLAY);
+        Boolean monitorOverlayConfigured = getBooleanProperty(properties, PROP_MONITOR_OVERLAY);
         if (monitorOverlayConfigured == null) {
-            monitorOverlay = DEFAULT_MONITOR_OVERLAY;
+            monitorOverlay = PROP_MONITOR_OVERLAY_DEFAULT;
             log.info("Monitor overlay flag is NOT " +
                     "configured, default value is {}", monitorOverlay);
         } else {
@@ -1029,9 +1025,9 @@
             log.info("Configured. Monitor overlay flag is {}", monitorOverlay);
         }
 
-        Boolean monitorUnderlayConfigured = getBooleanProperty(properties, MONITOR_UNDERLAY);
+        Boolean monitorUnderlayConfigured = getBooleanProperty(properties, PROP_MONITOR_UNDERLAY);
         if (monitorUnderlayConfigured == null) {
-            monitorUnderlay = DEFAULT_MONITOR_UNDERLAY;
+            monitorUnderlay = PROP_MONITOR_UNDERLAY_DEFAULT;
             log.info("Monitor underlay flag is NOT " +
                     "configured, default value is {}", monitorUnderlay);
         } else {
diff --git a/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/web/OpenstackTelemetryCodecRegister.java b/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/web/OpenstackTelemetryCodecRegister.java
index 5b3ec7e..c8bfeb5 100644
--- a/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/web/OpenstackTelemetryCodecRegister.java
+++ b/apps/openstacktelemetry/app/src/main/java/org/onosproject/openstacktelemetry/web/OpenstackTelemetryCodecRegister.java
@@ -15,11 +15,11 @@
  */
 package org.onosproject.openstacktelemetry.web;
 
-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.onosproject.codec.CodecService;
 import org.onosproject.openstacktelemetry.api.FlowInfo;
 import org.onosproject.openstacktelemetry.api.StatsFlowRule;
@@ -38,7 +38,7 @@
 
     private final org.slf4j.Logger log = getLogger(getClass());
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected CodecService codecService;
 
     @Activate
diff --git a/apps/openstacktelemetry/app/src/test/java/org/onosproject/openstacktelemetry/config/DefaultPrometheusTelemetryConfigTest.java b/apps/openstacktelemetry/app/src/test/java/org/onosproject/openstacktelemetry/config/DefaultPrometheusTelemetryConfigTest.java
index 3e291c2..6a0c0b5 100644
--- a/apps/openstacktelemetry/app/src/test/java/org/onosproject/openstacktelemetry/config/DefaultPrometheusTelemetryConfigTest.java
+++ b/apps/openstacktelemetry/app/src/test/java/org/onosproject/openstacktelemetry/config/DefaultPrometheusTelemetryConfigTest.java
@@ -26,19 +26,19 @@
 import static org.hamcrest.MatcherAssert.assertThat;
 import static org.hamcrest.Matchers.is;
 import static org.onlab.junit.ImmutableClassChecker.assertThatClassIsImmutable;
-import static org.onosproject.openstacktelemetry.api.Constants.DEFAULT_PROMETHEUS_EXPORTER_IP;
-import static org.onosproject.openstacktelemetry.api.Constants.DEFAULT_PROMETHEUS_EXPORTER_PORT;
+import static org.onosproject.openstacktelemetry.impl.OsgiPropertyConstants.PROMETHEUS_EXPORTER_PORT_DEFAULT;
+import static org.onosproject.openstacktelemetry.impl.OsgiPropertyConstants.PROMETHEUS_EXPORTER_ADDRESS_DEFAULT;
 
 /**
  * Unit tests for DefaultPrometheusTelemetryConfig class.
  */
 public class DefaultPrometheusTelemetryConfigTest {
 
-    private static final String IP_ADDRESS_1 = DEFAULT_PROMETHEUS_EXPORTER_IP;
+    private static final String IP_ADDRESS_1 = PROMETHEUS_EXPORTER_ADDRESS_DEFAULT;
     private static final String IP_ADDRESS_2 = "10.10.1.2";
 
-    private static final int PORT_1 = DEFAULT_PROMETHEUS_EXPORTER_PORT;
-    private static final int PORT_2 = DEFAULT_PROMETHEUS_EXPORTER_PORT + 1;
+    private static final int PORT_1 = PROMETHEUS_EXPORTER_PORT_DEFAULT;
+    private static final int PORT_2 = PROMETHEUS_EXPORTER_PORT_DEFAULT + 1;
 
     private static final Map<String, Object> CONFIG_MAP_1 =
             ImmutableMap.of("key1", "value1");
diff --git a/apps/openstacktroubleshoot/BUCK b/apps/openstacktroubleshoot/BUCK
deleted file mode 100644
index b834c12..0000000
--- a/apps/openstacktroubleshoot/BUCK
+++ /dev/null
@@ -1,13 +0,0 @@
-BUNDLES = [
-    '//apps/openstacktroubleshoot/api:onos-apps-openstacktroubleshoot-api',
-    '//apps/openstacktroubleshoot/app:onos-apps-openstacktroubleshoot-app',
-]
-
-onos_app (
-    title = 'OpenStack Troubleshoot',
-    category = 'Integration',
-    url = 'http://onosproject.org',
-    included_bundles = BUNDLES,
-    description = 'SONA Openstack Troubleshoot Application.',
-    required_apps = [ 'org.onosproject.openstacknetworking' ]
-)
\ No newline at end of file
diff --git a/apps/openstacktroubleshoot/api/BUCK b/apps/openstacktroubleshoot/api/BUCK
deleted file mode 100644
index 27cd4a2..0000000
--- a/apps/openstacktroubleshoot/api/BUCK
+++ /dev/null
@@ -1,17 +0,0 @@
-COMPILE_DEPS = [
-    '//lib:CORE_DEPS',
-    '//lib:org.apache.karaf.shell.console',
-    '//cli:onos-cli',
-    '//apps/openstacknetworking/api:onos-apps-openstacknetworking-api',
-]
-
-TEST_DEPS = [
-    '//lib:TEST_ADAPTERS',
-    '//core/api:onos-api-tests',
-    '//core/common:onos-core-common-tests',
-]
-
-osgi_jar_with_tests (
-    deps = COMPILE_DEPS,
-    test_deps = TEST_DEPS,
-)
diff --git a/apps/openstacktroubleshoot/app/BUCK b/apps/openstacktroubleshoot/app/BUCK
deleted file mode 100644
index b0c072c..0000000
--- a/apps/openstacktroubleshoot/app/BUCK
+++ /dev/null
@@ -1,32 +0,0 @@
-COMPILE_DEPS = [
-    '//lib:CORE_DEPS',
-    '//lib:JACKSON',
-    '//lib:KRYO',
-    '//core/store/serializers:onos-core-serializers',
-    '//lib:org.apache.karaf.shell.console',
-    '//cli:onos-cli',
-    '//lib:javax.ws.rs-api',
-    '//utils/rest:onlab-rest',
-    '//apps/openstacknode/api:onos-apps-openstacknode-api',
-    '//apps/openstacknetworking/api:onos-apps-openstacknetworking-api',
-    '//apps/openstacktroubleshoot/api:onos-apps-openstacktroubleshoot-api',
-]
-
-TEST_DEPS = [
-    '//lib:TEST_ADAPTERS',
-    '//core/api:onos-api-tests',
-    '//core/common:onos-core-common-tests',
-    '//web/api:onos-rest-tests',
-    '//lib:TEST_REST',
-]
-
-osgi_jar_with_tests (
-    deps = COMPILE_DEPS,
-    test_deps = TEST_DEPS,
-    web_context = '/onos/openstacktroubleshoot',
-    api_title = 'OpenStack Troubleshoot API',
-    api_version = '1.0',
-    api_description = 'REST API for OpenStack Troubleshoot',
-    api_package = 'org.onosproject.openstacktroubleshoot.web',
-)
-
diff --git a/apps/openstacktroubleshoot/app/app.xml b/apps/openstacktroubleshoot/app/app.xml
deleted file mode 100644
index 8d219be..0000000
--- a/apps/openstacktroubleshoot/app/app.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-  ~ Copyright 2018-present Open Networking Foundation
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~     http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License.
-  -->
-<app name="org.onosproject.openstacktroubleshoot" origin="Open Networking Foundation" version="${project.version}"
-     category="Integration" url="https://wiki.onosproject.org/display/ONOS/SONA%3A+DC+Network+Virtualization"
-     title="OpenStack Troubleshoot App" features="${project.artifactId}"
-     apps="org.onosproject.openstacknetworking"
-     featuresRepo="mvn:${project.groupId}/${project.artifactId}/${project.version}/xml/features">
-    <description>${project.description}</description>
-    <artifact>mvn:${project.groupId}/onos-apps-openstacktroubleshoot-api/${project.version}</artifact>
-    <artifact>mvn:${project.groupId}/onos-apps-openstacktroubleshoot-app/${project.version}</artifact>
-</app>
diff --git a/apps/openstacktroubleshoot/app/features.xml b/apps/openstacktroubleshoot/app/features.xml
deleted file mode 100644
index cb56ba4..0000000
--- a/apps/openstacktroubleshoot/app/features.xml
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
-<!--
-  ~ Copyright 2018-present Open Networking Foundation
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~     http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License.
-  -->
-<features xmlns="http://karaf.apache.org/xmlns/features/v1.2.0" name="${project.artifactId}-${project.version}">
-    <feature name="${project.artifactId}" version="${project.version}"
-             description="${project.description}">
-        <feature>onos-api</feature>
-        <bundle>mvn:${project.groupId}/onos-apps-openstacktroubleshoot-api/${project.version}</bundle>
-        <bundle>mvn:${project.groupId}/onos-apps-openstacktroubleshoot-app/${project.version}</bundle>
-    </feature>
-</features>
diff --git a/apps/openstacktroubleshoot/app/src/main/java/org/onosproject/openstacktroubleshoot/cli/ActiveFloatingIpCompleter.java b/apps/openstacktroubleshoot/app/src/main/java/org/onosproject/openstacktroubleshoot/cli/ActiveFloatingIpCompleter.java
index 4687209..9d6d204 100644
--- a/apps/openstacktroubleshoot/app/src/main/java/org/onosproject/openstacktroubleshoot/cli/ActiveFloatingIpCompleter.java
+++ b/apps/openstacktroubleshoot/app/src/main/java/org/onosproject/openstacktroubleshoot/cli/ActiveFloatingIpCompleter.java
@@ -15,8 +15,11 @@
  */
 package org.onosproject.openstacktroubleshoot.cli;
 
-import org.apache.karaf.shell.console.Completer;
-import org.apache.karaf.shell.console.completer.StringsCompleter;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
+import org.apache.karaf.shell.api.console.CommandLine;
+import org.apache.karaf.shell.api.console.Completer;
+import org.apache.karaf.shell.api.console.Session;
+import org.apache.karaf.shell.support.completers.StringsCompleter;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.openstacknetworking.api.InstancePort;
 import org.onosproject.openstacknetworking.api.InstancePortService;
@@ -29,10 +32,11 @@
 /**
  * Active VM floating IP address completer.
  */
+@Service
 public class ActiveFloatingIpCompleter implements Completer {
 
     @Override
-    public int complete(String buffer, int cursor, List<String> candidates) {
+    public int complete(Session session, CommandLine commandLine, List<String> candidates) {
         StringsCompleter delegate = new StringsCompleter();
         InstancePortService service = AbstractShellCommand.get(InstancePortService.class);
         Set<String> set = service.instancePorts().stream()
@@ -44,6 +48,6 @@
         SortedSet<String> strings = delegate.getStrings();
         strings.addAll(set);
 
-        return delegate.complete(buffer, cursor, candidates);
+        return delegate.complete(session, commandLine, candidates);
     }
 }
diff --git a/apps/openstacktroubleshoot/app/src/main/java/org/onosproject/openstacktroubleshoot/cli/ActiveVmIpCompleter.java b/apps/openstacktroubleshoot/app/src/main/java/org/onosproject/openstacktroubleshoot/cli/ActiveVmIpCompleter.java
index 326b041..97dbabf 100644
--- a/apps/openstacktroubleshoot/app/src/main/java/org/onosproject/openstacktroubleshoot/cli/ActiveVmIpCompleter.java
+++ b/apps/openstacktroubleshoot/app/src/main/java/org/onosproject/openstacktroubleshoot/cli/ActiveVmIpCompleter.java
@@ -15,8 +15,11 @@
  */
 package org.onosproject.openstacktroubleshoot.cli;
 
-import org.apache.karaf.shell.console.Completer;
-import org.apache.karaf.shell.console.completer.StringsCompleter;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
+import org.apache.karaf.shell.api.console.CommandLine;
+import org.apache.karaf.shell.api.console.Completer;
+import org.apache.karaf.shell.api.console.Session;
+import org.apache.karaf.shell.support.completers.StringsCompleter;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.openstacknetworking.api.InstancePort;
 import org.onosproject.openstacknetworking.api.InstancePortService;
@@ -29,10 +32,11 @@
 /**
  * Active VM IP address completer.
  */
+@Service
 public class ActiveVmIpCompleter implements Completer {
 
     @Override
-    public int complete(String buffer, int cursor, List<String> candidates) {
+    public int complete(Session session, CommandLine commandLine, List<String> candidates) {
         StringsCompleter delegate = new StringsCompleter();
         InstancePortService service = AbstractShellCommand.get(InstancePortService.class);
         Set<String> set = service.instancePorts().stream()
@@ -43,6 +47,6 @@
         SortedSet<String> strings = delegate.getStrings();
         strings.addAll(set);
 
-        return delegate.complete(buffer, cursor, candidates);
+        return delegate.complete(session, commandLine, candidates);
     }
 }
diff --git a/apps/openstacktroubleshoot/app/src/main/java/org/onosproject/openstacktroubleshoot/cli/OpenstackEastWestProbeCommand.java b/apps/openstacktroubleshoot/app/src/main/java/org/onosproject/openstacktroubleshoot/cli/OpenstackEastWestProbeCommand.java
index 53cfb31..8d4ac94 100644
--- a/apps/openstacktroubleshoot/app/src/main/java/org/onosproject/openstacktroubleshoot/cli/OpenstackEastWestProbeCommand.java
+++ b/apps/openstacktroubleshoot/app/src/main/java/org/onosproject/openstacktroubleshoot/cli/OpenstackEastWestProbeCommand.java
@@ -16,9 +16,10 @@
 package org.onosproject.openstacktroubleshoot.cli;
 
 import com.google.common.collect.Sets;
-import org.apache.karaf.shell.commands.Argument;
-import org.apache.karaf.shell.commands.Command;
-import org.apache.karaf.shell.commands.Option;
+import org.apache.karaf.shell.api.action.Argument;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.Option;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onlab.packet.IpAddress;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.cluster.ClusterService;
@@ -44,6 +45,7 @@
 /**
  * Checks the east-west VMs connectivity.
  */
+@Service
 @Command(scope = "onos", name = "openstack-check-east-west",
         description = "Checks the east-west VMs connectivity")
 public class OpenstackEastWestProbeCommand extends AbstractShellCommand {
@@ -66,7 +68,7 @@
             groupedThreads(this.getClass().getSimpleName(), "probe-handler", log));
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         OpenstackTroubleshootService tsService = get(OpenstackTroubleshootService.class);
         InstancePortService instPortService = get(InstancePortService.class);
         MastershipService mastershipService = get(MastershipService.class);
diff --git a/apps/openstacktroubleshoot/app/src/main/java/org/onosproject/openstacktroubleshoot/cli/OpenstackNorthSouthProbeCommand.java b/apps/openstacktroubleshoot/app/src/main/java/org/onosproject/openstacktroubleshoot/cli/OpenstackNorthSouthProbeCommand.java
index 3088d82..32c32c0 100644
--- a/apps/openstacktroubleshoot/app/src/main/java/org/onosproject/openstacktroubleshoot/cli/OpenstackNorthSouthProbeCommand.java
+++ b/apps/openstacktroubleshoot/app/src/main/java/org/onosproject/openstacktroubleshoot/cli/OpenstackNorthSouthProbeCommand.java
@@ -16,9 +16,10 @@
 package org.onosproject.openstacktroubleshoot.cli;
 
 import com.google.common.collect.Sets;
-import org.apache.karaf.shell.commands.Argument;
-import org.apache.karaf.shell.commands.Command;
-import org.apache.karaf.shell.commands.Option;
+import org.apache.karaf.shell.api.action.Argument;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.Option;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.cluster.ClusterService;
 import org.onosproject.cluster.NodeId;
@@ -41,6 +42,7 @@
 /**
  * Checks the north-south VM connectivity.
  */
+@Service
 @Command(scope = "onos", name = "openstack-check-north-south",
         description = "Checks the north-south VMs connectivity")
 public class OpenstackNorthSouthProbeCommand extends AbstractShellCommand {
@@ -63,7 +65,7 @@
             groupedThreads(this.getClass().getSimpleName(), "probe-handler", log));
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         OpenstackTroubleshootService tsService = get(OpenstackTroubleshootService.class);
         InstancePortService instPortService = get(InstancePortService.class);
         OpenstackNodeService osNodeService = get(OpenstackNodeService.class);
diff --git a/apps/openstacktroubleshoot/app/src/main/java/org/onosproject/openstacktroubleshoot/cli/ResetMastershipCommand.java b/apps/openstacktroubleshoot/app/src/main/java/org/onosproject/openstacktroubleshoot/cli/ResetMastershipCommand.java
index 305304b..00a70e6 100644
--- a/apps/openstacktroubleshoot/app/src/main/java/org/onosproject/openstacktroubleshoot/cli/ResetMastershipCommand.java
+++ b/apps/openstacktroubleshoot/app/src/main/java/org/onosproject/openstacktroubleshoot/cli/ResetMastershipCommand.java
@@ -16,8 +16,9 @@
 
 package org.onosproject.openstacktroubleshoot.cli;
 
-import org.apache.karaf.shell.commands.Command;
-import org.apache.karaf.shell.commands.Option;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.Option;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.cluster.ClusterService;
 import org.onosproject.cluster.NodeId;
@@ -29,6 +30,7 @@
 /**
  * Re-configure mastership.
  */
+@Service
 @Command(scope = "onos", name = "openstack-reset-mastership",
         description = "Reconfigure the mastership")
 public class ResetMastershipCommand extends AbstractShellCommand {
@@ -44,7 +46,7 @@
     private boolean isBalance = false;
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         MastershipAdminService mastershipService = get(MastershipAdminService.class);
         ClusterService clusterService = get(ClusterService.class);
         DeviceService deviceService = get(DeviceService.class);
diff --git a/apps/openstacktroubleshoot/app/src/main/java/org/onosproject/openstacktroubleshoot/impl/OpenstackTroubleshootManager.java b/apps/openstacktroubleshoot/app/src/main/java/org/onosproject/openstacktroubleshoot/impl/OpenstackTroubleshootManager.java
index 1b1cdf8..c2f4b22 100644
--- a/apps/openstacktroubleshoot/app/src/main/java/org/onosproject/openstacktroubleshoot/impl/OpenstackTroubleshootManager.java
+++ b/apps/openstacktroubleshoot/app/src/main/java/org/onosproject/openstacktroubleshoot/impl/OpenstackTroubleshootManager.java
@@ -16,12 +16,6 @@
 package org.onosproject.openstacktroubleshoot.impl;
 
 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.onlab.packet.DeserializationException;
 import org.onlab.packet.Ethernet;
 import org.onlab.packet.ICMP;
@@ -65,6 +59,11 @@
 import org.onosproject.store.service.ConsistentMap;
 import org.onosproject.store.service.Serializer;
 import org.onosproject.store.service.StorageService;
+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;
 
@@ -100,8 +99,7 @@
 /**
  * Implementation of openstack troubleshoot app.
  */
-@Component(immediate = true)
-@Service
+@Component(immediate = true, service = OpenstackTroubleshootService.class)
 public class OpenstackTroubleshootManager implements OpenstackTroubleshootService {
 
     private final Logger log = LoggerFactory.getLogger(getClass());
@@ -120,37 +118,37 @@
 
     private static final String ICMP_COUNTER_NAME = "icmp-id-counter";
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected CoreService coreService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected PacketService packetService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected FlowRuleService flowRuleService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected StorageService storageService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected LeadershipService leadershipService;
 
-    @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 OpenstackNodeService osNodeService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected OpenstackNetworkService osNetworkService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected OpenstackFlowRuleService osFlowRuleService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected InstancePortService instancePortService;
 
     private final ExecutorService eventExecutor = newSingleThreadScheduledExecutor(
diff --git a/apps/openstacktroubleshoot/app/src/main/resources/OSGI-INF/blueprint/shell-config.xml b/apps/openstacktroubleshoot/app/src/main/resources/OSGI-INF/blueprint/shell-config.xml
deleted file mode 100644
index 791a58d..0000000
--- a/apps/openstacktroubleshoot/app/src/main/resources/OSGI-INF/blueprint/shell-config.xml
+++ /dev/null
@@ -1,37 +0,0 @@
-<!--
-~ Copyright 2018-present Open Networking Foundation
-~
-~ Licensed under the Apache License, Version 2.0 (the "License");
-~ you may not use this file except in compliance with the License.
-~ You may obtain a copy of the License at
-~
-~     http://www.apache.org/licenses/LICENSE-2.0
-~
-~ Unless required by applicable law or agreed to in writing, software
-~ distributed under the License is distributed on an "AS IS" BASIS,
-~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-~ See the License for the specific language governing permissions and
-~ limitations under the License.
--->
-<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0">
-    <command-bundle xmlns="http://karaf.apache.org/xmlns/shell/v1.1.0">
-        <command>
-            <action class="org.onosproject.openstacktroubleshoot.cli.OpenstackEastWestProbeCommand"/>
-            <completers>
-                <ref component-id="activeVmIpCompleter"/>
-            </completers>
-        </command>
-        <command>
-            <action class="org.onosproject.openstacktroubleshoot.cli.OpenstackNorthSouthProbeCommand"/>
-            <completers>
-                <ref component-id="activeFloatingIpCompleter"/>
-            </completers>
-        </command>
-        <command>
-            <action class="org.onosproject.openstacktroubleshoot.cli.ResetMastershipCommand"/>
-        </command>
-    </command-bundle>
-
-    <bean id="activeVmIpCompleter" class="org.onosproject.openstacktroubleshoot.cli.ActiveVmIpCompleter"/>
-    <bean id="activeFloatingIpCompleter" class="org.onosproject.openstacktroubleshoot.cli.ActiveFloatingIpCompleter"/>
-</blueprint>
diff --git a/apps/openstackvtap/BUCK b/apps/openstackvtap/BUCK
deleted file mode 100644
index e124259..0000000
--- a/apps/openstackvtap/BUCK
+++ /dev/null
@@ -1,15 +0,0 @@
-BUNDLES = [
-    '//apps/openstackvtap/api:onos-apps-openstackvtap-api',
-    '//apps/openstackvtap/app:onos-apps-openstackvtap-app',
-]
-
-onos_app (
-    title = 'Openstack Vtap Application',
-    category = 'Integration',
-    url = 'https://wiki.onosproject.org/display/ONOS/SONA%3A+DC+Network+Virtualization',
-    included_bundles = BUNDLES,
-    description = 'SONA Openstack Vtap Application.',
-    required_apps = [
-        'org.onosproject.openstacknetworking',
-    ]
-)
diff --git a/apps/openstackvtap/api/BUCK b/apps/openstackvtap/api/BUCK
deleted file mode 100644
index 9fde222..0000000
--- a/apps/openstackvtap/api/BUCK
+++ /dev/null
@@ -1,14 +0,0 @@
-COMPILE_DEPS = [
-    '//lib:CORE_DEPS',
-]
-
-TEST_DEPS = [
-    '//lib:TEST_ADAPTERS',
-    '//core/api:onos-api-tests',
-    '//core/common:onos-core-common-tests',
-]
-
-osgi_jar_with_tests (
-    deps = COMPILE_DEPS,
-    test_deps = TEST_DEPS
-)
diff --git a/apps/openstackvtap/app/BUCK b/apps/openstackvtap/app/BUCK
deleted file mode 100644
index 3656f6c..0000000
--- a/apps/openstackvtap/app/BUCK
+++ /dev/null
@@ -1,32 +0,0 @@
-COMPILE_DEPS = [
-    '//lib:CORE_DEPS',
-    '//lib:JACKSON',
-    '//lib:KRYO',
-    '//core/store/serializers:onos-core-serializers',
-    '//lib:javax.ws.rs-api',
-    '//utils/rest:onlab-rest',
-    '//lib:jersey-client',
-    '//cli:onos-cli',
-    '//lib:org.apache.karaf.shell.console',
-    '//apps/openstacknetworking/api:onos-apps-openstacknetworking-api',
-    '//apps/openstacknode/api:onos-apps-openstacknode-api',
-    '//apps/openstackvtap/api:onos-apps-openstackvtap-api',
-]
-
-TEST_DEPS = [
-    '//lib:TEST_ADAPTERS',
-    '//core/api:onos-api-tests',
-    '//core/common:onos-core-common-tests',
-    '//web/api:onos-rest-tests',
-    '//lib:TEST_REST',
-]
-
-osgi_jar_with_tests (
-    deps = COMPILE_DEPS,
-    test_deps = TEST_DEPS,
-    web_context = '/onos/openstackvtap',
-    api_title = 'OpenStack Vtap REST API',
-    api_version = '1.0',
-    api_description = 'OpenStack Vtap REST API',
-    api_package = 'org.onosproject.openstackvtap.web',
-)
diff --git a/apps/openstackvtap/app/app.xml b/apps/openstackvtap/app/app.xml
deleted file mode 100644
index b077858..0000000
--- a/apps/openstackvtap/app/app.xml
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-  ~ Copyright 2018-present Open Networking Foundation
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~     http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License.
-  -->
-<app name="org.onosproject.openstackvtap" origin="Open Networking Foundation"
-     version="${project.version}" category="Utility" title="Openstack Vtap App"
-     features="${project.artifactId}" apps="org.onosproject.openstacknetworking"
-     featuresRepo="mvn:${project.groupId}/${project.artifactId}/${project.version}/xml/features">
-    <description>${project.description}</description>
-    <artifact>mvn:${project.groupId}/onos-apps-openstackvtap-api/${project.version}</artifact>
-    <artifact>mvn:${project.groupId}/onos-apps-openstackvtap-app/${project.version}</artifact>
-</app>
diff --git a/apps/openstackvtap/app/features.xml b/apps/openstackvtap/app/features.xml
deleted file mode 100644
index 0e8d5c6..0000000
--- a/apps/openstackvtap/app/features.xml
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
-<!--
-  ~ Copyright 2018-present Open Networking Foundation
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~     http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License.
-  -->
-<features xmlns="http://karaf.apache.org/xmlns/features/v1.2.0" name="${project.artifactId}-${project.version}">
-    <feature name="${project.artifactId}" version="${project.version}"
-             description="${project.description}">
-        <feature>onos-api</feature>
-        <bundle>mvn:${project.groupId}/onos-apps-openstackvtap-api/${project.version}</bundle>
-        <bundle>mvn:${project.groupId}/onos-apps-openstackvtap-app/${project.version}</bundle>
-    </feature>
-</features>
diff --git a/apps/openstackvtap/app/src/main/java/org/onosproject/openstackvtap/cli/OpenstackVtapAddCommand.java b/apps/openstackvtap/app/src/main/java/org/onosproject/openstackvtap/cli/OpenstackVtapAddCommand.java
index 5272083..9480346 100644
--- a/apps/openstackvtap/app/src/main/java/org/onosproject/openstackvtap/cli/OpenstackVtapAddCommand.java
+++ b/apps/openstackvtap/app/src/main/java/org/onosproject/openstackvtap/cli/OpenstackVtapAddCommand.java
@@ -15,8 +15,9 @@
  */
 package org.onosproject.openstackvtap.cli;
 
-import org.apache.karaf.shell.commands.Argument;
-import org.apache.karaf.shell.commands.Command;
+import org.apache.karaf.shell.api.action.Argument;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onlab.packet.IpPrefix;
 import org.onlab.packet.TpPort;
 import org.onosproject.cli.AbstractShellCommand;
@@ -30,6 +31,7 @@
 /**
  * Adds a openstack vtap rule.
  */
+@Service
 @Command(scope = "onos", name = "openstack-vtap-add",
         description = "OpenstackVtap activate")
 public class OpenstackVtapAddCommand extends AbstractShellCommand {
@@ -68,10 +70,11 @@
     String vtapTypeStr = "all";
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         DefaultOpenstackVtapCriterion.Builder vtapCriterionBuilder = DefaultOpenstackVtapCriterion.builder();
         if (makeCriterion(vtapCriterionBuilder)) {
             OpenstackVtap.Type type = getVtapTypeFromString(vtapTypeStr);
+
             if (type == null) {
                 print("Invalid vtap type");
                 return;
diff --git a/apps/openstackvtap/app/src/main/java/org/onosproject/openstackvtap/cli/OpenstackVtapDeleteCommand.java b/apps/openstackvtap/app/src/main/java/org/onosproject/openstackvtap/cli/OpenstackVtapDeleteCommand.java
index e54f6ac..e2d37f7 100644
--- a/apps/openstackvtap/app/src/main/java/org/onosproject/openstackvtap/cli/OpenstackVtapDeleteCommand.java
+++ b/apps/openstackvtap/app/src/main/java/org/onosproject/openstackvtap/cli/OpenstackVtapDeleteCommand.java
@@ -14,9 +14,10 @@
  * limitations under the License.
  */
 package org.onosproject.openstackvtap.cli;
-import org.apache.karaf.shell.commands.Command;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.cli.AbstractShellCommand;
-import org.apache.karaf.shell.commands.Argument;
+import org.apache.karaf.shell.api.action.Argument;
 import org.onosproject.openstackvtap.api.OpenstackVtap;
 import org.onosproject.openstackvtap.api.OpenstackVtapAdminService;
 import org.onosproject.openstackvtap.api.OpenstackVtapId;
@@ -24,6 +25,7 @@
 /**
  * Delete a openstack vtap rule from the existing vtaps.
  */
+@Service
 @Command(scope = "onos", name = "openstack-vtap-del",
         description = "OpenstackVtap deactivate")
 public class OpenstackVtapDeleteCommand extends AbstractShellCommand {
@@ -35,7 +37,7 @@
     String vtapId = "";
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         OpenstackVtap vtap = vtapService.removeVtap(OpenstackVtapId.vtapId(vtapId));
         if (vtap != null) {
             print("Removed OpenstackVtap with id { %s }", vtap.id().toString());
diff --git a/apps/openstackvtap/app/src/main/java/org/onosproject/openstackvtap/cli/OpenstackVtapListCommand.java b/apps/openstackvtap/app/src/main/java/org/onosproject/openstackvtap/cli/OpenstackVtapListCommand.java
index a0989b33d..089f850 100644
--- a/apps/openstackvtap/app/src/main/java/org/onosproject/openstackvtap/cli/OpenstackVtapListCommand.java
+++ b/apps/openstackvtap/app/src/main/java/org/onosproject/openstackvtap/cli/OpenstackVtapListCommand.java
@@ -16,8 +16,9 @@
 package org.onosproject.openstackvtap.cli;
 
 import com.google.common.collect.ImmutableSet;
-import org.apache.karaf.shell.commands.Argument;
-import org.apache.karaf.shell.commands.Command;
+import org.apache.karaf.shell.api.action.Argument;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.net.DeviceId;
 import org.onosproject.openstacknode.api.OpenstackNode;
@@ -34,6 +35,7 @@
 /**
  * Lists openstack vtap rules.
  */
+@Service
 @Command(scope = "onos", name = "openstack-vtap-list",
         description = "OpenstackVtap list")
 public class OpenstackVtapListCommand extends AbstractShellCommand {
@@ -51,7 +53,7 @@
     private static final String FORMAT_RX_NODES = "   rx openstack nodes: %s";
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         OpenstackVtap.Type type = getVtapTypeFromString(vtapType);
         Set<OpenstackVtap> openstackVtaps = vtapService.getVtaps(type);
         for (OpenstackVtap vtap : openstackVtaps) {
diff --git a/apps/openstackvtap/app/src/main/java/org/onosproject/openstackvtap/cli/OpenstackVtapNetworkListCommand.java b/apps/openstackvtap/app/src/main/java/org/onosproject/openstackvtap/cli/OpenstackVtapNetworkListCommand.java
index 68a94f8..225582b 100644
--- a/apps/openstackvtap/app/src/main/java/org/onosproject/openstackvtap/cli/OpenstackVtapNetworkListCommand.java
+++ b/apps/openstackvtap/app/src/main/java/org/onosproject/openstackvtap/cli/OpenstackVtapNetworkListCommand.java
@@ -16,7 +16,8 @@
 package org.onosproject.openstackvtap.cli;
 
 import com.google.common.collect.ImmutableSet;
-import org.apache.karaf.shell.commands.Command;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.net.DeviceId;
 import org.onosproject.openstacknode.api.OpenstackNode;
@@ -31,6 +32,7 @@
 /**
  * Lists openstack vtap networks.
  */
+@Service
 @Command(scope = "onos", name = "openstack-vtap-network-list",
         description = "OpenstackVtap network list")
 public class OpenstackVtapNetworkListCommand extends AbstractShellCommand {
@@ -42,7 +44,7 @@
     private static final String FORMAT_NODES = "   openstack nodes: %s";
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         OpenstackVtapNetwork vtapNetwork = osVtapAdminService.getVtapNetwork();
         if (vtapNetwork != null) {
             print(FORMAT,
diff --git a/apps/openstackvtap/app/src/main/java/org/onosproject/openstackvtap/cli/ProtocolTypeCompleter.java b/apps/openstackvtap/app/src/main/java/org/onosproject/openstackvtap/cli/ProtocolTypeCompleter.java
index 3bfcf2b..49c676d 100644
--- a/apps/openstackvtap/app/src/main/java/org/onosproject/openstackvtap/cli/ProtocolTypeCompleter.java
+++ b/apps/openstackvtap/app/src/main/java/org/onosproject/openstackvtap/cli/ProtocolTypeCompleter.java
@@ -16,6 +16,7 @@
 package org.onosproject.openstackvtap.cli;
 
 import com.google.common.collect.Lists;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.cli.AbstractChoicesCompleter;
 
 import java.util.List;
@@ -23,6 +24,7 @@
 /**
  * IP protocol type completer.
  */
+@Service
 public class ProtocolTypeCompleter extends AbstractChoicesCompleter {
 
     @Override
diff --git a/apps/openstackvtap/app/src/main/java/org/onosproject/openstackvtap/cli/VmIpCompleter.java b/apps/openstackvtap/app/src/main/java/org/onosproject/openstackvtap/cli/VmIpCompleter.java
index 3ee28fe..ce55d01 100644
--- a/apps/openstackvtap/app/src/main/java/org/onosproject/openstackvtap/cli/VmIpCompleter.java
+++ b/apps/openstackvtap/app/src/main/java/org/onosproject/openstackvtap/cli/VmIpCompleter.java
@@ -15,8 +15,11 @@
  */
 package org.onosproject.openstackvtap.cli;
 
-import org.apache.karaf.shell.console.Completer;
-import org.apache.karaf.shell.console.completer.StringsCompleter;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
+import org.apache.karaf.shell.api.console.CommandLine;
+import org.apache.karaf.shell.api.console.Completer;
+import org.apache.karaf.shell.api.console.Session;
+import org.apache.karaf.shell.support.completers.StringsCompleter;
 import org.onlab.packet.IpAddress;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.net.Host;
@@ -29,12 +32,13 @@
 /**
  * VM IP completer.
  */
+@Service
 public class VmIpCompleter implements Completer {
 
     private static final String CIDR = "/32";
 
     @Override
-    public int complete(String buffer, int cursor, List<String> candidates) {
+    public int complete(Session session, CommandLine commandLine, List<String> candidates) {
         // Delegate string completer
         StringsCompleter delegate = new StringsCompleter();
 
@@ -47,6 +51,6 @@
             }
         }
 
-        return delegate.complete(buffer, cursor, candidates);
+        return delegate.complete(session, commandLine, candidates);
     }
 }
diff --git a/apps/openstackvtap/app/src/main/java/org/onosproject/openstackvtap/cli/VtapIdCompleter.java b/apps/openstackvtap/app/src/main/java/org/onosproject/openstackvtap/cli/VtapIdCompleter.java
index dad6e8e..ba834e7 100644
--- a/apps/openstackvtap/app/src/main/java/org/onosproject/openstackvtap/cli/VtapIdCompleter.java
+++ b/apps/openstackvtap/app/src/main/java/org/onosproject/openstackvtap/cli/VtapIdCompleter.java
@@ -15,8 +15,11 @@
  */
 package org.onosproject.openstackvtap.cli;
 
-import org.apache.karaf.shell.console.Completer;
-import org.apache.karaf.shell.console.completer.StringsCompleter;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
+import org.apache.karaf.shell.api.console.CommandLine;
+import org.apache.karaf.shell.api.console.Completer;
+import org.apache.karaf.shell.api.console.Session;
+import org.apache.karaf.shell.support.completers.StringsCompleter;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.openstackvtap.api.OpenstackVtap;
 import org.onosproject.openstackvtap.api.OpenstackVtapService;
@@ -29,12 +32,13 @@
 /**
  * Vtap ID completer.
  */
+@Service
 public class VtapIdCompleter implements Completer {
 
     private static final String VTAP_TYPE = "any";
 
     @Override
-    public int complete(String buffer, int cursor, List<String> candidates) {
+    public int complete(Session session, CommandLine commandLine, List<String> candidates) {
 
         OpenstackVtap.Type type = getVtapTypeFromString(VTAP_TYPE);
 
@@ -48,6 +52,6 @@
             strings.add(t.id().toString());
         });
 
-        return delegate.complete(buffer, cursor, candidates);
+        return delegate.complete(session, commandLine, candidates);
     }
 }
diff --git a/apps/openstackvtap/app/src/main/java/org/onosproject/openstackvtap/cli/VtapTypeCompleter.java b/apps/openstackvtap/app/src/main/java/org/onosproject/openstackvtap/cli/VtapTypeCompleter.java
index c77c913..50ab3d9 100644
--- a/apps/openstackvtap/app/src/main/java/org/onosproject/openstackvtap/cli/VtapTypeCompleter.java
+++ b/apps/openstackvtap/app/src/main/java/org/onosproject/openstackvtap/cli/VtapTypeCompleter.java
@@ -16,6 +16,7 @@
 package org.onosproject.openstackvtap.cli;
 
 import com.google.common.collect.Lists;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.cli.AbstractChoicesCompleter;
 
 import java.util.List;
@@ -23,6 +24,7 @@
 /**
  * Vtap type completer.
  */
+@Service
 public class VtapTypeCompleter extends AbstractChoicesCompleter {
 
     @Override
diff --git a/apps/openstackvtap/app/src/main/java/org/onosproject/openstackvtap/gui/OpenstackVtapUI.java b/apps/openstackvtap/app/src/main/java/org/onosproject/openstackvtap/gui/OpenstackVtapUI.java
index c68c338..e2ebf3a 100644
--- a/apps/openstackvtap/app/src/main/java/org/onosproject/openstackvtap/gui/OpenstackVtapUI.java
+++ b/apps/openstackvtap/app/src/main/java/org/onosproject/openstackvtap/gui/OpenstackVtapUI.java
@@ -16,18 +16,17 @@
 package org.onosproject.openstackvtap.gui;
 
 import com.google.common.collect.ImmutableList;
-import org.apache.felix.scr.annotations.Component;
-import org.apache.felix.scr.annotations.Service;
-import org.apache.felix.scr.annotations.Reference;
-import org.apache.felix.scr.annotations.Activate;
-import org.apache.felix.scr.annotations.Deactivate;
-import org.apache.felix.scr.annotations.ReferenceCardinality;
 import org.onosproject.ui.UiExtensionService;
 import org.onosproject.ui.UiMessageHandlerFactory;
 import org.onosproject.ui.UiTopoOverlayFactory;
 import org.onosproject.ui.UiView;
 import org.onosproject.ui.UiViewHidden;
 import org.onosproject.ui.UiExtension;
+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;
 
@@ -36,8 +35,7 @@
 /**
  * Mechanism to stream data to the GUI.
  */
-@Component(immediate = true, enabled = true)
-@Service(value = OpenstackVtapUI.class)
+@Component(immediate = true, service = {OpenstackVtapUI.class})
 public class OpenstackVtapUI {
     private static final String OPENSTACK_VTAP_ID = "openstackvtap";
     private static final String RESOURCE_PATH = "gui";
@@ -45,7 +43,7 @@
 
     private final Logger log = LoggerFactory.getLogger(getClass());
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected UiExtensionService uiExtensionService;
 
     // Factory for UI message handlers
diff --git a/apps/openstackvtap/app/src/main/java/org/onosproject/openstackvtap/impl/DistributedOpenstackVtapStore.java b/apps/openstackvtap/app/src/main/java/org/onosproject/openstackvtap/impl/DistributedOpenstackVtapStore.java
index 9f2ee12..0f955e5 100644
--- a/apps/openstackvtap/app/src/main/java/org/onosproject/openstackvtap/impl/DistributedOpenstackVtapStore.java
+++ b/apps/openstackvtap/app/src/main/java/org/onosproject/openstackvtap/impl/DistributedOpenstackVtapStore.java
@@ -18,12 +18,6 @@
 import com.google.common.collect.ImmutableSet;
 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.onlab.util.KryoNamespace;
 import org.onosproject.net.DefaultAnnotations;
 import org.onosproject.net.DeviceId;
@@ -44,6 +38,11 @@
 import org.onosproject.store.service.Serializer;
 import org.onosproject.store.service.StorageService;
 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.util.Comparator;
@@ -64,15 +63,14 @@
 /**
  * Manages the inventory of openstack vtap and openstack vtap network using a {@code ConsistentMap}.
  */
-@Component(immediate = true)
-@Service
+@Component(immediate = true, service = OpenstackVtapStore.class)
 public class DistributedOpenstackVtapStore
         extends AbstractStore<OpenstackVtapEvent, OpenstackVtapStoreDelegate>
         implements OpenstackVtapStore {
 
     private final Logger log = getLogger(getClass());
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected StorageService storageService;
 
     private ConsistentMap<OpenstackVtapId, DefaultOpenstackVtap> vtapConsistentMap;
diff --git a/apps/openstackvtap/app/src/main/java/org/onosproject/openstackvtap/impl/OpenstackVtapManager.java b/apps/openstackvtap/app/src/main/java/org/onosproject/openstackvtap/impl/OpenstackVtapManager.java
index 4ea817c..439b084 100644
--- a/apps/openstackvtap/app/src/main/java/org/onosproject/openstackvtap/impl/OpenstackVtapManager.java
+++ b/apps/openstackvtap/app/src/main/java/org/onosproject/openstackvtap/impl/OpenstackVtapManager.java
@@ -19,14 +19,6 @@
 import com.google.common.collect.ImmutableSet;
 import com.google.common.collect.Lists;
 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.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.packet.IpAddress;
 import org.onlab.packet.IpPrefix;
 import org.onlab.util.Tools;
@@ -90,6 +82,12 @@
 import org.onosproject.openstackvtap.api.OpenstackVtapStore;
 import org.onosproject.openstackvtap.api.OpenstackVtapStoreDelegate;
 import org.osgi.service.component.ComponentContext;
+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.Dictionary;
@@ -125,6 +123,8 @@
 import static org.onosproject.openstacknode.api.Constants.INTEGRATION_BRIDGE;
 import static org.onosproject.openstacknode.api.NodeState.COMPLETE;
 import static org.onosproject.openstacknode.api.OpenstackNode.NodeType.COMPUTE;
+import static org.onosproject.openstackvtap.impl.OsgiPropertyConstants.TUNNEL_NICIRA;
+import static org.onosproject.openstackvtap.impl.OsgiPropertyConstants.TUNNEL_NICRA_DEFAULT;
 import static org.onosproject.openstackvtap.util.OpenstackVtapUtil.containsIp;
 import static org.onosproject.openstackvtap.util.OpenstackVtapUtil.dumpStackTrace;
 import static org.onosproject.openstackvtap.util.OpenstackVtapUtil.getGroupKey;
@@ -137,48 +137,52 @@
 /**
  * Provides implementation of the openstack vtap and openstack vtap network APIs.
  */
-@Component(immediate = true)
-@Service
+@Component(
+    immediate = true,
+    service = { OpenstackVtapService.class, OpenstackVtapAdminService.class },
+    property = {
+        TUNNEL_NICIRA + ":Boolean=" + TUNNEL_NICRA_DEFAULT
+    }
+)
 public class OpenstackVtapManager
         extends AbstractListenerManager<OpenstackVtapEvent, OpenstackVtapListener>
         implements OpenstackVtapService, OpenstackVtapAdminService {
 
     private final Logger log = getLogger(getClass());
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected CoreService coreService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected ClusterService clusterService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected LeadershipService leadershipService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected FlowRuleService flowRuleService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected GroupService groupService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected DeviceService deviceService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected OpenstackNodeService osNodeService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
+
     protected HostService hostService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected OpenstackVtapStore store;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected ComponentConfigService componentConfigService;
 
-    private static final boolean DEFAULT_TUNNEL_NICRA = false;
-    @Property(name = TUNNEL_NICIRA, boolValue = DEFAULT_TUNNEL_NICRA,
-            label = "Use nicra extension for tunneling")
-    private boolean tunnelNicira = DEFAULT_TUNNEL_NICRA;
+    /** Use nicra extension for tunneling. */
+    private boolean tunnelNicira = TUNNEL_NICRA_DEFAULT;
 
     public static final String APP_ID = "org.onosproject.openstackvtap";
     public static final String VTAP_DESC_NULL = "vtap field %s cannot be null";
@@ -210,7 +214,6 @@
                     IpPrefix.valueOf(IpAddress.valueOf("0.0.0.0"), 0);
     private static final String TABLE_EXTENSION = "table";
     private static final String TUNNEL_DST_EXTENSION = "tunnelDst";
-    private static final String TUNNEL_NICIRA = "tunnelNicira";
 
     private static final int VTAP_NETWORK_KEY = 0;
 
diff --git a/apps/openstackvtap/app/src/main/java/org/onosproject/openstackvtap/impl/OsgiPropertyConstants.java b/apps/openstackvtap/app/src/main/java/org/onosproject/openstackvtap/impl/OsgiPropertyConstants.java
new file mode 100644
index 0000000..bc6f5ed
--- /dev/null
+++ b/apps/openstackvtap/app/src/main/java/org/onosproject/openstackvtap/impl/OsgiPropertyConstants.java
@@ -0,0 +1,28 @@
+/*
+ * Copyright 2018-present Open Networking Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.onosproject.openstackvtap.impl;
+
+/**
+ * Name/Value constants for properties.
+ */
+public final class OsgiPropertyConstants {
+    private OsgiPropertyConstants() {
+    }
+
+    static final String TUNNEL_NICIRA = "tunnelNicira";
+    static final boolean TUNNEL_NICRA_DEFAULT = false;
+}
diff --git a/apps/openstackvtap/app/src/main/java/org/onosproject/openstackvtap/web/OpenstackVtapNetworkCodecRegister.java b/apps/openstackvtap/app/src/main/java/org/onosproject/openstackvtap/web/OpenstackVtapNetworkCodecRegister.java
index 7ac689a..509a286 100644
--- a/apps/openstackvtap/app/src/main/java/org/onosproject/openstackvtap/web/OpenstackVtapNetworkCodecRegister.java
+++ b/apps/openstackvtap/app/src/main/java/org/onosproject/openstackvtap/web/OpenstackVtapNetworkCodecRegister.java
@@ -15,26 +15,30 @@
  */
 package org.onosproject.openstackvtap.web;
 
-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.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.codec.CodecService;
 import org.onosproject.openstackvtap.api.OpenstackVtapNetwork;
 import org.onosproject.openstackvtap.codec.OpenstackVtapNetworkCodec;
+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 static org.slf4j.LoggerFactory.getLogger;
 
 /**
  * Implementation of the JSON codec brokering service for openstack vtap network.
  */
+@Service
 @Component(immediate = true)
 public class OpenstackVtapNetworkCodecRegister {
 
     private final org.slf4j.Logger log = getLogger(getClass());
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected CodecService codecService;
 
     @Activate
diff --git a/apps/openstackvtap/app/src/main/resources/OSGI-INF/blueprint/shell-config.xml b/apps/openstackvtap/app/src/main/resources/OSGI-INF/blueprint/shell-config.xml
deleted file mode 100644
index 7fd8ccf..0000000
--- a/apps/openstackvtap/app/src/main/resources/OSGI-INF/blueprint/shell-config.xml
+++ /dev/null
@@ -1,54 +0,0 @@
-<!--
-+  ~ Copyright 2018-present Open Networking Foundation
-+  ~
-+  ~ Licensed under the Apache License, Version 2.0 (the "License");
-+  ~ you may not use this file except in compliance with the License.
-+  ~ You may obtain a copy of the License at
-+  ~
-+  ~     http://www.apache.org/licenses/LICENSE-2.0
-+  ~
-+  ~ Unless required by applicable law or agreed to in writing, software
-+  ~ distributed under the License is distributed on an "AS IS" BASIS,
-+  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+  ~ See the License for the specific language governing permissions and
-+  ~ limitations under the License.
-+  -->
-<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0">
-    <command-bundle xmlns="http://karaf.apache.org/xmlns/shell/v1.1.0">
-        <command>
-            <action class="org.onosproject.openstackvtap.cli.OpenstackVtapAddCommand" />
-            <completers>
-                <ref component-id="vmIpCompleter"/>
-                <ref component-id="vmIpCompleter"/>
-                <ref component-id="protocolTypeCompleter"/>
-                <null/>
-                <null/>
-                <ref component-id="vtapTypeCompleter"/>
-            </completers>
-        </command>
-
-        <command>
-            <action class="org.onosproject.openstackvtap.cli.OpenstackVtapListCommand" />
-            <completers>
-                <ref component-id="vtapTypeCompleter"/>
-            </completers>
-        </command>
-
-        <command>
-            <action class="org.onosproject.openstackvtap.cli.OpenstackVtapDeleteCommand" />
-            <completers>
-                <ref component-id="vtapIdCompleter"/>
-            </completers>
-        </command>
-
-        <command>
-            <action class="org.onosproject.openstackvtap.cli.OpenstackVtapNetworkListCommand" />
-        </command>
-    </command-bundle>
-
-    <bean id="vtapTypeCompleter" class="org.onosproject.openstackvtap.cli.VtapTypeCompleter"/>
-    <bean id="protocolTypeCompleter" class="org.onosproject.openstackvtap.cli.ProtocolTypeCompleter"/>
-    <bean id="vmIpCompleter" class="org.onosproject.openstackvtap.cli.VmIpCompleter"/>
-    <bean id="vtapIdCompleter" class="org.onosproject.openstackvtap.cli.VtapIdCompleter"/>
-
-</blueprint>
diff --git a/apps/optical-model/BUCK b/apps/optical-model/BUCK
deleted file mode 100644
index de3def8..0000000
--- a/apps/optical-model/BUCK
+++ /dev/null
@@ -1,29 +0,0 @@
-COMPILE_DEPS = [
-    '//lib:CORE_DEPS',
-    '//lib:JACKSON',
-    '//incubator/api:onos-incubator-api',
-    '//cli:onos-cli',
-    '//lib:org.apache.karaf.shell.console',
-]
-
-TEST_DEPS = [
-    '//lib:TEST_ADAPTERS',
-]
-
-
-osgi_jar_with_tests (
-    deps = COMPILE_DEPS,
-    test_deps = TEST_DEPS,
-)
-
-onos_app (
-    app_name = 'org.onosproject.optical-model',
-    # Is there a way to change BUCK target name properly?
-    #name = 'onos-optical-model',
-    feature_coords = 'org.onosproject:onos-optical-model:%s' % (ONOS_VERSION),
-    title = 'Optical Network Model',
-    category = 'Optical',
-    url = 'https://wiki.onosproject.org/x/C4m',
-    description = 'ONOS optical information model.',
-    required_apps = [ ],
-)
diff --git a/apps/optical-model/BUILD b/apps/optical-model/BUILD
index 61a839b..9ba6cda 100644
--- a/apps/optical-model/BUILD
+++ b/apps/optical-model/BUILD
@@ -5,6 +5,7 @@
 ]
 
 osgi_jar_with_tests(
+    karaf_command_packages = ["org.onosproject.net.optical.cli"],
     test_deps = TEST_ADAPTERS,
     deps = COMPILE_DEPS,
 )
diff --git a/apps/optical-model/features.xml b/apps/optical-model/features.xml
deleted file mode 100644
index 63bbdaa..0000000
--- a/apps/optical-model/features.xml
+++ /dev/null
@@ -1,23 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
-<!--
-  ~ Copyright 2016-present Open Networking Foundation
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~     http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License.
-  -->
-<features xmlns="http://karaf.apache.org/xmlns/features/v1.2.1" name="${project.artifactId}-${project.version}">
-    <feature name="${project.artifactId}" version="${project.version}"
-             description="${project.description}">
-        <feature>onos-api</feature>
-        <bundle>mvn:${project.groupId}/${project.artifactId}/${project.version}</bundle>
-    </feature>
-</features>
diff --git a/apps/optical-model/src/main/java/org/onosproject/net/optical/cli/AddOpticalIntentCommand.java b/apps/optical-model/src/main/java/org/onosproject/net/optical/cli/AddOpticalIntentCommand.java
index 07f9cc1..833b20d 100644
--- a/apps/optical-model/src/main/java/org/onosproject/net/optical/cli/AddOpticalIntentCommand.java
+++ b/apps/optical-model/src/main/java/org/onosproject/net/optical/cli/AddOpticalIntentCommand.java
@@ -16,10 +16,11 @@
 package org.onosproject.net.optical.cli;
 
 import com.google.common.collect.ImmutableMap;
-import org.apache.karaf.shell.commands.Argument;
-import org.apache.karaf.shell.commands.Command;
-import org.apache.karaf.shell.commands.Option;
-import org.onosproject.cli.app.AllApplicationNamesCompleter;
+import org.apache.karaf.shell.api.action.Argument;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.Completion;
+import org.apache.karaf.shell.api.action.Option;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.cli.net.ConnectPointCompleter;
 import org.onosproject.cli.net.ConnectivityIntentCommand;
 import org.onosproject.net.ChannelSpacing;
@@ -42,6 +43,7 @@
 /**
  * Installs optical connectivity or circuit intents, depending on given port types.
  */
+@Service
 @Command(scope = "onos", name = "add-optical-intent",
         description = "Installs optical connectivity intent")
 public class AddOpticalIntentCommand extends ConnectivityIntentCommand {
@@ -63,22 +65,16 @@
             .put(CH_100, ChannelSpacing.CHL_100GHZ)
             .build();
 
-    // OSGi workaround
-    @SuppressWarnings("unused")
-    private ConnectPointCompleter cpCompleter;
-
-    // OSGi workaround
-    @SuppressWarnings("unused")
-    private AllApplicationNamesCompleter appCompleter;
-
     @Argument(index = 0, name = "ingress",
             description = "Ingress Device/Port Description",
             required = true, multiValued = false)
+    @Completion(ConnectPointCompleter.class)
     String ingressString = "";
 
     @Argument(index = 1, name = "egress",
             description = "Egress Device/Port Description",
             required = true, multiValued = false)
+    @Completion(ConnectPointCompleter.class)
     String egressString = "";
 
     @Option(name = "-b", aliases = "--bidirectional",
@@ -142,7 +138,7 @@
 
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         IntentService service = get(IntentService.class);
         DeviceService deviceService = get(DeviceService.class);
         ConnectPoint ingress = createConnectPoint(ingressString);
diff --git a/apps/optical-model/src/main/java/org/onosproject/net/optical/cli/OpticalPortsListCommand.java b/apps/optical-model/src/main/java/org/onosproject/net/optical/cli/OpticalPortsListCommand.java
index 448217c..d61c8bd 100644
--- a/apps/optical-model/src/main/java/org/onosproject/net/optical/cli/OpticalPortsListCommand.java
+++ b/apps/optical-model/src/main/java/org/onosproject/net/optical/cli/OpticalPortsListCommand.java
@@ -16,7 +16,8 @@
 package org.onosproject.net.optical.cli;
 
 import com.fasterxml.jackson.databind.ObjectMapper;
-import org.apache.karaf.shell.commands.Command;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onlab.util.Frequency;
 import org.onosproject.cli.net.DevicePortsListCommand;
 import org.onosproject.net.Device;
@@ -38,6 +39,7 @@
 /**
  * Lists all ports or all ports of a device.
  */
+@Service
 @Command(scope = "onos", name = "optical-ports",
          description = "Lists all optical ports or all optical ports of a device")
 public class OpticalPortsListCommand extends DevicePortsListCommand {
@@ -50,7 +52,7 @@
     private static final EnumSet<Port.Type> OPTICAL = EnumSet.of(Type.OCH, Type.ODUCLT, Type.OMS, Type.OTU);
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         DeviceService service = opticalView(get(DeviceService.class));
         if (uri == null) {
             if (outputJson()) {
diff --git a/apps/optical-model/src/main/java/org/onosproject/net/optical/intent/impl/compiler/OpticalCircuitIntentCompiler.java b/apps/optical-model/src/main/java/org/onosproject/net/optical/intent/impl/compiler/OpticalCircuitIntentCompiler.java
index 40d88f4..a484d66 100644
--- a/apps/optical-model/src/main/java/org/onosproject/net/optical/intent/impl/compiler/OpticalCircuitIntentCompiler.java
+++ b/apps/optical-model/src/main/java/org/onosproject/net/optical/intent/impl/compiler/OpticalCircuitIntentCompiler.java
@@ -16,15 +16,9 @@
 package org.onosproject.net.optical.intent.impl.compiler;
 
 import com.google.common.base.Strings;
-
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.Sets;
 import org.apache.commons.lang3.tuple.Pair;
-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.onlab.util.Tools;
 import org.onosproject.cfg.ComponentConfigService;
 import org.onosproject.core.ApplicationId;
@@ -55,23 +49,26 @@
 import org.onosproject.net.intent.IntentExtensionService;
 import org.onosproject.net.intent.IntentId;
 import org.onosproject.net.intent.IntentService;
+import org.onosproject.net.intent.IntentSetMultimap;
 import org.onosproject.net.intent.OpticalCircuitIntent;
 import org.onosproject.net.intent.OpticalConnectivityIntent;
 import org.onosproject.net.intent.PathIntent;
 import org.onosproject.net.optical.OchPort;
 import org.onosproject.net.optical.OduCltPort;
-import org.onosproject.net.intent.IntentSetMultimap;
-import org.onosproject.net.resource.ResourceAllocation;
 import org.onosproject.net.resource.Resource;
+import org.onosproject.net.resource.ResourceAllocation;
 import org.onosproject.net.resource.ResourceService;
 import org.onosproject.net.resource.Resources;
 import org.osgi.service.component.ComponentContext;
+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 org.slf4j.LoggerFactory;
 
-import com.google.common.collect.ImmutableList;
-import com.google.common.collect.Sets;
-
 import java.util.Arrays;
 import java.util.Collections;
 import java.util.Comparator;
@@ -85,44 +82,47 @@
 
 import static com.google.common.base.Preconditions.checkArgument;
 import static org.onosproject.net.optical.device.OpticalDeviceServiceView.opticalView;
+import static org.onosproject.net.optical.intent.impl.compiler.OsgiPropertyConstants.MAX_CAPACITY;
+import static org.onosproject.net.optical.intent.impl.compiler.OsgiPropertyConstants.MAX_CAPACITY_DEFAULT;
 
 /**
  * An intent compiler for {@link org.onosproject.net.intent.OpticalCircuitIntent}.
  */
-@Component(immediate = true)
+@Component(
+    immediate = true,
+    property = {
+        MAX_CAPACITY + ":Integer=" + MAX_CAPACITY_DEFAULT
+    }
+)
 public class OpticalCircuitIntentCompiler implements IntentCompiler<OpticalCircuitIntent> {
 
     private static final Logger log = LoggerFactory.getLogger(OpticalCircuitIntentCompiler.class);
 
-    private static final int DEFAULT_MAX_CAPACITY = 10;
+    /** Maximum utilization of an optical connection. */
+    private int maxCapacity = MAX_CAPACITY_DEFAULT;
 
-    @Property(name = "maxCapacity", intValue = DEFAULT_MAX_CAPACITY,
-            label = "Maximum utilization of an optical connection.")
-
-    private int maxCapacity = DEFAULT_MAX_CAPACITY;
-
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected ComponentConfigService cfgService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected IntentExtensionService intentManager;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected CoreService coreService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected DeviceService deviceService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected ResourceService resourceService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected IntentSetMultimap intentSetMultimap;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected IntentService intentService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected DriverService driverService;
 
     private ApplicationId appId;
@@ -136,7 +136,7 @@
         Dictionary properties = context.getProperties();
 
         //TODO for reduction check if the new capacity is smaller than the size of the current mapping
-        String propertyString = Tools.get(properties, "maxCapacity");
+        String propertyString = Tools.get(properties, MAX_CAPACITY);
 
         //Ignore if propertyString is empty or null
         if (!Strings.isNullOrEmpty(propertyString)) {
diff --git a/apps/optical-model/src/main/java/org/onosproject/net/optical/intent/impl/compiler/OpticalConnectivityIntentCompiler.java b/apps/optical-model/src/main/java/org/onosproject/net/optical/intent/impl/compiler/OpticalConnectivityIntentCompiler.java
index 3612273..5a76aef 100644
--- a/apps/optical-model/src/main/java/org/onosproject/net/optical/intent/impl/compiler/OpticalConnectivityIntentCompiler.java
+++ b/apps/optical-model/src/main/java/org/onosproject/net/optical/intent/impl/compiler/OpticalConnectivityIntentCompiler.java
@@ -19,11 +19,11 @@
 import com.google.common.collect.ImmutableSet;
 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.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.graph.ScalarWeight;
 import org.onlab.graph.Weight;
 import org.onosproject.net.AnnotationKeys;
@@ -87,16 +87,16 @@
     private static final ProviderId PROVIDER_ID = new ProviderId("opticalConnectivityIntent",
             "org.onosproject.net.optical.intent");
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected IntentExtensionService intentManager;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected TopologyService topologyService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected DeviceService deviceService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected ResourceService resourceService;
 
     @Activate
diff --git a/apps/optical-model/src/main/java/org/onosproject/net/optical/intent/impl/compiler/OpticalOduIntentCompiler.java b/apps/optical-model/src/main/java/org/onosproject/net/optical/intent/impl/compiler/OpticalOduIntentCompiler.java
index e45bfb1..4a5fade 100644
--- a/apps/optical-model/src/main/java/org/onosproject/net/optical/intent/impl/compiler/OpticalOduIntentCompiler.java
+++ b/apps/optical-model/src/main/java/org/onosproject/net/optical/intent/impl/compiler/OpticalOduIntentCompiler.java
@@ -16,11 +16,11 @@
 package org.onosproject.net.optical.intent.impl.compiler;
 
 
-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.graph.ScalarWeight;
 import org.onlab.graph.Weight;
 import org.onosproject.core.ApplicationId;
@@ -90,19 +90,19 @@
 
     private static final Logger log = LoggerFactory.getLogger(OpticalOduIntentCompiler.class);
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected IntentExtensionService intentManager;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected CoreService coreService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected TopologyService topologyService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected DeviceService deviceService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected ResourceService resourceService;
 
     private ApplicationId appId;
diff --git a/apps/optical-model/src/main/java/org/onosproject/net/optical/intent/impl/compiler/OpticalPathIntentCompiler.java b/apps/optical-model/src/main/java/org/onosproject/net/optical/intent/impl/compiler/OpticalPathIntentCompiler.java
index 9786cd4..d269843 100644
--- a/apps/optical-model/src/main/java/org/onosproject/net/optical/intent/impl/compiler/OpticalPathIntentCompiler.java
+++ b/apps/optical-model/src/main/java/org/onosproject/net/optical/intent/impl/compiler/OpticalPathIntentCompiler.java
@@ -17,11 +17,11 @@
 
 import com.google.common.collect.ImmutableSet;
 import com.google.common.collect.Lists;
-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.onosproject.core.ApplicationId;
 import org.onosproject.core.CoreService;
 import org.onosproject.net.ConnectPoint;
@@ -59,13 +59,13 @@
 
     private static final Logger log = LoggerFactory.getLogger(OpticalPathIntentCompiler.class);
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected IntentExtensionService intentManager;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected CoreService coreService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected DeviceService deviceService = new DeviceServiceAdapter();
 
     private ApplicationId appId;
diff --git a/apps/optical-model/src/main/java/org/onosproject/net/optical/intent/impl/compiler/OsgiPropertyConstants.java b/apps/optical-model/src/main/java/org/onosproject/net/optical/intent/impl/compiler/OsgiPropertyConstants.java
new file mode 100644
index 0000000..5eb77e7
--- /dev/null
+++ b/apps/optical-model/src/main/java/org/onosproject/net/optical/intent/impl/compiler/OsgiPropertyConstants.java
@@ -0,0 +1,25 @@
+/*
+ * Copyright 2018-present Open Networking Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.onosproject.net.optical.intent.impl.compiler;
+
+public final class OsgiPropertyConstants {
+    private OsgiPropertyConstants() {
+    }
+
+    static final String MAX_CAPACITY = "maxCapacity";
+    static final int MAX_CAPACITY_DEFAULT = 10;
+}
diff --git a/apps/optical-model/src/main/java/org/onosproject/net/optical/internal/OpticalModelLoader.java b/apps/optical-model/src/main/java/org/onosproject/net/optical/internal/OpticalModelLoader.java
index 9045e24..ecdbebd 100644
--- a/apps/optical-model/src/main/java/org/onosproject/net/optical/internal/OpticalModelLoader.java
+++ b/apps/optical-model/src/main/java/org/onosproject/net/optical/internal/OpticalModelLoader.java
@@ -17,11 +17,11 @@
 
 import static org.onosproject.net.config.basics.SubjectFactories.CONNECT_POINT_SUBJECT_FACTORY;
 
-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.onosproject.net.ConnectPoint;
 import org.onosproject.net.config.ConfigFactory;
 import org.onosproject.net.config.NetworkConfigRegistry;
@@ -39,10 +39,10 @@
 
     private final Logger log = LoggerFactory.getLogger(getClass());
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected PortConfigOperatorRegistry portOperatorRegistry;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected NetworkConfigRegistry netcfgRegistry;
 
 
diff --git a/apps/optical-model/src/main/resources/OSGI-INF/blueprint/shell-config.xml b/apps/optical-model/src/main/resources/OSGI-INF/blueprint/shell-config.xml
deleted file mode 100644
index ab597d8..0000000
--- a/apps/optical-model/src/main/resources/OSGI-INF/blueprint/shell-config.xml
+++ /dev/null
@@ -1,41 +0,0 @@
-<!--
-  ~ Copyright 2016-present Open Networking Foundation
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~     http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License.
-  -->
-<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0">
-
-    <command-bundle xmlns="http://karaf.apache.org/xmlns/shell/v1.1.0">
-        <command>
-            <action class="org.onosproject.net.optical.cli.AddOpticalIntentCommand"/>
-            <completers>
-                <ref component-id="connectPointCompleter"/>
-                <ref component-id="connectPointCompleter"/>
-            </completers>
-            <optional-completers>
-                <entry key="-a" value-ref="allAppNameCompleter"/>
-            </optional-completers>
-        </command>
-        <command>
-            <action class="org.onosproject.net.optical.cli.OpticalPortsListCommand"/>
-            <completers>
-                <ref component-id="deviceIdCompleter"/>
-            </completers>
-        </command>
-    </command-bundle>
-
-    <bean id="connectPointCompleter" class="org.onosproject.cli.net.ConnectPointCompleter"/>
-    <bean id="allAppNameCompleter" class="org.onosproject.cli.app.AllApplicationNamesCompleter"/>
-    <bean id="deviceIdCompleter" class="org.onosproject.cli.net.DeviceIdCompleter"/>
-
-</blueprint>
\ No newline at end of file
diff --git a/apps/optical-rest/BUCK b/apps/optical-rest/BUCK
deleted file mode 100644
index 9c47cb8..0000000
--- a/apps/optical-rest/BUCK
+++ /dev/null
@@ -1,35 +0,0 @@
-COMPILE_DEPS = [
-    '//lib:CORE_DEPS',
-    '//lib:JACKSON',
-    '//lib:javax.ws.rs-api',
-    '//utils/rest:onlab-rest',
-    '//apps/optical-model:onos-apps-optical-model'
-]
-
-APPS = [
-    'org.onosproject.optical-model',
-]
-
-TEST_DEPS = [
-    '//lib:TEST_REST',
-    '//utils/osgi:onlab-osgi-tests',
-    '//web/api:onos-rest-tests',
-]
-
-osgi_jar_with_tests (
-    deps = COMPILE_DEPS,
-    test_deps = TEST_DEPS,
-    web_context = '/onos/optical',
-    api_title = 'Optical Network Model REST API',
-    api_version = '1.0',
-    api_description = 'REST API for Optical Model',
-    api_package = 'org.onosproject.net.optical.rest'
-)
-
-onos_app (
-    title = 'Optical Network Model REST API',
-    category = 'Optical',
-    url = 'http://onosproject.org',
-    description = 'This application provides REST support for optical network model.',
-    required_apps = APPS
-)
diff --git a/apps/p4-tutorial/mytunnel/BUCK b/apps/p4-tutorial/mytunnel/BUCK
deleted file mode 100644
index 7945c93..0000000
--- a/apps/p4-tutorial/mytunnel/BUCK
+++ /dev/null
@@ -1,24 +0,0 @@
-COMPILE_DEPS = [
-    '//lib:CORE_DEPS',
-    '//apps/p4-tutorial/pipeconf:onos-apps-p4-tutorial-pipeconf',
-]
-
-osgi_jar (
-    deps = COMPILE_DEPS,
-)
-
-BUNDLES = [
-    '//apps/p4-tutorial/mytunnel:onos-apps-p4-tutorial-mytunnel',
-]
-
-onos_app (
-    app_name = 'org.onosproject.p4tutorial.mytunnel',
-    title = 'MyTunnel Demo App',
-    category = 'Traffic Engineering',
-    url = 'http://onosproject.org',
-    description = 'Provides forwarding between each pair of hosts via MyTunnel protocol',
-    included_bundles = BUNDLES,
-    required_apps = [
-        'org.onosproject.p4tutorial.pipeconf',
-    ]
-)
diff --git a/apps/p4-tutorial/mytunnel/src/main/java/org/onosproject/p4tutorial/mytunnel/MyTunnelApp.java b/apps/p4-tutorial/mytunnel/src/main/java/org/onosproject/p4tutorial/mytunnel/MyTunnelApp.java
index 5acc434..4a92716 100644
--- a/apps/p4-tutorial/mytunnel/src/main/java/org/onosproject/p4tutorial/mytunnel/MyTunnelApp.java
+++ b/apps/p4-tutorial/mytunnel/src/main/java/org/onosproject/p4tutorial/mytunnel/MyTunnelApp.java
@@ -17,11 +17,11 @@
 package org.onosproject.p4tutorial.mytunnel;
 
 import com.google.common.collect.Lists;
-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.core.ApplicationId;
 import org.onosproject.core.CoreService;
@@ -82,16 +82,16 @@
     // ONOS core services needed by this application.
     //--------------------------------------------------------------------------
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     private FlowRuleService flowRuleService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     private CoreService coreService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     private TopologyService topologyService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     private HostService hostService;
 
     //--------------------------------------------------------------------------
diff --git a/apps/p4-tutorial/pipeconf/BUCK b/apps/p4-tutorial/pipeconf/BUCK
deleted file mode 100644
index 6bdb389..0000000
--- a/apps/p4-tutorial/pipeconf/BUCK
+++ /dev/null
@@ -1,27 +0,0 @@
-COMPILE_DEPS = [
-    '//lib:CORE_DEPS',
-    '//lib:minimal-json',
-    '//protocols/p4runtime/model:onos-protocols-p4runtime-model',
-    '//drivers/default:onos-drivers-default',
-    '//protocols/p4runtime/api:onos-protocols-p4runtime-api',
-]
-
-osgi_jar (
-    deps = COMPILE_DEPS,
-)
-
-BUNDLES = [
-    '//apps/p4-tutorial/pipeconf:onos-apps-p4-tutorial-pipeconf',
-]
-
-onos_app (
-    app_name = 'org.onosproject.p4tutorial.pipeconf',
-    title = 'P4 Tutorial Pipeconf',
-    category = 'Pipeconf',
-    url = 'http://onosproject.org',
-    description = 'Provides pipeconf for the ONOS-P4 Tutorial',
-    included_bundles = BUNDLES,
-    required_apps = [
-        'org.onosproject.drivers.p4runtime',
-    ]
-)
diff --git a/apps/p4-tutorial/pipeconf/src/main/java/org/onosproject/p4tutorial/pipeconf/PipeconfFactory.java b/apps/p4-tutorial/pipeconf/src/main/java/org/onosproject/p4tutorial/pipeconf/PipeconfFactory.java
index f0078ec..b216aff 100644
--- a/apps/p4-tutorial/pipeconf/src/main/java/org/onosproject/p4tutorial/pipeconf/PipeconfFactory.java
+++ b/apps/p4-tutorial/pipeconf/src/main/java/org/onosproject/p4tutorial/pipeconf/PipeconfFactory.java
@@ -16,11 +16,11 @@
 
 package org.onosproject.p4tutorial.pipeconf;
 
-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.onosproject.driver.pipeline.DefaultSingleTablePipeline;
 import org.onosproject.net.behaviour.Pipeliner;
 import org.onosproject.net.device.PortStatisticsDiscovery;
@@ -52,7 +52,7 @@
     private static final URL P4INFO_URL = PipeconfFactory.class.getResource("/mytunnel.p4info");
     private static final URL BMV2_JSON_URL = PipeconfFactory.class.getResource("/mytunnel.json");
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     private PiPipeconfService piPipeconfService;
 
     @Activate
diff --git a/apps/packet-stats/BUCK b/apps/packet-stats/BUCK
deleted file mode 100644
index e7c77b1..0000000
--- a/apps/packet-stats/BUCK
+++ /dev/null
@@ -1,21 +0,0 @@
-COMPILE_DEPS = [
-    '//lib:CORE_DEPS',
-    '//lib:JACKSON',
-    '//lib:METRICS',
-    '//core/store/serializers:onos-core-serializers',
-    '//core/store/primitives:onos-core-primitives',
-    '//core/api:onos-api',
-    '//lib:org.apache.karaf.shell.console',
-    '//cli:onos-cli',
-]
-
-osgi_jar_with_tests (
-    deps = COMPILE_DEPS,
-)
-
-onos_app (
-    title = 'Packet Statistics',
-    category = 'Traffic Engineering',
-    url = 'http://onosproject.org',
-    description = 'Application to calculate the number of packets of different types',
-)
diff --git a/apps/packet-stats/src/main/java/org/onosproject/packetstats/PacketStatistics.java b/apps/packet-stats/src/main/java/org/onosproject/packetstats/PacketStatistics.java
index 6d3f77f..05800f2 100644
--- a/apps/packet-stats/src/main/java/org/onosproject/packetstats/PacketStatistics.java
+++ b/apps/packet-stats/src/main/java/org/onosproject/packetstats/PacketStatistics.java
@@ -16,11 +16,11 @@
 
 package org.onosproject.packetstats;
 import com.codahale.metrics.Counter;
-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.Ethernet;
 import org.onlab.packet.IPv4;
 import org.onlab.packet.UDP;
@@ -46,21 +46,21 @@
 @Component(immediate = true)
 public class  PacketStatistics {
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected PacketService packetService;
 
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected FlowRuleService flowRuleService;
 
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected CoreService coreService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected ComponentConfigService cfgService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected MetricsService metricService;
 
     private ReactivePacketProcessor processor = new ReactivePacketProcessor();
diff --git a/apps/packet-stats/src/main/java/org/onosproject/packetstats/PacketStatsUiComponent.java b/apps/packet-stats/src/main/java/org/onosproject/packetstats/PacketStatsUiComponent.java
index 7846756..e9982a2 100644
--- a/apps/packet-stats/src/main/java/org/onosproject/packetstats/PacketStatsUiComponent.java
+++ b/apps/packet-stats/src/main/java/org/onosproject/packetstats/PacketStatsUiComponent.java
@@ -18,11 +18,11 @@
 
 
 import com.google.common.collect.ImmutableList;
-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.onosproject.ui.UiExtension;
 import org.onosproject.ui.UiExtensionService;
 import org.onosproject.ui.UiMessageHandlerFactory;
@@ -42,7 +42,7 @@
 
     private final Logger log = LoggerFactory.getLogger(getClass());
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected UiExtensionService uiExtensionService;
 
     // List of application views
diff --git a/apps/pathpainter/BUCK b/apps/pathpainter/BUCK
deleted file mode 100644
index bbb142a..0000000
--- a/apps/pathpainter/BUCK
+++ /dev/null
@@ -1,20 +0,0 @@
-COMPILE_DEPS = [
-    '//lib:CORE_DEPS',
-    '//lib:JACKSON',
-]
-
-osgi_jar_with_tests (
-    deps = COMPILE_DEPS,
-    resources_root = 'src/main/resources',
-    resources = glob(['src/main/resources/**']),
-)
-
-onos_app (
-    title = 'Path Visualization',
-    category = 'GUI',
-    url = 'http://onosproject.org',
-    description = 'Extends the GUI topology view by adding an overlay that allows the operator ' +
-        'to visualize topology paths using various forms of path-finding algorithms such as ' +
-        'the Dijkstra shortest path using default link metric (ONOS default), using geographic ' +
-        'distances, disjoint paths, etc.',
-)
diff --git a/apps/pathpainter/src/main/java/org/onosproject/pathpainter/PathPainter.java b/apps/pathpainter/src/main/java/org/onosproject/pathpainter/PathPainter.java
index 64c2c7b..bf97b3c 100644
--- a/apps/pathpainter/src/main/java/org/onosproject/pathpainter/PathPainter.java
+++ b/apps/pathpainter/src/main/java/org/onosproject/pathpainter/PathPainter.java
@@ -16,11 +16,11 @@
 package org.onosproject.pathpainter;
 
 import com.google.common.collect.ImmutableList;
-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.onosproject.ui.UiExtension;
 import org.onosproject.ui.UiExtensionService;
 import org.onosproject.ui.UiMessageHandlerFactory;
@@ -43,7 +43,7 @@
 
     private final Logger log = LoggerFactory.getLogger(getClass());
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected UiExtensionService uiExtensionService;
 
     // List of application views
diff --git a/apps/pce/BUCK b/apps/pce/BUCK
deleted file mode 100644
index cd306b8..0000000
--- a/apps/pce/BUCK
+++ /dev/null
@@ -1,15 +0,0 @@
-BUNDLES = [
-    '//apps/pce/bandwidthmgmt:onos-apps-pce-bandwidthmgmt',
-    '//apps/pce/app:onos-apps-pce-app',
-    '//apps/pce/pcerest:onos-apps-pce-pcerest',
-    '//apps/pce/pceweb:onos-apps-pce-pceweb',
-]
-
-onos_app (
-  app_name='org.onosproject.pce',
-    title = 'PCE APP',
-    category = 'PCE',
-    url = 'http://onosproject.org',
-    included_bundles = BUNDLES,
-    description = 'PCE Service App.',
-)
\ No newline at end of file
diff --git a/apps/pce/app/BUCK b/apps/pce/app/BUCK
deleted file mode 100644
index 7f3869f..0000000
--- a/apps/pce/app/BUCK
+++ /dev/null
@@ -1,35 +0,0 @@
-COMPILE_DEPS = [
-    '//lib:CORE_DEPS',
-    '//lib:COMPILE',
-    '//lib:JACKSON',
-    '//lib:KRYO',
-    '//lib:org.osgi.compendium',
-    '//cli:onos-cli',
-    '//core/store/serializers:onos-core-serializers',
-    '//utils/rest:onlab-rest',
-    '//incubator/api:onos-incubator-api',
-    '//apps/pcep-api:onos-apps-pcep-api',
-    '//utils/misc:onlab-misc',
-    '//core/api:onos-api',
-    '//lib:org.apache.karaf.shell.console',
-    '//lib:javax.ws.rs-api',
-    '//apps/pce/bandwidthmgmt:onos-apps-pce-bandwidthmgmt',
-]
-
-TEST_DEPS = [
-    '//lib:TEST_REST',
-    '//incubator/api:onos-incubator-api-tests',
-]
-
-osgi_jar_with_tests (
-    deps = COMPILE_DEPS,
-    test_deps = TEST_DEPS
-)
-
-onos_app (
-    app_name='org.onosproject.pce.app',
-    title = 'PCE',
-    category = 'default',
-    url = 'http://onosproject.org',
-    description = 'PCE as centeral controller App.',
-)
diff --git a/apps/pce/app/BUILD b/apps/pce/app/BUILD
index 3bb7284..027a2c1 100644
--- a/apps/pce/app/BUILD
+++ b/apps/pce/app/BUILD
@@ -10,6 +10,7 @@
 ]
 
 osgi_jar_with_tests(
+    karaf_command_packages = ["org.onosproject.pce.cli"],
     test_deps = TEST_DEPS,
     deps = COMPILE_DEPS,
 )
diff --git a/apps/pce/app/src/main/java/org/onosproject/pce/cli/PceDeleteLoadBalancingPathCommand.java b/apps/pce/app/src/main/java/org/onosproject/pce/cli/PceDeleteLoadBalancingPathCommand.java
index d66683c..fd8a3cb 100644
--- a/apps/pce/app/src/main/java/org/onosproject/pce/cli/PceDeleteLoadBalancingPathCommand.java
+++ b/apps/pce/app/src/main/java/org/onosproject/pce/cli/PceDeleteLoadBalancingPathCommand.java
@@ -17,9 +17,10 @@
 
 import static org.slf4j.LoggerFactory.getLogger;
 
-import org.apache.karaf.shell.commands.Argument;
-import org.apache.karaf.shell.commands.Command;
+import org.apache.karaf.shell.api.action.Argument;
+import org.apache.karaf.shell.api.action.Command;
 
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.pce.pceservice.api.PceService;
 
@@ -28,6 +29,7 @@
 /**
  * Supports deleting pce load balancing path.
  */
+@Service
 @Command(scope = "onos", name = "pce-delete-load-balancing-path",
         description = "Supports deleting pce load balancing path.")
 public class PceDeleteLoadBalancingPathCommand extends AbstractShellCommand {
@@ -38,7 +40,7 @@
     String name = null;
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         log.info("executing pce-delete-load-balancing-path");
 
         PceService service = get(PceService.class);
diff --git a/apps/pce/app/src/main/java/org/onosproject/pce/cli/PceDeletePathCommand.java b/apps/pce/app/src/main/java/org/onosproject/pce/cli/PceDeletePathCommand.java
index bd4cf31..e4a6ccc 100644
--- a/apps/pce/app/src/main/java/org/onosproject/pce/cli/PceDeletePathCommand.java
+++ b/apps/pce/app/src/main/java/org/onosproject/pce/cli/PceDeletePathCommand.java
@@ -17,9 +17,10 @@
 
 import static org.slf4j.LoggerFactory.getLogger;
 
-import org.apache.karaf.shell.commands.Argument;
-import org.apache.karaf.shell.commands.Command;
+import org.apache.karaf.shell.api.action.Argument;
+import org.apache.karaf.shell.api.action.Command;
 
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.incubator.net.tunnel.TunnelId;
 import org.onosproject.pce.pceservice.api.PceService;
@@ -29,6 +30,7 @@
 /**
  * Supports deleting pce path.
  */
+@Service
 @Command(scope = "onos", name = "pce-delete-path", description = "Supports deleting pce path.")
 public class PceDeletePathCommand extends AbstractShellCommand {
     private final Logger log = getLogger(getClass());
@@ -37,7 +39,7 @@
     String id = null;
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         log.info("executing pce-delete-path");
 
         PceService service = get(PceService.class);
diff --git a/apps/pce/app/src/main/java/org/onosproject/pce/cli/PceQueryLoadBalancingPathCommand.java b/apps/pce/app/src/main/java/org/onosproject/pce/cli/PceQueryLoadBalancingPathCommand.java
index b503f07..686ea45 100644
--- a/apps/pce/app/src/main/java/org/onosproject/pce/cli/PceQueryLoadBalancingPathCommand.java
+++ b/apps/pce/app/src/main/java/org/onosproject/pce/cli/PceQueryLoadBalancingPathCommand.java
@@ -17,9 +17,10 @@
 
 import static org.slf4j.LoggerFactory.getLogger;
 
-import org.apache.karaf.shell.commands.Argument;
-import org.apache.karaf.shell.commands.Command;
+import org.apache.karaf.shell.api.action.Argument;
+import org.apache.karaf.shell.api.action.Command;
 
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.incubator.net.tunnel.Tunnel;
 import org.onosproject.incubator.net.tunnel.TunnelId;
@@ -33,6 +34,7 @@
 /**
  * Supports quering PCE load balanced path.
  */
+@Service
 @Command(scope = "onos", name = "pce-query-load-balancing-path",
         description = "Supports querying PCE path.")
 public class PceQueryLoadBalancingPathCommand extends AbstractShellCommand {
@@ -44,7 +46,7 @@
     String name = null;
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         log.info("executing pce-query-load-balancing-path");
 
         PceService service = get(PceService.class);
diff --git a/apps/pce/app/src/main/java/org/onosproject/pce/cli/PceQueryPathCommand.java b/apps/pce/app/src/main/java/org/onosproject/pce/cli/PceQueryPathCommand.java
index e716949..5edb675 100644
--- a/apps/pce/app/src/main/java/org/onosproject/pce/cli/PceQueryPathCommand.java
+++ b/apps/pce/app/src/main/java/org/onosproject/pce/cli/PceQueryPathCommand.java
@@ -17,9 +17,10 @@
 
 import static org.slf4j.LoggerFactory.getLogger;
 
-import org.apache.karaf.shell.commands.Command;
-import org.apache.karaf.shell.commands.Option;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.Option;
 
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.incubator.net.tunnel.Tunnel;
 import org.onosproject.incubator.net.tunnel.TunnelId;
@@ -34,6 +35,7 @@
 /**
  * Supports quering PCE path.
  */
+@Service
 @Command(scope = "onos", name = "pce-query-path",
         description = "Supports querying PCE path.")
 public class PceQueryPathCommand extends AbstractShellCommand {
@@ -45,7 +47,7 @@
     String id = null;
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         log.info("executing pce-query-path");
 
         PceService service = get(PceService.class);
diff --git a/apps/pce/app/src/main/java/org/onosproject/pce/cli/PceSetupPathCommand.java b/apps/pce/app/src/main/java/org/onosproject/pce/cli/PceSetupPathCommand.java
index d41e378..253a166 100644
--- a/apps/pce/app/src/main/java/org/onosproject/pce/cli/PceSetupPathCommand.java
+++ b/apps/pce/app/src/main/java/org/onosproject/pce/cli/PceSetupPathCommand.java
@@ -25,9 +25,10 @@
 
 import com.google.common.collect.Lists;
 
-import org.apache.karaf.shell.commands.Argument;
-import org.apache.karaf.shell.commands.Command;
-import org.apache.karaf.shell.commands.Option;
+import org.apache.karaf.shell.api.action.Argument;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.Option;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onlab.util.DataRateUnit;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.incubator.net.tunnel.Tunnel;
@@ -49,6 +50,7 @@
 /**
  * Supports creating the pce path.
  */
+@Service
 @Command(scope = "onos", name = "pce-setup-path", description = "Supports creating pce path.")
 public class PceSetupPathCommand extends AbstractShellCommand {
     private final Logger log = getLogger(getClass());
@@ -105,7 +107,7 @@
     List<ExplicitPathInfo> explicitPathInfo = Lists.newLinkedList();
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         log.info("executing pce-setup-path");
 
         PceService service = get(PceService.class);
diff --git a/apps/pce/app/src/main/java/org/onosproject/pce/cli/PceUpdatePathCommand.java b/apps/pce/app/src/main/java/org/onosproject/pce/cli/PceUpdatePathCommand.java
index 2a2f4a8..96796b5 100644
--- a/apps/pce/app/src/main/java/org/onosproject/pce/cli/PceUpdatePathCommand.java
+++ b/apps/pce/app/src/main/java/org/onosproject/pce/cli/PceUpdatePathCommand.java
@@ -20,10 +20,11 @@
 import java.util.List;
 import java.util.LinkedList;
 
-import org.apache.karaf.shell.commands.Argument;
-import org.apache.karaf.shell.commands.Command;
-import org.apache.karaf.shell.commands.Option;
+import org.apache.karaf.shell.api.action.Argument;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.Option;
 
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onlab.util.DataRateUnit;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.incubator.net.tunnel.TunnelId;
@@ -37,6 +38,7 @@
 /**
  * Supports updating the PCE path.
  */
+@Service
 @Command(scope = "onos", name = "pce-update-path",
         description = "Supports updating PCE path.")
 public class PceUpdatePathCommand extends AbstractShellCommand {
@@ -54,7 +56,7 @@
     Double bandwidth = null;
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         log.info("executing pce-update-path");
 
         PceService service = get(PceService.class);
diff --git a/apps/pce/app/src/main/java/org/onosproject/pce/pceservice/PceManager.java b/apps/pce/app/src/main/java/org/onosproject/pce/pceservice/PceManager.java
index e7ef935..d9a61f0 100644
--- a/apps/pce/app/src/main/java/org/onosproject/pce/pceservice/PceManager.java
+++ b/apps/pce/app/src/main/java/org/onosproject/pce/pceservice/PceManager.java
@@ -15,29 +15,14 @@
  */
 package org.onosproject.pce.pceservice;
 
-import static com.google.common.base.Preconditions.checkNotNull;
-
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableSet;
+import com.google.common.collect.Sets;
 import org.onlab.graph.ScalarWeight;
 import org.onlab.graph.Weight;
-import org.onosproject.net.DisjointPath;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.Map;
-import java.util.Optional;
-import java.util.Set;
-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.packet.IpAddress;
 import org.onlab.util.Bandwidth;
+import org.onosproject.bandwidthmgr.api.BandwidthMgmtService;
 import org.onosproject.core.ApplicationId;
 import org.onosproject.core.CoreService;
 import org.onosproject.core.IdGenerator;
@@ -51,38 +36,38 @@
 import org.onosproject.incubator.net.tunnel.TunnelName;
 import org.onosproject.incubator.net.tunnel.TunnelService;
 import org.onosproject.mastership.MastershipService;
-import org.onosproject.net.LinkKey;
-import org.onosproject.net.config.ConfigFactory;
-import org.onosproject.net.config.NetworkConfigRegistry;
-import org.onosproject.net.config.NetworkConfigService;
 import org.onosproject.net.DefaultAnnotations;
 import org.onosproject.net.DefaultAnnotations.Builder;
 import org.onosproject.net.DefaultPath;
 import org.onosproject.net.Device;
 import org.onosproject.net.DeviceId;
+import org.onosproject.net.DisjointPath;
 import org.onosproject.net.Link;
+import org.onosproject.net.LinkKey;
+import org.onosproject.net.MastershipRole;
 import org.onosproject.net.NetworkResource;
 import org.onosproject.net.Path;
+import org.onosproject.net.config.ConfigFactory;
+import org.onosproject.net.config.NetworkConfigRegistry;
+import org.onosproject.net.config.NetworkConfigService;
 import org.onosproject.net.config.basics.SubjectFactories;
 import org.onosproject.net.device.DeviceService;
 import org.onosproject.net.intent.Constraint;
 import org.onosproject.net.link.LinkEvent;
-import org.onosproject.net.MastershipRole;
-import org.onosproject.bandwidthmgr.api.BandwidthMgmtService;
-import org.onosproject.net.topology.LinkWeigher;
-import org.onosproject.pce.pceservice.constraint.CapabilityConstraint;
-import org.onosproject.pce.pceservice.constraint.CapabilityConstraint.CapabilityType;
-import org.onosproject.pce.pceservice.constraint.CostConstraint;
-import org.onosproject.pce.pceservice.constraint.PceBandwidthConstraint;
-import org.onosproject.pce.pceservice.constraint.SharedBandwidthConstraint;
 import org.onosproject.net.resource.Resource;
 import org.onosproject.net.resource.ResourceAllocation;
+import org.onosproject.net.topology.LinkWeigher;
 import org.onosproject.net.topology.PathService;
 import org.onosproject.net.topology.TopologyEdge;
 import org.onosproject.net.topology.TopologyEvent;
 import org.onosproject.net.topology.TopologyListener;
 import org.onosproject.net.topology.TopologyService;
 import org.onosproject.pce.pceservice.api.PceService;
+import org.onosproject.pce.pceservice.constraint.CapabilityConstraint;
+import org.onosproject.pce.pceservice.constraint.CapabilityConstraint.CapabilityType;
+import org.onosproject.pce.pceservice.constraint.CostConstraint;
+import org.onosproject.pce.pceservice.constraint.PceBandwidthConstraint;
+import org.onosproject.pce.pceservice.constraint.SharedBandwidthConstraint;
 import org.onosproject.pce.pcestore.PcePathInfo;
 import org.onosproject.pce.pcestore.api.PceStore;
 import org.onosproject.pcep.api.DeviceCapability;
@@ -91,31 +76,43 @@
 import org.onosproject.store.service.DistributedSet;
 import org.onosproject.store.service.Serializer;
 import org.onosproject.store.service.StorageService;
+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 com.google.common.collect.ImmutableList;
-import com.google.common.collect.ImmutableSet;
-import com.google.common.collect.Sets;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Map;
+import java.util.Optional;
+import java.util.Set;
 
+import static com.google.common.base.Preconditions.checkNotNull;
 import static org.onosproject.incubator.net.tunnel.Tunnel.State.INIT;
 import static org.onosproject.incubator.net.tunnel.Tunnel.State.UNSTABLE;
 import static org.onosproject.incubator.net.tunnel.Tunnel.Type.MPLS;
 import static org.onosproject.pce.pceservice.LspType.WITH_SIGNALLING;
 import static org.onosproject.pce.pceservice.PcepAnnotationKeys.BANDWIDTH;
+import static org.onosproject.pce.pceservice.PcepAnnotationKeys.COST_TYPE;
+import static org.onosproject.pce.pceservice.PcepAnnotationKeys.DELEGATE;
 import static org.onosproject.pce.pceservice.PcepAnnotationKeys.LOCAL_LSP_ID;
 import static org.onosproject.pce.pceservice.PcepAnnotationKeys.LSP_SIG_TYPE;
+import static org.onosproject.pce.pceservice.PcepAnnotationKeys.PCC_TUNNEL_ID;
 import static org.onosproject.pce.pceservice.PcepAnnotationKeys.PCE_INIT;
 import static org.onosproject.pce.pceservice.PcepAnnotationKeys.PLSP_ID;
-import static org.onosproject.pce.pceservice.PcepAnnotationKeys.PCC_TUNNEL_ID;
-import static org.onosproject.pce.pceservice.PcepAnnotationKeys.DELEGATE;
-import static org.onosproject.pce.pceservice.PcepAnnotationKeys.COST_TYPE;
 
 /**
  * Implementation of PCE service.
  */
-@Component(immediate = true)
-@Service
+@Component(immediate = true, service = PceManager.class)
 public class PceManager implements PceService {
     private static final Logger log = LoggerFactory.getLogger(PceManager.class);
 
@@ -134,37 +131,37 @@
     private IdGenerator localLspIdIdGen;
     protected DistributedSet<Short> localLspIdFreeList;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected CoreService coreService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected PathService pathService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected PceStore pceStore;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected TunnelService tunnelService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected DeviceService deviceService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected StorageService storageService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected NetworkConfigService netCfgService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected MastershipService mastershipService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected TopologyService topologyService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected BandwidthMgmtService bandwidthMgmtService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected NetworkConfigRegistry netConfigRegistry;
 
     private TunnelListener listener = new InnerTunnelListener();
diff --git a/apps/pce/app/src/main/java/org/onosproject/pce/pcestore/DistributedPceStore.java b/apps/pce/app/src/main/java/org/onosproject/pce/pcestore/DistributedPceStore.java
index 91923ab..998f87e 100644
--- a/apps/pce/app/src/main/java/org/onosproject/pce/pcestore/DistributedPceStore.java
+++ b/apps/pce/app/src/main/java/org/onosproject/pce/pcestore/DistributedPceStore.java
@@ -16,13 +16,6 @@
 package org.onosproject.pce.pcestore;
 
 import com.google.common.collect.ImmutableSet;
-import java.util.Arrays;
-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.KryoNamespace;
 import org.onosproject.incubator.net.tunnel.TunnelId;
 import org.onosproject.pce.pceservice.ExplicitPathInfo;
@@ -37,9 +30,15 @@
 import org.onosproject.store.service.DistributedSet;
 import org.onosproject.store.service.Serializer;
 import org.onosproject.store.service.StorageService;
+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.util.Arrays;
 import java.util.List;
 
 import static com.google.common.base.Preconditions.checkNotNull;
@@ -47,8 +46,7 @@
 /**
  * Manages the pool of available labels to devices, links and tunnels.
  */
-@Component(immediate = true)
-@Service
+@Component(immediate = true, service = PceStore.class)
 public class DistributedPceStore implements PceStore {
     private static final String PATH_INFO_NULL = "Path Info cannot be null";
     private static final String PCECC_TUNNEL_INFO_NULL = "PCECC Tunnel Info cannot be null";
@@ -56,7 +54,7 @@
 
     private final Logger log = LoggerFactory.getLogger(getClass());
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected StorageService storageService;
 
     //Mapping tunnel name with Disjoint paths
diff --git a/apps/pce/app/src/main/resources/OSGI-INF/blueprint/shell-config.xml b/apps/pce/app/src/main/resources/OSGI-INF/blueprint/shell-config.xml
deleted file mode 100644
index 75f0893..0000000
--- a/apps/pce/app/src/main/resources/OSGI-INF/blueprint/shell-config.xml
+++ /dev/null
@@ -1,37 +0,0 @@
-<!--
-  ~ Copyright 2016-present Open Networking Foundation
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~     http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License.
-  -->
-<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0">
-  <command-bundle xmlns="http://karaf.apache.org/xmlns/shell/v1.1.0">
-    <command>
-      <action class="org.onosproject.pce.cli.PceQueryPathCommand"/>
-    </command>
-    <command>
-      <action class="org.onosproject.pce.cli.PceSetupPathCommand"/>
-    </command>
-    <command>
-      <action class="org.onosproject.pce.cli.PceUpdatePathCommand"/>
-    </command>
-    <command>
-      <action class="org.onosproject.pce.cli.PceDeletePathCommand"/>
-    </command>
-    <command>
-      <action class="org.onosproject.pce.cli.PceQueryLoadBalancingPathCommand"/>
-    </command>
-    <command>
-      <action class="org.onosproject.pce.cli.PceDeleteLoadBalancingPathCommand"/>
-    </command>
-  </command-bundle>
-</blueprint>
diff --git a/apps/pce/bandwidthmgmt/BUCK b/apps/pce/bandwidthmgmt/BUCK
deleted file mode 100644
index c5f0b25..0000000
--- a/apps/pce/bandwidthmgmt/BUCK
+++ /dev/null
@@ -1,18 +0,0 @@
-COMPILE_DEPS = [
-    '//lib:CORE_DEPS',
-    '//lib:KRYO',
-    '//core/store/serializers:onos-core-serializers',
-    '//apps/pcep-api:onos-apps-pcep-api',
-]
-
-osgi_jar_with_tests (
-    deps = COMPILE_DEPS
-)
-
-onos_app (
-    app_name = 'org.onosproject.bandwidthmgmt',
-    title = 'PCE Bandwidth Management',
-    category = 'default',
-    url = 'http://onosproject.org',
-    description = 'PCE Bandwidth Management.',
-)
diff --git a/apps/pce/bandwidthmgmt/src/main/java/org/onosproject/bandwidthmgr/BandwidthManager.java b/apps/pce/bandwidthmgmt/src/main/java/org/onosproject/bandwidthmgr/BandwidthManager.java
index 4316626..a23c16e 100644
--- a/apps/pce/bandwidthmgmt/src/main/java/org/onosproject/bandwidthmgr/BandwidthManager.java
+++ b/apps/pce/bandwidthmgmt/src/main/java/org/onosproject/bandwidthmgr/BandwidthManager.java
@@ -15,16 +15,15 @@
  */
 package org.onosproject.bandwidthmgr;
 
-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.net.Link;
-import org.onosproject.net.LinkKey;
 import org.onosproject.bandwidthmgr.api.BandwidthMgmtService;
 import org.onosproject.bandwidthmgr.api.BandwidthMgmtStore;
+import org.onosproject.net.Link;
+import org.onosproject.net.LinkKey;
+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;
 
@@ -35,12 +34,11 @@
 /**
  * Implementation of PCE service.
  */
-@Component(immediate = true)
-@Service
+@Component(immediate = true, service = BandwidthMgmtService.class)
 public class BandwidthManager implements BandwidthMgmtService {
     private static final Logger log = LoggerFactory.getLogger(BandwidthManager.class);
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected BandwidthMgmtStore store;
 
     @Activate
diff --git a/apps/pce/bandwidthmgmt/src/main/java/org/onosproject/bandwidthmgr/DistributedBandwidthMgmtStore.java b/apps/pce/bandwidthmgmt/src/main/java/org/onosproject/bandwidthmgr/DistributedBandwidthMgmtStore.java
index 54c0191..50bad95 100644
--- a/apps/pce/bandwidthmgmt/src/main/java/org/onosproject/bandwidthmgr/DistributedBandwidthMgmtStore.java
+++ b/apps/pce/bandwidthmgmt/src/main/java/org/onosproject/bandwidthmgr/DistributedBandwidthMgmtStore.java
@@ -15,49 +15,45 @@
  */
 package org.onosproject.bandwidthmgr;
 
-import static com.google.common.base.Preconditions.checkNotNull;
-import static org.onosproject.net.config.NetworkConfigEvent.Type.CONFIG_ADDED;
-import static org.onosproject.net.config.NetworkConfigEvent.Type.CONFIG_REMOVED;
-import static org.onosproject.net.config.NetworkConfigEvent.Type.CONFIG_UPDATED;
-
-import java.util.LinkedHashSet;
-import java.util.Set;
-
-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.KryoNamespace;
+import org.onosproject.bandwidthmgr.api.BandwidthMgmtStore;
 import org.onosproject.net.ConnectPoint;
 import org.onosproject.net.LinkKey;
 import org.onosproject.net.config.NetworkConfigEvent;
 import org.onosproject.net.config.NetworkConfigListener;
 import org.onosproject.net.config.NetworkConfigService;
-import org.onosproject.bandwidthmgr.api.BandwidthMgmtStore;
 import org.onosproject.pcep.api.TeLinkConfig;
 import org.onosproject.store.serializers.KryoNamespaces;
 import org.onosproject.store.service.ConsistentMap;
 import org.onosproject.store.service.Serializer;
 import org.onosproject.store.service.StorageService;
-
+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.util.LinkedHashSet;
+import java.util.Set;
+
+import static com.google.common.base.Preconditions.checkNotNull;
+import static org.onosproject.net.config.NetworkConfigEvent.Type.CONFIG_ADDED;
+import static org.onosproject.net.config.NetworkConfigEvent.Type.CONFIG_REMOVED;
+import static org.onosproject.net.config.NetworkConfigEvent.Type.CONFIG_UPDATED;
+
 /**
  * Manages the pool of available labels to devices, links and tunnels.
  */
-@Component(immediate = true)
-@Service
+@Component(immediate = true, service = BandwidthMgmtStore.class)
 public class DistributedBandwidthMgmtStore implements BandwidthMgmtStore {
     private static final Logger log = LoggerFactory.getLogger(BandwidthManager.class);
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected NetworkConfigService netCfgService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected StorageService storageService;
 
     private InternalConfigListener cfgListener = new InternalConfigListener();
diff --git a/apps/pce/pcerest/BUCK b/apps/pce/pcerest/BUCK
deleted file mode 100644
index bed98d2..0000000
--- a/apps/pce/pcerest/BUCK
+++ /dev/null
@@ -1,27 +0,0 @@
-COMPILE_DEPS = [
-    '//lib:CORE_DEPS',
-    '//lib:JACKSON',
-    '//lib:javax.ws.rs-api',
-    '//utils/rest:onlab-rest',
-    '//apps/pce/app:onos-apps-pce-app',
-    '//core/store/serializers:onos-core-serializers',
-    '//core/api:onos-api',
-    '//incubator/api:onos-incubator-api',
-]
-
-TEST_DEPS = [
-    '//lib:TEST_REST',
-    '//lib:minimal-json',
-]
-
-osgi_jar_with_tests (
-    deps = COMPILE_DEPS,
-    test_deps = TEST_DEPS
-)
-
-onos_app (
-    title = 'PCE REST API',
-    category = 'Utility',
-    url = 'http://onosproject.org',
-    description = 'Tunnel Service between network devices via REST interface',
-)
diff --git a/apps/pce/pcerest/src/main/java/org/onosproject/pcerest/PceCodecRegistrator.java b/apps/pce/pcerest/src/main/java/org/onosproject/pcerest/PceCodecRegistrator.java
index acfe5b4..be8686a 100644
--- a/apps/pce/pcerest/src/main/java/org/onosproject/pcerest/PceCodecRegistrator.java
+++ b/apps/pce/pcerest/src/main/java/org/onosproject/pcerest/PceCodecRegistrator.java
@@ -15,11 +15,11 @@
  */
 package org.onosproject.pcerest;
 
-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.onosproject.codec.CodecService;
 import org.onosproject.pce.pceservice.PcePath;
 import org.slf4j.Logger;
@@ -33,7 +33,7 @@
 
     private static Logger log = LoggerFactory.getLogger(PceCodecRegistrator.class);
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected CodecService codecService;
 
     @Activate
diff --git a/apps/pce/pceweb/BUCK b/apps/pce/pceweb/BUCK
deleted file mode 100644
index a4a9a34..0000000
--- a/apps/pce/pceweb/BUCK
+++ /dev/null
@@ -1,20 +0,0 @@
-COMPILE_DEPS = [
-    '//lib:CORE_DEPS',
-    '//lib:JACKSON',
-    '//apps/pce/app:onos-apps-pce-app',
-    '//cli:onos-cli',
-    '//lib:org.apache.karaf.shell.console',
-    '//core/api:onos-api',
-    '//incubator/api:onos-incubator-api',
-]
-
-osgi_jar_with_tests (
-    deps = COMPILE_DEPS,
-)
-
-onos_app (
-    title = 'PCE REST API',
-    category = 'Utility',
-    url = 'http://onosproject.org',
-    description = 'Allows the user to visualize different types of paths between network entities',
-)
diff --git a/apps/pce/pceweb/src/main/java/org/onosproject/pceweb/PceWebTopovComponent.java b/apps/pce/pceweb/src/main/java/org/onosproject/pceweb/PceWebTopovComponent.java
index d9bc252..a98e8b0 100644
--- a/apps/pce/pceweb/src/main/java/org/onosproject/pceweb/PceWebTopovComponent.java
+++ b/apps/pce/pceweb/src/main/java/org/onosproject/pceweb/PceWebTopovComponent.java
@@ -17,11 +17,11 @@
 package org.onosproject.pceweb;
 
 import com.google.common.collect.ImmutableList;
-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.onosproject.ui.UiExtension;
 import org.onosproject.ui.UiExtensionService;
 import org.onosproject.ui.UiMessageHandlerFactory;
@@ -44,7 +44,7 @@
 
     private final Logger log = LoggerFactory.getLogger(getClass());
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected UiExtensionService uiExtensionService;
 
     // List of application views
diff --git a/apps/pcep-api/BUCK b/apps/pcep-api/BUCK
deleted file mode 100644
index 5751b06..0000000
--- a/apps/pcep-api/BUCK
+++ /dev/null
@@ -1,17 +0,0 @@
-COMPILE_DEPS = [
-    '//lib:CORE_DEPS',
-    '//lib:JACKSON',
-    '//protocols/ovsdb/api:onos-protocols-ovsdb-api',
-    '//protocols/ovsdb/rfc:onos-protocols-ovsdb-rfc',
-]
-
-osgi_jar_with_tests (
-    deps = COMPILE_DEPS,
-)
-
-onos_app (
-    title = 'PCEP Protocol API',
-    category = 'Protocol',
-    url = 'http://onosproject.org',
-    description = 'PCEP protocol API.',
-)
diff --git a/apps/pi-demo/common/BUCK b/apps/pi-demo/common/BUCK
deleted file mode 100644
index 132086c..0000000
--- a/apps/pi-demo/common/BUCK
+++ /dev/null
@@ -1,7 +0,0 @@
-COMPILE_DEPS = [
-    '//lib:CORE_DEPS',
-]
-
-osgi_jar (
-    deps = COMPILE_DEPS,
-)
\ No newline at end of file
diff --git a/apps/pi-demo/common/src/main/java/org/onosproject/pi/demo/app/common/AbstractUpgradableFabricApp.java b/apps/pi-demo/common/src/main/java/org/onosproject/pi/demo/app/common/AbstractUpgradableFabricApp.java
index bd12b13..ac92028 100644
--- a/apps/pi-demo/common/src/main/java/org/onosproject/pi/demo/app/common/AbstractUpgradableFabricApp.java
+++ b/apps/pi-demo/common/src/main/java/org/onosproject/pi/demo/app/common/AbstractUpgradableFabricApp.java
@@ -22,11 +22,11 @@
 import com.google.common.collect.Lists;
 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.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.onosproject.app.ApplicationAdminService;
 import org.onosproject.core.ApplicationId;
 import org.onosproject.core.CoreService;
@@ -112,28 +112,28 @@
 
     private final String appName;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected TopologyService topologyService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected DeviceService deviceService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     private HostService hostService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     private FlowRuleService flowRuleService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected GroupService groupService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     private ApplicationAdminService appService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     private CoreService coreService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     private PiPipeconfService piPipeconfService;
 
     private boolean appActive = false;
diff --git a/apps/pi-demo/ecmp/BUCK b/apps/pi-demo/ecmp/BUCK
deleted file mode 100644
index 71dcc31..0000000
--- a/apps/pi-demo/ecmp/BUCK
+++ /dev/null
@@ -1,27 +0,0 @@
-COMPILE_DEPS = [
-    '//lib:CORE_DEPS',
-    '//lib:minimal-json',
-    '//apps/pi-demo/common:onos-apps-pi-demo-common',
-    '//pipelines/basic:onos-pipelines-basic',
-]
-
-osgi_jar (
-    deps = COMPILE_DEPS,
-)
-
-BUNDLES = [
-    '//apps/pi-demo/common:onos-apps-pi-demo-common',
-    '//apps/pi-demo/ecmp:onos-apps-pi-demo-ecmp',
-]
-
-onos_app (
-    app_name = 'org.onosproject.pi-ecmp',
-    title = 'PI Demo ECMP Fabric',
-    category = 'Traffic Engineering',
-    url = 'http://onosproject.org',
-    description = 'Provides ECMP support for a 2-stage clos fabric topology of PI-enabled devices',
-    included_bundles = BUNDLES,
-    required_apps = [
-        'org.onosproject.pipelines.basic'
-    ]
-)
diff --git a/apps/pi-demo/ecmp/src/main/java/org/onosproject/pi/demo/app/ecmp/EcmpFabricApp.java b/apps/pi-demo/ecmp/src/main/java/org/onosproject/pi/demo/app/ecmp/EcmpFabricApp.java
index bb15afc..d8d7a1d 100644
--- a/apps/pi-demo/ecmp/src/main/java/org/onosproject/pi/demo/app/ecmp/EcmpFabricApp.java
+++ b/apps/pi-demo/ecmp/src/main/java/org/onosproject/pi/demo/app/ecmp/EcmpFabricApp.java
@@ -21,8 +21,8 @@
 import com.google.common.collect.Sets;
 import org.apache.commons.lang3.tuple.ImmutablePair;
 import org.apache.commons.lang3.tuple.Pair;
-import org.apache.felix.scr.annotations.Component;
-import org.apache.felix.scr.annotations.Deactivate;
+import org.osgi.service.component.annotations.Component;
+import org.osgi.service.component.annotations.Deactivate;
 import org.onlab.packet.IpAddress;
 import org.onosproject.net.DeviceId;
 import org.onosproject.net.Host;
diff --git a/apps/pim/BUCK b/apps/pim/BUCK
deleted file mode 100644
index 3eab5a8..0000000
--- a/apps/pim/BUCK
+++ /dev/null
@@ -1,29 +0,0 @@
-COMPILE_DEPS = [
-    '//lib:CORE_DEPS',
-    '//lib:JACKSON',
-    '//lib:org.apache.karaf.shell.console',
-    '//cli:onos-cli',
-    '//incubator/api:onos-incubator-api',
-    '//apps/routing-api:onos-apps-routing-api',
-    '//apps/route-service/api:onos-apps-route-service-api',
-]
-
-BUNDLES = [
-    '//apps/routing-api:onos-apps-routing-api',
-    ':onos-apps-pim',
-]
-
-osgi_jar_with_tests (
-    deps = COMPILE_DEPS,
-    resources_root = 'src/main/resources',
-    resources = glob(['src/main/resources/**']),
-)
-
-onos_app (
-    title = 'Protocol Independent Multicast Emulation',
-    category = 'Traffic Engineering',
-    url = 'http://onosproject.org',
-    description = 'Protocol independent multicast emulation.',
-    included_bundles = BUNDLES,
-    required_apps = [ 'org.onosproject.route-service' ],
-)
diff --git a/apps/pim/BUILD b/apps/pim/BUILD
index ccde728..07a729f 100644
--- a/apps/pim/BUILD
+++ b/apps/pim/BUILD
@@ -10,6 +10,7 @@
 ]
 
 osgi_jar_with_tests(
+    karaf_command_packages = ["org.onosproject.pim.cli"],
     resources = glob(["src/main/resources/**"]),
     resources_root = "src/main/resources",
     deps = COMPILE_DEPS,
diff --git a/apps/pim/src/main/java/org/onosproject/pim/cli/PimInterfacesListCommand.java b/apps/pim/src/main/java/org/onosproject/pim/cli/PimInterfacesListCommand.java
index 2fa4821..36e045e 100644
--- a/apps/pim/src/main/java/org/onosproject/pim/cli/PimInterfacesListCommand.java
+++ b/apps/pim/src/main/java/org/onosproject/pim/cli/PimInterfacesListCommand.java
@@ -16,7 +16,8 @@
 
 package org.onosproject.pim.cli;
 
-import org.apache.karaf.shell.commands.Command;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.pim.impl.PimInterface;
 import org.onosproject.pim.impl.PimInterfaceService;
@@ -26,6 +27,7 @@
 /**
  * Lists the interfaces where PIM is enabled.
  */
+@Service
 @Command(scope = "onos", name = "pim-interfaces",
         description = "Lists the interfaces where PIM is enabled")
 public class PimInterfacesListCommand extends AbstractShellCommand {
@@ -34,7 +36,7 @@
     private static final String ROUTE_FORMAT = "    %s";
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         PimInterfaceService interfaceService = get(PimInterfaceService.class);
 
         Set<PimInterface> interfaces = interfaceService.getPimInterfaces();
diff --git a/apps/pim/src/main/java/org/onosproject/pim/cli/PimNeighborsListCommand.java b/apps/pim/src/main/java/org/onosproject/pim/cli/PimNeighborsListCommand.java
index 2c71d28..659b399 100644
--- a/apps/pim/src/main/java/org/onosproject/pim/cli/PimNeighborsListCommand.java
+++ b/apps/pim/src/main/java/org/onosproject/pim/cli/PimNeighborsListCommand.java
@@ -16,7 +16,8 @@
 
 package org.onosproject.pim.cli;
 
-import org.apache.karaf.shell.commands.Command;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onlab.util.Tools;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.pim.impl.PimInterface;
@@ -28,6 +29,7 @@
 /**
  * Lists PIM neighbors.
  */
+@Service
 @Command(scope = "onos", name = "pim-neighbors",
         description = "Lists the PIM neighbors")
 public class PimNeighborsListCommand extends AbstractShellCommand {
@@ -36,7 +38,7 @@
     private static final String NEIGHBOR_FORMAT = "  neighbor=%s, uptime=%s, holdtime=%s, drPriority=%s, genId=%s";
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         PimInterfaceService interfaceService = get(PimInterfaceService.class);
 
         Set<PimInterface> interfaces = interfaceService.getPimInterfaces();
diff --git a/apps/pim/src/main/java/org/onosproject/pim/impl/PimApplication.java b/apps/pim/src/main/java/org/onosproject/pim/impl/PimApplication.java
index b8bb17b..8d76e31 100644
--- a/apps/pim/src/main/java/org/onosproject/pim/impl/PimApplication.java
+++ b/apps/pim/src/main/java/org/onosproject/pim/impl/PimApplication.java
@@ -15,11 +15,11 @@
  */
 package org.onosproject.pim.impl;
 
-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.Ethernet;
 import org.onlab.packet.IPv4;
 import org.onosproject.core.ApplicationId;
@@ -46,25 +46,25 @@
     private final Logger log = getLogger(getClass());
 
     // Used to get the appId
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected CoreService coreService;
 
     // Our application ID
     private static ApplicationId appId;
 
     // Register to receive PIM packets, used to send packets as well
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected PacketService packetService;
 
     // Use the MulticastRouteService to manage incoming PIM Join/Prune state as well as
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected MulticastRouteService ms;
 
     // Create an instance of the PIM packet handler
     protected PimPacketHandler pimPacketHandler;
 
     // Provide interfaces to the pimInterface manager as a result of Netconfig updates.
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected PimInterfaceService pimInterfaceManager;
 
     private final PimPacketProcessor processor = new PimPacketProcessor();
diff --git a/apps/pim/src/main/java/org/onosproject/pim/impl/PimInterfaceManager.java b/apps/pim/src/main/java/org/onosproject/pim/impl/PimInterfaceManager.java
index 3c75c93..31dd0a9 100644
--- a/apps/pim/src/main/java/org/onosproject/pim/impl/PimInterfaceManager.java
+++ b/apps/pim/src/main/java/org/onosproject/pim/impl/PimInterfaceManager.java
@@ -17,19 +17,7 @@
 
 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.SafeRecurringTask;
-import org.onosproject.net.intf.Interface;
-import org.onosproject.net.intf.InterfaceEvent;
-import org.onosproject.net.intf.InterfaceListener;
-import org.onosproject.net.intf.InterfaceService;
-import org.onosproject.routeservice.Route;
-import org.onosproject.routeservice.RouteService;
 import org.onosproject.net.ConnectPoint;
 import org.onosproject.net.Host;
 import org.onosproject.net.config.ConfigFactory;
@@ -38,11 +26,22 @@
 import org.onosproject.net.config.NetworkConfigRegistry;
 import org.onosproject.net.config.basics.SubjectFactories;
 import org.onosproject.net.host.HostService;
+import org.onosproject.net.intf.Interface;
+import org.onosproject.net.intf.InterfaceEvent;
+import org.onosproject.net.intf.InterfaceListener;
+import org.onosproject.net.intf.InterfaceService;
 import org.onosproject.net.mcast.McastEvent;
 import org.onosproject.net.mcast.McastListener;
 import org.onosproject.net.mcast.McastRoute;
 import org.onosproject.net.mcast.MulticastRouteService;
 import org.onosproject.net.packet.PacketService;
+import org.onosproject.routeservice.Route;
+import org.onosproject.routeservice.RouteService;
+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.Map;
@@ -58,8 +57,7 @@
  *
  * TODO: Do we need to add a ServiceListener?
  */
-@Component(immediate = true)
-@Service
+@Component(immediate = true, service = PimInterfaceService.class)
 public class PimInterfaceManager implements PimInterfaceService {
 
     private final Logger log = getLogger(getClass());
@@ -83,22 +81,22 @@
 
     private final int joinTaskPeriod = 10000;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected PacketService packetService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected NetworkConfigRegistry networkConfig;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected InterfaceService interfaceService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected HostService hostService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected MulticastRouteService multicastRouteService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected RouteService unicastRouteService;
 
     // Store PIM Interfaces in a map key'd by ConnectPoint
diff --git a/apps/pim/src/main/resources/OSGI-INF/blueprint/shell-config.xml b/apps/pim/src/main/resources/OSGI-INF/blueprint/shell-config.xml
deleted file mode 100644
index 9e71abb..0000000
--- a/apps/pim/src/main/resources/OSGI-INF/blueprint/shell-config.xml
+++ /dev/null
@@ -1,27 +0,0 @@
-<!--
-  ~ Copyright 2016-present Open Networking Foundation
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~     http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License.
-  -->
-<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0">
-
-    <command-bundle xmlns="http://karaf.apache.org/xmlns/shell/v1.1.0">
-        <command>
-            <action class="org.onosproject.pim.cli.PimInterfacesListCommand"/>
-        </command>
-        <command>
-            <action class="org.onosproject.pim.cli.PimNeighborsListCommand"/>
-        </command>
-    </command-bundle>
-
-</blueprint>
diff --git a/apps/powermanagement/BUCK b/apps/powermanagement/BUCK
deleted file mode 100644
index 41d7956..0000000
--- a/apps/powermanagement/BUCK
+++ /dev/null
@@ -1,30 +0,0 @@
-COMPILE_DEPS = [
-    '//lib:CORE_DEPS',
-    '//lib:JACKSON',
-    '//core/store/serializers:onos-core-serializers',
-    '//utils/rest:onlab-rest',
-    '//lib:javax.ws.rs-api',
-]
-
-TEST_DEPS = [
-    '//lib:TEST_REST',
-    '//core/api:onos-api-tests',
-]
-
-osgi_jar_with_tests (
-    deps = COMPILE_DEPS,
-    test_deps = TEST_DEPS,
-    web_context = '/onos/powermanagement',
-    api_title = 'Power Management API',
-    api_version = '1.0',
-    api_description = 'REST API for Power Management',
-    api_package = 'org.onosproject.powermanagement',
-)
-
-onos_app (
-    title = 'Power Management',
-    category = 'Monitoring',
-    url = 'http://onosproject.org',
-    description = 'This application provides northbound interfaces for monitoring and ' +
-        'configuring power.',
-)
diff --git a/apps/proxyarp/BUCK b/apps/proxyarp/BUCK
deleted file mode 100644
index 6923d0d..0000000
--- a/apps/proxyarp/BUCK
+++ /dev/null
@@ -1,15 +0,0 @@
-COMPILE_DEPS = [
-    '//lib:CORE_DEPS',
-    '//incubator/api:onos-incubator-api',
-]
-
-osgi_jar (
-    deps = COMPILE_DEPS,
-)
-
-onos_app (
-    title = 'Proxy ARP/NDP',
-    category = 'Traffic Engineering',
-    url = 'http://onosproject.org',
-    description = 'Proxy ARP/NDP application.',
-)
diff --git a/apps/proxyarp/src/main/java/org/onosproject/proxyarp/DefaultProxyArp.java b/apps/proxyarp/src/main/java/org/onosproject/proxyarp/DefaultProxyArp.java
index d8095bb..d07c008 100644
--- a/apps/proxyarp/src/main/java/org/onosproject/proxyarp/DefaultProxyArp.java
+++ b/apps/proxyarp/src/main/java/org/onosproject/proxyarp/DefaultProxyArp.java
@@ -16,11 +16,11 @@
 
 package org.onosproject.proxyarp;
 
-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.onosproject.core.ApplicationId;
 import org.onosproject.core.CoreService;
 import org.onosproject.net.neighbour.DefaultNeighbourMessageHandler;
@@ -43,13 +43,13 @@
 
     private static final String APP_NAME = "org.onosproject.proxyarp";
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected EdgePortService edgeService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected NeighbourResolutionService neighbourResolutionService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected CoreService coreService;
 
     private ApplicationId appId;
diff --git a/apps/rabbitmq/BUCK b/apps/rabbitmq/BUCK
deleted file mode 100644
index c283951..0000000
--- a/apps/rabbitmq/BUCK
+++ /dev/null
@@ -1,33 +0,0 @@
-COMPILE_DEPS = [
-    '//lib:CORE_DEPS',
-    '//incubator/api:onos-incubator-api',
-    '//lib:com_google_guava_guava',
-    '//lib:com_google_code_gson_gson',
-    '//lib:amqp-client',
-]
-
-TEST_DEPS = [
-    '//lib:TEST_ADAPTERS',
-]
-
-BUNDLES = [
-    '//lib:com_google_code_gson_gson',
-    '//lib:amqp-client',
-    '//apps/rabbitmq:onos-apps-rabbitmq',
-]
-
-osgi_jar_with_tests (
-    deps = COMPILE_DEPS,
-    test_deps = TEST_DEPS,
-    resources_root = 'src/main/resources',
-    resources = glob(['src/main/resources/**']),
-)
-
-onos_app (
-    title = 'Rabbit MQ Integration',
-    category = 'Integration',
-    url = 'http://onosproject.org',
-    description = 'Rabbit MQ application.',
-    required_apps = [ 'org.onosproject.proxyarp' ],
-    included_bundles = BUNDLES,
-)
diff --git a/apps/rabbitmq/src/main/java/org/onosproject/rabbitmq/listener/MQEventHandler.java b/apps/rabbitmq/src/main/java/org/onosproject/rabbitmq/listener/MQEventHandler.java
index 38c5f94..a6d54a5 100644
--- a/apps/rabbitmq/src/main/java/org/onosproject/rabbitmq/listener/MQEventHandler.java
+++ b/apps/rabbitmq/src/main/java/org/onosproject/rabbitmq/listener/MQEventHandler.java
@@ -21,11 +21,11 @@
 
 import java.util.concurrent.ExecutorService;
 
-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.onosproject.net.device.DeviceEvent;
 import org.onosproject.net.device.DeviceListener;
 import org.onosproject.net.device.DeviceService;
@@ -62,13 +62,13 @@
     private static final String PROVIDER_NAME = MQConstants.ONOS_APP_NAME;
     private static final int PKT_PROC_PRIO = 1;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected DeviceService deviceService;
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected PacketService packetService;
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected LinkService linkService;
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected TopologyService topologyService;
 
     private MQService mqService;
diff --git a/apps/reactive-routing/BUCK b/apps/reactive-routing/BUCK
deleted file mode 100644
index 4157a55..0000000
--- a/apps/reactive-routing/BUCK
+++ /dev/null
@@ -1,21 +0,0 @@
-COMPILE_DEPS = [
-    '//lib:CORE_DEPS',
-    '//lib:JACKSON',
-    '//lib:concurrent-trees',
-    '//incubator/api:onos-incubator-api',
-    '//apps/routing-api:onos-apps-routing-api',
-    '//apps/intentsync:onos-apps-intentsync',
-    '//apps/route-service/api:onos-apps-route-service-api',
-]
-
-osgi_jar (
-    deps = COMPILE_DEPS,
-)
-
-onos_app (
-    title = 'SDN-IP Reactive Routing',
-    category = 'Traffic Engineering',
-    url = 'http://onosproject.org',
-    description = 'SDN-IP reactive routing application.',
-    required_apps = [ 'org.onosproject.intentsynchronizer', 'org.onosproject.sdnip', 'org.onosproject.route-service'],
-)
diff --git a/apps/reactive-routing/features.xml b/apps/reactive-routing/features.xml
deleted file mode 100644
index 2158a68..0000000
--- a/apps/reactive-routing/features.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
-<!--
-  ~ Copyright 2016-present Open Networking Foundation
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~     http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License.
-  -->
-<features xmlns="http://karaf.apache.org/xmlns/features/v1.2.0" name="${project.artifactId}-${project.version}">
-    <feature name="onos-apps-reactive-routing" version="${project.version}"
-             description="${project.description}">
-        <feature>onos-api</feature>
-        <bundle>mvn:${project.groupId}/onos-apps-reactive-routing/${project.version}</bundle>
-        <bundle>mvn:${project.groupId}/onos-apps-routing-api/${project.version}</bundle>
-        <bundle>mvn:${project.groupId}/onos-apps-routing-common/${project.version}</bundle>
-    </feature>
-</features>
diff --git a/apps/reactive-routing/src/main/java/org/onosproject/reactive/routing/ReactiveRoutingConfiguration.java b/apps/reactive-routing/src/main/java/org/onosproject/reactive/routing/ReactiveRoutingConfiguration.java
index 8d01036..3288d7d 100644
--- a/apps/reactive-routing/src/main/java/org/onosproject/reactive/routing/ReactiveRoutingConfiguration.java
+++ b/apps/reactive-routing/src/main/java/org/onosproject/reactive/routing/ReactiveRoutingConfiguration.java
@@ -20,12 +20,6 @@
 import com.googlecode.concurrenttrees.radix.node.concrete.DefaultByteArrayNodeFactory;
 import com.googlecode.concurrenttrees.radixinverted.ConcurrentInvertedRadixTree;
 import com.googlecode.concurrenttrees.radixinverted.InvertedRadixTree;
-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.packet.Ip4Address;
 import org.onlab.packet.Ip6Address;
 import org.onlab.packet.IpAddress;
@@ -33,8 +27,6 @@
 import org.onlab.packet.MacAddress;
 import org.onosproject.core.ApplicationId;
 import org.onosproject.core.CoreService;
-import org.onosproject.net.intf.Interface;
-import org.onosproject.net.intf.InterfaceService;
 import org.onosproject.net.ConnectPoint;
 import org.onosproject.net.config.ConfigFactory;
 import org.onosproject.net.config.NetworkConfigEvent;
@@ -42,8 +34,15 @@
 import org.onosproject.net.config.NetworkConfigRegistry;
 import org.onosproject.net.config.NetworkConfigService;
 import org.onosproject.net.config.basics.SubjectFactories;
+import org.onosproject.net.intf.Interface;
+import org.onosproject.net.intf.InterfaceService;
 import org.onosproject.routing.RoutingService;
 import org.onosproject.routing.config.BgpConfig;
+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;
 
@@ -57,23 +56,22 @@
 /**
  * Reactive routing configuration manager.
  */
-@Component(immediate = true)
-@Service
+@Component(immediate = true, service = ReactiveRoutingConfigurationService.class)
 public class ReactiveRoutingConfiguration implements
         ReactiveRoutingConfigurationService {
 
     private final Logger log = LoggerFactory.getLogger(getClass());
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected NetworkConfigRegistry registry;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected NetworkConfigService configService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected CoreService coreService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected InterfaceService interfaceService;
 
     private Set<IpAddress> gatewayIpAddresses = new HashSet<>();
diff --git a/apps/reactive-routing/src/main/java/org/onosproject/reactive/routing/SdnIpReactiveRouting.java b/apps/reactive-routing/src/main/java/org/onosproject/reactive/routing/SdnIpReactiveRouting.java
index 906e34d..f05d63b 100644
--- a/apps/reactive-routing/src/main/java/org/onosproject/reactive/routing/SdnIpReactiveRouting.java
+++ b/apps/reactive-routing/src/main/java/org/onosproject/reactive/routing/SdnIpReactiveRouting.java
@@ -15,11 +15,11 @@
  */
 package org.onosproject.reactive.routing;
 
-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.ARP;
 import org.onlab.packet.EthType;
 import org.onlab.packet.Ethernet;
@@ -74,25 +74,25 @@
     private static final String APP_NAME = "org.onosproject.reactive.routing";
     private final Logger log = getLogger(getClass());
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected CoreService coreService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected PacketService packetService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected RouteService routeService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected IntentSynchronizationService intentSynchronizer;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected ReactiveRoutingConfigurationService config;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected InterfaceService interfaceService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected HostService hostService;
 
     private ApplicationId appId;
diff --git a/apps/restconf/BUCK b/apps/restconf/BUCK
deleted file mode 100644
index 2ce6c79..0000000
--- a/apps/restconf/BUCK
+++ /dev/null
@@ -1,19 +0,0 @@
-BUNDLES = [
-    '//apps/restconf/api:onos-apps-restconf-api',
-    '//apps/restconf/utils:onos-apps-restconf-utils',
-    '//apps/restconf/restconfmgr:onos-apps-restconf-restconfmgr',
-]
-
-APPS = [
-    'org.onosproject.yang',
-    'org.onosproject.config',
-]
-
-onos_app (
-    app_name = 'org.onosproject.restconf',
-    title = 'RESTCONF Application Module',
-    category = 'Utility',
-    url = 'http://onosproject.org',
-    included_bundles = BUNDLES,
-    required_apps = APPS,
-)
diff --git a/apps/restconf/api/BUCK b/apps/restconf/api/BUCK
deleted file mode 100644
index 39a3872..0000000
--- a/apps/restconf/api/BUCK
+++ /dev/null
@@ -1,16 +0,0 @@
-COMPILE_DEPS = [
-    '//lib:CORE_DEPS',
-    '//lib:JACKSON',
-    '//lib:jersey-client',
-    '//lib:javax.ws.rs-api',
-    '//lib:jersey-server',
-]
-
-TEST_DEPS = [
-    '//lib:TEST_REST',
-]
-
-osgi_jar_with_tests (
-    deps = COMPILE_DEPS,
-    test_deps = TEST_DEPS,
-)
diff --git a/apps/restconf/app/app.xml b/apps/restconf/app/app.xml
deleted file mode 100644
index ca7f79b..0000000
--- a/apps/restconf/app/app.xml
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-  ~ Copyright 2016-present Open Networking Foundation
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~     http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License.
-  -->
-<app name="org.onosproject.restconf" origin="ON.Lab" version="${project.version}"
-     category="Utility" url="http://onosproject.org" title="RESTCONF Service Module App"
-     featuresRepo="mvn:${project.groupId}/${project.artifactId}/${project.version}/xml/features"
-     features="${project.artifactId}" >
-    <description>${project.description}</description>
-    <artifact>mvn:${project.groupId}/onos-apps-restconf-api/${project.version}</artifact>
-    <artifact>mvn:${project.groupId}/onos-apps-restconf-restconfmgr/${project.version}</artifact>
-</app>
diff --git a/apps/restconf/app/features.xml b/apps/restconf/app/features.xml
deleted file mode 100644
index cf84a3e..0000000
--- a/apps/restconf/app/features.xml
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
-<!--
-  ~ Copyright 2016-present Open Networking Foundation
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~     http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License.
-  -->
-<features xmlns="http://karaf.apache.org/xmlns/features/v1.2.0" name="${project.artifactId}-${project.version}">
-    <feature name="${project.artifactId}" version="${project.version}"
-             description="${project.description}">
-        <feature>onos-api</feature>
-        <bundle>mvn:${project.groupId}/onos-apps-restconf-api/${project.version}</bundle>
-        <bundle>mvn:${project.groupId}/onos-apps-restconf-restconfmgr/${project.version}</bundle>
-    </feature>
-</features>
diff --git a/apps/restconf/restconfmgr/BUCK b/apps/restconf/restconfmgr/BUCK
deleted file mode 100644
index 742d1cc..0000000
--- a/apps/restconf/restconfmgr/BUCK
+++ /dev/null
@@ -1,19 +0,0 @@
-COMPILE_DEPS = [
-    '//lib:CORE_DEPS',
-    '//lib:ONOS_YANG',
-    '//lib:JACKSON',
-    '//lib:jersey-client',
-    '//lib:jersey-server',
-    '//lib:javax.ws.rs-api',
-    '//incubator/api:onos-incubator-api',
-    '//lib:COMPILE',
-    '//core/store/serializers:onos-core-serializers',
-    '//apps/restconf/api:onos-apps-restconf-api',
-    '//apps/restconf/utils:onos-apps-restconf-utils',
-    '//apps/config:onos-apps-config',
-    '//lib:onos-yang-runtime',
-]
-
-osgi_jar_with_tests (
-    deps = COMPILE_DEPS,
-)
diff --git a/apps/restconf/restconfmgr/src/main/java/org/onosproject/restconf/restconfmanager/RestconfManager.java b/apps/restconf/restconfmgr/src/main/java/org/onosproject/restconf/restconfmanager/RestconfManager.java
index 673ee62..f672e0b 100644
--- a/apps/restconf/restconfmgr/src/main/java/org/onosproject/restconf/restconfmanager/RestconfManager.java
+++ b/apps/restconf/restconfmgr/src/main/java/org/onosproject/restconf/restconfmanager/RestconfManager.java
@@ -18,12 +18,6 @@
 
 import com.fasterxml.jackson.databind.node.ObjectNode;
 import com.google.common.util.concurrent.ThreadFactoryBuilder;
-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.glassfish.jersey.server.ChunkedOutput;
 import org.onosproject.config.DynamicConfigService;
 import org.onosproject.config.FailedException;
@@ -45,6 +39,11 @@
 import org.onosproject.yang.model.RpcInput;
 import org.onosproject.yang.model.RpcOutput;
 import org.onosproject.yang.model.SchemaId;
+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;
 
@@ -79,8 +78,7 @@
  *    on the YANG data objects (i.e., resource id, yang data node).
  */
 
-@Component(immediate = true)
-@Service
+@Component(immediate = true, service = RestconfService.class)
 public class RestconfManager implements RestconfService {
 
     private static final String RESTCONF_ROOT = "/onos/restconf";
@@ -89,7 +87,7 @@
 
     private final Logger log = LoggerFactory.getLogger(getClass());
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected DynamicConfigService dynamicConfigService;
 
     private ExecutorService workerThreadPool;
diff --git a/apps/restconf/utils/BUCK b/apps/restconf/utils/BUCK
deleted file mode 100644
index 8ebc904..0000000
--- a/apps/restconf/utils/BUCK
+++ /dev/null
@@ -1,17 +0,0 @@
-COMPILE_DEPS = [
-    '//lib:CORE_DEPS',
-    '//lib:JACKSON',
-    '//lib:jersey-client',
-    '//lib:jersey-server',
-    '//lib:javax.ws.rs-api',
-    '//lib:easymock',
-    '//utils/rest:onlab-rest',
-    '//apps/restconf/api:onos-apps-restconf-api',
-    '//lib:onos-yang-model',
-    '//lib:onos-yang-compiler-api',
-    '//lib:onos-yang-runtime',
-]
-
-osgi_jar_with_tests (
-    deps = COMPILE_DEPS,
-)
diff --git a/apps/roadm/BUCK b/apps/roadm/BUCK
deleted file mode 100644
index 042bd52..0000000
--- a/apps/roadm/BUCK
+++ /dev/null
@@ -1,25 +0,0 @@
-COMPILE_DEPS = [
-    '//lib:CORE_DEPS',
-    '//lib:JACKSON',
-    '//core/store/serializers:onos-core-serializers',
-    '//apps/optical-model:onos-apps-optical-model',
-]
-
-TEST_DEPS = [
-    '//lib:TEST_REST',
-    '//core/api:onos-api-tests',
-]
-
-osgi_jar_with_tests (
-    deps = COMPILE_DEPS,
-    test_deps = TEST_DEPS,
-)
-
-onos_app (
-    title = 'ROADM',
-    category = 'Optical',
-    url = 'http://onosproject.org',
-    description = 'This application provides an interface and web GUI for monitoring and ' +
-        'configuring power on ROADM devices.',
-    required_apps = [ 'org.onosproject.optical-model' ],
-)
diff --git a/apps/roadm/src/main/java/org/onosproject/roadm/DistributedRoadmStore.java b/apps/roadm/src/main/java/org/onosproject/roadm/DistributedRoadmStore.java
index 7cd2ea4..c137c13 100644
--- a/apps/roadm/src/main/java/org/onosproject/roadm/DistributedRoadmStore.java
+++ b/apps/roadm/src/main/java/org/onosproject/roadm/DistributedRoadmStore.java
@@ -15,37 +15,34 @@
  */
 package org.onosproject.roadm;
 
-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.net.DeviceId;
 import org.onosproject.net.PortNumber;
 import org.onosproject.store.serializers.KryoNamespaces;
 import org.onosproject.store.service.ConsistentMap;
 import org.onosproject.store.service.Serializer;
 import org.onosproject.store.service.StorageService;
+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.util.HashMap;
 import java.util.Map;
 
 /**
  * Manages the port target powers for ROADM devices.
  */
-@Component(immediate = true)
-@Service
+@Component(immediate = true, service = RoadmStore.class)
 public class DistributedRoadmStore implements RoadmStore {
     private static Logger log = LoggerFactory.getLogger(DistributedRoadmStore.class);
 
     private ConsistentMap<DeviceId, Map<PortNumber, Long>> distPowerMap;
     private Map<DeviceId, Map<PortNumber, Long>> powerMap;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected StorageService storageService;
 
     @Activate
diff --git a/apps/roadm/src/main/java/org/onosproject/roadm/RoadmComponent.java b/apps/roadm/src/main/java/org/onosproject/roadm/RoadmComponent.java
index 5056b71..0526c78 100644
--- a/apps/roadm/src/main/java/org/onosproject/roadm/RoadmComponent.java
+++ b/apps/roadm/src/main/java/org/onosproject/roadm/RoadmComponent.java
@@ -16,11 +16,11 @@
 package org.onosproject.roadm;
 
 import com.google.common.collect.ImmutableList;
-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.onosproject.ui.UiExtension;
 import org.onosproject.ui.UiExtensionService;
 import org.onosproject.ui.UiMessageHandlerFactory;
@@ -44,7 +44,7 @@
 
     private final Logger log = LoggerFactory.getLogger(getClass());
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected UiExtensionService uiExtensionService;
 
     // List of application views
diff --git a/apps/roadm/src/main/java/org/onosproject/roadm/RoadmManager.java b/apps/roadm/src/main/java/org/onosproject/roadm/RoadmManager.java
index d5bd501..2abe2a6 100644
--- a/apps/roadm/src/main/java/org/onosproject/roadm/RoadmManager.java
+++ b/apps/roadm/src/main/java/org/onosproject/roadm/RoadmManager.java
@@ -17,12 +17,6 @@
 
 import com.google.common.collect.ImmutableMap;
 import com.google.common.collect.Range;
-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.core.ApplicationId;
 import org.onosproject.core.CoreService;
 import org.onosproject.net.ChannelSpacing;
@@ -36,8 +30,8 @@
 import org.onosproject.net.PortNumber;
 import org.onosproject.net.behaviour.LambdaQuery;
 import org.onosproject.net.behaviour.PowerConfig;
-import org.onosproject.net.behaviour.protection.ProtectionConfigBehaviour;
 import org.onosproject.net.behaviour.protection.ProtectedTransportEndpointState;
+import org.onosproject.net.behaviour.protection.ProtectionConfigBehaviour;
 import org.onosproject.net.behaviour.protection.TransportEndpointState;
 import org.onosproject.net.device.DeviceEvent;
 import org.onosproject.net.device.DeviceListener;
@@ -53,7 +47,11 @@
 import org.onosproject.net.flow.TrafficTreatment;
 import org.onosproject.net.flow.criteria.Criteria;
 import org.onosproject.net.flow.instructions.Instructions;
-
+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;
 
@@ -74,8 +72,7 @@
 /**
  * Application for monitoring and configuring ROADM devices.
  */
-@Component(immediate = true)
-@Service
+@Component(immediate = true, service = RoadmService.class)
 public class RoadmManager implements RoadmService {
 
     private static final String APP_NAME = "org.onosproject.roadm";
@@ -85,16 +82,16 @@
 
     private DeviceListener deviceListener = new InternalDeviceListener();
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected RoadmStore roadmStore;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected CoreService coreService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected DeviceService deviceService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected FlowRuleService flowRuleService;
 
     @Activate
diff --git a/apps/route-service/BUCK b/apps/route-service/BUCK
deleted file mode 100644
index d7ebe99..0000000
--- a/apps/route-service/BUCK
+++ /dev/null
@@ -1,11 +0,0 @@
-BUNDLES = [
-    '//apps/route-service/api:onos-apps-route-service-api',
-    '//apps/route-service/app:onos-apps-route-service-app',
-]
-
-onos_app (
-    title = 'Route Service Server',
-    category = 'Utility',
-    url = 'http://onosproject.org',
-    included_bundles = BUNDLES,
-)
diff --git a/apps/route-service/api/BUCK b/apps/route-service/api/BUCK
deleted file mode 100644
index 3b7812b..0000000
--- a/apps/route-service/api/BUCK
+++ /dev/null
@@ -1,14 +0,0 @@
-COMPILE_DEPS = [
-    '//lib:CORE_DEPS',
-    '//lib:JACKSON',
-]
-
-TEST_DEPS = [
-    '//lib:TEST',
-    '//core/api:onos-api-tests',
-]
-
-osgi_jar_with_tests (
-    deps = COMPILE_DEPS,
-    test_deps = TEST_DEPS,
-)
diff --git a/apps/route-service/app/BUCK b/apps/route-service/app/BUCK
deleted file mode 100644
index f9233bb..0000000
--- a/apps/route-service/app/BUCK
+++ /dev/null
@@ -1,29 +0,0 @@
-COMPILE_DEPS = [
-    '//lib:CORE_DEPS',
-    '//lib:JACKSON',
-    '//lib:KRYO',
-    '//lib:concurrent-trees',
-    '//lib:javax.ws.rs-api',
-    '//lib:jersey-server',
-    '//core/store/serializers:onos-core-serializers',
-    '//apps/route-service/api:onos-apps-route-service-api',
-    '//cli:onos-cli',
-    '//lib:org.apache.karaf.shell.console',
-    '//utils/rest:onlab-rest',
-]
-
-TEST_DEPS = [
-    '//lib:TEST',
-    '//apps/route-service/api:onos-apps-route-service-api-tests',
-    '//core/api:onos-api-tests',
-]
-
-osgi_jar_with_tests (
-    deps = COMPILE_DEPS,
-    test_deps = TEST_DEPS,
-    web_context = '/onos/routeservice',
-    api_title = 'Route Service App',
-    api_version = '1.0',
-    api_description = 'REST API for Route Service App',
-    api_package = 'org.onosproject.routeservice.rest',
-)
diff --git a/apps/route-service/app/BUILD b/apps/route-service/app/BUILD
index 885fa8b..0f1c1f4 100644
--- a/apps/route-service/app/BUILD
+++ b/apps/route-service/app/BUILD
@@ -11,6 +11,7 @@
 ]
 
 osgi_jar_with_tests(
+    karaf_command_packages = ["org.onosproject.routeservice.cli"],
     test_deps = TEST_DEPS,
     deps = COMPILE_DEPS,
     #web_context = "/onos/routeservice",
diff --git a/apps/route-service/app/app.xml b/apps/route-service/app/app.xml
deleted file mode 100644
index 3ed0537..0000000
--- a/apps/route-service/app/app.xml
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-  ~ Copyright 2015-present Open Networking Foundation
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~     http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License.
-  -->
-<app name="org.onosproject.routeservice" origin="Open Networking Foundation" version="${project.version}"
-     category="Utility" url="http://onosproject.org" title="Route Service App"
-     featuresRepo="mvn:${project.groupId}/${project.artifactId}/${project.version}/xml/features"
-     features="${project.artifactId}">
-    <description>${project.description}</description>
-    <artifact>mvn:${project.groupId}/${project.artifactId}/${project.version}</artifact>
-    <artifact>mvn:${project.groupId}/onos-apps-route-service-api/${project.version}</artifact>
-</app>
diff --git a/apps/route-service/app/features.xml b/apps/route-service/app/features.xml
deleted file mode 100644
index 165bee4..0000000
--- a/apps/route-service/app/features.xml
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
-<!--
-  ~ Copyright 2015-present Open Networking Foundation
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~     http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License.
-  -->
-<features xmlns="http://karaf.apache.org/xmlns/features/v1.2.0" name="${project.artifactId}-${project.version}">
-    <feature name="${project.artifactId}" version="${project.version}"
-             description="${project.description}">
-        <feature>onos-api</feature>
-        <bundle>mvn:${project.groupId}/onos-apps-route-service-api/${project.version}</bundle>
-        <bundle>mvn:${project.groupId}/onos-apps-route-service/${project.version}</bundle>
-    </feature>
-</features>
diff --git a/apps/route-service/app/src/main/java/org/onosproject/routeservice/cli/RouteAddCommand.java b/apps/route-service/app/src/main/java/org/onosproject/routeservice/cli/RouteAddCommand.java
index 1810a07..e104d4c 100644
--- a/apps/route-service/app/src/main/java/org/onosproject/routeservice/cli/RouteAddCommand.java
+++ b/apps/route-service/app/src/main/java/org/onosproject/routeservice/cli/RouteAddCommand.java
@@ -16,8 +16,9 @@
 
 package org.onosproject.routeservice.cli;
 
-import org.apache.karaf.shell.commands.Argument;
-import org.apache.karaf.shell.commands.Command;
+import org.apache.karaf.shell.api.action.Argument;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onlab.packet.IpAddress;
 import org.onlab.packet.IpPrefix;
 import org.onosproject.cli.AbstractShellCommand;
@@ -29,6 +30,7 @@
 /**
  * Command to add a route to the routing table.
  */
+@Service
 @Command(scope = "onos", name = "route-add",
         description = "Adds a route to the route table")
 public class RouteAddCommand extends AbstractShellCommand {
@@ -42,7 +44,7 @@
     String nextHopString = null;
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         RouteAdminService service = AbstractShellCommand.get(RouteAdminService.class);
 
         IpPrefix prefix = IpPrefix.valueOf(prefixString);
diff --git a/apps/route-service/app/src/main/java/org/onosproject/routeservice/cli/RouteRemoveCommand.java b/apps/route-service/app/src/main/java/org/onosproject/routeservice/cli/RouteRemoveCommand.java
index 24ecc71..8fb29ec 100644
--- a/apps/route-service/app/src/main/java/org/onosproject/routeservice/cli/RouteRemoveCommand.java
+++ b/apps/route-service/app/src/main/java/org/onosproject/routeservice/cli/RouteRemoveCommand.java
@@ -16,8 +16,9 @@
 
 package org.onosproject.routeservice.cli;
 
-import org.apache.karaf.shell.commands.Argument;
-import org.apache.karaf.shell.commands.Command;
+import org.apache.karaf.shell.api.action.Argument;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onlab.packet.IpAddress;
 import org.onlab.packet.IpPrefix;
 import org.onosproject.cli.AbstractShellCommand;
@@ -29,6 +30,7 @@
 /**
  * Command to remove a route from the routing table.
  */
+@Service
 @Command(scope = "onos", name = "route-remove",
         description = "Removes a route from the route table")
 public class RouteRemoveCommand extends AbstractShellCommand {
@@ -46,7 +48,7 @@
     String source = null;
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         RouteAdminService service = AbstractShellCommand.get(RouteAdminService.class);
 
         IpPrefix prefix = IpPrefix.valueOf(prefixString);
diff --git a/apps/route-service/app/src/main/java/org/onosproject/routeservice/cli/RouteStoreCommand.java b/apps/route-service/app/src/main/java/org/onosproject/routeservice/cli/RouteStoreCommand.java
index 2aefbf7..64ec0a2 100644
--- a/apps/route-service/app/src/main/java/org/onosproject/routeservice/cli/RouteStoreCommand.java
+++ b/apps/route-service/app/src/main/java/org/onosproject/routeservice/cli/RouteStoreCommand.java
@@ -15,19 +15,21 @@
  */
 package org.onosproject.routeservice.cli;
 
-import org.apache.karaf.shell.commands.Command;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.routeservice.RouteStore;
 
 /**
  * Command to show the current route store implementation.
  */
+@Service
 @Command(scope = "onos", name = "route-store",
         description = "Show the current route store implementation.")
 public class RouteStoreCommand extends AbstractShellCommand {
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         RouteStore routeStore = AbstractShellCommand.get(RouteStore.class);
         print(routeStore.name());
     }
diff --git a/apps/route-service/app/src/main/java/org/onosproject/routeservice/cli/RoutesListCommand.java b/apps/route-service/app/src/main/java/org/onosproject/routeservice/cli/RoutesListCommand.java
index 665b432..e2cb714 100644
--- a/apps/route-service/app/src/main/java/org/onosproject/routeservice/cli/RoutesListCommand.java
+++ b/apps/route-service/app/src/main/java/org/onosproject/routeservice/cli/RoutesListCommand.java
@@ -19,7 +19,8 @@
 import com.fasterxml.jackson.databind.ObjectMapper;
 import com.fasterxml.jackson.databind.node.ArrayNode;
 import com.fasterxml.jackson.databind.node.ObjectNode;
-import org.apache.karaf.shell.commands.Command;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.routeservice.ResolvedRoute;
 import org.onosproject.routeservice.RouteInfo;
@@ -34,6 +35,7 @@
 /**
  * Command to show the routes in the routing tables.
  */
+@Service
 @Command(scope = "onos", name = "routes",
         description = "Lists routes in the route store")
 public class RoutesListCommand extends AbstractShellCommand {
@@ -50,7 +52,7 @@
     private static final String FORMAT_TOTAL = "   Total: %d";
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         RouteService service = AbstractShellCommand.get(RouteService.class);
 
         if (outputJson()) {
diff --git a/apps/route-service/app/src/main/java/org/onosproject/routeservice/impl/ConfigurationRouteSource.java b/apps/route-service/app/src/main/java/org/onosproject/routeservice/impl/ConfigurationRouteSource.java
index eb6733f..bad5b92 100644
--- a/apps/route-service/app/src/main/java/org/onosproject/routeservice/impl/ConfigurationRouteSource.java
+++ b/apps/route-service/app/src/main/java/org/onosproject/routeservice/impl/ConfigurationRouteSource.java
@@ -16,11 +16,11 @@
 
 package org.onosproject.routeservice.impl;
 
-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.onosproject.core.ApplicationId;
 import org.onosproject.routeservice.Route;
 import org.onosproject.routeservice.RouteAdminService;
@@ -40,10 +40,10 @@
 @Component(immediate = true)
 public class ConfigurationRouteSource {
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected NetworkConfigRegistry netcfgRegistry;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected RouteAdminService routeService;
 
     private final ConfigFactory<ApplicationId, RouteConfig> routeConfigFactory =
diff --git a/apps/route-service/app/src/main/java/org/onosproject/routeservice/impl/RouteManager.java b/apps/route-service/app/src/main/java/org/onosproject/routeservice/impl/RouteManager.java
index d45415b..afa9cd6 100644
--- a/apps/route-service/app/src/main/java/org/onosproject/routeservice/impl/RouteManager.java
+++ b/apps/route-service/app/src/main/java/org/onosproject/routeservice/impl/RouteManager.java
@@ -17,15 +17,13 @@
 package org.onosproject.routeservice.impl;
 
 import com.google.common.collect.ImmutableList;
-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.packet.IpAddress;
 import org.onlab.packet.IpPrefix;
 import org.onosproject.cluster.ClusterService;
+import org.onosproject.net.Host;
+import org.onosproject.net.host.HostEvent;
+import org.onosproject.net.host.HostListener;
+import org.onosproject.net.host.HostService;
 import org.onosproject.routeservice.InternalRouteEvent;
 import org.onosproject.routeservice.ResolvedRoute;
 import org.onosproject.routeservice.Route;
@@ -38,11 +36,12 @@
 import org.onosproject.routeservice.RouteStore;
 import org.onosproject.routeservice.RouteStoreDelegate;
 import org.onosproject.routeservice.RouteTableId;
-import org.onosproject.net.Host;
-import org.onosproject.net.host.HostEvent;
-import org.onosproject.net.host.HostListener;
-import org.onosproject.net.host.HostService;
 import org.onosproject.store.service.StorageService;
+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;
 
@@ -67,8 +66,7 @@
 /**
  * Implementation of the unicast route service.
  */
-@Service
-@Component
+@Component(service = { RouteService.class, RouteAdminService.class })
 public class RouteManager implements RouteService, RouteAdminService {
 
     private final Logger log = LoggerFactory.getLogger(getClass());
@@ -76,16 +74,16 @@
     private RouteStoreDelegate delegate = new InternalRouteStoreDelegate();
     private InternalHostListener hostListener = new InternalHostListener();
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected RouteStore routeStore;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected HostService hostService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected ClusterService clusterService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected StorageService storageService;
 
     private ResolvedRouteStore resolvedRouteStore;
diff --git a/apps/route-service/app/src/main/java/org/onosproject/routeservice/rest/RouteServiceCodecRegistrator.java b/apps/route-service/app/src/main/java/org/onosproject/routeservice/rest/RouteServiceCodecRegistrator.java
index 2868e5f..736fbea 100644
--- a/apps/route-service/app/src/main/java/org/onosproject/routeservice/rest/RouteServiceCodecRegistrator.java
+++ b/apps/route-service/app/src/main/java/org/onosproject/routeservice/rest/RouteServiceCodecRegistrator.java
@@ -15,11 +15,11 @@
  */
 package org.onosproject.routeservice.rest;
 
-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.onosproject.codec.CodecService;
 import org.onosproject.routeservice.Route;
 import org.slf4j.Logger;
@@ -34,7 +34,7 @@
 
     private static Logger log = LoggerFactory.getLogger(RouteServiceCodecRegistrator.class);
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected CodecService codecService;
 
     @Activate
diff --git a/apps/route-service/app/src/main/java/org/onosproject/routeservice/store/OsgiPropertyConstants.java b/apps/route-service/app/src/main/java/org/onosproject/routeservice/store/OsgiPropertyConstants.java
new file mode 100644
index 0000000..e21155b
--- /dev/null
+++ b/apps/route-service/app/src/main/java/org/onosproject/routeservice/store/OsgiPropertyConstants.java
@@ -0,0 +1,25 @@
+/*
+ * Copyright 2018-present Open Networking Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.onosproject.routeservice.store;
+
+public final class OsgiPropertyConstants {
+    private OsgiPropertyConstants() {
+    }
+
+    static final String DISTRIBUTED = "distributed";
+    static final boolean DISTRIBUTED_DEFAULT = false;
+}
diff --git a/apps/route-service/app/src/main/java/org/onosproject/routeservice/store/RouteStoreImpl.java b/apps/route-service/app/src/main/java/org/onosproject/routeservice/store/RouteStoreImpl.java
index 7e3ea9f..edd22c3 100644
--- a/apps/route-service/app/src/main/java/org/onosproject/routeservice/store/RouteStoreImpl.java
+++ b/apps/route-service/app/src/main/java/org/onosproject/routeservice/store/RouteStoreImpl.java
@@ -16,13 +16,6 @@
 
 package org.onosproject.routeservice.store;
 
-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.packet.IpAddress;
 import org.onlab.packet.IpPrefix;
 import org.onlab.util.Tools;
@@ -37,6 +30,11 @@
 import org.onosproject.store.service.StorageService;
 import org.osgi.service.component.ComponentContext;
 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 org.slf4j.LoggerFactory;
 
@@ -44,23 +42,29 @@
 import java.util.Dictionary;
 import java.util.Set;
 
+import static org.onosproject.routeservice.store.OsgiPropertyConstants.DISTRIBUTED;
+import static org.onosproject.routeservice.store.OsgiPropertyConstants.DISTRIBUTED_DEFAULT;
+
 /**
  * An implementation of RouteStore that is backed by either LocalRouteStore or
  * DistributedRouteStore according to configuration.
  */
-@Service
-@Component
+@Component(
+    service = RouteStore.class,
+    property = {
+        DISTRIBUTED + ":Boolean=" + DISTRIBUTED_DEFAULT
+    }
+)
 public class RouteStoreImpl extends AbstractStore<InternalRouteEvent, RouteStoreDelegate>
         implements RouteStore {
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected ComponentConfigService componentConfigService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     public StorageService storageService;
 
-    @Property(name = "distributed", boolValue = false,
-            label = "Enable distributed route store")
+    /** Enable distributed route store. */
     private boolean distributed;
 
     private final Logger log = LoggerFactory.getLogger(getClass());
@@ -95,7 +99,7 @@
             return;
         }
 
-        String strDistributed = Tools.get(properties, "distributed");
+        String strDistributed = Tools.get(properties, DISTRIBUTED);
         boolean expectDistributed = Boolean.parseBoolean(strDistributed);
 
         // Start route store during first start or config change
diff --git a/apps/route-service/app/src/main/resources/OSGI-INF/blueprint/shell-config.xml b/apps/route-service/app/src/main/resources/OSGI-INF/blueprint/shell-config.xml
deleted file mode 100644
index a020c3b..0000000
--- a/apps/route-service/app/src/main/resources/OSGI-INF/blueprint/shell-config.xml
+++ /dev/null
@@ -1,35 +0,0 @@
-<!--
-  ~ Copyright 2014-present Open Networking Foundation
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~     http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-        ~ limitations under the License.
-  -->
-<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0">
-
-    <command-bundle xmlns="http://karaf.apache.org/xmlns/shell/v1.1.0">
-
-        <command>
-            <action class="org.onosproject.routeservice.cli.RoutesListCommand"/>
-        </command>
-        <command>
-            <action class="org.onosproject.routeservice.cli.RouteAddCommand"/>
-        </command>
-        <command>
-            <action class="org.onosproject.routeservice.cli.RouteRemoveCommand"/>
-        </command>
-        <command>
-            <action class="org.onosproject.routeservice.cli.RouteStoreCommand"/>
-        </command>
-
-    </command-bundle>
-
-</blueprint>
diff --git a/apps/routeradvertisement/BUCK b/apps/routeradvertisement/BUCK
deleted file mode 100644
index c414ec3..0000000
--- a/apps/routeradvertisement/BUCK
+++ /dev/null
@@ -1,23 +0,0 @@
-COMPILE_DEPS = [
-    '//lib:CORE_DEPS',
-    '//lib:JACKSON',
-    '//incubator/api:onos-incubator-api',
-    '//lib:org.apache.karaf.shell.console',
-    '//cli:onos-cli'
-]
-
-TEST_DEPS = [
-    '//lib:TEST_ADAPTERS',
-]
-
-osgi_jar_with_tests (
-    deps = COMPILE_DEPS,
-    test_deps = TEST_DEPS,
-)
-
-onos_app (
-    title = 'IPv6 RA Generator',
-    category = 'Traffic Engineering',
-    url = 'http://onosproject.org',
-    description = 'Application for generating IPv6 RAs',
-)
diff --git a/apps/routeradvertisement/BUILD b/apps/routeradvertisement/BUILD
index abca366..452fc52 100644
--- a/apps/routeradvertisement/BUILD
+++ b/apps/routeradvertisement/BUILD
@@ -3,6 +3,7 @@
 ]
 
 osgi_jar_with_tests(
+    karaf_command_packages = ["org.onosproject.ra.cli"],
     test_deps = TEST_ADAPTERS,
     deps = COMPILE_DEPS,
 )
diff --git a/apps/routeradvertisement/src/main/java/org/onosproject/ra/OsgiPropertyConstants.java b/apps/routeradvertisement/src/main/java/org/onosproject/ra/OsgiPropertyConstants.java
new file mode 100644
index 0000000..e9784ec
--- /dev/null
+++ b/apps/routeradvertisement/src/main/java/org/onosproject/ra/OsgiPropertyConstants.java
@@ -0,0 +1,44 @@
+/*
+ * Copyright 2018-present Open Networking Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.onosproject.ra;
+
+/**
+ * Name/Value constants for properties.
+ */
+public final class OsgiPropertyConstants {
+    private OsgiPropertyConstants() {
+    }
+
+    public static final String RA_THREADS_POOL = "raPoolSize";
+    public static final int RA_THREADS_POOL_SIZE_DEFAULT = 10;
+
+    public static final String RA_THREADS_DELAY = "raThreadDelay";
+    public static final int RA_THREADS_DELAY_DEFAULT = 5;
+
+    public static final String RA_FLAG_MBIT_STATUS = "raFlagMbitStatus";
+    public static final boolean RA_FLAG_MBIT_STATUS_DEFAULT = false;
+
+    public static final String RA_FLAG_OBIT_STATUS = "raFlagObitStatus";
+    public static final boolean RA_FLAG_OBIT_STATUS_DEFAULT = false;
+
+    public static final String RA_OPTION_PREFIX_STATUS = "raOptionPrefixStatus";
+    public static final boolean RA_OPTION_PREFIX_STATUS_DEFAULT = false;
+
+    public static final String RA_GLOBAL_PREFIX_CONF_STATUS = "raGlobalPrefixConfStatus";
+    public static final boolean RA_GLOBAL_PREFIX_CONF_STATUS_DEFAULT = true;
+
+}
diff --git a/apps/routeradvertisement/src/main/java/org/onosproject/ra/RouterAdvertisementManager.java b/apps/routeradvertisement/src/main/java/org/onosproject/ra/RouterAdvertisementManager.java
index f568e90..53d96b1 100644
--- a/apps/routeradvertisement/src/main/java/org/onosproject/ra/RouterAdvertisementManager.java
+++ b/apps/routeradvertisement/src/main/java/org/onosproject/ra/RouterAdvertisementManager.java
@@ -16,14 +16,7 @@
 
 package org.onosproject.ra;
 
-import org.apache.felix.scr.annotations.Activate;
-import org.apache.felix.scr.annotations.Component;
-import org.apache.felix.scr.annotations.Service;
-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 com.google.common.collect.ImmutableMap;
 import org.onlab.packet.EthType;
 import org.onlab.packet.Ethernet;
 import org.onlab.packet.ICMP6;
@@ -66,6 +59,12 @@
 import org.onosproject.net.packet.PacketService;
 import org.onosproject.ra.config.RouterAdvertisementDeviceConfig;
 import org.osgi.service.component.ComponentContext;
+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 org.slf4j.LoggerFactory;
 
@@ -90,73 +89,76 @@
 import static com.google.common.base.Strings.isNullOrEmpty;
 import static org.onlab.util.Tools.get;
 import static org.onlab.util.Tools.groupedThreads;
-import com.google.common.collect.ImmutableMap;
+import static org.onosproject.ra.OsgiPropertyConstants.RA_FLAG_MBIT_STATUS;
+import static org.onosproject.ra.OsgiPropertyConstants.RA_FLAG_MBIT_STATUS_DEFAULT;
+import static org.onosproject.ra.OsgiPropertyConstants.RA_FLAG_OBIT_STATUS;
+import static org.onosproject.ra.OsgiPropertyConstants.RA_FLAG_OBIT_STATUS_DEFAULT;
+import static org.onosproject.ra.OsgiPropertyConstants.RA_GLOBAL_PREFIX_CONF_STATUS;
+import static org.onosproject.ra.OsgiPropertyConstants.RA_GLOBAL_PREFIX_CONF_STATUS_DEFAULT;
+import static org.onosproject.ra.OsgiPropertyConstants.RA_OPTION_PREFIX_STATUS;
+import static org.onosproject.ra.OsgiPropertyConstants.RA_OPTION_PREFIX_STATUS_DEFAULT;
+import static org.onosproject.ra.OsgiPropertyConstants.RA_THREADS_DELAY;
+import static org.onosproject.ra.OsgiPropertyConstants.RA_THREADS_DELAY_DEFAULT;
+import static org.onosproject.ra.OsgiPropertyConstants.RA_THREADS_POOL;
+import static org.onosproject.ra.OsgiPropertyConstants.RA_THREADS_POOL_SIZE_DEFAULT;
 
 /**
  * Manages IPv6 Router Advertisements.
  */
-@Service
-@Component(immediate = true)
+@Component(
+    immediate = true,
+    service = RoutingAdvertisementService.class,
+    property = {
+        RA_THREADS_POOL + ":Integer=" + RA_THREADS_POOL_SIZE_DEFAULT,
+        RA_THREADS_DELAY + ":Integer=" + RA_THREADS_DELAY_DEFAULT,
+        RA_FLAG_MBIT_STATUS + ":Boolean=" + RA_FLAG_MBIT_STATUS_DEFAULT,
+        RA_FLAG_OBIT_STATUS + ":Boolean=" + RA_FLAG_OBIT_STATUS_DEFAULT,
+        RA_OPTION_PREFIX_STATUS + ":Boolean=" + RA_OPTION_PREFIX_STATUS_DEFAULT,
+        RA_GLOBAL_PREFIX_CONF_STATUS  + ":Boolean=" + RA_GLOBAL_PREFIX_CONF_STATUS_DEFAULT
+    }
+)
 public class RouterAdvertisementManager implements RoutingAdvertisementService {
 
     private final Logger log = LoggerFactory.getLogger(getClass());
-    private static final String PROP_RA_THREADS_POOL = "raPoolSize";
-    private static final int DEFAULT_RA_THREADS_POOL_SIZE = 10;
-    private static final String PROP_RA_THREADS_DELAY = "raThreadDelay";
-    private static final int DEFAULT_RA_THREADS_DELAY = 5;
-    private static final String PROP_RA_FLAG_MBIT_STATUS = "raFlagMbitStatus";
-    private static final boolean DEFAULT_RA_FLAG_MBIT_STATUS = false;
-    private static final String PROP_RA_FLAG_OBIT_STATUS = "raFlagObitStatus";
-    private static final boolean DEFAULT_RA_FLAG_OBIT_STATUS = false;
-    private static final String PROP_RA_OPTION_PREFIX_STATUS = "raOptionPrefixStatus";
-    private static final boolean DEFAULT_RA_OPTION_PREFIX_STATUS = false;
-    private static final String PROP_RA_GLOBAL_PREFIX_CONF_STATUS = "raGlobalPrefixConfStatus";
-    private static final boolean DEFAULT_RA_GLOBAL_PREFIX_CONF_STATUS = true;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected CoreService coreService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     PacketService packetService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected ComponentConfigService componentConfigService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     public InterfaceService interfaceService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     public MastershipService mastershipService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected NetworkConfigRegistry networkConfigRegistry;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected DeviceService deviceService;
 
-    @Property(name = PROP_RA_THREADS_POOL, intValue = DEFAULT_RA_THREADS_POOL_SIZE,
-            label = "Thread pool capacity")
-    protected int raPoolSize = DEFAULT_RA_THREADS_POOL_SIZE;
+    /** Thread pool capacity. */
+    protected int raPoolSize = RA_THREADS_POOL_SIZE_DEFAULT;
 
-    @Property(name = PROP_RA_THREADS_DELAY, intValue = DEFAULT_RA_THREADS_DELAY,
-            label = "Thread delay in seconds")
-    protected int raThreadDelay = DEFAULT_RA_THREADS_DELAY;
+    /** Thread delay in seconds. */
+    protected int raThreadDelay = RA_THREADS_DELAY_DEFAULT;
 
-    @Property(name = PROP_RA_FLAG_MBIT_STATUS, boolValue = DEFAULT_RA_FLAG_MBIT_STATUS,
-            label = "Turn M-bit flag on/off")
-    protected boolean raFlagMbitStatus = DEFAULT_RA_FLAG_MBIT_STATUS;
+    /** Turn M-bit flag on/off. */
+    protected boolean raFlagMbitStatus = RA_FLAG_MBIT_STATUS_DEFAULT;
 
-    @Property(name = PROP_RA_FLAG_OBIT_STATUS, boolValue = DEFAULT_RA_FLAG_OBIT_STATUS,
-            label = "Turn O-bit flag on/off")
-    protected boolean raFlagObitStatus = DEFAULT_RA_FLAG_OBIT_STATUS;
+    /** Turn O-bit flag on/off. */
+    protected boolean raFlagObitStatus = RA_FLAG_OBIT_STATUS_DEFAULT;
 
-    @Property(name = PROP_RA_OPTION_PREFIX_STATUS, boolValue = DEFAULT_RA_OPTION_PREFIX_STATUS,
-            label = "Prefix option support needed or not")
-    protected boolean raOptionPrefixStatus = DEFAULT_RA_OPTION_PREFIX_STATUS;
+    /** Prefix option support needed or not. */
+    protected boolean raOptionPrefixStatus = RA_OPTION_PREFIX_STATUS_DEFAULT;
 
-    @Property(name = PROP_RA_GLOBAL_PREFIX_CONF_STATUS, boolValue = DEFAULT_RA_GLOBAL_PREFIX_CONF_STATUS,
-            label = "Global prefix configuration support on/off")
-    protected boolean raGlobalConfigStatus = DEFAULT_RA_GLOBAL_PREFIX_CONF_STATUS;
+    /** Global prefix configuration support on/off. */
+    protected boolean raGlobalPrefixConfStatus = RA_GLOBAL_PREFIX_CONF_STATUS_DEFAULT;
 
     @GuardedBy(value = "this")
     private final Map<ConnectPoint, Map.Entry<ScheduledFuture<?>, List<InterfaceIpAddress>>> transmitters =
@@ -176,7 +178,7 @@
     private Function<Interface, Map.Entry<ConnectPoint, List<InterfaceIpAddress>>> prefixGenerator =
             i -> {
                 Map.Entry<ConnectPoint, List<InterfaceIpAddress>> prefixEntry;
-                if (raGlobalConfigStatus && globalPrefixes.containsKey(i.connectPoint().deviceId())) {
+                if (raGlobalPrefixConfStatus && globalPrefixes.containsKey(i.connectPoint().deviceId())) {
                     prefixEntry = new AbstractMap.SimpleEntry<>(i.connectPoint(),
                             globalPrefixes.get(i.connectPoint().deviceId()));
                 } else {
@@ -430,9 +432,9 @@
             Dictionary<?, ?> properties = context.getProperties();
             try {
                 // Handle change in pool size
-                String s = get(properties, PROP_RA_THREADS_POOL);
+                String s = get(properties, RA_THREADS_POOL);
                 newRaPoolSize = isNullOrEmpty(s) ?
-                        DEFAULT_RA_THREADS_POOL_SIZE : Integer.parseInt(s.trim());
+                        RA_THREADS_POOL_SIZE_DEFAULT : Integer.parseInt(s.trim());
                 if (newRaPoolSize != raPoolSize) {
                     raPoolSize = newRaPoolSize;
                     clearPoolAndTxWorkers();
@@ -441,9 +443,9 @@
                 }
 
                 // Handle change in thread delay
-                s = get(properties, PROP_RA_THREADS_DELAY);
+                s = get(properties, RA_THREADS_DELAY);
                 newRaThreadDelay = isNullOrEmpty(s) ?
-                        DEFAULT_RA_THREADS_DELAY : Integer.parseInt(s.trim());
+                        RA_THREADS_DELAY_DEFAULT : Integer.parseInt(s.trim());
                 if (newRaThreadDelay != raThreadDelay) {
                     raThreadDelay = newRaThreadDelay;
                     clearTxWorkers();
@@ -452,30 +454,30 @@
                 }
 
                 // Handle M-flag changes
-                s = get(properties, PROP_RA_FLAG_MBIT_STATUS);
+                s = get(properties, RA_FLAG_MBIT_STATUS);
                 if (!isNullOrEmpty(s)) {
                     raFlagMbitStatus = Boolean.parseBoolean(s.trim());
                     log.info("RA M-flag set {}", s);
                 }
 
                 // Handle O-flag changes
-                s = get(properties, PROP_RA_FLAG_OBIT_STATUS);
+                s = get(properties, RA_FLAG_OBIT_STATUS);
                 if (!isNullOrEmpty(s)) {
                     raFlagObitStatus = Boolean.parseBoolean(s.trim());
                     log.info("RA O-flag set {}", s);
                 }
 
                 // Handle prefix option configuration
-                s = get(properties, PROP_RA_OPTION_PREFIX_STATUS);
+                s = get(properties, RA_OPTION_PREFIX_STATUS);
                 if (!isNullOrEmpty(s)) {
                     raOptionPrefixStatus = Boolean.parseBoolean(s.trim());
                     String status = raOptionPrefixStatus ? "enabled" : "disabled";
                     log.info("RA prefix option {}", status);
                 }
 
-                s = get(properties, PROP_RA_GLOBAL_PREFIX_CONF_STATUS);
+                s = get(properties, RA_GLOBAL_PREFIX_CONF_STATUS);
                 if (!isNullOrEmpty(s)) {
-                    raGlobalConfigStatus = Boolean.parseBoolean(s.trim());
+                    raGlobalPrefixConfStatus = Boolean.parseBoolean(s.trim());
                     clearTxWorkers();
                     setupTxWorkers();
                     String status = raOptionPrefixStatus ? "enabled" : "disabled";
diff --git a/apps/routeradvertisement/src/main/java/org/onosproject/ra/cli/GlobalPrefixesListCommand.java b/apps/routeradvertisement/src/main/java/org/onosproject/ra/cli/GlobalPrefixesListCommand.java
index 554db34..d8ad1ca 100644
--- a/apps/routeradvertisement/src/main/java/org/onosproject/ra/cli/GlobalPrefixesListCommand.java
+++ b/apps/routeradvertisement/src/main/java/org/onosproject/ra/cli/GlobalPrefixesListCommand.java
@@ -18,24 +18,26 @@
 
 import java.util.List;
 
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.net.DeviceId;
 import org.onosproject.net.host.InterfaceIpAddress;
 import org.onosproject.ra.RoutingAdvertisementService;
 import org.onosproject.cli.AbstractShellCommand;
 
-import org.apache.karaf.shell.commands.Command;
+import org.apache.karaf.shell.api.action.Command;
 
 import com.google.common.collect.ImmutableMap;
 
 /**
  * Command to list global-prefixes in Routing Advertisement.
  */
+@Service
 @Command(scope = "onos", name = "ra-global-prefixes",
         description = "List Routing Advertisement global prefixes")
 public class GlobalPrefixesListCommand extends AbstractShellCommand {
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         RoutingAdvertisementService raService =
                 AbstractShellCommand.get(RoutingAdvertisementService.class);
         printGlobalPrefixes(raService.getGlobalPrefixes());
diff --git a/apps/routeradvertisement/src/main/resources/OSGI-INF/blueprint/shell-config.xml b/apps/routeradvertisement/src/main/resources/OSGI-INF/blueprint/shell-config.xml
deleted file mode 100644
index 4e8b59e..0000000
--- a/apps/routeradvertisement/src/main/resources/OSGI-INF/blueprint/shell-config.xml
+++ /dev/null
@@ -1,24 +0,0 @@
-<!--
-  ~ Copyright 2017-present Open Networking Foundation
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~     http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License.
-  -->
-<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0">
-
-    <command-bundle xmlns="http://karaf.apache.org/xmlns/shell/v1.1.0">
-        <command>
-            <action class="org.onosproject.ra.cli.GlobalPrefixesListCommand"/>
-        </command>
-    </command-bundle>
-</blueprint>
-
diff --git a/apps/routing-api/BUCK b/apps/routing-api/BUCK
deleted file mode 100644
index 8db5219..0000000
--- a/apps/routing-api/BUCK
+++ /dev/null
@@ -1,15 +0,0 @@
-COMPILE_DEPS = [
-    '//lib:CORE_DEPS',
-    '//lib:JACKSON',
-    '//incubator/api:onos-incubator-api',
-]
-
-TEST_DEPS = [
-    '//lib:TEST_ADAPTERS',
-]
-
-osgi_jar_with_tests (
-    deps = COMPILE_DEPS,
-    test_deps = TEST_DEPS,
-)
-
diff --git a/apps/routing/common/BUCK b/apps/routing/common/BUCK
deleted file mode 100644
index 2bd6aec..0000000
--- a/apps/routing/common/BUCK
+++ /dev/null
@@ -1,24 +0,0 @@
-COMPILE_DEPS = [
-    '//lib:CORE_DEPS',
-    '//lib:NETTY',
-    '//lib:JACKSON',
-    '//lib:org.apache.karaf.shell.console',
-    '//lib:concurrent-trees',
-    '//cli:onos-cli',
-    '//incubator/api:onos-incubator-api',
-    '//apps/routing-api:onos-apps-routing-api',
-    '//apps/route-service/api:onos-apps-route-service-api',
-    '//core/common:onos-core-common',
-    '//lib:io_netty_netty',
-]
-
-TEST_DEPS = [
-    '//lib:TEST_ADAPTERS',
-    '//incubator/api:onos-incubator-api-tests',
-    '//apps/routing-api:onos-apps-routing-api-tests',
-]
-
-osgi_jar_with_tests (
-    deps = COMPILE_DEPS,
-    test_deps = TEST_DEPS,
-)
diff --git a/apps/routing/common/BUILD b/apps/routing/common/BUILD
index 1d5b4d4..f51df5c 100644
--- a/apps/routing/common/BUILD
+++ b/apps/routing/common/BUILD
@@ -12,6 +12,7 @@
 ]
 
 osgi_jar_with_tests(
+    karaf_command_packages = ["org.onosproject.routing.cli"],
     test_deps = TEST_DEPS,
     deps = COMPILE_DEPS,
 )
diff --git a/apps/routing/common/src/main/java/org/onosproject/routing/bgp/BgpSessionManager.java b/apps/routing/common/src/main/java/org/onosproject/routing/bgp/BgpSessionManager.java
index a2521ba..0259a2f 100644
--- a/apps/routing/common/src/main/java/org/onosproject/routing/bgp/BgpSessionManager.java
+++ b/apps/routing/common/src/main/java/org/onosproject/routing/bgp/BgpSessionManager.java
@@ -16,13 +16,6 @@
 
 package org.onosproject.routing.bgp;
 
-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.Reference;
-import org.apache.felix.scr.annotations.ReferenceCardinality;
-import org.apache.felix.scr.annotations.Service;
 import org.jboss.netty.bootstrap.ServerBootstrap;
 import org.jboss.netty.channel.Channel;
 import org.jboss.netty.channel.ChannelException;
@@ -41,6 +34,12 @@
 import org.onosproject.routeservice.Route;
 import org.onosproject.routeservice.RouteAdminService;
 import org.osgi.service.component.ComponentContext;
+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 org.slf4j.LoggerFactory;
 
@@ -58,16 +57,15 @@
 /**
  * BGP Session Manager class.
  */
-@Component(immediate = true, enabled = false)
-@Service
+@Component(immediate = true, service = BgpInfoService.class)
 public class BgpSessionManager implements BgpInfoService {
     private static final Logger log =
             LoggerFactory.getLogger(BgpSessionManager.class);
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected RouteAdminService routeService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected ClusterService clusterService;
 
     boolean isShutdown = true;
diff --git a/apps/routing/common/src/main/java/org/onosproject/routing/cli/AddPeerCommand.java b/apps/routing/common/src/main/java/org/onosproject/routing/cli/AddPeerCommand.java
index ddb8a4f..f0f2f76 100644
--- a/apps/routing/common/src/main/java/org/onosproject/routing/cli/AddPeerCommand.java
+++ b/apps/routing/common/src/main/java/org/onosproject/routing/cli/AddPeerCommand.java
@@ -16,8 +16,9 @@
 
 package org.onosproject.routing.cli;
 
-import org.apache.karaf.shell.commands.Argument;
-import org.apache.karaf.shell.commands.Command;
+import org.apache.karaf.shell.api.action.Argument;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onlab.packet.IpAddress;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.core.ApplicationId;
@@ -30,6 +31,7 @@
 /**
  * Command to add new BGP peer to existing internal speaker.
  */
+@Service
 @Command(scope = "onos", name = "bgp-peer-add",
         description = "Adds an external BGP router as peer to an existing BGP speaker")
 public class AddPeerCommand extends AbstractShellCommand {
@@ -54,7 +56,7 @@
     private IpAddress peerAddress = null;
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         peerAddress = IpAddress.valueOf(ip);
 
         NetworkConfigService configService = get(NetworkConfigService.class);
diff --git a/apps/routing/common/src/main/java/org/onosproject/routing/cli/AddSpeakerCommand.java b/apps/routing/common/src/main/java/org/onosproject/routing/cli/AddSpeakerCommand.java
index ff5ef94..5ce0b8d 100644
--- a/apps/routing/common/src/main/java/org/onosproject/routing/cli/AddSpeakerCommand.java
+++ b/apps/routing/common/src/main/java/org/onosproject/routing/cli/AddSpeakerCommand.java
@@ -16,8 +16,9 @@
 
 package org.onosproject.routing.cli;
 
-import org.apache.karaf.shell.commands.Argument;
-import org.apache.karaf.shell.commands.Command;
+import org.apache.karaf.shell.api.action.Argument;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onlab.packet.IpAddress;
 import org.onlab.packet.VlanId;
 import org.onosproject.cli.AbstractShellCommand;
@@ -34,6 +35,7 @@
 /**
  * Command to add a new internal BGP speaker.
  */
+@Service
 @Command(scope = "onos", name = "bgp-speaker-add",
         description = "Adds an internal BGP speaker")
 public class AddSpeakerCommand extends AbstractShellCommand {
@@ -57,7 +59,7 @@
     private static final String SPEAKER_ADD_SUCCESS = "Speaker Successfully Added.";
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         NetworkConfigService configService = get(NetworkConfigService.class);
         CoreService coreService = get(CoreService.class);
         ApplicationId appId = coreService.getAppId(RoutingService.ROUTER_APP_ID);
diff --git a/apps/routing/common/src/main/java/org/onosproject/routing/cli/BgpNeighborsListCommand.java b/apps/routing/common/src/main/java/org/onosproject/routing/cli/BgpNeighborsListCommand.java
index 9a39cbf..b220fd5 100644
--- a/apps/routing/common/src/main/java/org/onosproject/routing/cli/BgpNeighborsListCommand.java
+++ b/apps/routing/common/src/main/java/org/onosproject/routing/cli/BgpNeighborsListCommand.java
@@ -20,8 +20,9 @@
 import com.fasterxml.jackson.databind.ObjectMapper;
 import com.fasterxml.jackson.databind.node.ArrayNode;
 import com.fasterxml.jackson.databind.node.ObjectNode;
-import org.apache.karaf.shell.commands.Command;
-import org.apache.karaf.shell.commands.Option;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.Option;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.routing.bgp.BgpInfoService;
 import org.onosproject.routing.bgp.BgpSession;
@@ -31,6 +32,7 @@
 /**
  * Command to show the BGP neighbors.
  */
+@Service
 @Command(scope = "onos", name = "bgp-neighbors",
          description = "Lists the BGP neighbors")
 public class BgpNeighborsListCommand extends AbstractShellCommand {
@@ -53,7 +55,7 @@
         "  4 Octet AS Capability: %s %s";
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         BgpInfoService service = AbstractShellCommand.get(BgpInfoService.class);
         Collection<BgpSession> bgpSessions = service.getBgpSessions();
 
diff --git a/apps/routing/common/src/main/java/org/onosproject/routing/cli/BgpRoutesListCommand.java b/apps/routing/common/src/main/java/org/onosproject/routing/cli/BgpRoutesListCommand.java
index 7b61f7c..c4b49e3 100644
--- a/apps/routing/common/src/main/java/org/onosproject/routing/cli/BgpRoutesListCommand.java
+++ b/apps/routing/common/src/main/java/org/onosproject/routing/cli/BgpRoutesListCommand.java
@@ -20,8 +20,9 @@
 import com.fasterxml.jackson.databind.ObjectMapper;
 import com.fasterxml.jackson.databind.node.ArrayNode;
 import com.fasterxml.jackson.databind.node.ObjectNode;
-import org.apache.karaf.shell.commands.Command;
-import org.apache.karaf.shell.commands.Option;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.Option;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.routing.bgp.BgpConstants;
 import org.onosproject.routing.bgp.BgpInfoService;
@@ -34,6 +35,7 @@
 /**
  * Command to show the routes learned through BGP.
  */
+@Service
 @Command(scope = "onos", name = "bgp-routes",
          description = "Lists all BGP best routes")
 public class BgpRoutesListCommand extends AbstractShellCommand {
@@ -59,7 +61,7 @@
         "                      AsPath %s";
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         BgpInfoService service = AbstractShellCommand.get(BgpInfoService.class);
 
         // Print summary of the routes
diff --git a/apps/routing/common/src/main/java/org/onosproject/routing/cli/BgpSpeakersListCommand.java b/apps/routing/common/src/main/java/org/onosproject/routing/cli/BgpSpeakersListCommand.java
index 6f85c5e..6a784cc 100644
--- a/apps/routing/common/src/main/java/org/onosproject/routing/cli/BgpSpeakersListCommand.java
+++ b/apps/routing/common/src/main/java/org/onosproject/routing/cli/BgpSpeakersListCommand.java
@@ -17,7 +17,8 @@
 package org.onosproject.routing.cli;
 
 import com.google.common.collect.Lists;
-import org.apache.karaf.shell.commands.Command;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.utils.Comparators;
 import org.onosproject.core.ApplicationId;
@@ -33,6 +34,7 @@
 /**
  * Lists the BGP speakers configured in the system.
  */
+@Service
 @Command(scope = "onos", name = "bgp-speakers",
         description = "Lists all BGP speakers")
 public class BgpSpeakersListCommand extends AbstractShellCommand {
@@ -44,7 +46,7 @@
             Comparators.CONNECT_POINT_COMPARATOR.compare(s1.connectPoint(), s2.connectPoint());
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         NetworkConfigService configService = get(NetworkConfigService.class);
         CoreService coreService = get(CoreService.class);
         ApplicationId appId = coreService.getAppId(RoutingService.ROUTER_APP_ID);
diff --git a/apps/routing/common/src/main/java/org/onosproject/routing/cli/RemovePeerCommand.java b/apps/routing/common/src/main/java/org/onosproject/routing/cli/RemovePeerCommand.java
index 7ce2456..a4b2912 100644
--- a/apps/routing/common/src/main/java/org/onosproject/routing/cli/RemovePeerCommand.java
+++ b/apps/routing/common/src/main/java/org/onosproject/routing/cli/RemovePeerCommand.java
@@ -16,8 +16,9 @@
 
 package org.onosproject.routing.cli;
 
-import org.apache.karaf.shell.commands.Argument;
-import org.apache.karaf.shell.commands.Command;
+import org.apache.karaf.shell.api.action.Argument;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onlab.packet.IpAddress;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.core.ApplicationId;
@@ -29,6 +30,7 @@
 /**
  * Command to remove existing BGP peer.
  */
+@Service
 @Command(scope = "onos", name = "bgp-peer-remove",
         description = "Removes a BGP peer")
 public class RemovePeerCommand extends AbstractShellCommand {
@@ -46,7 +48,7 @@
     private IpAddress peerAddress = null;
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         peerAddress = IpAddress.valueOf(ip);
 
         NetworkConfigService configService = get(NetworkConfigService.class);
diff --git a/apps/routing/common/src/main/java/org/onosproject/routing/cli/RemoveSpeakerCommand.java b/apps/routing/common/src/main/java/org/onosproject/routing/cli/RemoveSpeakerCommand.java
index 5594e17..9d52e71 100644
--- a/apps/routing/common/src/main/java/org/onosproject/routing/cli/RemoveSpeakerCommand.java
+++ b/apps/routing/common/src/main/java/org/onosproject/routing/cli/RemoveSpeakerCommand.java
@@ -16,8 +16,9 @@
 
 package org.onosproject.routing.cli;
 
-import org.apache.karaf.shell.commands.Argument;
-import org.apache.karaf.shell.commands.Command;
+import org.apache.karaf.shell.api.action.Argument;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.core.ApplicationId;
 import org.onosproject.core.CoreService;
@@ -28,6 +29,7 @@
 /**
  * Command to remove a internal BGP speaker.
  */
+@Service
 @Command(scope = "onos", name = "bgp-speaker-remove",
         description = "Removes an internal BGP speaker")
 public class RemoveSpeakerCommand extends AbstractShellCommand {
@@ -45,7 +47,7 @@
             "Speaker with name \'%s\' not found";
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         NetworkConfigService configService = get(NetworkConfigService.class);
         CoreService coreService = get(CoreService.class);
         ApplicationId appId = coreService.getAppId(RoutingService.ROUTER_APP_ID);
diff --git a/apps/routing/common/src/main/java/org/onosproject/routing/impl/BgpSpeakerNeighbourHandler.java b/apps/routing/common/src/main/java/org/onosproject/routing/impl/BgpSpeakerNeighbourHandler.java
index ab1e595..1ae02c2 100644
--- a/apps/routing/common/src/main/java/org/onosproject/routing/impl/BgpSpeakerNeighbourHandler.java
+++ b/apps/routing/common/src/main/java/org/onosproject/routing/impl/BgpSpeakerNeighbourHandler.java
@@ -16,11 +16,11 @@
 
 package org.onosproject.routing.impl;
 
-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.Ethernet;
 import org.onlab.packet.VlanId;
 import org.onosproject.core.ApplicationId;
@@ -59,16 +59,16 @@
 @Component(immediate = true, enabled = false)
 public class BgpSpeakerNeighbourHandler {
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected CoreService coreService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected NetworkConfigService configService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected InterfaceService interfaceService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected NeighbourResolutionService neighbourService;
 
     private ApplicationId appId;
diff --git a/apps/routing/common/src/main/java/org/onosproject/routing/impl/DirectHostManager.java b/apps/routing/common/src/main/java/org/onosproject/routing/impl/DirectHostManager.java
index 0cac220..9348665 100644
--- a/apps/routing/common/src/main/java/org/onosproject/routing/impl/DirectHostManager.java
+++ b/apps/routing/common/src/main/java/org/onosproject/routing/impl/DirectHostManager.java
@@ -18,18 +18,11 @@
 
 import com.google.common.cache.Cache;
 import com.google.common.cache.CacheBuilder;
-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.onlab.packet.EthType;
 import org.onlab.packet.Ethernet;
+import org.onlab.packet.IP;
 import org.onlab.packet.IPv4;
 import org.onlab.packet.IPv6;
-import org.onlab.packet.IP;
 import org.onlab.packet.IpAddress;
 import org.onlab.packet.MacAddress;
 import org.onlab.packet.VlanId;
@@ -37,8 +30,6 @@
 import org.onosproject.cfg.ComponentConfigService;
 import org.onosproject.core.ApplicationId;
 import org.onosproject.core.CoreService;
-import org.onosproject.net.intf.Interface;
-import org.onosproject.net.intf.InterfaceService;
 import org.onosproject.net.ConnectPoint;
 import org.onosproject.net.Host;
 import org.onosproject.net.flow.DefaultTrafficSelector;
@@ -47,6 +38,8 @@
 import org.onosproject.net.host.HostEvent;
 import org.onosproject.net.host.HostListener;
 import org.onosproject.net.host.HostService;
+import org.onosproject.net.intf.Interface;
+import org.onosproject.net.intf.InterfaceService;
 import org.onosproject.net.packet.DefaultOutboundPacket;
 import org.onosproject.net.packet.OutboundPacket;
 import org.onosproject.net.packet.PacketContext;
@@ -54,6 +47,12 @@
 import org.onosproject.net.packet.PacketProcessor;
 import org.onosproject.net.packet.PacketService;
 import org.osgi.service.component.ComponentContext;
+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 org.slf4j.LoggerFactory;
 
@@ -65,36 +64,41 @@
 
 import static com.google.common.base.Preconditions.checkNotNull;
 import static org.onlab.packet.IpAddress.Version.INET6;
+import static org.onosproject.routing.impl.OsgiPropertyConstants.ENABLED;
+import static org.onosproject.routing.impl.OsgiPropertyConstants.ENABLED_DEFAULT;
 
 /**
  * Reactively handles sending packets to hosts that are directly connected to
  * router interfaces.
  */
-@Component(immediate = true, enabled = false)
+@Component(
+    immediate = true,
+    enabled = false,
+    property = {
+        ENABLED + ":Boolean=" + ENABLED_DEFAULT
+    }
+)
 public class DirectHostManager {
 
     private Logger log = LoggerFactory.getLogger(getClass());
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected PacketService packetService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected InterfaceService interfaceService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected HostService hostService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected CoreService coreService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected ComponentConfigService componentConfigService;
 
-    private static final boolean DEFAULT_ENABLED = false;
-
-    @Property(name = "enabled", boolValue = DEFAULT_ENABLED,
-            label = "Enable reactive directly-connected host processing")
-    private volatile boolean enabled = DEFAULT_ENABLED;
+    /** Enable reactive directly-connected host processing. */
+    private volatile boolean enabled = ENABLED_DEFAULT;
 
     private static final String APP_NAME = "org.onosproject.directhost";
 
@@ -121,7 +125,7 @@
 
     @Modified
     private void modified(ComponentContext context) {
-        Boolean boolEnabled = Tools.isPropertyEnabled(context.getProperties(), "enabled");
+        Boolean boolEnabled = Tools.isPropertyEnabled(context.getProperties(), ENABLED);
         if (boolEnabled != null) {
             if (enabled && !boolEnabled) {
                 enabled = false;
diff --git a/apps/routing/common/src/main/java/org/onosproject/routing/impl/OsgiPropertyConstants.java b/apps/routing/common/src/main/java/org/onosproject/routing/impl/OsgiPropertyConstants.java
new file mode 100644
index 0000000..ca4643f
--- /dev/null
+++ b/apps/routing/common/src/main/java/org/onosproject/routing/impl/OsgiPropertyConstants.java
@@ -0,0 +1,28 @@
+/*
+ * Copyright 2018-present Open Networking Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.onosproject.routing.impl;
+
+/**
+ * Name/Value constants for properties.
+ */
+public final class OsgiPropertyConstants {
+    private OsgiPropertyConstants() {
+    }
+
+    static final String ENABLED = "enabled";
+    static final boolean ENABLED_DEFAULT = false;
+}
diff --git a/apps/routing/common/src/main/resources/OSGI-INF/blueprint/shell-config.xml b/apps/routing/common/src/main/resources/OSGI-INF/blueprint/shell-config.xml
deleted file mode 100644
index 1692a1d..0000000
--- a/apps/routing/common/src/main/resources/OSGI-INF/blueprint/shell-config.xml
+++ /dev/null
@@ -1,41 +0,0 @@
-<!--
-  ~ Copyright 2015-present Open Networking Foundation
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~     http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License.
-  -->
-<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0">
-
-  <command-bundle xmlns="http://karaf.apache.org/xmlns/shell/v1.1.0">
-    <command>
-      <action class="org.onosproject.routing.cli.BgpNeighborsListCommand"/>
-    </command>
-    <command>
-      <action class="org.onosproject.routing.cli.BgpRoutesListCommand"/>
-    </command>
-    <command>
-      <action class="org.onosproject.routing.cli.BgpSpeakersListCommand"/>
-    </command>
-    <command>
-      <action class="org.onosproject.routing.cli.AddSpeakerCommand"/>
-    </command>
-    <command>
-      <action class="org.onosproject.routing.cli.RemoveSpeakerCommand"/>
-    </command>
-    <command>
-      <action class="org.onosproject.routing.cli.AddPeerCommand"/>
-    </command>
-    <command>
-      <action class="org.onosproject.routing.cli.RemovePeerCommand"/>
-    </command>
-  </command-bundle>
-</blueprint>
diff --git a/apps/routing/cpr/BUCK b/apps/routing/cpr/BUCK
deleted file mode 100644
index 90d8634..0000000
--- a/apps/routing/cpr/BUCK
+++ /dev/null
@@ -1,32 +0,0 @@
-COMPILE_DEPS = [
-    '//lib:CORE_DEPS',
-    '//incubator/api:onos-incubator-api',
-    '//apps/routing-api:onos-apps-routing-api',
-]
-
-TEST_DEPS = [
-    '//lib:TEST_ADAPTERS',
-    '//incubator/api:onos-incubator-api-tests',
-    '//apps/routing-api:onos-apps-routing-api-tests',
-    '//utils/osgi:onlab-osgi-tests',
-]
-
-osgi_jar_with_tests (
-    deps = COMPILE_DEPS,
-    test_deps = TEST_DEPS,
-)
-
-BUNDLES = [
-    '//apps/routing/common:onos-apps-routing-common',
-    '//apps/routing/cpr:onos-apps-routing-cpr',
-    '//apps/routing-api:onos-apps-routing-api',
-]
-
-onos_app (
-    app_name = 'org.onosproject.cpr',
-    title = 'Control Plane Redirect',
-    category = 'Traffic Engineering',
-    url = 'http://onosproject.org',
-    description = 'Redirects routing control traffic to a control plane',
-    included_bundles = BUNDLES,
-)
diff --git a/apps/routing/cpr/src/main/java/org/onosproject/routing/cpr/ControlPlaneRedirectManager.java b/apps/routing/cpr/src/main/java/org/onosproject/routing/cpr/ControlPlaneRedirectManager.java
index c834c2c..0d7adf5 100644
--- a/apps/routing/cpr/src/main/java/org/onosproject/routing/cpr/ControlPlaneRedirectManager.java
+++ b/apps/routing/cpr/src/main/java/org/onosproject/routing/cpr/ControlPlaneRedirectManager.java
@@ -18,13 +18,6 @@
 
 import com.google.common.collect.Lists;
 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.Modified;
-import org.apache.felix.scr.annotations.Property;
-import org.apache.felix.scr.annotations.Reference;
-import org.apache.felix.scr.annotations.ReferenceCardinality;
 import org.onlab.packet.EthType;
 import org.onlab.packet.Ip4Address;
 import org.onlab.packet.Ip6Address;
@@ -36,8 +29,6 @@
 import org.onosproject.cfg.ComponentConfigService;
 import org.onosproject.core.ApplicationId;
 import org.onosproject.core.CoreService;
-import org.onosproject.net.intf.Interface;
-import org.onosproject.net.intf.InterfaceService;
 import org.onosproject.mastership.MastershipService;
 import org.onosproject.net.DeviceId;
 import org.onosproject.net.Host;
@@ -57,13 +48,21 @@
 import org.onosproject.net.flowobjective.NextObjective;
 import org.onosproject.net.host.HostService;
 import org.onosproject.net.host.InterfaceIpAddress;
+import org.onosproject.net.intf.Interface;
+import org.onosproject.net.intf.InterfaceService;
 import org.onosproject.routing.InterfaceProvisionRequest;
 import org.onosproject.routing.Router;
 import org.onosproject.routing.RouterInfo;
 import org.onosproject.routing.RoutingService;
-import org.onosproject.routing.config.RoutingConfiguration;
 import org.onosproject.routing.config.RoutersConfig;
+import org.onosproject.routing.config.RoutingConfiguration;
 import org.osgi.service.component.ComponentContext;
+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.Dictionary;
@@ -80,13 +79,20 @@
 import static org.onlab.packet.IPv6.PROTOCOL_ICMP6;
 import static org.onlab.packet.IPv6.getLinkLocalAddress;
 import static org.onlab.packet.IPv6.getSolicitNodeAddress;
+import static org.onosproject.routing.cpr.OsgiPropertyConstants.FORCE_UNPROVISION;
+import static org.onosproject.routing.cpr.OsgiPropertyConstants.FORCE_UNPROVISION_DEFAULT;
 import static org.slf4j.LoggerFactory.getLogger;
 
 /**
  * Manages connectivity between peers redirecting control traffic to a routing
  * control plane available on the dataplane.
  */
-@Component(immediate = true)
+@Component(
+    immediate = true,
+    property = {
+        FORCE_UNPROVISION + ":Boolean=" + FORCE_UNPROVISION_DEFAULT
+    }
+)
 public class ControlPlaneRedirectManager {
 
     private final Logger log = getLogger(getClass());
@@ -99,36 +105,35 @@
     static final int ACL_PRIORITY = 40001;
     private static final int OSPF_IP_PROTO = 0x59;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected CoreService coreService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected DeviceService deviceService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected InterfaceService interfaceService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected FlowObjectiveService flowObjectiveService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected NetworkConfigRegistry networkConfigService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected MastershipService mastershipService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected HostService hostService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected ApplicationService applicationService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected ComponentConfigService cfgService;
 
-    @Property(name = "forceUnprovision", boolValue = false,
-            label = "Force unprovision when the device goes offline")
-    private boolean forceUnprovision = false;
+    /** Force unprovision when the device goes offline. */
+    private boolean forceUnprovision = FORCE_UNPROVISION_DEFAULT;
 
     private static final String APP_NAME = "org.onosproject.cpr";
     private ApplicationId appId;
@@ -176,7 +181,7 @@
         Dictionary<?, ?> properties = context.getProperties();
         Boolean flag;
 
-        flag = Tools.isPropertyEnabled(properties, "forceUnprovision");
+        flag = Tools.isPropertyEnabled(properties, FORCE_UNPROVISION);
         if (flag == null) {
             log.info("ForceUnprovision is not configured, " +
                     "using current value of {}", forceUnprovision);
diff --git a/apps/routing/cpr/src/main/java/org/onosproject/routing/cpr/OsgiPropertyConstants.java b/apps/routing/cpr/src/main/java/org/onosproject/routing/cpr/OsgiPropertyConstants.java
new file mode 100644
index 0000000..86e2f35
--- /dev/null
+++ b/apps/routing/cpr/src/main/java/org/onosproject/routing/cpr/OsgiPropertyConstants.java
@@ -0,0 +1,28 @@
+/*
+ * Copyright 2018-present Open Networking Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.onosproject.routing.cpr;
+
+/**
+ * Name/Value constants for properties.
+ */
+public final class OsgiPropertyConstants {
+    private OsgiPropertyConstants() {
+    }
+
+    static final String FORCE_UNPROVISION = "forceUnprovision";
+    static final boolean FORCE_UNPROVISION_DEFAULT = false;
+}
diff --git a/apps/routing/fibinstaller/BUCK b/apps/routing/fibinstaller/BUCK
deleted file mode 100644
index 94bcab2..0000000
--- a/apps/routing/fibinstaller/BUCK
+++ /dev/null
@@ -1,33 +0,0 @@
-COMPILE_DEPS = [
-    '//lib:CORE_DEPS',
-    '//incubator/api:onos-incubator-api',
-    '//apps/routing-api:onos-apps-routing-api',
-    '//apps/route-service/api:onos-apps-route-service-api',
-]
-
-TEST_DEPS = [
-    '//lib:TEST_ADAPTERS',
-    '//incubator/api:onos-incubator-api-tests',
-    '//apps/routing-api:onos-apps-routing-api-tests',
-    '//apps/route-service/api:onos-apps-route-service-api-tests',
-]
-
-osgi_jar_with_tests (
-    deps = COMPILE_DEPS,
-    test_deps = TEST_DEPS,
-)
-
-BUNDLES = [
-    '//apps/routing/fibinstaller:onos-apps-routing-fibinstaller',
-    '//apps/routing-api:onos-apps-routing-api',
-]
-
-onos_app (
-    app_name = 'org.onosproject.fibinstaller',
-    title = 'FIB Installer',
-    category = 'Traffic Engineering',
-    url = 'http://onosproject.org',
-    description = 'Installs routing rules into switches',
-    included_bundles = BUNDLES,
-    required_apps = [ 'org.onosproject.route-service' ],
-)
diff --git a/apps/routing/fibinstaller/src/main/java/org/onosproject/routing/fibinstaller/FibInstaller.java b/apps/routing/fibinstaller/src/main/java/org/onosproject/routing/fibinstaller/FibInstaller.java
index 73841bd..d12c6d8 100644
--- a/apps/routing/fibinstaller/src/main/java/org/onosproject/routing/fibinstaller/FibInstaller.java
+++ b/apps/routing/fibinstaller/src/main/java/org/onosproject/routing/fibinstaller/FibInstaller.java
@@ -19,13 +19,6 @@
 import com.google.common.collect.ConcurrentHashMultiset;
 import com.google.common.collect.Maps;
 import com.google.common.collect.Multiset;
-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.onlab.packet.Ethernet;
 import org.onlab.packet.IpAddress;
 import org.onlab.packet.IpPrefix;
@@ -36,20 +29,13 @@
 import org.onosproject.cfg.ComponentConfigService;
 import org.onosproject.core.ApplicationId;
 import org.onosproject.core.CoreService;
-import org.onosproject.net.config.basics.McastConfig;
-import org.onosproject.net.intf.Interface;
-import org.onosproject.net.intf.InterfaceService;
-import org.onosproject.routeservice.ResolvedRoute;
-import org.onosproject.routeservice.Route;
-import org.onosproject.routeservice.RouteEvent;
-import org.onosproject.routeservice.RouteListener;
-import org.onosproject.routeservice.RouteService;
 import org.onosproject.net.DeviceId;
 import org.onosproject.net.config.ConfigFactory;
 import org.onosproject.net.config.NetworkConfigEvent;
 import org.onosproject.net.config.NetworkConfigListener;
 import org.onosproject.net.config.NetworkConfigRegistry;
 import org.onosproject.net.config.NetworkConfigService;
+import org.onosproject.net.config.basics.McastConfig;
 import org.onosproject.net.config.basics.SubjectFactories;
 import org.onosproject.net.device.DeviceService;
 import org.onosproject.net.flow.DefaultTrafficSelector;
@@ -66,15 +52,28 @@
 import org.onosproject.net.flowobjective.ForwardingObjective;
 import org.onosproject.net.flowobjective.NextObjective;
 import org.onosproject.net.flowobjective.ObjectiveContext;
+import org.onosproject.net.intf.Interface;
+import org.onosproject.net.intf.InterfaceService;
+import org.onosproject.routeservice.ResolvedRoute;
+import org.onosproject.routeservice.Route;
+import org.onosproject.routeservice.RouteEvent;
+import org.onosproject.routeservice.RouteListener;
+import org.onosproject.routeservice.RouteService;
 import org.onosproject.routing.InterfaceProvisionRequest;
 import org.onosproject.routing.NextHop;
 import org.onosproject.routing.NextHopGroupKey;
 import org.onosproject.routing.Router;
 import org.onosproject.routing.RouterInfo;
 import org.onosproject.routing.RoutingService;
-import org.onosproject.routing.config.RoutingConfiguration;
 import org.onosproject.routing.config.RoutersConfig;
+import org.onosproject.routing.config.RoutingConfiguration;
 import org.osgi.service.component.ComponentContext;
+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 org.slf4j.LoggerFactory;
 
@@ -82,10 +81,18 @@
 import java.util.Map;
 import java.util.Set;
 
+import static org.onosproject.routing.fibinstaller.OsgiPropertyConstants.ROUTE_TO_NEXT_HOP;
+import static org.onosproject.routing.fibinstaller.OsgiPropertyConstants.ROUTE_TO_NEXT_HOP_DEFAULT;
+
 /**
  * Programs routes to a single OpenFlow switch.
  */
-@Component(immediate = true)
+@Component(
+    immediate = true,
+    property = {
+        ROUTE_TO_NEXT_HOP + ":Boolean=  " + ROUTE_TO_NEXT_HOP_DEFAULT
+    }
+)
 public class FibInstaller {
 
     private final Logger log = LoggerFactory.getLogger(getClass());
@@ -98,36 +105,35 @@
     //        programs the fabric switches for VR
     public static final short ASSIGNED_VLAN = 4094;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected CoreService coreService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected RouteService routeService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected InterfaceService interfaceService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected NetworkConfigService networkConfigService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected NetworkConfigRegistry networkConfigRegistry;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected ComponentConfigService componentConfigService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected FlowObjectiveService flowObjectiveService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected DeviceService deviceService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected ApplicationService applicationService;
 
-    @Property(name = "routeToNextHop", boolValue = false,
-            label = "Install a /32 or /128 route to each next hop")
-    private boolean routeToNextHop = false;
+    /** Install a /32 or /128 route to each next hop. */
+    private boolean routeToNextHop = ROUTE_TO_NEXT_HOP_DEFAULT;
 
     // Device id of data-plane switch - should be learned from config
     private DeviceId deviceId;
diff --git a/apps/routing/fibinstaller/src/main/java/org/onosproject/routing/fibinstaller/OsgiPropertyConstants.java b/apps/routing/fibinstaller/src/main/java/org/onosproject/routing/fibinstaller/OsgiPropertyConstants.java
new file mode 100644
index 0000000..731ce4f
--- /dev/null
+++ b/apps/routing/fibinstaller/src/main/java/org/onosproject/routing/fibinstaller/OsgiPropertyConstants.java
@@ -0,0 +1,28 @@
+/*
+ * Copyright 2018-present Open Networking Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.onosproject.routing.fibinstaller;
+
+/**
+ * Name/Value constants for properties.
+ */
+public final class OsgiPropertyConstants {
+    private OsgiPropertyConstants() {
+    }
+
+    public static final String ROUTE_TO_NEXT_HOP = "routeToNextHop";
+    public static final boolean ROUTE_TO_NEXT_HOP_DEFAULT = false;
+}
diff --git a/apps/routing/fpm/BUCK b/apps/routing/fpm/BUCK
deleted file mode 100644
index c11818b..0000000
--- a/apps/routing/fpm/BUCK
+++ /dev/null
@@ -1,16 +0,0 @@
-BUNDLES = [
-    '//apps/routing/common:onos-apps-routing-common',
-    '//apps/routing-api:onos-apps-routing-api',
-    '//apps/routing/fpm/api:onos-apps-routing-fpm-api',
-    '//apps/routing/fpm/app:onos-apps-routing-fpm-app',
-]
-
-onos_app (
-    app_name = 'org.onosproject.fpm',
-    title = 'FIB Push Manager (FPM) Route Receiver',
-    category = 'Utility',
-    url = 'http://onosproject.org',
-    description = 'Receives/Transmits routes from external routing daemon over FPM protocol',
-    included_bundles = BUNDLES,
-    required_apps = [ 'org.onosproject.route-service' ],
-)
\ No newline at end of file
diff --git a/apps/routing/fpm/api/BUCK b/apps/routing/fpm/api/BUCK
deleted file mode 100644
index f5a98fc..0000000
--- a/apps/routing/fpm/api/BUCK
+++ /dev/null
@@ -1,7 +0,0 @@
-COMPILE_DEPS = [
-    '//lib:CORE_DEPS',
-]
-
-osgi_jar (
-    deps = COMPILE_DEPS,
-)
diff --git a/apps/routing/fpm/app/BUCK b/apps/routing/fpm/app/BUCK
deleted file mode 100644
index adf50c3..0000000
--- a/apps/routing/fpm/app/BUCK
+++ /dev/null
@@ -1,22 +0,0 @@
-COMPILE_DEPS = [
-    '//lib:CORE_DEPS',
-    '//lib:NETTY',
-    '//lib:KRYO',
-    '//lib:org.apache.karaf.shell.console',
-    '//cli:onos-cli',
-    '//incubator/api:onos-incubator-api',
-    '//apps/routing-api:onos-apps-routing-api',
-    '//apps/route-service/api:onos-apps-route-service-api',
-    '//core/store/serializers:onos-core-serializers',
-    '//apps/routing/fpm/api:onos-apps-routing-fpm-api',
-    '//lib:io_netty_netty',
-]
-
-TEST_DEPS = [
-    '//lib:TEST_ADAPTERS',
-]
-
-osgi_jar_with_tests (
-    deps = COMPILE_DEPS,
-    test_deps = TEST_DEPS,
-)
diff --git a/apps/routing/fpm/app/BUILD b/apps/routing/fpm/app/BUILD
index 9622b2b..05fc051 100644
--- a/apps/routing/fpm/app/BUILD
+++ b/apps/routing/fpm/app/BUILD
@@ -8,6 +8,7 @@
 ]
 
 osgi_jar_with_tests(
+    karaf_command_packages = ["org.onosproject.routing.fpm.cli"],
     test_deps = TEST_ADAPTERS,
     deps = COMPILE_DEPS,
 )
diff --git a/apps/routing/fpm/app/src/main/java/org/onosproject/routing/fpm/FpmManager.java b/apps/routing/fpm/app/src/main/java/org/onosproject/routing/fpm/FpmManager.java
index 4deaebb..294ebe8 100644
--- a/apps/routing/fpm/app/src/main/java/org/onosproject/routing/fpm/FpmManager.java
+++ b/apps/routing/fpm/app/src/main/java/org/onosproject/routing/fpm/FpmManager.java
@@ -18,15 +18,6 @@
 
 import com.google.common.collect.ImmutableMap;
 import com.google.common.collect.Lists;
-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.ReferencePolicy;
-import org.apache.felix.scr.annotations.Service;
 import org.jboss.netty.bootstrap.ServerBootstrap;
 import org.jboss.netty.channel.Channel;
 import org.jboss.netty.channel.ChannelException;
@@ -75,19 +66,26 @@
 import org.onosproject.store.service.Serializer;
 import org.onosproject.store.service.StorageService;
 import org.osgi.service.component.ComponentContext;
+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.osgi.service.component.annotations.ReferencePolicy;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 import java.net.InetSocketAddress;
 import java.time.Duration;
+import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.Collection;
 import java.util.Collections;
 import java.util.Dictionary;
 import java.util.HashSet;
 import java.util.LinkedList;
 import java.util.List;
-import java.util.ArrayList;
-import java.util.Arrays;
 import java.util.Map;
 import java.util.Set;
 import java.util.concurrent.ConcurrentHashMap;
@@ -97,12 +95,28 @@
 
 import static java.util.concurrent.Executors.newCachedThreadPool;
 import static org.onlab.util.Tools.groupedThreads;
+import static org.onosproject.routing.fpm.OsgiPropertyConstants.CLEAR_ROUTES;
+import static org.onosproject.routing.fpm.OsgiPropertyConstants.CLEAR_ROUTES_DEFAULT;
+import static org.onosproject.routing.fpm.OsgiPropertyConstants.PD_PUSH_ENABLED;
+import static org.onosproject.routing.fpm.OsgiPropertyConstants.PD_PUSH_ENABLED_DEFAULT;
+import static org.onosproject.routing.fpm.OsgiPropertyConstants.PD_PUSH_NEXT_HOP_IPV4;
+import static org.onosproject.routing.fpm.OsgiPropertyConstants.PD_PUSH_NEXT_HOP_IPV4_DEFAULT;
+import static org.onosproject.routing.fpm.OsgiPropertyConstants.PD_PUSH_NEXT_HOP_IPV6;
+import static org.onosproject.routing.fpm.OsgiPropertyConstants.PD_PUSH_NEXT_HOP_IPV6_DEFAULT;
 
 /**
  * Forwarding Plane Manager (FPM) route source.
  */
-@Service
-@Component(immediate = true)
+@Component(
+       immediate = true,
+       service = FpmInfoService.class,
+       property = {
+           CLEAR_ROUTES + ":Boolean=" + CLEAR_ROUTES_DEFAULT,
+           PD_PUSH_ENABLED + ":Boolean=" + PD_PUSH_ENABLED_DEFAULT,
+           PD_PUSH_NEXT_HOP_IPV4 + "=" + PD_PUSH_NEXT_HOP_IPV4_DEFAULT,
+           PD_PUSH_NEXT_HOP_IPV6 + "=" + PD_PUSH_NEXT_HOP_IPV6_DEFAULT,
+       }
+)
 public class FpmManager implements FpmInfoService {
     private final Logger log = LoggerFactory.getLogger(getClass());
 
@@ -111,32 +125,32 @@
     private static final int IDLE_TIMEOUT_SECS = 5;
     private static final String LOCK_NAME = "fpm-manager-lock";
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected CoreService coreService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected ComponentConfigService componentConfigService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected RouteAdminService routeService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected ClusterService clusterService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected StorageService storageService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected InterfaceService interfaceService;
 
-    @Reference(cardinality = ReferenceCardinality.OPTIONAL_UNARY,
+    @Reference(cardinality = ReferenceCardinality.OPTIONAL,
                bind = "bindRipStore",
                unbind = "unbindRipStore",
                policy = ReferencePolicy.DYNAMIC,
                target = "(fpm_type=RIP)")
     protected volatile FpmPrefixStore ripStore;
 
-    @Reference(cardinality = ReferenceCardinality.OPTIONAL_UNARY,
+    @Reference(cardinality = ReferenceCardinality.OPTIONAL,
                bind = "bindDhcpStore",
                unbind = "unbindDhcpStore",
                policy = ReferencePolicy.DYNAMIC,
@@ -162,20 +176,16 @@
     //Local cache for peers to be used in case of cluster partition.
     private Map<FpmPeer, Set<FpmConnectionInfo>> localPeers = new ConcurrentHashMap<>();
 
-    @Property(name = "clearRoutes", boolValue = true,
-            label = "Whether to clear routes when the FPM connection goes down")
-    private boolean clearRoutes = true;
+    /** Whether to clear routes when the FPM connection goes down. */
+    private boolean clearRoutes = CLEAR_ROUTES_DEFAULT;
 
-    @Property(name = "pdPushEnabled", boolValue = false,
-            label = "Whether to push prefixes to Quagga over fpm connection")
-    private boolean pdPushEnabled = false;
+    /** Whether to push prefixes to Quagga over fpm connection. */
+    private boolean pdPushEnabled = PD_PUSH_ENABLED_DEFAULT;
 
-    @Property(name = "pdPushNextHopIPv4", value = "",
-            label = "IPv4 next-hop address for PD Pushing.")
+    /** IPv4 next-hop address for PD Pushing. */
     private List<Ip4Address> pdPushNextHopIPv4 = null;
 
-    @Property(name = "pdPushNextHopIPv6", value = "",
-            label = "IPv6 next-hop address for PD Pushing.")
+    /** IPv6 next-hop address for PD Pushing. */
     private List<Ip6Address> pdPushNextHopIPv6 = null;
 
     protected void bindRipStore(FpmPrefixStore store) {
@@ -268,13 +278,13 @@
         if (properties == null) {
             return;
         }
-        String strClearRoutes = Tools.get(properties, "clearRoutes");
+        String strClearRoutes = Tools.get(properties, CLEAR_ROUTES);
         if (strClearRoutes != null) {
             clearRoutes = Boolean.parseBoolean(strClearRoutes);
             log.info("clearRoutes is {}", clearRoutes);
         }
 
-        String strPdPushEnabled = Tools.get(properties, "pdPushEnabled");
+        String strPdPushEnabled = Tools.get(properties, PD_PUSH_ENABLED);
         if (strPdPushEnabled != null) {
             boolean oldValue = pdPushEnabled;
             pdPushEnabled = Boolean.parseBoolean(strPdPushEnabled);
@@ -283,7 +293,7 @@
                 pdPushNextHopIPv4 = new ArrayList<Ip4Address>();
                 pdPushNextHopIPv6 = new ArrayList<Ip6Address>();
 
-                String strPdPushNextHopIPv4 = Tools.get(properties, "pdPushNextHopIPv4");
+                String strPdPushNextHopIPv4 = Tools.get(properties, PD_PUSH_NEXT_HOP_IPV4);
                 if (strPdPushNextHopIPv4 != null) {
                     List<String> strPdPushNextHopIPv4List = Arrays.asList(strPdPushNextHopIPv4.split(","));
                     for (String nextHop : strPdPushNextHopIPv4List) {
@@ -291,7 +301,7 @@
                         pdPushNextHopIPv4.add(Ip4Address.valueOf(nextHop));
                     }
                 }
-                String strPdPushNextHopIPv6 = Tools.get(properties, "pdPushNextHopIPv6");
+                String strPdPushNextHopIPv6 = Tools.get(properties, PD_PUSH_NEXT_HOP_IPV6);
                 if (strPdPushNextHopIPv6 != null) {
                     List<String> strPdPushNextHopIPv6List = Arrays.asList(strPdPushNextHopIPv6.split(","));
                     for (String nextHop : strPdPushNextHopIPv6List) {
diff --git a/apps/routing/fpm/app/src/main/java/org/onosproject/routing/fpm/OsgiPropertyConstants.java b/apps/routing/fpm/app/src/main/java/org/onosproject/routing/fpm/OsgiPropertyConstants.java
new file mode 100644
index 0000000..2092657
--- /dev/null
+++ b/apps/routing/fpm/app/src/main/java/org/onosproject/routing/fpm/OsgiPropertyConstants.java
@@ -0,0 +1,37 @@
+/*
+ * Copyright 2018-present Open Networking Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.onosproject.routing.fpm;
+
+/**
+ * Name/Value constants for properties.
+ */
+public final class OsgiPropertyConstants {
+    private OsgiPropertyConstants() {
+    }
+
+    public static final String CLEAR_ROUTES = "clearRoutes";
+    public static final boolean CLEAR_ROUTES_DEFAULT = true;
+
+    public static final String PD_PUSH_ENABLED = "pdPushEnabled";
+    public static final boolean PD_PUSH_ENABLED_DEFAULT = false;
+
+    public static final String PD_PUSH_NEXT_HOP_IPV4 = "pdPushNextHopIPv4";
+    public static final String PD_PUSH_NEXT_HOP_IPV4_DEFAULT = "";
+
+    public static final String PD_PUSH_NEXT_HOP_IPV6 = "pdPushNextHopIPv6";
+    public static final String PD_PUSH_NEXT_HOP_IPV6_DEFAULT = "";
+}
diff --git a/apps/routing/fpm/app/src/main/java/org/onosproject/routing/fpm/cli/FpmConnectionsList.java b/apps/routing/fpm/app/src/main/java/org/onosproject/routing/fpm/cli/FpmConnectionsList.java
index f55f00e..d797844 100644
--- a/apps/routing/fpm/app/src/main/java/org/onosproject/routing/fpm/cli/FpmConnectionsList.java
+++ b/apps/routing/fpm/app/src/main/java/org/onosproject/routing/fpm/cli/FpmConnectionsList.java
@@ -16,7 +16,8 @@
 
 package org.onosproject.routing.fpm.cli;
 
-import org.apache.karaf.shell.commands.Command;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onlab.packet.IpAddress;
 import org.onlab.util.Tools;
 import org.onosproject.cli.AbstractShellCommand;
@@ -31,6 +32,7 @@
 /**
  * Displays the current FPM connections.
  */
+@Service
 @Command(scope = "onos", name = "fpm-connections",
         description = "Displays the current FPM connections")
 public class FpmConnectionsList extends AbstractShellCommand {
@@ -38,7 +40,7 @@
     private static final String FORMAT = "peer %s:%s connected to %s since %s %s (%d routes locally)";
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         FpmInfoService fpmInfo = get(FpmInfoService.class);
 
         print(String.format("PD Pushing is %s.", fpmInfo.isPdPushEnabled() ? "enabled" : "disabled"));
diff --git a/apps/routing/fpm/app/src/main/java/org/onosproject/routing/fpm/cli/FpmPushRoutesCommand.java b/apps/routing/fpm/app/src/main/java/org/onosproject/routing/fpm/cli/FpmPushRoutesCommand.java
index 29f0b63..0379442 100644
--- a/apps/routing/fpm/app/src/main/java/org/onosproject/routing/fpm/cli/FpmPushRoutesCommand.java
+++ b/apps/routing/fpm/app/src/main/java/org/onosproject/routing/fpm/cli/FpmPushRoutesCommand.java
@@ -16,7 +16,8 @@
 
 package org.onosproject.routing.fpm.cli;
 
-import org.apache.karaf.shell.commands.Command;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.routing.fpm.FpmInfoService;
 
@@ -24,11 +25,12 @@
 /**
  * Displays the current FPM connections.
  */
+@Service
 @Command(scope = "onos", name = "fpm-push-routes",
         description = "Pushes all local FPM routes to route store")
 public class FpmPushRoutesCommand extends AbstractShellCommand {
     @Override
-    protected void execute() {
+    protected void doExecute() {
         FpmInfoService fpmInfo = get(FpmInfoService.class);
         fpmInfo.pushFpmRoutes();
     }
diff --git a/apps/routing/fpm/app/src/main/resources/OSGI-INF/blueprint/shell-config.xml b/apps/routing/fpm/app/src/main/resources/OSGI-INF/blueprint/shell-config.xml
deleted file mode 100644
index a227f6f..0000000
--- a/apps/routing/fpm/app/src/main/resources/OSGI-INF/blueprint/shell-config.xml
+++ /dev/null
@@ -1,26 +0,0 @@
-<!--
-  ~ Copyright 2017-present Open Networking Foundation
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~     http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License.
-  -->
-<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0">
-
-  <command-bundle xmlns="http://karaf.apache.org/xmlns/shell/v1.1.0">
-    <command>
-      <action class="org.onosproject.routing.fpm.cli.FpmConnectionsList"/>
-    </command>
-    <command>
-      <action class="org.onosproject.routing.fpm.cli.FpmPushRoutesCommand"/>
-    </command>
-  </command-bundle>
-</blueprint>
diff --git a/apps/scalablegateway/BUCK b/apps/scalablegateway/BUCK
deleted file mode 100644
index a7a6d74..0000000
--- a/apps/scalablegateway/BUCK
+++ /dev/null
@@ -1,19 +0,0 @@
-COMPILE_DEPS = [
-    '//lib:CORE_DEPS',
-    '//lib:JACKSON',
-    '//lib:KRYO',
-    '//lib:org.apache.karaf.shell.console',
-    '//cli:onos-cli',
-    '//core/store/serializers:onos-core-serializers',
-]
-
-osgi_jar_with_tests (
-    deps = COMPILE_DEPS,
-)
-
-onos_app (
-  title = 'Scalable Gateway',
-  category = 'Traffic Engineering',
-  url = 'http://onosproject.org',
-  description = 'Scalable gateway service',
-)
diff --git a/apps/scalablegateway/BUILD b/apps/scalablegateway/BUILD
index 6d56e39..57e3109 100644
--- a/apps/scalablegateway/BUILD
+++ b/apps/scalablegateway/BUILD
@@ -3,6 +3,7 @@
 ]
 
 osgi_jar_with_tests(
+    karaf_command_packages = ["org.onosproject.scalablegateway.cli"],
     deps = COMPILE_DEPS,
 )
 
diff --git a/apps/scalablegateway/src/main/java/org/onosproject/scalablegateway/cli/ScalableGatewayAddCommand.java b/apps/scalablegateway/src/main/java/org/onosproject/scalablegateway/cli/ScalableGatewayAddCommand.java
index 71a9c5f..cb51402 100644
--- a/apps/scalablegateway/src/main/java/org/onosproject/scalablegateway/cli/ScalableGatewayAddCommand.java
+++ b/apps/scalablegateway/src/main/java/org/onosproject/scalablegateway/cli/ScalableGatewayAddCommand.java
@@ -16,8 +16,9 @@
 
 package org.onosproject.scalablegateway.cli;
 
-import org.apache.karaf.shell.commands.Argument;
-import org.apache.karaf.shell.commands.Command;
+import org.apache.karaf.shell.api.action.Argument;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onlab.packet.Ip4Address;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.net.DeviceId;
@@ -27,7 +28,7 @@
 /**
  * Adds gateway node information for scalablegateway node managements.
  */
-
+@Service
 @Command(scope = "onos", name = "gateway-add",
         description = "Adds gateway node information for scalablegateway node managements")
 public class ScalableGatewayAddCommand extends AbstractShellCommand {
@@ -50,7 +51,7 @@
     String interfaceName = null;
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         ScalableGatewayService service = get(ScalableGatewayService.class);
 
         GatewayNode gatewayNode = GatewayNode.builder()
diff --git a/apps/scalablegateway/src/main/java/org/onosproject/scalablegateway/cli/ScalableGatewayDeleteCommand.java b/apps/scalablegateway/src/main/java/org/onosproject/scalablegateway/cli/ScalableGatewayDeleteCommand.java
index 4ba4339..edfe52f 100644
--- a/apps/scalablegateway/src/main/java/org/onosproject/scalablegateway/cli/ScalableGatewayDeleteCommand.java
+++ b/apps/scalablegateway/src/main/java/org/onosproject/scalablegateway/cli/ScalableGatewayDeleteCommand.java
@@ -16,8 +16,9 @@
 
 package org.onosproject.scalablegateway.cli;
 
-import org.apache.karaf.shell.commands.Argument;
-import org.apache.karaf.shell.commands.Command;
+import org.apache.karaf.shell.api.action.Argument;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.net.DeviceId;
 import org.onosproject.scalablegateway.api.GatewayNode;
@@ -26,7 +27,7 @@
 /**
  * Deletes gateway node information for scalablegateway node managements.
  */
-
+@Service
 @Command(scope = "onos", name = "gateway-delete",
         description = "Deletes gateway node information for scalablegateway node managements")
 public class ScalableGatewayDeleteCommand extends AbstractShellCommand {
@@ -40,7 +41,7 @@
     String deviceId = null;
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         ScalableGatewayService service = get(ScalableGatewayService.class);
 
         GatewayNode gatewayNode = service.getGatewayNode(DeviceId.deviceId(deviceId));
diff --git a/apps/scalablegateway/src/main/java/org/onosproject/scalablegateway/cli/ScalableGatewayListCommand.java b/apps/scalablegateway/src/main/java/org/onosproject/scalablegateway/cli/ScalableGatewayListCommand.java
index 5c76412..d8a89f5 100644
--- a/apps/scalablegateway/src/main/java/org/onosproject/scalablegateway/cli/ScalableGatewayListCommand.java
+++ b/apps/scalablegateway/src/main/java/org/onosproject/scalablegateway/cli/ScalableGatewayListCommand.java
@@ -16,21 +16,22 @@
 
 package org.onosproject.scalablegateway.cli;
 
-import org.apache.karaf.shell.commands.Command;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.scalablegateway.api.ScalableGatewayService;
 
 /**
  * Lists all gateway node information of scalablegateway.
  */
-
+@Service
 @Command(scope = "onos", name = "gateways",
         description = "Lists gateway node information")
 public class ScalableGatewayListCommand extends AbstractShellCommand {
 
     private static final String FORMAT = "GatewayNode Id[%s]: DataPlane Ip[%s], External Interface names[%s]";
     @Override
-    protected void execute() {
+    protected void doExecute() {
         ScalableGatewayService service = get(ScalableGatewayService.class);
         service.getGatewayNodes().forEach(node -> print(FORMAT,
                 node.getGatewayDeviceId().toString(),
diff --git a/apps/scalablegateway/src/main/java/org/onosproject/scalablegateway/impl/ScalableGatewayManager.java b/apps/scalablegateway/src/main/java/org/onosproject/scalablegateway/impl/ScalableGatewayManager.java
index d5c478b..11cc0ad 100644
--- a/apps/scalablegateway/src/main/java/org/onosproject/scalablegateway/impl/ScalableGatewayManager.java
+++ b/apps/scalablegateway/src/main/java/org/onosproject/scalablegateway/impl/ScalableGatewayManager.java
@@ -18,12 +18,6 @@
 
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.Lists;
-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.KryoNamespace;
 import org.onlab.util.Tools;
 import org.onosproject.core.ApplicationId;
@@ -53,6 +47,11 @@
 import org.onosproject.store.service.Serializer;
 import org.onosproject.store.service.StorageService;
 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 org.slf4j.LoggerFactory;
 
@@ -66,8 +65,7 @@
  * Manages gateway node for gateway scalability.
  */
 
-@Service
-@Component(immediate = true)
+@Component(immediate = true, service = ScalableGatewayService.class)
 public class ScalableGatewayManager implements ScalableGatewayService {
     private final Logger log = LoggerFactory.getLogger(getClass());
 
@@ -76,25 +74,25 @@
     private static final String APP_NAME = "scalablegateway";
     private static final String GATEWAYNODE_MAP_NAME = "gatewaynode-map";
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected CoreService coreService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected NetworkConfigService configService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected NetworkConfigRegistry configRegistry;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected DeviceService deviceService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected DriverService driverService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected GroupService groupService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected StorageService storageService;
 
     private GatewayNodeConfig config;
diff --git a/apps/scalablegateway/src/main/resources/OSGI-INF/blueprint/shell-config.xml b/apps/scalablegateway/src/main/resources/OSGI-INF/blueprint/shell-config.xml
deleted file mode 100644
index d7ce04d..0000000
--- a/apps/scalablegateway/src/main/resources/OSGI-INF/blueprint/shell-config.xml
+++ /dev/null
@@ -1,29 +0,0 @@
-<!--
-  ~ Copyright 2016-present Open Networking Foundation
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~     http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License.
-  -->
-<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0">
-
-    <command-bundle xmlns="http://karaf.apache.org/xmlns/shell/v1.1.0">
-        <command>
-            <action class="org.onosproject.scalablegateway.cli.ScalableGatewayListCommand"/>
-        </command>
-        <command>
-            <action class="org.onosproject.scalablegateway.cli.ScalableGatewayAddCommand"/>
-        </command>
-        <command>
-            <action class="org.onosproject.scalablegateway.cli.ScalableGatewayDeleteCommand"/>
-        </command>
-    </command-bundle>
-</blueprint>
diff --git a/apps/sdnip/BUCK b/apps/sdnip/BUCK
deleted file mode 100644
index 4a807cf..0000000
--- a/apps/sdnip/BUCK
+++ /dev/null
@@ -1,36 +0,0 @@
-COMPILE_DEPS = [
-    '//lib:CORE_DEPS',
-    '//lib:JACKSON',
-    '//incubator/api:onos-incubator-api',
-    '//apps/routing-api:onos-apps-routing-api',
-    '//apps/route-service/api:onos-apps-route-service-api',
-    '//apps/intentsync:onos-apps-intentsync',
-    '//lib:org.apache.karaf.shell.console',
-    '//cli:onos-cli'
-]
-
-BUNDLES = [
-    '//apps/sdnip:onos-apps-sdnip',
-    '//apps/routing-api:onos-apps-routing-api',
-    '//apps/routing/common:onos-apps-routing-common',
-]
-
-TEST_DEPS = [
-    '//lib:TEST_ADAPTERS',
-    '//apps/routing-api:onos-apps-routing-api-tests',
-    '//apps/route-service/api:onos-apps-route-service-api-tests',
-]
-
-osgi_jar_with_tests (
-    deps = COMPILE_DEPS,
-    test_deps = TEST_DEPS,
-)
-
-onos_app (
-  title = 'SDN-IP',
-  category = 'Traffic Engineering',
-  url = 'http://onosproject.org',
-  included_bundles = BUNDLES,
-  description = 'SDN-IP peering application',
-  required_apps = [ 'org.onosproject.intentsynchronizer', 'org.onosproject.route-service' ],
-)
diff --git a/apps/sdnip/BUILD b/apps/sdnip/BUILD
index 861fe8e..50fa4d2 100644
--- a/apps/sdnip/BUILD
+++ b/apps/sdnip/BUILD
@@ -17,6 +17,10 @@
 ]
 
 osgi_jar_with_tests(
+    karaf_command_packages = [
+        "org.onosproject.sdnip.cli",
+        "org.onosproject.sdnip.cli.completer",
+    ],
     test_deps = TEST_DEPS,
     deps = COMPILE_DEPS,
 )
diff --git a/apps/sdnip/app.xml b/apps/sdnip/app.xml
deleted file mode 100644
index 24ce985..0000000
--- a/apps/sdnip/app.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-  ~ Copyright 2015-present Open Networking Foundation
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~     http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License.
-  -->
-<app name="org.onosproject.sdnip" origin="Open Networking Foundation" version="${project.version}"
-     category="Traffic Steering" url="http://onosproject.org" title="SDN-IP App"
-     featuresRepo="mvn:${project.groupId}/${project.artifactId}/${project.version}/xml/features"
-     features="${project.artifactId}" apps="intentsynchronizer">
-    <description>${project.description}</description>
-    <artifact>mvn:${project.groupId}/${project.artifactId}/${project.version}</artifact>
-    <artifact>mvn:${project.groupId}/onos-apps-routing-api/${project.version}</artifact>
-    <artifact>mvn:${project.groupId}/onos-apps-routing-common/${project.version}</artifact>
-</app>
diff --git a/apps/sdnip/features.xml b/apps/sdnip/features.xml
deleted file mode 100644
index 4304447..0000000
--- a/apps/sdnip/features.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
-<!--
-  ~ Copyright 2015-present Open Networking Foundation
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~     http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License.
-  -->
-<features xmlns="http://karaf.apache.org/xmlns/features/v1.2.0" name="${project.artifactId}-${project.version}">
-    <feature name="onos-apps-sdnip" version="${project.version}"
-             description="${project.description}">
-        <feature>onos-api</feature>
-        <bundle>mvn:${project.groupId}/onos-apps-sdnip/${project.version}</bundle>
-        <bundle>mvn:${project.groupId}/onos-apps-routing-api/${project.version}</bundle>
-        <bundle>mvn:${project.groupId}/onos-apps-routing-common/${project.version}</bundle>
-    </feature>
-</features>
diff --git a/apps/sdnip/src/main/java/org/onosproject/sdnip/SdnIp.java b/apps/sdnip/src/main/java/org/onosproject/sdnip/SdnIp.java
index 1103736..8df4949 100644
--- a/apps/sdnip/src/main/java/org/onosproject/sdnip/SdnIp.java
+++ b/apps/sdnip/src/main/java/org/onosproject/sdnip/SdnIp.java
@@ -16,11 +16,11 @@
 package org.onosproject.sdnip;
 
 import com.google.common.collect.ImmutableList;
-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.onosproject.app.ApplicationService;
 import org.onosproject.core.ApplicationId;
 import org.onosproject.core.CoreService;
@@ -49,25 +49,25 @@
     public static final String SDN_IP_APP = "org.onosproject.sdnip";
     private final Logger log = getLogger(getClass());
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected CoreService coreService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected ApplicationService applicationService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected NetworkConfigService networkConfigService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected InterfaceService interfaceService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected IntentSynchronizationService intentSynchronizer;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected NetworkConfigRegistry cfgRegistry;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected ComponentService componentService;
 
     private PeerConnectivityManager peerConnectivity;
diff --git a/apps/sdnip/src/main/java/org/onosproject/sdnip/SdnIpFib.java b/apps/sdnip/src/main/java/org/onosproject/sdnip/SdnIpFib.java
index 9a4369e..3f484eb 100644
--- a/apps/sdnip/src/main/java/org/onosproject/sdnip/SdnIpFib.java
+++ b/apps/sdnip/src/main/java/org/onosproject/sdnip/SdnIpFib.java
@@ -18,11 +18,11 @@
 
 import com.google.common.collect.ImmutableList;
 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.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.Ethernet;
 import org.onlab.packet.IpAddress;
 import org.onlab.packet.IpPrefix;
@@ -74,19 +74,19 @@
 public class SdnIpFib {
     private Logger log = LoggerFactory.getLogger(getClass());
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected InterfaceService interfaceService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected IntentSynchronizationService intentSynchronizer;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected CoreService coreService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected NetworkConfigService networkConfigService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected RouteService routeService;
 
     private final InternalRouteListener routeListener = new InternalRouteListener();
diff --git a/apps/sdnip/src/main/java/org/onosproject/sdnip/cli/SdnIpCommand.java b/apps/sdnip/src/main/java/org/onosproject/sdnip/cli/SdnIpCommand.java
index d25abf2..b3fafa9 100644
--- a/apps/sdnip/src/main/java/org/onosproject/sdnip/cli/SdnIpCommand.java
+++ b/apps/sdnip/src/main/java/org/onosproject/sdnip/cli/SdnIpCommand.java
@@ -15,19 +15,24 @@
  */
 package org.onosproject.sdnip.cli;
 
-import org.apache.karaf.shell.commands.Argument;
-import org.apache.karaf.shell.commands.Command;
+import org.apache.karaf.shell.api.action.Argument;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.Completion;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.core.ApplicationId;
 import org.onosproject.core.CoreService;
 import org.onosproject.net.EncapsulationType;
 import org.onosproject.net.config.NetworkConfigService;
 import org.onosproject.sdnip.SdnIp;
+import org.onosproject.sdnip.cli.completer.SdnIpCommandCompleter;
+import org.onosproject.sdnip.cli.completer.SdnIpEncapCompleter;
 import org.onosproject.sdnip.config.SdnIpConfig;
 
 /**
  * CLI to interact with the SDN-IP application.
  */
+@Service
 @Command(scope = "onos", name = "sdnip",
         description = "Manages the SDN-IP application")
 public class SdnIpCommand extends AbstractShellCommand {
@@ -49,15 +54,17 @@
     @Argument(index = 0, name = "command", description = "Command name" +
             " {set-encap}",
             required = true, multiValued = false)
+    @Completion(SdnIpCommandCompleter.class)
     String command = null;
 
     @Argument(index = 1, name = "encapType", description = "The encapsulation" +
             " type {NONE | VLAN | MPLS}",
             required = true, multiValued = false)
+    @Completion(SdnIpEncapCompleter.class)
     String encapType = null;
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         if (command != null) {
             switch (command) {
                 case "set-encap":
diff --git a/apps/sdnip/src/main/java/org/onosproject/sdnip/cli/completer/SdnIpCommandCompleter.java b/apps/sdnip/src/main/java/org/onosproject/sdnip/cli/completer/SdnIpCommandCompleter.java
index 90e1c5b..276da12 100644
--- a/apps/sdnip/src/main/java/org/onosproject/sdnip/cli/completer/SdnIpCommandCompleter.java
+++ b/apps/sdnip/src/main/java/org/onosproject/sdnip/cli/completer/SdnIpCommandCompleter.java
@@ -16,6 +16,7 @@
 package org.onosproject.sdnip.cli.completer;
 
 import com.google.common.collect.Lists;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.cli.AbstractChoicesCompleter;
 
 import java.util.List;
@@ -23,6 +24,7 @@
 /**
  * SDN-IP command completer.
  */
+@Service
 public class SdnIpCommandCompleter extends AbstractChoicesCompleter {
 
     @Override
diff --git a/apps/sdnip/src/main/java/org/onosproject/sdnip/cli/completer/SdnIpEncapCompleter.java b/apps/sdnip/src/main/java/org/onosproject/sdnip/cli/completer/SdnIpEncapCompleter.java
index dec4fcf..76d67ee 100644
--- a/apps/sdnip/src/main/java/org/onosproject/sdnip/cli/completer/SdnIpEncapCompleter.java
+++ b/apps/sdnip/src/main/java/org/onosproject/sdnip/cli/completer/SdnIpEncapCompleter.java
@@ -15,6 +15,7 @@
  */
 package org.onosproject.sdnip.cli.completer;
 
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.cli.AbstractChoicesCompleter;
 import org.onosproject.net.EncapsulationType;
 
@@ -25,6 +26,7 @@
 /**
  * SDN-IP encapsulation type completer.
  */
+@Service
 public class SdnIpEncapCompleter extends AbstractChoicesCompleter {
 
     @Override
diff --git a/apps/sdnip/src/main/resources/OSGI-INF/blueprint/shell-config.xml b/apps/sdnip/src/main/resources/OSGI-INF/blueprint/shell-config.xml
deleted file mode 100644
index cdebd85..0000000
--- a/apps/sdnip/src/main/resources/OSGI-INF/blueprint/shell-config.xml
+++ /dev/null
@@ -1,31 +0,0 @@
-<!--
-  ~ Copyright 2014-present Open Networking Foundation
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~     http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-        ~ limitations under the License.
-  -->
-<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0">
-
-    <command-bundle xmlns="http://karaf.apache.org/xmlns/shell/v1.1.0">
-        <command>
-            <action class="org.onosproject.sdnip.cli.SdnIpCommand"/>
-            <completers>
-                <ref component-id="sdnIpCommandCompleter"/>
-                <ref component-id="sdnIpEncapCompleter"/>
-                <null/>
-            </completers>
-        </command>
-    </command-bundle>
-
-    <bean id="sdnIpCommandCompleter" class="org.onosproject.sdnip.cli.completer.SdnIpCommandCompleter"/>
-    <bean id="sdnIpEncapCompleter" class="org.onosproject.sdnip.cli.completer.SdnIpEncapCompleter"/>
-</blueprint>
\ No newline at end of file
diff --git a/apps/segmentrouting/BUCK b/apps/segmentrouting/BUCK
deleted file mode 100644
index 1b3990f..0000000
--- a/apps/segmentrouting/BUCK
+++ /dev/null
@@ -1,13 +0,0 @@
-BUNDLES = [
-    '//apps/segmentrouting/app:onos-apps-segmentrouting-app',
-    '//apps/segmentrouting/web:onos-apps-segmentrouting-web',
-]
-
-onos_app (
-    title = 'Segment Routing',
-    category = 'Traffic Engineering',
-    url = 'http://onosproject.org',
-    included_bundles = BUNDLES,
-    description = 'Segment routing application.',
-    required_apps = [ 'org.onosproject.route-service', 'org.onosproject.mcast' ],
-)
diff --git a/apps/segmentrouting/app/BUCK b/apps/segmentrouting/app/BUCK
deleted file mode 100644
index 7deda13..0000000
--- a/apps/segmentrouting/app/BUCK
+++ /dev/null
@@ -1,25 +0,0 @@
-COMPILE_DEPS = [
-    '//lib:CORE_DEPS',
-    '//lib:JACKSON',
-    '//lib:KRYO',
-    '//lib:org.apache.karaf.shell.console',
-    '//cli:onos-cli',
-    '//core/common:onos-core-common',
-    '//core/store/serializers:onos-core-serializers',
-    '//incubator/api:onos-incubator-api',
-    '//apps/route-service/api:onos-apps-route-service-api',
-    '//apps/mcast/api:onos-apps-mcast-api',
-    '//apps/mcast/cli:onos-apps-mcast-cli',
-]
-
-TEST_DEPS = [
-    '//lib:TEST_ADAPTERS',
-    '//core/net:onos-core-net',
-    '//incubator/api:onos-incubator-api-tests',
-    '//apps/route-service/api:onos-apps-route-service-api-tests',
-]
-
-osgi_jar_with_tests (
-    deps = COMPILE_DEPS,
-    test_deps = TEST_DEPS,
-)
diff --git a/apps/segmentrouting/app/BUILD b/apps/segmentrouting/app/BUILD
index 9edce3e..f5bb7ec 100644
--- a/apps/segmentrouting/app/BUILD
+++ b/apps/segmentrouting/app/BUILD
@@ -14,6 +14,7 @@
 ]
 
 osgi_jar_with_tests(
+    karaf_command_packages = ["org.onosproject.segmentrouting.cli"],
     test_deps = TEST_DEPS,
     deps = COMPILE_DEPS,
 )
diff --git a/apps/segmentrouting/app/src/main/java/org/onosproject/segmentrouting/OsgiPropertyConstants.java b/apps/segmentrouting/app/src/main/java/org/onosproject/segmentrouting/OsgiPropertyConstants.java
new file mode 100644
index 0000000..7b5a6fc
--- /dev/null
+++ b/apps/segmentrouting/app/src/main/java/org/onosproject/segmentrouting/OsgiPropertyConstants.java
@@ -0,0 +1,47 @@
+/*
+ * Copyright 2018-present Open Networking Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.onosproject.segmentrouting;
+
+/**
+ * Constants for default values of configurable properties.
+ */
+public final class OsgiPropertyConstants {
+
+    private OsgiPropertyConstants() {}
+
+    public static final String PROP_ACTIVE_PROBING = "activeProbing";
+    public static final boolean ACTIVE_PROBING_DEFAULT = true;
+
+    public static final String PROP_SINGLE_HOMED_DOWN = "singleHomedDown";
+    public static final boolean SINGLE_HOMED_DOWN_DEFAULT = false;
+
+    public static final String PROP_RESPOND_TO_UNKNOWN_HOSTS = "respondToUnknownHosts";
+    public static final boolean RESPOND_TO_UNKNOWN_HOSTS_DEFAULT = true;
+
+    public static final String PROP_ROUTE_DOUBLE_TAGGED_HOSTS = "routeDoubleTaggedHosts";
+    public static final boolean ROUTE_DOUBLE_TAGGED_HOSTS_DEFAULT = false;
+
+    public static final String PROP_DEFAULT_INTERNAL_VLAN = "defaultInternalVlan";
+    public static final int DEFAULT_INTERNAL_VLAN_DEFAULT = 4094;
+
+    public static final String PROP_PW_TRANSPORT_VLAN = "pwTransportVlan";
+    public static final int PW_TRANSPORT_VLAN_DEFAULT = 4090;
+
+    static final String PROP_SYMMETRIC_PROBING = "symmetricProbing";
+    static final boolean SYMMETRIC_PROBING_DEFAULT = false;
+
+}
diff --git a/apps/segmentrouting/app/src/main/java/org/onosproject/segmentrouting/SegmentRoutingManager.java b/apps/segmentrouting/app/src/main/java/org/onosproject/segmentrouting/SegmentRoutingManager.java
index 3c37d80..c75de3c 100644
--- a/apps/segmentrouting/app/src/main/java/org/onosproject/segmentrouting/SegmentRoutingManager.java
+++ b/apps/segmentrouting/app/src/main/java/org/onosproject/segmentrouting/SegmentRoutingManager.java
@@ -20,14 +20,6 @@
 import com.google.common.collect.Maps;
 import com.google.common.collect.Multimap;
 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.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.packet.Ethernet;
 import org.onlab.packet.ICMP6;
 import org.onlab.packet.IPv4;
@@ -110,19 +102,17 @@
 import org.onosproject.segmentrouting.mcast.McastHandler;
 import org.onosproject.segmentrouting.mcast.McastRole;
 import org.onosproject.segmentrouting.mcast.McastRoleStoreKey;
+import org.onosproject.segmentrouting.mcast.McastStoreKey;
 import org.onosproject.segmentrouting.pwaas.DefaultL2Tunnel;
 import org.onosproject.segmentrouting.pwaas.DefaultL2TunnelDescription;
 import org.onosproject.segmentrouting.pwaas.DefaultL2TunnelHandler;
 import org.onosproject.segmentrouting.pwaas.DefaultL2TunnelPolicy;
-
 import org.onosproject.segmentrouting.pwaas.L2Tunnel;
+import org.onosproject.segmentrouting.pwaas.L2TunnelDescription;
 import org.onosproject.segmentrouting.pwaas.L2TunnelHandler;
 import org.onosproject.segmentrouting.pwaas.L2TunnelPolicy;
-import org.onosproject.segmentrouting.pwaas.L2TunnelDescription;
-
 import org.onosproject.segmentrouting.storekey.DestinationSetNextObjectiveStoreKey;
 import org.onosproject.segmentrouting.storekey.DummyVlanIdStoreKey;
-import org.onosproject.segmentrouting.mcast.McastStoreKey;
 import org.onosproject.segmentrouting.storekey.PortNextObjectiveStoreKey;
 import org.onosproject.segmentrouting.storekey.VlanNextObjectiveStoreKey;
 import org.onosproject.segmentrouting.storekey.XConnectStoreKey;
@@ -133,6 +123,12 @@
 import org.onosproject.store.service.StorageService;
 import org.onosproject.store.service.WallClockTimestamp;
 import org.osgi.service.component.ComponentContext;
+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 org.slf4j.LoggerFactory;
 
@@ -161,110 +157,125 @@
 import static org.onlab.util.Tools.groupedThreads;
 import static org.onosproject.net.config.NetworkConfigEvent.Type.CONFIG_REGISTERED;
 import static org.onosproject.net.config.NetworkConfigEvent.Type.CONFIG_UNREGISTERED;
+import static org.onosproject.segmentrouting.OsgiPropertyConstants.ACTIVE_PROBING_DEFAULT;
+import static org.onosproject.segmentrouting.OsgiPropertyConstants.DEFAULT_INTERNAL_VLAN_DEFAULT;
+import static org.onosproject.segmentrouting.OsgiPropertyConstants.PROP_ACTIVE_PROBING;
+import static org.onosproject.segmentrouting.OsgiPropertyConstants.PROP_DEFAULT_INTERNAL_VLAN;
+import static org.onosproject.segmentrouting.OsgiPropertyConstants.PROP_PW_TRANSPORT_VLAN;
+import static org.onosproject.segmentrouting.OsgiPropertyConstants.PROP_RESPOND_TO_UNKNOWN_HOSTS;
+import static org.onosproject.segmentrouting.OsgiPropertyConstants.PROP_ROUTE_DOUBLE_TAGGED_HOSTS;
+import static org.onosproject.segmentrouting.OsgiPropertyConstants.PROP_SINGLE_HOMED_DOWN;
+import static org.onosproject.segmentrouting.OsgiPropertyConstants.PROP_SYMMETRIC_PROBING;
+import static org.onosproject.segmentrouting.OsgiPropertyConstants.PW_TRANSPORT_VLAN_DEFAULT;
+import static org.onosproject.segmentrouting.OsgiPropertyConstants.RESPOND_TO_UNKNOWN_HOSTS_DEFAULT;
+import static org.onosproject.segmentrouting.OsgiPropertyConstants.ROUTE_DOUBLE_TAGGED_HOSTS_DEFAULT;
+import static org.onosproject.segmentrouting.OsgiPropertyConstants.SINGLE_HOMED_DOWN_DEFAULT;
+import static org.onosproject.segmentrouting.OsgiPropertyConstants.SYMMETRIC_PROBING_DEFAULT;
 
 /**
  * Segment routing manager.
  */
-@Service
-@Component(immediate = true)
+@Component(
+    immediate = true,
+    service = SegmentRoutingService.class,
+    property = {
+        PROP_ACTIVE_PROBING + ":Boolean=" + ACTIVE_PROBING_DEFAULT,
+        PROP_SINGLE_HOMED_DOWN + ":Boolean=" + SINGLE_HOMED_DOWN_DEFAULT,
+        PROP_RESPOND_TO_UNKNOWN_HOSTS + ":Boolean=" + RESPOND_TO_UNKNOWN_HOSTS_DEFAULT,
+        PROP_ROUTE_DOUBLE_TAGGED_HOSTS + ":Boolean=" + ROUTE_DOUBLE_TAGGED_HOSTS_DEFAULT,
+        PROP_DEFAULT_INTERNAL_VLAN + ":Integer=" + DEFAULT_INTERNAL_VLAN_DEFAULT,
+        PROP_PW_TRANSPORT_VLAN + ":Integer=" + PW_TRANSPORT_VLAN_DEFAULT,
+        PROP_SYMMETRIC_PROBING + ":Boolean=" + SYMMETRIC_PROBING_DEFAULT
+    }
+)
 public class SegmentRoutingManager implements SegmentRoutingService {
 
     private static Logger log = LoggerFactory.getLogger(SegmentRoutingManager.class);
     private static final String NOT_MASTER = "Current instance is not the master of {}. Ignore.";
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     private ComponentConfigService compCfgService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     private NeighbourResolutionService neighbourResolutionService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     public CoreService coreService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     PacketService packetService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     HostService hostService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     HostProbingService probingService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     public DeviceService deviceService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     DeviceAdminService deviceAdminService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     public FlowObjectiveService flowObjectiveService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     public LinkService linkService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     public MastershipService mastershipService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     public StorageService storageService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     public MulticastRouteService multicastRouteService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     public TopologyService topologyService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     RouteService routeService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     public NetworkConfigRegistry cfgService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     public InterfaceService interfaceService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     public ClusterService clusterService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     public WorkPartitionService workPartitionService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     public LeadershipService leadershipService;
 
-    @Reference(cardinality = ReferenceCardinality.OPTIONAL_UNARY)
+    @Reference(cardinality = ReferenceCardinality.OPTIONAL)
     public XconnectService xconnectService;
 
-    @Property(name = "activeProbing", boolValue = true,
-            label = "Enable active probing to discover dual-homed hosts.")
-    boolean activeProbing = true;
+    /** Enable active probing to discover dual-homed hosts. */
+    boolean activeProbing = ACTIVE_PROBING_DEFAULT;
 
-    @Property(name = "symmetricProbing", boolValue = false,
-            label = "Enable only send probe on the same port number of the pair device")
-    boolean symmetricProbing = false;
+    /** Enable only send probe on the same port number of the pair device. */
+    boolean symmetricProbing = SYMMETRIC_PROBING_DEFAULT;
 
-    @Property(name = "singleHomedDown", boolValue = false,
-            label = "Enable administratively taking down single-homed hosts "
-                    + "when all uplinks are gone")
-    boolean singleHomedDown = false;
+    /** Enable administratively taking down single-homed hosts. */
+    boolean singleHomedDown = SINGLE_HOMED_DOWN_DEFAULT;
 
-    @Property(name = "respondToUnknownHosts", boolValue = true,
-            label = "Enable this to respond to ARP/NDP requests from unknown hosts.")
-    boolean respondToUnknownHosts = true;
+    /** Enable this to respond to ARP/NDP requests from unknown hosts. */
+    boolean respondToUnknownHosts = RESPOND_TO_UNKNOWN_HOSTS_DEFAULT;
 
-    @Property(name = "routeDoubleTaggedHosts", boolValue = false,
-            label = "Program flows and groups to pop and route double tagged hosts")
-    boolean routeDoubleTaggedHosts = false;
+    /** Program flows and groups to pop and route double tagged hosts. */
+    boolean routeDoubleTaggedHosts = ROUTE_DOUBLE_TAGGED_HOSTS_DEFAULT;
 
-    private static final int DEFAULT_INTERNAL_VLAN = 4094;
-    @Property(name = "defaultInternalVlan", intValue = DEFAULT_INTERNAL_VLAN,
-            label = "internal vlan assigned by default to unconfigured ports")
-    private int defaultInternalVlan = DEFAULT_INTERNAL_VLAN;
+    /** internal vlan assigned by default to unconfigured ports. */
+    private int defaultInternalVlan = DEFAULT_INTERNAL_VLAN_DEFAULT;
 
-    private static final int PW_TRANSPORT_VLAN = 4090;
-    @Property(name = "pwTransportVlan", intValue = PW_TRANSPORT_VLAN,
-            label = "vlan used for transport of pseudowires between switches")
-    private int pwTransportVlan = PW_TRANSPORT_VLAN;
+    /** vlan used for transport of pseudowires between switches. */
+    private int pwTransportVlan = PW_TRANSPORT_VLAN_DEFAULT;
 
     ArpHandler arpHandler = null;
     IcmpHandler icmpHandler = null;
@@ -613,21 +624,22 @@
             return;
         }
 
-        String strActiveProbing = Tools.get(properties, "activeProbing");
+        String strActiveProbing = Tools.get(properties, PROP_ACTIVE_PROBING);
         boolean expectActiveProbing = Boolean.parseBoolean(strActiveProbing);
         if (expectActiveProbing != activeProbing) {
             activeProbing = expectActiveProbing;
             log.info("{} active probing", activeProbing ? "Enabling" : "Disabling");
         }
 
-        String strSymmetricProving = Tools.get(properties, "symmetricProbing");
-        boolean expectSymmetricProbing = Boolean.parseBoolean(strSymmetricProving);
+
+        String strSymmetricProbing = Tools.get(properties, PROP_SYMMETRIC_PROBING);
+        boolean expectSymmetricProbing = Boolean.parseBoolean(strSymmetricProbing);
         if (expectSymmetricProbing != symmetricProbing) {
             symmetricProbing = expectSymmetricProbing;
             log.info("{} symmetric probing", symmetricProbing ? "Enabling" : "Disabling");
         }
 
-        String strSingleHomedDown = Tools.get(properties, "singleHomedDown");
+        String strSingleHomedDown = Tools.get(properties, PROP_SINGLE_HOMED_DOWN);
         boolean expectSingleHomedDown = Boolean.parseBoolean(strSingleHomedDown);
         if (expectSingleHomedDown != singleHomedDown) {
             singleHomedDown = expectSingleHomedDown;
@@ -646,14 +658,14 @@
             }
         }
 
-        String strRespondToUnknownHosts = Tools.get(properties, "respondToUnknownHosts");
+        String strRespondToUnknownHosts = Tools.get(properties, PROP_RESPOND_TO_UNKNOWN_HOSTS);
         boolean expectRespondToUnknownHosts = Boolean.parseBoolean(strRespondToUnknownHosts);
         if (expectRespondToUnknownHosts != respondToUnknownHosts) {
             respondToUnknownHosts = expectRespondToUnknownHosts;
             log.info("{} responding to ARPs/NDPs from unknown hosts", respondToUnknownHosts ? "Enabling" : "Disabling");
         }
 
-        String strRouteDoubleTaggedHosts = Tools.get(properties, "routeDoubleTaggedHosts");
+        String strRouteDoubleTaggedHosts = Tools.get(properties, PROP_ROUTE_DOUBLE_TAGGED_HOSTS);
         boolean expectRouteDoubleTaggedHosts = Boolean.parseBoolean(strRouteDoubleTaggedHosts);
         if (expectRouteDoubleTaggedHosts != routeDoubleTaggedHosts) {
             routeDoubleTaggedHosts = expectRouteDoubleTaggedHosts;
@@ -666,7 +678,7 @@
             }
         }
 
-        String strDefaultInternalVlan = Tools.get(properties, "defaultInternalVlan");
+        String strDefaultInternalVlan = Tools.get(properties, PROP_DEFAULT_INTERNAL_VLAN);
         int defIntVlan = Integer.parseInt(strDefaultInternalVlan);
         if (defIntVlan != defaultInternalVlan) {
             if (canUseVlanId(defIntVlan)) {
@@ -684,7 +696,7 @@
             }
         }
 
-        String strPwTxpVlan = Tools.get(properties, "pwTransportVlan");
+        String strPwTxpVlan = Tools.get(properties, PROP_PW_TRANSPORT_VLAN);
         int pwTxpVlan = Integer.parseInt(strPwTxpVlan);
         if (pwTxpVlan != pwTransportVlan) {
             if (canUseVlanId(pwTxpVlan)) {
diff --git a/apps/segmentrouting/app/src/main/java/org/onosproject/segmentrouting/cli/BlackHoleCommand.java b/apps/segmentrouting/app/src/main/java/org/onosproject/segmentrouting/cli/BlackHoleCommand.java
index d30d49d..c45ff8e 100644
--- a/apps/segmentrouting/app/src/main/java/org/onosproject/segmentrouting/cli/BlackHoleCommand.java
+++ b/apps/segmentrouting/app/src/main/java/org/onosproject/segmentrouting/cli/BlackHoleCommand.java
@@ -19,8 +19,9 @@
 import com.fasterxml.jackson.databind.JsonNode;
 import com.fasterxml.jackson.databind.ObjectMapper;
 import com.google.common.collect.Sets;
-import org.apache.karaf.shell.commands.Argument;
-import org.apache.karaf.shell.commands.Command;
+import org.apache.karaf.shell.api.action.Argument;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onlab.packet.IpPrefix;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.net.config.NetworkConfigService;
@@ -32,6 +33,7 @@
 /**
  * CLI command for managing black hole routes.
  */
+@Service
 @Command(scope = "onos", name = "sr-blackhole",
         description = "Manage black hole routes")
 public class BlackHoleCommand extends AbstractShellCommand {
@@ -46,7 +48,7 @@
     private String prefix;
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         SegmentRoutingService srService = AbstractShellCommand.get(SegmentRoutingService.class);
         NetworkConfigService netcfgService = AbstractShellCommand.get(NetworkConfigService.class);
 
diff --git a/apps/segmentrouting/app/src/main/java/org/onosproject/segmentrouting/cli/DeviceSubnetListCommand.java b/apps/segmentrouting/app/src/main/java/org/onosproject/segmentrouting/cli/DeviceSubnetListCommand.java
index a364b6e..8f706b0 100644
--- a/apps/segmentrouting/app/src/main/java/org/onosproject/segmentrouting/cli/DeviceSubnetListCommand.java
+++ b/apps/segmentrouting/app/src/main/java/org/onosproject/segmentrouting/cli/DeviceSubnetListCommand.java
@@ -16,7 +16,8 @@
 
 package org.onosproject.segmentrouting.cli;
 
-import org.apache.karaf.shell.commands.Command;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onlab.packet.IpPrefix;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.net.DeviceId;
@@ -28,11 +29,12 @@
 /**
  * Command to list device-subnet mapping in Segment Routing.
  */
+@Service
 @Command(scope = "onos", name = "sr-device-subnets",
         description = "List device-subnet mapping in Segment Routing")
 public class DeviceSubnetListCommand extends AbstractShellCommand {
     @Override
-    protected void execute() {
+    protected void doExecute() {
         SegmentRoutingService srService =
                 AbstractShellCommand.get(SegmentRoutingService.class);
         printDeviceSubnetMap(srService.getDeviceSubnetMap());
diff --git a/apps/segmentrouting/app/src/main/java/org/onosproject/segmentrouting/cli/EcmpGraphCommand.java b/apps/segmentrouting/app/src/main/java/org/onosproject/segmentrouting/cli/EcmpGraphCommand.java
index 678114a..269134d 100644
--- a/apps/segmentrouting/app/src/main/java/org/onosproject/segmentrouting/cli/EcmpGraphCommand.java
+++ b/apps/segmentrouting/app/src/main/java/org/onosproject/segmentrouting/cli/EcmpGraphCommand.java
@@ -19,7 +19,8 @@
 
 import java.util.Map;
 
-import org.apache.karaf.shell.commands.Command;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.net.DeviceId;
 import org.onosproject.segmentrouting.EcmpShortestPathGraph;
@@ -29,6 +30,7 @@
  * Command to read the current state of the ECMP shortest-path graph.
  *
  */
+@Service
 @Command(scope = "onos", name = "sr-ecmp-spg",
         description = "Displays the current ecmp shortest-path-graph in this "
                 + "controller instance")
@@ -37,7 +39,7 @@
     private static final String FORMAT_MAPPING = "  %s";
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         SegmentRoutingService srService =
                 AbstractShellCommand.get(SegmentRoutingService.class);
         printEcmpGraph(srService.getCurrentEcmpSpg());
diff --git a/apps/segmentrouting/app/src/main/java/org/onosproject/segmentrouting/cli/InvalidateNextCommand.java b/apps/segmentrouting/app/src/main/java/org/onosproject/segmentrouting/cli/InvalidateNextCommand.java
index aa3f78b..094bea9 100644
--- a/apps/segmentrouting/app/src/main/java/org/onosproject/segmentrouting/cli/InvalidateNextCommand.java
+++ b/apps/segmentrouting/app/src/main/java/org/onosproject/segmentrouting/cli/InvalidateNextCommand.java
@@ -17,8 +17,9 @@
 package org.onosproject.segmentrouting.cli;
 
 
-import org.apache.karaf.shell.commands.Argument;
-import org.apache.karaf.shell.commands.Command;
+import org.apache.karaf.shell.api.action.Argument;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onlab.osgi.ServiceNotFoundException;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.segmentrouting.SegmentRoutingService;
@@ -26,6 +27,7 @@
 /**
  * Command to invalidate next id from SR internal stores.
  */
+@Service
 @Command(scope = "onos", name = "sr-next-invalidate",
         description = "Invalidate given next id from SR internal stores")
 public class InvalidateNextCommand extends AbstractShellCommand {
@@ -39,7 +41,7 @@
     private String please = null;
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         if (please == null || !please.equals(CONFIRM_PHRASE)) {
             print("WARNING: System may enter an unpredictable state if the next ID is force invalidated." +
                     "Enter confirmation phrase to continue.");
diff --git a/apps/segmentrouting/app/src/main/java/org/onosproject/segmentrouting/cli/LinkStateCommand.java b/apps/segmentrouting/app/src/main/java/org/onosproject/segmentrouting/cli/LinkStateCommand.java
index ded4ae6..9d7147b 100644
--- a/apps/segmentrouting/app/src/main/java/org/onosproject/segmentrouting/cli/LinkStateCommand.java
+++ b/apps/segmentrouting/app/src/main/java/org/onosproject/segmentrouting/cli/LinkStateCommand.java
@@ -20,7 +20,8 @@
 import java.util.List;
 import java.util.Set;
 
-import org.apache.karaf.shell.commands.Command;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.net.DeviceId;
 import org.onosproject.net.Link;
@@ -34,13 +35,14 @@
  * Command to read the current state of the DestinationSetNextObjectiveStore.
  *
  */
+@Service
 @Command(scope = "onos", name = "sr-link-state", description = "Displays the current internal link state "
         + "noted by this instance of the controller")
 public class LinkStateCommand extends AbstractShellCommand {
     private static final String FORMAT_MAPPING = "  %s";
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         SegmentRoutingService srService = AbstractShellCommand
                 .get(SegmentRoutingService.class);
         printLinkState(srService.getSeenLinks(),
diff --git a/apps/segmentrouting/app/src/main/java/org/onosproject/segmentrouting/cli/McastLeaderListCommand.java b/apps/segmentrouting/app/src/main/java/org/onosproject/segmentrouting/cli/McastLeaderListCommand.java
index 33a9fc9..633745c 100644
--- a/apps/segmentrouting/app/src/main/java/org/onosproject/segmentrouting/cli/McastLeaderListCommand.java
+++ b/apps/segmentrouting/app/src/main/java/org/onosproject/segmentrouting/cli/McastLeaderListCommand.java
@@ -16,8 +16,10 @@
 
 package org.onosproject.segmentrouting.cli;
 
-import org.apache.karaf.shell.commands.Command;
-import org.apache.karaf.shell.commands.Option;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.Completion;
+import org.apache.karaf.shell.api.action.Option;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onlab.packet.IpAddress;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.cluster.NodeId;
@@ -31,6 +33,7 @@
 /**
  * Command to show the mcast leaders of the groups.
  */
+@Service
 @Command(scope = "onos", name = "sr-mcast-leader",
         description = "Lists all mcast leaders")
 public class McastLeaderListCommand extends AbstractShellCommand {
@@ -45,10 +48,11 @@
             description = "IP Address of the multicast group",
             valueToShowInHelp = "224.0.0.0",
             required = false, multiValued = false)
+    @Completion(McastGroupCompleter.class)
     String gAddr = null;
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         // Verify mcast group
         IpAddress mcastGroup = null;
         if (!isNullOrEmpty(gAddr)) {
diff --git a/apps/segmentrouting/app/src/main/java/org/onosproject/segmentrouting/cli/McastNextListCommand.java b/apps/segmentrouting/app/src/main/java/org/onosproject/segmentrouting/cli/McastNextListCommand.java
index 569f097..7dd6fd3 100644
--- a/apps/segmentrouting/app/src/main/java/org/onosproject/segmentrouting/cli/McastNextListCommand.java
+++ b/apps/segmentrouting/app/src/main/java/org/onosproject/segmentrouting/cli/McastNextListCommand.java
@@ -17,8 +17,10 @@
 package org.onosproject.segmentrouting.cli;
 
 import com.google.common.collect.Maps;
-import org.apache.karaf.shell.commands.Command;
-import org.apache.karaf.shell.commands.Option;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.Completion;
+import org.apache.karaf.shell.api.action.Option;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onlab.packet.IpAddress;
 import org.onlab.packet.VlanId;
 import org.onosproject.cli.AbstractShellCommand;
@@ -37,6 +39,7 @@
 /**
  * Command to show the list of mcast nextids.
  */
+@Service
 @Command(scope = "onos", name = "sr-next-mcast",
         description = "Lists all mcast nextids")
 public class McastNextListCommand extends AbstractShellCommand {
@@ -51,10 +54,11 @@
             description = "IP Address of the multicast group",
             valueToShowInHelp = "224.0.0.0",
             required = false, multiValued = false)
+    @Completion(McastGroupCompleter.class)
     String gAddr = null;
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         // Verify mcast group
         IpAddress mcastGroup = null;
         if (!isNullOrEmpty(gAddr)) {
diff --git a/apps/segmentrouting/app/src/main/java/org/onosproject/segmentrouting/cli/McastRoleListCommand.java b/apps/segmentrouting/app/src/main/java/org/onosproject/segmentrouting/cli/McastRoleListCommand.java
index facd6a1..2b22c67 100644
--- a/apps/segmentrouting/app/src/main/java/org/onosproject/segmentrouting/cli/McastRoleListCommand.java
+++ b/apps/segmentrouting/app/src/main/java/org/onosproject/segmentrouting/cli/McastRoleListCommand.java
@@ -19,10 +19,13 @@
 import com.google.common.collect.ArrayListMultimap;
 import com.google.common.collect.Maps;
 import com.google.common.collect.Multimap;
-import org.apache.karaf.shell.commands.Command;
-import org.apache.karaf.shell.commands.Option;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.Completion;
+import org.apache.karaf.shell.api.action.Option;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onlab.packet.IpAddress;
 import org.onosproject.cli.AbstractShellCommand;
+import org.onosproject.cli.net.ConnectPointCompleter;
 import org.onosproject.mcast.cli.McastGroupCompleter;
 import org.onosproject.net.ConnectPoint;
 import org.onosproject.net.DeviceId;
@@ -40,6 +43,7 @@
 /**
  * Command to show the list of mcast roles.
  */
+@Service
 @Command(scope = "onos", name = "sr-mcast-role",
         description = "Lists all mcast roles")
 public class McastRoleListCommand extends AbstractShellCommand {
@@ -54,16 +58,18 @@
             description = "IP Address of the multicast group",
             valueToShowInHelp = "224.0.0.0",
             required = false, multiValued = false)
+    @Completion(McastGroupCompleter.class)
     String gAddr = null;
 
     @Option(name = "-src", aliases = "--connectPoint",
             description = "Source port of:XXXXXXXXXX/XX",
             valueToShowInHelp = "of:0000000000000001/1",
             required = false, multiValued = false)
+    @Completion(ConnectPointCompleter.class)
     String source = null;
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         // Verify mcast group
         IpAddress mcastGroup = null;
         // We want to use source cp only for a specific group
diff --git a/apps/segmentrouting/app/src/main/java/org/onosproject/segmentrouting/cli/McastTreeListCommand.java b/apps/segmentrouting/app/src/main/java/org/onosproject/segmentrouting/cli/McastTreeListCommand.java
index 89f107a..09c795c 100644
--- a/apps/segmentrouting/app/src/main/java/org/onosproject/segmentrouting/cli/McastTreeListCommand.java
+++ b/apps/segmentrouting/app/src/main/java/org/onosproject/segmentrouting/cli/McastTreeListCommand.java
@@ -21,10 +21,13 @@
 import com.fasterxml.jackson.databind.node.ObjectNode;
 import com.google.common.collect.ImmutableSet;
 import com.google.common.collect.Multimap;
-import org.apache.karaf.shell.commands.Command;
-import org.apache.karaf.shell.commands.Option;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.Completion;
+import org.apache.karaf.shell.api.action.Option;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onlab.packet.IpAddress;
 import org.onosproject.cli.AbstractShellCommand;
+import org.onosproject.cli.net.ConnectPointCompleter;
 import org.onosproject.mcast.cli.McastGroupCompleter;
 import org.onosproject.net.ConnectPoint;
 import org.onosproject.segmentrouting.SegmentRoutingService;
@@ -38,6 +41,7 @@
 /**
  * Command to show the list of mcast trees.
  */
+@Service
 @Command(scope = "onos", name = "sr-mcast-tree",
         description = "Lists all mcast trees")
 public class McastTreeListCommand extends AbstractShellCommand {
@@ -54,16 +58,18 @@
             description = "IP Address of the multicast group",
             valueToShowInHelp = "224.0.0.0",
             required = false, multiValued = false)
+    @Completion(McastGroupCompleter.class)
     String gAddr = null;
 
     @Option(name = "-src", aliases = "--connectPoint",
             description = "Source port of:XXXXXXXXXX/XX",
             valueToShowInHelp = "of:0000000000000001/1",
             required = false, multiValued = false)
+    @Completion(ConnectPointCompleter.class)
     String source = null;
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         // Get SR service and the handled mcast groups
         SegmentRoutingService srService = get(SegmentRoutingService.class);
         Set<IpAddress> mcastGroups = ImmutableSet.copyOf(srService.getMcastLeaders(null)
diff --git a/apps/segmentrouting/app/src/main/java/org/onosproject/segmentrouting/cli/NextDstCommand.java b/apps/segmentrouting/app/src/main/java/org/onosproject/segmentrouting/cli/NextDstCommand.java
index 07950a7..e6da695 100644
--- a/apps/segmentrouting/app/src/main/java/org/onosproject/segmentrouting/cli/NextDstCommand.java
+++ b/apps/segmentrouting/app/src/main/java/org/onosproject/segmentrouting/cli/NextDstCommand.java
@@ -21,7 +21,8 @@
 import java.util.Comparator;
 import java.util.Map;
 
-import org.apache.karaf.shell.commands.Command;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.segmentrouting.SegmentRoutingService;
 import org.onosproject.segmentrouting.grouphandler.NextNeighbors;
@@ -30,6 +31,7 @@
 /**
  * Command to read the current state of the DestinationSetNextObjectiveStore.
  */
+@Service
 @Command(scope = "onos", name = "sr-next-dst",
         description = "Displays the current next-hops seen by each switch "
                 + "towards a set of destinations and the next-id it maps to")
@@ -38,7 +40,7 @@
     private static final String FORMAT_MAPPING = "  %s";
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         SegmentRoutingService srService =
                 AbstractShellCommand.get(SegmentRoutingService.class);
         printDestinationSet(srService.getDstNextObjStore());
diff --git a/apps/segmentrouting/app/src/main/java/org/onosproject/segmentrouting/cli/NextPortCommand.java b/apps/segmentrouting/app/src/main/java/org/onosproject/segmentrouting/cli/NextPortCommand.java
index 5be9d77..fddc1d7 100644
--- a/apps/segmentrouting/app/src/main/java/org/onosproject/segmentrouting/cli/NextPortCommand.java
+++ b/apps/segmentrouting/app/src/main/java/org/onosproject/segmentrouting/cli/NextPortCommand.java
@@ -16,7 +16,8 @@
 
 package org.onosproject.segmentrouting.cli;
 
-import org.apache.karaf.shell.commands.Command;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.segmentrouting.SegmentRoutingService;
 import org.onosproject.segmentrouting.storekey.PortNextObjectiveStoreKey;
@@ -28,11 +29,12 @@
 /**
  * Command to read the current state of the portNextObjStore.
  */
+@Service
 @Command(scope = "onos", name = "sr-next-port",
         description = "Displays the current port / next-id it mapping")
 public class NextPortCommand extends AbstractShellCommand {
     @Override
-    protected void execute() {
+    protected void doExecute() {
         SegmentRoutingService srService =
                 AbstractShellCommand.get(SegmentRoutingService.class);
         print(srService.getPortNextObjStore());
diff --git a/apps/segmentrouting/app/src/main/java/org/onosproject/segmentrouting/cli/NextVlanCommand.java b/apps/segmentrouting/app/src/main/java/org/onosproject/segmentrouting/cli/NextVlanCommand.java
index 0295a90..8518a5f 100644
--- a/apps/segmentrouting/app/src/main/java/org/onosproject/segmentrouting/cli/NextVlanCommand.java
+++ b/apps/segmentrouting/app/src/main/java/org/onosproject/segmentrouting/cli/NextVlanCommand.java
@@ -16,7 +16,8 @@
 
 package org.onosproject.segmentrouting.cli;
 
-import org.apache.karaf.shell.commands.Command;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.segmentrouting.SegmentRoutingService;
 import org.onosproject.segmentrouting.storekey.VlanNextObjectiveStoreKey;
@@ -28,11 +29,12 @@
 /**
  * Command to read the current state of the vlanNextObjStore.
  */
+@Service
 @Command(scope = "onos", name = "sr-next-vlan",
         description = "Displays the current vlan / next-id it mapping")
 public class NextVlanCommand extends AbstractShellCommand {
     @Override
-    protected void execute() {
+    protected void doExecute() {
         SegmentRoutingService srService =
                 AbstractShellCommand.get(SegmentRoutingService.class);
         print(srService.getVlanNextObjStore());
diff --git a/apps/segmentrouting/app/src/main/java/org/onosproject/segmentrouting/cli/PolicyAddCommand.java b/apps/segmentrouting/app/src/main/java/org/onosproject/segmentrouting/cli/PolicyAddCommand.java
index 605ba83..1f75317 100644
--- a/apps/segmentrouting/app/src/main/java/org/onosproject/segmentrouting/cli/PolicyAddCommand.java
+++ b/apps/segmentrouting/app/src/main/java/org/onosproject/segmentrouting/cli/PolicyAddCommand.java
@@ -15,8 +15,9 @@
  */
 package org.onosproject.segmentrouting.cli;
 
-import org.apache.karaf.shell.commands.Argument;
-import org.apache.karaf.shell.commands.Command;
+import org.apache.karaf.shell.api.action.Argument;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.segmentrouting.Policy;
 import org.onosproject.segmentrouting.PolicyHandler;
@@ -26,6 +27,7 @@
 /**
  * Command to add a new policy.
  */
+@Service
 @Command(scope = "onos", name = "sr-policy-add",
         description = "Create a new policy")
 public class PolicyAddCommand extends AbstractShellCommand {
@@ -78,7 +80,7 @@
     String tunnelId;
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
 
         SegmentRoutingService srService =
                 AbstractShellCommand.get(SegmentRoutingService.class);
diff --git a/apps/segmentrouting/app/src/main/java/org/onosproject/segmentrouting/cli/PolicyListCommand.java b/apps/segmentrouting/app/src/main/java/org/onosproject/segmentrouting/cli/PolicyListCommand.java
index 6c91b8b..3520fba 100644
--- a/apps/segmentrouting/app/src/main/java/org/onosproject/segmentrouting/cli/PolicyListCommand.java
+++ b/apps/segmentrouting/app/src/main/java/org/onosproject/segmentrouting/cli/PolicyListCommand.java
@@ -15,7 +15,8 @@
  */
 package org.onosproject.segmentrouting.cli;
 
-import org.apache.karaf.shell.commands.Command;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.segmentrouting.Policy;
 import org.onosproject.segmentrouting.SegmentRoutingService;
@@ -24,6 +25,7 @@
 /**
  * Command to show the list of policies.
  */
+@Service
 @Command(scope = "onos", name = "sr-policy-list",
         description = "Lists all policies")
 public class PolicyListCommand extends AbstractShellCommand {
@@ -32,7 +34,7 @@
             "  id=%s, type=%s,  prio=%d, src=%s, port=%d, dst=%s, port=%d, proto=%s, tunnel=%s";
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
 
         SegmentRoutingService srService =
                 AbstractShellCommand.get(SegmentRoutingService.class);
diff --git a/apps/segmentrouting/app/src/main/java/org/onosproject/segmentrouting/cli/PolicyRemoveCommand.java b/apps/segmentrouting/app/src/main/java/org/onosproject/segmentrouting/cli/PolicyRemoveCommand.java
index cdc3034..575d35f 100644
--- a/apps/segmentrouting/app/src/main/java/org/onosproject/segmentrouting/cli/PolicyRemoveCommand.java
+++ b/apps/segmentrouting/app/src/main/java/org/onosproject/segmentrouting/cli/PolicyRemoveCommand.java
@@ -16,8 +16,9 @@
 package org.onosproject.segmentrouting.cli;
 
 
-import org.apache.karaf.shell.commands.Argument;
-import org.apache.karaf.shell.commands.Command;
+import org.apache.karaf.shell.api.action.Argument;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.segmentrouting.PolicyHandler;
 import org.onosproject.segmentrouting.SegmentRoutingService;
@@ -26,6 +27,7 @@
 /**
  * Command to remove a policy.
  */
+@Service
 @Command(scope = "onos", name = "sr-policy-remove",
         description = "Remove a policy")
 public class PolicyRemoveCommand extends AbstractShellCommand {
@@ -36,7 +38,7 @@
     String policyId;
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
 
         SegmentRoutingService srService =
                 AbstractShellCommand.get(SegmentRoutingService.class);
diff --git a/apps/segmentrouting/app/src/main/java/org/onosproject/segmentrouting/cli/PseudowireAddCommand.java b/apps/segmentrouting/app/src/main/java/org/onosproject/segmentrouting/cli/PseudowireAddCommand.java
index d7d22b4..d595d5c 100644
--- a/apps/segmentrouting/app/src/main/java/org/onosproject/segmentrouting/cli/PseudowireAddCommand.java
+++ b/apps/segmentrouting/app/src/main/java/org/onosproject/segmentrouting/cli/PseudowireAddCommand.java
@@ -16,8 +16,9 @@
 package org.onosproject.segmentrouting.cli;
 
 
-import org.apache.karaf.shell.commands.Argument;
-import org.apache.karaf.shell.commands.Command;
+import org.apache.karaf.shell.api.action.Argument;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.net.ConnectPoint;
 import org.onosproject.segmentrouting.SegmentRoutingService;
@@ -35,6 +36,7 @@
 /**
  * Command to add a pseuwodire.
  */
+@Service
 @Command(scope = "onos", name = "sr-pw-add",
         description = "Add a pseudowire to the network configuration, if it already exists update it.")
 public class PseudowireAddCommand extends AbstractShellCommand {
@@ -90,7 +92,7 @@
     String cP2OuterVlan;
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
 
         SegmentRoutingService srService =
                 AbstractShellCommand.get(SegmentRoutingService.class);
diff --git a/apps/segmentrouting/app/src/main/java/org/onosproject/segmentrouting/cli/PseudowireIdCompleter.java b/apps/segmentrouting/app/src/main/java/org/onosproject/segmentrouting/cli/PseudowireIdCompleter.java
index b44ca76..abf0c0c 100644
--- a/apps/segmentrouting/app/src/main/java/org/onosproject/segmentrouting/cli/PseudowireIdCompleter.java
+++ b/apps/segmentrouting/app/src/main/java/org/onosproject/segmentrouting/cli/PseudowireIdCompleter.java
@@ -15,8 +15,11 @@
  */
 package org.onosproject.segmentrouting.cli;
 
-import org.apache.karaf.shell.console.Completer;
-import org.apache.karaf.shell.console.completer.StringsCompleter;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
+import org.apache.karaf.shell.api.console.CommandLine;
+import org.apache.karaf.shell.api.console.Completer;
+import org.apache.karaf.shell.api.console.Session;
+import org.apache.karaf.shell.support.completers.StringsCompleter;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.segmentrouting.SegmentRoutingService;
 import org.onosproject.segmentrouting.pwaas.L2Tunnel;
@@ -29,9 +32,10 @@
 /**
  * Device ID completer.
  */
+@Service
 public class PseudowireIdCompleter implements Completer {
     @Override
-    public int complete(String buffer, int cursor, List<String> candidates) {
+    public int complete(Session session, CommandLine commandLine, List<String> candidates) {
         // Delegate string completer
         StringsCompleter delegate = new StringsCompleter();
 
@@ -52,7 +56,7 @@
         }
 
         // Now let the completer do the work for figuring out what to offer.
-        return delegate.complete(buffer, cursor, candidates);
+        return delegate.complete(session, commandLine, candidates);
     }
 
 }
diff --git a/apps/segmentrouting/app/src/main/java/org/onosproject/segmentrouting/cli/PseudowireListCommand.java b/apps/segmentrouting/app/src/main/java/org/onosproject/segmentrouting/cli/PseudowireListCommand.java
index f38fe80..475ce26 100644
--- a/apps/segmentrouting/app/src/main/java/org/onosproject/segmentrouting/cli/PseudowireListCommand.java
+++ b/apps/segmentrouting/app/src/main/java/org/onosproject/segmentrouting/cli/PseudowireListCommand.java
@@ -15,7 +15,8 @@
  */
 package org.onosproject.segmentrouting.cli;
 
-import org.apache.karaf.shell.commands.Command;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onlab.packet.VlanId;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.segmentrouting.SegmentRoutingService;
@@ -23,6 +24,7 @@
 /**
  * Command to show the pseudowires.
  */
+@Service
 @Command(scope = "onos", name = "sr-pw-list",
         description = "Lists all pseudowires")
 public class PseudowireListCommand extends AbstractShellCommand {
@@ -36,7 +38,7 @@
                     "   pending = %s";
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
 
         SegmentRoutingService srService =
                 AbstractShellCommand.get(SegmentRoutingService.class);
diff --git a/apps/segmentrouting/app/src/main/java/org/onosproject/segmentrouting/cli/PseudowireNextListCommand.java b/apps/segmentrouting/app/src/main/java/org/onosproject/segmentrouting/cli/PseudowireNextListCommand.java
index d37d3e8..f2b3e8d 100644
--- a/apps/segmentrouting/app/src/main/java/org/onosproject/segmentrouting/cli/PseudowireNextListCommand.java
+++ b/apps/segmentrouting/app/src/main/java/org/onosproject/segmentrouting/cli/PseudowireNextListCommand.java
@@ -16,7 +16,8 @@
 
 package org.onosproject.segmentrouting.cli;
 
-import org.apache.karaf.shell.commands.Command;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.net.flowobjective.NextObjective;
 import org.onosproject.segmentrouting.SegmentRoutingService;
@@ -28,11 +29,12 @@
 /**
  * Command to read the current state of the pseudowire next stores.
  */
+@Service
 @Command(scope = "onos", name = "sr-next-pw",
         description = "Displays the current next-id for pseudowire")
 public class PseudowireNextListCommand extends AbstractShellCommand {
     @Override
-    protected void execute() {
+    protected void doExecute() {
         SegmentRoutingService srService =
                 AbstractShellCommand.get(SegmentRoutingService.class);
         print(srService.getPwInitNext());
diff --git a/apps/segmentrouting/app/src/main/java/org/onosproject/segmentrouting/cli/PseudowireRemoveCommand.java b/apps/segmentrouting/app/src/main/java/org/onosproject/segmentrouting/cli/PseudowireRemoveCommand.java
index d0f217d..2bb28b0 100644
--- a/apps/segmentrouting/app/src/main/java/org/onosproject/segmentrouting/cli/PseudowireRemoveCommand.java
+++ b/apps/segmentrouting/app/src/main/java/org/onosproject/segmentrouting/cli/PseudowireRemoveCommand.java
@@ -16,8 +16,10 @@
 package org.onosproject.segmentrouting.cli;
 
 
-import org.apache.karaf.shell.commands.Argument;
-import org.apache.karaf.shell.commands.Command;
+import org.apache.karaf.shell.api.action.Argument;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.Completion;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.segmentrouting.SegmentRoutingManager;
 import org.onosproject.segmentrouting.SegmentRoutingService;
@@ -29,6 +31,7 @@
 /**
  * Command to remove a pseudowire.
  */
+@Service
 @Command(scope = "onos", name = "sr-pw-remove",
         description = "Remove a pseudowire")
 public class PseudowireRemoveCommand extends AbstractShellCommand {
@@ -36,10 +39,11 @@
     @Argument(index = 0, name = "pwId",
             description = "pseudowire ID",
             required = true, multiValued = false)
+    @Completion(PseudowireIdCompleter.class)
     String pwId;
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
 
         SegmentRoutingService srService =
                 AbstractShellCommand.get(SegmentRoutingService.class);
diff --git a/apps/segmentrouting/app/src/main/java/org/onosproject/segmentrouting/cli/RerouteNetworkCommand.java b/apps/segmentrouting/app/src/main/java/org/onosproject/segmentrouting/cli/RerouteNetworkCommand.java
index 40525f2..6e8d3e9 100644
--- a/apps/segmentrouting/app/src/main/java/org/onosproject/segmentrouting/cli/RerouteNetworkCommand.java
+++ b/apps/segmentrouting/app/src/main/java/org/onosproject/segmentrouting/cli/RerouteNetworkCommand.java
@@ -17,7 +17,8 @@
 package org.onosproject.segmentrouting.cli;
 
 
-import org.apache.karaf.shell.commands.Command;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.segmentrouting.SegmentRoutingService;
 
@@ -25,12 +26,13 @@
  * Command to manually trigger routing and rule-population in the network.
  *
  */
+@Service
 @Command(scope = "onos", name = "sr-reroute-network",
         description = "Repopulate routing rules given current network state")
 public class RerouteNetworkCommand extends AbstractShellCommand {
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         SegmentRoutingService srService =
                 AbstractShellCommand.get(SegmentRoutingService.class);
         srService.rerouteNetwork();
diff --git a/apps/segmentrouting/app/src/main/java/org/onosproject/segmentrouting/cli/ShouldProgramCommand.java b/apps/segmentrouting/app/src/main/java/org/onosproject/segmentrouting/cli/ShouldProgramCommand.java
index 43a0213..250fb3b 100644
--- a/apps/segmentrouting/app/src/main/java/org/onosproject/segmentrouting/cli/ShouldProgramCommand.java
+++ b/apps/segmentrouting/app/src/main/java/org/onosproject/segmentrouting/cli/ShouldProgramCommand.java
@@ -16,7 +16,8 @@
 
 package org.onosproject.segmentrouting.cli;
 
-import org.apache.karaf.shell.commands.Command;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.cluster.NodeId;
 import org.onosproject.net.DeviceId;
@@ -28,11 +29,12 @@
 /**
  * Display current shouldProgram map.
  */
+@Service
 @Command(scope = "onos", name = "sr-should-program",
         description = "Display current shouldProgram map")
 public class ShouldProgramCommand extends AbstractShellCommand {
     @Override
-    protected void execute() {
+    protected void doExecute() {
         SegmentRoutingService srService = AbstractShellCommand.get(SegmentRoutingService.class);
         Map<Set<DeviceId>, NodeId> shouldProgram = srService.getShouldProgram();
         Map<DeviceId, Boolean> shouldProgramCache = srService.getShouldProgramCache();
diff --git a/apps/segmentrouting/app/src/main/java/org/onosproject/segmentrouting/cli/TunnelAddCommand.java b/apps/segmentrouting/app/src/main/java/org/onosproject/segmentrouting/cli/TunnelAddCommand.java
index 6b3e1fc..0e487d0 100644
--- a/apps/segmentrouting/app/src/main/java/org/onosproject/segmentrouting/cli/TunnelAddCommand.java
+++ b/apps/segmentrouting/app/src/main/java/org/onosproject/segmentrouting/cli/TunnelAddCommand.java
@@ -15,8 +15,9 @@
  */
 package org.onosproject.segmentrouting.cli;
 
-import org.apache.karaf.shell.commands.Argument;
-import org.apache.karaf.shell.commands.Command;
+import org.apache.karaf.shell.api.action.Argument;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.segmentrouting.DefaultTunnel;
 import org.onosproject.segmentrouting.SegmentRoutingService;
@@ -30,6 +31,7 @@
 /**
  * Command to add a new tunnel.
  */
+@Service
 @Command(scope = "onos", name = "sr-tunnel-add",
         description = "Create a new tunnel")
 public class TunnelAddCommand extends AbstractShellCommand {
@@ -46,7 +48,7 @@
 
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
 
         SegmentRoutingService srService =
                 AbstractShellCommand.get(SegmentRoutingService.class);
diff --git a/apps/segmentrouting/app/src/main/java/org/onosproject/segmentrouting/cli/TunnelListCommand.java b/apps/segmentrouting/app/src/main/java/org/onosproject/segmentrouting/cli/TunnelListCommand.java
index 7984eb4..6c5f33d 100644
--- a/apps/segmentrouting/app/src/main/java/org/onosproject/segmentrouting/cli/TunnelListCommand.java
+++ b/apps/segmentrouting/app/src/main/java/org/onosproject/segmentrouting/cli/TunnelListCommand.java
@@ -15,7 +15,8 @@
  */
 package org.onosproject.segmentrouting.cli;
 
-import org.apache.karaf.shell.commands.Command;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.segmentrouting.SegmentRoutingService;
 import org.onosproject.segmentrouting.Tunnel;
@@ -23,6 +24,7 @@
 /**
  * Command to show the list of tunnels.
  */
+@Service
 @Command(scope = "onos", name = "sr-tunnel-list",
         description = "Lists all tunnels")
 public class TunnelListCommand extends AbstractShellCommand {
@@ -31,7 +33,7 @@
             "  id=%s, path=%s";
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
 
         SegmentRoutingService srService =
                 AbstractShellCommand.get(SegmentRoutingService.class);
diff --git a/apps/segmentrouting/app/src/main/java/org/onosproject/segmentrouting/cli/TunnelRemoveCommand.java b/apps/segmentrouting/app/src/main/java/org/onosproject/segmentrouting/cli/TunnelRemoveCommand.java
index b9a7edb..f5f0299 100644
--- a/apps/segmentrouting/app/src/main/java/org/onosproject/segmentrouting/cli/TunnelRemoveCommand.java
+++ b/apps/segmentrouting/app/src/main/java/org/onosproject/segmentrouting/cli/TunnelRemoveCommand.java
@@ -17,8 +17,9 @@
 
 
 import com.google.common.collect.Lists;
-import org.apache.karaf.shell.commands.Argument;
-import org.apache.karaf.shell.commands.Command;
+import org.apache.karaf.shell.api.action.Argument;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.segmentrouting.DefaultTunnel;
 import org.onosproject.segmentrouting.SegmentRoutingService;
@@ -28,6 +29,7 @@
 /**
  * Command to remove a tunnel.
  */
+@Service
 @Command(scope = "onos", name = "sr-tunnel-remove",
         description = "Remove a tunnel")
 public class TunnelRemoveCommand extends AbstractShellCommand {
@@ -38,7 +40,7 @@
     String tunnelId;
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         SegmentRoutingService srService =
                 AbstractShellCommand.get(SegmentRoutingService.class);
 
diff --git a/apps/segmentrouting/app/src/main/java/org/onosproject/segmentrouting/cli/VerifyGroupsCommand.java b/apps/segmentrouting/app/src/main/java/org/onosproject/segmentrouting/cli/VerifyGroupsCommand.java
index 3e89ca4..385260e 100644
--- a/apps/segmentrouting/app/src/main/java/org/onosproject/segmentrouting/cli/VerifyGroupsCommand.java
+++ b/apps/segmentrouting/app/src/main/java/org/onosproject/segmentrouting/cli/VerifyGroupsCommand.java
@@ -16,9 +16,12 @@
 
 package org.onosproject.segmentrouting.cli;
 
-import org.apache.karaf.shell.commands.Argument;
-import org.apache.karaf.shell.commands.Command;
+import org.apache.karaf.shell.api.action.Argument;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.Completion;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.cli.AbstractShellCommand;
+import org.onosproject.cli.net.DeviceIdCompleter;
 import org.onosproject.net.Device;
 import org.onosproject.net.DeviceId;
 import org.onosproject.net.device.DeviceService;
@@ -29,6 +32,7 @@
  * and corrects the buckets if necessary. Outcome can be viewed in the 'groups'
  * command.
  */
+@Service
 @Command(scope = "onos", name = "sr-verify-groups",
         description = "Triggers the verification of hashed groups in the specified "
                 + "device. Does not return any output; users can query the results "
@@ -37,10 +41,11 @@
 
     @Argument(index = 0, name = "uri", description = "Device ID",
             required = true, multiValued = false)
+    @Completion(DeviceIdCompleter.class)
     String uri = null;
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         DeviceService deviceService = get(DeviceService.class);
         SegmentRoutingService srService =
                 AbstractShellCommand.get(SegmentRoutingService.class);
diff --git a/apps/segmentrouting/app/src/main/java/org/onosproject/segmentrouting/cli/XconnectAddCommand.java b/apps/segmentrouting/app/src/main/java/org/onosproject/segmentrouting/cli/XconnectAddCommand.java
index a1ad929..762b9f3 100644
--- a/apps/segmentrouting/app/src/main/java/org/onosproject/segmentrouting/cli/XconnectAddCommand.java
+++ b/apps/segmentrouting/app/src/main/java/org/onosproject/segmentrouting/cli/XconnectAddCommand.java
@@ -16,10 +16,15 @@
 package org.onosproject.segmentrouting.cli;
 
 import com.google.common.collect.Sets;
-import org.apache.karaf.shell.commands.Argument;
-import org.apache.karaf.shell.commands.Command;
+import org.apache.karaf.shell.api.action.Argument;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.Completion;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onlab.packet.VlanId;
 import org.onosproject.cli.AbstractShellCommand;
+import org.onosproject.cli.PlaceholderCompleter;
+import org.onosproject.cli.net.DeviceIdCompleter;
+import org.onosproject.cli.net.PortNumberCompleter;
 import org.onosproject.net.DeviceId;
 import org.onosproject.net.PortNumber;
 import org.onosproject.segmentrouting.xconnect.api.XconnectService;
@@ -29,31 +34,36 @@
 /**
  * Creates Xconnect.
  */
+@Service
 @Command(scope = "onos", name = "sr-xconnect-add", description = "Create Xconnect")
 public class XconnectAddCommand extends AbstractShellCommand {
     @Argument(index = 0, name = "deviceId",
             description = "Device ID",
             required = true, multiValued = false)
+    @Completion(DeviceIdCompleter.class)
     private String deviceIdStr;
 
     @Argument(index = 1, name = "vlanId",
             description = "VLAN ID",
             required = true, multiValued = false)
+    @Completion(PlaceholderCompleter.class)
     private String vlanIdStr;
 
     @Argument(index = 2, name = "port1",
             description = "Port 1",
             required = true, multiValued = false)
+    @Completion(PortNumberCompleter.class)
     private String port1Str;
 
     @Argument(index = 3, name = "port2",
             description = "Port 2",
             required = true, multiValued = false)
+    @Completion(PortNumberCompleter.class)
     private String port2Str;
 
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         DeviceId deviceId = DeviceId.deviceId(deviceIdStr);
         VlanId vlanId = VlanId.vlanId(vlanIdStr);
         PortNumber port1 = PortNumber.portNumber(port1Str);
diff --git a/apps/segmentrouting/app/src/main/java/org/onosproject/segmentrouting/cli/XconnectListCommand.java b/apps/segmentrouting/app/src/main/java/org/onosproject/segmentrouting/cli/XconnectListCommand.java
index 43919c4..44a7d37 100644
--- a/apps/segmentrouting/app/src/main/java/org/onosproject/segmentrouting/cli/XconnectListCommand.java
+++ b/apps/segmentrouting/app/src/main/java/org/onosproject/segmentrouting/cli/XconnectListCommand.java
@@ -15,17 +15,19 @@
  */
 package org.onosproject.segmentrouting.cli;
 
-import org.apache.karaf.shell.commands.Command;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.segmentrouting.xconnect.api.XconnectService;
 
 /**
  * Lists Xconnects.
  */
+@Service
 @Command(scope = "onos", name = "sr-xconnect", description = "Lists all Xconnects")
 public class XconnectListCommand extends AbstractShellCommand {
     @Override
-    protected void execute() {
+    protected void doExecute() {
         XconnectService xconnectService = get(XconnectService.class);
         xconnectService.getXconnects().forEach(desc -> print("%s", desc));
     }
diff --git a/apps/segmentrouting/app/src/main/java/org/onosproject/segmentrouting/cli/XconnectNextListCommand.java b/apps/segmentrouting/app/src/main/java/org/onosproject/segmentrouting/cli/XconnectNextListCommand.java
index 18b2033..0b81186 100644
--- a/apps/segmentrouting/app/src/main/java/org/onosproject/segmentrouting/cli/XconnectNextListCommand.java
+++ b/apps/segmentrouting/app/src/main/java/org/onosproject/segmentrouting/cli/XconnectNextListCommand.java
@@ -16,7 +16,8 @@
 
 package org.onosproject.segmentrouting.cli;
 
-import org.apache.karaf.shell.commands.Command;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.segmentrouting.xconnect.api.XconnectKey;
 import org.onosproject.segmentrouting.xconnect.api.XconnectService;
@@ -28,11 +29,12 @@
 /**
  * Command to read the current state of the xconnect next stores.
  */
+@Service
 @Command(scope = "onos", name = "sr-next-xconnect",
         description = "Displays the current next-id for xconnect")
 public class XconnectNextListCommand extends AbstractShellCommand {
     @Override
-    protected void execute() {
+    protected void doExecute() {
         XconnectService xconnectService =
                 AbstractShellCommand.get(XconnectService.class);
         print(xconnectService.getNext());
diff --git a/apps/segmentrouting/app/src/main/java/org/onosproject/segmentrouting/cli/XconnectRemoveCommand.java b/apps/segmentrouting/app/src/main/java/org/onosproject/segmentrouting/cli/XconnectRemoveCommand.java
index 224a600..e651338 100644
--- a/apps/segmentrouting/app/src/main/java/org/onosproject/segmentrouting/cli/XconnectRemoveCommand.java
+++ b/apps/segmentrouting/app/src/main/java/org/onosproject/segmentrouting/cli/XconnectRemoveCommand.java
@@ -15,30 +15,37 @@
  */
 package org.onosproject.segmentrouting.cli;
 
-import org.apache.karaf.shell.commands.Argument;
-import org.apache.karaf.shell.commands.Command;
+import org.apache.karaf.shell.api.action.Argument;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.Completion;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onlab.packet.VlanId;
 import org.onosproject.cli.AbstractShellCommand;
+import org.onosproject.cli.PlaceholderCompleter;
+import org.onosproject.cli.net.DeviceIdCompleter;
 import org.onosproject.net.DeviceId;
 import org.onosproject.segmentrouting.xconnect.api.XconnectService;
 
 /**
  * Deletes Xconnect.
  */
+@Service
 @Command(scope = "onos", name = "sr-xconnect-remove", description = "Remove Xconnect")
 public class XconnectRemoveCommand extends AbstractShellCommand {
     @Argument(index = 0, name = "deviceId",
             description = "Device ID",
             required = true, multiValued = false)
+    @Completion(DeviceIdCompleter.class)
     private String deviceIdStr;
 
     @Argument(index = 1, name = "vlanId",
             description = "VLAN ID",
             required = true, multiValued = false)
+    @Completion(PlaceholderCompleter.class)
     private String vlanIdStr;
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         DeviceId deviceId = DeviceId.deviceId(deviceIdStr);
         VlanId vlanId = VlanId.vlanId(vlanIdStr);
 
diff --git a/apps/segmentrouting/app/src/main/java/org/onosproject/segmentrouting/xconnect/api/XconnectService.java b/apps/segmentrouting/app/src/main/java/org/onosproject/segmentrouting/xconnect/api/XconnectService.java
index 4e82524..9ef7672 100644
--- a/apps/segmentrouting/app/src/main/java/org/onosproject/segmentrouting/xconnect/api/XconnectService.java
+++ b/apps/segmentrouting/app/src/main/java/org/onosproject/segmentrouting/xconnect/api/XconnectService.java
@@ -16,7 +16,6 @@
 package org.onosproject.segmentrouting.xconnect.api;
 
 import com.google.common.collect.ImmutableMap;
-import org.apache.felix.scr.annotations.Service;
 import org.onlab.packet.VlanId;
 import org.onosproject.net.ConnectPoint;
 import org.onosproject.net.DeviceId;
@@ -28,7 +27,6 @@
 /**
  * VLAN cross connect between exactly two ports.
  */
-@Service
 public interface XconnectService {
 
     /**
diff --git a/apps/segmentrouting/app/src/main/java/org/onosproject/segmentrouting/xconnect/impl/XconnectManager.java b/apps/segmentrouting/app/src/main/java/org/onosproject/segmentrouting/xconnect/impl/XconnectManager.java
index 1f41fda..be1dafc 100644
--- a/apps/segmentrouting/app/src/main/java/org/onosproject/segmentrouting/xconnect/impl/XconnectManager.java
+++ b/apps/segmentrouting/app/src/main/java/org/onosproject/segmentrouting/xconnect/impl/XconnectManager.java
@@ -18,12 +18,6 @@
 import com.google.common.collect.ImmutableMap;
 import com.google.common.collect.ImmutableSet;
 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.onlab.packet.Ethernet;
 import org.onlab.packet.MacAddress;
 import org.onlab.packet.VlanId;
@@ -74,6 +68,11 @@
 import org.onosproject.store.service.Serializer;
 import org.onosproject.store.service.StorageService;
 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 org.slf4j.LoggerFactory;
 
@@ -93,37 +92,36 @@
 
 import static org.onlab.util.Tools.groupedThreads;
 
-@Service
-@Component(immediate = true)
+@Component(immediate = true, service = XconnectService.class)
 public class XconnectManager implements XconnectService {
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     private CoreService coreService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     private CodecService codecService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     private StorageService storageService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     public NetworkConfigService netCfgService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     public DeviceService deviceService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     public FlowObjectiveService flowObjectiveService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     public MastershipService mastershipService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.OPTIONAL)
     public SegmentRoutingService srService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     public InterfaceService interfaceService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     HostService hostService;
 
     private static final String APP_NAME = "org.onosproject.xconnect";
diff --git a/apps/segmentrouting/app/src/main/resources/OSGI-INF/blueprint/shell-config.xml b/apps/segmentrouting/app/src/main/resources/OSGI-INF/blueprint/shell-config.xml
deleted file mode 100644
index f61569a..0000000
--- a/apps/segmentrouting/app/src/main/resources/OSGI-INF/blueprint/shell-config.xml
+++ /dev/null
@@ -1,152 +0,0 @@
-<!--
-  ~ Copyright 2015-present Open Networking Foundation
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~     http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License.
-  -->
-<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0">
-
-    <command-bundle xmlns="http://karaf.apache.org/xmlns/shell/v1.1.0">
-        <!-- XXX revisit when we formally add policies
-        <command>
-            <action class="org.onosproject.segmentrouting.cli.TunnelListCommand"/>
-        </command>
-        <command>
-            <action class="org.onosproject.segmentrouting.cli.PolicyListCommand"/>
-        </command>
-        <command>
-            <action class="org.onosproject.segmentrouting.cli.PolicyAddCommand"/>
-        </command>
-        <command>
-            <action class="org.onosproject.segmentrouting.cli.PolicyRemoveCommand"/>
-        </command>
-        <command>
-            <action class="org.onosproject.segmentrouting.cli.TunnelAddCommand"/>
-        </command>
-        <command>
-            <action class="org.onosproject.segmentrouting.cli.TunnelRemoveCommand"/>
-        </command>
-        <command>
-            <action class="org.onosproject.segmentrouting.cli.RerouteNetworkCommand"/>
-        </command>
-        -->
-        <command>
-            <action class="org.onosproject.segmentrouting.cli.DeviceSubnetListCommand"/>
-        </command>
-        <command>
-            <action class="org.onosproject.segmentrouting.cli.EcmpGraphCommand"/>
-        </command>
-        <command>
-            <action class="org.onosproject.segmentrouting.cli.NextDstCommand"/>
-        </command>
-        <command>
-            <action class="org.onosproject.segmentrouting.cli.NextVlanCommand"/>
-        </command>
-        <command>
-            <action class="org.onosproject.segmentrouting.cli.NextPortCommand"/>
-        </command>
-        <command>
-            <action class="org.onosproject.segmentrouting.cli.PseudowireNextListCommand"/>
-        </command>
-        <command>
-            <action class="org.onosproject.segmentrouting.cli.XconnectNextListCommand"/>
-        </command>
-        <command>
-            <action class="org.onosproject.segmentrouting.cli.InvalidateNextCommand"/>
-        </command>
-        <command>
-            <action class="org.onosproject.segmentrouting.cli.ShouldProgramCommand"/>
-        </command>
-        <command>
-            <action class="org.onosproject.segmentrouting.cli.VerifyGroupsCommand"/>
-            <completers>
-                <ref component-id="deviceIdCompleter"/>
-            </completers>
-        </command>
-        <command>
-            <action class="org.onosproject.segmentrouting.cli.PseudowireListCommand"/>
-        </command>
-        <command>
-            <action class="org.onosproject.segmentrouting.cli.PseudowireRemoveCommand"/>
-            <completers>
-                <ref component-id="pseudowireIdCompleter"/>
-            </completers>
-        </command>
-        <command>
-            <action class="org.onosproject.segmentrouting.cli.PseudowireAddCommand"/>
-        </command>
-        <command>
-            <action class="org.onosproject.segmentrouting.cli.LinkStateCommand"/>
-        </command>
-        <command>
-            <action class="org.onosproject.segmentrouting.cli.McastNextListCommand"/>
-            <optional-completers>
-                <entry key="-gAddr" value-ref="mcastGroupCompleter"/>
-            </optional-completers>
-        </command>
-        <command>
-            <action class="org.onosproject.segmentrouting.cli.McastRoleListCommand"/>
-            <optional-completers>
-                <entry key="-gAddr" value-ref="mcastGroupCompleter"/>
-                <entry key="-src" value-ref="connectpointCompleter"/>
-            </optional-completers>
-        </command>
-        <command>
-            <action class="org.onosproject.segmentrouting.cli.McastTreeListCommand"/>
-            <optional-completers>
-                <entry key="-gAddr" value-ref="mcastGroupCompleter"/>
-                <entry key="-src" value-ref="connectpointCompleter"/>
-            </optional-completers>
-        </command>
-        <command>
-            <action class="org.onosproject.segmentrouting.cli.McastLeaderListCommand"/>
-            <optional-completers>
-                <entry key="-gAddr" value-ref="mcastGroupCompleter"/>
-            </optional-completers>
-        </command>
-        <command>
-            <action class="org.onosproject.segmentrouting.cli.XconnectListCommand"/>
-        </command>
-        <command>
-            <action class="org.onosproject.segmentrouting.cli.XconnectAddCommand"/>
-            <completers>
-                <ref component-id="deviceIdCompleter"/>
-                <ref component-id="placeholderCompleter"/>
-                <ref component-id="portNumberCompleter"/>
-                <ref component-id="portNumberCompleter"/>
-                <null/>
-            </completers>
-        </command>
-        <command>
-            <action class="org.onosproject.segmentrouting.cli.XconnectRemoveCommand"/>
-            <completers>
-                <ref component-id="deviceIdCompleter"/>
-                <ref component-id="placeholderCompleter"/>
-                <null/>
-            </completers>
-        </command>
-        <command>
-            <action class="org.onosproject.segmentrouting.cli.BlackHoleCommand"/>
-        </command>
-    </command-bundle>
-
-    <bean id="nullCompleter" class="org.apache.karaf.shell.console.completer.NullCompleter"/>
-    <bean id="placeholderCompleter" class="org.onosproject.cli.PlaceholderCompleter"/>
-    <bean id="deviceIdCompleter" class="org.onosproject.cli.net.DeviceIdCompleter"/>
-    <bean id="portNumberCompleter" class="org.onosproject.cli.net.PortNumberCompleter"/>
-    <bean id="pseudowireIdCompleter" class="org.onosproject.segmentrouting.cli.PseudowireIdCompleter"/>
-    <bean id="mcastGroupCompleter" class="org.onosproject.mcast.cli.McastGroupCompleter"/>
-    <bean id="connectpointCompleter" class="org.onosproject.cli.net.ConnectPointCompleter"/>
-
-</blueprint>
-
-
diff --git a/apps/segmentrouting/web/BUCK b/apps/segmentrouting/web/BUCK
deleted file mode 100644
index 9706438..0000000
--- a/apps/segmentrouting/web/BUCK
+++ /dev/null
@@ -1,16 +0,0 @@
-COMPILE_DEPS = [
-    '//lib:CORE_DEPS',
-    '//lib:JACKSON',
-    '//lib:javax.ws.rs-api',
-    '//utils/rest:onlab-rest',
-    '//apps/segmentrouting/app:onos-apps-segmentrouting-app',
-]
-
-osgi_jar_with_tests (
-    deps = COMPILE_DEPS,
-    web_context = '/onos/segmentrouting',
-    api_title = 'Segment Routing REST API',
-    api_version = '1.0',
-    api_description = 'REST API for Segment Routing Application',
-    api_package = 'org.onosproject.segmentrouting.web',
-)
diff --git a/apps/simplefabric/app/BUILD b/apps/simplefabric/app/BUILD
index a84652b..69d12f7 100644
--- a/apps/simplefabric/app/BUILD
+++ b/apps/simplefabric/app/BUILD
@@ -14,6 +14,7 @@
     api_package = "org.onosproject.simplefabric.web",
     api_title = "Simple Fabric API",
     api_version = "1.0",
+    karaf_command_packages = ["org.onosproject.simplefabric.cli"],
     test_deps = TEST_DEPS,
     web_context = "/onos/v1/simplefabric",
     deps = COMPILE_DEPS,
diff --git a/apps/simplefabric/app/app.xml b/apps/simplefabric/app/app.xml
deleted file mode 100644
index 3898661..0000000
--- a/apps/simplefabric/app/app.xml
+++ /dev/null
@@ -1,23 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-  ~ Copyright 2017-present Open Networking Foundation
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~     http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License.
-  -->
-<app name="org.onosproject.simplefabric" origin="Open Networking Foundation" version="${project.version}"
-     category="Traffic Steering" url="http://onosproject.org" title="Simple Leaf-Spine Network App"
-     featuresRepo="mvn:${project.groupId}/${project.artifactId}/${project.version}/xml/features"
-     features="${project.artifactId}" apps="org.onosproject.openflow-base,org.onosproject.lldpprovider,org.onosproject.hostprovider">
-    <description>${project.description}</description>
-    <artifact>mvn:${project.groupId}/${project.artifactId}/${project.version}</artifact>
-</app>
diff --git a/apps/simplefabric/app/features.xml b/apps/simplefabric/app/features.xml
deleted file mode 100644
index c9ac9f5..0000000
--- a/apps/simplefabric/app/features.xml
+++ /dev/null
@@ -1,23 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
-<!--
-  ~ Copyright 2017-present Open Networking Foundation
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~     http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License.
-  -->
-<features xmlns="http://karaf.apache.org/xmlns/features/v1.2.0" name="${project.artifactId}-${project.version}">
-    <feature name="onos-apps-simplefabric" version="${project.version}"
-             description="${project.description}">
-        <feature>onos-api</feature>
-        <bundle>mvn:${project.groupId}/onos-apps-simplefabric/${project.version}</bundle>
-    </feature>
-</features>
diff --git a/apps/simplefabric/app/src/main/java/org/onosproject/simplefabric/cli/SimpleFabricCommand.java b/apps/simplefabric/app/src/main/java/org/onosproject/simplefabric/cli/SimpleFabricCommand.java
index b7d413c..3271e8d 100644
--- a/apps/simplefabric/app/src/main/java/org/onosproject/simplefabric/cli/SimpleFabricCommand.java
+++ b/apps/simplefabric/app/src/main/java/org/onosproject/simplefabric/cli/SimpleFabricCommand.java
@@ -15,14 +15,17 @@
  */
 package org.onosproject.simplefabric.cli;
 
-import org.apache.karaf.shell.commands.Argument;
-import org.apache.karaf.shell.commands.Command;
+import org.apache.karaf.shell.api.action.Argument;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.Completion;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.simplefabric.api.SimpleFabricService;
 
 /**
  * CLI to interact with the SIMPLE_FABRIC application.
  */
+@Service
 @Command(scope = "onos", name = "simpleFabric",
          description = "Manages the SimpleFabric application")
 public class SimpleFabricCommand extends AbstractShellCommand {
@@ -30,10 +33,11 @@
     @Argument(index = 0, name = "command",
               description = "Command: show|intents|reactive-intents|refresh|flush",
               required = true, multiValued = false)
+    @Completion(SimpleFabricCommandCompleter.class)
     String command = null;
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
 
         SimpleFabricService simpleFabric = get(SimpleFabricService.class);
 
diff --git a/apps/simplefabric/app/src/main/java/org/onosproject/simplefabric/cli/SimpleFabricCommandCompleter.java b/apps/simplefabric/app/src/main/java/org/onosproject/simplefabric/cli/SimpleFabricCommandCompleter.java
index d216bac..a643539 100644
--- a/apps/simplefabric/app/src/main/java/org/onosproject/simplefabric/cli/SimpleFabricCommandCompleter.java
+++ b/apps/simplefabric/app/src/main/java/org/onosproject/simplefabric/cli/SimpleFabricCommandCompleter.java
@@ -16,7 +16,7 @@
 package org.onosproject.simplefabric.cli;
 
 import com.google.common.collect.Lists;
-import org.apache.karaf.shell.console.completer.ArgumentCompleter;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.cli.AbstractChoicesCompleter;
 
 import java.util.List;
@@ -26,6 +26,7 @@
 /**
  * SimpleFabric command completer.
  */
+@Service
 public class SimpleFabricCommandCompleter extends AbstractChoicesCompleter {
 
     private static final List<String> COMMAND_LIST =
@@ -33,11 +34,10 @@
 
     @Override
     public List<String> choices() {
-        ArgumentCompleter.ArgumentList argumentList = getArgumentList();
-        if (argumentList == null) {
+        if (commandLine.getArguments() == null) {
             return Collections.emptyList();
         }
-        List<String> argList = Lists.newArrayList(argumentList.getArguments());
+        List<String> argList = Lists.newArrayList(commandLine.getArguments());
         String argOne = null;
         if (argList.size() > 1) {
             argOne = argList.get(1);
diff --git a/apps/simplefabric/app/src/main/java/org/onosproject/simplefabric/impl/SimpleFabricForwarding.java b/apps/simplefabric/app/src/main/java/org/onosproject/simplefabric/impl/SimpleFabricForwarding.java
index f7eaa70..48fdf34 100644
--- a/apps/simplefabric/app/src/main/java/org/onosproject/simplefabric/impl/SimpleFabricForwarding.java
+++ b/apps/simplefabric/app/src/main/java/org/onosproject/simplefabric/impl/SimpleFabricForwarding.java
@@ -20,11 +20,11 @@
 import com.google.common.collect.ImmutableSet;
 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.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.MacAddress;
 import org.onlab.packet.VlanId;
 import org.onosproject.core.ApplicationId;
@@ -82,16 +82,16 @@
     private final Logger log = LoggerFactory.getLogger(getClass());
     protected ApplicationId appId;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected CoreService coreService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected IntentService intentService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected HostService hostService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected SimpleFabricService simpleFabric;
 
     public static final ImmutableList<Constraint> L2NETWORK_CONSTRAINTS =
diff --git a/apps/simplefabric/app/src/main/java/org/onosproject/simplefabric/impl/SimpleFabricManager.java b/apps/simplefabric/app/src/main/java/org/onosproject/simplefabric/impl/SimpleFabricManager.java
index 1bdcacd..7a4e5d8 100644
--- a/apps/simplefabric/app/src/main/java/org/onosproject/simplefabric/impl/SimpleFabricManager.java
+++ b/apps/simplefabric/app/src/main/java/org/onosproject/simplefabric/impl/SimpleFabricManager.java
@@ -21,12 +21,6 @@
 import com.googlecode.concurrenttrees.radix.node.concrete.DefaultByteArrayNodeFactory;
 import com.googlecode.concurrenttrees.radixinverted.ConcurrentInvertedRadixTree;
 import com.googlecode.concurrenttrees.radixinverted.InvertedRadixTree;
-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.packet.ARP;
 import org.onlab.packet.Ethernet;
 import org.onlab.packet.IPv6;
@@ -37,6 +31,7 @@
 import org.onlab.packet.MacAddress;
 import org.onlab.packet.VlanId;
 import org.onlab.packet.ndp.NeighborSolicitation;
+import org.onosproject.app.ApplicationService;
 import org.onosproject.component.ComponentService;
 import org.onosproject.core.ApplicationId;
 import org.onosproject.core.CoreService;
@@ -64,6 +59,11 @@
 import org.onosproject.net.packet.DefaultOutboundPacket;
 import org.onosproject.net.packet.OutboundPacket;
 import org.onosproject.net.packet.PacketService;
+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.onosproject.simplefabric.api.FabricNetwork;
 import org.onosproject.simplefabric.api.FabricRoute;
 import org.onosproject.simplefabric.api.FabricSubnet;
@@ -95,36 +95,38 @@
 /**
  * Reactive routing configuration manager.
  */
-@Component(immediate = true)
-@Service
+@Component(immediate = true, service = SimpleFabricService.class)
 public class SimpleFabricManager extends ListenerRegistry<SimpleFabricEvent, SimpleFabricListener>
         implements SimpleFabricService {
 
     private final Logger log = LoggerFactory.getLogger(getClass());
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected CoreService coreService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
+    protected ApplicationService applicationService;
+
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected NetworkConfigService configService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected NetworkConfigRegistry registry;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected DeviceService deviceService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected InterfaceService interfaceService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected HostService hostService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected PacketService packetService;
 
-    // components to be activated within SimpleFabric
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    // compoents to be activated within SimpleFabric
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected ComponentService componentService;
 
     // SimpleFabric variables
diff --git a/apps/simplefabric/app/src/main/java/org/onosproject/simplefabric/impl/SimpleFabricNeighbour.java b/apps/simplefabric/app/src/main/java/org/onosproject/simplefabric/impl/SimpleFabricNeighbour.java
index b17f999..5d7c8b0 100644
--- a/apps/simplefabric/app/src/main/java/org/onosproject/simplefabric/impl/SimpleFabricNeighbour.java
+++ b/apps/simplefabric/app/src/main/java/org/onosproject/simplefabric/impl/SimpleFabricNeighbour.java
@@ -15,11 +15,11 @@
  */
 package org.onosproject.simplefabric.impl;
 
-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.MacAddress;
 import org.onosproject.core.ApplicationId;
 import org.onosproject.core.CoreService;
@@ -52,19 +52,19 @@
     private final Logger log = LoggerFactory.getLogger(getClass());
     protected ApplicationId appId;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected CoreService coreService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected HostService hostService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected InterfaceService interfaceService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected NeighbourResolutionService neighbourService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected SimpleFabricService simpleFabric;
 
     private final InternalSimpleFabricListener simpleFabricListener =
diff --git a/apps/simplefabric/app/src/main/java/org/onosproject/simplefabric/impl/SimpleFabricRouting.java b/apps/simplefabric/app/src/main/java/org/onosproject/simplefabric/impl/SimpleFabricRouting.java
index 9eefc03..cbca9a5 100644
--- a/apps/simplefabric/app/src/main/java/org/onosproject/simplefabric/impl/SimpleFabricRouting.java
+++ b/apps/simplefabric/app/src/main/java/org/onosproject/simplefabric/impl/SimpleFabricRouting.java
@@ -16,11 +16,11 @@
 package org.onosproject.simplefabric.impl;
 
 import com.google.common.collect.ImmutableList;
-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.EthType;
 import org.onlab.packet.Ethernet;
 import org.onlab.packet.ICMP;
@@ -112,31 +112,31 @@
     private final Logger log = LoggerFactory.getLogger(getClass());
     private ApplicationId appId;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected CoreService coreService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected PacketService packetService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected InterfaceService interfaceService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected DeviceService deviceService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected LinkService linkService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected HostService hostService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected IntentService intentService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected FlowRuleService flowRuleService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected SimpleFabricService simpleFabric;
 
     private ImmutableList<Constraint> reactiveConstraints
diff --git a/apps/simplefabric/app/src/main/resources/OSGI-INF/blueprint/shell-config.xml b/apps/simplefabric/app/src/main/resources/OSGI-INF/blueprint/shell-config.xml
deleted file mode 100644
index 2aad546..0000000
--- a/apps/simplefabric/app/src/main/resources/OSGI-INF/blueprint/shell-config.xml
+++ /dev/null
@@ -1,28 +0,0 @@
-<!--
-  ~ Copyright 2017-present Open Networking Foundation
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~     http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-        ~ limitations under the License.
-  -->
-<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0">
-
-    <command-bundle xmlns="http://karaf.apache.org/xmlns/shell/v1.1.0">
-        <command>
-            <action class="org.onosproject.simplefabric.cli.SimpleFabricCommand"/>
-            <completers>
-                <ref component-id="SimpleFabricCommandCompleter"/>
-            </completers>
-        </command>
-    </command-bundle>
- 
-    <bean id="SimpleFabricCommandCompleter" class="org.onosproject.simplefabric.cli.SimpleFabricCommandCompleter"/>
-</blueprint>
diff --git a/apps/t3/BUCK b/apps/t3/BUCK
deleted file mode 100644
index c06bf7c..0000000
--- a/apps/t3/BUCK
+++ /dev/null
@@ -1,19 +0,0 @@
-BUNDLES = [
-    '//apps/t3/web:onos-apps-t3-web',
-    '//apps/t3/app:onos-apps-t3-app',
-]
-
-onos_app (
-   title = 'Trellis Troubleshooting Toolkit',
-   category = 'Utilities',
-   url = 'https://wiki.opencord.org/pages/viewpage.action?pageId=4456974',
-   description = 'Provides static analysis of flows and groups ' +
-   'to determine the possible paths a packet may take.',
-   required_apps = [
-           'org.onosproject.segmentrouting',
-           'org.onosproject.route-service',
-           'org.onosproject.mcast',
-   ],
-   included_bundles = BUNDLES,
-   app_name = 'org.onosproject.t3'
-)
diff --git a/apps/t3/app/BUCK b/apps/t3/app/BUCK
deleted file mode 100644
index 55092ea..0000000
--- a/apps/t3/app/BUCK
+++ /dev/null
@@ -1,26 +0,0 @@
-COMPILE_DEPS = [
-    '//lib:CORE_DEPS',
-    '//lib:KRYO',
-    '//core/store/serializers:onos-core-serializers',
-    '//core/store/primitives:onos-core-primitives',
-    '//lib:JACKSON',
-    '//lib:jackson-databind',
-    '//core/api:onos-api',
-    '//lib:org.apache.karaf.shell.console',
-    '//cli:onos-cli',
-    '//drivers/default:onos-drivers-default',
-    '//apps/segmentrouting/app:onos-apps-segmentrouting-app',
-    '//apps/route-service/api:onos-apps-route-service-api',
-    '//apps/mcast/api:onos-apps-mcast-api',
-]
-
-TEST_DEPS = [
-    '//lib:TEST_ADAPTERS',
-    '//utils/misc:onlab-misc',
-    '//apps/route-service/api:onos-apps-route-service-api-tests',
-]
-
-osgi_jar_with_tests (
-    deps = COMPILE_DEPS,
-    test_deps = TEST_DEPS,
-)
diff --git a/apps/t3/app/BUILD b/apps/t3/app/BUILD
index 4380cd6..81173f6 100644
--- a/apps/t3/app/BUILD
+++ b/apps/t3/app/BUILD
@@ -13,6 +13,7 @@
 ]
 
 osgi_jar_with_tests(
+    karaf_command_packages = ["org.onosproject.t3.cli"],
     test_deps = TEST_DEPS,
     deps = COMPILE_DEPS,
 )
diff --git a/apps/t3/app/src/main/java/org/onosproject/t3/cli/TroubleshootMcastCommand.java b/apps/t3/app/src/main/java/org/onosproject/t3/cli/TroubleshootMcastCommand.java
index 92ed92f..d3fefec 100644
--- a/apps/t3/app/src/main/java/org/onosproject/t3/cli/TroubleshootMcastCommand.java
+++ b/apps/t3/app/src/main/java/org/onosproject/t3/cli/TroubleshootMcastCommand.java
@@ -17,8 +17,9 @@
 package org.onosproject.t3.cli;
 
 import org.apache.commons.lang.StringUtils;
-import org.apache.karaf.shell.commands.Command;
-import org.apache.karaf.shell.commands.Option;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.Option;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onlab.packet.EthType;
 import org.onlab.packet.IpPrefix;
 import org.onlab.packet.VlanId;
@@ -39,6 +40,7 @@
 /**
  * Starts a Static Packet Trace for all the multicast routes in the system and prints the result.
  */
+@Service
 @Command(scope = "onos", name = "t3-troubleshoot-mcast",
         description = "Traces all the mcast routes present in the system")
 public class TroubleshootMcastCommand extends AbstractShellCommand {
@@ -58,7 +60,7 @@
 
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         TroubleshootService service = get(TroubleshootService.class);
         print("Tracing all Multicast routes in the System");
 
diff --git a/apps/t3/app/src/main/java/org/onosproject/t3/cli/TroubleshootPingAllCommand.java b/apps/t3/app/src/main/java/org/onosproject/t3/cli/TroubleshootPingAllCommand.java
index f9d7376..64fe2a0 100644
--- a/apps/t3/app/src/main/java/org/onosproject/t3/cli/TroubleshootPingAllCommand.java
+++ b/apps/t3/app/src/main/java/org/onosproject/t3/cli/TroubleshootPingAllCommand.java
@@ -17,10 +17,13 @@
 package org.onosproject.t3.cli;
 
 import org.apache.commons.lang.StringUtils;
-import org.apache.karaf.shell.commands.Command;
-import org.apache.karaf.shell.commands.Option;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.Completion;
+import org.apache.karaf.shell.api.action.Option;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onlab.packet.IpAddress;
 import org.onosproject.cli.AbstractShellCommand;
+import org.onosproject.cli.net.EthTypeCompleter;
 import org.onosproject.net.Host;
 import org.onosproject.net.flow.criteria.Criterion;
 import org.onosproject.net.flow.criteria.IPCriterion;
@@ -38,6 +41,7 @@
 /**
  * Starts a Static Packet Trace for a given input and prints the result.
  */
+@Service
 @Command(scope = "onos", name = "t3-troubleshoot-pingall",
         description = "Traces a ping between all hosts in the system of a given ETH type")
 public class TroubleshootPingAllCommand extends AbstractShellCommand {
@@ -46,6 +50,7 @@
             "id=%s, mac=%s, locations=%s, vlan=%s, ip(s)=%s";
 
     @Option(name = "-et", aliases = "--ethType", description = "ETH Type", valueToShowInHelp = "ipv4")
+    @Completion(EthTypeCompleter.class)
     String ethType = "ipv4";
 
     @Option(name = "-v", aliases = "--verbose", description = "Outputs trace for each host to host combination")
@@ -58,7 +63,7 @@
     private long delay = 0;
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         TroubleshootService service = get(TroubleshootService.class);
 
         EtherType type = EtherType.valueOf(ethType.toUpperCase());
diff --git a/apps/t3/app/src/main/java/org/onosproject/t3/cli/TroubleshootSimpleTraceCommand.java b/apps/t3/app/src/main/java/org/onosproject/t3/cli/TroubleshootSimpleTraceCommand.java
index 75356dc..7b18913 100644
--- a/apps/t3/app/src/main/java/org/onosproject/t3/cli/TroubleshootSimpleTraceCommand.java
+++ b/apps/t3/app/src/main/java/org/onosproject/t3/cli/TroubleshootSimpleTraceCommand.java
@@ -16,10 +16,13 @@
 
 package org.onosproject.t3.cli;
 
-import org.apache.karaf.shell.commands.Argument;
-import org.apache.karaf.shell.commands.Command;
-import org.apache.karaf.shell.commands.Option;
+import org.apache.karaf.shell.api.action.Argument;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.Completion;
+import org.apache.karaf.shell.api.action.Option;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.cli.AbstractShellCommand;
+import org.onosproject.cli.net.EthTypeCompleter;
 import org.onosproject.cli.net.HostIdCompleter;
 import org.onosproject.net.HostId;
 import org.onosproject.t3.api.StaticPacketTrace;
@@ -32,6 +35,7 @@
 /**
  * Starts a Static Packet Trace for a given input and prints the result.
  */
+@Service
 @Command(scope = "onos", name = "t3-troubleshoot-simple",
         description = "Given two hosts troubleshoots flows and groups between them, in case of segment routing")
 public class TroubleshootSimpleTraceCommand extends AbstractShellCommand {
@@ -40,10 +44,12 @@
     HostIdCompleter completer;
     @Argument(index = 0, name = "one", description = "One host ID",
             required = true, multiValued = false)
+    @Completion(HostIdCompleter.class)
     String srcHost = null;
 
     @Argument(index = 1, name = "two", description = "Another host ID",
             required = true, multiValued = false)
+    @Completion(HostIdCompleter.class)
     String dstHost = null;
 
     @Option(name = "-v", aliases = "--verbose", description = "Outputs complete path")
@@ -53,10 +59,11 @@
     private boolean verbosity2 = false;
 
     @Option(name = "-et", aliases = "--ethType", description = "ETH Type", valueToShowInHelp = "ipv4")
+    @Completion(EthTypeCompleter.class)
     String ethType = "ipv4";
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         TroubleshootService service = get(TroubleshootService.class);
 
         EtherType type = EtherType.valueOf(ethType.toUpperCase());
diff --git a/apps/t3/app/src/main/java/org/onosproject/t3/cli/TroubleshootTraceCommand.java b/apps/t3/app/src/main/java/org/onosproject/t3/cli/TroubleshootTraceCommand.java
index e8b759d..ed11cbe 100644
--- a/apps/t3/app/src/main/java/org/onosproject/t3/cli/TroubleshootTraceCommand.java
+++ b/apps/t3/app/src/main/java/org/onosproject/t3/cli/TroubleshootTraceCommand.java
@@ -17,8 +17,9 @@
 package org.onosproject.t3.cli;
 
 import com.google.common.base.Preconditions;
-import org.apache.karaf.shell.commands.Command;
-import org.apache.karaf.shell.commands.Option;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.Option;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onlab.packet.IpAddress;
 import org.onlab.packet.MacAddress;
 import org.onlab.packet.MplsLabel;
@@ -38,6 +39,7 @@
 /**
  * Starts a Static Packet Trace for a given input and prints the result.
  */
+@Service
 @Command(scope = "onos", name = "t3-troubleshoot",
         description = "troubleshoots flows and groups between source and destination")
 public class TroubleshootTraceCommand extends AbstractShellCommand {
@@ -102,7 +104,7 @@
     String udpDst = null;
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         TroubleshootService service = get(TroubleshootService.class);
         String[] cpInfo = srcPort.split("/");
         Preconditions.checkArgument(cpInfo.length == 2, "wrong format of source port");
diff --git a/apps/t3/app/src/main/java/org/onosproject/t3/impl/TroubleshootManager.java b/apps/t3/app/src/main/java/org/onosproject/t3/impl/TroubleshootManager.java
index 018f6ac..df73a61 100644
--- a/apps/t3/app/src/main/java/org/onosproject/t3/impl/TroubleshootManager.java
+++ b/apps/t3/app/src/main/java/org/onosproject/t3/impl/TroubleshootManager.java
@@ -22,10 +22,6 @@
 import com.google.common.collect.Lists;
 import com.google.common.collect.Sets;
 import org.apache.commons.lang3.tuple.Pair;
-import org.apache.felix.scr.annotations.Component;
-import org.apache.felix.scr.annotations.Reference;
-import org.apache.felix.scr.annotations.ReferenceCardinality;
-import org.apache.felix.scr.annotations.Service;
 import org.onlab.packet.IpAddress;
 import org.onlab.packet.VlanId;
 import org.onosproject.cluster.NodeId;
@@ -74,6 +70,9 @@
 import org.onosproject.t3.api.GroupsInDevice;
 import org.onosproject.t3.api.StaticPacketTrace;
 import org.onosproject.t3.api.TroubleshootService;
+import org.osgi.service.component.annotations.Component;
+import org.osgi.service.component.annotations.Reference;
+import org.osgi.service.component.annotations.ReferenceCardinality;
 import org.slf4j.Logger;
 
 import java.net.UnknownHostException;
@@ -103,45 +102,44 @@
  * Given a representation of a packet follows it's path in the network according to the existing flows and groups in
  * the devices.
  */
-@Service
-@Component(immediate = true)
+@Component(immediate = true, service = TroubleshootService.class)
 public class TroubleshootManager implements TroubleshootService {
 
     private static final Logger log = getLogger(TroubleshootManager.class);
 
     static final String PACKET_TO_CONTROLLER = "Packet goes to the controller";
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected FlowRuleService flowRuleService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected GroupService groupService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected LinkService linkService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected HostService hostService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected DriverService driverService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected DeviceService deviceService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected MastershipService mastershipService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected NetworkConfigService networkConfigService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected EdgePortService edgePortService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected RouteService routeService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected MulticastRouteService mcastService;
 
     @Override
diff --git a/apps/t3/app/src/main/resources/OSGI-INF/blueprint/shell-config.xml b/apps/t3/app/src/main/resources/OSGI-INF/blueprint/shell-config.xml
deleted file mode 100644
index 48df042..0000000
--- a/apps/t3/app/src/main/resources/OSGI-INF/blueprint/shell-config.xml
+++ /dev/null
@@ -1,47 +0,0 @@
-<!--
-  ~ Copyright 2017-present Open Networking Foundation
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~     http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License.
-  -->
-<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0">
-
-    <command-bundle xmlns="http://karaf.apache.org/xmlns/shell/v1.1.0">
-        <command>
-            <action class="org.onosproject.t3.cli.TroubleshootTraceCommand"/>
-        </command>
-        <command>
-            <action class="org.onosproject.t3.cli.TroubleshootSimpleTraceCommand"/>
-            <completers>
-                <ref component-id="hostIdCompleter"/>
-            </completers>
-            <optional-completers>
-                <entry key="-et" value-ref="ethTypeCompleter"/>
-            </optional-completers>
-        </command>
-        <command>
-            <action class="org.onosproject.t3.cli.TroubleshootPingAllCommand"/>
-            <optional-completers>
-                <entry key="-et" value-ref="ethTypeCompleter"/>
-            </optional-completers>
-        </command>
-        <command>
-            <action class="org.onosproject.t3.cli.TroubleshootMcastCommand"/>
-        </command>
-    </command-bundle>
-
-    <bean id="hostIdCompleter" class="org.onosproject.cli.net.HostIdCompleter"/>
-    <bean id="ethTypeCompleter" class="org.onosproject.cli.net.EthTypeCompleter"/>
-
-</blueprint>
-
-
diff --git a/apps/t3/web/BUCK b/apps/t3/web/BUCK
deleted file mode 100644
index fb837c4..0000000
--- a/apps/t3/web/BUCK
+++ /dev/null
@@ -1,19 +0,0 @@
-COMPILE_DEPS = [
-   '//lib:CORE_DEPS',
-   '//lib:KRYO',
-   '//core/api:onos-api',
-   '//lib:org.apache.karaf.shell.console',
-   '//utils/rest:onlab-rest',
-   '//lib:JACKSON',
-   '//lib:javax.ws.rs-api',
-   '//lib:jersey-server',
-   '//apps/t3/app:onos-apps-t3-app',
-]
-osgi_jar (
-   deps = COMPILE_DEPS,
-   web_context = '/onos/v1/t3',
-   api_title = 'T3 REST API',
-   api_version = '1.0',
-   api_description = 'REST API for T3',
-   api_package = 'org.onosproject.t3.rest',
-)
diff --git a/apps/tenbi/topology/app.xml b/apps/tenbi/topology/app.xml
deleted file mode 100644
index 84d3a60..0000000
--- a/apps/tenbi/topology/app.xml
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-  ~ Copyright 2015 Open Networking Foundation
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~     http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License.
-  -->
-<app name="org.onosproject.tenbi.topology" origin="HUAWEI" version="${project.version}"
-     featuresRepo="mvn:${project.groupId}/${project.artifactId}/${project.version}/xml/features"
-     features="${project.artifactId}">
-    <description>${project.description}</description>
-    <artifact>mvn:${project.groupId}/${project.artifactId}/${project.version}</artifact>
-    <artifact>mvn:${project.groupId}/onos-apps-tenbi-yangmodel/${project.version}</artifact>
-</app>
-
diff --git a/apps/tenbi/topology/features.xml b/apps/tenbi/topology/features.xml
deleted file mode 100644
index cf4a7f5..0000000
--- a/apps/tenbi/topology/features.xml
+++ /dev/null
@@ -1,27 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
-<!--
-  ~ Copyright 2015 Open Networking Foundation
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~     http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License.
-  -->
-<features xmlns="http://karaf.apache.org/xmlns/features/v1.2.0" name="${project.artifactId}-${project.version}">
-    <repository>mvn:${project.groupId}/onos-apps-tenbi-yangmodel/${project.version}/xml/features</repository>
-    <feature name="${project.artifactId}" version="${project.version}" description="${project.description}">
-        <feature>onos-api</feature>
-        <feature>onos-apps-tenbi-yangmodel</feature>
-        <bundle>mvn:${project.groupId}/${project.artifactId}/${project.version}</bundle>
-        <bundle>mvn:${project.groupId}/onos-apps-tetopology/${project.version}</bundle>
-        <bundle>mvn:${project.groupId}/onos-apps-yms-api/${project.version}</bundle>
-        <bundle>mvn:${project.groupId}/onos-apps-tenbi-utils/${project.version}</bundle>
-    </feature>
-</features>
diff --git a/apps/tenbi/topology/src/main/java/org/onosproject/tenbi/topology/impl/TeTopologyNbiManager.java b/apps/tenbi/topology/src/main/java/org/onosproject/tenbi/topology/impl/TeTopologyNbiManager.java
index 1f6dfd2..4c4d532 100644
--- a/apps/tenbi/topology/src/main/java/org/onosproject/tenbi/topology/impl/TeTopologyNbiManager.java
+++ b/apps/tenbi/topology/src/main/java/org/onosproject/tenbi/topology/impl/TeTopologyNbiManager.java
@@ -17,12 +17,11 @@
 
 import static com.google.common.base.Preconditions.checkNotNull;
 
-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.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.onosproject.event.AbstractListenerManager;
 import org.onosproject.tetopology.management.api.TeTopologyEvent;
 import org.onosproject.tetopology.management.api.TeTopologyListener;
@@ -54,18 +53,17 @@
 /**
  * The IETF TE Topology NBI Manager implementation.
  */
-@Component(immediate = true)
-@Service
+@Component(immediate = true, service = { IetfNetworkService.class, IetfNetworkTopologyService.class, IetfTeTopologyService.class })
 public class TeTopologyNbiManager
         extends AbstractListenerManager<IetfTeTopologyEvent, IetfTeTopologyEventListener>
         implements IetfNetworkService, IetfNetworkTopologyService, IetfTeTopologyService {
 
     private final Logger log = LoggerFactory.getLogger(getClass());
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected TeTopologyService teTopologyService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected YmsService ymsService;
 
 
diff --git a/apps/tenbi/tunnel/app.xml b/apps/tenbi/tunnel/app.xml
deleted file mode 100644
index 8df84d4..0000000
--- a/apps/tenbi/tunnel/app.xml
+++ /dev/null
@@ -1,26 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-  ~ /*
-  ~  * Copyright 2016-present Open Networking Foundation
-  ~  *
-  ~  * Licensed under the Apache License, Version 2.0 (the "License");
-  ~  * you may not use this file except in compliance with the License.
-  ~  * You may obtain a copy of the License at
-  ~  *
-  ~  *     http://www.apache.org/licenses/LICENSE-2.0
-  ~  *
-  ~  * Unless required by applicable law or agreed to in writing, software
-  ~  * distributed under the License is distributed on an "AS IS" BASIS,
-  ~  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~  * See the License for the specific language governing permissions and
-  ~  * limitations under the License.
-  ~  */
-  -->
-<app name="org.onosproject.tenbi.tunnel" origin="HUAWEI" version="${project.version}"
-     featuresRepo="mvn:${project.groupId}/${project.artifactId}/${project.version}/xml/features"
-     features="${project.artifactId}">
-    <description>${project.description}</description>
-    <artifact>mvn:${project.groupId}/${project.artifactId}/${project.version}</artifact>
-    <artifact>mvn:${project.groupId}/onos-apps-tenbi-yangmodel/${project.version}</artifact>
-</app>
-
diff --git a/apps/tenbi/tunnel/features.xml b/apps/tenbi/tunnel/features.xml
deleted file mode 100644
index d8fa1b4..0000000
--- a/apps/tenbi/tunnel/features.xml
+++ /dev/null
@@ -1,30 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
-<!--
-  ~ /*
-  ~  * Copyright 2016-present Open Networking Foundation
-  ~  *
-  ~  * Licensed under the Apache License, Version 2.0 (the "License");
-  ~  * you may not use this file except in compliance with the License.
-  ~  * You may obtain a copy of the License at
-  ~  *
-  ~  *     http://www.apache.org/licenses/LICENSE-2.0
-  ~  *
-  ~  * Unless required by applicable law or agreed to in writing, software
-  ~  * distributed under the License is distributed on an "AS IS" BASIS,
-  ~  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~  * See the License for the specific language governing permissions and
-  ~  * limitations under the License.
-  ~  */
-  -->
-<features xmlns="http://karaf.apache.org/xmlns/features/v1.2.0" name="${project.artifactId}-${project.version}">
-    <repository>mvn:${project.groupId}/onos-apps-tenbi-yangmodel/${project.version}/xml/features</repository>
-    <feature name="${project.artifactId}" version="${project.version}" description="${project.description}">
-        <feature>onos-api</feature>
-        <feature>onos-apps-tenbi-yangmodel</feature>
-        <bundle>mvn:${project.groupId}/onos-apps-tetopology-api/${project.version}</bundle>
-        <bundle>mvn:${project.groupId}/onos-apps-yms-api/${project.version}</bundle>
-        <bundle>mvn:${project.groupId}/onos-apps-tetunnel-api/${project.version}</bundle>
-        <bundle>mvn:${project.groupId}/onos-apps-tenbi-utils/${project.version}</bundle>
-        <bundle>mvn:${project.groupId}/${project.artifactId}/${project.version}</bundle>
-    </feature>
-</features>
diff --git a/apps/tenbi/tunnel/src/main/java/org/onosproject/tenbi/tunnel/TeTunnelNbiManager.java b/apps/tenbi/tunnel/src/main/java/org/onosproject/tenbi/tunnel/TeTunnelNbiManager.java
index 34a3033..4783d4a 100644
--- a/apps/tenbi/tunnel/src/main/java/org/onosproject/tenbi/tunnel/TeTunnelNbiManager.java
+++ b/apps/tenbi/tunnel/src/main/java/org/onosproject/tenbi/tunnel/TeTunnelNbiManager.java
@@ -16,12 +16,11 @@
 
 package org.onosproject.tenbi.tunnel;
 
-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.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.onosproject.event.AbstractListenerManager;
 import org.onosproject.tetopology.management.api.TeTopology;
 import org.onosproject.tetopology.management.api.TeTopologyKey;
@@ -55,23 +54,22 @@
 /**
  * The IETF TE Tunnel NBI Manager implementation.
  */
-@Component(immediate = true)
-@Service
+@Component(immediate = true, service = IetfTeService.class)
 public class TeTunnelNbiManager
         extends AbstractListenerManager<IetfTeEvent, IetfTeEventListener>
         implements IetfTeService {
     private final Logger log = getLogger(getClass());
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected YmsService ymsService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected TeTunnelService tunnelService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected TeTopologyService toplogyService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected TeTunnelAdminService tunnelAdminService;
 
     @Activate
diff --git a/apps/tenbi/yangmodel/features.xml b/apps/tenbi/yangmodel/features.xml
deleted file mode 100644
index deb89c3..0000000
--- a/apps/tenbi/yangmodel/features.xml
+++ /dev/null
@@ -1,22 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
-<!--
-  ~ Copyright 2015 Open Networking Foundation
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~     http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License.
-  -->
-<features xmlns="http://karaf.apache.org/xmlns/features/v1.2.0" name="@PROJECT-ARTIFACTID-@ONOS-VERSION" >
-    <feature name="@PROJECT-ARTIFACTID" version="@ONOS-VERSION"
-             description="@PROJECT-DESCRIPTION" >
-        <bundle>mvn:@PROJECT-GROUPID/@PROJECT-ARTIFACTID/@ONOS-VERSION</bundle>
-    </feature>
-</features>
\ No newline at end of file
diff --git a/apps/test/cluster-ha/BUCK b/apps/test/cluster-ha/BUCK
deleted file mode 100644
index d1ebbc9..0000000
--- a/apps/test/cluster-ha/BUCK
+++ /dev/null
@@ -1,16 +0,0 @@
-COMPILE_DEPS = [
-    '//lib:CORE_DEPS',
-    '//lib:org.apache.karaf.shell.console',
-    '//cli:onos-cli',
-    '//core/store/serializers:onos-core-serializers',
-    '//lib:KRYO',
-]
-osgi_jar (
-    deps = COMPILE_DEPS,
-)
-onos_app (
-    title = 'Cluster HA Test',
-    category = 'Test Utility',
-    url = 'http://onosproject.org',
-    description = 'Test for ONOS Cluster HA',
-)
diff --git a/apps/test/cluster-ha/BUILD b/apps/test/cluster-ha/BUILD
index fe48d70..4174424 100644
--- a/apps/test/cluster-ha/BUILD
+++ b/apps/test/cluster-ha/BUILD
@@ -3,6 +3,7 @@
 ]
 
 osgi_jar(
+    karaf_command_packages = ["org.onosproject.clusterha.cli"],
     deps = COMPILE_DEPS,
 )
 
diff --git a/apps/test/cluster-ha/src/main/java/org/onosproject/clusterha/ClusterHATest.java b/apps/test/cluster-ha/src/main/java/org/onosproject/clusterha/ClusterHATest.java
index 0ccca0a..1de17ec 100644
--- a/apps/test/cluster-ha/src/main/java/org/onosproject/clusterha/ClusterHATest.java
+++ b/apps/test/cluster-ha/src/main/java/org/onosproject/clusterha/ClusterHATest.java
@@ -18,20 +18,19 @@
 package org.onosproject.clusterha;
 
 
-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.KryoNamespace;
-import org.onosproject.store.serializers.KryoNamespaces;
 import org.onosproject.core.ApplicationId;
 import org.onosproject.core.CoreService;
-import org.onosproject.store.service.Serializer;
+import org.onosproject.store.serializers.KryoNamespaces;
 import org.onosproject.store.service.ConsistentMap;
+import org.onosproject.store.service.Serializer;
 import org.onosproject.store.service.StorageException;
 import org.onosproject.store.service.StorageService;
+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;
 
@@ -42,16 +41,15 @@
 /**
  * Cluster HA Test.
  */
-@Component(immediate = true)
-@Service(value = ClusterHATest.class)
+@Component(immediate = true, service = ClusterHATest.class)
 public class ClusterHATest {
 
     protected final Logger log = LoggerFactory.getLogger(getClass());
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected CoreService coreService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected StorageService storageService;
 
     private ApplicationId appId;
diff --git a/apps/test/cluster-ha/src/main/java/org/onosproject/clusterha/cli/ClusterHATestCommand.java b/apps/test/cluster-ha/src/main/java/org/onosproject/clusterha/cli/ClusterHATestCommand.java
index 6422988..a627292 100644
--- a/apps/test/cluster-ha/src/main/java/org/onosproject/clusterha/cli/ClusterHATestCommand.java
+++ b/apps/test/cluster-ha/src/main/java/org/onosproject/clusterha/cli/ClusterHATestCommand.java
@@ -16,11 +16,13 @@
 
 package org.onosproject.clusterha.cli;
 
-import org.apache.karaf.shell.commands.Argument;
-import org.apache.karaf.shell.commands.Command;
+import org.apache.karaf.shell.api.action.Argument;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.clusterha.ClusterHATest;
 
+@Service
 @Command(scope = "onos", name = "cluster-ha-test",
         description = "test addition & deletion on consistent map")
 public class ClusterHATestCommand extends AbstractShellCommand {
@@ -45,7 +47,7 @@
     private static final String CONSTANT = new String(new char[COUNT]).replace("\0", STR);
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         ClusterHATest service = get(ClusterHATest.class);
         int iStartIdx = 0, iEndIdx = 0;
         long lInterOpDelay = 0L;
diff --git a/apps/test/cluster-ha/src/main/resources/OSGI-INF/blueprint/shell-config.xml b/apps/test/cluster-ha/src/main/resources/OSGI-INF/blueprint/shell-config.xml
deleted file mode 100644
index 55cd87f..0000000
--- a/apps/test/cluster-ha/src/main/resources/OSGI-INF/blueprint/shell-config.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-<!--
-  ~ Copyright 2018-present Open Networking Foundation
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~     http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License.
-  -->
-
-<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0">
-
-    <command-bundle xmlns="http://karaf.apache.org/xmlns/shell/v1.1.0">
-        <command>
-            <action class="org.onosproject.clusterha.cli.ClusterHATestCommand"/>
-        </command>
-    </command-bundle>
-
-</blueprint>
diff --git a/apps/test/demo/BUCK b/apps/test/demo/BUCK
deleted file mode 100644
index 5623e04..0000000
--- a/apps/test/demo/BUCK
+++ /dev/null
@@ -1,25 +0,0 @@
-COMPILE_DEPS = [
-    '//lib:CORE_DEPS',
-    '//lib:JACKSON',
-    '//lib:org.apache.karaf.shell.console',
-    '//cli:onos-cli',
-    '//utils/rest:onlab-rest',
-    '//lib:javax.ws.rs-api',
-    '//core/store/serializers:onos-core-serializers',
-]
-
-osgi_jar_with_tests (
-    deps = COMPILE_DEPS,
-    web_context = '/onos/demo',
-    api_title = 'Flow Throughput Demo',
-    api_version = '1.0',
-    api_description = 'REST API for Demo',
-    api_package = 'org.onosproject.demo',
-)
-
-onos_app (
-    title = 'Flow Throughput Demo',
-    category = 'Test Utility',
-    url = 'http://onosproject.org',
-    description = 'APIs for interacting with the flow throughput test application.',
-)
diff --git a/apps/test/demo/src/main/java/org/onosproject/demo/DemoInstaller.java b/apps/test/demo/src/main/java/org/onosproject/demo/DemoInstaller.java
index 3772bdb..8283a22 100644
--- a/apps/test/demo/src/main/java/org/onosproject/demo/DemoInstaller.java
+++ b/apps/test/demo/src/main/java/org/onosproject/demo/DemoInstaller.java
@@ -15,36 +15,16 @@
  */
 package org.onosproject.demo;
 
-import java.security.SecureRandom;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.Map;
-import java.util.concurrent.atomic.AtomicLong;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.Objects;
-import java.util.Optional;
-import java.util.Random;
-import java.util.Set;
-import java.util.concurrent.Callable;
-import java.util.concurrent.CountDownLatch;
-import java.util.concurrent.ExecutionException;
-import java.util.concurrent.ExecutorService;
-import java.util.concurrent.Executors;
-import java.util.concurrent.Future;
-import java.util.concurrent.TimeUnit;
-import java.util.concurrent.TimeoutException;
-
+import com.fasterxml.jackson.databind.JsonNode;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.node.ObjectNode;
+import com.google.common.base.Predicate;
+import com.google.common.base.Stopwatch;
+import com.google.common.collect.FluentIterable;
+import com.google.common.collect.Lists;
+import com.google.common.collect.Sets;
+import com.google.common.util.concurrent.ThreadFactoryBuilder;
 import org.apache.commons.lang.math.RandomUtils;
-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.packet.MacAddress;
 import org.onosproject.cluster.ClusterService;
 import org.onosproject.cluster.ControllerNode;
@@ -53,6 +33,7 @@
 import org.onosproject.core.CoreService;
 import org.onosproject.mastership.MastershipService;
 import org.onosproject.net.Device;
+import org.onosproject.net.DeviceId;
 import org.onosproject.net.Host;
 import org.onosproject.net.HostId;
 import org.onosproject.net.MastershipRole;
@@ -69,64 +50,80 @@
 import org.onosproject.net.flow.TrafficTreatment;
 import org.onosproject.net.flow.criteria.Criterion;
 import org.onosproject.net.flow.instructions.Instructions;
-import org.onosproject.net.flowobjective.FlowObjectiveService;
 import org.onosproject.net.flowobjective.DefaultFilteringObjective;
 import org.onosproject.net.flowobjective.DefaultForwardingObjective;
-import org.onosproject.net.flowobjective.ForwardingObjective;
-import org.onosproject.net.flowobjective.FilteringObjective;
 import org.onosproject.net.flowobjective.DefaultObjectiveContext;
+import org.onosproject.net.flowobjective.FilteringObjective;
+import org.onosproject.net.flowobjective.FlowObjectiveService;
+import org.onosproject.net.flowobjective.ForwardingObjective;
 import org.onosproject.net.flowobjective.ObjectiveContext;
-import org.onosproject.net.DeviceId;
 import org.onosproject.net.host.HostService;
 import org.onosproject.net.intent.Constraint;
 import org.onosproject.net.intent.HostToHostIntent;
 import org.onosproject.net.intent.Intent;
 import org.onosproject.net.intent.IntentService;
+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.fasterxml.jackson.databind.JsonNode;
-import com.fasterxml.jackson.databind.ObjectMapper;
-import com.fasterxml.jackson.databind.node.ObjectNode;
-import com.google.common.base.Predicate;
-import com.google.common.base.Stopwatch;
-import com.google.common.collect.FluentIterable;
-import com.google.common.collect.Lists;
-import com.google.common.collect.Sets;
-import com.google.common.util.concurrent.ThreadFactoryBuilder;
+import java.security.SecureRandom;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+import java.util.Optional;
+import java.util.Random;
+import java.util.Set;
+import java.util.concurrent.Callable;
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.concurrent.Future;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.TimeoutException;
+import java.util.concurrent.atomic.AtomicLong;
 
 import static org.slf4j.LoggerFactory.getLogger;
 
 /**
  * Application to set up demos.
  */
-@Component(immediate = true)
-@Service
+@Component(immediate = true, service = DemoApi.class)
 public class DemoInstaller implements DemoApi {
 
     private final Logger log = getLogger(getClass());
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected CoreService coreService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected IntentService intentService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected HostService hostService;
 
-    @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 DeviceService deviceService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected FlowRuleService flowService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected FlowObjectiveService objectiveService;
 
     private ExecutorService worker;
diff --git a/apps/test/distributed-primitives/BUCK b/apps/test/distributed-primitives/BUCK
deleted file mode 100644
index eed561a..0000000
--- a/apps/test/distributed-primitives/BUCK
+++ /dev/null
@@ -1,21 +0,0 @@
-COMPILE_DEPS = [
-    '//lib:CORE_DEPS',
-    '//lib:KRYO',
-    '//lib:org.apache.karaf.shell.console',
-    '//cli:onos-cli',
-    '//utils/rest:onlab-rest',
-    '//lib:javax.ws.rs-api',
-    '//core/store/serializers:onos-core-serializers',
-]
-
-osgi_jar (
-    deps = COMPILE_DEPS,
-)
-
-onos_app (
-    app_name = 'org.onosproject.distributedprimitives',
-    title = 'Distributed Primitives Test',
-    category = 'Test Utility',
-    url = 'http://onosproject.org',
-    description = 'ONOS app to test distributed primitives.',
-)
diff --git a/apps/test/distributed-primitives/BUILD b/apps/test/distributed-primitives/BUILD
index 09ab1c4..025e053 100644
--- a/apps/test/distributed-primitives/BUILD
+++ b/apps/test/distributed-primitives/BUILD
@@ -5,6 +5,7 @@
 ]
 
 osgi_jar(
+    karaf_command_packages = ["org.onosproject.distributedprimitives.cli"],
     deps = COMPILE_DEPS,
 )
 
diff --git a/apps/test/distributed-primitives/src/main/java/org/onosproject/distributedprimitives/DistributedPrimitivesTest.java b/apps/test/distributed-primitives/src/main/java/org/onosproject/distributedprimitives/DistributedPrimitivesTest.java
index 3296046..0e8c5a0 100644
--- a/apps/test/distributed-primitives/src/main/java/org/onosproject/distributedprimitives/DistributedPrimitivesTest.java
+++ b/apps/test/distributed-primitives/src/main/java/org/onosproject/distributedprimitives/DistributedPrimitivesTest.java
@@ -15,15 +15,7 @@
  */
 package org.onosproject.distributedprimitives;
 
-import java.util.Map;
-
 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.onosproject.core.ApplicationId;
 import org.onosproject.core.CoreService;
 import org.onosproject.store.serializers.KryoNamespaces;
@@ -32,15 +24,21 @@
 import org.onosproject.store.service.LeaderElector;
 import org.onosproject.store.service.StorageService;
 import org.onosproject.store.service.WallClockTimestamp;
+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.Map;
+
 import static org.slf4j.LoggerFactory.getLogger;
 
 /**
  * Simple application to test distributed primitives.
  */
-@Component(immediate = true)
-@Service(value = DistributedPrimitivesTest.class)
+@Component(immediate = true, service = DistributedPrimitivesTest.class)
 public class DistributedPrimitivesTest {
 
     private final Logger log = getLogger(getClass());
@@ -48,10 +46,10 @@
     private static final String APP_NAME = "org.onosproject.distributedprimitives";
     private ApplicationId appId;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected CoreService coreService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected StorageService storageService;
 
     private final Map<String, EventuallyConsistentMap<String, String>> maps = Maps.newConcurrentMap();
diff --git a/apps/test/distributed-primitives/src/main/java/org/onosproject/distributedprimitives/cli/AtomicValueTestCommand.java b/apps/test/distributed-primitives/src/main/java/org/onosproject/distributedprimitives/cli/AtomicValueTestCommand.java
index 75a963f..61f1409 100644
--- a/apps/test/distributed-primitives/src/main/java/org/onosproject/distributedprimitives/cli/AtomicValueTestCommand.java
+++ b/apps/test/distributed-primitives/src/main/java/org/onosproject/distributedprimitives/cli/AtomicValueTestCommand.java
@@ -15,8 +15,9 @@
  */
 package org.onosproject.distributedprimitives.cli;
 
-import org.apache.karaf.shell.commands.Argument;
-import org.apache.karaf.shell.commands.Command;
+import org.apache.karaf.shell.api.action.Argument;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.store.serializers.KryoNamespaces;
 import org.onosproject.store.service.AtomicValue;
@@ -26,6 +27,7 @@
 /**
  * CLI command to manipulate a distributed value.
  */
+@Service
 @Command(scope = "onos", name = "value-test",
         description = "Manipulate a distributed value")
 public class AtomicValueTestCommand extends AbstractShellCommand {
@@ -53,7 +55,7 @@
     AtomicValue<String> atomicValue;
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         StorageService storageService = get(StorageService.class);
         atomicValue = storageService.<String>atomicValueBuilder()
                                     .withName(name)
diff --git a/apps/test/distributed-primitives/src/main/java/org/onosproject/distributedprimitives/cli/ConsistentMapTestCommand.java b/apps/test/distributed-primitives/src/main/java/org/onosproject/distributedprimitives/cli/ConsistentMapTestCommand.java
index 3896830..309d90a 100644
--- a/apps/test/distributed-primitives/src/main/java/org/onosproject/distributedprimitives/cli/ConsistentMapTestCommand.java
+++ b/apps/test/distributed-primitives/src/main/java/org/onosproject/distributedprimitives/cli/ConsistentMapTestCommand.java
@@ -15,8 +15,9 @@
  */
 package org.onosproject.distributedprimitives.cli;
 
-import org.apache.karaf.shell.commands.Argument;
-import org.apache.karaf.shell.commands.Command;
+import org.apache.karaf.shell.api.action.Argument;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.core.Version;
 import org.onosproject.store.serializers.KryoNamespaces;
@@ -28,6 +29,7 @@
 /**
  * CLI command to manipulate a distributed value.
  */
+@Service
 @Command(scope = "onos", name = "map-test",
         description = "Manipulate a consistent map")
 public class ConsistentMapTestCommand extends AbstractShellCommand {
@@ -60,7 +62,7 @@
     ConsistentMap<String, String> map;
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         StorageService storageService = get(StorageService.class);
         map = storageService.<String, String>consistentMapBuilder()
             .withName(name)
diff --git a/apps/test/distributed-primitives/src/main/java/org/onosproject/distributedprimitives/cli/CounterTestCommand.java b/apps/test/distributed-primitives/src/main/java/org/onosproject/distributedprimitives/cli/CounterTestCommand.java
index 4fd3f0f..cdf0a97 100644
--- a/apps/test/distributed-primitives/src/main/java/org/onosproject/distributedprimitives/cli/CounterTestCommand.java
+++ b/apps/test/distributed-primitives/src/main/java/org/onosproject/distributedprimitives/cli/CounterTestCommand.java
@@ -15,8 +15,9 @@
  */
 package org.onosproject.distributedprimitives.cli;
 
-import org.apache.karaf.shell.commands.Argument;
-import org.apache.karaf.shell.commands.Command;
+import org.apache.karaf.shell.api.action.Argument;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.store.service.AtomicCounter;
 import org.onosproject.store.service.StorageService;
@@ -24,6 +25,7 @@
 /**
  * CLI command to increment a distributed counter.
  */
+@Service
 @Command(scope = "onos", name = "counter-test",
         description = "Manipulate a distributed counter")
 public class CounterTestCommand extends AbstractShellCommand {
@@ -51,7 +53,7 @@
     AtomicCounter atomicCounter;
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         StorageService storageService = get(StorageService.class);
         atomicCounter = storageService.getAsyncAtomicCounter(counter).asAtomicCounter();
         if ("get".equals(operation)) {
diff --git a/apps/test/distributed-primitives/src/main/java/org/onosproject/distributedprimitives/cli/CounterTestIncrementCommand.java b/apps/test/distributed-primitives/src/main/java/org/onosproject/distributedprimitives/cli/CounterTestIncrementCommand.java
index 381c906..04d75c2 100644
--- a/apps/test/distributed-primitives/src/main/java/org/onosproject/distributedprimitives/cli/CounterTestIncrementCommand.java
+++ b/apps/test/distributed-primitives/src/main/java/org/onosproject/distributedprimitives/cli/CounterTestIncrementCommand.java
@@ -15,9 +15,10 @@
  */
 package org.onosproject.distributedprimitives.cli;
 
-import org.apache.karaf.shell.commands.Argument;
-import org.apache.karaf.shell.commands.Command;
-import org.apache.karaf.shell.commands.Option;
+import org.apache.karaf.shell.api.action.Argument;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.Option;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.store.service.AsyncAtomicCounter;
 import org.onosproject.store.service.StorageService;
@@ -33,6 +34,7 @@
 /**
  * CLI command to increment a distributed counter.
  */
+@Service
 @Command(scope = "onos", name = "counter-test-increment",
         description = "Increment a distributed counter")
 public class CounterTestIncrementCommand extends AbstractShellCommand {
@@ -57,7 +59,7 @@
 
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         StorageService storageService = get(StorageService.class);
         atomicCounter = storageService.getAsyncAtomicCounter(counter);
         CompletableFuture<Long> result;
diff --git a/apps/test/distributed-primitives/src/main/java/org/onosproject/distributedprimitives/cli/DistributedLockTestCommand.java b/apps/test/distributed-primitives/src/main/java/org/onosproject/distributedprimitives/cli/DistributedLockTestCommand.java
index 9e23cb2..d6760c6 100644
--- a/apps/test/distributed-primitives/src/main/java/org/onosproject/distributedprimitives/cli/DistributedLockTestCommand.java
+++ b/apps/test/distributed-primitives/src/main/java/org/onosproject/distributedprimitives/cli/DistributedLockTestCommand.java
@@ -17,12 +17,14 @@
 
 import java.time.Duration;
 
-import org.apache.karaf.shell.commands.Argument;
-import org.apache.karaf.shell.commands.Command;
+import org.apache.karaf.shell.api.action.Argument;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.distributedprimitives.DistributedPrimitivesTest;
 import org.onosproject.store.service.DistributedLock;
 
+@Service
 @Command(scope = "onos", name = "lock-test",
     description = "DistributedLock test cli fixture")
 public class DistributedLockTestCommand extends AbstractShellCommand {
@@ -47,7 +49,7 @@
     DistributedLock lock;
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         DistributedPrimitivesTest test = get(DistributedPrimitivesTest.class);
         lock = test.getLock(name);
         if ("lock".equals(operation)) {
diff --git a/apps/test/distributed-primitives/src/main/java/org/onosproject/distributedprimitives/cli/DocumentTreeTestCommand.java b/apps/test/distributed-primitives/src/main/java/org/onosproject/distributedprimitives/cli/DocumentTreeTestCommand.java
index d0cf863..448d681 100644
--- a/apps/test/distributed-primitives/src/main/java/org/onosproject/distributedprimitives/cli/DocumentTreeTestCommand.java
+++ b/apps/test/distributed-primitives/src/main/java/org/onosproject/distributedprimitives/cli/DocumentTreeTestCommand.java
@@ -15,8 +15,8 @@
  */
 package org.onosproject.distributedprimitives.cli;
 
-import org.apache.karaf.shell.commands.Argument;
-import org.apache.karaf.shell.commands.Command;
+import org.apache.karaf.shell.api.action.Argument;
+import org.apache.karaf.shell.api.action.Command;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.store.serializers.KryoNamespaces;
 import org.onosproject.store.service.DocumentPath;
@@ -55,7 +55,7 @@
     DocumentTree<String> tree;
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         StorageService storageService = get(StorageService.class);
         tree = storageService.<String>getDocumentTree(name, Serializer.using(KryoNamespaces.BASIC)).asDocumentTree();
 
diff --git a/apps/test/distributed-primitives/src/main/java/org/onosproject/distributedprimitives/cli/EventuallyConsistentMapTestCommand.java b/apps/test/distributed-primitives/src/main/java/org/onosproject/distributedprimitives/cli/EventuallyConsistentMapTestCommand.java
index 359669b..7789479 100644
--- a/apps/test/distributed-primitives/src/main/java/org/onosproject/distributedprimitives/cli/EventuallyConsistentMapTestCommand.java
+++ b/apps/test/distributed-primitives/src/main/java/org/onosproject/distributedprimitives/cli/EventuallyConsistentMapTestCommand.java
@@ -15,8 +15,9 @@
  */
 package org.onosproject.distributedprimitives.cli;
 
-import org.apache.karaf.shell.commands.Argument;
-import org.apache.karaf.shell.commands.Command;
+import org.apache.karaf.shell.api.action.Argument;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.distributedprimitives.DistributedPrimitivesTest;
 import org.onosproject.store.service.EventuallyConsistentMap;
@@ -24,6 +25,7 @@
 /**
  * CLI command to manipulate a distributed map.
  */
+@Service
 @Command(scope = "onos", name = "ec-map-test",
         description = "Manipulate an eventually consistent map")
 public class EventuallyConsistentMapTestCommand extends AbstractShellCommand {
@@ -56,7 +58,7 @@
     EventuallyConsistentMap<String, String> map;
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         DistributedPrimitivesTest test = get(DistributedPrimitivesTest.class);
         map = test.getEcMap(name);
 
diff --git a/apps/test/distributed-primitives/src/main/java/org/onosproject/distributedprimitives/cli/LeaderElectorTestCommand.java b/apps/test/distributed-primitives/src/main/java/org/onosproject/distributedprimitives/cli/LeaderElectorTestCommand.java
index 2c0f838..b28f0ad 100644
--- a/apps/test/distributed-primitives/src/main/java/org/onosproject/distributedprimitives/cli/LeaderElectorTestCommand.java
+++ b/apps/test/distributed-primitives/src/main/java/org/onosproject/distributedprimitives/cli/LeaderElectorTestCommand.java
@@ -15,8 +15,9 @@
  */
 package org.onosproject.distributedprimitives.cli;
 
-import org.apache.karaf.shell.commands.Argument;
-import org.apache.karaf.shell.commands.Command;
+import org.apache.karaf.shell.api.action.Argument;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.cluster.ClusterService;
 import org.onosproject.cluster.Leadership;
@@ -26,6 +27,7 @@
 
 import com.google.common.base.Joiner;
 
+@Service
 @Command(scope = "onos", name = "leader-test",
 description = "LeaderElector test cli fixture")
 public class LeaderElectorTestCommand extends AbstractShellCommand {
@@ -48,7 +50,7 @@
     LeaderElector leaderElector;
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         ClusterService clusterService = get(ClusterService.class);
         DistributedPrimitivesTest test = get(DistributedPrimitivesTest.class);
         leaderElector = test.getLeaderElector(name);
diff --git a/apps/test/distributed-primitives/src/main/java/org/onosproject/distributedprimitives/cli/SetTestAddCommand.java b/apps/test/distributed-primitives/src/main/java/org/onosproject/distributedprimitives/cli/SetTestAddCommand.java
index 905a792..5320ea4 100644
--- a/apps/test/distributed-primitives/src/main/java/org/onosproject/distributedprimitives/cli/SetTestAddCommand.java
+++ b/apps/test/distributed-primitives/src/main/java/org/onosproject/distributedprimitives/cli/SetTestAddCommand.java
@@ -15,8 +15,9 @@
  */
 package org.onosproject.distributedprimitives.cli;
 
-import org.apache.karaf.shell.commands.Argument;
-import org.apache.karaf.shell.commands.Command;
+import org.apache.karaf.shell.api.action.Argument;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onlab.util.KryoNamespace;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.store.serializers.KryoNamespaces;
@@ -29,6 +30,7 @@
 /**
  * CLI command to add elements to a distributed set.
  */
+@Service
 @Command(scope = "onos", name = "set-test-add",
         description = "Add to a distributed set")
 public class SetTestAddCommand extends AbstractShellCommand {
@@ -51,7 +53,7 @@
 
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         StorageService storageService = get(StorageService.class);
         set = storageService.<String>setBuilder()
                 .withName(setName)
diff --git a/apps/test/distributed-primitives/src/main/java/org/onosproject/distributedprimitives/cli/SetTestGetCommand.java b/apps/test/distributed-primitives/src/main/java/org/onosproject/distributedprimitives/cli/SetTestGetCommand.java
index d76806c..208c47a 100644
--- a/apps/test/distributed-primitives/src/main/java/org/onosproject/distributedprimitives/cli/SetTestGetCommand.java
+++ b/apps/test/distributed-primitives/src/main/java/org/onosproject/distributedprimitives/cli/SetTestGetCommand.java
@@ -15,9 +15,10 @@
  */
 package org.onosproject.distributedprimitives.cli;
 
-import org.apache.karaf.shell.commands.Argument;
-import org.apache.karaf.shell.commands.Command;
-import org.apache.karaf.shell.commands.Option;
+import org.apache.karaf.shell.api.action.Argument;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.Option;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onlab.util.KryoNamespace;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.store.serializers.KryoNamespaces;
@@ -30,6 +31,7 @@
 /**
  * CLI command to get the elements in a distributed set.
  */
+@Service
 @Command(scope = "onos", name = "set-test-get",
         description = "Get the elements in a distributed set")
 public class SetTestGetCommand extends AbstractShellCommand {
@@ -56,7 +58,7 @@
 
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         StorageService storageService = get(StorageService.class);
         set = storageService.<String>setBuilder()
                 .withName(setName)
diff --git a/apps/test/distributed-primitives/src/main/java/org/onosproject/distributedprimitives/cli/SetTestRemoveCommand.java b/apps/test/distributed-primitives/src/main/java/org/onosproject/distributedprimitives/cli/SetTestRemoveCommand.java
index 018d177..675747f 100644
--- a/apps/test/distributed-primitives/src/main/java/org/onosproject/distributedprimitives/cli/SetTestRemoveCommand.java
+++ b/apps/test/distributed-primitives/src/main/java/org/onosproject/distributedprimitives/cli/SetTestRemoveCommand.java
@@ -15,9 +15,10 @@
  */
 package org.onosproject.distributedprimitives.cli;
 
-import org.apache.karaf.shell.commands.Argument;
-import org.apache.karaf.shell.commands.Command;
-import org.apache.karaf.shell.commands.Option;
+import org.apache.karaf.shell.api.action.Argument;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.Option;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onlab.util.KryoNamespace;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.store.serializers.KryoNamespaces;
@@ -30,6 +31,7 @@
 /**
  * CLI command to remove elements from a distributed set.
  */
+@Service
 @Command(scope = "onos", name = "set-test-remove",
         description = "Remove from a distributed set")
 public class SetTestRemoveCommand extends AbstractShellCommand {
@@ -59,7 +61,7 @@
 
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         StorageService storageService = get(StorageService.class);
         set = storageService.<String>setBuilder()
                 .withName(setName)
diff --git a/apps/test/distributed-primitives/src/main/java/org/onosproject/distributedprimitives/cli/TransactionalMapTestGetCommand.java b/apps/test/distributed-primitives/src/main/java/org/onosproject/distributedprimitives/cli/TransactionalMapTestGetCommand.java
index 0a5fda2..f8dc239 100644
--- a/apps/test/distributed-primitives/src/main/java/org/onosproject/distributedprimitives/cli/TransactionalMapTestGetCommand.java
+++ b/apps/test/distributed-primitives/src/main/java/org/onosproject/distributedprimitives/cli/TransactionalMapTestGetCommand.java
@@ -15,8 +15,9 @@
  */
 package org.onosproject.distributedprimitives.cli;
 
-import org.apache.karaf.shell.commands.Argument;
-import org.apache.karaf.shell.commands.Command;
+import org.apache.karaf.shell.api.action.Argument;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.store.serializers.KryoNamespaces;
 import org.onosproject.store.service.Serializer;
@@ -27,6 +28,7 @@
 /**
  * CLI command to get a value associated with a specific key in a transactional map.
  */
+@Service
 @Command(scope = "onos", name = "transactional-map-test-get",
         description = "Get a value associated with a specific key in a transactional map")
 public class TransactionalMapTestGetCommand extends AbstractShellCommand {
@@ -41,7 +43,7 @@
     Serializer serializer = Serializer.using(KryoNamespaces.BASIC);
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         StorageService storageService = get(StorageService.class);
         TransactionContext context;
         context = storageService.transactionContextBuilder().build();
diff --git a/apps/test/distributed-primitives/src/main/java/org/onosproject/distributedprimitives/cli/TransactionalMapTestPutCommand.java b/apps/test/distributed-primitives/src/main/java/org/onosproject/distributedprimitives/cli/TransactionalMapTestPutCommand.java
index 11f5493..8d70c2a 100644
--- a/apps/test/distributed-primitives/src/main/java/org/onosproject/distributedprimitives/cli/TransactionalMapTestPutCommand.java
+++ b/apps/test/distributed-primitives/src/main/java/org/onosproject/distributedprimitives/cli/TransactionalMapTestPutCommand.java
@@ -15,8 +15,9 @@
  */
 package org.onosproject.distributedprimitives.cli;
 
-import org.apache.karaf.shell.commands.Argument;
-import org.apache.karaf.shell.commands.Command;
+import org.apache.karaf.shell.api.action.Argument;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.store.serializers.KryoNamespaces;
 import org.onosproject.store.service.Serializer;
@@ -27,6 +28,7 @@
 /**
  * CLI command to put a value into a transactional map.
  */
+@Service
 @Command(scope = "onos", name = "transactional-map-test-put",
         description = "Put a value into a transactional map")
 public class TransactionalMapTestPutCommand extends AbstractShellCommand {
@@ -47,7 +49,7 @@
     Serializer serializer = Serializer.using(KryoNamespaces.BASIC);
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         StorageService storageService = get(StorageService.class);
         TransactionContext context;
         context = storageService.transactionContextBuilder().build();
diff --git a/apps/test/distributed-primitives/src/main/java/org/onosproject/distributedprimitives/cli/WorkQueueTestCommand.java b/apps/test/distributed-primitives/src/main/java/org/onosproject/distributedprimitives/cli/WorkQueueTestCommand.java
index dfaeafc..5caef40 100644
--- a/apps/test/distributed-primitives/src/main/java/org/onosproject/distributedprimitives/cli/WorkQueueTestCommand.java
+++ b/apps/test/distributed-primitives/src/main/java/org/onosproject/distributedprimitives/cli/WorkQueueTestCommand.java
@@ -15,8 +15,9 @@
  */
 package org.onosproject.distributedprimitives.cli;
 
-import org.apache.karaf.shell.commands.Argument;
-import org.apache.karaf.shell.commands.Command;
+import org.apache.karaf.shell.api.action.Argument;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.store.serializers.KryoNamespaces;
 import org.onosproject.store.service.DistributedPrimitive;
@@ -34,6 +35,7 @@
 /**
  * CLI command to test a distributed work queue.
  */
+@Service
 @Command(scope = "onos", name = "work-queue-test",
         description = "Test a distributed work queue")
 public class WorkQueueTestCommand extends AbstractShellCommand {
@@ -62,7 +64,7 @@
     WorkQueue<String> queue;
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         StorageService storageService = get(StorageService.class);
         Serializer serializer = Serializer.using(KryoNamespaces.BASIC);
         queue = storageService.getWorkQueue(name, serializer);
diff --git a/apps/test/distributed-primitives/src/main/resources/OSGI-INF/blueprint/shell-config.xml b/apps/test/distributed-primitives/src/main/resources/OSGI-INF/blueprint/shell-config.xml
deleted file mode 100644
index eeeab33..0000000
--- a/apps/test/distributed-primitives/src/main/resources/OSGI-INF/blueprint/shell-config.xml
+++ /dev/null
@@ -1,63 +0,0 @@
-<!--
-  ~ Copyright 2015-present Open Networking Foundation
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~     http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License.
-  -->
-<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0">
-
-    <command-bundle xmlns="http://karaf.apache.org/xmlns/shell/v1.1.0">
-        <command>
-            <action class="org.onosproject.distributedprimitives.cli.CounterTestIncrementCommand"/>
-        </command>
-        <command>
-            <action class="org.onosproject.distributedprimitives.cli.SetTestAddCommand"/>
-        </command>
-        <command>
-            <action class="org.onosproject.distributedprimitives.cli.SetTestGetCommand"/>
-        </command>
-        <command>
-            <action class="org.onosproject.distributedprimitives.cli.SetTestRemoveCommand"/>
-        </command>
-        <command>
-            <action class="org.onosproject.distributedprimitives.cli.TransactionalMapTestGetCommand"/>
-        </command>
-        <command>
-            <action class="org.onosproject.distributedprimitives.cli.TransactionalMapTestPutCommand"/>
-        </command>
-        <command>
-            <action class="org.onosproject.distributedprimitives.cli.CounterTestCommand"/>
-        </command>
-        <command>
-            <action class="org.onosproject.distributedprimitives.cli.WorkQueueTestCommand"/>
-        </command>
-        <command>
-            <action class="org.onosproject.distributedprimitives.cli.ConsistentMapTestCommand"/>
-        </command>
-        <command>
-            <action class="org.onosproject.distributedprimitives.cli.DocumentTreeTestCommand"/>
-        </command>
-        <command>
-            <action class="org.onosproject.distributedprimitives.cli.EventuallyConsistentMapTestCommand"/>
-        </command>
-        <command>
-            <action class="org.onosproject.distributedprimitives.cli.AtomicValueTestCommand"/>
-        </command>
-        <command>
-            <action class="org.onosproject.distributedprimitives.cli.LeaderElectorTestCommand"/>
-        </command>
-        <command>
-            <action class="org.onosproject.distributedprimitives.cli.DistributedLockTestCommand"/>
-        </command>
-    </command-bundle>
-
-</blueprint>
diff --git a/apps/test/election/BUCK b/apps/test/election/BUCK
deleted file mode 100644
index 67077c9..0000000
--- a/apps/test/election/BUCK
+++ /dev/null
@@ -1,19 +0,0 @@
-COMPILE_DEPS = [
-    '//lib:CORE_DEPS',
-    '//lib:org.apache.karaf.shell.console',
-    '//cli:onos-cli',
-    '//utils/rest:onlab-rest',
-    '//lib:javax.ws.rs-api',
-    '//core/store/serializers:onos-core-serializers',
-]
-
-osgi_jar (
-    deps = COMPILE_DEPS,
-)
-
-onos_app (
-    title = 'Master Election Test',
-    category = 'Test Utility',
-    url = 'http://onosproject.org',
-    description = 'Master election test application.',
-)
diff --git a/apps/test/election/BUILD b/apps/test/election/BUILD
index 91ea75b..6128a5a 100644
--- a/apps/test/election/BUILD
+++ b/apps/test/election/BUILD
@@ -1,6 +1,7 @@
 COMPILE_DEPS = CORE_DEPS + CLI + REST
 
 osgi_jar(
+    karaf_command_packages = ["org.onosproject.election.cli"],
     deps = COMPILE_DEPS,
 )
 
diff --git a/apps/test/election/src/main/java/org/onosproject/election/ElectionTest.java b/apps/test/election/src/main/java/org/onosproject/election/ElectionTest.java
index 8497b81..17a620c 100644
--- a/apps/test/election/src/main/java/org/onosproject/election/ElectionTest.java
+++ b/apps/test/election/src/main/java/org/onosproject/election/ElectionTest.java
@@ -17,11 +17,11 @@
 
 import static org.slf4j.LoggerFactory.getLogger;
 
-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.onosproject.cluster.ClusterService;
 import org.onosproject.core.CoreService;
 import org.onosproject.cluster.LeadershipEvent;
@@ -43,13 +43,13 @@
     private static final String ELECTION_APP = "org.onosproject.election";
     private ApplicationId appId;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected ClusterService clusterService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected CoreService coreService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected LeadershipService leadershipService;
 
     private LeadershipEventListener leadershipEventListener =
diff --git a/apps/test/election/src/main/java/org/onosproject/election/cli/ElectionTestLeaderCommand.java b/apps/test/election/src/main/java/org/onosproject/election/cli/ElectionTestLeaderCommand.java
index aab47b0..ed6c982 100644
--- a/apps/test/election/src/main/java/org/onosproject/election/cli/ElectionTestLeaderCommand.java
+++ b/apps/test/election/src/main/java/org/onosproject/election/cli/ElectionTestLeaderCommand.java
@@ -15,14 +15,16 @@
  */
 package org.onosproject.election.cli;
 
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.cluster.NodeId;
-import org.apache.karaf.shell.commands.Command;
+import org.apache.karaf.shell.api.action.Command;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.cluster.LeadershipService;
 
 /**
  * CLI command to get the current leader for the Election test application.
  */
+@Service
 @Command(scope = "onos", name = "election-test-leader",
         description = "Get the current leader for the Election test application")
 public class ElectionTestLeaderCommand extends AbstractShellCommand {
@@ -31,7 +33,7 @@
     private static final String ELECTION_APP = "org.onosproject.election";
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         LeadershipService service = get(LeadershipService.class);
 
         //print the current leader
diff --git a/apps/test/election/src/main/java/org/onosproject/election/cli/ElectionTestRunCommand.java b/apps/test/election/src/main/java/org/onosproject/election/cli/ElectionTestRunCommand.java
index 983b6d1..ded59b5 100644
--- a/apps/test/election/src/main/java/org/onosproject/election/cli/ElectionTestRunCommand.java
+++ b/apps/test/election/src/main/java/org/onosproject/election/cli/ElectionTestRunCommand.java
@@ -15,13 +15,15 @@
  */
 package org.onosproject.election.cli;
 
-import org.apache.karaf.shell.commands.Command;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.cluster.LeadershipService;
 
 /**
  * CLI command to run for leadership of the Election test application.
  */
+@Service
 @Command(scope = "onos", name = "election-test-run",
         description = "Run for leader of the Election test application")
 public class ElectionTestRunCommand extends AbstractShellCommand {
@@ -29,7 +31,7 @@
     private static final String ELECTION_APP = "org.onosproject.election";
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         LeadershipService service = get(LeadershipService.class);
 
         service.runForLeadership(ELECTION_APP);
diff --git a/apps/test/election/src/main/java/org/onosproject/election/cli/ElectionTestWithdrawCommand.java b/apps/test/election/src/main/java/org/onosproject/election/cli/ElectionTestWithdrawCommand.java
index ee040ae..52cdb4d 100644
--- a/apps/test/election/src/main/java/org/onosproject/election/cli/ElectionTestWithdrawCommand.java
+++ b/apps/test/election/src/main/java/org/onosproject/election/cli/ElectionTestWithdrawCommand.java
@@ -15,7 +15,8 @@
  */
 package org.onosproject.election.cli;
 
-import org.apache.karaf.shell.commands.Command;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.cluster.LeadershipService;
 
@@ -23,6 +24,7 @@
  * CLI command to withdraw the local node from leadership election for
  * the Election test application.
  */
+@Service
 @Command(scope = "onos", name = "election-test-withdraw",
         description = "Withdraw node from leadership election for the Election test application")
 public class ElectionTestWithdrawCommand extends AbstractShellCommand {
@@ -30,7 +32,7 @@
     private static final String ELECTION_APP = "org.onosproject.election";
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         LeadershipService service = get(LeadershipService.class);
 
         service.withdraw(ELECTION_APP);
diff --git a/apps/test/election/src/main/resources/OSGI-INF/blueprint/shell-config.xml b/apps/test/election/src/main/resources/OSGI-INF/blueprint/shell-config.xml
deleted file mode 100644
index 1d2a9ae..0000000
--- a/apps/test/election/src/main/resources/OSGI-INF/blueprint/shell-config.xml
+++ /dev/null
@@ -1,30 +0,0 @@
-<!--
-  ~ Copyright 2015-present Open Networking Foundation
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~     http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License.
-  -->
-<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0">
-
-    <command-bundle xmlns="http://karaf.apache.org/xmlns/shell/v1.1.0">
-        <command>
-            <action class="org.onosproject.election.cli.ElectionTestLeaderCommand"/>
-        </command>
-        <command>
-            <action class="org.onosproject.election.cli.ElectionTestRunCommand"/>
-        </command>
-        <command>
-            <action class="org.onosproject.election.cli.ElectionTestWithdrawCommand"/>
-        </command>
-    </command-bundle>
-
-</blueprint>
diff --git a/apps/test/flow-perf/BUCK b/apps/test/flow-perf/BUCK
deleted file mode 100644
index 522647b..0000000
--- a/apps/test/flow-perf/BUCK
+++ /dev/null
@@ -1,19 +0,0 @@
-COMPILE_DEPS = [
-    '//lib:CORE_DEPS',
-    '//lib:org.apache.karaf.shell.console',
-    '//cli:onos-cli',
-    '//utils/rest:onlab-rest',
-    '//lib:javax.ws.rs-api',
-    '//core/store/serializers:onos-core-serializers',
-]
-
-osgi_jar_with_tests (
-    deps = COMPILE_DEPS,
-)
-
-onos_app (
-    title = 'Flow Performance Test',
-    category = 'Test Utility',
-    url = 'http://onosproject.org',
-    description = 'Messaging performance test application.',
-)
diff --git a/apps/test/flow-perf/src/main/java/org/onosproject/flowperf/FlowPerfApp.java b/apps/test/flow-perf/src/main/java/org/onosproject/flowperf/FlowPerfApp.java
index 9748907..9a6e3a7 100644
--- a/apps/test/flow-perf/src/main/java/org/onosproject/flowperf/FlowPerfApp.java
+++ b/apps/test/flow-perf/src/main/java/org/onosproject/flowperf/FlowPerfApp.java
@@ -15,28 +15,8 @@
  */
 package org.onosproject.flowperf;
 
-import static com.google.common.base.Strings.isNullOrEmpty;
-import static org.apache.felix.scr.annotations.ReferenceCardinality.MANDATORY_UNARY;
-import static org.onlab.util.Tools.get;
-import static org.slf4j.LoggerFactory.getLogger;
-
-import java.util.Dictionary;
-import java.util.Iterator;
-import java.util.List;
-import java.util.concurrent.CountDownLatch;
-import java.util.concurrent.ExecutorService;
-import java.util.concurrent.Executors;
-import java.util.concurrent.atomic.AtomicInteger;
-import java.util.concurrent.atomic.AtomicLong;
-
-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 com.google.common.collect.Iterables;
+import com.google.common.collect.Lists;
 import org.onlab.packet.MacAddress;
 import org.onlab.util.Tools;
 import org.onosproject.cfg.ComponentConfigService;
@@ -56,10 +36,32 @@
 import org.onosproject.net.flow.TrafficTreatment;
 import org.onosproject.net.flow.instructions.Instructions;
 import org.osgi.service.component.ComponentContext;
+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.slf4j.Logger;
 
-import com.google.common.collect.Iterables;
-import com.google.common.collect.Lists;
+import java.util.Dictionary;
+import java.util.Iterator;
+import java.util.List;
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.concurrent.atomic.AtomicInteger;
+import java.util.concurrent.atomic.AtomicLong;
+
+import static com.google.common.base.Strings.isNullOrEmpty;
+import static org.onlab.util.Tools.get;
+import static org.onosproject.flowperf.OsgiPropertyConstants.BATCH_SIZE;
+import static org.onosproject.flowperf.OsgiPropertyConstants.BATCH_SIZE_DEFAULT;
+import static org.onosproject.flowperf.OsgiPropertyConstants.TOTAL_FLOWS;
+import static org.onosproject.flowperf.OsgiPropertyConstants.TOTAL_FLOWS_DEFAULT;
+import static org.onosproject.flowperf.OsgiPropertyConstants.TOTAL_THREADS;
+import static org.onosproject.flowperf.OsgiPropertyConstants.TOTAL_THREADS_DEFAULT;
+import static org.osgi.service.component.annotations.ReferenceCardinality.MANDATORY;
+import static org.slf4j.LoggerFactory.getLogger;
 
 /**
  * Application for measuring flow installation performance.
@@ -67,28 +69,32 @@
  * This application installs a bunch of flows, validates that all those flows have
  * been successfully added and immediately proceeds to remove all the added flows.
  */
-@Component(immediate = true, enabled = true)
-@Service(value = FlowPerfApp.class)
+@Component(
+    immediate = true,
+    service = FlowPerfApp.class,
+    property = {
+        TOTAL_FLOWS + ":Integer=" + TOTAL_FLOWS_DEFAULT,
+        BATCH_SIZE + ":Integer=" + BATCH_SIZE_DEFAULT,
+        TOTAL_THREADS + ":Integer=" + TOTAL_THREADS_DEFAULT
+    }
+)
 public class FlowPerfApp {
     private final Logger log = getLogger(getClass());
 
-    @Reference(cardinality = MANDATORY_UNARY)
+    @Reference(cardinality = MANDATORY)
     protected DeviceService deviceService;
 
-    @Reference(cardinality = MANDATORY_UNARY)
+    @Reference(cardinality = MANDATORY)
     protected FlowRuleService flowRuleService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = MANDATORY)
     protected CoreService coreService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = MANDATORY)
     protected ComponentConfigService configService;
 
     protected ApplicationId appId;
 
-    private static final int DEFAULT_BATCH_SIZE = 200;
-    private static final int DEFAULT_TOTAL_THREADS = 1;
-    private static final int DEFAULT_TOTAL_FLOWS = 100000;
     private AtomicInteger pendingBatchCount;
     private CountDownLatch installationLatch;
     private CountDownLatch uninstallationLatch;
@@ -97,17 +103,14 @@
 
     List<FlowRule> addedRules = Lists.newArrayList();
 
-    @Property(name = "totalFlows", intValue = DEFAULT_TOTAL_FLOWS,
-            label = "Total number of flows")
-    protected int totalFlows = DEFAULT_TOTAL_FLOWS;
+    /** Total number of flows. */
+    private int totalFlows = TOTAL_FLOWS_DEFAULT;
 
-    @Property(name = "batchSize", intValue = DEFAULT_BATCH_SIZE,
-            label = "Number of flows per batch")
-    protected int batchSize = DEFAULT_BATCH_SIZE;
+    /** Number of flows per batch. */
+    private int batchSize = BATCH_SIZE_DEFAULT;
 
-    @Property(name = "totalThreads", intValue = DEFAULT_TOTAL_THREADS,
-            label = "Number of installer threads")
-    protected int totalThreads = DEFAULT_TOTAL_THREADS;
+    /** Number of installer threads. */
+    private int totalThreads = TOTAL_THREADS_DEFAULT;
 
     private ExecutorService installer;
     private ExecutorService testRunner =
@@ -224,9 +227,9 @@
     @Modified
     public void modified(ComponentContext context) {
         if (context == null) {
-            totalFlows = DEFAULT_TOTAL_FLOWS;
-            batchSize = DEFAULT_BATCH_SIZE;
-            totalThreads = DEFAULT_TOTAL_THREADS;
+            totalFlows = TOTAL_FLOWS_DEFAULT;
+            batchSize = BATCH_SIZE_DEFAULT;
+            totalThreads = TOTAL_THREADS_DEFAULT;
             return;
         }
 
@@ -236,15 +239,15 @@
         int newBatchSize = batchSize;
         int newTotalThreads = totalThreads;
         try {
-            String s = get(properties, "batchSize");
+            String s = get(properties, TOTAL_FLOWS);
             newTotalFlows = isNullOrEmpty(s)
                     ? totalFlows : Integer.parseInt(s.trim());
 
-            s = get(properties, "batchSize");
+            s = get(properties, BATCH_SIZE);
             newBatchSize = isNullOrEmpty(s)
                     ? batchSize : Integer.parseInt(s.trim());
 
-            s = get(properties, "totalThreads");
+            s = get(properties, TOTAL_THREADS);
             newTotalThreads = isNullOrEmpty(s)
                     ? totalThreads : Integer.parseInt(s.trim());
 
@@ -268,4 +271,4 @@
             installer = Executors.newFixedThreadPool(totalThreads, Tools.groupedThreads("flow-perf-worker", "%d"));
         }
     }
-}
\ No newline at end of file
+}
diff --git a/apps/test/flow-perf/src/main/java/org/onosproject/flowperf/OsgiPropertyConstants.java b/apps/test/flow-perf/src/main/java/org/onosproject/flowperf/OsgiPropertyConstants.java
new file mode 100644
index 0000000..5eef804
--- /dev/null
+++ b/apps/test/flow-perf/src/main/java/org/onosproject/flowperf/OsgiPropertyConstants.java
@@ -0,0 +1,34 @@
+/*
+ * Copyright 2018-present Open Networking Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.onosproject.flowperf;
+
+/**
+ * Name/Value constants for properties.
+ */
+public final class OsgiPropertyConstants {
+    private OsgiPropertyConstants() {
+    }
+
+    public static final String TOTAL_FLOWS = "totalFlows";
+    public static final int TOTAL_FLOWS_DEFAULT = 100000;
+
+    public static final String BATCH_SIZE = "batchSize";
+    public static final int BATCH_SIZE_DEFAULT = 200;
+
+    public static final String TOTAL_THREADS = "totalThreads";
+    public static final int TOTAL_THREADS_DEFAULT = 1;
+}
diff --git a/apps/test/intent-perf/BUCK b/apps/test/intent-perf/BUCK
deleted file mode 100644
index 6187b8c..0000000
--- a/apps/test/intent-perf/BUCK
+++ /dev/null
@@ -1,21 +0,0 @@
-COMPILE_DEPS = [
-    '//lib:CORE_DEPS',
-    '//lib:JACKSON',
-    '//lib:org.apache.karaf.shell.console',
-    '//cli:onos-cli',
-    '//utils/rest:onlab-rest',
-    '//lib:javax.ws.rs-api',
-    '//core/store/serializers:onos-core-serializers',
-]
-
-osgi_jar_with_tests (
-    deps = COMPILE_DEPS,
-)
-
-onos_app (
-    app_name = 'org.onosproject.intentperf',
-    title = 'Intent Performance Test',
-    category = 'Test Utility',
-    url = 'http://onosproject.org',
-    description = 'Intent performance test application.',
-)
diff --git a/apps/test/intent-perf/BUILD b/apps/test/intent-perf/BUILD
index b5c90d4..81b1845 100644
--- a/apps/test/intent-perf/BUILD
+++ b/apps/test/intent-perf/BUILD
@@ -3,6 +3,7 @@
 ]
 
 osgi_jar_with_tests(
+    karaf_command_packages = ["org.onosproject.intentperf"],
     deps = COMPILE_DEPS,
 )
 
diff --git a/apps/test/intent-perf/src/main/java/org/onosproject/intentperf/IntentPerfCollector.java b/apps/test/intent-perf/src/main/java/org/onosproject/intentperf/IntentPerfCollector.java
index 5efb0b6..763f5de 100644
--- a/apps/test/intent-perf/src/main/java/org/onosproject/intentperf/IntentPerfCollector.java
+++ b/apps/test/intent-perf/src/main/java/org/onosproject/intentperf/IntentPerfCollector.java
@@ -16,12 +16,6 @@
 package org.onosproject.intentperf;
 
 import com.google.common.collect.ImmutableList;
-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.NodeId;
@@ -29,6 +23,11 @@
 import org.onosproject.store.cluster.messaging.ClusterMessage;
 import org.onosproject.store.cluster.messaging.ClusterMessageHandler;
 import org.onosproject.store.cluster.messaging.MessageSubject;
+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.ArrayList;
@@ -44,8 +43,7 @@
 /**
  * Collects and distributes performance samples.
  */
-@Component(immediate = true)
-@Service(value = IntentPerfCollector.class)
+@Component(immediate = true, service = IntentPerfCollector.class)
 public class IntentPerfCollector {
 
     private static final long SAMPLE_TIME_WINDOW_MS = 5_000;
@@ -57,13 +55,13 @@
 
     private static final MessageSubject SAMPLE = new MessageSubject("intent-perf-sample");
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected ClusterCommunicationService communicationService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected ClusterService clusterService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected IntentPerfUi ui;
 
     // Auxiliary structures used to accrue data for normalized time interval
diff --git a/apps/test/intent-perf/src/main/java/org/onosproject/intentperf/IntentPerfInstaller.java b/apps/test/intent-perf/src/main/java/org/onosproject/intentperf/IntentPerfInstaller.java
index 4784475..0b509f4 100644
--- a/apps/test/intent-perf/src/main/java/org/onosproject/intentperf/IntentPerfInstaller.java
+++ b/apps/test/intent-perf/src/main/java/org/onosproject/intentperf/IntentPerfInstaller.java
@@ -21,14 +21,6 @@
 import com.google.common.collect.Multimap;
 import com.google.common.collect.Sets;
 import org.apache.commons.lang.math.RandomUtils;
-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.packet.MacAddress;
 import org.onlab.util.Counter;
 import org.onosproject.cfg.ComponentConfigService;
@@ -52,11 +44,16 @@
 import org.onosproject.net.intent.IntentListener;
 import org.onosproject.net.intent.IntentService;
 import org.onosproject.net.intent.Key;
-import org.onosproject.net.intent.WorkPartitionService;
 import org.onosproject.net.intent.PointToPointIntent;
+import org.onosproject.net.intent.WorkPartitionService;
 import org.onosproject.store.cluster.messaging.ClusterCommunicationService;
 import org.onosproject.store.cluster.messaging.MessageSubject;
 import org.osgi.service.component.ComponentContext;
+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.slf4j.Logger;
 
 import java.util.ArrayList;
@@ -77,27 +74,41 @@
 import static com.google.common.base.Strings.isNullOrEmpty;
 import static java.lang.String.format;
 import static java.lang.System.currentTimeMillis;
-import static org.apache.felix.scr.annotations.ReferenceCardinality.MANDATORY_UNARY;
-import static org.onlab.util.Tools.*;
-import static org.onosproject.net.intent.IntentEvent.Type.*;
+import static org.onlab.util.Tools.delay;
+import static org.onlab.util.Tools.get;
+import static org.onlab.util.Tools.groupedThreads;
+import static org.onosproject.intentperf.OsgiPropertyConstants.CYCLE_PERIOD;
+import static org.onosproject.intentperf.OsgiPropertyConstants.CYCLE_PERIOD_DEFAULT;
+import static org.onosproject.intentperf.OsgiPropertyConstants.NUM_KEYS;
+import static org.onosproject.intentperf.OsgiPropertyConstants.NUM_KEYS_DEFAULT;
+import static org.onosproject.intentperf.OsgiPropertyConstants.NUM_NEIGHBORS;
+import static org.onosproject.intentperf.OsgiPropertyConstants.NUM_NEIGHBORS_DEFAULT;
+import static org.onosproject.intentperf.OsgiPropertyConstants.NUM_WORKERS;
+import static org.onosproject.intentperf.OsgiPropertyConstants.NUM_WORKERS_DEFAULT;
+import static org.onosproject.net.intent.IntentEvent.Type.INSTALLED;
+import static org.onosproject.net.intent.IntentEvent.Type.INSTALL_REQ;
+import static org.onosproject.net.intent.IntentEvent.Type.WITHDRAWN;
+import static org.onosproject.net.intent.IntentEvent.Type.WITHDRAW_REQ;
+import static org.osgi.service.component.annotations.ReferenceCardinality.MANDATORY;
 import static org.slf4j.LoggerFactory.getLogger;
 
 /**
  * Application to test sustained intent throughput.
  */
-@Component(immediate = true)
-@Service(value = IntentPerfInstaller.class)
+@Component(
+    immediate = true,
+    service = IntentPerfInstaller.class,
+    property = {
+        NUM_KEYS + ":Integer=" + NUM_KEYS_DEFAULT,
+        NUM_WORKERS + ":Integer=" + NUM_WORKERS_DEFAULT,
+        CYCLE_PERIOD + ":Integer=" + CYCLE_PERIOD_DEFAULT,
+        NUM_NEIGHBORS + ":Integer=" + NUM_NEIGHBORS_DEFAULT,
+    }
+)
 public class IntentPerfInstaller {
 
     private final Logger log = getLogger(getClass());
 
-    private static final int DEFAULT_NUM_WORKERS = 1;
-
-    private static final int DEFAULT_NUM_KEYS = 40000;
-    private static final int DEFAULT_GOAL_CYCLE_PERIOD = 1000; //ms
-
-    private static final int DEFAULT_NUM_NEIGHBORS = 0;
-
     private static final int START_DELAY = 5_000; // ms
     private static final int REPORT_PERIOD = 1_000; //ms
 
@@ -107,48 +118,43 @@
 
     //FIXME add path length
 
-    @Property(name = "numKeys", intValue = DEFAULT_NUM_KEYS,
-            label = "Number of keys (i.e. unique intents) to generate per instance")
-    private int numKeys = DEFAULT_NUM_KEYS;
+    /** Number of keys (i.e. unique intents) to generate per instance. */
+    private int numKeys = NUM_KEYS_DEFAULT;
 
-    //TODO implement numWorkers property
-//    @Property(name = "numThreads", intValue = DEFAULT_NUM_WORKERS,
-//              label = "Number of installer threads per instance")
-//    private int numWokers = DEFAULT_NUM_WORKERS;
+    /** Number of installer threads per instance. */
+    private int numWorkers = NUM_WORKERS_DEFAULT;
 
-    @Property(name = "cyclePeriod", intValue = DEFAULT_GOAL_CYCLE_PERIOD,
-            label = "Goal for cycle period (in ms)")
-    private int cyclePeriod = DEFAULT_GOAL_CYCLE_PERIOD;
+    /** Goal for cycle period (in ms). */
+    private int cyclePeriod = CYCLE_PERIOD_DEFAULT;
 
-    @Property(name = "numNeighbors", intValue = DEFAULT_NUM_NEIGHBORS,
-            label = "Number of neighbors to generate intents for")
-    private int numNeighbors = DEFAULT_NUM_NEIGHBORS;
+    /** Number of neighbors to generate intents for. */
+    private int numNeighbors = NUM_NEIGHBORS_DEFAULT;
 
-    @Reference(cardinality = MANDATORY_UNARY)
+    @Reference(cardinality = MANDATORY)
     protected CoreService coreService;
 
-    @Reference(cardinality = MANDATORY_UNARY)
+    @Reference(cardinality = MANDATORY)
     protected IntentService intentService;
 
-    @Reference(cardinality = MANDATORY_UNARY)
+    @Reference(cardinality = MANDATORY)
     protected ClusterService clusterService;
 
-    @Reference(cardinality = MANDATORY_UNARY)
+    @Reference(cardinality = MANDATORY)
     protected DeviceService deviceService;
 
-    @Reference(cardinality = MANDATORY_UNARY)
+    @Reference(cardinality = MANDATORY)
     protected MastershipService mastershipService;
 
-    @Reference(cardinality = MANDATORY_UNARY)
+    @Reference(cardinality = MANDATORY)
     protected WorkPartitionService partitionService;
 
-    @Reference(cardinality = MANDATORY_UNARY)
+    @Reference(cardinality = MANDATORY)
     protected ComponentConfigService configService;
 
-    @Reference(cardinality = MANDATORY_UNARY)
+    @Reference(cardinality = MANDATORY)
     protected IntentPerfCollector sampleCollector;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = MANDATORY)
     protected ClusterCommunicationService communicationService;
 
     private ExecutorService messageHandlingExecutor;
@@ -176,7 +182,7 @@
 
         // TODO: replace with shared timer
         reportTimer = new Timer("onos-intent-perf-reporter");
-        workers = Executors.newFixedThreadPool(DEFAULT_NUM_WORKERS, groupedThreads("onos/intent-perf", "worker-%d"));
+        workers = Executors.newFixedThreadPool(numWorkers, groupedThreads("onos/intent-perf", "worker-%d"));
 
         // TODO: replace with shared executor
         messageHandlingExecutor = Executors.newSingleThreadExecutor(
@@ -216,28 +222,33 @@
         }
 
         Dictionary<?, ?> properties = context.getProperties();
-        int newNumKeys, newCyclePeriod, newNumNeighbors;
+        int newNumKeys, newCyclePeriod, newNumNeighbors, newNumWorkers;
         try {
-            String s = get(properties, "numKeys");
+            String s = get(properties, NUM_KEYS);
             newNumKeys = isNullOrEmpty(s) ? numKeys : Integer.parseInt(s.trim());
 
-            s = get(properties, "cyclePeriod");
+            s = get(properties, CYCLE_PERIOD);
             newCyclePeriod = isNullOrEmpty(s) ? cyclePeriod : Integer.parseInt(s.trim());
 
-            s = get(properties, "numNeighbors");
+            s = get(properties, NUM_NEIGHBORS);
             newNumNeighbors = isNullOrEmpty(s) ? numNeighbors : Integer.parseInt(s.trim());
 
+            s = get(properties, NUM_WORKERS);
+            newNumWorkers = isNullOrEmpty(s) ? numWorkers : Integer.parseInt(s.trim());
+
         } catch (NumberFormatException | ClassCastException e) {
             log.warn("Malformed configuration detected; using defaults", e);
-            newNumKeys = DEFAULT_NUM_KEYS;
-            newCyclePeriod = DEFAULT_GOAL_CYCLE_PERIOD;
-            newNumNeighbors = DEFAULT_NUM_NEIGHBORS;
+            newNumKeys = NUM_KEYS_DEFAULT;
+            newCyclePeriod = CYCLE_PERIOD_DEFAULT;
+            newNumNeighbors = NUM_NEIGHBORS_DEFAULT;
+            newNumWorkers = NUM_WORKERS_DEFAULT;
         }
 
         if (newNumKeys != numKeys || newCyclePeriod != cyclePeriod || newNumNeighbors != numNeighbors) {
             numKeys = newNumKeys;
             cyclePeriod = newCyclePeriod;
             numNeighbors = newNumNeighbors;
+            numWorkers = newNumWorkers;
             logConfig("Reconfigured");
         }
     }
@@ -276,7 +287,7 @@
 
         // Submit workers
         stopped = false;
-        for (int i = 0; i < DEFAULT_NUM_WORKERS; i++) {
+        for (int i = 0; i < numWorkers; i++) {
             workers.submit(new Submitter(createIntents(numKeys, /*FIXME*/ 2, lastKey)));
         }
         log.info("Started test run");
diff --git a/apps/test/intent-perf/src/main/java/org/onosproject/intentperf/IntentPerfListCommand.java b/apps/test/intent-perf/src/main/java/org/onosproject/intentperf/IntentPerfListCommand.java
index 7c35918..28dfb35 100644
--- a/apps/test/intent-perf/src/main/java/org/onosproject/intentperf/IntentPerfListCommand.java
+++ b/apps/test/intent-perf/src/main/java/org/onosproject/intentperf/IntentPerfListCommand.java
@@ -15,8 +15,9 @@
  */
 package org.onosproject.intentperf;
 
-import org.apache.karaf.shell.commands.Command;
-import org.apache.karaf.shell.commands.Option;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.Option;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.intentperf.IntentPerfCollector.Sample;
 
@@ -27,6 +28,7 @@
 /**
  * Displays accumulated performance metrics.
  */
+@Service
 @Command(scope = "onos", name = "intent-perf",
         description = "Displays accumulated performance metrics")
 public class IntentPerfListCommand extends AbstractShellCommand {
@@ -36,7 +38,7 @@
     private boolean summary = false;
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         if (summary) {
             printSummary();
         } else {
diff --git a/apps/test/intent-perf/src/main/java/org/onosproject/intentperf/IntentPerfStartCommand.java b/apps/test/intent-perf/src/main/java/org/onosproject/intentperf/IntentPerfStartCommand.java
index c52b0eb..77f5081 100644
--- a/apps/test/intent-perf/src/main/java/org/onosproject/intentperf/IntentPerfStartCommand.java
+++ b/apps/test/intent-perf/src/main/java/org/onosproject/intentperf/IntentPerfStartCommand.java
@@ -15,18 +15,20 @@
  */
 package org.onosproject.intentperf;
 
-import org.apache.karaf.shell.commands.Command;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.cli.AbstractShellCommand;
 
 /**
  * Starts intent performance test run.
  */
+@Service
 @Command(scope = "onos", name = "intent-perf-start",
         description = "Starts intent performance test run")
 public class IntentPerfStartCommand extends AbstractShellCommand {
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         get(IntentPerfInstaller.class).start();
     }
 
diff --git a/apps/test/intent-perf/src/main/java/org/onosproject/intentperf/IntentPerfStopCommand.java b/apps/test/intent-perf/src/main/java/org/onosproject/intentperf/IntentPerfStopCommand.java
index b31ad1b..b938430 100644
--- a/apps/test/intent-perf/src/main/java/org/onosproject/intentperf/IntentPerfStopCommand.java
+++ b/apps/test/intent-perf/src/main/java/org/onosproject/intentperf/IntentPerfStopCommand.java
@@ -15,18 +15,20 @@
  */
 package org.onosproject.intentperf;
 
-import org.apache.karaf.shell.commands.Command;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.cli.AbstractShellCommand;
 
 /**
  * Stops intent performance test run.
  */
+@Service
 @Command(scope = "onos", name = "intent-perf-stop",
         description = "Stops intent performance test run")
 public class IntentPerfStopCommand extends AbstractShellCommand {
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         get(IntentPerfInstaller.class).stop();
     }
 
diff --git a/apps/test/intent-perf/src/main/java/org/onosproject/intentperf/IntentPerfUi.java b/apps/test/intent-perf/src/main/java/org/onosproject/intentperf/IntentPerfUi.java
index a62d9ec..afb55a8 100644
--- a/apps/test/intent-perf/src/main/java/org/onosproject/intentperf/IntentPerfUi.java
+++ b/apps/test/intent-perf/src/main/java/org/onosproject/intentperf/IntentPerfUi.java
@@ -19,12 +19,6 @@
 import com.fasterxml.jackson.databind.node.ObjectNode;
 import com.google.common.collect.ImmutableList;
 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.apache.felix.scr.annotations.Service;
 import org.onlab.osgi.ServiceDirectory;
 import org.onosproject.intentperf.IntentPerfCollector.Sample;
 import org.onosproject.ui.RequestHandler;
@@ -33,6 +27,11 @@
 import org.onosproject.ui.UiExtensionService;
 import org.onosproject.ui.UiMessageHandler;
 import org.onosproject.ui.UiView;
+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 java.util.Collection;
 import java.util.HashSet;
@@ -45,14 +44,13 @@
 /**
  * Mechanism to stream data to the GUI.
  */
-@Component(immediate = true, enabled = true)
-@Service(value = IntentPerfUi.class)
+@Component(immediate = true, service = IntentPerfUi.class)
 public class IntentPerfUi {
 
     private static final String INTENT_PERF_START = "intentPerfStart";
     private static final String INTENT_PERF_STOP = "intentPerfStop";
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected UiExtensionService uiExtensionService;
 
     private final Set<StreamingControl> handlers = synchronizedSet(new HashSet<>());
diff --git a/apps/test/intent-perf/src/main/java/org/onosproject/intentperf/OsgiPropertyConstants.java b/apps/test/intent-perf/src/main/java/org/onosproject/intentperf/OsgiPropertyConstants.java
new file mode 100644
index 0000000..aed36a7
--- /dev/null
+++ b/apps/test/intent-perf/src/main/java/org/onosproject/intentperf/OsgiPropertyConstants.java
@@ -0,0 +1,37 @@
+/*
+ * Copyright 2018-present Open Networking Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.onosproject.intentperf;
+
+/**
+ * Name/Value constants for properties.
+ */
+public final class OsgiPropertyConstants {
+    private OsgiPropertyConstants() {
+    }
+
+    public static final String NUM_KEYS = "numKeys";
+    public static final int NUM_KEYS_DEFAULT = 40000;
+
+    public static final String NUM_WORKERS = "numWorkers";
+    public static final int NUM_WORKERS_DEFAULT = 1;
+
+    public static final String CYCLE_PERIOD = "cyclePeriod";
+    public static final int CYCLE_PERIOD_DEFAULT = 1000; //ms
+
+    public static final String NUM_NEIGHBORS = "numNeighbors";
+    public static final int NUM_NEIGHBORS_DEFAULT = 0;
+}
diff --git a/apps/test/intent-perf/src/main/resources/OSGI-INF/blueprint/shell-config.xml b/apps/test/intent-perf/src/main/resources/OSGI-INF/blueprint/shell-config.xml
deleted file mode 100644
index 4fd80c7..0000000
--- a/apps/test/intent-perf/src/main/resources/OSGI-INF/blueprint/shell-config.xml
+++ /dev/null
@@ -1,28 +0,0 @@
-<!--
-  ~ Copyright 2015-present Open Networking Foundation
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~     http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License.
-  -->
-<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0">
-    <command-bundle xmlns="http://karaf.apache.org/xmlns/shell/v1.1.0">
-        <command>
-            <action class="org.onosproject.intentperf.IntentPerfListCommand"/>
-        </command>
-        <command>
-            <action class="org.onosproject.intentperf.IntentPerfStartCommand"/>
-        </command>
-        <command>
-            <action class="org.onosproject.intentperf.IntentPerfStopCommand"/>
-        </command>
-    </command-bundle>
-</blueprint>
diff --git a/apps/test/loadtest/BUCK b/apps/test/loadtest/BUCK
deleted file mode 100644
index 93f15ff..0000000
--- a/apps/test/loadtest/BUCK
+++ /dev/null
@@ -1,19 +0,0 @@
-COMPILE_DEPS = [
-    '//lib:CORE_DEPS',
-    '//lib:org.apache.karaf.shell.console',
-    '//cli:onos-cli',
-    '//utils/rest:onlab-rest',
-    '//lib:javax.ws.rs-api',
-    '//core/store/serializers:onos-core-serializers',
-]
-
-osgi_jar_with_tests (
-    deps = COMPILE_DEPS,
-)
-
-onos_app (
-    title = 'Distributed Load Test',
-    category = 'Test Utility',
-    url = 'http://onosproject.org',
-    description = 'Distributed consensus load test application.',
-)
diff --git a/apps/test/loadtest/src/main/java/org/onosproject/loadtest/DistributedConsensusLoadTest.java b/apps/test/loadtest/src/main/java/org/onosproject/loadtest/DistributedConsensusLoadTest.java
index 37a36c3..3f8dbaf 100644
--- a/apps/test/loadtest/src/main/java/org/onosproject/loadtest/DistributedConsensusLoadTest.java
+++ b/apps/test/loadtest/src/main/java/org/onosproject/loadtest/DistributedConsensusLoadTest.java
@@ -15,9 +15,23 @@
  */
 package org.onosproject.loadtest;
 
-import static com.google.common.base.Strings.isNullOrEmpty;
-import static org.onlab.util.Tools.get;
-import static org.slf4j.LoggerFactory.getLogger;
+import com.google.common.collect.Lists;
+import com.google.common.util.concurrent.RateLimiter;
+import org.apache.commons.lang.math.RandomUtils;
+import org.onlab.util.Tools;
+import org.onosproject.cfg.ComponentConfigService;
+import org.onosproject.core.ApplicationId;
+import org.onosproject.core.CoreService;
+import org.onosproject.store.service.AsyncAtomicCounter;
+import org.onosproject.store.service.StorageService;
+import org.osgi.service.component.ComponentContext;
+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.Dictionary;
 import java.util.List;
@@ -30,57 +44,45 @@
 import java.util.concurrent.atomic.AtomicLong;
 import java.util.stream.Collectors;
 
-import org.apache.commons.lang.math.RandomUtils;
-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.util.Tools;
-import org.onosproject.cfg.ComponentConfigService;
-import org.onosproject.core.ApplicationId;
-import org.onosproject.core.CoreService;
-import org.onosproject.store.service.AsyncAtomicCounter;
-import org.onosproject.store.service.StorageService;
-import org.osgi.service.component.ComponentContext;
-import org.slf4j.Logger;
-
-import com.google.common.collect.Lists;
-import com.google.common.util.concurrent.RateLimiter;
+import static com.google.common.base.Strings.isNullOrEmpty;
+import static org.onlab.util.Tools.get;
+import static org.onosproject.loadtest.OsgiPropertyConstants.RATE;
+import static org.onosproject.loadtest.OsgiPropertyConstants.RATE_DEFAULT;
+import static org.slf4j.LoggerFactory.getLogger;
 
 /**
  * Simple application for load testing distributed consensus.
  * <p>
  * This application simply increments as {@link AsyncAtomicCounter} at a configurable rate.
  */
-@Component(immediate = true)
-@Service(value = DistributedConsensusLoadTest.class)
+@Component(
+    immediate = true,
+    service = DistributedConsensusLoadTest.class,
+    property = {
+        RATE + ":Integer=" + RATE_DEFAULT
+    }
+)
 public class DistributedConsensusLoadTest {
 
     private final Logger log = getLogger(getClass());
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected ComponentConfigService configService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected StorageService storageService;
 
     private ApplicationId appId;
 
     private AtomicBoolean stopped = new AtomicBoolean(false);
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected CoreService coreService;
 
-    private static final int DEFAULT_RATE = 100;
     private static final int TOTAL_COUNTERS = 50;
 
-    @Property(name = "rate", intValue = DEFAULT_RATE,
-            label = "Total number of increments per second to the atomic counter")
-    protected int rate = 0;
+    /** Total number of increments per second to the atomic counter. */
+    protected int rate = RATE_DEFAULT;
 
     private final AtomicLong previousReportTime = new AtomicLong(0);
     private final AtomicLong previousCount = new AtomicLong(0);
@@ -149,11 +151,11 @@
 
     @Modified
     public void modified(ComponentContext context) {
-        int newRate = DEFAULT_RATE;
+        int newRate = RATE_DEFAULT;
         if (context != null) {
             Dictionary properties = context.getProperties();
             try {
-                String s = get(properties, "rate");
+                String s = get(properties, RATE);
                 newRate = isNullOrEmpty(s)
                         ? rate : Integer.parseInt(s.trim());
             } catch (Exception e) {
diff --git a/apps/test/loadtest/src/main/java/org/onosproject/loadtest/OsgiPropertyConstants.java b/apps/test/loadtest/src/main/java/org/onosproject/loadtest/OsgiPropertyConstants.java
new file mode 100644
index 0000000..930945b
--- /dev/null
+++ b/apps/test/loadtest/src/main/java/org/onosproject/loadtest/OsgiPropertyConstants.java
@@ -0,0 +1,29 @@
+/*
+ * Copyright 2018-present Open Networking Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.onosproject.loadtest;
+
+/**
+ * Name/Value constants for properties.
+ */
+public final class OsgiPropertyConstants {
+    private OsgiPropertyConstants() {
+    }
+
+    public static final String RATE = "rate";
+    public static final int RATE_DEFAULT = 100;
+
+}
diff --git a/apps/test/messaging-perf/BUCK b/apps/test/messaging-perf/BUCK
deleted file mode 100644
index 9b12fd2..0000000
--- a/apps/test/messaging-perf/BUCK
+++ /dev/null
@@ -1,20 +0,0 @@
-COMPILE_DEPS = [
-    '//lib:CORE_DEPS',
-    '//lib:KRYO',
-    '//lib:org.apache.karaf.shell.console',
-    '//cli:onos-cli',
-    '//utils/rest:onlab-rest',
-    '//lib:javax.ws.rs-api',
-    '//core/store/serializers:onos-core-serializers',
-]
-
-osgi_jar_with_tests (
-    deps = COMPILE_DEPS,
-)
-
-onos_app (
-    title = 'Messaging Performance Test',
-    category = 'Test Utility',
-    url = 'http://onosproject.org',
-    description = 'Messaging performance test application.',
-)
diff --git a/apps/test/messaging-perf/src/main/java/org/onosproject/messagingperf/MessagingPerfApp.java b/apps/test/messaging-perf/src/main/java/org/onosproject/messagingperf/MessagingPerfApp.java
index de739cc..f37b19a 100644
--- a/apps/test/messaging-perf/src/main/java/org/onosproject/messagingperf/MessagingPerfApp.java
+++ b/apps/test/messaging-perf/src/main/java/org/onosproject/messagingperf/MessagingPerfApp.java
@@ -15,6 +15,29 @@
  */
 package org.onosproject.messagingperf;
 
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableSet;
+import com.google.common.collect.Lists;
+import com.google.common.collect.Sets;
+import com.google.common.util.concurrent.MoreExecutors;
+import org.onlab.util.BoundedThreadPool;
+import org.onlab.util.KryoNamespace;
+import org.onosproject.cfg.ComponentConfigService;
+import org.onosproject.cluster.ClusterService;
+import org.onosproject.cluster.NodeId;
+import org.onosproject.core.CoreService;
+import org.onosproject.store.cluster.messaging.ClusterCommunicationService;
+import org.onosproject.store.cluster.messaging.MessageSubject;
+import org.onosproject.store.serializers.KryoNamespaces;
+import org.onosproject.store.service.Serializer;
+import org.osgi.service.component.ComponentContext;
+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.slf4j.Logger;
+
 import java.util.Dictionary;
 import java.util.List;
 import java.util.Objects;
@@ -29,57 +52,46 @@
 import java.util.function.Function;
 import java.util.stream.IntStream;
 
-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.util.BoundedThreadPool;
-import org.onlab.util.KryoNamespace;
-import org.onosproject.cfg.ComponentConfigService;
-import org.onosproject.cluster.ClusterService;
-import org.onosproject.cluster.NodeId;
-import org.onosproject.core.CoreService;
-import org.onosproject.store.cluster.messaging.ClusterCommunicationService;
-import org.onosproject.store.cluster.messaging.MessageSubject;
-import org.onosproject.store.serializers.KryoNamespaces;
-import org.onosproject.store.service.Serializer;
-import org.osgi.service.component.ComponentContext;
-import org.slf4j.Logger;
-
-import com.google.common.collect.ImmutableList;
-import com.google.common.collect.ImmutableSet;
-import com.google.common.collect.Lists;
-import com.google.common.collect.Sets;
-import com.google.common.util.concurrent.MoreExecutors;
-
 import static com.google.common.base.Strings.isNullOrEmpty;
-import static org.apache.felix.scr.annotations.ReferenceCardinality.MANDATORY_UNARY;
 import static org.onlab.util.Tools.get;
 import static org.onlab.util.Tools.groupedThreads;
+import static org.onosproject.messagingperf.OsgiPropertyConstants.RECEIVER_THREAD_POOL_SIZE;
+import static org.onosproject.messagingperf.OsgiPropertyConstants.RECEIVER_THREAD_POOL_SIZE_DEFAULT;
+import static org.onosproject.messagingperf.OsgiPropertyConstants.RECEIVE_ON_IO_LOOP_THREAD;
+import static org.onosproject.messagingperf.OsgiPropertyConstants.RECEIVE_ON_IO_LOOP_THREAD_DEFAULT;
+import static org.onosproject.messagingperf.OsgiPropertyConstants.SENDER_THREAD_POOL_SIZE;
+import static org.onosproject.messagingperf.OsgiPropertyConstants.SENDER_THREAD_POOL_SIZE_DEFAULT;
+import static org.onosproject.messagingperf.OsgiPropertyConstants.SERIALIZATION_ON;
+import static org.onosproject.messagingperf.OsgiPropertyConstants.SERIALIZATION_ON_DEFAULT;
+import static org.osgi.service.component.annotations.ReferenceCardinality.MANDATORY;
 import static org.slf4j.LoggerFactory.getLogger;
 
 /**
  * Application for measuring cluster messaging performance.
  */
-@Component(immediate = true, enabled = true)
-@Service(value = MessagingPerfApp.class)
+@Component(
+    immediate = true,
+    service = MessagingPerfApp.class,
+    property = {
+        SENDER_THREAD_POOL_SIZE + ":Integer=" + SENDER_THREAD_POOL_SIZE_DEFAULT,
+        RECEIVER_THREAD_POOL_SIZE + ":Integer=" + RECEIVER_THREAD_POOL_SIZE_DEFAULT,
+        SERIALIZATION_ON + ":Boolean=" + SERIALIZATION_ON_DEFAULT,
+        RECEIVE_ON_IO_LOOP_THREAD + ":Boolean=" + RECEIVE_ON_IO_LOOP_THREAD_DEFAULT
+    }
+)
 public class MessagingPerfApp {
     private final Logger log = getLogger(getClass());
 
-    @Reference(cardinality = MANDATORY_UNARY)
+    @Reference(cardinality = MANDATORY)
     protected ClusterService clusterService;
 
-    @Reference(cardinality = MANDATORY_UNARY)
+    @Reference(cardinality = MANDATORY)
     protected ClusterCommunicationService communicationService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = MANDATORY)
     protected CoreService coreService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = MANDATORY)
     protected ComponentConfigService configService;
 
     private static final MessageSubject TEST_UNICAST_MESSAGE_TOPIC =
@@ -88,26 +100,19 @@
     private static final MessageSubject TEST_REQUEST_REPLY_TOPIC =
             new MessageSubject("net-perf-rr-message");
 
-    private static final int DEFAULT_SENDER_THREAD_POOL_SIZE = 2;
-    private static final int DEFAULT_RECEIVER_THREAD_POOL_SIZE = 2;
+    /** Number of sender threads. */
+    private int totalSenderThreads = SENDER_THREAD_POOL_SIZE_DEFAULT;
 
-    @Property(name = "totalSenderThreads", intValue = DEFAULT_SENDER_THREAD_POOL_SIZE,
-            label = "Number of sender threads")
-    protected int totalSenderThreads = DEFAULT_SENDER_THREAD_POOL_SIZE;
+    /** Number of receiver threads. */
+    private int totalReceiverThreads = RECEIVER_THREAD_POOL_SIZE_DEFAULT;
 
-    @Property(name = "totalReceiverThreads", intValue = DEFAULT_RECEIVER_THREAD_POOL_SIZE,
-            label = "Number of receiver threads")
-    protected int totalReceiverThreads = DEFAULT_RECEIVER_THREAD_POOL_SIZE;
+    /** Turn serialization on/off. */
+    private boolean serializationOn = SERIALIZATION_ON_DEFAULT;
 
-    @Property(name = "serializationOn", boolValue = true,
-            label = "Turn serialization on/off")
-    private boolean serializationOn = true;
+    /** Set this to true to handle message on IO thread. */
+    private boolean receiveOnIOLoopThread = RECEIVE_ON_IO_LOOP_THREAD_DEFAULT;
 
-    @Property(name = "receiveOnIOLoopThread", boolValue = false,
-            label = "Set this to true to handle message on IO thread")
-    private boolean receiveOnIOLoopThread = false;
-
-    protected int reportIntervalSeconds = 1;
+    private int reportIntervalSeconds = 1;
 
     private Executor messageReceivingExecutor;
 
@@ -172,8 +177,8 @@
     @Modified
     public void modified(ComponentContext context) {
         if (context == null) {
-            totalSenderThreads = DEFAULT_SENDER_THREAD_POOL_SIZE;
-            totalReceiverThreads = DEFAULT_RECEIVER_THREAD_POOL_SIZE;
+            totalSenderThreads = SENDER_THREAD_POOL_SIZE_DEFAULT;
+            totalReceiverThreads = RECEIVER_THREAD_POOL_SIZE_DEFAULT;
             serializationOn = true;
             receiveOnIOLoopThread = false;
             return;
@@ -186,19 +191,19 @@
         boolean newSerializationOn = serializationOn;
         boolean newReceiveOnIOLoopThread = receiveOnIOLoopThread;
         try {
-            String s = get(properties, "totalSenderThreads");
+            String s = get(properties, SENDER_THREAD_POOL_SIZE);
             newTotalSenderThreads = isNullOrEmpty(s)
                     ? totalSenderThreads : Integer.parseInt(s.trim());
 
-            s = get(properties, "totalReceiverThreads");
+            s = get(properties, RECEIVER_THREAD_POOL_SIZE);
             newTotalReceiverThreads = isNullOrEmpty(s)
                     ? totalReceiverThreads : Integer.parseInt(s.trim());
 
-            s = get(properties, "serializationOn");
+            s = get(properties, SERIALIZATION_ON);
             newSerializationOn = isNullOrEmpty(s)
                     ? serializationOn : Boolean.parseBoolean(s.trim());
 
-            s = get(properties, "receiveOnIOLoopThread");
+            s = get(properties, RECEIVE_ON_IO_LOOP_THREAD);
             newReceiveOnIOLoopThread = isNullOrEmpty(s)
                     ? receiveOnIOLoopThread : Boolean.parseBoolean(s.trim());
 
diff --git a/apps/test/messaging-perf/src/main/java/org/onosproject/messagingperf/OsgiPropertyConstants.java b/apps/test/messaging-perf/src/main/java/org/onosproject/messagingperf/OsgiPropertyConstants.java
new file mode 100644
index 0000000..7fffad4
--- /dev/null
+++ b/apps/test/messaging-perf/src/main/java/org/onosproject/messagingperf/OsgiPropertyConstants.java
@@ -0,0 +1,37 @@
+/*
+ * Copyright 2018-present Open Networking Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.onosproject.messagingperf;
+
+/**
+ * Name/Value constants for properties.
+ */
+public final class OsgiPropertyConstants {
+    private OsgiPropertyConstants() {
+    }
+
+    public static final String SENDER_THREAD_POOL_SIZE = "totalSenderThreads";
+    public static final int SENDER_THREAD_POOL_SIZE_DEFAULT = 2;
+
+    public static final String RECEIVER_THREAD_POOL_SIZE = "totalReceiverThreads";
+    public static final int RECEIVER_THREAD_POOL_SIZE_DEFAULT = 2;
+
+    public static final String SERIALIZATION_ON = "serializationOn";
+    public static final boolean SERIALIZATION_ON_DEFAULT = true;
+
+    public static final String RECEIVE_ON_IO_LOOP_THREAD = "receiveOnIOLoopThread";
+    public static final boolean RECEIVE_ON_IO_LOOP_THREAD_DEFAULT = false;
+}
diff --git a/apps/test/netcfg-monitor/BUCK b/apps/test/netcfg-monitor/BUCK
deleted file mode 100644
index f6051d9..0000000
--- a/apps/test/netcfg-monitor/BUCK
+++ /dev/null
@@ -1,14 +0,0 @@
-COMPILE_DEPS = [
-    '//lib:CORE_DEPS',
-]
-
-osgi_jar_with_tests (
-    deps = COMPILE_DEPS,
-)
-
-onos_app (
-    title = 'Network Configuration Monitor Test',
-    category = 'Test Utility',
-    url = 'http://onosproject.org',
-    description = 'Network configuration monitor test application.',
-)
diff --git a/apps/test/netcfg-monitor/src/main/java/org/onosproject/netcfgmonitor/NetCfgEventMonitor.java b/apps/test/netcfg-monitor/src/main/java/org/onosproject/netcfgmonitor/NetCfgEventMonitor.java
index eb4c299..03ee8ba 100644
--- a/apps/test/netcfg-monitor/src/main/java/org/onosproject/netcfgmonitor/NetCfgEventMonitor.java
+++ b/apps/test/netcfg-monitor/src/main/java/org/onosproject/netcfgmonitor/NetCfgEventMonitor.java
@@ -16,10 +16,10 @@
 
 package org.onosproject.netcfgmonitor;
 
-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.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.onosproject.net.config.NetworkConfigEvent;
 import org.onosproject.net.config.NetworkConfigListener;
 import org.onosproject.net.config.NetworkConfigService;
diff --git a/apps/test/primitive-perf/BUCK b/apps/test/primitive-perf/BUCK
deleted file mode 100644
index be70e00..0000000
--- a/apps/test/primitive-perf/BUCK
+++ /dev/null
@@ -1,20 +0,0 @@
-COMPILE_DEPS = [
-    '//lib:CORE_DEPS',
-    '//lib:org.apache.karaf.shell.console',
-    '//cli:onos-cli',
-    '//utils/rest:onlab-rest',
-    '//lib:javax.ws.rs-api',
-    '//core/store/serializers:onos-core-serializers',
-]
-
-osgi_jar_with_tests (
-    deps = COMPILE_DEPS,
-)
-
-onos_app (
-    app_name = 'org.onosproject.primitiveperf',
-    title = 'Primitive Performance Test',
-    category = 'Test Utility',
-    url = 'http://onosproject.org',
-    description = 'Primitive performance test application.',
-)
diff --git a/apps/test/primitive-perf/BUILD b/apps/test/primitive-perf/BUILD
index c562aa4..662023b 100644
--- a/apps/test/primitive-perf/BUILD
+++ b/apps/test/primitive-perf/BUILD
@@ -3,6 +3,7 @@
 ]
 
 osgi_jar_with_tests(
+    karaf_command_packages = ["org.onosproject.primitiveperf"],
     deps = COMPILE_DEPS,
 )
 
diff --git a/apps/test/primitive-perf/src/main/java/org/onosproject/primitiveperf/OsgiPropertyConstants.java b/apps/test/primitive-perf/src/main/java/org/onosproject/primitiveperf/OsgiPropertyConstants.java
new file mode 100644
index 0000000..186c7ee
--- /dev/null
+++ b/apps/test/primitive-perf/src/main/java/org/onosproject/primitiveperf/OsgiPropertyConstants.java
@@ -0,0 +1,50 @@
+/*
+ * Copyright 2018-present Open Networking Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.onosproject.primitiveperf;
+
+/**
+ * Name/Value constants for properties.
+ */
+public final class OsgiPropertyConstants {
+    private OsgiPropertyConstants() {
+    }
+
+    public static final String NUM_CLIENTS = "numClients";
+    public static final int NUM_CLIENTS_DEFAULT = 8;
+
+    public static final String WRITE_PERCENTAGE = "writePercentage";
+    public static final int WRITE_PERCENTAGE_DEFAULT = 100;
+
+    public static final String NUM_KEYS = "numKeys";
+    public static final int NUM_KEYS_DEFAULT = 100000;
+
+    public static final String KEY_LENGTH = "keyLength";
+    public static final int KEY_LENGTH_DEFAULT = 32;
+
+    public static final String NUM_UNIQUE_VALUES = "numValues";
+    public static final int NUM_UNIQUE_VALUES_DEFAULT = 100;
+
+    public static final String VALUE_LENGTH = "valueLength";
+    public static final int VALUE_LENGTH_DEFAULT = 1024;
+
+    public static final String INCLUDE_EVENTS = "includeEvents";
+    public static final boolean INCLUDE_EVENTS_DEFAULT = false;
+
+    public static final String DETERMINISTIC = "deterministic";
+    public static final boolean DETERMINISTIC_DEFAULT = true;
+
+}
diff --git a/apps/test/primitive-perf/src/main/java/org/onosproject/primitiveperf/PrimitivePerfApp.java b/apps/test/primitive-perf/src/main/java/org/onosproject/primitiveperf/PrimitivePerfApp.java
index 4a36ebe..5d9257b 100644
--- a/apps/test/primitive-perf/src/main/java/org/onosproject/primitiveperf/PrimitivePerfApp.java
+++ b/apps/test/primitive-perf/src/main/java/org/onosproject/primitiveperf/PrimitivePerfApp.java
@@ -15,6 +15,25 @@
  */
 package org.onosproject.primitiveperf;
 
+import com.google.common.collect.Lists;
+import org.onosproject.cfg.ComponentConfigService;
+import org.onosproject.cluster.ClusterService;
+import org.onosproject.cluster.ControllerNode;
+import org.onosproject.cluster.NodeId;
+import org.onosproject.store.serializers.KryoNamespaces;
+import org.onosproject.store.service.AtomicValue;
+import org.onosproject.store.service.AtomicValueEventListener;
+import org.onosproject.store.service.ConsistentMap;
+import org.onosproject.store.service.Serializer;
+import org.onosproject.store.service.StorageService;
+import org.osgi.service.component.ComponentContext;
+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.slf4j.Logger;
+
 import java.util.ArrayList;
 import java.util.Dictionary;
 import java.util.List;
@@ -28,115 +47,88 @@
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.atomic.AtomicLong;
 
-import com.google.common.collect.Lists;
-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.Service;
-import org.onosproject.cfg.ComponentConfigService;
-import org.onosproject.cluster.ClusterService;
-import org.onosproject.cluster.ControllerNode;
-import org.onosproject.cluster.NodeId;
-import org.onosproject.store.serializers.KryoNamespaces;
-import org.onosproject.store.service.AtomicValue;
-import org.onosproject.store.service.AtomicValueEventListener;
-import org.onosproject.store.service.ConsistentMap;
-import org.onosproject.store.service.Serializer;
-import org.onosproject.store.service.StorageService;
-import org.osgi.service.component.ComponentContext;
-import org.slf4j.Logger;
-
 import static com.google.common.base.Strings.isNullOrEmpty;
 import static java.lang.System.currentTimeMillis;
-import static org.apache.felix.scr.annotations.ReferenceCardinality.MANDATORY_UNARY;
 import static org.onlab.util.Tools.get;
 import static org.onlab.util.Tools.groupedThreads;
+import static org.onosproject.primitiveperf.OsgiPropertyConstants.DETERMINISTIC;
+import static org.onosproject.primitiveperf.OsgiPropertyConstants.DETERMINISTIC_DEFAULT;
+import static org.onosproject.primitiveperf.OsgiPropertyConstants.INCLUDE_EVENTS;
+import static org.onosproject.primitiveperf.OsgiPropertyConstants.INCLUDE_EVENTS_DEFAULT;
+import static org.onosproject.primitiveperf.OsgiPropertyConstants.KEY_LENGTH;
+import static org.onosproject.primitiveperf.OsgiPropertyConstants.KEY_LENGTH_DEFAULT;
+import static org.onosproject.primitiveperf.OsgiPropertyConstants.NUM_CLIENTS;
+import static org.onosproject.primitiveperf.OsgiPropertyConstants.NUM_CLIENTS_DEFAULT;
+import static org.onosproject.primitiveperf.OsgiPropertyConstants.NUM_KEYS;
+import static org.onosproject.primitiveperf.OsgiPropertyConstants.NUM_KEYS_DEFAULT;
+import static org.onosproject.primitiveperf.OsgiPropertyConstants.NUM_UNIQUE_VALUES;
+import static org.onosproject.primitiveperf.OsgiPropertyConstants.NUM_UNIQUE_VALUES_DEFAULT;
+import static org.onosproject.primitiveperf.OsgiPropertyConstants.VALUE_LENGTH;
+import static org.onosproject.primitiveperf.OsgiPropertyConstants.VALUE_LENGTH_DEFAULT;
+import static org.onosproject.primitiveperf.OsgiPropertyConstants.WRITE_PERCENTAGE;
+import static org.onosproject.primitiveperf.OsgiPropertyConstants.WRITE_PERCENTAGE_DEFAULT;
+import static org.osgi.service.component.annotations.ReferenceCardinality.MANDATORY;
 import static org.slf4j.LoggerFactory.getLogger;
 
 /**
  * Application to test sustained primitive throughput.
  */
-@Component(immediate = true)
-@Service(value = PrimitivePerfApp.class)
+@Component(
+    immediate = true,
+    service = PrimitivePerfApp.class,
+    property = {
+        NUM_CLIENTS + ":Integer=" + NUM_CLIENTS_DEFAULT,
+        WRITE_PERCENTAGE + ":Integer=" + WRITE_PERCENTAGE_DEFAULT,
+        NUM_KEYS + ":Integer=" + NUM_KEYS_DEFAULT,
+        KEY_LENGTH + ":Integer=" + KEY_LENGTH_DEFAULT,
+        NUM_UNIQUE_VALUES + ":Integer=" + NUM_UNIQUE_VALUES_DEFAULT,
+        VALUE_LENGTH + ":Integer=" + VALUE_LENGTH_DEFAULT,
+        INCLUDE_EVENTS + ":Boolean=" + INCLUDE_EVENTS_DEFAULT,
+        DETERMINISTIC + ":Boolean=" + DETERMINISTIC_DEFAULT,
+    }
+)
 public class PrimitivePerfApp {
 
     private final Logger log = getLogger(getClass());
 
-    private static final int DEFAULT_NUM_CLIENTS = 8;
-    private static final int DEFAULT_WRITE_PERCENTAGE = 100;
-
-    private static final int DEFAULT_NUM_KEYS = 100_000;
-    private static final int DEFAULT_KEY_LENGTH = 32;
-    private static final int DEFAULT_NUM_UNIQUE_VALUES = 100;
-    private static final int DEFAULT_VALUE_LENGTH = 1024;
-    private static final boolean DEFAULT_INCLUDE_EVENTS = false;
-    private static final boolean DEFAULT_DETERMINISTIC = true;
-
     private static final int REPORT_PERIOD = 1_000; //ms
 
     private static final char[] CHARS = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789".toCharArray();
 
-    @Property(
-        name = "numClients",
-        intValue = DEFAULT_NUM_CLIENTS,
-        label = "Number of clients to use to submit writes")
-    private int numClients = DEFAULT_NUM_CLIENTS;
+    /** Number of clients to use to submit writes. */
+    private int numClients = NUM_CLIENTS_DEFAULT;
 
-    @Property(
-        name = "writePercentage",
-        intValue = DEFAULT_WRITE_PERCENTAGE,
-        label = "Percentage of operations to perform as writes")
-    private int writePercentage = DEFAULT_WRITE_PERCENTAGE;
+    /** Percentage of operations to perform as writes. */
+    private int writePercentage = WRITE_PERCENTAGE_DEFAULT;
 
-    @Property(
-        name = "numKeys",
-        intValue = DEFAULT_NUM_KEYS,
-        label = "Number of unique keys to write")
-    private int numKeys = DEFAULT_NUM_KEYS;
+    /** Number of unique keys to write. */
+    private int numKeys = NUM_KEYS_DEFAULT;
 
-    @Property(
-        name = "keyLength",
-        intValue = DEFAULT_KEY_LENGTH,
-        label = "Key length")
-    private int keyLength = DEFAULT_KEY_LENGTH;
+    /** Key length. */
+    private int keyLength = KEY_LENGTH_DEFAULT;
 
-    @Property(
-        name = "numValues",
-        intValue = DEFAULT_NUM_UNIQUE_VALUES,
-        label = "Number of unique values to write")
-    private int numValues = DEFAULT_NUM_UNIQUE_VALUES;
+    /** Number of unique values to write. */
+    private int numValues = NUM_UNIQUE_VALUES_DEFAULT;
 
-    @Property(
-        name = "valueLength",
-        intValue = DEFAULT_VALUE_LENGTH,
-        label = "Value length")
-    private int valueLength = DEFAULT_VALUE_LENGTH;
+    /** Value length. */
+    private int valueLength = VALUE_LENGTH_DEFAULT;
 
-    @Property(
-        name = "includeEvents",
-        boolValue = DEFAULT_INCLUDE_EVENTS,
-        label = "Whether to include events in test")
-    private boolean includeEvents = DEFAULT_INCLUDE_EVENTS;
+    /** Whether to include events in test. */
+    private boolean includeEvents = INCLUDE_EVENTS_DEFAULT;
 
-    @Property(
-        name = "deterministic",
-        boolValue = DEFAULT_DETERMINISTIC,
-        label = "Whether to deterministically populate entries")
-    private boolean deterministic = DEFAULT_DETERMINISTIC;
+    /** Whether to deterministically populate entries. */
+    private boolean deterministic = DETERMINISTIC_DEFAULT;
 
-    @Reference(cardinality = MANDATORY_UNARY)
+    @Reference(cardinality = MANDATORY)
     protected ClusterService clusterService;
 
-    @Reference(cardinality = MANDATORY_UNARY)
+    @Reference(cardinality = MANDATORY)
     protected StorageService storageService;
 
-    @Reference(cardinality = MANDATORY_UNARY)
+    @Reference(cardinality = MANDATORY)
     protected ComponentConfigService configService;
 
-    @Reference(cardinality = MANDATORY_UNARY)
+    @Reference(cardinality = MANDATORY)
     protected PrimitivePerfCollector sampleCollector;
 
     private ExecutorService messageHandlingExecutor;
@@ -219,19 +211,19 @@
         }
 
         Dictionary<?, ?> properties = context.getProperties();
-        int newNumClients = parseInt(properties, "numClients", numClients, DEFAULT_NUM_CLIENTS);
-        int newWritePercentage = parseInt(properties, "writePercentage", writePercentage, DEFAULT_WRITE_PERCENTAGE);
-        int newNumKeys = parseInt(properties, "numKeys", numKeys, DEFAULT_NUM_KEYS);
-        int newKeyLength = parseInt(properties, "keyLength", keyLength, DEFAULT_KEY_LENGTH);
-        int newNumValues = parseInt(properties, "numValues", numValues, DEFAULT_NUM_UNIQUE_VALUES);
-        int newValueLength = parseInt(properties, "valueLength", valueLength, DEFAULT_VALUE_LENGTH);
+        int newNumClients = parseInt(properties, NUM_CLIENTS, numClients, NUM_CLIENTS_DEFAULT);
+        int newWritePercentage = parseInt(properties, WRITE_PERCENTAGE, writePercentage, WRITE_PERCENTAGE_DEFAULT);
+        int newNumKeys = parseInt(properties, NUM_KEYS, numKeys, NUM_KEYS_DEFAULT);
+        int newKeyLength = parseInt(properties, KEY_LENGTH, keyLength, KEY_LENGTH_DEFAULT);
+        int newNumValues = parseInt(properties, NUM_UNIQUE_VALUES, numValues, NUM_UNIQUE_VALUES_DEFAULT);
+        int newValueLength = parseInt(properties, VALUE_LENGTH, valueLength, VALUE_LENGTH_DEFAULT);
 
-        String includeEventsString = get(properties, "includeEvents");
+        String includeEventsString = get(properties, INCLUDE_EVENTS);
         boolean newIncludeEvents = isNullOrEmpty(includeEventsString)
             ? includeEvents
             : Boolean.parseBoolean(includeEventsString.trim());
 
-        String deterministicString = get(properties, "deterministic");
+        String deterministicString = get(properties, DETERMINISTIC);
         boolean newDeterministic = isNullOrEmpty(deterministicString)
             ? includeEvents
             : Boolean.parseBoolean(deterministicString.trim());
diff --git a/apps/test/primitive-perf/src/main/java/org/onosproject/primitiveperf/PrimitivePerfCollector.java b/apps/test/primitive-perf/src/main/java/org/onosproject/primitiveperf/PrimitivePerfCollector.java
index 6ea85d0..cbf528e 100644
--- a/apps/test/primitive-perf/src/main/java/org/onosproject/primitiveperf/PrimitivePerfCollector.java
+++ b/apps/test/primitive-perf/src/main/java/org/onosproject/primitiveperf/PrimitivePerfCollector.java
@@ -15,20 +15,7 @@
  */
 package org.onosproject.primitiveperf;
 
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.HashMap;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.Map;
-
 import com.google.common.collect.ImmutableList;
-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.NodeId;
@@ -36,16 +23,27 @@
 import org.onosproject.store.cluster.messaging.ClusterMessage;
 import org.onosproject.store.cluster.messaging.ClusterMessageHandler;
 import org.onosproject.store.cluster.messaging.MessageSubject;
+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.ArrayList;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Map;
+
 import static org.onlab.util.SharedExecutors.getPoolThreadExecutor;
 import static org.slf4j.LoggerFactory.getLogger;
 
 /**
  * Collects and distributes performance samples.
  */
-@Component(immediate = true)
-@Service(value = PrimitivePerfCollector.class)
+@Component(immediate = true, service = PrimitivePerfCollector.class)
 public class PrimitivePerfCollector {
 
     private static final long SAMPLE_TIME_WINDOW_MS = 5_000;
@@ -57,10 +55,10 @@
 
     private static final MessageSubject SAMPLE = new MessageSubject("primitive-perf-sample");
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected ClusterCommunicationService communicationService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected ClusterService clusterService;
 
     // Auxiliary structures used to accrue data for normalized time interval
diff --git a/apps/test/primitive-perf/src/main/java/org/onosproject/primitiveperf/PrimitivePerfListCommand.java b/apps/test/primitive-perf/src/main/java/org/onosproject/primitiveperf/PrimitivePerfListCommand.java
index 2518a27..d443865 100644
--- a/apps/test/primitive-perf/src/main/java/org/onosproject/primitiveperf/PrimitivePerfListCommand.java
+++ b/apps/test/primitive-perf/src/main/java/org/onosproject/primitiveperf/PrimitivePerfListCommand.java
@@ -19,14 +19,16 @@
 import java.util.Date;
 import java.util.List;
 
-import org.apache.karaf.shell.commands.Command;
-import org.apache.karaf.shell.commands.Option;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.Option;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.primitiveperf.PrimitivePerfCollector.Sample;
 
 /**
  * Displays accumulated performance metrics.
  */
+@Service
 @Command(scope = "onos", name = "primitive-perf",
         description = "Displays accumulated performance metrics")
 public class PrimitivePerfListCommand extends AbstractShellCommand {
@@ -36,7 +38,7 @@
     private boolean summary = false;
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         if (summary) {
             printSummary();
         } else {
diff --git a/apps/test/primitive-perf/src/main/java/org/onosproject/primitiveperf/PrimitivePerfStartCommand.java b/apps/test/primitive-perf/src/main/java/org/onosproject/primitiveperf/PrimitivePerfStartCommand.java
index 11a1a41..af45199 100644
--- a/apps/test/primitive-perf/src/main/java/org/onosproject/primitiveperf/PrimitivePerfStartCommand.java
+++ b/apps/test/primitive-perf/src/main/java/org/onosproject/primitiveperf/PrimitivePerfStartCommand.java
@@ -15,18 +15,20 @@
  */
 package org.onosproject.primitiveperf;
 
-import org.apache.karaf.shell.commands.Command;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.cli.AbstractShellCommand;
 
 /**
  * Starts primitive performance test run.
  */
+@Service
 @Command(scope = "onos", name = "primitive-perf-start",
         description = "Starts primitive performance test run")
 public class PrimitivePerfStartCommand extends AbstractShellCommand {
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         get(PrimitivePerfApp.class).start();
     }
 
diff --git a/apps/test/primitive-perf/src/main/java/org/onosproject/primitiveperf/PrimitivePerfStopCommand.java b/apps/test/primitive-perf/src/main/java/org/onosproject/primitiveperf/PrimitivePerfStopCommand.java
index cb9edaa..6702c11 100644
--- a/apps/test/primitive-perf/src/main/java/org/onosproject/primitiveperf/PrimitivePerfStopCommand.java
+++ b/apps/test/primitive-perf/src/main/java/org/onosproject/primitiveperf/PrimitivePerfStopCommand.java
@@ -15,18 +15,20 @@
  */
 package org.onosproject.primitiveperf;
 
-import org.apache.karaf.shell.commands.Command;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.cli.AbstractShellCommand;
 
 /**
  * Stops primitive performance test run.
  */
+@Service
 @Command(scope = "onos", name = "primitive-perf-stop",
         description = "Stops primitive performance test run")
 public class PrimitivePerfStopCommand extends AbstractShellCommand {
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         get(PrimitivePerfApp.class).stop();
     }
 
diff --git a/apps/test/primitive-perf/src/main/resources/OSGI-INF/blueprint/shell-config.xml b/apps/test/primitive-perf/src/main/resources/OSGI-INF/blueprint/shell-config.xml
deleted file mode 100644
index 78b15ad..0000000
--- a/apps/test/primitive-perf/src/main/resources/OSGI-INF/blueprint/shell-config.xml
+++ /dev/null
@@ -1,28 +0,0 @@
-<!--
-  ~ Copyright 2017-present Open Networking Foundation
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~     http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License.
-  -->
-<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0">
-    <command-bundle xmlns="http://karaf.apache.org/xmlns/shell/v1.1.0">
-        <command>
-            <action class="org.onosproject.primitiveperf.PrimitivePerfListCommand"/>
-        </command>
-        <command>
-            <action class="org.onosproject.primitiveperf.PrimitivePerfStartCommand"/>
-        </command>
-        <command>
-            <action class="org.onosproject.primitiveperf.PrimitivePerfStopCommand"/>
-        </command>
-    </command-bundle>
-</blueprint>
diff --git a/apps/test/proxy/BUCK b/apps/test/proxy/BUCK
deleted file mode 100644
index 4b443d3..0000000
--- a/apps/test/proxy/BUCK
+++ /dev/null
@@ -1,20 +0,0 @@
-COMPILE_DEPS = [
-    '//lib:CORE_DEPS',
-    '//lib:org.apache.karaf.shell.console',
-    '//cli:onos-cli',
-    '//utils/rest:onlab-rest',
-    '//lib:javax.ws.rs-api',
-    '//core/store/serializers:onos-core-serializers',
-]
-
-osgi_jar_with_tests (
-    deps = COMPILE_DEPS,
-)
-
-onos_app (
-    app_name = 'org.onosproject.proxytest',
-    title = 'Proxy Test',
-    category = 'Test Utility',
-    url = 'http://onosproject.org',
-    description = 'Proxy test application.',
-)
diff --git a/apps/test/proxy/BUILD b/apps/test/proxy/BUILD
index 82ac3d5..16cc0af 100644
--- a/apps/test/proxy/BUILD
+++ b/apps/test/proxy/BUILD
@@ -3,6 +3,7 @@
 ]
 
 osgi_jar_with_tests(
+    karaf_command_packages = ["org.onosproject.proxytest"],
     deps = COMPILE_DEPS,
 )
 
diff --git a/apps/test/proxy/src/main/java/org/onosproject/proxytest/ProxyTest.java b/apps/test/proxy/src/main/java/org/onosproject/proxytest/ProxyTest.java
index 1edc4a6..920f53d 100644
--- a/apps/test/proxy/src/main/java/org/onosproject/proxytest/ProxyTest.java
+++ b/apps/test/proxy/src/main/java/org/onosproject/proxytest/ProxyTest.java
@@ -15,12 +15,6 @@
  */
 package org.onosproject.proxytest;
 
-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.NodeId;
 import org.onosproject.cluster.ProxyFactory;
 import org.onosproject.cluster.ProxyService;
@@ -30,6 +24,11 @@
 import org.onosproject.net.DeviceId;
 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 static org.slf4j.LoggerFactory.getLogger;
@@ -37,8 +36,7 @@
 /**
  * Proxy test application.
  */
-@Component(immediate = true)
-@Service(value = ProxyTest.class)
+@Component(immediate = true, service = ProxyTest.class)
 public class ProxyTest {
 
     private static final Serializer SERIALIZER = Serializer.using(KryoNamespaces.API);
@@ -47,13 +45,13 @@
 
     private static final String APP_NAME = "org.onosproject.proxytest";
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected CoreService coreService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected ProxyService proxyService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected MastershipProxyService mastershipProxyService;
 
     private ProxyFactory<TestProxy> proxyFactory;
diff --git a/apps/test/proxy/src/main/java/org/onosproject/proxytest/ProxyTestCommand.java b/apps/test/proxy/src/main/java/org/onosproject/proxytest/ProxyTestCommand.java
index 1cb64e8..1ef2782 100644
--- a/apps/test/proxy/src/main/java/org/onosproject/proxytest/ProxyTestCommand.java
+++ b/apps/test/proxy/src/main/java/org/onosproject/proxytest/ProxyTestCommand.java
@@ -19,8 +19,9 @@
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.TimeoutException;
 
-import org.apache.karaf.shell.commands.Argument;
-import org.apache.karaf.shell.commands.Command;
+import org.apache.karaf.shell.api.action.Argument;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.cluster.NodeId;
 import org.onosproject.net.DeviceId;
@@ -28,6 +29,7 @@
 /**
  * Proxy test command.
  */
+@Service
 @Command(scope = "onos", name = "proxy-test", description = "Manipulate a distributed proxy")
 public class ProxyTestCommand extends AbstractShellCommand {
 
@@ -64,7 +66,7 @@
     String arg2;
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         ProxyTest proxyTest = get(ProxyTest.class);
         TestProxy proxy;
         if ("node".equals(type)) {
diff --git a/apps/test/proxy/src/main/resources/OSGI-INF/blueprint/shell-config.xml b/apps/test/proxy/src/main/resources/OSGI-INF/blueprint/shell-config.xml
deleted file mode 100644
index 9519234..0000000
--- a/apps/test/proxy/src/main/resources/OSGI-INF/blueprint/shell-config.xml
+++ /dev/null
@@ -1,22 +0,0 @@
-<!--
-  ~ Copyright 2018-present Open Networking Foundation
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~     http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License.
-  -->
-<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0">
-    <command-bundle xmlns="http://karaf.apache.org/xmlns/shell/v1.1.0">
-        <command>
-            <action class="org.onosproject.proxytest.ProxyTestCommand"/>
-        </command>
-    </command-bundle>
-</blueprint>
diff --git a/apps/test/route-scale/BUCK b/apps/test/route-scale/BUCK
deleted file mode 100644
index d0853d4..0000000
--- a/apps/test/route-scale/BUCK
+++ /dev/null
@@ -1,20 +0,0 @@
-COMPILE_DEPS = [
-    '//lib:CORE_DEPS',
-    '//lib:org.apache.karaf.shell.console',
-    '//cli:onos-cli',
-    '//utils/rest:onlab-rest',
-    '//apps/route-service/api:onos-apps-route-service-api',
-]
-
-osgi_jar_with_tests (
-    deps = COMPILE_DEPS,
-)
-
-onos_app (
-    app_name = 'org.onosproject.routescale',
-    title = 'Route and Flow Scalability Test',
-    category = 'Test Utility',
-    url = 'http://onosproject.org',
-    description = 'Route and flow scalability test facility.',
-    required_apps = [ 'org.onosproject.route-service' ],
-)
diff --git a/apps/test/route-scale/BUILD b/apps/test/route-scale/BUILD
index 328f558..36ae8bf 100644
--- a/apps/test/route-scale/BUILD
+++ b/apps/test/route-scale/BUILD
@@ -3,6 +3,7 @@
 ]
 
 osgi_jar_with_tests(
+    karaf_command_packages = ["org.onosproject.routescale"],
     deps = COMPILE_DEPS,
 )
 
diff --git a/apps/test/route-scale/src/main/java/org/onosproject/routescale/CreateFlows.java b/apps/test/route-scale/src/main/java/org/onosproject/routescale/CreateFlows.java
index 9e5baf9..2bcee51 100644
--- a/apps/test/route-scale/src/main/java/org/onosproject/routescale/CreateFlows.java
+++ b/apps/test/route-scale/src/main/java/org/onosproject/routescale/CreateFlows.java
@@ -15,14 +15,16 @@
  */
 package org.onosproject.routescale;
 
-import org.apache.karaf.shell.commands.Argument;
-import org.apache.karaf.shell.commands.Command;
+import org.apache.karaf.shell.api.action.Argument;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.cfg.ComponentConfigService;
 import org.onosproject.cli.AbstractShellCommand;
 
 /**
  * Creates the specified number of routes for scale testing.
  */
+@Service
 @Command(scope = "onos", name = "scale-flows",
         description = "Sets the specified number of flows for scale testing")
 public class CreateFlows extends AbstractShellCommand {
@@ -32,7 +34,7 @@
     int flowCount;
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         ComponentConfigService service = get(ComponentConfigService.class);
         service.setProperty("org.onosproject.routescale.ScaleTestManager",
                             "flowCount", String.valueOf(flowCount));
diff --git a/apps/test/route-scale/src/main/java/org/onosproject/routescale/CreateRoutes.java b/apps/test/route-scale/src/main/java/org/onosproject/routescale/CreateRoutes.java
index 608fc53..5fdcb7a 100644
--- a/apps/test/route-scale/src/main/java/org/onosproject/routescale/CreateRoutes.java
+++ b/apps/test/route-scale/src/main/java/org/onosproject/routescale/CreateRoutes.java
@@ -15,14 +15,16 @@
  */
 package org.onosproject.routescale;
 
-import org.apache.karaf.shell.commands.Argument;
-import org.apache.karaf.shell.commands.Command;
+import org.apache.karaf.shell.api.action.Argument;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.cfg.ComponentConfigService;
 import org.onosproject.cli.AbstractShellCommand;
 
 /**
  * Creates the specified number of routes for scale testing.
  */
+@Service
 @Command(scope = "onos", name = "scale-routes",
         description = "Sets the specified number of routes for scale testing")
 public class CreateRoutes extends AbstractShellCommand {
@@ -32,7 +34,7 @@
     int routeCount;
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         ComponentConfigService service = get(ComponentConfigService.class);
         service.setProperty("org.onosproject.routescale.ScaleTestManager",
                             "routeCount", String.valueOf(routeCount));
diff --git a/apps/test/route-scale/src/main/java/org/onosproject/routescale/OsgiPropertyConstants.java b/apps/test/route-scale/src/main/java/org/onosproject/routescale/OsgiPropertyConstants.java
new file mode 100644
index 0000000..c7bcd4d
--- /dev/null
+++ b/apps/test/route-scale/src/main/java/org/onosproject/routescale/OsgiPropertyConstants.java
@@ -0,0 +1,31 @@
+/*
+ * Copyright 2018-present Open Networking Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.onosproject.routescale;
+
+/**
+ * Name/Value constants for properties.
+ */
+public final class OsgiPropertyConstants {
+    private OsgiPropertyConstants() {
+    }
+
+    public static final String FLOW_COUNT = "flowCount";
+    public static final int FLOW_COUNT_DEFAULT = 0;
+
+    public static final String ROUTE_COUNT = "routeCount";
+    public static final int ROUTE_COUNT_DEFAULT = 0;
+}
diff --git a/apps/test/route-scale/src/main/java/org/onosproject/routescale/ScaleTestManager.java b/apps/test/route-scale/src/main/java/org/onosproject/routescale/ScaleTestManager.java
index cfc7ad6..8c8b398 100644
--- a/apps/test/route-scale/src/main/java/org/onosproject/routescale/ScaleTestManager.java
+++ b/apps/test/route-scale/src/main/java/org/onosproject/routescale/ScaleTestManager.java
@@ -18,14 +18,6 @@
 
 import com.google.common.collect.ImmutableList;
 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.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.packet.Ethernet;
 import org.onlab.packet.IpAddress;
 import org.onlab.packet.IpPrefix;
@@ -53,6 +45,12 @@
 import org.onosproject.routeservice.Route;
 import org.onosproject.routeservice.RouteAdminService;
 import org.osgi.service.component.ComponentContext;
+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 org.slf4j.LoggerFactory;
 
@@ -63,41 +61,49 @@
 
 import static com.google.common.base.Strings.isNullOrEmpty;
 import static org.onlab.util.Tools.get;
+import static org.onosproject.routescale.OsgiPropertyConstants.FLOW_COUNT;
+import static org.onosproject.routescale.OsgiPropertyConstants.FLOW_COUNT_DEFAULT;
+import static org.onosproject.routescale.OsgiPropertyConstants.ROUTE_COUNT;
+import static org.onosproject.routescale.OsgiPropertyConstants.ROUTE_COUNT_DEFAULT;
 
-@Component(immediate = true)
-@Service(value = ScaleTestManager.class)
+@Component(
+    immediate = true,
+    service = ScaleTestManager.class,
+    property = {
+        FLOW_COUNT + ":Integer=" + FLOW_COUNT_DEFAULT,
+        ROUTE_COUNT + ":Integer=" + ROUTE_COUNT_DEFAULT,
+    }
+)
 public class ScaleTestManager {
 
     private Logger log = LoggerFactory.getLogger(getClass());
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected ApplicationService applicationService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected DeviceService deviceService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected HostAdminService hostAdminService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected LinkService linkService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected FlowRuleService flowRuleService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected RouteAdminService routeAdminService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected ComponentConfigService componentConfigService;
 
-    @Property(name = "flowCount", intValue = 0,
-            label = "Number of flows to be maintained in the system")
-    private int flowCount = 0;
+    /** Number of flows to be maintained in the system. */
+    private int flowCount = FLOW_COUNT_DEFAULT;
 
-    @Property(name = "routeCount", intValue = 0,
-            label = "Number of routes to be maintained in the system")
-    private int routeCount = 0;
+    /** Number of routes to be maintained in the system. */
+    private int routeCount = ROUTE_COUNT_DEFAULT;
 
     private final Random random = new Random(System.currentTimeMillis());
 
@@ -126,10 +132,10 @@
 
         Dictionary<?, ?> properties = context.getProperties();
         try {
-            String s = get(properties, "flowCount");
+            String s = get(properties, FLOW_COUNT);
             flowCount = isNullOrEmpty(s) ? flowCount : Integer.parseInt(s.trim());
 
-            s = get(properties, "routeCount");
+            s = get(properties, ROUTE_COUNT);
             routeCount = isNullOrEmpty(s) ? routeCount : Integer.parseInt(s.trim());
 
             log.info("Reconfigured; flowCount={}; routeCount={}", flowCount, routeCount);
diff --git a/apps/test/route-scale/src/main/resources/OSGI-INF/blueprint/shell-config.xml b/apps/test/route-scale/src/main/resources/OSGI-INF/blueprint/shell-config.xml
deleted file mode 100644
index 0c9dbc5..0000000
--- a/apps/test/route-scale/src/main/resources/OSGI-INF/blueprint/shell-config.xml
+++ /dev/null
@@ -1,27 +0,0 @@
-<!--
-  ~ Copyright 2018-present Open Networking Foundation
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~     http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License.
-  -->
-<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0">
-
-    <command-bundle xmlns="http://karaf.apache.org/xmlns/shell/v1.1.0">
-        <command>
-            <action class="org.onosproject.routescale.CreateRoutes"/>
-        </command>
-        <command>
-            <action class="org.onosproject.routescale.CreateFlows"/>
-        </command>
-    </command-bundle>
-
-</blueprint>
diff --git a/apps/test/transaction-perf/BUCK b/apps/test/transaction-perf/BUCK
deleted file mode 100644
index 0caa955..0000000
--- a/apps/test/transaction-perf/BUCK
+++ /dev/null
@@ -1,19 +0,0 @@
-COMPILE_DEPS = [
-    '//lib:CORE_DEPS',
-    '//lib:org.apache.karaf.shell.console',
-    '//cli:onos-cli',
-    '//utils/rest:onlab-rest',
-    '//lib:javax.ws.rs-api',
-    '//core/store/serializers:onos-core-serializers',
-]
-
-osgi_jar_with_tests (
-    deps = COMPILE_DEPS,
-)
-
-onos_app (
-    title = 'Transaction Performance Test',
-    category = 'Test Utility',
-    url = 'http://onosproject.org',
-    description = 'Transaction performance test application.',
-)
diff --git a/apps/test/transaction-perf/src/main/java/org/onosproject/transactionperf/OsgiPropertyConstants.java b/apps/test/transaction-perf/src/main/java/org/onosproject/transactionperf/OsgiPropertyConstants.java
new file mode 100644
index 0000000..ca8df1a
--- /dev/null
+++ b/apps/test/transaction-perf/src/main/java/org/onosproject/transactionperf/OsgiPropertyConstants.java
@@ -0,0 +1,43 @@
+/*
+ * Copyright 2018-present Open Networking Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.onosproject.transactionperf;
+
+/**
+ * Name/Value constants for properties.
+ */
+public final class OsgiPropertyConstants {
+    private OsgiPropertyConstants() {
+    }
+
+    public static final String MAP_NAME = "mapName";
+    public static final String MAP_NAME_DEFAULT = "transaction-perf";
+
+    public static final String READ_PERCENTAGE = "readPercentage";
+    public static final double READ_PERCENTAGE_DEFAULT = .9;
+
+    public static final String TOTAL_OPERATIONS = "totalOperationsPerTransaction";
+    public static final int TOTAL_OPERATIONS_DEFAULT = 1000;
+
+    public static final String WITH_CONTENTION = "withContention";
+    public static final boolean WITH_CONTENTION_DEFAULT = false;
+
+    public static final String WITH_RETRIES = "withRetries";
+    public static final boolean WITH_RETRIES_DEFAULT = false;
+
+    public static final String REPORT_INTERVAL_SECONDS = "reportIntervalSeconds";
+    public static final int REPORT_INTERVAL_SECONDS_DEFAULT = 1;
+}
diff --git a/apps/test/transaction-perf/src/main/java/org/onosproject/transactionperf/TransactionPerfApp.java b/apps/test/transaction-perf/src/main/java/org/onosproject/transactionperf/TransactionPerfApp.java
index c941bf6..b79ea2e 100644
--- a/apps/test/transaction-perf/src/main/java/org/onosproject/transactionperf/TransactionPerfApp.java
+++ b/apps/test/transaction-perf/src/main/java/org/onosproject/transactionperf/TransactionPerfApp.java
@@ -15,22 +15,6 @@
  */
 package org.onosproject.transactionperf;
 
-import java.util.Comparator;
-import java.util.Dictionary;
-import java.util.concurrent.ExecutorService;
-import java.util.concurrent.Executors;
-import java.util.concurrent.ScheduledExecutorService;
-import java.util.concurrent.TimeUnit;
-import java.util.concurrent.atomic.AtomicInteger;
-
-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.util.Tools;
 import org.onosproject.cfg.ComponentConfigService;
 import org.onosproject.cluster.ClusterService;
@@ -42,62 +26,85 @@
 import org.onosproject.store.service.TransactionContext;
 import org.onosproject.store.service.TransactionalMap;
 import org.osgi.service.component.ComponentContext;
+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.slf4j.Logger;
 
+import java.util.Comparator;
+import java.util.Dictionary;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.concurrent.ScheduledExecutorService;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.atomic.AtomicInteger;
+
 import static com.google.common.base.Strings.isNullOrEmpty;
-import static org.apache.felix.scr.annotations.ReferenceCardinality.MANDATORY_UNARY;
 import static org.onlab.util.Tools.get;
 import static org.onlab.util.Tools.groupedThreads;
+import static org.onosproject.transactionperf.OsgiPropertyConstants.MAP_NAME;
+import static org.onosproject.transactionperf.OsgiPropertyConstants.MAP_NAME_DEFAULT;
+import static org.onosproject.transactionperf.OsgiPropertyConstants.READ_PERCENTAGE;
+import static org.onosproject.transactionperf.OsgiPropertyConstants.READ_PERCENTAGE_DEFAULT;
+import static org.onosproject.transactionperf.OsgiPropertyConstants.REPORT_INTERVAL_SECONDS;
+import static org.onosproject.transactionperf.OsgiPropertyConstants.REPORT_INTERVAL_SECONDS_DEFAULT;
+import static org.onosproject.transactionperf.OsgiPropertyConstants.TOTAL_OPERATIONS;
+import static org.onosproject.transactionperf.OsgiPropertyConstants.TOTAL_OPERATIONS_DEFAULT;
+import static org.onosproject.transactionperf.OsgiPropertyConstants.WITH_CONTENTION;
+import static org.onosproject.transactionperf.OsgiPropertyConstants.WITH_CONTENTION_DEFAULT;
+import static org.onosproject.transactionperf.OsgiPropertyConstants.WITH_RETRIES;
+import static org.onosproject.transactionperf.OsgiPropertyConstants.WITH_RETRIES_DEFAULT;
+import static org.osgi.service.component.annotations.ReferenceCardinality.MANDATORY;
 import static org.slf4j.LoggerFactory.getLogger;
 
 /**
  * Application for measuring transaction performance.
  */
-@Component(immediate = true, enabled = true)
-@Service(value = TransactionPerfApp.class)
+@Component(
+    immediate = true,
+    service = TransactionPerfApp.class,
+    property = {
+        MAP_NAME_DEFAULT + "=" + MAP_NAME,
+        READ_PERCENTAGE + ":Double=" + READ_PERCENTAGE_DEFAULT,
+        TOTAL_OPERATIONS + ":Integer=" + TOTAL_OPERATIONS_DEFAULT,
+        WITH_CONTENTION + ":Boolean=" + WITH_CONTENTION_DEFAULT,
+        WITH_RETRIES + ":Boolean=" + WITH_RETRIES_DEFAULT,
+        REPORT_INTERVAL_SECONDS + ":Integer=" + REPORT_INTERVAL_SECONDS_DEFAULT
+    }
+)
 public class TransactionPerfApp {
     private final Logger log = getLogger(getClass());
 
-    @Reference(cardinality = MANDATORY_UNARY)
+    @Reference(cardinality = MANDATORY)
     protected StorageService storageService;
 
-    @Reference(cardinality = MANDATORY_UNARY)
+    @Reference(cardinality = MANDATORY)
     protected ClusterService clusterService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = MANDATORY)
     protected ComponentConfigService configService;
 
-    private static final String DEFAULT_MAP_NAME = "transaction-perf";
-    private static final double DEFAULT_READ_PERCENTAGE = .9;
-    private static final int DEFAULT_TOTAL_OPERATIONS = 1000;
-    private static final boolean DEFAULT_WITH_CONTENTION = false;
-    private static final boolean DEFAULT_WITH_RETRIES = false;
-    private static final int DEFAULT_REPORT_INTERVAL_SECONDS = 1;
     private static final String KEY_PREFIX = "key";
 
-    @Property(name = "mapName", value = DEFAULT_MAP_NAME,
-            label = "The name of the map to use for testing")
-    protected String mapName = DEFAULT_MAP_NAME;
+    /** The name of the map to use for testing. */
+    protected String mapName = MAP_NAME_DEFAULT;
 
-    @Property(name = "readPercentage", doubleValue = DEFAULT_READ_PERCENTAGE,
-            label = "Percentage of reads to perform")
-    protected double readPercentage = DEFAULT_READ_PERCENTAGE;
+    /** Percentage of reads to perform. */
+    protected double readPercentage = READ_PERCENTAGE_DEFAULT;
 
-    @Property(name = "totalOperationsPerTransaction", intValue = DEFAULT_TOTAL_OPERATIONS,
-            label = "Number of operations to perform within each transaction")
-    protected int totalOperationsPerTransaction = DEFAULT_TOTAL_OPERATIONS;
+    /** Number of operations to perform within each transaction. */
+    protected int totalOperationsPerTransaction = TOTAL_OPERATIONS_DEFAULT;
 
-    @Property(name = "withContention", boolValue = DEFAULT_WITH_CONTENTION,
-            label = "Whether to test transactions with contention from all nodes")
-    protected boolean withContention = DEFAULT_WITH_CONTENTION;
+    /** Whether to test transactions with contention from all nodes. */
+    protected boolean withContention = WITH_CONTENTION_DEFAULT;
 
-    @Property(name = "withRetries", boolValue = DEFAULT_WITH_RETRIES,
-            label = "Whether to retry transactions until success")
-    protected boolean withRetries = DEFAULT_WITH_RETRIES;
+    /** Whether to retry transactions until success. */
+    protected boolean withRetries = WITH_RETRIES_DEFAULT;
 
-    @Property(name = "reportIntervalSeconds", intValue = DEFAULT_REPORT_INTERVAL_SECONDS,
-            label = "The frequency with which to report performance in seconds")
-    protected int reportIntervalSeconds = 1;
+    /** The frequency with which to report performance in seconds. */
+    protected int reportIntervalSeconds = REPORT_INTERVAL_SECONDS_DEFAULT;
 
     private ExecutorService testRunner =
             Executors.newSingleThreadExecutor(Tools.groupedThreads("app/transaction-perf-test-runner", ""));
@@ -128,12 +135,12 @@
     @Modified
     public void modified(ComponentContext context) {
         if (context == null) {
-            mapName = DEFAULT_MAP_NAME;
-            readPercentage = DEFAULT_READ_PERCENTAGE;
-            totalOperationsPerTransaction = DEFAULT_TOTAL_OPERATIONS;
-            withContention = DEFAULT_WITH_CONTENTION;
-            withRetries = DEFAULT_WITH_RETRIES;
-            reportIntervalSeconds = DEFAULT_REPORT_INTERVAL_SECONDS;
+            mapName = MAP_NAME_DEFAULT;
+            readPercentage = READ_PERCENTAGE_DEFAULT;
+            totalOperationsPerTransaction = TOTAL_OPERATIONS_DEFAULT;
+            withContention = WITH_CONTENTION_DEFAULT;
+            withRetries = WITH_RETRIES_DEFAULT;
+            reportIntervalSeconds = REPORT_INTERVAL_SECONDS_DEFAULT;
             return;
         }
 
@@ -149,32 +156,32 @@
         try {
             String s;
 
-            s = get(properties, "mapName");
+            s = get(properties, MAP_NAME);
             if (!isNullOrEmpty(s)) {
                 newMapName = s;
             }
 
-            s = get(properties, "readPercentage");
+            s = get(properties, READ_PERCENTAGE);
             if (!isNullOrEmpty(s)) {
                 newReadPercentage = Double.parseDouble(s);
             }
 
-            s = get(properties, "totalOperationsPerTransaction");
+            s = get(properties, TOTAL_OPERATIONS);
             if (!isNullOrEmpty(s)) {
                 newTotalOperationsPerTransaction = Integer.parseInt(s);
             }
 
-            s = get(properties, "withContention");
+            s = get(properties, WITH_CONTENTION);
             if (!isNullOrEmpty(s)) {
                 newWithContention = Boolean.parseBoolean(s);
             }
 
-            s = get(properties, "withRetries");
+            s = get(properties, WITH_RETRIES);
             if (!isNullOrEmpty(s)) {
                 newWithRetries = Boolean.parseBoolean(s);
             }
 
-            s = get(properties, "reportIntervalSeconds");
+            s = get(properties, REPORT_INTERVAL_SECONDS);
             if (!isNullOrEmpty(s)) {
                 newReportIntervalSeconds = Integer.parseInt(s);
             }
diff --git a/apps/tetopology/BUCK b/apps/tetopology/BUCK
deleted file mode 100644
index 0d91b2d..0000000
--- a/apps/tetopology/BUCK
+++ /dev/null
@@ -1,13 +0,0 @@
-BUNDLES = [
-  '//apps/tetopology/api:onos-apps-tetopology-api',
-  '//apps/tetopology/app:onos-apps-tetopology-app',
-]
-
-onos_app (
-    app_name = 'org.onosproject.tetopology',
-    title = 'TE Topology Core',
-    category = 'Traffic Engineering',
-    url = 'http://onosproject.org',
-    description = 'Application to create and manage hierarchical TE topologies.',
-    included_bundles = BUNDLES,
-)
diff --git a/apps/tetopology/api/BUCK b/apps/tetopology/api/BUCK
deleted file mode 100644
index 2b27800..0000000
--- a/apps/tetopology/api/BUCK
+++ /dev/null
@@ -1,7 +0,0 @@
-COMPILE_DEPS = [
-    '//lib:CORE_DEPS',
-]
-
-osgi_jar_with_tests (
-    deps = COMPILE_DEPS,
-)
diff --git a/apps/tetopology/app/BUCK b/apps/tetopology/app/BUCK
deleted file mode 100644
index eb92dc7..0000000
--- a/apps/tetopology/app/BUCK
+++ /dev/null
@@ -1,19 +0,0 @@
-COMPILE_DEPS = [
-    '//lib:CORE_DEPS',
-    '//lib:JACKSON',
-    '//lib:KRYO',
-    '//apps/tetopology/api:onos-apps-tetopology-api',
-    '//incubator/api:onos-incubator-api',
-    '//core/store/serializers:onos-core-serializers',
-]
-
-TEST_DEPS = [
-    '//lib:TEST_ADAPTERS',
-    '//utils/osgi:onlab-osgi-tests',
-    '//incubator/api:onos-incubator-api-tests',
-]
-
-osgi_jar_with_tests (
-    deps = COMPILE_DEPS,
-    test_deps = TEST_DEPS,
-)
diff --git a/apps/tetopology/app/app.xml b/apps/tetopology/app/app.xml
deleted file mode 100644
index 40f8da6..0000000
--- a/apps/tetopology/app/app.xml
+++ /dev/null
@@ -1,23 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-  ~ Copyright 2015 Open Networking Foundation
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~     http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License.
-  -->
-<app name="org.onosproject.tetopology" origin="HUAWEI" version="${project.version}"
-     featuresRepo="mvn:${project.groupId}/${project.artifactId}/${project.version}/xml/features"
-     features="${project.artifactId}">
-    <description>${project.description}</description>
-    <artifact>mvn:${project.groupId}/${project.artifactId}/${project.version}</artifact>
-</app>
-
diff --git a/apps/tetopology/app/features.xml b/apps/tetopology/app/features.xml
deleted file mode 100644
index 41af7ce..0000000
--- a/apps/tetopology/app/features.xml
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
-<!--
-  ~ Copyright 2015 Open Networking Foundation
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~     http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License.
-  -->
-<features xmlns="http://karaf.apache.org/xmlns/features/v1.2.0" name="${project.artifactId}-${project.version}">
-    <feature name="${project.artifactId}" version="${project.version}"
-             description="${project.description}">
-        <feature>onos-api</feature>
-        <bundle>mvn:${project.groupId}/onos-apps-tetopology-api/${project.version}</bundle>
-        <bundle>mvn:${project.groupId}/onos-apps-tetopology/${project.version}</bundle>
-    </feature>
-</features>
diff --git a/apps/tetopology/app/src/main/java/org/onosproject/tetopology/management/impl/DistributedTeTopologyStore.java b/apps/tetopology/app/src/main/java/org/onosproject/tetopology/management/impl/DistributedTeTopologyStore.java
index e3a63b3..4b37857 100644
--- a/apps/tetopology/app/src/main/java/org/onosproject/tetopology/management/impl/DistributedTeTopologyStore.java
+++ b/apps/tetopology/app/src/main/java/org/onosproject/tetopology/management/impl/DistributedTeTopologyStore.java
@@ -15,41 +15,10 @@
  */
 package org.onosproject.tetopology.management.impl;
 
-import static org.onosproject.tetopology.management.api.OptimizationType.NOT_OPTIMIZED;
-import static org.onosproject.tetopology.management.api.TeTopologyEvent.Type.LINK_ADDED;
-import static org.onosproject.tetopology.management.api.TeTopologyEvent.Type.LINK_REMOVED;
-import static org.onosproject.tetopology.management.api.TeTopologyEvent.Type.LINK_UPDATED;
-import static org.onosproject.tetopology.management.api.TeTopologyEvent.Type.NETWORK_ADDED;
-import static org.onosproject.tetopology.management.api.TeTopologyEvent.Type.NETWORK_REMOVED;
-import static org.onosproject.tetopology.management.api.TeTopologyEvent.Type.NETWORK_UPDATED;
-import static org.onosproject.tetopology.management.api.TeTopologyEvent.Type.NODE_ADDED;
-import static org.onosproject.tetopology.management.api.TeTopologyEvent.Type.NODE_REMOVED;
-import static org.onosproject.tetopology.management.api.TeTopologyEvent.Type.NODE_UPDATED;
-import static org.onosproject.tetopology.management.api.TeTopologyEvent.Type.TE_LINK_ADDED;
-import static org.onosproject.tetopology.management.api.TeTopologyEvent.Type.TE_LINK_REMOVED;
-import static org.onosproject.tetopology.management.api.TeTopologyEvent.Type.TE_LINK_UPDATED;
-import static org.onosproject.tetopology.management.api.TeTopologyEvent.Type.TE_NODE_ADDED;
-import static org.onosproject.tetopology.management.api.TeTopologyEvent.Type.TE_NODE_REMOVED;
-import static org.onosproject.tetopology.management.api.TeTopologyEvent.Type.TE_NODE_UPDATED;
-import static org.onosproject.tetopology.management.api.TeTopologyEvent.Type.TE_TOPOLOGY_ADDED;
-import static org.onosproject.tetopology.management.api.TeTopologyEvent.Type.TE_TOPOLOGY_REMOVED;
-import static org.onosproject.tetopology.management.api.TeTopologyEvent.Type.TE_TOPOLOGY_UPDATED;
-import static org.slf4j.LoggerFactory.getLogger;
-
-import java.util.BitSet;
-import java.util.List;
-import java.util.Map;
-import java.util.concurrent.BlockingQueue;
-import java.util.concurrent.LinkedBlockingQueue;
-
+import com.google.common.collect.Lists;
+import com.google.common.collect.Maps;
 import org.apache.commons.collections.CollectionUtils;
 import org.apache.commons.collections.MapUtils;
-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.KryoNamespace;
 import org.onosproject.net.DeviceId;
 import org.onosproject.store.AbstractStore;
@@ -123,16 +92,44 @@
 import org.onosproject.tetopology.management.api.node.TerminationPointKey;
 import org.onosproject.tetopology.management.api.node.TtpKey;
 import org.onosproject.tetopology.management.api.node.TunnelTerminationPoint;
+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.Lists;
-import com.google.common.collect.Maps;
+import java.util.BitSet;
+import java.util.List;
+import java.util.Map;
+import java.util.concurrent.BlockingQueue;
+import java.util.concurrent.LinkedBlockingQueue;
+
+import static org.onosproject.tetopology.management.api.OptimizationType.NOT_OPTIMIZED;
+import static org.onosproject.tetopology.management.api.TeTopologyEvent.Type.LINK_ADDED;
+import static org.onosproject.tetopology.management.api.TeTopologyEvent.Type.LINK_REMOVED;
+import static org.onosproject.tetopology.management.api.TeTopologyEvent.Type.LINK_UPDATED;
+import static org.onosproject.tetopology.management.api.TeTopologyEvent.Type.NETWORK_ADDED;
+import static org.onosproject.tetopology.management.api.TeTopologyEvent.Type.NETWORK_REMOVED;
+import static org.onosproject.tetopology.management.api.TeTopologyEvent.Type.NETWORK_UPDATED;
+import static org.onosproject.tetopology.management.api.TeTopologyEvent.Type.NODE_ADDED;
+import static org.onosproject.tetopology.management.api.TeTopologyEvent.Type.NODE_REMOVED;
+import static org.onosproject.tetopology.management.api.TeTopologyEvent.Type.NODE_UPDATED;
+import static org.onosproject.tetopology.management.api.TeTopologyEvent.Type.TE_LINK_ADDED;
+import static org.onosproject.tetopology.management.api.TeTopologyEvent.Type.TE_LINK_REMOVED;
+import static org.onosproject.tetopology.management.api.TeTopologyEvent.Type.TE_LINK_UPDATED;
+import static org.onosproject.tetopology.management.api.TeTopologyEvent.Type.TE_NODE_ADDED;
+import static org.onosproject.tetopology.management.api.TeTopologyEvent.Type.TE_NODE_REMOVED;
+import static org.onosproject.tetopology.management.api.TeTopologyEvent.Type.TE_NODE_UPDATED;
+import static org.onosproject.tetopology.management.api.TeTopologyEvent.Type.TE_TOPOLOGY_ADDED;
+import static org.onosproject.tetopology.management.api.TeTopologyEvent.Type.TE_TOPOLOGY_REMOVED;
+import static org.onosproject.tetopology.management.api.TeTopologyEvent.Type.TE_TOPOLOGY_UPDATED;
+import static org.slf4j.LoggerFactory.getLogger;
 
 /**
  * Implementation of the TE network store.
  */
-@Component(immediate = true)
-@Service
+@Component(immediate = true, service = TeTopologyStore.class)
 public class DistributedTeTopologyStore
     extends AbstractStore<TeTopologyEvent, TeTopologyStoreDelegate>
     implements TeTopologyStore {
@@ -150,7 +147,7 @@
     private static final String TTPKEY_TUNNELTERMINATIONPOINT = "TtpKey-TunnelTerminationPoint";
     private final Logger log = getLogger(getClass());
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected StorageService storageService;
     // Track TE topologies by TE Topology key
     private ConsistentMap<TeTopologyKey, InternalTeTopology> teTopologyConsistentMap;
diff --git a/apps/tetopology/app/src/main/java/org/onosproject/tetopology/management/impl/TeTopologyManager.java b/apps/tetopology/app/src/main/java/org/onosproject/tetopology/management/impl/TeTopologyManager.java
index 5775a57..a3c0aed 100644
--- a/apps/tetopology/app/src/main/java/org/onosproject/tetopology/management/impl/TeTopologyManager.java
+++ b/apps/tetopology/app/src/main/java/org/onosproject/tetopology/management/impl/TeTopologyManager.java
@@ -15,59 +15,17 @@
  */
 package org.onosproject.tetopology.management.impl;
 
-import static java.util.concurrent.Executors.newFixedThreadPool;
-import static org.onlab.util.Tools.groupedThreads;
-import static org.onosproject.net.config.NetworkConfigEvent.Type.CONFIG_ADDED;
-import static org.onosproject.net.config.NetworkConfigEvent.Type.CONFIG_UPDATED;
-import static org.onosproject.net.config.basics.SubjectFactories.APP_SUBJECT_FACTORY;
-import static org.onosproject.tetopology.management.api.OptimizationType.NOT_OPTIMIZED;
-import static org.onosproject.tetopology.management.api.TeTopology.BIT_CUSTOMIZED;
-import static org.onosproject.tetopology.management.api.TeTopology.BIT_LEARNT;
-import static org.onosproject.tetopology.management.api.TeTopology.BIT_MERGED;
-import static org.onosproject.tetopology.management.api.TeTopologyEvent.Type.LINK_ADDED;
-import static org.onosproject.tetopology.management.api.TeTopologyEvent.Type.LINK_REMOVED;
-import static org.onosproject.tetopology.management.api.TeTopologyEvent.Type.LINK_UPDATED;
-import static org.onosproject.tetopology.management.api.TeTopologyEvent.Type.NETWORK_ADDED;
-import static org.onosproject.tetopology.management.api.TeTopologyEvent.Type.NETWORK_REMOVED;
-import static org.onosproject.tetopology.management.api.TeTopologyEvent.Type.NODE_ADDED;
-import static org.onosproject.tetopology.management.api.TeTopologyEvent.Type.NODE_REMOVED;
-import static org.onosproject.tetopology.management.api.TeTopologyEvent.Type.NODE_UPDATED;
-import static org.onosproject.tetopology.management.api.TeTopologyEvent.Type.TE_LINK_ADDED;
-import static org.onosproject.tetopology.management.api.TeTopologyEvent.Type.TE_LINK_REMOVED;
-import static org.onosproject.tetopology.management.api.TeTopologyEvent.Type.TE_LINK_UPDATED;
-import static org.onosproject.tetopology.management.api.TeTopologyEvent.Type.TE_NODE_ADDED;
-import static org.onosproject.tetopology.management.api.TeTopologyEvent.Type.TE_NODE_REMOVED;
-import static org.onosproject.tetopology.management.api.TeTopologyEvent.Type.TE_NODE_UPDATED;
-import static org.onosproject.tetopology.management.api.TeTopologyEvent.Type.TE_TOPOLOGY_ADDED;
-import static org.onosproject.tetopology.management.api.TeTopologyEvent.Type.TE_TOPOLOGY_REMOVED;
-import static org.onosproject.tetopology.management.api.link.TeLink.BIT_ACCESS_INTERDOMAIN;
-import static org.onosproject.tetopology.management.impl.TeMgrUtil.linkBuilder;
-import static org.onosproject.tetopology.management.impl.TeMgrUtil.networkBuilder;
-import static org.onosproject.tetopology.management.impl.TeMgrUtil.networkLinkKey;
-import static org.onosproject.tetopology.management.impl.TeMgrUtil.networkNodeKey;
-import static org.onosproject.tetopology.management.impl.TeMgrUtil.nodeBuilder;
-import static org.onosproject.tetopology.management.impl.TeMgrUtil.toNetworkId;
-import static org.onosproject.tetopology.management.impl.TeMgrUtil.toNetworkLinkId;
-
-import java.util.BitSet;
-import java.util.List;
-import java.util.Map;
-import java.util.concurrent.ExecutorService;
-
+import com.google.common.base.MoreObjects;
+import com.google.common.collect.Lists;
+import com.google.common.collect.Maps;
 import org.apache.commons.collections.CollectionUtils;
 import org.apache.commons.collections.MapUtils;
-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.packet.Ip4Address;
 import org.onosproject.app.ApplicationException;
 import org.onosproject.core.ApplicationId;
 import org.onosproject.core.CoreService;
-import org.onosproject.net.config.ConfigException;
 import org.onosproject.net.DeviceId;
+import org.onosproject.net.config.ConfigException;
 import org.onosproject.net.config.ConfigFactory;
 import org.onosproject.net.config.NetworkConfigEvent;
 import org.onosproject.net.config.NetworkConfigListener;
@@ -123,18 +81,57 @@
 import org.onosproject.tetopology.management.api.node.TerminationPointKey;
 import org.onosproject.tetopology.management.api.node.TtpKey;
 import org.onosproject.tetopology.management.api.node.TunnelTerminationPoint;
+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 com.google.common.base.MoreObjects;
-import com.google.common.collect.Lists;
-import com.google.common.collect.Maps;
+import java.util.BitSet;
+import java.util.List;
+import java.util.Map;
+import java.util.concurrent.ExecutorService;
+
+import static java.util.concurrent.Executors.newFixedThreadPool;
+import static org.onlab.util.Tools.groupedThreads;
+import static org.onosproject.net.config.NetworkConfigEvent.Type.CONFIG_ADDED;
+import static org.onosproject.net.config.NetworkConfigEvent.Type.CONFIG_UPDATED;
+import static org.onosproject.net.config.basics.SubjectFactories.APP_SUBJECT_FACTORY;
+import static org.onosproject.tetopology.management.api.OptimizationType.NOT_OPTIMIZED;
+import static org.onosproject.tetopology.management.api.TeTopology.BIT_CUSTOMIZED;
+import static org.onosproject.tetopology.management.api.TeTopology.BIT_LEARNT;
+import static org.onosproject.tetopology.management.api.TeTopology.BIT_MERGED;
+import static org.onosproject.tetopology.management.api.TeTopologyEvent.Type.LINK_ADDED;
+import static org.onosproject.tetopology.management.api.TeTopologyEvent.Type.LINK_REMOVED;
+import static org.onosproject.tetopology.management.api.TeTopologyEvent.Type.LINK_UPDATED;
+import static org.onosproject.tetopology.management.api.TeTopologyEvent.Type.NETWORK_ADDED;
+import static org.onosproject.tetopology.management.api.TeTopologyEvent.Type.NETWORK_REMOVED;
+import static org.onosproject.tetopology.management.api.TeTopologyEvent.Type.NODE_ADDED;
+import static org.onosproject.tetopology.management.api.TeTopologyEvent.Type.NODE_REMOVED;
+import static org.onosproject.tetopology.management.api.TeTopologyEvent.Type.NODE_UPDATED;
+import static org.onosproject.tetopology.management.api.TeTopologyEvent.Type.TE_LINK_ADDED;
+import static org.onosproject.tetopology.management.api.TeTopologyEvent.Type.TE_LINK_REMOVED;
+import static org.onosproject.tetopology.management.api.TeTopologyEvent.Type.TE_LINK_UPDATED;
+import static org.onosproject.tetopology.management.api.TeTopologyEvent.Type.TE_NODE_ADDED;
+import static org.onosproject.tetopology.management.api.TeTopologyEvent.Type.TE_NODE_REMOVED;
+import static org.onosproject.tetopology.management.api.TeTopologyEvent.Type.TE_NODE_UPDATED;
+import static org.onosproject.tetopology.management.api.TeTopologyEvent.Type.TE_TOPOLOGY_ADDED;
+import static org.onosproject.tetopology.management.api.TeTopologyEvent.Type.TE_TOPOLOGY_REMOVED;
+import static org.onosproject.tetopology.management.api.link.TeLink.BIT_ACCESS_INTERDOMAIN;
+import static org.onosproject.tetopology.management.impl.TeMgrUtil.linkBuilder;
+import static org.onosproject.tetopology.management.impl.TeMgrUtil.networkBuilder;
+import static org.onosproject.tetopology.management.impl.TeMgrUtil.networkLinkKey;
+import static org.onosproject.tetopology.management.impl.TeMgrUtil.networkNodeKey;
+import static org.onosproject.tetopology.management.impl.TeMgrUtil.nodeBuilder;
+import static org.onosproject.tetopology.management.impl.TeMgrUtil.toNetworkId;
+import static org.onosproject.tetopology.management.impl.TeMgrUtil.toNetworkLinkId;
 
 /**
  * Implementation of the topology management service.
  */
-@Component(immediate = true)
-@Service
+@Component(immediate = true, service = { TeTopologyService.class, TeTopologyProviderRegistry.class })
 public class TeTopologyManager
     extends AbstractListenerProviderRegistry<TeTopologyEvent, TeTopologyListener,
                                              TeTopologyProvider, TeTopologyProviderService>
@@ -154,25 +151,25 @@
 
     private final Logger log = LoggerFactory.getLogger(getClass());
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected CoreService coreService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected NetworkConfigRegistry cfgService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected DeviceService deviceService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected LinkService linkService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected DeviceProviderRegistry deviceProviderRegistry;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected LinkProviderRegistry linkProviderRegistry;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     public TeTopologyStore store;
 
     private TeTopologyStoreDelegate delegate = this::post;
diff --git a/apps/tetopology/app/src/test/java/org/onosproject/tetopology/management/SimpleTeTopologyStore.java b/apps/tetopology/app/src/test/java/org/onosproject/tetopology/management/SimpleTeTopologyStore.java
index 7f010fa..24dcad5 100644
--- a/apps/tetopology/app/src/test/java/org/onosproject/tetopology/management/SimpleTeTopologyStore.java
+++ b/apps/tetopology/app/src/test/java/org/onosproject/tetopology/management/SimpleTeTopologyStore.java
@@ -15,24 +15,10 @@
  */
 package org.onosproject.tetopology.management;
 
-import static org.onosproject.tetopology.management.api.OptimizationType.NOT_OPTIMIZED;
-import static org.onosproject.tetopology.management.api.TeTopologyEvent.Type.NETWORK_ADDED;
-import static org.onosproject.tetopology.management.api.TeTopologyEvent.Type.NETWORK_REMOVED;
-import static org.onosproject.tetopology.management.api.TeTopologyEvent.Type.TE_TOPOLOGY_ADDED;
-import static org.onosproject.tetopology.management.api.TeTopologyEvent.Type.TE_TOPOLOGY_REMOVED;
-import static org.slf4j.LoggerFactory.getLogger;
-
-import java.util.BitSet;
-import java.util.List;
-import java.util.Map;
-import java.util.concurrent.BlockingQueue;
-
+import com.google.common.collect.Lists;
+import com.google.common.collect.Maps;
 import org.apache.commons.collections.CollectionUtils;
 import org.apache.commons.collections.MapUtils;
-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.onosproject.net.DeviceId;
 import org.onosproject.store.AbstractStore;
 import org.onosproject.tetopology.management.api.CommonTopologyData;
@@ -81,16 +67,27 @@
 import org.onosproject.tetopology.management.impl.TeTopologyMapEvent;
 import org.onosproject.tetopology.management.impl.TeTopologyStore;
 import org.onosproject.tetopology.management.impl.TeTopologyStoreDelegate;
+import org.osgi.service.component.annotations.Activate;
+import org.osgi.service.component.annotations.Component;
+import org.osgi.service.component.annotations.Deactivate;
 import org.slf4j.Logger;
 
-import com.google.common.collect.Lists;
-import com.google.common.collect.Maps;
+import java.util.BitSet;
+import java.util.List;
+import java.util.Map;
+import java.util.concurrent.BlockingQueue;
+
+import static org.onosproject.tetopology.management.api.OptimizationType.NOT_OPTIMIZED;
+import static org.onosproject.tetopology.management.api.TeTopologyEvent.Type.NETWORK_ADDED;
+import static org.onosproject.tetopology.management.api.TeTopologyEvent.Type.NETWORK_REMOVED;
+import static org.onosproject.tetopology.management.api.TeTopologyEvent.Type.TE_TOPOLOGY_ADDED;
+import static org.onosproject.tetopology.management.api.TeTopologyEvent.Type.TE_TOPOLOGY_REMOVED;
+import static org.slf4j.LoggerFactory.getLogger;
 
 /**
  * Implementation of the TE network store.
  */
-@Component(immediate = true)
-@Service
+@Component(immediate = true, service = TeTopologyStore.class)
 public class SimpleTeTopologyStore
         extends AbstractStore<TeTopologyEvent, TeTopologyStoreDelegate>
         implements TeTopologyStore {
diff --git a/apps/tetunnel/BUCK b/apps/tetunnel/BUCK
deleted file mode 100644
index 73065c2..0000000
--- a/apps/tetunnel/BUCK
+++ /dev/null
@@ -1,14 +0,0 @@
-BUNDLES = [
-  '//apps/tetunnel/api:onos-apps-tetunnel-api',
-  '//apps/tetunnel/app:onos-apps-tetunnel-app',
-]
-
-onos_app (
-    app_name = 'org.onosproject.tetunnel',
-    title = 'TE Tunnel Core',
-    category = 'Traffic Engineering',
-    url = 'http://onosproject.org',
-    description = 'Application to create and manage TE tunnels.',
-    included_bundles = BUNDLES,
-    required_apps = [ 'org.onosproject.tetopology' ],
-)
diff --git a/apps/tetunnel/api/BUCK b/apps/tetunnel/api/BUCK
deleted file mode 100644
index eea4ec2..0000000
--- a/apps/tetunnel/api/BUCK
+++ /dev/null
@@ -1,9 +0,0 @@
-COMPILE_DEPS = [
-    '//lib:CORE_DEPS',
-    '//apps/tetopology/api:onos-apps-tetopology-api',
-    '//incubator/api:onos-incubator-api',
-]
-
-osgi_jar_with_tests (
-    deps = COMPILE_DEPS,
-)
diff --git a/apps/tetunnel/app/BUCK b/apps/tetunnel/app/BUCK
deleted file mode 100644
index aef55f0..0000000
--- a/apps/tetunnel/app/BUCK
+++ /dev/null
@@ -1,19 +0,0 @@
-COMPILE_DEPS = [
-    '//lib:CORE_DEPS',
-    '//lib:KRYO',
-    '//apps/tetopology/api:onos-apps-tetopology-api',
-    '//apps/tetunnel/api:onos-apps-tetunnel-api',
-    '//incubator/api:onos-incubator-api',
-    '//core/store/serializers:onos-core-serializers',
-]
-
-TEST_DEPS = [
-    '//lib:TEST_ADAPTERS',
-    '//utils/osgi:onlab-osgi-tests',
-    '//incubator/api:onos-incubator-api-tests',
-]
-
-osgi_jar_with_tests (
-    deps = COMPILE_DEPS,
-    test_deps = TEST_DEPS,
-)
diff --git a/apps/tetunnel/app/app.xml b/apps/tetunnel/app/app.xml
deleted file mode 100644
index 6f0ab72..0000000
--- a/apps/tetunnel/app/app.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-
-<!--
-  ~ Copyright 2016-present Open Networking Foundation
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~     http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License.
-  -->
-<app name="org.onosproject.tetunnel" origin="HUAWEI" version="${project.version}"
-     featuresRepo="mvn:${project.groupId}/${project.artifactId}/${project.version}/xml/features"
-     features="${project.artifactId}"
-     apps="org.onosproject.tetopology">
-    <description>${project.description}</description>
-    <artifact>mvn:${project.groupId}/onos-apps-tetunnel-api/${project.version}</artifact>
-    <artifact>mvn:${project.groupId}/${project.artifactId}/${project.version}</artifact>
-</app>
\ No newline at end of file
diff --git a/apps/tetunnel/app/features.xml b/apps/tetunnel/app/features.xml
deleted file mode 100644
index 545cdfd..0000000
--- a/apps/tetunnel/app/features.xml
+++ /dev/null
@@ -1,26 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
-
-<!--
-  ~ Copyright 2016-present Open Networking Foundation
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~     http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License.
-  -->
-<features xmlns="http://karaf.apache.org/xmlns/features/v1.2.0" name="${project.artifactId}-${project.version}">
-    <feature name="${project.artifactId}" version="${project.version}"
-             description="${project.description}">
-        <feature>onos-api</feature>
-        <bundle>mvn:${project.groupId}/onos-apps-tetopology-api/${project.version}</bundle>
-        <bundle>mvn:${project.groupId}/onos-apps-tetunnel-api/${project.version}</bundle>
-        <bundle>mvn:${project.groupId}/${project.artifactId}/${project.version}</bundle>
-    </feature>
-</features>
\ No newline at end of file
diff --git a/apps/tetunnel/app/src/main/java/org/onosproject/tetunnel/impl/DistributedTeTunnelStore.java b/apps/tetunnel/app/src/main/java/org/onosproject/tetunnel/impl/DistributedTeTunnelStore.java
index 8589b8d..e9da5e4 100644
--- a/apps/tetunnel/app/src/main/java/org/onosproject/tetunnel/impl/DistributedTeTunnelStore.java
+++ b/apps/tetunnel/app/src/main/java/org/onosproject/tetunnel/impl/DistributedTeTunnelStore.java
@@ -17,12 +17,6 @@
 package org.onosproject.tetunnel.impl;
 
 import com.google.common.collect.ImmutableList;
-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.KryoNamespace;
 import org.onosproject.incubator.net.tunnel.TunnelId;
 import org.onosproject.store.serializers.KryoNamespaces;
@@ -30,11 +24,16 @@
 import org.onosproject.store.service.LogicalClockService;
 import org.onosproject.store.service.StorageService;
 import org.onosproject.tetopology.management.api.TeTopologyKey;
+import org.onosproject.tetunnel.api.TeTunnelStore;
 import org.onosproject.tetunnel.api.lsp.TeLsp;
 import org.onosproject.tetunnel.api.lsp.TeLspKey;
 import org.onosproject.tetunnel.api.tunnel.TeTunnel;
-import org.onosproject.tetunnel.api.TeTunnelStore;
 import org.onosproject.tetunnel.api.tunnel.TeTunnelKey;
+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;
@@ -45,16 +44,15 @@
 /**
  * Manages the TE tunnel attributes using an eventually consistent map.
  */
-@Component(immediate = true)
-@Service
+@Component(immediate = true, service = TeTunnelStore.class)
 public class DistributedTeTunnelStore implements TeTunnelStore {
 
     private final Logger log = getLogger(getClass());
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected StorageService storageService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected LogicalClockService clockService;
 
     private EventuallyConsistentMap<TeTunnelKey, TeTunnel> teTunnels;
diff --git a/apps/tetunnel/app/src/main/java/org/onosproject/tetunnel/impl/TeTunnelManager.java b/apps/tetunnel/app/src/main/java/org/onosproject/tetunnel/impl/TeTunnelManager.java
index b071ce8..cd99d0c 100644
--- a/apps/tetunnel/app/src/main/java/org/onosproject/tetunnel/impl/TeTunnelManager.java
+++ b/apps/tetunnel/app/src/main/java/org/onosproject/tetunnel/impl/TeTunnelManager.java
@@ -16,12 +16,6 @@
 
 package org.onosproject.tetunnel.impl;
 
-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.core.ApplicationId;
 import org.onosproject.core.CoreService;
 import org.onosproject.core.GroupId;
@@ -37,15 +31,20 @@
 import org.onosproject.tetopology.management.api.TeTopology;
 import org.onosproject.tetopology.management.api.TeTopologyKey;
 import org.onosproject.tetopology.management.api.TeTopologyService;
-import org.onosproject.tetunnel.api.lsp.TeLsp;
-import org.onosproject.tetunnel.api.lsp.TeLspKey;
-import org.onosproject.tetunnel.api.tunnel.TeTunnel;
 import org.onosproject.tetunnel.api.TeTunnelAdminService;
 import org.onosproject.tetunnel.api.TeTunnelProviderService;
 import org.onosproject.tetunnel.api.TeTunnelService;
 import org.onosproject.tetunnel.api.TeTunnelStore;
+import org.onosproject.tetunnel.api.lsp.TeLsp;
+import org.onosproject.tetunnel.api.lsp.TeLspKey;
+import org.onosproject.tetunnel.api.tunnel.TeTunnel;
 import org.onosproject.tetunnel.api.tunnel.TeTunnelEndpoint;
 import org.onosproject.tetunnel.api.tunnel.TeTunnelKey;
+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;
@@ -56,8 +55,8 @@
 /**
  * Implementation of TE tunnel attributes management service.
  */
-@Component(immediate = true)
-@Service
+@Component(immediate = true, service = { TeTunnelService.class, TeTunnelAdminService.class,
+        TeTunnelProviderService.class })
 public class TeTunnelManager implements TeTunnelService, TeTunnelAdminService,
         TeTunnelProviderService {
 
@@ -65,19 +64,19 @@
 
     private final Logger log = getLogger(getClass());
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected CoreService coreService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected TeTunnelStore store;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected TunnelService tunnelService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected TunnelAdminService tunnelAdminService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected TeTopologyService teTopologyService;
 
     private ApplicationId appId;
diff --git a/apps/virtualbng/BUCK b/apps/virtualbng/BUCK
deleted file mode 100644
index 036ce08..0000000
--- a/apps/virtualbng/BUCK
+++ /dev/null
@@ -1,22 +0,0 @@
-COMPILE_DEPS = [
-    '//lib:CORE_DEPS',
-    '//lib:JACKSON',
-    '//lib:jersey-client',
-    '//lib:javax.ws.rs-api',
-    '//lib:org.apache.karaf.shell.console',
-    '//cli:onos-cli',
-    '//utils/rest:onlab-rest',
-]
-
-osgi_jar_with_tests (
-    deps = COMPILE_DEPS,
-    resources_root = 'src/main/resources',
-    resources = glob(['src/main/resources/**']),
-)
-
-onos_app (
-    title = 'Virtual Broadband Gateway',
-    category = 'Traffic Engineering',
-    url = 'http://onosproject.org',
-    description = 'A virtual Broadband Network Gateway(BNG) application.',
-)
diff --git a/apps/virtualbng/BUILD b/apps/virtualbng/BUILD
index 353fda5..6baa64d 100644
--- a/apps/virtualbng/BUILD
+++ b/apps/virtualbng/BUILD
@@ -1,6 +1,7 @@
 COMPILE_DEPS = CORE_DEPS + JACKSON + CLI + REST
 
 osgi_jar_with_tests(
+    karaf_command_packages = ["org.onosproject.virtualbng.cli"],
     resources = glob(["src/main/resources/**"]),
     resources_root = "src/main/resources",
     deps = COMPILE_DEPS,
diff --git a/apps/virtualbng/features.xml b/apps/virtualbng/features.xml
deleted file mode 100644
index 88d6934..0000000
--- a/apps/virtualbng/features.xml
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
-<!--
-  ~ Copyright 2015-present Open Networking Foundation
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~     http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License.
-  -->
-<features xmlns="http://karaf.apache.org/xmlns/features/v1.2.0" name="${project.artifactId}-${project.version}">
-    <feature name="${project.artifactId}" version="${project.version}"
-             description="${project.description}">
-        <bundle>mvn:org.glassfish.jersey.core/jersey-client/2.26</bundle>
-        <bundle>mvn:${project.groupId}/onos-apps-virtualbng/${project.version}</bundle>
-        <feature>onos-thirdparty-web</feature>
-    </feature>
-</features>
diff --git a/apps/virtualbng/src/main/java/org/onosproject/virtualbng/VbngConfigurationManager.java b/apps/virtualbng/src/main/java/org/onosproject/virtualbng/VbngConfigurationManager.java
index adc6966..20ad02c 100644
--- a/apps/virtualbng/src/main/java/org/onosproject/virtualbng/VbngConfigurationManager.java
+++ b/apps/virtualbng/src/main/java/org/onosproject/virtualbng/VbngConfigurationManager.java
@@ -16,14 +16,13 @@
 package org.onosproject.virtualbng;
 
 import com.fasterxml.jackson.databind.ObjectMapper;
-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.packet.IpPrefix;
 import org.onlab.packet.MacAddress;
 import org.onosproject.net.ConnectPoint;
+import org.osgi.service.component.annotations.Activate;
+import org.osgi.service.component.annotations.Component;
+import org.osgi.service.component.annotations.Deactivate;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -40,8 +39,7 @@
  * Implementation of ConfigurationService which reads virtual BNG
  * configuration from a file.
  */
-@Component(immediate = true)
-@Service
+@Component(immediate = true, service = VbngConfigurationService.class)
 public class VbngConfigurationManager implements VbngConfigurationService {
 
     private final Logger log = LoggerFactory.getLogger(getClass());
diff --git a/apps/virtualbng/src/main/java/org/onosproject/virtualbng/VbngManager.java b/apps/virtualbng/src/main/java/org/onosproject/virtualbng/VbngManager.java
index 35ca7f9..209d11d 100644
--- a/apps/virtualbng/src/main/java/org/onosproject/virtualbng/VbngManager.java
+++ b/apps/virtualbng/src/main/java/org/onosproject/virtualbng/VbngManager.java
@@ -18,12 +18,6 @@
 import com.fasterxml.jackson.databind.JsonNode;
 import com.fasterxml.jackson.databind.node.ArrayNode;
 import com.fasterxml.jackson.databind.node.ObjectNode;
-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.packet.Ethernet;
 import org.onlab.packet.IpAddress;
 import org.onlab.packet.IpPrefix;
@@ -44,6 +38,11 @@
 import org.onosproject.net.intent.IntentService;
 import org.onosproject.net.intent.Key;
 import org.onosproject.net.intent.PointToPointIntent;
+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;
 
@@ -63,8 +62,7 @@
  * (3) installs point to point intents for the host configured with private IP
  * address to access Internet
  */
-@Component(immediate = true)
-@Service
+@Component(immediate = true, service = VbngService.class)
 public class VbngManager implements VbngService {
 
     private static final String APP_NAME = "org.onosproject.virtualbng";
@@ -72,16 +70,16 @@
 
     private final Logger log = LoggerFactory.getLogger(getClass());
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected CoreService coreService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected HostService hostService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected IntentService intentService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected VbngConfigurationService vbngConfigurationService;
 
     private ApplicationId appId;
diff --git a/apps/virtualbng/src/main/java/org/onosproject/virtualbng/VirtualPublicHosts.java b/apps/virtualbng/src/main/java/org/onosproject/virtualbng/VirtualPublicHosts.java
index 1a45b0a..d483bbf 100644
--- a/apps/virtualbng/src/main/java/org/onosproject/virtualbng/VirtualPublicHosts.java
+++ b/apps/virtualbng/src/main/java/org/onosproject/virtualbng/VirtualPublicHosts.java
@@ -19,11 +19,11 @@
 
 import java.nio.ByteBuffer;
 
-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.ARP;
 import org.onlab.packet.Ethernet;
 import org.onlab.packet.Ip4Address;
@@ -63,13 +63,13 @@
     private static final String APP_NAME =
             "org.onosproject.virtualbng.VirtualPublicHosts";
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected CoreService coreService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected PacketService packetService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected VbngConfigurationService vbngConfigService;
 
     private ApplicationId appId;
diff --git a/apps/virtualbng/src/main/java/org/onosproject/virtualbng/cli/MappingListCommand.java b/apps/virtualbng/src/main/java/org/onosproject/virtualbng/cli/MappingListCommand.java
index b880dce..0dbf4a0 100644
--- a/apps/virtualbng/src/main/java/org/onosproject/virtualbng/cli/MappingListCommand.java
+++ b/apps/virtualbng/src/main/java/org/onosproject/virtualbng/cli/MappingListCommand.java
@@ -19,7 +19,8 @@
 import java.util.Map;
 import java.util.Map.Entry;
 
-import org.apache.karaf.shell.commands.Command;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onlab.packet.IpAddress;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.virtualbng.VbngConfigurationService;
@@ -27,6 +28,7 @@
 /**
  * Command to show the list of vBNG IP address mapping entries.
  */
+@Service
 @Command(scope = "onos", name = "vbngs",
         description = "Lists all vBNG IP address mapping entries")
 public class MappingListCommand extends AbstractShellCommand {
@@ -37,7 +39,7 @@
             "   %s - %s";
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
 
         VbngConfigurationService service =
                 AbstractShellCommand.get(VbngConfigurationService.class);
diff --git a/apps/virtualbng/src/main/resources/OSGI-INF/blueprint/shell-config.xml b/apps/virtualbng/src/main/resources/OSGI-INF/blueprint/shell-config.xml
deleted file mode 100644
index 33704fe..0000000
--- a/apps/virtualbng/src/main/resources/OSGI-INF/blueprint/shell-config.xml
+++ /dev/null
@@ -1,23 +0,0 @@
-<!--
-  ~ Copyright 2015-present Open Networking Foundation
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~     http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License.
-  -->
-<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0">
-
-    <command-bundle xmlns="http://karaf.apache.org/xmlns/shell/v1.1.0">
-        <command>
-            <action class="org.onosproject.virtualbng.cli.MappingListCommand"/>
-        </command>
-    </command-bundle>
-</blueprint>
diff --git a/apps/vpls/BUCK b/apps/vpls/BUCK
deleted file mode 100644
index d07376f..0000000
--- a/apps/vpls/BUCK
+++ /dev/null
@@ -1,29 +0,0 @@
-COMPILE_DEPS = [
-    '//lib:CORE_DEPS',
-    '//lib:JACKSON',
-    '//lib:KRYO',
-    '//lib:jersey-client',
-    '//lib:javax.ws.rs-api',
-    '//lib:org.apache.karaf.shell.console',
-    '//cli:onos-cli',
-    '//utils/rest:onlab-rest',
-    '//incubator/api:onos-incubator-api',
-    '//core/store/serializers:onos-core-serializers'
-]
-
-TEST_DEPS = [
-    '//lib:TEST_ADAPTERS',
-]
-
-osgi_jar_with_tests (
-    deps = COMPILE_DEPS,
-    test_deps = TEST_DEPS,
-)
-
-onos_app (
-    title = 'VLAN L2 Broadcast Network',
-    category = 'Traffic Engineering',
-    url = 'http://onosproject.org',
-    description = 'Application to create L2 broadcast network using VLAN.',
-    required_apps = [ 'org.onosproject.intentsynchronizer' ],
-)
diff --git a/apps/vpls/BUILD b/apps/vpls/BUILD
index 5e90e5b..07a23df 100644
--- a/apps/vpls/BUILD
+++ b/apps/vpls/BUILD
@@ -6,6 +6,10 @@
 
 osgi_jar_with_tests(
     exclude_tests = ["org.onosproject.vpls.VplsTest"],
+    karaf_command_packages = [
+        "org.onosproject.vpls.cli",
+        "org.onosproject.vpls.cli.completer",
+    ],
     test_deps = TEST_ADAPTERS,
     deps = COMPILE_DEPS,
 )
diff --git a/apps/vpls/src/main/java/org/onosproject/vpls/VplsManager.java b/apps/vpls/src/main/java/org/onosproject/vpls/VplsManager.java
index eab3395..425f77d 100644
--- a/apps/vpls/src/main/java/org/onosproject/vpls/VplsManager.java
+++ b/apps/vpls/src/main/java/org/onosproject/vpls/VplsManager.java
@@ -16,55 +16,53 @@
 package org.onosproject.vpls;
 
 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.apache.felix.scr.annotations.Service;
-import org.onosproject.net.intf.Interface;
-import org.onosproject.net.intf.InterfaceService;
 import org.onosproject.net.EncapsulationType;
 import org.onosproject.net.Host;
 import org.onosproject.net.host.HostEvent;
 import org.onosproject.net.host.HostListener;
 import org.onosproject.net.host.HostService;
+import org.onosproject.net.intf.Interface;
+import org.onosproject.net.intf.InterfaceService;
 import org.onosproject.store.StoreDelegate;
-import org.onosproject.vpls.api.VplsData;
-import org.onosproject.vpls.api.VplsOperationService;
-import org.onosproject.vpls.api.VplsOperation;
 import org.onosproject.vpls.api.Vpls;
+import org.onosproject.vpls.api.VplsData;
+import org.onosproject.vpls.api.VplsOperation;
+import org.onosproject.vpls.api.VplsOperationService;
 import org.onosproject.vpls.api.VplsStore;
 import org.onosproject.vpls.store.VplsStoreEvent;
+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.Set;
 
-import static java.util.Objects.*;
+import static java.util.Objects.requireNonNull;
 import static org.slf4j.LoggerFactory.getLogger;
 
 /**
  * Application to create L2 broadcast overlay networks using VLANs.
  */
-@Component(immediate = true)
-@Service
+@Component(immediate = true, service = Vpls.class)
 public class VplsManager implements Vpls {
     public static final String VPLS_APP = "org.onosproject.vpls";
     private static final String UNSUPPORTED_STORE_EVENT_TYPE =
             "Unsupported store event type {}.";
     private final Logger log = getLogger(getClass());
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected HostService hostService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected InterfaceService interfaceService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected VplsStore vplsStore;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected VplsOperationService operationService;
 
     private StoreDelegate<VplsStoreEvent> vplsStoreDelegate;
diff --git a/apps/vpls/src/main/java/org/onosproject/vpls/VplsNeighbourHandler.java b/apps/vpls/src/main/java/org/onosproject/vpls/VplsNeighbourHandler.java
index 2cbd412..fa360bb 100644
--- a/apps/vpls/src/main/java/org/onosproject/vpls/VplsNeighbourHandler.java
+++ b/apps/vpls/src/main/java/org/onosproject/vpls/VplsNeighbourHandler.java
@@ -15,11 +15,11 @@
  */
 package org.onosproject.vpls;
 
-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.MacAddress;
 import org.onlab.packet.VlanId;
 import org.onosproject.core.ApplicationId;
@@ -59,19 +59,19 @@
     private static final String CAN_NOT_FIND_VPLS =
             "Cannot find VPLS for port {} with VLAN Id {}.";
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected CoreService coreService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected InterfaceService interfaceService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected NeighbourResolutionService neighbourService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected VplsStore vplsStore;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected NetworkConfigService configService;
 
     private VplsInterfaceListener interfaceListener =
diff --git a/apps/vpls/src/main/java/org/onosproject/vpls/VplsOperationManager.java b/apps/vpls/src/main/java/org/onosproject/vpls/VplsOperationManager.java
index 08d117f..d05670c 100644
--- a/apps/vpls/src/main/java/org/onosproject/vpls/VplsOperationManager.java
+++ b/apps/vpls/src/main/java/org/onosproject/vpls/VplsOperationManager.java
@@ -19,12 +19,6 @@
 import com.google.common.collect.Maps;
 import com.google.common.collect.Queues;
 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.onlab.util.Tools;
 import org.onosproject.cluster.ClusterService;
 import org.onosproject.cluster.LeadershipEvent;
@@ -33,7 +27,6 @@
 import org.onosproject.cluster.NodeId;
 import org.onosproject.core.ApplicationId;
 import org.onosproject.core.CoreService;
-import org.onosproject.net.intf.Interface;
 import org.onosproject.net.Host;
 import org.onosproject.net.host.HostService;
 import org.onosproject.net.intent.Intent;
@@ -45,12 +38,18 @@
 import org.onosproject.net.intent.Key;
 import org.onosproject.net.intent.MultiPointToSinglePointIntent;
 import org.onosproject.net.intent.SinglePointToMultiPointIntent;
+import org.onosproject.net.intf.Interface;
 import org.onosproject.vpls.api.VplsData;
+import org.onosproject.vpls.api.VplsOperation;
 import org.onosproject.vpls.api.VplsOperationException;
 import org.onosproject.vpls.api.VplsOperationService;
-import org.onosproject.vpls.api.VplsOperation;
 import org.onosproject.vpls.api.VplsStore;
 import org.onosproject.vpls.intent.VplsIntentUtility;
+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;
@@ -77,27 +76,26 @@
  * Handles the execution order of the VPLS operations generated by the
  * application.
  */
-@Component(immediate = true)
-@Service
+@Component(immediate = true, service = VplsOperationService.class)
 public class VplsOperationManager implements VplsOperationService {
     private static final int NUM_THREADS = 4;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected CoreService coreService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected IntentService intentService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected LeadershipService leadershipService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected ClusterService clusterService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected HostService hostService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected VplsStore vplsStore;
 
     private final Logger log = getLogger(getClass());
diff --git a/apps/vpls/src/main/java/org/onosproject/vpls/cli/VplsCommand.java b/apps/vpls/src/main/java/org/onosproject/vpls/cli/VplsCommand.java
index 72489b1..0e060c5 100644
--- a/apps/vpls/src/main/java/org/onosproject/vpls/cli/VplsCommand.java
+++ b/apps/vpls/src/main/java/org/onosproject/vpls/cli/VplsCommand.java
@@ -16,8 +16,10 @@
 package org.onosproject.vpls.cli;
 
 import com.google.common.collect.ImmutableSet;
-import org.apache.karaf.shell.commands.Argument;
-import org.apache.karaf.shell.commands.Command;
+import org.apache.karaf.shell.api.action.Argument;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.Completion;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.net.intf.Interface;
 import org.onosproject.net.intf.InterfaceService;
@@ -25,6 +27,9 @@
 import org.onosproject.vpls.api.VplsData;
 import org.onosproject.vpls.api.Vpls;
 import org.onosproject.vpls.api.VplsData.VplsState;
+import org.onosproject.vpls.cli.completer.VplsCommandCompleter;
+import org.onosproject.vpls.cli.completer.VplsNameCompleter;
+import org.onosproject.vpls.cli.completer.VplsOptArgCompleter;
 
 import java.util.Collection;
 import java.util.Collections;
@@ -39,6 +44,7 @@
 /**
  * CLI to interact with the VPLS application.
  */
+@Service
 @Command(scope = "onos", name = "vpls",
         description = "Manages the VPLS application")
 public class VplsCommand extends AbstractShellCommand {
@@ -107,19 +113,22 @@
     @Argument(index = 0, name = "command", description = "Command name (add-if|" +
             "create|delete|list|rem-if|set-encap|show)",
             required = true, multiValued = false)
+    @Completion(VplsCommandCompleter.class)
     String command = null;
 
     @Argument(index = 1, name = "vplsName", description = "The name of the VPLS",
             required = false, multiValued = false)
+    @Completion(VplsNameCompleter.class)
     String vplsName = null;
 
     @Argument(index = 2, name = "optArg", description = "The interface name or" +
             " the encapsulation type for set-encap",
             required = false, multiValued = false)
+    @Completion(VplsOptArgCompleter.class)
     String optArg = null;
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         if (vpls == null) {
             vpls = get(Vpls.class);
         }
diff --git a/apps/vpls/src/main/java/org/onosproject/vpls/cli/completer/VplsCommandCompleter.java b/apps/vpls/src/main/java/org/onosproject/vpls/cli/completer/VplsCommandCompleter.java
index a0cdc99..4ab8e93 100644
--- a/apps/vpls/src/main/java/org/onosproject/vpls/cli/completer/VplsCommandCompleter.java
+++ b/apps/vpls/src/main/java/org/onosproject/vpls/cli/completer/VplsCommandCompleter.java
@@ -16,7 +16,7 @@
 package org.onosproject.vpls.cli.completer;
 
 import com.google.common.collect.Lists;
-import org.apache.karaf.shell.console.completer.ArgumentCompleter;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.cli.AbstractChoicesCompleter;
 import org.onosproject.vpls.cli.VplsCommandEnum;
 
@@ -26,15 +26,16 @@
 /**
  * VPLS command completer.
  */
+@Service
 public class VplsCommandCompleter extends AbstractChoicesCompleter {
 
     @Override
     public List<String> choices() {
-        ArgumentCompleter.ArgumentList argumentList = getArgumentList();
-        if (argumentList == null) {
+        if (commandLine.getArguments() == null) {
             return Collections.emptyList();
         }
-        List<String> argList = Lists.newArrayList(argumentList.getArguments());
+        List<String> argList = Lists.newArrayList();
+
         String argOne = null;
         if (argList.size() > 1) {
             argOne = argList.get(1);
diff --git a/apps/vpls/src/main/java/org/onosproject/vpls/cli/completer/VplsNameCompleter.java b/apps/vpls/src/main/java/org/onosproject/vpls/cli/completer/VplsNameCompleter.java
index d3ffb33..83f06e4 100644
--- a/apps/vpls/src/main/java/org/onosproject/vpls/cli/completer/VplsNameCompleter.java
+++ b/apps/vpls/src/main/java/org/onosproject/vpls/cli/completer/VplsNameCompleter.java
@@ -15,6 +15,7 @@
  */
 package org.onosproject.vpls.cli.completer;
 
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.cli.AbstractChoicesCompleter;
 import org.onosproject.vpls.api.Vpls;
 import org.onosproject.vpls.api.VplsData;
@@ -28,6 +29,7 @@
 /**
  * VPLS name completer.
  */
+@Service
 public class VplsNameCompleter extends AbstractChoicesCompleter {
 
     protected Vpls vpls;
diff --git a/apps/vpls/src/main/java/org/onosproject/vpls/cli/completer/VplsOptArgCompleter.java b/apps/vpls/src/main/java/org/onosproject/vpls/cli/completer/VplsOptArgCompleter.java
index 4b5ec46..c335369 100644
--- a/apps/vpls/src/main/java/org/onosproject/vpls/cli/completer/VplsOptArgCompleter.java
+++ b/apps/vpls/src/main/java/org/onosproject/vpls/cli/completer/VplsOptArgCompleter.java
@@ -15,12 +15,11 @@
  */
 package org.onosproject.vpls.cli.completer;
 
-import com.google.common.collect.Lists;
-import org.apache.karaf.shell.console.completer.ArgumentCompleter;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.cli.AbstractChoicesCompleter;
+import org.onosproject.net.EncapsulationType;
 import org.onosproject.net.intf.Interface;
 import org.onosproject.net.intf.InterfaceService;
-import org.onosproject.net.EncapsulationType;
 import org.onosproject.vpls.api.Vpls;
 import org.onosproject.vpls.api.VplsData;
 import org.onosproject.vpls.cli.VplsCommandEnum;
@@ -37,6 +36,7 @@
 /**
  * VPLS optional argument completer.
  */
+@Service
 public class VplsOptArgCompleter extends AbstractChoicesCompleter {
     protected Vpls vpls;
     protected InterfaceService interfaceService;
@@ -46,12 +46,11 @@
         if (vpls == null) {
             vpls = get(Vpls.class);
         }
-        ArgumentCompleter.ArgumentList argumentList = getArgumentList();
-        if (argumentList == null) {
+        String[] argList = commandLine.getArguments();
+        if (argList == null) {
             return Collections.emptyList();
         }
-        List<String> argList = Lists.newArrayList(argumentList.getArguments());
-        String argOne = argList.get(1);
+        String argOne = argList[1];
         VplsCommandEnum vplsCommandEnum = VplsCommandEnum.enumFromString(argOne);
         if (vplsCommandEnum != null) {
             switch (vplsCommandEnum) {
@@ -107,8 +106,7 @@
      * @return the list of interfaces associated to a VPLS
      */
     private List<String> vplsIfaces() {
-        ArgumentCompleter.ArgumentList list = getArgumentList();
-        String vplsName = list.getArguments()[2];
+        String vplsName = commandLine.getArguments()[2];
         VplsData vplsData = vpls.getVpls(vplsName);
         return vplsData.interfaces().stream()
                 .map(Interface::name)
diff --git a/apps/vpls/src/main/java/org/onosproject/vpls/config/VplsConfigManager.java b/apps/vpls/src/main/java/org/onosproject/vpls/config/VplsConfigManager.java
index 541953e..14a755e 100644
--- a/apps/vpls/src/main/java/org/onosproject/vpls/config/VplsConfigManager.java
+++ b/apps/vpls/src/main/java/org/onosproject/vpls/config/VplsConfigManager.java
@@ -17,11 +17,11 @@
 package org.onosproject.vpls.config;
 
 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.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.onosproject.cluster.LeadershipService;
 import org.onosproject.cluster.NodeId;
 import org.onosproject.core.ApplicationId;
@@ -67,22 +67,22 @@
     private final NetworkConfigListener configListener =
             new InternalNetworkConfigListener();
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected NetworkConfigService configService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected CoreService coreService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected InterfaceService interfaceService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected NetworkConfigRegistry registry;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected Vpls vpls;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected LeadershipService leadershipService;
 
     private ScheduledExecutorService reloadExecutor =
diff --git a/apps/vpls/src/main/java/org/onosproject/vpls/store/DistributedVplsStore.java b/apps/vpls/src/main/java/org/onosproject/vpls/store/DistributedVplsStore.java
index 4125399..1730002 100644
--- a/apps/vpls/src/main/java/org/onosproject/vpls/store/DistributedVplsStore.java
+++ b/apps/vpls/src/main/java/org/onosproject/vpls/store/DistributedVplsStore.java
@@ -15,17 +15,11 @@
  */
 package org.onosproject.vpls.store;
 
-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.KryoNamespace;
 import org.onosproject.core.ApplicationId;
 import org.onosproject.core.CoreService;
-import org.onosproject.net.intf.Interface;
 import org.onosproject.net.config.NetworkConfigService;
+import org.onosproject.net.intf.Interface;
 import org.onosproject.store.AbstractStore;
 import org.onosproject.store.StoreDelegate;
 import org.onosproject.store.serializers.KryoNamespaces;
@@ -37,9 +31,14 @@
 import org.onosproject.vpls.VplsManager;
 import org.onosproject.vpls.api.VplsData;
 import org.onosproject.vpls.api.VplsOperation;
-import org.onosproject.vpls.config.VplsAppConfig;
 import org.onosproject.vpls.api.VplsStore;
+import org.onosproject.vpls.config.VplsAppConfig;
 import org.onosproject.vpls.config.VplsConfig;
+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;
 
@@ -48,14 +47,13 @@
 import java.util.concurrent.CompletableFuture;
 import java.util.stream.Collectors;
 
-import static java.util.Objects.*;
+import static java.util.Objects.requireNonNull;
 
 /**
  * Implementation of VPLSConfigurationService which reads VPLS configuration
  * from the network configuration service.
  */
-@Component(immediate = true)
-@Service
+@Component(immediate = true, service = VplsStore.class)
 public class DistributedVplsStore
         extends AbstractStore<VplsStoreEvent, StoreDelegate<VplsStoreEvent>>
         implements VplsStore {
@@ -70,13 +68,13 @@
 
     private final Logger log = LoggerFactory.getLogger(getClass());
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected CoreService coreService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected StorageService storageService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected NetworkConfigService networkConfigService;
 
     private EventuallyConsistentMap<String, VplsData> vplsDataStore;
diff --git a/apps/vpls/src/main/resources/OSGI-INF/blueprint/shell-config.xml b/apps/vpls/src/main/resources/OSGI-INF/blueprint/shell-config.xml
deleted file mode 100644
index b61850c..0000000
--- a/apps/vpls/src/main/resources/OSGI-INF/blueprint/shell-config.xml
+++ /dev/null
@@ -1,34 +0,0 @@
-<!--
-  ~ Copyright 2014-present Open Networking Foundation
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~     http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-        ~ limitations under the License.
-  -->
-<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0">
-
-    <command-bundle xmlns="http://karaf.apache.org/xmlns/shell/v1.1.0">
-        <command>
-            <action class="org.onosproject.vpls.cli.VplsCommand"/>
-            <completers>
-                <ref component-id="vplsCommandCompleter"/>
-                <ref component-id="vplsNameCompleter"/>
-                <ref component-id="vplsOptArgCompleter"/>
-                <ref component-id="nullCompleter"/>
-            </completers>
-        </command>
-    </command-bundle>
-
-    <bean id="vplsCommandCompleter" class="org.onosproject.vpls.cli.completer.VplsCommandCompleter"/>
-    <bean id="vplsNameCompleter" class="org.onosproject.vpls.cli.completer.VplsNameCompleter"/>
-    <bean id="vplsOptArgCompleter" class="org.onosproject.vpls.cli.completer.VplsOptArgCompleter"/>
-    <bean id="nullCompleter" class="org.apache.karaf.shell.console.completer.NullCompleter"/>
-</blueprint>
\ No newline at end of file
diff --git a/apps/vpls/src/test/java/org/onosproject/vpls/cli/VplsCommandTest.java b/apps/vpls/src/test/java/org/onosproject/vpls/cli/VplsCommandTest.java
index dfe146b..099bd33 100644
--- a/apps/vpls/src/test/java/org/onosproject/vpls/cli/VplsCommandTest.java
+++ b/apps/vpls/src/test/java/org/onosproject/vpls/cli/VplsCommandTest.java
@@ -68,7 +68,7 @@
     public void testCreate() {
         vplsCommand.command = VplsCommandEnum.CREATE.toString();
         vplsCommand.vplsName = VPLS1;
-        vplsCommand.execute();
+        vplsCommand.doExecute();
         Collection<VplsData> vplss = vplsCommand.vpls.getAllVpls();
         assertEquals(1, vplss.size());
         VplsData result = vplss.iterator().next();
@@ -86,12 +86,12 @@
         vplsCommand.command = VplsCommandEnum.ADD_IFACE.toString();
         vplsCommand.vplsName = VPLS1;
         vplsCommand.optArg = V100H1.name();
-        vplsCommand.execute();
+        vplsCommand.doExecute();
 
         vplsCommand.command = VplsCommandEnum.ADD_IFACE.toString();
         vplsCommand.vplsName = VPLS1;
         vplsCommand.optArg = V200H1.name();
-        vplsCommand.execute();
+        vplsCommand.doExecute();
 
         Collection<VplsData> vplss = vplsCommand.vpls.getAllVpls();
         assertEquals(1, vplss.size());
@@ -113,7 +113,7 @@
         vplsCommand.command = VplsCommandEnum.REMOVE_IFACE.toString();
         vplsCommand.vplsName = VPLS1;
         vplsCommand.optArg = V200H1.name();
-        vplsCommand.execute();
+        vplsCommand.doExecute();
 
         Collection<VplsData> vplss = vplsCommand.vpls.getAllVpls();
         assertEquals(1, vplss.size());
@@ -133,7 +133,7 @@
         PrintStream ps = new PrintStream(baos);
         System.setOut(ps);
         vplsCommand.command = VplsCommandEnum.LIST.toString();
-        vplsCommand.execute();
+        vplsCommand.doExecute();
         String result = baos.toString();
 
         assertEquals(LIST_OUTPUT, result);
@@ -150,7 +150,7 @@
         vplsCommand.command = VplsCommandEnum.SET_ENCAP.toString();
         vplsCommand.vplsName = VPLS1;
         vplsCommand.optArg = EncapsulationType.NONE.name();
-        vplsCommand.execute();
+        vplsCommand.doExecute();
         VplsData result = vplsCommand.vpls.getVpls(VPLS1);
         assertEquals(result.encapsulationType(), EncapsulationType.NONE);
 
@@ -158,7 +158,7 @@
         vplsCommand.command = VplsCommandEnum.SET_ENCAP.toString();
         vplsCommand.vplsName = VPLS1;
         vplsCommand.optArg = EncapsulationType.VLAN.name();
-        vplsCommand.execute();
+        vplsCommand.doExecute();
         result = vplsCommand.vpls.getVpls(VPLS1);
         assertEquals(result.encapsulationType(), EncapsulationType.VLAN);
 
@@ -166,7 +166,7 @@
         vplsCommand.command = VplsCommandEnum.SET_ENCAP.toString();
         vplsCommand.vplsName = VPLS1;
         vplsCommand.optArg = EncapsulationType.MPLS.name();
-        vplsCommand.execute();
+        vplsCommand.doExecute();
         result = vplsCommand.vpls.getVpls(VPLS1);
         assertEquals(result.encapsulationType(), EncapsulationType.MPLS);
     }
@@ -179,7 +179,7 @@
         ((TestVpls) vplsCommand.vpls).initSampleData();
         vplsCommand.command = VplsCommandEnum.DELETE.toString();
         vplsCommand.vplsName = VPLS1;
-        vplsCommand.execute();
+        vplsCommand.doExecute();
         Collection<VplsData> vplss = vplsCommand.vpls.getAllVpls();
         assertEquals(1, vplss.size());
     }
@@ -194,7 +194,7 @@
         PrintStream ps = new PrintStream(baos);
         System.setOut(ps);
         vplsCommand.command = VplsCommandEnum.SHOW.toString();
-        vplsCommand.execute();
+        vplsCommand.doExecute();
         String result = baos.toString();
         assertEquals(SHOW_ALL_RES, result);
     }
@@ -210,7 +210,7 @@
         System.setOut(ps);
         vplsCommand.command = VplsCommandEnum.SHOW.toString();
         vplsCommand.vplsName = VPLS1;
-        vplsCommand.execute();
+        vplsCommand.doExecute();
         String result = baos.toString();
         assertEquals(SHOW_ONE_RES, result);
     }
@@ -227,7 +227,7 @@
         vplsCommand.command = VplsCommandEnum.ADD_IFACE.toString();
         vplsCommand.vplsName = VPLS1;
         vplsCommand.optArg = V200H1.name();
-        vplsCommand.execute();
+        vplsCommand.doExecute();
 
         String result = baos.toString();
         assertEquals(IFACE_ALREADY_USED, result);
@@ -240,7 +240,7 @@
     public void testClean() {
         ((TestVpls) vplsCommand.vpls).initSampleData();
         vplsCommand.command = VplsCommandEnum.CLEAN.toString();
-        vplsCommand.execute();
+        vplsCommand.doExecute();
         Collection<VplsData> vplss = vplsCommand.vpls.getAllVpls();
         assertEquals(0, vplss.size());
     }
diff --git a/apps/vpls/src/test/java/org/onosproject/vpls/cli/completer/VplsCommandCompleterTest.java b/apps/vpls/src/test/java/org/onosproject/vpls/cli/completer/VplsCommandCompleterTest.java
index eaac572..bf865a4 100644
--- a/apps/vpls/src/test/java/org/onosproject/vpls/cli/completer/VplsCommandCompleterTest.java
+++ b/apps/vpls/src/test/java/org/onosproject/vpls/cli/completer/VplsCommandCompleterTest.java
@@ -18,9 +18,12 @@
 
 import com.google.common.collect.ImmutableList;
 import org.apache.felix.service.command.CommandSession;
-import org.apache.karaf.shell.console.CommandSessionHolder;
-import org.apache.karaf.shell.console.completer.ArgumentCompleter;
+import org.apache.felix.service.command.Job;
+import org.apache.felix.service.command.JobListener;
+//import org.apache.karaf.shell.console.CommandSessionHolder;
+//import org.apache.karaf.shell.console.completer.ArgumentCompleter;
 import org.junit.Before;
+import org.junit.Ignore;
 import org.junit.Test;
 import org.onosproject.net.intf.Interface;
 import org.onosproject.net.EncapsulationType;
@@ -29,12 +32,14 @@
 
 import java.io.InputStream;
 import java.io.PrintStream;
+import java.nio.file.Path;
 import java.util.Arrays;
 import java.util.List;
 import java.util.stream.Collectors;
 
 import static org.junit.Assert.*;
 
+@Ignore("FIXME implement for new karaf CLI classes")
 public class VplsCommandCompleterTest extends VplsTest {
     private static final String VPLS_CMD = "vpls";
     private TestCommandSession commandSession;
@@ -42,7 +47,7 @@
     @Before
     public void setup() {
         commandSession = new TestCommandSession();
-        CommandSessionHolder.setSession(commandSession);
+        //CommandSessionHolder.setSession(commandSession);
     }
 
     /**
@@ -124,13 +129,49 @@
      * Test command session.
      */
     class TestCommandSession implements CommandSession {
-        ArgumentCompleter.ArgumentList argumentList;
+        //ArgumentCompleter.ArgumentList argumentList;
+
+        @Override
+        public Path currentDir() {
+            return null;
+        }
+
+        @Override
+        public void currentDir(Path path) {
+
+        }
+
+        @Override
+        public ClassLoader classLoader() {
+            return null;
+        }
+
+        @Override
+        public void classLoader(ClassLoader classLoader) {
+
+        }
+
+        @Override
+        public List<Job> jobs() {
+            return null;
+        }
+
+        @Override
+        public Job foregroundJob() {
+            return null;
+        }
+
+        @Override
+        public void setJobListener(JobListener jobListener) {
+
+        }
+
         public TestCommandSession() {
             String[] emptyStringArr = new String[0];
-            argumentList = new ArgumentCompleter.ArgumentList(emptyStringArr,
-                                                              0,
-                                                              0,
-                                                              0);
+            //argumentList = new ArgumentCompleter.ArgumentList(emptyStringArr,
+            //                                                  0,
+            //                                                  0,
+            //                                                  0);
         }
 
         /**
@@ -139,10 +180,10 @@
          * @param args new arguments
          */
         public void updateArguments(String... args) {
-            argumentList = new ArgumentCompleter.ArgumentList(args,
-                                                              0,
-                                                              0,
-                                                              0);
+            //argumentList = new ArgumentCompleter.ArgumentList(args,
+            //                                                  0,
+            //                                                  0,
+            //                                                  0);
         }
 
         @Override
@@ -167,12 +208,13 @@
 
         @Override
         public Object get(String s) {
-            return argumentList;
+            return "";
+            //return argumentList;
         }
 
         @Override
-        public void put(String s, Object o) {
-
+        public String put(String s, Object o) {
+            return "";
         }
 
         @Override
diff --git a/apps/vrouter/BUCK b/apps/vrouter/BUCK
deleted file mode 100644
index bc51d54..0000000
--- a/apps/vrouter/BUCK
+++ /dev/null
@@ -1,23 +0,0 @@
-COMPILE_DEPS = [
-    '//lib:CORE_DEPS',
-    '//incubator/api:onos-incubator-api',
-]
-
-BUNDLES = [
-    '//apps/routing-api:onos-apps-routing-api',
-    '//apps/routing/common:onos-apps-routing-common',
-    '//apps/vrouter:onos-apps-vrouter',
-]
-
-osgi_jar (
-    deps = COMPILE_DEPS,
-)
-
-onos_app (
-    title = 'Virtual Router',
-    category = 'Traffic Engineering',
-    url = 'http://onosproject.org',
-    included_bundles = BUNDLES,
-    description = 'Virtual router (vRouter) application.',
-    required_apps = [ 'org.onosproject.fibinstaller', 'org.onosproject.cpr', 'org.onosproject.fpm' ],
-)
diff --git a/apps/vrouter/src/main/java/org/onosproject/vrouter/Vrouter.java b/apps/vrouter/src/main/java/org/onosproject/vrouter/Vrouter.java
index 972ff24..5410339 100644
--- a/apps/vrouter/src/main/java/org/onosproject/vrouter/Vrouter.java
+++ b/apps/vrouter/src/main/java/org/onosproject/vrouter/Vrouter.java
@@ -16,11 +16,11 @@
 package org.onosproject.vrouter;
 
 import com.google.common.collect.Lists;
-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.onosproject.core.ApplicationId;
 import org.onosproject.core.CoreService;
 import org.onosproject.component.ComponentService;
@@ -40,10 +40,10 @@
     private static final String APP_NAME = "org.onosproject.vrouter";
     private static final String DIRECT_HOST_MGR = "org.onosproject.routing.impl.DirectHostManager";
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     private CoreService coreService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     private ComponentService componentService;
 
     private ApplicationId appId;
diff --git a/apps/vtn/BUCK b/apps/vtn/BUCK
deleted file mode 100644
index 3afd56d..0000000
--- a/apps/vtn/BUCK
+++ /dev/null
@@ -1,14 +0,0 @@
-BUNDLES = [
-    '//apps/vtn/vtnrsc:onos-apps-vtn-vtnrsc',
-    '//apps/vtn/sfcmgr:onos-apps-vtn-sfcmgr',
-    '//apps/vtn/vtnmgr:onos-apps-vtn-vtnmgr',
-    '//apps/vtn/vtnweb:onos-apps-vtn-vtnweb',
-]
-
-onos_app (
-  title = 'OPNFV',
-  url = 'http://onosproject.org',
-  category = 'Integration',
-  included_bundles = BUNDLES,
-  description = 'ONOS framework applications',
-)
diff --git a/apps/vtn/app/app.xml b/apps/vtn/app/app.xml
deleted file mode 100644
index 270e274..0000000
--- a/apps/vtn/app/app.xml
+++ /dev/null
@@ -1,27 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-  ~ Copyright 2015-present Open Networking Foundation
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~     http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License.
-  -->
-<app name="org.onosproject.vtn" origin="ON.Lab" version="${project.version}"
-     category="Utility" url="http://onosproject.org" title="OPNFV App"
-     featuresRepo="mvn:${project.groupId}/${project.artifactId}/${project.version}/xml/features"
-     features="${project.artifactId}">
-    <description>${project.description}</description>
-    <artifact>mvn:${project.groupId}/onos-apps-vtn-vtnmgr/${project.version}</artifact>
-    <artifact>mvn:${project.groupId}/onos-apps-vtn-sfcmgr/${project.version}</artifact>
-    <artifact>mvn:${project.groupId}/onos-apps-vtn-vtnweb/${project.version}</artifact>
-    <artifact>mvn:${project.groupId}/onos-apps-vtn-vtnrsc/${project.version}</artifact>
-    <artifact>mvn:${project.groupId}/onos-apps-vtn-sfcweb/${project.version}</artifact>
-</app>
diff --git a/apps/vtn/app/features.xml b/apps/vtn/app/features.xml
deleted file mode 100644
index 374102c..0000000
--- a/apps/vtn/app/features.xml
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
-<!--
-  ~ Copyright 2015-present Open Networking Foundation
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~     http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License.
-  -->
-<features xmlns="http://karaf.apache.org/xmlns/features/v1.2.0" name="${project.artifactId}-${project.version}">
-    <feature name="${project.artifactId}" version="${project.version}"
-             description="${project.description}">
-        <feature>onos-api</feature>
-        <feature>onos-drivers-default</feature>
-        <bundle>mvn:${project.groupId}/onos-apps-vtn-vtnmgr/${project.version}</bundle>
-        <bundle>mvn:${project.groupId}/onos-apps-vtn-sfcmgr/${project.version}</bundle>
-        <bundle>mvn:${project.groupId}/onos-apps-vtn-vtnweb/${project.version}</bundle>
-        <bundle>mvn:${project.groupId}/onos-apps-vtn-vtnrsc/${project.version}</bundle>
-        <bundle>mvn:${project.groupId}/onos-apps-vtn-sfcweb/${project.version}</bundle>
-    </feature>
-</features>
diff --git a/apps/vtn/sfcmgr/BUCK b/apps/vtn/sfcmgr/BUCK
deleted file mode 100644
index 9941797..0000000
--- a/apps/vtn/sfcmgr/BUCK
+++ /dev/null
@@ -1,15 +0,0 @@
-COMPILE_DEPS = [
-    '//lib:CORE_DEPS',
-    '//lib:KRYO',
-    '//core/store/serializers:onos-core-serializers',
-    '//apps/vtn/vtnrsc:onos-apps-vtn-vtnrsc',
-]
-
-TEST_DEPS = [
-    '//lib:TEST_ADAPTERS',
-]
-
-osgi_jar_with_tests (
-    deps = COMPILE_DEPS,
-    test_deps = TEST_DEPS,
-)
diff --git a/apps/vtn/sfcmgr/src/main/java/org/onosproject/sfc/manager/impl/SfcManager.java b/apps/vtn/sfcmgr/src/main/java/org/onosproject/sfc/manager/impl/SfcManager.java
index 2bc8e39..d403502 100644
--- a/apps/vtn/sfcmgr/src/main/java/org/onosproject/sfc/manager/impl/SfcManager.java
+++ b/apps/vtn/sfcmgr/src/main/java/org/onosproject/sfc/manager/impl/SfcManager.java
@@ -15,21 +15,7 @@
  */
 package org.onosproject.sfc.manager.impl;
 
-import static org.slf4j.LoggerFactory.getLogger;
-
-import java.util.Collection;
-import java.util.Iterator;
-import java.util.List;
-import java.util.ListIterator;
-import java.util.Set;
-import java.util.UUID;
-
-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.Lists;
 import org.onlab.packet.Ethernet;
 import org.onlab.packet.IPv4;
 import org.onlab.packet.IpAddress;
@@ -81,15 +67,26 @@
 import org.onosproject.vtnrsc.portpairgroup.PortPairGroupService;
 import org.onosproject.vtnrsc.service.VtnRscService;
 import org.onosproject.vtnrsc.virtualport.VirtualPortService;
+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.Lists;
+import java.util.Collection;
+import java.util.Iterator;
+import java.util.List;
+import java.util.ListIterator;
+import java.util.Set;
+import java.util.UUID;
+
+import static org.slf4j.LoggerFactory.getLogger;
 
 /**
  * Provides implementation of SFC Service.
  */
-@Component(immediate = true)
-@Service
+@Component(immediate = true, service = SfcService.class)
 public class SfcManager implements SfcService {
 
     private final Logger log = getLogger(getClass());
@@ -100,28 +97,28 @@
     private static final int MAX_NSH_SPI_ID = 0x7FFFF;
     private static final int MAX_LOAD_BALANCE_ID = 0x20;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected VtnRscService vtnRscService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected CoreService coreService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected PacketService packetService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected PortChainService portChainService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected PortPairGroupService portPairGroupService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected FlowClassifierService flowClassifierService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected VirtualPortService virtualPortService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected StorageService storageService;
 
     protected SfcPacketProcessor processor = new SfcPacketProcessor();
diff --git a/apps/vtn/sfcweb/src/main/java/org/onosproject/sfcweb/SfcwebUiTopovComponent.java b/apps/vtn/sfcweb/src/main/java/org/onosproject/sfcweb/SfcwebUiTopovComponent.java
index 049efbb..ddd6fa2 100644
--- a/apps/vtn/sfcweb/src/main/java/org/onosproject/sfcweb/SfcwebUiTopovComponent.java
+++ b/apps/vtn/sfcweb/src/main/java/org/onosproject/sfcweb/SfcwebUiTopovComponent.java
@@ -16,11 +16,11 @@
 package org.onosproject.sfcweb;
 
 import com.google.common.collect.ImmutableList;
-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.onosproject.ui.UiExtension;
 import org.onosproject.ui.UiExtensionService;
 import org.onosproject.ui.UiMessageHandlerFactory;
@@ -43,7 +43,7 @@
 
     private final Logger log = LoggerFactory.getLogger(getClass());
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected UiExtensionService uiExtensionService;
 
     // List of application views
diff --git a/apps/vtn/vtnmgr/BUCK b/apps/vtn/vtnmgr/BUCK
deleted file mode 100644
index fdaf355..0000000
--- a/apps/vtn/vtnmgr/BUCK
+++ /dev/null
@@ -1,15 +0,0 @@
-COMPILE_DEPS = [
-    '//lib:CORE_DEPS',
-    '//lib:JACKSON',
-    '//lib:KRYO',
-    '//lib:org.apache.karaf.shell.console',
-    '//core/store/serializers:onos-core-serializers',
-    '//cli:onos-cli',
-    '//apps/vtn/vtnrsc:onos-apps-vtn-vtnrsc',
-]
-
-osgi_jar_with_tests (
-    deps = COMPILE_DEPS,
-    resources_root = 'src/main/resources',
-    resources = glob(['src/main/resources/**']),
-)
diff --git a/apps/vtn/vtnmgr/BUILD b/apps/vtn/vtnmgr/BUILD
index 0ae2ab8..d399cdc 100644
--- a/apps/vtn/vtnmgr/BUILD
+++ b/apps/vtn/vtnmgr/BUILD
@@ -4,6 +4,7 @@
 ]
 
 osgi_jar_with_tests(
+    karaf_command_packages = ["org.onosproject.vtn.cli"],
     resources = glob(["src/main/resources/**"]),
     resources_root = "src/main/resources",
     deps = COMPILE_DEPS,
diff --git a/apps/vtn/vtnmgr/src/main/java/org/onosproject/vtn/cli/VtnCommand.java b/apps/vtn/vtnmgr/src/main/java/org/onosproject/vtn/cli/VtnCommand.java
index a88afae..1fed65f 100644
--- a/apps/vtn/vtnmgr/src/main/java/org/onosproject/vtn/cli/VtnCommand.java
+++ b/apps/vtn/vtnmgr/src/main/java/org/onosproject/vtn/cli/VtnCommand.java
@@ -15,14 +15,16 @@
  */
 package org.onosproject.vtn.cli;
 
-import org.apache.karaf.shell.commands.Command;
-import org.apache.karaf.shell.commands.Option;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.Option;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.vtn.manager.impl.VtnManager;
 
 /**
  * Supports for updating the external gateway virtualPort.
  */
+@Service
 @Command(scope = "onos", name = "externalportname-set",
         description = "Supports for setting the external port name.")
 public class VtnCommand extends AbstractShellCommand {
@@ -32,7 +34,7 @@
     String exPortName = "";
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         VtnManager.setExPortName(exPortName);
     }
 }
diff --git a/apps/vtn/vtnmgr/src/main/java/org/onosproject/vtn/manager/impl/VtnManager.java b/apps/vtn/vtnmgr/src/main/java/org/onosproject/vtn/manager/impl/VtnManager.java
index c3c5af9..427aba8 100644
--- a/apps/vtn/vtnmgr/src/main/java/org/onosproject/vtn/manager/impl/VtnManager.java
+++ b/apps/vtn/vtnmgr/src/main/java/org/onosproject/vtn/manager/impl/VtnManager.java
@@ -15,29 +15,8 @@
  */
 package org.onosproject.vtn.manager.impl;
 
-import static org.onosproject.net.flow.instructions.ExtensionTreatmentType.ExtensionTreatmentTypes.NICIRA_SET_TUNNEL_DST;
-import static org.slf4j.LoggerFactory.getLogger;
-
-import java.nio.ByteBuffer;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import java.util.UUID;
-import java.util.concurrent.ConcurrentHashMap;
-import java.util.stream.Collectors;
-
-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.Lists;
+import com.google.common.collect.Sets;
 import org.onlab.packet.ARP;
 import org.onlab.packet.Ethernet;
 import org.onlab.packet.IPv4;
@@ -146,69 +125,87 @@
 import org.onosproject.vtnrsc.subnet.SubnetService;
 import org.onosproject.vtnrsc.tenantnetwork.TenantNetworkService;
 import org.onosproject.vtnrsc.virtualport.VirtualPortService;
+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.Lists;
-import com.google.common.collect.Sets;
+import java.nio.ByteBuffer;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.UUID;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.stream.Collectors;
+
+import static org.onosproject.net.flow.instructions.ExtensionTreatmentType.ExtensionTreatmentTypes.NICIRA_SET_TUNNEL_DST;
+import static org.slf4j.LoggerFactory.getLogger;
 
 /**
  * Provides implementation of VTNService.
  */
-@Component(immediate = true)
-@Service
+@Component(immediate = true, service = VtnService.class)
 public class VtnManager implements VtnService {
     private final Logger log = getLogger(getClass());
     private static final String APP_ID = "org.onosproject.app.vtn";
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected NetworkConfigService configService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected DeviceService deviceService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected HostService hostService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected CoreService coreService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected StorageService storageService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected TenantNetworkService tenantNetworkService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected VirtualPortService virtualPortService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected DriverService driverService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected LogicalClockService clockService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected MastershipService mastershipService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected GroupService groupService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected SubnetService subnetService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected VtnRscService vtnRscService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected FloatingIpService floatingIpService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected RouterInterfaceService routerInterfaceService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected FlowRuleService flowRuleService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected NetworkConfigService networkConfigService;
 
     private ApplicationId appId;
@@ -252,7 +249,7 @@
     private static ConsistentMap<String, String> exPortMap;
 
     private VtnL3PacketProcessor l3PacketProcessor = new VtnL3PacketProcessor();
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected PacketService packetService;
 
     @Activate
diff --git a/apps/vtn/vtnmgr/src/main/resources/OSGI-INF/blueprint/shell-config.xml b/apps/vtn/vtnmgr/src/main/resources/OSGI-INF/blueprint/shell-config.xml
deleted file mode 100644
index 98a44ce..0000000
--- a/apps/vtn/vtnmgr/src/main/resources/OSGI-INF/blueprint/shell-config.xml
+++ /dev/null
@@ -1,23 +0,0 @@
-<!--
-  ~ Copyright 2015-present Open Networking Foundation
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~     http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License.
-  -->
-<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0">
-
-  <command-bundle xmlns="http://karaf.apache.org/xmlns/shell/v1.1.0">
-    <command>
-      <action class="org.onosproject.vtn.cli.VtnCommand"/>
-    </command>
-  </command-bundle>
-</blueprint>
diff --git a/apps/vtn/vtnrsc/BUCK b/apps/vtn/vtnrsc/BUCK
deleted file mode 100644
index c4d5920..0000000
--- a/apps/vtn/vtnrsc/BUCK
+++ /dev/null
@@ -1,16 +0,0 @@
-COMPILE_DEPS = [
-    '//lib:CORE_DEPS',
-    '//lib:KRYO',
-    '//lib:org.apache.karaf.shell.console',
-    '//cli:onos-cli',
-    '//core/store/serializers:onos-core-serializers',
-]
-
-TEST_DEPS = [
-    '//lib:TEST_REST',
-]
-
-osgi_jar_with_tests (
-    deps = COMPILE_DEPS,
-    test_deps = TEST_DEPS,
-)
diff --git a/apps/vtn/vtnrsc/BUILD b/apps/vtn/vtnrsc/BUILD
index df0a9a9..167e717 100644
--- a/apps/vtn/vtnrsc/BUILD
+++ b/apps/vtn/vtnrsc/BUILD
@@ -7,6 +7,15 @@
         "org/onosproject/vtnrsc/util/VtnEventuallyConsistentMapTest",
         "org/onosproject/vtnrsc/util/VtnStorageServiceTest",
     ],
+    karaf_command_packages = [
+        "org.onosproject.vtnrsc.cli",
+        "org.onosproject.vtnrsc.cli.virtualport",
+        "org.onosproject.vtnrsc.cli.subnet",
+        "org.onosproject.vtnrsc.cli.routerinterface",
+        "org.onosproject.vtnrsc.cli.router",
+        "org.onosproject.vtnrsc.cli.network",
+        "org.onosproject.vtnrsc.cli.floatingip",
+    ],
     test_deps = TEST_REST,
     deps = COMPILE_DEPS,
 )
diff --git a/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/classifier/impl/ClassifierManager.java b/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/classifier/impl/ClassifierManager.java
index 378f478..74bf8b6 100644
--- a/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/classifier/impl/ClassifierManager.java
+++ b/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/classifier/impl/ClassifierManager.java
@@ -15,34 +15,31 @@
  */
 package org.onosproject.vtnrsc.classifier.impl;
 
-import static org.slf4j.LoggerFactory.getLogger;
-
-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.ImmutableList;
 import org.onosproject.net.DeviceId;
 import org.onosproject.store.serializers.KryoNamespaces;
 import org.onosproject.store.service.DistributedSet;
 import org.onosproject.store.service.Serializer;
 import org.onosproject.store.service.StorageService;
 import org.onosproject.vtnrsc.classifier.ClassifierService;
+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.ImmutableList;
+import static org.slf4j.LoggerFactory.getLogger;
 
 /**
  * Provides implementation of the Classifier Service.
  */
-@Component(immediate = true)
-@Service
+@Component(immediate = true, service = ClassifierService.class)
 public class ClassifierManager implements ClassifierService {
 
     private final Logger log = getLogger(ClassifierManager.class);
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected StorageService storageService;
 
     private DistributedSet<DeviceId> classifierList;
diff --git a/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/cli/floatingip/FloatingIpCreateCommand.java b/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/cli/floatingip/FloatingIpCreateCommand.java
index 991df52..e21cbc3 100644
--- a/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/cli/floatingip/FloatingIpCreateCommand.java
+++ b/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/cli/floatingip/FloatingIpCreateCommand.java
@@ -17,9 +17,10 @@
 
 import java.util.Set;
 
-import org.apache.karaf.shell.commands.Argument;
-import org.apache.karaf.shell.commands.Command;
-import org.apache.karaf.shell.commands.Option;
+import org.apache.karaf.shell.api.action.Argument;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.Option;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onlab.packet.IpAddress;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.vtnrsc.DefaultFloatingIp;
@@ -37,6 +38,7 @@
 /**
  * Supports for create a floating IP.
  */
+@Service
 @Command(scope = "onos", name = "floatingip-create",
         description = "Supports for creating a floating IP")
 public class FloatingIpCreateCommand extends AbstractShellCommand {
@@ -73,7 +75,7 @@
     String status = null;
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         FloatingIpService service = get(FloatingIpService.class);
         try {
             FloatingIp floatingIpObj = new DefaultFloatingIp(
diff --git a/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/cli/floatingip/FloatingIpQueryCommand.java b/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/cli/floatingip/FloatingIpQueryCommand.java
index f5fe540..d4b08a7 100644
--- a/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/cli/floatingip/FloatingIpQueryCommand.java
+++ b/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/cli/floatingip/FloatingIpQueryCommand.java
@@ -15,8 +15,9 @@
  */
 package org.onosproject.vtnrsc.cli.floatingip;
 
-import org.apache.karaf.shell.commands.Command;
-import org.apache.karaf.shell.commands.Option;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.Option;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.vtnrsc.FloatingIpId;
 import org.onosproject.vtnrsc.FloatingIp;
@@ -25,6 +26,7 @@
 /**
  * Supports for query a floating IP.
  */
+@Service
 @Command(scope = "onos", name = "floatingips", description = "Supports for querying a floating IP")
 public class FloatingIpQueryCommand extends AbstractShellCommand {
     @Option(name = "-I", aliases = "--id", description = "The floating IP identifier",
@@ -43,7 +45,7 @@
             + "routerId=%s, fixedIp=%s, floatingIp=%s, status=%s";
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         FloatingIpService service = get(FloatingIpService.class);
         if (id != null) {
             FloatingIp floatingIp = service.getFloatingIp(FloatingIpId
diff --git a/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/cli/floatingip/FloatingIpRemoveCommand.java b/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/cli/floatingip/FloatingIpRemoveCommand.java
index 7c1e7c5..4071cd8 100644
--- a/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/cli/floatingip/FloatingIpRemoveCommand.java
+++ b/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/cli/floatingip/FloatingIpRemoveCommand.java
@@ -17,8 +17,9 @@
 
 import java.util.Set;
 
-import org.apache.karaf.shell.commands.Command;
-import org.apache.karaf.shell.commands.Option;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.Option;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.vtnrsc.FloatingIp;
 import org.onosproject.vtnrsc.FloatingIpId;
@@ -29,6 +30,7 @@
 /**
  * Supports for remove a floating IP.
  */
+@Service
 @Command(scope = "onos", name = "floatingip-remove", description = "Supports for removing a floating IP")
 public class FloatingIpRemoveCommand extends AbstractShellCommand {
     @Option(name = "-I", aliases = "--id", description = "The floating IP identifier",
@@ -44,7 +46,7 @@
     String floatingIp = null;
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         FloatingIpService service = get(FloatingIpService.class);
         if (id == null && fixedIp == null && floatingIp == null) {
             print(null, "one of id, fixedIp, floatingIp should not be null");
diff --git a/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/cli/floatingip/FloatingIpUpdateCommand.java b/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/cli/floatingip/FloatingIpUpdateCommand.java
index c1ad481..5ec16c9 100644
--- a/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/cli/floatingip/FloatingIpUpdateCommand.java
+++ b/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/cli/floatingip/FloatingIpUpdateCommand.java
@@ -17,9 +17,10 @@
 
 import java.util.Set;
 
-import org.apache.karaf.shell.commands.Argument;
-import org.apache.karaf.shell.commands.Command;
-import org.apache.karaf.shell.commands.Option;
+import org.apache.karaf.shell.api.action.Argument;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.Option;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onlab.packet.IpAddress;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.vtnrsc.DefaultFloatingIp;
@@ -37,6 +38,7 @@
 /**
  * Supports for update a floating IP.
  */
+@Service
 @Command(scope = "onos", name = "floatingip-update",
         description = "Supports for updating a floating IP")
 public class FloatingIpUpdateCommand extends AbstractShellCommand {
@@ -73,7 +75,7 @@
     String floatingIp = null;
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         FloatingIpService service = get(FloatingIpService.class);
         FloatingIpId floatingIpId = FloatingIpId.of(id);
         FloatingIp floatingIpStore = get(FloatingIpService.class).getFloatingIp(floatingIpId);
diff --git a/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/cli/network/TenantNetworkCreateCommand.java b/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/cli/network/TenantNetworkCreateCommand.java
index 055d6fd..40669cb 100644
--- a/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/cli/network/TenantNetworkCreateCommand.java
+++ b/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/cli/network/TenantNetworkCreateCommand.java
@@ -17,9 +17,10 @@
 
 import java.util.Set;
 
-import org.apache.karaf.shell.commands.Argument;
-import org.apache.karaf.shell.commands.Command;
-import org.apache.karaf.shell.commands.Option;
+import org.apache.karaf.shell.api.action.Argument;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.Option;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.vtnrsc.DefaultTenantNetwork;
 import org.onosproject.vtnrsc.PhysicalNetwork;
@@ -34,6 +35,7 @@
 /**
  * Supports for creating a TenantNetwork.
  */
+@Service
 @Command(scope = "onos", name = "tenantnetwork-create",
         description = "Supports for creating a TenantNetwork")
 public class TenantNetworkCreateCommand extends AbstractShellCommand {
@@ -80,7 +82,7 @@
     String physicalNetwork = "";
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         TenantNetworkService service = get(TenantNetworkService.class);
         TenantNetwork network = new DefaultTenantNetwork(TenantNetworkId.networkId(id), name,
                                                          adminStateUp,
diff --git a/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/cli/network/TenantNetworkQueryCommand.java b/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/cli/network/TenantNetworkQueryCommand.java
index 6a20fd3..7521eff 100644
--- a/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/cli/network/TenantNetworkQueryCommand.java
+++ b/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/cli/network/TenantNetworkQueryCommand.java
@@ -15,8 +15,9 @@
  */
 package org.onosproject.vtnrsc.cli.network;
 
-import org.apache.karaf.shell.commands.Command;
-import org.apache.karaf.shell.commands.Option;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.Option;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.vtnrsc.TenantNetwork;
 import org.onosproject.vtnrsc.TenantNetworkId;
@@ -25,6 +26,7 @@
 /**
  * Supports for querying TenantNetworks by network id.
  */
+@Service
 @Command(scope = "onos", name = "tenantnetworks", description = "Supports for querying"
         + "tenantNetworks by networkid")
 public class TenantNetworkQueryCommand extends AbstractShellCommand {
@@ -37,7 +39,7 @@
             + "tenantId=%s, type=%s, adminStateUp=%s";
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         TenantNetworkService service = get(TenantNetworkService.class);
         if (id != null) {
             TenantNetwork network = service.getNetwork(TenantNetworkId.networkId(id));
diff --git a/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/cli/network/TenantNetworkRemoveCommand.java b/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/cli/network/TenantNetworkRemoveCommand.java
index 4ff6d3d..d6a8673 100644
--- a/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/cli/network/TenantNetworkRemoveCommand.java
+++ b/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/cli/network/TenantNetworkRemoveCommand.java
@@ -17,8 +17,9 @@
 
 import java.util.Set;
 
-import org.apache.karaf.shell.commands.Argument;
-import org.apache.karaf.shell.commands.Command;
+import org.apache.karaf.shell.api.action.Argument;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.vtnrsc.TenantNetworkId;
 import org.onosproject.vtnrsc.tenantnetwork.TenantNetworkService;
@@ -28,6 +29,7 @@
 /**
  * Supports for removing a TenantNetwork by network id.
  */
+@Service
 @Command(scope = "onos", name = "tenantnetwork-remove", description = "Supports for removing"
         + " a tenantNetwork by tenantNetworkid")
 public class TenantNetworkRemoveCommand extends AbstractShellCommand {
@@ -37,7 +39,7 @@
     String id = null;
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         TenantNetworkService service = get(TenantNetworkService.class);
         Set<TenantNetworkId> networkIds = Sets.newHashSet(TenantNetworkId.networkId(id));
         service.removeNetworks(networkIds);
diff --git a/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/cli/network/TenantNetworkUpdateCommand.java b/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/cli/network/TenantNetworkUpdateCommand.java
index 4a9d6fc..88c342e 100644
--- a/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/cli/network/TenantNetworkUpdateCommand.java
+++ b/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/cli/network/TenantNetworkUpdateCommand.java
@@ -17,9 +17,10 @@
 
 import java.util.Set;
 
-import org.apache.karaf.shell.commands.Argument;
-import org.apache.karaf.shell.commands.Command;
-import org.apache.karaf.shell.commands.Option;
+import org.apache.karaf.shell.api.action.Argument;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.Option;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.vtnrsc.DefaultTenantNetwork;
 import org.onosproject.vtnrsc.PhysicalNetwork;
@@ -34,6 +35,7 @@
 /**
  * Supports for updating a TenantNetwork.
  */
+@Service
 @Command(scope = "onos", name = "tenantnetwork-update",
         description = "Supports for updating a TenantNetwork")
 public class TenantNetworkUpdateCommand extends AbstractShellCommand {
@@ -80,7 +82,7 @@
     String physicalNetwork = "";
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         TenantNetworkService service = get(TenantNetworkService.class);
         TenantNetwork network = new DefaultTenantNetwork(TenantNetworkId.networkId(id), name,
                                                          adminStateUp,
diff --git a/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/cli/router/RouterCreateCommand.java b/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/cli/router/RouterCreateCommand.java
index c819cf5..4c0aee4 100644
--- a/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/cli/router/RouterCreateCommand.java
+++ b/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/cli/router/RouterCreateCommand.java
@@ -19,9 +19,10 @@
 import java.util.List;
 import java.util.Set;
 
-import org.apache.karaf.shell.commands.Argument;
-import org.apache.karaf.shell.commands.Command;
-import org.apache.karaf.shell.commands.Option;
+import org.apache.karaf.shell.api.action.Argument;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.Option;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.vtnrsc.DefaultRouter;
 import org.onosproject.vtnrsc.Router;
@@ -36,6 +37,7 @@
 /**
  * Supports for create a router.
  */
+@Service
 @Command(scope = "onos", name = "router-create",
         description = "Supports for creating a router")
 public class RouterCreateCommand extends AbstractShellCommand {
@@ -72,7 +74,7 @@
     boolean distributed = false;
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         RouterService service = get(RouterService.class);
         try {
             List<String> routes = new ArrayList<String>();
diff --git a/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/cli/router/RouterQueryCommand.java b/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/cli/router/RouterQueryCommand.java
index 3794dd7..dc447d6 100644
--- a/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/cli/router/RouterQueryCommand.java
+++ b/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/cli/router/RouterQueryCommand.java
@@ -15,8 +15,9 @@
  */
 package org.onosproject.vtnrsc.cli.router;
 
-import org.apache.karaf.shell.commands.Command;
-import org.apache.karaf.shell.commands.Option;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.Option;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.vtnrsc.Router;
 import org.onosproject.vtnrsc.RouterId;
@@ -25,6 +26,7 @@
 /**
  * Supports for query a list of router.
  */
+@Service
 @Command(scope = "onos", name = "routers", description = "Supports for creating a router")
 public class RouterQueryCommand extends AbstractShellCommand {
     @Option(name = "-i", aliases = "--id", description = "The router identifier",
@@ -39,7 +41,7 @@
             + "externalGatewayInfo=%s, status=%s, adminStateUp=%s, distributed=%s, routers=%s";
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         RouterService service = get(RouterService.class);
         if (id != null) {
             Router router = service.getRouter(RouterId.valueOf(id));
diff --git a/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/cli/router/RouterRemoveCommand.java b/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/cli/router/RouterRemoveCommand.java
index b0240e4..45d642c 100644
--- a/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/cli/router/RouterRemoveCommand.java
+++ b/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/cli/router/RouterRemoveCommand.java
@@ -17,8 +17,9 @@
 
 import java.util.Set;
 
-import org.apache.karaf.shell.commands.Command;
-import org.apache.karaf.shell.commands.Option;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.Option;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.vtnrsc.Router;
 import org.onosproject.vtnrsc.RouterId;
@@ -29,6 +30,7 @@
 /**
  * Supports for remove a router.
  */
+@Service
 @Command(scope = "onos", name = "router-remove", description = "Supports for removing a router")
 public class RouterRemoveCommand extends AbstractShellCommand {
     @Option(name = "-i", aliases = "--id", description = "The router identifier",
@@ -40,7 +42,7 @@
     String routerName = null;
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         RouterService service = get(RouterService.class);
         if (id == null && routerName == null) {
             print(null, "one of id, routerName should not be null");
diff --git a/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/cli/router/RouterUpdateCommand.java b/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/cli/router/RouterUpdateCommand.java
index 7409e1a..0b2d89f 100644
--- a/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/cli/router/RouterUpdateCommand.java
+++ b/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/cli/router/RouterUpdateCommand.java
@@ -19,9 +19,10 @@
 import java.util.List;
 import java.util.Set;
 
-import org.apache.karaf.shell.commands.Argument;
-import org.apache.karaf.shell.commands.Command;
-import org.apache.karaf.shell.commands.Option;
+import org.apache.karaf.shell.api.action.Argument;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.Option;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.vtnrsc.DefaultRouter;
 import org.onosproject.vtnrsc.Router;
@@ -36,6 +37,7 @@
 /**
  * Supports for update a router.
  */
+@Service
 @Command(scope = "onos", name = "router-update", description = "Supports for updating a router")
 public class RouterUpdateCommand extends AbstractShellCommand {
     @Argument(index = 0, name = "id", description = "The router identifier",
@@ -71,7 +73,7 @@
     boolean distributed = false;
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         RouterService service = get(RouterService.class);
         RouterId routerId = RouterId.valueOf(id);
         Router router = get(RouterService.class).getRouter(routerId);
diff --git a/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/cli/routerinterface/RouterInterfaceCreateCommand.java b/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/cli/routerinterface/RouterInterfaceCreateCommand.java
index bc8e332..c8c39cb 100644
--- a/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/cli/routerinterface/RouterInterfaceCreateCommand.java
+++ b/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/cli/routerinterface/RouterInterfaceCreateCommand.java
@@ -15,8 +15,9 @@
  */
 package org.onosproject.vtnrsc.cli.routerinterface;
 
-import org.apache.karaf.shell.commands.Argument;
-import org.apache.karaf.shell.commands.Command;
+import org.apache.karaf.shell.api.action.Argument;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.vtnrsc.RouterId;
 import org.onosproject.vtnrsc.RouterInterface;
@@ -28,6 +29,7 @@
 /**
  * Supports for create a router interface.
  */
+@Service
 @Command(scope = "onos", name = "routerinterface-create", description = "Supports for creating a router interface")
 public class RouterInterfaceCreateCommand extends AbstractShellCommand {
     @Argument(index = 0, name = "routerId", description = "The router identifier of router interface",
@@ -47,7 +49,7 @@
     String subnetId = null;
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         RouterInterfaceService service = get(RouterInterfaceService.class);
         try {
             RouterInterface routerInterface = RouterInterface.routerInterface(
diff --git a/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/cli/routerinterface/RouterInterfaceQueryCommand.java b/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/cli/routerinterface/RouterInterfaceQueryCommand.java
index 71ad03f..7486c12 100644
--- a/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/cli/routerinterface/RouterInterfaceQueryCommand.java
+++ b/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/cli/routerinterface/RouterInterfaceQueryCommand.java
@@ -15,8 +15,9 @@
  */
 package org.onosproject.vtnrsc.cli.routerinterface;
 
-import org.apache.karaf.shell.commands.Command;
-import org.apache.karaf.shell.commands.Option;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.Option;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.vtnrsc.RouterInterface;
 import org.onosproject.vtnrsc.SubnetId;
@@ -25,6 +26,7 @@
 /**
  * Supports for query a router interface.
  */
+@Service
 @Command(scope = "onos", name = "routerinterfaces", description = "Supports for querying a router interface")
 public class RouterInterfaceQueryCommand extends AbstractShellCommand {
     @Option(name = "-s", aliases = "--subnetId", description = "The subnet identifier of router interface",
@@ -34,7 +36,7 @@
     private static final String FMT = "subnetId=%s, tenantId=%s, portId=%s, routerId=%s";
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         RouterInterfaceService service = get(RouterInterfaceService.class);
         if (subnetId != null) {
             RouterInterface routerInterface = service
diff --git a/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/cli/routerinterface/RouterInterfaceRemoveCommand.java b/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/cli/routerinterface/RouterInterfaceRemoveCommand.java
index f0ed094..3bfd7d2 100644
--- a/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/cli/routerinterface/RouterInterfaceRemoveCommand.java
+++ b/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/cli/routerinterface/RouterInterfaceRemoveCommand.java
@@ -15,8 +15,9 @@
  */
 package org.onosproject.vtnrsc.cli.routerinterface;
 
-import org.apache.karaf.shell.commands.Command;
-import org.apache.karaf.shell.commands.Option;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.Option;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.vtnrsc.RouterInterface;
 import org.onosproject.vtnrsc.SubnetId;
@@ -25,6 +26,7 @@
 /**
  * Supports for remove a router interface.
  */
+@Service
 @Command(scope = "onos", name = "routerinterface-remove", description = "Supports for removing a router interface")
 public class RouterInterfaceRemoveCommand extends AbstractShellCommand {
     @Option(name = "-s", aliases = "--subnetId", description = "The subnet identifier of router interface",
@@ -32,7 +34,7 @@
     String subnetId = null;
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         RouterInterfaceService service = get(RouterInterfaceService.class);
         try {
             RouterInterface routerInterface = service
diff --git a/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/cli/subnet/SubnetCreateCommand.java b/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/cli/subnet/SubnetCreateCommand.java
index a6f4b31..8a0a034 100644
--- a/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/cli/subnet/SubnetCreateCommand.java
+++ b/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/cli/subnet/SubnetCreateCommand.java
@@ -17,9 +17,10 @@
 
 import java.util.Set;
 
-import org.apache.karaf.shell.commands.Argument;
-import org.apache.karaf.shell.commands.Command;
-import org.apache.karaf.shell.commands.Option;
+import org.apache.karaf.shell.api.action.Argument;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.Option;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onlab.packet.IpAddress;
 import org.onlab.packet.IpAddress.Version;
 import org.onlab.packet.IpPrefix;
@@ -39,6 +40,7 @@
 /**
  * Supports for creating a subnet.
  */
+@Service
 @Command(scope = "onos", name = "subnet-create", description = "Supports for creating a subnet")
 public class SubnetCreateCommand extends AbstractShellCommand {
 
@@ -95,7 +97,7 @@
     Set<AllocationPool> allocationPools = Sets.newHashSet();
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         SubnetService service = get(SubnetService.class);
         if (id == null || networkId == null || tenantId == null) {
             print("id,networkId,tenantId can not be null");
diff --git a/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/cli/subnet/SubnetQueryCommand.java b/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/cli/subnet/SubnetQueryCommand.java
index 9be7f1c..9cc3269 100644
--- a/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/cli/subnet/SubnetQueryCommand.java
+++ b/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/cli/subnet/SubnetQueryCommand.java
@@ -15,8 +15,9 @@
  */
 package org.onosproject.vtnrsc.cli.subnet;
 
-import org.apache.karaf.shell.commands.Command;
-import org.apache.karaf.shell.commands.Option;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.Option;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.vtnrsc.Subnet;
 import org.onosproject.vtnrsc.SubnetId;
@@ -25,6 +26,7 @@
 /**
  * Supports for querying a subnet.
  */
+@Service
 @Command(scope = "onos", name = "subnets", description = "Supports for querying a subnet")
 public class SubnetQueryCommand extends AbstractShellCommand {
 
@@ -36,7 +38,7 @@
             + "tenantId=%s, cidr=%s, dhcpEnabled=%s, gatewayIp=%s," + "ipVersion=%s";
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         SubnetService service = get(SubnetService.class);
         if (id != null) {
             Subnet subnet = service.getSubnet(SubnetId.subnetId(id));
diff --git a/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/cli/subnet/SubnetRemoveCommand.java b/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/cli/subnet/SubnetRemoveCommand.java
index 44f5dbb..4955bc9 100644
--- a/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/cli/subnet/SubnetRemoveCommand.java
+++ b/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/cli/subnet/SubnetRemoveCommand.java
@@ -17,8 +17,9 @@
 
 import java.util.Set;
 
-import org.apache.karaf.shell.commands.Argument;
-import org.apache.karaf.shell.commands.Command;
+import org.apache.karaf.shell.api.action.Argument;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.vtnrsc.SubnetId;
 import org.onosproject.vtnrsc.subnet.SubnetService;
@@ -28,6 +29,7 @@
 /**
  * Supports for removing a subnet.
  */
+@Service
 @Command(scope = "onos", name = "subnet-remove", description = "Supports for removing a subnet")
 public class SubnetRemoveCommand extends AbstractShellCommand {
 
@@ -36,7 +38,7 @@
     String id = null;
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         SubnetService service = get(SubnetService.class);
         Set<SubnetId> subnetsSet = Sets.newHashSet();
         subnetsSet.add(SubnetId.subnetId(id));
diff --git a/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/cli/subnet/SubnetUpdateCommand.java b/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/cli/subnet/SubnetUpdateCommand.java
index 5c28d98..50cfaa2 100644
--- a/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/cli/subnet/SubnetUpdateCommand.java
+++ b/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/cli/subnet/SubnetUpdateCommand.java
@@ -17,9 +17,10 @@
 
 import java.util.Set;
 
-import org.apache.karaf.shell.commands.Argument;
-import org.apache.karaf.shell.commands.Command;
-import org.apache.karaf.shell.commands.Option;
+import org.apache.karaf.shell.api.action.Argument;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.Option;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onlab.packet.IpAddress;
 import org.onlab.packet.IpAddress.Version;
 import org.onlab.packet.IpPrefix;
@@ -39,6 +40,7 @@
 /**
  * Supports for updating a subnet.
  */
+@Service
 @Command(scope = "onos", name = "subnet-update", description = "Supports for updating a subnet")
 public class SubnetUpdateCommand extends AbstractShellCommand {
 
@@ -95,7 +97,7 @@
     Set<AllocationPool> allocationPools = Sets.newHashSet();
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         SubnetService service = get(SubnetService.class);
         if (id == null || networkId == null || tenantId == null) {
             print("id,networkId,tenantId can not be null");
diff --git a/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/cli/virtualport/VirtualPortCreateCommand.java b/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/cli/virtualport/VirtualPortCreateCommand.java
index 4592059..4bf53ff 100644
--- a/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/cli/virtualport/VirtualPortCreateCommand.java
+++ b/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/cli/virtualport/VirtualPortCreateCommand.java
@@ -18,9 +18,10 @@
 import java.util.Map;
 import java.util.Set;
 
-import org.apache.karaf.shell.commands.Argument;
-import org.apache.karaf.shell.commands.Command;
-import org.apache.karaf.shell.commands.Option;
+import org.apache.karaf.shell.api.action.Argument;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.Option;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onlab.packet.MacAddress;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.net.DeviceId;
@@ -41,6 +42,7 @@
 /**
  * Supports for creating a virtualPort.
  */
+@Service
 @Command(scope = "onos", name = "virtualport-create",
         description = "Supports for creating a virtualPort.")
 public class VirtualPortCreateCommand extends AbstractShellCommand {
@@ -112,7 +114,7 @@
     Set<SecurityGroup> securityGroups = Sets.newHashSet();
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         Map<String, String> strMap = Maps.newHashMap();
         strMap.putIfAbsent("name", name);
         strMap.putIfAbsent("deviceOwner", deviceOwner);
diff --git a/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/cli/virtualport/VirtualPortExGwUpdateCommand.java b/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/cli/virtualport/VirtualPortExGwUpdateCommand.java
index 76b683c8..113fd44 100644
--- a/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/cli/virtualport/VirtualPortExGwUpdateCommand.java
+++ b/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/cli/virtualport/VirtualPortExGwUpdateCommand.java
@@ -18,8 +18,9 @@
 import java.util.Map;
 import java.util.Set;
 
-import org.apache.karaf.shell.commands.Command;
-import org.apache.karaf.shell.commands.Option;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.Option;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onlab.packet.IpAddress;
 import org.onlab.packet.MacAddress;
 import org.onosproject.cli.AbstractShellCommand;
@@ -41,6 +42,7 @@
 /**
  * Supports for updating the external gateway virtualPort.
  */
+@Service
 @Command(scope = "onos", name = "externalgateway-update",
         description = "Supports for updating the external gateway virtualPort.")
 public class VirtualPortExGwUpdateCommand extends AbstractShellCommand {
@@ -50,7 +52,7 @@
     String macAddress = "";
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         VirtualPortService service = get(VirtualPortService.class);
         SubnetService subnetService = get(SubnetService.class);
         TenantNetworkService tenantNetworkService = get(TenantNetworkService.class);
diff --git a/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/cli/virtualport/VirtualPortQueryCommand.java b/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/cli/virtualport/VirtualPortQueryCommand.java
index 6ffda80..520a33a 100644
--- a/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/cli/virtualport/VirtualPortQueryCommand.java
+++ b/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/cli/virtualport/VirtualPortQueryCommand.java
@@ -17,8 +17,9 @@
 
 import java.util.Collection;
 
-import org.apache.karaf.shell.commands.Command;
-import org.apache.karaf.shell.commands.Option;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.Option;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.net.DeviceId;
 import org.onosproject.vtnrsc.TenantNetworkId;
@@ -29,6 +30,7 @@
 /**
  * Supports for querying virtualPorts.
  */
+@Service
 @Command(scope = "onos", name = "virtualports", description = "Supports for querying virtualPorts.")
 public class VirtualPortQueryCommand extends AbstractShellCommand {
 
@@ -55,7 +57,7 @@
             + " allowedAddress=%s, securityGroups=%s";
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         VirtualPortService service = get(VirtualPortService.class);
         if (vPortId != null && networkId == null && deviceId == null && tenantId == null) {
             VirtualPort port = service.getPort(VirtualPortId.portId(vPortId));
diff --git a/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/cli/virtualport/VirtualPortRemoveCommand.java b/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/cli/virtualport/VirtualPortRemoveCommand.java
index f7df366..4984099 100644
--- a/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/cli/virtualport/VirtualPortRemoveCommand.java
+++ b/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/cli/virtualport/VirtualPortRemoveCommand.java
@@ -17,8 +17,9 @@
 
 import java.util.Set;
 
-import org.apache.karaf.shell.commands.Argument;
-import org.apache.karaf.shell.commands.Command;
+import org.apache.karaf.shell.api.action.Argument;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.vtnrsc.VirtualPortId;
 import org.onosproject.vtnrsc.virtualport.VirtualPortService;
@@ -28,6 +29,7 @@
 /**
  * Supports for removing a virtualPort.
  */
+@Service
 @Command(scope = "onos", name = "virtualport-remove",
         description = "Supports for removing a virtualPort.")
 public class VirtualPortRemoveCommand extends AbstractShellCommand {
@@ -37,7 +39,7 @@
     String id = null;
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         VirtualPortService service = get(VirtualPortService.class);
         Set<VirtualPortId> virtualPorts = Sets.newHashSet(VirtualPortId.portId(id));
         service.removePorts(virtualPorts);
diff --git a/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/cli/virtualport/VirtualPortUpdateCommand.java b/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/cli/virtualport/VirtualPortUpdateCommand.java
index ab5d8fd..6cd7791 100644
--- a/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/cli/virtualport/VirtualPortUpdateCommand.java
+++ b/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/cli/virtualport/VirtualPortUpdateCommand.java
@@ -18,9 +18,10 @@
 import java.util.Map;
 import java.util.Set;
 
-import org.apache.karaf.shell.commands.Argument;
-import org.apache.karaf.shell.commands.Command;
-import org.apache.karaf.shell.commands.Option;
+import org.apache.karaf.shell.api.action.Argument;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.Option;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onlab.packet.MacAddress;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.net.DeviceId;
@@ -41,6 +42,7 @@
 /**
  * Supports for updating a virtualPort.
  */
+@Service
 @Command(scope = "onos", name = "virtualport-update",
         description = "Supports for updating a virtualPort.")
 public class VirtualPortUpdateCommand extends AbstractShellCommand {
@@ -113,7 +115,7 @@
     Set<SecurityGroup> securityGroups = Sets.newHashSet();
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         VirtualPortService service = get(VirtualPortService.class);
         Map<String, String> strMap = Maps.newHashMap();
         strMap.putIfAbsent("name", name);
diff --git a/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/floatingip/impl/FloatingIpManager.java b/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/floatingip/impl/FloatingIpManager.java
index 6b66506..196d889 100644
--- a/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/floatingip/impl/FloatingIpManager.java
+++ b/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/floatingip/impl/FloatingIpManager.java
@@ -15,20 +15,7 @@
  */
 package org.onosproject.vtnrsc.floatingip.impl;
 
-import static com.google.common.base.Preconditions.checkNotNull;
-import static org.slf4j.LoggerFactory.getLogger;
-
-import java.util.Collection;
-import java.util.Collections;
-import java.util.Set;
-import java.util.UUID;
-
-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.Sets;
 import org.onlab.packet.IpAddress;
 import org.onlab.util.KryoNamespace;
 import org.onosproject.core.ApplicationId;
@@ -42,25 +29,35 @@
 import org.onosproject.vtnrsc.DefaultFloatingIp;
 import org.onosproject.vtnrsc.FloatingIp;
 import org.onosproject.vtnrsc.FloatingIpId;
+import org.onosproject.vtnrsc.RouterId;
 import org.onosproject.vtnrsc.TenantId;
 import org.onosproject.vtnrsc.TenantNetworkId;
 import org.onosproject.vtnrsc.VirtualPortId;
-import org.onosproject.vtnrsc.RouterId;
 import org.onosproject.vtnrsc.floatingip.FloatingIpEvent;
 import org.onosproject.vtnrsc.floatingip.FloatingIpListener;
 import org.onosproject.vtnrsc.floatingip.FloatingIpService;
 import org.onosproject.vtnrsc.router.RouterService;
 import org.onosproject.vtnrsc.tenantnetwork.TenantNetworkService;
 import org.onosproject.vtnrsc.virtualport.VirtualPortService;
+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.Sets;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.Set;
+import java.util.UUID;
+
+import static com.google.common.base.Preconditions.checkNotNull;
+import static org.slf4j.LoggerFactory.getLogger;
 
 /**
  * Provides implementation of the FloatingIp service.
  */
-@Component(immediate = true)
-@Service
+@Component(immediate = true, service = FloatingIpService.class)
 public class FloatingIpManager implements FloatingIpService {
     private static final String FLOATINGIP_ID_NOT_NULL = "Floatingip ID cannot be null";
     private static final String FLOATINGIP_NOT_NULL = "Floatingip cannot be null";
@@ -79,19 +76,19 @@
     protected EventuallyConsistentMap<FloatingIpId, FloatingIp> floatingIpBindStore;
     protected ApplicationId appId;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected StorageService storageService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected CoreService coreService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected TenantNetworkService tenantNetworkService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected VirtualPortService virtualPortService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected RouterService routerService;
 
     @Activate
diff --git a/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/flowclassifier/impl/FlowClassifierManager.java b/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/flowclassifier/impl/FlowClassifierManager.java
index f2396da..216a2c5 100644
--- a/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/flowclassifier/impl/FlowClassifierManager.java
+++ b/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/flowclassifier/impl/FlowClassifierManager.java
@@ -15,17 +15,7 @@
  */
 package org.onosproject.vtnrsc.flowclassifier.impl;
 
-import static com.google.common.base.Preconditions.checkNotNull;
-import static org.slf4j.LoggerFactory.getLogger;
-
-import java.util.UUID;
-
-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.ImmutableList;
 import org.onlab.packet.IpPrefix;
 import org.onlab.util.KryoNamespace;
 import org.onosproject.event.AbstractListenerManager;
@@ -44,15 +34,22 @@
 import org.onosproject.vtnrsc.flowclassifier.FlowClassifierEvent;
 import org.onosproject.vtnrsc.flowclassifier.FlowClassifierListener;
 import org.onosproject.vtnrsc.flowclassifier.FlowClassifierService;
+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.ImmutableList;
+import java.util.UUID;
+
+import static com.google.common.base.Preconditions.checkNotNull;
+import static org.slf4j.LoggerFactory.getLogger;
 
 /**
  * Provides implementation of the Flow Classifier Service.
  */
-@Component(immediate = true)
-@Service
+@Component(immediate = true, service = FlowClassifierService.class)
 public class FlowClassifierManager extends AbstractListenerManager<FlowClassifierEvent, FlowClassifierListener>
         implements FlowClassifierService {
 
@@ -68,7 +65,7 @@
     private EventuallyConsistentMapListener<FlowClassifierId, FlowClassifier> flowClassifierListener =
             new InnerFlowClassifierStoreListener();
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected StorageService storageService;
 
     @Activate
diff --git a/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/portchain/impl/PortChainManager.java b/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/portchain/impl/PortChainManager.java
index f3739f6..6aa6bf3 100644
--- a/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/portchain/impl/PortChainManager.java
+++ b/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/portchain/impl/PortChainManager.java
@@ -15,18 +15,6 @@
  */
 package org.onosproject.vtnrsc.portchain.impl;
 
-import static com.google.common.base.Preconditions.checkNotNull;
-import static org.slf4j.LoggerFactory.getLogger;
-
-import java.util.Collections;
-import java.util.UUID;
-
-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.KryoNamespace;
 import org.onosproject.event.AbstractListenerManager;
 import org.onosproject.net.DeviceId;
@@ -49,13 +37,23 @@
 import org.onosproject.vtnrsc.portchain.PortChainEvent;
 import org.onosproject.vtnrsc.portchain.PortChainListener;
 import org.onosproject.vtnrsc.portchain.PortChainService;
+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.Collections;
+import java.util.UUID;
+
+import static com.google.common.base.Preconditions.checkNotNull;
+import static org.slf4j.LoggerFactory.getLogger;
+
 /**
  * Provides implementation of the portChainService.
  */
-@Component(immediate = true)
-@Service
+@Component(immediate = true, service = PortChainService.class)
 public class PortChainManager extends AbstractListenerManager<PortChainEvent, PortChainListener> implements
         PortChainService {
 
@@ -69,7 +67,7 @@
     private EventuallyConsistentMapListener<PortChainId, PortChain> portChainListener =
             new InnerPortChainStoreListener();
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected StorageService storageService;
 
     @Activate
diff --git a/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/portchainsfmap/impl/PortChainSfMapManager.java b/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/portchainsfmap/impl/PortChainSfMapManager.java
index 0481d7d..78737b3 100644
--- a/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/portchainsfmap/impl/PortChainSfMapManager.java
+++ b/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/portchainsfmap/impl/PortChainSfMapManager.java
@@ -15,18 +15,8 @@
  */
 package org.onosproject.vtnrsc.portchainsfmap.impl;
 
-import static com.google.common.base.Preconditions.checkNotNull;
-import static org.slf4j.LoggerFactory.getLogger;
-
-import java.util.List;
-import java.util.ListIterator;
-
-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.ImmutableList;
+import com.google.common.collect.Lists;
 import org.onosproject.vtnrsc.PortChain;
 import org.onosproject.vtnrsc.PortChainId;
 import org.onosproject.vtnrsc.PortPairGroup;
@@ -36,31 +26,38 @@
 import org.onosproject.vtnrsc.portchainsfmap.PortChainSfMapService;
 import org.onosproject.vtnrsc.portpair.PortPairService;
 import org.onosproject.vtnrsc.portpairgroup.PortPairGroupService;
+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.ImmutableList;
-import com.google.common.collect.Lists;
+import java.util.List;
+import java.util.ListIterator;
+
+import static com.google.common.base.Preconditions.checkNotNull;
+import static org.slf4j.LoggerFactory.getLogger;
 
 /**
  * Provides implementation of the PortChainSfMapService.
  * A port pair group is nothing but group of similar service functions.
  * A port pair is nothing but a service function.
  */
-@Component(immediate = true)
-@Service
+@Component(immediate = true, service = PortChainSfMapService.class)
 public class PortChainSfMapManager implements PortChainSfMapService {
 
     private static final String PORT_CHAIN_ID_NULL = "PortChain ID cannot be null";
 
     private final Logger log = getLogger(getClass());
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected PortChainService portChainService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected PortPairGroupService portPairGroupService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected PortPairService portPairService;
 
     @Activate
diff --git a/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/portpair/impl/PortPairManager.java b/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/portpair/impl/PortPairManager.java
index fb97859..47dbe1c 100644
--- a/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/portpair/impl/PortPairManager.java
+++ b/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/portpair/impl/PortPairManager.java
@@ -15,18 +15,6 @@
  */
 package org.onosproject.vtnrsc.portpair.impl;
 
-import static com.google.common.base.Preconditions.checkNotNull;
-import static org.slf4j.LoggerFactory.getLogger;
-
-import java.util.Collections;
-import java.util.UUID;
-
-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.KryoNamespace;
 import org.onosproject.event.AbstractListenerManager;
 import org.onosproject.store.serializers.KryoNamespaces;
@@ -43,13 +31,23 @@
 import org.onosproject.vtnrsc.portpair.PortPairEvent;
 import org.onosproject.vtnrsc.portpair.PortPairListener;
 import org.onosproject.vtnrsc.portpair.PortPairService;
+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.Collections;
+import java.util.UUID;
+
+import static com.google.common.base.Preconditions.checkNotNull;
+import static org.slf4j.LoggerFactory.getLogger;
+
 /**
  * Provides implementation of the portPairService.
  */
-@Component(immediate = true)
-@Service
+@Component(immediate = true, service = PortPairService.class)
 public class PortPairManager extends AbstractListenerManager<PortPairEvent, PortPairListener> implements
         PortPairService {
 
@@ -65,7 +63,7 @@
     private EventuallyConsistentMapListener<PortPairId, PortPair> portPairListener =
             new InnerPortPairStoreListener();
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected StorageService storageService;
 
     @Activate
diff --git a/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/portpairgroup/impl/PortPairGroupManager.java b/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/portpairgroup/impl/PortPairGroupManager.java
index 4c76c1e..f5ff8e8 100644
--- a/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/portpairgroup/impl/PortPairGroupManager.java
+++ b/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/portpairgroup/impl/PortPairGroupManager.java
@@ -15,18 +15,6 @@
  */
 package org.onosproject.vtnrsc.portpairgroup.impl;
 
-import static com.google.common.base.Preconditions.checkNotNull;
-import static org.slf4j.LoggerFactory.getLogger;
-
-import java.util.Collections;
-import java.util.UUID;
-
-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.KryoNamespace;
 import org.onosproject.event.AbstractListenerManager;
 import org.onosproject.store.serializers.KryoNamespaces;
@@ -44,13 +32,23 @@
 import org.onosproject.vtnrsc.portpairgroup.PortPairGroupEvent;
 import org.onosproject.vtnrsc.portpairgroup.PortPairGroupListener;
 import org.onosproject.vtnrsc.portpairgroup.PortPairGroupService;
+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.Collections;
+import java.util.UUID;
+
+import static com.google.common.base.Preconditions.checkNotNull;
+import static org.slf4j.LoggerFactory.getLogger;
+
 /**
  * Provides implementation of the portPairGroupService.
  */
-@Component(immediate = true)
-@Service
+@Component(immediate = true, service = PortPairGroupService.class)
 public class PortPairGroupManager extends AbstractListenerManager<PortPairGroupEvent, PortPairGroupListener> implements
         PortPairGroupService {
 
@@ -66,7 +64,7 @@
     private EventuallyConsistentMapListener<PortPairGroupId, PortPairGroup> portPairGroupListener =
             new InnerPortPairGroupStoreListener();
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected StorageService storageService;
 
     @Activate
diff --git a/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/router/impl/RouterManager.java b/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/router/impl/RouterManager.java
index 04600f3..8954a38 100644
--- a/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/router/impl/RouterManager.java
+++ b/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/router/impl/RouterManager.java
@@ -15,19 +15,7 @@
  */
 package org.onosproject.vtnrsc.router.impl;
 
-import static com.google.common.base.Preconditions.checkNotNull;
-import static org.slf4j.LoggerFactory.getLogger;
-
-import java.util.Collection;
-import java.util.Collections;
-import java.util.Set;
-
-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.Sets;
 import org.onlab.util.KryoNamespace;
 import org.onosproject.core.ApplicationId;
 import org.onosproject.core.CoreService;
@@ -52,15 +40,24 @@
 import org.onosproject.vtnrsc.subnet.SubnetService;
 import org.onosproject.vtnrsc.tenantnetwork.TenantNetworkService;
 import org.onosproject.vtnrsc.virtualport.VirtualPortService;
+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.Sets;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.Set;
+
+import static com.google.common.base.Preconditions.checkNotNull;
+import static org.slf4j.LoggerFactory.getLogger;
 
 /**
  * Provides implementation of the Router service.
  */
-@Component(immediate = true)
-@Service
+@Component(immediate = true, service = RouterService.class)
 public class RouterManager implements RouterService {
 
     private static final String ROUTER_ID_NULL = "Router ID cannot be null";
@@ -76,19 +73,19 @@
     protected EventuallyConsistentMap<RouterId, Router> routerStore;
     protected ApplicationId appId;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected StorageService storageService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected CoreService coreService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected TenantNetworkService tenantNetworkService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected VirtualPortService virtualPortService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected SubnetService subnetService;
 
     @Activate
diff --git a/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/routerinterface/impl/RouterInterfaceManager.java b/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/routerinterface/impl/RouterInterfaceManager.java
index dd8d06d..854efd9 100644
--- a/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/routerinterface/impl/RouterInterfaceManager.java
+++ b/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/routerinterface/impl/RouterInterfaceManager.java
@@ -15,19 +15,7 @@
  */
 package org.onosproject.vtnrsc.routerinterface.impl;
 
-import static com.google.common.base.Preconditions.checkNotNull;
-import static org.slf4j.LoggerFactory.getLogger;
-
-import java.util.Collection;
-import java.util.Collections;
-import java.util.Set;
-
-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.Sets;
 import org.onlab.util.KryoNamespace;
 import org.onosproject.core.ApplicationId;
 import org.onosproject.core.CoreService;
@@ -48,15 +36,24 @@
 import org.onosproject.vtnrsc.routerinterface.RouterInterfaceService;
 import org.onosproject.vtnrsc.subnet.SubnetService;
 import org.onosproject.vtnrsc.virtualport.VirtualPortService;
+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.Sets;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.Set;
+
+import static com.google.common.base.Preconditions.checkNotNull;
+import static org.slf4j.LoggerFactory.getLogger;
 
 /**
  * Provides implementation of the Router interface service.
  */
-@Component(immediate = true)
-@Service
+@Component(immediate = true, service = RouterInterfaceService.class)
 public class RouterInterfaceManager implements RouterInterfaceService {
     private static final String SUBNET_ID_NULL = "Subnet ID cannot be null";
     private static final String ROUTER_INTERFACE_NULL = "Router Interface cannot be null";
@@ -73,19 +70,19 @@
     protected EventuallyConsistentMap<SubnetId, RouterInterface> routerInterfaceStore;
     protected ApplicationId appId;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected StorageService storageService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected CoreService coreService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected VirtualPortService virtualPortService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected SubnetService subnetService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected RouterService routerService;
 
     @Activate
diff --git a/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/service/impl/VtnRscManager.java b/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/service/impl/VtnRscManager.java
index d17255f..37f2de4 100644
--- a/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/service/impl/VtnRscManager.java
+++ b/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/service/impl/VtnRscManager.java
@@ -15,19 +15,6 @@
  */
 package org.onosproject.vtnrsc.service.impl;
 
-import static com.google.common.base.Preconditions.checkNotNull;
-import static org.slf4j.LoggerFactory.getLogger;
-
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.Set;
-
-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.packet.IpAddress;
 import org.onlab.packet.MacAddress;
 import org.onlab.util.KryoNamespace;
@@ -90,20 +77,31 @@
 import org.onosproject.vtnrsc.virtualport.VirtualPortEvent;
 import org.onosproject.vtnrsc.virtualport.VirtualPortListener;
 import org.onosproject.vtnrsc.virtualport.VirtualPortService;
+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.HashSet;
+import java.util.Iterator;
+import java.util.Set;
+
+import static com.google.common.base.Preconditions.checkNotNull;
+import static org.slf4j.LoggerFactory.getLogger;
+
 /**
  * Provides implementation of the VtnRsc service.
  */
-@Component(immediate = true)
-@Service
+@Component(immediate = true, service = VtnRscService.class)
 public class VtnRscManager extends AbstractListenerManager<VtnRscEvent, VtnRscListener>
                            implements VtnRscService {
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected CoreService coreService;
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected StorageService storageService;
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected LogicalClockService clockService;
 
     private final Logger log = getLogger(getClass());
@@ -133,29 +131,29 @@
     private static final String CLASSIFIEROVSMAP = "classifierOvsMap";
     private static final String SFFOVSMAP = "sffOvsMap";
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected RouterService routerService;
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected FloatingIpService floatingIpService;
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected RouterInterfaceService routerInterfaceService;
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected VirtualPortService virtualPortService;
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected HostService hostService;
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected SubnetService subnetService;
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected TenantNetworkService tenantNetworkService;
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected DeviceService deviceService;
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected PortPairService portPairService;
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected PortPairGroupService portPairGroupService;
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected FlowClassifierService flowClassifierService;
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected PortChainService portChainService;
 
     @Activate
diff --git a/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/subnet/impl/SubnetManager.java b/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/subnet/impl/SubnetManager.java
index 8f43d75..5d13cb1 100644
--- a/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/subnet/impl/SubnetManager.java
+++ b/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/subnet/impl/SubnetManager.java
@@ -15,12 +15,6 @@
  */
 package org.onosproject.vtnrsc.subnet.impl;
 
-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.packet.IpAddress;
 import org.onosproject.core.ApplicationId;
 import org.onosproject.core.CoreService;
@@ -38,6 +32,11 @@
 import org.onosproject.vtnrsc.TenantNetworkId;
 import org.onosproject.vtnrsc.subnet.SubnetService;
 import org.onosproject.vtnrsc.tenantnetwork.TenantNetworkService;
+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.Arrays;
@@ -50,8 +49,7 @@
 /**
  * Provides implementation of the Subnet service.
  */
-@Component(immediate = true)
-@Service
+@Component(immediate = true, service = SubnetService.class)
 public class SubnetManager implements SubnetService {
 
     private static final String SUBNET_ID_NULL = "Subnet ID cannot be null";
@@ -65,13 +63,13 @@
     protected Map<SubnetId, Subnet> subnetStore;
     protected ApplicationId appId;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected StorageService storageService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected CoreService coreService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected TenantNetworkService tenantNetworkService;
 
     @Activate
diff --git a/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/tenantnetwork/impl/TenantNetworkManager.java b/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/tenantnetwork/impl/TenantNetworkManager.java
index d845b72..753e38a 100644
--- a/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/tenantnetwork/impl/TenantNetworkManager.java
+++ b/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/tenantnetwork/impl/TenantNetworkManager.java
@@ -15,12 +15,6 @@
  */
 package org.onosproject.vtnrsc.tenantnetwork.impl;
 
-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.core.ApplicationId;
 import org.onosproject.core.CoreService;
 import org.onosproject.store.serializers.KryoNamespaces;
@@ -33,6 +27,11 @@
 import org.onosproject.vtnrsc.TenantNetwork;
 import org.onosproject.vtnrsc.TenantNetworkId;
 import org.onosproject.vtnrsc.tenantnetwork.TenantNetworkService;
+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.Arrays;
@@ -45,8 +44,7 @@
 /**
  * Provides implementation of the tenantNetworkService.
  */
-@Component(immediate = true)
-@Service
+@Component(immediate = true, service = TenantNetworkService.class)
 public class TenantNetworkManager implements TenantNetworkService {
 
     private static final String NETWORK_ID_NULL = "Network ID cannot be null";
@@ -59,10 +57,10 @@
 
     private final Logger log = getLogger(getClass());
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected StorageService storageService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected CoreService coreService;
 
 
diff --git a/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/virtualport/impl/VirtualPortManager.java b/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/virtualport/impl/VirtualPortManager.java
index 76a4204..5206e3f 100644
--- a/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/virtualport/impl/VirtualPortManager.java
+++ b/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/virtualport/impl/VirtualPortManager.java
@@ -15,22 +15,6 @@
  */
 package org.onosproject.vtnrsc.virtualport.impl;
 
-import static com.google.common.base.Preconditions.checkNotNull;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.Iterator;
-import java.util.List;
-import java.util.UUID;
-import java.util.stream.Collectors;
-
-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.packet.IpAddress;
 import org.onlab.packet.MacAddress;
 import org.onlab.util.KryoNamespace;
@@ -66,14 +50,28 @@
 import org.onosproject.vtnrsc.virtualport.VirtualPortEvent;
 import org.onosproject.vtnrsc.virtualport.VirtualPortListener;
 import org.onosproject.vtnrsc.virtualport.VirtualPortService;
+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.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.Iterator;
+import java.util.List;
+import java.util.UUID;
+import java.util.stream.Collectors;
+
+import static com.google.common.base.Preconditions.checkNotNull;
+
 /**
  * Provides implementation of the VirtualPort APIs.
  */
-@Component(immediate = true)
-@Service
+@Component(immediate = true, service = VirtualPortService.class)
 public class VirtualPortManager extends AbstractListenerManager<VirtualPortEvent, VirtualPortListener>
 implements VirtualPortService {
 
@@ -95,13 +93,13 @@
     protected EventuallyConsistentMap<VirtualPortId, VirtualPort> vPortStore;
     protected ApplicationId appId;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected StorageService storageService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected TenantNetworkService networkService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected CoreService coreService;
 
     private EventuallyConsistentMapListener<VirtualPortId, VirtualPort> virtualPortListener =
diff --git a/apps/vtn/vtnrsc/src/main/resources/OSGI-INF/blueprint/shell-config.xml b/apps/vtn/vtnrsc/src/main/resources/OSGI-INF/blueprint/shell-config.xml
deleted file mode 100644
index 70d6898..0000000
--- a/apps/vtn/vtnrsc/src/main/resources/OSGI-INF/blueprint/shell-config.xml
+++ /dev/null
@@ -1,92 +0,0 @@
-<!--
-  ~ Copyright 2015-present Open Networking Foundation
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~     http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License.
-  -->
-<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0">
-
-  <command-bundle xmlns="http://karaf.apache.org/xmlns/shell/v1.1.0">
-    <command>
-      <action class="org.onosproject.vtnrsc.cli.network.TenantNetworkCreateCommand"/>
-    </command>
-     <command>
-      <action class="org.onosproject.vtnrsc.cli.network.TenantNetworkQueryCommand"/>
-    </command>
-     <command>
-      <action class="org.onosproject.vtnrsc.cli.network.TenantNetworkRemoveCommand"/>
-    </command>
-     <command>
-      <action class="org.onosproject.vtnrsc.cli.network.TenantNetworkUpdateCommand"/>
-    </command>
-     <command>
-      <action class="org.onosproject.vtnrsc.cli.subnet.SubnetCreateCommand"/>
-    </command>
-     <command>
-      <action class="org.onosproject.vtnrsc.cli.subnet.SubnetQueryCommand"/>
-    </command>
-     <command>
-      <action class="org.onosproject.vtnrsc.cli.subnet.SubnetRemoveCommand"/>
-    </command>
-     <command>
-      <action class="org.onosproject.vtnrsc.cli.subnet.SubnetUpdateCommand"/>
-    </command>
-      <command>
-      <action class="org.onosproject.vtnrsc.cli.virtualport.VirtualPortCreateCommand"/>
-    </command>
-     <command>
-      <action class="org.onosproject.vtnrsc.cli.virtualport.VirtualPortQueryCommand"/>
-    </command>
-     <command>
-      <action class="org.onosproject.vtnrsc.cli.virtualport.VirtualPortRemoveCommand"/>
-    </command>
-     <command>
-      <action class="org.onosproject.vtnrsc.cli.virtualport.VirtualPortUpdateCommand"/>
-    </command>
-    <command>
-      <action class="org.onosproject.vtnrsc.cli.virtualport.VirtualPortExGwUpdateCommand"/>
-    </command>
-     <command>
-      <action class="org.onosproject.vtnrsc.cli.floatingip.FloatingIpCreateCommand"/>
-    </command>
-     <command>
-      <action class="org.onosproject.vtnrsc.cli.floatingip.FloatingIpQueryCommand"/>
-    </command>
-     <command>
-      <action class="org.onosproject.vtnrsc.cli.floatingip.FloatingIpRemoveCommand"/>
-    </command>
-     <command>
-      <action class="org.onosproject.vtnrsc.cli.floatingip.FloatingIpUpdateCommand"/>
-    </command>
-     <command>
-      <action class="org.onosproject.vtnrsc.cli.router.RouterCreateCommand"/>
-    </command>
-     <command>
-      <action class="org.onosproject.vtnrsc.cli.router.RouterQueryCommand"/>
-    </command>
-     <command>
-      <action class="org.onosproject.vtnrsc.cli.router.RouterRemoveCommand"/>
-    </command>
-    <command>
-      <action class="org.onosproject.vtnrsc.cli.router.RouterUpdateCommand"/>
-    </command>
-     <command>
-      <action class="org.onosproject.vtnrsc.cli.routerinterface.RouterInterfaceCreateCommand"/>
-    </command>
-     <command>
-      <action class="org.onosproject.vtnrsc.cli.routerinterface.RouterInterfaceRemoveCommand"/>
-    </command>
-     <command>
-      <action class="org.onosproject.vtnrsc.cli.routerinterface.RouterInterfaceQueryCommand"/>
-    </command>
-  </command-bundle>
-</blueprint>
diff --git a/apps/vtn/vtnweb/BUCK b/apps/vtn/vtnweb/BUCK
deleted file mode 100644
index 53a640e..0000000
--- a/apps/vtn/vtnweb/BUCK
+++ /dev/null
@@ -1,20 +0,0 @@
-COMPILE_DEPS = [
-    '//lib:CORE_DEPS',
-    '//lib:JACKSON',
-    '//lib:javax.ws.rs-api',
-    '//utils/rest:onlab-rest',
-    '//apps/vtn/vtnrsc:onos-apps-vtn-vtnrsc',
-]
-
-TEST_DEPS = [
-    '//lib:TEST_REST',
-    '//utils/osgi:onlab-osgi-tests',
-    '//web/api:onos-rest-tests',
-    '//lib:minimal-json',
-]
-
-osgi_jar_with_tests (
-    deps = COMPILE_DEPS,
-    test_deps = TEST_DEPS,
-    web_context = '/onos/vtn',
-)
diff --git a/apps/vtn/vtnweb/src/main/java/org/onosproject/vtnweb/gui/SfcUiExtensionManager.java b/apps/vtn/vtnweb/src/main/java/org/onosproject/vtnweb/gui/SfcUiExtensionManager.java
index b28b557..7997d4a 100644
--- a/apps/vtn/vtnweb/src/main/java/org/onosproject/vtnweb/gui/SfcUiExtensionManager.java
+++ b/apps/vtn/vtnweb/src/main/java/org/onosproject/vtnweb/gui/SfcUiExtensionManager.java
@@ -15,31 +15,28 @@
  */
 package org.onosproject.vtnweb.gui;
 
-import static com.google.common.collect.ImmutableList.of;
-import static org.onosproject.ui.UiView.Category.NETWORK;
-import static org.slf4j.LoggerFactory.getLogger;
-
-import java.util.List;
-
-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.ImmutableList;
 import org.onosproject.ui.UiExtension;
 import org.onosproject.ui.UiExtensionService;
 import org.onosproject.ui.UiMessageHandlerFactory;
 import org.onosproject.ui.UiView;
+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.ImmutableList;
+import java.util.List;
+
+import static com.google.common.collect.ImmutableList.of;
+import static org.onosproject.ui.UiView.Category.NETWORK;
+import static org.slf4j.LoggerFactory.getLogger;
 
 /**
  * service function chain gui.
  */
-@Component(immediate = true, enabled = true)
-@Service(value = SfcUiExtensionManager.class)
+@Component(immediate = true, service = SfcUiExtensionManager.class)
 public class SfcUiExtensionManager {
     private final Logger log = getLogger(getClass());
 
@@ -47,7 +44,7 @@
             SfcUiExtensionManager.class.getClassLoader();
     private static final String GUI = "gui";
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected UiExtensionService uiExtensionService;
 
     // service function chain extension
diff --git a/apps/vtn/vtnweb/src/main/java/org/onosproject/vtnweb/web/VtnCodecRegistrator.java b/apps/vtn/vtnweb/src/main/java/org/onosproject/vtnweb/web/VtnCodecRegistrator.java
index 3add533..33581eb 100644
--- a/apps/vtn/vtnweb/src/main/java/org/onosproject/vtnweb/web/VtnCodecRegistrator.java
+++ b/apps/vtn/vtnweb/src/main/java/org/onosproject/vtnweb/web/VtnCodecRegistrator.java
@@ -15,11 +15,11 @@
  */
 package org.onosproject.vtnweb.web;
 
-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.onosproject.codec.CodecService;
 import org.onosproject.vtnrsc.FlowClassifier;
 import org.onosproject.vtnrsc.PortChain;
@@ -37,7 +37,7 @@
 
     private static Logger log = LoggerFactory.getLogger(VtnCodecRegistrator.class);
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected CodecService codecService;
 
     @Activate
diff --git a/apps/workflow/BUCK b/apps/workflow/BUCK
deleted file mode 100644
index d7e5d1b..0000000
--- a/apps/workflow/BUCK
+++ /dev/null
@@ -1,12 +0,0 @@
-BUNDLES = [
-    '//apps/workflow/api:onos-apps-workflow-api',
-    '//apps/workflow/app:onos-apps-workflow-app',
-]
-
-onos_app (
-    category = 'Utility',
-    description = "Workflow application",
-    included_bundles = BUNDLES,
-    title = 'Workflow',
-    url = 'http://onosproject.org',
-)
diff --git a/apps/workflow/api/BUCK b/apps/workflow/api/BUCK
deleted file mode 100644
index f9461af..0000000
--- a/apps/workflow/api/BUCK
+++ /dev/null
@@ -1,11 +0,0 @@
-COMPILE_DEPS = [
-    '//lib:CORE_DEPS',
-    '//lib:jackson-core',
-    '//lib:jackson-annotations',
-    '//lib:jackson-databind',
-    '//core/store/serializers:onos-core-serializers',
-]
-
-osgi_jar_with_tests (
-    deps = COMPILE_DEPS,
-)
diff --git a/apps/workflow/app/BUCK b/apps/workflow/app/BUCK
deleted file mode 100644
index aa0e62a..0000000
--- a/apps/workflow/app/BUCK
+++ /dev/null
@@ -1,16 +0,0 @@
-COMPILE_DEPS = [
-    '//lib:CORE_DEPS',
-    '//lib:KRYO',
-    '//lib:jsch',
-    '//lib:org.apache.karaf.shell.console',
-    '//lib:jackson-core',
-    '//lib:jackson-annotations',
-    '//lib:jackson-databind',
-    '//cli:onos-cli',
-    '//core/store/serializers:onos-core-serializers',
-    '//apps/workflow/api:onos-apps-workflow-api',
-]
-
-osgi_jar_with_tests(
-    deps = COMPILE_DEPS,
-)
diff --git a/apps/workflow/app/src/main/java/org/onosproject/workflow/cli/WorkFlowCommand.java b/apps/workflow/app/src/main/java/org/onosproject/workflow/cli/WorkFlowCommand.java
index 94b099b..3f96ba9 100644
--- a/apps/workflow/app/src/main/java/org/onosproject/workflow/cli/WorkFlowCommand.java
+++ b/apps/workflow/app/src/main/java/org/onosproject/workflow/cli/WorkFlowCommand.java
@@ -16,8 +16,9 @@
 package org.onosproject.workflow.cli;
 
 import com.fasterxml.jackson.databind.node.JsonNodeFactory;
-import org.apache.karaf.shell.commands.Argument;
-import org.apache.karaf.shell.commands.Command;
+import org.apache.karaf.shell.api.action.Argument;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.workflow.api.DefaultWorkflowDescription;
 import org.onosproject.workflow.api.WorkflowService;
@@ -26,10 +27,11 @@
 import java.util.Arrays;
 import java.util.Objects;
 
+@Service
 @Command(scope = "onos", name = "workflow", description = "workflow cli")
 public class WorkFlowCommand extends AbstractShellCommand {
 
-    @Argument (index = 0, name = "cmd", description = "command(invoke)", required = true)
+    @Argument(index = 0, name = "cmd", description = "command(invoke)", required = true)
     private String cmd = null;
 
     @Argument (index = 1, name = "id", description = "workflow id(URI)", required = true)
@@ -39,7 +41,7 @@
     private String name = null;
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         if (Objects.isNull(cmd)) {
             error("invalid cmd parameter");
             return;
diff --git a/apps/workflow/app/src/main/java/org/onosproject/workflow/cli/WorkFlowEventMapCommand.java b/apps/workflow/app/src/main/java/org/onosproject/workflow/cli/WorkFlowEventMapCommand.java
index 0a8e492..e23e97d 100644
--- a/apps/workflow/app/src/main/java/org/onosproject/workflow/cli/WorkFlowEventMapCommand.java
+++ b/apps/workflow/app/src/main/java/org/onosproject/workflow/cli/WorkFlowEventMapCommand.java
@@ -18,8 +18,9 @@
 import com.fasterxml.jackson.core.JsonProcessingException;
 import com.fasterxml.jackson.databind.JsonNode;
 import com.fasterxml.jackson.databind.ObjectMapper;
-import org.apache.karaf.shell.commands.Argument;
-import org.apache.karaf.shell.commands.Command;
+import org.apache.karaf.shell.api.action.Argument;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.workflow.api.ContextEventMapStore;
 import org.onosproject.workflow.api.WorkflowException;
@@ -27,14 +28,15 @@
 import java.util.Arrays;
 import java.util.Objects;
 
+@Service
 @Command(scope = "onos", name = "workflow-eventmap", description = "workflow event map cli")
 public class WorkFlowEventMapCommand extends AbstractShellCommand {
 
-    @Argument (index = 0, name = "cmd", description = "command(print)", required = true)
+    @Argument(index = 0, name = "cmd", description = "command(print)", required = true)
     private String cmd = null;
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         if (Objects.isNull(cmd)) {
             error("invalid cmd parameter");
             return;
diff --git a/apps/workflow/app/src/main/java/org/onosproject/workflow/cli/WorkFlowStoreCommand.java b/apps/workflow/app/src/main/java/org/onosproject/workflow/cli/WorkFlowStoreCommand.java
index 820d141..f5e795a 100644
--- a/apps/workflow/app/src/main/java/org/onosproject/workflow/cli/WorkFlowStoreCommand.java
+++ b/apps/workflow/app/src/main/java/org/onosproject/workflow/cli/WorkFlowStoreCommand.java
@@ -15,8 +15,9 @@
  */
 package org.onosproject.workflow.cli;
 
-import org.apache.karaf.shell.commands.Argument;
-import org.apache.karaf.shell.commands.Command;
+import org.apache.karaf.shell.api.action.Argument;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.workflow.api.Workflow;
 import org.onosproject.workflow.api.WorkflowStore;
@@ -24,17 +25,18 @@
 import java.util.Objects;
 import java.net.URI;
 
+@Service
 @Command(scope = "onos", name = "workflowstore", description = "workflow store cli")
 public class WorkFlowStoreCommand extends AbstractShellCommand {
 
-    @Argument (index = 0, name = "cmd", description = "command(rm)", required = false)
+    @Argument(index = 0, name = "cmd", description = "command(rm)", required = false)
     private String cmd = null;
 
     @Argument (index = 1, name = "id", description = "workflow id(URI)", required = false)
     private String id = null;
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
 
         if (Objects.isNull(cmd)) {
             printAllWorkflow();
diff --git a/apps/workflow/app/src/main/java/org/onosproject/workflow/cli/WorkFlowTestCommand.java b/apps/workflow/app/src/main/java/org/onosproject/workflow/cli/WorkFlowTestCommand.java
index 090dad0..b3c34ec 100644
--- a/apps/workflow/app/src/main/java/org/onosproject/workflow/cli/WorkFlowTestCommand.java
+++ b/apps/workflow/app/src/main/java/org/onosproject/workflow/cli/WorkFlowTestCommand.java
@@ -16,8 +16,9 @@
 package org.onosproject.workflow.cli;
 
 import com.fasterxml.jackson.databind.node.JsonNodeFactory;
-import org.apache.karaf.shell.commands.Argument;
-import org.apache.karaf.shell.commands.Command;
+import org.apache.karaf.shell.api.action.Argument;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.workflow.api.DefaultWorkflowDescription;
 import org.onosproject.workflow.api.WorkflowException;
@@ -26,17 +27,18 @@
 import java.util.Arrays;
 import java.util.Objects;
 
+@Service
 @Command(scope = "onos", name = "workflow-test", description = "workflow test cli")
 public class WorkFlowTestCommand extends AbstractShellCommand {
 
-    @Argument (index = 0, name = "cmd", description = "command(invoke)", required = true)
+    @Argument(index = 0, name = "cmd", description = "command(invoke)", required = true)
     private String cmd = null;
 
     @Argument (index = 1, name = "number", description = "number of test", required = true)
     private String number = null;
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         if (Objects.isNull(cmd)) {
             error("invalid cmd parameter");
             return;
diff --git a/apps/workflow/app/src/main/java/org/onosproject/workflow/cli/WorkplaceStoreCommand.java b/apps/workflow/app/src/main/java/org/onosproject/workflow/cli/WorkplaceStoreCommand.java
index ded5882..db1a736 100644
--- a/apps/workflow/app/src/main/java/org/onosproject/workflow/cli/WorkplaceStoreCommand.java
+++ b/apps/workflow/app/src/main/java/org/onosproject/workflow/cli/WorkplaceStoreCommand.java
@@ -15,9 +15,10 @@
  */
 package org.onosproject.workflow.cli;
 
-import org.apache.karaf.shell.commands.Argument;
-import org.apache.karaf.shell.commands.Command;
-import org.apache.karaf.shell.commands.Option;
+import org.apache.karaf.shell.api.action.Argument;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.Option;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.workflow.api.WorkflowContext;
 import org.onosproject.workflow.api.WorkflowException;
@@ -29,11 +30,12 @@
 import java.util.Arrays;
 import java.util.Objects;
 
+@Service
 @Command(scope = "onos", name = "workplace",
         description = "workplace cli")
 public class WorkplaceStoreCommand extends AbstractShellCommand {
 
-    @Argument (index = 0, name = "cmd", description = "command(add/rm/clear/print)", required = false)
+    @Argument(index = 0, name = "cmd", description = "command(add/rm/clear/print)", required = false)
     private String cmd = null;
 
     @Argument (index = 1, name = "name", description = "workspace name", required = false)
@@ -48,7 +50,7 @@
     private String exFilter = null;
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
 
         if (Objects.isNull(cmd)) {
             printAllWorkplace();
diff --git a/apps/workflow/app/src/main/java/org/onosproject/workflow/impl/DistributedContextEventMapTreeStore.java b/apps/workflow/app/src/main/java/org/onosproject/workflow/impl/DistributedContextEventMapTreeStore.java
index b7c7366..1ee2cf0 100644
--- a/apps/workflow/app/src/main/java/org/onosproject/workflow/impl/DistributedContextEventMapTreeStore.java
+++ b/apps/workflow/app/src/main/java/org/onosproject/workflow/impl/DistributedContextEventMapTreeStore.java
@@ -19,12 +19,11 @@
 import com.fasterxml.jackson.databind.node.ObjectNode;
 import com.google.common.collect.Lists;
 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.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.util.KryoNamespace;
 import org.onosproject.core.ApplicationId;
 import org.onosproject.core.CoreService;
@@ -49,16 +48,15 @@
 
 import static org.slf4j.LoggerFactory.getLogger;
 
-@Component(immediate = true)
-@Service
+@Component(immediate = true, service = ContextEventMapStore.class)
 public class DistributedContextEventMapTreeStore implements ContextEventMapStore {
 
     protected static final Logger log = getLogger(DistributedContextEventMapTreeStore.class);
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     private CoreService coreService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     private StorageService storageService;
 
     private ApplicationId appId;
diff --git a/apps/workflow/app/src/main/java/org/onosproject/workflow/impl/DistributedWorkplaceStore.java b/apps/workflow/app/src/main/java/org/onosproject/workflow/impl/DistributedWorkplaceStore.java
index ca8a454..31fe044 100644
--- a/apps/workflow/app/src/main/java/org/onosproject/workflow/impl/DistributedWorkplaceStore.java
+++ b/apps/workflow/app/src/main/java/org/onosproject/workflow/impl/DistributedWorkplaceStore.java
@@ -40,12 +40,11 @@
 import com.fasterxml.jackson.databind.node.ValueNode;
 import com.google.common.collect.ImmutableList;
 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.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.util.KryoNamespace;
 import org.onosproject.core.ApplicationId;
 import org.onosproject.core.CoreService;
@@ -82,15 +81,14 @@
 
 import static org.slf4j.LoggerFactory.getLogger;
 
-@Component(immediate = true)
-@Service
+@Component(immediate = true, service = WorkplaceStore.class)
 public class DistributedWorkplaceStore
     extends AbstractStore<WorkflowDataEvent, WorkplaceStoreDelegate> implements WorkplaceStore {
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected CoreService coreService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected StorageService storageService;
 
     private ApplicationId appId;
diff --git a/apps/workflow/app/src/main/java/org/onosproject/workflow/impl/ECWorkFlowStore.java b/apps/workflow/app/src/main/java/org/onosproject/workflow/impl/ECWorkFlowStore.java
index cd7df77..fcb17c9 100644
--- a/apps/workflow/app/src/main/java/org/onosproject/workflow/impl/ECWorkFlowStore.java
+++ b/apps/workflow/app/src/main/java/org/onosproject/workflow/impl/ECWorkFlowStore.java
@@ -18,13 +18,13 @@
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableSet;
 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.onlab.util.KryoNamespace;
+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.onosproject.core.ApplicationId;
 import org.onosproject.core.CoreService;
 import org.onosproject.workflow.api.AbstractWorkflow;
@@ -39,7 +39,6 @@
 import org.onosproject.store.service.EventuallyConsistentMap;
 import org.onosproject.store.service.StorageService;
 import org.onosproject.store.service.WallClockTimestamp;
-import org.slf4j.Logger;
 
 import java.net.URI;
 import java.util.Collection;
@@ -50,17 +49,16 @@
 
 import static org.slf4j.LoggerFactory.getLogger;
 
-@Component(immediate = true)
-@Service
+@Component(immediate = true, service = WorkflowStore.class)
 public class ECWorkFlowStore
     extends AbstractStore<GroupEvent, GroupStoreDelegate> implements WorkflowStore {
 
     private final Logger log = getLogger(getClass());
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected CoreService coreService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected StorageService storageService;
 
     private ApplicationId appId;
diff --git a/apps/workflow/app/src/main/java/org/onosproject/workflow/impl/WorkFlowEngine.java b/apps/workflow/app/src/main/java/org/onosproject/workflow/impl/WorkFlowEngine.java
index 26e0bc9..15cd8cd 100644
--- a/apps/workflow/app/src/main/java/org/onosproject/workflow/impl/WorkFlowEngine.java
+++ b/apps/workflow/app/src/main/java/org/onosproject/workflow/impl/WorkFlowEngine.java
@@ -17,12 +17,6 @@
 
 import com.fasterxml.jackson.databind.node.JsonNodeFactory;
 import com.google.common.collect.Lists;
-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.LeadershipService;
 import org.onosproject.cluster.NodeId;
@@ -56,6 +50,11 @@
 import org.onosproject.event.AbstractListenerManager;
 import org.onosproject.event.Event;
 import org.onosproject.net.intent.WorkPartitionService;
+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;
@@ -75,31 +74,30 @@
 import static org.onosproject.workflow.api.WorkflowAttribute.REMOVE_AFTER_COMPLETE;
 import static org.slf4j.LoggerFactory.getLogger;
 
-@Component(immediate = true)
-@Service
+@Component(immediate = true, service = WorkflowExecutionService.class)
 public class WorkFlowEngine extends AbstractListenerManager<WorkflowDataEvent, WorkflowDataListener>
         implements WorkflowExecutionService {
 
     protected static final Logger log = getLogger(WorkFlowEngine.class);
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected CoreService coreService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected ClusterService clusterService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected LeadershipService leadershipService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected WorkPartitionService partitionService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected WorkplaceStore workplaceStore;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected WorkflowStore workflowStore;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected ContextEventMapStore eventMapStore;
 
     private final WorkplaceStoreDelegate workplaceStoreDelegate = this::post;
diff --git a/apps/workflow/app/src/main/java/org/onosproject/workflow/impl/WorkflowManager.java b/apps/workflow/app/src/main/java/org/onosproject/workflow/impl/WorkflowManager.java
index 804716e..5866932 100644
--- a/apps/workflow/app/src/main/java/org/onosproject/workflow/impl/WorkflowManager.java
+++ b/apps/workflow/app/src/main/java/org/onosproject/workflow/impl/WorkflowManager.java
@@ -17,12 +17,6 @@
 
 import com.fasterxml.jackson.databind.JsonNode;
 import com.fasterxml.jackson.databind.node.JsonNodeFactory;
-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.net.config.NetworkConfigRegistry;
 import org.onosproject.net.config.NetworkConfigService;
 import org.onosproject.workflow.api.DefaultWorkplace;
@@ -37,6 +31,11 @@
 import org.onosproject.workflow.api.Workplace;
 import org.onosproject.workflow.api.WorkplaceDescription;
 import org.onosproject.workflow.api.WorkplaceStore;
+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.URI;
@@ -44,25 +43,24 @@
 
 import static org.slf4j.LoggerFactory.getLogger;
 
-@Component(immediate = true)
-@Service
+@Component(immediate = true, service = WorkflowService.class)
 public class WorkflowManager implements WorkflowService {
 
     protected static final Logger log = getLogger(WorkflowManager.class);
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     private WorkflowExecutionService workflowExecutionService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected WorkplaceStore workplaceStore;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected WorkflowStore workflowStore;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     private NetworkConfigService networkConfigService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     private NetworkConfigRegistry networkConfigRegistry;
 
     private WorkflowNetConfigListener netcfgListener;
diff --git a/apps/workflow/app/src/main/java/org/onosproject/workflow/impl/example/SampleWorkflow.java b/apps/workflow/app/src/main/java/org/onosproject/workflow/impl/example/SampleWorkflow.java
index a1ca9cc..c09bec2 100644
--- a/apps/workflow/app/src/main/java/org/onosproject/workflow/impl/example/SampleWorkflow.java
+++ b/apps/workflow/app/src/main/java/org/onosproject/workflow/impl/example/SampleWorkflow.java
@@ -18,11 +18,6 @@
 import com.fasterxml.jackson.databind.JsonNode;
 import com.fasterxml.jackson.databind.node.JsonNodeType;
 import com.fasterxml.jackson.databind.node.ObjectNode;
-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.onosproject.net.device.DeviceService;
 import org.onosproject.workflow.api.AbstractWorklet;
 import org.onosproject.workflow.api.DataModelTree;
@@ -34,6 +29,11 @@
 import org.onosproject.workflow.api.WorkflowExecutionService;
 import org.onosproject.workflow.api.WorkflowStore;
 import org.onosproject.workflow.api.WorkplaceStore;
+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;
 
@@ -47,16 +47,16 @@
 
     private static final Logger log = LoggerFactory.getLogger(SampleWorkflow.class);
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected WorkflowStore workflowStore;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected WorkplaceStore workplaceStore;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected WorkflowExecutionService workflowExecutionService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected DeviceService deviceService;
 
 
diff --git a/apps/workflow/app/src/main/resources/OSGI-INF/blueprint/shell-config.xml b/apps/workflow/app/src/main/resources/OSGI-INF/blueprint/shell-config.xml
deleted file mode 100644
index cee835a..0000000
--- a/apps/workflow/app/src/main/resources/OSGI-INF/blueprint/shell-config.xml
+++ /dev/null
@@ -1,20 +0,0 @@
-<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0">
-
-	<command-bundle xmlns="http://karaf.apache.org/xmlns/shell/v1.1.0">
-		<command>
-			<action class="org.onosproject.workflow.cli.WorkFlowStoreCommand"></action>
-		</command>
-		<command>
-			<action class="org.onosproject.workflow.cli.WorkplaceStoreCommand"></action>
-		</command>
-		<command>
-			<action class="org.onosproject.workflow.cli.WorkFlowCommand"></action>
-		</command>
-		<command>
-			<action class="org.onosproject.workflow.cli.WorkFlowEventMapCommand"></action>
-		</command>
-		<command>
-			<action class="org.onosproject.workflow.cli.WorkFlowTestCommand"></action>
-		</command>
-	</command-bundle>
-</blueprint>
diff --git a/apps/yang-gui/BUCK b/apps/yang-gui/BUCK
deleted file mode 100644
index 7e971f4..0000000
--- a/apps/yang-gui/BUCK
+++ /dev/null
@@ -1,25 +0,0 @@
-COMPILE_DEPS = [
-    '//lib:CORE_DEPS',
-    '//lib:JACKSON',
-    '//lib:ONOS_YANG',
-    '//lib:onos-yang-runtime',
-    '//apps/yang:onos-apps-yang',
-]
-
-osgi_jar_with_tests (
-    deps = COMPILE_DEPS,
-    resources_root = 'src/main/resources',
-    resources = glob(['src/main/resources/**']),
-)
-
-onos_app (
-    title = 'YANG Runtime GUI',
-    category = 'GUI',
-    url = 'http://onosproject.org',
-    description = 'Adds GUI extension that allows the operator to view the list of currently ' +
-        'registered YANG models, and their YANG sources. It also provides means for compiling ' +
-        'source YANG files (*.yang, *.zip, *.jar) on the fly and directly from the GUI using ' +
-        'drag-n-drop.<p/>User can simply compress a set of YANG source files and drop it on the ' +
-        'YANG Models GUI view to automatically compile and then register the compiled YANG models.',
-    required_apps = [ 'org.onosproject.yang' ],
-)
diff --git a/apps/yang-gui/src/main/java/org/onosproject/yang/gui/YangModelUiComponent.java b/apps/yang-gui/src/main/java/org/onosproject/yang/gui/YangModelUiComponent.java
index 4337b0f..0456e5e 100644
--- a/apps/yang-gui/src/main/java/org/onosproject/yang/gui/YangModelUiComponent.java
+++ b/apps/yang-gui/src/main/java/org/onosproject/yang/gui/YangModelUiComponent.java
@@ -17,11 +17,11 @@
 package org.onosproject.yang.gui;
 
 import com.google.common.collect.ImmutableList;
-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.onosproject.ui.UiExtension;
 import org.onosproject.ui.UiExtensionService;
 import org.onosproject.ui.UiMessageHandlerFactory;
@@ -49,7 +49,7 @@
 
     private final Logger log = LoggerFactory.getLogger(getClass());
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected UiExtensionService uiExtensionService;
 
     // List of application views
diff --git a/apps/yang/BUCK b/apps/yang/BUCK
deleted file mode 100644
index a7319ea..0000000
--- a/apps/yang/BUCK
+++ /dev/null
@@ -1,53 +0,0 @@
-COMPILE_DEPS = [
-  '//lib:CORE_DEPS',
-  '//lib:JACKSON',
-  '//core/api:onos-api',
-  '//core/common:onos-core-common',
-  '//cli:onos-cli',
-  '//lib:org.apache.karaf.shell.console',
-  '//lib:jackson-core',
-  '//lib:onos-yang-model',
-  '//lib:onos-yang-compiler-api',
-  '//lib:onos-yang-runtime',
-  '//lib:onos-yang-serializers-json',
-  '//lib:onos-yang-serializers-xml',
-  '//lib:onos-yang-serializers-utils',
-  '//lib:org.apache.servicemix.bundles.dom4j',
-]
-
-BUNDLES = [
-  '//lib:onos-yang-model',
-  '//lib:onos-yang-compiler-api',
-  '//lib:onos-yang-runtime',
-  '//lib:onos-yang-serializers-json',
-  '//lib:onos-yang-serializers-xml',
-  '//lib:onos-yang-serializers-utils',
-  '//apps/yang:onos-apps-yang',
-  '//apps/yang/web:onos-apps-yang-web',
-]
-
-EXCLUDED_BUNDLES = [
-  '//lib:org.apache.servicemix.bundles.dom4j',
-]
-
-TEST_DEPS = [
-  '//lib:TEST_ADAPTERS',
-  '//utils/osgi:onlab-osgi-tests',
-]
-
-osgi_jar_with_tests(
-  deps = COMPILE_DEPS,
-  test_deps = TEST_DEPS,
-)
-
-onos_app(
-  title = 'YANG Compiler and Runtime',
-  category = 'Utility',
-  url = 'http://onosproject.org',
-  description = 'Provides ability to register compiled YANG models or even to compile YANG source ' +
-    'files on the fly. Registering YANG models allows other ONOS subsystems to interact with ' +
-    'orchestrators or individual network devices using XML or JSON data structured in accordance ' +
-    'with those models.',
-  included_bundles = BUNDLES,
-  excluded_bundles = EXCLUDED_BUNDLES,
-)
diff --git a/apps/yang/BUILD b/apps/yang/BUILD
index 1f38d13..12decaf 100644
--- a/apps/yang/BUILD
+++ b/apps/yang/BUILD
@@ -14,6 +14,7 @@
 ]
 
 osgi_jar_with_tests(
+    karaf_command_packages = ["org.onosproject.yang.impl"],
     deps = COMPILE_DEPS,
 )
 
diff --git a/apps/yang/src/main/java/org/onosproject/yang/AbstractYangModelRegistrator.java b/apps/yang/src/main/java/org/onosproject/yang/AbstractYangModelRegistrator.java
index a068526..dc10103 100644
--- a/apps/yang/src/main/java/org/onosproject/yang/AbstractYangModelRegistrator.java
+++ b/apps/yang/src/main/java/org/onosproject/yang/AbstractYangModelRegistrator.java
@@ -16,11 +16,10 @@
 
 package org.onosproject.yang;
 
-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.Deactivate;
+import org.osgi.service.component.annotations.Reference;
+import org.osgi.service.component.annotations.ReferenceCardinality;
 import org.onosproject.yang.model.YangModel;
 import org.onosproject.yang.model.YangModuleId;
 import org.onosproject.yang.runtime.AppModuleInfo;
@@ -38,7 +37,6 @@
 /**
  * Abstract base for self-registering YANG models.
  */
-@Component
 public abstract class AbstractYangModelRegistrator {
 
     protected final Logger log = LoggerFactory.getLogger(getClass());
@@ -48,13 +46,49 @@
     protected YangModel model;
     private ModelRegistrationParam registrationParam;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected YangModelRegistry modelRegistry;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected YangClassLoaderRegistry sourceResolver;
 
     /**
+     * Binds the specified YANG model registry.
+     *
+     * @param registry model registry
+     */
+    protected void bindModelRegistry(YangModelRegistry registry) {
+        this.modelRegistry = registry;
+    }
+
+    /**
+     * Unbinds the specified YANG model registry.
+     *
+     * @param registry model registry
+     */
+    protected void unbindModelRegistry(YangModelRegistry registry) {
+        this.modelRegistry = null;
+    }
+
+    /**
+     * Binds the specified YANG source resolver registry.
+     *
+     * @param resolver model source resolver
+     */
+    protected void bindSourceResolver(YangClassLoaderRegistry resolver) {
+        this.sourceResolver = resolver;
+    }
+
+    /**
+     * Unbinds the specified YANG source resolver registry.
+     *
+     * @param resolver model source resolver
+     */
+    protected void unbindSourceResolver(YangClassLoaderRegistry resolver) {
+        this.sourceResolver = null;
+    }
+
+    /**
      * Creates a model registrator primed with the class-loader of the specified
      * class.
      *
diff --git a/apps/yang/src/main/java/org/onosproject/yang/impl/YangCompileCommand.java b/apps/yang/src/main/java/org/onosproject/yang/impl/YangCompileCommand.java
index 3061da6..a366073 100644
--- a/apps/yang/src/main/java/org/onosproject/yang/impl/YangCompileCommand.java
+++ b/apps/yang/src/main/java/org/onosproject/yang/impl/YangCompileCommand.java
@@ -16,9 +16,10 @@
 package org.onosproject.yang.impl;
 
 import com.google.common.io.ByteStreams;
-import org.apache.karaf.shell.commands.Argument;
-import org.apache.karaf.shell.commands.Command;
-import org.apache.karaf.shell.commands.Option;
+import org.apache.karaf.shell.api.action.Argument;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.Option;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.app.ApplicationAdminService;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.core.ApplicationId;
@@ -31,6 +32,7 @@
 /**
  * Compiles the provided YANG source files and installs the resulting model extension.
  */
+@Service
 @Command(scope = "onos", name = "compile-model",
         description = "Compiles the provided YANG source files and installs the resulting model extension")
 public class YangCompileCommand extends AbstractShellCommand {
@@ -53,7 +55,7 @@
     String url = null;
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         try {
             InputStream yangJar = new URL(url).openStream();
             YangLiveCompilerService compiler = get(YangLiveCompilerService.class);
diff --git a/apps/yang/src/main/java/org/onosproject/yang/impl/YangLiveCompilerManager.java b/apps/yang/src/main/java/org/onosproject/yang/impl/YangLiveCompilerManager.java
index 10f821e..7e94639 100644
--- a/apps/yang/src/main/java/org/onosproject/yang/impl/YangLiveCompilerManager.java
+++ b/apps/yang/src/main/java/org/onosproject/yang/impl/YangLiveCompilerManager.java
@@ -18,14 +18,13 @@
 
 import com.google.common.io.ByteStreams;
 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.Service;
 import org.onlab.util.FilePathValidator;
 import org.onosproject.yang.YangLiveCompilerService;
 import org.onosproject.yang.compiler.tool.DefaultYangCompilationParam;
 import org.onosproject.yang.compiler.tool.YangCompilerManager;
+import org.osgi.service.component.annotations.Activate;
+import org.osgi.service.component.annotations.Component;
+import org.osgi.service.component.annotations.Deactivate;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -52,8 +51,7 @@
 /**
  * Represents implementation of YANG live compiler manager.
  */
-@Service
-@Component(immediate = true)
+@Component(immediate = true, service = YangLiveCompilerService.class)
 public class YangLiveCompilerManager implements YangLiveCompilerService {
 
     private final Logger log = LoggerFactory.getLogger(getClass());
diff --git a/apps/yang/src/main/java/org/onosproject/yang/impl/YangModelsListCommand.java b/apps/yang/src/main/java/org/onosproject/yang/impl/YangModelsListCommand.java
index 69fef62..d75b999 100644
--- a/apps/yang/src/main/java/org/onosproject/yang/impl/YangModelsListCommand.java
+++ b/apps/yang/src/main/java/org/onosproject/yang/impl/YangModelsListCommand.java
@@ -19,7 +19,8 @@
 import com.fasterxml.jackson.databind.ObjectMapper;
 import com.fasterxml.jackson.databind.node.ArrayNode;
 import com.fasterxml.jackson.databind.node.ObjectNode;
-import org.apache.karaf.shell.commands.Command;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.yang.model.YangModel;
 import org.onosproject.yang.model.YangModule;
@@ -28,6 +29,7 @@
 /**
  * Lists registered YANG models.
  */
+@Service
 @Command(scope = "onos", name = "models",
         description = "Lists registered YANG models")
 public class YangModelsListCommand extends AbstractShellCommand {
@@ -38,7 +40,7 @@
     private static final String MODULE_REVISION = "moduleRevision";
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         YangModelRegistry service = get(YangModelRegistry.class);
 
         if (outputJson()) {
diff --git a/apps/yang/src/main/java/org/onosproject/yang/impl/YangRuntimeManager.java b/apps/yang/src/main/java/org/onosproject/yang/impl/YangRuntimeManager.java
index c338c33..fe74bd3 100644
--- a/apps/yang/src/main/java/org/onosproject/yang/impl/YangRuntimeManager.java
+++ b/apps/yang/src/main/java/org/onosproject/yang/impl/YangRuntimeManager.java
@@ -16,12 +16,6 @@
 
 package org.onosproject.yang.impl;
 
-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.core.CoreService;
 import org.onosproject.yang.YangClassLoaderRegistry;
 import org.onosproject.yang.model.ModelConverter;
@@ -51,6 +45,11 @@
 import org.onosproject.yang.runtime.impl.DefaultYangSerializerRegistry;
 import org.onosproject.yang.serializers.json.JsonSerializer;
 import org.onosproject.yang.serializers.xml.XmlSerializer;
+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;
 
@@ -63,8 +62,9 @@
 /**
  * Represents implementation of YANG runtime manager.
  */
-@Service
-@Component(immediate = true)
+@Component(immediate = true, service = { YangModelRegistry.class,
+        YangSerializerRegistry.class, YangRuntimeService.class, ModelConverter.class,
+        SchemaContextProvider.class, YangClassLoaderRegistry.class })
 public class YangRuntimeManager implements YangModelRegistry,
         YangSerializerRegistry, YangRuntimeService, ModelConverter,
         SchemaContextProvider, YangClassLoaderRegistry {
@@ -72,7 +72,7 @@
     private static final String APP_ID = "org.onosproject.yang";
     private final Logger log = LoggerFactory.getLogger(getClass());
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected CoreService coreService;
 
     private DefaultYangModelRegistry modelRegistry;
diff --git a/apps/yang/src/main/resources/OSGI-INF/blueprint/shell-config.xml b/apps/yang/src/main/resources/OSGI-INF/blueprint/shell-config.xml
deleted file mode 100644
index d5e1711..0000000
--- a/apps/yang/src/main/resources/OSGI-INF/blueprint/shell-config.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-<!--
-  ~ Copyright 2017-present Open Networking Foundation
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~     http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License.
-  -->
-<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0">
-    <command-bundle xmlns="http://karaf.apache.org/xmlns/shell/v1.1.0">
-        <command>
-            <action class="org.onosproject.yang.impl.YangModelsListCommand"/>
-        </command>
-        <command>
-            <action class="org.onosproject.yang.impl.YangCompileCommand"/>
-        </command>
-    </command-bundle>
-</blueprint>
diff --git a/apps/yang/web/BUCK b/apps/yang/web/BUCK
deleted file mode 100644
index b988cc6..0000000
--- a/apps/yang/web/BUCK
+++ /dev/null
@@ -1,23 +0,0 @@
-COMPILE_DEPS = [
-  '//lib:CORE_DEPS',
-  '//lib:JACKSON',
-  '//lib:javax.ws.rs-api',
-  '//utils/rest:onlab-rest',
-  '//lib:jersey-media-multipart',
-  '//lib:onos-yang-model',
-  '//lib:onos-yang-compiler-api',
-  '//lib:onos-yang-runtime',
-  '//apps/yang:onos-apps-yang'
-]
-
-TEST_DEPS = [
-  '//lib:TEST_REST',
-  '//utils/osgi:onlab-osgi-tests',
-  '//web/api:onos-rest-tests',
-]
-
-osgi_jar_with_tests(
-  deps = COMPILE_DEPS,
-  test_deps = TEST_DEPS,
-  web_context = '/onos/yang',
-)
diff --git a/apps/yms/app/app.xml b/apps/yms/app/app.xml
deleted file mode 100644
index bedcf30..0000000
--- a/apps/yms/app/app.xml
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-  ~ Copyright 2016-present Open Networking Foundation
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~     http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License.
-  -->
-<app name="org.onosproject.yms" origin="ON.Lab" version="${project.version}"
-     category="Utility" url="http://onosproject.org" title="YMS App"
-     featuresRepo="mvn:${project.groupId}/${project.artifactId}/${project.version}/xml/features"
-     features="${project.artifactId}">
-    <description>${project.description}</description>
-    <artifact>mvn:${project.groupId}/${project.artifactId}/${project.version}</artifact>
-    <artifact>mvn:${project.groupId}/onos-apps-yms-api/${project.version}</artifact>
-</app>
diff --git a/apps/yms/app/features.xml b/apps/yms/app/features.xml
deleted file mode 100644
index ae1e094..0000000
--- a/apps/yms/app/features.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
-<!--
-  ~ Copyright 2016-present Open Networking Foundation
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~     http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License.
-  -->
-<features xmlns="http://karaf.apache.org/xmlns/features/v1.2.0" name="${project.artifactId}-${project.version}">
-    <feature name="${project.artifactId}" version="${project.version}"
-             description="${project.description}">
-        <feature>onos-api</feature>
-        <bundle>mvn:${project.groupId}/onos-apps-yms-api/${project.version}</bundle>
-        <bundle>mvn:${project.groupId}/${project.artifactId}/${project.version}</bundle>
-        <bundle dependency="true">mvn:org.apache.servicemix.bundles/org.apache.servicemix.bundles.dom4j/1.6.1_5</bundle>
-    </feature>
-</features>
diff --git a/apps/yms/app/src/main/java/org/onosproject/yms/app/ymsm/YmsManager.java b/apps/yms/app/src/main/java/org/onosproject/yms/app/ymsm/YmsManager.java
index 1af2302..b3e37c1 100644
--- a/apps/yms/app/src/main/java/org/onosproject/yms/app/ymsm/YmsManager.java
+++ b/apps/yms/app/src/main/java/org/onosproject/yms/app/ymsm/YmsManager.java
@@ -16,12 +16,6 @@
 
 package org.onosproject.yms.app.ymsm;
 
-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.core.ApplicationId;
 import org.onosproject.core.CoreService;
 import org.onosproject.core.IdGenerator;
@@ -47,6 +41,11 @@
 import org.onosproject.yms.ynh.YangNotificationService;
 import org.onosproject.yms.ysr.YangModuleIdentifier;
 import org.onosproject.yms.ysr.YangModuleLibrary;
+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;
 
@@ -61,8 +60,7 @@
 /**
  * Represents implementation of YANG management system manager.
  */
-@Service
-@Component(immediate = true)
+@Component(immediate = true, service = YmsService.class)
 public class YmsManager
         implements YmsService {
 
@@ -79,7 +77,7 @@
     private YangNotificationExtendedService ynhExtendedService;
     private YangModuleLibrary library;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected CoreService coreService;
 
     @Activate
diff --git a/apps/yms/app/src/main/java/org/onosproject/yms/app/ypm/YpmManager.java b/apps/yms/app/src/main/java/org/onosproject/yms/app/ypm/YpmManager.java
index 954511a..8e6238f 100644
--- a/apps/yms/app/src/main/java/org/onosproject/yms/app/ypm/YpmManager.java
+++ b/apps/yms/app/src/main/java/org/onosproject/yms/app/ypm/YpmManager.java
@@ -16,22 +16,20 @@
 
 package org.onosproject.yms.app.ypm;
 
-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.onosproject.yms.ydt.YdtContext;
+import org.onosproject.yms.ypm.DefaultYpmNode;
 import org.onosproject.yms.ypm.YpmContext;
 import org.onosproject.yms.ypm.YpmService;
-import org.onosproject.yms.ypm.DefaultYpmNode;
+import org.osgi.service.component.annotations.Activate;
+import org.osgi.service.component.annotations.Component;
+import org.osgi.service.component.annotations.Deactivate;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 /**
  * Represents implementation of YANG protocol metadata manager.
  */
-@Service
-@Component(immediate = true)
+@Component(immediate = true, service = YpmService.class)
 public class YpmManager implements YpmService {
 
     private final Logger log = LoggerFactory.getLogger(getClass());
diff --git a/buck-tools/BUCK b/buck-tools/BUCK
deleted file mode 100644
index 9548e41..0000000
--- a/buck-tools/BUCK
+++ /dev/null
@@ -1,60 +0,0 @@
-python_binary(
-  name = 'onos-app-writer',
-  main = 'onos_app.py',
-  deps = [],
-  visibility = ['PUBLIC'],
-)
-
-python_binary(
-  name = 'onos-app-oar',
-  main = 'onos_oar.py',
-  deps = [],
-  visibility = ['PUBLIC'],
-)
-
-python_binary(
-  name = 'onos-stage',
-  main = 'onos_stage.py',
-  deps = [],
-  visibility = ['PUBLIC'],
-)
-
-python_binary(
-  name = 'onos-feature',
-  main = 'onos_feature.py',
-  deps = [],
-  visibility = ['PUBLIC'],
-)
-
-def shquote(s):
-  return s.replace("'", "'\\''")
-
-def os_path():
-  from os import environ
-  return environ.get('PATH')
-
-genrule(
-  name = 'buck',
-  cmd = 'echo buck=`which buck`>$OUT;' +
-    ("echo PATH=\''%s'\' >>$OUT;" % shquote(os_path())),
-  out = 'buck.properties',
-  visibility = ['PUBLIC'],
-)
-
-export_file(
-  name = 'yang-registrator',
-  src = 'yang-registrator',
-  visibility = [ 'PUBLIC' ],
-)
-
-export_file(
-  name = 'yang-schema',
-  src = 'yang-schema',
-  visibility = [ 'PUBLIC' ],
-)
-
-export_file(
-  name = 'grpc',
-  src = 'grpc',
-  visibility = [ 'PUBLIC' ],
-)
diff --git a/buck-tools/default.defs b/buck-tools/default.defs
deleted file mode 100644
index 0e3ff13..0000000
--- a/buck-tools/default.defs
+++ /dev/null
@@ -1,15 +0,0 @@
-include_defs('//onos.defs')
-include_defs('//bucklets/maven_jar.bucklet')
-include_defs('//bucklets/onos.bucklet')
-include_defs('//bucklets/onos_app.bucklet')
-include_defs('//bucklets/yang.bucklet')
-include_defs('//bucklets/remote_jar.bucklet')
-include_defs('//bucklets/grpc.bucklet')
-include_defs('//bucklets/jaxb2.bucklet')
-
-BASE_DEPS = [
-    '//lib:junit',
-    '//lib:hamcrest-all',
-    '//lib:slf4j-api',
-    '//lib:guava-testlib',
-]
diff --git a/buck-tools/grpc b/buck-tools/grpc
deleted file mode 100755
index 9a8fa27..0000000
--- a/buck-tools/grpc
+++ /dev/null
@@ -1,27 +0,0 @@
-#!/bin/bash -e
-# -----------------------------------------------------------------------------
-# Generates the gRPC java artifacts from protobuf models.
-# -----------------------------------------------------------------------------
-out=$1
-shift
-proto_paths=$1
-shift
-protoc=$1
-shift
-plugin=$1
-shift
-
-#set -x
-
-dir=$(dirname $out)
-mkdir -p $dir
-
-$protoc \
-    --plugin=protoc-gen-grpc-java=$plugin \
-    --grpc-java_out=$dir \
-    --java_out=$dir \
-    $proto_paths \
-    $*
-
-cd $dir
-jar -cf $out *
diff --git a/buck-tools/java_sources.defs b/buck-tools/java_sources.defs
deleted file mode 100644
index 0b3974e..0000000
--- a/buck-tools/java_sources.defs
+++ /dev/null
@@ -1,10 +0,0 @@
-def java_sources(
-    name,
-    srcs,
-    visibility = []
-  ):
-  java_library(
-    name = name,
-    resources = srcs,
-    visibility = visibility,
-  )
diff --git a/buck-tools/onos_app.py b/buck-tools/onos_app.py
deleted file mode 100755
index bbb053c..0000000
--- a/buck-tools/onos_app.py
+++ /dev/null
@@ -1,219 +0,0 @@
-#!/usr/bin/env python
-#FIXME Add license
-
-##### Templates for features.xml
-FEATURES_HEADER = '''\
-<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
-<features xmlns="http://karaf.apache.org/xmlns/features/v1.2.0"
-          name="%(feature_repo_name)s">
-'''
-FEATURE_HEADER= '''\
-    <feature name="%(feature_name)s" version="%(version)s"
-             description="%(title)s">
-'''
-EXISTING_FEATURE = '        <feature>%s</feature>\n'
-BUNDLE = '        <bundle>%s</bundle>\n'
-FEATURE_FOOTER = '    </feature>\n'
-FEATURES_FOOTER = '</features>'
-
-##### Templates for app.xml
-APP_HEADER = '''\
-<?xml version="1.0" encoding="UTF-8"?>
-<app name="%(app_name)s" origin="%(origin)s" version="%(version)s"
-        title="%(title)s" category="%(category)s" url="%(url)s"
-        featuresRepo="%(feature_repo_name)s"
-        features="%(feature_name)s" apps="%(apps)s">
-    <description>%(description)s</description>
-'''
-ARTIFACT = '    <artifact>%s</artifact>\n'
-SECURITY = '''\
-    <security>
-%s
-    </security>\n'''
-APP_FOOTER = '</app>'
-
-NON_OSGI_TAG = 'NON-OSGI'
-
-def mvnUrl(bundle):
-    #mvn-uri := 'mvn:' [ repository-url '!' ] group-id '/' artifact-id [ '/' [version] [ '/' [type] [ '/' classifier ] ] ] ]
-    parts = bundle.split(':')
-    prefix = 'mvn:'
-    suffix = ''
-    if len(parts) > 3:
-        parts.insert(2, parts.pop()) # move version to the 3rd position
-    if len(parts) >= 5:
-        # check classifier for special non-OSGi tag
-        i = parts[4].find(NON_OSGI_TAG)
-        if i == 0:
-            prefix = 'wrap:' + prefix
-            suffix = '$Bundle-SymbolicName=%s.%s&amp;Bundle-Version=%s' % tuple(parts[0:3])
-            if len(parts[4]) == len(NON_OSGI_TAG):
-                parts.pop() # pop off empty classifier
-                if parts[3].lower() == 'jar':
-                    parts.pop() # pop off default extension: jar
-            else:
-                parts[4] = parts[4][len(NON_OSGI_TAG):]
-    return prefix + '/'.join(parts) + suffix
-
-def generateFeatureFile(feature_repo_name,
-                        features = [],
-                        **kwargs):
-    values = {
-        'feature_repo_name' : '-'.join(feature_repo_name.split(':')[1:3]),
-    }
-
-    output = FEATURES_HEADER % values
-
-    for feature in features:
-        output += feature
-
-    output += FEATURES_FOOTER
-    return output
-
-def generateFeature(feature_name,
-                    version,
-                    title,
-                    features = [],
-                    bundles = [],
-                    **kwargs):
-    values = {
-        'feature_name' : feature_name,
-        'version' : version,
-        'title' : title,
-    }
-
-    output = FEATURE_HEADER % values
-
-    if features:
-        for feature in features:
-            output += EXISTING_FEATURE % feature
-
-    if bundles:
-        for bundle in bundles:
-            output += BUNDLE % mvnUrl(bundle)
-
-    output += FEATURE_FOOTER
-    return output
-
-
-def generateAppFile(app_name,
-                    origin,
-                    version,
-                    title,
-                    category,
-                    url,
-                    feature_repo_name,
-                    feature_name,
-                    description = None,
-                    apps = [],
-                    artifacts = [],
-                    security= None,
-                    **kwargs):
-    values = {
-        'app_name' : app_name,
-        'origin' : origin,
-        'version' : version,
-        'title' : title,
-        'category' : category,
-        'url' : url,
-        'feature_repo_name' : mvnUrl(feature_repo_name) + '/xml/features',
-        'feature_name' : feature_name,
-    }
-
-    values['description'] = description if description else title
-    values['apps'] = ','.join(apps) if apps else ''
-
-    output = APP_HEADER % values
-
-    for artifact in artifacts:
-        output += ARTIFACT % mvnUrl(artifact)
-
-    if security is not None:
-        output += SECURITY % security
-
-    output += APP_FOOTER
-    return output
-
-
-if __name__ == '__main__':
-    import sys, optparse
-
-    parser = optparse.OptionParser()
-    parser.add_option("-n", "--name",     dest="feature_coords", help="Feature MVN Coords")
-    parser.add_option("-a", "--app",      dest="app_name",     help="App Name")
-    parser.add_option("-o", "--origin",   dest="origin",       help="Origin")
-    parser.add_option("-c", "--category", dest="category",     help="Category")
-    parser.add_option("-u", "--url",      dest="url",          help="URL")
-    parser.add_option("-v", "--version",  dest="version",      help="Version")
-    parser.add_option("-t", "--title",    dest="title",        help="Title")
-    parser.add_option("-r", "--repo",     dest="repo_name",    help="Repo Name")
-    parser.add_option('-D', '--desc',     dest='desc',         help='Application description')
-    parser.add_option('-s', '--security', dest='security',     help='Application security')
-
-    parser.add_option('-b', '--bundle',
-                      action="append", dest='included_bundles',
-                      metavar="BUNDLE", help='Included Bundle (multiple allowed)')
-    parser.add_option('-e', '--excluded-bundle',
-                      action="append", dest='excluded_bundles',
-                      metavar="BUNDLE", help='Excluded Bundle (multiple allowed)')
-    parser.add_option('-f', '--feature',
-                      action="append", dest='features',
-                      metavar="FEATURE", help='Existing Feature (multiple allowed)')
-    parser.add_option('-d', '--apps',
-                      action="append", dest='apps',
-                      metavar="FEATURE", help='Required App (multiple allowed)')
-
-    parser.add_option("-A", "--write-app", dest="write_app", action="store_true")
-    parser.add_option("-F", "--write-features", dest="write_features", action="store_true")
-    parser.add_option("-E", "--write-feature", dest="write_feature", action="store_true")
-
-    (options, args) = parser.parse_args()
-
-    values = {}
-    if options.feature_coords and options.version and options.title:
-        parts = options.feature_coords.split(':')
-        values['feature_name'] = parts[1] if len(parts) > 1 else parts[0]
-        values['version'] = options.version
-        values['title'] = options.title
-    else:
-        sys.stderr.write('ERROR: Feature Name, Version, and Title are required\n')
-        sys.stderr.flush()
-        sys.exit(1)
-
-    if options.app_name and options.origin and options.category and options.url:
-        values['app_name'] = options.app_name
-        values['origin'] = options.origin
-        values['category'] = options.category
-        values['url'] = options.url
-    elif options.write_app:
-        sys.stderr.write('ERROR: Feature Name, Version, and Title are required\n')
-        sys.stderr.flush()
-        sys.exit(1)
-
-    values['feature_repo_name'] = options.repo_name if options.repo_name \
-                                    else options.feature_coords
-
-    bundles = []
-    if options.included_bundles:
-        bundles += options.included_bundles
-    if options.excluded_bundles:
-        bundles += options.excluded_bundles
-    if options.desc:
-        values['description'] = options.desc
-
-    feature = generateFeature(bundles=bundles,
-                              features=options.features,
-                              **values)
-
-    if options.write_feature:
-        print feature
-
-    if options.write_features:
-        print generateFeatureFile(features=[ feature ],
-                                  **values)
-
-    if options.write_app:
-        print generateAppFile(artifacts=options.included_bundles,
-                              apps=options.apps,
-                              security=options.security,
-                              **values)
\ No newline at end of file
diff --git a/buck-tools/onos_feature.py b/buck-tools/onos_feature.py
deleted file mode 100755
index 731ce71..0000000
--- a/buck-tools/onos_feature.py
+++ /dev/null
@@ -1,42 +0,0 @@
-#!/usr/bin/env python
-#FIXME Add license
-
-from zipfile import ZipFile
-
-def generateOar(output, files=[]):
-    # Note this is not a compressed zip
-    with ZipFile(output, 'w') as zip:
-        for file, mvnCoords in files:
-            filename = file.split('/')[-1]
-            if mvnCoords == 'NONE':
-                dest = filename
-            else:
-                parts = mvnCoords.split(':')
-                if len(parts) > 3:
-                    parts.insert(2, parts.pop()) # move version to the 3rd position
-                groupId, artifactId, version = parts[0:3]
-                groupId = groupId.replace('.', '/')
-                extension = filename.split('.')[-1]
-                if extension == 'jar':
-                    filename = '%s-%s.jar' % ( artifactId, version )
-                elif 'features.xml' in filename:
-                    filename = '%s-%s-features.xml' % ( artifactId, version )
-                dest = '%s/%s/%s/%s' % ( groupId, artifactId, version, filename )
-            zip.write(file, dest)
-
-if __name__ == '__main__':
-    import sys
-
-    if len(sys.argv) < 2:
-        print 'USAGE'
-        sys.exit(1)
-
-    output = sys.argv[1]
-    args = sys.argv[2:]
-
-    if len(args) % 2 != 0:
-        print 'There must be an even number of args: file mvn_coords'
-        sys.exit(2)
-
-    files = zip(*[iter(args)]*2)
-    generateOar(output, files)
diff --git a/buck-tools/onos_oar.py b/buck-tools/onos_oar.py
deleted file mode 100755
index 30f70f5..0000000
--- a/buck-tools/onos_oar.py
+++ /dev/null
@@ -1,42 +0,0 @@
-#!/usr/bin/env python
-#FIXME Add license
-
-from zipfile import ZipFile
-
-def generateOar(output, files=[]):
-    # Note this is not a compressed zip
-    with ZipFile(output, 'w') as zip:
-        for file, mvnCoords in files:
-            filename = file.split('/')[-1]
-            if mvnCoords == 'NONE':
-                dest = filename
-            else:
-                parts = mvnCoords.split(':')
-                if len(parts) > 3:
-                    parts.insert(2, parts.pop()) # move version to the 3rd position
-                groupId, artifactId, version = parts[0:3]
-                groupId = groupId.replace('.', '/')
-                extension = filename.split('.')[-1]
-                if extension == 'jar':
-                    filename = '%s-%s.jar' % ( artifactId, version )
-                elif 'features.xml' in filename:
-                    filename = '%s-%s-features.xml' % ( artifactId, version )
-                dest = 'm2/%s/%s/%s/%s' % ( groupId, artifactId, version, filename )
-            zip.write(file, dest)
-
-if __name__ == '__main__':
-    import sys
-
-    if len(sys.argv) < 2:
-        print 'USAGE'
-        sys.exit(1)
-
-    output = sys.argv[1]
-    args = sys.argv[2:]
-
-    if len(args) % 2 != 0:
-        print 'There must be an even number of args: file mvn_coords'
-        sys.exit(2)
-
-    files = zip(*[iter(args)]*2)
-    generateOar(output, files)
diff --git a/buck-tools/onos_stage.py b/buck-tools/onos_stage.py
deleted file mode 100755
index 8991dfa..0000000
--- a/buck-tools/onos_stage.py
+++ /dev/null
@@ -1,94 +0,0 @@
-#!/usr/bin/env python
-#FIXME Add license
-
-import re
-import os
-from zipfile import ZipFile
-from tarfile import TarFile, TarInfo
-import tarfile
-import time
-from cStringIO import StringIO
-import subprocess
-
-
-written_files = set()
-now = time.time()
-
-def addFile(tar, dest, file, file_size):
-    if dest not in written_files:
-        info = TarInfo(dest)
-        info.size = file_size
-        info.mtime = now
-        info.mode = 0777
-        tar.addfile(info, fileobj=file)
-        written_files.add(dest)
-
-def addString(tar, dest, string):
-    if dest not in written_files:
-        print dest, string
-        info = TarInfo(dest)
-        info.size = len(string)
-        info.mtime = now
-        info.mode = 0777
-        file = StringIO(string)
-        tar.addfile(info, fileobj=file)
-        file.close()
-        written_files.add(dest)
-
-def getHash():
-    p = subprocess.Popen('git rev-parse --verify HEAD --short', stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True)
-    (output, err) = p.communicate()
-    return output if p.wait() == 0 else '0000000000'
-
-def stageOnos(output, version, files=[]):
-    base = 'onos-%s/' % version
-
-    runtimeVersion = version
-    if version.endswith('-SNAPSHOT'):
-        runtimeVersion = version.replace('-SNAPSHOT', '.%s' % getHash())
-
-    # Note this is not a compressed zip
-    with tarfile.open(output, 'w:gz') as output:
-        for file in files:
-            if '.zip' in file:
-                with ZipFile(file, 'r') as zip_part:
-                    for f in zip_part.infolist():
-                        dest = f.filename
-                        if base not in dest:
-                            dest = base + 'apache-karaf-3.0.8/system/' + f.filename
-                        addFile(output, dest, zip_part.open(f), f.file_size)
-            elif '.oar' in file:
-                with ZipFile(file, 'r') as oar:
-                    app_xml = oar.open('app.xml').read()
-                    app_name = re.search('name="([^"]+)"', app_xml).group(1)
-                    dest = base + 'apps/%(name)s/%(name)s.oar' % { 'name': app_name}
-                    addFile(output, dest, open(file), os.stat(file).st_size)
-                    dest = base + 'apps/%s/app.xml' % app_name
-                    addString(output, dest, app_xml)
-                    for f in oar.infolist():
-                        filename = f.filename
-                        if 'm2' in filename:
-                            dest = base + 'apache-karaf-3.0.8/system/' + filename[3:]
-                            if dest not in written_files:
-                                addFile(output, dest, oar.open(f), f.file_size)
-                                written_files.add(dest)
-            elif 'features.xml' in file:
-                dest = base + 'apache-karaf-3.0.8/system/org/onosproject/onos-features/%s/' % version
-                dest += 'onos-features-%s-features.xml' % version
-                with open(file) as f:
-                    addFile(output, dest, f, os.stat(file).st_size)
-        addString(output, base + 'apps/org.onosproject.drivers/active', '')
-        addString(output, base + 'VERSION', runtimeVersion)
-
-if __name__ == '__main__':
-    import sys
-
-    if len(sys.argv) < 3:
-        print 'USAGE' #FIXME
-        sys.exit(1)
-
-    output = sys.argv[1]
-    version = sys.argv[2]
-    args = sys.argv[3:]
-
-    stageOnos(output, version, args)
diff --git a/buck-tools/yang-registrator b/buck-tools/yang-registrator
deleted file mode 100755
index 56dc54a..0000000
--- a/buck-tools/yang-registrator
+++ /dev/null
@@ -1,32 +0,0 @@
-#!/bin/bash
-# -----------------------------------------------------------------------------
-# Generates YANG Model registrator component.
-# -----------------------------------------------------------------------------
-
-output=$1
-package=$2
-shift 2
-
-aux=/tmp/yr-$$
-
-trap "rm -fr $aux" EXIT
-
-pkgDir=$aux/${package//./\/}
-rm -fr $aux $output
-mkdir -p $pkgDir
-cd $aux
-
-cat <<EOF >$output
-// Auto-generated code
-package $package;
-
-import org.onosproject.yang.AbstractYangModelRegistrator;
-import org.apache.felix.scr.annotations.Component;
-
-@Component(immediate = true)
-public class YangModelRegistrator extends AbstractYangModelRegistrator {
-    public YangModelRegistrator() {
-        super(YangModelRegistrator.class);
-    }
-}
-EOF
diff --git a/buck-tools/yang-schema b/buck-tools/yang-schema
deleted file mode 100755
index bcb6e1b..0000000
--- a/buck-tools/yang-schema
+++ /dev/null
@@ -1,17 +0,0 @@
-#!/bin/bash
-# -----------------------------------------------------------------------------
-# Extracts YANG model schema and YANG sources from a YANG model jar.
-# -----------------------------------------------------------------------------
-
-output=$1
-jar=$2
-
-aux=/tmp/ys-$$
-trap "rm -fr $aux" EXIT
-
-rm -fr $aux
-mkdir -p $aux $output
-
-cd $aux
-jar xf $jar
-mv yang/* $output
\ No newline at end of file
diff --git a/bucklets/grpc.bucklet b/bucklets/grpc.bucklet
deleted file mode 100644
index 53ab5ef..0000000
--- a/bucklets/grpc.bucklet
+++ /dev/null
@@ -1,134 +0,0 @@
-include_defs('//onos.defs')
-include_defs('//bucklets/onos.bucklet')
-
-
-DEFAULT_PROTOC_VERSION = '3.2.0'
-DEFAULT_GRPC_PLUGIN_VERSION = '1.3.1'
-
-PROTOC_RELEASE_BASE_URL = "https://github.com/google/protobuf/releases/download"
-GRPC_PLUGIN_BASE_URL = "https://repo1.maven.org/maven2/io/grpc/protoc-gen-grpc-java"
-
-PROTOC_SHA1S = {
-    "protoc-3.0.2-linux-x86_64.zip":"779ed606f524eb2c8c116b0fce7a3bc6507769e7",
-    "protoc-3.0.2-osx-x86_64.zip":"f71d97affca4ffe32747772539c0bcbf76c9dc9b",
-    "protoc-3.2.0-linux-x86_64.zip":"f418d246d183a534d9bd749e614f639a55f6829b",
-    "protoc-3.2.0-osx-x86_64.zip":"81f4fac3200ba2cb12a98df0a9ee4d1c584e9210",
-}
-
-GRPC_JAVA_SHA1S = {
-    "protoc-gen-grpc-java-1.3.1-linux-x86_64.exe":"9598b00ad0f41a6bd6aeb01f647903dbc62792cc",
-    "protoc-gen-grpc-java-1.3.1-osx-x86_64.exe":"f4eccb96524b8b9f152024890550d9b88398b8cd"
-}
-
-#Returns the string for the OS and architecture of the system of the form 'OS-ARCH'
-def get_system_arch():
-    import platform
-    os = platform.system().lower()
-    arch = platform.machine()
-    if os == "darwin":
-        os = "osx"
-    return "%s-%s" % ( os, arch)
-
-def fetch_protoc(
-        version
-    ):
-    file_name = "protoc-%s-%s.zip" % (version, get_system_arch())
-    if file_name not in PROTOC_SHA1S:
-        raise Exception('Cannot download %s, architecture or version not supported' % file_name)
-    remote_file(
-        name = 'protoc-release-' + version,
-        url = PROTOC_RELEASE_BASE_URL + '/v' + version + '/' + file_name,
-        sha1 = PROTOC_SHA1S[file_name],
-    )
-    genrule(
-        name = 'protoc-exe-' + version,
-        bash = 'jar xf $(location :protoc-release-' + version + ') bin/protoc && ' +
-                'mv bin/protoc $OUT && ' +
-                'chmod +x $OUT',
-        out = 'protoc.exe',
-        executable = True,
-        visibility = [ "PUBLIC" ],
-    )
-    genrule(
-        name = 'protoc-lib-' + version,
-        bash = 'jar xf $(location :protoc-release-' + version + ') include && mv include $OUT',
-        out = 'include',
-        visibility = [ "PUBLIC" ],
-    )
-
-def fetch_grpc_plugin(
-        version
-):
-    file_name = "protoc-gen-grpc-java-%s-%s.exe" % (version, get_system_arch())
-    if file_name not in GRPC_JAVA_SHA1S:
-        raise Exception('Cannot download %s, architecture or version not supported' % file_name)
-    remote_file(
-        name = 'grpc-plugin-binary-' + version,
-        url = GRPC_PLUGIN_BASE_URL + '/' + version + '/' + file_name,
-        sha1 = GRPC_JAVA_SHA1S[file_name],
-    )
-    genrule(
-        name = 'grpc-plugin-exe-' + version,
-        bash = 'cp $(location :grpc-plugin-binary-' + version + ') $OUT && chmod +x $OUT',
-        executable = True,
-        visibility = [ "PUBLIC" ],
-        out = 'grpc-plugin.exe',
-    )
-
-def _get_name():
-    base_path = get_base_path()
-    return ONOS_ARTIFACT_BASE + base_path.replace('/', '-') #TODO Unix-separator
-
-def grpc_jar(
-    name = None,
-    deps = [],
-    #NOTE: if targeting a directory also built with maven this path MUST end in
-    # /proto because maven plugin interprets imports relative to the proto
-    # directory and BUCK interprets imports relative to the last directory
-    # listed in the first listed proto_path which contains the specified
-    # file
-    proto_paths = [],
-    srcs = [],
-    src_string = '', # Useful to build proto files external to the ONOS sources, using BUCK's environment variables.
-    proto_match_patterns = [ "src/main/proto/**/*.proto" ],
-    protoc_version = DEFAULT_PROTOC_VERSION,
-    plugin_version = DEFAULT_GRPC_PLUGIN_VERSION,
-    include_std_lib = False,
-    **kwargs
-    ):
-
-    #Get the correct name for the protoc compilation call
-    if name is None:
-        name = _get_name()
-
-    # Create the string for the proto_path arguments (order matters, similar to classpath)
-
-    if include_std_lib:
-        # Add protoc standard lib to the includes
-        proto_paths = ['$(location //incubator/protobuf-dependencies:protoc-lib-' + protoc_version + ')'] + proto_paths
-
-    if len(proto_paths) != 0:
-        proto_paths_string = "-I=" + reduce(lambda a,b:  a +" -I=" + b, proto_paths)
-    else:
-        proto_paths_string = ""
-    protoc = name + '-protoc'
-
-    genrule(
-        name = protoc,
-        srcs = glob(proto_match_patterns),
-        out = 'grpc.src.zip',
-        cmd = '$(location //buck-tools:grpc) $OUT '
-              + '\"' + proto_paths_string + '\" '
-              + '$(location //incubator/protobuf-dependencies:protoc-exe-'+ protoc_version + ') '
-              + '$(location //incubator/grpc-dependencies:grpc-plugin-exe-' + plugin_version + ') '
-              + '$SRCS' + src_string,
-    )
-
-    osgi_jar(
-        name = name,
-        srcs = [ ':' + protoc ],
-        deps = deps + [ ':' + protoc ],
-        do_javadocs = False,
-        do_checkstyle = False,
-        **kwargs
-    )
diff --git a/bucklets/jaxb2.bucklet b/bucklets/jaxb2.bucklet
deleted file mode 100644
index f3bb9fb..0000000
--- a/bucklets/jaxb2.bucklet
+++ /dev/null
@@ -1,64 +0,0 @@
-#
-# Copyright 2017-present Open Networking Foundation
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-#
-# Bucklet to create Java Code from XSD using the 'xjc' tool from the JAXB API v2.
-# The genrule() creates the Java code, zips it and puts it in the output of jaxb2-xjc
-# The osgi_jar_with_tests() takes the sources in this ZIP and adds them to what ever
-# sources were used in the call to this method, and compiles all of them and adds
-# them to a JAR file in the output folder
-
-include_defs('//onos.defs')
-include_defs('//bucklets/onos.bucklet')
-
-def _get_name():
-    base_path = get_base_path()
-    return ONOS_ARTIFACT_BASE + base_path.replace('/', '-') #TODO Unix-separator
-
-def jaxb2_xjc_osgi_jar(
-    name,
-    srcs,
-    xsd,
-    bindinfo=None,
-    destdir='.',
-    deps=[],
-    test_deps=[],
-    visibility = [],
-    **kwargs
-    ):
-    if name is None:
-          name = _get_name()
-
-    cmd = 'xjc '+xsd
-    if bindinfo is not None:
-        cmd=cmd+' -b '+bindinfo
-        cmd=cmd+' -d '+destdir
-
-    genrule(
-        name = 'jaxb2-xjc',
-        srcs = glob(['src/main/resources/*.xsd','src/main/resources/*.xjb']),
-        bash = cmd + ' && zip $OUT -r *',
-        out = name+'.src.zip',
-        visibility = [ ],
-    )
-
-    osgi_jar_with_tests (
-        deps = [":jaxb2-xjc"] + deps,
-        srcs = [':jaxb2-xjc'] + srcs,
-        test_deps = test_deps,
-        do_javadocs = False,
-        do_checkstyle = False,
-        **kwargs
-    )
-
diff --git a/bucklets/maven_jar.bucklet b/bucklets/maven_jar.bucklet
deleted file mode 100644
index 35af13d..0000000
--- a/bucklets/maven_jar.bucklet
+++ /dev/null
@@ -1,202 +0,0 @@
-# Copyright (C) 2013 The Android Open Source Project
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-GERRIT = 'GERRIT:'
-GERRIT_API = 'GERRIT_API:'
-MAVEN_CENTRAL = 'MAVEN_CENTRAL:'
-MAVEN_LOCAL = 'MAVEN_LOCAL:'
-
-def define_license(name):
-  n = 'LICENSE-' + name
-  genrule(
-    name = n,
-    cmd = 'ln -s $SRCS $OUT',
-    srcs = [n],
-    out = n,
-    visibility = ['PUBLIC'],
-  )
-
-def maven_jar(
-    name,
-    id,
-    license,
-    exclude = [],
-    exclude_java_sources = False,
-    unsign = False,
-    deps = [],
-    exported_deps = [],
-    sha1 = '', bin_sha1 = '', src_sha1 = '',
-    repository = MAVEN_CENTRAL,
-    attach_source = True,
-    visibility = ['PUBLIC'],
-    local_license = False,
-    full_url = ''):
-
-  if not full_url:
-    groupId, artifactId, version = id.split(':')
-
-    prebuilt_jar(
-            name = name,
-            binary_jar = ':%s-jar' % name,
-            maven_coords = id,
-            visibility = [ 'PUBLIC' ]
-    )
-
-    remote_file(
-            name = name + '-jar',
-            out = '%s-%s.jar' % (artifactId, version),
-            url = 'mvn:%s:%s:%s:%s' % (groupId, artifactId, 'jar', version),
-            sha1 = sha1
-    )
-    return
-
-  from os import path
-
-  parts = id.split(':')
-  if len(parts) not in [3, 4]:
-    raise NameError('%s:\nexpected id="groupId:artifactId:version[:classifier]"'
-                    % id)
-  if len(parts) == 4:
-    group, artifact, version, classifier = parts
-  else:
-    group, artifact, version = parts
-    classifier = None
-
-  # SNAPSHOT artifacts are handled differently on Google storage bucket:
-  # 'SNAPSHOT' is discarded from the directory name. However on other
-  # Maven repositories, most notable local repository located in
-  # ~/.m2/repository (and is supported through MAVEN_LOCAL repository)
-  # it must be preserved, otherwise the artifact wouldn't be found.
-  # Atm the SNAPSHOT part is only discarded for Google storage bucket.
-  if 'SNAPSHOT' in version and repository.startswith(GERRIT):
-    file_version = version.replace('-SNAPSHOT', '')
-    version = version.split('-SNAPSHOT')[0] + '-SNAPSHOT'
-  else:
-    file_version = version
-
-  if classifier is not None:
-    file_version += '-' + classifier
-
-  jar = path.join(name, artifact.lower() + '-' + file_version)
-
-  url = '/'.join([
-    repository,
-    group.replace('.', '/'), artifact, version,
-    artifact + '-' + file_version])
-
-  if full_url != '':
-    url = full_url
-
-  binjar = jar + '.jar'
-  binurl = url + '.jar'
-
-  srcjar = jar + '-src.jar'
-  srcurl = url + '-sources.jar'
-
-  cmd = ['$(exe //buck-tools:download_file)', '-o', '$OUT', '-u', binurl]
-  if sha1:
-    cmd.extend(['-v', sha1])
-  elif bin_sha1:
-    cmd.extend(['-v', bin_sha1])
-  for x in exclude:
-    cmd.extend(['-x', x])
-  if exclude_java_sources:
-    cmd.append('--exclude_java_sources')
-  if unsign:
-    cmd.append('--unsign')
-
-  genrule(
-    name = '%s__download_bin' % name,
-    cmd = ' '.join(cmd),
-    out = binjar,
-  )
-  license = ':LICENSE-' + license
-  if not local_license:
-    license = '//lib' + license
-  license = [license]
-
-  if src_sha1 or attach_source:
-    cmd = ['$(exe //buck-tools:download_file)', '-o', '$OUT', '-u', srcurl]
-    if src_sha1:
-      cmd.extend(['-v', src_sha1])
-    genrule(
-      name = '%s__download_src' % name,
-      cmd = ' '.join(cmd),
-      out = srcjar,
-    )
-    prebuilt_jar(
-      name = '%s_src' % name,
-      binary_jar = ':%s__download_src' % name,
-      maven_coords = id,
-      deps = license,
-      visibility = visibility,
-    )
-  else:
-    srcjar = None
-    genrule(
-      name = '%s_src' % name,
-      cmd = ':>$OUT',
-      out = '__%s__no_src' % name,
-    )
-
-  if exported_deps:
-    prebuilt_jar(
-      name = '%s__jar' % name,
-      deps = deps + license,
-      binary_jar = ':%s__download_bin' % name,
-      source_jar = ':%s__download_src' % name if srcjar else None,
-      maven_coords = id,
-    )
-    java_library(
-      name = name,
-      exported_deps = exported_deps + [':' + name + '__jar'],
-      visibility = visibility,
-    )
-  else:
-    prebuilt_jar(
-      name = name,
-      deps = deps + license,
-      binary_jar = ':%s__download_bin' % name,
-      source_jar = ':%s__download_src' % name if srcjar else None,
-      visibility = visibility,
-      maven_coords = id,
-    )
-
-
-def merge_maven_jars(
-    name,
-    srcs,
-    visibility = []):
-
-  def cmd(jars):
-    return ('$(location //buck-tools:merge_jars) $OUT '
-            + ' '.join(['$(location %s)' % j for j in jars]))
-
-  genrule(
-    name = '%s__merged_bin' % name,
-    cmd = cmd(['%s__download_bin' % s for s in srcs]),
-    out = '%s__merged.jar' % name,
-  )
-  genrule(
-    name = '%s__merged_src' % name,
-    cmd = cmd(['%s__download_src' % s for s in srcs]),
-    # buck-tools/eclipse/project.py requires -src.jar suffix.
-    out = '%s__merged-src.jar' % name,
-  )
-  prebuilt_jar(
-    name = name,
-    binary_jar = ':%s__merged_bin' % name,
-    source_jar = ':%s__merged_src' % name,
-    visibility = visibility,
-  )
diff --git a/bucklets/node.bucklet b/bucklets/node.bucklet
deleted file mode 100644
index 15dfeb2..0000000
--- a/bucklets/node.bucklet
+++ /dev/null
@@ -1,35 +0,0 @@
-NODE_RELEASE_BASE_URL = "https://nodejs.org/dist/"
-
-NODE_SHA1S = {
-    "node-v8.1.2-linux-x64.tar.gz":"61a609c83e2d3458cc2301a63b212a97e6b9f809",
-    "node-v8.1.2-darwin-x64.tar.gz":"a8b31fd645480661a8a777d9b4466dca0e6deb33",
-    "node-v8.11.1-linux-x64.tar.gz":"ee0213f62185c36121c2daf8dcacd34ade90b10c",
-    "node-v8.11.1-darwin-x64.tar.gz":"01effb57fa711aa258d7aab26c6615e1f8a64b1a"
-}
-
-def get_system_arch():
-    import platform
-    os = platform.system().lower()
-    return os
-
-def fetch_node(version):
-    file_name = "node-%s-%s-x64" % (version, get_system_arch())
-    file_fullname = "node-%s-%s-x64.tar.gz" % (version, get_system_arch())
-    if file_fullname not in NODE_SHA1S:
-        raise Exception("Cannot download %s, architecture or version not supported" % file_name)
-
-    remote_file(
-        name = 'node-release-' + version,
-        url = NODE_RELEASE_BASE_URL + version + '/' + file_fullname,
-        sha1 = NODE_SHA1S[file_fullname],
-    )
-
-    genrule(
-        name = 'node-bin-' + version,
-        bash = 'tar --no-same-owner -xf $(location :node-release-' + version + ') && ' +
-               'mv ' + file_name + ' $OUT && ' +
-               'chmod +x $OUT',
-        out = 'node-binaries',
-        executable = False,
-        visibility = [ "PUBLIC" ],
-    )
diff --git a/bucklets/onos.bucklet b/bucklets/onos.bucklet
deleted file mode 100644
index f711d6f..0000000
--- a/bucklets/onos.bucklet
+++ /dev/null
@@ -1,390 +0,0 @@
-import random
-
-DEBUG_ARG='JAVA_TOOL_OPTIONS="-Xdebug -Xrunjdwp:server=y,transport=dt_socket,address=5005,suspend=y"'
-FORCE_INSTALL=True
-NONE='NONE'
-
-SRC = 'src/main/java/**/'
-TEST = 'src/test/java/**/'
-RESOURCES_ROOT = 'src/main/resources/'
-TEST_RESOURCES_ROOT = 'src/test/resources/'
-
-include_defs('//onos.defs')
-
-def _get_name():
-    base_path = get_base_path()
-    return ONOS_ARTIFACT_BASE + base_path.replace('/', '-') #TODO Unix-separator
-
-def checkstyle(
-    name,
-    srcs = None,
-    jar_target = None,
-    ):
-
-    if srcs:
-        base = get_base_path()
-        # module name; base filepath; files (line-separated); empty line (to signify end of stream)
-        files = '%s\n%s\n' % (name, base) + '\n'.join(['%s/%s' % (base, s) for s in srcs]) + '\n\n'
-
-        genrule(
-                name = name + '-checkstyle-files',
-                bash = "echo '%s' > $OUT" % files,
-                srcs = srcs,
-                out = 'checkstyle-files.txt',
-        )
-
-        sh_test(
-                name = name + '-checkstyle',
-                test = '//tools/build/conf:start-buck-daemon',
-                deps = [ ':' + name + '-checkstyle-files',
-                         '//tools/build/conf:onos-java-header',
-                         '//tools/build/conf:onos-build-conf', ],
-                args = [
-                    '$(location //tools/build/conf:buck-daemon-jar)',
-                    'checkstyle',
-                    '$(location :' + name + '-checkstyle-files)',
-                    '$(location //tools/build/conf:checkstyle-xml)',
-                    '$(location //tools/build/conf:suppressions-xml)',
-                    ],
-                #TODO test_rule_timeout_ms seems to be ignored on Linux
-                test_rule_timeout_ms = 45000,
-                labels = [ 'checkstyle' ],
-        )
-
-def java_doc(
-    name,
-    title,
-    pkgs,
-    paths,
-    srcs = [],
-    deps = [],
-    visibility = [],
-    do_it_wrong = False,
-  ):
-  if do_it_wrong:
-    sourcepath = paths
-  else:
-    sourcepath = ['$SRCDIR/' + n for n in paths]
-
-  if len(srcs) != 0:
-    cmd = ' '.join([
-        'while ! test -f .buckconfig; do cd ..; done;',
-        'javadoc',
-        '-tag onos.rsModel:a:"onos model"',
-        '-quiet',
-        '-protected',
-        '-encoding UTF-8',
-        '-charset UTF-8',
-        '-notimestamp',
-        '-windowtitle "' + title + '"',
-        '-link http://docs.oracle.com/javase/8/docs/api',
-        '-subpackages ',
-        ':'.join(pkgs),
-        '-sourcepath ',
-        ':'.join(sourcepath),
-        ' -classpath ',
-        ':'.join(['$(classpath %s)' % n for n in deps]),
-        '-d $TMP',
-      ]) + ';jar cf $OUT -C $TMP .'
-
-    genrule(
-      name = name,
-      cmd = cmd,
-      srcs = srcs,
-      out = name + '.jar',
-      visibility = visibility,
-    )
-
-def sonar(
-    name,
-    test = False
-    ):
-
-  cmd = '; '.join([ 'rm -f $OUT',
-          'printf "%(src_base)s = " >> $OUT',
-          '%(srcs)s >> $OUT',
-          'echo "%(binary_base)s = %(classes)s" >> $OUT',
-          'printf "%(lib_base)s = " >> $OUT',
-          '%(libraries)s >> $OUT'
-        ]) % {
-          'srcs' : "echo $(srcs :%s) | sed 's/ /,/g'" % name,
-          'classes' : ("$(bin_dir :%s#non-osgi)" if not test else "$(bin_dir :%s)") % name,
-          'libraries' : "echo $(classpath :%s) | sed 's/:/,/g'" % name,
-          'src_base' : 'sonar.sources' if not test else 'sonar.tests',
-          'binary_base' : 'sonar.java.binaries' if not test else 'sonar.java.test.binaries',
-          'lib_base' : 'sonar.java.libraries' if not test else 'sonar.java.test.libraries'
-        }
-  # FIXME do we need to specify dep here or with the expander cover it?
-  genrule(
-      name = name + "-sonar",
-      cmd = cmd,
-      out = 'sonar-project.properties'
-  )
-
-def osgi_jar(
-    name = None,
-    srcs = None,
-    group_id = ONOS_GROUP_ID,
-    version = ONOS_VERSION,
-    deps = [],
-    visibility = ['PUBLIC'],
-    license = 'NONE',
-    description = '',
-    debug = False,
-    import_packages = '*',
-    dynamicimport_packages = '',
-    embedded_dependencies = '',
-    bundle_classpath = '',
-    export_packages = '!.,!*.impl.*,!*.internal.*,*',
-    package_name_root = 'org.onosproject',
-    include_resources = {},
-    web_context = NONE,
-    api_title = None,
-    api_version = NONE,
-    api_package = NONE,
-    api_description = NONE,
-    resources = NONE,
-    resources_root = None,
-    tests = None,
-    do_javadocs = True,
-    do_checkstyle = True,
-    **kwargs
-    ):
-
-  # if name and _get_name() != name:
-  #     print _get_name(), '!=', name
-  if name is None:
-      name = _get_name()
-
-  if srcs is None:
-      srcs = glob([SRC + '/*.java'])
-
-  if resources == NONE and resources_root is not None:
-      resources = glob([resources_root + '**'])
-  elif resources == NONE:
-      resources = glob([RESOURCES_ROOT + '**'])
-
-  if resources and not resources_root:
-      resources_root = RESOURCES_ROOT
-
-  mvn_coords = group_id + ':' + name + ':' + version
-
-  onos_jar(
-      name = name,
-      # FIXME webapp path hard coded here probably is not right
-      srcs = srcs + glob(['src/main/webapp/**'], excludes = ['src/main/webapp/tests/**']),
-      deps = deps,
-      visibility = visibility,
-      resources = resources,
-      resources_root = resources_root,
-      bundle_name = name,
-      group_id = group_id,
-      bundle_version = version,
-      bundle_license = license,
-      bundle_description = description,
-      import_packages = import_packages,
-      export_packages = export_packages,
-      include_resources = include_resources,
-      dynamicimport_packages = dynamicimport_packages,
-      embedded_dependencies = embedded_dependencies,
-      bundle_classpath = bundle_classpath,
-      web_context = web_context,
-      api_title = api_title,
-      api_version = api_version,
-      api_package = api_package,
-      api_description = api_description,
-      tests = tests,
-      maven_coords = mvn_coords,
-      **kwargs
-  )
-
-  ### Checkstyle
-  if do_checkstyle:
-      checkstyle(
-          name = name,
-          srcs = srcs,
-      )
-
-  if do_javadocs:
-      java_doc(
-           name = name + '-javadoc',
-           title = 'Java Docs',
-           pkgs = [ package_name_root ],
-           paths = [ 'src/main/java' ],
-           srcs = srcs,
-           deps = deps,
-           visibility = visibility,
-           do_it_wrong = False,
-      )
-
-  # TODO add project config for intellij
-  # project_config(
-  #   src_target = ':' + name,
-  #   src_roots = [ 'src/main/java' ],
-  #   test_target = ':' + name + '-tests',
-  #   test_roots = [ 'src/test/java' ],
-  # )
-
-  ### .m2 Install
-  mvn_cmd = ' '.join(( 'mvn install:install-file',
-                       '-Dfile=$(location :%s)' % name,
-                       '-DgroupId=%s' % group_id,
-                       '-DartifactId=%s' % name,
-                       '-Dversion=%s' % version,
-                       '-Dpackaging=jar' ))
-  cmd = mvn_cmd + ' > $OUT'
-  if FORCE_INSTALL:
-    # Add a random number to the command to force this rule to run.
-    # TODO We should make this configurable from CLI, perhaps with a flag.
-    cmd = 'FOO=%s ' % random.random() + cmd
-  genrule(
-    name = name + '-install',
-    bash = cmd,
-    out = 'install.log',
-    visibility = visibility,
-  )
-  sonar(
-    name = name,
-  )
-
-def osgi_jar_with_tests(
-        name = None,
-        deps = [],
-        group_id = ONOS_GROUP_ID,
-        version = ONOS_VERSION,
-        test_srcs = None,
-        test_deps = [ '//lib:TEST' ],
-        test_resources = None,
-        test_resources_root = None,
-        visibility = [ 'PUBLIC' ],
-        **kwargs
-    ):
-
-  if name is None:
-      name = _get_name()
-
-  if test_resources and not test_resources_root:
-      test_resources_root = TEST_RESOURCES_ROOT
-  if test_resources_root and not test_resources:
-      test_resources = glob([test_resources_root + '**'])
-  if not test_resources and not test_resources_root:
-      test_resources = glob([TEST_RESOURCES_ROOT + '**'])
-      if test_resources:
-        test_resources_root = TEST_RESOURCES_ROOT
-
-  if test_srcs is None:
-      test_srcs = glob([TEST + '/*.java'])
-
-  mvn_coords = group_id + ':' + name + ':jar:tests:' + version
-
-  if test_srcs:
-      java_test(
-        name = name + '-tests',
-        srcs = test_srcs,
-        deps = deps +
-               test_deps +
-               [':' + name + '#non-osgi'],
-        resources = test_resources,
-        resources_root = test_resources_root,
-        maven_coords = mvn_coords,
-        visibility = visibility,
-      )
-
-      checkstyle(
-          name = name + '-tests',
-          srcs = test_srcs,
-      )
-
-      sonar(
-          name = name + '-tests',
-          test = True
-      )
-
-      osgi_jar(name = name,
-               deps = deps,
-               group_id = group_id,
-               version = version,
-               visibility = visibility,
-               tests = [':' + name + '-tests'],
-               **kwargs)
-  else:
-      osgi_jar(name = name,
-               deps = deps,
-               group_id = group_id,
-               version = version,
-               visibility = visibility,
-               **kwargs)
-
-def tar_file(
-   name,
-   srcs,
-   other_tars = [],
-   flat = False,
-   root = None,
-   out = None,
-   visibility = [ 'PUBLIC' ],
-   ):
-
-   cmds = [ 'mkdir -p $TMP/%(root_dir)s',
-            'cp -R -L $SRCDIR/* $TMP/%(root_dir)s' ]
-   for t in other_tars:
-       cmds += [ 'tar -zxf $(location %s)' % t + ' -C $TMP/%(root_dir)s' ]
-
-   if flat:
-       cmds += [ 'find $TMP/%(root_dir)s -type f -exec mv {} $TMP/%(root_dir)s \;',
-                 'find $TMP/%(root_dir)s/* -type d -d -exec rmdir {} \;' ]
-
-   cmds += [ 'tar -C $TMP -zcf $OUT %(root_dir)s' ]
-
-   cmd = ' && '.join(cmds) % {
-           'root_dir': root if root is not None else name
-         }
-
-   genrule(
-       name = name,
-       srcs = srcs,
-       bash = cmd,
-       out = out if out is not None else ( root if root is not None else name ) + '.tar.gz',
-       visibility = visibility,
-   )
-
-def only_lib_dep_pom(
-    name,
-    src,
-    out,
-    version = ONOS_VERSION,
-    onosGroupId = ONOS_GROUP_ID,
-    visibility = [ 'PUBLIC' ],
-    ):
-
-    cmd = 'grep -v \<module\> ' + src + ' | sed "s#<modules>#<modules><module>lib</module>#" >$OUT'
-
-    genrule(
-        name = name,
-        srcs = [ src ],
-        bash = cmd,
-        out = out,
-        visibility = visibility,
-        maven_coords = onosGroupId + ':onos:pom:' + version,
-    )
-
-def pass_thru_pom(
-    name,
-    src,
-    out,
-    artifactId,
-    version = ONOS_VERSION,
-    onosGroupId = ONOS_GROUP_ID,
-    visibility = [ 'PUBLIC' ],
-    ):
-
-    cmd = 'cp ' + src + ' $OUT'
-
-    genrule(
-        name = name,
-        srcs = [ src ],
-        bash = cmd,
-        out = out,
-        visibility = visibility,
-        maven_coords = onosGroupId + ':' + artifactId + ':pom:' + version,
-    )
diff --git a/bucklets/onos_app.bucklet b/bucklets/onos_app.bucklet
deleted file mode 100644
index d0a0028..0000000
--- a/bucklets/onos_app.bucklet
+++ /dev/null
@@ -1,221 +0,0 @@
-include_defs('//onos.defs')
-
-DEFAULT_APP_CATEGORY = 'Utility'
-
-import os.path
-
-# FIXME Factor this into common place
-def _get_name():
-    base_path = get_base_path()
-    return ONOS_ARTIFACT_BASE + base_path.replace('/', '-') #TODO Unix-separator
-
-def _get_app_name():
-    base_path = get_base_path()
-    return APP_PREFIX + os.path.basename(base_path)
-
-def osgi_feature(
-        name,
-        title,
-        feature_coords = None,
-        version = ONOS_VERSION,
-        required_features = [ 'onos-api' ],
-        required_apps = [],
-        included_bundles = None,
-        excluded_bundles = [],
-        generate_file = False,
-        visibility = [ 'PUBLIC' ],
-        stage_repo = True,
-        maven_coords = None,
-    ):
-
-    if not feature_coords:
-        feature_coords = name
-    args = [ '-n %s' % feature_coords,
-             '-v %s' % version,
-             '-t "%s"' % title,
-             ]
-    args += [ '-f %s' % f for f in required_features ]
-    args += [ '-b $(maven_coords %s)' % b for b in included_bundles ]
-    args += [ '-e $(maven_coords %s)' % b for b in excluded_bundles ]
-    args += [ '-d %s' % a for a in required_apps ]
-
-    feature_cmd = '-F' if generate_file else '-E'
-
-    cmd = '$(exe //buck-tools:onos-app-writer) %s ' % feature_cmd
-    cmd += ' '.join(args) + ' > $OUT'
-    genrule(
-            name = name + '-feature',
-            bash = cmd,
-            out = 'features.xml',
-            visibility = visibility,
-            maven_coords = maven_coords,
-    )
-
-    if stage_repo:
-        sources = ['$(location %s) $(maven_coords %s)' % (i, i) for i in included_bundles]
-        genrule(
-                name = name + '-repo',
-                out = name + '-repo.zip.part',
-                bash = '$(exe //buck-tools:onos-feature) $OUT ' + ' '.join(sources),
-                visibility = visibility,
-        )
-
-FEATURES_HEADER = '''\
-<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
-<features xmlns="http://karaf.apache.org/xmlns/features/v1.2.0"
-          name="onos-%s">
-    <repository>mvn:org.apache.karaf.features/standard/3.0.8/xml/features</repository>
-
-''' % ONOS_VERSION
-
-FEATURES_FOOTER = '</features>'
-
-def compile_features(
-        name,
-        features = [],
-        maven_coords = None,
-        visibility = [ 'PUBLIC' ],
-    ):
-
-    cmd = "(echo '%s'; " % FEATURES_HEADER
-    cmd += ''.join(['cat $(location %s-feature); ' % s for s in features])
-    cmd += "echo '%s') > $OUT" % FEATURES_FOOTER
-
-    genrule(
-            name = name,
-            bash = cmd,
-            visibility = visibility,
-            out = 'features.xml',
-            maven_coords = maven_coords,
-    )
-
-
-#TODO rename this
-def osgi_feature_group(
-        name,
-        description = 'TEST',
-        version = ONOS_VERSION,
-        exported_deps = [],
-        visibility = ['PUBLIC'],
-        maven_coords = None,
-        **kwargs
-    ):
-    java_library(
-            name = name,
-            exported_deps = exported_deps, #compile only
-            visibility = visibility,
-    )
-
-    osgi_feature(
-            name = name,
-            feature_coords = name,
-            version = version,
-            title = description,
-            required_features = [],
-            included_bundles = exported_deps,
-            generate_file = False,
-            visibility = visibility,
-            maven_coords = maven_coords,
-    )
-
-
-
-def onos_app(
-        app_name = None,
-        name = None,
-        title = None,
-        version = ONOS_VERSION,
-        origin = ONOS_ORIGIN,
-        category = DEFAULT_APP_CATEGORY,
-        url = None,
-        description = None, #TODO make this a file
-        #TODO icon,
-        feature_coords = None,
-        required_features = [ 'onos-api' ],
-        required_apps = [],
-        included_bundles = None,
-        excluded_bundles = [],
-        visibility = [ 'PUBLIC' ],
-        security = None,
-        **kwargs):
-    if name is None:
-        name = _get_name()
-
-    if app_name is None:
-        app_name = _get_app_name()
-
-    maven_coords = '%s:%s:oar:%s' % ( ONOS_GROUP_ID, name, ONOS_VERSION )
-    feature_xml_coords = '%s:%s:xml:features:%s' % ( ONOS_GROUP_ID, name, ONOS_VERSION )
-
-    if title is None:
-        print "Missing title for %s" % _get_name()
-        title = _get_app_name()
-
-    if included_bundles is None:
-        target = ':' + name
-        included_bundles = [ target ]
-
-    if not feature_coords and len(included_bundles) == 1:
-        feature_coords = '$(maven_coords %s)' % included_bundles[0]
-
-    if not feature_coords:
-        feature_coords = '%s:%s:%s' % ( ONOS_GROUP_ID, name, ONOS_VERSION )
-
-    args = [ '-n %s' % feature_coords,
-             '-v %s' % version,
-             '-t "%s"' % title,
-             '-o "%s"' % origin,
-             '-c "%s"' % category,
-             '-a "%s"' % app_name,
-             '-u %s' % url,
-             ]
-    args += [ '-f %s' % f for f in required_features ]
-    args += [ '-b $(maven_coords %s)' % b for b in included_bundles ]
-    args += [ '-e $(maven_coords %s)' % b for b in excluded_bundles ]
-    args += [ '-d %s' % a for a in required_apps ]
-    if description is not None:
-        args += [ '-D "%s"' % description ]
-    if security is not None:
-        args += [ '-s "%s"' % security ]
-
-    # cmd = '$(exe //buck-tools:onos-app-writer) -F ' + ' '.join(args) + ' > $OUT'
-    # genrule(
-    #     name = name + '-feature',
-    #     bash = cmd,
-    #     out = 'features.xml',
-    #     visibility = [],
-    # )
-    osgi_feature(
-        name = name,
-        feature_coords = feature_coords,
-        version = version,
-        title = title,
-        required_features = required_features,
-        included_bundles = included_bundles,
-        excluded_bundles = excluded_bundles,
-        generate_file = True,
-        visibility = [],
-        stage_repo = False,
-        maven_coords = feature_xml_coords,
-    )
-
-    cmd = '$(exe //buck-tools:onos-app-writer) -A ' + ' '.join(args) + ' > $OUT'
-    genrule(
-        name = name + '-app-xml',
-        bash = cmd,
-        out = 'app.xml',
-        visibility = [],
-    )
-
-    sources = [
-        '$(location :%s-feature) %s' % (name, feature_coords),
-        '$(location :%s-app-xml) NONE' % name,
-    ]
-    sources += ['$(location %s) $(maven_coords %s)' % (i, i) for i in included_bundles]
-    genrule(
-        name = name + '-oar',
-        out = 'app.oar',
-        bash = '$(exe //buck-tools:onos-app-oar) $OUT ' + ' '.join(sources),
-        maven_coords = maven_coords,
-        visibility = visibility,
-    )
diff --git a/bucklets/remote_jar.bucklet b/bucklets/remote_jar.bucklet
deleted file mode 100644
index e45045a..0000000
--- a/bucklets/remote_jar.bucklet
+++ /dev/null
@@ -1,23 +0,0 @@
-def remote_jar (
-        name,
-        out,
-        url,
-        sha1,
-        maven_coords = None,
-        visibility = [ 'PUBLIC' ],
-    ):
-
-    prebuilt_jar(
-        name = name,
-        binary_jar = ':' + out,
-        maven_coords = maven_coords,
-        visibility = visibility,
-    )
-
-    remote_file(
-        name = out,
-        out = out,
-        url = url,
-        sha1 = sha1,
-        visibility = []
-    )
diff --git a/bucklets/yang.bucklet b/bucklets/yang.bucklet
deleted file mode 100644
index 8d5d83f..0000000
--- a/bucklets/yang.bucklet
+++ /dev/null
@@ -1,148 +0,0 @@
-include_defs('//onos.defs')
-include_defs('//bucklets/onos.bucklet')
-include_defs('//bucklets/onos_app.bucklet')
-
-def _get_name():
-    base_path = get_base_path()
-    return ONOS_ARTIFACT_BASE + base_path.replace('/', '-') #TODO Unix-separator
-
-YANG_TOOLS = [
-    '//lib:onos-yang-model',
-    '//lib:onos-yang-compiler-api',
-    '//lib:onos-yang-runtime',
-    '//lib:org.apache.felix.scr.annotations',
-    '//apps/yang:onos-apps-yang',
-]
-
-def yang_model(
-    name = None,
-    app_name = None,
-    model_id = None,
-    title = 'YANG Model',
-    url = 'http://onosproject.org',
-    description = None,
-    deps = [],
-    required_apps = [],
-    custom_registrator = False,
-    yang_src = None,
-    custom_src = None,
-    **kwargs
-    ):
-
-    if name is None:
-        name = _get_name()
-
-    if model_id is None:
-        model_id = app_name
-
-    if yang_src is None:
-        yang_src = glob(['src/main/yang/**/*.yang'])
-
-    if custom_src is None:
-        custom_src = glob(['src/main/java/**/*.java'])
-
-    yang = name + '-yang'
-    yangSrcs = yang + '#srcs'
-    schema = name + '-schema'
-    registrator = name + '-registrator'
-
-    yang_library(
-      deps = deps,
-      name = yang,
-      srcs = yang_src,
-      model_id = model_id
-    )
-
-    genrule(
-      name = schema,
-      srcs = [ ':' + yangSrcs ],
-      cmd = '$(location //buck-tools:yang-schema) $OUT $SRCS',
-      out = 'yang'
-    )
-
-    if custom_registrator:
-        osgi_jar(
-          name = name,
-          srcs = [ ':' + yangSrcs ] + custom_src,
-          deps = deps + YANG_TOOLS,
-          resources = [ ':' + schema ],
-          resources_root = ".",
-          do_checkstyle = True,
-          do_javadocs = False,
-        )
-    else:
-        genrule(
-          name = registrator,
-          srcs = [ ':' + yangSrcs ],
-          cmd = '$(location //buck-tools:yang-registrator) $OUT ' + app_name.replace('-', '_') + ' $SRCS',
-          out = 'YangModelRegistrator.java'
-        )
-        osgi_jar(
-          name = name,
-          srcs = [ ':' + yangSrcs, ':' + registrator ],
-          deps = deps + YANG_TOOLS,
-          resources = [ ':' + schema ],
-          resources_root = ".",
-          do_checkstyle = False,
-          do_javadocs = False,
-        )
-
-    onos_app (
-      name = name,
-      app_name = app_name,
-      title = title,
-      category = 'Models',
-      url = url,
-      description = description,
-      required_apps = required_apps + [ 'org.onosproject.yang' ],
-    )
-
-def yang_osgi_jar(
-    name = None,
-    srcs = None,
-    model_id = None,
-    group_id = ONOS_GROUP_ID,
-    version = ONOS_VERSION,
-    deps = [],
-    visibility = ['PUBLIC'],
-    license = 'NONE',
-    **kwargs
-    ):
-
-    if name is None:
-        name = _get_name()
-
-    if model_id is None:
-        model_id = name
-    yang_jar = name + '-yang'
-    bnd_jar = name + '-bnd'
-
-    args = { 'group':group_id, 'artifact':name, 'version':version }
-
-    yang_library(
-      deps = deps,
-      name = yang_jar,
-      srcs = srcs,
-      model_id = model_id,
-      visibility = [ ],
-    )
-
-    cmd = 'java -jar $(location //lib:bndexe) wrap -o $OUT '
-    cmd += '-b %(group)s.%(artifact)s ' % args
-    cmd += '-v ' + version.replace('-', '.') + ' '
-    cmd += '$(location :%s) ' % yang_jar
-    cmd += ' >/dev/null 2>&1'
-
-    genrule(
-         name = bnd_jar,
-         bash = cmd,
-         out = name + '.jar',
-         visibility = [],
-    )
-
-    prebuilt_jar(
-        name = name,
-        binary_jar = ':' + bnd_jar,
-        maven_coords = '%(group)s:%(artifact)s:%(version)s'%args,
-        visibility = visibility,
-    )
diff --git a/cli/BUCK b/cli/BUCK
deleted file mode 100644
index 3fedcf4..0000000
--- a/cli/BUCK
+++ /dev/null
@@ -1,16 +0,0 @@
-COMPILE_DEPS = [
-    '//lib:CORE_DEPS',
-    '//lib:JACKSON',
-    '//lib:METRICS',
-    '//lib:org.apache.karaf.shell.console',
-    '//incubator/api:onos-incubator-api',
-    '//incubator/net:onos-incubator-net',
-    '//utils/rest:onlab-rest',
-    '//core/common:onos-core-common',
-]
-
-osgi_jar (
-    deps = COMPILE_DEPS,
-    visibility = ['PUBLIC'],
-)
-
diff --git a/cli/BUILD b/cli/BUILD
index b8a3f5b..9924aac 100644
--- a/cli/BUILD
+++ b/cli/BUILD
@@ -1,5 +1,5 @@
 COMPILE_DEPS = CORE_DEPS + JACKSON + METRICS + [
-    "@org_apache_karaf_shell_console//jar",
+    "@org_apache_karaf_shell_core//jar",
     "//incubator/api:onos-incubator-api",
     "//incubator/net:onos-incubator-net",
     "//utils/rest:onlab-rest",
@@ -7,6 +7,13 @@
 ]
 
 osgi_jar(
+    karaf_command_packages = [
+        "org.onosproject.cli",
+        "org.onosproject.cli.app",
+        "org.onosproject.cli.cfg",
+        "org.onosproject.cli.net",
+        "org.onosproject.cli.security",
+    ],
     visibility = ["//visibility:public"],
     deps = COMPILE_DEPS,
 )
diff --git a/cli/src/main/java/org/onosproject/cli/AbstractChoicesCompleter.java b/cli/src/main/java/org/onosproject/cli/AbstractChoicesCompleter.java
index 5b5e808..b3a551a 100644
--- a/cli/src/main/java/org/onosproject/cli/AbstractChoicesCompleter.java
+++ b/cli/src/main/java/org/onosproject/cli/AbstractChoicesCompleter.java
@@ -15,7 +15,9 @@
  */
 package org.onosproject.cli;
 
-import org.apache.karaf.shell.console.completer.StringsCompleter;
+import org.apache.karaf.shell.api.console.CommandLine;
+import org.apache.karaf.shell.api.console.Session;
+import org.apache.karaf.shell.support.completers.StringsCompleter;
 
 import java.util.List;
 import java.util.SortedSet;
@@ -26,13 +28,17 @@
 public abstract class AbstractChoicesCompleter extends AbstractCompleter {
 
     protected abstract List<String> choices();
+    public CommandLine commandLine;
+    public Session session;
 
     @Override
-    public int complete(String buffer, int cursor, List<String> candidates) {
+    public int complete(Session session, CommandLine commandLine, List<String> candidates) {
+        this.session = session;
+        this.commandLine = commandLine;
         StringsCompleter delegate = new StringsCompleter();
         SortedSet<String> strings = delegate.getStrings();
         choices().forEach(strings::add);
-        return delegate.complete(buffer, cursor, candidates);
+        return delegate.complete(session, commandLine, candidates);
     }
 
 }
diff --git a/cli/src/main/java/org/onosproject/cli/AbstractCompleter.java b/cli/src/main/java/org/onosproject/cli/AbstractCompleter.java
index 19f51f1..44cbea7 100644
--- a/cli/src/main/java/org/onosproject/cli/AbstractCompleter.java
+++ b/cli/src/main/java/org/onosproject/cli/AbstractCompleter.java
@@ -15,25 +15,23 @@
  */
 package org.onosproject.cli;
 
-import org.apache.felix.service.command.CommandSession;
-import org.apache.karaf.shell.console.CommandSessionHolder;
-import org.apache.karaf.shell.console.Completer;
-import org.apache.karaf.shell.console.completer.ArgumentCompleter;
+import org.apache.karaf.shell.api.console.CommandLine;
+import org.apache.karaf.shell.api.console.Completer;
+import org.apache.karaf.shell.api.console.Session;
+import org.apache.karaf.shell.support.completers.StringsCompleter;
+
+import java.util.List;
 
 /**
  * Abstract argument completer.
  */
 public abstract class AbstractCompleter implements Completer {
 
-    /**
-     * Returns the argument list.
-     *
-     * @return argument list
-     */
-    protected ArgumentCompleter.ArgumentList getArgumentList() {
-        CommandSession session = CommandSessionHolder.getSession();
-        return (ArgumentCompleter.ArgumentList)
-                session.get(ArgumentCompleter.ARGUMENTS_LIST);
+    @Override
+    public int complete(Session session, CommandLine commandLine, List<String> candidates) {
+        StringsCompleter delegate = new StringsCompleter();
+
+        return delegate.complete(session, commandLine, candidates);
     }
 
 }
diff --git a/cli/src/main/java/org/onosproject/cli/AbstractShellCommand.java b/cli/src/main/java/org/onosproject/cli/AbstractShellCommand.java
index 09e08fa..d6d044e 100644
--- a/cli/src/main/java/org/onosproject/cli/AbstractShellCommand.java
+++ b/cli/src/main/java/org/onosproject/cli/AbstractShellCommand.java
@@ -15,8 +15,8 @@
  */
 package org.onosproject.cli;
 
-import org.apache.karaf.shell.commands.Option;
-import org.apache.karaf.shell.console.AbstractAction;
+import org.apache.karaf.shell.api.action.Option;
+import org.apache.karaf.shell.api.action.Action;
 import org.onlab.osgi.DefaultServiceDirectory;
 import org.onlab.osgi.ServiceNotFoundException;
 import org.onosproject.codec.CodecContext;
@@ -29,6 +29,8 @@
 import com.fasterxml.jackson.databind.ObjectMapper;
 import com.fasterxml.jackson.databind.node.ObjectNode;
 import org.onosproject.net.DefaultAnnotations;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 import java.util.Set;
 import java.util.TreeSet;
@@ -36,7 +38,8 @@
 /**
  * Base abstraction of Karaf shell commands.
  */
-public abstract class AbstractShellCommand extends AbstractAction implements CodecContext {
+public abstract class AbstractShellCommand implements Action, CodecContext {
+    protected final Logger log = LoggerFactory.getLogger(this.getClass());
 
     @Option(name = "-j", aliases = "--json", description = "Output JSON",
             required = false, multiValued = false)
@@ -136,11 +139,6 @@
     }
 
     /**
-     * Executes this command.
-     */
-    protected abstract void execute();
-
-    /**
      * Indicates whether JSON format should be output.
      *
      * @return true if JSON is requested
@@ -150,16 +148,22 @@
     }
 
     @Override
-    protected Object doExecute() throws Exception {
+    public Object execute() throws Exception {
         try {
-            execute();
+            doExecute();
         } catch (ServiceNotFoundException e) {
             error(e.getMessage());
         }
         return null;
     }
 
-
+    protected void doExecute() throws Exception {
+        try {
+            execute();
+        } catch (ServiceNotFoundException e) {
+            error(e.getMessage());
+        }
+    }
 
     private final ObjectMapper mapper = new ObjectMapper();
 
diff --git a/cli/src/main/java/org/onosproject/cli/BalanceMastersCommand.java b/cli/src/main/java/org/onosproject/cli/BalanceMastersCommand.java
index 8c86c71..7ef8f4e 100644
--- a/cli/src/main/java/org/onosproject/cli/BalanceMastersCommand.java
+++ b/cli/src/main/java/org/onosproject/cli/BalanceMastersCommand.java
@@ -15,18 +15,20 @@
  */
 package org.onosproject.cli;
 
-import org.apache.karaf.shell.commands.Command;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.mastership.MastershipAdminService;
 
 /**
  * Forces device mastership rebalancing.
  */
+@Service
 @Command(scope = "onos", name = "balance-masters",
         description = "Forces device mastership rebalancing")
 public class BalanceMastersCommand extends AbstractShellCommand {
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         get(MastershipAdminService.class).balanceRoles();
     }
 
diff --git a/cli/src/main/java/org/onosproject/cli/CliComponent.java b/cli/src/main/java/org/onosproject/cli/CliComponent.java
index 2c44578..558abda 100644
--- a/cli/src/main/java/org/onosproject/cli/CliComponent.java
+++ b/cli/src/main/java/org/onosproject/cli/CliComponent.java
@@ -15,10 +15,10 @@
  */
 package org.onosproject.cli;
 
-import org.apache.felix.scr.annotations.Activate;
-import org.apache.felix.scr.annotations.Component;
-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.Reference;
+import org.osgi.service.component.annotations.ReferenceCardinality;
 import org.onosproject.core.CoreService;
 
 /**
@@ -28,7 +28,7 @@
 @Component(immediate = true)
 public class CliComponent {
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected CoreService coreService;
 
     @Activate
diff --git a/cli/src/main/java/org/onosproject/cli/IssuCommand.java b/cli/src/main/java/org/onosproject/cli/IssuCommand.java
index e2ff991..04e3ad9 100644
--- a/cli/src/main/java/org/onosproject/cli/IssuCommand.java
+++ b/cli/src/main/java/org/onosproject/cli/IssuCommand.java
@@ -15,14 +15,16 @@
  */
 package org.onosproject.cli;
 
-import org.apache.karaf.shell.commands.Argument;
-import org.apache.karaf.shell.commands.Command;
+import org.apache.karaf.shell.api.action.Argument;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.upgrade.UpgradeAdminService;
 import org.onosproject.upgrade.UpgradeService;
 
 /**
  * Commands for managing upgrades.
  */
+@Service
 @Command(scope = "onos", name = "issu",
         description = "Manages upgrades")
 public class IssuCommand extends AbstractShellCommand {
@@ -41,7 +43,7 @@
     String command = null;
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         UpgradeService upgradeService = get(UpgradeService.class);
         UpgradeAdminService upgradeAdminService = get(UpgradeAdminService.class);
         if (command == null) {
diff --git a/cli/src/main/java/org/onosproject/cli/MarkCommand.java b/cli/src/main/java/org/onosproject/cli/MarkCommand.java
index dc119ed..f7881f3 100644
--- a/cli/src/main/java/org/onosproject/cli/MarkCommand.java
+++ b/cli/src/main/java/org/onosproject/cli/MarkCommand.java
@@ -20,9 +20,10 @@
 import java.util.List;
 import java.util.stream.Collectors;
 
-import org.apache.karaf.shell.commands.Argument;
-import org.apache.karaf.shell.commands.Command;
-import org.apache.karaf.shell.commands.Option;
+import org.apache.karaf.shell.api.action.Argument;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
+import org.apache.karaf.shell.api.action.Option;
 import org.slf4j.Logger;
 
 import com.google.common.collect.ImmutableList;
@@ -30,6 +31,7 @@
 /**
  * CLI command which just log message to ONOS log for ease of debugging, etc.
  */
+@Service
 @Command(scope = "onos", name = "mark",
          description = "Mark message in the log")
 public class MarkCommand extends AbstractShellCommand {
@@ -49,7 +51,7 @@
     List<String> message = ImmutableList.of(MARK);
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
 
         Logger log = getLogger(loggerName);
 
diff --git a/cli/src/main/java/org/onosproject/cli/MastersListCommand.java b/cli/src/main/java/org/onosproject/cli/MastersListCommand.java
index 7ffc3b2..6debc1b 100644
--- a/cli/src/main/java/org/onosproject/cli/MastersListCommand.java
+++ b/cli/src/main/java/org/onosproject/cli/MastersListCommand.java
@@ -19,7 +19,8 @@
 import com.fasterxml.jackson.databind.ObjectMapper;
 import com.fasterxml.jackson.databind.node.ArrayNode;
 import com.google.common.collect.Lists;
-import org.apache.karaf.shell.commands.Command;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.cluster.ClusterService;
 import org.onosproject.cluster.ControllerNode;
 import org.onosproject.mastership.MastershipService;
@@ -34,12 +35,13 @@
 /**
  * Lists device mastership information.
  */
+@Service
 @Command(scope = "onos", name = "masters",
          description = "Lists device mastership information")
 public class MastersListCommand extends AbstractShellCommand {
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         ClusterService service = get(ClusterService.class);
         MastershipService mastershipService = get(MastershipService.class);
         DeviceService deviceService = get(DeviceService.class);
diff --git a/cli/src/main/java/org/onosproject/cli/MembershipsListCommand.java b/cli/src/main/java/org/onosproject/cli/MembershipsListCommand.java
index f1a5c42..ffb9aca 100644
--- a/cli/src/main/java/org/onosproject/cli/MembershipsListCommand.java
+++ b/cli/src/main/java/org/onosproject/cli/MembershipsListCommand.java
@@ -20,7 +20,8 @@
 import com.fasterxml.jackson.databind.ObjectMapper;
 import com.fasterxml.jackson.databind.node.ArrayNode;
 import com.fasterxml.jackson.databind.node.ObjectNode;
-import org.apache.karaf.shell.commands.Command;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.cluster.ClusterAdminService;
 import org.onosproject.cluster.ControllerNode;
 import org.onosproject.cluster.Member;
@@ -35,12 +36,13 @@
 /**
  * Command to list the memberships in the system.
  */
+@Service
 @Command(scope = "onos", name = "memberships",
         description = "Lists information about memberships in the system")
 public class MembershipsListCommand extends AbstractShellCommand {
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         MembershipService service = get(MembershipService.class);
         ClusterAdminService clusterService = get(ClusterAdminService.class);
 
diff --git a/cli/src/main/java/org/onosproject/cli/MetricNameCompleter.java b/cli/src/main/java/org/onosproject/cli/MetricNameCompleter.java
index 31ac4ff..62734f5 100644
--- a/cli/src/main/java/org/onosproject/cli/MetricNameCompleter.java
+++ b/cli/src/main/java/org/onosproject/cli/MetricNameCompleter.java
@@ -15,6 +15,7 @@
  */
 package org.onosproject.cli;
 
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onlab.metrics.MetricsService;
 
 import java.util.ArrayList;
@@ -23,6 +24,7 @@
 /**
  * Metric name completer.
  */
+@Service
 public class MetricNameCompleter extends AbstractChoicesCompleter {
 
     @Override
diff --git a/cli/src/main/java/org/onosproject/cli/MetricsListCommand.java b/cli/src/main/java/org/onosproject/cli/MetricsListCommand.java
index d1ecafa..a2a99f9 100644
--- a/cli/src/main/java/org/onosproject/cli/MetricsListCommand.java
+++ b/cli/src/main/java/org/onosproject/cli/MetricsListCommand.java
@@ -29,8 +29,10 @@
 import com.google.common.base.Strings;
 import com.google.common.collect.Ordering;
 import com.google.common.collect.TreeMultimap;
-import org.apache.karaf.shell.commands.Argument;
-import org.apache.karaf.shell.commands.Command;
+import org.apache.karaf.shell.api.action.Argument;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.Completion;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onlab.metrics.MetricsService;
 import org.onlab.util.Tools;
 
@@ -43,6 +45,7 @@
 /**
  * Prints metrics in the system.
  */
+@Service
 @Command(scope = "onos", name = "metrics",
          description = "Prints metrics in the system")
 public class MetricsListCommand extends AbstractShellCommand {
@@ -68,10 +71,11 @@
 
     @Argument(index = 0, name = "metricName", description = "Name of Metric",
             required = false, multiValued = false)
+    @Completion(MetricNameCompleter.class)
     String metricName = null;
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         MetricsService metricsService = get(MetricsService.class);
 
         MetricFilter filter = metricName != null ? (name, metric) -> name.equals(metricName) : MetricFilter.ALL;
diff --git a/cli/src/main/java/org/onosproject/cli/NodeAddCommand.java b/cli/src/main/java/org/onosproject/cli/NodeAddCommand.java
index 2b2b659..e01fd67 100644
--- a/cli/src/main/java/org/onosproject/cli/NodeAddCommand.java
+++ b/cli/src/main/java/org/onosproject/cli/NodeAddCommand.java
@@ -15,8 +15,9 @@
  */
 package org.onosproject.cli;
 
-import org.apache.karaf.shell.commands.Argument;
-import org.apache.karaf.shell.commands.Command;
+import org.apache.karaf.shell.api.action.Argument;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.cluster.ClusterAdminService;
 import org.onosproject.cluster.DefaultControllerNode;
 import org.onosproject.cluster.NodeId;
@@ -25,6 +26,7 @@
 /**
  * Adds a new controller cluster node.
  */
+@Service
 @Command(scope = "onos", name = "add-node",
          description = "Adds a new controller cluster node")
 public class NodeAddCommand extends AbstractShellCommand {
@@ -42,7 +44,7 @@
     int tcpPort = DefaultControllerNode.DEFAULT_PORT;
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         ClusterAdminService service = get(ClusterAdminService.class);
         service.addNode(new NodeId(nodeId), IpAddress.valueOf(ip), tcpPort);
     }
diff --git a/cli/src/main/java/org/onosproject/cli/NodeIdCompleter.java b/cli/src/main/java/org/onosproject/cli/NodeIdCompleter.java
index c770f4f..5d55de3 100644
--- a/cli/src/main/java/org/onosproject/cli/NodeIdCompleter.java
+++ b/cli/src/main/java/org/onosproject/cli/NodeIdCompleter.java
@@ -15,8 +15,11 @@
  */
 package org.onosproject.cli;
 
-import org.apache.karaf.shell.console.Completer;
-import org.apache.karaf.shell.console.completer.StringsCompleter;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
+import org.apache.karaf.shell.api.console.CommandLine;
+import org.apache.karaf.shell.api.console.Completer;
+import org.apache.karaf.shell.api.console.Session;
+import org.apache.karaf.shell.support.completers.StringsCompleter;
 import org.onosproject.cluster.ClusterService;
 import org.onosproject.cluster.ControllerNode;
 
@@ -27,9 +30,10 @@
 /**
  * Node ID completer.
  */
+@Service
 public class NodeIdCompleter implements Completer {
     @Override
-    public int complete(String buffer, int cursor, List<String> candidates) {
+    public int complete(Session session, CommandLine commandLine, List<String> candidates) {
         // Delegate string completer
         StringsCompleter delegate = new StringsCompleter();
 
@@ -42,7 +46,7 @@
         }
 
         // Now let the completer do the work for figuring out what to offer.
-        return delegate.complete(buffer, cursor, candidates);
+        return delegate.complete(session, commandLine, candidates);
     }
 
 }
diff --git a/cli/src/main/java/org/onosproject/cli/NodeRemoveCommand.java b/cli/src/main/java/org/onosproject/cli/NodeRemoveCommand.java
index 215156f..5470c38 100644
--- a/cli/src/main/java/org/onosproject/cli/NodeRemoveCommand.java
+++ b/cli/src/main/java/org/onosproject/cli/NodeRemoveCommand.java
@@ -15,14 +15,16 @@
  */
 package org.onosproject.cli;
 
-import org.apache.karaf.shell.commands.Argument;
-import org.apache.karaf.shell.commands.Command;
+import org.apache.karaf.shell.api.action.Argument;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.cluster.ClusterAdminService;
 import org.onosproject.cluster.NodeId;
 
 /**
  * Removes a controller cluster node.
  */
+@Service
 @Command(scope = "onos", name = "remove-node",
          description = "Removes a new controller cluster node")
 public class NodeRemoveCommand extends AbstractShellCommand {
@@ -32,7 +34,7 @@
     String nodeId = null;
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         ClusterAdminService service = get(ClusterAdminService.class);
         service.removeNode(new NodeId(nodeId));
     }
diff --git a/cli/src/main/java/org/onosproject/cli/NodesListCommand.java b/cli/src/main/java/org/onosproject/cli/NodesListCommand.java
index ab1216e..ac6a5ec 100644
--- a/cli/src/main/java/org/onosproject/cli/NodesListCommand.java
+++ b/cli/src/main/java/org/onosproject/cli/NodesListCommand.java
@@ -19,7 +19,8 @@
 import com.fasterxml.jackson.databind.ObjectMapper;
 import com.fasterxml.jackson.databind.node.ArrayNode;
 import com.fasterxml.jackson.databind.node.ObjectNode;
-import org.apache.karaf.shell.commands.Command;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.cluster.ClusterAdminService;
 import org.onosproject.cluster.ControllerNode;
 import org.onosproject.core.Version;
@@ -33,6 +34,7 @@
 /**
  * Lists all controller cluster nodes.
  */
+@Service
 @Command(scope = "onos", name = "nodes",
         description = "Lists all controller cluster nodes")
 public class NodesListCommand extends AbstractShellCommand {
@@ -40,7 +42,7 @@
     private static final String FMT = "id=%s, address=%s:%s, state=%s, version=%s, updated=%s %s";
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         ClusterAdminService service = get(ClusterAdminService.class);
         List<ControllerNode> nodes = newArrayList(service.getNodes());
         Collections.sort(nodes, Comparators.NODE_COMPARATOR);
diff --git a/cli/src/main/java/org/onosproject/cli/PlaceholderCompleter.java b/cli/src/main/java/org/onosproject/cli/PlaceholderCompleter.java
index bba871e..30ef054 100644
--- a/cli/src/main/java/org/onosproject/cli/PlaceholderCompleter.java
+++ b/cli/src/main/java/org/onosproject/cli/PlaceholderCompleter.java
@@ -16,7 +16,10 @@
 
 package org.onosproject.cli;
 
-import org.apache.karaf.shell.console.completer.StringsCompleter;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
+import org.apache.karaf.shell.api.console.CommandLine;
+import org.apache.karaf.shell.api.console.Session;
+import org.apache.karaf.shell.support.completers.StringsCompleter;
 
 import java.util.List;
 import java.util.SortedSet;
@@ -25,16 +28,17 @@
  * A completer that can be used as a placeholder for arguments that don't
  * need/want completers.
  */
+@Service
 public class PlaceholderCompleter extends AbstractCompleter {
 
     @Override
-    public int complete(String s, int i, List<String> list) {
+    public int complete(Session session, CommandLine commandLine, List<String> candidates) {
         // Populate a string completer with what the user has typed so far
         StringsCompleter delegate = new StringsCompleter();
         SortedSet<String> strings = delegate.getStrings();
-        if (s != null) {
-            strings.add(s);
+        if (commandLine.getCursorArgument() != null) {
+            strings.add(commandLine.getCursorArgument());
         }
-        return delegate.complete(s, i, list);
+        return delegate.complete(session, commandLine, candidates);
     }
 }
diff --git a/cli/src/main/java/org/onosproject/cli/PrettyJson.java b/cli/src/main/java/org/onosproject/cli/PrettyJson.java
index 22b08a0..39d7da6 100644
--- a/cli/src/main/java/org/onosproject/cli/PrettyJson.java
+++ b/cli/src/main/java/org/onosproject/cli/PrettyJson.java
@@ -16,7 +16,8 @@
 package org.onosproject.cli;
 
 import java.io.IOException;
-import org.apache.karaf.shell.commands.Command;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 
 import com.fasterxml.jackson.databind.ObjectMapper;
 import com.fasterxml.jackson.databind.SerializationFeature;
@@ -24,12 +25,13 @@
 /**
  * Pretty print previous command output JSON.
  */
+@Service
 @Command(scope = "onos", name = "pp",
          description = "Pretty print JSON output from previous command")
 public class PrettyJson extends AbstractShellCommand {
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         try {
             ObjectMapper mapper = new ObjectMapper();
             mapper.enable(SerializationFeature.INDENT_OUTPUT);
diff --git a/cli/src/main/java/org/onosproject/cli/PrettyXml.java b/cli/src/main/java/org/onosproject/cli/PrettyXml.java
index 9b3635f..20c8180 100644
--- a/cli/src/main/java/org/onosproject/cli/PrettyXml.java
+++ b/cli/src/main/java/org/onosproject/cli/PrettyXml.java
@@ -18,7 +18,8 @@
 import java.io.IOException;
 import java.io.InputStreamReader;
 
-import org.apache.karaf.shell.commands.Command;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onlab.util.XmlString;
 
 import com.google.common.io.CharStreams;
@@ -26,12 +27,13 @@
 /**
  * Pretty print previous command output XML.
  */
+@Service
 @Command(scope = "onos", name = "ppxml",
          description = "Pretty print XML output from previous command")
 public class PrettyXml extends AbstractShellCommand {
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         try {
             String xmlS = CharStreams.toString(new InputStreamReader(System.in));
 
diff --git a/cli/src/main/java/org/onosproject/cli/RolesCommand.java b/cli/src/main/java/org/onosproject/cli/RolesCommand.java
index 17f46aa..88fa8fe 100644
--- a/cli/src/main/java/org/onosproject/cli/RolesCommand.java
+++ b/cli/src/main/java/org/onosproject/cli/RolesCommand.java
@@ -19,7 +19,8 @@
 import com.fasterxml.jackson.databind.ObjectMapper;
 import com.fasterxml.jackson.databind.node.ArrayNode;
 import com.fasterxml.jackson.databind.node.ObjectNode;
-import org.apache.karaf.shell.commands.Command;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.cluster.NodeId;
 import org.onosproject.cluster.RoleInfo;
 import org.onosproject.mastership.MastershipService;
@@ -34,6 +35,7 @@
 /**
  * Lists mastership roles of nodes for each device.
  */
+@Service
 @Command(scope = "onos", name = "roles",
          description = "Lists mastership roles of nodes for each device.")
 public class RolesCommand extends AbstractShellCommand {
@@ -41,7 +43,7 @@
     private static final String FMT_HDR = "%s: master=%s, standbys=[ %s]";
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         DeviceService deviceService = get(DeviceService.class);
         MastershipService roleService = get(MastershipService.class);
 
diff --git a/cli/src/main/java/org/onosproject/cli/ScrListCommand.java b/cli/src/main/java/org/onosproject/cli/ScrListCommand.java
new file mode 100644
index 0000000..2de0c8e
--- /dev/null
+++ b/cli/src/main/java/org/onosproject/cli/ScrListCommand.java
@@ -0,0 +1,63 @@
+/*
+ * Copyright 2017-present Open Networking Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.onosproject.cli;
+
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
+import org.osgi.service.component.runtime.ServiceComponentRuntime;
+import org.osgi.service.component.runtime.dto.ComponentConfigurationDTO;
+
+import java.util.Formatter;
+
+/**
+ * CLI command to dump out the SCR components list in the old karaf format.
+ */
+@Service
+@Command(scope = "onos", name = "scr-list",
+         description = "List components")
+public class ScrListCommand extends AbstractShellCommand {
+
+    @Override
+    protected void doExecute() {
+        StringBuilder output = new StringBuilder();
+        Formatter formatter = new Formatter(output);
+        ServiceComponentRuntime scrService = get(ServiceComponentRuntime.class);
+
+        scrService.getComponentDescriptionDTOs()
+            .forEach(componentDto -> {
+                scrService.getComponentConfigurationDTOs(componentDto)
+                    .forEach(configurationDto -> {
+                        String state;
+                        switch (configurationDto.state) {
+                            case ComponentConfigurationDTO.ACTIVE: {
+                                state = "ACTIVE";
+                                break;
+                            }
+                            case ComponentConfigurationDTO.SATISFIED: {
+                                state = "SATISFIED";
+                                break;
+                            }
+                            default: {
+                                state = "UNKNOWN";
+                            }
+                        }
+                        formatter.format("%3d | %9s | %s\n", configurationDto.id, state, componentDto.name);
+                    });
+                });
+        print(output.toString());
+    }
+
+}
diff --git a/cli/src/main/java/org/onosproject/cli/StartStopCompleter.java b/cli/src/main/java/org/onosproject/cli/StartStopCompleter.java
index 42b4e95..71ad389 100644
--- a/cli/src/main/java/org/onosproject/cli/StartStopCompleter.java
+++ b/cli/src/main/java/org/onosproject/cli/StartStopCompleter.java
@@ -16,12 +16,14 @@
 package org.onosproject.cli;
 
 import com.google.common.collect.ImmutableList;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 
 import java.util.List;
 
 /**
  * Start/stop command completer.
  */
+@Service
 public class StartStopCompleter extends AbstractChoicesCompleter {
 
     public static final String START = "start";
diff --git a/cli/src/main/java/org/onosproject/cli/StorageNodesListCommand.java b/cli/src/main/java/org/onosproject/cli/StorageNodesListCommand.java
index 7b26db8..7cbf619 100644
--- a/cli/src/main/java/org/onosproject/cli/StorageNodesListCommand.java
+++ b/cli/src/main/java/org/onosproject/cli/StorageNodesListCommand.java
@@ -23,7 +23,8 @@
 import com.fasterxml.jackson.databind.ObjectMapper;
 import com.fasterxml.jackson.databind.node.ArrayNode;
 import com.fasterxml.jackson.databind.node.ObjectNode;
-import org.apache.karaf.shell.commands.Command;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.cluster.ClusterAdminService;
 import org.onosproject.cluster.Node;
 
@@ -32,13 +33,14 @@
 /**
  * Lists all storage nodes.
  */
+@Service
 @Command(scope = "onos", name = "storage-nodes", description = "Lists all storage nodes")
 public class StorageNodesListCommand extends AbstractShellCommand {
 
     private static final String FMT = "id=%s, address=%s:%s";
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         ClusterAdminService service = get(ClusterAdminService.class);
         List<Node> nodes = newArrayList(service.getConsensusNodes());
         Collections.sort(nodes, Comparator.comparing(Node::id));
diff --git a/cli/src/main/java/org/onosproject/cli/SummaryCommand.java b/cli/src/main/java/org/onosproject/cli/SummaryCommand.java
index 51a2fc3..02ff37d 100644
--- a/cli/src/main/java/org/onosproject/cli/SummaryCommand.java
+++ b/cli/src/main/java/org/onosproject/cli/SummaryCommand.java
@@ -16,7 +16,8 @@
 package org.onosproject.cli;
 
 import com.fasterxml.jackson.databind.ObjectMapper;
-import org.apache.karaf.shell.commands.Command;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onlab.packet.IpAddress;
 import org.onosproject.cluster.ClusterMetadataService;
 import org.onosproject.cluster.ClusterService;
@@ -35,6 +36,7 @@
 /**
  * Provides summary of ONOS model.
  */
+@Service
 @Command(scope = "onos", name = "summary",
          description = "Provides summary of ONOS model")
 public class SummaryCommand extends AbstractShellCommand {
@@ -55,7 +57,7 @@
     }
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         IpAddress nodeIp = get(ClusterService.class).getLocalNode().ip();
         Version version = get(CoreService.class).version();
         long numNodes = activeNodes(get(ClusterService.class).getNodes());
diff --git a/cli/src/main/java/org/onosproject/cli/UpDownCompleter.java b/cli/src/main/java/org/onosproject/cli/UpDownCompleter.java
index 268b00f..a73ec42 100644
--- a/cli/src/main/java/org/onosproject/cli/UpDownCompleter.java
+++ b/cli/src/main/java/org/onosproject/cli/UpDownCompleter.java
@@ -16,12 +16,14 @@
 package org.onosproject.cli;
 
 import com.google.common.collect.ImmutableList;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 
 import java.util.List;
 
 /**
  * Up/down command completer.
  */
+@Service
 public class UpDownCompleter extends AbstractChoicesCompleter {
 
     public static final String UP = "up";
diff --git a/cli/src/main/java/org/onosproject/cli/app/AllApplicationNamesCompleter.java b/cli/src/main/java/org/onosproject/cli/app/AllApplicationNamesCompleter.java
index f501fd2..d04e087 100644
--- a/cli/src/main/java/org/onosproject/cli/app/AllApplicationNamesCompleter.java
+++ b/cli/src/main/java/org/onosproject/cli/app/AllApplicationNamesCompleter.java
@@ -21,6 +21,7 @@
 import java.util.Spliterators;
 import java.util.stream.StreamSupport;
 
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.app.ApplicationService;
 import org.onosproject.cli.AbstractChoicesCompleter;
 import org.onosproject.core.Application;
@@ -32,6 +33,7 @@
 /**
  * All installed application name completer.
  */
+@Service
 public class AllApplicationNamesCompleter extends AbstractChoicesCompleter {
     @Override
     public List<String> choices() {
diff --git a/cli/src/main/java/org/onosproject/cli/app/ApplicationCommand.java b/cli/src/main/java/org/onosproject/cli/app/ApplicationCommand.java
index 4db129d..ff0cbf8 100644
--- a/cli/src/main/java/org/onosproject/cli/app/ApplicationCommand.java
+++ b/cli/src/main/java/org/onosproject/cli/app/ApplicationCommand.java
@@ -16,8 +16,10 @@
 package org.onosproject.cli.app;
 
 import com.google.common.io.ByteStreams;
-import org.apache.karaf.shell.commands.Argument;
-import org.apache.karaf.shell.commands.Command;
+import org.apache.karaf.shell.api.action.Argument;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.Completion;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.app.ApplicationAdminService;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.core.Application;
@@ -31,6 +33,7 @@
 /**
  * Manages application inventory.
  */
+@Service
 @Command(scope = "onos", name = "app",
         description = "Manages application inventory")
 public class ApplicationCommand extends AbstractShellCommand {
@@ -43,15 +46,17 @@
 
     @Argument(index = 0, name = "command",
             description = "Command name (install|activate|deactivate|uninstall|download)",
-            required = true, multiValued = false)
+            required = true)
+    @Completion(ApplicationCommandCompleter.class)
     String command = null;
 
     @Argument(index = 1, name = "names", description = "Application name(s) or URL(s)",
             required = true, multiValued = true)
+    @Completion(ApplicationNameCompleter.class)
     String[] names = null;
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         ApplicationAdminService service = get(ApplicationAdminService.class);
         if (command.equals(INSTALL)) {
             for (String name : names) {
diff --git a/cli/src/main/java/org/onosproject/cli/app/ApplicationCommandCompleter.java b/cli/src/main/java/org/onosproject/cli/app/ApplicationCommandCompleter.java
index 8164b0e..a6487b3 100644
--- a/cli/src/main/java/org/onosproject/cli/app/ApplicationCommandCompleter.java
+++ b/cli/src/main/java/org/onosproject/cli/app/ApplicationCommandCompleter.java
@@ -16,6 +16,7 @@
 package org.onosproject.cli.app;
 
 import com.google.common.collect.ImmutableList;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.cli.AbstractChoicesCompleter;
 
 import java.util.List;
@@ -25,6 +26,7 @@
 /**
  * Application command completer.
  */
+@Service
 public class ApplicationCommandCompleter extends AbstractChoicesCompleter {
     @Override
     public List<String> choices() {
diff --git a/cli/src/main/java/org/onosproject/cli/app/ApplicationIdListCommand.java b/cli/src/main/java/org/onosproject/cli/app/ApplicationIdListCommand.java
index 15e7227..8e8a482 100644
--- a/cli/src/main/java/org/onosproject/cli/app/ApplicationIdListCommand.java
+++ b/cli/src/main/java/org/onosproject/cli/app/ApplicationIdListCommand.java
@@ -18,7 +18,8 @@
 import com.fasterxml.jackson.databind.JsonNode;
 import com.fasterxml.jackson.databind.ObjectMapper;
 import com.fasterxml.jackson.databind.node.ArrayNode;
-import org.apache.karaf.shell.commands.Command;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.utils.Comparators;
 import org.onosproject.core.ApplicationId;
@@ -32,12 +33,13 @@
 /**
  * Lists application ID information.
  */
+@Service
 @Command(scope = "onos", name = "app-ids",
          description = "Lists application ID information")
 public class ApplicationIdListCommand extends AbstractShellCommand {
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         CoreService service = get(CoreService.class);
         List<ApplicationId> ids = newArrayList(service.getAppIds());
         Collections.sort(ids, Comparators.APP_ID_COMPARATOR);
diff --git a/cli/src/main/java/org/onosproject/cli/app/ApplicationIdWithIntentNameCompleter.java b/cli/src/main/java/org/onosproject/cli/app/ApplicationIdWithIntentNameCompleter.java
index 275d6b9..d9e1a15 100644
--- a/cli/src/main/java/org/onosproject/cli/app/ApplicationIdWithIntentNameCompleter.java
+++ b/cli/src/main/java/org/onosproject/cli/app/ApplicationIdWithIntentNameCompleter.java
@@ -18,17 +18,21 @@
 import java.util.List;
 import java.util.SortedSet;
 
-import org.apache.karaf.shell.console.Completer;
-import org.apache.karaf.shell.console.completer.StringsCompleter;
+import org.apache.karaf.shell.api.console.CommandLine;
+import org.apache.karaf.shell.api.console.Completer;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
+import org.apache.karaf.shell.api.console.Session;
+import org.apache.karaf.shell.support.completers.StringsCompleter;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.net.intent.IntentService;
 
 /**
  * Application name completer.
  */
+@Service
 public class ApplicationIdWithIntentNameCompleter implements Completer {
     @Override
-    public int complete(String buffer, int cursor, List<String> candidates) {
+    public int complete(Session session, CommandLine commandLine, List<String> candidates) {
         // Delegate string completer
         StringsCompleter delegate = new StringsCompleter();
 
@@ -41,7 +45,7 @@
                         strings.add(intent.appId().name()));
 
         // Now let the completer do the work for figuring out what to offer.
-        return delegate.complete(buffer, cursor, candidates);
+        return delegate.complete(session, commandLine, candidates);
     }
 
 }
diff --git a/cli/src/main/java/org/onosproject/cli/app/ApplicationNameCompleter.java b/cli/src/main/java/org/onosproject/cli/app/ApplicationNameCompleter.java
index 3f93ced..2d0a6f7 100644
--- a/cli/src/main/java/org/onosproject/cli/app/ApplicationNameCompleter.java
+++ b/cli/src/main/java/org/onosproject/cli/app/ApplicationNameCompleter.java
@@ -15,8 +15,10 @@
  */
 package org.onosproject.cli.app;
 
-import org.apache.karaf.shell.console.completer.ArgumentCompleter;
-import org.apache.karaf.shell.console.completer.StringsCompleter;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
+import org.apache.karaf.shell.api.console.CommandLine;
+import org.apache.karaf.shell.api.console.Session;
+import org.apache.karaf.shell.support.completers.StringsCompleter;
 import org.onosproject.app.ApplicationService;
 import org.onosproject.app.ApplicationState;
 import org.onosproject.cli.AbstractCompleter;
@@ -42,15 +44,15 @@
 /**
  * Application name completer.
  */
+@Service
 public class ApplicationNameCompleter extends AbstractCompleter {
     @Override
-    public int complete(String buffer, int cursor, List<String> candidates) {
+    public int complete(Session session, CommandLine commandLine, List<String> candidates) {
         // Delegate string completer
         StringsCompleter delegate = new StringsCompleter();
 
         // Command name is the second argument.
-        ArgumentCompleter.ArgumentList list = getArgumentList();
-        String cmd = list.getArguments()[1];
+        String cmd = commandLine.getArguments()[1];
 
         // Grab apps already on the command (to prevent tab-completed duplicates)
         // FIXME: This does not work.
@@ -80,7 +82,7 @@
         }
 
         // add unique suffix to candidates, if user has something in buffer
-        if (!Strings.isNullOrEmpty(buffer)) {
+        if (!Strings.isNullOrEmpty(commandLine.getCursorArgument())) {
             List<String> suffixCandidates = strings.stream()
                     // remove onos common prefix
                     .map(full -> full.replaceFirst("org\\.onosproject\\.", ""))
@@ -107,7 +109,7 @@
         }
 
         // Now let the completer do the work for figuring out what to offer.
-        return delegate.complete(buffer, cursor, candidates);
+        return delegate.complete(session, commandLine, candidates);
     }
 
 }
diff --git a/cli/src/main/java/org/onosproject/cli/app/ApplicationsListCommand.java b/cli/src/main/java/org/onosproject/cli/app/ApplicationsListCommand.java
index 5b0c1ef..24b2da1 100644
--- a/cli/src/main/java/org/onosproject/cli/app/ApplicationsListCommand.java
+++ b/cli/src/main/java/org/onosproject/cli/app/ApplicationsListCommand.java
@@ -20,8 +20,9 @@
 import java.util.Comparator;
 import java.util.List;
 
-import org.apache.karaf.shell.commands.Command;
-import org.apache.karaf.shell.commands.Option;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
+import org.apache.karaf.shell.api.action.Option;
 import org.onosproject.app.ApplicationService;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.utils.Comparators;
@@ -37,6 +38,7 @@
 /**
  * Lists application information.
  */
+@Service
 @Command(scope = "onos", name = "apps",
         description = "Lists application information")
 public class ApplicationsListCommand extends AbstractShellCommand {
@@ -61,7 +63,7 @@
 
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         ApplicationService service = get(ApplicationService.class);
         List<Application> apps = newArrayList(service.getApplications());
         if (sortByName) {
diff --git a/cli/src/main/java/org/onosproject/cli/cfg/ComponentConfigCommand.java b/cli/src/main/java/org/onosproject/cli/cfg/ComponentConfigCommand.java
index ef20d07..2ac3a11 100644
--- a/cli/src/main/java/org/onosproject/cli/cfg/ComponentConfigCommand.java
+++ b/cli/src/main/java/org/onosproject/cli/cfg/ComponentConfigCommand.java
@@ -18,9 +18,11 @@
 import java.util.Optional;
 import java.util.Set;
 
-import org.apache.karaf.shell.commands.Argument;
-import org.apache.karaf.shell.commands.Command;
-import org.apache.karaf.shell.commands.Option;
+import org.apache.karaf.shell.api.action.Argument;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.Completion;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
+import org.apache.karaf.shell.api.action.Option;
 import org.onosproject.cfg.ComponentConfigService;
 import org.onosproject.cfg.ConfigProperty;
 import org.onosproject.cli.AbstractShellCommand;
@@ -35,6 +37,7 @@
 /**
  * Manages component configuration.
  */
+@Service
 @Command(scope = "onos", name = "cfg",
         description = "Manages component configuration")
 public class ComponentConfigCommand extends AbstractShellCommand {
@@ -54,14 +57,17 @@
     @Argument(index = 0, name = "command",
             description = "Command name (get|set|preset)",
             required = false, multiValued = false)
+    @Completion(ComponentConfigCommandCompleter.class)
     String command = null;
 
     @Argument(index = 1, name = "component", description = "Component name",
             required = false, multiValued = false)
+    @Completion(ComponentNameCompleter.class)
     String component = null;
 
     @Argument(index = 2, name = "name", description = "Property name",
             required = false, multiValued = false)
+    @Completion(ComponentPropertyNameCompleter.class)
     String name = null;
 
     @Argument(index = 3, name = "value", description = "Property value",
@@ -71,7 +77,7 @@
     ComponentConfigService service;
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         service = get(ComponentConfigService.class);
         try {
             if (isNullOrEmpty(command)) {
diff --git a/cli/src/main/java/org/onosproject/cli/cfg/ComponentConfigCommandCompleter.java b/cli/src/main/java/org/onosproject/cli/cfg/ComponentConfigCommandCompleter.java
index 46830cf..8c1819f 100644
--- a/cli/src/main/java/org/onosproject/cli/cfg/ComponentConfigCommandCompleter.java
+++ b/cli/src/main/java/org/onosproject/cli/cfg/ComponentConfigCommandCompleter.java
@@ -15,8 +15,11 @@
  */
 package org.onosproject.cli.cfg;
 
-import org.apache.karaf.shell.console.Completer;
-import org.apache.karaf.shell.console.completer.StringsCompleter;
+import org.apache.karaf.shell.api.console.CommandLine;
+import org.apache.karaf.shell.api.console.Completer;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
+import org.apache.karaf.shell.api.console.Session;
+import org.apache.karaf.shell.support.completers.StringsCompleter;
 
 import java.util.List;
 import java.util.SortedSet;
@@ -28,9 +31,10 @@
 /**
  * Component configuration command completer.
  */
+@Service
 public class ComponentConfigCommandCompleter implements Completer {
     @Override
-    public int complete(String buffer, int cursor, List<String> candidates) {
+    public int complete(Session session, CommandLine commandLine, List<String> candidates) {
         // Delegate string completer
         StringsCompleter delegate = new StringsCompleter();
         SortedSet<String> strings = delegate.getStrings();
@@ -39,7 +43,7 @@
         strings.add(PRESET);
 
         // Now let the completer do the work for figuring out what to offer.
-        return delegate.complete(buffer, cursor, candidates);
+        return delegate.complete(session, commandLine, candidates);
     }
 
 }
diff --git a/cli/src/main/java/org/onosproject/cli/cfg/ComponentNameCompleter.java b/cli/src/main/java/org/onosproject/cli/cfg/ComponentNameCompleter.java
index 1e4853b..fedeb01 100644
--- a/cli/src/main/java/org/onosproject/cli/cfg/ComponentNameCompleter.java
+++ b/cli/src/main/java/org/onosproject/cli/cfg/ComponentNameCompleter.java
@@ -15,8 +15,11 @@
  */
 package org.onosproject.cli.cfg;
 
-import org.apache.karaf.shell.console.Completer;
-import org.apache.karaf.shell.console.completer.StringsCompleter;
+import org.apache.karaf.shell.api.console.CommandLine;
+import org.apache.karaf.shell.api.console.Completer;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
+import org.apache.karaf.shell.api.console.Session;
+import org.apache.karaf.shell.support.completers.StringsCompleter;
 import org.onosproject.cfg.ComponentConfigService;
 import org.onosproject.cli.AbstractShellCommand;
 
@@ -26,9 +29,10 @@
 /**
  * Component name completer.
  */
+@Service
 public class ComponentNameCompleter implements Completer {
     @Override
-    public int complete(String buffer, int cursor, List<String> candidates) {
+    public int complete(Session session, CommandLine commandLine, List<String> candidates) {
         // Delegate string completer
         StringsCompleter delegate = new StringsCompleter();
 
@@ -38,7 +42,7 @@
         service.getComponentNames().forEach(strings::add);
 
         // Now let the completer do the work for figuring out what to offer.
-        return delegate.complete(buffer, cursor, candidates);
+        return delegate.complete(session, commandLine, candidates);
     }
 
 }
diff --git a/cli/src/main/java/org/onosproject/cli/cfg/ComponentPropertyNameCompleter.java b/cli/src/main/java/org/onosproject/cli/cfg/ComponentPropertyNameCompleter.java
index 0c842fa..4d6161a 100644
--- a/cli/src/main/java/org/onosproject/cli/cfg/ComponentPropertyNameCompleter.java
+++ b/cli/src/main/java/org/onosproject/cli/cfg/ComponentPropertyNameCompleter.java
@@ -15,8 +15,9 @@
  */
 package org.onosproject.cli.cfg;
 
-import org.apache.karaf.shell.console.completer.ArgumentCompleter;
-import org.apache.karaf.shell.console.completer.StringsCompleter;
+import org.apache.karaf.shell.api.console.CommandLine;
+import org.apache.karaf.shell.api.console.Session;
+import org.apache.karaf.shell.support.completers.StringsCompleter;
 import org.onosproject.cfg.ComponentConfigService;
 import org.onosproject.cfg.ConfigProperty;
 import org.onosproject.cli.AbstractCompleter;
@@ -32,13 +33,12 @@
  */
 public class ComponentPropertyNameCompleter extends AbstractCompleter {
     @Override
-    public int complete(String buffer, int cursor, List<String> candidates) {
+    public int complete(Session session, CommandLine commandLine, List<String> candidates) {
         // Delegate string completer
         StringsCompleter delegate = new StringsCompleter();
 
         // Component name is the previous argument.
-        ArgumentCompleter.ArgumentList list = getArgumentList();
-        String componentName = list.getArguments()[list.getCursorArgumentIndex() - 1];
+        String componentName = commandLine.getArguments()[commandLine.getCursorArgumentIndex() - 1];
         ComponentConfigService service = get(ComponentConfigService.class);
 
         SortedSet<String> strings = delegate.getStrings();
@@ -49,7 +49,7 @@
         }
 
         // Now let the completer do the work for figuring out what to offer.
-        return delegate.complete(buffer, cursor, candidates);
+        return delegate.complete(session, commandLine, candidates);
     }
 
 }
diff --git a/cli/src/main/java/org/onosproject/cli/cfg/ConfigKeyCompleter.java b/cli/src/main/java/org/onosproject/cli/cfg/ConfigKeyCompleter.java
index 35dd2a0..74bcdc2 100644
--- a/cli/src/main/java/org/onosproject/cli/cfg/ConfigKeyCompleter.java
+++ b/cli/src/main/java/org/onosproject/cli/cfg/ConfigKeyCompleter.java
@@ -21,7 +21,7 @@
 import java.util.Set;
 import java.util.stream.Collectors;
 
-import org.apache.karaf.shell.console.completer.ArgumentCompleter.ArgumentList;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.cli.AbstractChoicesCompleter;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.net.config.Config;
@@ -36,23 +36,23 @@
  * Assumes 2 argument before the one being completed is SubjectClassKey
  * and argument right before the one being completed is SubjectKey.
  */
+@Service
 public class ConfigKeyCompleter extends AbstractChoicesCompleter {
 
     // FIXME ConfigKeyCompleter never gets called??
     @Override
     protected List<String> choices() {
         NetworkConfigRegistry service = AbstractShellCommand.get(NetworkConfigRegistry.class);
-        ArgumentList args = getArgumentList();
 
-        checkArgument(args.getCursorArgumentIndex() >= 2);
-        String subjectClassKey = args.getArguments()[args.getCursorArgumentIndex() - 2];
+        checkArgument(commandLine.getCursorArgumentIndex() >= 2);
+        String subjectClassKey = commandLine.getArguments()[commandLine.getCursorArgumentIndex() - 2];
 
         SubjectFactory<?> subjectFactory = service.getSubjectFactory(subjectClassKey);
         if (subjectFactory == null) {
             return ImmutableList.of();
         }
 
-        String subjectKey = args.getArguments()[args.getCursorArgumentIndex() - 1];
+        String subjectKey = commandLine.getArguments()[commandLine.getCursorArgumentIndex() - 1];
 
         Object subject = subjectFactory.createSubject(subjectKey);
         Set<? extends Config<Object>> configs = service.getConfigs(subject);
diff --git a/cli/src/main/java/org/onosproject/cli/cfg/NetworkConfigCommand.java b/cli/src/main/java/org/onosproject/cli/cfg/NetworkConfigCommand.java
index a45efcb..fad93ef 100644
--- a/cli/src/main/java/org/onosproject/cli/cfg/NetworkConfigCommand.java
+++ b/cli/src/main/java/org/onosproject/cli/cfg/NetworkConfigCommand.java
@@ -19,9 +19,11 @@
 import com.fasterxml.jackson.databind.JsonNode;
 import com.fasterxml.jackson.databind.ObjectMapper;
 import com.fasterxml.jackson.databind.node.ObjectNode;
-import org.apache.karaf.shell.commands.Argument;
-import org.apache.karaf.shell.commands.Command;
-import org.apache.karaf.shell.commands.Option;
+import org.apache.karaf.shell.api.action.Argument;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.Completion;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
+import org.apache.karaf.shell.api.action.Option;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.net.config.Config;
 import org.onosproject.net.config.NetworkConfigService;
@@ -33,6 +35,7 @@
 /**
  * Manages network configuration.
  */
+@Service
 @Command(scope = "onos", name = "netcfg",
         description = "Manages network configuration")
 public class NetworkConfigCommand extends AbstractShellCommand {
@@ -41,14 +44,17 @@
 
     @Argument(index = 0, name = "subjectClassKey", description = "Subject class key",
             required = false, multiValued = false)
+    @Completion(ComponentConfigCommandCompleter.class)
     String subjectClassKey = null;
 
     @Argument(index = 1, name = "subjectKey", description = "Subject key",
             required = false, multiValued = false)
+    @Completion(ComponentNameCompleter.class)
     String subjectKey = null;
 
     @Argument(index = 2, name = "configKey", description = "Config key",
             required = false, multiValued = false)
+    @Completion(ConfigKeyCompleter.class)
     String configKey = null;
 
     @Option(name = "--remove",
@@ -60,7 +66,7 @@
     private NetworkConfigService service;
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         service = get(NetworkConfigService.class);
         JsonNode root = mapper.createObjectNode();
         if (isNullOrEmpty(subjectClassKey)) {
diff --git a/cli/src/main/java/org/onosproject/cli/cfg/NetworkConfigRegistryCommand.java b/cli/src/main/java/org/onosproject/cli/cfg/NetworkConfigRegistryCommand.java
index 5026fec..d477279 100644
--- a/cli/src/main/java/org/onosproject/cli/cfg/NetworkConfigRegistryCommand.java
+++ b/cli/src/main/java/org/onosproject/cli/cfg/NetworkConfigRegistryCommand.java
@@ -15,8 +15,9 @@
  */
 package org.onosproject.cli.cfg;
 
-import org.apache.karaf.shell.commands.Command;
-import org.apache.karaf.shell.commands.Option;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
+import org.apache.karaf.shell.api.action.Option;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.net.config.ConfigFactory;
 import org.onosproject.net.config.NetworkConfigRegistry;
@@ -24,6 +25,7 @@
 /**
  * Displays network configuration registry contents.
  */
+@Service
 @Command(scope = "onos", name = "netcfg-registry",
         description = "Displays network configuration registry contents")
 public class NetworkConfigRegistryCommand extends AbstractShellCommand {
@@ -36,7 +38,7 @@
     private boolean shortOnly = false;
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         get(NetworkConfigRegistry.class).getConfigFactories().forEach(this::print);
     }
 
diff --git a/cli/src/main/java/org/onosproject/cli/cfg/SubjectKeyCompleter.java b/cli/src/main/java/org/onosproject/cli/cfg/SubjectKeyCompleter.java
index 0267023..e0d183d 100644
--- a/cli/src/main/java/org/onosproject/cli/cfg/SubjectKeyCompleter.java
+++ b/cli/src/main/java/org/onosproject/cli/cfg/SubjectKeyCompleter.java
@@ -20,7 +20,6 @@
 import java.util.Set;
 import java.util.stream.Collectors;
 
-import org.apache.karaf.shell.console.completer.ArgumentCompleter.ArgumentList;
 import org.onosproject.cli.AbstractChoicesCompleter;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.net.config.NetworkConfigRegistry;
@@ -36,8 +35,7 @@
     @Override
     protected List<String> choices() {
         NetworkConfigRegistry service = AbstractShellCommand.get(NetworkConfigRegistry.class);
-        ArgumentList args = getArgumentList();
-        String subjectClassKey = args.getArguments()[args.getCursorArgumentIndex() - 1];
+        String subjectClassKey = commandLine.getArguments()[commandLine.getCursorArgumentIndex() - 1];
 
         SubjectFactory subjectFactory = service.getSubjectFactory(subjectClassKey);
         if (subjectFactory == null) {
diff --git a/cli/src/main/java/org/onosproject/cli/net/AddHostToHostIntentCommand.java b/cli/src/main/java/org/onosproject/cli/net/AddHostToHostIntentCommand.java
index 8f2fa87..27a7dca 100644
--- a/cli/src/main/java/org/onosproject/cli/net/AddHostToHostIntentCommand.java
+++ b/cli/src/main/java/org/onosproject/cli/net/AddHostToHostIntentCommand.java
@@ -17,8 +17,10 @@
 
 import java.util.List;
 
-import org.apache.karaf.shell.commands.Argument;
-import org.apache.karaf.shell.commands.Command;
+import org.apache.karaf.shell.api.action.Argument;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.Completion;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.net.HostId;
 import org.onosproject.net.flow.TrafficSelector;
 import org.onosproject.net.flow.TrafficTreatment;
@@ -29,20 +31,23 @@
 /**
  * Installs host-to-host connectivity intent.
  */
+@Service
 @Command(scope = "onos", name = "add-host-intent",
          description = "Installs host-to-host connectivity intent")
 public class AddHostToHostIntentCommand extends ConnectivityIntentCommand {
 
     @Argument(index = 0, name = "one", description = "One host ID",
               required = true, multiValued = false)
+    @Completion(HostIdCompleter.class)
     String one = null;
 
     @Argument(index = 1, name = "two", description = "Another host ID",
               required = true, multiValued = false)
+    @Completion(HostIdCompleter.class)
     String two = null;
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         IntentService service = get(IntentService.class);
 
         HostId oneId = HostId.hostId(one);
diff --git a/cli/src/main/java/org/onosproject/cli/net/AddMultiPointToSinglePointIntentCommand.java b/cli/src/main/java/org/onosproject/cli/net/AddMultiPointToSinglePointIntentCommand.java
index 16250a3..d06b491 100644
--- a/cli/src/main/java/org/onosproject/cli/net/AddMultiPointToSinglePointIntentCommand.java
+++ b/cli/src/main/java/org/onosproject/cli/net/AddMultiPointToSinglePointIntentCommand.java
@@ -15,8 +15,10 @@
  */
 package org.onosproject.cli.net;
 
-import org.apache.karaf.shell.commands.Argument;
-import org.apache.karaf.shell.commands.Command;
+import org.apache.karaf.shell.api.action.Argument;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.Completion;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.net.ConnectPoint;
 import org.onosproject.net.FilteredConnectPoint;
 import org.onosproject.net.flow.TrafficSelector;
@@ -33,6 +35,7 @@
 /**
  * Installs connectivity intent between multiple ingress devices and a single egress device.
  */
+@Service
 @Command(scope = "onos", name = "add-multi-to-single-intent",
          description = "Installs connectivity intent between multiple ingress devices and a single egress device")
 public class AddMultiPointToSinglePointIntentCommand extends ConnectivityIntentCommand {
@@ -40,10 +43,11 @@
     @Argument(index = 0, name = "ingressDevices egressDevice",
               description = "ingressDevice/Port..ingressDevice/Port egressDevice/Port",
               required = true, multiValued = true)
+    @Completion(ConnectPointCompleter.class)
     String[] deviceStrings = null;
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         IntentService service = get(IntentService.class);
 
         if (deviceStrings.length < 2) {
diff --git a/cli/src/main/java/org/onosproject/cli/net/AddPointToPointIntentCommand.java b/cli/src/main/java/org/onosproject/cli/net/AddPointToPointIntentCommand.java
index 264eb39..2a57397 100644
--- a/cli/src/main/java/org/onosproject/cli/net/AddPointToPointIntentCommand.java
+++ b/cli/src/main/java/org/onosproject/cli/net/AddPointToPointIntentCommand.java
@@ -15,9 +15,11 @@
  */
 package org.onosproject.cli.net;
 
-import org.apache.karaf.shell.commands.Argument;
-import org.apache.karaf.shell.commands.Command;
-import org.apache.karaf.shell.commands.Option;
+import org.apache.karaf.shell.api.action.Argument;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.Completion;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
+import org.apache.karaf.shell.api.action.Option;
 import org.onosproject.net.ConnectPoint;
 import org.onosproject.net.FilteredConnectPoint;
 import org.onosproject.net.flow.TrafficSelector;
@@ -35,6 +37,7 @@
 /**
  * Installs point-to-point connectivity intents.
  */
+@Service
 @Command(scope = "onos", name = "add-point-intent",
          description = "Installs point-to-point connectivity intent")
 public class AddPointToPointIntentCommand extends ConnectivityIntentCommand {
@@ -42,11 +45,13 @@
     @Argument(index = 0, name = "ingressDevice",
               description = "Ingress Device/Port Description",
               required = true, multiValued = false)
+    @Completion(ConnectPointCompleter.class)
     String ingressDeviceString = null;
 
     @Argument(index = 1, name = "egressDevice",
               description = "Egress Device/Port Description",
               required = true, multiValued = false)
+    @Completion(ConnectPointCompleter.class)
     String egressDeviceString = null;
 
     private boolean backup = false;
@@ -59,7 +64,7 @@
     private boolean useProtected = false;
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         IntentService service = get(IntentService.class);
 
         ConnectPoint ingress = ConnectPoint.deviceConnectPoint(ingressDeviceString);
diff --git a/cli/src/main/java/org/onosproject/cli/net/AddProtectedTransportIntentCommand.java b/cli/src/main/java/org/onosproject/cli/net/AddProtectedTransportIntentCommand.java
index 1254f41..ad8954e 100644
--- a/cli/src/main/java/org/onosproject/cli/net/AddProtectedTransportIntentCommand.java
+++ b/cli/src/main/java/org/onosproject/cli/net/AddProtectedTransportIntentCommand.java
@@ -17,9 +17,11 @@
 
 import java.util.Optional;
 
-import org.apache.karaf.shell.commands.Argument;
-import org.apache.karaf.shell.commands.Command;
-import org.apache.karaf.shell.commands.Option;
+import org.apache.karaf.shell.api.action.Argument;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.Completion;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
+import org.apache.karaf.shell.api.action.Option;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.net.DeviceId;
 import org.onosproject.net.intent.Intent;
@@ -30,6 +32,7 @@
 /**
  * Installs ProtectedTransportIntent.
  */
+@Service
 @Command(scope = "onos", name = "add-protected-transport",
          description = "Adds ProtectedTransportIntent")
 public class AddProtectedTransportIntentCommand
@@ -43,17 +46,19 @@
     @Argument(index = 0, name = "deviceId1",
             description = "First Device ID of protected path",
             required = true, multiValued = false)
+    @Completion(DeviceIdCompleter.class)
     private String deviceId1Str = null;
 
     @Argument(index = 1, name = "deviceId2",
             description = "Second Device ID of protected path",
             required = true, multiValued = false)
+    @Completion(DeviceIdCompleter.class)
     private String deviceId2Str = null;
 
     private IntentService intentService;
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         intentService = get(IntentService.class);
 
         DeviceId did1 = DeviceId.deviceId(deviceId1Str);
diff --git a/cli/src/main/java/org/onosproject/cli/net/AddSinglePointToMultiPointIntentCommand.java b/cli/src/main/java/org/onosproject/cli/net/AddSinglePointToMultiPointIntentCommand.java
index 9cb8fea..17f1072 100644
--- a/cli/src/main/java/org/onosproject/cli/net/AddSinglePointToMultiPointIntentCommand.java
+++ b/cli/src/main/java/org/onosproject/cli/net/AddSinglePointToMultiPointIntentCommand.java
@@ -15,8 +15,10 @@
  */
 package org.onosproject.cli.net;
 
-import org.apache.karaf.shell.commands.Argument;
-import org.apache.karaf.shell.commands.Command;
+import org.apache.karaf.shell.api.action.Argument;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.Completion;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.net.ConnectPoint;
 import org.onosproject.net.flow.TrafficSelector;
 import org.onosproject.net.flow.TrafficTreatment;
@@ -31,16 +33,18 @@
 /**
  * Installs connectivity intent between a single ingress device and multiple egress devices.
  */
+@Service
 @Command(scope = "onos", name = "add-single-to-multi-intent",
         description = "Installs connectivity intent between a single ingress device and multiple egress devices")
 public class AddSinglePointToMultiPointIntentCommand extends ConnectivityIntentCommand {
     @Argument(index = 0, name = "ingressDevice egressDevices",
             description = "ingressDevice/Port egressDevice/Port...egressDevice/Port",
             required = true, multiValued = true)
+    @Completion(ConnectPointCompleter.class)
     String[] deviceStrings = null;
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         IntentService service = get(IntentService.class);
 
         if (deviceStrings.length < 2) {
diff --git a/cli/src/main/java/org/onosproject/cli/net/AddTestFlowsCommand.java b/cli/src/main/java/org/onosproject/cli/net/AddTestFlowsCommand.java
index 004ebfa..05c4451 100644
--- a/cli/src/main/java/org/onosproject/cli/net/AddTestFlowsCommand.java
+++ b/cli/src/main/java/org/onosproject/cli/net/AddTestFlowsCommand.java
@@ -20,8 +20,9 @@
 import java.util.concurrent.TimeUnit;
 
 import org.apache.commons.lang.math.RandomUtils;
-import org.apache.karaf.shell.commands.Argument;
-import org.apache.karaf.shell.commands.Command;
+import org.apache.karaf.shell.api.action.Argument;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onlab.packet.MacAddress;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.core.ApplicationId;
@@ -51,6 +52,7 @@
 /**
  * Installs bulk flows.
  */
+@Service
 @Command(scope = "onos", name = "add-test-flows",
          description = "Installs a number of test flow rules - for testing only")
 public class AddTestFlowsCommand extends AbstractShellCommand {
@@ -68,7 +70,7 @@
     String numOfRuns = null;
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         FlowRuleService flowService = get(FlowRuleService.class);
         DeviceService deviceService = get(DeviceService.class);
         CoreService coreService = get(CoreService.class);
diff --git a/cli/src/main/java/org/onosproject/cli/net/AddTunnelCommand.java b/cli/src/main/java/org/onosproject/cli/net/AddTunnelCommand.java
index 35b5744..18c677f 100644
--- a/cli/src/main/java/org/onosproject/cli/net/AddTunnelCommand.java
+++ b/cli/src/main/java/org/onosproject/cli/net/AddTunnelCommand.java
@@ -15,8 +15,9 @@
  */
 package org.onosproject.cli.net;
 
-import org.apache.karaf.shell.commands.Argument;
-import org.apache.karaf.shell.commands.Command;
+import org.apache.karaf.shell.api.action.Argument;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.incubator.net.domain.IntentDomainId;
 import org.onosproject.incubator.net.domain.IntentDomainService;
@@ -28,6 +29,7 @@
 /**
  * Installs intent domain tunnel primitive.
  */
+@Service
 @Command(scope = "onos", name = "add-domain-tunnel",
          description = "Installs intent domain tunnel primitive")
 public class AddTunnelCommand extends AbstractShellCommand {
@@ -43,7 +45,7 @@
     String twoString = null;
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         IntentDomainService service = get(IntentDomainService.class);
 
         ConnectPoint one = ConnectPoint.deviceConnectPoint(oneString);
diff --git a/cli/src/main/java/org/onosproject/cli/net/AllocationsCommand.java b/cli/src/main/java/org/onosproject/cli/net/AllocationsCommand.java
index c228645..5e7b4fe 100644
--- a/cli/src/main/java/org/onosproject/cli/net/AllocationsCommand.java
+++ b/cli/src/main/java/org/onosproject/cli/net/AllocationsCommand.java
@@ -27,9 +27,11 @@
 
 import com.google.common.base.Strings;
 import com.google.common.collect.ImmutableSet;
-import org.apache.karaf.shell.commands.Argument;
-import org.apache.karaf.shell.commands.Command;
-import org.apache.karaf.shell.commands.Option;
+import org.apache.karaf.shell.api.action.Argument;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.Completion;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
+import org.apache.karaf.shell.api.action.Option;
 import org.onlab.packet.MplsLabel;
 import org.onlab.packet.VlanId;
 import org.onlab.util.Bandwidth;
@@ -51,6 +53,7 @@
 /**
  * Lists allocated resources.
  */
+@Service
 @Command(scope = "onos", name = "allocations",
          description = "Lists allocated resources")
 public class AllocationsCommand extends AbstractShellCommand {
@@ -71,10 +74,12 @@
 
     @Argument(index = 0, name = "deviceIdString", description = "Device ID",
               required = false, multiValued = false)
+    @Completion(DeviceIdCompleter.class)
     String deviceIdStr = null;
 
     @Argument(index = 1, name = "portNumberString", description = "PortNumber",
               required = false, multiValued = false)
+    @Completion(PortNumberCompleter.class)
     String portNumberStr = null;
 
 
@@ -83,7 +88,7 @@
     private ResourceService resourceService;
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         deviceService = get(DeviceService.class);
         resourceService = get(ResourceService.class);
 
diff --git a/cli/src/main/java/org/onosproject/cli/net/AnnotateDeviceCommand.java b/cli/src/main/java/org/onosproject/cli/net/AnnotateDeviceCommand.java
index 0680d59..b538db1 100644
--- a/cli/src/main/java/org/onosproject/cli/net/AnnotateDeviceCommand.java
+++ b/cli/src/main/java/org/onosproject/cli/net/AnnotateDeviceCommand.java
@@ -15,10 +15,13 @@
  */
 package org.onosproject.cli.net;
 
-import org.apache.karaf.shell.commands.Argument;
-import org.apache.karaf.shell.commands.Command;
-import org.apache.karaf.shell.commands.Option;
+import org.apache.karaf.shell.api.action.Argument;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.Completion;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
+import org.apache.karaf.shell.api.action.Option;
 import org.onosproject.cli.AbstractShellCommand;
+import org.onosproject.cli.net.completer.AnnotationKeysCompleter;
 import org.onosproject.net.DeviceId;
 import org.onosproject.net.config.NetworkConfigService;
 import org.onosproject.net.config.basics.DeviceAnnotationConfig;
@@ -27,6 +30,7 @@
 /**
  * Annotates network device model.
  */
+@Service
 @Command(scope = "onos", name = "annotate-device",
         description = "Annotates network model entities")
 public class AnnotateDeviceCommand extends AbstractShellCommand {
@@ -35,10 +39,12 @@
 
     @Argument(index = 0, name = "uri", description = "Device ID",
             required = true, multiValued = false)
+    @Completion(DeviceIdCompleter.class)
     String uri = null;
 
     @Argument(index = 1, name = "key", description = "Annotation key",
             required = true, multiValued = false)
+    @Completion(AnnotationKeysCompleter.class)
     String key = null;
 
     @Argument(index = 2, name = "value",
@@ -51,7 +57,7 @@
     private boolean removeCfg = false;
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         NetworkConfigService netcfgService = get(NetworkConfigService.class);
         DeviceId deviceId = DeviceId.deviceId(uri);
 
diff --git a/cli/src/main/java/org/onosproject/cli/net/AnnotateLinkCommand.java b/cli/src/main/java/org/onosproject/cli/net/AnnotateLinkCommand.java
index 382f354..3355dc3 100644
--- a/cli/src/main/java/org/onosproject/cli/net/AnnotateLinkCommand.java
+++ b/cli/src/main/java/org/onosproject/cli/net/AnnotateLinkCommand.java
@@ -18,10 +18,14 @@
 import static com.google.common.base.Preconditions.checkNotNull;
 import static org.onosproject.net.ConnectPoint.deviceConnectPoint;
 
-import org.apache.karaf.shell.commands.Argument;
-import org.apache.karaf.shell.commands.Command;
-import org.apache.karaf.shell.commands.Option;
+import org.apache.karaf.shell.api.action.Argument;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.Completion;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
+import org.apache.karaf.shell.api.action.Option;
 import org.onosproject.cli.AbstractShellCommand;
+import org.onosproject.cli.net.completer.AnnotationKeysCompleter;
+import org.onosproject.cli.net.completer.PeerConnectPointCompleter;
 import org.onosproject.net.ConnectPoint;
 import org.onosproject.net.DefaultAnnotations;
 import org.onosproject.net.Link;
@@ -36,6 +40,7 @@
 /**
  * Annotates network link model.
  */
+@Service
 @Command(scope = "onos", name = "annotate-link",
          description = "Annotates network model entities")
 public class AnnotateLinkCommand extends AbstractShellCommand {
@@ -48,16 +53,19 @@
 
     @Argument(index = 0, name = "srcConnectPoint", description = "source Connect Point",
             required = true, multiValued = false)
+    @Completion(ConnectPointCompleter.class)
     private String srcCp = null;
 
     @Argument(index = 1, name = "dstConnectPoint", description = "destination Connect Point",
             required = true, multiValued = false)
+    @Completion(PeerConnectPointCompleter.class)
     private String dstCp = null;
 
 
 
     @Argument(index = 2, name = "key", description = "Annotation key",
             required = true, multiValued = false)
+    @Completion(AnnotationKeysCompleter.class)
     private String key = null;
 
     @Argument(index = 3, name = "value",
@@ -67,7 +75,7 @@
 
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         LinkService service = get(LinkService.class);
         ConnectPoint src = deviceConnectPoint(srcCp);
         ConnectPoint dst = deviceConnectPoint(dstCp);
diff --git a/cli/src/main/java/org/onosproject/cli/net/AnnotatePortCommand.java b/cli/src/main/java/org/onosproject/cli/net/AnnotatePortCommand.java
index 6550bdc..bab4f16 100644
--- a/cli/src/main/java/org/onosproject/cli/net/AnnotatePortCommand.java
+++ b/cli/src/main/java/org/onosproject/cli/net/AnnotatePortCommand.java
@@ -15,10 +15,13 @@
  */
 package org.onosproject.cli.net;
 
-import org.apache.karaf.shell.commands.Argument;
-import org.apache.karaf.shell.commands.Command;
-import org.apache.karaf.shell.commands.Option;
+import org.apache.karaf.shell.api.action.Argument;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.Completion;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
+import org.apache.karaf.shell.api.action.Option;
 import org.onosproject.cli.AbstractShellCommand;
+import org.onosproject.cli.net.completer.AnnotationKeysCompleter;
 import org.onosproject.net.ConnectPoint;
 import org.onosproject.net.config.NetworkConfigService;
 import org.onosproject.net.config.basics.PortAnnotationConfig;
@@ -27,16 +30,19 @@
 /**
  * Annotates network device port model.
  */
+@Service
 @Command(scope = "onos", name = "annotate-port",
         description = "Annotates port entities")
 public class AnnotatePortCommand extends AbstractShellCommand {
 
     @Argument(index = 0, name = "port", description = "Device Port",
               required = true)
+    @Completion(ConnectPointCompleter.class)
     String port = null;
 
     @Argument(index = 1, name = "key", description = "Annotation key",
              required = false)
+    @Completion(AnnotationKeysCompleter.class)
     String key = null;
 
     @Argument(index = 2, name = "value",
@@ -49,7 +55,7 @@
     private boolean removeCfg = false;
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         DeviceService deviceService = get(DeviceService.class);
         NetworkConfigService netcfgService = get(NetworkConfigService.class);
 
diff --git a/cli/src/main/java/org/onosproject/cli/net/ClusterDevicesCommand.java b/cli/src/main/java/org/onosproject/cli/net/ClusterDevicesCommand.java
index b81e9c3..2380462 100644
--- a/cli/src/main/java/org/onosproject/cli/net/ClusterDevicesCommand.java
+++ b/cli/src/main/java/org/onosproject/cli/net/ClusterDevicesCommand.java
@@ -17,8 +17,10 @@
 
 import com.fasterxml.jackson.databind.ObjectMapper;
 import com.google.common.collect.Lists;
-import org.apache.karaf.shell.commands.Argument;
-import org.apache.karaf.shell.commands.Command;
+import org.apache.karaf.shell.api.action.Argument;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.Completion;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.utils.Comparators;
 import org.onosproject.net.DeviceId;
 import org.onosproject.net.topology.TopologyCluster;
@@ -32,16 +34,18 @@
 /**
  * Lists devices of the specified topology cluster in the current topology.
  */
+@Service
 @Command(scope = "onos", name = "topo-cluster-devices",
          description = "Lists devices of the specified topology cluster in the current topology")
 public class ClusterDevicesCommand extends ClustersListCommand {
 
     @Argument(index = 0, name = "id", description = "Cluster ID",
               required = true, multiValued = false)
+    @Completion(ClusterIdCompleter.class)
     String id = null;
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         int cid = Integer.parseInt(id);
         init();
         TopologyCluster cluster = service.getCluster(topology, clusterId(cid));
diff --git a/cli/src/main/java/org/onosproject/cli/net/ClusterIdCompleter.java b/cli/src/main/java/org/onosproject/cli/net/ClusterIdCompleter.java
index ed0c259..3ae21c3 100644
--- a/cli/src/main/java/org/onosproject/cli/net/ClusterIdCompleter.java
+++ b/cli/src/main/java/org/onosproject/cli/net/ClusterIdCompleter.java
@@ -15,8 +15,11 @@
  */
 package org.onosproject.cli.net;
 
-import org.apache.karaf.shell.console.Completer;
-import org.apache.karaf.shell.console.completer.StringsCompleter;
+import org.apache.karaf.shell.api.console.CommandLine;
+import org.apache.karaf.shell.api.console.Completer;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
+import org.apache.karaf.shell.api.console.Session;
+import org.apache.karaf.shell.support.completers.StringsCompleter;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.net.topology.Topology;
 import org.onosproject.net.topology.TopologyCluster;
@@ -28,9 +31,10 @@
 /**
  * Cluster ID completer.
  */
+@Service
 public class ClusterIdCompleter implements Completer {
     @Override
-    public int complete(String buffer, int cursor, List<String> candidates) {
+    public int complete(Session session, CommandLine commandLine, List<String> candidates) {
         // Delegate string completer
         StringsCompleter delegate = new StringsCompleter();
 
@@ -44,7 +48,7 @@
         }
 
         // Now let the completer do the work for figuring out what to offer.
-        return delegate.complete(buffer, cursor, candidates);
+        return delegate.complete(session, commandLine, candidates);
     }
 
 }
diff --git a/cli/src/main/java/org/onosproject/cli/net/ClusterLinksCommand.java b/cli/src/main/java/org/onosproject/cli/net/ClusterLinksCommand.java
index df6ab96..b3f3d42 100644
--- a/cli/src/main/java/org/onosproject/cli/net/ClusterLinksCommand.java
+++ b/cli/src/main/java/org/onosproject/cli/net/ClusterLinksCommand.java
@@ -15,8 +15,10 @@
  */
 package org.onosproject.cli.net;
 
-import org.apache.karaf.shell.commands.Argument;
-import org.apache.karaf.shell.commands.Command;
+import org.apache.karaf.shell.api.action.Argument;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.Completion;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.net.Link;
 import org.onosproject.net.topology.TopologyCluster;
 
@@ -27,16 +29,18 @@
 /**
  * Lists links of the specified topology cluster in the current topology.
  */
+@Service
 @Command(scope = "onos", name = "topo-cluster-links",
          description = "Lists links of the specified topology cluster in the current topology")
 public class ClusterLinksCommand extends ClustersListCommand {
 
     @Argument(index = 0, name = "id", description = "Cluster ID",
               required = true, multiValued = false)
+    @Completion(ClusterIdCompleter.class)
     String id = null;
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         int cid = Integer.parseInt(id);
         init();
         TopologyCluster cluster = service.getCluster(topology, clusterId(cid));
diff --git a/cli/src/main/java/org/onosproject/cli/net/ClustersListCommand.java b/cli/src/main/java/org/onosproject/cli/net/ClustersListCommand.java
index 7721d10..b4b5540 100644
--- a/cli/src/main/java/org/onosproject/cli/net/ClustersListCommand.java
+++ b/cli/src/main/java/org/onosproject/cli/net/ClustersListCommand.java
@@ -19,7 +19,8 @@
 import com.fasterxml.jackson.databind.ObjectMapper;
 import com.fasterxml.jackson.databind.node.ArrayNode;
 import com.google.common.collect.Lists;
-import org.apache.karaf.shell.commands.Command;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.utils.Comparators;
 import org.onosproject.net.topology.TopologyCluster;
 
@@ -29,6 +30,7 @@
 /**
  * Lists all clusters in the current topology.
  */
+@Service
 @Command(scope = "onos", name = "topo-clusters",
          description = "Lists all clusters in the current topology")
 public class ClustersListCommand extends TopologyCommand {
@@ -37,7 +39,7 @@
             "id=%d, devices=%d, links=%d";
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         init();
         List<TopologyCluster> clusters = Lists.newArrayList(service.getClusters(topology));
         Collections.sort(clusters, Comparators.CLUSTER_COMPARATOR);
diff --git a/cli/src/main/java/org/onosproject/cli/net/ConfigureLinkCommand.java b/cli/src/main/java/org/onosproject/cli/net/ConfigureLinkCommand.java
index 1607ab3..89b2e48 100644
--- a/cli/src/main/java/org/onosproject/cli/net/ConfigureLinkCommand.java
+++ b/cli/src/main/java/org/onosproject/cli/net/ConfigureLinkCommand.java
@@ -19,10 +19,13 @@
 
 import java.util.Optional;
 
-import org.apache.karaf.shell.commands.Argument;
-import org.apache.karaf.shell.commands.Command;
-import org.apache.karaf.shell.commands.Option;
+import org.apache.karaf.shell.api.action.Argument;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.Completion;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
+import org.apache.karaf.shell.api.action.Option;
 import org.onosproject.cli.AbstractShellCommand;
+import org.onosproject.cli.net.completer.PeerConnectPointCompleter;
 import org.onosproject.net.ConnectPoint;
 import org.onosproject.net.Link;
 import org.onosproject.net.LinkKey;
@@ -33,16 +36,19 @@
 /**
  * Add Link configuration.
  */
+@Service
 @Command(scope = "onos", name = "config-link",
          description = "Configure link.")
 public class ConfigureLinkCommand extends AbstractShellCommand {
 
     @Argument(index = 0, name = "src", description = "src port",
             required = true, multiValued = false)
+    @Completion(ConnectPointCompleter.class)
     String src = null;
 
     @Argument(index = 1, name = "dst", description = "dst port",
             required = true, multiValued = false)
+    @Completion(PeerConnectPointCompleter.class)
     String dst = null;
 
     @Option(name = "--type",
@@ -71,7 +77,7 @@
 
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         DeviceService deviceService = get(DeviceService.class);
         NetworkConfigService netCfgService = get(NetworkConfigService.class);
 
diff --git a/cli/src/main/java/org/onosproject/cli/net/ConnectPointCompleter.java b/cli/src/main/java/org/onosproject/cli/net/ConnectPointCompleter.java
index ab230c1..dfc76a7 100644
--- a/cli/src/main/java/org/onosproject/cli/net/ConnectPointCompleter.java
+++ b/cli/src/main/java/org/onosproject/cli/net/ConnectPointCompleter.java
@@ -15,8 +15,11 @@
  */
 package org.onosproject.cli.net;
 
-import org.apache.karaf.shell.console.Completer;
-import org.apache.karaf.shell.console.completer.StringsCompleter;
+import org.apache.karaf.shell.api.console.CommandLine;
+import org.apache.karaf.shell.api.console.Completer;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
+import org.apache.karaf.shell.api.console.Session;
+import org.apache.karaf.shell.support.completers.StringsCompleter;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.net.Device;
 import org.onosproject.net.Port;
@@ -28,9 +31,10 @@
 /**
  * ConnectPoint completer.
  */
+@Service
 public class ConnectPointCompleter implements Completer {
     @Override
-    public int complete(String buffer, int cursor, List<String> candidates) {
+    public int complete(Session session, CommandLine commandLine, List<String> candidates) {
         // Delegate string completer
         StringsCompleter delegate = new StringsCompleter();
 
@@ -48,7 +52,7 @@
         }
 
         // Now let the completer do the work for figuring out what to offer.
-        return delegate.complete(buffer, cursor, candidates);
+        return delegate.complete(session, commandLine, candidates);
     }
 
 }
diff --git a/cli/src/main/java/org/onosproject/cli/net/ConnectivityIntentCommand.java b/cli/src/main/java/org/onosproject/cli/net/ConnectivityIntentCommand.java
index 679a0af..43961f3 100644
--- a/cli/src/main/java/org/onosproject/cli/net/ConnectivityIntentCommand.java
+++ b/cli/src/main/java/org/onosproject/cli/net/ConnectivityIntentCommand.java
@@ -15,7 +15,8 @@
  */
 package org.onosproject.cli.net;
 
-import org.apache.karaf.shell.commands.Option;
+import org.apache.karaf.shell.api.action.Completion;
+import org.apache.karaf.shell.api.action.Option;
 import org.onlab.packet.Ip6Address;
 import org.onlab.packet.IpAddress;
 import org.onlab.packet.IpPrefix;
@@ -24,6 +25,7 @@
 import org.onlab.packet.VlanId;
 import org.onlab.util.Bandwidth;
 import org.onosproject.cli.AbstractShellCommand;
+import org.onosproject.cli.app.AllApplicationNamesCompleter;
 import org.onosproject.core.ApplicationId;
 import org.onosproject.core.CoreService;
 import org.onosproject.net.EncapsulationType;
@@ -67,6 +69,7 @@
 
     @Option(name = "-t", aliases = "--ethType", description = "Ethernet Type",
             required = false, multiValued = false)
+    @Completion(EthTypeCompleter.class)
     private String ethTypeString = null;
 
     @Option(name = "-v", aliases = "--vlan", description = "VLAN ID",
@@ -75,6 +78,7 @@
 
     @Option(name = "--ipProto", description = "IP Protocol",
             required = false, multiValued = false)
+    @Completion(IpProtocolCompleter.class)
     private String ipProtoString = null;
 
     @Option(name = "--ipSrc", description = "Source IP Prefix",
@@ -91,10 +95,12 @@
 
     @Option(name = "--icmp6Type", description = "ICMPv6 Type",
             required = false, multiValued = false)
+    @Completion(Icmp6TypeCompleter.class)
     private String icmp6TypeString = null;
 
     @Option(name = "--icmp6Code", description = "ICMPv6 Code",
             required = false, multiValued = false)
+    @Completion(Icmp6CodeCompleter.class)
     private String icmp6CodeString = null;
 
     @Option(name = "--ndTarget", description = "IPv6 Neighbor Discovery Target Address",
@@ -119,10 +125,12 @@
 
     @Option(name = "--extHdr", description = "IPv6 Extension Header Pseudo-field",
             required = false, multiValued = true)
+    @Completion(ExtHeaderCompleter.class)
     private List<String> extHdrStringList = null;
 
     @Option(name = "-a", aliases = "--appId", description = "Application Id",
             required = false, multiValued = false)
+    @Completion(AllApplicationNamesCompleter.class)
     private String appId = null;
 
     @Option(name = "-k", aliases = "--key", description = "Intent Key",
@@ -180,6 +188,7 @@
 
     @Option(name = "-e", aliases = "--encapsulation", description = "Encapsulation type",
             required = false, multiValued = false)
+    @Completion(EncapTypeCompleter.class)
     private String encapsulationString = null;
 
     @Option(name = "--hashed", description = "Hashed path selection",
diff --git a/cli/src/main/java/org/onosproject/cli/net/CounterCommand.java b/cli/src/main/java/org/onosproject/cli/net/CounterCommand.java
index ca71ca7..a3d0f35 100644
--- a/cli/src/main/java/org/onosproject/cli/net/CounterCommand.java
+++ b/cli/src/main/java/org/onosproject/cli/net/CounterCommand.java
@@ -15,8 +15,9 @@
  */
 package org.onosproject.cli.net;
 
-import org.apache.karaf.shell.commands.Argument;
-import org.apache.karaf.shell.commands.Command;
+import org.apache.karaf.shell.api.action.Argument;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.store.service.AtomicCounter;
 import org.onosproject.store.service.StorageService;
@@ -27,6 +28,7 @@
 /**
  * Command to display the current value of a atomic counter.
  */
+@Service
 @Command(scope = "onos", name = "counter",
         description = "Displays the current value of a atomic counter")
 public class CounterCommand extends AbstractShellCommand {
@@ -36,7 +38,7 @@
     String name = null;
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         StorageService storageService = get(StorageService.class);
         AtomicCounter counter = storageService.getAtomicCounter(name);
 
diff --git a/cli/src/main/java/org/onosproject/cli/net/CountersListCommand.java b/cli/src/main/java/org/onosproject/cli/net/CountersListCommand.java
index 51a13a7..02b1a76 100644
--- a/cli/src/main/java/org/onosproject/cli/net/CountersListCommand.java
+++ b/cli/src/main/java/org/onosproject/cli/net/CountersListCommand.java
@@ -17,7 +17,8 @@
 
 import java.util.Map;
 
-import org.apache.karaf.shell.commands.Command;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.store.service.StorageAdminService;
 
@@ -27,6 +28,7 @@
 /**
  * Command to list the various counters in the system.
  */
+@Service
 @Command(scope = "onos", name = "counters",
         description = "Lists information about atomic counters in the system")
 public class CountersListCommand extends AbstractShellCommand {
@@ -34,7 +36,7 @@
     private static final String FMT = "name=%s value=%d";
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         StorageAdminService storageAdminService = get(StorageAdminService.class);
         Map<String, Long> counters = storageAdminService.getCounters();
         if (outputJson()) {
diff --git a/cli/src/main/java/org/onosproject/cli/net/DeviceControllersCommand.java b/cli/src/main/java/org/onosproject/cli/net/DeviceControllersCommand.java
index 1231da5..0a25b37 100644
--- a/cli/src/main/java/org/onosproject/cli/net/DeviceControllersCommand.java
+++ b/cli/src/main/java/org/onosproject/cli/net/DeviceControllersCommand.java
@@ -15,8 +15,10 @@
  */
 package org.onosproject.cli.net;
 
-import org.apache.karaf.shell.commands.Argument;
-import org.apache.karaf.shell.commands.Command;
+import org.apache.karaf.shell.api.action.Argument;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.Completion;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.net.DeviceId;
 import org.onosproject.net.behaviour.ControllerConfig;
@@ -26,17 +28,19 @@
 /**
  * Sets role of the controller node for the given infrastructure device.
  */
+@Service
 @Command(scope = "onos", name = "device-controllers",
         description = "gets the list of controllers for the given infrastructure device")
 public class DeviceControllersCommand extends AbstractShellCommand {
 
     @Argument(index = 0, name = "uri", description = "Device ID",
             required = true, multiValued = false)
+    @Completion(DeviceIdCompleter.class)
     String uri = null;
     private DeviceId deviceId;
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         DriverService service = get(DriverService.class);
         deviceId = DeviceId.deviceId(uri);
         DriverHandler h = service.createHandler(deviceId);
diff --git a/cli/src/main/java/org/onosproject/cli/net/DeviceIdCompleter.java b/cli/src/main/java/org/onosproject/cli/net/DeviceIdCompleter.java
index 4ecf264..a0080cd 100644
--- a/cli/src/main/java/org/onosproject/cli/net/DeviceIdCompleter.java
+++ b/cli/src/main/java/org/onosproject/cli/net/DeviceIdCompleter.java
@@ -15,8 +15,11 @@
  */
 package org.onosproject.cli.net;
 
-import org.apache.karaf.shell.console.Completer;
-import org.apache.karaf.shell.console.completer.StringsCompleter;
+import org.apache.karaf.shell.api.console.CommandLine;
+import org.apache.karaf.shell.api.console.Completer;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
+import org.apache.karaf.shell.api.console.Session;
+import org.apache.karaf.shell.support.completers.StringsCompleter;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.net.Device;
 import org.onosproject.net.device.DeviceService;
@@ -28,9 +31,10 @@
 /**
  * Device ID completer.
  */
+@Service
 public class DeviceIdCompleter implements Completer {
     @Override
-    public int complete(String buffer, int cursor, List<String> candidates) {
+    public int complete(Session session, CommandLine commandLine, List<String> candidates) {
         // Delegate string completer
         StringsCompleter delegate = new StringsCompleter();
 
@@ -43,7 +47,7 @@
         }
 
         // Now let the completer do the work for figuring out what to offer.
-        return delegate.complete(buffer, cursor, candidates);
+        return delegate.complete(session, commandLine, candidates);
     }
 
 }
diff --git a/cli/src/main/java/org/onosproject/cli/net/DeviceInterfaceAddCommand.java b/cli/src/main/java/org/onosproject/cli/net/DeviceInterfaceAddCommand.java
index c28e190..e2a2503 100644
--- a/cli/src/main/java/org/onosproject/cli/net/DeviceInterfaceAddCommand.java
+++ b/cli/src/main/java/org/onosproject/cli/net/DeviceInterfaceAddCommand.java
@@ -15,9 +15,11 @@
  */
 package org.onosproject.cli.net;
 
-import org.apache.karaf.shell.commands.Argument;
-import org.apache.karaf.shell.commands.Command;
-import org.apache.karaf.shell.commands.Option;
+import org.apache.karaf.shell.api.action.Argument;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.Completion;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
+import org.apache.karaf.shell.api.action.Option;
 import org.onlab.packet.VlanId;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.net.DeviceId;
@@ -31,6 +33,7 @@
 /**
  * Configures a device interface.
  */
+@Service
 @Command(scope = "onos", name = "device-add-interface",
          description = "Configures a device interface")
 public class DeviceInterfaceAddCommand extends AbstractShellCommand {
@@ -52,6 +55,7 @@
 
     @Argument(index = 0, name = "uri", description = "Device ID",
             required = true, multiValued = false)
+    @Completion(DeviceIdCompleter.class)
     private String uri = null;
 
     @Argument(index = 1, name = "interface",
@@ -75,7 +79,7 @@
     private String accessVlanString = null;
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         DriverService service = get(DriverService.class);
         DeviceId deviceId = DeviceId.deviceId(uri);
         DriverHandler h = service.createHandler(deviceId);
diff --git a/cli/src/main/java/org/onosproject/cli/net/DeviceInterfaceRemoveCommand.java b/cli/src/main/java/org/onosproject/cli/net/DeviceInterfaceRemoveCommand.java
index 76262af..527e133 100644
--- a/cli/src/main/java/org/onosproject/cli/net/DeviceInterfaceRemoveCommand.java
+++ b/cli/src/main/java/org/onosproject/cli/net/DeviceInterfaceRemoveCommand.java
@@ -15,9 +15,11 @@
  */
 package org.onosproject.cli.net;
 
-import org.apache.karaf.shell.commands.Argument;
-import org.apache.karaf.shell.commands.Command;
-import org.apache.karaf.shell.commands.Option;
+import org.apache.karaf.shell.api.action.Argument;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.Completion;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
+import org.apache.karaf.shell.api.action.Option;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.net.DeviceId;
 import org.onosproject.net.behaviour.InterfaceConfig;
@@ -27,6 +29,7 @@
 /**
  * Removes an interface configurion from a device.
  */
+@Service
 @Command(scope = "onos", name = "device-remove-interface",
          description = "Removes an interface configuration from a device")
 public class DeviceInterfaceRemoveCommand extends AbstractShellCommand {
@@ -48,6 +51,7 @@
 
     @Argument(index = 0, name = "uri", description = "Device ID",
             required = true, multiValued = false)
+    @Completion(DeviceIdCompleter.class)
     private String uri = null;
 
     @Argument(index = 1, name = "interface",
@@ -71,7 +75,7 @@
     private boolean accessMode = false;
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         DriverService service = get(DriverService.class);
         DeviceId deviceId = DeviceId.deviceId(uri);
         DriverHandler h = service.createHandler(deviceId);
diff --git a/cli/src/main/java/org/onosproject/cli/net/DeviceInterfacesListCommand.java b/cli/src/main/java/org/onosproject/cli/net/DeviceInterfacesListCommand.java
index 0e9de93..a617058 100644
--- a/cli/src/main/java/org/onosproject/cli/net/DeviceInterfacesListCommand.java
+++ b/cli/src/main/java/org/onosproject/cli/net/DeviceInterfacesListCommand.java
@@ -16,8 +16,10 @@
 
 package org.onosproject.cli.net;
 
-import org.apache.karaf.shell.commands.Argument;
-import org.apache.karaf.shell.commands.Command;
+import org.apache.karaf.shell.api.action.Argument;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.Completion;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.net.Device;
 import org.onosproject.net.behaviour.InterfaceConfig;
 import org.onosproject.net.device.DeviceInterfaceDescription;
@@ -32,6 +34,7 @@
 /**
  * Lists all interfaces or interfaces of a device.
  */
+@Service
 @Command(scope = "onos", name = "device-interfaces",
         description = "Lists all interfaces or interfaces of a device.")
 public class DeviceInterfacesListCommand extends DevicesListCommand {
@@ -47,10 +50,11 @@
 
     @Argument(index = 0, name = "uri", description = "Device ID",
             required = false, multiValued = false)
+    @Completion(DeviceIdCompleter.class)
     private String uri = null;
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         DeviceService deviceService = get(DeviceService.class);
         DriverService driverService = get(DriverService.class);
 
diff --git a/cli/src/main/java/org/onosproject/cli/net/DeviceKeyAddCommand.java b/cli/src/main/java/org/onosproject/cli/net/DeviceKeyAddCommand.java
index 44bc483..fc15cfb 100644
--- a/cli/src/main/java/org/onosproject/cli/net/DeviceKeyAddCommand.java
+++ b/cli/src/main/java/org/onosproject/cli/net/DeviceKeyAddCommand.java
@@ -16,9 +16,10 @@
 
 package org.onosproject.cli.net;
 
-import org.apache.karaf.shell.commands.Argument;
-import org.apache.karaf.shell.commands.Command;
-import org.apache.karaf.shell.commands.Option;
+import org.apache.karaf.shell.api.action.Argument;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
+import org.apache.karaf.shell.api.action.Option;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.net.key.DeviceKey;
 import org.onosproject.net.key.DeviceKeyAdminService;
@@ -27,6 +28,7 @@
 /**
  * Adds a device key.
  */
+@Service
 @Command(scope = "onos", name = "device-key-add",
         description = "Adds a device key. Adding a new device key with " +
                 "the same id will replace the existing device key.")
@@ -62,7 +64,7 @@
     String password = null;
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         DeviceKeyAdminService service = get(DeviceKeyAdminService.class);
         DeviceKey deviceKey = null;
         if (type.equalsIgnoreCase(COMMUNITY_NAME)) {
diff --git a/cli/src/main/java/org/onosproject/cli/net/DeviceKeyListCommand.java b/cli/src/main/java/org/onosproject/cli/net/DeviceKeyListCommand.java
index 98ac00e..dc1007e 100644
--- a/cli/src/main/java/org/onosproject/cli/net/DeviceKeyListCommand.java
+++ b/cli/src/main/java/org/onosproject/cli/net/DeviceKeyListCommand.java
@@ -16,7 +16,8 @@
 
 package org.onosproject.cli.net;
 
-import org.apache.karaf.shell.commands.Command;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.utils.Comparators;
 import org.onosproject.net.key.DeviceKey;
@@ -30,6 +31,7 @@
 /**
  * Lists all device keys.
  */
+@Service
 @Command(scope = "onos", name = "device-keys",
         description = "Lists all device keys")
 
@@ -40,7 +42,7 @@
             "identifier=%s, type=%s, username=%s, password=%s";
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         DeviceKeyService service = get(DeviceKeyService.class);
         for (DeviceKey deviceKey : getSortedDeviceKeys(service)) {
             printDeviceKey(deviceKey);
diff --git a/cli/src/main/java/org/onosproject/cli/net/DeviceKeyRemoveCommand.java b/cli/src/main/java/org/onosproject/cli/net/DeviceKeyRemoveCommand.java
index 31d9131..650f1e6 100644
--- a/cli/src/main/java/org/onosproject/cli/net/DeviceKeyRemoveCommand.java
+++ b/cli/src/main/java/org/onosproject/cli/net/DeviceKeyRemoveCommand.java
@@ -16,8 +16,9 @@
 
 package org.onosproject.cli.net;
 
-import org.apache.karaf.shell.commands.Argument;
-import org.apache.karaf.shell.commands.Command;
+import org.apache.karaf.shell.api.action.Argument;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.net.key.DeviceKeyAdminService;
 import org.onosproject.net.key.DeviceKeyId;
@@ -25,6 +26,7 @@
 /**
  * Removes a device key.
  */
+@Service
 @Command(scope = "onos", name = "device-key-remove",
         description = "Removes a device key")
 
@@ -35,7 +37,7 @@
     String id = null;
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         DeviceKeyAdminService service = get(DeviceKeyAdminService.class);
         service.removeKey(DeviceKeyId.deviceKeyId(id));
     }
diff --git a/cli/src/main/java/org/onosproject/cli/net/DevicePortStateCommand.java b/cli/src/main/java/org/onosproject/cli/net/DevicePortStateCommand.java
index 7cd177f..543bffb 100644
--- a/cli/src/main/java/org/onosproject/cli/net/DevicePortStateCommand.java
+++ b/cli/src/main/java/org/onosproject/cli/net/DevicePortStateCommand.java
@@ -15,8 +15,10 @@
  */
 package org.onosproject.cli.net;
 
-import org.apache.karaf.shell.commands.Argument;
-import org.apache.karaf.shell.commands.Command;
+import org.apache.karaf.shell.api.action.Argument;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.Completion;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.net.Device;
 import org.onosproject.net.DeviceId;
@@ -28,24 +30,28 @@
 /**
  * Administratively enables or disabled a port on a device.
  */
+@Service
 @Command(scope = "onos", name = "portstate",
          description = "Administratively enables or disabled a port on a device")
 public class DevicePortStateCommand extends AbstractShellCommand {
     @Argument(index = 0, name = "uri", description = "Device ID",
             required = true, multiValued = false)
+    @Completion(DeviceIdCompleter.class)
     String uri = null;
 
     @Argument(index = 1, name = "portNumber", description = "Port Number",
             required = true, multiValued = false)
+    @Completion(PortNumberCompleter.class)
     String portNumber = null;
 
     @Argument(index = 2, name = "portState",
             description = "Desired State. Either \"enable\" or \"disable\".",
             required = true, multiValued = false)
+    @Completion(PortStateCompleter.class)
     String portState = null;
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         DeviceService deviceService = get(DeviceService.class);
         DeviceAdminService deviceAdminService = get(DeviceAdminService.class);
         Device dev = deviceService.getDevice(DeviceId.deviceId(uri));
diff --git a/cli/src/main/java/org/onosproject/cli/net/DevicePortStatsCommand.java b/cli/src/main/java/org/onosproject/cli/net/DevicePortStatsCommand.java
index 18413a7..8105bff 100644
--- a/cli/src/main/java/org/onosproject/cli/net/DevicePortStatsCommand.java
+++ b/cli/src/main/java/org/onosproject/cli/net/DevicePortStatsCommand.java
@@ -23,9 +23,11 @@
 import java.util.concurrent.TimeUnit;
 
 import com.google.common.collect.Lists;
-import org.apache.karaf.shell.commands.Argument;
-import org.apache.karaf.shell.commands.Command;
-import org.apache.karaf.shell.commands.Option;
+import org.apache.karaf.shell.api.action.Argument;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.Completion;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
+import org.apache.karaf.shell.api.action.Option;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.net.Device;
 import org.onosproject.net.DeviceId;
@@ -36,6 +38,7 @@
 /**
  * Lists port statistic of all ports in the system.
  */
+@Service
 @Command(scope = "onos", name = "portstats",
         description = "Lists statistics of all ports in the system")
 public class DevicePortStatsCommand extends AbstractShellCommand {
@@ -58,10 +61,12 @@
 
     @Argument(index = 0, name = "uri", description = "Device ID",
             required = false, multiValued = false)
+    @Completion(DeviceIdCompleter.class)
     String uri = null;
 
     @Argument(index = 1, name = "portNumber", description = "Port Number",
             required = false, multiValued = false)
+    @Completion(PortNumberCompleter.class)
     String portNumberStr = null;
 
     PortNumber portNumber = null;
@@ -70,7 +75,7 @@
             "   port=%s, pktRx=%s, pktTx=%s, bytesRx=%s, bytesTx=%s, pktRxDrp=%s, pktTxDrp=%s, Dur=%s%s";
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         DeviceService deviceService = get(DeviceService.class);
 
         if (portNumberStr != null) {
diff --git a/cli/src/main/java/org/onosproject/cli/net/DevicePortsListCommand.java b/cli/src/main/java/org/onosproject/cli/net/DevicePortsListCommand.java
index c96bab2..86887f7 100644
--- a/cli/src/main/java/org/onosproject/cli/net/DevicePortsListCommand.java
+++ b/cli/src/main/java/org/onosproject/cli/net/DevicePortsListCommand.java
@@ -19,9 +19,11 @@
 import com.fasterxml.jackson.databind.ObjectMapper;
 import com.fasterxml.jackson.databind.node.ArrayNode;
 import com.fasterxml.jackson.databind.node.ObjectNode;
-import org.apache.karaf.shell.commands.Argument;
-import org.apache.karaf.shell.commands.Command;
-import org.apache.karaf.shell.commands.Option;
+import org.apache.karaf.shell.api.action.Argument;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.Completion;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
+import org.apache.karaf.shell.api.action.Option;
 import org.onosproject.utils.Comparators;
 import org.onosproject.net.Device;
 import org.onosproject.net.Port;
@@ -35,6 +37,7 @@
 /**
  * Lists all ports or all ports of a device.
  */
+@Service
 @Command(scope = "onos", name = "ports",
          description = "Lists all ports or all ports of a device")
 public class DevicePortsListCommand extends DevicesListCommand {
@@ -43,6 +46,7 @@
 
     @Option(name = "-e", aliases = "--enabled", description = "Show only enabled ports",
             required = false, multiValued = false)
+    @Completion(DeviceIdCompleter.class)
     private boolean enabled = false;
 
     @Option(name = "-d", aliases = "--disabled", description = "Show only disabled ports",
@@ -51,10 +55,11 @@
 
     @Argument(index = 0, name = "uri", description = "Device ID",
               required = false, multiValued = false)
+    @Completion(DeviceIdCompleter.class)
     protected String uri = null;
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         DeviceService service = get(DeviceService.class);
         if (uri == null) {
             if (outputJson()) {
diff --git a/cli/src/main/java/org/onosproject/cli/net/DeviceRemoveCommand.java b/cli/src/main/java/org/onosproject/cli/net/DeviceRemoveCommand.java
index 83cd43f..4152312 100644
--- a/cli/src/main/java/org/onosproject/cli/net/DeviceRemoveCommand.java
+++ b/cli/src/main/java/org/onosproject/cli/net/DeviceRemoveCommand.java
@@ -15,8 +15,10 @@
  */
 package org.onosproject.cli.net;
 
-import org.apache.karaf.shell.commands.Argument;
-import org.apache.karaf.shell.commands.Command;
+import org.apache.karaf.shell.api.action.Argument;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.Completion;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.net.DeviceId;
 import org.onosproject.net.device.DeviceAdminService;
@@ -24,16 +26,18 @@
 /**
  * Removes an infrastructure device.
  */
+@Service
 @Command(scope = "onos", name = "device-remove",
          description = "Removes an infrastructure device")
 public class DeviceRemoveCommand extends AbstractShellCommand {
 
     @Argument(index = 0, name = "uri", description = "Device ID",
               required = true, multiValued = false)
+    @Completion(DeviceIdCompleter.class)
     String uri = null;
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         try {
             get(DeviceAdminService.class).removeDevice(DeviceId.deviceId(uri));
         } catch (IllegalStateException e) {
diff --git a/cli/src/main/java/org/onosproject/cli/net/DeviceRoleCommand.java b/cli/src/main/java/org/onosproject/cli/net/DeviceRoleCommand.java
index 7a2a430..03d5f26 100644
--- a/cli/src/main/java/org/onosproject/cli/net/DeviceRoleCommand.java
+++ b/cli/src/main/java/org/onosproject/cli/net/DeviceRoleCommand.java
@@ -15,9 +15,12 @@
  */
 package org.onosproject.cli.net;
 
-import org.apache.karaf.shell.commands.Argument;
-import org.apache.karaf.shell.commands.Command;
+import org.apache.karaf.shell.api.action.Argument;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.Completion;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.cli.AbstractShellCommand;
+import org.onosproject.cli.NodeIdCompleter;
 import org.onosproject.cluster.NodeId;
 import org.onosproject.mastership.MastershipAdminService;
 import org.onosproject.net.MastershipRole;
@@ -29,24 +32,28 @@
 /**
  * Sets role of the controller node for the given infrastructure device.
  */
+@Service
 @Command(scope = "onos", name = "device-role",
          description = "Sets role of the controller node for the given infrastructure device")
 public class DeviceRoleCommand extends AbstractShellCommand {
 
     @Argument(index = 0, name = "uri", description = "Device ID",
               required = true, multiValued = false)
+    @Completion(DeviceIdCompleter.class)
     String uri = null;
 
     @Argument(index = 1, name = "node", description = "Node ID",
               required = true, multiValued = false)
+    @Completion(NodeIdCompleter.class)
     String node = null;
 
     @Argument(index = 2, name = "role", description = "Mastership role",
               required = true, multiValued = false)
+    @Completion(RoleCompleter.class)
     String role = null;
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         MastershipAdminService service = get(MastershipAdminService.class);
         MastershipRole mastershipRole = MastershipRole.valueOf(role.toUpperCase());
         Futures.getUnchecked(service.setRole(new NodeId(node), deviceId(uri), mastershipRole));
diff --git a/cli/src/main/java/org/onosproject/cli/net/DeviceSetControllersCommand.java b/cli/src/main/java/org/onosproject/cli/net/DeviceSetControllersCommand.java
index e8d3201..dc20afa 100644
--- a/cli/src/main/java/org/onosproject/cli/net/DeviceSetControllersCommand.java
+++ b/cli/src/main/java/org/onosproject/cli/net/DeviceSetControllersCommand.java
@@ -16,9 +16,11 @@
 
 package org.onosproject.cli.net;
 
-import org.apache.karaf.shell.commands.Argument;
-import org.apache.karaf.shell.commands.Command;
-import org.apache.karaf.shell.commands.Option;
+import org.apache.karaf.shell.api.action.Argument;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.Completion;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
+import org.apache.karaf.shell.api.action.Option;
 import org.onlab.packet.IpAddress;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.net.Annotations;
@@ -36,12 +38,14 @@
 /**
  * Sets role of the controller node for the given infrastructure device.
  */
+@Service
 @Command(scope = "onos", name = "device-setcontrollers",
         description = "sets the list of controllers for the given infrastructure device")
 public class DeviceSetControllersCommand extends AbstractShellCommand {
 
     @Argument(index = 0, name = "uri", description = "Device ID",
             required = true, multiValued = false)
+    @Completion(DeviceIdCompleter.class)
     String uri = null;
 
     @Argument(index = 1, name = "controllersListStrings", description = "list of " +
@@ -62,7 +66,7 @@
     private List<ControllerInfo> controllers = new ArrayList<>();
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
 
         if (controllersListStrings == null && !removeCont && !removeAll) {
             print("No controller are given, skipping.");
diff --git a/cli/src/main/java/org/onosproject/cli/net/DevicesListCommand.java b/cli/src/main/java/org/onosproject/cli/net/DevicesListCommand.java
index 4b95f0f..cf90604 100644
--- a/cli/src/main/java/org/onosproject/cli/net/DevicesListCommand.java
+++ b/cli/src/main/java/org/onosproject/cli/net/DevicesListCommand.java
@@ -19,8 +19,9 @@
 import com.fasterxml.jackson.databind.ObjectMapper;
 import com.fasterxml.jackson.databind.node.ArrayNode;
 import com.google.common.collect.ImmutableSet;
-import org.apache.karaf.shell.commands.Command;
-import org.apache.karaf.shell.commands.Option;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
+import org.apache.karaf.shell.api.action.Option;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.net.AnnotationKeys;
 import org.onosproject.net.Device;
@@ -36,6 +37,7 @@
 /**
  * Lists all infrastructure devices.
  */
+@Service
 @Command(scope = "onos", name = "devices",
         description = "Lists all infrastructure devices")
 public class DevicesListCommand extends AbstractShellCommand {
@@ -52,7 +54,7 @@
     private boolean shortOnly = false;
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         DeviceService deviceService = get(DeviceService.class);
         if (outputJson()) {
             print("%s", json(getSortedDevices(deviceService)));
diff --git a/cli/src/main/java/org/onosproject/cli/net/DomainIdCompleter.java b/cli/src/main/java/org/onosproject/cli/net/DomainIdCompleter.java
index 7f0dc8f..324fbb0 100644
--- a/cli/src/main/java/org/onosproject/cli/net/DomainIdCompleter.java
+++ b/cli/src/main/java/org/onosproject/cli/net/DomainIdCompleter.java
@@ -15,8 +15,11 @@
  */
 package org.onosproject.cli.net;
 
-import org.apache.karaf.shell.console.Completer;
-import org.apache.karaf.shell.console.completer.StringsCompleter;
+import org.apache.karaf.shell.api.console.CommandLine;
+import org.apache.karaf.shell.api.console.Completer;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
+import org.apache.karaf.shell.api.console.Session;
+import org.apache.karaf.shell.support.completers.StringsCompleter;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.net.domain.DomainId;
 import org.onosproject.net.domain.DomainService;
@@ -28,10 +31,11 @@
 /**
  * Domain ID completer.
  */
+@Service
 public class DomainIdCompleter implements Completer {
 
     @Override
-    public int complete(String buffer, int cursor, List<String> candidates) {
+    public int complete(Session session, CommandLine commandLine, List<String> candidates) {
         // Delegate string completer
         StringsCompleter delegate = new StringsCompleter();
 
@@ -44,6 +48,6 @@
         }
 
         // Now let the completer do the work for figuring out what to offer.
-        return delegate.complete(buffer, cursor, candidates);
+        return delegate.complete(session, commandLine, candidates);
     }
 }
diff --git a/cli/src/main/java/org/onosproject/cli/net/DpisListCommand.java b/cli/src/main/java/org/onosproject/cli/net/DpisListCommand.java
index d34c9ed..88e51c4 100644
--- a/cli/src/main/java/org/onosproject/cli/net/DpisListCommand.java
+++ b/cli/src/main/java/org/onosproject/cli/net/DpisListCommand.java
@@ -16,9 +16,10 @@
 
 package org.onosproject.cli.net;
 
-import org.apache.karaf.shell.commands.Argument;
-import org.apache.karaf.shell.commands.Command;
-import org.apache.karaf.shell.commands.Option;
+import org.apache.karaf.shell.api.action.Argument;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
+import org.apache.karaf.shell.api.action.Option;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.incubator.net.dpi.DpiStatInfo;
 import org.onosproject.incubator.net.dpi.DpiStatistics;
@@ -34,6 +35,7 @@
 /**
  * Fetches DPI statistics list.
  */
+@Service
 @Command(scope = "onos", name = "dpis",
         description = "Fetches the DPI result entries that is received from DPI engine server")
 public class DpisListCommand extends AbstractShellCommand {
@@ -96,7 +98,7 @@
                     + " or correct receivedTime format: 'yyyy-MM-dd HH:mm:ss', ex:'2016-08-30 10:31:20'";
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         DpiStatisticsManagerService dsms = get(DpiStatisticsManagerService.class);
 
         DpiStatistics ds;
diff --git a/cli/src/main/java/org/onosproject/cli/net/DriverNameCompleter.java b/cli/src/main/java/org/onosproject/cli/net/DriverNameCompleter.java
index d8f6930..f0cc6a7 100644
--- a/cli/src/main/java/org/onosproject/cli/net/DriverNameCompleter.java
+++ b/cli/src/main/java/org/onosproject/cli/net/DriverNameCompleter.java
@@ -15,8 +15,11 @@
  */
 package org.onosproject.cli.net;
 
-import org.apache.karaf.shell.console.Completer;
-import org.apache.karaf.shell.console.completer.StringsCompleter;
+import org.apache.karaf.shell.api.console.CommandLine;
+import org.apache.karaf.shell.api.console.Completer;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
+import org.apache.karaf.shell.api.console.Session;
+import org.apache.karaf.shell.support.completers.StringsCompleter;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.net.driver.DriverService;
 
@@ -26,9 +29,10 @@
 /**
  * Device driver name completer.
  */
+@Service
 public class DriverNameCompleter implements Completer {
     @Override
-    public int complete(String buffer, int cursor, List<String> candidates) {
+    public int complete(Session session, CommandLine commandLine, List<String> candidates) {
         // Delegate string completer
         StringsCompleter delegate = new StringsCompleter();
         SortedSet<String> strings = delegate.getStrings();
@@ -38,7 +42,7 @@
         service.getDrivers().forEach(d -> strings.add(d.name()));
 
         // Now let the completer do the work for figuring out what to offer.
-        return delegate.complete(buffer, cursor, candidates);
+        return delegate.complete(session, commandLine, candidates);
     }
 
 }
diff --git a/cli/src/main/java/org/onosproject/cli/net/DriverProvidersListCommand.java b/cli/src/main/java/org/onosproject/cli/net/DriverProvidersListCommand.java
index 3692c57..0667f28 100644
--- a/cli/src/main/java/org/onosproject/cli/net/DriverProvidersListCommand.java
+++ b/cli/src/main/java/org/onosproject/cli/net/DriverProvidersListCommand.java
@@ -15,7 +15,8 @@
  */
 package org.onosproject.cli.net;
 
-import org.apache.karaf.shell.commands.Command;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.net.driver.Driver;
 import org.onosproject.net.driver.DriverAdminService;
@@ -26,6 +27,7 @@
 /**
  * Lists device drivers.
  */
+@Service
 @Command(scope = "onos", name = "driver-providers",
         description = "Lists device driver providers")
 public class DriverProvidersListCommand extends AbstractShellCommand {
@@ -33,7 +35,7 @@
     private static final String FMT = "provider=%s, drivers=%s";
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         DriverAdminService service = get(DriverAdminService.class);
         service.getProviders().forEach(this::printDriverProvider);
     }
diff --git a/cli/src/main/java/org/onosproject/cli/net/DriversListCommand.java b/cli/src/main/java/org/onosproject/cli/net/DriversListCommand.java
index 79fb65a..4b88ad3 100644
--- a/cli/src/main/java/org/onosproject/cli/net/DriversListCommand.java
+++ b/cli/src/main/java/org/onosproject/cli/net/DriversListCommand.java
@@ -17,9 +17,11 @@
 
 import com.fasterxml.jackson.databind.node.ArrayNode;
 import com.google.common.collect.ImmutableList;
-import org.apache.karaf.shell.commands.Argument;
-import org.apache.karaf.shell.commands.Command;
-import org.apache.karaf.shell.commands.Option;
+import org.apache.karaf.shell.api.action.Argument;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.Completion;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
+import org.apache.karaf.shell.api.action.Option;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.net.driver.Behaviour;
 import org.onosproject.net.driver.Driver;
@@ -34,6 +36,7 @@
 /**
  * Lists device drivers.
  */
+@Service
 @Command(scope = "onos", name = "drivers",
         description = "Lists device drivers")
 public class DriversListCommand extends AbstractShellCommand {
@@ -44,6 +47,7 @@
 
     @Argument(index = 0, name = "driverName", description = "Driver name",
             required = false, multiValued = false)
+    @Completion(DriverNameCompleter.class)
     String driverName = null;
 
     @Option(name = "-s", aliases = "--sort", description = "Sort output by driver name",
@@ -55,7 +59,7 @@
     private boolean nameOnly = false;
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         DriverService service = get(DriverService.class);
 
         if (driverName != null) {
diff --git a/cli/src/main/java/org/onosproject/cli/net/EdgePortsListCommand.java b/cli/src/main/java/org/onosproject/cli/net/EdgePortsListCommand.java
index 529d778..6f7ae26 100644
--- a/cli/src/main/java/org/onosproject/cli/net/EdgePortsListCommand.java
+++ b/cli/src/main/java/org/onosproject/cli/net/EdgePortsListCommand.java
@@ -15,8 +15,10 @@
  */
 package org.onosproject.cli.net;
 
-import org.apache.karaf.shell.commands.Argument;
-import org.apache.karaf.shell.commands.Command;
+import org.apache.karaf.shell.api.action.Argument;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.Completion;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.net.ConnectPoint;
 import org.onosproject.net.edge.EdgePortService;
@@ -31,6 +33,7 @@
 /**
  * Lists all edge ports.
  */
+@Service
 @Command(scope = "onos", name = "edge-ports",
         description = "Lists all edge ports.")
 public class EdgePortsListCommand extends AbstractShellCommand {
@@ -39,10 +42,11 @@
 
     @Argument(index = 0, name = "uri", description = "Device ID",
             required = false, multiValued = false)
+    @Completion(DeviceIdCompleter.class)
     String uri = null;
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         EdgePortService service = get(EdgePortService.class);
         if (uri == null) {
             printEdgePoints(service.getEdgePoints());
diff --git a/cli/src/main/java/org/onosproject/cli/net/EncapTypeCompleter.java b/cli/src/main/java/org/onosproject/cli/net/EncapTypeCompleter.java
index 1510e31..d6e7566 100644
--- a/cli/src/main/java/org/onosproject/cli/net/EncapTypeCompleter.java
+++ b/cli/src/main/java/org/onosproject/cli/net/EncapTypeCompleter.java
@@ -15,8 +15,11 @@
  */
 package org.onosproject.cli.net;
 
-import org.apache.karaf.shell.console.Completer;
-import org.apache.karaf.shell.console.completer.StringsCompleter;
+import org.apache.karaf.shell.api.console.CommandLine;
+import org.apache.karaf.shell.api.console.Completer;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
+import org.apache.karaf.shell.api.console.Session;
+import org.apache.karaf.shell.support.completers.StringsCompleter;
 import org.onosproject.net.EncapsulationType;
 
 import java.util.List;
@@ -25,10 +28,11 @@
 /**
  * Encapsulation type completer.
  */
+@Service
 public class EncapTypeCompleter implements Completer {
 
     @Override
-    public int complete(String buffer, int cursor, List<String> candidates) {
+    public int complete(Session session, CommandLine commandLine, List<String> candidates) {
         // Delegate string completer
         StringsCompleter delegate = new StringsCompleter();
         SortedSet<String> strings = delegate.getStrings();
@@ -38,6 +42,6 @@
         }
 
         // Now let the completer do the work for figuring out what to offer.
-        return delegate.complete(buffer, cursor, candidates);
+        return delegate.complete(session, commandLine, candidates);
     }
 }
diff --git a/cli/src/main/java/org/onosproject/cli/net/EthTypeCompleter.java b/cli/src/main/java/org/onosproject/cli/net/EthTypeCompleter.java
index 370e0c9..db4744b 100644
--- a/cli/src/main/java/org/onosproject/cli/net/EthTypeCompleter.java
+++ b/cli/src/main/java/org/onosproject/cli/net/EthTypeCompleter.java
@@ -18,15 +18,19 @@
 import java.util.List;
 import java.util.SortedSet;
 
-import org.apache.karaf.shell.console.Completer;
-import org.apache.karaf.shell.console.completer.StringsCompleter;
+import org.apache.karaf.shell.api.console.CommandLine;
+import org.apache.karaf.shell.api.console.Completer;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
+import org.apache.karaf.shell.api.console.Session;
+import org.apache.karaf.shell.support.completers.StringsCompleter;
 
 /**
  * Ethernet type completer.
  */
+@Service
 public class EthTypeCompleter implements Completer {
     @Override
-    public int complete(String buffer, int cursor, List<String> candidates) {
+    public int complete(Session session, CommandLine commandLine, List<String> candidates) {
         // Delegate string completer
         StringsCompleter delegate = new StringsCompleter();
         SortedSet<String> strings = delegate.getStrings();
@@ -36,7 +40,7 @@
         }
 
         // Now let the completer do the work for figuring out what to offer.
-        return delegate.complete(buffer, cursor, candidates);
+        return delegate.complete(session, commandLine, candidates);
     }
 
 }
diff --git a/cli/src/main/java/org/onosproject/cli/net/ExtHeaderCompleter.java b/cli/src/main/java/org/onosproject/cli/net/ExtHeaderCompleter.java
index e6018e2..3c85b71 100644
--- a/cli/src/main/java/org/onosproject/cli/net/ExtHeaderCompleter.java
+++ b/cli/src/main/java/org/onosproject/cli/net/ExtHeaderCompleter.java
@@ -15,8 +15,11 @@
  */
 package org.onosproject.cli.net;
 
-import org.apache.karaf.shell.console.Completer;
-import org.apache.karaf.shell.console.completer.StringsCompleter;
+import org.apache.karaf.shell.api.console.CommandLine;
+import org.apache.karaf.shell.api.console.Completer;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
+import org.apache.karaf.shell.api.console.Session;
+import org.apache.karaf.shell.support.completers.StringsCompleter;
 
 import java.util.List;
 import java.util.SortedSet;
@@ -24,9 +27,10 @@
 /**
  * IPv6 extension header completer.
  */
+@Service
 public class ExtHeaderCompleter implements Completer {
     @Override
-    public int complete(String buffer, int cursor, List<String> candidates) {
+    public int complete(Session session, CommandLine commandLine, List<String> candidates) {
         // Delegate string completer
         StringsCompleter delegate = new StringsCompleter();
         SortedSet<String> strings = delegate.getStrings();
@@ -36,7 +40,7 @@
         }
 
         // Now let the completer do the work for figuring out what to offer.
-        return delegate.complete(buffer, cursor, candidates);
+        return delegate.complete(session, commandLine, candidates);
     }
 
 }
diff --git a/cli/src/main/java/org/onosproject/cli/net/FlowObjectiveCompositionCommand.java b/cli/src/main/java/org/onosproject/cli/net/FlowObjectiveCompositionCommand.java
index 7e0c358..d87f723 100644
--- a/cli/src/main/java/org/onosproject/cli/net/FlowObjectiveCompositionCommand.java
+++ b/cli/src/main/java/org/onosproject/cli/net/FlowObjectiveCompositionCommand.java
@@ -15,14 +15,16 @@
  */
 package org.onosproject.cli.net;
 
-import org.apache.karaf.shell.commands.Argument;
-import org.apache.karaf.shell.commands.Command;
+import org.apache.karaf.shell.api.action.Argument;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.net.flowobjective.FlowObjectiveService;
 
 /**
  * Manages FlowObjectiveComposition policy.
  */
+@Service
 @Command(scope = "onos", name = "policy",
         description = "Manages FlowObjectiveComposition policy")
 public class FlowObjectiveCompositionCommand extends AbstractShellCommand {
@@ -37,7 +39,7 @@
     String[] policies = null;
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         FlowObjectiveService service = get(FlowObjectiveService.class);
         service.initPolicy(policies[0]);
         print("Policy %s installed", policies[0]);
diff --git a/cli/src/main/java/org/onosproject/cli/net/FlowObjectiveNextListCommand.java b/cli/src/main/java/org/onosproject/cli/net/FlowObjectiveNextListCommand.java
index bbf90e3..dd85b5b 100644
--- a/cli/src/main/java/org/onosproject/cli/net/FlowObjectiveNextListCommand.java
+++ b/cli/src/main/java/org/onosproject/cli/net/FlowObjectiveNextListCommand.java
@@ -18,7 +18,8 @@
 import java.util.List;
 import org.onlab.osgi.ServiceNotFoundException;
 
-import org.apache.karaf.shell.commands.Command;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.net.flowobjective.FlowObjectiveService;
 
@@ -26,6 +27,7 @@
  * Returns a mapping of FlowObjective next-ids to the groups that get created
  * by a device driver. These mappings are controller instance specific.
  */
+@Service
 @Command(scope = "onos", name = "obj-next-ids",
         description = "flow-objectives next-ids to group-ids mapping")
 public class FlowObjectiveNextListCommand extends AbstractShellCommand {
@@ -33,7 +35,7 @@
     private static final String FORMAT_MAPPING = "  %s";
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         try {
             FlowObjectiveService service = get(FlowObjectiveService.class);
             printNexts(service.getNextMappings());
diff --git a/cli/src/main/java/org/onosproject/cli/net/FlowObjectivePendingNextCommand.java b/cli/src/main/java/org/onosproject/cli/net/FlowObjectivePendingNextCommand.java
index e3f372b..f0fbca8 100644
--- a/cli/src/main/java/org/onosproject/cli/net/FlowObjectivePendingNextCommand.java
+++ b/cli/src/main/java/org/onosproject/cli/net/FlowObjectivePendingNextCommand.java
@@ -17,7 +17,8 @@
 
 import java.util.List;
 
-import org.apache.karaf.shell.commands.Command;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onlab.osgi.ServiceNotFoundException;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.net.flowobjective.FlowObjectiveService;
@@ -27,6 +28,7 @@
  * Also returns the forwarding objectives and next objectives waiting on the pending
  * next-objectives. These lists are controller instance specific.
  */
+@Service
 @Command(scope = "onos", name = "obj-pending-nexts",
         description = "flow-objectives pending next-objectives")
 public class FlowObjectivePendingNextCommand extends AbstractShellCommand {
@@ -34,7 +36,7 @@
     private static final String FORMAT_MAPPING = "  %s";
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         try {
             FlowObjectiveService service = get(FlowObjectiveService.class);
             printNexts(service.getPendingFlowObjectives());
diff --git a/cli/src/main/java/org/onosproject/cli/net/FlowObjectiveQueueClearCommand.java b/cli/src/main/java/org/onosproject/cli/net/FlowObjectiveQueueClearCommand.java
index d15ac87..ff0895e 100644
--- a/cli/src/main/java/org/onosproject/cli/net/FlowObjectiveQueueClearCommand.java
+++ b/cli/src/main/java/org/onosproject/cli/net/FlowObjectiveQueueClearCommand.java
@@ -15,8 +15,9 @@
  */
 package org.onosproject.cli.net;
 
-import org.apache.karaf.shell.commands.Argument;
-import org.apache.karaf.shell.commands.Command;
+import org.apache.karaf.shell.api.action.Argument;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onlab.osgi.ServiceNotFoundException;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.net.flowobjective.FlowObjectiveService;
@@ -24,6 +25,7 @@
 /**
  * Clear flow objective that are waiting for the completion of previous objective with the same key.
  */
+@Service
 @Command(scope = "onos", name = "obj-clear-queues",
         description = "Force empty flow objective queues and invalidate flow objective caches")
 public class FlowObjectiveQueueClearCommand extends AbstractShellCommand {
@@ -33,7 +35,7 @@
     private String please = null;
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         if (please == null || !please.equals(CONFIRM_PHRASE)) {
             print("WARNING: System may enter an unpredictable state if the flow obj queues are force emptied." +
                     "Enter confirmation phrase to continue.");
diff --git a/cli/src/main/java/org/onosproject/cli/net/FlowObjectiveQueueListCommand.java b/cli/src/main/java/org/onosproject/cli/net/FlowObjectiveQueueListCommand.java
index 46f6122..9aded1e 100644
--- a/cli/src/main/java/org/onosproject/cli/net/FlowObjectiveQueueListCommand.java
+++ b/cli/src/main/java/org/onosproject/cli/net/FlowObjectiveQueueListCommand.java
@@ -16,8 +16,9 @@
 package org.onosproject.cli.net;
 
 import com.google.common.collect.ListMultimap;
-import org.apache.karaf.shell.commands.Command;
-import org.apache.karaf.shell.commands.Option;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
+import org.apache.karaf.shell.api.action.Option;
 import org.onlab.osgi.ServiceNotFoundException;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.net.flowobjective.FilteringObjQueueKey;
@@ -31,6 +32,7 @@
 /**
  * Displays flow objective that are waiting for the completion of previous objective with the same key.
  */
+@Service
 @Command(scope = "onos", name = "obj-queues",
         description = "Display flow objective queues")
 public class FlowObjectiveQueueListCommand extends AbstractShellCommand {
@@ -46,7 +48,7 @@
     private boolean cache = false;
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         try {
             FlowObjectiveService service = get(FlowObjectiveService.class);
             ListMultimap<FilteringObjQueueKey, Objective> filtObjQueue = service.getFilteringObjQueue();
diff --git a/cli/src/main/java/org/onosproject/cli/net/FlowRuleStatusCompleter.java b/cli/src/main/java/org/onosproject/cli/net/FlowRuleStatusCompleter.java
index 8fe5664..1666332 100644
--- a/cli/src/main/java/org/onosproject/cli/net/FlowRuleStatusCompleter.java
+++ b/cli/src/main/java/org/onosproject/cli/net/FlowRuleStatusCompleter.java
@@ -18,16 +18,20 @@
 import java.util.List;
 import java.util.SortedSet;
 
-import org.apache.karaf.shell.console.Completer;
-import org.apache.karaf.shell.console.completer.StringsCompleter;
+import org.apache.karaf.shell.api.console.CommandLine;
+import org.apache.karaf.shell.api.console.Completer;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
+import org.apache.karaf.shell.api.console.Session;
+import org.apache.karaf.shell.support.completers.StringsCompleter;
 import org.onosproject.net.flow.FlowEntry.FlowEntryState;
 
 /**
  * Flow rule status completer.
  */
+@Service
 public class FlowRuleStatusCompleter implements Completer {
     @Override
-    public int complete(String buffer, int cursor, List<String> candidates) {
+    public int complete(Session session, CommandLine commandLine, List<String> candidates) {
         // Delegate string completer
         StringsCompleter delegate = new StringsCompleter();
 
@@ -39,7 +43,7 @@
         strings.add(FlowsListCommand.ANY);
 
         // Now let the completer do the work for figuring out what to offer.
-        return delegate.complete(buffer, cursor, candidates);
+        return delegate.complete(session, commandLine, candidates);
     }
 
 }
diff --git a/cli/src/main/java/org/onosproject/cli/net/FlowsListCommand.java b/cli/src/main/java/org/onosproject/cli/net/FlowsListCommand.java
index 5c26b06..f7adc0a 100644
--- a/cli/src/main/java/org/onosproject/cli/net/FlowsListCommand.java
+++ b/cli/src/main/java/org/onosproject/cli/net/FlowsListCommand.java
@@ -19,11 +19,14 @@
 import com.fasterxml.jackson.databind.ObjectMapper;
 import com.fasterxml.jackson.databind.node.ArrayNode;
 import com.fasterxml.jackson.databind.node.ObjectNode;
-import org.apache.karaf.shell.commands.Argument;
-import org.apache.karaf.shell.commands.Command;
-import org.apache.karaf.shell.commands.Option;
+import org.apache.karaf.shell.api.action.Argument;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.Completion;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
+import org.apache.karaf.shell.api.action.Option;
 import org.onlab.util.StringFilter;
 import org.onosproject.cli.AbstractShellCommand;
+import org.onosproject.cli.PlaceholderCompleter;
 import org.onosproject.core.ApplicationId;
 import org.onosproject.core.CoreService;
 import org.onosproject.net.Device;
@@ -54,6 +57,7 @@
 /**
  * Lists all currently-known flows.
  */
+@Service
 @Command(scope = "onos", name = "flows",
          description = "Lists all currently-known flows.")
 public class FlowsListCommand extends AbstractShellCommand {
@@ -71,14 +75,17 @@
 
     @Argument(index = 0, name = "state", description = "Flow Rule state",
             required = false, multiValued = false)
+    @Completion(FlowRuleStatusCompleter.class)
     String state = null;
 
     @Argument(index = 1, name = "uri", description = "Device ID",
               required = false, multiValued = false)
+    @Completion(DeviceIdCompleter.class)
     String uri = null;
 
     @Argument(index = 2, name = "table", description = "Table ID",
             required = false, multiValued = false)
+    @Completion(PlaceholderCompleter.class)
     String table = null;
 
     @Option(name = "-s", aliases = "--short",
@@ -111,7 +118,7 @@
     private StringFilter contentFilter;
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         CoreService coreService = get(CoreService.class);
         DeviceService deviceService = get(DeviceService.class);
         FlowRuleService service = get(FlowRuleService.class);
diff --git a/cli/src/main/java/org/onosproject/cli/net/GetDomainsCommand.java b/cli/src/main/java/org/onosproject/cli/net/GetDomainsCommand.java
index 9854d54..6186d2a 100644
--- a/cli/src/main/java/org/onosproject/cli/net/GetDomainsCommand.java
+++ b/cli/src/main/java/org/onosproject/cli/net/GetDomainsCommand.java
@@ -15,7 +15,8 @@
  */
 package org.onosproject.cli.net;
 
-import org.apache.karaf.shell.commands.Command;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.net.domain.DomainId;
 import org.onosproject.net.domain.DomainService;
@@ -25,11 +26,12 @@
 /**
  * Gets the complete list of domain IDs.
  */
+@Service
 @Command(scope = "onos", name = "domains", description = "Gets the list of domain IDs")
 public class GetDomainsCommand extends AbstractShellCommand {
 
     @Override
-    public void execute() {
+    public void doExecute() {
         DomainService domainService = AbstractShellCommand.get(DomainService.class);
 
         Set<DomainId> domainIds = domainService.getDomainIds();
diff --git a/cli/src/main/java/org/onosproject/cli/net/GetFlowStatisticsCommand.java b/cli/src/main/java/org/onosproject/cli/net/GetFlowStatisticsCommand.java
index 78b1a37..bc2fca5 100644
--- a/cli/src/main/java/org/onosproject/cli/net/GetFlowStatisticsCommand.java
+++ b/cli/src/main/java/org/onosproject/cli/net/GetFlowStatisticsCommand.java
@@ -16,9 +16,11 @@
 
 package org.onosproject.cli.net;
 
-import org.apache.karaf.shell.commands.Argument;
-import org.apache.karaf.shell.commands.Command;
-import org.apache.karaf.shell.commands.Option;
+import org.apache.karaf.shell.api.action.Argument;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.Completion;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
+import org.apache.karaf.shell.api.action.Option;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.net.ConnectPoint;
 import org.onosproject.net.Device;
@@ -42,12 +44,14 @@
 /**
  * Fetches flow statistics with a flow type and instruction type.
  */
+@Service
 @Command(scope = "onos", name = "get-flow-stats",
         description = "Fetches flow stats for a connection point with given flow type and instruction type")
 public class GetFlowStatisticsCommand extends AbstractShellCommand {
     @Argument(index = 0, name = "devicePort",
             description = "Device[/Port] connectPoint Description",
             required = true, multiValued = false)
+    @Completion(ConnectPointCompleter.class)
     String devicePort = null;
 
     @Option(name = "-s", aliases = "--summary",
@@ -79,7 +83,7 @@
     String instructionType = null;
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         DeviceService deviceService = get(DeviceService.class);
         FlowStatisticService flowStatsService = get(FlowStatisticService.class);
 
diff --git a/cli/src/main/java/org/onosproject/cli/net/GetStatisticsCommand.java b/cli/src/main/java/org/onosproject/cli/net/GetStatisticsCommand.java
index 12e92c6..984916f 100644
--- a/cli/src/main/java/org/onosproject/cli/net/GetStatisticsCommand.java
+++ b/cli/src/main/java/org/onosproject/cli/net/GetStatisticsCommand.java
@@ -15,8 +15,10 @@
  */
 package org.onosproject.cli.net;
 
-import org.apache.karaf.shell.commands.Argument;
-import org.apache.karaf.shell.commands.Command;
+import org.apache.karaf.shell.api.action.Argument;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.Completion;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.net.ConnectPoint;
 import org.onosproject.net.DeviceId;
@@ -32,6 +34,7 @@
 /**
  * Fetches statistics.
  */
+@Service
 @Command(scope = "onos", name = "get-stats",
          description = "Fetches stats for a connection point")
 public class GetStatisticsCommand extends AbstractShellCommand {
@@ -39,11 +42,12 @@
     @Argument(index = 0, name = "connectPoint",
               description = "Device/Port Description",
               required = true, multiValued = false)
+    @Completion(ConnectPointCompleter.class)
     String connectPoint = null;
 
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         StatisticService service = get(StatisticService.class);
 
         DeviceId ingressDeviceId = deviceId(getDeviceId(connectPoint));
diff --git a/cli/src/main/java/org/onosproject/cli/net/GlobalLabelApplyCommand.java b/cli/src/main/java/org/onosproject/cli/net/GlobalLabelApplyCommand.java
index 44d0a93..2981408 100644
--- a/cli/src/main/java/org/onosproject/cli/net/GlobalLabelApplyCommand.java
+++ b/cli/src/main/java/org/onosproject/cli/net/GlobalLabelApplyCommand.java
@@ -18,13 +18,15 @@
 import java.util.Collection;
 import java.util.Iterator;
 
-import org.apache.karaf.shell.commands.Argument;
-import org.apache.karaf.shell.commands.Command;
+import org.apache.karaf.shell.api.action.Argument;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.incubator.net.resource.label.DefaultLabelResource;
 import org.onosproject.incubator.net.resource.label.LabelResource;
 import org.onosproject.incubator.net.resource.label.LabelResourceService;
 
+@Service
 @Command(scope = "onos", name = "global-label-apply",
       description = "Apply global labels from global resource pool")
 public class GlobalLabelApplyCommand extends AbstractShellCommand {
@@ -36,7 +38,7 @@
     private static final String FMT = "deviceid=%s, labelresourceid=%s";
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         LabelResourceService lrs = get(LabelResourceService.class);
         Collection<LabelResource> result =
                 lrs.applyFromGlobalPool(Long.parseLong(applyNum));
diff --git a/cli/src/main/java/org/onosproject/cli/net/GlobalLabelCommand.java b/cli/src/main/java/org/onosproject/cli/net/GlobalLabelCommand.java
index bda8876..2dd55af 100644
--- a/cli/src/main/java/org/onosproject/cli/net/GlobalLabelCommand.java
+++ b/cli/src/main/java/org/onosproject/cli/net/GlobalLabelCommand.java
@@ -15,11 +15,13 @@
  */
 package org.onosproject.cli.net;
 
-import org.apache.karaf.shell.commands.Command;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.incubator.net.resource.label.LabelResourcePool;
 import org.onosproject.incubator.net.resource.label.LabelResourceService;
 
+@Service
 @Command(scope = "onos", name = "global-label-pool",
       description = "Gets global label resource pool information.")
 public class GlobalLabelCommand extends AbstractShellCommand {
@@ -28,7 +30,7 @@
             + "releaseLabelIds=%s";
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         LabelResourceService lrs = get(LabelResourceService.class);
         LabelResourcePool pool = lrs.getGlobalLabelResourcePool();
         if (pool != null) {
diff --git a/cli/src/main/java/org/onosproject/cli/net/GlobalLabelPoolCreateCommand.java b/cli/src/main/java/org/onosproject/cli/net/GlobalLabelPoolCreateCommand.java
index 993dd49..6ef72bc 100644
--- a/cli/src/main/java/org/onosproject/cli/net/GlobalLabelPoolCreateCommand.java
+++ b/cli/src/main/java/org/onosproject/cli/net/GlobalLabelPoolCreateCommand.java
@@ -15,8 +15,9 @@
  */
 package org.onosproject.cli.net;
 
-import org.apache.karaf.shell.commands.Argument;
-import org.apache.karaf.shell.commands.Command;
+import org.apache.karaf.shell.api.action.Argument;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.incubator.net.resource.label.LabelResourceAdminService;
 import org.onosproject.incubator.net.resource.label.LabelResourceId;
@@ -24,6 +25,7 @@
 /**
  * create label resource pool by specific device id.
  */
+@Service
 @Command(scope = "onos", name = "global-label-pool-create",
 description = "Creates global label resource pool.")
 public class GlobalLabelPoolCreateCommand extends AbstractShellCommand {
@@ -37,7 +39,7 @@
     String endLabel = null;
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         LabelResourceAdminService lrs = get(LabelResourceAdminService.class);
         lrs.createGlobalPool(LabelResourceId.labelResourceId(Long
                 .parseLong(beginLabel)), LabelResourceId.labelResourceId(Long
diff --git a/cli/src/main/java/org/onosproject/cli/net/GlobalLabelPoolDestroyCommand.java b/cli/src/main/java/org/onosproject/cli/net/GlobalLabelPoolDestroyCommand.java
index 981210e..387a80a 100644
--- a/cli/src/main/java/org/onosproject/cli/net/GlobalLabelPoolDestroyCommand.java
+++ b/cli/src/main/java/org/onosproject/cli/net/GlobalLabelPoolDestroyCommand.java
@@ -15,15 +15,17 @@
  */
 package org.onosproject.cli.net;
 
-import org.apache.karaf.shell.commands.Command;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.incubator.net.resource.label.LabelResourceAdminService;
 
+@Service
 @Command(scope = "onos", name = "global-label-pool-destroy",
 description = "Destroys global label resource pool")
 public class GlobalLabelPoolDestroyCommand extends AbstractShellCommand {
     @Override
-    protected void execute() {
+    protected void doExecute() {
         LabelResourceAdminService lrs = get(LabelResourceAdminService.class);
         lrs.destroyGlobalPool();
     }
diff --git a/cli/src/main/java/org/onosproject/cli/net/GlobalLabelReleaseCommand.java b/cli/src/main/java/org/onosproject/cli/net/GlobalLabelReleaseCommand.java
index 169833b..edd4dfb 100644
--- a/cli/src/main/java/org/onosproject/cli/net/GlobalLabelReleaseCommand.java
+++ b/cli/src/main/java/org/onosproject/cli/net/GlobalLabelReleaseCommand.java
@@ -18,12 +18,14 @@
 import java.util.HashSet;
 import java.util.Set;
 
-import org.apache.karaf.shell.commands.Argument;
-import org.apache.karaf.shell.commands.Command;
+import org.apache.karaf.shell.api.action.Argument;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.incubator.net.resource.label.LabelResourceId;
 import org.onosproject.incubator.net.resource.label.LabelResourceService;
 
+@Service
 @Command(scope = "onos", name = "global-label-release",
 description = "Releases labels to global label resource pool.")
 public class GlobalLabelReleaseCommand extends AbstractShellCommand {
@@ -33,7 +35,7 @@
     String releaseLabelIds = null;
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         LabelResourceService lrs = get(LabelResourceService.class);
         Set<LabelResourceId> release = new HashSet<LabelResourceId>();
         String[] labelIds = releaseLabelIds.split(",");
diff --git a/cli/src/main/java/org/onosproject/cli/net/GroupStatusCompleter.java b/cli/src/main/java/org/onosproject/cli/net/GroupStatusCompleter.java
index 3669c54..ce7f51e 100644
--- a/cli/src/main/java/org/onosproject/cli/net/GroupStatusCompleter.java
+++ b/cli/src/main/java/org/onosproject/cli/net/GroupStatusCompleter.java
@@ -16,6 +16,7 @@
 package org.onosproject.cli.net;
 
 import com.google.common.collect.Lists;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.cli.AbstractChoicesCompleter;
 import org.onosproject.net.group.Group;
 
@@ -24,6 +25,7 @@
 /**
  * Group status completer.
  */
+@Service
 public class GroupStatusCompleter extends AbstractChoicesCompleter {
     @Override
     protected List<String> choices() {
diff --git a/cli/src/main/java/org/onosproject/cli/net/GroupTypeCompleter.java b/cli/src/main/java/org/onosproject/cli/net/GroupTypeCompleter.java
index 5eb567a..904676f 100644
--- a/cli/src/main/java/org/onosproject/cli/net/GroupTypeCompleter.java
+++ b/cli/src/main/java/org/onosproject/cli/net/GroupTypeCompleter.java
@@ -16,6 +16,7 @@
 package org.onosproject.cli.net;
 
 import com.google.common.collect.Lists;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.cli.AbstractChoicesCompleter;
 import org.onosproject.net.group.Group;
 
@@ -24,6 +25,7 @@
 /**
  * Group status completer.
  */
+@Service
 public class GroupTypeCompleter extends AbstractChoicesCompleter {
     @Override
     protected List<String> choices() {
diff --git a/cli/src/main/java/org/onosproject/cli/net/GroupsListCommand.java b/cli/src/main/java/org/onosproject/cli/net/GroupsListCommand.java
index 48c2e1f..f162e77 100644
--- a/cli/src/main/java/org/onosproject/cli/net/GroupsListCommand.java
+++ b/cli/src/main/java/org/onosproject/cli/net/GroupsListCommand.java
@@ -18,9 +18,11 @@
 import com.fasterxml.jackson.databind.JsonNode;
 import com.fasterxml.jackson.databind.node.ArrayNode;
 import com.google.common.collect.Lists;
-import org.apache.karaf.shell.commands.Argument;
-import org.apache.karaf.shell.commands.Command;
-import org.apache.karaf.shell.commands.Option;
+import org.apache.karaf.shell.api.action.Argument;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.Completion;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
+import org.apache.karaf.shell.api.action.Option;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.net.Device;
 import org.onosproject.net.DeviceId;
@@ -44,6 +46,7 @@
 /**
  * Lists all groups in the system.
  */
+@Service
 @Command(scope = "onos", name = "groups",
         description = "Lists all groups in the system")
 public class GroupsListCommand extends AbstractShellCommand {
@@ -57,10 +60,12 @@
 
     @Argument(index = 1, name = "uri", description = "Device ID",
             required = false, multiValued = false)
+    @Completion(DeviceIdCompleter.class)
     String uri = null;
 
     @Argument(index = 0, name = "state", description = "Group state",
             required = false, multiValued = false)
+    @Completion(GroupStatusCompleter.class)
     String state;
 
     @Option(name = "-c", aliases = "--count",
@@ -76,6 +81,7 @@
     @Option(name = "-t", aliases = "--type",
             description = "Print groups with specified type",
             required = false, multiValued = false)
+    @Completion(GroupTypeCompleter.class)
     private String type = null;
 
 
@@ -90,7 +96,7 @@
     }
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         DeviceService deviceService = get(DeviceService.class);
         GroupService groupService = get(GroupService.class);
         SortedMap<Device, List<Group>> sortedGroups =
diff --git a/cli/src/main/java/org/onosproject/cli/net/HostIdCompleter.java b/cli/src/main/java/org/onosproject/cli/net/HostIdCompleter.java
index 2ee7dca..2efdec3 100644
--- a/cli/src/main/java/org/onosproject/cli/net/HostIdCompleter.java
+++ b/cli/src/main/java/org/onosproject/cli/net/HostIdCompleter.java
@@ -19,8 +19,11 @@
 import java.util.List;
 import java.util.SortedSet;
 
-import org.apache.karaf.shell.console.Completer;
-import org.apache.karaf.shell.console.completer.StringsCompleter;
+import org.apache.karaf.shell.api.console.CommandLine;
+import org.apache.karaf.shell.api.console.Completer;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
+import org.apache.karaf.shell.api.console.Session;
+import org.apache.karaf.shell.support.completers.StringsCompleter;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.net.Host;
 import org.onosproject.net.host.HostService;
@@ -28,10 +31,11 @@
 /**
  * Host ID completer.
  */
+@Service
 public class HostIdCompleter implements Completer {
 
     @Override
-    public int complete(String buffer, int cursor, List<String> candidates) {
+    public int complete(Session session, CommandLine commandLine, List<String> candidates) {
         // Delegate string completer
         StringsCompleter delegate = new StringsCompleter();
 
@@ -43,7 +47,7 @@
         }
 
         // Now let the completer do the work for figuring out what to offer.
-        return delegate.complete(buffer, cursor, candidates);
+        return delegate.complete(session, commandLine, candidates);
 
     }
 
diff --git a/cli/src/main/java/org/onosproject/cli/net/HostRemoveCommand.java b/cli/src/main/java/org/onosproject/cli/net/HostRemoveCommand.java
index cba5111..cdb8dcd 100644
--- a/cli/src/main/java/org/onosproject/cli/net/HostRemoveCommand.java
+++ b/cli/src/main/java/org/onosproject/cli/net/HostRemoveCommand.java
@@ -15,8 +15,10 @@
  */
 package org.onosproject.cli.net;
 
-import org.apache.karaf.shell.commands.Argument;
-import org.apache.karaf.shell.commands.Command;
+import org.apache.karaf.shell.api.action.Argument;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.Completion;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.net.HostId;
 import org.onosproject.net.host.HostAdminService;
@@ -24,16 +26,18 @@
 /**
  * Removes an end-station host.
  */
+@Service
 @Command(scope = "onos", name = "host-remove",
          description = "Removes an end-station host")
 public class HostRemoveCommand extends AbstractShellCommand {
 
     @Argument(index = 0, name = "id", description = "Host ID",
               required = true, multiValued = false)
+    @Completion(HostIdCompleter.class)
     String id = null;
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         get(HostAdminService.class).removeHost(HostId.hostId(id));
     }
 
diff --git a/cli/src/main/java/org/onosproject/cli/net/HostsListCommand.java b/cli/src/main/java/org/onosproject/cli/net/HostsListCommand.java
index 683ab26..3a9f860 100644
--- a/cli/src/main/java/org/onosproject/cli/net/HostsListCommand.java
+++ b/cli/src/main/java/org/onosproject/cli/net/HostsListCommand.java
@@ -18,8 +18,9 @@
 import com.fasterxml.jackson.databind.JsonNode;
 import com.fasterxml.jackson.databind.ObjectMapper;
 import com.fasterxml.jackson.databind.node.ArrayNode;
-import org.apache.karaf.shell.commands.Command;
-import org.apache.karaf.shell.commands.Option;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
+import org.apache.karaf.shell.api.action.Option;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.net.Host;
 import org.onosproject.net.host.HostService;
@@ -33,6 +34,7 @@
 /**
  * Lists all currently-known hosts.
  */
+@Service
 @Command(scope = "onos", name = "hosts",
         description = "Lists all currently-known hosts.")
 public class HostsListCommand extends AbstractShellCommand {
@@ -49,7 +51,7 @@
     private boolean shortOnly = false;
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         HostService service = get(HostService.class);
         if (outputJson()) {
             print("%s", json(getSortedHosts(service)));
diff --git a/cli/src/main/java/org/onosproject/cli/net/Icmp6CodeCompleter.java b/cli/src/main/java/org/onosproject/cli/net/Icmp6CodeCompleter.java
index eae82a2..b488d73 100644
--- a/cli/src/main/java/org/onosproject/cli/net/Icmp6CodeCompleter.java
+++ b/cli/src/main/java/org/onosproject/cli/net/Icmp6CodeCompleter.java
@@ -15,8 +15,11 @@
  */
 package org.onosproject.cli.net;
 
-import org.apache.karaf.shell.console.Completer;
-import org.apache.karaf.shell.console.completer.StringsCompleter;
+import org.apache.karaf.shell.api.console.CommandLine;
+import org.apache.karaf.shell.api.console.Completer;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
+import org.apache.karaf.shell.api.console.Session;
+import org.apache.karaf.shell.support.completers.StringsCompleter;
 
 import java.util.List;
 import java.util.SortedSet;
@@ -24,9 +27,10 @@
 /**
  * ICMPv6 type completer.
  */
+@Service
 public class Icmp6CodeCompleter implements Completer {
     @Override
-    public int complete(String buffer, int cursor, List<String> candidates) {
+    public int complete(Session session, CommandLine commandLine, List<String> candidates) {
         // Delegate string completer
         StringsCompleter delegate = new StringsCompleter();
         SortedSet<String> strings = delegate.getStrings();
@@ -36,7 +40,7 @@
         }
 
         // Now let the completer do the work for figuring out what to offer.
-        return delegate.complete(buffer, cursor, candidates);
+        return delegate.complete(session, commandLine, candidates);
     }
 
 }
diff --git a/cli/src/main/java/org/onosproject/cli/net/Icmp6TypeCompleter.java b/cli/src/main/java/org/onosproject/cli/net/Icmp6TypeCompleter.java
index 7f18a4b..553f5be 100644
--- a/cli/src/main/java/org/onosproject/cli/net/Icmp6TypeCompleter.java
+++ b/cli/src/main/java/org/onosproject/cli/net/Icmp6TypeCompleter.java
@@ -15,8 +15,11 @@
  */
 package org.onosproject.cli.net;
 
-import org.apache.karaf.shell.console.Completer;
-import org.apache.karaf.shell.console.completer.StringsCompleter;
+import org.apache.karaf.shell.api.console.CommandLine;
+import org.apache.karaf.shell.api.console.Completer;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
+import org.apache.karaf.shell.api.console.Session;
+import org.apache.karaf.shell.support.completers.StringsCompleter;
 
 import java.util.List;
 import java.util.SortedSet;
@@ -24,9 +27,10 @@
 /**
  * ICMPv6 type completer.
  */
+@Service
 public class Icmp6TypeCompleter implements Completer {
     @Override
-    public int complete(String buffer, int cursor, List<String> candidates) {
+    public int complete(Session session, CommandLine commandLine, List<String> candidates) {
         // Delegate string completer
         StringsCompleter delegate = new StringsCompleter();
         SortedSet<String> strings = delegate.getStrings();
@@ -36,7 +40,7 @@
         }
 
         // Now let the completer do the work for figuring out what to offer.
-        return delegate.complete(buffer, cursor, candidates);
+        return delegate.complete(session, commandLine, candidates);
     }
 
 }
diff --git a/cli/src/main/java/org/onosproject/cli/net/IntentCycleCommand.java b/cli/src/main/java/org/onosproject/cli/net/IntentCycleCommand.java
index fa764fb..ddab53a 100644
--- a/cli/src/main/java/org/onosproject/cli/net/IntentCycleCommand.java
+++ b/cli/src/main/java/org/onosproject/cli/net/IntentCycleCommand.java
@@ -19,8 +19,11 @@
 import java.util.List;
 import java.util.concurrent.atomic.AtomicLong;
 
-import org.apache.karaf.shell.commands.Argument;
-import org.apache.karaf.shell.commands.Command;
+import org.apache.karaf.shell.api.action.Argument;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.Completion;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
+import org.apache.karaf.shell.support.completers.NullCompleter;
 import org.onlab.packet.Ethernet;
 import org.onlab.packet.MacAddress;
 import org.onosproject.cli.AbstractShellCommand;
@@ -49,6 +52,7 @@
 /**
  * Installs point-to-point connectivity intents.
  */
+@Service
 @Command(scope = "onos", name = "cycle-intents",
          description = "Installs random intents to test throughput")
 public class IntentCycleCommand extends AbstractShellCommand
@@ -57,16 +61,19 @@
     @Argument(index = 0, name = "ingressDevice",
               description = "Ingress Device/Port Description",
               required = true, multiValued = false)
+    @Completion(ConnectPointCompleter.class)
     String ingressDeviceString = null;
 
     @Argument(index = 1, name = "egressDevice",
               description = "Egress Device/Port Description",
               required = true, multiValued = false)
+    @Completion(ConnectPointCompleter.class)
     String egressDeviceString = null;
 
     @Argument(index = 2, name = "numberOfIntents",
             description = "Number of intents to install/withdraw",
             required = true, multiValued = false)
+    @Completion(NullCompleter.class)
     String numberOfIntents = null;
 
     @Argument(index = 3, name = "keyOffset",
@@ -83,7 +90,7 @@
     private boolean add;
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         service = get(IntentService.class);
 
 
diff --git a/cli/src/main/java/org/onosproject/cli/net/IntentDetailsCommand.java b/cli/src/main/java/org/onosproject/cli/net/IntentDetailsCommand.java
index 0445059..1c2716e 100644
--- a/cli/src/main/java/org/onosproject/cli/net/IntentDetailsCommand.java
+++ b/cli/src/main/java/org/onosproject/cli/net/IntentDetailsCommand.java
@@ -18,10 +18,13 @@
 import java.util.List;
 import java.util.Set;
 import java.util.stream.Collectors;
-import org.apache.karaf.shell.commands.Command;
-import org.apache.karaf.shell.commands.Option;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.Completion;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
+import org.apache.karaf.shell.api.action.Option;
 import org.onlab.util.Tools;
 import org.onosproject.cli.AbstractShellCommand;
+import org.onosproject.cli.net.completer.IntentIdCompleter;
 import org.onosproject.net.Link;
 import org.onosproject.net.LinkKey;
 import org.onosproject.net.intent.Intent;
@@ -32,19 +35,21 @@
 /**
  * Displays details about an Intent in the system.
  */
+@Service
 @Command(scope = "onos", name = "intent-details",
          description = "Displays intent details")
 public class IntentDetailsCommand extends AbstractShellCommand {
 
     @Option(name = "--id",
             description = "Filter intent by specific Id", multiValued = true)
+    @Completion(IntentIdCompleter.class)
     private List<String> idsStr;
 
     private Set<IntentId> ids = null;
 
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         detailIntents(idsStr);
     }
 
diff --git a/cli/src/main/java/org/onosproject/cli/net/IntentKeyCompleter.java b/cli/src/main/java/org/onosproject/cli/net/IntentKeyCompleter.java
index 39c3e55..6d26d62 100644
--- a/cli/src/main/java/org/onosproject/cli/net/IntentKeyCompleter.java
+++ b/cli/src/main/java/org/onosproject/cli/net/IntentKeyCompleter.java
@@ -15,8 +15,11 @@
  */
 package org.onosproject.cli.net;
 
-import org.apache.karaf.shell.console.Completer;
-import org.apache.karaf.shell.console.completer.StringsCompleter;
+import org.apache.karaf.shell.api.console.CommandLine;
+import org.apache.karaf.shell.api.console.Completer;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
+import org.apache.karaf.shell.api.console.Session;
+import org.apache.karaf.shell.support.completers.StringsCompleter;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.net.intent.Intent;
 import org.onosproject.net.intent.IntentService;
@@ -28,9 +31,10 @@
 /**
  * Intent Key completer.
  */
+@Service
 public class IntentKeyCompleter implements Completer {
     @Override
-    public int complete(String buffer, int cursor, List<String> candidates) {
+    public int complete(Session session, CommandLine commandLine, List<String> candidates) {
         // Delegate string completer
         StringsCompleter delegate = new StringsCompleter();
 
@@ -43,7 +47,7 @@
         }
 
         // Now let the completer do the work for figuring out what to offer.
-        return delegate.complete(buffer, cursor, candidates);
+        return delegate.complete(session, commandLine, candidates);
     }
 
 }
diff --git a/cli/src/main/java/org/onosproject/cli/net/IntentListCompilers.java b/cli/src/main/java/org/onosproject/cli/net/IntentListCompilers.java
index fd1c145..d920eec 100644
--- a/cli/src/main/java/org/onosproject/cli/net/IntentListCompilers.java
+++ b/cli/src/main/java/org/onosproject/cli/net/IntentListCompilers.java
@@ -15,7 +15,8 @@
  */
 package org.onosproject.cli.net;
 
-import org.apache.karaf.shell.commands.Command;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.net.intent.IntentExtensionService;
 
@@ -24,12 +25,13 @@
 /**
  * Lists the inventory of intents and their states.
  */
+@Service
 @Command(scope = "onos", name = "intent-compilers",
         description = "Lists the mapping from intent type to compiler component")
 public class IntentListCompilers extends AbstractShellCommand {
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         IntentExtensionService service = get(IntentExtensionService.class);
         OptionalInt length = service.getCompilers().keySet().stream()
                 .mapToInt(s -> s.getName().length())
diff --git a/cli/src/main/java/org/onosproject/cli/net/IntentListInstallers.java b/cli/src/main/java/org/onosproject/cli/net/IntentListInstallers.java
index 44ee963..10e8270 100644
--- a/cli/src/main/java/org/onosproject/cli/net/IntentListInstallers.java
+++ b/cli/src/main/java/org/onosproject/cli/net/IntentListInstallers.java
@@ -15,7 +15,8 @@
  */
 package org.onosproject.cli.net;
 
-import org.apache.karaf.shell.commands.Command;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.net.intent.IntentExtensionService;
 
@@ -24,11 +25,12 @@
 /**
  * Lists the installers of intents.
  */
+@Service
 @Command(scope = "onos", name = "intent-installers",
         description = "Lists the mapping from intent type to installer component")
 public class IntentListInstallers extends AbstractShellCommand {
     @Override
-    protected void execute() {
+    protected void doExecute() {
         IntentExtensionService service = get(IntentExtensionService.class);
         OptionalInt length = service.getInstallers().keySet().stream()
                 .mapToInt(s -> s.getName().length())
diff --git a/cli/src/main/java/org/onosproject/cli/net/IntentPurgeCommand.java b/cli/src/main/java/org/onosproject/cli/net/IntentPurgeCommand.java
index ec067b7..203be80 100644
--- a/cli/src/main/java/org/onosproject/cli/net/IntentPurgeCommand.java
+++ b/cli/src/main/java/org/onosproject/cli/net/IntentPurgeCommand.java
@@ -15,7 +15,8 @@
  */
 package org.onosproject.cli.net;
 
-import org.apache.karaf.shell.commands.Command;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.net.intent.Intent;
 import org.onosproject.net.intent.IntentService;
@@ -25,11 +26,12 @@
 /**
  * Purges all WITHDRAWN intents.
  */
+@Service
 @Command(scope = "onos", name = "purge-intents",
          description = "Purges all WITHDRAWN intents")
 public class IntentPurgeCommand extends AbstractShellCommand {
     @Override
-    protected void execute() {
+    protected void doExecute() {
         IntentService intentService = get(IntentService.class);
         for (Intent intent: intentService.getIntents()) {
             if (intentService.getIntentState(intent.key()) == WITHDRAWN) {
diff --git a/cli/src/main/java/org/onosproject/cli/net/IntentPushTestCommand.java b/cli/src/main/java/org/onosproject/cli/net/IntentPushTestCommand.java
index 4fcb0c8..bc51f88 100644
--- a/cli/src/main/java/org/onosproject/cli/net/IntentPushTestCommand.java
+++ b/cli/src/main/java/org/onosproject/cli/net/IntentPushTestCommand.java
@@ -16,9 +16,12 @@
 package org.onosproject.cli.net;
 
 import com.google.common.collect.Lists;
-import org.apache.karaf.shell.commands.Argument;
-import org.apache.karaf.shell.commands.Command;
-import org.apache.karaf.shell.commands.Option;
+import org.apache.karaf.shell.api.action.Argument;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.Completion;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
+import org.apache.karaf.shell.api.action.Option;
+import org.apache.karaf.shell.support.completers.NullCompleter;
 import org.onlab.packet.Ethernet;
 import org.onlab.packet.MacAddress;
 import org.onosproject.cli.AbstractShellCommand;
@@ -50,6 +53,7 @@
 /**
  * Installs bulk point-to-point connectivity intents between given ingress/egress devices.
  */
+@Service
 @Command(scope = "onos", name = "push-test-intents",
          description = "Installs random intents to test throughput")
 public class IntentPushTestCommand extends AbstractShellCommand
@@ -58,16 +62,19 @@
     @Argument(index = 0, name = "ingressDevice",
               description = "Ingress Device/Port Description",
               required = true, multiValued = false)
+    @Completion(ConnectPointCompleter.class)
     String ingressDeviceString = null;
 
     @Argument(index = 1, name = "egressDevice",
               description = "Egress Device/Port Description",
               required = true, multiValued = false)
+    @Completion(ConnectPointCompleter.class)
     String egressDeviceString = null;
 
     @Argument(index = 2, name = "numberOfIntents",
             description = "Number of intents to install/withdraw",
             required = true, multiValued = false)
+    @Completion(NullCompleter.class)
     String numberOfIntents = null;
 
     @Argument(index = 3, name = "keyOffset",
@@ -95,7 +102,7 @@
     List<Key> keysForWithdraw = new ArrayList<>();
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         service = get(IntentService.class);
 
 
diff --git a/cli/src/main/java/org/onosproject/cli/net/IntentRemoveCommand.java b/cli/src/main/java/org/onosproject/cli/net/IntentRemoveCommand.java
index cadae7e..6a9c8aa0 100644
--- a/cli/src/main/java/org/onosproject/cli/net/IntentRemoveCommand.java
+++ b/cli/src/main/java/org/onosproject/cli/net/IntentRemoveCommand.java
@@ -16,10 +16,13 @@
 package org.onosproject.cli.net;
 
 import com.google.common.collect.ImmutableList;
-import org.apache.karaf.shell.commands.Argument;
-import org.apache.karaf.shell.commands.Command;
-import org.apache.karaf.shell.commands.Option;
+import org.apache.karaf.shell.api.action.Argument;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.Completion;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
+import org.apache.karaf.shell.api.action.Option;
 import org.onosproject.cli.AbstractShellCommand;
+import org.onosproject.cli.app.ApplicationIdWithIntentNameCompleter;
 import org.onosproject.core.ApplicationId;
 import org.onosproject.core.CoreService;
 import org.onosproject.net.intent.Intent;
@@ -45,6 +48,7 @@
 /**
  * Removes an intent.
  */
+@Service
 @Command(scope = "onos", name = "remove-intent",
         description = "Removes the specified intent")
 public class IntentRemoveCommand extends AbstractShellCommand {
@@ -52,11 +56,13 @@
     @Argument(index = 0, name = "app",
             description = "Application ID",
             required = false, multiValued = false)
+    @Completion(ApplicationIdWithIntentNameCompleter.class)
     String applicationIdString = null;
 
     @Argument(index = 1, name = "key",
             description = "Intent Key",
             required = false, multiValued = false)
+    @Completion(IntentKeyCompleter.class)
     String keyString = null;
 
     @Option(name = "-p", aliases = "--purge",
@@ -72,7 +78,7 @@
     private static final EnumSet<IntentState> CAN_PURGE = EnumSet.of(WITHDRAWN, FAILED);
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         IntentService intentService = get(IntentService.class);
         removeIntent(intentService.getIntents(),
              applicationIdString, keyString,
diff --git a/cli/src/main/java/org/onosproject/cli/net/IntentsDiagnosisCommand.java b/cli/src/main/java/org/onosproject/cli/net/IntentsDiagnosisCommand.java
index 1dc1d8d..da9ae55 100644
--- a/cli/src/main/java/org/onosproject/cli/net/IntentsDiagnosisCommand.java
+++ b/cli/src/main/java/org/onosproject/cli/net/IntentsDiagnosisCommand.java
@@ -19,9 +19,11 @@
 import com.google.common.collect.ImmutableSet;
 import com.google.common.collect.SetMultimap;
 import com.google.common.collect.Streams;
-import org.apache.karaf.shell.commands.Argument;
-import org.apache.karaf.shell.commands.Command;
-import org.apache.karaf.shell.commands.Option;
+import org.apache.karaf.shell.api.action.Argument;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.Completion;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
+import org.apache.karaf.shell.api.action.Option;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.net.AnnotationKeys;
 import org.onosproject.net.ConnectPoint;
@@ -56,6 +58,7 @@
 import java.util.Set;
 import java.util.stream.Stream;
 
+@Service
 @Command(scope = "onos", name = "intents-diagnosis",
         description = "Diagnosis intents")
 public class IntentsDiagnosisCommand extends AbstractShellCommand {
@@ -63,6 +66,7 @@
     @Argument(index = 0, name = "key",
             description = "Intent key",
             required = false, multiValued = false)
+    @Completion(IntentKeyCompleter.class)
     String key = null;
 
     @Option(name = "-d", aliases = "--details", description = "printing intent details",
@@ -77,7 +81,7 @@
     private static final String FIELD_INTENTS_BY_LINK = "intentsByLink";
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
 
         print("intents-diagnosis");
         ServiceRefs svcRefs = buildServiceRefs();
diff --git a/cli/src/main/java/org/onosproject/cli/net/IntentsListCommand.java b/cli/src/main/java/org/onosproject/cli/net/IntentsListCommand.java
index 20c8b34..0f0c448 100644
--- a/cli/src/main/java/org/onosproject/cli/net/IntentsListCommand.java
+++ b/cli/src/main/java/org/onosproject/cli/net/IntentsListCommand.java
@@ -23,8 +23,9 @@
 import com.google.common.collect.Lists;
 import com.google.common.collect.Sets;
 import org.apache.commons.lang.StringUtils;
-import org.apache.karaf.shell.commands.Command;
-import org.apache.karaf.shell.commands.Option;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
+import org.apache.karaf.shell.api.action.Option;
 import org.onlab.util.StringFilter;
 import org.onlab.util.Tools;
 import org.onosproject.cli.AbstractShellCommand;
@@ -63,6 +64,7 @@
 /**
  * Lists the inventory of intents and their states.
  */
+@Service
 @Command(scope = "onos", name = "intents",
          description = "Lists the inventory of intents and their states")
 public class IntentsListCommand extends AbstractShellCommand {
@@ -181,7 +183,7 @@
     private WorkPartitionService workPartitionService;
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         service = get(IntentService.class);
         workPartitionService = get(WorkPartitionService.class);
 
diff --git a/cli/src/main/java/org/onosproject/cli/net/InterfaceAddCommand.java b/cli/src/main/java/org/onosproject/cli/net/InterfaceAddCommand.java
index 32d8f2a..ee11157 100644
--- a/cli/src/main/java/org/onosproject/cli/net/InterfaceAddCommand.java
+++ b/cli/src/main/java/org/onosproject/cli/net/InterfaceAddCommand.java
@@ -17,12 +17,15 @@
 package org.onosproject.cli.net;
 
 import com.google.common.collect.Lists;
-import org.apache.karaf.shell.commands.Argument;
-import org.apache.karaf.shell.commands.Command;
-import org.apache.karaf.shell.commands.Option;
+import org.apache.karaf.shell.api.action.Argument;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.Completion;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
+import org.apache.karaf.shell.api.action.Option;
 import org.onlab.packet.MacAddress;
 import org.onlab.packet.VlanId;
 import org.onosproject.cli.AbstractShellCommand;
+import org.onosproject.cli.PlaceholderCompleter;
 import org.onosproject.net.intf.Interface;
 import org.onosproject.net.intf.InterfaceAdminService;
 import org.onosproject.net.ConnectPoint;
@@ -33,6 +36,7 @@
 /**
  * Adds a new interface configuration.
  */
+@Service
 @Command(scope = "onos", name = "interface-add",
         description = "Adds a new configured interface")
 public class InterfaceAddCommand extends AbstractShellCommand {
@@ -40,10 +44,12 @@
     @Argument(index = 0, name = "port",
             description = "Device port that the interface is associated with",
             required = true, multiValued = false)
+    @Completion(ConnectPointCompleter.class)
     private String connectPoint = null;
 
     @Argument(index = 1, name = "name", description = "Interface name",
             required = true, multiValued = false)
+    @Completion(PlaceholderCompleter.class)
     private String name = null;
 
     @Option(name = "-m", aliases = "--mac",
@@ -63,7 +69,7 @@
     private String vlan = null;
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         InterfaceAdminService interfaceService = get(InterfaceAdminService.class);
 
         List<InterfaceIpAddress> ipAddresses = Lists.newArrayList();
diff --git a/cli/src/main/java/org/onosproject/cli/net/InterfaceRemoveCommand.java b/cli/src/main/java/org/onosproject/cli/net/InterfaceRemoveCommand.java
index c98bb20..f379286 100644
--- a/cli/src/main/java/org/onosproject/cli/net/InterfaceRemoveCommand.java
+++ b/cli/src/main/java/org/onosproject/cli/net/InterfaceRemoveCommand.java
@@ -16,15 +16,19 @@
 
 package org.onosproject.cli.net;
 
-import org.apache.karaf.shell.commands.Argument;
-import org.apache.karaf.shell.commands.Command;
+import org.apache.karaf.shell.api.action.Argument;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.Completion;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.cli.AbstractShellCommand;
+import org.onosproject.cli.net.completer.InterfaceNameCompleter;
 import org.onosproject.net.intf.InterfaceAdminService;
 import org.onosproject.net.ConnectPoint;
 
 /**
  * Removes an interface configuration.
  */
+@Service
 @Command(scope = "onos", name = "interface-remove",
         description = "Removes a configured interface")
 public class InterfaceRemoveCommand extends AbstractShellCommand {
@@ -32,15 +36,17 @@
     @Argument(index = 0, name = "connectPoint",
             description = "Connect point of the interface",
             required = true, multiValued = false)
+    @Completion(ConnectPointCompleter.class)
     private String connectPoint = null;
 
     @Argument(index = 1, name = "name",
             description = "Interface name",
             required = true, multiValued = false)
+    @Completion(InterfaceNameCompleter.class)
     private String name = null;
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         InterfaceAdminService interfaceService = get(InterfaceAdminService.class);
 
         boolean success = interfaceService.remove(
diff --git a/cli/src/main/java/org/onosproject/cli/net/InterfacesListCommand.java b/cli/src/main/java/org/onosproject/cli/net/InterfacesListCommand.java
index deda244..34e7417 100644
--- a/cli/src/main/java/org/onosproject/cli/net/InterfacesListCommand.java
+++ b/cli/src/main/java/org/onosproject/cli/net/InterfacesListCommand.java
@@ -16,7 +16,8 @@
 package org.onosproject.cli.net;
 
 import com.google.common.collect.Lists;
-import org.apache.karaf.shell.commands.Command;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onlab.packet.MacAddress;
 import org.onlab.packet.VlanId;
 import org.onosproject.cli.AbstractShellCommand;
@@ -30,6 +31,7 @@
 /**
  * Lists all configured interfaces.
  */
+@Service
 @Command(scope = "onos", name = "interfaces",
         description = "Lists all configured interfaces.")
 public class InterfacesListCommand extends AbstractShellCommand {
@@ -45,7 +47,7 @@
     private static final String NO_NAME = "(unamed)";
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         InterfaceService interfaceService = get(InterfaceService.class);
 
         List<Interface> interfaces = Lists.newArrayList(interfaceService.getInterfaces());
diff --git a/cli/src/main/java/org/onosproject/cli/net/IpProtocolCompleter.java b/cli/src/main/java/org/onosproject/cli/net/IpProtocolCompleter.java
index 28e68e9..b7b471f 100644
--- a/cli/src/main/java/org/onosproject/cli/net/IpProtocolCompleter.java
+++ b/cli/src/main/java/org/onosproject/cli/net/IpProtocolCompleter.java
@@ -18,15 +18,19 @@
 import java.util.List;
 import java.util.SortedSet;
 
-import org.apache.karaf.shell.console.Completer;
-import org.apache.karaf.shell.console.completer.StringsCompleter;
+import org.apache.karaf.shell.api.console.CommandLine;
+import org.apache.karaf.shell.api.console.Completer;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
+import org.apache.karaf.shell.api.console.Session;
+import org.apache.karaf.shell.support.completers.StringsCompleter;
 
 /**
  * IP protocol completer.
  */
+@Service
 public class IpProtocolCompleter implements Completer {
     @Override
-    public int complete(String buffer, int cursor, List<String> candidates) {
+    public int complete(Session session, CommandLine commandLine, List<String> candidates) {
         // Delegate string completer
         StringsCompleter delegate = new StringsCompleter();
         SortedSet<String> strings = delegate.getStrings();
@@ -36,7 +40,7 @@
         }
 
         // Now let the completer do the work for figuring out what to offer.
-        return delegate.complete(buffer, cursor, candidates);
+        return delegate.complete(session, commandLine, candidates);
     }
 
 }
diff --git a/cli/src/main/java/org/onosproject/cli/net/LabelApplyCommand.java b/cli/src/main/java/org/onosproject/cli/net/LabelApplyCommand.java
index 290f4a8..739e129 100644
--- a/cli/src/main/java/org/onosproject/cli/net/LabelApplyCommand.java
+++ b/cli/src/main/java/org/onosproject/cli/net/LabelApplyCommand.java
@@ -18,14 +18,16 @@
 import java.util.Collection;
 import java.util.Iterator;
 
-import org.apache.karaf.shell.commands.Argument;
-import org.apache.karaf.shell.commands.Command;
+import org.apache.karaf.shell.api.action.Argument;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.net.DeviceId;
 import org.onosproject.incubator.net.resource.label.DefaultLabelResource;
 import org.onosproject.incubator.net.resource.label.LabelResource;
 import org.onosproject.incubator.net.resource.label.LabelResourceService;
 
+@Service
 @Command(scope = "onos", name = "label-apply",
       description = "Apply label resource from device pool by specific device id")
 public class LabelApplyCommand extends AbstractShellCommand {
@@ -41,7 +43,7 @@
     private static final String FMT = "deviceid=%s, labelresourceid=%s";
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         LabelResourceService lrs = get(LabelResourceService.class);
         Collection<LabelResource> result = lrs.applyFromDevicePool(DeviceId
                 .deviceId(deviceId), Long.parseLong(applyNum));
diff --git a/cli/src/main/java/org/onosproject/cli/net/LabelPoolCreateCommand.java b/cli/src/main/java/org/onosproject/cli/net/LabelPoolCreateCommand.java
index 9feee57..3b27b95 100644
--- a/cli/src/main/java/org/onosproject/cli/net/LabelPoolCreateCommand.java
+++ b/cli/src/main/java/org/onosproject/cli/net/LabelPoolCreateCommand.java
@@ -15,8 +15,9 @@
  */
 package org.onosproject.cli.net;
 
-import org.apache.karaf.shell.commands.Argument;
-import org.apache.karaf.shell.commands.Command;
+import org.apache.karaf.shell.api.action.Argument;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.net.DeviceId;
 import org.onosproject.incubator.net.resource.label.LabelResourceAdminService;
@@ -25,6 +26,7 @@
 /**
  * create label resource pool by specific device id.
  */
+@Service
 @Command(scope = "onos", name = "label-pool-create",
      description = "Creates label resource pool by a specific device id")
 public class LabelPoolCreateCommand extends AbstractShellCommand {
@@ -38,7 +40,7 @@
     String endLabel = null;
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         LabelResourceAdminService lrs = get(LabelResourceAdminService.class);
         lrs.createDevicePool(DeviceId.deviceId(deviceId), LabelResourceId
                 .labelResourceId(Long.parseLong(beginLabel)), LabelResourceId
diff --git a/cli/src/main/java/org/onosproject/cli/net/LabelPoolDestroyCommand.java b/cli/src/main/java/org/onosproject/cli/net/LabelPoolDestroyCommand.java
index 2bd9418..74aa26d 100644
--- a/cli/src/main/java/org/onosproject/cli/net/LabelPoolDestroyCommand.java
+++ b/cli/src/main/java/org/onosproject/cli/net/LabelPoolDestroyCommand.java
@@ -15,12 +15,14 @@
  */
 package org.onosproject.cli.net;
 
-import org.apache.karaf.shell.commands.Argument;
-import org.apache.karaf.shell.commands.Command;
+import org.apache.karaf.shell.api.action.Argument;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.net.DeviceId;
 import org.onosproject.incubator.net.resource.label.LabelResourceAdminService;
 
+@Service
 @Command(scope = "onos", name = "label-pool-destroy",
     description = "Destroys label resource pool by a specific device id")
 public class LabelPoolDestroyCommand extends AbstractShellCommand {
@@ -28,7 +30,7 @@
     String deviceId = null;
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         LabelResourceAdminService lrs = get(LabelResourceAdminService.class);
         lrs.destroyDevicePool(DeviceId.deviceId(deviceId));
     }
diff --git a/cli/src/main/java/org/onosproject/cli/net/LabelReleaseCommand.java b/cli/src/main/java/org/onosproject/cli/net/LabelReleaseCommand.java
index df84f3f..a4e89c0 100644
--- a/cli/src/main/java/org/onosproject/cli/net/LabelReleaseCommand.java
+++ b/cli/src/main/java/org/onosproject/cli/net/LabelReleaseCommand.java
@@ -15,8 +15,9 @@
  */
 package org.onosproject.cli.net;
 
-import org.apache.karaf.shell.commands.Argument;
-import org.apache.karaf.shell.commands.Command;
+import org.apache.karaf.shell.api.action.Argument;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.net.DeviceId;
 import org.onosproject.incubator.net.resource.label.DefaultLabelResource;
@@ -27,6 +28,7 @@
 import com.google.common.collect.ArrayListMultimap;
 import com.google.common.collect.Multimap;
 
+@Service
 @Command(scope = "onos", name = "label-release",
 description = "Releases label ids to label resource pool by a specific device id")
 public class LabelReleaseCommand extends AbstractShellCommand {
@@ -40,7 +42,7 @@
     String releaseLabelIds = null;
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         LabelResourceService lrs = get(LabelResourceService.class);
         Multimap<DeviceId, LabelResource> map = ArrayListMultimap
                 .create();
diff --git a/cli/src/main/java/org/onosproject/cli/net/LabelResourceCommand.java b/cli/src/main/java/org/onosproject/cli/net/LabelResourceCommand.java
index f381085..1221f23 100644
--- a/cli/src/main/java/org/onosproject/cli/net/LabelResourceCommand.java
+++ b/cli/src/main/java/org/onosproject/cli/net/LabelResourceCommand.java
@@ -15,13 +15,15 @@
  */
 package org.onosproject.cli.net;
 
-import org.apache.karaf.shell.commands.Argument;
-import org.apache.karaf.shell.commands.Command;
+import org.apache.karaf.shell.api.action.Argument;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.net.DeviceId;
 import org.onosproject.incubator.net.resource.label.LabelResourcePool;
 import org.onosproject.incubator.net.resource.label.LabelResourceService;
 
+@Service
 @Command(scope = "onos", name = "label-pool",
       description = "Gets label resource pool information by a specific device id")
 public class LabelResourceCommand extends AbstractShellCommand {
@@ -33,7 +35,7 @@
             + "releaseLabelIds=%s";
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         LabelResourceService lrs = get(LabelResourceService.class);
         LabelResourcePool pool = lrs.getDeviceLabelResourcePool(DeviceId
                 .deviceId(deviceId));
diff --git a/cli/src/main/java/org/onosproject/cli/net/LayoutAddCommand.java b/cli/src/main/java/org/onosproject/cli/net/LayoutAddCommand.java
index f4d6a94..95ddba8 100644
--- a/cli/src/main/java/org/onosproject/cli/net/LayoutAddCommand.java
+++ b/cli/src/main/java/org/onosproject/cli/net/LayoutAddCommand.java
@@ -15,8 +15,9 @@
  */
 package org.onosproject.cli.net;
 
-import org.apache.karaf.shell.commands.Argument;
-import org.apache.karaf.shell.commands.Command;
+import org.apache.karaf.shell.api.action.Argument;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.net.region.Region;
 import org.onosproject.net.region.RegionService;
@@ -41,6 +42,7 @@
  * layout-add root @bayareaGEO . . 1.2 0.0 -4.0
  * </pre>
  */
+@Service
 @Command(scope = "onos", name = "layout-add",
         description = "Adds a new UI layout.")
 public class LayoutAddCommand extends AbstractShellCommand {
@@ -86,7 +88,7 @@
     private RegionService regionService;
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         UiTopoLayoutService service = get(UiTopoLayoutService.class);
         RegionService regionService = get(RegionService.class);
 
diff --git a/cli/src/main/java/org/onosproject/cli/net/LayoutListCommand.java b/cli/src/main/java/org/onosproject/cli/net/LayoutListCommand.java
index 358a9ef..cf7300d 100644
--- a/cli/src/main/java/org/onosproject/cli/net/LayoutListCommand.java
+++ b/cli/src/main/java/org/onosproject/cli/net/LayoutListCommand.java
@@ -16,8 +16,9 @@
 
 package org.onosproject.cli.net;
 
-import org.apache.karaf.shell.commands.Argument;
-import org.apache.karaf.shell.commands.Command;
+import org.apache.karaf.shell.api.action.Argument;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.ui.UiTopoLayoutService;
 import org.onosproject.ui.model.topo.UiTopoLayout;
@@ -32,6 +33,7 @@
 /**
  * List layout details.
  */
+@Service
 @Command(scope = "onos", name = "layouts",
         description = "List layout details")
 public class LayoutListCommand extends AbstractShellCommand {
@@ -45,7 +47,7 @@
     private UiTopoLayoutService layoutService;
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         layoutService = get(UiTopoLayoutService.class);
         if (id == null) {
             for (UiTopoLayout layout : getSortedLayouts(layoutService)) {
diff --git a/cli/src/main/java/org/onosproject/cli/net/LeaderCommand.java b/cli/src/main/java/org/onosproject/cli/net/LeaderCommand.java
index 51601d2..7139b86 100644
--- a/cli/src/main/java/org/onosproject/cli/net/LeaderCommand.java
+++ b/cli/src/main/java/org/onosproject/cli/net/LeaderCommand.java
@@ -18,9 +18,10 @@
 import com.fasterxml.jackson.databind.JsonNode;
 import com.fasterxml.jackson.databind.ObjectMapper;
 import com.fasterxml.jackson.databind.node.ArrayNode;
-import org.apache.karaf.shell.commands.Argument;
-import org.apache.karaf.shell.commands.Command;
-import org.apache.karaf.shell.commands.Option;
+import org.apache.karaf.shell.api.action.Argument;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
+import org.apache.karaf.shell.api.action.Option;
 import org.onlab.util.Tools;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.cluster.Leadership;
@@ -35,6 +36,7 @@
 /**
  * Prints the leader for every topic.
  */
+@Service
 @Command(scope = "onos", name = "leaders",
         description = "Finds the leader for particular topic.")
 public class LeaderCommand extends AbstractShellCommand {
@@ -134,7 +136,7 @@
     }
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         LeadershipAdminService leaderService = get(LeadershipAdminService.class);
         Map<String, Leadership> leaderBoard = leaderService.getLeaderBoard();
         if (topicPattern == null) {
diff --git a/cli/src/main/java/org/onosproject/cli/net/LinkDstCompleter.java b/cli/src/main/java/org/onosproject/cli/net/LinkDstCompleter.java
index d4234f6..cccec10 100644
--- a/cli/src/main/java/org/onosproject/cli/net/LinkDstCompleter.java
+++ b/cli/src/main/java/org/onosproject/cli/net/LinkDstCompleter.java
@@ -15,8 +15,10 @@
  */
 package org.onosproject.cli.net;
 
-import org.apache.karaf.shell.console.completer.ArgumentCompleter;
-import org.apache.karaf.shell.console.completer.StringsCompleter;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
+import org.apache.karaf.shell.api.console.CommandLine;
+import org.apache.karaf.shell.api.console.Session;
+import org.apache.karaf.shell.support.completers.StringsCompleter;
 import org.onosproject.cli.AbstractCompleter;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.net.ConnectPoint;
@@ -28,9 +30,10 @@
 /**
  * Link destination end-point completer.
  */
+@Service
 public class LinkDstCompleter extends AbstractCompleter {
     @Override
-    public int complete(String buffer, int cursor, List<String> candidates) {
+    public int complete(Session session, CommandLine commandLine, List<String> candidates) {
         // Delegate string completer
         StringsCompleter delegate = new StringsCompleter();
 
@@ -38,8 +41,7 @@
         LinkService service = AbstractShellCommand.get(LinkService.class);
 
         // Link source the previous argument.
-        ArgumentCompleter.ArgumentList list = getArgumentList();
-        String srcArg = list.getArguments()[list.getCursorArgumentIndex() - 1];
+        String srcArg = commandLine.getArguments()[commandLine.getCursorArgumentIndex() - 1];
 
         // Generate the device ID/port number identifiers
         SortedSet<String> strings = delegate.getStrings();
@@ -53,7 +55,7 @@
         }
 
         // Now let the completer do the work for figuring out what to offer.
-        return delegate.complete(buffer, cursor, candidates);
+        return delegate.complete(session, commandLine, candidates);
     }
 
 }
diff --git a/cli/src/main/java/org/onosproject/cli/net/LinkSrcCompleter.java b/cli/src/main/java/org/onosproject/cli/net/LinkSrcCompleter.java
index 8a04832..27e6881 100644
--- a/cli/src/main/java/org/onosproject/cli/net/LinkSrcCompleter.java
+++ b/cli/src/main/java/org/onosproject/cli/net/LinkSrcCompleter.java
@@ -15,7 +15,10 @@
  */
 package org.onosproject.cli.net;
 
-import org.apache.karaf.shell.console.completer.StringsCompleter;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
+import org.apache.karaf.shell.api.console.CommandLine;
+import org.apache.karaf.shell.api.console.Session;
+import org.apache.karaf.shell.support.completers.StringsCompleter;
 import org.onosproject.cli.AbstractCompleter;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.net.link.LinkService;
@@ -26,9 +29,10 @@
 /**
  * Link source end-point completer.
  */
+@Service
 public class LinkSrcCompleter extends AbstractCompleter {
     @Override
-    public int complete(String buffer, int cursor, List<String> candidates) {
+    public int complete(Session session, CommandLine commandLine, List<String> candidates) {
         // Delegate string completer
         StringsCompleter delegate = new StringsCompleter();
 
@@ -42,7 +46,7 @@
                                                      "/" + link.src().port()));
 
         // Now let the completer do the work for figuring out what to offer.
-        return delegate.complete(buffer, cursor, candidates);
+        return delegate.complete(session, commandLine, candidates);
     }
 
 }
diff --git a/cli/src/main/java/org/onosproject/cli/net/LinksListCommand.java b/cli/src/main/java/org/onosproject/cli/net/LinksListCommand.java
index 47e72a2..c1667e9 100644
--- a/cli/src/main/java/org/onosproject/cli/net/LinksListCommand.java
+++ b/cli/src/main/java/org/onosproject/cli/net/LinksListCommand.java
@@ -15,8 +15,10 @@
  */
 package org.onosproject.cli.net;
 
-import org.apache.karaf.shell.commands.Argument;
-import org.apache.karaf.shell.commands.Command;
+import org.apache.karaf.shell.api.action.Argument;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.Completion;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onlab.util.Tools;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.net.Link;
@@ -34,6 +36,7 @@
 /**
  * Lists all infrastructure links.
  */
+@Service
 @Command(scope = "onos", name = "links",
          description = "Lists all infrastructure links")
 public class LinksListCommand extends AbstractShellCommand {
@@ -43,10 +46,11 @@
 
     @Argument(index = 0, name = "uri", description = "Device ID",
               required = false, multiValued = false)
+    @Completion(DeviceIdCompleter.class)
     String uri = null;
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         LinkService service = get(LinkService.class);
         Iterable<Link> links = uri != null ?
                 service.getDeviceLinks(deviceId(uri)) : service.getLinks();
diff --git a/cli/src/main/java/org/onosproject/cli/net/MapsListCommand.java b/cli/src/main/java/org/onosproject/cli/net/MapsListCommand.java
index 4e31fcd..1025208 100644
--- a/cli/src/main/java/org/onosproject/cli/net/MapsListCommand.java
+++ b/cli/src/main/java/org/onosproject/cli/net/MapsListCommand.java
@@ -17,7 +17,8 @@
 
 import java.util.List;
 
-import org.apache.karaf.shell.commands.Command;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.store.service.MapInfo;
 import org.onosproject.store.service.StorageAdminService;
@@ -30,6 +31,7 @@
 /**
  * Command to list the various maps in the system.
  */
+@Service
 @Command(scope = "onos", name = "maps",
         description = "Lists information about consistent maps in the system")
 public class MapsListCommand extends AbstractShellCommand {
@@ -71,7 +73,7 @@
     }
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         StorageAdminService storageAdminService = get(StorageAdminService.class);
         List<MapInfo> mapInfo = storageAdminService.getMapInfo();
         if (outputJson()) {
diff --git a/cli/src/main/java/org/onosproject/cli/net/McastDeleteCommand.java b/cli/src/main/java/org/onosproject/cli/net/McastDeleteCommand.java
index 26dbfde..a5ad5fe 100644
--- a/cli/src/main/java/org/onosproject/cli/net/McastDeleteCommand.java
+++ b/cli/src/main/java/org/onosproject/cli/net/McastDeleteCommand.java
@@ -15,10 +15,13 @@
  */
 package org.onosproject.cli.net;
 
-import org.apache.karaf.shell.commands.Argument;
-import org.apache.karaf.shell.commands.Command;
+import org.apache.karaf.shell.api.action.Argument;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.Completion;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onlab.packet.IpAddress;
 import org.onosproject.cli.AbstractShellCommand;
+import org.onosproject.cli.PlaceholderCompleter;
 import org.onosproject.net.ConnectPoint;
 import org.onosproject.net.mcast.McastRoute;
 import org.onosproject.net.mcast.MulticastRouteService;
@@ -26,6 +29,7 @@
 /**
  * Deletes a multicast route.
  */
+@Service
 @Command(scope = "onos", name = "mcast-delete",
         description = "Delete a multicast route flow")
 public class McastDeleteCommand extends AbstractShellCommand {
@@ -41,21 +45,24 @@
     @Argument(index = 0, name = "sAddr",
             description = "IP Address of the multicast source. '*' can be used for any source (*, G) entry",
             required = true, multiValued = false)
+    @Completion(PlaceholderCompleter.class)
     String sAddr = null;
 
     @Argument(index = 1, name = "gAddr",
             description = "IP Address of the multicast group. '*' can be used to denote all groups",
             required = true, multiValued = false)
+    @Completion(McastGroupCompleter.class)
     String gAddr = null;
 
     @Argument(index = 2, name = "egressList",
             description = "Egress id/port",
             required = false, multiValued = true)
+    @Completion(ConnectPointCompleter.class)
     String[] egressList = null;
 
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         MulticastRouteService mcastRouteManager = get(MulticastRouteService.class);
 
         if ("*".equals(sAddr) && "*".equals(gAddr)) {
diff --git a/cli/src/main/java/org/onosproject/cli/net/McastGroupCompleter.java b/cli/src/main/java/org/onosproject/cli/net/McastGroupCompleter.java
index 6700b97..2ba40d3 100644
--- a/cli/src/main/java/org/onosproject/cli/net/McastGroupCompleter.java
+++ b/cli/src/main/java/org/onosproject/cli/net/McastGroupCompleter.java
@@ -16,6 +16,7 @@
 
 package org.onosproject.cli.net;
 
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onlab.packet.IpAddress;
 import org.onlab.util.Tools;
 import org.onosproject.cli.AbstractChoicesCompleter;
@@ -29,6 +30,7 @@
 /**
  * Mcast group Completer.
  */
+@Service
 public class McastGroupCompleter extends AbstractChoicesCompleter {
 
     @Override
diff --git a/cli/src/main/java/org/onosproject/cli/net/McastJoinCommand.java b/cli/src/main/java/org/onosproject/cli/net/McastJoinCommand.java
index 83969a8..e0d8047 100644
--- a/cli/src/main/java/org/onosproject/cli/net/McastJoinCommand.java
+++ b/cli/src/main/java/org/onosproject/cli/net/McastJoinCommand.java
@@ -15,10 +15,13 @@
  */
 package org.onosproject.cli.net;
 
-import org.apache.karaf.shell.commands.Argument;
-import org.apache.karaf.shell.commands.Command;
+import org.apache.karaf.shell.api.action.Argument;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.Completion;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onlab.packet.IpAddress;
 import org.onosproject.cli.AbstractShellCommand;
+import org.onosproject.cli.PlaceholderCompleter;
 import org.onosproject.net.ConnectPoint;
 import org.onosproject.net.mcast.McastRoute;
 import org.onosproject.net.mcast.MulticastRouteService;
@@ -26,6 +29,7 @@
 /**
  * Installs a source, multicast group flow.
  */
+@Service
 @Command(scope = "onos", name = "mcast-join",
          description = "Installs a source, multicast group flow")
 public class McastJoinCommand extends AbstractShellCommand {
@@ -37,16 +41,19 @@
     @Argument(index = 0, name = "sAddr",
               description = "IP Address of the multicast source. '*' can be used for any source (*, G) entry",
               required = true, multiValued = false)
+    @Completion(PlaceholderCompleter.class)
     String sAddr = null;
 
     @Argument(index = 1, name = "gAddr",
               description = "IP Address of the multicast group",
               required = true, multiValued = false)
+    @Completion(McastGroupCompleter.class)
     String gAddr = null;
 
     @Argument(index = 2, name = "ingressPort",
             description = "Ingress port of:XXXXXXXXXX/XX",
             required = false, multiValued = false)
+    @Completion(ConnectPointCompleter.class)
     String ingressPort = null;
 
     @Argument(index = 3, name = "ports",
@@ -55,7 +62,7 @@
     String[] ports = null;
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         MulticastRouteService mcastRouteManager = get(MulticastRouteService.class);
 
         McastRoute mRoute = new McastRoute(IpAddress.valueOf(sAddr),
diff --git a/cli/src/main/java/org/onosproject/cli/net/McastRoutesListCommand.java b/cli/src/main/java/org/onosproject/cli/net/McastRoutesListCommand.java
index 003e53c..146729a 100644
--- a/cli/src/main/java/org/onosproject/cli/net/McastRoutesListCommand.java
+++ b/cli/src/main/java/org/onosproject/cli/net/McastRoutesListCommand.java
@@ -15,7 +15,8 @@
  */
 package org.onosproject.cli.net;
 
-import org.apache.karaf.shell.commands.Command;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.net.ConnectPoint;
 import org.onosproject.net.mcast.McastRoute;
@@ -28,6 +29,7 @@
 /**
  * Displays the source, multicast group flows entries.
  */
+@Service
 @Command(scope = "onos", name = "mcast-routes",
         description = "Lists routes in the mcast route store")
 public class McastRoutesListCommand extends AbstractShellCommand {
@@ -48,7 +50,7 @@
     private static final String SINKS = "Sinks";
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         // Get the service
         MulticastRouteService mcastService = get(MulticastRouteService.class);
         // Get the routes
diff --git a/cli/src/main/java/org/onosproject/cli/net/McastShowCommand.java b/cli/src/main/java/org/onosproject/cli/net/McastShowCommand.java
index 91ab0c4..3d9b9b5 100644
--- a/cli/src/main/java/org/onosproject/cli/net/McastShowCommand.java
+++ b/cli/src/main/java/org/onosproject/cli/net/McastShowCommand.java
@@ -15,8 +15,10 @@
  */
 package org.onosproject.cli.net;
 
-import org.apache.karaf.shell.commands.Argument;
-import org.apache.karaf.shell.commands.Command;
+import org.apache.karaf.shell.api.action.Argument;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.Completion;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onlab.packet.IpAddress;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.net.ConnectPoint;
@@ -32,6 +34,7 @@
 /**
  * Displays the source, multicast group flows entries.
  */
+@Service
 @Command(scope = "onos", name = "mcast-show", description = "Displays the source, multicast group flows")
 public class McastShowCommand extends AbstractShellCommand {
 
@@ -40,10 +43,11 @@
 
     @Argument(index = 0, name = "mcastIp", description = "mcast Ip",
             required = false, multiValued = false)
+    @Completion(McastGroupCompleter.class)
     String mcastIp;
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         // Get the service
         MulticastRouteService mcastService = get(MulticastRouteService.class);
         // Get the routes
diff --git a/cli/src/main/java/org/onosproject/cli/net/MeterAddCommand.java b/cli/src/main/java/org/onosproject/cli/net/MeterAddCommand.java
index 0b23f88..3e71ad9 100644
--- a/cli/src/main/java/org/onosproject/cli/net/MeterAddCommand.java
+++ b/cli/src/main/java/org/onosproject/cli/net/MeterAddCommand.java
@@ -15,9 +15,11 @@
  */
 package org.onosproject.cli.net;
 
-import org.apache.karaf.shell.commands.Argument;
-import org.apache.karaf.shell.commands.Command;
-import org.apache.karaf.shell.commands.Option;
+import org.apache.karaf.shell.api.action.Argument;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.Completion;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
+import org.apache.karaf.shell.api.action.Option;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.core.CoreService;
 import org.onosproject.net.DeviceId;
@@ -36,6 +38,7 @@
 /**
  * Add a meter to a device.
  */
+@Service
 @Command(scope = "onos", name = "meter-add",
         description = "Adds a meter to a device (currently for testing)")
 public class MeterAddCommand extends AbstractShellCommand {
@@ -81,6 +84,7 @@
 
     @Argument(index = 0, name = "uri", description = "Device ID",
             required = true, multiValued = false)
+    @Completion(DeviceIdCompleter.class)
     private String uri = null;
 
     private final String appId = "org.onosproject.cli.meterCmd";
@@ -139,7 +143,7 @@
     }
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         MeterService service = get(MeterService.class);
         CoreService coreService = get(CoreService.class);
 
diff --git a/cli/src/main/java/org/onosproject/cli/net/MeterRemoveCommand.java b/cli/src/main/java/org/onosproject/cli/net/MeterRemoveCommand.java
index 7814476..6c3f1bb 100644
--- a/cli/src/main/java/org/onosproject/cli/net/MeterRemoveCommand.java
+++ b/cli/src/main/java/org/onosproject/cli/net/MeterRemoveCommand.java
@@ -15,8 +15,10 @@
  */
 package org.onosproject.cli.net;
 
-import org.apache.karaf.shell.commands.Argument;
-import org.apache.karaf.shell.commands.Command;
+import org.apache.karaf.shell.api.action.Argument;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.Completion;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.core.CoreService;
 import org.onosproject.net.DeviceId;
@@ -33,12 +35,14 @@
 /**
  * Remove existing meter from device.
  */
+@Service
 @Command(scope = "onos", name = "meter-remove",
         description = "Removes a meter from a device (currently for testing)")
 public class MeterRemoveCommand extends AbstractShellCommand {
 
     @Argument(index = 0, name = "uri", description = "Device ID",
             required = true, multiValued = false)
+    @Completion(DeviceIdCompleter.class)
     private String uri = null;
 
     @Argument(index = 1, name = "meterId", description = "Meter ID hexadecimal value",
@@ -48,7 +52,7 @@
     private final String appId = "org.onosproject.cli.meterCmd";
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         MeterService service = get(MeterService.class);
         CoreService coreService = get(CoreService.class);
 
diff --git a/cli/src/main/java/org/onosproject/cli/net/MetersListCommand.java b/cli/src/main/java/org/onosproject/cli/net/MetersListCommand.java
index 72dca0d..4fe3590 100644
--- a/cli/src/main/java/org/onosproject/cli/net/MetersListCommand.java
+++ b/cli/src/main/java/org/onosproject/cli/net/MetersListCommand.java
@@ -16,8 +16,10 @@
 package org.onosproject.cli.net;
 
 import com.google.common.collect.Collections2;
-import org.apache.karaf.shell.commands.Argument;
-import org.apache.karaf.shell.commands.Command;
+import org.apache.karaf.shell.api.action.Argument;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.Completion;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.net.DeviceId;
 import org.onosproject.net.meter.Meter;
@@ -31,12 +33,14 @@
 /**
  * Lists all meters.
  */
+@Service
 @Command(scope = "onos", name = "meters",
         description = "Shows meters")
 public class MetersListCommand extends AbstractShellCommand {
 
     @Argument(index = 0, name = "uri", description = "Device ID",
             required = false, multiValued = false)
+    @Completion(DeviceIdCompleter.class)
     String uri = null;
 
     @Argument(index = 1, name = "meter", description = "Meter ID",
@@ -46,7 +50,7 @@
     MeterId meterId = null;
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
 
         if (!isNullOrEmpty(meterstr)) {
             meterId = MeterId.meterId(Long.parseLong(meterstr));
diff --git a/cli/src/main/java/org/onosproject/cli/net/NeighbourHandlersListCommand.java b/cli/src/main/java/org/onosproject/cli/net/NeighbourHandlersListCommand.java
index 8ba768b..924400a 100644
--- a/cli/src/main/java/org/onosproject/cli/net/NeighbourHandlersListCommand.java
+++ b/cli/src/main/java/org/onosproject/cli/net/NeighbourHandlersListCommand.java
@@ -16,7 +16,8 @@
 
 package org.onosproject.cli.net;
 
-import org.apache.karaf.shell.commands.Command;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.net.intf.Interface;
 import org.onosproject.net.neighbour.NeighbourResolutionService;
@@ -24,6 +25,7 @@
 /**
  * Lists neighbour message handlers.
  */
+@Service
 @Command(scope = "onos", name = "neighbour-handlers",
         description = "Lists neighbour message handlers")
 public class NeighbourHandlersListCommand extends AbstractShellCommand {
@@ -31,7 +33,7 @@
     private static final String FORMAT = "%20s: interface=%s, class=%s";
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         NeighbourResolutionService service = get(NeighbourResolutionService.class);
 
         service.getHandlerRegistrations().forEach((cp, list) -> {
diff --git a/cli/src/main/java/org/onosproject/cli/net/PacketProcessorsListCommand.java b/cli/src/main/java/org/onosproject/cli/net/PacketProcessorsListCommand.java
index ffc9be2..28a01f7 100644
--- a/cli/src/main/java/org/onosproject/cli/net/PacketProcessorsListCommand.java
+++ b/cli/src/main/java/org/onosproject/cli/net/PacketProcessorsListCommand.java
@@ -18,7 +18,8 @@
 import com.fasterxml.jackson.databind.JsonNode;
 import com.fasterxml.jackson.databind.ObjectMapper;
 import com.fasterxml.jackson.databind.node.ArrayNode;
-import org.apache.karaf.shell.commands.Command;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.net.packet.PacketProcessorEntry;
 import org.onosproject.net.packet.PacketService;
@@ -31,6 +32,7 @@
 /**
  * Lists packet processors.
  */
+@Service
 @Command(scope = "onos", name = "packet-processors",
         description = "Lists packet processors")
 public class PacketProcessorsListCommand extends AbstractShellCommand {
@@ -38,7 +40,7 @@
     private static final String FMT = "priority=%s, class=%s, packets=%d, avgNanos=%d";
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         PacketService service = get(PacketService.class);
         if (outputJson()) {
             print("%s", json(service.getProcessors()));
diff --git a/cli/src/main/java/org/onosproject/cli/net/PacketRequestsListCommand.java b/cli/src/main/java/org/onosproject/cli/net/PacketRequestsListCommand.java
index f3bfc61..ecc2dc1 100644
--- a/cli/src/main/java/org/onosproject/cli/net/PacketRequestsListCommand.java
+++ b/cli/src/main/java/org/onosproject/cli/net/PacketRequestsListCommand.java
@@ -18,7 +18,8 @@
 import com.fasterxml.jackson.databind.JsonNode;
 import com.fasterxml.jackson.databind.ObjectMapper;
 import com.fasterxml.jackson.databind.node.ArrayNode;
-import org.apache.karaf.shell.commands.Command;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.net.packet.PacketRequest;
 import org.onosproject.net.packet.PacketService;
@@ -28,6 +29,7 @@
 /**
  * Lists packet requests.
  */
+@Service
 @Command(scope = "onos", name = "packet-requests",
         description = "Lists packet requests")
 public class PacketRequestsListCommand extends AbstractShellCommand {
@@ -35,7 +37,7 @@
     private static final String FMT = "nodeId=%s appId=%s, priority=%s, criteria=%s, deviceId=%s";
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         PacketService service = get(PacketService.class);
         if (outputJson()) {
             print("%s", json(service.getRequests()));
diff --git a/cli/src/main/java/org/onosproject/cli/net/PartitionsListCommand.java b/cli/src/main/java/org/onosproject/cli/net/PartitionsListCommand.java
index c9df46a..f38c78e 100644
--- a/cli/src/main/java/org/onosproject/cli/net/PartitionsListCommand.java
+++ b/cli/src/main/java/org/onosproject/cli/net/PartitionsListCommand.java
@@ -17,8 +17,9 @@
 
 import java.util.List;
 
-import org.apache.karaf.shell.commands.Command;
-import org.apache.karaf.shell.commands.Option;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
+import org.apache.karaf.shell.api.action.Option;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.cluster.ClusterService;
 import org.onosproject.cluster.ControllerNode;
@@ -37,6 +38,7 @@
 /**
  * Command to list the database partitions in the system.
  */
+@Service
 @Command(scope = "onos", name = "partitions",
         description = "Lists information about partitions in the system")
 public class PartitionsListCommand extends AbstractShellCommand {
@@ -172,7 +174,7 @@
     }
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         StorageAdminService storageAdminService = get(StorageAdminService.class);
         if (reportClientInfo) {
             PartitionAdminService partitionAdminService = get(PartitionAdminService.class);
diff --git a/cli/src/main/java/org/onosproject/cli/net/PathListCommand.java b/cli/src/main/java/org/onosproject/cli/net/PathListCommand.java
index 0ee9214..ae86d2c 100644
--- a/cli/src/main/java/org/onosproject/cli/net/PathListCommand.java
+++ b/cli/src/main/java/org/onosproject/cli/net/PathListCommand.java
@@ -18,9 +18,11 @@
 import com.fasterxml.jackson.databind.JsonNode;
 import com.fasterxml.jackson.databind.ObjectMapper;
 import com.fasterxml.jackson.databind.node.ArrayNode;
-import org.apache.karaf.shell.commands.Argument;
-import org.apache.karaf.shell.commands.Command;
-import org.apache.karaf.shell.commands.Option;
+import org.apache.karaf.shell.api.action.Argument;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.Completion;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
+import org.apache.karaf.shell.api.action.Option;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.net.DeviceId;
 import org.onosproject.net.DisjointPath;
@@ -37,6 +39,7 @@
  * Lists all shortest-paths paths between the specified source and
  * destination devices.
  */
+@Service
 @Command(scope = "onos", name = "paths",
          description = "Lists all shortest-paths paths between the specified source and destination devices")
 public class PathListCommand extends TopologyCommand {
@@ -45,17 +48,19 @@
 
     @Argument(index = 0, name = "src", description = "Source device ID",
               required = true, multiValued = false)
+    @Completion(DeviceIdCompleter.class)
     String src = null;
 
     @Argument(index = 1, name = "dst", description = "Destination device ID",
               required = true, multiValued = false)
+    @Completion(DeviceIdCompleter.class)
     String dst = null;
 
     @Option(name = "--disjoint", description = "Show disjoint Paths")
     boolean disjoint = false;
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         init();
         DeviceService deviceService = get(DeviceService.class);
         DeviceId srcDid = deviceId(src);
diff --git a/cli/src/main/java/org/onosproject/cli/net/PipeconfCommand.java b/cli/src/main/java/org/onosproject/cli/net/PipeconfCommand.java
index 39381be..e70d7eb 100644
--- a/cli/src/main/java/org/onosproject/cli/net/PipeconfCommand.java
+++ b/cli/src/main/java/org/onosproject/cli/net/PipeconfCommand.java
@@ -17,8 +17,8 @@
 package org.onosproject.cli.net;
 
 
-import org.apache.karaf.shell.commands.Command;
-import org.apache.karaf.shell.commands.Option;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.Option;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.net.driver.Behaviour;
 import org.onosproject.net.pi.model.PiPipeconf;
@@ -43,7 +43,7 @@
     private boolean shortOutput = false;
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         piPipeconfService = get(PiPipeconfService.class);
 
         for (PiPipeconf piPipeconf : piPipeconfService.getPipeconfs()) {
diff --git a/cli/src/main/java/org/onosproject/cli/net/PortNumberCompleter.java b/cli/src/main/java/org/onosproject/cli/net/PortNumberCompleter.java
index f0a5eec..5192cc4 100644
--- a/cli/src/main/java/org/onosproject/cli/net/PortNumberCompleter.java
+++ b/cli/src/main/java/org/onosproject/cli/net/PortNumberCompleter.java
@@ -22,7 +22,7 @@
 import java.util.stream.Collectors;
 import java.util.stream.StreamSupport;
 
-import org.apache.karaf.shell.console.completer.ArgumentCompleter.ArgumentList;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.cli.AbstractChoicesCompleter;
 import org.onosproject.net.Device;
 import org.onosproject.net.DeviceId;
@@ -34,6 +34,7 @@
  *
  * Assumes argument right before the one being completed is DeviceId.
  */
+@Service
 public class PortNumberCompleter extends AbstractChoicesCompleter {
 
     /**
@@ -42,11 +43,10 @@
      * @return DeviceId found or null if not found
      */
     protected DeviceId lookForDeviceId() {
-        ArgumentList args = getArgumentList();
         //parse argument list for deviceId
         DeviceService deviceService = getService(DeviceService.class);
         Device dev = null;
-        for (String str : args.getArguments()) {
+        for (String str : commandLine.getArguments()) {
             if (str.contains(":")) {
                 dev = deviceService.getDevice(DeviceId.deviceId(str));
                 if (dev != null) {
diff --git a/cli/src/main/java/org/onosproject/cli/net/PortQueryVlansCommand.java b/cli/src/main/java/org/onosproject/cli/net/PortQueryVlansCommand.java
index 939f14a..369b1ae 100644
--- a/cli/src/main/java/org/onosproject/cli/net/PortQueryVlansCommand.java
+++ b/cli/src/main/java/org/onosproject/cli/net/PortQueryVlansCommand.java
@@ -15,8 +15,10 @@
  */
 package org.onosproject.cli.net;
 
-import org.apache.karaf.shell.commands.Argument;
-import org.apache.karaf.shell.commands.Command;
+import org.apache.karaf.shell.api.action.Argument;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.Completion;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onlab.packet.VlanId;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.net.ConnectPoint;
@@ -36,6 +38,7 @@
 /**
  * Command to show the list of unused vlan-ids.
  */
+@Service
 @Command(scope = "onos", name = "port-query-vlans",
         description = "Lists all unused VLAN-IDs on port")
 public class PortQueryVlansCommand extends AbstractShellCommand {
@@ -49,11 +52,12 @@
     @Argument(index = 0, name = "port",
             description = "Port Description",
             required = true, multiValued = true)
+    @Completion(ConnectPointCompleter.class)
     private String[] ports;
 
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         DeviceService service = get(DeviceService.class);
         for (String portStr : ports) {
             ConnectPoint connectPoint = ConnectPoint.deviceConnectPoint(portStr);
diff --git a/cli/src/main/java/org/onosproject/cli/net/PortStateCompleter.java b/cli/src/main/java/org/onosproject/cli/net/PortStateCompleter.java
index 888e6a2..e84140f 100644
--- a/cli/src/main/java/org/onosproject/cli/net/PortStateCompleter.java
+++ b/cli/src/main/java/org/onosproject/cli/net/PortStateCompleter.java
@@ -17,6 +17,7 @@
 
 import java.util.List;
 
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.cli.AbstractChoicesCompleter;
 
 import com.google.common.collect.ImmutableList;
@@ -26,6 +27,7 @@
  *
  * Assumes argument right before the one being completed is PortNumber.
  */
+@Service
 public class PortStateCompleter extends AbstractChoicesCompleter {
 
     @Override
diff --git a/cli/src/main/java/org/onosproject/cli/net/QueuesListCommand.java b/cli/src/main/java/org/onosproject/cli/net/QueuesListCommand.java
index aa7d088..612fb9e 100644
--- a/cli/src/main/java/org/onosproject/cli/net/QueuesListCommand.java
+++ b/cli/src/main/java/org/onosproject/cli/net/QueuesListCommand.java
@@ -17,7 +17,8 @@
 
 import java.util.Map;
 
-import org.apache.karaf.shell.commands.Command;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.store.service.StorageAdminService;
 import org.onosproject.store.service.WorkQueueStats;
@@ -28,6 +29,7 @@
 /**
  * Command to list stats for all work queues in the system.
  */
+@Service
 @Command(scope = "onos", name = "queues",
         description = "Lists information about work queues in the system")
 public class QueuesListCommand extends AbstractShellCommand {
@@ -35,7 +37,7 @@
     private static final String FMT = "name=%s pending=%d inProgress=%d, completed=%d";
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         StorageAdminService storageAdminService = get(StorageAdminService.class);
         Map<String, WorkQueueStats> queueStats = storageAdminService.getQueueStats();
         if (outputJson()) {
diff --git a/cli/src/main/java/org/onosproject/cli/net/RandomIntentCommand.java b/cli/src/main/java/org/onosproject/cli/net/RandomIntentCommand.java
index b31f22d..cdfc8fe 100644
--- a/cli/src/main/java/org/onosproject/cli/net/RandomIntentCommand.java
+++ b/cli/src/main/java/org/onosproject/cli/net/RandomIntentCommand.java
@@ -19,8 +19,11 @@
 import java.util.Collections;
 import java.util.List;
 
-import org.apache.karaf.shell.commands.Argument;
-import org.apache.karaf.shell.commands.Command;
+import org.apache.karaf.shell.api.action.Argument;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.Completion;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
+import org.apache.karaf.shell.support.completers.NullCompleter;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.core.ApplicationId;
 import org.onosproject.core.CoreService;
@@ -35,6 +38,7 @@
 /**
  * Installs bulk host-to-host intents between hosts of the network.
  */
+@Service
 @Command(scope = "onos", name = "push-random-intents",
          description = "It installs random intents to test throughput. The " +
                  "maximum number of intents is determined by the number of " +
@@ -50,6 +54,7 @@
                       "not be taken into account if it exceeds the maximum " +
                       "number of intents the command can push",
               required = true, multiValued = false)
+    @Completion(NullCompleter.class)
     String countString = null;
 
     private IntentService service;
@@ -57,7 +62,7 @@
     private int count;
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         service = get(IntentService.class);
         hostService = get(HostService.class);
 
diff --git a/cli/src/main/java/org/onosproject/cli/net/RegionAddCommand.java b/cli/src/main/java/org/onosproject/cli/net/RegionAddCommand.java
index 9a10473..392bdba 100644
--- a/cli/src/main/java/org/onosproject/cli/net/RegionAddCommand.java
+++ b/cli/src/main/java/org/onosproject/cli/net/RegionAddCommand.java
@@ -19,9 +19,12 @@
 import com.google.common.collect.HashBiMap;
 import com.google.common.collect.Lists;
 import com.google.common.collect.Sets;
-import org.apache.karaf.shell.commands.Argument;
-import org.apache.karaf.shell.commands.Command;
+import org.apache.karaf.shell.api.action.Argument;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.Completion;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.cli.AbstractShellCommand;
+import org.onosproject.cli.NodeIdCompleter;
 import org.onosproject.cluster.NodeId;
 import org.onosproject.net.config.NetworkConfigService;
 import org.onosproject.net.config.basics.BasicRegionConfig;
@@ -35,6 +38,7 @@
 /**
  * Add a new region.
  */
+@Service
 @Command(scope = "onos", name = "region-add",
         description = "Adds a new region.")
 public class RegionAddCommand extends AbstractShellCommand {
@@ -64,6 +68,7 @@
     @Argument(index = 2, name = "type", description = "Region Type (CONTINENT|" +
             "COUNTRY|METRO|CAMPUS|BUILDING|DATA_CENTER|FLOOR|ROOM|RACK|LOGICAL_GROUP)",
             required = true, multiValued = false)
+    @Completion(RegionTypeCompleter.class)
     String type = null;
 
     @Argument(index = 3, name = "latOrY",
@@ -83,10 +88,11 @@
     @Argument(index = 6, name = "masters", description = "Region Master, a set " +
             "of nodeIds should be split with '/' delimiter (e.g., 1 2 3 / 4 5 6)",
             required = true, multiValued = true)
+    @Completion(NodeIdCompleter.class)
     List<String> masterArgs = null;
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         RegionAdminService service = get(RegionAdminService.class);
         RegionId regionId = RegionId.regionId(id);
 
diff --git a/cli/src/main/java/org/onosproject/cli/net/RegionAddDevicesCommand.java b/cli/src/main/java/org/onosproject/cli/net/RegionAddDevicesCommand.java
index 7abb2e9..c879598 100644
--- a/cli/src/main/java/org/onosproject/cli/net/RegionAddDevicesCommand.java
+++ b/cli/src/main/java/org/onosproject/cli/net/RegionAddDevicesCommand.java
@@ -15,8 +15,10 @@
  */
 package org.onosproject.cli.net;
 
-import org.apache.karaf.shell.commands.Argument;
-import org.apache.karaf.shell.commands.Command;
+import org.apache.karaf.shell.api.action.Argument;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.Completion;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.net.DeviceId;
 import org.onosproject.net.region.RegionAdminService;
@@ -28,20 +30,23 @@
 /**
  * Add a set of devices into existing region.
  */
+@Service
 @Command(scope = "onos", name = "region-add-devices",
         description = "Adds a set of devices into the region.")
 public class RegionAddDevicesCommand extends AbstractShellCommand {
 
     @Argument(index = 0, name = "id", description = "Region ID",
             required = true, multiValued = false)
+    @Completion(RegionIdCompleter.class)
     String id = null;
 
     @Argument(index = 1, name = "devIds", description = "Device IDs",
             required = true, multiValued = true)
+    @Completion(DeviceIdCompleter.class)
     List<String> devIds = null;
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         RegionAdminService service = get(RegionAdminService.class);
         RegionId regionId = RegionId.regionId(id);
 
diff --git a/cli/src/main/java/org/onosproject/cli/net/RegionAddPeerLocCommand.java b/cli/src/main/java/org/onosproject/cli/net/RegionAddPeerLocCommand.java
index 3c503c9..bc721d3 100644
--- a/cli/src/main/java/org/onosproject/cli/net/RegionAddPeerLocCommand.java
+++ b/cli/src/main/java/org/onosproject/cli/net/RegionAddPeerLocCommand.java
@@ -15,8 +15,10 @@
  */
 package org.onosproject.cli.net;
 
-import org.apache.karaf.shell.commands.Argument;
-import org.apache.karaf.shell.commands.Command;
+import org.apache.karaf.shell.api.action.Argument;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.Completion;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.net.config.NetworkConfigService;
 import org.onosproject.net.config.basics.BasicRegionConfig;
@@ -38,6 +40,7 @@
  * at grid-Y 100 and grid-X 200.
  *
  */
+@Service
 @Command(scope = "onos", name = "region-add-peer-loc",
         description = "Adds a peer location annotation to a region.")
 public class RegionAddPeerLocCommand extends AbstractShellCommand {
@@ -47,6 +50,7 @@
 
     @Argument(index = 0, name = "id", description = "Region ID",
             required = true, multiValued = false)
+    @Completion(RegionIdCompleter.class)
     String id = null;
 
     @Argument(index = 1, name = "peer", description = "Peer region ID",
@@ -68,7 +72,7 @@
     String locType = GEO;
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         RegionId regionId = RegionId.regionId(id);
 
         NetworkConfigService cfgService = get(NetworkConfigService.class);
diff --git a/cli/src/main/java/org/onosproject/cli/net/RegionIdCompleter.java b/cli/src/main/java/org/onosproject/cli/net/RegionIdCompleter.java
index 9d46b1f..51379ac 100644
--- a/cli/src/main/java/org/onosproject/cli/net/RegionIdCompleter.java
+++ b/cli/src/main/java/org/onosproject/cli/net/RegionIdCompleter.java
@@ -15,6 +15,7 @@
  */
 package org.onosproject.cli.net;
 
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.cli.AbstractChoicesCompleter;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.net.region.RegionService;
@@ -25,6 +26,7 @@
 /**
  * Region ID completer.
  */
+@Service
 public class RegionIdCompleter extends AbstractChoicesCompleter {
     @Override
     protected List<String> choices() {
diff --git a/cli/src/main/java/org/onosproject/cli/net/RegionListCommand.java b/cli/src/main/java/org/onosproject/cli/net/RegionListCommand.java
index e033ba9..ab0065b 100644
--- a/cli/src/main/java/org/onosproject/cli/net/RegionListCommand.java
+++ b/cli/src/main/java/org/onosproject/cli/net/RegionListCommand.java
@@ -15,8 +15,10 @@
  */
 package org.onosproject.cli.net;
 
-import org.apache.karaf.shell.commands.Argument;
-import org.apache.karaf.shell.commands.Command;
+import org.apache.karaf.shell.api.action.Argument;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.Completion;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.utils.Comparators;
 import org.onosproject.net.region.Region;
@@ -31,6 +33,7 @@
 /**
  * List Region details including membership.
  */
+@Service
 @Command(scope = "onos", name = "regions",
         description = "List Region details including membership")
 public class RegionListCommand extends AbstractShellCommand {
@@ -40,12 +43,13 @@
 
     @Argument(index = 0, name = "id", description = "Region ID",
             required = false, multiValued = false)
+    @Completion(RegionIdCompleter.class)
     String id = null;
 
     private RegionService regionService;
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         regionService = get(RegionService.class);
         if (id == null) {
             for (Region region : getSortedRegions(regionService)) {
diff --git a/cli/src/main/java/org/onosproject/cli/net/RegionRemoveCommand.java b/cli/src/main/java/org/onosproject/cli/net/RegionRemoveCommand.java
index 20c9dec..cf6d5c3 100644
--- a/cli/src/main/java/org/onosproject/cli/net/RegionRemoveCommand.java
+++ b/cli/src/main/java/org/onosproject/cli/net/RegionRemoveCommand.java
@@ -15,8 +15,10 @@
  */
 package org.onosproject.cli.net;
 
-import org.apache.karaf.shell.commands.Argument;
-import org.apache.karaf.shell.commands.Command;
+import org.apache.karaf.shell.api.action.Argument;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.Completion;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.net.region.RegionAdminService;
 import org.onosproject.net.region.RegionId;
@@ -24,16 +26,18 @@
 /**
  * Removes a region from the existing region list.
  */
+@Service
 @Command(scope = "onos", name = "region-remove",
         description = "Removes an existing region.")
 public class RegionRemoveCommand extends AbstractShellCommand {
 
     @Argument(index = 0, name = "id", description = "Region ID",
             required = true, multiValued = false)
+    @Completion(RegionIdCompleter.class)
     String id = null;
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         RegionAdminService service = get(RegionAdminService.class);
         RegionId regionId = RegionId.regionId(id);
 
diff --git a/cli/src/main/java/org/onosproject/cli/net/RegionRemoveDevicesCommand.java b/cli/src/main/java/org/onosproject/cli/net/RegionRemoveDevicesCommand.java
index 3d16612..79d406d 100644
--- a/cli/src/main/java/org/onosproject/cli/net/RegionRemoveDevicesCommand.java
+++ b/cli/src/main/java/org/onosproject/cli/net/RegionRemoveDevicesCommand.java
@@ -15,8 +15,10 @@
  */
 package org.onosproject.cli.net;
 
-import org.apache.karaf.shell.commands.Argument;
-import org.apache.karaf.shell.commands.Command;
+import org.apache.karaf.shell.api.action.Argument;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.Completion;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.net.DeviceId;
 import org.onosproject.net.region.RegionAdminService;
@@ -28,20 +30,23 @@
 /**
  * Remove a set of devices from existing region.
  */
+@Service
 @Command(scope = "onos", name = "region-remove-devices",
         description = "Removes a set of devices from the region.")
 public class RegionRemoveDevicesCommand extends AbstractShellCommand {
 
     @Argument(index = 0, name = "id", description = "Region ID",
             required = true, multiValued = false)
+    @Completion(RegionIdCompleter.class)
     String id = null;
 
     @Argument(index = 1, name = "devIds", description = "Device IDs",
             required = true, multiValued = true)
+    @Completion(DeviceIdCompleter.class)
     List<String> devIds = null;
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         RegionAdminService service = get(RegionAdminService.class);
         RegionId regionId = RegionId.regionId(id);
 
diff --git a/cli/src/main/java/org/onosproject/cli/net/RegionTypeCompleter.java b/cli/src/main/java/org/onosproject/cli/net/RegionTypeCompleter.java
index a2c4dc2..1c7c13d 100644
--- a/cli/src/main/java/org/onosproject/cli/net/RegionTypeCompleter.java
+++ b/cli/src/main/java/org/onosproject/cli/net/RegionTypeCompleter.java
@@ -16,6 +16,7 @@
 package org.onosproject.cli.net;
 
 import com.google.common.collect.Lists;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.cli.AbstractChoicesCompleter;
 import org.onosproject.net.region.Region;
 
@@ -24,6 +25,7 @@
 /**
  * Region type completer.
  */
+@Service
 public class RegionTypeCompleter extends AbstractChoicesCompleter {
     @Override
     protected List<String> choices() {
diff --git a/cli/src/main/java/org/onosproject/cli/net/RegionUpdateCommand.java b/cli/src/main/java/org/onosproject/cli/net/RegionUpdateCommand.java
index a31bbbb..678ae10 100644
--- a/cli/src/main/java/org/onosproject/cli/net/RegionUpdateCommand.java
+++ b/cli/src/main/java/org/onosproject/cli/net/RegionUpdateCommand.java
@@ -19,9 +19,12 @@
 import com.google.common.collect.HashBiMap;
 import com.google.common.collect.Lists;
 import com.google.common.collect.Sets;
-import org.apache.karaf.shell.commands.Argument;
-import org.apache.karaf.shell.commands.Command;
+import org.apache.karaf.shell.api.action.Argument;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.Completion;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.cli.AbstractShellCommand;
+import org.onosproject.cli.NodeIdCompleter;
 import org.onosproject.cluster.NodeId;
 import org.onosproject.net.region.Region;
 import org.onosproject.net.region.RegionAdminService;
@@ -34,6 +37,7 @@
 /**
  * Update an existing region.
  */
+@Service
 @Command(scope = "onos", name = "region-update",
         description = "Updates an existing region.")
 public class RegionUpdateCommand extends AbstractShellCommand {
@@ -48,6 +52,7 @@
 
     @Argument(index = 0, name = "id", description = "Region ID",
             required = true, multiValued = false)
+    @Completion(RegionIdCompleter.class)
     String id = null;
 
     @Argument(index = 1, name = "name", description = "Region Name",
@@ -57,15 +62,17 @@
     @Argument(index = 2, name = "type", description = "Region Type (CONTINENT|" +
             "COUNTRY|METRO|CAMPUS|BUILDING|FLOOR|ROOM|RACK|LOGICAL_GROUP)",
             required = true, multiValued = false)
+    @Completion(RegionTypeCompleter.class)
     String type = null;
 
     @Argument(index = 3, name = "masters", description = "Region Master, a set " +
     "of nodeIds should be split with '/' delimiter (e.g., 1 2 3 / 4 5 6)",
             required = true, multiValued = true)
+    @Completion(NodeIdCompleter.class)
     List<String> masterArgs = null;
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         RegionService regionService = get(RegionService.class);
         RegionAdminService regionAdminService = get(RegionAdminService.class);
         RegionId regionId = RegionId.regionId(id);
diff --git a/cli/src/main/java/org/onosproject/cli/net/ResourcesCommand.java b/cli/src/main/java/org/onosproject/cli/net/ResourcesCommand.java
index 1e24cb9..d4c1a40 100644
--- a/cli/src/main/java/org/onosproject/cli/net/ResourcesCommand.java
+++ b/cli/src/main/java/org/onosproject/cli/net/ResourcesCommand.java
@@ -25,9 +25,11 @@
 import java.util.Collections;
 
 import com.google.common.collect.Iterables;
-import org.apache.karaf.shell.commands.Argument;
-import org.apache.karaf.shell.commands.Command;
-import org.apache.karaf.shell.commands.Option;
+import org.apache.karaf.shell.api.action.Argument;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.Completion;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
+import org.apache.karaf.shell.api.action.Option;
 import org.onlab.packet.MplsLabel;
 import org.onlab.packet.VlanId;
 import org.onosproject.cli.AbstractShellCommand;
@@ -52,6 +54,7 @@
 /**
  * Lists registered resources.
  */
+@Service
 @Command(scope = "onos", name = "resources",
          description = "Lists registered resources")
 public class ResourcesCommand extends AbstractShellCommand {
@@ -73,17 +76,19 @@
 
     @Argument(index = 0, name = "deviceIdString", description = "Device ID",
               required = false, multiValued = false)
+    @Completion(DeviceIdCompleter.class)
     String deviceIdStr = null;
 
     @Argument(index = 1, name = "portNumberString", description = "PortNumber",
               required = false, multiValued = false)
+    @Completion(PortNumberCompleter.class)
     String portNumberStr = null;
 
 
     private ResourceQueryService resourceService;
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         resourceService = get(ResourceQueryService.class);
 
         if (typeStrings != null) {
diff --git a/cli/src/main/java/org/onosproject/cli/net/RoleCompleter.java b/cli/src/main/java/org/onosproject/cli/net/RoleCompleter.java
index 6fa1394..77fad80 100644
--- a/cli/src/main/java/org/onosproject/cli/net/RoleCompleter.java
+++ b/cli/src/main/java/org/onosproject/cli/net/RoleCompleter.java
@@ -15,8 +15,11 @@
  */
 package org.onosproject.cli.net;
 
-import org.apache.karaf.shell.console.Completer;
-import org.apache.karaf.shell.console.completer.StringsCompleter;
+import org.apache.karaf.shell.api.console.CommandLine;
+import org.apache.karaf.shell.api.console.Completer;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
+import org.apache.karaf.shell.api.console.Session;
+import org.apache.karaf.shell.support.completers.StringsCompleter;
 import org.onosproject.net.MastershipRole;
 
 import java.util.List;
@@ -25,9 +28,10 @@
 /**
  * Device mastership role completer.
  */
+@Service
 public class RoleCompleter implements Completer {
     @Override
-    public int complete(String buffer, int cursor, List<String> candidates) {
+    public int complete(Session session, CommandLine commandLine, List<String> candidates) {
         // Delegate string completer
         StringsCompleter delegate = new StringsCompleter();
         SortedSet<String> strings = delegate.getStrings();
@@ -36,7 +40,7 @@
         strings.add(MastershipRole.NONE.toString().toLowerCase());
 
         // Now let the completer do the work for figuring out what to offer.
-        return delegate.complete(buffer, cursor, candidates);
+        return delegate.complete(session, commandLine, candidates);
     }
 
 }
diff --git a/cli/src/main/java/org/onosproject/cli/net/TableStatisticsCommand.java b/cli/src/main/java/org/onosproject/cli/net/TableStatisticsCommand.java
index 2037800e..1077b52 100644
--- a/cli/src/main/java/org/onosproject/cli/net/TableStatisticsCommand.java
+++ b/cli/src/main/java/org/onosproject/cli/net/TableStatisticsCommand.java
@@ -23,9 +23,10 @@
 import java.util.SortedMap;
 import java.util.TreeMap;
 
-import org.apache.karaf.shell.commands.Argument;
-import org.apache.karaf.shell.commands.Command;
-import org.apache.karaf.shell.commands.Option;
+import org.apache.karaf.shell.api.action.Argument;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
+import org.apache.karaf.shell.api.action.Option;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.utils.Comparators;
 import org.onosproject.net.Device;
@@ -42,6 +43,7 @@
 /**
  * Lists port statistic of all ports in the system.
  */
+@Service
 @Command(scope = "onos", name = "tablestats",
         description = "Lists statistics of all tables in the device")
 public class TableStatisticsCommand extends AbstractShellCommand {
@@ -59,7 +61,7 @@
     private static final String NA = "N/A";
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         FlowRuleService flowService = get(FlowRuleService.class);
         DeviceService deviceService = get(DeviceService.class);
         SortedMap<Device, List<TableStatisticsEntry>> deviceTableStats =
diff --git a/cli/src/main/java/org/onosproject/cli/net/TestAllocateResource.java b/cli/src/main/java/org/onosproject/cli/net/TestAllocateResource.java
index 172687a..d704509 100644
--- a/cli/src/main/java/org/onosproject/cli/net/TestAllocateResource.java
+++ b/cli/src/main/java/org/onosproject/cli/net/TestAllocateResource.java
@@ -17,9 +17,11 @@
 
 import java.util.Optional;
 
-import org.apache.karaf.shell.commands.Argument;
-import org.apache.karaf.shell.commands.Command;
-import org.apache.karaf.shell.commands.Option;
+import org.apache.karaf.shell.api.action.Argument;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.Completion;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
+import org.apache.karaf.shell.api.action.Option;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.net.ChannelSpacing;
 import org.onosproject.net.DeviceId;
@@ -36,6 +38,7 @@
 /**
  * Test tool to allocate resources.
  */
+@Service
 @Command(scope = "onos", name = "test-allocate-resources",
          description = "Test tool to allocate resources")
 public class TestAllocateResource extends AbstractShellCommand {
@@ -56,16 +59,18 @@
 
     @Argument(index = 0, name = "deviceId", description = "Device ID",
             required = true, multiValued = false)
+    @Completion(DeviceIdCompleter.class)
     String deviceIdStr = null;
 
     @Argument(index = 1, name = "portNumber", description = "PortNumber",
             required = true, multiValued = false)
+    @Completion(PortNumberCompleter.class)
     String portNumberStr = null;
 
     private ResourceService resourceService;
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         resourceService = get(ResourceService.class);
         DeviceId did = DeviceId.deviceId(deviceIdStr);
         PortNumber portNum = PortNumber.fromString(portNumberStr);
diff --git a/cli/src/main/java/org/onosproject/cli/net/TestProtectionEndpointIntentCommand.java b/cli/src/main/java/org/onosproject/cli/net/TestProtectionEndpointIntentCommand.java
index 27ae936..a50bd4f 100644
--- a/cli/src/main/java/org/onosproject/cli/net/TestProtectionEndpointIntentCommand.java
+++ b/cli/src/main/java/org/onosproject/cli/net/TestProtectionEndpointIntentCommand.java
@@ -19,9 +19,11 @@
 import java.util.List;
 import java.util.Optional;
 
-import org.apache.karaf.shell.commands.Argument;
-import org.apache.karaf.shell.commands.Command;
-import org.apache.karaf.shell.commands.Option;
+import org.apache.karaf.shell.api.action.Argument;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.Completion;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
+import org.apache.karaf.shell.api.action.Option;
 import org.onlab.packet.VlanId;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.net.ConnectPoint;
@@ -40,6 +42,7 @@
 /**
  * Test tool to add ProtectionEndpointIntent.
  */
+@Service
 @Command(scope = "onos", name = "test-add-protection-endpoint",
          description = "Test tool to add ProtectionEndpointIntent")
 public class TestProtectionEndpointIntentCommand extends AbstractShellCommand {
@@ -54,11 +57,13 @@
     @Argument(index = 0, name = "deviceId",
             description = "Device ID to configure",
             required = true)
+    @Completion(DeviceIdCompleter.class)
     private String deviceIdStr = null;
 
     @Argument(index = 1, name = "peerDeviceId",
             description = "Device ID of remote peer",
             required = true)
+    @Completion(DeviceIdCompleter.class)
     private String peerStr = null;
 
     @Argument(index = 2, name = "portNumber1",
@@ -83,7 +88,7 @@
     private DeviceService deviceService;
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         fingerprint = Optional.ofNullable(fingerprint)
                               .orElse(DEFAULT_FINGERPRINT);
 
diff --git a/cli/src/main/java/org/onosproject/cli/net/TopologyCommand.java b/cli/src/main/java/org/onosproject/cli/net/TopologyCommand.java
index 0b4b4b3..ad1db11 100644
--- a/cli/src/main/java/org/onosproject/cli/net/TopologyCommand.java
+++ b/cli/src/main/java/org/onosproject/cli/net/TopologyCommand.java
@@ -20,8 +20,9 @@
 import java.util.Calendar;
 import java.util.concurrent.TimeUnit;
 
-import org.apache.karaf.shell.commands.Command;
-import org.apache.karaf.shell.commands.Option;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
+import org.apache.karaf.shell.api.action.Option;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.net.topology.Topology;
 import org.onosproject.net.topology.TopologyProvider;
@@ -30,6 +31,7 @@
 /**
  * Lists summary of the current topology.
  */
+@Service
 @Command(scope = "onos", name = "topology",
 description = "Lists summary of the current topology")
 public class TopologyCommand extends AbstractShellCommand {
@@ -53,7 +55,7 @@
     }
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         init();
         long topologyUptime =
                 Math.max(0, (System.currentTimeMillis() - topology.creationTime()));
diff --git a/cli/src/main/java/org/onosproject/cli/net/TransactionsCommand.java b/cli/src/main/java/org/onosproject/cli/net/TransactionsCommand.java
index ec6a1a8..1eb1643 100644
--- a/cli/src/main/java/org/onosproject/cli/net/TransactionsCommand.java
+++ b/cli/src/main/java/org/onosproject/cli/net/TransactionsCommand.java
@@ -17,7 +17,8 @@
 
 import java.util.Collection;
 
-import org.apache.karaf.shell.commands.Command;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.store.primitives.TransactionId;
 import org.onosproject.store.service.StorageAdminService;
@@ -29,6 +30,7 @@
 /**
  * CLI to view in-progress database transactions in the system.
  */
+@Service
 @Command(scope = "onos", name = "transactions",
         description = "Utility for listing pending/inprogress transactions")
 public class TransactionsCommand extends AbstractShellCommand {
@@ -46,7 +48,7 @@
     }
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         StorageAdminService storageAdminService = get(StorageAdminService.class);
         Collection<TransactionId> transactionIds = storageAdminService.getPendingTransactions();
         if (outputJson()) {
diff --git a/cli/src/main/java/org/onosproject/cli/net/TunnelBorrowCommand.java b/cli/src/main/java/org/onosproject/cli/net/TunnelBorrowCommand.java
index 1815432..8d30733 100644
--- a/cli/src/main/java/org/onosproject/cli/net/TunnelBorrowCommand.java
+++ b/cli/src/main/java/org/onosproject/cli/net/TunnelBorrowCommand.java
@@ -19,9 +19,10 @@
 import java.util.HashSet;
 import java.util.Optional;
 
-import org.apache.karaf.shell.commands.Argument;
-import org.apache.karaf.shell.commands.Command;
-import org.apache.karaf.shell.commands.Option;
+import org.apache.karaf.shell.api.action.Argument;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
+import org.apache.karaf.shell.api.action.Option;
 import org.onlab.packet.IpAddress;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.core.ApplicationId;
@@ -42,6 +43,7 @@
 /**
  * Borrows tunnels. It's used by consumers.
  */
+@Service
 @Command(scope = "onos", name = "tunnel-borrow", description = "Borrows tunnels. It's used by consumers.")
 public class TunnelBorrowCommand extends AbstractShellCommand {
 
@@ -77,7 +79,7 @@
             + "groupId=%s";
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         Collection<Tunnel> tunnelSet = null;
         Tunnel.Type trueType = null;
         TunnelService service = get(TunnelService.class);
diff --git a/cli/src/main/java/org/onosproject/cli/net/TunnelCreateCommand.java b/cli/src/main/java/org/onosproject/cli/net/TunnelCreateCommand.java
index 262f50e..6b3a77b 100644
--- a/cli/src/main/java/org/onosproject/cli/net/TunnelCreateCommand.java
+++ b/cli/src/main/java/org/onosproject/cli/net/TunnelCreateCommand.java
@@ -17,9 +17,10 @@
 
 import java.util.Optional;
 
-import org.apache.karaf.shell.commands.Argument;
-import org.apache.karaf.shell.commands.Command;
-import org.apache.karaf.shell.commands.Option;
+import org.apache.karaf.shell.api.action.Argument;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
+import org.apache.karaf.shell.api.action.Option;
 import org.onlab.packet.IpAddress;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.core.GroupId;
@@ -44,6 +45,7 @@
  * Supports for creating a tunnel by using IP address and optical as tunnel end
  * point.
  */
+@Service
 @Command(scope = "onos", name = "tunnel-create",
 description = "Supports for creating a tunnel by using IP address and optical as tunnel end point now.")
 public class TunnelCreateCommand extends AbstractShellCommand {
@@ -77,7 +79,7 @@
     private static final String FMT = "The tunnel identity is %s";
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         TunnelProvider service = get(TunnelProvider.class);
         ProviderId producerName = new ProviderId("default",
                                                  "org.onosproject.provider.tunnel.default");
diff --git a/cli/src/main/java/org/onosproject/cli/net/TunnelQueryCommand.java b/cli/src/main/java/org/onosproject/cli/net/TunnelQueryCommand.java
index 1aff456..76dd752 100644
--- a/cli/src/main/java/org/onosproject/cli/net/TunnelQueryCommand.java
+++ b/cli/src/main/java/org/onosproject/cli/net/TunnelQueryCommand.java
@@ -19,8 +19,9 @@
 import java.util.HashSet;
 import java.util.Optional;
 
-import org.apache.karaf.shell.commands.Command;
-import org.apache.karaf.shell.commands.Option;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
+import org.apache.karaf.shell.api.action.Option;
 import org.onlab.packet.IpAddress;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.incubator.net.tunnel.DefaultOpticalTunnelEndPoint;
@@ -40,6 +41,7 @@
 /**
  * Supports for querying tunnels. It's used by consumers.
  */
+@Service
 @Command(scope = "onos", name = "tunnels", description = "Supports for querying tunnels."
         + " It's used by consumers.")
 public class TunnelQueryCommand extends AbstractShellCommand {
@@ -67,7 +69,7 @@
             + "groupId=%s, path=%s%s";
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         Tunnel.Type trueType = null;
         TunnelService service = get(TunnelService.class);
         ProviderId producerName = new ProviderId("default",
diff --git a/cli/src/main/java/org/onosproject/cli/net/TunnelQuerySubscriptionCommand.java b/cli/src/main/java/org/onosproject/cli/net/TunnelQuerySubscriptionCommand.java
index 2c8cb20..fed8e64 100644
--- a/cli/src/main/java/org/onosproject/cli/net/TunnelQuerySubscriptionCommand.java
+++ b/cli/src/main/java/org/onosproject/cli/net/TunnelQuerySubscriptionCommand.java
@@ -17,8 +17,9 @@
 
 import java.util.Collection;
 
-import org.apache.karaf.shell.commands.Argument;
-import org.apache.karaf.shell.commands.Command;
+import org.apache.karaf.shell.api.action.Argument;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.core.ApplicationId;
 import org.onosproject.core.DefaultApplicationId;
@@ -29,6 +30,7 @@
  * Query all tunnel subscriptions of consumer by consumer id.
  * It's used by consumers.
  */
+@Service
 @Command(scope = "onos", name = "tunnel-subscriptions",
       description = "Query all request orders of consumer by consumer id. It's used by consumers.")
 public class TunnelQuerySubscriptionCommand extends AbstractShellCommand {
@@ -40,7 +42,7 @@
             + "type=%s, tunnelId=%s";
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         TunnelService service = get(TunnelService.class);
         ApplicationId applicationId = new DefaultApplicationId(1, consumerId);
         Collection<TunnelSubscription> tunnelSet = service.queryTunnelSubscription(applicationId);
diff --git a/cli/src/main/java/org/onosproject/cli/net/TunnelRemoveCommand.java b/cli/src/main/java/org/onosproject/cli/net/TunnelRemoveCommand.java
index 4305d21..8d683cb 100644
--- a/cli/src/main/java/org/onosproject/cli/net/TunnelRemoveCommand.java
+++ b/cli/src/main/java/org/onosproject/cli/net/TunnelRemoveCommand.java
@@ -18,8 +18,9 @@
 import java.util.Collection;
 import java.util.Optional;
 
-import org.apache.karaf.shell.commands.Command;
-import org.apache.karaf.shell.commands.Option;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
+import org.apache.karaf.shell.api.action.Option;
 import org.onlab.packet.IpAddress;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.incubator.net.tunnel.DefaultOpticalTunnelEndPoint;
@@ -40,6 +41,7 @@
 /**
  * Supports for removing tunnels. It's used by producers.
  */
+@Service
 @Command(scope = "onos", name = "tunnel-remove", description = "Supports for removing tunnels. It's used by producers.")
 public class TunnelRemoveCommand extends AbstractShellCommand {
     @Option(name = "-s", aliases = "--src", description = "Source tunnel point."
@@ -62,7 +64,7 @@
     String tunnelId = null;
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         TunnelDescription tunnel = null;
         TunnelProvider service = get(TunnelProvider.class);
         ProviderId producerName = new ProviderId("default",
diff --git a/cli/src/main/java/org/onosproject/cli/net/TunnelReturnCommand.java b/cli/src/main/java/org/onosproject/cli/net/TunnelReturnCommand.java
index dbc34fb..cab46f9 100644
--- a/cli/src/main/java/org/onosproject/cli/net/TunnelReturnCommand.java
+++ b/cli/src/main/java/org/onosproject/cli/net/TunnelReturnCommand.java
@@ -17,9 +17,10 @@
 
 import java.util.Optional;
 
-import org.apache.karaf.shell.commands.Argument;
-import org.apache.karaf.shell.commands.Command;
-import org.apache.karaf.shell.commands.Option;
+import org.apache.karaf.shell.api.action.Argument;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
+import org.apache.karaf.shell.api.action.Option;
 import org.onlab.packet.IpAddress;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.core.ApplicationId;
@@ -40,6 +41,7 @@
 /**
  * Returns tunnels. It's used by consumers.
  */
+@Service
 @Command(scope = "onos", name = "tunnel-return",
 description = "Returns tunnels. It's used by consumers.")
 public class TunnelReturnCommand extends AbstractShellCommand {
@@ -72,7 +74,7 @@
     String tunnelName = null;
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         Tunnel.Type trueType = null;
         TunnelService service = get(TunnelService.class);
         ApplicationId appId = new DefaultApplicationId(1, consumerId);
diff --git a/cli/src/main/java/org/onosproject/cli/net/TunnelUpdateCommand.java b/cli/src/main/java/org/onosproject/cli/net/TunnelUpdateCommand.java
index efa0a9f..9bfdadd 100644
--- a/cli/src/main/java/org/onosproject/cli/net/TunnelUpdateCommand.java
+++ b/cli/src/main/java/org/onosproject/cli/net/TunnelUpdateCommand.java
@@ -15,9 +15,10 @@
  */
 package org.onosproject.cli.net;
 
-import org.apache.karaf.shell.commands.Argument;
-import org.apache.karaf.shell.commands.Command;
-import org.apache.karaf.shell.commands.Option;
+import org.apache.karaf.shell.api.action.Argument;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
+import org.apache.karaf.shell.api.action.Option;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.incubator.net.tunnel.DefaultTunnelDescription;
 import org.onosproject.incubator.net.tunnel.TunnelDescription;
@@ -30,6 +31,7 @@
  * Supports for updating a tunnel by tunnel identity.
  * It's used by producers.
  */
+@Service
 @Command(scope = "onos", name = "tunnel-update",
 description = "Supports for updating a tunnel by tunnel identity."
         + " It's used by producers.")
@@ -43,7 +45,7 @@
     String bandwidth = null;
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         TunnelProvider service = get(TunnelProvider.class);
         TunnelId id = TunnelId.valueOf(tunnelId);
         SparseAnnotations annotations = DefaultAnnotations
diff --git a/cli/src/main/java/org/onosproject/cli/net/WipeOutCommand.java b/cli/src/main/java/org/onosproject/cli/net/WipeOutCommand.java
index 880621d..7bfd6b9 100644
--- a/cli/src/main/java/org/onosproject/cli/net/WipeOutCommand.java
+++ b/cli/src/main/java/org/onosproject/cli/net/WipeOutCommand.java
@@ -16,8 +16,9 @@
 package org.onosproject.cli.net;
 
 import com.google.common.collect.Sets;
-import org.apache.karaf.shell.commands.Argument;
-import org.apache.karaf.shell.commands.Command;
+import org.apache.karaf.shell.api.action.Argument;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onlab.util.Tools;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.net.Device;
@@ -50,6 +51,7 @@
 /**
  * Wipes-out the entire network information base, i.e. devices, links, hosts, intents.
  */
+@Service
 @Command(scope = "onos", name = "wipe-out",
         description = "Wipes-out the entire network information base, i.e. devices, links, hosts")
 public class WipeOutCommand extends AbstractShellCommand {
@@ -59,7 +61,7 @@
     String please = null;
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         if (please == null || !please.equals(PLEASE)) {
             print("I'm afraid I can't do that!\nSay: %s", PLEASE);
             return;
diff --git a/cli/src/main/java/org/onosproject/cli/net/completer/AnnotationKeysCompleter.java b/cli/src/main/java/org/onosproject/cli/net/completer/AnnotationKeysCompleter.java
index 773d5ec..baf91f7 100644
--- a/cli/src/main/java/org/onosproject/cli/net/completer/AnnotationKeysCompleter.java
+++ b/cli/src/main/java/org/onosproject/cli/net/completer/AnnotationKeysCompleter.java
@@ -21,12 +21,14 @@
 import java.util.Objects;
 import java.util.stream.Collectors;
 
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.cli.AbstractChoicesCompleter;
 import org.onosproject.net.AnnotationKeys;
 
 /**
  * Completer for annotation keys declared in {@link AnnotationKeys}.
  */
+@Service
 public class AnnotationKeysCompleter extends AbstractChoicesCompleter {
 
 
diff --git a/cli/src/main/java/org/onosproject/cli/net/completer/PeerConnectPointCompleter.java b/cli/src/main/java/org/onosproject/cli/net/completer/PeerConnectPointCompleter.java
index a21eb67..563e552 100644
--- a/cli/src/main/java/org/onosproject/cli/net/completer/PeerConnectPointCompleter.java
+++ b/cli/src/main/java/org/onosproject/cli/net/completer/PeerConnectPointCompleter.java
@@ -15,8 +15,11 @@
  */
 package org.onosproject.cli.net.completer;
 
-import static org.onlab.osgi.DefaultServiceDirectory.getService;
-import static org.onosproject.net.ConnectPoint.deviceConnectPoint;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
+import org.onosproject.cli.AbstractChoicesCompleter;
+import org.onosproject.net.ConnectPoint;
+import org.onosproject.net.device.DeviceService;
+import org.onosproject.net.link.LinkService;
 
 import java.util.Arrays;
 import java.util.Collections;
@@ -26,11 +29,8 @@
 import java.util.stream.Collectors;
 import java.util.stream.Stream;
 
-import org.apache.karaf.shell.console.completer.ArgumentCompleter.ArgumentList;
-import org.onosproject.cli.AbstractChoicesCompleter;
-import org.onosproject.net.ConnectPoint;
-import org.onosproject.net.device.DeviceService;
-import org.onosproject.net.link.LinkService;
+import static org.onlab.osgi.DefaultServiceDirectory.getService;
+import static org.onosproject.net.ConnectPoint.deviceConnectPoint;
 
 /**
  * Completer, which proposes remote end of existing Link in the system.
@@ -38,16 +38,16 @@
  * This completer will look for (device id)/(port number) in the
  * existing argument and propose list of remote ports.
  */
+@Service
 public class PeerConnectPointCompleter extends AbstractChoicesCompleter {
 
     @Override
     protected List<String> choices() {
-        ArgumentList args = getArgumentList();
 
         DeviceService deviceService = getService(DeviceService.class);
         LinkService linkService = getService(LinkService.class);
 
-        Optional<ConnectPoint> port = Arrays.asList(args.getArguments()).stream()
+        Optional<ConnectPoint> port = Arrays.asList(commandLine.getArguments()).stream()
             .filter(s -> s.contains(":") && s.contains("/"))
             .map(s -> {
                 try {
diff --git a/cli/src/main/java/org/onosproject/cli/net/vnet/TenantAddCommand.java b/cli/src/main/java/org/onosproject/cli/net/vnet/TenantAddCommand.java
index e9439c8..ab4fc66 100644
--- a/cli/src/main/java/org/onosproject/cli/net/vnet/TenantAddCommand.java
+++ b/cli/src/main/java/org/onosproject/cli/net/vnet/TenantAddCommand.java
@@ -16,8 +16,9 @@
 
 package org.onosproject.cli.net.vnet;
 
-import org.apache.karaf.shell.commands.Argument;
-import org.apache.karaf.shell.commands.Command;
+import org.apache.karaf.shell.api.action.Argument;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.incubator.net.virtual.TenantId;
 import org.onosproject.incubator.net.virtual.VirtualNetworkAdminService;
@@ -25,6 +26,7 @@
 /**
  * Creates a new virtual network tenant.
  */
+@Service
 @Command(scope = "onos", name = "vnet-add-tenant",
         description = "Creates a new virtual network tenant.")
 
@@ -35,7 +37,7 @@
     String id = null;
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         VirtualNetworkAdminService service = get(VirtualNetworkAdminService.class);
         service.registerTenantId(TenantId.tenantId(id));
         print("Tenant successfully added.");
diff --git a/cli/src/main/java/org/onosproject/cli/net/vnet/TenantCompleter.java b/cli/src/main/java/org/onosproject/cli/net/vnet/TenantCompleter.java
index 22d7b6d..f8b977f 100644
--- a/cli/src/main/java/org/onosproject/cli/net/vnet/TenantCompleter.java
+++ b/cli/src/main/java/org/onosproject/cli/net/vnet/TenantCompleter.java
@@ -16,8 +16,11 @@
 
 package org.onosproject.cli.net.vnet;
 
-import org.apache.karaf.shell.console.Completer;
-import org.apache.karaf.shell.console.completer.StringsCompleter;
+import org.apache.karaf.shell.api.console.CommandLine;
+import org.apache.karaf.shell.api.console.Completer;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
+import org.apache.karaf.shell.api.console.Session;
+import org.apache.karaf.shell.support.completers.StringsCompleter;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.incubator.net.virtual.TenantId;
 import org.onosproject.incubator.net.virtual.VirtualNetworkAdminService;
@@ -28,9 +31,10 @@
 /**
  * Tenant Id completer.
  */
+@Service
 public class TenantCompleter implements Completer {
     @Override
-    public int complete(String buffer, int cursor, List<String> candidates) {
+    public int complete(Session session, CommandLine commandLine, List<String> candidates) {
         // Delegate string completer
         StringsCompleter delegate = new StringsCompleter();
 
@@ -44,6 +48,6 @@
         }
 
         // Now let the completer do the work for figuring out what to offer.
-        return delegate.complete(buffer, cursor, candidates);
+        return delegate.complete(session, commandLine, candidates);
     }
 }
diff --git a/cli/src/main/java/org/onosproject/cli/net/vnet/TenantListCommand.java b/cli/src/main/java/org/onosproject/cli/net/vnet/TenantListCommand.java
index a401a48..e701250 100644
--- a/cli/src/main/java/org/onosproject/cli/net/vnet/TenantListCommand.java
+++ b/cli/src/main/java/org/onosproject/cli/net/vnet/TenantListCommand.java
@@ -16,7 +16,8 @@
 
 package org.onosproject.cli.net.vnet;
 
-import org.apache.karaf.shell.commands.Command;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.incubator.net.virtual.TenantId;
 import org.onosproject.incubator.net.virtual.VirtualNetworkAdminService;
@@ -29,6 +30,7 @@
 /**
  * Lists all tenants.
  */
+@Service
 @Command(scope = "onos", name = "vnet-tenants",
         description = "Lists all virtual network tenants.")
 public class TenantListCommand extends AbstractShellCommand {
@@ -36,7 +38,7 @@
     private static final String FMT_TENANT = "tenantId=%s";
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         VirtualNetworkAdminService service = get(VirtualNetworkAdminService.class);
         List<TenantId> tenants = new ArrayList<>();
         tenants.addAll(service.getTenantIds());
diff --git a/cli/src/main/java/org/onosproject/cli/net/vnet/TenantRemoveCommand.java b/cli/src/main/java/org/onosproject/cli/net/vnet/TenantRemoveCommand.java
index 36f9d1c..d31696c 100644
--- a/cli/src/main/java/org/onosproject/cli/net/vnet/TenantRemoveCommand.java
+++ b/cli/src/main/java/org/onosproject/cli/net/vnet/TenantRemoveCommand.java
@@ -16,8 +16,10 @@
 
 package org.onosproject.cli.net.vnet;
 
-import org.apache.karaf.shell.commands.Argument;
-import org.apache.karaf.shell.commands.Command;
+import org.apache.karaf.shell.api.action.Argument;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.Completion;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.incubator.net.virtual.TenantId;
 import org.onosproject.incubator.net.virtual.VirtualNetworkAdminService;
@@ -25,6 +27,7 @@
 /**
  * Creates a new virtual network tenant.
  */
+@Service
 @Command(scope = "onos", name = "vnet-remove-tenant",
         description = "Removes a virtual network tenant.")
 
@@ -32,10 +35,11 @@
 
     @Argument(index = 0, name = "id", description = "Tenant ID",
             required = true, multiValued = false)
+    @Completion(TenantCompleter.class)
     String id = null;
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         VirtualNetworkAdminService service = get(VirtualNetworkAdminService.class);
         service.unregisterTenantId(TenantId.tenantId(id));
         print("Tenant successfully removed.");
diff --git a/cli/src/main/java/org/onosproject/cli/net/vnet/VirtualDeviceCompleter.java b/cli/src/main/java/org/onosproject/cli/net/vnet/VirtualDeviceCompleter.java
index 780c0bb..2baace7 100644
--- a/cli/src/main/java/org/onosproject/cli/net/vnet/VirtualDeviceCompleter.java
+++ b/cli/src/main/java/org/onosproject/cli/net/vnet/VirtualDeviceCompleter.java
@@ -18,7 +18,7 @@
 
 import static org.onlab.osgi.DefaultServiceDirectory.getService;
 
-import org.apache.karaf.shell.console.completer.ArgumentCompleter.ArgumentList;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.cli.AbstractChoicesCompleter;
 import org.onosproject.incubator.net.virtual.NetworkId;
 import org.onosproject.incubator.net.virtual.VirtualDevice;
@@ -35,12 +35,12 @@
  *
  * Assumes the first argument which can be parsed to a number is network id.
  */
+@Service
 public class VirtualDeviceCompleter extends AbstractChoicesCompleter {
     @Override
     protected List<String> choices() {
-        ArgumentList args = getArgumentList();
         //parse argument list for network id
-        String[] argsArray = args.getArguments();
+        String[] argsArray = commandLine.getArguments();
         for (String str : argsArray) {
             if (str.matches("[0-9]+")) {
                 long networkId = Long.valueOf(str);
diff --git a/cli/src/main/java/org/onosproject/cli/net/vnet/VirtualDeviceCreateCommand.java b/cli/src/main/java/org/onosproject/cli/net/vnet/VirtualDeviceCreateCommand.java
index a9eb8d4..a7a8b72 100644
--- a/cli/src/main/java/org/onosproject/cli/net/vnet/VirtualDeviceCreateCommand.java
+++ b/cli/src/main/java/org/onosproject/cli/net/vnet/VirtualDeviceCreateCommand.java
@@ -16,8 +16,10 @@
 
 package org.onosproject.cli.net.vnet;
 
-import org.apache.karaf.shell.commands.Argument;
-import org.apache.karaf.shell.commands.Command;
+import org.apache.karaf.shell.api.action.Argument;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.Completion;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.incubator.net.virtual.NetworkId;
 import org.onosproject.incubator.net.virtual.VirtualNetworkAdminService;
@@ -26,12 +28,14 @@
 /**
  * Creates a new virtual device.
  */
+@Service
 @Command(scope = "onos", name = "vnet-create-device",
         description = "Creates a new virtual device in a network.")
 public class VirtualDeviceCreateCommand extends AbstractShellCommand {
 
     @Argument(index = 0, name = "networkId", description = "Network ID",
             required = true, multiValued = false)
+    @Completion(VirtualNetworkCompleter.class)
     Long networkId = null;
 
     @Argument(index = 1, name = "deviceId", description = "Device ID",
@@ -39,7 +43,7 @@
     String deviceId = null;
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         VirtualNetworkAdminService service = get(VirtualNetworkAdminService.class);
         service.createVirtualDevice(NetworkId.networkId(networkId), DeviceId.deviceId(deviceId));
         print("Virtual device successfully created.");
diff --git a/cli/src/main/java/org/onosproject/cli/net/vnet/VirtualDeviceListCommand.java b/cli/src/main/java/org/onosproject/cli/net/vnet/VirtualDeviceListCommand.java
index 65f4107..79aba49 100644
--- a/cli/src/main/java/org/onosproject/cli/net/vnet/VirtualDeviceListCommand.java
+++ b/cli/src/main/java/org/onosproject/cli/net/vnet/VirtualDeviceListCommand.java
@@ -16,8 +16,10 @@
 
 package org.onosproject.cli.net.vnet;
 
-import org.apache.karaf.shell.commands.Argument;
-import org.apache.karaf.shell.commands.Command;
+import org.apache.karaf.shell.api.action.Argument;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.Completion;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.incubator.net.virtual.NetworkId;
 import org.onosproject.incubator.net.virtual.VirtualDevice;
@@ -31,6 +33,7 @@
 /**
  * Lists all virtual devices for the network ID.
  */
+@Service
 @Command(scope = "onos", name = "vnet-devices",
         description = "Lists all virtual devices in a virtual network.")
 public class VirtualDeviceListCommand extends AbstractShellCommand {
@@ -40,10 +43,11 @@
 
     @Argument(index = 0, name = "networkId", description = "Network ID",
             required = true, multiValued = false)
+    @Completion(VirtualNetworkCompleter.class)
     Long networkId = null;
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
 
         getSortedVirtualDevices().forEach(this::printVirtualDevice);
     }
diff --git a/cli/src/main/java/org/onosproject/cli/net/vnet/VirtualDeviceRemoveCommand.java b/cli/src/main/java/org/onosproject/cli/net/vnet/VirtualDeviceRemoveCommand.java
index f04bcda..2f40812 100644
--- a/cli/src/main/java/org/onosproject/cli/net/vnet/VirtualDeviceRemoveCommand.java
+++ b/cli/src/main/java/org/onosproject/cli/net/vnet/VirtualDeviceRemoveCommand.java
@@ -16,9 +16,12 @@
 
 package org.onosproject.cli.net.vnet;
 
-import org.apache.karaf.shell.commands.Argument;
-import org.apache.karaf.shell.commands.Command;
+import org.apache.karaf.shell.api.action.Argument;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.Completion;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.cli.AbstractShellCommand;
+import org.onosproject.cli.net.DeviceIdCompleter;
 import org.onosproject.incubator.net.virtual.NetworkId;
 import org.onosproject.incubator.net.virtual.VirtualNetworkAdminService;
 import org.onosproject.net.DeviceId;
@@ -26,20 +29,23 @@
 /**
  * Removes a virtual device.
  */
+@Service
 @Command(scope = "onos", name = "vnet-remove-device",
         description = "Removes a virtual device.")
 public class VirtualDeviceRemoveCommand extends AbstractShellCommand {
 
     @Argument(index = 0, name = "networkId", description = "Network ID",
             required = true, multiValued = false)
+    @Completion(VirtualNetworkCompleter.class)
     Long networkId = null;
 
     @Argument(index = 1, name = "deviceId", description = "Device ID",
             required = true, multiValued = false)
+    @Completion(DeviceIdCompleter.class)
     String deviceId = null;
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         VirtualNetworkAdminService service = get(VirtualNetworkAdminService.class);
         service.removeVirtualDevice(NetworkId.networkId(networkId), DeviceId.deviceId(deviceId));
         print("Virtual device successfully removed.");
diff --git a/cli/src/main/java/org/onosproject/cli/net/vnet/VirtualFlowsListCommand.java b/cli/src/main/java/org/onosproject/cli/net/vnet/VirtualFlowsListCommand.java
index ff0cf7d..57c9fb1 100644
--- a/cli/src/main/java/org/onosproject/cli/net/vnet/VirtualFlowsListCommand.java
+++ b/cli/src/main/java/org/onosproject/cli/net/vnet/VirtualFlowsListCommand.java
@@ -19,11 +19,15 @@
 import com.fasterxml.jackson.databind.ObjectMapper;
 import com.fasterxml.jackson.databind.node.ArrayNode;
 import com.fasterxml.jackson.databind.node.ObjectNode;
-import org.apache.karaf.shell.commands.Argument;
-import org.apache.karaf.shell.commands.Command;
-import org.apache.karaf.shell.commands.Option;
+import org.apache.karaf.shell.api.action.Argument;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.Completion;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
+import org.apache.karaf.shell.api.action.Option;
 import org.onlab.util.StringFilter;
 import org.onosproject.cli.AbstractShellCommand;
+import org.onosproject.cli.PlaceholderCompleter;
+import org.onosproject.cli.net.FlowRuleStatusCompleter;
 import org.onosproject.core.ApplicationId;
 import org.onosproject.core.CoreService;
 import org.onosproject.incubator.net.virtual.NetworkId;
@@ -53,6 +57,7 @@
 /**
  * Lists all currently-known flows.
  */
+@Service
 @Command(scope = "onos", name = "vnet-flows",
          description = "Lists all currently-known flows for a virtual network.")
 public class VirtualFlowsListCommand extends AbstractShellCommand {
@@ -70,18 +75,22 @@
 
     @Argument(index = 0, name = "networkId", description = "Network ID",
             required = true, multiValued = false)
+    @Completion(VirtualNetworkCompleter.class)
     Long networkId = null;
 
     @Argument(index = 1, name = "state", description = "Flow Rule state",
             required = false, multiValued = false)
+    @Completion(FlowRuleStatusCompleter.class)
     String state = null;
 
     @Argument(index = 2, name = "uri", description = "Device ID",
               required = false, multiValued = false)
+    @Completion(VirtualDeviceCompleter.class)
     String uri = null;
 
     @Argument(index = 3, name = "table", description = "Table ID",
             required = false, multiValued = false)
+    @Completion(PlaceholderCompleter.class)
     String table = null;
 
     @Option(name = "-s", aliases = "--short",
@@ -104,7 +113,7 @@
     private StringFilter contentFilter;
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         CoreService coreService = get(CoreService.class);
 
         VirtualNetworkService vnetservice = get(VirtualNetworkService.class);
diff --git a/cli/src/main/java/org/onosproject/cli/net/vnet/VirtualHostCompleter.java b/cli/src/main/java/org/onosproject/cli/net/vnet/VirtualHostCompleter.java
index c44ef40..dec2a35 100644
--- a/cli/src/main/java/org/onosproject/cli/net/vnet/VirtualHostCompleter.java
+++ b/cli/src/main/java/org/onosproject/cli/net/vnet/VirtualHostCompleter.java
@@ -16,7 +16,6 @@
 
 package org.onosproject.cli.net.vnet;
 
-import org.apache.karaf.shell.console.completer.ArgumentCompleter.ArgumentList;
 import org.onosproject.cli.AbstractChoicesCompleter;
 import org.onosproject.incubator.net.virtual.NetworkId;
 import org.onosproject.incubator.net.virtual.VirtualHost;
@@ -37,9 +36,8 @@
 public class VirtualHostCompleter extends AbstractChoicesCompleter {
     @Override
     protected List<String> choices() {
-        ArgumentList args = getArgumentList();
         //parse argument list for network id
-        String[] argsArray = args.getArguments();
+        String[] argsArray = commandLine.getArguments();
         for (String str : argsArray) {
             if (str.matches("[0-9]+")) {
                 long networkId = Long.valueOf(str);
diff --git a/cli/src/main/java/org/onosproject/cli/net/vnet/VirtualHostCreateCommand.java b/cli/src/main/java/org/onosproject/cli/net/vnet/VirtualHostCreateCommand.java
index b2990e9..b580c68 100644
--- a/cli/src/main/java/org/onosproject/cli/net/vnet/VirtualHostCreateCommand.java
+++ b/cli/src/main/java/org/onosproject/cli/net/vnet/VirtualHostCreateCommand.java
@@ -16,9 +16,11 @@
 
 package org.onosproject.cli.net.vnet;
 
-import org.apache.karaf.shell.commands.Argument;
-import org.apache.karaf.shell.commands.Command;
-import org.apache.karaf.shell.commands.Option;
+import org.apache.karaf.shell.api.action.Argument;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.Completion;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
+import org.apache.karaf.shell.api.action.Option;
 import org.onlab.packet.IpAddress;
 import org.onlab.packet.MacAddress;
 import org.onlab.packet.VlanId;
@@ -37,12 +39,14 @@
 /**
  * Creates a new virtual host.
  */
+@Service
 @Command(scope = "onos", name = "vnet-create-host",
         description = "Creates a new virtual host in a network.")
 public class VirtualHostCreateCommand extends AbstractShellCommand {
 
     @Argument(index = 0, name = "networkId", description = "Network ID",
             required = true, multiValued = false)
+    @Completion(VirtualNetworkCompleter.class)
     Long networkId = null;
 
     @Argument(index = 1, name = "mac", description = "Mac address",
@@ -67,7 +71,7 @@
     protected String[] hostIpStrings;
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         VirtualNetworkAdminService service = get(VirtualNetworkAdminService.class);
 
         Set<IpAddress> hostIps = new HashSet<>();
diff --git a/cli/src/main/java/org/onosproject/cli/net/vnet/VirtualHostListCommand.java b/cli/src/main/java/org/onosproject/cli/net/vnet/VirtualHostListCommand.java
index 12512b7..6569e50 100644
--- a/cli/src/main/java/org/onosproject/cli/net/vnet/VirtualHostListCommand.java
+++ b/cli/src/main/java/org/onosproject/cli/net/vnet/VirtualHostListCommand.java
@@ -16,8 +16,10 @@
 
 package org.onosproject.cli.net.vnet;
 
-import org.apache.karaf.shell.commands.Argument;
-import org.apache.karaf.shell.commands.Command;
+import org.apache.karaf.shell.api.action.Argument;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.Completion;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.incubator.net.virtual.NetworkId;
 import org.onosproject.incubator.net.virtual.VirtualHost;
@@ -29,6 +31,7 @@
 /**
  * Lists all virtual hosts for the network ID.
  */
+@Service
 @Command(scope = "onos", name = "vnet-hosts",
         description = "Lists all virtual hosts in a virtual network.")
 public class VirtualHostListCommand extends AbstractShellCommand {
@@ -38,10 +41,11 @@
 
     @Argument(index = 0, name = "networkId", description = "Network ID",
             required = true, multiValued = false)
+    @Completion(VirtualNetworkCompleter.class)
     Long networkId = null;
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         getSortedVirtualHosts().forEach(this::printVirtualHost);
     }
 
diff --git a/cli/src/main/java/org/onosproject/cli/net/vnet/VirtualHostRemoveCommand.java b/cli/src/main/java/org/onosproject/cli/net/vnet/VirtualHostRemoveCommand.java
index a496e38..b7c08c0 100644
--- a/cli/src/main/java/org/onosproject/cli/net/vnet/VirtualHostRemoveCommand.java
+++ b/cli/src/main/java/org/onosproject/cli/net/vnet/VirtualHostRemoveCommand.java
@@ -16,8 +16,10 @@
 
 package org.onosproject.cli.net.vnet;
 
-import org.apache.karaf.shell.commands.Argument;
-import org.apache.karaf.shell.commands.Command;
+import org.apache.karaf.shell.api.action.Argument;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.Completion;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.incubator.net.virtual.NetworkId;
 import org.onosproject.incubator.net.virtual.VirtualNetworkAdminService;
@@ -28,20 +30,23 @@
  * Removes a virtual host.
  */
 
+@Service
 @Command(scope = "onos", name = "vnet-remove-host",
         description = "Removes a virtual host.")
 public class VirtualHostRemoveCommand extends AbstractShellCommand {
 
     @Argument(index = 0, name = "networkId", description = "Network ID",
             required = true, multiValued = false)
+    @Completion(VirtualNetworkCompleter.class)
     Long networkId = null;
 
     @Argument(index = 1, name = "id", description = "Host ID",
               required = true, multiValued = false)
+    @Completion(VirtualHostCompleter.class)
     String id = null;
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         VirtualNetworkAdminService service = get(VirtualNetworkAdminService.class);
         service.removeVirtualHost(NetworkId.networkId(networkId), HostId.hostId(id));
         print("Virtual host successfully removed.");
diff --git a/cli/src/main/java/org/onosproject/cli/net/vnet/VirtualLinkCreateCommand.java b/cli/src/main/java/org/onosproject/cli/net/vnet/VirtualLinkCreateCommand.java
index 604e196..916f118 100644
--- a/cli/src/main/java/org/onosproject/cli/net/vnet/VirtualLinkCreateCommand.java
+++ b/cli/src/main/java/org/onosproject/cli/net/vnet/VirtualLinkCreateCommand.java
@@ -16,9 +16,11 @@
 
 package org.onosproject.cli.net.vnet;
 
-import org.apache.karaf.shell.commands.Argument;
-import org.apache.karaf.shell.commands.Command;
-import org.apache.karaf.shell.commands.Option;
+import org.apache.karaf.shell.api.action.Argument;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.Completion;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
+import org.apache.karaf.shell.api.action.Option;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.incubator.net.virtual.NetworkId;
 import org.onosproject.incubator.net.virtual.VirtualNetworkAdminService;
@@ -29,28 +31,34 @@
 /**
  * Creates a new virtual link.
  */
+@Service
 @Command(scope = "onos", name = "vnet-create-link",
         description = "Creates a new virtual link in a network.")
 public class VirtualLinkCreateCommand extends AbstractShellCommand {
 
     @Argument(index = 0, name = "networkId", description = "Network ID",
             required = true, multiValued = false)
+    @Completion(VirtualNetworkCompleter.class)
     Long networkId = null;
 
     @Argument(index = 1, name = "srcDeviceId", description = "Source device ID",
             required = true, multiValued = false)
+    @Completion(VirtualDeviceCompleter.class)
     String srcDeviceId = null;
 
     @Argument(index = 2, name = "srcPortNum", description = "Source port number",
             required = true, multiValued = false)
+    @Completion(VirtualPortCompleter.class)
     Integer srcPortNum = null;
 
     @Argument(index = 3, name = "dstDeviceId", description = "Destination device ID",
             required = true, multiValued = false)
+    @Completion(VirtualDeviceCompleter.class)
     String dstDeviceId = null;
 
     @Argument(index = 4, name = "dstPortNum", description = "Destination port number",
             required = true, multiValued = false)
+    @Completion(VirtualPortCompleter.class)
     Integer dstPortNum = null;
 
     @Option(name = "-b", aliases = "--bidirectional",
@@ -60,7 +68,7 @@
     boolean bidirectional = false;
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         VirtualNetworkAdminService service = get(VirtualNetworkAdminService.class);
         ConnectPoint src = new ConnectPoint(DeviceId.deviceId(srcDeviceId), PortNumber.portNumber(srcPortNum));
         ConnectPoint dst = new ConnectPoint(DeviceId.deviceId(dstDeviceId), PortNumber.portNumber(dstPortNum));
diff --git a/cli/src/main/java/org/onosproject/cli/net/vnet/VirtualLinkListCommand.java b/cli/src/main/java/org/onosproject/cli/net/vnet/VirtualLinkListCommand.java
index c7f3c86..cf8e7ee 100644
--- a/cli/src/main/java/org/onosproject/cli/net/vnet/VirtualLinkListCommand.java
+++ b/cli/src/main/java/org/onosproject/cli/net/vnet/VirtualLinkListCommand.java
@@ -16,8 +16,10 @@
 
 package org.onosproject.cli.net.vnet;
 
-import org.apache.karaf.shell.commands.Argument;
-import org.apache.karaf.shell.commands.Command;
+import org.apache.karaf.shell.api.action.Argument;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.Completion;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.incubator.net.virtual.NetworkId;
 import org.onosproject.incubator.net.virtual.VirtualLink;
@@ -29,6 +31,7 @@
 /**
  * Lists all virtual links for the network ID.
  */
+@Service
 @Command(scope = "onos", name = "vnet-links",
         description = "Lists all virtual links in a virtual network.")
 public class VirtualLinkListCommand extends AbstractShellCommand {
@@ -38,10 +41,11 @@
 
     @Argument(index = 0, name = "networkId", description = "Network ID",
             required = true, multiValued = false)
+    @Completion(VirtualNetworkCompleter.class)
     Long networkId = null;
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
 
         getSortedVirtualLinks().forEach(this::printVirtualLink);
     }
diff --git a/cli/src/main/java/org/onosproject/cli/net/vnet/VirtualLinkRemoveCommand.java b/cli/src/main/java/org/onosproject/cli/net/vnet/VirtualLinkRemoveCommand.java
index 3e0034a..df0259d 100644
--- a/cli/src/main/java/org/onosproject/cli/net/vnet/VirtualLinkRemoveCommand.java
+++ b/cli/src/main/java/org/onosproject/cli/net/vnet/VirtualLinkRemoveCommand.java
@@ -16,9 +16,11 @@
 
 package org.onosproject.cli.net.vnet;
 
-import org.apache.karaf.shell.commands.Argument;
-import org.apache.karaf.shell.commands.Command;
-import org.apache.karaf.shell.commands.Option;
+import org.apache.karaf.shell.api.action.Argument;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.Completion;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
+import org.apache.karaf.shell.api.action.Option;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.incubator.net.virtual.NetworkId;
 import org.onosproject.incubator.net.virtual.VirtualNetworkAdminService;
@@ -29,28 +31,34 @@
 /**
  * Removes a virtual link.
  */
+@Service
 @Command(scope = "onos", name = "vnet-remove-link",
         description = "Removes a virtual link.")
 public class VirtualLinkRemoveCommand extends AbstractShellCommand {
 
     @Argument(index = 0, name = "networkId", description = "Network ID",
             required = true, multiValued = false)
+    @Completion(VirtualNetworkCompleter.class)
     Long networkId = null;
 
     @Argument(index = 1, name = "srcDeviceId", description = "Source device ID",
             required = true, multiValued = false)
+    @Completion(VirtualDeviceCompleter.class)
     String srcDeviceId = null;
 
     @Argument(index = 2, name = "srcPortNum", description = "Source port number",
             required = true, multiValued = false)
+    @Completion(VirtualPortCompleter.class)
     Integer srcPortNum = null;
 
     @Argument(index = 3, name = "dstDeviceId", description = "Destination device ID",
             required = true, multiValued = false)
+    @Completion(VirtualDeviceCompleter.class)
     String dstDeviceId = null;
 
     @Argument(index = 4, name = "dstPortNum", description = "Destination port number",
             required = true, multiValued = false)
+    @Completion(VirtualPortCompleter.class)
     Integer dstPortNum = null;
 
     @Option(name = "-b", aliases = "--bidirectional",
@@ -60,7 +68,7 @@
     boolean bidirectional = false;
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         VirtualNetworkAdminService service = get(VirtualNetworkAdminService.class);
         ConnectPoint src = new ConnectPoint(DeviceId.deviceId(srcDeviceId), PortNumber.portNumber(srcPortNum));
         ConnectPoint dst = new ConnectPoint(DeviceId.deviceId(dstDeviceId), PortNumber.portNumber(dstPortNum));
diff --git a/cli/src/main/java/org/onosproject/cli/net/vnet/VirtualNetworkBalanceMastersCommand.java b/cli/src/main/java/org/onosproject/cli/net/vnet/VirtualNetworkBalanceMastersCommand.java
index 632ff57..4164688 100644
--- a/cli/src/main/java/org/onosproject/cli/net/vnet/VirtualNetworkBalanceMastersCommand.java
+++ b/cli/src/main/java/org/onosproject/cli/net/vnet/VirtualNetworkBalanceMastersCommand.java
@@ -15,8 +15,10 @@
  */
 package org.onosproject.cli.net.vnet;
 
-import org.apache.karaf.shell.commands.Argument;
-import org.apache.karaf.shell.commands.Command;
+import org.apache.karaf.shell.api.action.Argument;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.Completion;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.incubator.net.virtual.NetworkId;
 import org.onosproject.incubator.net.virtual.VirtualNetworkService;
@@ -25,14 +27,16 @@
 /**
  * Forces virtual network device mastership rebalancing.
  */
+@Service
 @Command(scope = "onos", name = "vnet-balance-masters",
         description = "Forces virtual network device mastership rebalancing")
 public class VirtualNetworkBalanceMastersCommand extends AbstractShellCommand {
     @Argument(index = 0, name = "networkId", description = "Network ID",
             required = true, multiValued = false)
+    @Completion(VirtualNetworkCompleter.class)
     Long networkId = null;
     @Override
-    protected void execute() {
+    protected void doExecute() {
         VirtualNetworkService vnetService = get(VirtualNetworkService.class);
         MastershipAdminService mastershipAdminService = vnetService
                 .get(NetworkId.networkId(networkId), MastershipAdminService.class);
diff --git a/cli/src/main/java/org/onosproject/cli/net/vnet/VirtualNetworkCompleter.java b/cli/src/main/java/org/onosproject/cli/net/vnet/VirtualNetworkCompleter.java
index f06177e7..4fc1732 100644
--- a/cli/src/main/java/org/onosproject/cli/net/vnet/VirtualNetworkCompleter.java
+++ b/cli/src/main/java/org/onosproject/cli/net/vnet/VirtualNetworkCompleter.java
@@ -16,8 +16,11 @@
 
 package org.onosproject.cli.net.vnet;
 
-import org.apache.karaf.shell.console.Completer;
-import org.apache.karaf.shell.console.completer.StringsCompleter;
+import org.apache.karaf.shell.api.console.CommandLine;
+import org.apache.karaf.shell.api.console.Completer;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
+import org.apache.karaf.shell.api.console.Session;
+import org.apache.karaf.shell.support.completers.StringsCompleter;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.incubator.net.virtual.TenantId;
 import org.onosproject.incubator.net.virtual.VirtualNetwork;
@@ -33,9 +36,10 @@
 /**
  * Virtual network completer.
  */
+@Service
 public class VirtualNetworkCompleter implements Completer {
     @Override
-    public int complete(String buffer, int cursor, List<String> candidates) {
+    public int complete(Session session, CommandLine commandLine, List<String> candidates) {
         // Delegate string completer
         StringsCompleter delegate = new StringsCompleter();
 
@@ -53,6 +57,6 @@
         virtualNetworks.forEach(virtualNetwork -> strings.add(virtualNetwork.id().toString()));
 
         // Now let the completer do the work for figuring out what to offer.
-        return delegate.complete(buffer, cursor, candidates);
+        return delegate.complete(session, commandLine, candidates);
     }
 }
diff --git a/cli/src/main/java/org/onosproject/cli/net/vnet/VirtualNetworkCreateCommand.java b/cli/src/main/java/org/onosproject/cli/net/vnet/VirtualNetworkCreateCommand.java
index b927bf9..0850144 100644
--- a/cli/src/main/java/org/onosproject/cli/net/vnet/VirtualNetworkCreateCommand.java
+++ b/cli/src/main/java/org/onosproject/cli/net/vnet/VirtualNetworkCreateCommand.java
@@ -16,8 +16,10 @@
 
 package org.onosproject.cli.net.vnet;
 
-import org.apache.karaf.shell.commands.Argument;
-import org.apache.karaf.shell.commands.Command;
+import org.apache.karaf.shell.api.action.Argument;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.Completion;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.incubator.net.virtual.TenantId;
 import org.onosproject.incubator.net.virtual.VirtualNetworkAdminService;
@@ -25,16 +27,18 @@
 /**
  * Creates a new virtual network.
  */
+@Service
 @Command(scope = "onos", name = "vnet-create",
         description = "Creates a new virtual network.")
 public class VirtualNetworkCreateCommand extends AbstractShellCommand {
 
     @Argument(index = 0, name = "id", description = "Tenant ID",
             required = true, multiValued = false)
+    @Completion(TenantCompleter.class)
     String id = null;
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         VirtualNetworkAdminService service = get(VirtualNetworkAdminService.class);
         service.createVirtualNetwork(TenantId.tenantId(id));
         print("Virtual network successfully created.");
diff --git a/cli/src/main/java/org/onosproject/cli/net/vnet/VirtualNetworkIntentCreateCommand.java b/cli/src/main/java/org/onosproject/cli/net/vnet/VirtualNetworkIntentCreateCommand.java
index 9e48ed6..f57f3f7 100644
--- a/cli/src/main/java/org/onosproject/cli/net/vnet/VirtualNetworkIntentCreateCommand.java
+++ b/cli/src/main/java/org/onosproject/cli/net/vnet/VirtualNetworkIntentCreateCommand.java
@@ -16,8 +16,10 @@
 
 package org.onosproject.cli.net.vnet;
 
-import org.apache.karaf.shell.commands.Argument;
-import org.apache.karaf.shell.commands.Command;
+import org.apache.karaf.shell.api.action.Argument;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.Completion;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.cli.net.ConnectivityIntentCommand;
 import org.onosproject.incubator.net.virtual.NetworkId;
 import org.onosproject.incubator.net.virtual.VirtualNetworkIntent;
@@ -34,12 +36,14 @@
 /**
  * Installs virtual network intents.
  */
+@Service
 @Command(scope = "onos", name = "add-vnet-intent",
         description = "Installs virtual network connectivity intent")
 public class VirtualNetworkIntentCreateCommand extends ConnectivityIntentCommand {
 
     @Argument(index = 0, name = "networkId", description = "Network ID",
             required = true, multiValued = false)
+    @Completion(VirtualNetworkCompleter.class)
     Long networkId = null;
 
     @Argument(index = 1, name = "ingressDevice",
@@ -53,7 +57,7 @@
     String egressDeviceString = null;
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         VirtualNetworkService service = get(VirtualNetworkService.class);
         IntentService virtualNetworkIntentService = service.get(NetworkId.networkId(networkId), IntentService.class);
 
diff --git a/cli/src/main/java/org/onosproject/cli/net/vnet/VirtualNetworkIntentRemoveCommand.java b/cli/src/main/java/org/onosproject/cli/net/vnet/VirtualNetworkIntentRemoveCommand.java
index 7ba6791..67f39f2 100644
--- a/cli/src/main/java/org/onosproject/cli/net/vnet/VirtualNetworkIntentRemoveCommand.java
+++ b/cli/src/main/java/org/onosproject/cli/net/vnet/VirtualNetworkIntentRemoveCommand.java
@@ -16,9 +16,11 @@
 
 package org.onosproject.cli.net.vnet;
 
-import org.apache.karaf.shell.commands.Argument;
-import org.apache.karaf.shell.commands.Command;
-import org.apache.karaf.shell.commands.Option;
+import org.apache.karaf.shell.api.action.Argument;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.Completion;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
+import org.apache.karaf.shell.api.action.Option;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.core.ApplicationId;
 import org.onosproject.core.CoreService;
@@ -44,12 +46,14 @@
 /**
  * Removes a virtual network intent.
  */
+@Service
 @Command(scope = "onos", name = "remove-vnet-intent",
         description = "Removes the virtual network intent")
 public class VirtualNetworkIntentRemoveCommand extends AbstractShellCommand {
 
     @Argument(index = 0, name = "networkId", description = "Network ID",
             required = true, multiValued = false)
+    @Completion(VirtualNetworkCompleter.class)
     Long networkId = null;
 
     @Argument(index = 1, name = "app",
@@ -75,7 +79,7 @@
     private static final EnumSet<IntentState> CAN_PURGE = EnumSet.of(WITHDRAWN, FAILED);
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         VirtualNetworkService service = get(VirtualNetworkService.class);
         IntentService intentService = service.get(NetworkId.networkId(networkId), IntentService.class);
         CoreService coreService = get(CoreService.class);
diff --git a/cli/src/main/java/org/onosproject/cli/net/vnet/VirtualNetworkListCommand.java b/cli/src/main/java/org/onosproject/cli/net/vnet/VirtualNetworkListCommand.java
index 6d5818c..b6e1c1a 100644
--- a/cli/src/main/java/org/onosproject/cli/net/vnet/VirtualNetworkListCommand.java
+++ b/cli/src/main/java/org/onosproject/cli/net/vnet/VirtualNetworkListCommand.java
@@ -16,7 +16,8 @@
 
 package org.onosproject.cli.net.vnet;
 
-import org.apache.karaf.shell.commands.Command;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.incubator.net.virtual.TenantId;
 import org.onosproject.incubator.net.virtual.VirtualNetwork;
@@ -32,6 +33,7 @@
 /**
  * Lists all virtual networks for the tenant ID.
  */
+@Service
 @Command(scope = "onos", name = "vnets",
         description = "Lists all virtual networks.")
 public class VirtualNetworkListCommand extends AbstractShellCommand {
@@ -40,7 +42,7 @@
             "tenantId=%s, networkId=%s";
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
 
         getSortedVirtualNetworks().forEach(this::printVirtualNetwork);
     }
diff --git a/cli/src/main/java/org/onosproject/cli/net/vnet/VirtualNetworkPacketRequestCommand.java b/cli/src/main/java/org/onosproject/cli/net/vnet/VirtualNetworkPacketRequestCommand.java
index 2a88198..c022444 100644
--- a/cli/src/main/java/org/onosproject/cli/net/vnet/VirtualNetworkPacketRequestCommand.java
+++ b/cli/src/main/java/org/onosproject/cli/net/vnet/VirtualNetworkPacketRequestCommand.java
@@ -19,9 +19,11 @@
 import com.fasterxml.jackson.databind.JsonNode;
 import com.fasterxml.jackson.databind.ObjectMapper;
 import com.fasterxml.jackson.databind.node.ArrayNode;
-import org.apache.karaf.shell.commands.Argument;
-import org.apache.karaf.shell.commands.Command;
-import org.apache.karaf.shell.commands.Option;
+import org.apache.karaf.shell.api.action.Argument;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.Completion;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
+import org.apache.karaf.shell.api.action.Option;
 import org.onlab.packet.Ip6Address;
 import org.onlab.packet.IpPrefix;
 import org.onlab.packet.MacAddress;
@@ -29,10 +31,15 @@
 import org.onlab.packet.VlanId;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.cli.net.EthType;
+import org.onosproject.cli.net.EthTypeCompleter;
 import org.onosproject.cli.net.ExtHeader;
+import org.onosproject.cli.net.ExtHeaderCompleter;
 import org.onosproject.cli.net.Icmp6Code;
+import org.onosproject.cli.net.Icmp6CodeCompleter;
 import org.onosproject.cli.net.Icmp6Type;
+import org.onosproject.cli.net.Icmp6TypeCompleter;
 import org.onosproject.cli.net.IpProtocol;
+import org.onosproject.cli.net.IpProtocolCompleter;
 import org.onosproject.incubator.net.virtual.NetworkId;
 import org.onosproject.incubator.net.virtual.VirtualNetworkService;
 import org.onosproject.net.DeviceId;
@@ -50,6 +57,7 @@
 /**
  * Tests virtual network packet requests.
  */
+@Service
 @Command(scope = "onos", name = "vnet-packet",
         description = "Tests virtual network packet requests")
 public class VirtualNetworkPacketRequestCommand extends AbstractShellCommand {
@@ -78,6 +86,7 @@
 
     @Option(name = "-t", aliases = "--ethType", description = "Ethernet Type",
             required = false, multiValued = false)
+    @Completion(EthTypeCompleter.class)
     private String ethTypeString = null;
 
     @Option(name = "-v", aliases = "--vlan", description = "VLAN ID",
@@ -86,6 +95,7 @@
 
     @Option(name = "--ipProto", description = "IP Protocol",
             required = false, multiValued = false)
+    @Completion(IpProtocolCompleter.class)
     private String ipProtoString = null;
 
     @Option(name = "--ipSrc", description = "Source IP Prefix",
@@ -102,10 +112,12 @@
 
     @Option(name = "--icmp6Type", description = "ICMPv6 Type",
             required = false, multiValued = false)
+    @Completion(Icmp6TypeCompleter.class)
     private String icmp6TypeString = null;
 
     @Option(name = "--icmp6Code", description = "ICMPv6 Code",
             required = false, multiValued = false)
+    @Completion(Icmp6CodeCompleter.class)
     private String icmp6CodeString = null;
 
     @Option(name = "--ndTarget", description = "IPv6 Neighbor Discovery Target Address",
@@ -130,10 +142,11 @@
 
     @Option(name = "--extHdr", description = "IPv6 Extension Header Pseudo-field",
             required = false, multiValued = true)
+    @Completion(ExtHeaderCompleter.class)
     private List<String> extHdrStringList = null;
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         VirtualNetworkService service = get(VirtualNetworkService.class);
         PacketService virtualPacketService = service.get(NetworkId.networkId(networkId), PacketService.class);
 
diff --git a/cli/src/main/java/org/onosproject/cli/net/vnet/VirtualNetworkRemoveCommand.java b/cli/src/main/java/org/onosproject/cli/net/vnet/VirtualNetworkRemoveCommand.java
index c608b25..aad24d7 100644
--- a/cli/src/main/java/org/onosproject/cli/net/vnet/VirtualNetworkRemoveCommand.java
+++ b/cli/src/main/java/org/onosproject/cli/net/vnet/VirtualNetworkRemoveCommand.java
@@ -16,8 +16,10 @@
 
 package org.onosproject.cli.net.vnet;
 
-import org.apache.karaf.shell.commands.Argument;
-import org.apache.karaf.shell.commands.Command;
+import org.apache.karaf.shell.api.action.Argument;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.Completion;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.incubator.net.virtual.NetworkId;
 import org.onosproject.incubator.net.virtual.VirtualNetworkAdminService;
@@ -25,16 +27,18 @@
 /**
  * Removes a virtual network.
  */
+@Service
 @Command(scope = "onos", name = "vnet-remove",
         description = "Removes a virtual network.")
 public class VirtualNetworkRemoveCommand extends AbstractShellCommand {
 
     @Argument(index = 0, name = "id", description = "Network ID",
             required = true, multiValued = false)
+    @Completion(VirtualNetworkCompleter.class)
     Long id;
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         VirtualNetworkAdminService service = get(VirtualNetworkAdminService.class);
         service.removeVirtualNetwork(NetworkId.networkId(id));
         print("Virtual network successfully removed.");
diff --git a/cli/src/main/java/org/onosproject/cli/net/vnet/VirtualPortBindCommand.java b/cli/src/main/java/org/onosproject/cli/net/vnet/VirtualPortBindCommand.java
index 2ebdc2c..488972c 100644
--- a/cli/src/main/java/org/onosproject/cli/net/vnet/VirtualPortBindCommand.java
+++ b/cli/src/main/java/org/onosproject/cli/net/vnet/VirtualPortBindCommand.java
@@ -16,9 +16,13 @@
 
 package org.onosproject.cli.net.vnet;
 
-import org.apache.karaf.shell.commands.Argument;
-import org.apache.karaf.shell.commands.Command;
+import org.apache.karaf.shell.api.action.Argument;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.Completion;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.cli.AbstractShellCommand;
+import org.onosproject.cli.net.DeviceIdCompleter;
+import org.onosproject.cli.net.PortNumberCompleter;
 import org.onosproject.incubator.net.virtual.NetworkId;
 import org.onosproject.incubator.net.virtual.VirtualNetworkAdminService;
 import org.onosproject.incubator.net.virtual.VirtualNetworkService;
@@ -35,31 +39,37 @@
 /**
  * Binds an existing virtual port with a physical port.
  */
+@Service
 @Command(scope = "onos", name = "vnet-bind-port",
         description = "Binds an existing virtual port with a physical port.")
 public class VirtualPortBindCommand extends AbstractShellCommand {
     @Argument(index = 0, name = "networkId", description = "Network ID",
             required = true, multiValued = false)
+    @Completion(VirtualNetworkCompleter.class)
     Long networkId = null;
 
     @Argument(index = 1, name = "deviceId", description = "Virtual Device ID",
             required = true, multiValued = false)
+    @Completion(VirtualDeviceCompleter.class)
     String deviceId = null;
 
     @Argument(index = 2, name = "portNum", description = "Virtual device port number",
             required = true, multiValued = false)
+    @Completion(VirtualPortCompleter.class)
     Integer portNum = null;
 
     @Argument(index = 3, name = "physDeviceId", description = "Physical Device ID",
             required = true, multiValued = false)
+    @Completion(DeviceIdCompleter.class)
     String physDeviceId = null;
 
     @Argument(index = 4, name = "physPortNum", description = "Physical device port number",
             required = true, multiValued = false)
+    @Completion(PortNumberCompleter.class)
     Integer physPortNum = null;
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         VirtualNetworkAdminService service = get(VirtualNetworkAdminService.class);
         DeviceService deviceService = get(DeviceService.class);
 
diff --git a/cli/src/main/java/org/onosproject/cli/net/vnet/VirtualPortCompleter.java b/cli/src/main/java/org/onosproject/cli/net/vnet/VirtualPortCompleter.java
index 19a31a3..f810a97 100644
--- a/cli/src/main/java/org/onosproject/cli/net/vnet/VirtualPortCompleter.java
+++ b/cli/src/main/java/org/onosproject/cli/net/vnet/VirtualPortCompleter.java
@@ -18,7 +18,7 @@
 
 import static org.onlab.osgi.DefaultServiceDirectory.getService;
 
-import org.apache.karaf.shell.console.completer.ArgumentCompleter.ArgumentList;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.cli.AbstractChoicesCompleter;
 import org.onosproject.incubator.net.virtual.NetworkId;
 import org.onosproject.incubator.net.virtual.VirtualNetworkService;
@@ -36,12 +36,12 @@
  * Assumes the first argument which can be parsed to a number is network id
  * and the argument right before the one being completed is device id
  */
+@Service
 public class VirtualPortCompleter extends AbstractChoicesCompleter {
     @Override
     protected List<String> choices() {
-        ArgumentList args = getArgumentList();
         //parse argument list for network id
-        String[] argsArray = args.getArguments();
+        String[] argsArray = commandLine.getArguments();
         for (String str : argsArray) {
             if (str.matches("[0-9]+")) {
                 long networkId = Long.valueOf(str);
diff --git a/cli/src/main/java/org/onosproject/cli/net/vnet/VirtualPortCreateCommand.java b/cli/src/main/java/org/onosproject/cli/net/vnet/VirtualPortCreateCommand.java
index 5769a64..190de0f 100644
--- a/cli/src/main/java/org/onosproject/cli/net/vnet/VirtualPortCreateCommand.java
+++ b/cli/src/main/java/org/onosproject/cli/net/vnet/VirtualPortCreateCommand.java
@@ -16,9 +16,13 @@
 
 package org.onosproject.cli.net.vnet;
 
-import org.apache.karaf.shell.commands.Argument;
-import org.apache.karaf.shell.commands.Command;
+import org.apache.karaf.shell.api.action.Argument;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.Completion;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.cli.AbstractShellCommand;
+import org.onosproject.cli.net.DeviceIdCompleter;
+import org.onosproject.cli.net.PortNumberCompleter;
 import org.onosproject.incubator.net.virtual.NetworkId;
 import org.onosproject.incubator.net.virtual.VirtualDevice;
 import org.onosproject.incubator.net.virtual.VirtualNetworkAdminService;
@@ -35,16 +39,19 @@
 /**
  * Creates a new virtual port.
  */
+@Service
 @Command(scope = "onos", name = "vnet-create-port",
         description = "Creates a new virtual port in a network.")
 public class VirtualPortCreateCommand extends AbstractShellCommand {
 
     @Argument(index = 0, name = "networkId", description = "Network ID",
             required = true, multiValued = false)
+    @Completion(VirtualNetworkCompleter.class)
     Long networkId = null;
 
     @Argument(index = 1, name = "deviceId", description = "Virtual Device ID",
             required = true, multiValued = false)
+    @Completion(VirtualDeviceCompleter.class)
     String deviceId = null;
 
     @Argument(index = 2, name = "portNum", description = "Virtual device port number",
@@ -53,14 +60,16 @@
 
     @Argument(index = 3, name = "physDeviceId", description = "Physical Device ID",
             required = false, multiValued = false)
+    @Completion(DeviceIdCompleter.class)
     String physDeviceId = null;
 
     @Argument(index = 4, name = "physPortNum", description = "Physical device port number",
             required = false, multiValued = false)
+    @Completion(PortNumberCompleter.class)
     Integer physPortNum = null;
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         VirtualNetworkAdminService service = get(VirtualNetworkAdminService.class);
         DeviceService deviceService = get(DeviceService.class);
 
diff --git a/cli/src/main/java/org/onosproject/cli/net/vnet/VirtualPortListCommand.java b/cli/src/main/java/org/onosproject/cli/net/vnet/VirtualPortListCommand.java
index 7a0f2f0..612ef65 100644
--- a/cli/src/main/java/org/onosproject/cli/net/vnet/VirtualPortListCommand.java
+++ b/cli/src/main/java/org/onosproject/cli/net/vnet/VirtualPortListCommand.java
@@ -16,8 +16,10 @@
 
 package org.onosproject.cli.net.vnet;
 
-import org.apache.karaf.shell.commands.Argument;
-import org.apache.karaf.shell.commands.Command;
+import org.apache.karaf.shell.api.action.Argument;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.Completion;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.incubator.net.virtual.NetworkId;
 import org.onosproject.incubator.net.virtual.VirtualNetworkService;
@@ -32,6 +34,7 @@
 /**
  * Lists all virtual ports for the network ID.
  */
+@Service
 @Command(scope = "onos", name = "vnet-ports",
         description = "Lists all virtual ports in a virtual network.")
 public class VirtualPortListCommand extends AbstractShellCommand {
@@ -41,14 +44,16 @@
 
     @Argument(index = 0, name = "networkId", description = "Network ID",
             required = true, multiValued = false)
+    @Completion(VirtualNetworkCompleter.class)
     Long networkId = null;
 
     @Argument(index = 1, name = "deviceId", description = "Virtual Device ID",
             required = true, multiValued = false)
+    @Completion(VirtualDeviceCompleter.class)
     String deviceId = null;
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
 
         getSortedVirtualPorts().forEach(this::printVirtualPort);
     }
diff --git a/cli/src/main/java/org/onosproject/cli/net/vnet/VirtualPortRemoveCommand.java b/cli/src/main/java/org/onosproject/cli/net/vnet/VirtualPortRemoveCommand.java
index 12710ab..d8fe2e6 100644
--- a/cli/src/main/java/org/onosproject/cli/net/vnet/VirtualPortRemoveCommand.java
+++ b/cli/src/main/java/org/onosproject/cli/net/vnet/VirtualPortRemoveCommand.java
@@ -16,8 +16,10 @@
 
 package org.onosproject.cli.net.vnet;
 
-import org.apache.karaf.shell.commands.Argument;
-import org.apache.karaf.shell.commands.Command;
+import org.apache.karaf.shell.api.action.Argument;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.Completion;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.incubator.net.virtual.NetworkId;
 import org.onosproject.incubator.net.virtual.VirtualNetworkAdminService;
@@ -27,24 +29,28 @@
 /**
  * Removes a virtual port.
  */
+@Service
 @Command(scope = "onos", name = "vnet-remove-port",
         description = "Removes a virtual port.")
 public class VirtualPortRemoveCommand extends AbstractShellCommand {
 
     @Argument(index = 0, name = "networkId", description = "Network ID",
             required = true, multiValued = false)
+    @Completion(VirtualNetworkCompleter.class)
     Long networkId = null;
 
     @Argument(index = 1, name = "deviceId", description = "Device ID",
             required = true, multiValued = false)
+    @Completion(VirtualDeviceCompleter.class)
     String deviceId = null;
 
     @Argument(index = 2, name = "portNum", description = "Device port number",
             required = true, multiValued = false)
+    @Completion(VirtualPortCompleter.class)
     Integer portNum = null;
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         VirtualNetworkAdminService service = get(VirtualNetworkAdminService.class);
         service.removeVirtualPort(NetworkId.networkId(networkId), DeviceId.deviceId(deviceId),
                                   PortNumber.portNumber(portNum));
diff --git a/cli/src/main/java/org/onosproject/cli/net/vnet/VirtualPortStateCommand.java b/cli/src/main/java/org/onosproject/cli/net/vnet/VirtualPortStateCommand.java
index d11e249..a645419 100644
--- a/cli/src/main/java/org/onosproject/cli/net/vnet/VirtualPortStateCommand.java
+++ b/cli/src/main/java/org/onosproject/cli/net/vnet/VirtualPortStateCommand.java
@@ -16,8 +16,10 @@
 
 package org.onosproject.cli.net.vnet;
 
-import org.apache.karaf.shell.commands.Argument;
-import org.apache.karaf.shell.commands.Command;
+import org.apache.karaf.shell.api.action.Argument;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.Completion;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.incubator.net.virtual.NetworkId;
 import org.onosproject.incubator.net.virtual.VirtualNetworkAdminService;
@@ -33,19 +35,23 @@
 /**
  * Administratively enables or disables state of an existing virtual port.
  */
+@Service
 @Command(scope = "onos", name = "vnet-port-state",
         description = "Administratively enables or disables state of an existing virtual port.")
 public class VirtualPortStateCommand extends AbstractShellCommand {
     @Argument(index = 0, name = "networkId", description = "Network ID",
             required = true, multiValued = false)
+    @Completion(VirtualNetworkCompleter.class)
     Long networkId = null;
 
     @Argument(index = 1, name = "deviceId", description = "Virtual Device ID",
             required = true, multiValued = false)
+    @Completion(VirtualDeviceCompleter.class)
     String deviceId = null;
 
     @Argument(index = 2, name = "portNum", description = "Virtual device port number",
             required = true, multiValued = false)
+    @Completion(VirtualPortCompleter.class)
     Integer portNum = null;
 
     @Argument(index = 3, name = "portState",
@@ -54,7 +60,7 @@
     String portState = null;
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         VirtualNetworkAdminService service = get(VirtualNetworkAdminService.class);
 
         VirtualPort vPort = getVirtualPort(PortNumber.portNumber(portNum));
diff --git a/cli/src/main/java/org/onosproject/cli/security/ReviewApplicationNameCompleter.java b/cli/src/main/java/org/onosproject/cli/security/ReviewApplicationNameCompleter.java
index f6e306a..fa8dbce 100644
--- a/cli/src/main/java/org/onosproject/cli/security/ReviewApplicationNameCompleter.java
+++ b/cli/src/main/java/org/onosproject/cli/security/ReviewApplicationNameCompleter.java
@@ -16,7 +16,10 @@
 
 package org.onosproject.cli.security;
 
-import org.apache.karaf.shell.console.completer.StringsCompleter;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
+import org.apache.karaf.shell.api.console.CommandLine;
+import org.apache.karaf.shell.api.console.Session;
+import org.apache.karaf.shell.support.completers.StringsCompleter;
 import org.onosproject.app.ApplicationService;
 import org.onosproject.app.ApplicationState;
 import org.onosproject.cli.AbstractCompleter;
@@ -32,9 +35,10 @@
 /**
  * Application name completer for security review command.
  */
+@Service
 public class ReviewApplicationNameCompleter extends AbstractCompleter {
     @Override
-    public int complete(String buffer, int cursor, List<String> candidates) {
+    public int complete(Session session, CommandLine commandLine, List<String> candidates) {
         // Delegate string completer
         StringsCompleter delegate = new StringsCompleter();
 
@@ -53,6 +57,6 @@
         }
 
         // Now let the completer do the work for figuring out what to offer.
-        return delegate.complete(buffer, cursor, candidates);
+        return delegate.complete(session, commandLine, candidates);
     }
 }
\ No newline at end of file
diff --git a/cli/src/main/java/org/onosproject/cli/security/ReviewCommand.java b/cli/src/main/java/org/onosproject/cli/security/ReviewCommand.java
index 3031c3c..00c5424 100644
--- a/cli/src/main/java/org/onosproject/cli/security/ReviewCommand.java
+++ b/cli/src/main/java/org/onosproject/cli/security/ReviewCommand.java
@@ -16,8 +16,10 @@
 
 package org.onosproject.cli.security;
 
-import org.apache.karaf.shell.commands.Argument;
-import org.apache.karaf.shell.commands.Command;
+import org.apache.karaf.shell.api.action.Argument;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.Completion;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.app.ApplicationAdminService;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.core.Application;
@@ -33,12 +35,14 @@
 /**
  * Application security policy review commands.
  */
+@Service
 @Command(scope = "onos", name = "review",
         description = "Application security policy review interface")
 public class ReviewCommand extends AbstractShellCommand {
 
     @Argument(index = 0, name = "name", description = "Application name",
             required = true, multiValued = false)
+    @Completion(ReviewApplicationNameCompleter.class)
     String name = null;
 
     @Argument(index = 1, name = "accept", description = "Option to accept policy",
@@ -46,7 +50,7 @@
     String accept = null;
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         ApplicationAdminService applicationAdminService = get(ApplicationAdminService.class);
         ApplicationId appId = applicationAdminService.getId(name);
         if (appId == null) {
diff --git a/cli/src/main/resources/OSGI-INF/blueprint/shell-config.xml b/cli/src/main/resources/OSGI-INF/blueprint/shell-config.xml
deleted file mode 100644
index e67a8fb..0000000
--- a/cli/src/main/resources/OSGI-INF/blueprint/shell-config.xml
+++ /dev/null
@@ -1,1014 +0,0 @@
-<!--
-  ~ Copyright 2014-present Open Networking Foundation
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~     http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License.
-  -->
-<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0">
-
-    <command-bundle xmlns="http://karaf.apache.org/xmlns/shell/v1.1.0">
-
-        <command>
-            <action class="org.onosproject.cli.MarkCommand"/>
-        </command>
-
-        <command>
-            <action class="org.onosproject.cli.PrettyJson"/>
-        </command>
-
-        <command>
-            <action class="org.onosproject.cli.PrettyXml"/>
-        </command>
-
-        <command>
-            <action class="org.onosproject.cli.SummaryCommand"/>
-        </command>
-
-        <command>
-            <action class="org.onosproject.cli.IssuCommand"/>
-        </command>
-
-        <command>
-            <action class="org.onosproject.cli.security.ReviewCommand"/>
-            <completers>
-                <ref component-id="reviewAppNameCompleter"/>
-            </completers>
-        </command>
-
-        <command>
-            <action class="org.onosproject.cli.net.FlowObjectiveNextListCommand"/>
-        </command>
-
-        <command>
-            <action class="org.onosproject.cli.net.FlowObjectivePendingNextCommand"/>
-        </command>
-
-        <command>
-            <action class="org.onosproject.cli.net.FlowObjectiveQueueListCommand"/>
-        </command>
-
-        <command>
-            <action class="org.onosproject.cli.net.FlowObjectiveQueueClearCommand"/>
-        </command>
-
-        <command>
-            <action class="org.onosproject.cli.net.FlowObjectiveCompositionCommand"/>
-        </command>
-
-        <command>
-            <action class="org.onosproject.cli.app.ApplicationsListCommand"/>
-        </command>
-
-        <command>
-            <action class="org.onosproject.cli.app.ApplicationCommand"/>
-            <completers>
-                <ref component-id="appCommandCompleter"/>
-                <ref component-id="appNameCompleter"/>
-            </completers>
-        </command>
-
-        <command>
-            <action class="org.onosproject.cli.cfg.ComponentConfigCommand"/>
-            <completers>
-                <ref component-id="cfgCommandCompleter"/>
-                <ref component-id="componentNameCompleter"/>
-                <ref component-id="componentPropertyNameCompleter"/>
-            </completers>
-        </command>
-
-        <command>
-            <action class="org.onosproject.cli.cfg.NetworkConfigRegistryCommand"/>
-        </command>
-
-        <command>
-            <action class="org.onosproject.cli.cfg.NetworkConfigCommand"/>
-            <completers>
-                <ref component-id="subjectClassKeyCompleter"/>
-                <ref component-id="subjectKeyCompleter"/>
-                <ref component-id="configKeyCompleter"/>
-            </completers>
-        </command>
-
-        <command>
-            <action class="org.onosproject.cli.MetricsListCommand"/>
-            <completers>
-                <ref component-id="metricNameCompleter"/>
-            </completers>
-        </command>
-
-        <command>
-            <action class="org.onosproject.cli.NodesListCommand"/>
-        </command>
-        <command>
-            <action class="org.onosproject.cli.StorageNodesListCommand"/>
-        </command>
-
-        <command>
-            <action class="org.onosproject.cli.RolesCommand"/>
-        </command>
-        <command>
-            <action class="org.onosproject.cli.MastersListCommand"/>
-        </command>
-        <command>
-            <action class="org.onosproject.cli.BalanceMastersCommand"/>
-        </command>
-        <command>
-            <action class="org.onosproject.cli.app.ApplicationIdListCommand"/>
-        </command>
-
-        <command>
-            <action class="org.onosproject.cli.net.McastShowCommand"/>
-            <completers>
-                <ref component-id="mcastGroupCompleter"/>
-            </completers>
-        </command>
-        <command>
-            <action class="org.onosproject.cli.net.McastRoutesListCommand"/>
-            <completers>
-                <ref component-id="mcastGroupCompleter"/>
-            </completers>
-        </command>
-        <command>
-            <action class="org.onosproject.cli.net.McastJoinCommand"/>
-            <completers>
-                <ref component-id="placeholderCompleter"/>
-                <ref component-id="mcastGroupCompleter"/>
-                <ref component-id="connectPointCompleter"/>
-            </completers>
-        </command>
-        <command>
-            <action class="org.onosproject.cli.net.McastDeleteCommand"/>
-            <completers>
-                <ref component-id="placeholderCompleter"/>
-                <ref component-id="mcastGroupCompleter"/>
-                <ref component-id="connectPointCompleter"/>
-            </completers>
-        </command>
-
-        <command>
-            <action class="org.onosproject.cli.net.DriverProvidersListCommand"/>
-        </command>
-        <command>
-            <action class="org.onosproject.cli.net.DriversListCommand"/>
-            <completers>
-                <ref component-id="driverNameCompleter"/>
-                <null/>
-            </completers>
-        </command>
-
-        <command>
-            <action class="org.onosproject.cli.net.DevicesListCommand"/>
-        </command>
-        <command>
-            <action class="org.onosproject.cli.net.DevicePortsListCommand"/>
-            <completers>
-                <ref component-id="deviceIdCompleter"/>
-            </completers>
-        </command>
-        <command>
-            <action class="org.onosproject.cli.net.DevicePortStateCommand"/>
-            <completers>
-                <ref component-id="deviceIdCompleter"/>
-                <ref component-id="portNumberCompleter"/>
-                <ref component-id="portStateCompleter"/>
-                <null/>
-            </completers>
-        </command>
-        <command>
-            <action class="org.onosproject.cli.net.DeviceControllersCommand"/>
-            <completers>
-                <ref component-id="deviceIdCompleter"/>
-            </completers>
-        </command>
-        <command>
-            <action class="org.onosproject.cli.net.DeviceSetControllersCommand"/>
-            <completers>
-                <ref component-id="deviceIdCompleter"/>
-            </completers>
-        </command>
-        <command>
-            <action class="org.onosproject.cli.net.DeviceRemoveCommand"/>
-            <completers>
-                <ref component-id="deviceIdCompleter"/>
-            </completers>
-        </command>
-        <command>
-            <action class="org.onosproject.cli.net.DeviceInterfaceAddCommand"/>
-            <completers>
-                <ref component-id="deviceIdCompleter"/>
-            </completers>
-        </command>
-        <command>
-            <action class="org.onosproject.cli.net.DeviceInterfaceRemoveCommand"/>
-            <completers>
-                <ref component-id="deviceIdCompleter"/>
-            </completers>
-        </command>
-        <command>
-            <action class="org.onosproject.cli.net.DeviceInterfacesListCommand"/>
-            <completers>
-                <ref component-id="deviceIdCompleter"/>
-            </completers>
-        </command>
-        <command>
-            <action class="org.onosproject.cli.net.MeterAddCommand"/>
-            <completers>
-                <ref component-id="deviceIdCompleter"/>
-            </completers>
-        </command>
-        <command>
-            <action class="org.onosproject.cli.net.MeterRemoveCommand"/>
-            <completers>
-                <ref component-id="deviceIdCompleter"/>
-            </completers>
-        </command>
-        <command>
-            <action class="org.onosproject.cli.net.MetersListCommand"/>
-            <completers>
-                <ref component-id="deviceIdCompleter"/>
-            </completers>
-        </command>
-        <command>
-            <action class="org.onosproject.cli.net.DeviceRoleCommand"/>
-            <completers>
-                <ref component-id="deviceIdCompleter"/>
-                <ref component-id="nodeIdCompleter"/>
-                <ref component-id="roleCompleter"/>
-            </completers>
-        </command>
-
-        <command>
-            <action class="org.onosproject.cli.net.AnnotateDeviceCommand"/>
-            <completers>
-                <ref component-id="deviceIdCompleter"/>
-                <ref component-id="annotationKeysCompleter"/>
-                <null/>
-            </completers>
-        </command>
-
-        <command>
-            <action class="org.onosproject.cli.net.AnnotatePortCommand"/>
-            <completers>
-                <ref component-id="connectPointCompleter"/>
-                <ref component-id="annotationKeysCompleter"/>
-                <null/>
-            </completers>
-        </command>
-
-        <command>
-            <action class="org.onosproject.cli.net.AnnotateLinkCommand"/>
-            <completers>
-                <ref component-id="connectPointCompleter"/>
-                <ref component-id="peerConnectPointCompleter"/>
-                <ref component-id="annotationKeysCompleter"/>
-                <null/>
-            </completers>
-        </command>
-
-        <command>
-            <action class="org.onosproject.cli.net.LinksListCommand"/>
-            <completers>
-                <ref component-id="deviceIdCompleter"/>
-                <null/> <!-- no more arguments -->
-            </completers>
-        </command>
-
-        <command>
-            <action class="org.onosproject.cli.net.EdgePortsListCommand"/>
-            <completers>
-                <ref component-id="deviceIdCompleter"/>
-                <null/>
-            </completers>
-        </command>
-
-        <command>
-            <action class="org.onosproject.cli.net.TopologyCommand"/>
-        </command>
-        <command>
-            <action class="org.onosproject.cli.net.PathListCommand"/>
-            <completers>
-                <ref component-id="deviceIdCompleter"/>
-                <ref component-id="deviceIdCompleter"/>
-                <null/> <!-- no more arguments -->
-            </completers>
-        </command>
-
-        <command>
-            <action class="org.onosproject.cli.net.IntentsListCommand"/>
-        </command>
-        <command>
-            <action class="org.onosproject.cli.net.IntentsDiagnosisCommand"/>
-            <completers>
-                <ref component-id="intentKeyCompleter"/>
-            </completers>
-        </command>
-        <command>
-            <action class="org.onosproject.cli.net.IntentListCompilers"/>
-        </command>
-        <command>
-            <action class="org.onosproject.cli.net.IntentListInstallers"/>
-        </command>
-        <command>
-            <action class="org.onosproject.cli.net.IntentRemoveCommand"/>
-            <completers>
-                <ref component-id="appIdWithIntentNameCompleter"/>
-                <ref component-id="intentKeyCompleter"/>
-            </completers>
-        </command>
-        <command>
-            <action class="org.onosproject.cli.net.IntentPurgeCommand"/>
-        </command>
-        <command>
-            <action class="org.onosproject.cli.net.AddHostToHostIntentCommand"/>
-            <completers>
-                <ref component-id="hostIdCompleter"/>
-                <ref component-id="hostIdCompleter"/>
-            </completers>
-            <optional-completers>
-                <entry key="-t" value-ref="ethTypeCompleter"/>
-                <entry key="--ipProto" value-ref="ipProtocolCompleter"/>
-                <entry key="--icmp6Type" value-ref="Icmp6TypeCompleter"/>
-                <entry key="--icmp6Code" value-ref="Icmp6CodeCompleter"/>
-                <entry key="--extHdr" value-ref="ExtHeaderCompleter"/>
-                <entry key="-a" value-ref="allAppNameCompleter"/>
-                <entry key="-e" value-ref="encapTypeCompleter"/>
-            </optional-completers>
-        </command>
-        <command>
-            <action class="org.onosproject.cli.net.AddPointToPointIntentCommand"/>
-            <completers>
-                <ref component-id="connectPointCompleter"/>
-                <ref component-id="connectPointCompleter"/>
-                <null/> <!-- no more argument -->
-            </completers>
-            <optional-completers>
-                <entry key="-t" value-ref="ethTypeCompleter"/>
-                <entry key="--ipProto" value-ref="ipProtocolCompleter"/>
-                <entry key="--icmp6Type" value-ref="Icmp6TypeCompleter"/>
-                <entry key="--icmp6Code" value-ref="Icmp6CodeCompleter"/>
-                <entry key="--extHdr" value-ref="ExtHeaderCompleter"/>
-                <entry key="-a" value-ref="allAppNameCompleter"/>
-                <entry key="-e" value-ref="encapTypeCompleter"/>
-                <entry key="-r" value-ref="nullCompleter"/> <!-- option has no argument -->
-            </optional-completers>
-        </command>
-        <command>
-            <action class="org.onosproject.cli.net.GetStatisticsCommand"/>
-            <completers>
-                <ref component-id="connectPointCompleter"/>
-            </completers>
-        </command>
-        <command>
-            <action class="org.onosproject.cli.net.GetFlowStatisticsCommand"/>
-            <completers>
-                <ref component-id="deviceIdCompleter"/>
-            </completers>
-        </command>
-        <command>
-            <action class="org.onosproject.cli.net.AddMultiPointToSinglePointIntentCommand"/>
-            <completers>
-                <ref component-id="connectPointCompleter"/>
-            </completers>
-            <optional-completers>
-                <entry key="-t" value-ref="ethTypeCompleter"/>
-                <entry key="--ipProto" value-ref="ipProtocolCompleter"/>
-                <entry key="--icmp6Type" value-ref="Icmp6TypeCompleter"/>
-                <entry key="--icmp6Code" value-ref="Icmp6CodeCompleter"/>
-                <entry key="--extHdr" value-ref="ExtHeaderCompleter"/>
-                <entry key="-a" value-ref="allAppNameCompleter"/>
-                <entry key="-e" value-ref="encapTypeCompleter"/>
-            </optional-completers>
-        </command>
-        <command>
-            <action class="org.onosproject.cli.net.AddSinglePointToMultiPointIntentCommand"/>
-            <completers>
-                <ref component-id="connectPointCompleter"/>
-            </completers>
-            <optional-completers>
-                <entry key="-t" value-ref="ethTypeCompleter"/>
-                <entry key="--ipProto" value-ref="ipProtocolCompleter"/>
-                <entry key="--icmp6Type" value-ref="Icmp6TypeCompleter"/>
-                <entry key="--icmp6Code" value-ref="Icmp6CodeCompleter"/>
-                <entry key="--extHdr" value-ref="ExtHeaderCompleter"/>
-                <entry key="-a" value-ref="allAppNameCompleter"/>
-                <entry key="-e" value-ref="encapTypeCompleter"/>
-            </optional-completers>
-        </command>
-        <command>
-            <action class="org.onosproject.cli.net.IntentPushTestCommand"/>
-            <completers>
-                <ref component-id="connectPointCompleter"/>
-                <ref component-id="connectPointCompleter"/>
-                <ref component-id="nullCompleter"/>
-            </completers>
-        </command>
-        <command>
-            <action class="org.onosproject.cli.net.IntentCycleCommand"/>
-            <completers>
-                <ref component-id="connectPointCompleter"/>
-                <ref component-id="connectPointCompleter"/>
-                <ref component-id="nullCompleter"/>
-            </completers>
-        </command>
-        <command>
-            <action class="org.onosproject.cli.net.RandomIntentCommand"/>
-            <completers>
-                <ref component-id="nullCompleter"/>
-            </completers>
-        </command>
-        <command>
-            <action class="org.onosproject.cli.net.ResourcesCommand"/>
-            <completers>
-                <ref component-id="deviceIdCompleter"/>
-                <ref component-id="portNumberCompleter"/>
-            </completers>
-        </command>
-        <command>
-            <action class="org.onosproject.cli.net.AllocationsCommand"/>
-            <completers>
-                <ref component-id="deviceIdCompleter"/>
-                <ref component-id="portNumberCompleter"/>
-                <null/>
-            </completers>
-        </command>
-        <command>
-            <action class="org.onosproject.cli.net.TestAllocateResource"/>
-            <completers>
-                <ref component-id="deviceIdCompleter"/>
-                <ref component-id="portNumberCompleter"/>
-                <null/>
-            </completers>
-        </command>
-
-        <command>
-            <action class="org.onosproject.cli.net.TestProtectionEndpointIntentCommand"/>
-            <completers>
-                <ref component-id="deviceIdCompleter"/>
-                <ref component-id="deviceIdCompleter"/>
-                <null/>
-            </completers>
-        </command>
-
-        <command>
-            <action class="org.onosproject.cli.net.AddProtectedTransportIntentCommand"/>
-            <completers>
-                <ref component-id="deviceIdCompleter"/>
-                <ref component-id="deviceIdCompleter"/>
-                <null/>
-            </completers>
-        </command>
-
-        <command>
-            <action class="org.onosproject.cli.net.ClustersListCommand"/>
-        </command>
-        <command>
-            <action class="org.onosproject.cli.net.PartitionsListCommand"/>
-        </command>
-        <command>
-            <action class="org.onosproject.cli.net.MapsListCommand"/>
-        </command>
-        <command>
-            <action class="org.onosproject.cli.net.CountersListCommand"/>
-        </command>
-        <command>
-            <action class="org.onosproject.cli.net.QueuesListCommand"/>
-        </command>
-        <command>
-            <action class="org.onosproject.cli.net.TransactionsCommand"/>
-        </command>
-        <command>
-            <action class="org.onosproject.cli.net.CounterCommand"/>
-        </command>
-        <command>
-            <action class="org.onosproject.cli.net.ClusterDevicesCommand"/>
-            <completers>
-                <ref component-id="clusterIdCompleter"/>
-            </completers>
-        </command>
-        <command>
-            <action class="org.onosproject.cli.net.ClusterLinksCommand"/>
-            <completers>
-                <ref component-id="clusterIdCompleter"/>
-            </completers>
-        </command>
-
-        <command>
-            <action class="org.onosproject.cli.net.HostsListCommand"/>
-        </command>
-        <command>
-            <action class="org.onosproject.cli.net.HostRemoveCommand"/>
-            <completers>
-                <ref component-id="hostIdCompleter"/>
-            </completers>
-        </command>
-        <command>
-            <action class="org.onosproject.cli.net.InterfacesListCommand"/>
-        </command>
-        <command>
-            <action class="org.onosproject.cli.net.InterfaceAddCommand"/>
-            <completers>
-                <ref component-id="connectPointCompleter" />
-                <ref component-id="placeholderCompleter" />
-            </completers>
-        </command>
-        <command>
-            <action class="org.onosproject.cli.net.InterfaceRemoveCommand"/>
-            <completers>
-                <ref component-id="connectPointCompleter"/>
-                <ref component-id="interfaceNameCompleter"/>
-                <null/>
-            </completers>
-        </command>
-        <command>
-            <action class="org.onosproject.cli.net.GroupsListCommand"/>
-            <completers>
-                <ref component-id="groupStatusCompleter"/>
-                <ref component-id="deviceIdCompleter"/>
-            </completers>
-            <optional-completers>
-                <entry key="-t" value-ref="groupTypeCompleter"/>
-            </optional-completers>
-        </command>
-
-        <command>
-            <action class="org.onosproject.cli.net.DevicePortStatsCommand"/>
-            <completers>
-                <ref component-id="deviceIdCompleter"/>
-                <ref component-id="portNumberCompleter"/>
-                <null/>
-            </completers>
-        </command>
-
-        <command>
-            <action class="org.onosproject.cli.net.PortQueryVlansCommand"/>
-            <completers>
-                <ref component-id="connectPointCompleter"/>
-            </completers>
-        </command>
-
-        <command>
-            <action class="org.onosproject.cli.net.TableStatisticsCommand"/>
-        </command>
-
-        <command>
-            <action class="org.onosproject.cli.net.FlowsListCommand"/>
-            <completers>
-                <ref component-id="flowRuleStatusCompleter"/>
-                <ref component-id="deviceIdCompleter"/>
-                <ref component-id="placeholderCompleter"/>
-                <null/>
-            </completers>
-        </command>
-
-        <command>
-            <action class="org.onosproject.cli.net.PacketRequestsListCommand"/>
-        </command>
-        <command>
-            <action class="org.onosproject.cli.net.PacketProcessorsListCommand"/>
-        </command>
-        <command>
-            <action class="org.onosproject.cli.net.NeighbourHandlersListCommand"/>
-        </command>
-
-        <command>
-            <action class="org.onosproject.cli.net.AddTestFlowsCommand"/>
-        </command>
-        <command>
-            <action class="org.onosproject.cli.net.LeaderCommand"/>
-        </command>
-
-        <command>
-            <action class="org.onosproject.cli.net.WipeOutCommand"/>
-        </command>
-
-        <command>
-            <action class="org.onosproject.cli.net.GlobalLabelCommand"/>
-        </command>
-        <command>
-            <action class="org.onosproject.cli.net.LabelResourceCommand"/>
-        </command>
-        <command>
-            <action class="org.onosproject.cli.net.GlobalLabelPoolCreateCommand"/>
-        </command>
-        <command>
-            <action class="org.onosproject.cli.net.LabelPoolCreateCommand"/>
-        </command>
-        <command>
-            <action class="org.onosproject.cli.net.GlobalLabelPoolDestroyCommand"/>
-        </command>
-        <command>
-            <action class="org.onosproject.cli.net.LabelPoolDestroyCommand"/>
-        </command>
-        <command>
-            <action class="org.onosproject.cli.net.GlobalLabelReleaseCommand"/>
-        </command>
-        <command>
-            <action class="org.onosproject.cli.net.LabelReleaseCommand"/>
-        </command>
-        <command>
-            <action class="org.onosproject.cli.net.GlobalLabelApplyCommand"/>
-        </command>
-        <command>
-            <action class="org.onosproject.cli.net.LabelApplyCommand"/>
-        </command>
-        <!-- tunnel commands -->
-        <command>
-            <action class="org.onosproject.cli.net.TunnelBorrowCommand"/>
-        </command>
-        <command>
-            <action class="org.onosproject.cli.net.TunnelReturnCommand"/>
-        </command>
-        <command>
-            <action class="org.onosproject.cli.net.TunnelQueryCommand"/>
-        </command>
-        <command>
-            <action class="org.onosproject.cli.net.TunnelQuerySubscriptionCommand"/>
-        </command>
-        <command>
-            <action class="org.onosproject.cli.net.TunnelCreateCommand"/>
-        </command>
-        <command>
-            <action class="org.onosproject.cli.net.TunnelRemoveCommand"/>
-        </command>
-        <command>
-            <action class="org.onosproject.cli.net.TunnelUpdateCommand"/>
-        </command>
-        <!-- device key commands -->
-        <command>
-            <action class="org.onosproject.cli.net.DeviceKeyListCommand"/>
-        </command>
-        <command>
-            <action class="org.onosproject.cli.net.DeviceKeyAddCommand"/>
-        </command>
-        <command>
-            <action class="org.onosproject.cli.net.DeviceKeyRemoveCommand"/>
-        </command>
-
-        <!--region commands -->
-        <command>
-            <action class="org.onosproject.cli.net.RegionListCommand"/>
-            <completers>
-                <ref component-id="regionIdCompleter"/>
-            </completers>
-        </command>
-        <command>
-            <action class="org.onosproject.cli.net.RegionAddCommand"/>
-            <completers>
-                <null/>
-                <null/>
-                <ref component-id="regionTypeCompleter"/>
-                <ref component-id="nodeIdCompleter"/>
-            </completers>
-        </command>
-        <command>
-            <action class="org.onosproject.cli.net.RegionUpdateCommand"/>
-            <completers>
-                <ref component-id="regionIdCompleter"/>
-                <null/>
-                <ref component-id="regionTypeCompleter"/>
-                <ref component-id="nodeIdCompleter"/>
-            </completers>
-        </command>
-        <command>
-            <action class="org.onosproject.cli.net.RegionRemoveCommand"/>
-            <completers>
-                <ref component-id="regionIdCompleter"/>
-            </completers>
-        </command>
-        <command>
-            <action class="org.onosproject.cli.net.RegionAddDevicesCommand"/>
-            <completers>
-                <ref component-id="regionIdCompleter"/>
-                <ref component-id="deviceIdCompleter"/>
-            </completers>
-        </command>
-        <command>
-            <action class="org.onosproject.cli.net.RegionRemoveDevicesCommand"/>
-            <completers>
-                <ref component-id="regionIdCompleter"/>
-                <ref component-id="deviceIdCompleter"/>
-            </completers>
-        </command>
-        <command>
-            <action class="org.onosproject.cli.net.RegionAddPeerLocCommand"/>
-            <completers>
-                <ref component-id="regionIdCompleter"/>
-            </completers>
-        </command>
-
-        <!-- UI Layout commands -->
-        <command>
-            <action class="org.onosproject.cli.net.LayoutListCommand"/>
-        </command>
-        <command>
-            <action class="org.onosproject.cli.net.LayoutAddCommand"/>
-        </command>
-        <!--TODO: add this + completers
-        <command>
-            <action class="org.onosproject.cli.net.LayoutRemoveCommand"/>
-        </command>
-        -->
-
-        <command>
-            <action class="org.onosproject.cli.net.PipeconfCommand"/>
-        </command>
-
-        <!--virtual network commands -->
-        <command>
-            <action class="org.onosproject.cli.net.vnet.TenantListCommand"/>
-        </command>
-        <command>
-            <action class="org.onosproject.cli.net.vnet.TenantAddCommand"/>
-        </command>
-        <command>
-            <action class="org.onosproject.cli.net.vnet.TenantRemoveCommand"/>
-            <completers>
-                <ref component-id="tenantCompleter"/>
-                <null/>
-            </completers>
-        </command>
-        <command>
-            <action class="org.onosproject.cli.net.vnet.VirtualNetworkListCommand"/>
-        </command>
-        <command>
-            <action class="org.onosproject.cli.net.vnet.VirtualNetworkCreateCommand"/>
-            <completers>
-                <ref component-id="tenantCompleter"/>
-                <ref component-id="nullCompleter"/>
-            </completers>
-        </command>
-        <command>
-            <action class="org.onosproject.cli.net.vnet.VirtualNetworkRemoveCommand"/>
-            <completers>
-                <ref component-id="virtualNetworkCompleter"/>
-                <null/>
-            </completers>
-        </command>
-        <command>
-            <action class="org.onosproject.cli.net.vnet.VirtualDeviceListCommand"/>
-            <completers>
-                <ref component-id="virtualNetworkCompleter"/>
-                <null/>
-            </completers>
-        </command>
-        <command>
-            <action class="org.onosproject.cli.net.vnet.VirtualDeviceCreateCommand"/>
-            <completers>
-                <ref component-id="virtualNetworkCompleter"/>
-                <null/>
-            </completers>
-        </command>
-        <command>
-            <action class="org.onosproject.cli.net.vnet.VirtualDeviceRemoveCommand"/>
-            <completers>
-                <ref component-id="virtualNetworkCompleter"/>
-                <ref component-id="virtualDeviceCompleter"/>
-                <ref component-id="nullCompleter"/>
-            </completers>
-        </command>
-        <command>
-            <action class="org.onosproject.cli.net.vnet.VirtualLinkListCommand"/>
-            <completers>
-                <ref component-id="virtualNetworkCompleter"/>
-                <null/>
-            </completers>
-        </command>
-        <command>
-            <action class="org.onosproject.cli.net.vnet.VirtualLinkCreateCommand"/>
-            <completers>
-                <ref component-id="virtualNetworkCompleter"/>
-                <ref component-id="virtualDeviceCompleter"/>
-                <ref component-id="virtualPortCompleter"/>
-                <ref component-id="virtualDeviceCompleter"/>
-                <ref component-id="virtualPortCompleter"/>
-                <null/>
-            </completers>
-        </command>
-        <command>
-            <action class="org.onosproject.cli.net.vnet.VirtualLinkRemoveCommand"/>
-            <completers>
-                <ref component-id="virtualNetworkCompleter"/>
-                <ref component-id="virtualDeviceCompleter"/>
-                <ref component-id="virtualPortCompleter"/>
-                <ref component-id="virtualDeviceCompleter"/>
-                <ref component-id="virtualPortCompleter"/>
-                <null/>
-            </completers>
-        </command>
-        <command>
-            <action class="org.onosproject.cli.net.vnet.VirtualPortListCommand"/>
-            <completers>
-                <ref component-id="virtualNetworkCompleter"/>
-                <ref component-id="virtualDeviceCompleter"/>
-                <null/>
-            </completers>
-        </command>
-        <command>
-            <action class="org.onosproject.cli.net.vnet.VirtualPortCreateCommand"/>
-            <completers>
-                <ref component-id="virtualNetworkCompleter"/>
-                <ref component-id="virtualDeviceCompleter"/>
-                <ref component-id="nullCompleter"/>
-                <ref component-id="deviceIdCompleter"/>
-                <ref component-id="portNumberCompleter"/>
-                <null/>
-            </completers>
-        </command>
-        <command>
-            <action class="org.onosproject.cli.net.vnet.VirtualPortBindCommand"/>
-            <completers>
-                <ref component-id="virtualNetworkCompleter"/>
-                <ref component-id="virtualDeviceCompleter"/>
-                <ref component-id="virtualPortCompleter"/>
-                <ref component-id="deviceIdCompleter"/>
-                <ref component-id="portNumberCompleter"/>
-                <null/>
-            </completers>
-        </command>
-        <command>
-            <action class="org.onosproject.cli.net.vnet.VirtualPortStateCommand"/>
-            <completers>
-                <ref component-id="virtualNetworkCompleter"/>
-                <ref component-id="virtualDeviceCompleter"/>
-                <ref component-id="virtualPortCompleter"/>
-                <null/>
-            </completers>
-        </command>
-        <command>
-            <action class="org.onosproject.cli.net.vnet.VirtualPortRemoveCommand"/>
-            <completers>
-                <ref component-id="virtualNetworkCompleter"/>
-                <ref component-id="virtualDeviceCompleter"/>
-                <ref component-id="virtualPortCompleter"/>
-                <null/>
-            </completers>
-        </command>
-        <command>
-            <action class="org.onosproject.cli.net.vnet.VirtualHostListCommand"/>
-            <completers>
-                <ref component-id="virtualNetworkCompleter"/>
-                <null/>
-            </completers>
-        </command>
-        <command>
-            <action class="org.onosproject.cli.net.vnet.VirtualHostCreateCommand"/>
-            <completers>
-                <ref component-id="virtualNetworkCompleter"/>
-                <null/>
-            </completers>
-        </command>
-        <command>
-            <action class="org.onosproject.cli.net.vnet.VirtualHostRemoveCommand"/>
-            <completers>
-                <ref component-id="virtualNetworkCompleter"/>
-                <ref component-id="virtualHostCompleter"/>
-                <null/>
-            </completers>
-        </command>
-        <command>
-            <action class="org.onosproject.cli.net.vnet.VirtualNetworkIntentCreateCommand"/>
-            <completers>
-                <ref component-id="virtualNetworkCompleter"/>
-                <null/>
-            </completers>
-        </command>
-        <command>
-            <action class="org.onosproject.cli.net.vnet.VirtualNetworkIntentRemoveCommand"/>
-            <completers>
-                <ref component-id="virtualNetworkCompleter"/>
-                <null/>
-            </completers>
-        </command>
-        <command>
-            <action class="org.onosproject.cli.net.vnet.VirtualFlowsListCommand"/>
-            <completers>
-                <ref component-id="virtualNetworkCompleter"/>
-                <ref component-id="flowRuleStatusCompleter"/>
-                <ref component-id="virtualDeviceCompleter"/>
-                <ref component-id="placeholderCompleter"/>
-                <null/>
-            </completers>
-        </command>
-        <command>
-            <action class="org.onosproject.cli.net.vnet.VirtualNetworkPacketRequestCommand"/>
-            <optional-completers>
-                <entry key="-t" value-ref="ethTypeCompleter"/>
-                <entry key="--ipProto" value-ref="ipProtocolCompleter"/>
-                <entry key="--icmp6Type" value-ref="Icmp6TypeCompleter"/>
-                <entry key="--icmp6Code" value-ref="Icmp6CodeCompleter"/>
-                <entry key="--extHdr" value-ref="ExtHeaderCompleter"/>
-            </optional-completers>
-        </command>
-        <command>
-            <action class="org.onosproject.cli.net.vnet.VirtualNetworkBalanceMastersCommand"/>
-            <completers>
-                <ref component-id="virtualNetworkCompleter"/>
-                <null/>
-            </completers>
-        </command>
-        <command>
-            <action class="org.onosproject.cli.net.DpisListCommand"/>
-        </command>
-
-        <command>
-            <action class="org.onosproject.cli.net.IntentDetailsCommand"/>
-            <optional-completers>
-                <entry key="--id" value-ref="intentIdCompleter"/>
-            </optional-completers>
-        </command>
-
-        <command>
-            <action class="org.onosproject.cli.net.ConfigureLinkCommand"/>
-            <completers>
-                <ref component-id="connectPointCompleter"/>
-                <ref component-id="peerConnectPointCompleter"/>
-                <null/>
-            </completers>
-            <optional-completers>
-                <entry key="--type" value-ref="linkTypeCompleter"/>
-            </optional-completers>
-        </command>
-
-        <command>
-            <action class="org.onosproject.cli.MembershipsListCommand"/>
-        </command>
-
-        <!--Domain command-->
-        <command>
-            <action class="org.onosproject.cli.net.GetDomainsCommand"/>
-        </command>
-
-    </command-bundle>
-
-    <bean id="reviewAppNameCompleter" class="org.onosproject.cli.security.ReviewApplicationNameCompleter"/>
-    <bean id="appCommandCompleter" class="org.onosproject.cli.app.ApplicationCommandCompleter"/>
-    <bean id="appNameCompleter" class="org.onosproject.cli.app.ApplicationNameCompleter"/>
-    <bean id="allAppNameCompleter" class="org.onosproject.cli.app.AllApplicationNamesCompleter"/>
-    <bean id="appIdWithIntentNameCompleter" class="org.onosproject.cli.app.ApplicationIdWithIntentNameCompleter"/>
-    <bean id="cfgCommandCompleter" class="org.onosproject.cli.cfg.ComponentConfigCommandCompleter"/>
-    <bean id="componentNameCompleter" class="org.onosproject.cli.cfg.ComponentNameCompleter"/>
-    <bean id="componentPropertyNameCompleter" class="org.onosproject.cli.cfg.ComponentPropertyNameCompleter"/>
-    <bean id="nodeIdCompleter" class="org.onosproject.cli.NodeIdCompleter"/>
-    <bean id="deviceIdCompleter" class="org.onosproject.cli.net.DeviceIdCompleter"/>
-    <bean id="portNumberCompleter" class="org.onosproject.cli.net.PortNumberCompleter"/>
-    <bean id="numericPortNumberCompleter" class="org.onosproject.cli.net.completer.NumericPortNumberCompleter" />
-    <bean id="portStateCompleter" class="org.onosproject.cli.net.PortStateCompleter"/>
-    <bean id="clusterIdCompleter" class="org.onosproject.cli.net.ClusterIdCompleter"/>
-    <bean id="roleCompleter" class="org.onosproject.cli.net.RoleCompleter"/>
-    <bean id="hostIdCompleter" class="org.onosproject.cli.net.HostIdCompleter"/>
-    <bean id="intentKeyCompleter" class="org.onosproject.cli.net.IntentKeyCompleter"/>
-    <bean id="intentIdCompleter" class="org.onosproject.cli.net.completer.IntentIdCompleter"/>
-    <bean id="flowRuleStatusCompleter" class="org.onosproject.cli.net.FlowRuleStatusCompleter"/>
-    <bean id="groupStatusCompleter" class="org.onosproject.cli.net.GroupStatusCompleter" />
-    <bean id="groupTypeCompleter" class="org.onosproject.cli.net.GroupTypeCompleter" />
-    <bean id="connectPointCompleter" class="org.onosproject.cli.net.ConnectPointCompleter"/>
-    <bean id="nullCompleter" class="org.apache.karaf.shell.console.completer.NullCompleter"/>
-    <bean id="ethTypeCompleter" class="org.onosproject.cli.net.EthTypeCompleter"/>
-    <bean id="ipProtocolCompleter" class="org.onosproject.cli.net.IpProtocolCompleter"/>
-    <bean id="driverNameCompleter" class="org.onosproject.cli.net.DriverNameCompleter"/>
-    <bean id="Icmp6TypeCompleter" class="org.onosproject.cli.net.Icmp6TypeCompleter"/>
-    <bean id="Icmp6CodeCompleter" class="org.onosproject.cli.net.Icmp6CodeCompleter"/>
-    <bean id="ExtHeaderCompleter" class="org.onosproject.cli.net.ExtHeaderCompleter"/>
-
-    <bean id="startStopCompleter" class="org.onosproject.cli.StartStopCompleter"/>
-    <bean id="metricNameCompleter" class="org.onosproject.cli.MetricNameCompleter"/>
-    <bean id="upDownCompleter" class="org.onosproject.cli.UpDownCompleter"/>
-    <bean id="encapTypeCompleter" class="org.onosproject.cli.net.EncapTypeCompleter"/>
-
-    <bean id="placeholderCompleter" class="org.onosproject.cli.PlaceholderCompleter"/>
-
-    <bean id="subjectClassKeyCompleter" class="org.onosproject.cli.cfg.SubjectClassKeyCompleter"/>
-    <bean id="subjectKeyCompleter" class="org.onosproject.cli.cfg.SubjectKeyCompleter"/>
-    <bean id="configKeyCompleter" class="org.onosproject.cli.cfg.ConfigKeyCompleter"/>
-
-    <bean id="regionIdCompleter" class="org.onosproject.cli.net.RegionIdCompleter"/>
-    <bean id="regionTypeCompleter" class="org.onosproject.cli.net.RegionTypeCompleter"/>
-
-    <bean id="annotationKeysCompleter" class="org.onosproject.cli.net.completer.AnnotationKeysCompleter"/>
-
-    <bean id="peerConnectPointCompleter" class="org.onosproject.cli.net.completer.PeerConnectPointCompleter"/>
-
-    <bean id="interfaceNameCompleter" class="org.onosproject.cli.net.completer.InterfaceNameCompleter"/>
-
-    <bean id="linkTypeCompleter" class="org.onosproject.cli.net.completer.LinkTypeCompleter"/>
-
-    <bean id="tenantCompleter" class="org.onosproject.cli.net.vnet.TenantCompleter"/>
-    <bean id="virtualNetworkCompleter" class="org.onosproject.cli.net.vnet.VirtualNetworkCompleter"/>
-    <bean id="virtualDeviceCompleter" class="org.onosproject.cli.net.vnet.VirtualDeviceCompleter"/>
-    <bean id="virtualPortCompleter" class="org.onosproject.cli.net.vnet.VirtualPortCompleter"/>
-    <bean id="virtualHostCompleter" class="org.onosproject.cli.net.vnet.VirtualHostCompleter"/>
-
-    <bean id="domainIdCompleter" class="org.onosproject.cli.net.DomainIdCompleter" />
-
-    <bean id="mcastGroupCompleter" class="org.onosproject.cli.net.McastGroupCompleter"/>
-
-</blueprint>
diff --git a/core/api/BUCK b/core/api/BUCK
deleted file mode 100644
index d4cdf8a..0000000
--- a/core/api/BUCK
+++ /dev/null
@@ -1,19 +0,0 @@
-COMPILE_DEPS = [
-    '//lib:COMPILE',
-    '//lib:NETTY',
-    '//lib:JACKSON',
-    '//lib:METRICS',
-    '//lib:KRYO',
-    '//utils/misc:onlab-misc',
-    '//utils/osgi:onlab-osgi',
-    '//utils/rest:onlab-rest',
-    '//lib:joda-time',
-    '//lib:io_netty_netty',
-]
-
-osgi_jar_with_tests (
-    name = 'onos-api',
-    deps = COMPILE_DEPS,
-    javadoc_files = glob(['src/main/javadoc/**/*']),
-    javadoc_files_root = 'src/main/javadoc',
-)
diff --git a/core/api/src/main/java/org/onosproject/cfg/package-info.java b/core/api/src/main/java/org/onosproject/cfg/package-info.java
index 7a8fae5..0f9bc00 100644
--- a/core/api/src/main/java/org/onosproject/cfg/package-info.java
+++ b/core/api/src/main/java/org/onosproject/cfg/package-info.java
@@ -18,7 +18,7 @@
  * Set of abstractions for centrally managing component configurations.
  * Configuration properties are registered for a component resource which is
  * auto-generated during the build process based on information specified in
- * the @Property annotations. This provides an overall inventory of all
- * supported component configurations.
+ * the @Component property annotations. This provides an overall inventory of
+ * all supported component configurations.
  */
 package org.onosproject.cfg;
\ No newline at end of file
diff --git a/core/api/src/main/java/org/onosproject/event/AbstractListenerManager.java b/core/api/src/main/java/org/onosproject/event/AbstractListenerManager.java
index d0db318..3ff63a5 100644
--- a/core/api/src/main/java/org/onosproject/event/AbstractListenerManager.java
+++ b/core/api/src/main/java/org/onosproject/event/AbstractListenerManager.java
@@ -15,20 +15,18 @@
  */
 package org.onosproject.event;
 
-import org.apache.felix.scr.annotations.Component;
-import org.apache.felix.scr.annotations.Reference;
-import org.apache.felix.scr.annotations.ReferenceCardinality;
+import org.osgi.service.component.annotations.Reference;
+import org.osgi.service.component.annotations.ReferenceCardinality;
 
 /**
  * Basis for components which need to export listener mechanism.
  */
-@Component
 public abstract class AbstractListenerManager<E extends Event, L extends EventListener<E>>
     implements ListenerService<E, L> {
 
     protected final ListenerRegistry<E, L> listenerRegistry = new ListenerRegistry<>();
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected EventDeliveryService eventDispatcher;
 
     @Override
diff --git a/core/api/src/main/java/org/onosproject/net/driver/AbstractDriverLoader.java b/core/api/src/main/java/org/onosproject/net/driver/AbstractDriverLoader.java
index fc2b6f2..c1ae98d 100644
--- a/core/api/src/main/java/org/onosproject/net/driver/AbstractDriverLoader.java
+++ b/core/api/src/main/java/org/onosproject/net/driver/AbstractDriverLoader.java
@@ -15,21 +15,19 @@
  */
 package org.onosproject.net.driver;
 
-import org.apache.felix.scr.annotations.Component;
-import org.apache.felix.scr.annotations.Reference;
-import org.apache.felix.scr.annotations.ReferenceCardinality;
+import org.osgi.service.component.annotations.Reference;
+import org.osgi.service.component.annotations.ReferenceCardinality;
 
 /**
  * Abstract bootstrapper for loading and registering driver definitions that
  * are dependent on the default driver definitions.
  */
-@Component
 public abstract class AbstractDriverLoader extends AbstractIndependentDriverLoader {
 
     // FIXME: This requirement should be removed and the driver extensions that
     // depend on the default drivers being loaded should be modified to instead
     // express the dependency using the application dependency mechanism.
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected DefaultDriverProviderService defaultDriverProviderService;
 
     /**
diff --git a/core/api/src/main/java/org/onosproject/net/driver/AbstractIndependentDriverLoader.java b/core/api/src/main/java/org/onosproject/net/driver/AbstractIndependentDriverLoader.java
index cd587e9..5816ef7 100644
--- a/core/api/src/main/java/org/onosproject/net/driver/AbstractIndependentDriverLoader.java
+++ b/core/api/src/main/java/org/onosproject/net/driver/AbstractIndependentDriverLoader.java
@@ -15,11 +15,10 @@
  */
 package org.onosproject.net.driver;
 
-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.Deactivate;
+import org.osgi.service.component.annotations.Reference;
+import org.osgi.service.component.annotations.ReferenceCardinality;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -27,7 +26,6 @@
  * Abstract bootstrapper for loading and registering driver definitions that
  * are independent from the default driver definitions.
  */
-@Component
 public abstract class AbstractIndependentDriverLoader {
 
     private final Logger log = LoggerFactory.getLogger(getClass());
@@ -35,7 +33,7 @@
     private DriverProvider provider;
     private final String path;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected DriverAdminService driverAdminService;
 
     /**
diff --git a/core/api/src/main/java/org/onosproject/net/provider/AbstractListenerProviderRegistry.java b/core/api/src/main/java/org/onosproject/net/provider/AbstractListenerProviderRegistry.java
index f65f3bc..b42e077 100644
--- a/core/api/src/main/java/org/onosproject/net/provider/AbstractListenerProviderRegistry.java
+++ b/core/api/src/main/java/org/onosproject/net/provider/AbstractListenerProviderRegistry.java
@@ -15,19 +15,17 @@
  */
 package org.onosproject.net.provider;
 
-import org.apache.felix.scr.annotations.Component;
-import org.apache.felix.scr.annotations.Reference;
-import org.apache.felix.scr.annotations.ReferenceCardinality;
 import org.onosproject.event.Event;
 import org.onosproject.event.EventDeliveryService;
 import org.onosproject.event.EventListener;
 import org.onosproject.event.ListenerRegistry;
 import org.onosproject.event.ListenerService;
+import org.osgi.service.component.annotations.Reference;
+import org.osgi.service.component.annotations.ReferenceCardinality;
 
 /**
  * Basis for components which need to export listener mechanism.
  */
-@Component
 public abstract class AbstractListenerProviderRegistry<E extends Event, L extends EventListener<E>,
                                                        P extends Provider, S extends ProviderService<P>>
         extends AbstractProviderRegistry<P, S> implements ListenerService<E, L> {
@@ -36,7 +34,7 @@
 
     protected final ListenerRegistry<E, L> listenerRegistry = new ListenerRegistry<>();
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected EventDeliveryService eventDispatcher;
 
     @Override
diff --git a/core/api/src/main/java/org/onosproject/rest/AbstractApiDocRegistrator.java b/core/api/src/main/java/org/onosproject/rest/AbstractApiDocRegistrator.java
index de8058a..82478ee 100644
--- a/core/api/src/main/java/org/onosproject/rest/AbstractApiDocRegistrator.java
+++ b/core/api/src/main/java/org/onosproject/rest/AbstractApiDocRegistrator.java
@@ -15,21 +15,19 @@
  */
 package org.onosproject.rest;
 
-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.Deactivate;
+import org.osgi.service.component.annotations.Reference;
+import org.osgi.service.component.annotations.ReferenceCardinality;
 
 /**
  * Self-registering REST API provider.
  */
-@Component(immediate = true)
 public abstract class AbstractApiDocRegistrator {
 
     protected final ApiDocProvider provider;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected ApiDocService service;
 
     /**
diff --git a/core/api/src/main/java/org/onosproject/ui/lion/LionUtils.java b/core/api/src/main/java/org/onosproject/ui/lion/LionUtils.java
index 210a5af..f80d8c4 100644
--- a/core/api/src/main/java/org/onosproject/ui/lion/LionUtils.java
+++ b/core/api/src/main/java/org/onosproject/ui/lion/LionUtils.java
@@ -25,6 +25,7 @@
 import java.io.InputStreamReader;
 import java.net.URL;
 import java.net.URLConnection;
+import java.util.HashSet;
 import java.util.Locale;
 import java.util.PropertyResourceBundle;
 import java.util.ResourceBundle;
@@ -102,7 +103,7 @@
         // TODO: Review- do we need to store the system default anywhere?
 
         // Useful to log the "user.*" properties for debugging...
-        Set<String> pn = System.getProperties().stringPropertyNames();
+        Set<String> pn = new HashSet<>(System.getProperties().stringPropertyNames());
         pn.removeIf(f -> !(f.startsWith("user.")));
         for (String ukey : pn) {
             log.debug("  {}: {}", ukey, System.getProperty(ukey));
diff --git a/core/common/BUCK b/core/common/BUCK
deleted file mode 100644
index 56c6970..0000000
--- a/core/common/BUCK
+++ /dev/null
@@ -1,19 +0,0 @@
-SRC_DEPS = [
-    '//lib:CORE_DEPS',
-    '//lib:JACKSON',
-    '//lib:METRICS',
-    '//incubator/api:onos-incubator-api',
-    '//core/api:onos-api',
-]
-
-TEST_DEPS = [
-    '//lib:TEST',
-    '//core/api:onos-api-tests',
-]
-
-osgi_jar_with_tests (
-    name = 'onos-core-common',
-    deps = SRC_DEPS,
-    test_deps = TEST_DEPS,
-    visibility = ['PUBLIC'],
-)
diff --git a/core/common/src/main/java/org/onosproject/codec/impl/CodecManager.java b/core/common/src/main/java/org/onosproject/codec/impl/CodecManager.java
index 13782c7..07f44c8 100644
--- a/core/common/src/main/java/org/onosproject/codec/impl/CodecManager.java
+++ b/core/common/src/main/java/org/onosproject/codec/impl/CodecManager.java
@@ -17,10 +17,9 @@
 
 import com.codahale.metrics.Metric;
 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.Service;
+import org.osgi.service.component.annotations.Activate;
+import org.osgi.service.component.annotations.Component;
+import org.osgi.service.component.annotations.Deactivate;
 import org.onlab.packet.Ethernet;
 import org.onosproject.cluster.ControllerNode;
 import org.onosproject.cluster.RoleInfo;
@@ -109,8 +108,7 @@
 /**
  * Implementation of the JSON codec brokering service.
  */
-@Component(immediate = true)
-@Service
+@Component(immediate = true, service = CodecService.class)
 public class CodecManager implements CodecService {
 
     private static Logger log = LoggerFactory.getLogger(CodecManager.class);
diff --git a/core/common/src/main/java/org/onosproject/common/net/AbstractDeviceProvider.java b/core/common/src/main/java/org/onosproject/common/net/AbstractDeviceProvider.java
index 9a70369..8b3cae4 100644
--- a/core/common/src/main/java/org/onosproject/common/net/AbstractDeviceProvider.java
+++ b/core/common/src/main/java/org/onosproject/common/net/AbstractDeviceProvider.java
@@ -16,11 +16,10 @@
 
 package org.onosproject.common.net;
 
-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.Deactivate;
+import org.osgi.service.component.annotations.Reference;
+import org.osgi.service.component.annotations.ReferenceCardinality;
 import org.onosproject.net.DeviceId;
 import org.onosproject.net.device.DeviceDescription;
 import org.onosproject.net.device.DeviceDescriptionDiscovery;
@@ -46,16 +45,15 @@
  * configuration.
  * </p>
  */
-@Component(immediate = true)
 public abstract class AbstractDeviceProvider extends AbstractProvider
         implements DeviceProvider {
 
     protected final Logger log = LoggerFactory.getLogger(getClass());
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected DeviceProviderRegistry providerRegistry;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected DriverService driverService;
 
     protected DeviceProviderService providerService;
diff --git a/core/common/src/test/java/org/onosproject/store/trivial/SimpleApplicationIdStore.java b/core/common/src/test/java/org/onosproject/store/trivial/SimpleApplicationIdStore.java
index 0e14c24..acbaa2a 100644
--- a/core/common/src/test/java/org/onosproject/store/trivial/SimpleApplicationIdStore.java
+++ b/core/common/src/test/java/org/onosproject/store/trivial/SimpleApplicationIdStore.java
@@ -16,11 +16,10 @@
 package org.onosproject.store.trivial;
 
 import com.google.common.collect.ImmutableSet;
-import org.apache.felix.scr.annotations.Component;
-import org.apache.felix.scr.annotations.Service;
-import org.onosproject.core.ApplicationId;
 import org.onosproject.app.ApplicationIdStore;
+import org.onosproject.core.ApplicationId;
 import org.onosproject.core.DefaultApplicationId;
+import org.osgi.service.component.annotations.Component;
 
 import java.util.Map;
 import java.util.Set;
@@ -31,8 +30,7 @@
  * Simple implementation of the application ID registry using in-memory
  * structures.
  */
-@Component(immediate = true)
-@Service
+@Component(immediate = true, service = ApplicationIdStore.class)
 public class SimpleApplicationIdStore implements ApplicationIdStore {
 
     private static final AtomicInteger ID_DISPENSER = new AtomicInteger(1);
diff --git a/core/common/src/test/java/org/onosproject/store/trivial/SimpleApplicationStore.java b/core/common/src/test/java/org/onosproject/store/trivial/SimpleApplicationStore.java
index c904455..1bb3c4d 100644
--- a/core/common/src/test/java/org/onosproject/store/trivial/SimpleApplicationStore.java
+++ b/core/common/src/test/java/org/onosproject/store/trivial/SimpleApplicationStore.java
@@ -16,22 +16,21 @@
 package org.onosproject.store.trivial;
 
 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.apache.felix.scr.annotations.Service;
 import org.onosproject.app.ApplicationDescription;
 import org.onosproject.app.ApplicationEvent;
+import org.onosproject.app.ApplicationIdStore;
 import org.onosproject.app.ApplicationState;
 import org.onosproject.app.ApplicationStore;
 import org.onosproject.common.app.ApplicationArchive;
 import org.onosproject.core.Application;
 import org.onosproject.core.ApplicationId;
-import org.onosproject.app.ApplicationIdStore;
 import org.onosproject.core.DefaultApplication;
 import org.onosproject.security.Permission;
+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.io.InputStream;
@@ -39,7 +38,11 @@
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.ConcurrentMap;
 
-import static org.onosproject.app.ApplicationEvent.Type.*;
+import static org.onosproject.app.ApplicationEvent.Type.APP_ACTIVATED;
+import static org.onosproject.app.ApplicationEvent.Type.APP_DEACTIVATED;
+import static org.onosproject.app.ApplicationEvent.Type.APP_INSTALLED;
+import static org.onosproject.app.ApplicationEvent.Type.APP_PERMISSIONS_CHANGED;
+import static org.onosproject.app.ApplicationEvent.Type.APP_UNINSTALLED;
 import static org.onosproject.app.ApplicationState.ACTIVE;
 import static org.onosproject.app.ApplicationState.INSTALLED;
 import static org.slf4j.LoggerFactory.getLogger;
@@ -47,8 +50,7 @@
 /**
  * Manages inventory of network control applications.
  */
-@Component(immediate = true)
-@Service
+@Component(immediate = true, service = ApplicationStore.class)
 public class SimpleApplicationStore extends ApplicationArchive
         implements ApplicationStore {
 
@@ -62,7 +64,7 @@
     private final ConcurrentMap<ApplicationId, Set<Permission>> permissions =
             new ConcurrentHashMap<>();
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected ApplicationIdStore idStore;
 
     @Activate
diff --git a/core/common/src/test/java/org/onosproject/store/trivial/SimpleClusterStore.java b/core/common/src/test/java/org/onosproject/store/trivial/SimpleClusterStore.java
index 251e413..537c629 100644
--- a/core/common/src/test/java/org/onosproject/store/trivial/SimpleClusterStore.java
+++ b/core/common/src/test/java/org/onosproject/store/trivial/SimpleClusterStore.java
@@ -16,13 +16,6 @@
 package org.onosproject.store.trivial;
 
 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.apache.felix.scr.annotations.Service;
 import org.onlab.packet.IpAddress;
 import org.onosproject.cluster.ClusterEvent;
 import org.onosproject.cluster.ClusterStore;
@@ -39,6 +32,11 @@
 import org.onosproject.net.intent.WorkPartitionEventListener;
 import org.onosproject.net.intent.WorkPartitionService;
 import org.onosproject.store.AbstractStore;
+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;
@@ -46,15 +44,15 @@
 import java.util.function.Function;
 
 import static org.onosproject.security.AppGuard.checkPermission;
-import static org.onosproject.security.AppPermission.Type.*;
+import static org.onosproject.security.AppPermission.Type.INTENT_EVENT;
+import static org.onosproject.security.AppPermission.Type.INTENT_READ;
 import static org.slf4j.LoggerFactory.getLogger;
 
 /**
  * Manages inventory of infrastructure devices using trivial in-memory
  * structures implementation.
  */
-@Component(immediate = true)
-@Service
+@Component(immediate = true, service = { ClusterStore.class, WorkPartitionService.class })
 public class SimpleClusterStore
         extends AbstractStore<ClusterEvent, ClusterStoreDelegate>
         implements ClusterStore, WorkPartitionService {
@@ -67,10 +65,10 @@
 
     private final Instant creationTime = Instant.now();
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected EventDeliveryService eventDispatcher;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected VersionService versionService;
 
     private ListenerRegistry<WorkPartitionEvent, WorkPartitionEventListener> listenerRegistry;
diff --git a/core/common/src/test/java/org/onosproject/store/trivial/SimpleComponentConfigStore.java b/core/common/src/test/java/org/onosproject/store/trivial/SimpleComponentConfigStore.java
index 9ba2659..2c6e103 100644
--- a/core/common/src/test/java/org/onosproject/store/trivial/SimpleComponentConfigStore.java
+++ b/core/common/src/test/java/org/onosproject/store/trivial/SimpleComponentConfigStore.java
@@ -15,14 +15,13 @@
  */
 package org.onosproject.store.trivial;
 
-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.onosproject.cfg.ComponentConfigEvent;
 import org.onosproject.cfg.ComponentConfigStore;
 import org.onosproject.cfg.ComponentConfigStoreDelegate;
 import org.onosproject.store.AbstractStore;
+import org.osgi.service.component.annotations.Activate;
+import org.osgi.service.component.annotations.Component;
+import org.osgi.service.component.annotations.Deactivate;
 import org.slf4j.Logger;
 
 import static org.onosproject.cfg.ComponentConfigEvent.Type.PROPERTY_SET;
@@ -32,8 +31,7 @@
 /**
  * Manages inventory of component configuration properties.
  */
-@Component(immediate = true)
-@Service
+@Component(immediate = true, service = ComponentConfigStore.class)
 public class SimpleComponentConfigStore
         extends AbstractStore<ComponentConfigEvent, ComponentConfigStoreDelegate>
         implements ComponentConfigStore {
diff --git a/core/common/src/test/java/org/onosproject/store/trivial/SimpleDeviceStore.java b/core/common/src/test/java/org/onosproject/store/trivial/SimpleDeviceStore.java
index 645b287..ec4d916 100644
--- a/core/common/src/test/java/org/onosproject/store/trivial/SimpleDeviceStore.java
+++ b/core/common/src/test/java/org/onosproject/store/trivial/SimpleDeviceStore.java
@@ -19,11 +19,7 @@
 import com.google.common.collect.ImmutableList;
 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.Service;
+import org.onlab.packet.ChassisId;
 import org.onosproject.net.AnnotationsUtil;
 import org.onosproject.net.DefaultAnnotations;
 import org.onosproject.net.DefaultDevice;
@@ -45,7 +41,9 @@
 import org.onosproject.net.device.PortStatistics;
 import org.onosproject.net.provider.ProviderId;
 import org.onosproject.store.AbstractStore;
-import org.onlab.packet.ChassisId;
+import org.osgi.service.component.annotations.Activate;
+import org.osgi.service.component.annotations.Component;
+import org.osgi.service.component.annotations.Deactivate;
 import org.slf4j.Logger;
 
 import java.util.ArrayList;
@@ -70,17 +68,21 @@
 import static com.google.common.base.Preconditions.checkNotNull;
 import static com.google.common.base.Predicates.notNull;
 import static com.google.common.base.Verify.verify;
-import static org.onosproject.net.device.DeviceEvent.Type.*;
-import static org.slf4j.LoggerFactory.getLogger;
-import static org.onosproject.net.DefaultAnnotations.union;
 import static org.onosproject.net.DefaultAnnotations.merge;
+import static org.onosproject.net.DefaultAnnotations.union;
+import static org.onosproject.net.device.DeviceEvent.Type.DEVICE_AVAILABILITY_CHANGED;
+import static org.onosproject.net.device.DeviceEvent.Type.DEVICE_REMOVED;
+import static org.onosproject.net.device.DeviceEvent.Type.PORT_ADDED;
+import static org.onosproject.net.device.DeviceEvent.Type.PORT_REMOVED;
+import static org.onosproject.net.device.DeviceEvent.Type.PORT_STATS_UPDATED;
+import static org.onosproject.net.device.DeviceEvent.Type.PORT_UPDATED;
+import static org.slf4j.LoggerFactory.getLogger;
 
 /**
  * Manages inventory of infrastructure devices using trivial in-memory
  * structures implementation.
  */
-@Component(immediate = true)
-@Service
+@Component(immediate = true, service = DeviceStore.class)
 public class SimpleDeviceStore
         extends AbstractStore<DeviceEvent, DeviceStoreDelegate>
         implements DeviceStore {
diff --git a/core/common/src/test/java/org/onosproject/store/trivial/SimpleFlowRuleStore.java b/core/common/src/test/java/org/onosproject/store/trivial/SimpleFlowRuleStore.java
index 02cd8ec..31b58fb 100644
--- a/core/common/src/test/java/org/onosproject/store/trivial/SimpleFlowRuleStore.java
+++ b/core/common/src/test/java/org/onosproject/store/trivial/SimpleFlowRuleStore.java
@@ -24,13 +24,6 @@
 import com.google.common.collect.Sets;
 import com.google.common.collect.Streams;
 import com.google.common.util.concurrent.SettableFuture;
-
-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.Service;
 import org.onlab.util.Tools;
 import org.onosproject.net.DeviceId;
 import org.onosproject.net.flow.CompletedBatchOperation;
@@ -39,17 +32,17 @@
 import org.onosproject.net.flow.FlowEntry.FlowEntryState;
 import org.onosproject.net.flow.FlowId;
 import org.onosproject.net.flow.FlowRule;
-import org.onosproject.net.flow.oldbatch.FlowRuleBatchEntry;
-import org.onosproject.net.flow.oldbatch.FlowRuleBatchEntry.FlowRuleOperation;
-import org.onosproject.net.flow.oldbatch.FlowRuleBatchEvent;
-import org.onosproject.net.flow.oldbatch.FlowRuleBatchOperation;
-import org.onosproject.net.flow.oldbatch.FlowRuleBatchRequest;
 import org.onosproject.net.flow.FlowRuleEvent;
 import org.onosproject.net.flow.FlowRuleEvent.Type;
 import org.onosproject.net.flow.FlowRuleStore;
 import org.onosproject.net.flow.FlowRuleStoreDelegate;
 import org.onosproject.net.flow.StoredFlowEntry;
 import org.onosproject.net.flow.TableStatisticsEntry;
+import org.onosproject.net.flow.oldbatch.FlowRuleBatchEntry;
+import org.onosproject.net.flow.oldbatch.FlowRuleBatchEntry.FlowRuleOperation;
+import org.onosproject.net.flow.oldbatch.FlowRuleBatchEvent;
+import org.onosproject.net.flow.oldbatch.FlowRuleBatchOperation;
+import org.onosproject.net.flow.oldbatch.FlowRuleBatchRequest;
 import org.onosproject.store.AbstractStore;
 import org.osgi.service.component.ComponentContext;
 import org.slf4j.Logger;
@@ -72,15 +65,12 @@
 /**
  * Manages inventory of flow rules using trivial in-memory implementation.
  */
-@Component(immediate = true)
-@Service
 public class SimpleFlowRuleStore
         extends AbstractStore<FlowRuleBatchEvent, FlowRuleStoreDelegate>
         implements FlowRuleStore {
 
     private final Logger log = getLogger(getClass());
 
-
     // inner Map is Device flow table
     // inner Map value (FlowId synonym list) must be synchronized before modifying
     private final ConcurrentMap<DeviceId, ConcurrentMap<FlowId, List<StoredFlowEntry>>>
@@ -92,8 +82,6 @@
     private final AtomicInteger localBatchIdGen = new AtomicInteger();
 
     private static final int DEFAULT_PENDING_FUTURE_TIMEOUT_MINUTES = 5;
-    @Property(name = "pendingFutureTimeoutMinutes", intValue = DEFAULT_PENDING_FUTURE_TIMEOUT_MINUTES,
-            label = "Expiration time after an entry is created that it should be automatically removed")
     private int pendingFutureTimeoutMinutes = DEFAULT_PENDING_FUTURE_TIMEOUT_MINUTES;
 
     private Cache<Integer, SettableFuture<CompletedBatchOperation>> pendingFutures =
@@ -102,21 +90,17 @@
                 .removalListener(new TimeoutFuture())
                 .build();
 
-    @Activate
     public void activate() {
         log.info("Started");
     }
 
-    @Deactivate
     public void deactivate() {
         deviceTableStats.clear();
         flowEntries.clear();
         log.info("Stopped");
     }
 
-    @Modified
     public void modified(ComponentContext context) {
-
         readComponentConfiguration(context);
 
         // Reset Cache and copy all.
diff --git a/core/common/src/test/java/org/onosproject/store/trivial/SimpleGroupStore.java b/core/common/src/test/java/org/onosproject/store/trivial/SimpleGroupStore.java
index d2e0834..0564fae 100644
--- a/core/common/src/test/java/org/onosproject/store/trivial/SimpleGroupStore.java
+++ b/core/common/src/test/java/org/onosproject/store/trivial/SimpleGroupStore.java
@@ -15,24 +15,8 @@
  */
 package org.onosproject.store.trivial;
 
-import static org.slf4j.LoggerFactory.getLogger;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-import java.util.Optional;
-import java.util.Set;
-import java.util.concurrent.ConcurrentHashMap;
-import java.util.concurrent.ConcurrentMap;
-import java.util.concurrent.atomic.AtomicInteger;
-
-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 com.google.common.collect.FluentIterable;
+import com.google.common.collect.Sets;
 import org.onosproject.core.GroupId;
 import org.onosproject.net.DeviceId;
 import org.onosproject.net.group.DefaultGroup;
@@ -51,16 +35,29 @@
 import org.onosproject.net.group.StoredGroupBucketEntry;
 import org.onosproject.net.group.StoredGroupEntry;
 import org.onosproject.store.AbstractStore;
+import org.osgi.service.component.annotations.Activate;
+import org.osgi.service.component.annotations.Component;
+import org.osgi.service.component.annotations.Deactivate;
 import org.slf4j.Logger;
 
-import com.google.common.collect.FluentIterable;
-import com.google.common.collect.Sets;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.Optional;
+import java.util.Set;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.ConcurrentMap;
+import java.util.concurrent.atomic.AtomicInteger;
+
+import static org.slf4j.LoggerFactory.getLogger;
 
 /**
  * Manages inventory of group entries using trivial in-memory implementation.
  */
-@Component(immediate = true)
-@Service
+@Component(immediate = true, service = GroupStore.class)
 public class SimpleGroupStore
         extends AbstractStore<GroupEvent, GroupStoreDelegate>
         implements GroupStore {
diff --git a/core/common/src/test/java/org/onosproject/store/trivial/SimpleHostStore.java b/core/common/src/test/java/org/onosproject/store/trivial/SimpleHostStore.java
index 4af7bea..923e68e 100644
--- a/core/common/src/test/java/org/onosproject/store/trivial/SimpleHostStore.java
+++ b/core/common/src/test/java/org/onosproject/store/trivial/SimpleHostStore.java
@@ -18,10 +18,6 @@
 import com.google.common.collect.HashMultimap;
 import com.google.common.collect.ImmutableSet;
 import com.google.common.collect.Multimap;
-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.packet.MacAddress;
 import org.onlab.packet.VlanId;
@@ -39,6 +35,9 @@
 import org.onosproject.net.host.HostStoreDelegate;
 import org.onosproject.net.provider.ProviderId;
 import org.onosproject.store.AbstractStore;
+import org.osgi.service.component.annotations.Activate;
+import org.osgi.service.component.annotations.Component;
+import org.osgi.service.component.annotations.Deactivate;
 import org.slf4j.Logger;
 
 import java.util.HashSet;
@@ -58,8 +57,7 @@
  * Manages inventory of end-station hosts using trivial in-memory
  * implementation.
  */
-@Component(immediate = true)
-@Service
+@Component(immediate = true, service = HostStore.class)
 public class SimpleHostStore
         extends AbstractStore<HostEvent, HostStoreDelegate>
         implements HostStore {
diff --git a/core/common/src/test/java/org/onosproject/store/trivial/SimpleIdBlockStore.java b/core/common/src/test/java/org/onosproject/store/trivial/SimpleIdBlockStore.java
index e9c4a59..e8b69b0 100644
--- a/core/common/src/test/java/org/onosproject/store/trivial/SimpleIdBlockStore.java
+++ b/core/common/src/test/java/org/onosproject/store/trivial/SimpleIdBlockStore.java
@@ -15,10 +15,9 @@
  */
 package org.onosproject.store.trivial;
 
-import org.apache.felix.scr.annotations.Component;
-import org.apache.felix.scr.annotations.Service;
 import org.onosproject.core.IdBlock;
 import org.onosproject.core.IdBlockStore;
+import org.osgi.service.component.annotations.Component;
 
 import java.util.Map;
 import java.util.concurrent.ConcurrentHashMap;
@@ -27,8 +26,7 @@
 /**
  * Simple implementation of id block store.
  */
-@Component(immediate = true)
-@Service
+@Component(immediate = true, service = IdBlockStore.class)
 public class SimpleIdBlockStore implements IdBlockStore {
 
     private static final long DEFAULT_BLOCK_SIZE = 0x1000L;
diff --git a/core/common/src/test/java/org/onosproject/store/trivial/SimpleIntentStore.java b/core/common/src/test/java/org/onosproject/store/trivial/SimpleIntentStore.java
index 1ef16d6..cd802a6 100644
--- a/core/common/src/test/java/org/onosproject/store/trivial/SimpleIntentStore.java
+++ b/core/common/src/test/java/org/onosproject/store/trivial/SimpleIntentStore.java
@@ -17,10 +17,6 @@
 
 import com.google.common.collect.Lists;
 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.Service;
 import org.onosproject.net.intent.Intent;
 import org.onosproject.net.intent.IntentData;
 import org.onosproject.net.intent.IntentEvent;
@@ -29,6 +25,9 @@
 import org.onosproject.net.intent.IntentStoreDelegate;
 import org.onosproject.net.intent.Key;
 import org.onosproject.store.AbstractStore;
+import org.osgi.service.component.annotations.Activate;
+import org.osgi.service.component.annotations.Component;
+import org.osgi.service.component.annotations.Deactivate;
 import org.slf4j.Logger;
 
 import java.util.List;
@@ -42,8 +41,7 @@
 /**
  * Simple single-instance implementation of the intent store.
  */
-@Component(immediate = true)
-@Service
+@Component(immediate = true, service = IntentStore.class)
 public class SimpleIntentStore
         extends AbstractStore<IntentEvent, IntentStoreDelegate>
         implements IntentStore {
diff --git a/core/common/src/test/java/org/onosproject/store/trivial/SimpleLeadershipManager.java b/core/common/src/test/java/org/onosproject/store/trivial/SimpleLeadershipManager.java
index 035ac9c..05bdbb2 100644
--- a/core/common/src/test/java/org/onosproject/store/trivial/SimpleLeadershipManager.java
+++ b/core/common/src/test/java/org/onosproject/store/trivial/SimpleLeadershipManager.java
@@ -15,7 +15,18 @@
  */
 package org.onosproject.store.trivial;
 
-import static com.google.common.base.Preconditions.checkArgument;
+import org.onosproject.cluster.ClusterService;
+import org.onosproject.cluster.Leader;
+import org.onosproject.cluster.Leadership;
+import org.onosproject.cluster.LeadershipEvent;
+import org.onosproject.cluster.LeadershipEvent.Type;
+import org.onosproject.cluster.LeadershipEventListener;
+import org.onosproject.cluster.LeadershipService;
+import org.onosproject.cluster.NodeId;
+import org.osgi.service.component.annotations.Activate;
+import org.osgi.service.component.annotations.Component;
+import org.osgi.service.component.annotations.Reference;
+import org.osgi.service.component.annotations.ReferenceCardinality;
 
 import java.util.Arrays;
 import java.util.List;
@@ -26,19 +37,7 @@
 import java.util.concurrent.CopyOnWriteArraySet;
 import java.util.stream.Collectors;
 
-import org.apache.felix.scr.annotations.Activate;
-import org.apache.felix.scr.annotations.Component;
-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.Leader;
-import org.onosproject.cluster.Leadership;
-import org.onosproject.cluster.LeadershipEvent;
-import org.onosproject.cluster.LeadershipEvent.Type;
-import org.onosproject.cluster.LeadershipEventListener;
-import org.onosproject.cluster.LeadershipService;
-import org.onosproject.cluster.NodeId;
+import static com.google.common.base.Preconditions.checkArgument;
 
 /**
  * A trivial implementation of the leadership service.
@@ -46,13 +45,12 @@
  * The service is not distributed, so it can assume there's a single leadership
  * contender. This contender is always granted leadership whenever it asks.
  */
-@Component(immediate = true)
-@Service
+@Component(immediate = true, service = LeadershipService.class)
 public class SimpleLeadershipManager implements LeadershipService {
 
     private Set<LeadershipEventListener> listeners = new CopyOnWriteArraySet<>();
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     private ClusterService clusterService;
 
     private NodeId localNodeId;
diff --git a/core/common/src/test/java/org/onosproject/store/trivial/SimpleLinkStore.java b/core/common/src/test/java/org/onosproject/store/trivial/SimpleLinkStore.java
index 0241b41..1d5828e 100644
--- a/core/common/src/test/java/org/onosproject/store/trivial/SimpleLinkStore.java
+++ b/core/common/src/test/java/org/onosproject/store/trivial/SimpleLinkStore.java
@@ -20,11 +20,6 @@
 import com.google.common.collect.Multimaps;
 import com.google.common.collect.SetMultimap;
 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.Service;
 import org.onosproject.net.AnnotationKeys;
 import org.onosproject.net.AnnotationsUtil;
 import org.onosproject.net.ConnectPoint;
@@ -42,6 +37,9 @@
 import org.onosproject.net.link.LinkStoreDelegate;
 import org.onosproject.net.provider.ProviderId;
 import org.onosproject.store.AbstractStore;
+import org.osgi.service.component.annotations.Activate;
+import org.osgi.service.component.annotations.Component;
+import org.osgi.service.component.annotations.Deactivate;
 import org.slf4j.Logger;
 
 import java.util.Collections;
@@ -64,15 +62,16 @@
 import static org.onosproject.net.Link.Type.DIRECT;
 import static org.onosproject.net.Link.Type.INDIRECT;
 import static org.onosproject.net.LinkKey.linkKey;
-import static org.onosproject.net.link.LinkEvent.Type.*;
+import static org.onosproject.net.link.LinkEvent.Type.LINK_ADDED;
+import static org.onosproject.net.link.LinkEvent.Type.LINK_REMOVED;
+import static org.onosproject.net.link.LinkEvent.Type.LINK_UPDATED;
 import static org.slf4j.LoggerFactory.getLogger;
 
 /**
  * Manages inventory of infrastructure links using trivial in-memory structures
  * implementation.
  */
-@Component(immediate = true)
-@Service
+@Component(immediate = true, service = LinkStore.class)
 public class SimpleLinkStore
         extends AbstractStore<LinkEvent, LinkStoreDelegate>
         implements LinkStore {
diff --git a/core/common/src/test/java/org/onosproject/store/trivial/SimpleMastershipStore.java b/core/common/src/test/java/org/onosproject/store/trivial/SimpleMastershipStore.java
index d52db14..4536dda 100644
--- a/core/common/src/test/java/org/onosproject/store/trivial/SimpleMastershipStore.java
+++ b/core/common/src/test/java/org/onosproject/store/trivial/SimpleMastershipStore.java
@@ -15,30 +15,9 @@
  */
 package org.onosproject.store.trivial;
 
-import static org.onosproject.mastership.MastershipEvent.Type.BACKUPS_CHANGED;
-import static org.onosproject.mastership.MastershipEvent.Type.MASTER_CHANGED;
-import static org.slf4j.LoggerFactory.getLogger;
-
-import java.time.Instant;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Objects;
-import java.util.Optional;
-import java.util.Set;
-import java.util.concurrent.CompletableFuture;
-import java.util.concurrent.atomic.AtomicInteger;
-
+import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableMap;
-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.ImmutableSet;
 import org.onlab.packet.IpAddress;
 import org.onosproject.cluster.ClusterEventListener;
 import org.onosproject.cluster.ClusterService;
@@ -58,17 +37,35 @@
 import org.onosproject.net.DeviceId;
 import org.onosproject.net.MastershipRole;
 import org.onosproject.store.AbstractStore;
+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.ImmutableList;
-import com.google.common.collect.ImmutableSet;
+import java.time.Instant;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+import java.util.Optional;
+import java.util.Set;
+import java.util.concurrent.CompletableFuture;
+import java.util.concurrent.atomic.AtomicInteger;
+
+import static org.onosproject.mastership.MastershipEvent.Type.BACKUPS_CHANGED;
+import static org.onosproject.mastership.MastershipEvent.Type.MASTER_CHANGED;
+import static org.slf4j.LoggerFactory.getLogger;
 
 /**
  * Manages inventory of controller mastership over devices using
  * trivial, non-distributed in-memory structures implementation.
  */
-@Component(immediate = true)
-@Service
+@Component(immediate = true, service = MastershipStore.class)
 public class SimpleMastershipStore
         extends AbstractStore<MastershipEvent, MastershipStoreDelegate>
         implements MastershipStore {
@@ -78,10 +75,10 @@
     private static final int NOTHING = 0;
     private static final int INIT = 1;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected ClusterService clusterService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected VersionService versionService;
 
     //devices mapped to their masters, to emulate multiple nodes
diff --git a/core/common/src/test/java/org/onosproject/store/trivial/SimplePacketStore.java b/core/common/src/test/java/org/onosproject/store/trivial/SimplePacketStore.java
index 78e88a2..054ff05 100644
--- a/core/common/src/test/java/org/onosproject/store/trivial/SimplePacketStore.java
+++ b/core/common/src/test/java/org/onosproject/store/trivial/SimplePacketStore.java
@@ -19,8 +19,6 @@
 import com.google.common.collect.Lists;
 import com.google.common.collect.Maps;
 import com.google.common.collect.Sets;
-import org.apache.felix.scr.annotations.Component;
-import org.apache.felix.scr.annotations.Service;
 import org.onosproject.net.flow.TrafficSelector;
 import org.onosproject.net.packet.OutboundPacket;
 import org.onosproject.net.packet.PacketEvent;
@@ -29,6 +27,7 @@
 import org.onosproject.net.packet.PacketStore;
 import org.onosproject.net.packet.PacketStoreDelegate;
 import org.onosproject.store.AbstractStore;
+import org.osgi.service.component.annotations.Component;
 
 import java.util.HashSet;
 import java.util.List;
@@ -38,8 +37,7 @@
 /**
  * Simple single instance implementation of the packet store.
  */
-@Component(immediate = true)
-@Service
+@Component(immediate = true, service = PacketStore.class)
 public class SimplePacketStore
         extends AbstractStore<PacketEvent, PacketStoreDelegate>
         implements PacketStore {
diff --git a/core/common/src/test/java/org/onosproject/store/trivial/SimpleStatisticStore.java b/core/common/src/test/java/org/onosproject/store/trivial/SimpleStatisticStore.java
index 4501429..04d3391 100644
--- a/core/common/src/test/java/org/onosproject/store/trivial/SimpleStatisticStore.java
+++ b/core/common/src/test/java/org/onosproject/store/trivial/SimpleStatisticStore.java
@@ -16,10 +16,6 @@
 package org.onosproject.store.trivial;
 
 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.Service;
 import org.onosproject.net.ConnectPoint;
 import org.onosproject.net.PortNumber;
 import org.onosproject.net.flow.FlowEntry;
@@ -27,6 +23,9 @@
 import org.onosproject.net.flow.instructions.Instruction;
 import org.onosproject.net.flow.instructions.Instructions;
 import org.onosproject.net.statistic.StatisticStore;
+import org.osgi.service.component.annotations.Activate;
+import org.osgi.service.component.annotations.Component;
+import org.osgi.service.component.annotations.Deactivate;
 import org.slf4j.Logger;
 
 import java.util.Collections;
@@ -43,8 +42,7 @@
  * Maintains statistics using RPC calls to collect stats from remote instances
  * on demand.
  */
-@Component(immediate = true)
-@Service
+@Component(immediate = true, service = StatisticStore.class)
 public class SimpleStatisticStore implements StatisticStore {
 
     private final Logger log = getLogger(getClass());
diff --git a/core/common/src/test/java/org/onosproject/store/trivial/SimpleTopologyStore.java b/core/common/src/test/java/org/onosproject/store/trivial/SimpleTopologyStore.java
index cb34df1..60210ef 100644
--- a/core/common/src/test/java/org/onosproject/store/trivial/SimpleTopologyStore.java
+++ b/core/common/src/test/java/org/onosproject/store/trivial/SimpleTopologyStore.java
@@ -15,10 +15,6 @@
  */
 package org.onosproject.store.trivial;
 
-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.onosproject.common.DefaultTopology;
 import org.onosproject.event.Event;
 import org.onosproject.net.ConnectPoint;
@@ -37,6 +33,9 @@
 import org.onosproject.net.topology.TopologyStore;
 import org.onosproject.net.topology.TopologyStoreDelegate;
 import org.onosproject.store.AbstractStore;
+import org.osgi.service.component.annotations.Activate;
+import org.osgi.service.component.annotations.Component;
+import org.osgi.service.component.annotations.Deactivate;
 import org.slf4j.Logger;
 
 import java.util.List;
@@ -49,8 +48,7 @@
  * Manages inventory of topology snapshots using trivial in-memory
  * structures implementation.
  */
-@Component(immediate = true)
-@Service
+@Component(immediate = true, service = TopologyStore.class)
 public class SimpleTopologyStore
         extends AbstractStore<TopologyEvent, TopologyStoreDelegate>
         implements TopologyStore {
diff --git a/core/net/BUCK b/core/net/BUCK
deleted file mode 100644
index 8a6bad8..0000000
--- a/core/net/BUCK
+++ /dev/null
@@ -1,29 +0,0 @@
-COMPILE_DEPS = [
-    '//lib:CORE_DEPS',
-    '//lib:JACKSON',
-    '//lib:METRICS',
-    '//lib:KRYO',
-    '//core/common:onos-core-common',
-    '//incubator/api:onos-incubator-api',
-    '//utils/rest:onlab-rest',
-    '//incubator/net:onos-incubator-net',
-    '//incubator/store:onos-incubator-store',
-    '//core/store/serializers:onos-core-serializers',
-]
-
-TEST_DEPS = [
-    '//lib:TEST_REST',
-    '//lib:TEST_ADAPTERS',
-    '//core/store/dist:onos-core-dist',
-    '//core/store/dist:onos-core-dist-tests',
-    '//utils/osgi:onlab-osgi-tests',
-    '//pipelines/basic:onos-pipelines-basic',
-    '//lib:minimal-json',
-]
-
-osgi_jar_with_tests (
-    name = 'onos-core-net',
-    deps = COMPILE_DEPS,
-    test_deps = TEST_DEPS,
-    visibility = ['PUBLIC'],
-)
diff --git a/core/net/BUILD b/core/net/BUILD
index 3c17dd0..571c45a 100644
--- a/core/net/BUILD
+++ b/core/net/BUILD
@@ -5,6 +5,8 @@
     "//incubator/net:onos-incubator-net",
     "//incubator/store:onos-incubator-store",
     "//core/store/serializers:onos-core-serializers",
+    "//core/store/primitives:onos-core-primitives",
+    "@org_osgi_service_cm//jar",
 ]
 
 TEST_DEPS = TEST + TEST_REST + TEST_ADAPTERS + [
diff --git a/core/net/src/main/java/org/onosproject/app/impl/ApplicationManager.java b/core/net/src/main/java/org/onosproject/app/impl/ApplicationManager.java
index d8b09b0..2bb9c11 100644
--- a/core/net/src/main/java/org/onosproject/app/impl/ApplicationManager.java
+++ b/core/net/src/main/java/org/onosproject/app/impl/ApplicationManager.java
@@ -20,13 +20,6 @@
 import com.google.common.collect.HashMultimap;
 import com.google.common.collect.Multimap;
 import com.google.common.util.concurrent.Uninterruptibles;
-
-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.features.Feature;
 import org.apache.karaf.features.FeaturesService;
 import org.onosproject.app.ApplicationAdminService;
@@ -41,6 +34,11 @@
 import org.onosproject.event.AbstractListenerManager;
 import org.onosproject.security.Permission;
 import org.onosproject.security.SecurityUtil;
+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.io.InputStream;
@@ -61,8 +59,7 @@
 /**
  * Implementation of the application management service.
  */
-@Component(immediate = true)
-@Service
+@Component(immediate = true, service = {ApplicationService.class, ApplicationAdminService.class})
 public class ApplicationManager
         extends AbstractListenerManager<ApplicationEvent, ApplicationListener>
         implements ApplicationService, ApplicationAdminService {
@@ -74,10 +71,10 @@
 
     private final ApplicationStoreDelegate delegate = new InternalStoreDelegate();
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected ApplicationStore store;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected FeaturesService featuresService;
 
     // Application supplied hooks for pre-activation processing.
diff --git a/core/net/src/main/java/org/onosproject/cfg/impl/ComponentConfigLoader.java b/core/net/src/main/java/org/onosproject/cfg/impl/ComponentConfigLoader.java
index e852581..a88738d 100644
--- a/core/net/src/main/java/org/onosproject/cfg/impl/ComponentConfigLoader.java
+++ b/core/net/src/main/java/org/onosproject/cfg/impl/ComponentConfigLoader.java
@@ -18,10 +18,10 @@
 
 import com.fasterxml.jackson.databind.ObjectMapper;
 import com.fasterxml.jackson.databind.node.ObjectNode;
-import org.apache.felix.scr.annotations.Activate;
-import org.apache.felix.scr.annotations.Component;
-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.Reference;
+import org.osgi.service.component.annotations.ReferenceCardinality;
 import org.onosproject.cfg.ComponentConfigService;
 import org.slf4j.Logger;
 
@@ -41,7 +41,7 @@
 
     private final Logger log = getLogger(getClass());
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected ComponentConfigService configService;
 
     private ObjectNode root;
diff --git a/core/net/src/main/java/org/onosproject/cfg/impl/ComponentConfigManager.java b/core/net/src/main/java/org/onosproject/cfg/impl/ComponentConfigManager.java
index b6e6a0f..d15ad63 100644
--- a/core/net/src/main/java/org/onosproject/cfg/impl/ComponentConfigManager.java
+++ b/core/net/src/main/java/org/onosproject/cfg/impl/ComponentConfigManager.java
@@ -17,12 +17,6 @@
 
 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.AbstractAccumulator;
 import org.onlab.util.Accumulator;
 import org.onlab.util.SharedExecutors;
@@ -33,6 +27,11 @@
 import org.onosproject.cfg.ConfigProperty;
 import org.osgi.service.cm.Configuration;
 import org.osgi.service.cm.ConfigurationAdmin;
+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.io.IOException;
@@ -48,15 +47,15 @@
 import static com.google.common.base.Preconditions.checkArgument;
 import static com.google.common.base.Preconditions.checkNotNull;
 import static org.onosproject.security.AppGuard.checkPermission;
+import static org.onosproject.security.AppPermission.Type.CONFIG_READ;
+import static org.onosproject.security.AppPermission.Type.CONFIG_WRITE;
 import static org.slf4j.LoggerFactory.getLogger;
-import static org.onosproject.security.AppPermission.Type.*;
 
 
 /**
  * Implementation of the centralized component configuration service.
  */
-@Component(immediate = true)
-@Service
+@Component(immediate = true, service = ComponentConfigService.class)
 public class ComponentConfigManager implements ComponentConfigService {
 
     private static final String COMPONENT_NULL = "Component name cannot be null";
@@ -77,10 +76,10 @@
     private final ComponentConfigStoreDelegate delegate = new InternalStoreDelegate();
     private final InternalAccumulator accumulator = new InternalAccumulator();
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected ComponentConfigStore store;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected ConfigurationAdmin cfgAdmin;
 
     // Locally maintained catalog of definitions.
@@ -113,6 +112,11 @@
         String componentName = componentClass.getName();
         String resourceName = componentClass.getSimpleName() + RESOURCE_EXT;
         try (InputStream ris = componentClass.getResourceAsStream(resourceName)) {
+            // FIXME: Eliminate the following soft-fail after property refactoring is complete.
+            if (ris == null) {
+                log.info("Property definitions not found at resource {}; please fix this", resourceName);
+                return;
+            }
             checkArgument(ris != null, "Property definitions not found at resource %s",
                           resourceName);
 
@@ -132,6 +136,10 @@
 
     @Override
     public void unregisterProperties(Class<?> componentClass, boolean clear) {
+        if (true) {
+            return;
+        }
+
         checkPermission(CONFIG_WRITE);
 
         String componentName = componentClass.getName();
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..df77d09 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,19 +15,7 @@
  */
 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 com.google.common.collect.ImmutableList;
 import org.onlab.packet.IpAddress;
 import org.onosproject.cluster.ClusterMetadata;
 import org.onosproject.cluster.ClusterMetadataAdminService;
@@ -43,9 +31,28 @@
 import org.onosproject.cluster.PartitionId;
 import org.onosproject.net.provider.AbstractListenerProviderRegistry;
 import org.onosproject.net.provider.AbstractProviderService;
+import org.onosproject.net.provider.ProviderId;
+import org.onosproject.store.atomix.ClusterActivator;
 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 java.util.List;
+import java.util.Set;
+import java.util.stream.Collectors;
+
 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 +61,9 @@
 /**
  * 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,12 +71,19 @@
                                              ClusterMetadataProviderService>
     implements ClusterMetadataService, ClusterMetadataAdminService, ClusterMetadataProviderRegistry {
 
+    private static final int MAX_WAIT_TRIES = 600;
+    private static final int MAX_WAIT_MS = 100;
+
+    private List<String> requiredProviders = ImmutableList.of("file", "default");
+
     private final Logger log = getLogger(getClass());
     private ControllerNode localNode;
 
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
+    private ClusterActivator clusterActivator;
+
     @Activate
     public void activate() {
-        // FIXME: Need to ensure all cluster metadata providers are registered before we activate
         eventDispatcher.addSink(ClusterMetadataEvent.class, listenerRegistry);
         log.info("Started");
     }
@@ -80,13 +95,24 @@
     }
 
     @Override
+    public synchronized ClusterMetadataProviderService register(ClusterMetadataProvider provider) {
+        ClusterMetadataProviderService s = super.register(provider);
+        Set<String> providerNames = getProviders().stream().map(ProviderId::scheme).collect(Collectors.toSet());
+        if (providerNames.containsAll(requiredProviders)) {
+            // Safe to release Atomix now, cluster metadata is ready
+            clusterActivator.activateCluster();
+        }
+        return s;
+    }
+
+
+    @Override
     public ClusterMetadata getClusterMetadata() {
         checkPermission(CLUSTER_READ);
         Versioned<ClusterMetadata> metadata = getProvider().getClusterMetadata();
         return metadata.value();
     }
 
-
     @Override
     protected ClusterMetadataProviderService createProviderService(
             ClusterMetadataProvider provider) {
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..3dd5dda 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,8 @@
 import org.osgi.framework.Bundle;
 import org.osgi.framework.BundleContext;
 import org.osgi.service.component.ComponentContext;
+import org.osgi.service.component.runtime.dto.ComponentConfigurationDTO;
+import org.osgi.service.component.runtime.dto.ComponentDescriptionDTO;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -40,20 +42,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 +87,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 +113,16 @@
     }
 
     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)) {
+                for (ComponentConfigurationDTO config : scrService.getComponentConfigurationDTOs(component)) {
+                    if (config.state != ComponentConfigurationDTO.ACTIVE) {
+                        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 de7a3e1..807a143 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,13 @@
 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.onosproject.cluster.ClusterMetadata;
 import org.onosproject.cluster.ClusterMetadataProvider;
 import org.onosproject.cluster.ClusterMetadataProviderRegistry;
@@ -64,7 +66,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 35a56a8..2facc1c 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
@@ -25,11 +25,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;
@@ -54,10 +54,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..442aaef 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;
@@ -77,13 +75,25 @@
 import static org.onosproject.security.AppPermission.Type.CLUSTER_READ;
 import static org.onosproject.security.AppPermission.Type.CLUSTER_WRITE;
 import static org.slf4j.LoggerFactory.getLogger;
+import static org.onosproject.net.OsgiPropertyConstants.*;
 
 
 /**
  * Component providing the node-device mastership service.
  */
-@Component(immediate = true)
-@Service
+@Component(
+        immediate = true,
+        service = {
+                MastershipService.class,
+                MastershipAdminService.class,
+                MastershipTermService.class,
+                MetricsHelper.class
+        },
+        property = {
+                USE_REGION_FOR_BALANCE_ROLES + ":Boolean=" + USE_REGION_FOR_BALANCE_ROLES_DEFAULT,
+                REBALANCE_ROLES_ON_UPGRADE + ":Boolean=" + REBALANCE_ROLES_ON_UPGRADE_DEFAULT
+        }
+)
 public class MastershipManager
         extends AbstractListenerManager<MastershipEvent, MastershipListener>
         implements MastershipService, MastershipAdminService, MastershipTermService,
@@ -98,37 +108,32 @@
     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")
-    protected boolean useRegionForBalanceRoles;
+    /** Use Regions for balancing roles. */
+    protected boolean useRegionForBalanceRoles = USE_REGION_FOR_BALANCE_ROLES_DEFAULT;
 
-    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")
-    protected boolean rebalanceRolesOnUpgrade = DEFAULT_REBALANCE_ROLES_ON_UPGRADE;
+    /** Automatically rebalance roles following an upgrade. */
+    protected boolean rebalanceRolesOnUpgrade = REBALANCE_ROLES_ON_UPGRADE_DEFAULT;
 
     @Activate
     public void activate() {
@@ -146,9 +151,13 @@
     @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 (USE_REGION_FOR_BALANCE_ROLES.equals(property.name())) {
+                    useRegionForBalanceRoles = property.asBoolean();
+                } else if (REBALANCE_ROLES_ON_UPGRADE.equals(property.name())) {
+                    rebalanceRolesOnUpgrade = 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 =
diff --git a/core/net/src/main/java/org/onosproject/component/impl/ComponentManager.java b/core/net/src/main/java/org/onosproject/component/impl/ComponentManager.java
index abe8e0b..56486ec 100644
--- a/core/net/src/main/java/org/onosproject/component/impl/ComponentManager.java
+++ b/core/net/src/main/java/org/onosproject/component/impl/ComponentManager.java
@@ -16,42 +16,41 @@
 
 package org.onosproject.component.impl;
 
-import org.apache.felix.scr.ScrService;
-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.core.ApplicationId;
 import org.onosproject.component.ComponentService;
+import org.onosproject.core.ApplicationId;
+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.osgi.service.component.runtime.ServiceComponentRuntime;
+import org.osgi.service.component.runtime.dto.ComponentDescriptionDTO;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 import java.util.Collections;
 import java.util.Set;
 import java.util.concurrent.ConcurrentHashMap;
-import java.util.concurrent.Executors;
 import java.util.concurrent.ScheduledExecutorService;
 import java.util.concurrent.TimeUnit;
 
+import static java.util.concurrent.Executors.newScheduledThreadPool;
 import static org.onlab.util.Tools.groupedThreads;
 
 /**
  * Manages OSGi components.
  */
-@Service
-@Component(immediate = true)
+@Component(immediate = true, service = ComponentService.class)
 public class ComponentManager implements ComponentService {
 
     private final Logger log = LoggerFactory.getLogger(getClass());
 
+    private static final long TIMEOUT = 3000;
     private static final int POLLING_PERIOD_MS = 500;
-
     private static final int NUM_THREADS = 1;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
-    protected ScrService scrService;
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
+    protected ServiceComponentRuntime scrService;
 
     private Set<String> components;
 
@@ -61,19 +60,15 @@
     private void activate() {
         components = Collections.newSetFromMap(new ConcurrentHashMap<>());
 
-        executor = Executors.newScheduledThreadPool(NUM_THREADS,
-                groupedThreads("onos/component", "%d", log));
-
+        executor = newScheduledThreadPool(NUM_THREADS, groupedThreads("onos/component", "%d", log));
         executor.scheduleAtFixedRate(() -> components.forEach(this::enableComponent),
-                0, POLLING_PERIOD_MS, TimeUnit.MILLISECONDS);
-
+                                     0, POLLING_PERIOD_MS, TimeUnit.MILLISECONDS);
         log.info("Started");
     }
 
     @Deactivate
     private void deactivate() {
         executor.shutdownNow();
-
         log.info("Stopped");
     }
 
@@ -89,30 +84,36 @@
         disableComponent(name);
     }
 
-    private void enableComponent(String name) {
-        org.apache.felix.scr.Component[] components = scrService.getComponents(name);
-
-        if (components == null || components.length == 0) {
-            return;
+    private ComponentDescriptionDTO getComponent(String name) {
+        for (ComponentDescriptionDTO component : scrService.getComponentDescriptionDTOs()) {
+            if (component.name.equals(name)) {
+                return component;
+            }
         }
+        return null;
+    }
 
-        org.apache.felix.scr.Component component = components[0];
-
-        if (component.getState() == org.apache.felix.scr.Component.STATE_DISABLED) {
+    private void enableComponent(String name) {
+        ComponentDescriptionDTO component = getComponent(name);
+        if (component != null && !scrService.isComponentEnabled(component)) {
             log.info("Enabling component {}", name);
-            component.enable();
+            try {
+                scrService.enableComponent(component).timeout(TIMEOUT);
+            } catch (Exception e) {
+                throw new IllegalStateException("Unable to start component " + name, e);
+            }
         }
     }
 
     private void disableComponent(String name) {
-        org.apache.felix.scr.Component[] components = scrService.getComponents(name);
-
-        if (components == null || components.length == 0) {
-            return;
+        ComponentDescriptionDTO component = getComponent(name);
+        if (component != null && scrService.isComponentEnabled(component)) {
+            log.info("Disabling component {}", name);
+            try {
+                scrService.disableComponent(component).timeout(TIMEOUT);
+            } catch (Exception e) {
+                throw new IllegalStateException("Unable to start component " + name, e);
+            }
         }
-
-        log.info("Disabling component {}", name);
-
-        components[0].disable();
     }
 }
diff --git a/core/net/src/main/java/org/onosproject/core/impl/CoreManager.java b/core/net/src/main/java/org/onosproject/core/impl/CoreManager.java
index 66fc9f9..f707c26 100644
--- a/core/net/src/main/java/org/onosproject/core/impl/CoreManager.java
+++ b/core/net/src/main/java/org/onosproject/core/impl/CoreManager.java
@@ -15,22 +15,14 @@
  */
 package org.onosproject.core.impl;
 
-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.onlab.util.SharedExecutors;
 import org.onlab.util.SharedScheduledExecutors;
 import org.onlab.util.Tools;
+import org.onosproject.app.ApplicationIdStore;
 import org.onosproject.app.ApplicationService;
 import org.onosproject.cfg.ComponentConfigService;
 import org.onosproject.core.ApplicationId;
-import org.onosproject.app.ApplicationIdStore;
 import org.onosproject.core.CoreService;
 import org.onosproject.core.IdBlockStore;
 import org.onosproject.core.IdGenerator;
@@ -38,6 +30,12 @@
 import org.onosproject.core.VersionService;
 import org.onosproject.event.EventDeliveryService;
 import org.osgi.service.component.ComponentContext;
+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 org.slf4j.LoggerFactory;
 
@@ -45,6 +43,12 @@
 import java.util.Set;
 
 import static com.google.common.base.Preconditions.checkNotNull;
+import static org.onosproject.net.OsgiPropertyConstants.CALCULATE_PERFORMANCE_CHECK;
+import static org.onosproject.net.OsgiPropertyConstants.CALCULATE_PERFORMANCE_CHECK_DEFAULT;
+import static org.onosproject.net.OsgiPropertyConstants.MAX_EVENT_TIME_LIMIT;
+import static org.onosproject.net.OsgiPropertyConstants.MAX_EVENT_TIME_LIMIT_DEFAULT;
+import static org.onosproject.net.OsgiPropertyConstants.SHARED_THREAD_POOL_SIZE;
+import static org.onosproject.net.OsgiPropertyConstants.SHARED_THREAD_POOL_SIZE_DEFAULT;
 import static org.onosproject.security.AppGuard.checkPermission;
 import static org.onosproject.security.AppPermission.Type.APP_READ;
 import static org.onosproject.security.AppPermission.Type.APP_WRITE;
@@ -52,47 +56,48 @@
 /**
  * Core service implementation.
  */
-@Component(immediate = true)
-@Service
+@Component(
+        immediate = true,
+        service = CoreService.class,
+        property = {
+                SHARED_THREAD_POOL_SIZE + ":Integer=" + SHARED_THREAD_POOL_SIZE_DEFAULT,
+                MAX_EVENT_TIME_LIMIT + ":Integer=" + MAX_EVENT_TIME_LIMIT_DEFAULT,
+                CALCULATE_PERFORMANCE_CHECK + ":Boolean=" + CALCULATE_PERFORMANCE_CHECK_DEFAULT
+        }
+)
 public class CoreManager implements CoreService {
 
     private final Logger log = LoggerFactory.getLogger(getClass());
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected VersionService versionService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected ApplicationIdStore applicationIdStore;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected IdBlockStore idBlockStore;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected ApplicationService appService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected ComponentConfigService cfgService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected EventDeliveryService eventDeliveryService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected MetricsService metricsService;
 
-    private static final int DEFAULT_POOL_SIZE = 30;
-    @Property(name = "sharedThreadPoolSize", intValue = DEFAULT_POOL_SIZE,
-            label = "Configure shared pool maximum size ")
-    private int sharedThreadPoolSize = DEFAULT_POOL_SIZE;
+    /** Configure shared pool maximum size. */
+    private int sharedThreadPoolSize = SHARED_THREAD_POOL_SIZE_DEFAULT;
 
-    private static final int DEFAULT_EVENT_TIME = 2000;
-    @Property(name = "maxEventTimeLimit", intValue = DEFAULT_EVENT_TIME,
-            label = "Maximum number of millis an event sink has to process an event")
-    private int maxEventTimeLimit = DEFAULT_EVENT_TIME;
+    /** Maximum number of millis an event sink has to process an event. */
+    private int maxEventTimeLimit = MAX_EVENT_TIME_LIMIT_DEFAULT;
 
-    private static final boolean DEFAULT_PERFORMANCE_CHECK = false;
-    @Property(name = "sharedThreadPerformanceCheck", boolValue = DEFAULT_PERFORMANCE_CHECK,
-            label = "Enable queue performance check on shared pool")
-    private boolean calculatePoolPerformance = DEFAULT_PERFORMANCE_CHECK;
+    /** Enable queue performance check on shared pool. */
+    private boolean calculatePoolPerformance = CALCULATE_PERFORMANCE_CHECK_DEFAULT;
 
 
     @Activate
@@ -157,7 +162,7 @@
     @Modified
     protected void modified(ComponentContext context) {
         Dictionary<?, ?> properties = context.getProperties();
-        Integer poolSize = Tools.getIntegerProperty(properties, "sharedThreadPoolSize");
+        Integer poolSize = Tools.getIntegerProperty(properties, SHARED_THREAD_POOL_SIZE);
 
         if (poolSize != null && poolSize > 1) {
             sharedThreadPoolSize = poolSize;
@@ -166,7 +171,7 @@
             log.warn("sharedThreadPoolSize must be greater than 1");
         }
 
-        Integer timeLimit = Tools.getIntegerProperty(properties, "maxEventTimeLimit");
+        Integer timeLimit = Tools.getIntegerProperty(properties, MAX_EVENT_TIME_LIMIT);
         if (timeLimit != null && timeLimit >= 0) {
             maxEventTimeLimit = timeLimit;
             eventDeliveryService.setDispatchTimeLimit(maxEventTimeLimit);
@@ -174,7 +179,7 @@
             log.warn("maxEventTimeLimit must be greater than or equal to 0");
         }
 
-        Boolean performanceCheck = Tools.isPropertyEnabled(properties, "sharedThreadPerformanceCheck");
+        Boolean performanceCheck = Tools.isPropertyEnabled(properties, CALCULATE_PERFORMANCE_CHECK);
         if (performanceCheck != null) {
             calculatePoolPerformance = performanceCheck;
             SharedExecutors.setMetricsService(calculatePoolPerformance ? metricsService : null);
diff --git a/core/net/src/main/java/org/onosproject/core/impl/HybridLogicalClockManager.java b/core/net/src/main/java/org/onosproject/core/impl/HybridLogicalClockManager.java
index 7eb0bf7..182aee0 100644
--- a/core/net/src/main/java/org/onosproject/core/impl/HybridLogicalClockManager.java
+++ b/core/net/src/main/java/org/onosproject/core/impl/HybridLogicalClockManager.java
@@ -16,25 +16,23 @@
 
 package org.onosproject.core.impl;
 
-import static org.slf4j.LoggerFactory.getLogger;
+import org.onosproject.core.HybridLogicalClockService;
+import org.onosproject.core.HybridLogicalTime;
+import org.osgi.service.component.annotations.Activate;
+import org.osgi.service.component.annotations.Component;
+import org.osgi.service.component.annotations.Deactivate;
+import org.slf4j.Logger;
 
 import java.util.function.Supplier;
 
-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.onosproject.core.HybridLogicalClockService;
-import org.onosproject.core.HybridLogicalTime;
-import org.slf4j.Logger;
+import static org.slf4j.LoggerFactory.getLogger;
 
 /**
  * Implementation of {@link HybridLogicalClockService}.
  * <p>
  * Implementation is based on HLT <a href="http://www.cse.buffalo.edu/tech-reports/2014-04.pdf">paper</a>.
  */
-@Component(immediate = true)
-@Service
+@Component(immediate = true, service = HybridLogicalClockService.class)
 public class HybridLogicalClockManager implements HybridLogicalClockService {
 
     private final Logger log = getLogger(getClass());
diff --git a/core/net/src/main/java/org/onosproject/core/impl/MetricsManagerComponent.java b/core/net/src/main/java/org/onosproject/core/impl/MetricsManagerComponent.java
index aaff20a..4e8db53 100644
--- a/core/net/src/main/java/org/onosproject/core/impl/MetricsManagerComponent.java
+++ b/core/net/src/main/java/org/onosproject/core/impl/MetricsManagerComponent.java
@@ -15,18 +15,16 @@
  */
 package org.onosproject.core.impl;
 
-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.metrics.MetricsManager;
+import org.onlab.metrics.MetricsService;
+import org.osgi.service.component.annotations.Activate;
+import org.osgi.service.component.annotations.Component;
+import org.osgi.service.component.annotations.Deactivate;
 
 /**
  * Metrics service implementation.
  */
-@Component(immediate = true)
-@Service
+@Component(immediate = true, service = MetricsService.class)
 public class MetricsManagerComponent extends MetricsManager {
 
     @Activate
diff --git a/core/net/src/main/java/org/onosproject/core/impl/VersionManager.java b/core/net/src/main/java/org/onosproject/core/impl/VersionManager.java
index faec87b..0e1f636 100644
--- a/core/net/src/main/java/org/onosproject/core/impl/VersionManager.java
+++ b/core/net/src/main/java/org/onosproject/core/impl/VersionManager.java
@@ -15,6 +15,13 @@
  */
 package org.onosproject.core.impl;
 
+import org.onosproject.core.Version;
+import org.onosproject.core.VersionService;
+import org.osgi.service.component.annotations.Activate;
+import org.osgi.service.component.annotations.Component;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
 import java.io.File;
 import java.io.IOException;
 import java.nio.file.Files;
@@ -22,25 +29,16 @@
 import java.nio.file.Paths;
 import java.util.List;
 
-import org.apache.felix.scr.annotations.Activate;
-import org.apache.felix.scr.annotations.Component;
-import org.apache.felix.scr.annotations.Service;
-import org.onosproject.core.Version;
-import org.onosproject.core.VersionService;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
 /**
  * Node version service implementation.
  */
-@Component(immediate = true)
-@Service
+@Component(immediate = true, service = VersionService.class)
 public class VersionManager implements VersionService {
 
     private final Logger log = LoggerFactory.getLogger(getClass());
 
     private static final File VERSION_FILE = new File("../VERSION");
-    private static Version version = Version.version("1.15.0-SNAPSHOT");
+    private static Version version = Version.version("2.0.0-SNAPSHOT");
 
     @Activate
     protected void activate() {
diff --git a/core/net/src/main/java/org/onosproject/event/impl/CoreEventDispatcher.java b/core/net/src/main/java/org/onosproject/event/impl/CoreEventDispatcher.java
index 6d0fa50..8656e71 100644
--- a/core/net/src/main/java/org/onosproject/event/impl/CoreEventDispatcher.java
+++ b/core/net/src/main/java/org/onosproject/event/impl/CoreEventDispatcher.java
@@ -15,19 +15,9 @@
  */
 package org.onosproject.event.impl;
 
-import java.util.Map;
-import java.util.Set;
-import java.util.TimerTask;
-import java.util.concurrent.BlockingQueue;
-import java.util.concurrent.ExecutorService;
-import java.util.concurrent.Future;
-import java.util.concurrent.LinkedBlockingQueue;
-import java.util.concurrent.TimeUnit;
-
-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 com.google.common.base.Stopwatch;
+import com.google.common.collect.ImmutableMap;
+import com.google.common.collect.ImmutableSet;
 import org.onlab.util.SharedExecutors;
 import org.onosproject.event.AbstractEvent;
 import org.onosproject.event.DefaultEventSinkRegistry;
@@ -40,11 +30,19 @@
 import org.onosproject.net.intent.IntentEvent;
 import org.onosproject.net.link.LinkEvent;
 import org.onosproject.net.topology.TopologyEvent;
+import org.osgi.service.component.annotations.Activate;
+import org.osgi.service.component.annotations.Component;
+import org.osgi.service.component.annotations.Deactivate;
 import org.slf4j.Logger;
 
-import com.google.common.base.Stopwatch;
-import com.google.common.collect.ImmutableMap;
-import com.google.common.collect.ImmutableSet;
+import java.util.Map;
+import java.util.Set;
+import java.util.TimerTask;
+import java.util.concurrent.BlockingQueue;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Future;
+import java.util.concurrent.LinkedBlockingQueue;
+import java.util.concurrent.TimeUnit;
 
 import static com.google.common.base.Preconditions.checkArgument;
 import static java.util.concurrent.Executors.newSingleThreadExecutor;
@@ -56,8 +54,7 @@
 /**
  * Simple implementation of an event dispatching service.
  */
-@Component(immediate = true)
-@Service
+@Component(immediate = true, service = EventDeliveryService.class)
 public class CoreEventDispatcher extends DefaultEventSinkRegistry
         implements EventDeliveryService {
 
diff --git a/core/net/src/main/java/org/onosproject/net/OsgiPropertyConstants.java b/core/net/src/main/java/org/onosproject/net/OsgiPropertyConstants.java
new file mode 100644
index 0000000..dd96525
--- /dev/null
+++ b/core/net/src/main/java/org/onosproject/net/OsgiPropertyConstants.java
@@ -0,0 +1,127 @@
+/*
+ * Copyright 2018-present Open Networking Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.onosproject.net;
+
+public final class OsgiPropertyConstants {
+    private OsgiPropertyConstants() {
+    }
+
+    public static final String USE_REGION_FOR_BALANCE_ROLES = "useRegionForBalanceRoles";
+    public static final boolean USE_REGION_FOR_BALANCE_ROLES_DEFAULT = false;
+
+    public static final String REBALANCE_ROLES_ON_UPGRADE = "rebalanceRolesOnUpgrade";
+    public static final boolean REBALANCE_ROLES_ON_UPGRADE_DEFAULT = true;
+
+    public static final String SHARED_THREAD_POOL_SIZE = "sharedThreadPoolSize";
+    public static final int SHARED_THREAD_POOL_SIZE_DEFAULT = 30;
+
+    public static final String MAX_EVENT_TIME_LIMIT = "maxEventTimeLimit";
+    public static final int MAX_EVENT_TIME_LIMIT_DEFAULT = 2000;
+
+    public static final String CALCULATE_PERFORMANCE_CHECK = "sharedThreadPerformanceCheck";
+    public static final boolean CALCULATE_PERFORMANCE_CHECK_DEFAULT = false;
+
+    public static final String ALLOW_EXTRANEOUS_RULES = "allowExtraneousRules";
+    public static final boolean ALLOW_EXTRANEOUS_RULES_DEFAULT = false;
+
+    public static final String PURGE_ON_DISCONNECTION = "purgeOnDisconnection";
+    public static final boolean PURGE_ON_DISCONNECTION_DEFAULT = false;
+
+    public static final String POLL_FREQUENCY = "fallbackFlowPollFrequency";
+    public static final int POLL_FREQUENCY_DEFAULT = 30;
+
+    public static final String FOM_NUM_THREADS = "numThreads";
+    public static final int FOM_NUM_THREADS_DEFAULT = 4;
+
+    public static final String GM_POLL_FREQUENCY = "fallbackGroupPollFrequency";
+    public static final int GM_POLL_FREQUENCY_DEFAULT = 30;
+
+    public static final String GM_PURGE_ON_DISCONNECTION = "purgeOnDisconnection";
+    public static final boolean  GM_PURGE_ON_DISCONNECTION_DEFAULT = false;
+
+    public static final String HM_ALLOW_DUPLICATE_IPS = "allowDuplicateIps";
+    public static final boolean HM_ALLOW_DUPLICATE_IPS_DEFAULT = true;
+
+    public static final String HM_MONITOR_HOSTS = "monitorHosts";
+    public static final boolean HM_MONITOR_HOSTS_DEFAULT = false;
+
+    public static final String HM_PROBE_RATE = "probeRate";
+    public static final long HM_PROBE_RATE_DEFAULT = 30000;
+
+    public static final String HM_GREEDY_LEARNING_IPV6 = "greedyLearningIpv6";
+    public static final boolean HM_GREEDY_LEARNING_IPV6_DEFAULT = false;
+
+    public static final String ICR_USE_FLOW_OBJECTIVES = "useFlowObjectives";
+    public static final boolean ICR_USE_FLOW_OBJECTIVES_DEFAULT = false;
+
+    public static final String ICR_LABEL_SELECTION = "labelSelection";
+    public static final String ICR_LABEL_SELECTION_DEFAULT = "RANDOM";
+
+    public static final String ICR_OPT_LABEL_SELECTION = "optLabelSelection";
+    public static final String ICR_OPT_LABEL_SELECTION_DEFAULT = "NONE";
+
+    public static final String ICR_FLOW_OPTIMIZATION = "optimizeInstructions";
+    public static final boolean ICR_FLOW_OPTIMIZATION_DEFAULT = false;
+
+    public static final String ICR_COPY_TTL = "useCopyTtl";
+    public static final boolean ICR_COPY_TTL_DEFAULT = false;
+
+    public static final String ICU_ENABLED = "enabled";
+    public static final boolean ICU_ENABLED_DEFAULT = true;
+
+    public static final String ICU_PERIOD = "period";
+    public static final int ICU_PERIOD_DEFAULT = 5; //seconds
+
+    public static final String ICU_RETRY_THRESHOLD = "retryThreshold";
+    public static final int ICU_RETRY_THRESHOLD_DEFAULT = 5; //tries
+
+    public static final String NON_DISRUPTIVE_INSTALLATION_WAITING_TIME = "nonDisruptiveInstallationWaitingTime";
+    public static final int NON_DISRUPTIVE_INSTALLATION_WAITING_TIME_DEFAULT = 1;
+
+    public static final String IM_SKIP_RELEASE_RESOURCES_ON_WITHDRAWAL = "skipReleaseResourcesOnWithdrawal";
+    public static final boolean IM_SKIP_RELEASE_RESOURCES_ON_WITHDRAWAL_DEFAULT = false;
+
+    public static final String IM_NUM_THREADS = "numThreads";
+    public static final int IM_NUM_THREADS_DEFAULT = 12;
+
+    public static final String MM_NUM_THREADS = "numThreads";
+    public static final int MM_NUM_THREADS_DEFAULT = 12;
+
+    public static final String MM_FALLBACK_METER_POLL_FREQUENCY = "fallbackMeterPollFrequency";
+    public static final int MM_FALLBACK_METER_POLL_FREQUENCY_DEFAULT = 30;
+
+    public static final String NRM_ARP_ENABLED = "arpEnabled";
+    public static final boolean NRM_ARP_ENABLED_DEFAULT = true;
+
+    public static final String NRM_NDP_ENABLED = "ndpEnabled";
+    public static final boolean NRM_NDP_ENABLED_DEFAULT = false;
+
+    public static final String NRM_REQUEST_INTERCEPTS_ENABLED = "requestInterceptsEnabled";
+    public static final boolean NRM_REQUEST_INTERCEPTS_ENABLED_DEFAULT = true;
+
+    public static final String PWM_PROBE_INTERVAL = "probeInterval";
+    public static final int PWM_PROBE_INTERVAL_DEFAULT = 15;
+
+    public static final String DTP_MAX_EVENTS = "maxEvents";
+    public static final int DTP_MAX_EVENTS_DEFAULT = 1000;
+
+    public static final String DTP_MAX_IDLE_MS = "maxIdleMs";
+    public static final int DTP_MAX_IDLE_MS_DEFAULT = 10;
+
+    public static final String DTP_MAX_BATCH_MS = "maxBatchMs";
+    public static final int DTP_MAX_BATCH_MS_DEFAULT = 50;
+}
diff --git a/core/net/src/main/java/org/onosproject/net/config/impl/BasicNetworkConfigs.java b/core/net/src/main/java/org/onosproject/net/config/impl/BasicNetworkConfigs.java
index 0e2ad0d..f5791de 100644
--- a/core/net/src/main/java/org/onosproject/net/config/impl/BasicNetworkConfigs.java
+++ b/core/net/src/main/java/org/onosproject/net/config/impl/BasicNetworkConfigs.java
@@ -16,15 +16,7 @@
 package org.onosproject.net.config.impl;
 
 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.apache.felix.scr.annotations.Service;
 import org.onosproject.core.CoreService;
-import org.onosproject.net.config.basics.DeviceAnnotationConfig;
-import org.onosproject.net.config.basics.InterfaceConfig;
 import org.onosproject.incubator.net.config.basics.PortDescriptionsConfig;
 import org.onosproject.net.ConnectPoint;
 import org.onosproject.net.DeviceId;
@@ -38,10 +30,17 @@
 import org.onosproject.net.config.basics.BasicLinkConfig;
 import org.onosproject.net.config.basics.BasicRegionConfig;
 import org.onosproject.net.config.basics.BasicUiTopoLayoutConfig;
+import org.onosproject.net.config.basics.DeviceAnnotationConfig;
+import org.onosproject.net.config.basics.InterfaceConfig;
 import org.onosproject.net.config.basics.PortAnnotationConfig;
 import org.onosproject.net.config.basics.SubjectFactories;
 import org.onosproject.net.region.RegionId;
 import org.onosproject.ui.model.topo.UiTopoLayoutId;
+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;
 
@@ -57,8 +56,7 @@
 /**
  * Component for registration of builtin basic network configurations.
  */
-@Service
-@Component(immediate = true)
+@Component(immediate = true, service = BasicNetworkConfigService.class)
 public class BasicNetworkConfigs implements BasicNetworkConfigService {
 
     private static final String BASIC = "basic";
@@ -144,10 +142,10 @@
 
     );
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected CoreService coreService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected NetworkConfigRegistry registry;
 
     @Activate
diff --git a/core/net/src/main/java/org/onosproject/net/config/impl/DeviceInjectionConfigMonitor.java b/core/net/src/main/java/org/onosproject/net/config/impl/DeviceInjectionConfigMonitor.java
index 5277075..0b593bd 100644
--- a/core/net/src/main/java/org/onosproject/net/config/impl/DeviceInjectionConfigMonitor.java
+++ b/core/net/src/main/java/org/onosproject/net/config/impl/DeviceInjectionConfigMonitor.java
@@ -15,26 +15,9 @@
  */
 package org.onosproject.net.config.impl;
 
-import static java.util.concurrent.Executors.newSingleThreadExecutor;
-import static org.onlab.util.Tools.groupedThreads;
-import static org.onosproject.net.PortNumber.portNumber;
-import static org.onosproject.net.config.basics.SubjectFactories.DEVICE_SUBJECT_FACTORY;
-import static org.slf4j.LoggerFactory.getLogger;
-
-import java.util.ArrayList;
-import java.util.EnumSet;
-import java.util.List;
-import java.util.Optional;
-import java.util.Set;
-import java.util.concurrent.ExecutorService;
-import java.util.concurrent.TimeUnit;
-
-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.annotations.Beta;
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableSet;
 import org.onlab.packet.ChassisId;
 import org.onosproject.net.Device.Type;
 import org.onosproject.net.DeviceId;
@@ -59,11 +42,26 @@
 import org.onosproject.net.driver.DefaultDriverHandler;
 import org.onosproject.net.driver.DriverService;
 import org.onosproject.net.provider.ProviderId;
+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.annotations.Beta;
-import com.google.common.collect.ImmutableList;
-import com.google.common.collect.ImmutableSet;
+import java.util.ArrayList;
+import java.util.EnumSet;
+import java.util.List;
+import java.util.Optional;
+import java.util.Set;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.TimeUnit;
+
+import static java.util.concurrent.Executors.newSingleThreadExecutor;
+import static org.onlab.util.Tools.groupedThreads;
+import static org.onosproject.net.PortNumber.portNumber;
+import static org.onosproject.net.config.basics.SubjectFactories.DEVICE_SUBJECT_FACTORY;
+import static org.slf4j.LoggerFactory.getLogger;
 
 // TODO In theory just @Component should be sufficient,
 //      but won't work without @Service. Need investigation.
@@ -71,27 +69,26 @@
  * Component to monitor DeviceInjectionConfig changes.
  */
 @Beta
-@Service(value = DeviceInjectionConfigMonitor.class)
-@Component(immediate = true)
+@Component(immediate = true, service = DeviceInjectionConfigMonitor.class)
 public class DeviceInjectionConfigMonitor {
 
     private final Logger log = getLogger(getClass());
 
     private final ProviderId pid = new ProviderId("inject", "org.onosproject.inject");
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected NetworkConfigService netcfgService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected DeviceService deviceService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected DeviceProviderRegistry deviceProviderRegistry;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected DriverService driverService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected NetworkConfigRegistry netcfgRegistry;
 
     private final List<ConfigFactory<?, ?>> factories = ImmutableList.of(
diff --git a/core/net/src/main/java/org/onosproject/net/config/impl/NetworkConfigLoader.java b/core/net/src/main/java/org/onosproject/net/config/impl/NetworkConfigLoader.java
index 43f5ff4..317a4b4 100644
--- a/core/net/src/main/java/org/onosproject/net/config/impl/NetworkConfigLoader.java
+++ b/core/net/src/main/java/org/onosproject/net/config/impl/NetworkConfigLoader.java
@@ -19,11 +19,11 @@
 import com.fasterxml.jackson.databind.ObjectMapper;
 import com.fasterxml.jackson.databind.node.ObjectNode;
 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.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.onosproject.net.config.BasicNetworkConfigService;
 import org.onosproject.net.config.Config;
 import org.onosproject.net.config.NetworkConfigEvent;
@@ -49,10 +49,10 @@
 
     // Dependency to ensure the basic subject factories are properly initialized
     // before we start loading configs from file
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected BasicNetworkConfigService basicConfigs;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected NetworkConfigService networkConfigService;
 
     // FIXME: Add mutual exclusion to make sure this happens only once per startup.
diff --git a/core/net/src/main/java/org/onosproject/net/config/impl/NetworkConfigManager.java b/core/net/src/main/java/org/onosproject/net/config/impl/NetworkConfigManager.java
index f6d9b51..990f43c 100644
--- a/core/net/src/main/java/org/onosproject/net/config/impl/NetworkConfigManager.java
+++ b/core/net/src/main/java/org/onosproject/net/config/impl/NetworkConfigManager.java
@@ -18,12 +18,6 @@
 import com.fasterxml.jackson.databind.JsonNode;
 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.onosproject.cluster.ClusterService;
 import org.onosproject.event.AbstractListenerManager;
 import org.onosproject.net.config.Config;
@@ -35,6 +29,11 @@
 import org.onosproject.net.config.NetworkConfigStore;
 import org.onosproject.net.config.NetworkConfigStoreDelegate;
 import org.onosproject.net.config.SubjectFactory;
+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;
 
@@ -44,13 +43,13 @@
 
 import static com.google.common.base.Preconditions.checkNotNull;
 import static org.onosproject.security.AppGuard.checkPermission;
-import static org.onosproject.security.AppPermission.Type.*;
+import static org.onosproject.security.AppPermission.Type.CONFIG_READ;
+import static org.onosproject.security.AppPermission.Type.CONFIG_WRITE;
 
 /**
  * Implementation of the network configuration subsystem.
  */
-@Component(immediate = true)
-@Service
+@Component(immediate = true, service = { NetworkConfigRegistry.class, NetworkConfigService.class })
 public class NetworkConfigManager
         extends AbstractListenerManager<NetworkConfigEvent, NetworkConfigListener>
         implements NetworkConfigRegistry, NetworkConfigService {
@@ -76,10 +75,10 @@
 
     private final NetworkConfigStoreDelegate storeDelegate = new InternalStoreDelegate();
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected NetworkConfigStore store;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected ClusterService clusterService;
 
 
diff --git a/core/net/src/main/java/org/onosproject/net/device/impl/DeviceManager.java b/core/net/src/main/java/org/onosproject/net/device/impl/DeviceManager.java
index 2161f7d..4caf74e 100644
--- a/core/net/src/main/java/org/onosproject/net/device/impl/DeviceManager.java
+++ b/core/net/src/main/java/org/onosproject/net/device/impl/DeviceManager.java
@@ -19,12 +19,6 @@
 import com.google.common.collect.Lists;
 import com.google.common.collect.Maps;
 import com.google.common.collect.Multimap;
-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.KryoNamespace;
 import org.onlab.util.Tools;
 import org.onosproject.cluster.ClusterService;
@@ -74,6 +68,11 @@
 import org.onosproject.store.serializers.KryoNamespaces;
 import org.onosproject.store.service.Serializer;
 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.Reference;
+import org.osgi.service.component.annotations.ReferenceCardinality;
 import org.slf4j.Logger;
 
 import java.time.Instant;
@@ -110,8 +109,9 @@
 /**
  * Provides implementation of the device SB &amp; NB APIs.
  */
-@Component(immediate = true)
-@Service
+@Component(immediate = true,
+           service = {DeviceService.class, DeviceAdminService.class,
+                      DeviceProviderRegistry.class, PortConfigOperatorRegistry.class })
 public class DeviceManager
         extends AbstractListenerProviderRegistry<DeviceEvent, DeviceListener, DeviceProvider, DeviceProviderService>
         implements DeviceService, DeviceAdminService, DeviceProviderRegistry, PortConfigOperatorRegistry {
@@ -134,25 +134,25 @@
 
     private final NetworkConfigListener networkConfigListener = new InternalNetworkConfigListener();
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected DeviceStore store;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected ClusterService clusterService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected MastershipService mastershipService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected MastershipTermService termService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected UpgradeService upgradeService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected NetworkConfigService networkConfigService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected ClusterCommunicationService communicationService;
 
     private ExecutorService portReqeustExecutor;
diff --git a/core/net/src/main/java/org/onosproject/net/domain/impl/DomainIntentManager.java b/core/net/src/main/java/org/onosproject/net/domain/impl/DomainIntentManager.java
index 18ff3f7..a77a53d 100644
--- a/core/net/src/main/java/org/onosproject/net/domain/impl/DomainIntentManager.java
+++ b/core/net/src/main/java/org/onosproject/net/domain/impl/DomainIntentManager.java
@@ -18,12 +18,6 @@
 
 import com.google.common.collect.Lists;
 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.ItemNotFoundException;
 import org.onosproject.net.DeviceId;
 import org.onosproject.net.behaviour.DomainIntentConfigurable;
@@ -34,6 +28,11 @@
 import org.onosproject.net.domain.DomainIntentService;
 import org.onosproject.net.driver.DriverHandler;
 import org.onosproject.net.driver.DriverService;
+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;
 
@@ -52,16 +51,15 @@
 /**
  * {@link DomainIntentService} implementation class.
  */
-@Component(immediate = true)
-@Service
+@Component(immediate = true, service = DomainIntentService.class)
 public class DomainIntentManager implements DomainIntentService {
 
     private final Logger log = LoggerFactory.getLogger(getClass());
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected DeviceService deviceService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected DriverService driverService;
 
     private ExecutorService executorService =
diff --git a/core/net/src/main/java/org/onosproject/net/domain/impl/DomainManager.java b/core/net/src/main/java/org/onosproject/net/domain/impl/DomainManager.java
index 8f0db20..753badc 100644
--- a/core/net/src/main/java/org/onosproject/net/domain/impl/DomainManager.java
+++ b/core/net/src/main/java/org/onosproject/net/domain/impl/DomainManager.java
@@ -16,17 +16,16 @@
 
 package org.onosproject.net.domain.impl;
 
-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.net.Device;
 import org.onosproject.net.DeviceId;
 import org.onosproject.net.device.DeviceService;
 import org.onosproject.net.domain.DomainId;
 import org.onosproject.net.domain.DomainService;
+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;
 
@@ -39,14 +38,13 @@
 /**
  * Exposes domain topology elements and listen for updates of such elements.
  */
-@Component(immediate = true)
-@Service
+@Component(immediate = true, service = DomainService.class)
 public class DomainManager implements DomainService {
 
     private static final String DOMAIN_ID = "domainId";
     private static final String LOCAL_DOMAIN = "local";
     private final Logger log = LoggerFactory.getLogger(getClass());
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected DeviceService deviceService;
 
     @Activate
diff --git a/core/net/src/main/java/org/onosproject/net/driver/impl/DriverManager.java b/core/net/src/main/java/org/onosproject/net/driver/impl/DriverManager.java
index f098c75..8990822 100644
--- a/core/net/src/main/java/org/onosproject/net/driver/impl/DriverManager.java
+++ b/core/net/src/main/java/org/onosproject/net/driver/impl/DriverManager.java
@@ -15,12 +15,6 @@
  */
 package org.onosproject.net.driver.impl;
 
-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.ItemNotFoundException;
 import org.onosproject.net.AbstractProjectableModel;
 import org.onosproject.net.Device;
@@ -38,6 +32,11 @@
 import org.onosproject.net.driver.DriverService;
 import org.onosproject.net.pi.model.PiPipeconfId;
 import org.onosproject.net.pi.service.PiPipeconfService;
+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;
 
@@ -53,10 +52,10 @@
 /**
  * Manages inventory of device drivers.
  */
-@Service
+
 // Not enabled by default to allow the DriverRegistryManager to enable it only
 // when all the required drivers are available.
-@Component(immediate = true, enabled = false)
+@Component(immediate = true, enabled = false, service = DriverService.class)
 public class DriverManager implements DriverService {
 
     private final Logger log = LoggerFactory.getLogger(getClass());
@@ -64,16 +63,16 @@
     private static final String NO_DRIVER = "Driver not found";
     private static final String NO_DEVICE = "Device not found";
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected DriverRegistry registry;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected DeviceService deviceService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected NetworkConfigService networkConfigService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected PiPipeconfService pipeconfService;
 
     @Activate
diff --git a/core/net/src/main/java/org/onosproject/net/driver/impl/DriverRegistryManager.java b/core/net/src/main/java/org/onosproject/net/driver/impl/DriverRegistryManager.java
index fbb21ec..02df30e 100644
--- a/core/net/src/main/java/org/onosproject/net/driver/impl/DriverRegistryManager.java
+++ b/core/net/src/main/java/org/onosproject/net/driver/impl/DriverRegistryManager.java
@@ -18,14 +18,13 @@
 import com.google.common.collect.ImmutableSet;
 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.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.onosproject.net.driver.DriverRegistry;
+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.onosproject.cfg.ComponentConfigService;
 import org.onosproject.component.ComponentService;
 import org.onosproject.event.EventDeliveryService;
@@ -39,6 +38,7 @@
 import org.onosproject.net.driver.DriverListener;
 import org.onosproject.net.driver.DriverProvider;
 import org.osgi.service.component.ComponentContext;
+//import org.osgi.service.metatype.annotations.AttributeDefinition;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -60,8 +60,7 @@
 /**
  * Manages inventory of device drivers.
  */
-@Service
-@Component(immediate = true, enabled = true)
+@Component(immediate = true, enabled = true, service = {DriverAdminService.class, DriverRegistry.class})
 public class DriverRegistryManager extends DefaultDriverProvider implements DriverAdminService {
 
     private static final String DRIVER_COMPONENT = "org.onosproject.net.driver.impl.DriverManager";
@@ -73,22 +72,26 @@
     private static final String NO_DRIVER = "Driver not found";
     private static final String DEFAULT = "default";
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected DeviceService deviceService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected ComponentConfigService componentConfigService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected ComponentService componenService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected EventDeliveryService eventDispatcher;
 
     private static final String DEFAULT_REQUIRED_DRIVERS = "default";
-    @Property(name = "requiredDrivers", value = DEFAULT_REQUIRED_DRIVERS,
-            label = "Comma-separated list of drivers that must be registered before starting driver subsystem")
-    private String requiredDrivers = DEFAULT_REQUIRED_DRIVERS;
+    private static String requiredDrivers = DEFAULT_REQUIRED_DRIVERS;
+    //@AttributeDefinition(name = "requiredDrivers",
+    //        defaultValue = DEFAULT_REQUIRED_DRIVERS + "AAA",
+    //        description = "Comma-separated list of drivers that must be registered before starting driver subsystem")
+    private String requiredDrivers() {
+        return requiredDrivers;
+    }
     private Set<String> requiredDriverSet;
 
     private Set<DriverProvider> providers = Sets.newConcurrentHashSet();
diff --git a/core/net/src/main/java/org/onosproject/net/edgeservice/impl/EdgeManager.java b/core/net/src/main/java/org/onosproject/net/edgeservice/impl/EdgeManager.java
index 3a825f0..9411a63 100644
--- a/core/net/src/main/java/org/onosproject/net/edgeservice/impl/EdgeManager.java
+++ b/core/net/src/main/java/org/onosproject/net/edgeservice/impl/EdgeManager.java
@@ -20,12 +20,6 @@
 import com.google.common.collect.ImmutableSet;
 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.event.AbstractListenerManager;
 import org.onosproject.net.ConnectPoint;
 import org.onosproject.net.DeviceId;
@@ -44,6 +38,11 @@
 import org.onosproject.net.packet.DefaultOutboundPacket;
 import org.onosproject.net.packet.OutboundPacket;
 import org.onosproject.net.packet.PacketService;
+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.nio.ByteBuffer;
@@ -66,8 +65,7 @@
 /**
  * This is an implementation of the edge net service.
  */
-@Component(immediate = true)
-@Service
+@Component(immediate = true, service = EdgePortService.class)
 public class EdgeManager
         extends AbstractListenerManager<EdgePortEvent, EdgePortListener>
         implements EdgePortService {
@@ -80,13 +78,13 @@
     private final DeviceListener deviceListener = new InnerDeviceListener();
     private final LinkListener linkListener = new InnerLinkListener();
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected PacketService packetService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected DeviceService deviceService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected LinkService linkService;
 
     @Activate
diff --git a/core/net/src/main/java/org/onosproject/net/flow/impl/FlowRuleManager.java b/core/net/src/main/java/org/onosproject/net/flow/impl/FlowRuleManager.java
index 56a54e4..1af7c82 100644
--- a/core/net/src/main/java/org/onosproject/net/flow/impl/FlowRuleManager.java
+++ b/core/net/src/main/java/org/onosproject/net/flow/impl/FlowRuleManager.java
@@ -21,14 +21,6 @@
 import com.google.common.collect.Maps;
 import com.google.common.collect.Multimap;
 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.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.util.Tools;
 import org.onosproject.cfg.ComponentConfigService;
 import org.onosproject.core.ApplicationId;
@@ -45,10 +37,6 @@
 import org.onosproject.net.flow.DefaultFlowEntry;
 import org.onosproject.net.flow.FlowEntry;
 import org.onosproject.net.flow.FlowRule;
-import org.onosproject.net.flow.oldbatch.FlowRuleBatchEntry;
-import org.onosproject.net.flow.oldbatch.FlowRuleBatchEvent;
-import org.onosproject.net.flow.oldbatch.FlowRuleBatchOperation;
-import org.onosproject.net.flow.oldbatch.FlowRuleBatchRequest;
 import org.onosproject.net.flow.FlowRuleEvent;
 import org.onosproject.net.flow.FlowRuleListener;
 import org.onosproject.net.flow.FlowRuleOperation;
@@ -61,10 +49,20 @@
 import org.onosproject.net.flow.FlowRuleStore;
 import org.onosproject.net.flow.FlowRuleStoreDelegate;
 import org.onosproject.net.flow.TableStatisticsEntry;
+import org.onosproject.net.flow.oldbatch.FlowRuleBatchEntry;
+import org.onosproject.net.flow.oldbatch.FlowRuleBatchEvent;
+import org.onosproject.net.flow.oldbatch.FlowRuleBatchOperation;
+import org.onosproject.net.flow.oldbatch.FlowRuleBatchRequest;
 import org.onosproject.net.provider.AbstractListenerProviderRegistry;
 import org.onosproject.net.provider.AbstractProviderService;
 import org.onosproject.net.provider.ProviderId;
 import org.osgi.service.component.ComponentContext;
+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.Collections;
@@ -82,6 +80,12 @@
 import static com.google.common.base.Strings.isNullOrEmpty;
 import static org.onlab.util.Tools.get;
 import static org.onlab.util.Tools.groupedThreads;
+import static org.onosproject.net.OsgiPropertyConstants.ALLOW_EXTRANEOUS_RULES;
+import static org.onosproject.net.OsgiPropertyConstants.ALLOW_EXTRANEOUS_RULES_DEFAULT;
+import static org.onosproject.net.OsgiPropertyConstants.POLL_FREQUENCY;
+import static org.onosproject.net.OsgiPropertyConstants.POLL_FREQUENCY_DEFAULT;
+import static org.onosproject.net.OsgiPropertyConstants.PURGE_ON_DISCONNECTION;
+import static org.onosproject.net.OsgiPropertyConstants.PURGE_ON_DISCONNECTION_DEFAULT;
 import static org.onosproject.net.flow.FlowRuleEvent.Type.RULE_ADD_REQUESTED;
 import static org.onosproject.net.flow.FlowRuleEvent.Type.RULE_REMOVE_REQUESTED;
 import static org.onosproject.security.AppGuard.checkPermission;
@@ -92,8 +96,18 @@
 /**
  * Provides implementation of the flow NB &amp; SB APIs.
  */
-@Component(immediate = true)
-@Service
+@Component(
+    immediate = true,
+    service = {
+        FlowRuleService.class,
+        FlowRuleProviderRegistry.class
+    },
+    property = {
+        ALLOW_EXTRANEOUS_RULES + ":Boolean=" + ALLOW_EXTRANEOUS_RULES_DEFAULT,
+        PURGE_ON_DISCONNECTION + ":Boolean=" + PURGE_ON_DISCONNECTION_DEFAULT,
+        POLL_FREQUENCY + ":Integer=" + POLL_FREQUENCY_DEFAULT
+    }
+)
 public class FlowRuleManager
         extends AbstractListenerProviderRegistry<FlowRuleEvent, FlowRuleListener,
                                                  FlowRuleProvider, FlowRuleProviderService>
@@ -103,20 +117,15 @@
 
     private static final String DEVICE_ID_NULL = "Device ID cannot be null";
     private static final String FLOW_RULE_NULL = "FlowRule cannot be null";
-    private static final boolean ALLOW_EXTRANEOUS_RULES = false;
 
-    @Property(name = "allowExtraneousRules", boolValue = ALLOW_EXTRANEOUS_RULES,
-            label = "Allow flow rules in switch not installed by ONOS")
-    private boolean allowExtraneousRules = ALLOW_EXTRANEOUS_RULES;
+    /** Allow flow rules in switch not installed by ONOS. */
+    private boolean allowExtraneousRules = ALLOW_EXTRANEOUS_RULES_DEFAULT;
 
-    @Property(name = "purgeOnDisconnection", boolValue = false,
-            label = "Purge entries associated with a device when the device goes offline")
-    private boolean purgeOnDisconnection = false;
+    /** Purge entries associated with a device when the device goes offline. */
+    private boolean purgeOnDisconnection = PURGE_ON_DISCONNECTION_DEFAULT;
 
-    private static final int DEFAULT_POLL_FREQUENCY = 30;
-    @Property(name = "fallbackFlowPollFrequency", intValue = DEFAULT_POLL_FREQUENCY,
-            label = "Frequency (in seconds) for polling flow statistics via fallback provider")
-    private int fallbackFlowPollFrequency = DEFAULT_POLL_FREQUENCY;
+    /** Frequency (in seconds) for polling flow statistics via fallback provider. */
+    private int fallbackFlowPollFrequency = POLL_FREQUENCY_DEFAULT;
 
     private final FlowRuleStoreDelegate delegate = new InternalStoreDelegate();
     private final DeviceListener deviceListener = new InternalDeviceListener();
@@ -133,22 +142,22 @@
 
     private final Map<Long, FlowOperationsProcessor> pendingFlowOperations = new ConcurrentHashMap<>();
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected FlowRuleStore store;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected DeviceService deviceService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected CoreService coreService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected MastershipService mastershipService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected ComponentConfigService cfgService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected DriverService driverService;
 
     @Activate
@@ -197,7 +206,7 @@
         Dictionary<?, ?> properties = context.getProperties();
         Boolean flag;
 
-        flag = Tools.isPropertyEnabled(properties, "allowExtraneousRules");
+        flag = Tools.isPropertyEnabled(properties, ALLOW_EXTRANEOUS_RULES);
         if (flag == null) {
             log.info("AllowExtraneousRules is not configured, " +
                     "using current value of {}", allowExtraneousRules);
@@ -207,7 +216,7 @@
                     allowExtraneousRules ? "enabled" : "disabled");
         }
 
-        flag = Tools.isPropertyEnabled(properties, "purgeOnDisconnection");
+        flag = Tools.isPropertyEnabled(properties, PURGE_ON_DISCONNECTION);
         if (flag == null) {
             log.info("PurgeOnDisconnection is not configured, " +
                     "using current value of {}", purgeOnDisconnection);
@@ -217,7 +226,7 @@
                     purgeOnDisconnection ? "enabled" : "disabled");
         }
 
-        String s = get(properties, "fallbackFlowPollFrequency");
+        String s = get(properties, POLL_FREQUENCY);
         if (isNullOrEmpty(s)) {
             log.info("fallbackFlowPollFrequency is not configured, " +
                              "using current value of {} seconds",
diff --git a/core/net/src/main/java/org/onosproject/net/flowobjective/impl/FlowObjectiveManager.java b/core/net/src/main/java/org/onosproject/net/flowobjective/impl/FlowObjectiveManager.java
index 4567415..58cb215 100644
--- a/core/net/src/main/java/org/onosproject/net/flowobjective/impl/FlowObjectiveManager.java
+++ b/core/net/src/main/java/org/onosproject/net/flowobjective/impl/FlowObjectiveManager.java
@@ -19,14 +19,6 @@
 import com.google.common.collect.Lists;
 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.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.osgi.DefaultServiceDirectory;
 import org.onlab.osgi.ServiceDirectory;
 import org.onlab.util.ItemNotFoundException;
@@ -59,6 +51,12 @@
 import org.onosproject.net.flowobjective.ObjectiveEvent.Type;
 import org.onosproject.net.group.GroupService;
 import org.osgi.service.component.ComponentContext;
+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 org.slf4j.LoggerFactory;
 
@@ -74,14 +72,21 @@
 import static java.util.concurrent.Executors.newFixedThreadPool;
 import static org.onlab.util.Tools.groupedThreads;
 import static org.onosproject.net.AnnotationKeys.DRIVER;
+import static org.onosproject.net.OsgiPropertyConstants.FOM_NUM_THREADS;
+import static org.onosproject.net.OsgiPropertyConstants.FOM_NUM_THREADS_DEFAULT;
 import static org.onosproject.security.AppGuard.checkPermission;
 import static org.onosproject.security.AppPermission.Type.FLOWRULE_WRITE;
 
 /**
  * Provides implementation of the flow objective programming service.
  */
-@Component(enabled = false)
-@Service
+@Component(
+    enabled = false,
+    service = FlowObjectiveService.class,
+    property = {
+        FOM_NUM_THREADS + ":Integer=" + FOM_NUM_THREADS_DEFAULT
+    }
+)
 public class FlowObjectiveManager implements FlowObjectiveService {
 
     private static final int INSTALL_RETRY_ATTEMPTS = 5;
@@ -93,36 +98,33 @@
 
     private final Logger log = LoggerFactory.getLogger(getClass());
 
-    private static final int DEFAULT_NUM_THREADS = 4;
-    @Property(name = NUM_THREAD,
-             intValue = DEFAULT_NUM_THREADS,
-             label = "Number of worker threads")
-    private int numThreads = DEFAULT_NUM_THREADS;
+    /** Number of worker threads. */
+    private int numThreads = FOM_NUM_THREADS_DEFAULT;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected DriverService driverService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected DeviceService deviceService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected ClusterService clusterService;
 
     // Note: The following dependencies are added on behalf of the pipeline
     // driver behaviours to assure these services are available for their
     // initialization.
     @SuppressWarnings("unused")
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected FlowRuleService flowRuleService;
 
     @SuppressWarnings("unused")
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected GroupService groupService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected FlowObjectiveStore flowObjectiveStore;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected ComponentConfigService cfgService;
 
     final FlowObjectiveStoreDelegate delegate = new InternalStoreDelegate();
diff --git a/core/net/src/main/java/org/onosproject/net/flowobjective/impl/InOrderFlowObjectiveManager.java b/core/net/src/main/java/org/onosproject/net/flowobjective/impl/InOrderFlowObjectiveManager.java
index 7ded0f5..a90f84c 100644
--- a/core/net/src/main/java/org/onosproject/net/flowobjective/impl/InOrderFlowObjectiveManager.java
+++ b/core/net/src/main/java/org/onosproject/net/flowobjective/impl/InOrderFlowObjectiveManager.java
@@ -22,15 +22,12 @@
 import com.google.common.collect.ArrayListMultimap;
 import com.google.common.collect.ListMultimap;
 import com.google.common.collect.Multimaps;
-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.util.Tools;
 import org.onlab.util.Tools.LogLevel;
 import org.onosproject.net.DeviceId;
 import org.onosproject.net.flowobjective.FilteringObjQueueKey;
 import org.onosproject.net.flowobjective.FilteringObjective;
+import org.onosproject.net.flowobjective.FlowObjectiveService;
 import org.onosproject.net.flowobjective.FlowObjectiveStoreDelegate;
 import org.onosproject.net.flowobjective.ForwardingObjQueueKey;
 import org.onosproject.net.flowobjective.ForwardingObjective;
@@ -40,6 +37,9 @@
 import org.onosproject.net.flowobjective.ObjectiveContext;
 import org.onosproject.net.flowobjective.ObjectiveError;
 import org.onosproject.net.flowobjective.ObjectiveEvent;
+import org.osgi.service.component.annotations.Activate;
+import org.osgi.service.component.annotations.Component;
+import org.osgi.service.component.annotations.Deactivate;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -53,8 +53,7 @@
 import static java.util.concurrent.Executors.newSingleThreadScheduledExecutor;
 import static org.onlab.util.Tools.groupedThreads;
 
-@Component(immediate = true, enabled = true)
-@Service
+@Component(immediate = true, service = FlowObjectiveService.class)
 public class InOrderFlowObjectiveManager extends FlowObjectiveManager {
     private final Logger log = LoggerFactory.getLogger(getClass());
 
diff --git a/core/net/src/main/java/org/onosproject/net/flowobjective/impl/composition/FlowObjectiveCompositionManager.java b/core/net/src/main/java/org/onosproject/net/flowobjective/impl/composition/FlowObjectiveCompositionManager.java
index 21f8ddc..e09f8a1 100644
--- a/core/net/src/main/java/org/onosproject/net/flowobjective/impl/composition/FlowObjectiveCompositionManager.java
+++ b/core/net/src/main/java/org/onosproject/net/flowobjective/impl/composition/FlowObjectiveCompositionManager.java
@@ -18,11 +18,6 @@
 import com.google.common.collect.ImmutableList;
 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.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.osgi.DefaultServiceDirectory;
 import org.onlab.osgi.ServiceDirectory;
 import org.onlab.util.ItemNotFoundException;
@@ -51,6 +46,10 @@
 import org.onosproject.net.flowobjective.ObjectiveError;
 import org.onosproject.net.flowobjective.ObjectiveEvent;
 import org.onosproject.net.group.GroupService;
+import org.osgi.service.component.annotations.Activate;
+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;
 
@@ -79,7 +78,6 @@
  * This comment will be removed when a distributed implementation is available.
  */
 //@Component(immediate = true, enabled = false)
-@Service
 public class FlowObjectiveCompositionManager implements FlowObjectiveService {
 
     public enum PolicyOperator {
@@ -94,28 +92,28 @@
 
     private final Logger log = LoggerFactory.getLogger(getClass());
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected DriverService driverService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected DeviceService deviceService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected MastershipService mastershipService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected ClusterService clusterService;
 
     // Note: The following dependencies are added on behalf of the pipeline
     // driver behaviours to assure these services are available for their
     // initialization.
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected FlowRuleService flowRuleService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected GroupService groupService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected FlowObjectiveStore flowObjectiveStore;
 
     private final FlowObjectiveStoreDelegate delegate = new InternalStoreDelegate();
diff --git a/core/net/src/main/java/org/onosproject/net/group/impl/GroupManager.java b/core/net/src/main/java/org/onosproject/net/group/impl/GroupManager.java
index 06ce6ac..8853585 100644
--- a/core/net/src/main/java/org/onosproject/net/group/impl/GroupManager.java
+++ b/core/net/src/main/java/org/onosproject/net/group/impl/GroupManager.java
@@ -15,14 +15,6 @@
  */
 package org.onosproject.net.group.impl;
 
-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.util.Tools;
 import org.onosproject.cfg.ComponentConfigService;
 import org.onosproject.core.ApplicationId;
@@ -50,6 +42,12 @@
 import org.onosproject.net.provider.AbstractListenerProviderRegistry;
 import org.onosproject.net.provider.AbstractProviderService;
 import org.osgi.service.component.ComponentContext;
+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.Collection;
@@ -61,6 +59,7 @@
 import static com.google.common.base.Strings.isNullOrEmpty;
 import static org.onlab.util.Tools.get;
 import static org.onlab.util.Tools.groupedThreads;
+import static org.onosproject.net.OsgiPropertyConstants.*;
 import static org.onosproject.security.AppGuard.checkPermission;
 import static org.onosproject.security.AppPermission.Type.GROUP_READ;
 import static org.onosproject.security.AppPermission.Type.GROUP_WRITE;
@@ -69,8 +68,17 @@
 /**
  * Provides implementation of the group service APIs.
  */
-@Component(immediate = true)
-@Service
+@Component(
+        immediate = true,
+        service = {
+            GroupService.class,
+            GroupProviderRegistry.class
+        },
+        property = {
+            GM_POLL_FREQUENCY + ":Integer=" + GM_POLL_FREQUENCY_DEFAULT,
+            GM_PURGE_ON_DISCONNECTION + ":Boolean=" + GM_PURGE_ON_DISCONNECTION_DEFAULT
+        }
+)
 public class GroupManager
         extends AbstractListenerProviderRegistry<GroupEvent, GroupListener,
         GroupProvider, GroupProviderService>
@@ -85,30 +93,27 @@
 
     private ExecutorService eventExecutor;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected GroupStore store;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected DeviceService deviceService;
 
     // Reference the DriverService to ensure the service is bound prior to initialization of the GroupDriverProvider
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected DriverService driverService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected ComponentConfigService cfgService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected MastershipService mastershipService;
 
-    private static final int DEFAULT_POLL_FREQUENCY = 30;
-    @Property(name = "fallbackGroupPollFrequency", intValue = DEFAULT_POLL_FREQUENCY,
-            label = "Frequency (in seconds) for polling groups via fallback provider")
-    private int fallbackGroupPollFrequency = DEFAULT_POLL_FREQUENCY;
+    /** Frequency (in seconds) for polling groups via fallback provider. */
+    private int fallbackGroupPollFrequency = GM_POLL_FREQUENCY_DEFAULT;
 
-    @Property(name = "purgeOnDisconnection", boolValue = false,
-            label = "Purge entries associated with a device when the device goes offline")
-    private boolean purgeOnDisconnection = false;
+    /** Purge entries associated with a device when the device goes offline. */
+    private boolean purgeOnDisconnection = GM_PURGE_ON_DISCONNECTION_DEFAULT;
 
 
     @Activate
@@ -156,7 +161,7 @@
         Dictionary<?, ?> properties = context.getProperties();
         Boolean flag;
 
-        flag = Tools.isPropertyEnabled(properties, "purgeOnDisconnection");
+        flag = Tools.isPropertyEnabled(properties, GM_PURGE_ON_DISCONNECTION);
         if (flag == null) {
             log.info("PurgeOnDisconnection is not configured, " +
                     "using current value of {}", purgeOnDisconnection);
@@ -165,11 +170,11 @@
             log.info("Configured. PurgeOnDisconnection is {}",
                     purgeOnDisconnection ? "enabled" : "disabled");
         }
-        String s = get(properties, "fallbackGroupPollFrequency");
+        String s = get(properties, GM_POLL_FREQUENCY);
         try {
-            fallbackGroupPollFrequency = isNullOrEmpty(s) ? DEFAULT_POLL_FREQUENCY : Integer.parseInt(s);
+            fallbackGroupPollFrequency = isNullOrEmpty(s) ? GM_POLL_FREQUENCY_DEFAULT : Integer.parseInt(s);
         } catch (NumberFormatException e) {
-            fallbackGroupPollFrequency = DEFAULT_POLL_FREQUENCY;
+            fallbackGroupPollFrequency = GM_POLL_FREQUENCY_DEFAULT;
         }
     }
 
diff --git a/core/net/src/main/java/org/onosproject/net/host/impl/HostManager.java b/core/net/src/main/java/org/onosproject/net/host/impl/HostManager.java
index 6cb1cb6..1136951 100644
--- a/core/net/src/main/java/org/onosproject/net/host/impl/HostManager.java
+++ b/core/net/src/main/java/org/onosproject/net/host/impl/HostManager.java
@@ -15,34 +15,23 @@
  */
 package org.onosproject.net.host.impl;
 
-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.packet.Ip6Address;
 import org.onlab.packet.IpAddress;
 import org.onlab.packet.MacAddress;
 import org.onlab.packet.VlanId;
 import org.onlab.util.Tools;
 import org.onosproject.cfg.ComponentConfigService;
-import org.onosproject.net.intf.Interface;
-import org.onosproject.net.intf.InterfaceService;
-import org.onosproject.net.HostLocation;
-import org.onosproject.net.edge.EdgePortService;
-import org.onosproject.net.provider.AbstractListenerProviderRegistry;
-import org.onosproject.net.config.NetworkConfigEvent;
-import org.onosproject.net.config.NetworkConfigListener;
-import org.onosproject.net.config.NetworkConfigService;
-import org.onosproject.net.config.basics.BasicHostConfig;
 import org.onosproject.net.ConnectPoint;
 import org.onosproject.net.DeviceId;
 import org.onosproject.net.Host;
 import org.onosproject.net.HostId;
+import org.onosproject.net.HostLocation;
+import org.onosproject.net.config.NetworkConfigEvent;
+import org.onosproject.net.config.NetworkConfigListener;
+import org.onosproject.net.config.NetworkConfigService;
+import org.onosproject.net.config.basics.BasicHostConfig;
 import org.onosproject.net.device.DeviceService;
+import org.onosproject.net.edge.EdgePortService;
 import org.onosproject.net.host.HostAdminService;
 import org.onosproject.net.host.HostDescription;
 import org.onosproject.net.host.HostEvent;
@@ -53,9 +42,18 @@
 import org.onosproject.net.host.HostService;
 import org.onosproject.net.host.HostStore;
 import org.onosproject.net.host.HostStoreDelegate;
+import org.onosproject.net.intf.Interface;
+import org.onosproject.net.intf.InterfaceService;
 import org.onosproject.net.packet.PacketService;
+import org.onosproject.net.provider.AbstractListenerProviderRegistry;
 import org.onosproject.net.provider.AbstractProviderService;
 import org.osgi.service.component.ComponentContext;
+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.Dictionary;
@@ -64,6 +62,14 @@
 import static com.google.common.base.Preconditions.checkNotNull;
 import static com.google.common.base.Preconditions.checkState;
 import static org.onlab.packet.IPv6.getLinkLocalAddress;
+import static org.onosproject.net.OsgiPropertyConstants.HM_ALLOW_DUPLICATE_IPS;
+import static org.onosproject.net.OsgiPropertyConstants.HM_ALLOW_DUPLICATE_IPS_DEFAULT;
+import static org.onosproject.net.OsgiPropertyConstants.HM_GREEDY_LEARNING_IPV6;
+import static org.onosproject.net.OsgiPropertyConstants.HM_GREEDY_LEARNING_IPV6_DEFAULT;
+import static org.onosproject.net.OsgiPropertyConstants.HM_MONITOR_HOSTS;
+import static org.onosproject.net.OsgiPropertyConstants.HM_MONITOR_HOSTS_DEFAULT;
+import static org.onosproject.net.OsgiPropertyConstants.HM_PROBE_RATE;
+import static org.onosproject.net.OsgiPropertyConstants.HM_PROBE_RATE_DEFAULT;
 import static org.onosproject.security.AppGuard.checkPermission;
 import static org.onosproject.security.AppPermission.Type.HOST_EVENT;
 import static org.onosproject.security.AppPermission.Type.HOST_READ;
@@ -72,8 +78,20 @@
 /**
  * Provides basic implementation of the host SB &amp; NB APIs.
  */
-@Component(immediate = true)
-@Service
+@Component(
+        immediate = true,
+        service = {
+            HostService.class,
+            HostAdminService.class,
+            HostProviderRegistry.class
+        },
+        property = {
+            HM_ALLOW_DUPLICATE_IPS + ":Boolean=" + HM_ALLOW_DUPLICATE_IPS_DEFAULT,
+            HM_MONITOR_HOSTS + ":Boolean=" + HM_MONITOR_HOSTS_DEFAULT,
+            HM_PROBE_RATE + ":Integer=" + HM_PROBE_RATE_DEFAULT,
+            HM_GREEDY_LEARNING_IPV6 + ":Boolean=" + HM_GREEDY_LEARNING_IPV6_DEFAULT
+        }
+)
 public class HostManager
         extends AbstractListenerProviderRegistry<HostEvent, HostListener, HostProvider, HostProviderService>
         implements HostService, HostAdminService, HostProviderRegistry {
@@ -86,42 +104,38 @@
 
     private HostStoreDelegate delegate = new InternalStoreDelegate();
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected HostStore store;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected DeviceService deviceService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected PacketService packetService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected NetworkConfigService networkConfigService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected InterfaceService interfaceService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected EdgePortService edgePortService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected ComponentConfigService cfgService;
 
-    @Property(name = "allowDuplicateIps", boolValue = true,
-            label = "Enable removal of duplicate ip address")
-    private boolean allowDuplicateIps = true;
+    /** Enable removal of duplicate ip address. */
+    private boolean allowDuplicateIps = HM_ALLOW_DUPLICATE_IPS_DEFAULT;
 
-    @Property(name = "monitorHosts", boolValue = false,
-            label = "Enable/Disable monitoring of hosts")
-    private boolean monitorHosts = false;
+    /** Enable/Disable monitoring of hosts. */
+    private boolean monitorHosts = HM_MONITOR_HOSTS_DEFAULT;
 
-    @Property(name = "probeRate", longValue = 30000,
-            label = "Set the probe Rate in milli seconds")
-    private long probeRate = 30000;
+    /** Set the probe Rate in milli seconds. */
+    private long probeRate = HM_PROBE_RATE_DEFAULT;
 
-    @Property(name = "greedyLearningIpv6", boolValue = false,
-            label = "Enable/Disable greedy learning of IPv6 link local address")
-    private boolean greedyLearningIpv6 = false;
+    /** Enable/Disable greedy learning of IPv6 link local address. */
+    private boolean greedyLearningIpv6 = HM_GREEDY_LEARNING_IPV6_DEFAULT;
 
     private HostMonitor monitor;
 
@@ -157,7 +171,7 @@
         if (probeRate > 0) {
             monitor.setProbeRate(probeRate);
         } else {
-            log.warn("probeRate cannot be lessthan 0");
+            log.warn("ProbeRate cannot be less than 0");
         }
 
         if (oldValue != monitorHosts) {
@@ -178,7 +192,7 @@
         Dictionary<?, ?> properties = context.getProperties();
         Boolean flag;
 
-        flag = Tools.isPropertyEnabled(properties, "monitorHosts");
+        flag = Tools.isPropertyEnabled(properties, HM_MONITOR_HOSTS);
         if (flag == null) {
             log.info("monitorHosts is not enabled " +
                              "using current value of {}", monitorHosts);
@@ -188,7 +202,7 @@
                      monitorHosts ? "enabled" : "disabled");
         }
 
-        Long longValue = Tools.getLongProperty(properties, "probeRate");
+        Long longValue = Tools.getLongProperty(properties, HM_PROBE_RATE);
         if (longValue == null || longValue == 0) {
             log.info("probeRate is not set sing default value of {}", probeRate);
         } else {
@@ -196,7 +210,7 @@
             log.info("Configured. probeRate {}", probeRate);
         }
 
-        flag = Tools.isPropertyEnabled(properties, "allowDuplicateIps");
+        flag = Tools.isPropertyEnabled(properties, HM_ALLOW_DUPLICATE_IPS);
         if (flag == null) {
             log.info("Removal of duplicate ip address is not configured");
         } else {
@@ -205,7 +219,7 @@
                      allowDuplicateIps ? "disabled" : "enabled");
         }
 
-        flag = Tools.isPropertyEnabled(properties, "greedyLearningIpv6");
+        flag = Tools.isPropertyEnabled(properties, HM_GREEDY_LEARNING_IPV6);
         if (flag == null) {
             log.info("greedy learning is not enabled " +
                              "using current value of {}", greedyLearningIpv6);
diff --git a/core/net/src/main/java/org/onosproject/net/host/impl/HostProbingManager.java b/core/net/src/main/java/org/onosproject/net/host/impl/HostProbingManager.java
index 08ce42e..ea3a8a1 100644
--- a/core/net/src/main/java/org/onosproject/net/host/impl/HostProbingManager.java
+++ b/core/net/src/main/java/org/onosproject/net/host/impl/HostProbingManager.java
@@ -16,39 +16,37 @@
 
 package org.onosproject.net.host.impl;
 
-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.packet.MacAddress;
 import org.onosproject.net.ConnectPoint;
 import org.onosproject.net.Host;
+import org.onosproject.net.host.HostProbeStore;
 import org.onosproject.net.host.HostProbingEvent;
-import org.onosproject.net.host.ProbeMode;
 import org.onosproject.net.host.HostProbingListener;
 import org.onosproject.net.host.HostProbingProvider;
+import org.onosproject.net.host.HostProbingProviderRegistry;
 import org.onosproject.net.host.HostProbingProviderService;
 import org.onosproject.net.host.HostProbingService;
-import org.onosproject.net.host.HostProbeStore;
-import org.onosproject.net.host.HostProbingProviderRegistry;
 import org.onosproject.net.host.HostProbingStoreDelegate;
+import org.onosproject.net.host.ProbeMode;
 import org.onosproject.net.provider.AbstractListenerProviderRegistry;
 import org.onosproject.net.provider.AbstractProviderService;
+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 static org.slf4j.LoggerFactory.getLogger;
 
-@Component(immediate = true)
-@Service
+@Component(immediate = true, service = { HostProbingService.class, HostProbingProviderRegistry.class })
 public class HostProbingManager extends
         AbstractListenerProviderRegistry<HostProbingEvent, HostProbingListener, HostProbingProvider,
                 HostProbingProviderService>
         implements HostProbingService, HostProbingProviderRegistry {
     private final Logger log = getLogger(getClass());
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     private HostProbeStore hostProbeStore;
 
     private static final String SCHEME = "hostprobing";
diff --git a/core/net/src/main/java/org/onosproject/net/intent/impl/IntentCleanup.java b/core/net/src/main/java/org/onosproject/net/intent/impl/IntentCleanup.java
index 823aa3b..d41439e 100644
--- a/core/net/src/main/java/org/onosproject/net/intent/impl/IntentCleanup.java
+++ b/core/net/src/main/java/org/onosproject/net/intent/impl/IntentCleanup.java
@@ -15,13 +15,6 @@
  */
 package org.onosproject.net.intent.impl;
 
-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.onosproject.cfg.ComponentConfigService;
 import org.onosproject.net.intent.IntentData;
 import org.onosproject.net.intent.IntentEvent;
@@ -31,6 +24,12 @@
 import org.onosproject.net.intent.Key;
 import org.onosproject.store.service.WallClockTimestamp;
 import org.osgi.service.component.ComponentContext;
+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.Dictionary;
@@ -43,6 +42,12 @@
 import static java.util.concurrent.Executors.newSingleThreadExecutor;
 import static org.onlab.util.Tools.get;
 import static org.onlab.util.Tools.groupedThreads;
+import static org.onosproject.net.OsgiPropertyConstants.ICU_ENABLED;
+import static org.onosproject.net.OsgiPropertyConstants.ICU_ENABLED_DEFAULT;
+import static org.onosproject.net.OsgiPropertyConstants.ICU_PERIOD;
+import static org.onosproject.net.OsgiPropertyConstants.ICU_PERIOD_DEFAULT;
+import static org.onosproject.net.OsgiPropertyConstants.ICU_RETRY_THRESHOLD;
+import static org.onosproject.net.OsgiPropertyConstants.ICU_RETRY_THRESHOLD_DEFAULT;
 import static org.slf4j.LoggerFactory.getLogger;
 
 /**
@@ -54,7 +59,14 @@
  * notifications, which signify errors in processing, and retries.
  * </p>
  */
-@Component(immediate = true)
+@Component(
+    immediate = true,
+    property = {
+        ICU_ENABLED + ":Boolean=" + ICU_ENABLED_DEFAULT,
+        ICU_PERIOD + ":Integer=" + ICU_PERIOD_DEFAULT,
+        ICU_RETRY_THRESHOLD + ":Integer=" + ICU_RETRY_THRESHOLD_DEFAULT
+    }
+)
 public class IntentCleanup implements Runnable, IntentListener {
 
     private static final Logger log = getLogger(IntentCleanup.class);
@@ -62,30 +74,25 @@
     // Logical timeout for stuck Intents in INSTALLING or WITHDRAWING. The unit is seconds
     private static final int INSTALLING_WITHDRAWING_PERIOD = 120;
 
-    private static final int DEFAULT_PERIOD = 5; //seconds
-    private static final int DEFAULT_THRESHOLD = 5; //tries
-
-    @Property(name = "enabled", boolValue = true,
-              label = "Enables/disables the intent cleanup component")
-    private boolean enabled = true;
-
-    @Property(name = "period", intValue = DEFAULT_PERIOD,
-              label = "Frequency in ms between cleanup runs")
-    protected int period = DEFAULT_PERIOD;
     private long periodMs;
     private long periodMsForStuck;
 
-    @Property(name = "retryThreshold", intValue = DEFAULT_THRESHOLD,
-            label = "Number of times to retry CORRUPT intent without delay")
-    protected int retryThreshold = DEFAULT_THRESHOLD;
+    /** Enables/disables the intent cleanup component. */
+    private boolean enabled = ICU_ENABLED_DEFAULT;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    /** Frequency in ms between cleanup runs. */
+    protected int period = ICU_PERIOD_DEFAULT;
+
+    /** Number of times to retry CORRUPT intent without delay. */
+    protected int retryThreshold = ICU_RETRY_THRESHOLD_DEFAULT;
+
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected IntentService service;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected IntentStore store;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected ComponentConfigService cfgService;
 
     private ExecutorService executor;
@@ -119,13 +126,13 @@
         int newPeriod;
         boolean newEnabled;
         try {
-            String s = get(properties, "period");
+            String s = get(properties, ICU_PERIOD);
             newPeriod = isNullOrEmpty(s) ? period : Integer.parseInt(s.trim());
 
-            s = get(properties, "retryThreshold");
+            s = get(properties, ICU_RETRY_THRESHOLD);
             retryThreshold = isNullOrEmpty(s) ? retryThreshold : Integer.parseInt(s.trim());
 
-            s = get(properties, "enabled");
+            s = get(properties, ICU_ENABLED);
             newEnabled = isNullOrEmpty(s) ? enabled : Boolean.parseBoolean(s.trim());
         } catch (NumberFormatException e) {
             log.warn(e.getMessage());
diff --git a/core/net/src/main/java/org/onosproject/net/intent/impl/IntentManager.java b/core/net/src/main/java/org/onosproject/net/intent/impl/IntentManager.java
index 62752e7..2b83fa8 100644
--- a/core/net/src/main/java/org/onosproject/net/intent/impl/IntentManager.java
+++ b/core/net/src/main/java/org/onosproject/net/intent/impl/IntentManager.java
@@ -15,14 +15,6 @@
  */
 package org.onosproject.net.intent.impl;
 
-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.util.Tools;
 import org.onosproject.cfg.ComponentConfigService;
 import org.onosproject.core.CoreService;
@@ -38,13 +30,13 @@
 import org.onosproject.net.intent.Intent;
 import org.onosproject.net.intent.IntentBatchDelegate;
 import org.onosproject.net.intent.IntentCompiler;
-import org.onosproject.net.intent.IntentInstallCoordinator;
 import org.onosproject.net.intent.IntentData;
 import org.onosproject.net.intent.IntentEvent;
 import org.onosproject.net.intent.IntentExtensionService;
-import org.onosproject.net.intent.IntentOperationContext;
+import org.onosproject.net.intent.IntentInstallCoordinator;
 import org.onosproject.net.intent.IntentInstaller;
 import org.onosproject.net.intent.IntentListener;
+import org.onosproject.net.intent.IntentOperationContext;
 import org.onosproject.net.intent.IntentService;
 import org.onosproject.net.intent.IntentState;
 import org.onosproject.net.intent.IntentStore;
@@ -60,6 +52,12 @@
 import org.onosproject.net.resource.ResourceConsumer;
 import org.onosproject.net.resource.ResourceService;
 import org.osgi.service.component.ComponentContext;
+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.Collection;
@@ -77,7 +75,15 @@
 import static java.util.concurrent.Executors.newFixedThreadPool;
 import static java.util.concurrent.Executors.newSingleThreadExecutor;
 import static org.onlab.util.Tools.groupedThreads;
-import static org.onosproject.net.intent.IntentState.*;
+import static org.onosproject.net.OsgiPropertyConstants.IM_NUM_THREADS;
+import static org.onosproject.net.OsgiPropertyConstants.IM_NUM_THREADS_DEFAULT;
+import static org.onosproject.net.OsgiPropertyConstants.IM_SKIP_RELEASE_RESOURCES_ON_WITHDRAWAL;
+import static org.onosproject.net.OsgiPropertyConstants.IM_SKIP_RELEASE_RESOURCES_ON_WITHDRAWAL_DEFAULT;
+import static org.onosproject.net.intent.IntentState.FAILED;
+import static org.onosproject.net.intent.IntentState.INSTALL_REQ;
+import static org.onosproject.net.intent.IntentState.WITHDRAWING;
+import static org.onosproject.net.intent.IntentState.WITHDRAWN;
+import static org.onosproject.net.intent.IntentState.WITHDRAW_REQ;
 import static org.onosproject.net.intent.constraint.PartialFailureConstraint.intentAllowsPartialFailure;
 import static org.onosproject.net.intent.impl.phase.IntentProcessPhase.newInitialPhase;
 import static org.onosproject.security.AppGuard.checkPermission;
@@ -88,8 +94,18 @@
 /**
  * An implementation of intent service.
  */
-@Component(immediate = true)
-@Service
+@Component(
+    immediate = true,
+    service = {
+        IntentService.class,
+        IntentExtensionService.class,
+        IntentInstallCoordinator.class
+    },
+    property = {
+        IM_SKIP_RELEASE_RESOURCES_ON_WITHDRAWAL + ":Boolean=" + IM_SKIP_RELEASE_RESOURCES_ON_WITHDRAWAL_DEFAULT,
+        IM_NUM_THREADS + ":Integer=" + IM_NUM_THREADS_DEFAULT
+    }
+)
 public class IntentManager
         extends AbstractListenerManager<IntentEvent, IntentListener>
         implements IntentService, IntentExtensionService, IntentInstallCoordinator {
@@ -104,46 +120,40 @@
     private static final EnumSet<IntentState> WITHDRAW
             = EnumSet.of(WITHDRAW_REQ, WITHDRAWING, WITHDRAWN);
 
-    private static final boolean DEFAULT_SKIP_RELEASE_RESOURCES_ON_WITHDRAWAL = false;
-    @Property(name = "skipReleaseResourcesOnWithdrawal",
-            boolValue = DEFAULT_SKIP_RELEASE_RESOURCES_ON_WITHDRAWAL,
-            label = "Indicates whether skipping resource releases on withdrawal is enabled or not")
-    private boolean skipReleaseResourcesOnWithdrawal = DEFAULT_SKIP_RELEASE_RESOURCES_ON_WITHDRAWAL;
+    /** Indicates whether skipping resource releases on withdrawal is enabled or not. */
+    private boolean skipReleaseResourcesOnWithdrawal = IM_SKIP_RELEASE_RESOURCES_ON_WITHDRAWAL_DEFAULT;
 
-    private static final int DEFAULT_NUM_THREADS = 12;
-    @Property(name = "numThreads",
-            intValue = DEFAULT_NUM_THREADS,
-            label = "Number of worker threads")
-    private int numThreads = DEFAULT_NUM_THREADS;
+    /** Number of worker threads. */
+    private int numThreads = IM_NUM_THREADS_DEFAULT;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected CoreService coreService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected IntentStore store;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected ObjectiveTrackerService trackerService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected FlowRuleService flowRuleService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected FlowObjectiveService flowObjectiveService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected DomainIntentService domainIntentService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected ResourceService resourceService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected ComponentConfigService configService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected GroupService groupService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     private NetworkConfigService networkConfigService;
 
     private ExecutorService batchExecutor;
@@ -199,12 +209,12 @@
     @Modified
     public void modified(ComponentContext context) {
         if (context == null) {
-            skipReleaseResourcesOnWithdrawal = DEFAULT_SKIP_RELEASE_RESOURCES_ON_WITHDRAWAL;
+            skipReleaseResourcesOnWithdrawal = IM_SKIP_RELEASE_RESOURCES_ON_WITHDRAWAL_DEFAULT;
             logConfig("Default config");
             return;
         }
 
-        String s = Tools.get(context.getProperties(), "skipReleaseResourcesOnWithdrawal");
+        String s = Tools.get(context.getProperties(), IM_SKIP_RELEASE_RESOURCES_ON_WITHDRAWAL);
         boolean newTestEnabled = isNullOrEmpty(s) ? skipReleaseResourcesOnWithdrawal : Boolean.parseBoolean(s.trim());
         if (skipReleaseResourcesOnWithdrawal && !newTestEnabled) {
             store.unsetDelegate(testOnlyDelegate);
@@ -218,7 +228,7 @@
             logConfig("Reconfigured skip release resources on withdrawal");
         }
 
-        s = Tools.get(context.getProperties(), "numThreads");
+        s = Tools.get(context.getProperties(), IM_NUM_THREADS);
         int newNumThreads = isNullOrEmpty(s) ? numThreads : Integer.parseInt(s);
         if (newNumThreads != numThreads) {
             numThreads = newNumThreads;
diff --git a/core/net/src/main/java/org/onosproject/net/intent/impl/ObjectiveTracker.java b/core/net/src/main/java/org/onosproject/net/intent/impl/ObjectiveTracker.java
index f423ebc..288308d 100644
--- a/core/net/src/main/java/org/onosproject/net/intent/impl/ObjectiveTracker.java
+++ b/core/net/src/main/java/org/onosproject/net/intent/impl/ObjectiveTracker.java
@@ -18,13 +18,6 @@
 import com.google.common.collect.HashMultimap;
 import com.google.common.collect.ImmutableSet;
 import com.google.common.collect.SetMultimap;
-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.ReferencePolicy;
-import org.apache.felix.scr.annotations.Service;
 import org.onosproject.event.Event;
 import org.onosproject.net.DeviceId;
 import org.onosproject.net.ElementId;
@@ -55,6 +48,12 @@
 import org.onosproject.net.topology.TopologyEvent;
 import org.onosproject.net.topology.TopologyListener;
 import org.onosproject.net.topology.TopologyService;
+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.osgi.service.component.annotations.ReferencePolicy;
 import org.slf4j.Logger;
 
 import java.util.Collection;
@@ -85,8 +84,7 @@
  * Entity responsible for tracking installed flows and for monitoring topology
  * events to determine what flows are affected by topology changes.
  */
-@Component(immediate = true)
-@Service
+@Component(immediate = true, service = ObjectiveTrackerService.class)
 public class ObjectiveTracker implements ObjectiveTrackerService {
 
     private final Logger log = getLogger(getClass());
@@ -98,25 +96,25 @@
     private final SetMultimap<ElementId, Key> intentsByDevice =
             synchronizedSetMultimap(HashMultimap.<ElementId, Key>create());
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected TopologyService topologyService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected ResourceService resourceService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected DeviceService deviceService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected HostService hostService;
 
-    @Reference(cardinality = ReferenceCardinality.OPTIONAL_UNARY,
+    @Reference(cardinality = ReferenceCardinality.OPTIONAL,
                 bind = "bindComponentConfigService",
                 unbind = "unbindComponentConfigService",
                 policy = ReferencePolicy.DYNAMIC)
     protected IntentService intentService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected WorkPartitionService partitionService;
 
     private ExecutorService executorService =
diff --git a/core/net/src/main/java/org/onosproject/net/intent/impl/ProtectionConfigMonitor.java b/core/net/src/main/java/org/onosproject/net/intent/impl/ProtectionConfigMonitor.java
index 7201364..b8b70ec 100644
--- a/core/net/src/main/java/org/onosproject/net/intent/impl/ProtectionConfigMonitor.java
+++ b/core/net/src/main/java/org/onosproject/net/intent/impl/ProtectionConfigMonitor.java
@@ -15,28 +15,8 @@
  */
 package org.onosproject.net.intent.impl;
 
-import static java.util.concurrent.Executors.newSingleThreadExecutor;
-import static org.onlab.util.Tools.groupedThreads;
-import static org.onosproject.net.config.basics.SubjectFactories.DEVICE_SUBJECT_FACTORY;
-import static org.slf4j.LoggerFactory.getLogger;
-
-import java.util.EnumSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Map.Entry;
-import java.util.Optional;
-import java.util.Set;
-import java.util.concurrent.CompletableFuture;
-import java.util.concurrent.ExecutionException;
-import java.util.concurrent.ExecutorService;
-import java.util.concurrent.TimeUnit;
-
-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.ImmutableList;
+import com.google.common.collect.ImmutableSet;
 import org.onosproject.net.ConnectPoint;
 import org.onosproject.net.DeviceId;
 import org.onosproject.net.MastershipRole;
@@ -52,32 +32,49 @@
 import org.onosproject.net.device.DeviceService;
 import org.onosproject.net.driver.DriverHandler;
 import org.onosproject.net.driver.DriverService;
+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.ImmutableList;
-import com.google.common.collect.ImmutableSet;
+import java.util.EnumSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Map.Entry;
+import java.util.Optional;
+import java.util.Set;
+import java.util.concurrent.CompletableFuture;
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.TimeUnit;
+
+import static java.util.concurrent.Executors.newSingleThreadExecutor;
+import static org.onlab.util.Tools.groupedThreads;
+import static org.onosproject.net.config.basics.SubjectFactories.DEVICE_SUBJECT_FACTORY;
+import static org.slf4j.LoggerFactory.getLogger;
 
 // TODO In theory just @Component should be sufficient,
 //      but won't work without @Service. Need investigation.
 /**
  * Component to monitor {@link ProtectionConfig} changes.
  */
-@Service(value = ProtectionConfigMonitor.class)
-@Component(immediate = true)
+@Component(immediate = true, service = ProtectionConfigMonitor.class)
 public class ProtectionConfigMonitor {
 
     private final Logger log = getLogger(getClass());
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected NetworkConfigService networkConfigService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected DeviceService deviceService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected DriverService driverService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected NetworkConfigRegistry cfgRegistry;
 
     private final List<ConfigFactory<?, ?>> factories = ImmutableList.of(
diff --git a/core/net/src/main/java/org/onosproject/net/intent/impl/compiler/ConnectivityIntentCompiler.java b/core/net/src/main/java/org/onosproject/net/intent/impl/compiler/ConnectivityIntentCompiler.java
index a8ab9fa..666128c 100644
--- a/core/net/src/main/java/org/onosproject/net/intent/impl/compiler/ConnectivityIntentCompiler.java
+++ b/core/net/src/main/java/org/onosproject/net/intent/impl/compiler/ConnectivityIntentCompiler.java
@@ -18,9 +18,8 @@
 import com.google.common.collect.FluentIterable;
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.Lists;
-import org.apache.felix.scr.annotations.Component;
-import org.apache.felix.scr.annotations.Reference;
-import org.apache.felix.scr.annotations.ReferenceCardinality;
+import org.osgi.service.component.annotations.Reference;
+import org.osgi.service.component.annotations.ReferenceCardinality;
 import org.onlab.graph.DefaultEdgeWeigher;
 import org.onlab.graph.ScalarWeight;
 import org.onlab.graph.Weight;
@@ -66,7 +65,6 @@
  * Base class for compilers of various
  * {@link org.onosproject.net.intent.ConnectivityIntent connectivity intents}.
  */
-@Component(immediate = true)
 public abstract class ConnectivityIntentCompiler<T extends ConnectivityIntent>
         implements IntentCompiler<T> {
 
@@ -74,16 +72,16 @@
 
     private static final Logger log = LoggerFactory.getLogger(ConnectivityIntentCompiler.class);
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected DeviceService deviceService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected IntentExtensionService intentManager;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected PathService pathService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected ResourceService resourceService;
 
     /**
diff --git a/core/net/src/main/java/org/onosproject/net/intent/impl/compiler/HostToHostIntentCompiler.java b/core/net/src/main/java/org/onosproject/net/intent/impl/compiler/HostToHostIntentCompiler.java
index 4ba0bfe..99b31fc 100644
--- a/core/net/src/main/java/org/onosproject/net/intent/impl/compiler/HostToHostIntentCompiler.java
+++ b/core/net/src/main/java/org/onosproject/net/intent/impl/compiler/HostToHostIntentCompiler.java
@@ -17,11 +17,11 @@
 
 import com.google.common.collect.ImmutableList;
 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.onosproject.net.ConnectPoint;
 import org.onosproject.net.DefaultLink;
 import org.onosproject.net.DefaultPath;
@@ -62,7 +62,7 @@
 
     private static final String DEVICE_ID_NOT_FOUND = "Didn't find device id in the link";
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected HostService hostService;
 
     @Activate
diff --git a/core/net/src/main/java/org/onosproject/net/intent/impl/compiler/IntentConfigurableRegistrator.java b/core/net/src/main/java/org/onosproject/net/intent/impl/compiler/IntentConfigurableRegistrator.java
index f86cdba..97dd992 100644
--- a/core/net/src/main/java/org/onosproject/net/intent/impl/compiler/IntentConfigurableRegistrator.java
+++ b/core/net/src/main/java/org/onosproject/net/intent/impl/compiler/IntentConfigurableRegistrator.java
@@ -17,14 +17,6 @@
 package org.onosproject.net.intent.impl.compiler;
 
 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.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.util.Tools;
 import org.onosproject.cfg.ComponentConfigService;
 import org.onosproject.net.intent.Intent;
@@ -32,58 +24,67 @@
 import org.onosproject.net.intent.IntentExtensionService;
 import org.onosproject.net.resource.impl.LabelAllocator;
 import org.osgi.service.component.ComponentContext;
+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.Map;
 
 import static com.google.common.base.Strings.isNullOrEmpty;
+import static org.onosproject.net.OsgiPropertyConstants.ICR_COPY_TTL;
+import static org.onosproject.net.OsgiPropertyConstants.ICR_COPY_TTL_DEFAULT;
+import static org.onosproject.net.OsgiPropertyConstants.ICR_FLOW_OPTIMIZATION;
+import static org.onosproject.net.OsgiPropertyConstants.ICR_LABEL_SELECTION;
+import static org.onosproject.net.OsgiPropertyConstants.ICR_OPT_LABEL_SELECTION;
+import static org.onosproject.net.OsgiPropertyConstants.ICR_USE_FLOW_OBJECTIVES;
+import static org.onosproject.net.OsgiPropertyConstants.ICR_USE_FLOW_OBJECTIVES_DEFAULT;
+import static org.onosproject.net.OsgiPropertyConstants.ICR_FLOW_OPTIMIZATION_DEFAULT;
+import static org.onosproject.net.OsgiPropertyConstants.ICR_LABEL_SELECTION_DEFAULT;
+import static org.onosproject.net.OsgiPropertyConstants.ICR_OPT_LABEL_SELECTION_DEFAULT;
 import static org.slf4j.LoggerFactory.getLogger;
 
 /**
  * Auxiliary utility to register either flow-rule compilers or flow-objective
  * compilers.
  */
-@Component
-@Service(value = IntentConfigurableRegistrator.class)
+@Component(
+    service = IntentConfigurableRegistrator.class,
+    property = {
+        ICR_USE_FLOW_OBJECTIVES + ":Boolean=" + ICR_USE_FLOW_OBJECTIVES_DEFAULT,
+        ICR_LABEL_SELECTION + "=" + ICR_LABEL_SELECTION_DEFAULT,
+        ICR_OPT_LABEL_SELECTION + "=" + ICR_LABEL_SELECTION_DEFAULT,
+        ICR_FLOW_OPTIMIZATION + ":Boolean=" + ICR_FLOW_OPTIMIZATION_DEFAULT,
+        ICR_COPY_TTL + ":Boolean=" + ICR_COPY_TTL_DEFAULT
+    }
+)
 public class IntentConfigurableRegistrator {
 
     private final Logger log = getLogger(getClass());
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected IntentExtensionService extensionService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected ComponentConfigService cfgService;
 
-    private static final boolean DEFAULT_FLOW_OBJECTIVES = false;
-    @Property(name = "useFlowObjectives",
-            boolValue = DEFAULT_FLOW_OBJECTIVES,
-            label = "Indicates whether or not to use flow objective-based compilers")
-    private boolean useFlowObjectives = DEFAULT_FLOW_OBJECTIVES;
+    /** Indicates whether or not to use flow objective-based compilers. */
+    private boolean useFlowObjectives = ICR_USE_FLOW_OBJECTIVES_DEFAULT;
 
-    private static final String DEFAULT_LABEL_SELECTION = "RANDOM";
-    @Property(name = "labelSelection",
-            value = DEFAULT_LABEL_SELECTION,
-            label = "Defines the label selection algorithm - RANDOM or FIRST_FIT")
-    private String labelSelection = DEFAULT_LABEL_SELECTION;
+    /** Defines the label selection algorithm - RANDOM or FIRST_FIT. */
+    private String labelSelection = ICR_LABEL_SELECTION_DEFAULT;
 
-    private static final String DEFAULT_OPT_LABEL_SELECTION = "NONE";
-    @Property(name = "optLabelSelection",
-            value = DEFAULT_OPT_LABEL_SELECTION,
-            label = "Defines the optimization for label selection algorithm - NONE, NO_SWAP, MIN_SWAP")
-    private String optLabelSelection = DEFAULT_OPT_LABEL_SELECTION;
+    /** Defines the optimization for label selection algorithm - NONE, NO_SWAP, MIN_SWAP. */
+    private String optLabelSelection = ICR_OPT_LABEL_SELECTION_DEFAULT;
 
-    private static final boolean DEFAULT_FLOW_OPTIMIZATION = false;
-    @Property(name = "optimizeInstructions",
-            boolValue = DEFAULT_FLOW_OPTIMIZATION,
-            label = "Indicates whether or not to optimize the flows in the link collection compiler")
-    private boolean optimizeInstructions = DEFAULT_FLOW_OPTIMIZATION;
+    /** Indicates whether or not to optimize the flows in the link collection compiler. */
+    private boolean optimizeInstructions = ICR_FLOW_OPTIMIZATION_DEFAULT;
 
-    private static final boolean DEFAULT_COPY_TTL = false;
-    @Property(name = "useCopyTtl",
-            boolValue = DEFAULT_COPY_TTL,
-            label = "Indicates whether or not to use copy ttl in the link collection compiler")
-    private boolean useCopyTtl = DEFAULT_COPY_TTL;
+    /** Indicates whether or not to use copy ttl in the link collection compiler. */
+    private boolean useCopyTtl = ICR_COPY_TTL_DEFAULT;
 
     private final Map<Class<Intent>, IntentCompiler<Intent>> flowRuleBased = Maps.newConcurrentMap();
 
@@ -116,7 +117,7 @@
 
         boolean newFlowObjectives;
         try {
-            String s = Tools.get(context.getProperties(), "useFlowObjectives");
+            String s = Tools.get(context.getProperties(), ICR_USE_FLOW_OBJECTIVES);
             newFlowObjectives = isNullOrEmpty(s) ? useFlowObjectives : Boolean.parseBoolean(s.trim());
         } catch (ClassCastException e) {
             newFlowObjectives = useFlowObjectives;
@@ -130,7 +131,7 @@
 
         String newLabelSelection;
         try {
-            String s = Tools.get(context.getProperties(), "labelSelection");
+            String s = Tools.get(context.getProperties(), ICR_LABEL_SELECTION);
             newLabelSelection = isNullOrEmpty(s) ? labelSelection : s.trim();
         } catch (ClassCastException e) {
             newLabelSelection = labelSelection;
@@ -145,7 +146,7 @@
         String newOptLabelSelection;
         try {
             // The optimization behavior provided by the user
-            String optLabelSelected = Tools.get(context.getProperties(), "optLabelSelection");
+            String optLabelSelected = Tools.get(context.getProperties(), ICR_OPT_LABEL_SELECTION);
             // Parse the content of the string
             newOptLabelSelection = isNullOrEmpty(optLabelSelected) ? optLabelSelection : optLabelSelected.trim();
         } catch (ClassCastException e) {
@@ -160,7 +161,7 @@
 
         boolean newFlowOptimization;
         try {
-            String s = Tools.get(context.getProperties(), "useFlowOptimization");
+            String s = Tools.get(context.getProperties(), ICR_FLOW_OPTIMIZATION);
             newFlowOptimization = isNullOrEmpty(s) ? optimizeInstructions : Boolean.parseBoolean(s.trim());
         } catch (ClassCastException e) {
             newFlowOptimization = optimizeInstructions;
@@ -174,7 +175,7 @@
 
         boolean newCopyTtl;
         try {
-            String s = Tools.get(context.getProperties(), "useCopyTtl");
+            String s = Tools.get(context.getProperties(), ICR_COPY_TTL);
             newCopyTtl = isNullOrEmpty(s) ? useCopyTtl : Boolean.parseBoolean(s.trim());
         } catch (ClassCastException e) {
             newCopyTtl = useCopyTtl;
diff --git a/core/net/src/main/java/org/onosproject/net/intent/impl/compiler/LinkCollectionIntentCompiler.java b/core/net/src/main/java/org/onosproject/net/intent/impl/compiler/LinkCollectionIntentCompiler.java
index 6413408..b6e956e 100644
--- a/core/net/src/main/java/org/onosproject/net/intent/impl/compiler/LinkCollectionIntentCompiler.java
+++ b/core/net/src/main/java/org/onosproject/net/intent/impl/compiler/LinkCollectionIntentCompiler.java
@@ -19,11 +19,11 @@
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableMap;
 import com.google.common.collect.SetMultimap;
-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.util.Identifier;
 import org.onosproject.core.ApplicationId;
 import org.onosproject.core.CoreService;
@@ -70,16 +70,16 @@
     private static final String UNSUPPORTED_INSTRUCTION = "Unsupported %s instruction";
 
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected IntentConfigurableRegistrator registrator;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected CoreService coreService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected ResourceService resourceService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected DomainService domainService;
 
     private ApplicationId appId;
diff --git a/core/net/src/main/java/org/onosproject/net/intent/impl/compiler/LinkCollectionIntentFlowObjectiveCompiler.java b/core/net/src/main/java/org/onosproject/net/intent/impl/compiler/LinkCollectionIntentFlowObjectiveCompiler.java
index 159a53e..870473c 100644
--- a/core/net/src/main/java/org/onosproject/net/intent/impl/compiler/LinkCollectionIntentFlowObjectiveCompiler.java
+++ b/core/net/src/main/java/org/onosproject/net/intent/impl/compiler/LinkCollectionIntentFlowObjectiveCompiler.java
@@ -21,11 +21,11 @@
 import com.google.common.collect.Lists;
 import com.google.common.collect.SetMultimap;
 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.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.util.Identifier;
 import org.onosproject.core.ApplicationId;
 import org.onosproject.core.CoreService;
@@ -78,19 +78,19 @@
         implements IntentCompiler<LinkCollectionIntent> {
     private final Logger log = getLogger(getClass());
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected IntentConfigurableRegistrator registrator;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected CoreService coreService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected FlowObjectiveService flowObjectiveService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected ResourceService resourceService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected DomainService domainService;
 
     private ApplicationId appId;
diff --git a/core/net/src/main/java/org/onosproject/net/intent/impl/compiler/MultiPointToSinglePointIntentCompiler.java b/core/net/src/main/java/org/onosproject/net/intent/impl/compiler/MultiPointToSinglePointIntentCompiler.java
index fc5c970..7caa4e1 100644
--- a/core/net/src/main/java/org/onosproject/net/intent/impl/compiler/MultiPointToSinglePointIntentCompiler.java
+++ b/core/net/src/main/java/org/onosproject/net/intent/impl/compiler/MultiPointToSinglePointIntentCompiler.java
@@ -17,21 +17,17 @@
 
 import com.google.common.collect.ImmutableSet;
 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.onosproject.net.ConnectPoint;
 import org.onosproject.net.DeviceId;
 import org.onosproject.net.Link;
 import org.onosproject.net.Path;
-import org.onosproject.net.device.DeviceService;
 import org.onosproject.net.intent.Intent;
 import org.onosproject.net.intent.IntentException;
-import org.onosproject.net.intent.IntentExtensionService;
 import org.onosproject.net.intent.LinkCollectionIntent;
 import org.onosproject.net.intent.MultiPointToSinglePointIntent;
+import org.osgi.service.component.annotations.Activate;
+import org.osgi.service.component.annotations.Component;
+import org.osgi.service.component.annotations.Deactivate;
 
 import java.util.Collections;
 import java.util.HashMap;
@@ -51,12 +47,6 @@
 public class MultiPointToSinglePointIntentCompiler
         extends ConnectivityIntentCompiler<MultiPointToSinglePointIntent> {
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
-    protected IntentExtensionService intentManager;
-
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
-    protected DeviceService deviceService;
-
     @Activate
     public void activate() {
         intentManager.registerCompiler(MultiPointToSinglePointIntent.class, this);
diff --git a/core/net/src/main/java/org/onosproject/net/intent/impl/compiler/PathIntentCompiler.java b/core/net/src/main/java/org/onosproject/net/intent/impl/compiler/PathIntentCompiler.java
index 9b38837..0b9bdd1 100644
--- a/core/net/src/main/java/org/onosproject/net/intent/impl/compiler/PathIntentCompiler.java
+++ b/core/net/src/main/java/org/onosproject/net/intent/impl/compiler/PathIntentCompiler.java
@@ -16,11 +16,11 @@
 package org.onosproject.net.intent.impl.compiler;
 
 import com.google.common.collect.ImmutableList;
-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.onosproject.core.ApplicationId;
 import org.onosproject.core.CoreService;
 import org.onosproject.net.ConnectPoint;
@@ -53,13 +53,13 @@
 
     private final Logger log = getLogger(getClass());
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected CoreService coreService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected IntentConfigurableRegistrator registrator;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected ResourceService resourceService;
 
     private ApplicationId appId;
diff --git a/core/net/src/main/java/org/onosproject/net/intent/impl/compiler/PathIntentFlowObjectiveCompiler.java b/core/net/src/main/java/org/onosproject/net/intent/impl/compiler/PathIntentFlowObjectiveCompiler.java
index b919aada..75734b9 100644
--- a/core/net/src/main/java/org/onosproject/net/intent/impl/compiler/PathIntentFlowObjectiveCompiler.java
+++ b/core/net/src/main/java/org/onosproject/net/intent/impl/compiler/PathIntentFlowObjectiveCompiler.java
@@ -16,11 +16,11 @@
 package org.onosproject.net.intent.impl.compiler;
 
 import com.google.common.collect.ImmutableList;
-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.onosproject.core.ApplicationId;
 import org.onosproject.core.CoreService;
 import org.onosproject.net.ConnectPoint;
@@ -56,16 +56,16 @@
 
     private final Logger log = getLogger(getClass());
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected CoreService coreService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected IntentConfigurableRegistrator registrator;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected ResourceService resourceService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected FlowObjectiveService flowObjectiveService;
 
     private ApplicationId appId;
diff --git a/core/net/src/main/java/org/onosproject/net/intent/impl/compiler/PointToPointIntentCompiler.java b/core/net/src/main/java/org/onosproject/net/intent/impl/compiler/PointToPointIntentCompiler.java
index acdaddd..ad65e46 100644
--- a/core/net/src/main/java/org/onosproject/net/intent/impl/compiler/PointToPointIntentCompiler.java
+++ b/core/net/src/main/java/org/onosproject/net/intent/impl/compiler/PointToPointIntentCompiler.java
@@ -16,11 +16,6 @@
 package org.onosproject.net.intent.impl.compiler;
 
 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.onlab.graph.ScalarWeight;
 import org.onosproject.net.ConnectPoint;
 import org.onosproject.net.DefaultPath;
@@ -31,7 +26,6 @@
 import org.onosproject.net.Path;
 import org.onosproject.net.Port;
 import org.onosproject.net.PortNumber;
-import org.onosproject.net.device.DeviceService;
 import org.onosproject.net.flow.DefaultFlowRule;
 import org.onosproject.net.flow.DefaultTrafficSelector;
 import org.onosproject.net.flow.DefaultTrafficTreatment;
@@ -61,6 +55,11 @@
 import org.onosproject.net.intent.impl.PathNotFoundException;
 import org.onosproject.net.link.LinkService;
 import org.onosproject.net.provider.ProviderId;
+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.nio.ByteBuffer;
@@ -103,15 +102,12 @@
     protected boolean erasePrimary = false;
     protected boolean eraseBackup = false;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected GroupService groupService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected LinkService linkService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
-    protected DeviceService deviceService;
-
     @Activate
     public void activate() {
         intentManager.registerCompiler(PointToPointIntent.class, this);
diff --git a/core/net/src/main/java/org/onosproject/net/intent/impl/compiler/ProtectedTransportIntentCompiler.java b/core/net/src/main/java/org/onosproject/net/intent/impl/compiler/ProtectedTransportIntentCompiler.java
index 9020e5a..2bbac10 100644
--- a/core/net/src/main/java/org/onosproject/net/intent/impl/compiler/ProtectedTransportIntentCompiler.java
+++ b/core/net/src/main/java/org/onosproject/net/intent/impl/compiler/ProtectedTransportIntentCompiler.java
@@ -15,29 +15,14 @@
  */
 package org.onosproject.net.intent.impl.compiler;
 
-import static com.google.common.base.Preconditions.checkArgument;
-import static com.google.common.collect.Lists.transform;
-import static java.util.stream.Stream.concat;
-import static org.onosproject.net.MarkerResource.marker;
-import static org.onosproject.net.behaviour.protection.ProtectedTransportEndpointDescription.buildDescription;
-import static org.slf4j.LoggerFactory.getLogger;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.List;
-import java.util.Objects;
-import java.util.Optional;
-import java.util.Set;
-import java.util.stream.Collectors;
-import java.util.stream.Stream;
-
+import com.google.common.annotations.Beta;
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableSet;
+import com.google.common.collect.Iterables;
+import com.google.common.collect.Lists;
+import com.google.common.collect.Sets;
 import org.apache.commons.lang3.RandomUtils;
 import org.apache.commons.lang3.tuple.Pair;
-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.packet.VlanId;
 import org.onosproject.net.ConnectPoint;
 import org.onosproject.net.DefaultLink;
@@ -58,16 +43,27 @@
 import org.onosproject.net.intent.ProtectionEndpointIntent;
 import org.onosproject.net.resource.DiscreteResourceId;
 import org.onosproject.net.resource.Resource;
-import org.onosproject.net.resource.ResourceService;
 import org.onosproject.net.resource.Resources;
+import org.osgi.service.component.annotations.Activate;
+import org.osgi.service.component.annotations.Component;
+import org.osgi.service.component.annotations.Deactivate;
 import org.slf4j.Logger;
 
-import com.google.common.annotations.Beta;
-import com.google.common.collect.ImmutableList;
-import com.google.common.collect.ImmutableSet;
-import com.google.common.collect.Iterables;
-import com.google.common.collect.Lists;
-import com.google.common.collect.Sets;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+import java.util.Objects;
+import java.util.Optional;
+import java.util.Set;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
+
+import static com.google.common.base.Preconditions.checkArgument;
+import static com.google.common.collect.Lists.transform;
+import static java.util.stream.Stream.concat;
+import static org.onosproject.net.MarkerResource.marker;
+import static org.onosproject.net.behaviour.protection.ProtectedTransportEndpointDescription.buildDescription;
+import static org.slf4j.LoggerFactory.getLogger;
 
 /**
  * IntentCompiler for {@link ProtectedTransportIntent}.
@@ -87,12 +83,8 @@
      */
     private static final String REV = "rev";
 
-
     private final Logger log = getLogger(getClass());
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
-    protected ResourceService resourceService;
-
     @Activate
     public void activate() {
         intentManager.registerCompiler(ProtectedTransportIntent.class, this);
diff --git a/core/net/src/main/java/org/onosproject/net/intent/impl/compiler/SinglePointToMultiPointIntentCompiler.java b/core/net/src/main/java/org/onosproject/net/intent/impl/compiler/SinglePointToMultiPointIntentCompiler.java
index 391605b..dfd2e0a 100644
--- a/core/net/src/main/java/org/onosproject/net/intent/impl/compiler/SinglePointToMultiPointIntentCompiler.java
+++ b/core/net/src/main/java/org/onosproject/net/intent/impl/compiler/SinglePointToMultiPointIntentCompiler.java
@@ -16,19 +16,16 @@
 package org.onosproject.net.intent.impl.compiler;
 
 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.onosproject.net.ConnectPoint;
 import org.onosproject.net.Link;
 import org.onosproject.net.Path;
-import org.onosproject.net.device.DeviceService;
 import org.onosproject.net.intent.Intent;
 import org.onosproject.net.intent.IntentException;
 import org.onosproject.net.intent.LinkCollectionIntent;
 import org.onosproject.net.intent.SinglePointToMultiPointIntent;
+import org.osgi.service.component.annotations.Activate;
+import org.osgi.service.component.annotations.Component;
+import org.osgi.service.component.annotations.Deactivate;
 
 import java.util.Collections;
 import java.util.HashSet;
@@ -43,9 +40,6 @@
 public class SinglePointToMultiPointIntentCompiler
         extends ConnectivityIntentCompiler<SinglePointToMultiPointIntent> {
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
-    protected DeviceService deviceService;
-
     @Activate
     public void activate() {
         intentManager.registerCompiler(SinglePointToMultiPointIntent.class, this);
diff --git a/core/net/src/main/java/org/onosproject/net/intent/impl/compiler/TwoWayP2PIntentCompiler.java b/core/net/src/main/java/org/onosproject/net/intent/impl/compiler/TwoWayP2PIntentCompiler.java
index 753e04f..8ed1d94 100644
--- a/core/net/src/main/java/org/onosproject/net/intent/impl/compiler/TwoWayP2PIntentCompiler.java
+++ b/core/net/src/main/java/org/onosproject/net/intent/impl/compiler/TwoWayP2PIntentCompiler.java
@@ -16,9 +16,9 @@
 package org.onosproject.net.intent.impl.compiler;
 
 import com.google.common.collect.Lists;
-import org.apache.felix.scr.annotations.Activate;
-import org.apache.felix.scr.annotations.Component;
-import org.apache.felix.scr.annotations.Deactivate;
+import org.osgi.service.component.annotations.Activate;
+import org.osgi.service.component.annotations.Component;
+import org.osgi.service.component.annotations.Deactivate;
 import org.onosproject.net.FilteredConnectPoint;
 import org.onosproject.net.intent.Intent;
 import org.onosproject.net.intent.PointToPointIntent;
diff --git a/core/net/src/main/java/org/onosproject/net/intent/impl/compiler/VirtualNetworkIntentCompiler.java b/core/net/src/main/java/org/onosproject/net/intent/impl/compiler/VirtualNetworkIntentCompiler.java
index bf92873..3222714 100644
--- a/core/net/src/main/java/org/onosproject/net/intent/impl/compiler/VirtualNetworkIntentCompiler.java
+++ b/core/net/src/main/java/org/onosproject/net/intent/impl/compiler/VirtualNetworkIntentCompiler.java
@@ -16,11 +16,11 @@
 
 package org.onosproject.net.intent.impl.compiler;
 
-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.osgi.DefaultServiceDirectory;
 import org.onlab.osgi.ServiceDirectory;
 import org.onosproject.core.ApplicationId;
@@ -63,13 +63,13 @@
 
     protected ServiceDirectory serviceDirectory = new DefaultServiceDirectory();
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected VirtualNetworkService manager;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected IntentService intentService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected VirtualNetworkStore store;
 
 
diff --git a/core/net/src/main/java/org/onosproject/net/intent/impl/installer/DomainIntentInstaller.java b/core/net/src/main/java/org/onosproject/net/intent/impl/installer/DomainIntentInstaller.java
index d2fabff..19473a4 100644
--- a/core/net/src/main/java/org/onosproject/net/intent/impl/installer/DomainIntentInstaller.java
+++ b/core/net/src/main/java/org/onosproject/net/intent/impl/installer/DomainIntentInstaller.java
@@ -16,11 +16,11 @@
 
 package org.onosproject.net.intent.impl.installer;
 
-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.onosproject.net.domain.DomainIntent;
 import org.onosproject.net.domain.DomainIntentOperations;
 import org.onosproject.net.domain.DomainIntentOperationsContext;
@@ -47,16 +47,16 @@
 
     private final Logger log = getLogger(IntentManager.class);
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected IntentExtensionService intentExtensionService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected ObjectiveTrackerService trackerService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected IntentInstallCoordinator intentInstallCoordinator;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected DomainIntentService domainIntentService;
 
     @Activate
diff --git a/core/net/src/main/java/org/onosproject/net/intent/impl/installer/FlowObjectiveIntentInstaller.java b/core/net/src/main/java/org/onosproject/net/intent/impl/installer/FlowObjectiveIntentInstaller.java
index 84717e4..8c9151e 100644
--- a/core/net/src/main/java/org/onosproject/net/intent/impl/installer/FlowObjectiveIntentInstaller.java
+++ b/core/net/src/main/java/org/onosproject/net/intent/impl/installer/FlowObjectiveIntentInstaller.java
@@ -19,11 +19,11 @@
 import com.google.common.collect.ImmutableSet;
 import com.google.common.collect.Lists;
 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.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.onosproject.net.DeviceId;
 import org.onosproject.net.flowobjective.FilteringObjective;
 import org.onosproject.net.flowobjective.FlowObjectiveService;
@@ -63,16 +63,16 @@
     private static final String UNSUPPORT_OBJ = "unsupported objective {}";
     private final Logger log = getLogger(IntentManager.class);
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected IntentExtensionService intentExtensionService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected ObjectiveTrackerService trackerService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected IntentInstallCoordinator intentInstallCoordinator;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected FlowObjectiveService flowObjectiveService;
 
     @Activate
diff --git a/core/net/src/main/java/org/onosproject/net/intent/impl/installer/FlowRuleIntentInstaller.java b/core/net/src/main/java/org/onosproject/net/intent/impl/installer/FlowRuleIntentInstaller.java
index d96de2f..b2cdf5a 100644
--- a/core/net/src/main/java/org/onosproject/net/intent/impl/installer/FlowRuleIntentInstaller.java
+++ b/core/net/src/main/java/org/onosproject/net/intent/impl/installer/FlowRuleIntentInstaller.java
@@ -17,13 +17,6 @@
 package org.onosproject.net.intent.impl.installer;
 
 import com.google.common.collect.Lists;
-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.onlab.util.Tools;
 import org.onosproject.cfg.ComponentConfigService;
 import org.onosproject.core.DefaultApplicationId;
@@ -46,6 +39,12 @@
 import org.onosproject.net.intent.ObjectiveTrackerService;
 import org.onosproject.net.intent.impl.IntentManager;
 import org.osgi.service.component.ComponentContext;
+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.Collection;
@@ -62,6 +61,8 @@
 import static com.google.common.base.Strings.isNullOrEmpty;
 import static java.util.concurrent.Executors.newSingleThreadScheduledExecutor;
 import static org.onlab.util.Tools.groupedThreads;
+import static org.onosproject.net.OsgiPropertyConstants.NON_DISRUPTIVE_INSTALLATION_WAITING_TIME;
+import static org.onosproject.net.OsgiPropertyConstants.NON_DISRUPTIVE_INSTALLATION_WAITING_TIME_DEFAULT;
 import static org.onosproject.net.intent.IntentInstaller.Direction.ADD;
 import static org.onosproject.net.intent.IntentInstaller.Direction.REMOVE;
 import static org.onosproject.net.intent.IntentState.INSTALLED;
@@ -72,33 +73,35 @@
 /**
  * Installer for FlowRuleIntent.
  */
-@Component(immediate = true)
+@Component(
+    immediate = true,
+    property = {
+        NON_DISRUPTIVE_INSTALLATION_WAITING_TIME + ":Integer=" + NON_DISRUPTIVE_INSTALLATION_WAITING_TIME_DEFAULT
+    }
+)
 public class FlowRuleIntentInstaller implements IntentInstaller<FlowRuleIntent> {
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected IntentExtensionService intentExtensionService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected ObjectiveTrackerService trackerService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected IntentInstallCoordinator intentInstallCoordinator;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected FlowRuleService flowRuleService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected ComponentConfigService configService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected IntentStore store;
 
     private ScheduledExecutorService nonDisruptiveIntentInstaller;
 
-    private static final int DEFAULT_NON_DISRUPTIVE_INSTALLATION_WAITING_TIME = 1;
-    @Property(name = "nonDisruptiveInstallationWaitingTime",
-            intValue = DEFAULT_NON_DISRUPTIVE_INSTALLATION_WAITING_TIME,
-            label = "Number of seconds to wait during the non-disruptive installation phases")
-    private int nonDisruptiveInstallationWaitingTime = DEFAULT_NON_DISRUPTIVE_INSTALLATION_WAITING_TIME;
+    /** Number of seconds to wait during the non-disruptive installation phases. */
+    private int nonDisruptiveInstallationWaitingTime = NON_DISRUPTIVE_INSTALLATION_WAITING_TIME_DEFAULT;
 
     protected final Logger log = getLogger(IntentManager.class);
 
@@ -124,12 +127,12 @@
     public void modified(ComponentContext context) {
 
         if (context == null) {
-            nonDisruptiveInstallationWaitingTime = DEFAULT_NON_DISRUPTIVE_INSTALLATION_WAITING_TIME;
+            nonDisruptiveInstallationWaitingTime = NON_DISRUPTIVE_INSTALLATION_WAITING_TIME_DEFAULT;
             log.info("Restored default installation time for non-disruptive reallocation (1 sec.)");
             return;
         }
 
-        String s = Tools.get(context.getProperties(), "nonDisruptiveInstallationWaitingTime");
+        String s = Tools.get(context.getProperties(), NON_DISRUPTIVE_INSTALLATION_WAITING_TIME);
         int nonDisruptiveTime = isNullOrEmpty(s) ? nonDisruptiveInstallationWaitingTime : Integer.parseInt(s);
         if (nonDisruptiveTime != nonDisruptiveInstallationWaitingTime) {
             nonDisruptiveInstallationWaitingTime = nonDisruptiveTime;
diff --git a/core/net/src/main/java/org/onosproject/net/intent/impl/installer/ProtectionEndpointIntentInstaller.java b/core/net/src/main/java/org/onosproject/net/intent/impl/installer/ProtectionEndpointIntentInstaller.java
index 59b4ace..4513945 100644
--- a/core/net/src/main/java/org/onosproject/net/intent/impl/installer/ProtectionEndpointIntentInstaller.java
+++ b/core/net/src/main/java/org/onosproject/net/intent/impl/installer/ProtectionEndpointIntentInstaller.java
@@ -19,11 +19,11 @@
 import com.google.common.collect.ImmutableSet;
 import com.google.common.collect.Sets;
 import org.apache.commons.lang3.tuple.Pair;
-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.onosproject.net.DeviceId;
 import org.onosproject.net.behaviour.protection.ProtectedTransportEndpointDescription;
 import org.onosproject.net.behaviour.protection.ProtectionConfig;
@@ -66,16 +66,16 @@
     private static final String CONFIG_FAILED = "Config operation unsuccessful, expected %s, actual %s.";
     private final Logger log = getLogger(IntentManager.class);
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected IntentExtensionService intentExtensionService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     NetworkConfigService networkConfigService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     IntentInstallCoordinator intentInstallCoordinator;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     ObjectiveTrackerService trackerService;
 
     @Activate
diff --git a/core/net/src/main/java/org/onosproject/net/intf/impl/InterfaceManager.java b/core/net/src/main/java/org/onosproject/net/intf/impl/InterfaceManager.java
index 6f77a98..e70857f 100644
--- a/core/net/src/main/java/org/onosproject/net/intf/impl/InterfaceManager.java
+++ b/core/net/src/main/java/org/onosproject/net/intf/impl/InterfaceManager.java
@@ -20,27 +20,26 @@
 import com.google.common.collect.ImmutableSet;
 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.onlab.packet.IpAddress;
 import org.onlab.packet.VlanId;
 import org.onosproject.event.ListenerRegistry;
+import org.onosproject.net.ConnectPoint;
+import org.onosproject.net.config.BasicNetworkConfigService;
 import org.onosproject.net.config.ConfigException;
+import org.onosproject.net.config.NetworkConfigEvent;
+import org.onosproject.net.config.NetworkConfigListener;
+import org.onosproject.net.config.NetworkConfigService;
 import org.onosproject.net.config.basics.InterfaceConfig;
 import org.onosproject.net.intf.Interface;
 import org.onosproject.net.intf.InterfaceAdminService;
 import org.onosproject.net.intf.InterfaceEvent;
 import org.onosproject.net.intf.InterfaceListener;
 import org.onosproject.net.intf.InterfaceService;
-import org.onosproject.net.ConnectPoint;
-import org.onosproject.net.config.BasicNetworkConfigService;
-import org.onosproject.net.config.NetworkConfigEvent;
-import org.onosproject.net.config.NetworkConfigListener;
-import org.onosproject.net.config.NetworkConfigService;
+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;
 
@@ -58,8 +57,7 @@
 /**
  * Manages the inventory of interfaces in the system.
  */
-@Service
-@Component(immediate = true)
+@Component(immediate = true, service = { InterfaceService.class, InterfaceAdminService.class })
 public class InterfaceManager extends ListenerRegistry<InterfaceEvent, InterfaceListener>
         implements InterfaceService, InterfaceAdminService {
 
@@ -68,11 +66,11 @@
     private static final Class<ConnectPoint> SUBJECT_CLASS = ConnectPoint.class;
     private static final Class<InterfaceConfig> CONFIG_CLASS = InterfaceConfig.class;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected NetworkConfigService configService;
 
     //Dependency to ensure subject factories are properly initialized
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected BasicNetworkConfigService basicNetworkConfigService;
 
     private final InternalConfigListener listener = new InternalConfigListener();
diff --git a/core/net/src/main/java/org/onosproject/net/key/impl/DeviceKeyManager.java b/core/net/src/main/java/org/onosproject/net/key/impl/DeviceKeyManager.java
index 647acf7b23..cc06f47 100644
--- a/core/net/src/main/java/org/onosproject/net/key/impl/DeviceKeyManager.java
+++ b/core/net/src/main/java/org/onosproject/net/key/impl/DeviceKeyManager.java
@@ -16,12 +16,6 @@
 
 package org.onosproject.net.key.impl;
 
-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.event.AbstractListenerManager;
 import org.onosproject.net.key.DeviceKey;
 import org.onosproject.net.key.DeviceKeyAdminService;
@@ -31,6 +25,11 @@
 import org.onosproject.net.key.DeviceKeyService;
 import org.onosproject.net.key.DeviceKeyStore;
 import org.onosproject.net.key.DeviceKeyStoreDelegate;
+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;
@@ -43,8 +42,7 @@
 /**
  * Implementation of device key services.
  */
-@Component(immediate = true)
-@Service
+@Component(immediate = true, service = { DeviceKeyService.class, DeviceKeyAdminService.class })
 public class DeviceKeyManager extends AbstractListenerManager<DeviceKeyEvent, DeviceKeyListener>
         implements DeviceKeyService, DeviceKeyAdminService {
 
@@ -52,7 +50,7 @@
 
     private DeviceKeyStoreDelegate delegate = this::post;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected DeviceKeyStore store;
 
     @Activate
diff --git a/core/net/src/main/java/org/onosproject/net/link/impl/LinkManager.java b/core/net/src/main/java/org/onosproject/net/link/impl/LinkManager.java
index 0dfd275..326020b 100644
--- a/core/net/src/main/java/org/onosproject/net/link/impl/LinkManager.java
+++ b/core/net/src/main/java/org/onosproject/net/link/impl/LinkManager.java
@@ -17,25 +17,16 @@
 
 import com.google.common.collect.FluentIterable;
 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.net.provider.AbstractListenerProviderRegistry;
-import org.onosproject.net.provider.ProviderId;
-import org.onosproject.net.config.NetworkConfigEvent;
-import org.onosproject.net.config.NetworkConfigListener;
-import org.onosproject.net.config.NetworkConfigService;
-import org.onosproject.net.config.basics.BasicLinkConfig;
 import org.onosproject.net.ConnectPoint;
 import org.onosproject.net.DeviceId;
 import org.onosproject.net.Link;
 import org.onosproject.net.Link.State;
 import org.onosproject.net.LinkKey;
 import org.onosproject.net.MastershipRole;
+import org.onosproject.net.config.NetworkConfigEvent;
+import org.onosproject.net.config.NetworkConfigListener;
+import org.onosproject.net.config.NetworkConfigService;
+import org.onosproject.net.config.basics.BasicLinkConfig;
 import org.onosproject.net.device.DeviceEvent;
 import org.onosproject.net.device.DeviceListener;
 import org.onosproject.net.device.DeviceService;
@@ -49,7 +40,14 @@
 import org.onosproject.net.link.LinkService;
 import org.onosproject.net.link.LinkStore;
 import org.onosproject.net.link.LinkStoreDelegate;
+import org.onosproject.net.provider.AbstractListenerProviderRegistry;
 import org.onosproject.net.provider.AbstractProviderService;
+import org.onosproject.net.provider.ProviderId;
+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.Optional;
@@ -58,15 +56,14 @@
 import static com.google.common.base.Preconditions.checkNotNull;
 import static org.onosproject.net.LinkKey.linkKey;
 import static org.onosproject.security.AppGuard.checkPermission;
+import static org.onosproject.security.AppPermission.Type.LINK_READ;
 import static org.slf4j.LoggerFactory.getLogger;
-import static org.onosproject.security.AppPermission.Type.*;
 
 
 /**
  * Provides basic implementation of the link SB &amp; NB APIs.
  */
-@Component(immediate = true)
-@Service
+@Component(immediate = true, service = { LinkService.class, LinkAdminService.class, LinkProviderRegistry.class })
 public class LinkManager
         extends AbstractListenerProviderRegistry<LinkEvent, LinkListener, LinkProvider, LinkProviderService>
         implements LinkService, LinkAdminService, LinkProviderRegistry {
@@ -83,13 +80,13 @@
 
     private final NetworkConfigListener networkConfigListener = new InternalNetworkConfigListener();
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected LinkStore store;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected DeviceService deviceService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected NetworkConfigService networkConfigService;
 
     @Activate
diff --git a/core/net/src/main/java/org/onosproject/net/mcast/impl/MulticastRouteManager.java b/core/net/src/main/java/org/onosproject/net/mcast/impl/MulticastRouteManager.java
index 913dcdb..35ca7eb 100644
--- a/core/net/src/main/java/org/onosproject/net/mcast/impl/MulticastRouteManager.java
+++ b/core/net/src/main/java/org/onosproject/net/mcast/impl/MulticastRouteManager.java
@@ -15,14 +15,6 @@
  */
 package org.onosproject.net.mcast.impl;
 
-import java.util.Set;
-
-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.event.AbstractListenerManager;
 import org.onosproject.net.ConnectPoint;
 import org.onosproject.net.mcast.McastEvent;
@@ -31,16 +23,22 @@
 import org.onosproject.net.mcast.McastStore;
 import org.onosproject.net.mcast.McastStoreDelegate;
 import org.onosproject.net.mcast.MulticastRouteService;
+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.Set;
+
 import static com.google.common.base.Preconditions.checkNotNull;
 import static org.slf4j.LoggerFactory.getLogger;
 
 /**
  * An implementation of a multicast route table.
  */
-@Component(immediate = true)
-@Service
+@Component(immediate = true, service = MulticastRouteService.class)
 public class MulticastRouteManager
         extends AbstractListenerManager<McastEvent, McastListener>
         implements MulticastRouteService {
@@ -50,7 +48,7 @@
 
     private final McastStoreDelegate delegate = new InternalMcastStoreDelegate();
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected McastStore store;
 
     @Activate
diff --git a/core/net/src/main/java/org/onosproject/net/meter/impl/MeterManager.java b/core/net/src/main/java/org/onosproject/net/meter/impl/MeterManager.java
index f39b328..a1ff4e5 100644
--- a/core/net/src/main/java/org/onosproject/net/meter/impl/MeterManager.java
+++ b/core/net/src/main/java/org/onosproject/net/meter/impl/MeterManager.java
@@ -15,14 +15,6 @@
  */
 package org.onosproject.net.meter.impl;
 
-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.util.TriConsumer;
 import org.onosproject.cfg.ComponentConfigService;
 import org.onosproject.mastership.MastershipService;
@@ -30,8 +22,8 @@
 import org.onosproject.net.device.DeviceService;
 import org.onosproject.net.driver.DriverService;
 import org.onosproject.net.meter.DefaultMeter;
-import org.onosproject.net.meter.MeterCellId.MeterCellType;
 import org.onosproject.net.meter.Meter;
+import org.onosproject.net.meter.MeterCellId.MeterCellType;
 import org.onosproject.net.meter.MeterEvent;
 import org.onosproject.net.meter.MeterFailReason;
 import org.onosproject.net.meter.MeterFeatures;
@@ -51,6 +43,12 @@
 import org.onosproject.net.provider.AbstractListenerProviderRegistry;
 import org.onosproject.net.provider.AbstractProviderService;
 import org.osgi.service.component.ComponentContext;
+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.Collection;
@@ -64,49 +62,56 @@
 import static java.util.concurrent.Executors.newFixedThreadPool;
 import static org.onlab.util.Tools.get;
 import static org.onlab.util.Tools.groupedThreads;
+import static org.onosproject.net.OsgiPropertyConstants.MM_FALLBACK_METER_POLL_FREQUENCY;
+import static org.onosproject.net.OsgiPropertyConstants.MM_FALLBACK_METER_POLL_FREQUENCY_DEFAULT;
+import static org.onosproject.net.OsgiPropertyConstants.MM_NUM_THREADS;
+import static org.onosproject.net.OsgiPropertyConstants.MM_NUM_THREADS_DEFAULT;
 import static org.slf4j.LoggerFactory.getLogger;
 
 /**
  * Provides implementation of the meter service APIs.
  */
-@Component(immediate = true)
-@Service
+@Component(
+    immediate = true,
+    service = {
+        MeterService.class,
+        MeterProviderRegistry.class
+    },
+    property = {
+        MM_NUM_THREADS + ":Integer=" + MM_NUM_THREADS_DEFAULT,
+        MM_FALLBACK_METER_POLL_FREQUENCY + ":Integer=" + MM_FALLBACK_METER_POLL_FREQUENCY_DEFAULT
+    }
+)
 public class MeterManager
         extends AbstractListenerProviderRegistry<MeterEvent, MeterListener, MeterProvider, MeterProviderService>
         implements MeterService, MeterProviderRegistry {
 
-    private static final String NUM_THREAD = "numThreads";
     private static final String WORKER_PATTERN = "installer-%d";
     private static final String GROUP_THREAD_NAME = "onos/meter";
 
-    private static final int DEFAULT_NUM_THREADS = 4;
-    @Property(name = NUM_THREAD,
-            intValue = DEFAULT_NUM_THREADS,
-            label = "Number of worker threads")
-    private int numThreads = DEFAULT_NUM_THREADS;
-
     private final Logger log = getLogger(getClass());
     private final MeterStoreDelegate delegate = new InternalMeterStoreDelegate();
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     private MeterStore store;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected DriverService driverService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected DeviceService deviceService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected ComponentConfigService cfgService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected MastershipService mastershipService;
 
-    private static final int DEFAULT_POLL_FREQUENCY = 30;
-    @Property(name = "fallbackMeterPollFrequency", intValue = DEFAULT_POLL_FREQUENCY,
-            label = "Frequency (in seconds) for polling meters via fallback provider")
-    private int fallbackMeterPollFrequency = DEFAULT_POLL_FREQUENCY;
+    /** Number of worker threads. */
+    private int numThreads = MM_NUM_THREADS_DEFAULT;
+
+    /** Frequency (in seconds) for polling meters via fallback provider. */
+    private int fallbackMeterPollFrequency = MM_FALLBACK_METER_POLL_FREQUENCY_DEFAULT;
 
     private TriConsumer<MeterRequest, MeterStoreResult, Throwable> onComplete;
 
@@ -135,9 +140,9 @@
 
         };
 
+        modified(context);
         executorService = newFixedThreadPool(numThreads,
                                              groupedThreads(GROUP_THREAD_NAME, WORKER_PATTERN, log));
-        modified(context);
         log.info("Started");
     }
 
@@ -168,11 +173,19 @@
     private void readComponentConfiguration(ComponentContext context) {
         Dictionary<?, ?> properties = context.getProperties();
 
-        String s = get(properties, "fallbackMeterPollFrequency");
+        String s = get(properties, MM_FALLBACK_METER_POLL_FREQUENCY);
         try {
-            fallbackMeterPollFrequency = isNullOrEmpty(s) ? DEFAULT_POLL_FREQUENCY : Integer.parseInt(s);
+            fallbackMeterPollFrequency = isNullOrEmpty(s) ?
+                MM_FALLBACK_METER_POLL_FREQUENCY_DEFAULT : Integer.parseInt(s);
         } catch (NumberFormatException e) {
-            fallbackMeterPollFrequency = DEFAULT_POLL_FREQUENCY;
+            fallbackMeterPollFrequency = MM_FALLBACK_METER_POLL_FREQUENCY_DEFAULT;
+        }
+
+        s = get(properties, MM_NUM_THREADS);
+        try {
+            numThreads = isNullOrEmpty(s) ? MM_NUM_THREADS_DEFAULT : Integer.parseInt(s);
+        } catch (NumberFormatException e) {
+            numThreads = MM_NUM_THREADS_DEFAULT;
         }
     }
 
diff --git a/core/net/src/main/java/org/onosproject/net/neighbour/impl/NeighbourResolutionManager.java b/core/net/src/main/java/org/onosproject/net/neighbour/impl/NeighbourResolutionManager.java
index 0101c84..116b063 100644
--- a/core/net/src/main/java/org/onosproject/net/neighbour/impl/NeighbourResolutionManager.java
+++ b/core/net/src/main/java/org/onosproject/net/neighbour/impl/NeighbourResolutionManager.java
@@ -20,14 +20,6 @@
 import com.google.common.collect.ImmutableMap;
 import com.google.common.collect.Multimaps;
 import com.google.common.collect.SetMultimap;
-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.packet.Ethernet;
 import org.onlab.packet.ICMP6;
 import org.onlab.packet.IPv6;
@@ -38,22 +30,28 @@
 import org.onosproject.cfg.ComponentConfigService;
 import org.onosproject.core.ApplicationId;
 import org.onosproject.core.CoreService;
+import org.onosproject.net.ConnectPoint;
+import org.onosproject.net.edge.EdgePortService;
+import org.onosproject.net.flow.DefaultTrafficSelector;
+import org.onosproject.net.flow.TrafficSelector;
+import org.onosproject.net.host.HostService;
 import org.onosproject.net.intf.Interface;
 import org.onosproject.net.neighbour.NeighbourHandlerRegistration;
 import org.onosproject.net.neighbour.NeighbourMessageActions;
 import org.onosproject.net.neighbour.NeighbourMessageContext;
 import org.onosproject.net.neighbour.NeighbourMessageHandler;
 import org.onosproject.net.neighbour.NeighbourResolutionService;
-import org.onosproject.net.ConnectPoint;
-import org.onosproject.net.edge.EdgePortService;
-import org.onosproject.net.flow.DefaultTrafficSelector;
-import org.onosproject.net.flow.TrafficSelector;
-import org.onosproject.net.host.HostService;
 import org.onosproject.net.packet.InboundPacket;
 import org.onosproject.net.packet.PacketContext;
 import org.onosproject.net.packet.PacketProcessor;
 import org.onosproject.net.packet.PacketService;
 import org.osgi.service.component.ComponentContext;
+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 org.slf4j.LoggerFactory;
 
@@ -70,43 +68,53 @@
 import static org.onlab.packet.ICMP6.NEIGHBOR_ADVERTISEMENT;
 import static org.onlab.packet.ICMP6.NEIGHBOR_SOLICITATION;
 import static org.onlab.packet.IPv6.PROTOCOL_ICMP6;
+import static org.onosproject.net.OsgiPropertyConstants.NRM_ARP_ENABLED;
+import static org.onosproject.net.OsgiPropertyConstants.NRM_ARP_ENABLED_DEFAULT;
+import static org.onosproject.net.OsgiPropertyConstants.NRM_NDP_ENABLED;
+import static org.onosproject.net.OsgiPropertyConstants.NRM_NDP_ENABLED_DEFAULT;
+import static org.onosproject.net.OsgiPropertyConstants.NRM_REQUEST_INTERCEPTS_ENABLED;
+import static org.onosproject.net.OsgiPropertyConstants.NRM_REQUEST_INTERCEPTS_ENABLED_DEFAULT;
 import static org.onosproject.net.packet.PacketPriority.CONTROL;
 
 /**
  * Manages handlers for neighbour messages.
  */
-@Service
-@Component(immediate = true)
+@Component(
+    immediate = true,
+    service = NeighbourResolutionService.class,
+    property = {
+        NRM_ARP_ENABLED + ":Boolean=" + NRM_ARP_ENABLED_DEFAULT,
+        NRM_NDP_ENABLED + ":Boolean=" + NRM_NDP_ENABLED,
+        NRM_REQUEST_INTERCEPTS_ENABLED + ":Boolean=" + NRM_REQUEST_INTERCEPTS_ENABLED_DEFAULT
+    }
+)
 public class NeighbourResolutionManager implements NeighbourResolutionService {
 
     private final Logger log = LoggerFactory.getLogger(getClass());
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected CoreService coreService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected HostService hostService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected EdgePortService edgeService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected PacketService packetService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected ComponentConfigService componentConfigService;
 
-    @Property(name = "arpEnabled", boolValue = true,
-            label = "Enable Address resolution protocol")
-    protected boolean arpEnabled = true;
+    /** Enable Address resolution protocol. */
+    protected boolean arpEnabled = NRM_ARP_ENABLED_DEFAULT;
 
-    @Property(name = "ndpEnabled", boolValue = false,
-            label = "Enable IPv6 neighbour discovery")
-    protected boolean ndpEnabled = false;
+    /** Enable IPv6 neighbour discovery. */
+    protected boolean ndpEnabled = NRM_NDP_ENABLED_DEFAULT;
 
-    @Property(name = "requestInterceptsEnabled", boolValue = true,
-            label = "Enable requesting packet intercepts")
-    private boolean requestInterceptsEnabled = true;
+    /** Enable requesting packet intercepts. */
+    private boolean requestInterceptsEnabled = NRM_REQUEST_INTERCEPTS_ENABLED_DEFAULT;
 
     private static final String APP_NAME = "org.onosproject.neighbour";
     private ApplicationId appId;
@@ -141,21 +149,21 @@
         Dictionary<?, ?> properties = context.getProperties();
         Boolean flag;
 
-        flag = Tools.isPropertyEnabled(properties, "ndpEnabled");
+        flag = Tools.isPropertyEnabled(properties, NRM_NDP_ENABLED);
         if (flag != null) {
             ndpEnabled = flag;
             log.info("IPv6 neighbor discovery is {}",
                     ndpEnabled ? "enabled" : "disabled");
         }
 
-        flag = Tools.isPropertyEnabled(properties, "arpEnabled");
+        flag = Tools.isPropertyEnabled(properties, NRM_ARP_ENABLED);
         if (flag != null) {
             arpEnabled = flag;
             log.info("Address resolution protocol is {}",
                      arpEnabled ? "enabled" : "disabled");
         }
 
-        flag = Tools.isPropertyEnabled(properties, "requestInterceptsEnabled");
+        flag = Tools.isPropertyEnabled(properties, NRM_REQUEST_INTERCEPTS_ENABLED);
         if (flag == null) {
             log.info("Request intercepts is not configured, " +
                              "using current value of {}", requestInterceptsEnabled);
diff --git a/core/net/src/main/java/org/onosproject/net/package-info.java b/core/net/src/main/java/org/onosproject/net/package-info.java
new file mode 100644
index 0000000..ada4d32
--- /dev/null
+++ b/core/net/src/main/java/org/onosproject/net/package-info.java
@@ -0,0 +1,20 @@
+/*
+ * Copyright 2018-present Open Networking Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/**
+ * Constants for OSGi properties in the core/net components.
+ */
+package org.onosproject.net;
diff --git a/core/net/src/main/java/org/onosproject/net/packet/impl/PacketManager.java b/core/net/src/main/java/org/onosproject/net/packet/impl/PacketManager.java
index ac5c732..ff63efe 100644
--- a/core/net/src/main/java/org/onosproject/net/packet/impl/PacketManager.java
+++ b/core/net/src/main/java/org/onosproject/net/packet/impl/PacketManager.java
@@ -17,12 +17,6 @@
 
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.Lists;
-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.NodeId;
 import org.onosproject.core.ApplicationId;
@@ -59,6 +53,11 @@
 import org.onosproject.net.packet.PacketStoreDelegate;
 import org.onosproject.net.provider.AbstractProviderRegistry;
 import org.onosproject.net.provider.AbstractProviderService;
+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.List;
@@ -77,8 +76,7 @@
 /**
  * Provides a basic implementation of the packet SB &amp; NB APIs.
  */
-@Component(immediate = true)
-@Service
+@Component(immediate = true, service = { PacketService.class, PacketProviderRegistry.class })
 public class PacketManager
         extends AbstractProviderRegistry<PacketProvider, PacketProviderService>
         implements PacketService, PacketProviderRegistry {
@@ -93,22 +91,22 @@
 
     private final PacketStoreDelegate delegate = new InternalStoreDelegate();
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected CoreService coreService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected ClusterService clusterService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected DeviceService deviceService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected DriverService driverService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected PacketStore store;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected FlowObjectiveService objectiveService;
 
     private ExecutorService eventHandlingExecutor;
diff --git a/core/net/src/main/java/org/onosproject/net/pi/impl/PiPipeconfManager.java b/core/net/src/main/java/org/onosproject/net/pi/impl/PiPipeconfManager.java
index 02850ff..fa10d33 100644
--- a/core/net/src/main/java/org/onosproject/net/pi/impl/PiPipeconfManager.java
+++ b/core/net/src/main/java/org/onosproject/net/pi/impl/PiPipeconfManager.java
@@ -20,12 +20,6 @@
 import com.google.common.collect.ImmutableSet;
 import com.google.common.collect.Sets;
 import com.google.common.util.concurrent.Striped;
-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.ItemNotFoundException;
 import org.onlab.util.SharedExecutors;
 import org.onosproject.net.DeviceId;
@@ -45,6 +39,11 @@
 import org.onosproject.net.pi.service.PiPipeconfConfig;
 import org.onosproject.net.pi.service.PiPipeconfMappingStore;
 import org.onosproject.net.pi.service.PiPipeconfService;
+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.HashMap;
@@ -67,8 +66,7 @@
 /**
  * Implementation of the PiPipeconfService.
  */
-@Component(immediate = true)
-@Service
+@Component(immediate = true, service = PiPipeconfService.class)
 @Beta
 public class PiPipeconfManager implements PiPipeconfService {
 
@@ -79,13 +77,13 @@
 
     private static final int MISSING_DRIVER_WATCHDOG_INTERVAL = 5; // Seconds.
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected NetworkConfigRegistry cfgService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected DriverAdminService driverAdminService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     private PiPipeconfMappingStore pipeconfMappingStore;
 
     // Registered pipeconf are replicated through the app subsystem and
diff --git a/core/net/src/main/java/org/onosproject/net/pi/impl/PiPipeconfWatchdogManager.java b/core/net/src/main/java/org/onosproject/net/pi/impl/PiPipeconfWatchdogManager.java
index 6b41fd5..62fb157 100644
--- a/core/net/src/main/java/org/onosproject/net/pi/impl/PiPipeconfWatchdogManager.java
+++ b/core/net/src/main/java/org/onosproject/net/pi/impl/PiPipeconfWatchdogManager.java
@@ -18,14 +18,6 @@
 
 import com.google.common.collect.Maps;
 import com.google.common.util.concurrent.Striped;
-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.util.KryoNamespace;
 import org.onlab.util.Tools;
 import org.onosproject.cfg.ComponentConfigService;
@@ -54,6 +46,12 @@
 import org.onosproject.store.service.StorageService;
 import org.onosproject.store.service.WallClockTimestamp;
 import org.osgi.service.component.ComponentContext;
+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.Collections;
@@ -69,6 +67,8 @@
 import java.util.concurrent.locks.Lock;
 
 import static org.onlab.util.Tools.groupedThreads;
+import static org.onosproject.net.OsgiPropertyConstants.PWM_PROBE_INTERVAL;
+import static org.onosproject.net.OsgiPropertyConstants.PWM_PROBE_INTERVAL_DEFAULT;
 import static org.slf4j.LoggerFactory.getLogger;
 
 /**
@@ -76,8 +76,13 @@
  * pipeline probe task and listens for device events to update the status of the
  * pipeline.
  */
-@Component(immediate = true)
-@Service
+@Component(
+    immediate = true,
+    service = PiPipeconfWatchdogService.class,
+    property = {
+        PWM_PROBE_INTERVAL + ":Integer=" + PWM_PROBE_INTERVAL_DEFAULT
+    }
+)
 public class PiPipeconfWatchdogManager
         extends AbstractListenerManager<PiPipeconfWatchdogEvent, PiPipeconfWatchdogListener>
         implements PiPipeconfWatchdogService {
@@ -89,29 +94,26 @@
     // binaries over slow network).
     private static final long PIPECONF_SET_TIMEOUT = 60; // Seconds.
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     private PiPipeconfMappingStore pipeconfMappingStore;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     private DeviceService deviceService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     private MastershipService mastershipService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected PiPipeconfService pipeconfService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected StorageService storageService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     private ComponentConfigService componentConfigService;
 
-    private static final String PROBE_INTERVAL = "probeInterval";
-    private static final int DEFAULT_PROBE_INTERVAL = 15;
-    @Property(name = PROBE_INTERVAL, intValue = DEFAULT_PROBE_INTERVAL,
-            label = "Configure interval in seconds for device pipeconf probing")
-    private int probeInterval = DEFAULT_PROBE_INTERVAL;
+    /** Configure interval in seconds for device pipeconf probing. */
+    private int probeInterval = PWM_PROBE_INTERVAL_DEFAULT;
 
     protected ExecutorService executor = Executors.newFixedThreadPool(
             30, groupedThreads("onos/pipeconf-watchdog", "%d", log));
@@ -158,9 +160,9 @@
         Dictionary<?, ?> properties = context.getProperties();
         final int oldProbeInterval = probeInterval;
         probeInterval = Tools.getIntegerProperty(
-                properties, PROBE_INTERVAL, DEFAULT_PROBE_INTERVAL);
+                properties, PWM_PROBE_INTERVAL, PWM_PROBE_INTERVAL_DEFAULT);
         log.info("Configured. {} is configured to {} seconds",
-                 PROBE_INTERVAL, probeInterval);
+                 PWM_PROBE_INTERVAL_DEFAULT, probeInterval);
 
         if (oldProbeInterval != probeInterval) {
             rescheduleProbeTask();
diff --git a/core/net/src/main/java/org/onosproject/net/pi/impl/PiTranslationServiceImpl.java b/core/net/src/main/java/org/onosproject/net/pi/impl/PiTranslationServiceImpl.java
index a28ab0a..f024f6c 100644
--- a/core/net/src/main/java/org/onosproject/net/pi/impl/PiTranslationServiceImpl.java
+++ b/core/net/src/main/java/org/onosproject/net/pi/impl/PiTranslationServiceImpl.java
@@ -16,12 +16,6 @@
 
 package org.onosproject.net.pi.impl;
 
-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.net.Device;
 import org.onosproject.net.DeviceId;
 import org.onosproject.net.device.DeviceService;
@@ -43,33 +37,37 @@
 import org.onosproject.net.pi.service.PiMulticastGroupTranslator;
 import org.onosproject.net.pi.service.PiTranslationException;
 import org.onosproject.net.pi.service.PiTranslationService;
+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;
 
 /**
  * Implementation of the PI translation service.
  */
-@Component(immediate = true)
-@Service
+@Component(immediate = true, service = PiTranslationService.class)
 public class PiTranslationServiceImpl implements PiTranslationService {
 
     private final Logger log = LoggerFactory.getLogger(this.getClass());
 
     // TODO: implement cache to speed up translation.
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected DeviceService deviceService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     private PiFlowRuleTranslationStore flowRuleTranslationStore;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     private PiGroupTranslationStore groupTranslationStore;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     private PiMulticastGroupTranslationStore mcGroupTranslationStore;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     private PiMeterTranslationStore meterTranslationStore;
 
     private PiFlowRuleTranslator flowRuleTranslator;
diff --git a/core/net/src/main/java/org/onosproject/net/region/impl/RegionManager.java b/core/net/src/main/java/org/onosproject/net/region/impl/RegionManager.java
index 76b3f9e..c1b9327 100644
--- a/core/net/src/main/java/org/onosproject/net/region/impl/RegionManager.java
+++ b/core/net/src/main/java/org/onosproject/net/region/impl/RegionManager.java
@@ -17,12 +17,6 @@
 package org.onosproject.net.region.impl;
 
 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.apache.felix.scr.annotations.Service;
 import org.onlab.util.ItemNotFoundException;
 import org.onosproject.cluster.NodeId;
 import org.onosproject.event.AbstractListenerManager;
@@ -44,6 +38,11 @@
 import org.onosproject.net.region.RegionStore;
 import org.onosproject.net.region.RegionStoreDelegate;
 import org.onosproject.ui.topo.LayoutLocation;
+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;
@@ -61,8 +60,7 @@
 /**
  * Provides implementation of the region service APIs.
  */
-@Component(immediate = true)
-@Service
+@Component(immediate = true, service = {RegionAdminService.class, RegionService.class})
 public class RegionManager extends AbstractListenerManager<RegionEvent, RegionListener>
         implements RegionAdminService, RegionService {
 
@@ -82,10 +80,10 @@
 
     private RegionStoreDelegate delegate = this::post;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected RegionStore store;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected NetworkConfigService networkConfigService;
 
     @Activate
diff --git a/core/net/src/main/java/org/onosproject/net/resource/impl/ResourceManager.java b/core/net/src/main/java/org/onosproject/net/resource/impl/ResourceManager.java
index eca685a..81af96d 100644
--- a/core/net/src/main/java/org/onosproject/net/resource/impl/ResourceManager.java
+++ b/core/net/src/main/java/org/onosproject/net/resource/impl/ResourceManager.java
@@ -17,15 +17,10 @@
 
 import com.google.common.annotations.Beta;
 import com.google.common.collect.ImmutableList;
-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.Tools;
 import org.onosproject.event.AbstractListenerManager;
 import org.onosproject.net.resource.DiscreteResourceId;
+import org.onosproject.net.resource.Resource;
 import org.onosproject.net.resource.ResourceAdminService;
 import org.onosproject.net.resource.ResourceAllocation;
 import org.onosproject.net.resource.ResourceConsumer;
@@ -33,9 +28,13 @@
 import org.onosproject.net.resource.ResourceId;
 import org.onosproject.net.resource.ResourceListener;
 import org.onosproject.net.resource.ResourceService;
-import org.onosproject.net.resource.Resource;
 import org.onosproject.net.resource.ResourceStore;
 import org.onosproject.net.resource.ResourceStoreDelegate;
+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;
@@ -45,20 +44,19 @@
 
 import static com.google.common.base.Preconditions.checkNotNull;
 import static org.onosproject.security.AppGuard.checkPermission;
-import static org.onosproject.security.AppPermission.Type.RESOURCE_WRITE;
 import static org.onosproject.security.AppPermission.Type.RESOURCE_READ;
+import static org.onosproject.security.AppPermission.Type.RESOURCE_WRITE;
 import static org.slf4j.LoggerFactory.getLogger;
 
 /**
  * An implementation of ResourceService.
  */
-@Component(immediate = true)
-@Service
+@Component(immediate = true, service = {ResourceService.class, ResourceAdminService.class})
 @Beta
 public final class ResourceManager extends AbstractListenerManager<ResourceEvent, ResourceListener>
         implements ResourceService, ResourceAdminService {
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected ResourceStore store;
 
     private final Logger log = getLogger(getClass());
diff --git a/core/net/src/main/java/org/onosproject/net/resource/impl/ResourceRegistrar.java b/core/net/src/main/java/org/onosproject/net/resource/impl/ResourceRegistrar.java
index 9811d99..7c44f2a 100644
--- a/core/net/src/main/java/org/onosproject/net/resource/impl/ResourceRegistrar.java
+++ b/core/net/src/main/java/org/onosproject/net/resource/impl/ResourceRegistrar.java
@@ -18,11 +18,11 @@
 import com.google.common.annotations.Beta;
 import com.google.common.collect.ImmutableList;
 
-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.onosproject.mastership.MastershipService;
 import org.onosproject.net.ConnectPoint;
 import org.onosproject.net.config.ConfigFactory;
@@ -51,22 +51,22 @@
 @Beta
 public final class ResourceRegistrar {
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     ResourceAdminService adminService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     ResourceService resourceService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     DriverService driverService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     DeviceService deviceService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     MastershipService mastershipService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     NetworkConfigRegistry cfgRegistry;
 
     private final Logger log = getLogger(getClass());
diff --git a/core/net/src/main/java/org/onosproject/net/statistic/impl/FlowStatisticManager.java b/core/net/src/main/java/org/onosproject/net/statistic/impl/FlowStatisticManager.java
index 2af9bad..7f984ab 100644
--- a/core/net/src/main/java/org/onosproject/net/statistic/impl/FlowStatisticManager.java
+++ b/core/net/src/main/java/org/onosproject/net/statistic/impl/FlowStatisticManager.java
@@ -16,21 +16,9 @@
 
 package org.onosproject.net.statistic.impl;
 
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Objects;
-import java.util.Set;
-import java.util.TreeMap;
-import java.util.stream.Collectors;
-
-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.base.MoreObjects;
+import com.google.common.base.Predicate;
+import com.google.common.collect.ImmutableSet;
 import org.onosproject.net.ConnectPoint;
 import org.onosproject.net.Device;
 import org.onosproject.net.Port;
@@ -52,11 +40,21 @@
 import org.onosproject.net.statistic.SummaryFlowEntryWithLoad;
 import org.onosproject.net.statistic.TypedFlowEntryWithLoad;
 import org.onosproject.utils.Comparators;
+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.base.MoreObjects;
-import com.google.common.base.Predicate;
-import com.google.common.collect.ImmutableSet;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+import java.util.Set;
+import java.util.TreeMap;
+import java.util.stream.Collectors;
 
 import static com.google.common.base.Preconditions.checkNotNull;
 import static org.onosproject.security.AppGuard.checkPermission;
@@ -66,15 +64,14 @@
 /**
  * Provides an implementation of the Flow Statistic Service.
  */
-@Component(immediate = true)
-@Service
+@Component(immediate = true, service = FlowStatisticService.class)
 public class FlowStatisticManager implements FlowStatisticService {
     private final Logger log = getLogger(getClass());
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected StatisticStore statisticStore;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected DeviceService deviceService;
 
     @Activate
diff --git a/core/net/src/main/java/org/onosproject/net/statistic/impl/StatisticManager.java b/core/net/src/main/java/org/onosproject/net/statistic/impl/StatisticManager.java
index 545918c..846b0e0 100644
--- a/core/net/src/main/java/org/onosproject/net/statistic/impl/StatisticManager.java
+++ b/core/net/src/main/java/org/onosproject/net/statistic/impl/StatisticManager.java
@@ -19,18 +19,11 @@
 import com.google.common.base.Predicate;
 import com.google.common.collect.FluentIterable;
 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.apache.felix.scr.annotations.Service;
 import org.onosproject.core.ApplicationId;
 import org.onosproject.core.GroupId;
 import org.onosproject.net.ConnectPoint;
 import org.onosproject.net.Link;
 import org.onosproject.net.Path;
-
 import org.onosproject.net.flow.FlowEntry;
 import org.onosproject.net.flow.FlowRule;
 import org.onosproject.net.flow.FlowRuleEvent;
@@ -40,6 +33,11 @@
 import org.onosproject.net.statistic.Load;
 import org.onosproject.net.statistic.StatisticService;
 import org.onosproject.net.statistic.StatisticStore;
+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.Collections;
@@ -48,24 +46,23 @@
 import java.util.Set;
 
 import static com.google.common.base.Preconditions.checkNotNull;
-import static org.slf4j.LoggerFactory.getLogger;
 import static org.onosproject.security.AppGuard.checkPermission;
-import static org.onosproject.security.AppPermission.Type.*;
+import static org.onosproject.security.AppPermission.Type.STATISTIC_READ;
+import static org.slf4j.LoggerFactory.getLogger;
 
 
 /**
  * Provides an implementation of the Statistic Service.
  */
-@Component(immediate = true)
-@Service
+@Component(immediate = true, service = StatisticService.class)
 public class StatisticManager implements StatisticService {
 
     private final Logger log = getLogger(getClass());
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected FlowRuleService flowRuleService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected StatisticStore statisticStore;
 
 
diff --git a/core/net/src/main/java/org/onosproject/net/topology/impl/DefaultTopologyProvider.java b/core/net/src/main/java/org/onosproject/net/topology/impl/DefaultTopologyProvider.java
index 1aad105..5321a3e 100644
--- a/core/net/src/main/java/org/onosproject/net/topology/impl/DefaultTopologyProvider.java
+++ b/core/net/src/main/java/org/onosproject/net/topology/impl/DefaultTopologyProvider.java
@@ -15,30 +15,7 @@
  */
 package org.onosproject.net.topology.impl;
 
-import static com.google.common.base.Strings.isNullOrEmpty;
-import static java.util.concurrent.Executors.newFixedThreadPool;
-import static org.onlab.util.Tools.get;
-import static org.onlab.util.Tools.groupedThreads;
-import static org.onosproject.core.CoreService.CORE_PROVIDER_ID;
-import static org.onosproject.net.device.DeviceEvent.Type.DEVICE_ADDED;
-import static org.onosproject.net.device.DeviceEvent.Type.DEVICE_AVAILABILITY_CHANGED;
-import static org.onosproject.net.device.DeviceEvent.Type.DEVICE_REMOVED;
-import static org.slf4j.LoggerFactory.getLogger;
-
-import java.util.Collections;
-import java.util.Dictionary;
-import java.util.List;
-import java.util.Timer;
-import java.util.concurrent.ExecutorService;
-
-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 com.google.common.collect.ImmutableList;
 import org.onlab.util.AbstractAccumulator;
 import org.onlab.util.Accumulator;
 import org.onosproject.cfg.ComponentConfigService;
@@ -56,53 +33,80 @@
 import org.onosproject.net.topology.TopologyProviderRegistry;
 import org.onosproject.net.topology.TopologyProviderService;
 import org.osgi.service.component.ComponentContext;
+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 com.google.common.collect.ImmutableList;
+import java.util.Collections;
+import java.util.Dictionary;
+import java.util.List;
+import java.util.Timer;
+import java.util.concurrent.ExecutorService;
+
+import static com.google.common.base.Strings.isNullOrEmpty;
+import static java.util.concurrent.Executors.newFixedThreadPool;
+import static org.onlab.util.Tools.get;
+import static org.onlab.util.Tools.groupedThreads;
+import static org.onosproject.core.CoreService.CORE_PROVIDER_ID;
+import static org.onosproject.net.OsgiPropertyConstants.DTP_MAX_BATCH_MS;
+import static org.onosproject.net.OsgiPropertyConstants.DTP_MAX_BATCH_MS_DEFAULT;
+import static org.onosproject.net.OsgiPropertyConstants.DTP_MAX_EVENTS;
+import static org.onosproject.net.OsgiPropertyConstants.DTP_MAX_EVENTS_DEFAULT;
+import static org.onosproject.net.OsgiPropertyConstants.DTP_MAX_IDLE_MS;
+import static org.onosproject.net.OsgiPropertyConstants.DTP_MAX_IDLE_MS_DEFAULT;
+import static org.onosproject.net.device.DeviceEvent.Type.DEVICE_ADDED;
+import static org.onosproject.net.device.DeviceEvent.Type.DEVICE_AVAILABILITY_CHANGED;
+import static org.onosproject.net.device.DeviceEvent.Type.DEVICE_REMOVED;
+import static org.slf4j.LoggerFactory.getLogger;
 
 /**
  * Default implementation of a network topology provider that feeds off
  * device and link subsystem events to trigger assembly and computation of
  * new topology snapshots.
  */
-@Component(immediate = true)
-@Service
+@Component(
+    immediate = true,
+    service = TopologyProvider.class,
+    property = {
+        DTP_MAX_EVENTS + ":Integer=" + DTP_MAX_EVENTS_DEFAULT,
+        DTP_MAX_IDLE_MS + ":Integer=" + DTP_MAX_IDLE_MS_DEFAULT,
+        DTP_MAX_BATCH_MS + ":Integer=" + DTP_MAX_BATCH_MS_DEFAULT
+    }
+)
 public class DefaultTopologyProvider extends AbstractProvider
         implements TopologyProvider {
 
     private static final int MAX_THREADS = 8;
-    private static final int DEFAULT_MAX_EVENTS = 1000;
-    private static final int DEFAULT_MAX_IDLE_MS = 10;
-    private static final int DEFAULT_MAX_BATCH_MS = 50;
 
     // FIXME: Replace with a system-wide timer instance;
     // TODO: Convert to use HashedWheelTimer or produce a variant of that; then decide which we want to adopt
     private static final Timer TIMER = new Timer("onos-topo-event-batching");
 
-    @Property(name = "maxEvents", intValue = DEFAULT_MAX_EVENTS,
-            label = "Maximum number of events to accumulate")
-    private int maxEvents = DEFAULT_MAX_EVENTS;
+    /** Maximum number of events to accumulate. */
+    private int maxEvents = DTP_MAX_EVENTS_DEFAULT;
 
-    @Property(name = "maxIdleMs", intValue = DEFAULT_MAX_IDLE_MS,
-            label = "Maximum number of millis between events")
-    private int maxIdleMs = DEFAULT_MAX_IDLE_MS;
+    /** Maximum number of millis between events. */
+    private int maxIdleMs = DTP_MAX_IDLE_MS_DEFAULT;
 
-    @Property(name = "maxBatchMs", intValue = DEFAULT_MAX_BATCH_MS,
-            label = "Maximum number of millis for whole batch")
-    private int maxBatchMs = DEFAULT_MAX_BATCH_MS;
+    /** Maximum number of millis for whole batch. */
+    private int maxBatchMs = DTP_MAX_BATCH_MS_DEFAULT;
 
     private final Logger log = getLogger(getClass());
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected TopologyProviderRegistry providerRegistry;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected DeviceService deviceService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected LinkService linkService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected ComponentConfigService cfgService;
 
     private volatile boolean isStarted = false;
@@ -166,19 +170,19 @@
         Dictionary<?, ?> properties = context.getProperties();
         int newMaxEvents, newMaxBatchMs, newMaxIdleMs;
         try {
-            String s = get(properties, "maxEvents");
+            String s = get(properties, DTP_MAX_EVENTS);
             newMaxEvents = isNullOrEmpty(s) ? maxEvents : Integer.parseInt(s.trim());
 
-            s = get(properties, "maxBatchMs");
+            s = get(properties, DTP_MAX_BATCH_MS);
             newMaxBatchMs = isNullOrEmpty(s) ? maxBatchMs : Integer.parseInt(s.trim());
 
-            s = get(properties, "maxIdleMs");
+            s = get(properties, DTP_MAX_IDLE_MS);
             newMaxIdleMs = isNullOrEmpty(s) ? maxIdleMs : Integer.parseInt(s.trim());
 
         } catch (NumberFormatException | ClassCastException e) {
-            newMaxEvents = DEFAULT_MAX_EVENTS;
-            newMaxBatchMs = DEFAULT_MAX_BATCH_MS;
-            newMaxIdleMs = DEFAULT_MAX_IDLE_MS;
+            newMaxEvents = DTP_MAX_EVENTS_DEFAULT;
+            newMaxBatchMs = DTP_MAX_BATCH_MS_DEFAULT;
+            newMaxIdleMs = DTP_MAX_IDLE_MS_DEFAULT;
         }
 
         if (newMaxEvents != maxEvents || newMaxBatchMs != maxBatchMs || newMaxIdleMs != maxIdleMs) {
diff --git a/core/net/src/main/java/org/onosproject/net/topology/impl/PathManager.java b/core/net/src/main/java/org/onosproject/net/topology/impl/PathManager.java
index cc9cc53..c5d7392 100644
--- a/core/net/src/main/java/org/onosproject/net/topology/impl/PathManager.java
+++ b/core/net/src/main/java/org/onosproject/net/topology/impl/PathManager.java
@@ -15,47 +15,44 @@
  */
 package org.onosproject.net.topology.impl;
 
-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.net.DisjointPath;
 import org.onosproject.net.ElementId;
 import org.onosproject.net.Link;
 import org.onosproject.net.Path;
 import org.onosproject.net.host.HostService;
+import org.onosproject.net.topology.AbstractPathService;
 import org.onosproject.net.topology.LinkWeigher;
 import org.onosproject.net.topology.PathService;
 import org.onosproject.net.topology.TopologyService;
-import org.onosproject.net.topology.AbstractPathService;
+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.Map;
 import java.util.Set;
 import java.util.stream.Stream;
-import java.util.Map;
 
-
-import static org.slf4j.LoggerFactory.getLogger;
 import static org.onosproject.security.AppGuard.checkPermission;
-import static org.onosproject.security.AppPermission.Type.*;
+import static org.onosproject.security.AppPermission.Type.TOPOLOGY_READ;
+import static org.slf4j.LoggerFactory.getLogger;
 
 
 /**
  * Provides implementation of a path selection service atop the current
  * topology and host services.
  */
-@Component(immediate = true)
-@Service
+@Component(immediate = true, service = PathService.class)
 public class PathManager extends AbstractPathService implements PathService {
 
     private final Logger log = getLogger(getClass());
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected TopologyService topologyService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected HostService hostService;
 
     @Activate
diff --git a/core/net/src/main/java/org/onosproject/net/topology/impl/TopologyManager.java b/core/net/src/main/java/org/onosproject/net/topology/impl/TopologyManager.java
index 0d15645..d972601 100644
--- a/core/net/src/main/java/org/onosproject/net/topology/impl/TopologyManager.java
+++ b/core/net/src/main/java/org/onosproject/net/topology/impl/TopologyManager.java
@@ -15,12 +15,6 @@
  */
 package org.onosproject.net.topology.impl;
 
-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.event.Event;
 import org.onosproject.net.ConnectPoint;
 import org.onosproject.net.DeviceId;
@@ -43,6 +37,11 @@
 import org.onosproject.net.topology.TopologyService;
 import org.onosproject.net.topology.TopologyStore;
 import org.onosproject.net.topology.TopologyStoreDelegate;
+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.List;
@@ -59,8 +58,7 @@
 /**
  * Provides basic implementation of the topology SB &amp; NB APIs.
  */
-@Component(immediate = true)
-@Service
+@Component(immediate = true, service = {TopologyService.class, TopologyProviderRegistry.class})
 public class TopologyManager
         extends AbstractListenerProviderRegistry<TopologyEvent, TopologyListener,
         TopologyProvider, TopologyProviderService>
@@ -77,7 +75,7 @@
 
     private TopologyStoreDelegate delegate = new InternalStoreDelegate();
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected TopologyStore store;
 
     @Activate
diff --git a/core/net/src/main/java/org/onosproject/upgrade/impl/UpgradeManager.java b/core/net/src/main/java/org/onosproject/upgrade/impl/UpgradeManager.java
index 3910f4b..99f1345 100644
--- a/core/net/src/main/java/org/onosproject/upgrade/impl/UpgradeManager.java
+++ b/core/net/src/main/java/org/onosproject/upgrade/impl/UpgradeManager.java
@@ -15,17 +15,6 @@
  */
 package org.onosproject.upgrade.impl;
 
-import java.util.Objects;
-import java.util.Set;
-import java.util.concurrent.atomic.AtomicReference;
-import java.util.stream.Collectors;
-
-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.ClusterEvent;
 import org.onosproject.cluster.ClusterEventListener;
 import org.onosproject.cluster.ClusterService;
@@ -46,8 +35,18 @@
 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.Reference;
+import org.osgi.service.component.annotations.ReferenceCardinality;
 import org.slf4j.Logger;
 
+import java.util.Objects;
+import java.util.Set;
+import java.util.concurrent.atomic.AtomicReference;
+import java.util.stream.Collectors;
+
 import static org.onosproject.security.AppGuard.checkPermission;
 import static org.onosproject.security.AppPermission.Type.CLUSTER_EVENT;
 import static org.onosproject.security.AppPermission.Type.UPGRADE_EVENT;
@@ -61,24 +60,23 @@
  * This implementation uses the {@link CoordinationService} to store upgrade state in a version-agnostic primitive.
  * Upgrade state can be seen by current and future version nodes.
  */
-@Component(immediate = true)
-@Service
+@Component(immediate = true, service = { UpgradeService.class, UpgradeAdminService.class })
 public class UpgradeManager
         extends AbstractListenerManager<UpgradeEvent, UpgradeEventListener>
         implements UpgradeService, UpgradeAdminService {
 
     private final Logger log = getLogger(getClass());
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected VersionService versionService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected CoordinationService coordinationService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected ClusterService clusterService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected MembershipService membershipService;
 
     private Version localVersion;
diff --git a/core/net/src/test/java/org/onosproject/app/impl/FeaturesServiceAdapter.java b/core/net/src/test/java/org/onosproject/app/impl/FeaturesServiceAdapter.java
index bdb28be..165d4e4 100644
--- a/core/net/src/test/java/org/onosproject/app/impl/FeaturesServiceAdapter.java
+++ b/core/net/src/test/java/org/onosproject/app/impl/FeaturesServiceAdapter.java
@@ -15,12 +15,15 @@
  */
 package org.onosproject.app.impl;
 
+import org.apache.karaf.features.DeploymentListener;
 import org.apache.karaf.features.Feature;
+import org.apache.karaf.features.FeatureState;
 import org.apache.karaf.features.FeaturesListener;
 import org.apache.karaf.features.Repository;
 
 import java.net.URI;
 import java.util.EnumSet;
+import java.util.Map;
 import java.util.Set;
 
 /**
@@ -28,6 +31,118 @@
  */
 public class FeaturesServiceAdapter implements org.apache.karaf.features.FeaturesService {
     @Override
+    public boolean isRepositoryUriBlacklisted(URI uri) {
+        return false;
+    }
+
+    @Override
+    public Repository[] listRequiredRepositories() throws Exception {
+        return new Repository[0];
+    }
+
+    @Override
+    public void setResolutionOutputFile(String s) {
+
+    }
+
+    @Override
+    public void installFeatures(Set<String> set, String s, EnumSet<Option> enumSet) throws Exception {
+
+    }
+
+    @Override
+    public void addRequirements(Map<String, Set<String>> map, EnumSet<Option> enumSet) throws Exception {
+
+    }
+
+    @Override
+    public void uninstallFeatures(Set<String> set, EnumSet<Option> enumSet) throws Exception {
+
+    }
+
+    @Override
+    public void uninstallFeatures(Set<String> set, String s, EnumSet<Option> enumSet) throws Exception {
+
+    }
+
+    @Override
+    public void removeRequirements(Map<String, Set<String>> map, EnumSet<Option> enumSet) throws Exception {
+
+    }
+
+    @Override
+    public void updateFeaturesState(Map<String, Map<String, FeatureState>> map,
+                                    EnumSet<Option> enumSet) throws Exception {
+
+    }
+
+    @Override
+    public void updateReposAndRequirements(Set<URI> set,
+                                           Map<String, Set<String>> map, EnumSet<Option> enumSet) throws Exception {
+
+    }
+
+    @Override
+    public Repository createRepository(URI uri) throws Exception {
+        return null;
+    }
+
+    @Override
+    public Feature[] listRequiredFeatures() throws Exception {
+        return new Feature[0];
+    }
+
+    @Override
+    public Map<String, Set<String>> listRequirements() {
+        return null;
+    }
+
+    @Override
+    public boolean isRequired(Feature feature) {
+        return false;
+    }
+
+    @Override
+    public void refreshRepositories(Set<URI> set) throws Exception {
+
+    }
+
+    @Override
+    public URI getRepositoryUriFor(String s, String s1) {
+        return null;
+    }
+
+    @Override
+    public String[] getRepositoryNames() {
+        return new String[0];
+    }
+
+    @Override
+    public void registerListener(DeploymentListener deploymentListener) {
+
+    }
+
+    @Override
+    public void unregisterListener(DeploymentListener deploymentListener) {
+
+    }
+
+    @Override
+    public FeatureState getState(String s) {
+        return null;
+    }
+
+    @Override
+    public String getFeatureXml(Feature feature) {
+        return null;
+    }
+
+    @Override
+    public void refreshFeatures(EnumSet<Option> enumSet) throws Exception {
+
+    }
+
+    @Override
     public void validateRepository(URI uri) throws Exception {
 
     }
@@ -103,7 +218,7 @@
     }
 
     @Override
-    public void installFeatures(Set<Feature> features, EnumSet<Option> options) throws Exception {
+    public void installFeatures(Set<String> features, EnumSet<Option> options) throws Exception {
 
     }
 
diff --git a/core/security/BUCK b/core/security/BUCK
deleted file mode 100644
index f6b0da3..0000000
--- a/core/security/BUCK
+++ /dev/null
@@ -1,33 +0,0 @@
-SRC = 'src/main/java/org/onosproject/security/**/'
-TEST = 'src/test/java/org/onosproject/security/**/'
-CURRENT_NAME = 'onos-security'
-CURRENT_TARGET = ':' + CURRENT_NAME
-
-
-COMPILE_DEPS = [
-    '//lib:CORE_DEPS',
-    '//lib:KRYO',
-    '//core/store/serializers:onos-core-serializers',
-    '//lib:org.apache.felix.framework.security',
-    '//core/api:onos-api',
-]
-
-TEST_DEPS = [
-    '//lib:TEST',
-]
-
-osgi_jar_with_tests (
-    name = 'onos-security',
-    srcs = glob([SRC + '/*.java']),
-    deps = COMPILE_DEPS,
-    test_deps = TEST_DEPS,
-    visibility = ['PUBLIC'],
-)
-
-java_test(
-    name = 'tests',
-    srcs = glob([TEST + '/*.java']),
-    deps = COMPILE_DEPS +
-           TEST_DEPS +
-           [CURRENT_TARGET],
-)
\ No newline at end of file
diff --git a/core/security/BUILD b/core/security/BUILD
deleted file mode 100644
index 3bc076a..0000000
--- a/core/security/BUILD
+++ /dev/null
@@ -1,11 +0,0 @@
-COMPILE_DEPS = CORE_DEPS + KRYO + [
-    "@org_apache_felix_framework_security//jar",
-    "//core/store/serializers:onos-core-serializers",
-]
-
-osgi_jar_with_tests(
-    name = "onos-security",
-    test_deps = TEST,
-    visibility = ["//visibility:public"],
-    deps = COMPILE_DEPS,
-)
diff --git a/core/security/src/main/java/org/onosproject/security/impl/DefaultPolicyBuilder.java b/core/security/src/main/java/org/onosproject/security/impl/DefaultPolicyBuilder.java
index b79240a..e32db95 100644
--- a/core/security/src/main/java/org/onosproject/security/impl/DefaultPolicyBuilder.java
+++ b/core/security/src/main/java/org/onosproject/security/impl/DefaultPolicyBuilder.java
@@ -183,7 +183,7 @@
         permSet.add(new PackagePermission("*", PackagePermission.EXPORTONLY));
         permSet.add(new PackagePermission("*", PackagePermission.IMPORT));
         permSet.add(new AdaptPermission("*", AdaptPermission.ADAPT));
-        permSet.add(new ConfigurationPermission("*", ConfigurationPermission.CONFIGURE));
+        //permSet.add(new ConfigurationPermission("*", ConfigurationPermission.CONFIGURE));
         permSet.add(new AdminPermission("*", AdminPermission.METADATA));
         return permSet;
     }
@@ -444,9 +444,9 @@
         } else if (permission instanceof AdminPermission) {
             return new org.onosproject.security.Permission(
                     AdminPermission.class.getName(), permission.getName(), permission.getActions());
-        } else if (permission instanceof ConfigurationPermission) {
-            return new org.onosproject.security.Permission(
-                    ConfigurationPermission.class.getName(), permission.getName(), permission.getActions());
+        //} else if (permission instanceof ConfigurationPermission) {
+        //    return new org.onosproject.security.Permission(
+        //            ConfigurationPermission.class.getName(), permission.getName(), permission.getActions());
         }
         return null;
     }
@@ -506,8 +506,8 @@
             return new ServicePermission(name, actions);
         } else if (AdminPermission.class.getName().equals(classname)) {
             return new AdminPermission(name, actions);
-        } else if (ConfigurationPermission.class.getName().equals(classname)) {
-            return new ConfigurationPermission(name, actions);
+        //} else if (ConfigurationPermission.class.getName().equals(classname)) {
+        //    return new ConfigurationPermission(name, actions);
         } else if (ReflectPermission.class.getName().equals(classname)) {
             return new ReflectPermission(name, actions);
         }
diff --git a/core/security/src/main/java/org/onosproject/security/impl/SecurityModeManager.java b/core/security/src/main/java/org/onosproject/security/impl/SecurityModeManager.java
index c3278e7..5951a63 100644
--- a/core/security/src/main/java/org/onosproject/security/impl/SecurityModeManager.java
+++ b/core/security/src/main/java/org/onosproject/security/impl/SecurityModeManager.java
@@ -15,48 +15,13 @@
  */
 package org.onosproject.security.impl;
 
-import com.google.common.collect.Lists;
-
-import org.apache.felix.scr.annotations.Component;
-import org.apache.felix.scr.annotations.Reference;
-import org.apache.felix.scr.annotations.ReferenceCardinality;
-import org.apache.felix.scr.annotations.Activate;
-import org.apache.felix.scr.annotations.Deactivate;
-import org.apache.felix.scr.annotations.Service;
-
-import org.onosproject.app.ApplicationAdminService;
-import org.onosproject.app.ApplicationState;
-import org.onosproject.core.Application;
 import org.onosproject.core.ApplicationId;
-
-import org.onosproject.event.EventDeliveryService;
-import org.onosproject.event.ListenerRegistry;
-import org.onosproject.security.AppPermission;
 import org.onosproject.security.SecurityAdminService;
-import org.onosproject.security.store.SecurityModeEvent;
-import org.onosproject.security.store.SecurityModeListener;
-import org.onosproject.security.store.SecurityModeStore;
-import org.onosproject.security.store.SecurityModeStoreDelegate;
-import org.osgi.framework.BundleContext;
-import org.osgi.framework.FrameworkUtil;
-import org.osgi.framework.ServicePermission;
-import org.osgi.service.log.LogEntry;
-import org.osgi.service.log.LogListener;
-import org.osgi.service.log.LogReaderService;
-import org.osgi.service.permissionadmin.PermissionInfo;
+import org.osgi.service.component.annotations.Component;
 
-import java.security.AccessControlException;
 import java.security.Permission;
-import java.util.ArrayList;
 import java.util.List;
 import java.util.Map;
-import java.util.Set;
-import java.util.concurrent.ConcurrentHashMap;
-
-import org.osgi.service.permissionadmin.PermissionAdmin;
-import org.slf4j.Logger;
-
-import static org.slf4j.LoggerFactory.getLogger;
 
 /**
  * Security-Mode ONOS management implementation.
@@ -65,234 +30,41 @@
  *       See the wiki for instructions on how to activate it.
  */
 
-@Component(immediate = true)
-@Service
+@Component(immediate = true, service = SecurityAdminService.class)
 public class SecurityModeManager implements SecurityAdminService {
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
-    protected SecurityModeStore store;
-
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
-    protected ApplicationAdminService appAdminService;
-
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
-    protected LogReaderService logReaderService;
-
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
-    protected EventDeliveryService eventDispatcher;
-
-    private final Logger log = getLogger(getClass());
-
-    protected final ListenerRegistry<SecurityModeEvent, SecurityModeListener>
-            listenerRegistry = new ListenerRegistry<>();
-
-    private final SecurityModeStoreDelegate delegate = new InternalStoreDelegate();
-
-    private SecurityLogListener securityLogListener = new SecurityLogListener();
-
-    private PermissionAdmin permissionAdmin = getPermissionAdmin();
-
-    @Activate
-    public void activate() {
-
-        eventDispatcher.addSink(SecurityModeEvent.class, listenerRegistry);
-        logReaderService.addLogListener(securityLogListener);
-
-        if (System.getSecurityManager() == null) {
-            log.warn("J2EE security manager is disabled.");
-            deactivate();
-            return;
-        }
-        if (permissionAdmin == null) {
-            log.warn("Permission Admin not found.");
-            deactivate();
-            return;
-        }
-        store.setDelegate(delegate);
-
-        log.info("Security-Mode Started");
-    }
-
-    @Deactivate
-    public void deactivate() {
-        eventDispatcher.removeSink(SecurityModeEvent.class);
-        logReaderService.removeLogListener(securityLogListener);
-        store.unsetDelegate(delegate);
-        log.info("Stopped");
-
-    }
-
     @Override
     public boolean isSecured(ApplicationId appId) {
-        if (store.getState(appId) == null) {
-            store.registerApplication(appId);
-        }
-        return store.isSecured(appId);
+        return false;
     }
 
-
     @Override
     public void review(ApplicationId appId) {
-        if (store.getState(appId) == null) {
-            store.registerApplication(appId);
-        }
-        store.reviewPolicy(appId);
+
     }
 
     @Override
     public void acceptPolicy(ApplicationId appId) {
-        if (store.getState(appId) == null) {
-            store.registerApplication(appId);
-        }
-        store.acceptPolicy(appId, DefaultPolicyBuilder.convertToOnosPermissions(getMaximumPermissions(appId)));
+
     }
 
     @Override
     public void register(ApplicationId appId) {
-        store.registerApplication(appId);
+
     }
 
     @Override
     public Map<Integer, List<Permission>> getPrintableSpecifiedPermissions(ApplicationId appId) {
-        return getPrintablePermissionMap(getMaximumPermissions(appId));
+        return null;
     }
 
     @Override
     public Map<Integer, List<Permission>> getPrintableGrantedPermissions(ApplicationId appId) {
-        return getPrintablePermissionMap(
-                DefaultPolicyBuilder.convertToJavaPermissions(store.getGrantedPermissions(appId)));
+        return null;
     }
 
     @Override
     public Map<Integer, List<Permission>> getPrintableRequestedPermissions(ApplicationId appId) {
-        return getPrintablePermissionMap(
-                DefaultPolicyBuilder.convertToJavaPermissions(store.getRequestedPermissions(appId)));
+        return null;
     }
-
-    private class SecurityLogListener implements LogListener {
-        @Override
-        public void logged(LogEntry entry) {
-            if (entry.getException() != null &&
-                    entry.getException() instanceof AccessControlException) {
-                String location = entry.getBundle().getLocation();
-                Permission javaPerm =
-                        ((AccessControlException) entry.getException()).getPermission();
-                org.onosproject.security.Permission permission = DefaultPolicyBuilder.getOnosPermission(javaPerm);
-                if (permission == null) {
-                    log.warn("Unsupported permission requested.");
-                    return;
-                }
-                store.getApplicationIds(location).stream().filter(
-                        appId -> store.isSecured(appId) &&
-                                appAdminService.getState(appId) == ApplicationState.ACTIVE).forEach(appId -> {
-                    store.requestPermission(appId, permission);
-                    log.debug("[POLICY VIOLATION] APP: %s / Bundle: %s / Permission: %s ",
-                            appId.name(), location, permission.toString());
-                });
-            }
-        }
-    }
-
-    private class InternalStoreDelegate implements SecurityModeStoreDelegate {
-        @Override
-        public void notify(SecurityModeEvent event) {
-            if (event.type() == SecurityModeEvent.Type.POLICY_ACCEPTED) {
-                setLocalPermissions(event.subject());
-                log.info("{} POLICY ACCEPTED and ENFORCED", event.subject().name());
-            } else if (event.type() == SecurityModeEvent.Type.POLICY_VIOLATED) {
-                log.info("{} POLICY VIOLATED", event.subject().name());
-            } else if (event.type() == SecurityModeEvent.Type.POLICY_REVIEWED) {
-                log.info("{} POLICY REVIEWED", event.subject().name());
-            }
-            eventDispatcher.post(event);
-        }
-    }
-
-    /**
-     * TYPES.
-     * 0 - APP_PERM
-     * 1 - ADMIN SERVICE
-     * 2 - NB_SERVICE
-     * 3 - ETC_SERVICE
-     * 4 - ETC
-     * @param perms
-     */
-    private Map<Integer, List<Permission>> getPrintablePermissionMap(List<Permission> perms) {
-        ConcurrentHashMap<Integer, List<Permission>> sortedMap = new ConcurrentHashMap<>();
-        sortedMap.put(0, new ArrayList());
-        sortedMap.put(1, new ArrayList());
-        sortedMap.put(2, new ArrayList());
-        sortedMap.put(3, new ArrayList());
-        sortedMap.put(4, new ArrayList());
-        for (Permission perm : perms) {
-            if (perm instanceof ServicePermission) {
-                if (DefaultPolicyBuilder.getNBServiceList().contains(perm.getName())) {
-                    if (perm.getName().contains("Admin")) {
-                        sortedMap.get(1).add(perm);
-                    } else {
-                        sortedMap.get(2).add(perm);
-                    }
-                } else {
-                    sortedMap.get(3).add(perm);
-                }
-            } else if (perm instanceof AppPermission) {
-                sortedMap.get(0).add(perm);
-            } else {
-                sortedMap.get(4).add(perm);
-            }
-        }
-        return sortedMap;
-    }
-
-    private void setLocalPermissions(ApplicationId applicationId) {
-        for (String location : store.getBundleLocations(applicationId)) {
-            permissionAdmin.setPermissions(location, permissionsToInfo(store.getGrantedPermissions(applicationId)));
-        }
-    }
-
-    private PermissionInfo[] permissionsToInfo(Set<org.onosproject.security.Permission> permissions) {
-        List<PermissionInfo> result = Lists.newArrayList();
-        for (org.onosproject.security.Permission perm : permissions) {
-            result.add(new PermissionInfo(perm.getClassName(), perm.getName(), perm.getActions()));
-        }
-        PermissionInfo[] permissionInfos = new PermissionInfo[result.size()];
-        return result.toArray(permissionInfos);
-    }
-
-
-
-    private List<Permission> getMaximumPermissions(ApplicationId appId) {
-        Application app = appAdminService.getApplication(appId);
-        if (app == null) {
-            log.debug("Unknown application.");
-            return null;
-        }
-        List<Permission> appPerms;
-        switch (app.role()) {
-            case ADMIN:
-                appPerms = DefaultPolicyBuilder.getAdminApplicationPermissions(app.permissions());
-                break;
-            case USER:
-                appPerms = DefaultPolicyBuilder.getUserApplicationPermissions(app.permissions());
-                break;
-            case UNSPECIFIED:
-            default:
-                appPerms = DefaultPolicyBuilder.getDefaultPerms();
-                break;
-        }
-
-        return appPerms;
-    }
-
-    private PermissionAdmin getPermissionAdmin() {
-        BundleContext context = getBundleContext();
-        return (PermissionAdmin) context.getService(context.getServiceReference(PermissionAdmin.class.getName()));
-    }
-
-    private BundleContext getBundleContext() {
-        return FrameworkUtil.getBundle(this.getClass()).getBundleContext();
-
-    }
-
-
 }
\ No newline at end of file
diff --git a/core/security/src/main/java/org/onosproject/security/store/DistributedSecurityModeStore.java b/core/security/src/main/java/org/onosproject/security/store/DistributedSecurityModeStore.java
index e642369..d2d510d 100644
--- a/core/security/src/main/java/org/onosproject/security/store/DistributedSecurityModeStore.java
+++ b/core/security/src/main/java/org/onosproject/security/store/DistributedSecurityModeStore.java
@@ -18,13 +18,6 @@
 
 import com.google.common.collect.ImmutableSet;
 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.apache.karaf.features.BundleInfo;
 import org.apache.karaf.features.Feature;
 import org.apache.karaf.features.FeaturesService;
@@ -43,6 +36,11 @@
 import org.onosproject.store.service.Serializer;
 import org.onosproject.store.service.StorageService;
 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.util.HashSet;
@@ -54,15 +52,17 @@
 
 import static java.util.concurrent.Executors.newSingleThreadExecutor;
 import static org.onlab.util.Tools.groupedThreads;
-import static org.onosproject.security.store.SecurityModeState.*;
+import static org.onosproject.security.store.SecurityModeState.INSTALLED;
+import static org.onosproject.security.store.SecurityModeState.POLICY_VIOLATED;
+import static org.onosproject.security.store.SecurityModeState.REVIEWED;
+import static org.onosproject.security.store.SecurityModeState.SECURED;
 import static org.slf4j.LoggerFactory.getLogger;
 
 /**
  * Manages application permissions granted/requested to applications.
  * Uses both gossip-based and RAFT-based distributed data store.
  */
-@Component(immediate = true)
-@Service
+@Component(immediate = true, service = SecurityModeStore.class)
 public class DistributedSecurityModeStore
         extends AbstractStore<SecurityModeEvent, SecurityModeStoreDelegate>
         implements SecurityModeStore {
@@ -75,16 +75,16 @@
     private ConcurrentHashMap<String, Set<ApplicationId>> localBundleAppDirectory;
     private ConcurrentHashMap<ApplicationId, Set<String>> localAppBundleDirectory;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected StorageService storageService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected LogicalClockService clockService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected ApplicationAdminService applicationAdminService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected FeaturesService featuresService;
 
     private ExecutorService eventHandler;
diff --git a/core/store/dist/BUCK b/core/store/dist/BUCK
deleted file mode 100644
index 608bfc9..0000000
--- a/core/store/dist/BUCK
+++ /dev/null
@@ -1,31 +0,0 @@
-COMPILE_DEPS = [
-    '//lib:CORE_DEPS',
-    '//lib:JACKSON',
-    '//lib:KRYO',
-    '//core/common:onos-core-common',
-    '//utils/rest:onlab-rest',
-    '//core/store/serializers:onos-core-serializers',
-    '//lib:io_netty_netty_buffer',
-    '//lib:io_netty_netty_common',
-    '//lib:io_netty_netty_codec',
-    '//lib:io_netty_netty_handler',
-    '//lib:io_netty_netty_resolver',
-    '//lib:io_netty_netty_transport',
-    '//lib:io_netty_netty_transport_native_unix_common',
-    '//lib:io_netty_netty_transport-native-epoll',
-    '//lib:commons-math3',
-    '//incubator/api:onos-incubator-api',
-]
-
-TEST_DEPS = [
-    '//lib:TEST',
-    '//core/api:onos-api-tests',
-    '//core/common:onos-core-common-tests',
-]
-
-osgi_jar_with_tests (
-    name = 'onos-core-dist',
-    deps = COMPILE_DEPS,
-    test_deps = TEST_DEPS,
-    visibility = ['PUBLIC'],
-)
diff --git a/core/store/dist/src/main/java/org/onosproject/store/OsgiPropertyConstants.java b/core/store/dist/src/main/java/org/onosproject/store/OsgiPropertyConstants.java
new file mode 100644
index 0000000..1f4555d
--- /dev/null
+++ b/core/store/dist/src/main/java/org/onosproject/store/OsgiPropertyConstants.java
@@ -0,0 +1,67 @@
+/*
+ * Copyright 2018-present Open Networking Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.onosproject.store;
+
+/**
+ * Name/Value constants for properties.
+ */
+public final class OsgiPropertyConstants {
+    private OsgiPropertyConstants() {
+    }
+
+    public static final String MESSAGE_HANDLER_THREAD_POOL_SIZE = "msgHandlerPoolSize";
+    public static final int MESSAGE_HANDLER_THREAD_POOL_SIZE_DEFAULT = 8;
+
+    public static final String BACKUP_PERIOD_MILLIS = "backupPeriod";
+    public static final int BACKUP_PERIOD_MILLIS_DEFAULT = 2000;
+
+    public static final String ANTI_ENTROPY_PERIOD_MILLIS = "antiEntropyPeriod";
+    public static final int ANTI_ENTROPY_PERIOD_MILLIS_DEFAULT = 5000;
+
+    public static final String EC_FLOW_RULE_STORE_PERSISTENCE_ENABLED = "flowRuleStorePersistenceEnabled";
+    public static final boolean EC_FLOW_RULE_STORE_PERSISTENCE_ENABLED_DEFAULT = false;
+
+    public static final String MAX_BACKUP_COUNT = "backupCount";
+    public static final int MAX_BACKUP_COUNT_DEFAULT = 2;
+
+    public static final String ELECTION_TIMEOUT_MILLIS = "electionTimeoutMillis";
+    public static final long ELECTION_TIMEOUT_MILLIS_DEFAULT = 2500;
+
+    public static final String GARBAGE_COLLECT = "garbageCollect";
+    public static final boolean GARBAGE_COLLECT_DEFAULT = false;
+
+    public static final String GARBAGE_COLLECT_THRESH = "gcThresh";
+    public static final int GARBAGE_COLLECT_THRESH_DEFAULT = 6;
+
+    public static final String ALLOW_EXTRANEOUS_GROUPS = "allowExtraneousGroups";
+    public static final boolean ALLOW_EXTRANEOUS_GROUPS_DEFAULT = false;
+
+    public static final String GIS_PERSISTENCE_ENABLED = "persistenceEnabled";
+    public static final boolean GIS_PERSISTENCE_ENABLED_DEFAULT = false;
+
+    public static final String DPS_MESSAGE_HANDLER_THREAD_POOL_SIZE = "messageHandlerThreadPoolSize";
+    public static final int DPS_MESSAGE_HANDLER_THREAD_POOL_SIZE_DEFAULT = 4;
+
+    public static final String DFS_MESSAGE_HANDLER_THREAD_POOL_SIZE = "messageHandlerThreadPoolSize";
+    public static final int DFS_MESSAGE_HANDLER_THREAD_POOL_SIZE_DEFAULT = 4;
+
+    public static final String DSS_MESSAGE_HANDLER_THREAD_POOL_SIZE = "messageHandlerThreadPoolSize";
+    public static final int DSS_MESSAGE_HANDLER_THREAD_POOL_SIZE_DEFAULT = 4;
+
+    public static final String LINK_WEIGHT_FUNCTION = "linkWeightFunction";
+    public static final String LINK_WEIGHT_FUNCTION_DEFAULT = "hopCount";
+}
diff --git a/core/store/dist/src/main/java/org/onosproject/store/app/DistributedApplicationStore.java b/core/store/dist/src/main/java/org/onosproject/store/app/DistributedApplicationStore.java
index 36569f9..3793099 100644
--- a/core/store/dist/src/main/java/org/onosproject/store/app/DistributedApplicationStore.java
+++ b/core/store/dist/src/main/java/org/onosproject/store/app/DistributedApplicationStore.java
@@ -24,16 +24,10 @@
 import com.google.common.collect.Maps;
 import com.google.common.collect.Multimap;
 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.app.ApplicationDescription;
 import org.onosproject.app.ApplicationEvent;
 import org.onosproject.app.ApplicationException;
+import org.onosproject.app.ApplicationIdStore;
 import org.onosproject.app.ApplicationState;
 import org.onosproject.app.ApplicationStore;
 import org.onosproject.app.ApplicationStoreDelegate;
@@ -42,7 +36,6 @@
 import org.onosproject.common.app.ApplicationArchive;
 import org.onosproject.core.Application;
 import org.onosproject.core.ApplicationId;
-import org.onosproject.app.ApplicationIdStore;
 import org.onosproject.core.CoreService;
 import org.onosproject.core.DefaultApplication;
 import org.onosproject.core.Version;
@@ -52,6 +45,7 @@
 import org.onosproject.store.cluster.messaging.MessageSubject;
 import org.onosproject.store.serializers.KryoNamespaces;
 import org.onosproject.store.service.ConsistentMap;
+import org.onosproject.store.service.DistributedPrimitive.Status;
 import org.onosproject.store.service.MapEvent;
 import org.onosproject.store.service.MapEventListener;
 import org.onosproject.store.service.RevisionType;
@@ -60,7 +54,11 @@
 import org.onosproject.store.service.StorageService;
 import org.onosproject.store.service.Topic;
 import org.onosproject.store.service.Versioned;
-import org.onosproject.store.service.DistributedPrimitive.Status;
+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.io.ByteArrayInputStream;
@@ -86,16 +84,21 @@
 import static java.util.concurrent.TimeUnit.MILLISECONDS;
 import static org.onlab.util.Tools.groupedThreads;
 import static org.onlab.util.Tools.randomDelay;
-import static org.onosproject.app.ApplicationEvent.Type.*;
-import static org.onosproject.store.app.DistributedApplicationStore.InternalState.*;
+import static org.onosproject.app.ApplicationEvent.Type.APP_ACTIVATED;
+import static org.onosproject.app.ApplicationEvent.Type.APP_DEACTIVATED;
+import static org.onosproject.app.ApplicationEvent.Type.APP_INSTALLED;
+import static org.onosproject.app.ApplicationEvent.Type.APP_PERMISSIONS_CHANGED;
+import static org.onosproject.app.ApplicationEvent.Type.APP_UNINSTALLED;
+import static org.onosproject.store.app.DistributedApplicationStore.InternalState.ACTIVATED;
+import static org.onosproject.store.app.DistributedApplicationStore.InternalState.DEACTIVATED;
+import static org.onosproject.store.app.DistributedApplicationStore.InternalState.INSTALLED;
 import static org.slf4j.LoggerFactory.getLogger;
 
 /**
  * Manages inventory of applications in a distributed data store providing
  * stronger consistency guarantees.
  */
-@Component(immediate = true)
-@Service
+@Component(immediate = true, service = ApplicationStore.class)
 public class DistributedApplicationStore extends ApplicationArchive
         implements ApplicationStore {
 
@@ -122,19 +125,19 @@
     private ConsistentMap<ApplicationId, InternalApplicationHolder> apps;
     private Topic<Application> appActivationTopic;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected ClusterCommunicationService clusterCommunicator;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected ClusterService clusterService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected StorageService storageService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected ApplicationIdStore idStore;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected VersionService versionService;
 
     private final InternalAppsListener appsListener = new InternalAppsListener();
@@ -160,6 +163,9 @@
                     try {
                         log.info("Sending bits for application {}", name);
                         return toByteArray(getApplicationInputStream(name));
+                    } catch (ApplicationException e) {
+                        log.warn("Bits for application {} are not available on this node yet", name);
+                        return null;
                     } catch (IOException e) {
                         throw new StorageException(e);
                     }
diff --git a/core/store/dist/src/main/java/org/onosproject/store/cfg/DistributedComponentConfigStore.java b/core/store/dist/src/main/java/org/onosproject/store/cfg/DistributedComponentConfigStore.java
index 85e826f..6f7b68c 100644
--- a/core/store/dist/src/main/java/org/onosproject/store/cfg/DistributedComponentConfigStore.java
+++ b/core/store/dist/src/main/java/org/onosproject/store/cfg/DistributedComponentConfigStore.java
@@ -16,12 +16,6 @@
 package org.onosproject.store.cfg;
 
 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.apache.felix.scr.annotations.Service;
 import org.onosproject.cfg.ComponentConfigEvent;
 import org.onosproject.cfg.ComponentConfigStore;
 import org.onosproject.cfg.ComponentConfigStoreDelegate;
@@ -33,6 +27,11 @@
 import org.onosproject.store.service.Serializer;
 import org.onosproject.store.service.StorageService;
 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.util.Objects;
@@ -49,8 +48,7 @@
  * Manages inventory of component configurations in a distributed data store
  * that provides strong sequential consistency guarantees.
  */
-@Component(immediate = true)
-@Service
+@Component(immediate = true, service = ComponentConfigStore.class)
 public class DistributedComponentConfigStore
         extends AbstractStore<ComponentConfigEvent, ComponentConfigStoreDelegate>
         implements ComponentConfigStore {
@@ -61,7 +59,7 @@
 
     private ConsistentMap<String, String> properties;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected StorageService storageService;
 
     private InternalPropertiesListener propertiesListener = new InternalPropertiesListener();
diff --git a/core/store/dist/src/main/java/org/onosproject/store/cluster/impl/DistributedLeadershipStore.java b/core/store/dist/src/main/java/org/onosproject/store/cluster/impl/DistributedLeadershipStore.java
index fdecf31..43959de 100644
--- a/core/store/dist/src/main/java/org/onosproject/store/cluster/impl/DistributedLeadershipStore.java
+++ b/core/store/dist/src/main/java/org/onosproject/store/cluster/impl/DistributedLeadershipStore.java
@@ -15,23 +15,7 @@
  */
 package org.onosproject.store.cluster.impl;
 
-import java.util.Dictionary;
-import java.util.Map;
-import java.util.Objects;
-import java.util.concurrent.ExecutorService;
-import java.util.concurrent.Executors;
-import java.util.function.Consumer;
-import java.util.stream.Collectors;
-
 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.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.onosproject.cfg.ComponentConfigService;
 import org.onosproject.cluster.ClusterService;
 import org.onosproject.cluster.Leadership;
@@ -43,27 +27,46 @@
 import org.onosproject.core.VersionService;
 import org.onosproject.event.Change;
 import org.onosproject.store.AbstractStore;
-import org.onosproject.store.service.DistributedPrimitive.Status;
 import org.onosproject.store.service.CoordinationService;
+import org.onosproject.store.service.DistributedPrimitive.Status;
 import org.onosproject.store.service.LeaderElector;
 import org.onosproject.upgrade.UpgradeEvent;
 import org.onosproject.upgrade.UpgradeEventListener;
 import org.onosproject.upgrade.UpgradeService;
 import org.osgi.service.component.ComponentContext;
+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.slf4j.Logger;
 
+import java.util.Dictionary;
+import java.util.Map;
+import java.util.Objects;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.function.Consumer;
+import java.util.stream.Collectors;
+
 import static com.google.common.base.Strings.isNullOrEmpty;
-import static org.apache.felix.scr.annotations.ReferenceCardinality.MANDATORY_UNARY;
 import static org.onlab.util.Tools.get;
 import static org.onlab.util.Tools.groupedThreads;
+import static org.osgi.service.component.annotations.ReferenceCardinality.MANDATORY;
 import static org.slf4j.LoggerFactory.getLogger;
+import static org.onosproject.store.OsgiPropertyConstants.*;
 
 /**
  * Implementation of {@code LeadershipStore} that makes use of a {@link LeaderElector}
  * primitive.
  */
-@Service
-@Component(immediate = true)
+@Component(
+        immediate = true,
+        service = LeadershipStore.class,
+        property = {
+                ELECTION_TIMEOUT_MILLIS + ":Long=" + ELECTION_TIMEOUT_MILLIS_DEFAULT
+        }
+)
 public class DistributedLeadershipStore
     extends AbstractStore<LeadershipEvent, LeadershipStoreDelegate>
     implements LeadershipStore {
@@ -72,25 +75,23 @@
 
     private final Logger log = getLogger(getClass());
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = MANDATORY)
     protected ClusterService clusterService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = MANDATORY)
     protected CoordinationService storageService;
 
-    @Reference(cardinality = MANDATORY_UNARY)
+    @Reference(cardinality = MANDATORY)
     protected ComponentConfigService configService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = MANDATORY)
     protected VersionService versionService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = MANDATORY)
     protected UpgradeService upgradeService;
 
-    private static final long DEFAULT_ELECTION_TIMEOUT_MILLIS = 2500;
-    @Property(name = "electionTimeoutMillis", longValue = DEFAULT_ELECTION_TIMEOUT_MILLIS,
-            label = "the leader election timeout in milliseconds")
-    private long electionTimeoutMillis = DEFAULT_ELECTION_TIMEOUT_MILLIS;
+    /** Leader election timeout in milliseconds. */
+    private long electionTimeoutMillis = ELECTION_TIMEOUT_MILLIS_DEFAULT;
 
     private ExecutorService statusChangeHandler;
     private NodeId localNodeId;
@@ -190,11 +191,11 @@
         Dictionary<?, ?> properties = context.getProperties();
         long newElectionTimeoutMillis;
         try {
-            String s = get(properties, "electionTimeoutMillis");
+            String s = get(properties, ELECTION_TIMEOUT_MILLIS);
             newElectionTimeoutMillis = isNullOrEmpty(s) ? electionTimeoutMillis : Long.parseLong(s.trim());
         } catch (NumberFormatException | ClassCastException e) {
             log.warn("Malformed configuration detected; using defaults", e);
-            newElectionTimeoutMillis = DEFAULT_ELECTION_TIMEOUT_MILLIS;
+            newElectionTimeoutMillis = ELECTION_TIMEOUT_MILLIS_DEFAULT;
         }
 
         if (newElectionTimeoutMillis != electionTimeoutMillis) {
diff --git a/core/store/dist/src/main/java/org/onosproject/store/cluster/messaging/impl/ClusterCommunicationManager.java b/core/store/dist/src/main/java/org/onosproject/store/cluster/messaging/impl/ClusterCommunicationManager.java
index e160326..4b7a80a 100644
--- a/core/store/dist/src/main/java/org/onosproject/store/cluster/messaging/impl/ClusterCommunicationManager.java
+++ b/core/store/dist/src/main/java/org/onosproject/store/cluster/messaging/impl/ClusterCommunicationManager.java
@@ -17,12 +17,6 @@
 
 import com.google.common.base.Objects;
 import com.google.common.base.Throwables;
-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.Tools;
 import org.onosproject.cluster.ClusterService;
 import org.onosproject.cluster.ControllerNode;
@@ -34,6 +28,11 @@
 import org.onosproject.store.cluster.messaging.MessageSubject;
 import org.onosproject.store.cluster.messaging.MessagingService;
 import org.onosproject.utils.MeteringAgent;
+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;
 
@@ -52,14 +51,13 @@
 import static org.onosproject.security.AppGuard.checkPermission;
 import static org.onosproject.security.AppPermission.Type.CLUSTER_WRITE;
 
-@Component(immediate = true)
-@Service
+@Component(immediate = true, service = ClusterCommunicationService.class)
 public class ClusterCommunicationManager implements ClusterCommunicationService {
 
     private final Logger log = LoggerFactory.getLogger(getClass());
 
-    private final MeteringAgent subjectMeteringAgent = new MeteringAgent(PRIMITIVE_NAME, SUBJECT_PREFIX, true);
-    private final MeteringAgent endpointMeteringAgent = new MeteringAgent(PRIMITIVE_NAME, ENDPOINT_PREFIX, true);
+    private final MeteringAgent subjectMeteringAgent = new MeteringAgent(PRIMITIVE_NAME, SUBJECT_PREFIX, false);
+    private final MeteringAgent endpointMeteringAgent = new MeteringAgent(PRIMITIVE_NAME, ENDPOINT_PREFIX, false);
 
     private static final String PRIMITIVE_NAME = "clusterCommunication";
     private static final String SUBJECT_PREFIX = "subject";
@@ -71,10 +69,10 @@
     private static final String ROUND_TRIP_SUFFIX = ".rtt";
     private static final String ONE_WAY_SUFFIX = ".oneway";
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected ClusterService clusterService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected MessagingService messagingService;
 
     private NodeId localNodeId;
diff --git a/core/store/dist/src/main/java/org/onosproject/store/config/impl/DistributedNetworkConfigStore.java b/core/store/dist/src/main/java/org/onosproject/store/config/impl/DistributedNetworkConfigStore.java
index 7c2081e..bac245e 100644
--- a/core/store/dist/src/main/java/org/onosproject/store/config/impl/DistributedNetworkConfigStore.java
+++ b/core/store/dist/src/main/java/org/onosproject/store/config/impl/DistributedNetworkConfigStore.java
@@ -29,12 +29,6 @@
 import com.fasterxml.jackson.databind.node.TextNode;
 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.KryoNamespace;
 import org.onosproject.net.config.Config;
 import org.onosproject.net.config.ConfigApplyDelegate;
@@ -51,6 +45,11 @@
 import org.onosproject.store.service.Serializer;
 import org.onosproject.store.service.StorageService;
 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 org.slf4j.LoggerFactory;
 
@@ -69,8 +68,7 @@
 /**
  * Implementation of a distributed network configuration store.
  */
-@Component(immediate = true)
-@Service
+@Component(immediate = true, service = NetworkConfigStore.class)
 public class DistributedNetworkConfigStore
         extends AbstractStore<NetworkConfigEvent, NetworkConfigStoreDelegate>
         implements NetworkConfigStore {
@@ -84,7 +82,7 @@
     private static final String INVALID_JSON_OBJECT =
             "JSON node is not an object for object type config";
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected StorageService storageService;
 
     private ConsistentMap<ConfigKey, JsonNode> configs;
diff --git a/core/store/dist/src/main/java/org/onosproject/store/core/impl/DistributedApplicationIdStore.java b/core/store/dist/src/main/java/org/onosproject/store/core/impl/DistributedApplicationIdStore.java
index 9f6a2f6..4ec6a23 100644
--- a/core/store/dist/src/main/java/org/onosproject/store/core/impl/DistributedApplicationIdStore.java
+++ b/core/store/dist/src/main/java/org/onosproject/store/core/impl/DistributedApplicationIdStore.java
@@ -15,21 +15,10 @@
  */
 package org.onosproject.store.core.impl;
 
-import static org.slf4j.LoggerFactory.getLogger;
-
-
-import java.util.Map;
-import java.util.Set;
-
-
-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.core.ApplicationId;
+import com.google.common.collect.ImmutableSet;
+import com.google.common.collect.Maps;
 import org.onosproject.app.ApplicationIdStore;
+import org.onosproject.core.ApplicationId;
 import org.onosproject.core.DefaultApplicationId;
 import org.onosproject.store.serializers.KryoNamespaces;
 import org.onosproject.store.service.AtomicCounter;
@@ -38,23 +27,28 @@
 import org.onosproject.store.service.MapEventListener;
 import org.onosproject.store.service.Serializer;
 import org.onosproject.store.service.StorageService;
+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.Map;
+import java.util.Set;
 
-import com.google.common.collect.ImmutableSet;
-import com.google.common.collect.Maps;
+import static org.slf4j.LoggerFactory.getLogger;
 
 /**
  * ApplicationIdStore implementation on top of {@code AtomicCounter}
  * and {@code ConsistentMap} primitives.
  */
-@Component(immediate = true)
-@Service
+@Component(immediate = true, service = ApplicationIdStore.class)
 public class DistributedApplicationIdStore implements ApplicationIdStore {
 
     private final Logger log = getLogger(getClass());
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected StorageService storageService;
 
     private AtomicCounter appIdCounter;
diff --git a/core/store/dist/src/main/java/org/onosproject/store/core/impl/DistributedIdBlockStore.java b/core/store/dist/src/main/java/org/onosproject/store/core/impl/DistributedIdBlockStore.java
index 093d6cc..744e53b 100644
--- a/core/store/dist/src/main/java/org/onosproject/store/core/impl/DistributedIdBlockStore.java
+++ b/core/store/dist/src/main/java/org/onosproject/store/core/impl/DistributedIdBlockStore.java
@@ -16,17 +16,15 @@
 package org.onosproject.store.core.impl;
 
 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.onosproject.core.IdBlock;
 import org.onosproject.core.IdBlockStore;
 import org.onosproject.store.service.AtomicCounter;
 import org.onosproject.store.service.StorageService;
+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.Map;
@@ -36,8 +34,7 @@
 /**
  * Implementation of {@code IdBlockStore} using {@code AtomicCounter}.
  */
-@Component(immediate = true)
-@Service
+@Component(immediate = true, service = IdBlockStore.class)
 public class DistributedIdBlockStore implements IdBlockStore {
 
     private final Logger log = getLogger(getClass());
@@ -45,7 +42,7 @@
 
     private static final long DEFAULT_BLOCK_SIZE = 0x100000L;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected StorageService storageService;
 
     @Activate
diff --git a/core/store/dist/src/main/java/org/onosproject/store/core/impl/LogicalClockManager.java b/core/store/dist/src/main/java/org/onosproject/store/core/impl/LogicalClockManager.java
index 5f2d91e..366df71 100644
--- a/core/store/dist/src/main/java/org/onosproject/store/core/impl/LogicalClockManager.java
+++ b/core/store/dist/src/main/java/org/onosproject/store/core/impl/LogicalClockManager.java
@@ -15,34 +15,31 @@
  */
 package org.onosproject.store.core.impl;
 
-import static org.slf4j.LoggerFactory.getLogger;
-
-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.store.LogicalTimestamp;
 import org.onosproject.store.Timestamp;
 import org.onosproject.store.service.AtomicCounter;
 import org.onosproject.store.service.LogicalClockService;
 import org.onosproject.store.service.StorageService;
+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 static org.onosproject.security.AppGuard.checkPermission;
 import static org.onosproject.security.AppPermission.Type.CLOCK_WRITE;
+import static org.slf4j.LoggerFactory.getLogger;
 
 /**
  * LogicalClockService implementation based on a {@link AtomicCounter}.
  */
-@Component(immediate = true)
-@Service
+@Component(immediate = true, service = LogicalClockService.class)
 public class LogicalClockManager implements LogicalClockService {
 
     private final Logger log = getLogger(getClass());
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected StorageService storageService;
 
     private static final String SYSTEM_LOGICAL_CLOCK_COUNTER_NAME = "sys-clock-counter";
diff --git a/core/store/dist/src/main/java/org/onosproject/store/device/impl/DeviceClockManager.java b/core/store/dist/src/main/java/org/onosproject/store/device/impl/DeviceClockManager.java
index 9edcc1c..fb1d4e4 100644
--- a/core/store/dist/src/main/java/org/onosproject/store/device/impl/DeviceClockManager.java
+++ b/core/store/dist/src/main/java/org/onosproject/store/device/impl/DeviceClockManager.java
@@ -15,18 +15,8 @@
  */
 package org.onosproject.store.device.impl;
 
-import static org.slf4j.LoggerFactory.getLogger;
-
-import java.util.Optional;
-import java.util.concurrent.TimeUnit;
-import java.util.concurrent.atomic.AtomicLong;
-
-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.cache.Cache;
+import com.google.common.cache.CacheBuilder;
 import org.onosproject.cluster.ClusterService;
 import org.onosproject.cluster.NodeId;
 import org.onosproject.mastership.MastershipEvent;
@@ -39,27 +29,34 @@
 import org.onosproject.net.device.DeviceClockService;
 import org.onosproject.store.Timestamp;
 import org.onosproject.store.impl.MastershipBasedTimestamp;
+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.cache.Cache;
-import com.google.common.cache.CacheBuilder;
+import java.util.Optional;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.atomic.AtomicLong;
+
+import static org.slf4j.LoggerFactory.getLogger;
 
 /**
  * Clock service to issue Timestamp based on Device Mastership.
  */
-@Component(immediate = true)
-@Service
+@Component(immediate = true, service = DeviceClockService.class)
 public class DeviceClockManager implements DeviceClockService {
 
     private final Logger log = getLogger(getClass());
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected MastershipTermService mastershipTermService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected MastershipService mastershipService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected ClusterService clusterService;
 
     protected NodeId localNodeId;
diff --git a/core/store/dist/src/main/java/org/onosproject/store/device/impl/ECDeviceStore.java b/core/store/dist/src/main/java/org/onosproject/store/device/impl/ECDeviceStore.java
index 177c41ed..178bdcf 100644
--- a/core/store/dist/src/main/java/org/onosproject/store/device/impl/ECDeviceStore.java
+++ b/core/store/dist/src/main/java/org/onosproject/store/device/impl/ECDeviceStore.java
@@ -15,24 +15,12 @@
  */
 package org.onosproject.store.device.impl;
 
-import java.util.Collection;
-import java.util.Collections;
-import java.util.List;
-import java.util.Map;
-import java.util.Map.Entry;
-import java.util.Objects;
-import java.util.Optional;
-import java.util.Set;
-import java.util.concurrent.TimeUnit;
-import java.util.concurrent.atomic.AtomicReference;
-import java.util.stream.Collectors;
-import java.util.stream.Stream;
-
-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.apache.felix.scr.annotations.Service;
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.Iterables;
+import com.google.common.collect.Lists;
+import com.google.common.collect.Maps;
+import com.google.common.collect.Sets;
+import com.google.common.util.concurrent.Futures;
 import org.onlab.packet.ChassisId;
 import org.onlab.util.KryoNamespace;
 import org.onosproject.cluster.ClusterService;
@@ -73,14 +61,24 @@
 import org.onosproject.store.service.SetEventListener;
 import org.onosproject.store.service.StorageService;
 import org.onosproject.store.service.WallClockTimestamp;
+import org.osgi.service.component.annotations.Activate;
+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.ImmutableList;
-import com.google.common.collect.Iterables;
-import com.google.common.collect.Lists;
-import com.google.common.collect.Maps;
-import com.google.common.collect.Sets;
-import com.google.common.util.concurrent.Futures;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.List;
+import java.util.Map;
+import java.util.Map.Entry;
+import java.util.Objects;
+import java.util.Optional;
+import java.util.Set;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.atomic.AtomicReference;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
 
 import static com.google.common.base.Preconditions.checkArgument;
 import static com.google.common.base.Verify.verify;
@@ -101,7 +99,6 @@
  * Manages the inventory of devices using a {@code EventuallyConsistentMap}.
  */
 //@Component(immediate = true, enabled = false)
-@Service
 public class ECDeviceStore
     extends AbstractStore<DeviceEvent, DeviceStoreDelegate>
     implements DeviceStore {
@@ -121,22 +118,22 @@
 
     private DistributedSet<DeviceId> availableDevices;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected StorageService storageService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected MastershipService mastershipService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected MastershipTermService mastershipTermService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected DeviceClockService deviceClockService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected ClusterCommunicationService clusterCommunicator;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected ClusterService clusterService;
 
     private NodeId localNodeId;
diff --git a/core/store/dist/src/main/java/org/onosproject/store/device/impl/GossipDeviceStore.java b/core/store/dist/src/main/java/org/onosproject/store/device/impl/GossipDeviceStore.java
index e95d00d..32a9be6 100644
--- a/core/store/dist/src/main/java/org/onosproject/store/device/impl/GossipDeviceStore.java
+++ b/core/store/dist/src/main/java/org/onosproject/store/device/impl/GossipDeviceStore.java
@@ -20,12 +20,6 @@
 import com.google.common.collect.Maps;
 import com.google.common.collect.Sets;
 import org.apache.commons.lang3.RandomUtils;
-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.packet.ChassisId;
 import org.onlab.util.KryoNamespace;
 import org.onosproject.cluster.ClusterService;
@@ -68,6 +62,11 @@
 import org.onosproject.store.service.Serializer;
 import org.onosproject.store.service.StorageService;
 import org.onosproject.store.service.WallClockTimestamp;
+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.io.IOException;
@@ -99,9 +98,18 @@
 import static org.onlab.util.Tools.groupedThreads;
 import static org.onlab.util.Tools.minPriority;
 import static org.onosproject.cluster.ControllerNodeToNodeId.toNodeId;
-import static org.onosproject.net.device.DeviceEvent.Type.*;
-import static org.onosproject.store.device.impl.GossipDeviceStoreMessageSubjects.*;
+import static org.onosproject.net.device.DeviceEvent.Type.DEVICE_AVAILABILITY_CHANGED;
+import static org.onosproject.net.device.DeviceEvent.Type.PORT_ADDED;
+import static org.onosproject.net.device.DeviceEvent.Type.PORT_REMOVED;
+import static org.onosproject.net.device.DeviceEvent.Type.PORT_STATS_UPDATED;
+import static org.onosproject.net.device.DeviceEvent.Type.PORT_UPDATED;
+import static org.onosproject.store.device.impl.GossipDeviceStoreMessageSubjects.DEVICE_ADVERTISE;
 import static org.onosproject.store.device.impl.GossipDeviceStoreMessageSubjects.DEVICE_REMOVED;
+import static org.onosproject.store.device.impl.GossipDeviceStoreMessageSubjects.DEVICE_REMOVE_REQ;
+import static org.onosproject.store.device.impl.GossipDeviceStoreMessageSubjects.DEVICE_STATUS_CHANGE;
+import static org.onosproject.store.device.impl.GossipDeviceStoreMessageSubjects.DEVICE_UPDATE;
+import static org.onosproject.store.device.impl.GossipDeviceStoreMessageSubjects.PORT_STATUS_UPDATE;
+import static org.onosproject.store.device.impl.GossipDeviceStoreMessageSubjects.PORT_UPDATE;
 import static org.onosproject.store.service.EventuallyConsistentMapEvent.Type.PUT;
 import static org.slf4j.LoggerFactory.getLogger;
 
@@ -109,8 +117,7 @@
  * Manages inventory of infrastructure devices using gossip protocol to distribute
  * information.
  */
-@Component(immediate = true)
-@Service
+@Component(immediate = true, service = DeviceStore.class)
 public class GossipDeviceStore
         extends AbstractStore<DeviceEvent, DeviceStoreDelegate>
         implements DeviceStore {
@@ -142,22 +149,22 @@
     // available(=UP) devices
     private final Set<DeviceId> availableDevices = Sets.newConcurrentHashSet();
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected DeviceClockService deviceClockService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected StorageService storageService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected ClusterCommunicationService clusterCommunicator;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected ClusterService clusterService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected MastershipService mastershipService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected MastershipTermService termService;
 
     private static final Timestamp DEFAULT_TIMESTAMP = new MastershipBasedTimestamp(0, 0);
diff --git a/core/store/dist/src/main/java/org/onosproject/store/flow/impl/DistributedFlowRuleStore.java b/core/store/dist/src/main/java/org/onosproject/store/flow/impl/DistributedFlowRuleStore.java
index 32226fd..e0fe04d 100644
--- a/core/store/dist/src/main/java/org/onosproject/store/flow/impl/DistributedFlowRuleStore.java
+++ b/core/store/dist/src/main/java/org/onosproject/store/flow/impl/DistributedFlowRuleStore.java
@@ -15,32 +15,11 @@
  */
 package org.onosproject.store.flow.impl;
 
-import java.security.SecureRandom;
-import java.util.Collections;
-import java.util.List;
-import java.util.Map;
-import java.util.Objects;
-import java.util.Random;
-import java.util.Set;
-import java.util.concurrent.CompletableFuture;
-import java.util.concurrent.ExecutorService;
-import java.util.concurrent.Executors;
-import java.util.concurrent.ScheduledExecutorService;
-import java.util.concurrent.TimeUnit;
-import java.util.function.Supplier;
-import java.util.stream.Collectors;
-
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.Iterables;
 import com.google.common.collect.Maps;
 import com.google.common.collect.Sets;
 import com.google.common.collect.Streams;
-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.KryoNamespace;
 import org.onlab.util.Tools;
 import org.onosproject.cluster.ClusterService;
@@ -56,11 +35,6 @@
 import org.onosproject.net.flow.FlowEntry.FlowEntryState;
 import org.onosproject.net.flow.FlowId;
 import org.onosproject.net.flow.FlowRule;
-import org.onosproject.net.flow.oldbatch.FlowRuleBatchEntry;
-import org.onosproject.net.flow.oldbatch.FlowRuleBatchEntry.FlowRuleOperation;
-import org.onosproject.net.flow.oldbatch.FlowRuleBatchEvent;
-import org.onosproject.net.flow.oldbatch.FlowRuleBatchOperation;
-import org.onosproject.net.flow.oldbatch.FlowRuleBatchRequest;
 import org.onosproject.net.flow.FlowRuleEvent;
 import org.onosproject.net.flow.FlowRuleEvent.Type;
 import org.onosproject.net.flow.FlowRuleService;
@@ -68,6 +42,11 @@
 import org.onosproject.net.flow.FlowRuleStoreDelegate;
 import org.onosproject.net.flow.StoredFlowEntry;
 import org.onosproject.net.flow.TableStatisticsEntry;
+import org.onosproject.net.flow.oldbatch.FlowRuleBatchEntry;
+import org.onosproject.net.flow.oldbatch.FlowRuleBatchEntry.FlowRuleOperation;
+import org.onosproject.net.flow.oldbatch.FlowRuleBatchEvent;
+import org.onosproject.net.flow.oldbatch.FlowRuleBatchOperation;
+import org.onosproject.net.flow.oldbatch.FlowRuleBatchRequest;
 import org.onosproject.store.AbstractStore;
 import org.onosproject.store.cluster.messaging.ClusterCommunicationService;
 import org.onosproject.store.cluster.messaging.MessageSubject;
@@ -86,8 +65,28 @@
 import org.onosproject.store.service.StorageService;
 import org.onosproject.store.service.Versioned;
 import org.onosproject.store.service.WallClockTimestamp;
+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.security.SecureRandom;
+import java.util.Collections;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+import java.util.Random;
+import java.util.Set;
+import java.util.concurrent.CompletableFuture;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.concurrent.ScheduledExecutorService;
+import java.util.concurrent.TimeUnit;
+import java.util.function.Supplier;
+import java.util.stream.Collectors;
+
 import static org.onlab.util.Tools.groupedThreads;
 import static org.onosproject.net.flow.FlowRuleEvent.Type.RULE_REMOVED;
 import static org.onosproject.net.flow.FlowRuleEvent.Type.RULE_UPDATED;
@@ -99,8 +98,7 @@
  * @deprecated in Nightingale Release (1.13)
  */
 @Deprecated
-@Component(enabled = false)
-@Service
+@Component(enabled = false, service = FlowRuleStore.class)
 public class DistributedFlowRuleStore
         extends AbstractStore<FlowRuleBatchEvent, FlowRuleStoreDelegate>
         implements FlowRuleStore {
@@ -126,22 +124,22 @@
     private static final MessageSubject APPLY_BATCH_FLOWS = new MessageSubject("onos-flow-apply");
     private static final MessageSubject COMPLETE_BATCH = new MessageSubject("onos-flow-batch-complete");
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected DeviceService deviceService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected CoreService coreService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected MastershipService mastershipService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected ClusterCommunicationService clusterCommunicator;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected ClusterService clusterService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected StorageService storageService;
 
     protected final Serializer serializer = Serializer.using(KryoNamespaces.API);
diff --git a/core/store/dist/src/main/java/org/onosproject/store/flow/impl/ECFlowRuleStore.java b/core/store/dist/src/main/java/org/onosproject/store/flow/impl/ECFlowRuleStore.java
index 4502016..dad9351 100644
--- a/core/store/dist/src/main/java/org/onosproject/store/flow/impl/ECFlowRuleStore.java
+++ b/core/store/dist/src/main/java/org/onosproject/store/flow/impl/ECFlowRuleStore.java
@@ -15,32 +15,9 @@
 */
 package org.onosproject.store.flow.impl;
 
-import java.util.Collections;
-import java.util.Dictionary;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-import java.util.Objects;
-import java.util.Set;
-import java.util.concurrent.ExecutorService;
-import java.util.concurrent.Executors;
-import java.util.concurrent.ScheduledExecutorService;
-import java.util.concurrent.TimeUnit;
-import java.util.function.Function;
-import java.util.stream.Collectors;
-
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.Maps;
 import com.google.common.collect.Streams;
-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.util.KryoNamespace;
 import org.onlab.util.Tools;
 import org.onosproject.cfg.ComponentConfigService;
@@ -92,8 +69,29 @@
 import org.onosproject.store.service.StorageService;
 import org.onosproject.store.service.WallClockTimestamp;
 import org.osgi.service.component.ComponentContext;
+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.Collections;
+import java.util.Dictionary;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+import java.util.Set;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.concurrent.ScheduledExecutorService;
+import java.util.concurrent.TimeUnit;
+import java.util.function.Function;
+import java.util.stream.Collectors;
+
 import static com.google.common.base.Strings.isNullOrEmpty;
 import static org.onlab.util.Tools.get;
 import static org.onlab.util.Tools.groupedThreads;
@@ -107,68 +105,69 @@
 import static org.onosproject.store.flow.impl.ECFlowRuleStoreMessageSubjects.REMOVE_FLOW_ENTRY;
 import static org.slf4j.LoggerFactory.getLogger;
 
+import static org.onosproject.store.OsgiPropertyConstants.*;
+
 /**
  * Manages inventory of flow rules using a distributed state management protocol.
  */
-@Component(immediate = true)
-@Service
+@Component(
+        immediate = true,
+        service = FlowRuleStore.class,
+        property = {
+                MESSAGE_HANDLER_THREAD_POOL_SIZE + ":Integer=" + MESSAGE_HANDLER_THREAD_POOL_SIZE_DEFAULT,
+                BACKUP_PERIOD_MILLIS + ":Integer=" + BACKUP_PERIOD_MILLIS_DEFAULT,
+                ANTI_ENTROPY_PERIOD_MILLIS + ":Integer=" + ANTI_ENTROPY_PERIOD_MILLIS_DEFAULT,
+                EC_FLOW_RULE_STORE_PERSISTENCE_ENABLED + ":Boolean=" + EC_FLOW_RULE_STORE_PERSISTENCE_ENABLED_DEFAULT,
+                MAX_BACKUP_COUNT + ":Integer=" + MAX_BACKUP_COUNT_DEFAULT
+        }
+)
 public class ECFlowRuleStore
     extends AbstractStore<FlowRuleBatchEvent, FlowRuleStoreDelegate>
     implements FlowRuleStore {
 
     private final Logger log = getLogger(getClass());
 
-    private static final int MESSAGE_HANDLER_THREAD_POOL_SIZE = 8;
-    private static final int DEFAULT_MAX_BACKUP_COUNT = 2;
-    private static final boolean DEFAULT_PERSISTENCE_ENABLED = false;
-    private static final int DEFAULT_BACKUP_PERIOD_MILLIS = 2000;
-    private static final int DEFAULT_ANTI_ENTROPY_PERIOD_MILLIS = 5000;
     private static final long FLOW_RULE_STORE_TIMEOUT_MILLIS = 5000;
 
-    @Property(name = "msgHandlerPoolSize", intValue = MESSAGE_HANDLER_THREAD_POOL_SIZE,
-        label = "Number of threads in the message handler pool")
-    private int msgHandlerPoolSize = MESSAGE_HANDLER_THREAD_POOL_SIZE;
+    /** Number of threads in the message handler pool. */
+    private int msgHandlerPoolSize = MESSAGE_HANDLER_THREAD_POOL_SIZE_DEFAULT;
 
-    @Property(name = "backupPeriod", intValue = DEFAULT_BACKUP_PERIOD_MILLIS,
-        label = "Delay in ms between successive backup runs")
-    private int backupPeriod = DEFAULT_BACKUP_PERIOD_MILLIS;
+    /** Delay in ms between successive backup runs. */
+    private int backupPeriod = BACKUP_PERIOD_MILLIS_DEFAULT;
 
-    @Property(name = "antiEntropyPeriod", intValue = DEFAULT_ANTI_ENTROPY_PERIOD_MILLIS,
-        label = "Delay in ms between anti-entropy runs")
-    private int antiEntropyPeriod = DEFAULT_ANTI_ENTROPY_PERIOD_MILLIS;
+    /** Delay in ms between anti-entropy runs. */
+    private int antiEntropyPeriod = ANTI_ENTROPY_PERIOD_MILLIS_DEFAULT;
 
-    @Property(name = "persistenceEnabled", boolValue = false,
-        label = "Indicates whether or not changes in the flow table should be persisted to disk.")
-    private boolean persistenceEnabled = DEFAULT_PERSISTENCE_ENABLED;
+    /** Indicates whether or not changes in the flow table should be persisted to disk. */
+    private boolean persistenceEnabled = EC_FLOW_RULE_STORE_PERSISTENCE_ENABLED_DEFAULT;
 
-    @Property(name = "backupCount", intValue = DEFAULT_MAX_BACKUP_COUNT,
-        label = "Max number of backup copies for each device")
-    private volatile int backupCount = DEFAULT_MAX_BACKUP_COUNT;
+    /** Max number of backup copies for each device. */
+    private volatile int backupCount = MAX_BACKUP_COUNT_DEFAULT;
 
     private InternalFlowTable flowTable = new InternalFlowTable();
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected ReplicaInfoService replicaInfoManager;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected ClusterCommunicationService clusterCommunicator;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected ClusterService clusterService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected DeviceService deviceService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected CoreService coreService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected ComponentConfigService configService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected MastershipService mastershipService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected PersistenceService persistenceService;
 
     private Map<Long, NodeId> pendingResponses = Maps.newConcurrentMap();
@@ -182,7 +181,7 @@
     private final EventuallyConsistentMapListener<DeviceId, List<TableStatisticsEntry>> tableStatsListener =
         new InternalTableStatsListener();
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected StorageService storageService;
 
     protected final Serializer serializer = Serializer.using(KryoNamespace.newBuilder()
@@ -266,19 +265,19 @@
             String s = get(properties, "msgHandlerPoolSize");
             newPoolSize = isNullOrEmpty(s) ? msgHandlerPoolSize : Integer.parseInt(s.trim());
 
-            s = get(properties, "backupPeriod");
+            s = get(properties, BACKUP_PERIOD_MILLIS);
             newBackupPeriod = isNullOrEmpty(s) ? backupPeriod : Integer.parseInt(s.trim());
 
-            s = get(properties, "backupCount");
+            s = get(properties, MAX_BACKUP_COUNT);
             newBackupCount = isNullOrEmpty(s) ? backupCount : Integer.parseInt(s.trim());
 
-            s = get(properties, "antiEntropyPeriod");
+            s = get(properties, ANTI_ENTROPY_PERIOD_MILLIS);
             newAntiEntropyPeriod = isNullOrEmpty(s) ? antiEntropyPeriod : Integer.parseInt(s.trim());
         } catch (NumberFormatException | ClassCastException e) {
-            newPoolSize = MESSAGE_HANDLER_THREAD_POOL_SIZE;
-            newBackupPeriod = DEFAULT_BACKUP_PERIOD_MILLIS;
-            newBackupCount = DEFAULT_MAX_BACKUP_COUNT;
-            newAntiEntropyPeriod = DEFAULT_ANTI_ENTROPY_PERIOD_MILLIS;
+            newPoolSize = MESSAGE_HANDLER_THREAD_POOL_SIZE_DEFAULT;
+            newBackupPeriod = BACKUP_PERIOD_MILLIS_DEFAULT;
+            newBackupCount = MAX_BACKUP_COUNT_DEFAULT;
+            newAntiEntropyPeriod = ANTI_ENTROPY_PERIOD_MILLIS_DEFAULT;
         }
 
         if (newBackupPeriod != backupPeriod) {
diff --git a/core/store/dist/src/main/java/org/onosproject/store/flow/impl/ReplicaInfoManager.java b/core/store/dist/src/main/java/org/onosproject/store/flow/impl/ReplicaInfoManager.java
index cfa998d..7c3bed7 100644
--- a/core/store/dist/src/main/java/org/onosproject/store/flow/impl/ReplicaInfoManager.java
+++ b/core/store/dist/src/main/java/org/onosproject/store/flow/impl/ReplicaInfoManager.java
@@ -15,12 +15,6 @@
  */
 package org.onosproject.store.flow.impl;
 
-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.event.EventDeliveryService;
 import org.onosproject.event.ListenerRegistry;
 import org.onosproject.mastership.MastershipEvent;
@@ -32,6 +26,11 @@
 import org.onosproject.store.flow.ReplicaInfoEvent;
 import org.onosproject.store.flow.ReplicaInfoEventListener;
 import org.onosproject.store.flow.ReplicaInfoService;
+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 static com.google.common.base.Preconditions.checkNotNull;
@@ -42,18 +41,17 @@
 /**
  * Manages replica placement information.
  */
-@Component(immediate = true)
-@Service
+@Component(immediate = true, service = ReplicaInfoService.class)
 public class ReplicaInfoManager implements ReplicaInfoService {
 
     private final Logger log = getLogger(getClass());
 
     private final MastershipListener mastershipListener = new InternalMastershipListener();
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected EventDeliveryService eventDispatcher;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected MastershipService mastershipService;
 
     protected final ListenerRegistry<ReplicaInfoEvent, ReplicaInfoEventListener>
diff --git a/core/store/dist/src/main/java/org/onosproject/store/flowobjective/impl/DistributedFlowObjectiveStore.java b/core/store/dist/src/main/java/org/onosproject/store/flowobjective/impl/DistributedFlowObjectiveStore.java
index 569b50b..edbb979 100644
--- a/core/store/dist/src/main/java/org/onosproject/store/flowobjective/impl/DistributedFlowObjectiveStore.java
+++ b/core/store/dist/src/main/java/org/onosproject/store/flowobjective/impl/DistributedFlowObjectiveStore.java
@@ -15,12 +15,6 @@
  */
 package org.onosproject.store.flowobjective.impl;
 
-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.KryoNamespace;
 import org.onosproject.net.behaviour.DefaultNextGroup;
 import org.onosproject.net.behaviour.NextGroup;
@@ -35,11 +29,13 @@
 import org.onosproject.store.service.Serializer;
 import org.onosproject.store.service.StorageService;
 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 static org.onlab.util.Tools.groupedThreads;
-import static org.slf4j.LoggerFactory.getLogger;
-
 import java.util.HashMap;
 import java.util.Map;
 import java.util.concurrent.BlockingQueue;
@@ -47,11 +43,13 @@
 import java.util.concurrent.Executors;
 import java.util.concurrent.LinkedBlockingQueue;
 
+import static org.onlab.util.Tools.groupedThreads;
+import static org.slf4j.LoggerFactory.getLogger;
+
 /**
  * Manages the inventory of created next groups.
  */
-@Component(immediate = true)
-@Service
+@Component(immediate = true, service = FlowObjectiveStore.class)
 public class DistributedFlowObjectiveStore
         extends AbstractStore<ObjectiveEvent, FlowObjectiveStoreDelegate>
         implements FlowObjectiveStore {
@@ -60,7 +58,7 @@
 
     private ConsistentMap<Integer, byte[]> nextGroups;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected StorageService storageService;
 
     private AtomicIdGenerator nextIds;
diff --git a/core/store/dist/src/main/java/org/onosproject/store/group/impl/DistributedGroupStore.java b/core/store/dist/src/main/java/org/onosproject/store/group/impl/DistributedGroupStore.java
index 6e8b126..23c1c9f 100644
--- a/core/store/dist/src/main/java/org/onosproject/store/group/impl/DistributedGroupStore.java
+++ b/core/store/dist/src/main/java/org/onosproject/store/group/impl/DistributedGroupStore.java
@@ -19,14 +19,6 @@
 import com.google.common.collect.ImmutableSet;
 import com.google.common.collect.Iterables;
 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.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.util.KryoNamespace;
 import org.onosproject.cfg.ComponentConfigService;
 import org.onosproject.cluster.ClusterService;
@@ -57,6 +49,7 @@
 import org.onosproject.store.cluster.messaging.ClusterCommunicationService;
 import org.onosproject.store.serializers.KryoNamespaces;
 import org.onosproject.store.service.ConsistentMap;
+import org.onosproject.store.service.DistributedPrimitive.Status;
 import org.onosproject.store.service.MapEvent;
 import org.onosproject.store.service.MapEventListener;
 import org.onosproject.store.service.MultiValuedTimestamp;
@@ -64,8 +57,13 @@
 import org.onosproject.store.service.StorageService;
 import org.onosproject.store.service.Topic;
 import org.onosproject.store.service.Versioned;
-import org.onosproject.store.service.DistributedPrimitive.Status;
 import org.osgi.service.component.ComponentContext;
+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;
@@ -95,46 +93,56 @@
 import static java.util.concurrent.Executors.newSingleThreadScheduledExecutor;
 import static org.onlab.util.Tools.get;
 import static org.onlab.util.Tools.groupedThreads;
+import static org.onosproject.store.OsgiPropertyConstants.ALLOW_EXTRANEOUS_GROUPS;
+import static org.onosproject.store.OsgiPropertyConstants.ALLOW_EXTRANEOUS_GROUPS_DEFAULT;
+import static org.onosproject.store.OsgiPropertyConstants.GARBAGE_COLLECT;
+import static org.onosproject.store.OsgiPropertyConstants.GARBAGE_COLLECT_DEFAULT;
+import static org.onosproject.store.OsgiPropertyConstants.GARBAGE_COLLECT_THRESH;
+import static org.onosproject.store.OsgiPropertyConstants.GARBAGE_COLLECT_THRESH_DEFAULT;
 import static org.slf4j.LoggerFactory.getLogger;
 
 /**
  * Manages inventory of group entries using distributed group stores from the
  * storage service.
  */
-@Component(immediate = true)
-@Service
+@Component(
+        immediate = true,
+        service = GroupStore.class,
+        property = {
+                GARBAGE_COLLECT + ":Boolean=" + GARBAGE_COLLECT_DEFAULT,
+                GARBAGE_COLLECT_THRESH + ":Integer=" + GARBAGE_COLLECT_THRESH_DEFAULT,
+                ALLOW_EXTRANEOUS_GROUPS + ":Boolean=" + ALLOW_EXTRANEOUS_GROUPS_DEFAULT
+        }
+)
 public class DistributedGroupStore
         extends AbstractStore<GroupEvent, GroupStoreDelegate>
         implements GroupStore {
 
     private final Logger log = getLogger(getClass());
 
-    private static final boolean GARBAGE_COLLECT = false;
-    private static final int GC_THRESH = 6;
-    private static final boolean ALLOW_EXTRANEOUS_GROUPS = true;
     private static final int MAX_FAILED_ATTEMPTS = 3;
 
     private final int dummyId = 0xffffffff;
     private final GroupId dummyGroupId = new GroupId(dummyId);
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected ClusterCommunicationService clusterCommunicator;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected ClusterService clusterService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected StorageService storageService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected MastershipService mastershipService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected ComponentConfigService cfgService;
 
     // Guarantees enabling DriverService before enabling GroupStore
     // (DriverService is used in serializing/de-serializing DefaultGroup)
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected DriverService driverService;
 
     private ScheduledExecutorService executor;
@@ -162,17 +170,14 @@
 
     private static Topic<GroupStoreMessage> groupTopic;
 
-    @Property(name = "garbageCollect", boolValue = GARBAGE_COLLECT,
-            label = "Enable group garbage collection")
-    private boolean garbageCollect = GARBAGE_COLLECT;
+    /** Enable group garbage collection. */
+    private boolean garbageCollect = GARBAGE_COLLECT_DEFAULT;
 
-    @Property(name = "gcThresh", intValue = GC_THRESH,
-            label = "Number of rounds for group garbage collection")
-    private int gcThresh = GC_THRESH;
+    /** Number of rounds for group garbage collection. */
+    private int gcThresh = GARBAGE_COLLECT_THRESH_DEFAULT;
 
-    @Property(name = "allowExtraneousGroups", boolValue = ALLOW_EXTRANEOUS_GROUPS,
-            label = "Allow groups in switches not installed by ONOS")
-    private boolean allowExtraneousGroups = ALLOW_EXTRANEOUS_GROUPS;
+    /** Allow groups in switches not installed by ONOS. */
+    private boolean allowExtraneousGroups = ALLOW_EXTRANEOUS_GROUPS_DEFAULT;
 
     @Activate
     public void activate(ComponentContext context) {
@@ -261,18 +266,18 @@
         Dictionary<?, ?> properties = context != null ? context.getProperties() : new Properties();
 
         try {
-            String s = get(properties, "garbageCollect");
-            garbageCollect = isNullOrEmpty(s) ? GARBAGE_COLLECT : Boolean.parseBoolean(s.trim());
+            String s = get(properties, GARBAGE_COLLECT);
+            garbageCollect = isNullOrEmpty(s) ? GARBAGE_COLLECT_DEFAULT : Boolean.parseBoolean(s.trim());
 
-            s = get(properties, "gcThresh");
-            gcThresh = isNullOrEmpty(s) ? GC_THRESH : Integer.parseInt(s.trim());
+            s = get(properties, GARBAGE_COLLECT_THRESH);
+            gcThresh = isNullOrEmpty(s) ? GARBAGE_COLLECT_THRESH_DEFAULT : Integer.parseInt(s.trim());
 
-            s = get(properties, "allowExtraneousGroups");
-            allowExtraneousGroups = isNullOrEmpty(s) ? ALLOW_EXTRANEOUS_GROUPS : Boolean.parseBoolean(s.trim());
+            s = get(properties, ALLOW_EXTRANEOUS_GROUPS);
+            allowExtraneousGroups = isNullOrEmpty(s) ? ALLOW_EXTRANEOUS_GROUPS_DEFAULT : Boolean.parseBoolean(s.trim());
         } catch (Exception e) {
-            gcThresh = GC_THRESH;
-            garbageCollect = GARBAGE_COLLECT;
-            allowExtraneousGroups = ALLOW_EXTRANEOUS_GROUPS;
+            gcThresh = GARBAGE_COLLECT_THRESH_DEFAULT;
+            garbageCollect = GARBAGE_COLLECT_DEFAULT;
+            allowExtraneousGroups = ALLOW_EXTRANEOUS_GROUPS_DEFAULT;
         }
     }
 
diff --git a/core/store/dist/src/main/java/org/onosproject/store/host/impl/DefaultHostProbeStore.java b/core/store/dist/src/main/java/org/onosproject/store/host/impl/DefaultHostProbeStore.java
index 33cb7ad..4aac3a3 100644
--- a/core/store/dist/src/main/java/org/onosproject/store/host/impl/DefaultHostProbeStore.java
+++ b/core/store/dist/src/main/java/org/onosproject/store/host/impl/DefaultHostProbeStore.java
@@ -18,12 +18,6 @@
 import com.google.common.cache.Cache;
 import com.google.common.cache.CacheBuilder;
 import com.google.common.cache.RemovalNotification;
-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.packet.MacAddress;
 import org.onlab.util.KryoNamespace;
 import org.onosproject.net.ConnectPoint;
@@ -31,8 +25,8 @@
 import org.onosproject.net.host.HostProbe;
 import org.onosproject.net.host.HostProbeStore;
 import org.onosproject.net.host.HostProbingEvent;
-import org.onosproject.net.host.ProbeMode;
 import org.onosproject.net.host.HostProbingStoreDelegate;
+import org.onosproject.net.host.ProbeMode;
 import org.onosproject.store.AbstractStore;
 import org.onosproject.store.serializers.KryoNamespaces;
 import org.onosproject.store.service.AtomicCounter;
@@ -42,6 +36,11 @@
 import org.onosproject.store.service.Serializer;
 import org.onosproject.store.service.StorageService;
 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.util.Map;
@@ -52,11 +51,10 @@
 import static org.onlab.util.Tools.groupedThreads;
 import static org.slf4j.LoggerFactory.getLogger;
 
-@Component(immediate = true)
-@Service
+@Component(immediate = true, service = HostProbeStore.class)
 public class DefaultHostProbeStore extends AbstractStore<HostProbingEvent, HostProbingStoreDelegate>
         implements HostProbeStore {
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected StorageService storageService;
 
     private final Logger log = getLogger(getClass());
diff --git a/core/store/dist/src/main/java/org/onosproject/store/host/impl/DistributedHostStore.java b/core/store/dist/src/main/java/org/onosproject/store/host/impl/DistributedHostStore.java
index 35dedbd..2f6ba52 100644
--- a/core/store/dist/src/main/java/org/onosproject/store/host/impl/DistributedHostStore.java
+++ b/core/store/dist/src/main/java/org/onosproject/store/host/impl/DistributedHostStore.java
@@ -17,13 +17,6 @@
 
 import com.google.common.collect.ImmutableSet;
 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.onlab.packet.IpAddress;
 import org.onlab.packet.MacAddress;
 import org.onlab.packet.VlanId;
@@ -44,12 +37,17 @@
 import org.onosproject.store.AbstractStore;
 import org.onosproject.store.serializers.KryoNamespaces;
 import org.onosproject.store.service.ConsistentMap;
+import org.onosproject.store.service.DistributedPrimitive.Status;
 import org.onosproject.store.service.MapEvent;
 import org.onosproject.store.service.MapEventListener;
 import org.onosproject.store.service.Serializer;
 import org.onosproject.store.service.StorageService;
-import org.onosproject.store.service.DistributedPrimitive.Status;
 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.util.Collection;
@@ -69,21 +67,23 @@
 import static java.util.concurrent.Executors.newSingleThreadScheduledExecutor;
 import static org.onlab.util.Tools.groupedThreads;
 import static org.onosproject.net.DefaultAnnotations.merge;
-import static org.onosproject.net.host.HostEvent.Type.*;
+import static org.onosproject.net.host.HostEvent.Type.HOST_ADDED;
+import static org.onosproject.net.host.HostEvent.Type.HOST_MOVED;
+import static org.onosproject.net.host.HostEvent.Type.HOST_REMOVED;
+import static org.onosproject.net.host.HostEvent.Type.HOST_UPDATED;
 import static org.slf4j.LoggerFactory.getLogger;
 
 /**
  * Manages the inventory of hosts using a {@code EventuallyConsistentMap}.
  */
-@Component(immediate = true)
-@Service
+@Component(immediate = true, service = HostStore.class)
 public class DistributedHostStore
     extends AbstractStore<HostEvent, HostStoreDelegate>
     implements HostStore {
 
     private final Logger log = getLogger(getClass());
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected StorageService storageService;
 
     private ConsistentMap<HostId, DefaultHost> hostsConsistentMap;
diff --git a/core/store/dist/src/main/java/org/onosproject/store/intent/impl/ConsistentIntentSetMultimap.java b/core/store/dist/src/main/java/org/onosproject/store/intent/impl/ConsistentIntentSetMultimap.java
index ba0fed6..5e4ece3 100644
--- a/core/store/dist/src/main/java/org/onosproject/store/intent/impl/ConsistentIntentSetMultimap.java
+++ b/core/store/dist/src/main/java/org/onosproject/store/intent/impl/ConsistentIntentSetMultimap.java
@@ -16,12 +16,6 @@
 package org.onosproject.store.intent.impl;
 
 import com.google.common.annotations.Beta;
-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.net.device.DeviceService;
 import org.onosproject.net.intent.IntentId;
 import org.onosproject.net.intent.IntentSetMultimap;
@@ -30,6 +24,11 @@
 import org.onosproject.store.service.Serializer;
 import org.onosproject.store.service.StorageService;
 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.util.HashSet;
@@ -41,8 +40,7 @@
  * A collection that maps Intent IDs as keys to values as Intent IDs,
  * where each key may associated with multiple values without duplication.
  */
-@Component(immediate = true)
-@Service
+@Component(immediate = true, service = IntentSetMultimap.class)
 @Beta
 public class ConsistentIntentSetMultimap implements IntentSetMultimap {
     private final Logger log = getLogger(getClass());
@@ -53,10 +51,10 @@
 
     private ConsistentMap<IntentId, Set<IntentId>> intentMapping;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected StorageService storageService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected DeviceService deviceService;
 
     @Activate
diff --git a/core/store/dist/src/main/java/org/onosproject/store/intent/impl/GossipIntentStore.java b/core/store/dist/src/main/java/org/onosproject/store/intent/impl/GossipIntentStore.java
index 69b16ed..bddb7a0 100644
--- a/core/store/dist/src/main/java/org/onosproject/store/intent/impl/GossipIntentStore.java
+++ b/core/store/dist/src/main/java/org/onosproject/store/intent/impl/GossipIntentStore.java
@@ -17,14 +17,6 @@
 
 import com.google.common.collect.ImmutableList;
 import org.apache.commons.lang.math.RandomUtils;
-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.util.Backtrace;
 import org.onlab.util.KryoNamespace;
 import org.onosproject.cfg.ComponentConfigService;
@@ -52,6 +44,12 @@
 import org.onosproject.store.service.StorageService;
 import org.onosproject.store.service.WallClockTimestamp;
 import org.osgi.service.component.ComponentContext;
+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.Collection;
@@ -67,16 +65,22 @@
 import static com.google.common.base.Strings.isNullOrEmpty;
 import static org.onlab.util.Tools.get;
 import static org.onosproject.net.intent.IntentState.PURGE_REQ;
+import static org.onosproject.store.OsgiPropertyConstants.GIS_PERSISTENCE_ENABLED;
+import static org.onosproject.store.OsgiPropertyConstants.GIS_PERSISTENCE_ENABLED_DEFAULT;
 import static org.slf4j.LoggerFactory.getLogger;
-
 /**
  * Manages inventory of Intents in a distributed data store that uses optimistic
  * replication and gossip based techniques.
  */
 //FIXME we should listen for leadership changes. if the local instance has just
 // ...  become a leader, scan the pending map and process those
-@Component(immediate = true)
-@Service
+@Component(
+        immediate = true,
+        service = IntentStore.class,
+        property = {
+                GIS_PERSISTENCE_ENABLED + ":Boolean=" + GIS_PERSISTENCE_ENABLED_DEFAULT
+        }
+)
 public class GossipIntentStore
         extends AbstractStore<IntentEvent, IntentStoreDelegate>
         implements IntentStore {
@@ -91,16 +95,16 @@
     // Map of intent key => pending intent operation
     private EventuallyConsistentMap<Key, IntentData> pendingMap;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected ComponentConfigService configService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected ClusterService clusterService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected StorageService storageService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected WorkPartitionService partitionService;
 
     private final AtomicLong sequenceNumber = new AtomicLong(0);
@@ -115,12 +119,12 @@
     private boolean initiallyPersistent = false;
 
     //TODO this is currently an experimental feature used for performance
-    // evalutaion, enabling persistence with persist the intents but they will
+    // evaluation, enabling persistence with persist the intents but they will
     // not be reinstalled and network state will not be consistent with the
     // intents on cluster restart
-    @Property(name = "persistenceEnabled", boolValue = PERSIST,
-            label = "EXPERIMENTAL: Enable intent persistence")
-    private boolean persistenceEnabled;
+
+    /** EXPERIMENTAL: Enable intent persistence. */
+    private boolean persistenceEnabled = GIS_PERSISTENCE_ENABLED_DEFAULT;
 
 
     /**
@@ -214,7 +218,7 @@
         Dictionary<?, ?> properties = context != null ? context.getProperties()
                 : new Properties();
         try {
-            String s = get(properties, "persistenceEnabled");
+            String s = get(properties, GIS_PERSISTENCE_ENABLED);
             persistenceEnabled =  isNullOrEmpty(s) ? PERSIST :
                     Boolean.parseBoolean(s.trim());
         } catch (Exception e) {
diff --git a/core/store/dist/src/main/java/org/onosproject/store/intent/impl/WorkPartitionManager.java b/core/store/dist/src/main/java/org/onosproject/store/intent/impl/WorkPartitionManager.java
index b6e15cf..b06fe6b 100644
--- a/core/store/dist/src/main/java/org/onosproject/store/intent/impl/WorkPartitionManager.java
+++ b/core/store/dist/src/main/java/org/onosproject/store/intent/impl/WorkPartitionManager.java
@@ -15,12 +15,6 @@
  */
 package org.onosproject.store.intent.impl;
 
-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.Leadership;
 import org.onosproject.cluster.LeadershipEvent;
@@ -32,11 +26,14 @@
 import org.onosproject.net.intent.WorkPartitionEvent;
 import org.onosproject.net.intent.WorkPartitionEventListener;
 import org.onosproject.net.intent.WorkPartitionService;
+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 static org.onlab.util.Tools.groupedThreads;
-
 import java.util.List;
 import java.util.Objects;
 import java.util.concurrent.Executors;
@@ -47,22 +44,23 @@
 import java.util.stream.Collectors;
 import java.util.stream.IntStream;
 
+import static org.onlab.util.Tools.groupedThreads;
+
 /**
  * Manages the assignment of work partitions to instances.
  */
-@Component(immediate = true)
-@Service
+@Component(immediate = true, service = WorkPartitionService.class)
 public class WorkPartitionManager implements WorkPartitionService {
 
     private static final Logger log = LoggerFactory.getLogger(WorkPartitionManager.class);
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected LeadershipService leadershipService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected ClusterService clusterService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected EventDeliveryService eventDispatcher;
 
     protected final AtomicBoolean rebalanceScheduled = new AtomicBoolean(false);
diff --git a/core/store/dist/src/main/java/org/onosproject/store/key/impl/DistributedDeviceKeyStore.java b/core/store/dist/src/main/java/org/onosproject/store/key/impl/DistributedDeviceKeyStore.java
index 8885fbd..df2c1c2 100644
--- a/core/store/dist/src/main/java/org/onosproject/store/key/impl/DistributedDeviceKeyStore.java
+++ b/core/store/dist/src/main/java/org/onosproject/store/key/impl/DistributedDeviceKeyStore.java
@@ -16,12 +16,6 @@
 
 package org.onosproject.store.key.impl;
 
-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.net.key.DeviceKey;
 import org.onosproject.net.key.DeviceKeyEvent;
 import org.onosproject.net.key.DeviceKeyId;
@@ -34,6 +28,11 @@
 import org.onosproject.store.service.MapEventListener;
 import org.onosproject.store.service.Serializer;
 import org.onosproject.store.service.StorageService;
+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.Arrays;
@@ -47,15 +46,14 @@
  * A distributed device key store implementation, device keys are stored consistently
  * across the cluster.
  */
-@Component(immediate = true)
-@Service
+@Component(immediate = true, service = DeviceKeyStore.class)
 public class DistributedDeviceKeyStore
         extends AbstractStore<DeviceKeyEvent, DeviceKeyStoreDelegate>
         implements DeviceKeyStore {
 
     private final Logger log = getLogger(getClass());
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected StorageService storageService;
 
     private ConsistentMap<DeviceKeyId, DeviceKey> deviceKeys;
diff --git a/core/store/dist/src/main/java/org/onosproject/store/link/impl/ECLinkStore.java b/core/store/dist/src/main/java/org/onosproject/store/link/impl/ECLinkStore.java
index 21f8152..eebfbc2 100644
--- a/core/store/dist/src/main/java/org/onosproject/store/link/impl/ECLinkStore.java
+++ b/core/store/dist/src/main/java/org/onosproject/store/link/impl/ECLinkStore.java
@@ -15,20 +15,10 @@
  */
 package org.onosproject.store.link.impl;
 
-import java.util.Collection;
-import java.util.Map;
-import java.util.Objects;
-import java.util.Set;
-import java.util.concurrent.atomic.AtomicReference;
-import java.util.function.Predicate;
-import java.util.stream.Collectors;
-
-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.Iterables;
+import com.google.common.collect.Maps;
+import com.google.common.collect.Sets;
+import com.google.common.util.concurrent.Futures;
 import org.onlab.util.KryoNamespace;
 import org.onlab.util.SharedExecutors;
 import org.onosproject.cluster.ClusterService;
@@ -67,12 +57,20 @@
 import org.onosproject.store.service.EventuallyConsistentMapListener;
 import org.onosproject.store.service.Serializer;
 import org.onosproject.store.service.StorageService;
+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.Iterables;
-import com.google.common.collect.Maps;
-import com.google.common.collect.Sets;
-import com.google.common.util.concurrent.Futures;
+import java.util.Collection;
+import java.util.Map;
+import java.util.Objects;
+import java.util.Set;
+import java.util.concurrent.atomic.AtomicReference;
+import java.util.function.Predicate;
+import java.util.stream.Collectors;
 
 import static org.onosproject.net.DefaultAnnotations.union;
 import static org.onosproject.net.Link.State.ACTIVE;
@@ -91,8 +89,7 @@
 /**
  * Manages the inventory of links using a {@code EventuallyConsistentMap}.
  */
-@Component(immediate = true)
-@Service
+@Component(immediate = true, service = LinkStore.class)
 public class ECLinkStore
         extends AbstractStore<LinkEvent, LinkStoreDelegate>
         implements LinkStore {
@@ -124,25 +121,25 @@
 
     private static final MessageSubject LINK_INJECT_MESSAGE = new MessageSubject("inject-link-request");
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected StorageService storageService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected MastershipService mastershipService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected DeviceClockService deviceClockService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected ClusterCommunicationService clusterCommunicator;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected ClusterService clusterService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected NetworkConfigRegistry netCfgService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected CoreService coreService;
 
     private EventuallyConsistentMapListener<Provided<LinkKey>, LinkDescription> linkTracker =
diff --git a/core/store/dist/src/main/java/org/onosproject/store/mastership/impl/ConsistentDeviceMastershipStore.java b/core/store/dist/src/main/java/org/onosproject/store/mastership/impl/ConsistentDeviceMastershipStore.java
index 41adfde..3990a8b 100644
--- a/core/store/dist/src/main/java/org/onosproject/store/mastership/impl/ConsistentDeviceMastershipStore.java
+++ b/core/store/dist/src/main/java/org/onosproject/store/mastership/impl/ConsistentDeviceMastershipStore.java
@@ -15,34 +15,8 @@
  */
 package org.onosproject.store.mastership.impl;
 
-import static org.onlab.util.Tools.groupedThreads;
-import static org.onosproject.mastership.MastershipEvent.Type.BACKUPS_CHANGED;
-import static org.onosproject.mastership.MastershipEvent.Type.MASTER_CHANGED;
-import static org.onosproject.mastership.MastershipEvent.Type.RESTORED;
-import static org.onosproject.mastership.MastershipEvent.Type.SUSPENDED;
-import static org.slf4j.LoggerFactory.getLogger;
-import static com.google.common.base.Preconditions.checkArgument;
-
-import java.util.List;
-import java.util.Objects;
-import java.util.Optional;
-import java.util.Set;
-import java.util.concurrent.CompletableFuture;
-import java.util.concurrent.ExecutorService;
-import java.util.concurrent.Executors;
-import java.util.concurrent.ScheduledExecutorService;
-import java.util.concurrent.TimeUnit;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-import java.util.stream.Collectors;
-
+import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableMap;
-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.KryoNamespace;
 import org.onosproject.cluster.ClusterService;
 import org.onosproject.cluster.Leadership;
@@ -64,31 +38,54 @@
 import org.onosproject.store.cluster.messaging.MessageSubject;
 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 com.google.common.collect.ImmutableList;
+import java.util.List;
+import java.util.Objects;
+import java.util.Optional;
+import java.util.Set;
+import java.util.concurrent.CompletableFuture;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.concurrent.ScheduledExecutorService;
+import java.util.concurrent.TimeUnit;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+import java.util.stream.Collectors;
+
+import static com.google.common.base.Preconditions.checkArgument;
+import static org.onlab.util.Tools.groupedThreads;
+import static org.onosproject.mastership.MastershipEvent.Type.BACKUPS_CHANGED;
+import static org.onosproject.mastership.MastershipEvent.Type.MASTER_CHANGED;
+import static org.onosproject.mastership.MastershipEvent.Type.RESTORED;
+import static org.onosproject.mastership.MastershipEvent.Type.SUSPENDED;
+import static org.slf4j.LoggerFactory.getLogger;
 
 /**
  * Implementation of the MastershipStore on top of Leadership Service.
  */
-@Component(immediate = true)
-@Service
+@Component(immediate = true, service = MastershipStore.class)
 public class ConsistentDeviceMastershipStore
     extends AbstractStore<MastershipEvent, MastershipStoreDelegate>
     implements MastershipStore {
 
     private final Logger log = getLogger(getClass());
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected LeadershipService leadershipService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected LeadershipAdminService leadershipAdminService;
 
-    @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 NodeId localNodeId;
diff --git a/core/store/dist/src/main/java/org/onosproject/store/mcast/impl/DistributedMcastStore.java b/core/store/dist/src/main/java/org/onosproject/store/mcast/impl/DistributedMcastStore.java
index d371fdf..4c85458 100644
--- a/core/store/dist/src/main/java/org/onosproject/store/mcast/impl/DistributedMcastStore.java
+++ b/core/store/dist/src/main/java/org/onosproject/store/mcast/impl/DistributedMcastStore.java
@@ -18,14 +18,7 @@
 
 import com.google.common.base.Objects;
 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.onlab.util.KryoNamespace;
-
 import org.onosproject.net.ConnectPoint;
 import org.onosproject.net.mcast.McastEvent;
 import org.onosproject.net.mcast.McastRoute;
@@ -39,6 +32,11 @@
 import org.onosproject.store.service.Serializer;
 import org.onosproject.store.service.StorageService;
 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.util.Map;
@@ -55,8 +53,7 @@
  * A distributed mcast store implementation. Routes are stored consistently
  * across the cluster.
  */
-@Component(immediate = true)
-@Service
+@Component(immediate = true, service = McastStore.class)
 public class DistributedMcastStore
     extends AbstractStore<McastEvent, McastStoreDelegate>
     implements McastStore {
@@ -64,7 +61,7 @@
     private static final String MCASTRIB = "onos-mcast-rib-table";
     private Logger log = getLogger(getClass());
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected StorageService storageService;
 
     private Map<McastRoute, MulticastData> mcastRoutes;
diff --git a/core/store/dist/src/main/java/org/onosproject/store/package-info.java b/core/store/dist/src/main/java/org/onosproject/store/package-info.java
new file mode 100644
index 0000000..c468154
--- /dev/null
+++ b/core/store/dist/src/main/java/org/onosproject/store/package-info.java
@@ -0,0 +1,19 @@
+/*
+ * Copyright 2018-present Open Networking Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+/**
+ * Stores used by the core of ONOS.
+ */
+package org.onosproject.store;
\ No newline at end of file
diff --git a/core/store/dist/src/main/java/org/onosproject/store/packet/impl/DistributedPacketStore.java b/core/store/dist/src/main/java/org/onosproject/store/packet/impl/DistributedPacketStore.java
index 1043c45..50e8900 100644
--- a/core/store/dist/src/main/java/org/onosproject/store/packet/impl/DistributedPacketStore.java
+++ b/core/store/dist/src/main/java/org/onosproject/store/packet/impl/DistributedPacketStore.java
@@ -16,14 +16,6 @@
 package org.onosproject.store.packet.impl;
 
 import com.google.common.collect.Lists;
-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.util.KryoNamespace;
 import org.onosproject.cfg.ComponentConfigService;
 import org.onosproject.cluster.ClusterService;
@@ -46,6 +38,12 @@
 import org.onosproject.store.service.StorageService;
 import org.onosproject.store.service.Versioned;
 import org.osgi.service.component.ComponentContext;
+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.Collection;
@@ -61,14 +59,21 @@
 import static java.util.concurrent.Executors.newFixedThreadPool;
 import static org.onlab.util.Tools.get;
 import static org.onlab.util.Tools.groupedThreads;
+import static org.onosproject.store.OsgiPropertyConstants.DPS_MESSAGE_HANDLER_THREAD_POOL_SIZE;
+import static org.onosproject.store.OsgiPropertyConstants.DPS_MESSAGE_HANDLER_THREAD_POOL_SIZE_DEFAULT;
 import static org.slf4j.LoggerFactory.getLogger;
 
 /**
  * Distributed packet store implementation allowing packets to be sent to
  * remote instances.
  */
-@Component(immediate = true)
-@Service
+@Component(
+        immediate = true,
+        service = PacketStore.class,
+        property = {
+                DPS_MESSAGE_HANDLER_THREAD_POOL_SIZE + ":Integer=" + DPS_MESSAGE_HANDLER_THREAD_POOL_SIZE_DEFAULT
+        }
+)
 public class DistributedPacketStore
         extends AbstractStore<PacketEvent, PacketStoreDelegate>
         implements PacketStore {
@@ -77,19 +82,19 @@
 
     private static final String FORMAT = "Setting: messageHandlerThreadPoolSize={}";
 
-    @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 communicationService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected StorageService storageService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected ComponentConfigService cfgService;
 
     private PacketRequestTracker tracker;
@@ -101,10 +106,8 @@
 
     private ExecutorService messageHandlingExecutor;
 
-    private static final int DEFAULT_MESSAGE_HANDLER_THREAD_POOL_SIZE = 4;
-    @Property(name = "messageHandlerThreadPoolSize", intValue = DEFAULT_MESSAGE_HANDLER_THREAD_POOL_SIZE,
-            label = "Size of thread pool to assign message handler")
-    private static int messageHandlerThreadPoolSize = DEFAULT_MESSAGE_HANDLER_THREAD_POOL_SIZE;
+    /** Size of thread pool to assign message handler. */
+    private static int messageHandlerThreadPoolSize = DPS_MESSAGE_HANDLER_THREAD_POOL_SIZE_DEFAULT;
 
     private static final int MAX_BACKOFF = 50;
 
@@ -144,7 +147,7 @@
         int newMessageHandlerThreadPoolSize;
 
         try {
-            String s = get(properties, "messageHandlerThreadPoolSize");
+            String s = get(properties, DPS_MESSAGE_HANDLER_THREAD_POOL_SIZE);
 
             newMessageHandlerThreadPoolSize =
                     isNullOrEmpty(s) ? messageHandlerThreadPoolSize : Integer.parseInt(s.trim());
diff --git a/core/store/dist/src/main/java/org/onosproject/store/pi/impl/AbstractDistributedPiTranslationStore.java b/core/store/dist/src/main/java/org/onosproject/store/pi/impl/AbstractDistributedPiTranslationStore.java
index 9df6a86..36d87b5 100644
--- a/core/store/dist/src/main/java/org/onosproject/store/pi/impl/AbstractDistributedPiTranslationStore.java
+++ b/core/store/dist/src/main/java/org/onosproject/store/pi/impl/AbstractDistributedPiTranslationStore.java
@@ -16,11 +16,6 @@
 
 package org.onosproject.store.pi.impl;
 
-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.onosproject.net.pi.runtime.PiEntity;
 import org.onosproject.net.pi.runtime.PiHandle;
 import org.onosproject.net.pi.service.PiTranslatable;
@@ -35,6 +30,10 @@
 import org.onosproject.store.service.EventuallyConsistentMapListener;
 import org.onosproject.store.service.StorageService;
 import org.onosproject.store.service.WallClockTimestamp;
+import org.osgi.service.component.annotations.Activate;
+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 static com.google.common.base.Preconditions.checkArgument;
@@ -45,7 +44,6 @@
 /**
  * Distributed implementation of PiTranslationStore.
  */
-@Component(immediate = true)
 public abstract class AbstractDistributedPiTranslationStore
         <T extends PiTranslatable, E extends PiEntity>
         extends AbstractStore<PiTranslationEvent<T, E>, PiTranslationStoreDelegate<T, E>>
@@ -55,7 +53,7 @@
 
     private final Logger log = getLogger(getClass());
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected StorageService storageService;
 
     private EventuallyConsistentMap<PiHandle<E>, PiTranslatedEntity<T, E>>
diff --git a/core/store/dist/src/main/java/org/onosproject/store/pi/impl/DistributedDevicePipeconfMappingStore.java b/core/store/dist/src/main/java/org/onosproject/store/pi/impl/DistributedDevicePipeconfMappingStore.java
index 092b8eb..a732cad 100644
--- a/core/store/dist/src/main/java/org/onosproject/store/pi/impl/DistributedDevicePipeconfMappingStore.java
+++ b/core/store/dist/src/main/java/org/onosproject/store/pi/impl/DistributedDevicePipeconfMappingStore.java
@@ -20,12 +20,6 @@
 import com.google.common.collect.ImmutableSet;
 import com.google.common.collect.Multimaps;
 import com.google.common.collect.SetMultimap;
-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.net.DeviceId;
 import org.onosproject.net.pi.model.PiPipeconfId;
 import org.onosproject.net.pi.service.PiPipeconfDeviceMappingEvent;
@@ -38,6 +32,11 @@
 import org.onosproject.store.service.MapEventListener;
 import org.onosproject.store.service.Serializer;
 import org.onosproject.store.service.StorageService;
+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.Set;
@@ -47,15 +46,14 @@
 /**
  * Manages information of pipeconf to device binding.
  */
-@Component(immediate = true)
-@Service
+@Component(immediate = true, service = PiPipeconfMappingStore.class)
 public class DistributedDevicePipeconfMappingStore
         extends AbstractStore<PiPipeconfDeviceMappingEvent, PiPipeconfMappingStoreDelegate>
         implements PiPipeconfMappingStore {
 
     private final Logger log = getLogger(getClass());
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected StorageService storageService;
 
     protected ConsistentMap<DeviceId, PiPipeconfId> deviceToPipeconf;
diff --git a/core/store/dist/src/main/java/org/onosproject/store/pi/impl/DistributedPiFlowRuleTranslationStore.java b/core/store/dist/src/main/java/org/onosproject/store/pi/impl/DistributedPiFlowRuleTranslationStore.java
index c123ec5..ecad89d 100644
--- a/core/store/dist/src/main/java/org/onosproject/store/pi/impl/DistributedPiFlowRuleTranslationStore.java
+++ b/core/store/dist/src/main/java/org/onosproject/store/pi/impl/DistributedPiFlowRuleTranslationStore.java
@@ -16,17 +16,15 @@
 
 package org.onosproject.store.pi.impl;
 
-import org.apache.felix.scr.annotations.Component;
-import org.apache.felix.scr.annotations.Service;
 import org.onosproject.net.flow.FlowRule;
 import org.onosproject.net.pi.runtime.PiTableEntry;
 import org.onosproject.net.pi.service.PiFlowRuleTranslationStore;
+import org.osgi.service.component.annotations.Component;
 
 /**
  * Distributed implementation of a PI translation store for flow rules.
  */
-@Component(immediate = true)
-@Service
+@Component(immediate = true, service = PiFlowRuleTranslationStore.class)
 public class DistributedPiFlowRuleTranslationStore
         extends AbstractDistributedPiTranslationStore<FlowRule, PiTableEntry>
         implements PiFlowRuleTranslationStore {
diff --git a/core/store/dist/src/main/java/org/onosproject/store/pi/impl/DistributedPiGroupTranslationStore.java b/core/store/dist/src/main/java/org/onosproject/store/pi/impl/DistributedPiGroupTranslationStore.java
index fa62ef1..d2cedd8 100644
--- a/core/store/dist/src/main/java/org/onosproject/store/pi/impl/DistributedPiGroupTranslationStore.java
+++ b/core/store/dist/src/main/java/org/onosproject/store/pi/impl/DistributedPiGroupTranslationStore.java
@@ -16,17 +16,15 @@
 
 package org.onosproject.store.pi.impl;
 
-import org.apache.felix.scr.annotations.Component;
-import org.apache.felix.scr.annotations.Service;
 import org.onosproject.net.group.Group;
 import org.onosproject.net.pi.runtime.PiActionGroup;
 import org.onosproject.net.pi.service.PiGroupTranslationStore;
+import org.osgi.service.component.annotations.Component;
 
 /**
  * Distributed implementation of a PI translation store for groups.
  */
-@Component(immediate = true)
-@Service
+@Component(immediate = true, service = PiGroupTranslationStore.class)
 public class DistributedPiGroupTranslationStore
         extends AbstractDistributedPiTranslationStore<Group, PiActionGroup>
         implements PiGroupTranslationStore {
diff --git a/core/store/dist/src/main/java/org/onosproject/store/pi/impl/DistributedPiMeterTranslationStore.java b/core/store/dist/src/main/java/org/onosproject/store/pi/impl/DistributedPiMeterTranslationStore.java
index ef7e9f1..2ed5038 100644
--- a/core/store/dist/src/main/java/org/onosproject/store/pi/impl/DistributedPiMeterTranslationStore.java
+++ b/core/store/dist/src/main/java/org/onosproject/store/pi/impl/DistributedPiMeterTranslationStore.java
@@ -16,17 +16,15 @@
 
 package org.onosproject.store.pi.impl;
 
-import org.apache.felix.scr.annotations.Component;
-import org.apache.felix.scr.annotations.Service;
 import org.onosproject.net.meter.Meter;
 import org.onosproject.net.pi.runtime.PiMeterCellConfig;
 import org.onosproject.net.pi.service.PiMeterTranslationStore;
+import org.osgi.service.component.annotations.Component;
 
 /**
  * Distributed implementation of a PI translation store for meters.
  */
-@Component(immediate = true)
-@Service
+@Component(immediate = true, service = PiMeterTranslationStore.class)
 public class DistributedPiMeterTranslationStore
         extends AbstractDistributedPiTranslationStore<Meter, PiMeterCellConfig>
         implements PiMeterTranslationStore {
diff --git a/core/store/dist/src/main/java/org/onosproject/store/pi/impl/DistributedPiMulticastGroupTranslationStore.java b/core/store/dist/src/main/java/org/onosproject/store/pi/impl/DistributedPiMulticastGroupTranslationStore.java
index c95b185..dfa6652 100644
--- a/core/store/dist/src/main/java/org/onosproject/store/pi/impl/DistributedPiMulticastGroupTranslationStore.java
+++ b/core/store/dist/src/main/java/org/onosproject/store/pi/impl/DistributedPiMulticastGroupTranslationStore.java
@@ -16,8 +16,7 @@
 
 package org.onosproject.store.pi.impl;
 
-import org.apache.felix.scr.annotations.Component;
-import org.apache.felix.scr.annotations.Service;
+import org.osgi.service.component.annotations.Component;
 import org.onosproject.net.group.Group;
 import org.onosproject.net.pi.runtime.PiMulticastGroupEntry;
 import org.onosproject.net.pi.service.PiMulticastGroupTranslationStore;
@@ -25,8 +24,7 @@
 /**
  * Distributed implementation of a PI translation store for multicast groups.
  */
-@Component(immediate = true)
-@Service
+@Component(immediate = true, service = PiMulticastGroupTranslationStore.class)
 public class DistributedPiMulticastGroupTranslationStore
         extends AbstractDistributedPiTranslationStore<Group, PiMulticastGroupEntry>
         implements PiMulticastGroupTranslationStore {
diff --git a/core/store/dist/src/main/java/org/onosproject/store/region/impl/DistributedRegionStore.java b/core/store/dist/src/main/java/org/onosproject/store/region/impl/DistributedRegionStore.java
index 2f19561..e0d7b9d 100644
--- a/core/store/dist/src/main/java/org/onosproject/store/region/impl/DistributedRegionStore.java
+++ b/core/store/dist/src/main/java/org/onosproject/store/region/impl/DistributedRegionStore.java
@@ -18,12 +18,6 @@
 
 import com.google.common.collect.ImmutableSet;
 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.onlab.util.Identifier;
 import org.onosproject.cluster.NodeId;
 import org.onosproject.net.Annotations;
@@ -41,6 +35,11 @@
 import org.onosproject.store.service.MapEventListener;
 import org.onosproject.store.service.Serializer;
 import org.onosproject.store.service.StorageService;
+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.Arrays;
@@ -60,8 +59,7 @@
  * Consistent store implementation for tracking region definitions and device
  * region affiliation.
  */
-@Component(immediate = true)
-@Service
+@Component(immediate = true, service = RegionStore.class)
 public class DistributedRegionStore
         extends AbstractStore<RegionEvent, RegionStoreDelegate>
         implements RegionStore {
@@ -71,7 +69,7 @@
 
     private final Logger log = getLogger(getClass());
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected StorageService storageService;
 
     private ConsistentMap<RegionId, Region> regionsRepo;
diff --git a/core/store/dist/src/main/java/org/onosproject/store/resource/impl/ConsistentResourceStore.java b/core/store/dist/src/main/java/org/onosproject/store/resource/impl/ConsistentResourceStore.java
index e5ed75b..bfbbcae 100644
--- a/core/store/dist/src/main/java/org/onosproject/store/resource/impl/ConsistentResourceStore.java
+++ b/core/store/dist/src/main/java/org/onosproject/store/resource/impl/ConsistentResourceStore.java
@@ -15,27 +15,8 @@
  */
 package org.onosproject.store.resource.impl;
 
-import java.util.Collection;
-import java.util.LinkedHashMap;
-import java.util.LinkedHashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Optional;
-import java.util.Set;
-import java.util.concurrent.ExecutionException;
-import java.util.concurrent.TimeUnit;
-import java.util.concurrent.TimeoutException;
-import java.util.function.Function;
-import java.util.stream.Collectors;
-import java.util.stream.Stream;
-
 import com.google.common.annotations.Beta;
 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.Reference;
-import org.apache.felix.scr.annotations.ReferenceCardinality;
-import org.apache.felix.scr.annotations.Service;
 import org.onlab.util.KryoNamespace;
 import org.onlab.util.Tools;
 import org.onosproject.net.resource.ContinuousResource;
@@ -58,9 +39,27 @@
 import org.onosproject.store.service.Serializer;
 import org.onosproject.store.service.StorageService;
 import org.onosproject.store.service.TransactionContext;
+import org.osgi.service.component.annotations.Activate;
+import org.osgi.service.component.annotations.Component;
+import org.osgi.service.component.annotations.Reference;
+import org.osgi.service.component.annotations.ReferenceCardinality;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import java.util.Collection;
+import java.util.LinkedHashMap;
+import java.util.LinkedHashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Optional;
+import java.util.Set;
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.TimeoutException;
+import java.util.function.Function;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
+
 import static com.google.common.base.Preconditions.checkArgument;
 import static com.google.common.base.Preconditions.checkNotNull;
 import static java.util.stream.Collectors.groupingBy;
@@ -70,8 +69,7 @@
 /**
  * Implementation of ResourceStore using TransactionalMap.
  */
-@Component(immediate = true)
-@Service
+@Component(immediate = true, service = ResourceStore.class)
 @Beta
 public class ConsistentResourceStore extends AbstractStore<ResourceEvent, ResourceStoreDelegate>
         implements ResourceStore {
@@ -90,7 +88,7 @@
             .register(MplsLabelCodec.class)
             .build());
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected StorageService service;
 
     private ConsistentDiscreteResourceSubStore discreteStore;
diff --git a/core/store/dist/src/main/java/org/onosproject/store/statistic/impl/DistributedFlowStatisticStore.java b/core/store/dist/src/main/java/org/onosproject/store/statistic/impl/DistributedFlowStatisticStore.java
index f35ee0d..a115995 100644
--- a/core/store/dist/src/main/java/org/onosproject/store/statistic/impl/DistributedFlowStatisticStore.java
+++ b/core/store/dist/src/main/java/org/onosproject/store/statistic/impl/DistributedFlowStatisticStore.java
@@ -17,15 +17,6 @@
 package org.onosproject.store.statistic.impl;
 
 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.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.util.Tools;
 import org.onosproject.cfg.ComponentConfigService;
 import org.onosproject.cluster.ClusterService;
@@ -44,6 +35,12 @@
 import org.onosproject.store.serializers.KryoNamespaces;
 import org.onosproject.store.service.Serializer;
 import org.osgi.service.component.ComponentContext;
+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.Collections;
@@ -63,29 +60,36 @@
 import static java.util.concurrent.Executors.newFixedThreadPool;
 import static org.onlab.util.Tools.get;
 import static org.onlab.util.Tools.groupedThreads;
+import static org.onosproject.store.OsgiPropertyConstants.DFS_MESSAGE_HANDLER_THREAD_POOL_SIZE;
+import static org.onosproject.store.OsgiPropertyConstants.DFS_MESSAGE_HANDLER_THREAD_POOL_SIZE_DEFAULT;
 import static org.slf4j.LoggerFactory.getLogger;
 
 /**
  * Maintains flow statistics using RPC calls to collect stats from remote instances
  * on demand.
  */
-@Component(immediate = true)
-@Service
+@Component(
+        immediate = true,
+        service = FlowStatisticStore.class,
+        property = {
+                DFS_MESSAGE_HANDLER_THREAD_POOL_SIZE + ":Integer=" + DFS_MESSAGE_HANDLER_THREAD_POOL_SIZE_DEFAULT
+        }
+)
 public class DistributedFlowStatisticStore implements FlowStatisticStore {
     private final Logger log = getLogger(getClass());
 
     private static final String FORMAT = "Setting: messageHandlerThreadPoolSize={}";
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected MastershipService mastershipService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected ClusterCommunicationService clusterCommunicator;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected ClusterService clusterService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected ComponentConfigService cfgService;
 
     private Map<ConnectPoint, Set<FlowEntry>> previous =
@@ -102,10 +106,8 @@
     private NodeId local;
     private ExecutorService messageHandlingExecutor;
 
-    private static final int DEFAULT_MESSAGE_HANDLER_THREAD_POOL_SIZE = 4;
-    @Property(name = "messageHandlerThreadPoolSize", intValue = DEFAULT_MESSAGE_HANDLER_THREAD_POOL_SIZE,
-            label = "Size of thread pool to assign message handler")
-    private static int messageHandlerThreadPoolSize = DEFAULT_MESSAGE_HANDLER_THREAD_POOL_SIZE;
+    /** Size of thread pool to assign message handler. */
+    private static int messageHandlerThreadPoolSize = DFS_MESSAGE_HANDLER_THREAD_POOL_SIZE_DEFAULT;
 
 
     private static final long STATISTIC_STORE_TIMEOUT_MILLIS = 3000;
@@ -149,7 +151,7 @@
         int newMessageHandlerThreadPoolSize;
 
         try {
-            String s = get(properties, "messageHandlerThreadPoolSize");
+            String s = get(properties, DFS_MESSAGE_HANDLER_THREAD_POOL_SIZE);
 
             newMessageHandlerThreadPoolSize =
                     isNullOrEmpty(s) ? messageHandlerThreadPoolSize : Integer.parseInt(s.trim());
diff --git a/core/store/dist/src/main/java/org/onosproject/store/statistic/impl/DistributedStatisticStore.java b/core/store/dist/src/main/java/org/onosproject/store/statistic/impl/DistributedStatisticStore.java
index 522183e..acf73fc 100644
--- a/core/store/dist/src/main/java/org/onosproject/store/statistic/impl/DistributedStatisticStore.java
+++ b/core/store/dist/src/main/java/org/onosproject/store/statistic/impl/DistributedStatisticStore.java
@@ -16,15 +16,6 @@
 package org.onosproject.store.statistic.impl;
 
 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.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.util.Tools;
 import org.onosproject.cfg.ComponentConfigService;
 import org.onosproject.cluster.ClusterService;
@@ -43,6 +34,12 @@
 import org.onosproject.store.serializers.KryoNamespaces;
 import org.onosproject.store.service.Serializer;
 import org.osgi.service.component.ComponentContext;
+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.Collections;
@@ -62,6 +59,8 @@
 import static java.util.concurrent.Executors.newFixedThreadPool;
 import static org.onlab.util.Tools.get;
 import static org.onlab.util.Tools.groupedThreads;
+import static org.onosproject.store.OsgiPropertyConstants.DSS_MESSAGE_HANDLER_THREAD_POOL_SIZE;
+import static org.onosproject.store.OsgiPropertyConstants.DSS_MESSAGE_HANDLER_THREAD_POOL_SIZE_DEFAULT;
 import static org.slf4j.LoggerFactory.getLogger;
 
 
@@ -69,24 +68,29 @@
  * Maintains statistics using RPC calls to collect stats from remote instances
  * on demand.
  */
-@Component(immediate = true)
-@Service
+@Component(
+        immediate = true,
+        service = StatisticStore.class,
+        property = {
+                DSS_MESSAGE_HANDLER_THREAD_POOL_SIZE + ":Integer=" + DSS_MESSAGE_HANDLER_THREAD_POOL_SIZE_DEFAULT
+        }
+)
 public class DistributedStatisticStore implements StatisticStore {
 
     private final Logger log = getLogger(getClass());
 
     private static final String FORMAT = "Setting: messageHandlerThreadPoolSize={}";
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected MastershipService mastershipService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected ClusterCommunicationService clusterCommunicator;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected ClusterService clusterService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected ComponentConfigService cfgService;
 
     public static final MessageSubject GET_CURRENT = new MessageSubject("peer-return-current");
@@ -105,10 +109,8 @@
 
     private ExecutorService messageHandlingExecutor;
 
-    private static final int DEFAULT_MESSAGE_HANDLER_THREAD_POOL_SIZE = 4;
-    @Property(name = "messageHandlerThreadPoolSize", intValue = DEFAULT_MESSAGE_HANDLER_THREAD_POOL_SIZE,
-            label = "Size of thread pool to assign message handler")
-    private static int messageHandlerThreadPoolSize = DEFAULT_MESSAGE_HANDLER_THREAD_POOL_SIZE;
+    /** Size of thread pool to assign message handler. */
+    private static int messageHandlerThreadPoolSize = DSS_MESSAGE_HANDLER_THREAD_POOL_SIZE_DEFAULT;
 
     private static final long STATISTIC_STORE_TIMEOUT_MILLIS = 3000;
 
@@ -153,7 +155,7 @@
         int newMessageHandlerThreadPoolSize;
 
         try {
-            String s = get(properties, "messageHandlerThreadPoolSize");
+            String s = get(properties, DSS_MESSAGE_HANDLER_THREAD_POOL_SIZE);
 
             newMessageHandlerThreadPoolSize =
                     isNullOrEmpty(s) ? messageHandlerThreadPoolSize : Integer.parseInt(s.trim());
diff --git a/core/store/dist/src/main/java/org/onosproject/store/topology/impl/DistributedTopologyStore.java b/core/store/dist/src/main/java/org/onosproject/store/topology/impl/DistributedTopologyStore.java
index b6e6d04..0ea6845 100644
--- a/core/store/dist/src/main/java/org/onosproject/store/topology/impl/DistributedTopologyStore.java
+++ b/core/store/dist/src/main/java/org/onosproject/store/topology/impl/DistributedTopologyStore.java
@@ -15,14 +15,6 @@
  */
 package org.onosproject.store.topology.impl;
 
-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.graph.GraphPathSearch;
 import org.onlab.util.KryoNamespace;
 import org.onosproject.cfg.ComponentConfigService;
@@ -59,6 +51,12 @@
 import org.onosproject.store.service.LogicalClockService;
 import org.onosproject.store.service.StorageService;
 import org.osgi.service.component.ComponentContext;
+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.Collections;
@@ -74,6 +72,8 @@
 import static org.onlab.util.Tools.get;
 import static org.onlab.util.Tools.isNullOrEmpty;
 import static org.onosproject.net.topology.TopologyEvent.Type.TOPOLOGY_CHANGED;
+import static org.onosproject.store.OsgiPropertyConstants.LINK_WEIGHT_FUNCTION;
+import static org.onosproject.store.OsgiPropertyConstants.LINK_WEIGHT_FUNCTION_DEFAULT;
 import static org.slf4j.LoggerFactory.getLogger;
 
 /**
@@ -83,8 +83,15 @@
  * Note: This component is not distributed per-se. It runs on every
  * instance and feeds off of other distributed stores.
  */
-@Component(immediate = true)
-@Service
+@Component(
+        immediate = true,
+        service = {
+                TopologyStore.class, PathAdminService.class
+        },
+        property = {
+                LINK_WEIGHT_FUNCTION + "=" + LINK_WEIGHT_FUNCTION_DEFAULT
+        }
+)
 public class DistributedTopologyStore
         extends AbstractStore<TopologyEvent, TopologyStoreDelegate>
         implements TopologyStore, PathAdminService {
@@ -99,29 +106,27 @@
                                                             Collections.emptyList(),
                                                             Collections.emptyList()));
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected StorageService storageService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected LogicalClockService clockService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected MastershipService mastershipService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected ComponentConfigService configService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected DeviceService deviceService;
 
     private static final String HOP_COUNT = "hopCount";
     private static final String LINK_METRIC = "linkMetric";
     private static final String GEO_DISTANCE = "geoDistance";
 
-    private static final String DEFAULT_LINK_WEIGHT_FUNCTION = "hopCount";
-    @Property(name = "linkWeightFunction", value = DEFAULT_LINK_WEIGHT_FUNCTION,
-            label = "Default link-weight function: hopCount, linkMetric, geoDistance")
-    private String linkWeightFunction = DEFAULT_LINK_WEIGHT_FUNCTION;
+    /** Default link-weight function: hopCount, linkMetric, geoDistance. */
+    private String linkWeightFunction = LINK_WEIGHT_FUNCTION_DEFAULT;
 
     // Cluster root to broadcast points bindings to allow convergence to
     // a shared broadcast tree; node that is the master of the cluster root
@@ -159,7 +164,7 @@
     protected void modified(ComponentContext context) {
         Dictionary<?, ?> properties = context.getProperties();
 
-        String newLinkWeightFunction = get(properties, "linkWeightFunction");
+        String newLinkWeightFunction = get(properties, LINK_WEIGHT_FUNCTION);
         if (newLinkWeightFunction != null &&
                 !Objects.equals(newLinkWeightFunction, linkWeightFunction)) {
             linkWeightFunction = newLinkWeightFunction;
diff --git a/core/store/dist/src/test/java/org/onosproject/store/statistic/impl/DistributedStatisticStoreTest.java b/core/store/dist/src/test/java/org/onosproject/store/statistic/impl/DistributedStatisticStoreTest.java
index ad4baf7..a92345b 100644
--- a/core/store/dist/src/test/java/org/onosproject/store/statistic/impl/DistributedStatisticStoreTest.java
+++ b/core/store/dist/src/test/java/org/onosproject/store/statistic/impl/DistributedStatisticStoreTest.java
@@ -16,8 +16,8 @@
 
 package org.onosproject.store.statistic.impl;
 
-import org.apache.felix.scr.annotations.Reference;
-import org.apache.felix.scr.annotations.ReferenceCardinality;
+import org.osgi.service.component.annotations.Reference;
+import org.osgi.service.component.annotations.ReferenceCardinality;
 
 import static org.hamcrest.Matchers.empty;
 
@@ -67,7 +67,7 @@
 
 
 public class DistributedStatisticStoreTest {
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected MastershipService mastershipService;
 
     DistributedStatisticStore statStore;
diff --git a/core/store/persistence/BUCK b/core/store/persistence/BUCK
deleted file mode 100644
index 01cfff7..0000000
--- a/core/store/persistence/BUCK
+++ /dev/null
@@ -1,15 +0,0 @@
-COMPILE_DEPS = [
-    '//lib:CORE_DEPS',
-    '//lib:mapdb',
-]
-
-TEST_DEPS = [
-    '//lib:TEST',
-]
-
-osgi_jar_with_tests (
-    name = 'onos-core-persistence',
-    deps = COMPILE_DEPS,
-    test_deps = TEST_DEPS,
-    visibility = ['PUBLIC'],
-)
diff --git a/core/store/persistence/src/main/java/org/onosproject/persistence/impl/PersistenceManager.java b/core/store/persistence/src/main/java/org/onosproject/persistence/impl/PersistenceManager.java
index 498f5d0..0f291d5 100644
--- a/core/store/persistence/src/main/java/org/onosproject/persistence/impl/PersistenceManager.java
+++ b/core/store/persistence/src/main/java/org/onosproject/persistence/impl/PersistenceManager.java
@@ -16,15 +16,14 @@
 
 package org.onosproject.persistence.impl;
 
-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.mapdb.DB;
 import org.mapdb.DBMaker;
 import org.onosproject.persistence.PersistenceService;
 import org.onosproject.persistence.PersistentMapBuilder;
 import org.onosproject.persistence.PersistentSetBuilder;
+import org.osgi.service.component.annotations.Activate;
+import org.osgi.service.component.annotations.Component;
+import org.osgi.service.component.annotations.Deactivate;
 import org.slf4j.Logger;
 
 import java.io.File;
@@ -44,8 +43,7 @@
  * Service that maintains local disk backed maps and sets.
  * This implementation automatically deletes empty structures on shutdown.
  */
-@Component(immediate = true)
-@Service
+@Component(immediate = true, service = PersistenceService.class)
 public class PersistenceManager implements PersistenceService {
 
     private static final String DATABASE_ROOT =
diff --git a/core/store/primitives/BUCK b/core/store/primitives/BUCK
deleted file mode 100644
index ffe4fae..0000000
--- a/core/store/primitives/BUCK
+++ /dev/null
@@ -1,28 +0,0 @@
-include_defs('//core/store/primitives/primitives.bucklet')
-
-COMPILE_DEPS = [
-    '//lib:CORE_DEPS',
-    '//lib:KRYO',
-    '//lib:ATOMIX',
-    '//core/common:onos-core-common',
-    '//incubator/api:onos-incubator-api',
-    '//core/store/serializers:onos-core-serializers',
-]
-
-TEST_DEPS = [
-    '//lib:TEST',
-    '//core/api:onos-api-tests',
-    '//lib:io_netty_netty_handler',
-    '//lib:io_netty_netty_buffer',
-    '//lib:io_netty_netty_codec',
-    '//lib:io_netty_netty_resolver',
-    '//lib:commons-math3',
-]
-
-osgi_jar_with_tests (
-    name = 'onos-core-primitives',
-    deps = COMPILE_DEPS,
-    test_deps = TEST_DEPS,
-    visibility = ['PUBLIC'],
-    import_packages = INCLUDE_PACKAGES + ',' + ALL_PACKAGES,
-)
diff --git a/core/store/primitives/primitives.bucklet b/core/store/primitives/primitives.bucklet
deleted file mode 100644
index c9c2fc7..0000000
--- a/core/store/primitives/primitives.bucklet
+++ /dev/null
@@ -1,41 +0,0 @@
-# Base package names for core Atomix primitives
-_primitive_package_names = (
-    'barrier',
-    'collection',
-    'counter',
-    'election',
-    'idgenerator',
-    'iterator',
-    'list',
-    'lock',
-    'map',
-    'multimap',
-    'multiset',
-    'queue',
-    'semaphore',
-    'set',
-    'transaction',
-    'tree',
-    'value',
-    'workqueue',
-)
-
-# A list of all core primitive packages for dynamic class loading
-PRIMITIVE_PACKAGES = ','.join(['io.atomix.primitive.session.impl'] + ['io.atomix.core.{primitive},io.atomix.core.{primitive}.impl'.format(primitive=primitive) for primitive in _primitive_package_names])
-
-# Base package names for core Atomix protocols
-_protocol_package_names = (
-    'raft',
-    'backup'
-)
-
-# A list of all core protocol packages for dynamic class loading
-PROTOCOL_PACKAGES = ','.join(['io.atomix.primitive.partition.impl'] + ['io.atomix.protocols.{protocol},io.atomix.protocols.{protocol}.partition'.format(protocol=protocol) for protocol in _protocol_package_names] + ['io.atomix.protocols.gossip'])
-
-# A list of all additional core packages used in dynamic class loading
-CORE_PACKAGES = ','.join(['io.atomix.core.profile', 'io.atomix.core.profile.impl'])
-
-# A list of all dynamically loadable Atomix packages
-INCLUDE_PACKAGES = ','.join([PRIMITIVE_PACKAGES, PROTOCOL_PACKAGES, CORE_PACKAGES])
-
-ALL_PACKAGES = '*'
diff --git a/core/store/primitives/src/main/java/org/onosproject/store/atomix/ClusterActivator.java b/core/store/primitives/src/main/java/org/onosproject/store/atomix/ClusterActivator.java
new file mode 100644
index 0000000..125ceab
--- /dev/null
+++ b/core/store/primitives/src/main/java/org/onosproject/store/atomix/ClusterActivator.java
@@ -0,0 +1,47 @@
+/*
+ * Copyright 2018-present Open Networking Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.onosproject.store.atomix;
+
+import org.onosproject.component.ComponentService;
+import org.osgi.service.component.annotations.Activate;
+import org.osgi.service.component.annotations.Component;
+import org.osgi.service.component.annotations.Reference;
+import org.osgi.service.component.annotations.ReferenceCardinality;
+import org.slf4j.Logger;
+
+import static org.slf4j.LoggerFactory.getLogger;
+
+@Component(immediate = true, service = ClusterActivator.class)
+public class ClusterActivator {
+    private final Logger log = getLogger(getClass());
+
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
+    private ComponentService componentService;
+
+    @Activate
+    public void activate() {
+        log.info("Started");
+    }
+
+    /**
+     * Resources needed by the cluster are now available and the Atomix
+     * cluster can be formed.
+     */
+    public void activateCluster() {
+        componentService.activate(null, "org.onosproject.store.atomix.impl.AtomixManager");
+    }
+}
diff --git a/core/store/primitives/src/main/java/org/onosproject/store/atomix/cluster/impl/AtomixClusterStore.java b/core/store/primitives/src/main/java/org/onosproject/store/atomix/cluster/impl/AtomixClusterStore.java
index c4965e1..ca82891 100644
--- a/core/store/primitives/src/main/java/org/onosproject/store/atomix/cluster/impl/AtomixClusterStore.java
+++ b/core/store/primitives/src/main/java/org/onosproject/store/atomix/cluster/impl/AtomixClusterStore.java
@@ -15,23 +15,11 @@
  */
 package org.onosproject.store.atomix.cluster.impl;
 
-import java.time.Instant;
-import java.util.Map;
-import java.util.Objects;
-import java.util.Set;
-import java.util.stream.Collectors;
-
 import com.google.common.collect.Maps;
 import io.atomix.cluster.ClusterMembershipEvent;
 import io.atomix.cluster.ClusterMembershipEventListener;
 import io.atomix.cluster.ClusterMembershipService;
 import io.atomix.cluster.Member;
-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.packet.IpAddress;
 import org.onosproject.cluster.ClusterEvent;
 import org.onosproject.cluster.ClusterStore;
@@ -44,16 +32,26 @@
 import org.onosproject.core.VersionService;
 import org.onosproject.store.AbstractStore;
 import org.onosproject.store.atomix.impl.AtomixManager;
+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.time.Instant;
+import java.util.Map;
+import java.util.Objects;
+import java.util.Set;
+import java.util.stream.Collectors;
+
 import static com.google.common.base.Preconditions.checkNotNull;
 
 /**
  * Atomix cluster store.
  */
-@Component(immediate = true)
-@Service
+@Component(immediate = true, service = ClusterStore.class)
 public class AtomixClusterStore extends AbstractStore<ClusterEvent, ClusterStoreDelegate> implements ClusterStore {
     private static final String INSTANCE_ID_NULL = "Instance ID cannot be null";
 
@@ -62,10 +60,10 @@
 
     private final Logger log = LoggerFactory.getLogger(getClass());
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected AtomixManager atomixManager;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected VersionService versionService;
 
     private ClusterMembershipService membershipService;
diff --git a/core/store/primitives/src/main/java/org/onosproject/store/atomix/cluster/messaging/impl/AtomixMessagingManager.java b/core/store/primitives/src/main/java/org/onosproject/store/atomix/cluster/messaging/impl/AtomixMessagingManager.java
index 5a5e9af..54d49d1 100644
--- a/core/store/primitives/src/main/java/org/onosproject/store/atomix/cluster/messaging/impl/AtomixMessagingManager.java
+++ b/core/store/primitives/src/main/java/org/onosproject/store/atomix/cluster/messaging/impl/AtomixMessagingManager.java
@@ -15,35 +15,33 @@
  */
 package org.onosproject.store.atomix.cluster.messaging.impl;
 
+import io.atomix.utils.net.Address;
+import org.onlab.packet.IpAddress;
+import org.onosproject.store.atomix.impl.AtomixManager;
+import org.onosproject.store.cluster.messaging.Endpoint;
+import org.onosproject.store.cluster.messaging.MessagingService;
+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.util.concurrent.CompletableFuture;
 import java.util.concurrent.Executor;
 import java.util.function.BiConsumer;
 import java.util.function.BiFunction;
 
-import io.atomix.utils.net.Address;
-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.packet.IpAddress;
-import org.onosproject.store.cluster.messaging.Endpoint;
-import org.onosproject.store.cluster.messaging.MessagingService;
-import org.onosproject.store.atomix.impl.AtomixManager;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
 /**
  * Atomix messaging manager.
  */
-@Component(immediate = true)
-@Service
+@Component(immediate = true, service = MessagingService.class)
 public class AtomixMessagingManager implements MessagingService {
 
     private final Logger log = LoggerFactory.getLogger(getClass());
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected AtomixManager atomixManager;
 
     private io.atomix.cluster.messaging.MessagingService messagingService;
diff --git a/core/store/primitives/src/main/java/org/onosproject/store/atomix/impl/AtomixManager.java b/core/store/primitives/src/main/java/org/onosproject/store/atomix/impl/AtomixManager.java
index 8df1a40..1135fda 100644
--- a/core/store/primitives/src/main/java/org/onosproject/store/atomix/impl/AtomixManager.java
+++ b/core/store/primitives/src/main/java/org/onosproject/store/atomix/impl/AtomixManager.java
@@ -15,35 +15,33 @@
  */
 package org.onosproject.store.atomix.impl;
 
+import io.atomix.cluster.discovery.BootstrapDiscoveryProvider;
+import io.atomix.core.Atomix;
+import io.atomix.protocols.raft.partition.RaftPartitionGroup;
+import org.onosproject.cluster.ClusterMetadata;
+import org.onosproject.cluster.ClusterMetadataService;
+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.io.File;
 import java.util.Collections;
 import java.util.List;
 import java.util.stream.Collectors;
 
-import io.atomix.cluster.discovery.BootstrapDiscoveryProvider;
-import io.atomix.core.Atomix;
-import io.atomix.protocols.raft.partition.RaftPartitionGroup;
-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.ClusterMetadata;
-import org.onosproject.cluster.ClusterMetadataService;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
 /**
  * Atomix manager.
  */
-@Component(immediate = true)
-@Service(value = AtomixManager.class)
+@Component(immediate = true, enabled = false, service = AtomixManager.class)
 public class AtomixManager {
     private static final String LOCAL_DATA_DIR = System.getProperty("karaf.data") + "/db/partitions/";
     private final Logger log = LoggerFactory.getLogger(getClass());
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected ClusterMetadataService metadataService;
 
     private Atomix atomix;
diff --git a/core/store/primitives/src/main/java/org/onosproject/store/atomix/package-info.java b/core/store/primitives/src/main/java/org/onosproject/store/atomix/package-info.java
new file mode 100644
index 0000000..5613aa7
--- /dev/null
+++ b/core/store/primitives/src/main/java/org/onosproject/store/atomix/package-info.java
@@ -0,0 +1,20 @@
+/*
+ * Copyright 2014-present Open Networking Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/**
+ * Subsystem for tracking controller cluster nodes.
+ */
+package org.onosproject.store.atomix;
diff --git a/core/store/primitives/src/main/java/org/onosproject/store/atomix/primitives/impl/CoordinationManager.java b/core/store/primitives/src/main/java/org/onosproject/store/atomix/primitives/impl/CoordinationManager.java
index 900b678..1e5b8d9 100644
--- a/core/store/primitives/src/main/java/org/onosproject/store/atomix/primitives/impl/CoordinationManager.java
+++ b/core/store/primitives/src/main/java/org/onosproject/store/atomix/primitives/impl/CoordinationManager.java
@@ -15,24 +15,14 @@
  */
 package org.onosproject.store.atomix.primitives.impl;
 
-import java.util.List;
-import java.util.function.Supplier;
-import java.util.stream.Collectors;
-
 import io.atomix.core.Atomix;
 import io.atomix.primitive.partition.PartitionGroup;
-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.NodeId;
 import org.onosproject.persistence.PersistenceService;
-import org.onosproject.store.cluster.messaging.ClusterCommunicationService;
 import org.onosproject.store.atomix.impl.AtomixManager;
+import org.onosproject.store.cluster.messaging.ClusterCommunicationService;
 import org.onosproject.store.service.AsyncConsistentMultimap;
 import org.onosproject.store.service.AsyncConsistentTreeMap;
 import org.onosproject.store.service.AsyncDocumentTree;
@@ -54,8 +44,17 @@
 import org.onosproject.store.service.TransactionContextBuilder;
 import org.onosproject.store.service.WorkQueue;
 import org.onosproject.store.service.WorkQueueBuilder;
+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.List;
+import java.util.function.Supplier;
+import java.util.stream.Collectors;
+
 import static org.onosproject.security.AppGuard.checkPermission;
 import static org.onosproject.security.AppPermission.Type.STORAGE_WRITE;
 import static org.slf4j.LoggerFactory.getLogger;
@@ -63,22 +62,21 @@
 /**
  * Implementation of {@code CoordinationService} that uses the Atomix management partition group.
  */
-@Service
-@Component(immediate = true)
+@Component(immediate = true, service = CoordinationService.class)
 public class CoordinationManager implements CoordinationService {
 
     private final Logger log = getLogger(getClass());
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected ClusterService clusterService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected ClusterCommunicationService clusterCommunicator;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected PersistenceService persistenceService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected AtomixManager atomixManager;
 
     private Atomix atomix;
diff --git a/core/store/primitives/src/main/java/org/onosproject/store/atomix/primitives/impl/PartitionManager.java b/core/store/primitives/src/main/java/org/onosproject/store/atomix/primitives/impl/PartitionManager.java
index 5deb8d0..e10a03c 100644
--- a/core/store/primitives/src/main/java/org/onosproject/store/atomix/primitives/impl/PartitionManager.java
+++ b/core/store/primitives/src/main/java/org/onosproject/store/atomix/primitives/impl/PartitionManager.java
@@ -16,19 +16,9 @@
 
 package org.onosproject.store.atomix.primitives.impl;
 
-import java.util.List;
-import java.util.Set;
-import java.util.stream.Collectors;
-
 import io.atomix.cluster.MemberId;
 import io.atomix.primitive.partition.PartitionGroup;
 import io.atomix.protocols.raft.MultiRaftProtocol;
-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.NodeId;
 import org.onosproject.cluster.PartitionId;
 import org.onosproject.event.AbstractListenerManager;
@@ -40,8 +30,17 @@
 import org.onosproject.store.primitives.PartitionService;
 import org.onosproject.store.service.PartitionClientInfo;
 import org.onosproject.store.service.PartitionInfo;
+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.List;
+import java.util.Set;
+import java.util.stream.Collectors;
+
 import static org.onosproject.security.AppGuard.checkPermission;
 import static org.onosproject.security.AppPermission.Type.PARTITION_READ;
 import static org.slf4j.LoggerFactory.getLogger;
@@ -49,14 +48,13 @@
 /**
  * Implementation of {@code PartitionService} and {@code PartitionAdminService}.
  */
-@Component
-@Service
+@Component(service = { PartitionService.class, PartitionAdminService.class })
 public class PartitionManager extends AbstractListenerManager<PartitionEvent, PartitionEventListener>
     implements PartitionService, PartitionAdminService {
 
     private final Logger log = getLogger(getClass());
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected AtomixManager atomixManager;
 
     private PartitionGroup partitionGroup;
diff --git a/core/store/primitives/src/main/java/org/onosproject/store/atomix/primitives/impl/StorageManager.java b/core/store/primitives/src/main/java/org/onosproject/store/atomix/primitives/impl/StorageManager.java
index a59f4f9..cd15895 100644
--- a/core/store/primitives/src/main/java/org/onosproject/store/atomix/primitives/impl/StorageManager.java
+++ b/core/store/primitives/src/main/java/org/onosproject/store/atomix/primitives/impl/StorageManager.java
@@ -15,12 +15,6 @@
  */
 package org.onosproject.store.atomix.primitives.impl;
 
-import java.util.Collection;
-import java.util.List;
-import java.util.Map;
-import java.util.function.Supplier;
-import java.util.stream.Collectors;
-
 import com.google.common.collect.Maps;
 import io.atomix.core.Atomix;
 import io.atomix.core.counter.AtomicCounter;
@@ -29,20 +23,14 @@
 import io.atomix.core.workqueue.WorkQueueType;
 import io.atomix.primitive.partition.PartitionGroup;
 import io.atomix.protocols.raft.MultiRaftProtocol;
-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;
 import org.onosproject.cluster.MembershipService;
 import org.onosproject.cluster.NodeId;
 import org.onosproject.persistence.PersistenceService;
-import org.onosproject.store.cluster.messaging.ClusterCommunicationService;
 import org.onosproject.store.atomix.impl.AtomixManager;
+import org.onosproject.store.cluster.messaging.ClusterCommunicationService;
 import org.onosproject.store.primitives.PartitionAdminService;
 import org.onosproject.store.primitives.TransactionId;
 import org.onosproject.store.serializers.KryoNamespaces;
@@ -72,8 +60,19 @@
 import org.onosproject.store.service.WorkQueue;
 import org.onosproject.store.service.WorkQueueBuilder;
 import org.onosproject.store.service.WorkQueueStats;
+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.List;
+import java.util.Map;
+import java.util.function.Supplier;
+import java.util.stream.Collectors;
+
 import static org.onosproject.security.AppGuard.checkPermission;
 import static org.onosproject.security.AppPermission.Type.STORAGE_WRITE;
 import static org.slf4j.LoggerFactory.getLogger;
@@ -81,28 +80,27 @@
 /**
  * Implementation for {@code StorageService} and {@code StorageAdminService}.
  */
-@Service
-@Component(immediate = true)
+@Component(immediate = true, service = { StorageService.class, StorageAdminService.class })
 public class StorageManager implements StorageService, StorageAdminService {
 
     private final Logger log = getLogger(getClass());
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected ClusterService clusterService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected ClusterCommunicationService clusterCommunicator;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected PersistenceService persistenceService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected PartitionAdminService partitionAdminService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected MembershipService membershipService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected AtomixManager atomixManager;
 
     private Atomix atomix;
diff --git a/core/store/serializers/BUCK b/core/store/serializers/BUCK
deleted file mode 100644
index c1c66da..0000000
--- a/core/store/serializers/BUCK
+++ /dev/null
@@ -1,16 +0,0 @@
-COMPILE_DEPS = [
-    '//lib:CORE_DEPS',
-    '//lib:KRYO',
-    '//incubator/api:onos-incubator-api',
-]
-
-TEST_DEPS = [
-    '//lib:TEST',
-]
-
-osgi_jar_with_tests (
-    name = 'onos-core-serializers',
-    deps = COMPILE_DEPS,
-    test_deps = TEST_DEPS,
-    visibility = ['PUBLIC'],
-)
diff --git a/docs/BUCK b/docs/BUCK
deleted file mode 100644
index 8269150..0000000
--- a/docs/BUCK
+++ /dev/null
@@ -1,198 +0,0 @@
-external_deps = UTILS + API + [
-  '//apps/cpman/api:onos-apps-cpman-api',
-  '//apps/routing-api:onos-apps-routing-api',
-  '//apps/dhcp/api:onos-apps-dhcp-api',
-]
-
-external_groups = [
-  ( 'Network Model &amp; Services', [ 'org.onosproject.*' ]),
-  ( 'Incubator for Network Model &amp; Services',  [ 'org.onosproject.incubator.*' ]),
-  ( 'Utilities', [ 'org.onlab.*' ]),
-  ( 'App &amp; Extensions', [
-      'org.onosproject.dhcp',
-      'org.onosproject.cpman',
-      'org.onosproject.routing',
-  ]),
-]
-
-internal_groups = [
-  ( 'Network Model &amp; Services', [ 'org.onosproject.*' ]),
-  ( 'Incubator for Network Model &amp; Services', [ 'org.onosproject.incubator.*' ]),
-  ( 'Core Subsystems', [
-  'org.onosproject.cfg.impl',
-  'org.onosproject.cluster.impl',
-  'org.onosproject.core.impl',
-  'org.onosproject.event.impl',
-  'org.onosproject.net.config.impl',
-  'org.onosproject.net.device.impl',
-  'org.onosproject.net.driver.impl',
-  'org.onosproject.net.edgeservice.impl',
-  'org.onosproject.net.flow.impl',
-  'org.onosproject.net.flowobjective.impl',
-  'org.onosproject.net.flowobjective.impl.composition',
-  'org.onosproject.net.group.impl',
-  'org.onosproject.net.host.impl',
-  'org.onosproject.net.intent.impl',
-  'org.onosproject.net.intent.impl.compiler',
-  'org.onosproject.net.intent.impl.phase',
-  'org.onosproject.net.intf.impl',
-  'org.onosproject.net.link.impl',
-  'org.onosproject.net.newresource.impl',
-  'org.onosproject.net.packet.impl',
-  'org.onosproject.net.proxyarp.impl',
-  'org.onosproject.net.resource.impl',
-  'org.onosproject.net.statistic.impl',
-  'org.onosproject.net.topology.impl',
-  'org.onosproject.json',
-  'org.onosproject.json.*',
-  'org.onosproject.common.*',
-  'org.onosproject.security.impl',
-  'org.onosproject.security.store',
-  ]),
-  ( 'Distributed Stores', [
-  'org.onosproject.store.*',
-  'org.onosproject.persistence.impl',
-  ]),
-  ( 'Incubator for Core Subsystems &amp; Distributed Stores', [
-  'org.onosproject.incubator.net.impl',
-  'org.onosproject.incubator.store.impl',
-  'org.onosproject.incubator.net.resource.label.impl',
-  'org.onosproject.incubator.store.resource.impl',
-  'org.onosproject.incubator.net.tunnel.impl',
-  'org.onosproject.incubator.store.tunnel.impl',
-  'org.onosproject.incubator.net.config.impl',
-  'org.onosproject.incubator.net.domain.impl',
-  'org.onosproject.incubator.store.config.impl',
-  'org.onosproject.incubator.net.meter.impl',
-  'org.onosproject.incubator.net.resource.label',
-  'org.onosproject.incubator.store.meter.impl',
-  ]),
-  ( 'Utilities', [ 'org.onlab.*' ]),
-  ( 'GUI, REST &amp; Command-Line', [
-  'org.onosproject.ui.impl*',
-  'org.onosproject.rest.*',
-  'org.onosproject.cli*',
-  'org.onosproject.codec.impl',
-  ]),
-  ( 'Builtin Applications', [
-  'org.onosproject.app.*',
-  'org.onosproject.acl*',
-  'org.onosproject.aaa',
-  'org.onosproject.fwd',
-  'org.onosproject.dhcp*',
-  'org.onosproject.flowanalyzer',
-  'org.onosproject.cpman*',
-  'org.onosproject.mobility',
-  'org.onosproject.proxyarp',
-  'org.onosproject.calendar',
-  'org.onosproject.olt*',
-  'org.onosproject.optical*',
-  'org.onosproject.newoptical*',
-  'org.onosproject.sdnip',
-  'org.onosproject.sdnip.*',
-  'org.onosproject.config',
-  'org.onosproject.routing',
-  'org.onosproject.routing*',
-  'org.onosproject.bgprouter',
-  'org.onosproject.segmentrouting*',
-  'org.onosproject.reactive.routing*',
-  'org.onosproject.messagingperf',
-  'org.onosproject.virtualbng*',
-  'org.onosproject.cordfabric*',
-  'org.onosproject.xosintegration*',
-  'org.onosproject.cip*',
-  'org.onosproject.vtn*',
-  'org.onosproject.cord*',
-  'org.onosproject.mcast*',
-  'org.onosproject.mfwd*',
-  'org.onosproject.mlb*',
-  'org.onosproject.igmp*',
-  'org.onosproject.pim*',
-  'org.onosproject.vpls*',
-  'org.onosproject.vrouter*',
-  'org.onosproject.faultmanagement*',
-  'org.onosproject.iptopology*',
-  'org.onosproject.drivermatrix*',
-  'org.onosproject.pathpainter*',
-  'org.onosproject.openstack*',
-  'org.onosproject.scalablegateway*',
-  'org.onosproject.forwarder*',
-  'org.onosproject.sfc*',
-  'org.onosproject.netcfgmonitor*',
-  'org.onosproject.flowperf',
-  'org.onosproject.loadtest',
-  'org.onosproject.events',
-  'org.onosproject.bmv2*',
-  'org.onosproject.xosclient*',
-  'org.onosproject.kafkaintegration*',
-  'org.onosproject.gangliametrics*',
-  'org.onosproject.graphitemetrics*',
-  'org.onosproject.influxdbmetrics*',
-  'org.onosproject.yms*',
-  ]),
-  ( 'Test Instrumentation &amp; Applications', [
-  'org.onosproject.metrics.*',
-  'org.onosproject.demo*',
-  'org.onosproject.election*',
-  'org.onosproject.distributedprimitives*',
-  'org.onosproject.intentperf*',
-  'org.onosproject.messagingperf*',
-  'org.onosproject.optical.testapp*',
-  ]),
-  ( 'OpenFlow Providers &amp; Controller', [
-  'org.onosproject.openflow.*',
-  'org.onosproject.provider.of.*',
-  ]),
-  ( 'NetConf Protocol &amp; Providers', [
-  'org.onosproject.netconf*',
-  'org.onosproject.provider.netconf*',
-  ]),
-  ( 'OVSDB Protocol &amp; Providers', [
-  'org.onosproject.provider.ovsdb*',
-  'org.onosproject.ovsdb*',
-  ]),
-  ( 'PCEP Protocol &amp; Providers', [
-  'org.onosproject.pce.*',
-  'org.onosproject.pcerest*',
-  'org.onosproject.pceweb*',
-  'org.onosproject.pcep*',
-  'org.onosproject.pcepio*',
-  'org.onosproject.provider.pcep*',
-  ]),
-  ( 'BGP-LS Protocol &amp; Providers', [
-  'org.onosproject.bgp.controller*',
-  'org.onosproject.bgp*',
-  'org.onosproject.provider.bgp*',
-  ]),
-  ( 'OSPF Protocol &amp; Providers', [ 'org.onosproject.ospf*' ]),
-  ( 'ISIS Protocol &amp; Providers', [ 'org.onosproject.isis*' ]),
-  ( 'LISP Protocol &amp; Providers', [ 'org.onosproject.lisp*' ]),
-  ( 'SNMP Protocol &amp; Providers', [ 'org.onosproject.snmp*' ]),
-  ( 'REST Protocol &amp; Providers', [
-  'org.onosproject.protocol.rest*',
-  'org.onosproject.provider.rest*',
-  ]),
-  ( 'Other Providers', [
-  'org.onosproject.provider.*',
-  'org.onosproject.protocol.*',
-  ]),
-  ( 'Device Drivers', [ 'org.onosproject.driver*' ]),
-]
-
-project_javadoc(
-  name = 'external',
-  project_title = 'ONOS Java API (%s)' % ONOS_VERSION,
-  javadoc_files = glob(['src/main/javadoc/doc-files/*']),
-  overview = 'src/main/javadoc/overview.html',
-  deps = external_deps,
-  groups = external_groups,
-)
-
-project_javadoc(
-  name = 'internal',
-  project_title = 'ONOS Java API (%s)' % ONOS_VERSION,
-  javadoc_files = glob(['src/main/javadoc/doc-files/*']),
-  overview = 'src/main/javadoc/overview.html',
-  deps = CORE,
-  groups = internal_groups,
-)
diff --git a/docs/external.xml b/docs/external.xml
deleted file mode 100644
index d7dd4aa..0000000
--- a/docs/external.xml
+++ /dev/null
@@ -1,88 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-  ~ Copyright 2014-present Open Networking Foundation
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~     http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License.
-  -->
-<project xmlns="http://maven.apache.org/POM/4.0.0"
-         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
-    <modelVersion>4.0.0</modelVersion>
-
-    <prerequisites>
-        <maven>3.0.0</maven>
-    </prerequisites>
-
-    <parent>
-        <groupId>org.onosproject</groupId>
-        <artifactId>onos</artifactId>
-        <version>1.15.0-SNAPSHOT</version>
-        <relativePath>../pom.xml</relativePath>
-    </parent>
-
-    <artifactId>onos-docs-external</artifactId>
-    <packaging>pom</packaging>
-
-    <description>ONOS Java API documentation</description>
-
-    <modules>
-        <module>..</module>
-    </modules>
-
-    <url>http://onosproject.org/</url>
-
-    <build>
-        <plugins>
-            <plugin>
-                <groupId>org.apache.maven.plugins</groupId>
-                <artifactId>maven-javadoc-plugin</artifactId>
-                <configuration>
-                    <show>package</show>
-                    <sourceFileExcludes>
-                        <sourceFileExclude>**/generated-sources/**</sourceFileExclude>
-                    </sourceFileExcludes>
-                    <excludePackageNames>@external-excludes</excludePackageNames>
-                    <docfilessubdirs>true</docfilessubdirs>
-                    <doctitle>ONOS Java API (1.15.0-SNAPSHOT)</doctitle>
-                    <groups>
-                        <group>
-                            <title>Network Model &amp; Services</title>
-                            <packages>@external-apis</packages>
-                        </group>
-                        <group>
-                            <title>Incubator for Network Model &amp; Services
-                            </title>
-                            <packages>@external-incubator-apis</packages>
-                        </group>
-                        <group>
-                            <title>Utilities</title>
-                            <packages>@utils</packages>
-                        </group>
-                        <group>
-                            <title>App &amp; Extensions</title>
-                            <packages>@external-apps</packages>
-                        </group>
-                    </groups>
-                    <tags>
-                        <tag>
-                            <name>onos.rsModel</name>
-                            <placement>m</placement>
-                            <head>Json model for REST api:</head>
-                        </tag>
-                    </tags>
-                </configuration>
-            </plugin>
-        </plugins>
-    </build>
-
-</project>
diff --git a/docs/internal.xml b/docs/internal.xml
deleted file mode 100644
index a9e7686..0000000
--- a/docs/internal.xml
+++ /dev/null
@@ -1,159 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-  ~ Copyright 2015-present Open Networking Foundation
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~     http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License.
-  -->
-<project xmlns="http://maven.apache.org/POM/4.0.0"
-         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
-    <modelVersion>4.0.0</modelVersion>
-
-    <prerequisites>
-        <maven>3.0.0</maven>
-    </prerequisites>
-
-    <parent>
-        <groupId>org.onosproject</groupId>
-        <artifactId>onos</artifactId>
-        <version>1.15.0-SNAPSHOT</version>
-        <relativePath>../pom.xml</relativePath>
-    </parent>
-
-    <artifactId>onos-docs</artifactId>
-    <packaging>pom</packaging>
-
-    <description>ONOS Java API documentation</description>
-
-    <modules>
-        <module>..</module>
-    </modules>
-
-    <url>http://onosproject.org/</url>
-
-    <build>
-        <plugins>
-            <plugin>
-                <groupId>org.apache.maven.plugins</groupId>
-                <artifactId>maven-javadoc-plugin</artifactId>
-                <configuration>
-                    <show>package</show>
-                    <docfilessubdirs>true</docfilessubdirs>
-                    <doctitle>ONOS Java API (1.15.0-SNAPSHOT)</doctitle>
-                    <excludePackageNames>@internal-excludes</excludePackageNames>
-                    <sourceFileExcludes>
-                        <sourceFileExclude>**/generated-sources/**</sourceFileExclude>
-                    </sourceFileExcludes>
-
-                    <groups>
-                        <group>
-                            <title>Network Model &amp; Services</title>
-                            <packages>@internal-apis</packages>
-                        </group>
-                        <group>
-                            <title>Incubator for Network Model &amp; Services
-                            </title>
-                            <packages>@internal-incubator-apis</packages>
-                        </group>
-                        <group>
-                            <title>Core Subsystems</title>
-                            <packages>@internal-core</packages>
-                        </group>
-                        <group>
-                            <title>Distributed Stores</title>
-                            <packages>@internal-stores</packages>
-                        </group>
-                        <group>
-                            <title>Incubator for Core Subsystems &amp; Distributed Stores
-                            </title>
-                            <packages>@internal-incubator</packages>
-                        </group>
-                        <group>
-                            <title>Utilities</title>
-                            <packages>@utils</packages>
-                        </group>
-                        <group>
-                            <title>GUI, REST &amp; Command-Line</title>
-                            <packages>@internal-gui-rest-cli</packages>
-                        </group>
-                        <group>
-                            <title>Builtin Applications</title>
-                            <packages>@internal-apps</packages>
-                        </group>
-                        <group>
-                            <title>Test Instrumentation &amp; Applications
-                            </title>
-                            <packages>@internal-test-apps</packages>
-                        </group>
-                        <group>
-                            <title>OpenFlow Providers &amp; Controller</title>
-                            <packages>@internal-openflow</packages>
-                        </group>
-                        <group>
-                            <title>NetConf Protocol &amp; Providers</title>
-                            <packages>@internal-netconf</packages>
-                        </group>
-                        <group>
-                            <title>OVSDB Protocol &amp; Providers</title>
-                            <packages>@internal-ovsdb</packages>
-                        </group>
-                        <group>
-                            <title>PCEP Protocol &amp; Providers</title>
-                            <packages>@internal-pcep</packages>
-                        </group>
-                        <group>
-                            <title>BGP-LS Protocol &amp; Providers</title>
-                            <packages>@internal-bgpls</packages>
-                        </group>
-                        <group>
-                            <title>OSPF Protocol &amp; Providers</title>
-                            <packages>@internal-ospf</packages>
-                        </group>
-                        <group>
-                            <title>ISIS Protocol &amp; Providers</title>
-                            <packages>@internal-isis</packages>
-                        </group>
-                        <group>
-                            <title>LISP Protocol &amp; Providers</title>
-                            <packages>@internal-lisp</packages>
-                        </group>
-                        <group>
-                            <title>SNMP Protocol &amp; Providers</title>
-                            <packages>@internal-snmp</packages>
-                        </group>
-                        <group>
-                            <title>REST Protocol &amp; Providers</title>
-                            <packages>@internal-restsb</packages>
-                        </group>
-                        <group>
-                            <title>Other Providers</title>
-                            <packages>@internal-providers</packages>
-                        </group>
-                        <group>
-                            <title>Device Drivers</title>
-                            <packages>@internal-drivers</packages>
-                        </group>
-                    </groups>
-                    <tags>
-                        <tag>
-                            <name>onos.rsModel</name>
-                            <placement>m</placement>
-                            <head>Json model for REST api:</head>
-                        </tag>
-                    </tags>
-                </configuration>
-            </plugin>
-        </plugins>
-    </build>
-
-</project>
diff --git a/drivers/arista/BUCK b/drivers/arista/BUCK
deleted file mode 100644
index 0434807..0000000
--- a/drivers/arista/BUCK
+++ /dev/null
@@ -1,36 +0,0 @@
-COMPILE_DEPS = [
-    '//lib:CORE_DEPS',
-    '//lib:JACKSON',
-    '//lib:javax.ws.rs-api',
-    '//incubator/api:onos-incubator-api',
-    '//utils/rest:onlab-rest',
-    '//drivers/utilities:onos-drivers-utilities',
-    '//protocols/rest/api:onos-protocols-rest-api',
-]
-
-TEST_DEPS = [
-    '//lib:TEST_ADAPTERS',
-    '//core/api:onos-api-tests',
-]
-
-BUNDLES = [
-    ':onos-drivers-arista',
-    '//drivers/utilities:onos-drivers-utilities',
-]
-
-osgi_jar_with_tests (
-    deps = COMPILE_DEPS,
-    test_deps = TEST_DEPS,
-    resources_root = 'src/main/resources',
-    resources = glob(['src/main/resources/**']),
-)
-
-onos_app (
-    app_name = 'org.onosproject.drivers.arista',
-    title = 'Arista Drivers',
-    category = 'Drivers',
-    url = 'http://onosproject.org',
-    description = 'Adds support for Arista devices.',
-    included_bundles = BUNDLES,
-    required_apps = [ 'org.onosproject.restsb' ],
-)
diff --git a/drivers/arista/features.xml b/drivers/arista/features.xml
deleted file mode 100644
index 263d488..0000000
--- a/drivers/arista/features.xml
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
-<!--
-  ~ Copyright 2016-present Open Networking Foundation
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~     http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License.
-  -->
-<features xmlns="http://karaf.apache.org/xmlns/features/v1.2.0" name="${project.artifactId}-${project.version}">
-    <feature name="${project.artifactId}" version="${project.version}"
-             description="${project.description}">
-        <feature>onos-api</feature>
-        <bundle>mvn:${project.groupId}/${project.artifactId}/${project.version}</bundle>
-        <bundle>mvn:${project.groupId}/onos-drivers-utilities/${project.version}</bundle>
-    </feature>
-</features>
diff --git a/drivers/arista/src/main/java/org/onosproject/drivers/arista/AristaDriversLoader.java b/drivers/arista/src/main/java/org/onosproject/drivers/arista/AristaDriversLoader.java
index 2d15e66..4a8b0be 100644
--- a/drivers/arista/src/main/java/org/onosproject/drivers/arista/AristaDriversLoader.java
+++ b/drivers/arista/src/main/java/org/onosproject/drivers/arista/AristaDriversLoader.java
@@ -16,7 +16,7 @@
 
 package org.onosproject.drivers.arista;
 
-import org.apache.felix.scr.annotations.Component;
+import org.osgi.service.component.annotations.Component;
 import org.onosproject.net.driver.AbstractDriverLoader;
 
 /**
diff --git a/drivers/barefoot/BUCK b/drivers/barefoot/BUCK
deleted file mode 100644
index 8bcefde..0000000
--- a/drivers/barefoot/BUCK
+++ /dev/null
@@ -1,30 +0,0 @@
-GRPC_VER = '1.3.1'
-
-COMPILE_DEPS = [
-    '//lib:CORE_DEPS',
-    '//lib:minimal-json',
-    '//protocols/p4runtime/api:onos-protocols-p4runtime-api',
-    '//drivers/p4runtime:onos-drivers-p4runtime',
-    '//incubator/grpc-dependencies:grpc-core-repkg-' + GRPC_VER,
-    '//lib:grpc-netty-' + GRPC_VER,
-]
-
-BUNDLES = [
-    ':onos-drivers-barefoot',
-]
-
-osgi_jar(
-    deps = COMPILE_DEPS,
-)
-
-onos_app (
-    app_name = 'org.onosproject.drivers.barefoot',
-    title = 'Barefoot Drivers',
-    category = 'Drivers',
-    url = 'http://onosproject.org',
-    description = 'Adds support for Barefoot-based devices',
-    included_bundles = BUNDLES,
-    required_apps = [
-        'org.onosproject.drivers.p4runtime',
-    ],
-)
diff --git a/drivers/barefoot/src/main/java/org/onosproject/drivers/barefoot/BarefootDriversLoader.java b/drivers/barefoot/src/main/java/org/onosproject/drivers/barefoot/BarefootDriversLoader.java
index 41ab063..1118453 100644
--- a/drivers/barefoot/src/main/java/org/onosproject/drivers/barefoot/BarefootDriversLoader.java
+++ b/drivers/barefoot/src/main/java/org/onosproject/drivers/barefoot/BarefootDriversLoader.java
@@ -16,7 +16,7 @@
 
 package org.onosproject.drivers.barefoot;
 
-import org.apache.felix.scr.annotations.Component;
+import org.osgi.service.component.annotations.Component;
 import org.onosproject.net.driver.AbstractDriverLoader;
 
 /**
diff --git a/drivers/bmv2/BUCK b/drivers/bmv2/BUCK
deleted file mode 100644
index 312020f..0000000
--- a/drivers/bmv2/BUCK
+++ /dev/null
@@ -1,44 +0,0 @@
-# Buck build of P4-related modules is no longer supported, please use Bazel
-# GRPC_VER = '1.3.1'
-#
-# COMPILE_DEPS = [
-#     '//lib:CORE_DEPS',
-#     '//lib:minimal-json',
-#     '//lib:KRYO',
-#     '//lib:JACKSON',
-#     '//lib:libthrift',
-#     '//protocols/p4runtime/api:onos-protocols-p4runtime-api',
-#     '//protocols/p4runtime/model:onos-protocols-p4runtime-model',
-#     '//protocols/bmv2/thrift-api:onos-protocols-bmv2-thrift-api',
-#     '//drivers/p4runtime:onos-drivers-p4runtime',
-#     '//incubator/grpc-dependencies:grpc-core-repkg-' + GRPC_VER,
-#     '//lib:grpc-netty-' + GRPC_VER,
-#     '//pipelines/basic:onos-pipelines-basic',
-#     '//core/store/serializers:onos-core-serializers',
-# ]
-#
-# BUNDLES = [
-#     ':onos-drivers-bmv2',
-#     '//lib:libthrift',
-#     '//protocols/bmv2/thrift-api:onos-protocols-bmv2-thrift-api',
-# ]
-#
-# osgi_jar(
-#     deps = COMPILE_DEPS,
-#     resources_root = 'src/main/resources',
-#     resources = glob(['src/main/resources/**']),
-# )
-#
-# onos_app (
-#     app_name = 'org.onosproject.drivers.bmv2',
-#     title = 'BMv2 Drivers',
-#     category = 'Drivers',
-#     url = 'http://onosproject.org',
-#     description = 'Adds support for BMv2 P4 devices.',
-#     included_bundles = BUNDLES,
-#     required_apps = [
-#         'org.onosproject.drivers.p4runtime',
-#         'org.onosproject.drivers.gnmi',
-#         'org.onosproject.pipelines.basic',
-#     ],
-# )
diff --git a/drivers/bmv2/features.xml b/drivers/bmv2/features.xml
deleted file mode 100644
index 7d851a1..0000000
--- a/drivers/bmv2/features.xml
+++ /dev/null
@@ -1,27 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
-<!--
-  ~ Copyright 2017-present Open Networking Foundation
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~     http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License.
-  -->
-<features xmlns="http://karaf.apache.org/xmlns/features/v1.2.0"
-          name="${project.artifactId}-${project.version}">
-    <feature name="${project.artifactId}" version="${project.version}"
-             description="${project.description}">
-        <feature>onos-api</feature>
-        <bundle>
-            mvn:${project.groupId}/${project.artifactId}/${project.version}
-        </bundle>
-
-    </feature>
-</features>
diff --git a/drivers/bmv2/src/main/java/org/onosproject/drivers/bmv2/Bmv2DriversLoader.java b/drivers/bmv2/src/main/java/org/onosproject/drivers/bmv2/Bmv2DriversLoader.java
index 51a5432..fc196d9 100644
--- a/drivers/bmv2/src/main/java/org/onosproject/drivers/bmv2/Bmv2DriversLoader.java
+++ b/drivers/bmv2/src/main/java/org/onosproject/drivers/bmv2/Bmv2DriversLoader.java
@@ -16,7 +16,7 @@
 
 package org.onosproject.drivers.bmv2;
 
-import org.apache.felix.scr.annotations.Component;
+import org.osgi.service.component.annotations.Component;
 import org.onosproject.net.driver.AbstractDriverLoader;
 
 /**
diff --git a/drivers/bmv2/src/main/java/org/onosproject/drivers/bmv2/ctl/Bmv2PreControllerImpl.java b/drivers/bmv2/src/main/java/org/onosproject/drivers/bmv2/ctl/Bmv2PreControllerImpl.java
index 4c80e79..bc0aa47 100644
--- a/drivers/bmv2/src/main/java/org/onosproject/drivers/bmv2/ctl/Bmv2PreControllerImpl.java
+++ b/drivers/bmv2/src/main/java/org/onosproject/drivers/bmv2/ctl/Bmv2PreControllerImpl.java
@@ -22,14 +22,6 @@
 import com.google.common.cache.LoadingCache;
 import com.google.common.collect.Maps;
 import org.apache.commons.lang3.tuple.Pair;
-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.apache.thrift.protocol.TBinaryProtocol;
 import org.apache.thrift.protocol.TMultiplexedProtocol;
 import org.apache.thrift.protocol.TProtocol;
@@ -42,6 +34,12 @@
 import org.onosproject.drivers.bmv2.api.Bmv2PreController;
 import org.onosproject.net.DeviceId;
 import org.osgi.service.component.ComponentContext;
+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.Dictionary;
@@ -52,19 +50,21 @@
 
 import static com.google.common.base.Preconditions.checkNotNull;
 import static java.lang.String.format;
+import static org.onosproject.drivers.bmv2.ctl.OsgiPropertyConstants.*;
 import static org.slf4j.LoggerFactory.getLogger;
 
 /**
  * BMv2 PRE controller implementation.
  */
-@Component(immediate = true)
-@Service
+@Component(immediate = true, service = Bmv2PreController.class,
+        property = {
+                 NUM_CONNECTION_RETRIES + ":Integer=" + NUM_CONNECTION_RETRIES_DEFAULT,
+                TIME_BETWEEN_RETRIES + ":Integer=" + TIME_BETWEEN_RETRIES_DEFAULT,
+                DEVICE_LOCK_WAITING_TIME_IN_SEC + ":Integer=" + DEVICE_LOCK_WAITING_TIME_IN_SEC_DEFAULT,
+        })
 public class Bmv2PreControllerImpl implements Bmv2PreController {
 
     private static final int DEVICE_LOCK_CACHE_EXPIRE_TIME_IN_MIN = 10;
-    private static final int DEVICE_LOCK_WAITING_TIME_IN_SEC = 60;
-    private static final int DEFAULT_NUM_CONNECTION_RETRIES = 2;
-    private static final int DEFAULT_TIME_BETWEEN_RETRIES = 10;
     private static final String THRIFT_SERVICE_NAME = "simple_pre_lag";
     private final Logger log = getLogger(getClass());
     private final Map<DeviceId, Pair<TTransport, Bmv2DeviceThriftClient>> clients = Maps.newHashMap();
@@ -77,17 +77,17 @@
                     return new ReentrantReadWriteLock();
                 }
             });
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected ComponentConfigService cfgService;
-    @Property(name = "numConnectionRetries", intValue = DEFAULT_NUM_CONNECTION_RETRIES,
-            label = "Number of connection retries after a network error")
-    private int numConnectionRetries = DEFAULT_NUM_CONNECTION_RETRIES;
-    @Property(name = "timeBetweenRetries", intValue = DEFAULT_TIME_BETWEEN_RETRIES,
-            label = "Time between retries in milliseconds")
-    private int timeBetweenRetries = DEFAULT_TIME_BETWEEN_RETRIES;
-    @Property(name = "deviceLockWaitingTime", intValue = DEVICE_LOCK_WAITING_TIME_IN_SEC,
-            label = "Waiting time for a read/write lock in seconds")
-    private int deviceLockWaitingTime = DEVICE_LOCK_WAITING_TIME_IN_SEC;
+
+    /** Number of connection retries after a network error. */
+    private int numConnectionRetries = NUM_CONNECTION_RETRIES_DEFAULT;
+
+    /** Time between retries in milliseconds. */
+    private int timeBetweenRetries = TIME_BETWEEN_RETRIES_DEFAULT;
+
+    /** Waiting time for a read/write lock in seconds. */
+    private int deviceLockWaitingTime = DEVICE_LOCK_WAITING_TIME_IN_SEC_DEFAULT;
 
     @Activate
     public void activate() {
diff --git a/drivers/bmv2/src/main/java/org/onosproject/drivers/bmv2/ctl/OsgiPropertyConstants.java b/drivers/bmv2/src/main/java/org/onosproject/drivers/bmv2/ctl/OsgiPropertyConstants.java
new file mode 100644
index 0000000..1fe6536
--- /dev/null
+++ b/drivers/bmv2/src/main/java/org/onosproject/drivers/bmv2/ctl/OsgiPropertyConstants.java
@@ -0,0 +1,34 @@
+/*
+ * Copyright 2018-present Open Networking Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.onosproject.drivers.bmv2.ctl;
+
+/**
+ * Constants for default values of configurable properties.
+ */
+public final class OsgiPropertyConstants {
+
+    private OsgiPropertyConstants() {}
+
+    public static final String DEVICE_LOCK_WAITING_TIME_IN_SEC = "deviceLockWaitingTime";
+    public static final int DEVICE_LOCK_WAITING_TIME_IN_SEC_DEFAULT = 60;
+
+    public static final String NUM_CONNECTION_RETRIES = "numConnectionRetries";
+    public static final int NUM_CONNECTION_RETRIES_DEFAULT = 2;
+
+    public static final String TIME_BETWEEN_RETRIES = "timeBetweenRetries";
+    public static final int TIME_BETWEEN_RETRIES_DEFAULT = 2;
+}
diff --git a/drivers/bmv2/src/main/java/org/onosproject/drivers/bmv2/mirror/AbstractDistributedBmv2Mirror.java b/drivers/bmv2/src/main/java/org/onosproject/drivers/bmv2/mirror/AbstractDistributedBmv2Mirror.java
index d75be38..6d46e0f 100644
--- a/drivers/bmv2/src/main/java/org/onosproject/drivers/bmv2/mirror/AbstractDistributedBmv2Mirror.java
+++ b/drivers/bmv2/src/main/java/org/onosproject/drivers/bmv2/mirror/AbstractDistributedBmv2Mirror.java
@@ -17,11 +17,11 @@
 
 package org.onosproject.drivers.bmv2.mirror;
 
-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.util.KryoNamespace;
 import org.onosproject.drivers.bmv2.api.runtime.Bmv2Entity;
 import org.onosproject.drivers.bmv2.api.runtime.Bmv2Handle;
@@ -53,7 +53,7 @@
 
     private final Logger log = getLogger(getClass());
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     private StorageService storageService;
 
     private EventuallyConsistentMap<H, E> mirrorMap;
diff --git a/drivers/bmv2/src/main/java/org/onosproject/drivers/bmv2/mirror/DistributedBmv2PreGroupMirror.java b/drivers/bmv2/src/main/java/org/onosproject/drivers/bmv2/mirror/DistributedBmv2PreGroupMirror.java
index 1725676..fd6231f 100644
--- a/drivers/bmv2/src/main/java/org/onosproject/drivers/bmv2/mirror/DistributedBmv2PreGroupMirror.java
+++ b/drivers/bmv2/src/main/java/org/onosproject/drivers/bmv2/mirror/DistributedBmv2PreGroupMirror.java
@@ -17,8 +17,6 @@
 
 package org.onosproject.drivers.bmv2.mirror;
 
-import org.apache.felix.scr.annotations.Component;
-import org.apache.felix.scr.annotations.Service;
 import org.onlab.util.KryoNamespace;
 import org.onosproject.drivers.bmv2.api.runtime.Bmv2EntityType;
 import org.onosproject.drivers.bmv2.api.runtime.Bmv2PreGroup;
@@ -26,6 +24,7 @@
 import org.onosproject.drivers.bmv2.api.runtime.Bmv2PreNode;
 import org.onosproject.drivers.bmv2.api.runtime.Bmv2PreNodes;
 import org.onosproject.store.serializers.KryoNamespaces;
+import org.osgi.service.component.annotations.Component;
 
 
 /**
@@ -33,8 +32,7 @@
  * We need this mirror to preserve BMv2-specific identifiers of group
  * and nodes for further operations on them after creation.
  */
-@Component(immediate = true)
-@Service
+@Component(immediate = true, service = Bmv2PreGroupMirror.class)
 public class DistributedBmv2PreGroupMirror
         extends AbstractDistributedBmv2Mirror<Bmv2PreGroupHandle, Bmv2PreGroup>
         implements Bmv2PreGroupMirror {
diff --git a/drivers/ciena/c5162/BUCK b/drivers/ciena/c5162/BUCK
deleted file mode 100644
index 1f3584b..0000000
--- a/drivers/ciena/c5162/BUCK
+++ /dev/null
@@ -1,47 +0,0 @@
-COMPILE_DEPS = [
-    '//lib:CORE_DEPS',
-    '//lib:JACKSON',
-    '//lib:javax.ws.rs-api',
-    '//incubator/api:onos-incubator-api',
-    '//utils/rest:onlab-rest',
-    '//drivers/utilities:onos-drivers-utilities',
-    '//drivers/netconf:onos-drivers-netconf',
-    '//protocols/netconf/api:onos-protocols-netconf-api',
-]
-
-TEST_DEPS = [
-    '//lib:TEST_ADAPTERS',
-    '//core/api:onos-api-tests',
-    '//drivers/netconf:onos-drivers-netconf-tests',
-    '//lib:slf4j-jdk14',
-]
-
-BUNDLES = [
-    ':onos-drivers-ciena-c5162',
-    '//drivers/utilities:onos-drivers-utilities',
-    '//drivers/netconf:onos-drivers-netconf',
-]
-
-REQUIRED_APPS = [
-    'org.onosproject.linkdiscovery',
-    'org.onosproject.netconf',
-    'org.onosproject.netconfsb',
-    'org.onosproject.drivers.netconf'
-]
-
-osgi_jar_with_tests (
-    deps = COMPILE_DEPS,
-    test_deps = TEST_DEPS,
-    resources_root = 'src/main/resources',
-    resources = glob(['src/*/resources/**']),
-)
-
-onos_app (
-    app_name = 'org.onosproject.drivers.ciena.c5162',
-    title = 'Ciena 5162 Drivers',
-    category = 'Drivers',
-    url = 'http://onosproject.org',
-    description = 'Adds support for Ciena 5162 devices.',
-    included_bundles = BUNDLES,
-    required_apps = REQUIRED_APPS,
-)
diff --git a/drivers/ciena/c5162/features.xml b/drivers/ciena/c5162/features.xml
deleted file mode 100644
index 1e78782..0000000
--- a/drivers/ciena/c5162/features.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
-<!--
-  ~ Copyright 2018-present Open Networking Foundation
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~     http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License.
-  -->
-<features xmlns="http://karaf.apache.org/xmlns/features/v1.2.0" name="${project.artifactId}-${project.version}">
-    <feature name="${project.artifactId}" version="${project.version}"
-             description="${project.description}">
-        <feature>onos-api</feature>
-        <bundle>mvn:${project.groupId}/${project.artifactId}/${project.version}</bundle>
-        <bundle>mvn:${project.groupId}/onos-drivers-utilities/${project.version}</bundle>
-        <bundle>mvn:${project.groupId}/onos-drivers-netconf/${project.version}</bundle>
-    </feature>
-</features>
diff --git a/drivers/ciena/c5162/src/main/java/org/onosproject/drivers/ciena/c5162/Ciena5162DriversLoader.java b/drivers/ciena/c5162/src/main/java/org/onosproject/drivers/ciena/c5162/Ciena5162DriversLoader.java
index 338c2f1..5b911eb 100644
--- a/drivers/ciena/c5162/src/main/java/org/onosproject/drivers/ciena/c5162/Ciena5162DriversLoader.java
+++ b/drivers/ciena/c5162/src/main/java/org/onosproject/drivers/ciena/c5162/Ciena5162DriversLoader.java
@@ -15,7 +15,7 @@
  */
 package org.onosproject.drivers.ciena.c5162;
 
-import org.apache.felix.scr.annotations.Component;
+import org.osgi.service.component.annotations.Component;
 import org.onosproject.net.driver.AbstractDriverLoader;
 
 /**
diff --git a/drivers/ciena/c5170/BUCK b/drivers/ciena/c5170/BUCK
deleted file mode 100644
index 8c4ea6e..0000000
--- a/drivers/ciena/c5170/BUCK
+++ /dev/null
@@ -1,46 +0,0 @@
-COMPILE_DEPS = [
-    '//lib:CORE_DEPS',
-    '//lib:JACKSON',
-    '//lib:javax.ws.rs-api',
-    '//incubator/api:onos-incubator-api',
-    '//utils/rest:onlab-rest',
-    '//drivers/utilities:onos-drivers-utilities',
-    '//drivers/netconf:onos-drivers-netconf',
-    '//protocols/netconf/api:onos-protocols-netconf-api',
-]
-
-TEST_DEPS = [
-    '//lib:TEST_ADAPTERS',
-    '//core/api:onos-api-tests',
-    '//drivers/netconf:onos-drivers-netconf-tests',
-]
-
-BUNDLES = [
-    ':onos-drivers-ciena-c5170',
-    '//drivers/utilities:onos-drivers-utilities',
-    '//drivers/netconf:onos-drivers-netconf',
-]
-
-REQUIRED_APPS = [
-    'org.onosproject.linkdiscovery',
-    'org.onosproject.netconf',
-    'org.onosproject.netconfsb',
-    'org.onosproject.drivers.netconf'
-]
-
-osgi_jar_with_tests (
-    deps = COMPILE_DEPS,
-    test_deps = TEST_DEPS,
-    resources_root = 'src/main/resources',
-    resources = glob(['src/main/resources/**']),
-)
-
-onos_app (
-    app_name = 'org.onosproject.drivers.ciena.c5170',
-    title = 'Ciena 5170 Drivers',
-    category = 'Drivers',
-    url = 'http://onosproject.org',
-    description = 'Adds support for Ciena 5170 devices.',
-    included_bundles = BUNDLES,
-    required_apps = REQUIRED_APPS,
-)
diff --git a/drivers/ciena/c5170/features.xml b/drivers/ciena/c5170/features.xml
deleted file mode 100644
index 1e78782..0000000
--- a/drivers/ciena/c5170/features.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
-<!--
-  ~ Copyright 2018-present Open Networking Foundation
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~     http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License.
-  -->
-<features xmlns="http://karaf.apache.org/xmlns/features/v1.2.0" name="${project.artifactId}-${project.version}">
-    <feature name="${project.artifactId}" version="${project.version}"
-             description="${project.description}">
-        <feature>onos-api</feature>
-        <bundle>mvn:${project.groupId}/${project.artifactId}/${project.version}</bundle>
-        <bundle>mvn:${project.groupId}/onos-drivers-utilities/${project.version}</bundle>
-        <bundle>mvn:${project.groupId}/onos-drivers-netconf/${project.version}</bundle>
-    </feature>
-</features>
diff --git a/drivers/ciena/c5170/src/main/java/org/onosproject/drivers/ciena/c5170/Ciena5170DriversLoader.java b/drivers/ciena/c5170/src/main/java/org/onosproject/drivers/ciena/c5170/Ciena5170DriversLoader.java
index 759d24d..25de88c 100644
--- a/drivers/ciena/c5170/src/main/java/org/onosproject/drivers/ciena/c5170/Ciena5170DriversLoader.java
+++ b/drivers/ciena/c5170/src/main/java/org/onosproject/drivers/ciena/c5170/Ciena5170DriversLoader.java
@@ -15,7 +15,7 @@
  */
 package org.onosproject.drivers.ciena.c5170;
 
-import org.apache.felix.scr.annotations.Component;
+import org.osgi.service.component.annotations.Component;
 import org.onosproject.net.driver.AbstractDriverLoader;
 
 /**
diff --git a/drivers/ciena/waveserver/BUCK b/drivers/ciena/waveserver/BUCK
deleted file mode 100644
index 095ec04..0000000
--- a/drivers/ciena/waveserver/BUCK
+++ /dev/null
@@ -1,44 +0,0 @@
-COMPILE_DEPS = [
-    '//lib:CORE_DEPS',
-    '//lib:JACKSON',
-    '//lib:javax.ws.rs-api',
-    '//incubator/api:onos-incubator-api',
-    '//utils/rest:onlab-rest',
-    '//drivers/utilities:onos-drivers-utilities',
-    '//protocols/rest/api:onos-protocols-rest-api',
-    '//apps/optical-model:onos-apps-optical-model',
-    '//drivers/optical:onos-drivers-optical',
-]
-TEST_DEPS = [
-    '//lib:TEST_ADAPTERS',
-    '//core/api:onos-api-tests',
-    '//utils/osgi:onlab-osgi-tests',
-]
-
-BUNDLES = [
-    ':onos-drivers-ciena-waveserver',
-    '//drivers/utilities:onos-drivers-utilities',
-]
-
-REQUIRED_APPS = [
-    'org.onosproject.restsb',
-    'org.onosproject.optical-model',
-    'org.onosproject.drivers.optical',
-]
-
-osgi_jar_with_tests (
-    deps = COMPILE_DEPS,
-    test_deps = TEST_DEPS,
-    resources_root = 'src/main/resources',
-    resources = glob(['src/main/resources/**']),
-)
-
-onos_app (
-    app_name = 'org.onosproject.drivers.ciena.waveserver',
-    title = 'Ciena Waveserver Drivers',
-    category = 'Drivers',
-    url = 'http://onosproject.org',
-    description = 'Adds support for Ciena Waveserver devices.',
-    included_bundles = BUNDLES,
-    required_apps = REQUIRED_APPS,
-)
diff --git a/drivers/ciena/waveserver/features.xml b/drivers/ciena/waveserver/features.xml
deleted file mode 100644
index 6893131..0000000
--- a/drivers/ciena/waveserver/features.xml
+++ /dev/null
@@ -1,27 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
-<!--
-  ~ Copyright 2016-present Open Networking Foundation
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~     http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License.
-  -->
-<features xmlns="http://karaf.apache.org/xmlns/features/v1.2.0" name="${project.artifactId}-${project.version}">
-    <feature name="${project.artifactId}" version="${project.version}"
-             description="${project.description}">
-        <feature>onos-api</feature>
-        <bundle>mvn:${project.groupId}/${project.artifactId}/${project.version}</bundle>
-
-        <bundle>mvn:${project.groupId}/onos-restsb-api/${project.version}</bundle>
-
-        <bundle>mvn:${project.groupId}/onos-drivers-utilities/${project.version}</bundle>
-    </feature>
-</features>
\ No newline at end of file
diff --git a/drivers/ciena/waveserver/src/main/java/org/onosproject/drivers/ciena/waveserver/CienaDriversLoader.java b/drivers/ciena/waveserver/src/main/java/org/onosproject/drivers/ciena/waveserver/CienaDriversLoader.java
index 0752c4f..db69d21 100644
--- a/drivers/ciena/waveserver/src/main/java/org/onosproject/drivers/ciena/waveserver/CienaDriversLoader.java
+++ b/drivers/ciena/waveserver/src/main/java/org/onosproject/drivers/ciena/waveserver/CienaDriversLoader.java
@@ -16,7 +16,7 @@
 
 package org.onosproject.drivers.ciena.waveserver;
 
-import org.apache.felix.scr.annotations.Component;
+import org.osgi.service.component.annotations.Component;
 import org.onosproject.net.driver.AbstractDriverLoader;
 import org.onosproject.net.optical.OpticalDevice;
 
diff --git a/drivers/ciena/waveserverai/BUCK b/drivers/ciena/waveserverai/BUCK
deleted file mode 100644
index 26f7b9f..0000000
--- a/drivers/ciena/waveserverai/BUCK
+++ /dev/null
@@ -1,53 +0,0 @@
-COMPILE_DEPS = [
-    '//lib:CORE_DEPS',
-    '//lib:ONOS_YANG',
-    '//lib:javax.ws.rs-api',
-    '//drivers/utilities:onos-drivers-utilities',
-    '//drivers/netconf:onos-drivers-netconf',
-    '//protocols/netconf/api:onos-protocols-netconf-api',
-    '//protocols/netconf/ctl:onos-protocols-netconf-ctl',
-    '//models/common:onos-models-common',
-    '//models/ciena/waveserverai:onos-models-ciena-waveserverai',
-    '//apps/optical-model:onos-apps-optical-model',
-    '//drivers/optical:onos-drivers-optical',
-]
-TEST_DEPS = [
-    '//lib:TEST_ADAPTERS',
-    '//core/api:onos-api-tests',
-    '//drivers/netconf:onos-drivers-netconf-tests',
-    '//utils/osgi:onlab-osgi-tests',
-]
-
-BUNDLES = [
-    ':onos-drivers-ciena-waveserverai',
-    '//drivers/utilities:onos-drivers-utilities',
-    '//drivers/netconf:onos-drivers-netconf',
-]
-
-REQUIRED_APPS = [
-    'org.onosproject.yang',
-    'org.onosproject.optical-model',
-    'org.onosproject.drivers.optical',
-    'org.onosproject.models.ciena.waveserverai',
-    'org.onosproject.netconf',
-    'org.onosproject.netconfsb',
-    'org.onosproject.drivers.netconf',
-    'org.onosproject.linkdiscovery',
-]
-
-osgi_jar_with_tests (
-    deps = COMPILE_DEPS,
-    test_deps = TEST_DEPS,
-    resources_root = 'src/main/resources',
-    resources = glob(['src/main/resources/**']),
-)
-
-onos_app (
-    app_name = 'org.onosproject.drivers.ciena.waveserverai',
-    title = 'Ciena Waveserver Ai Drivers',
-    category = 'Drivers',
-    url = 'http://onosproject.org',
-    description = 'Adds support for Ciena Waveserver Ai devices.',
-    required_apps = REQUIRED_APPS,
-    included_bundles = BUNDLES,
-)
diff --git a/drivers/ciena/waveserverai/src/main/java/org/onosproject/drivers/ciena/waveserverai/CienaDriversLoader.java b/drivers/ciena/waveserverai/src/main/java/org/onosproject/drivers/ciena/waveserverai/CienaDriversLoader.java
index 0511337..18e21e9 100644
--- a/drivers/ciena/waveserverai/src/main/java/org/onosproject/drivers/ciena/waveserverai/CienaDriversLoader.java
+++ b/drivers/ciena/waveserverai/src/main/java/org/onosproject/drivers/ciena/waveserverai/CienaDriversLoader.java
@@ -16,7 +16,7 @@
 
 package org.onosproject.drivers.ciena.waveserverai;
 
-import org.apache.felix.scr.annotations.Component;
+import org.osgi.service.component.annotations.Component;
 import org.onosproject.net.driver.AbstractDriverLoader;
 import org.onosproject.net.optical.OpticalDevice;
 
diff --git a/drivers/cisco/netconf/BUCK b/drivers/cisco/netconf/BUCK
deleted file mode 100644
index 6975a52..0000000
--- a/drivers/cisco/netconf/BUCK
+++ /dev/null
@@ -1,32 +0,0 @@
-COMPILE_DEPS = [
-    '//lib:CORE_DEPS',
-    '//drivers/utilities:onos-drivers-utilities',
-    '//protocols/netconf/api:onos-protocols-netconf-api',
-]
-
-TEST_DEPS = [
-    '//lib:TEST_ADAPTERS',
-    '//core/api:onos-api-tests',
-]
-
-BUNDLES = [
-    ':onos-drivers-cisco-netconf',
-    '//drivers/utilities:onos-drivers-utilities',
-]
-
-osgi_jar_with_tests (
-    deps = COMPILE_DEPS,
-    test_deps = TEST_DEPS,
-    resources_root = 'src/main/resources',
-    resources = glob(['src/main/resources/**']),
-)
-
-onos_app (
-    app_name = 'org.onosproject.drivers.cisco.netconf',
-    title = 'Cisco NETCONF Drivers',
-    category = 'Drivers',
-    url = 'http://onosproject.org',
-    description = 'Adds support for Cisco devices using NETCONF protocol.',
-    included_bundles = BUNDLES,
-    required_apps = [ 'org.onosproject.netconf', 'org.onosproject.drivers.netconf' ],
-)
diff --git a/drivers/cisco/netconf/features.xml b/drivers/cisco/netconf/features.xml
deleted file mode 100644
index 9d4a490..0000000
--- a/drivers/cisco/netconf/features.xml
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
-<!--
-  ~ Copyright 2016-present Open Networking Foundation
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~     http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License.
-  -->
-<features xmlns="http://karaf.apache.org/xmlns/features/v1.2.0" name="${project.artifactId}-${project.version}">
-    <feature name="${project.artifactId}" version="${project.version}"
-             description="${project.description}">
-        <feature>onos-api</feature>
-        <bundle>mvn:${project.groupId}/onos-drivers-netconf/${project.version}</bundle>
-
-        <bundle>mvn:${project.groupId}/${project.artifactId}/${project.version}</bundle>
-
-        <bundle>mvn:${project.groupId}/onos-drivers-utilities/${project.version}</bundle>
-        <bundle>mvn:${project.groupId}/onos-protocols-netconf-api/${project.version}</bundle>
-    </feature>
-</features>
diff --git a/drivers/cisco/netconf/src/main/java/org/onosproject/drivers/cisco/CiscoDriversLoader.java b/drivers/cisco/netconf/src/main/java/org/onosproject/drivers/cisco/CiscoDriversLoader.java
index 2758a1c..908f147 100644
--- a/drivers/cisco/netconf/src/main/java/org/onosproject/drivers/cisco/CiscoDriversLoader.java
+++ b/drivers/cisco/netconf/src/main/java/org/onosproject/drivers/cisco/CiscoDriversLoader.java
@@ -16,7 +16,7 @@
 
 package org.onosproject.drivers.cisco;
 
-import org.apache.felix.scr.annotations.Component;
+import org.osgi.service.component.annotations.Component;
 import org.onosproject.net.driver.AbstractDriverLoader;
 
 /**
diff --git a/drivers/cisco/rest/BUCK b/drivers/cisco/rest/BUCK
deleted file mode 100644
index 73acb67..0000000
--- a/drivers/cisco/rest/BUCK
+++ /dev/null
@@ -1,36 +0,0 @@
-COMPILE_DEPS = [
-    '//lib:CORE_DEPS',
-    '//lib:JACKSON',
-    '//lib:javax.ws.rs-api',
-    '//incubator/api:onos-incubator-api',
-    '//utils/rest:onlab-rest',
-    '//drivers/utilities:onos-drivers-utilities',
-    '//protocols/rest/api:onos-protocols-rest-api',
-]
-
-TEST_DEPS = [
-    '//lib:TEST_ADAPTERS',
-    '//core/api:onos-api-tests',
-]
-
-BUNDLES = [
-    ':onos-drivers-cisco-rest',
-    '//drivers/utilities:onos-drivers-utilities',
-]
-
-osgi_jar_with_tests (
-    deps = COMPILE_DEPS,
-    test_deps = TEST_DEPS,
-    resources_root = 'src/main/resources',
-    resources = glob(['src/main/resources/**']),
-)
-
-onos_app (
-    app_name = 'org.onosproject.drivers.cisco.rest',
-    title = 'Cisco REST Drivers',
-    category = 'Drivers',
-    url = 'http://onosproject.org',
-    description = 'Adds support for Cisco devices using REST.',
-    included_bundles = BUNDLES,
-    required_apps = [ 'org.onosproject.restsb' ],
-)
diff --git a/drivers/cisco/rest/features.xml b/drivers/cisco/rest/features.xml
deleted file mode 100644
index 2c8372b..0000000
--- a/drivers/cisco/rest/features.xml
+++ /dev/null
@@ -1,26 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
-<!--
-  ~ Copyright 2017-present Open Networking Foundation
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~     http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License.
-  -->
-<features xmlns="http://karaf.apache.org/xmlns/features/v1.2.0" name="${project.artifactId}-${project.version}">
-    <feature name="${project.artifactId}" version="${project.version}"
-             description="${project.description}">
-        <feature>onos-api</feature>
-        <bundle>mvn:${project.groupId}/${project.artifactId}/${project.version}</bundle>
-
-        <bundle>mvn:${project.groupId}/onos-drivers-utilities/${project.version}</bundle>
-        <bundle>mvn:${project.groupId}/onos-restsb-api/${project.version}</bundle>
-    </feature>
-</features>
diff --git a/drivers/cisco/rest/src/main/java/org/onosproject/drivers/cisco/rest/CiscoRestDriversLoader.java b/drivers/cisco/rest/src/main/java/org/onosproject/drivers/cisco/rest/CiscoRestDriversLoader.java
index 1a55902..ea3b04c 100644
--- a/drivers/cisco/rest/src/main/java/org/onosproject/drivers/cisco/rest/CiscoRestDriversLoader.java
+++ b/drivers/cisco/rest/src/main/java/org/onosproject/drivers/cisco/rest/CiscoRestDriversLoader.java
@@ -16,7 +16,7 @@
 
 package org.onosproject.drivers.cisco.rest;
 
-import org.apache.felix.scr.annotations.Component;
+import org.osgi.service.component.annotations.Component;
 import org.onosproject.net.driver.AbstractDriverLoader;
 
 /**
diff --git a/drivers/corsa/BUCK b/drivers/corsa/BUCK
deleted file mode 100644
index 10eaf82..0000000
--- a/drivers/corsa/BUCK
+++ /dev/null
@@ -1,29 +0,0 @@
-COMPILE_DEPS = [
-    '//lib:CORE_DEPS',
-    '//lib:KRYO',
-    '//lib:openflowj',
-    '//drivers/default:onos-drivers-default',
-    '//drivers/utilities:onos-drivers-utilities',
-    '//protocols/openflow/api:onos-protocols-openflow-api',
-]
-
-TEST_DEPS = [
-    '//lib:TEST_ADAPTERS',
-    '//core/api:onos-api-tests',
-]
-
-osgi_jar_with_tests (
-    deps = COMPILE_DEPS,
-    test_deps = TEST_DEPS,
-    resources_root = 'src/main/resources',
-    resources = glob(['src/main/resources/**']),
-)
-
-onos_app (
-    app_name = 'org.onosproject.drivers.corsa',
-    title = 'Corsa Drivers',
-    category = 'Drivers',
-    url = 'http://onosproject.org',
-    description = 'Adds support for Corsa devices.',
-    required_apps = [ 'org.onosproject.openflow' ],
-)
diff --git a/drivers/corsa/src/main/java/org/onosproject/drivers/corsa/CorsaDriversLoader.java b/drivers/corsa/src/main/java/org/onosproject/drivers/corsa/CorsaDriversLoader.java
index f039bcf..fa3aaf9 100644
--- a/drivers/corsa/src/main/java/org/onosproject/drivers/corsa/CorsaDriversLoader.java
+++ b/drivers/corsa/src/main/java/org/onosproject/drivers/corsa/CorsaDriversLoader.java
@@ -16,7 +16,7 @@
 
 package org.onosproject.drivers.corsa;
 
-import org.apache.felix.scr.annotations.Component;
+import org.osgi.service.component.annotations.Component;
 import org.onosproject.net.driver.AbstractDriverLoader;
 
 /**
diff --git a/drivers/default/BUCK b/drivers/default/BUCK
deleted file mode 100644
index d8b95de..0000000
--- a/drivers/default/BUCK
+++ /dev/null
@@ -1,33 +0,0 @@
-COMPILE_DEPS = [
-    '//lib:CORE_DEPS',
-    '//lib:JACKSON',
-    '//lib:KRYO',
-    '//lib:openflowj',
-    '//protocols/openflow/api:onos-protocols-openflow-api',
-    '//core/store/serializers:onos-core-serializers',
-]
-
-TEST_DEPS = [
-    '//lib:TEST_ADAPTERS',
-    '//core/api:onos-api-tests',
-]
-
-osgi_jar_with_tests (
-    deps = COMPILE_DEPS,
-    test_deps = TEST_DEPS,
-    resources_root = 'src/main/resources',
-    resources = glob(['src/main/resources/**']),
-)
-
-onos_app (
-    app_name = 'org.onosproject.drivers',
-    title = 'Default Drivers',
-    category = 'Drivers',
-    url = 'http://onosproject.org',
-    description = 'Suite of default drivers.',
-    included_bundles = [
-        ':onos-drivers-default',
-        '//lib:openflowj',
-        '//protocols/openflow/api:onos-protocols-openflow-api',
-    ]
-)
diff --git a/drivers/default/features.xml b/drivers/default/features.xml
deleted file mode 100644
index a382ca9..0000000
--- a/drivers/default/features.xml
+++ /dev/null
@@ -1,27 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
-<!--
-  ~ Copyright 2016-present Open Networking Foundation
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~     http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License.
-  -->
-<features xmlns="http://karaf.apache.org/xmlns/features/v1.2.0" name="${project.artifactId}-${project.version}">
-    <feature name="${project.artifactId}" version="${project.version}"
-             description="${project.description}">
-        <feature>onos-api</feature>
-        <bundle>mvn:${project.groupId}/${project.artifactId}/${project.version}</bundle>
-
-        <bundle>mvn:org.onosproject/openflowj/3.2.0.onos</bundle>
-        <bundle>mvn:${project.groupId}/onos-protocols-openflow-api/${project.version}</bundle>
-
-    </feature>
-</features>
diff --git a/drivers/default/src/main/java/org/onosproject/driver/DefaultCodecRegister.java b/drivers/default/src/main/java/org/onosproject/driver/DefaultCodecRegister.java
index 97f4c6a..9b643ef 100644
--- a/drivers/default/src/main/java/org/onosproject/driver/DefaultCodecRegister.java
+++ b/drivers/default/src/main/java/org/onosproject/driver/DefaultCodecRegister.java
@@ -15,11 +15,11 @@
  */
 package org.onosproject.driver;
 
-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.onosproject.codec.CodecService;
 import org.onosproject.driver.extensions.MoveExtensionTreatment;
 import org.onosproject.driver.extensions.NiciraMatchNshSi;
@@ -75,7 +75,7 @@
 
     private final Logger log = getLogger(getClass());
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected CodecService codecService;
 
     @Activate
diff --git a/drivers/default/src/main/java/org/onosproject/driver/DefaultDriversLoader.java b/drivers/default/src/main/java/org/onosproject/driver/DefaultDriversLoader.java
index 261054b..d292aa6 100644
--- a/drivers/default/src/main/java/org/onosproject/driver/DefaultDriversLoader.java
+++ b/drivers/default/src/main/java/org/onosproject/driver/DefaultDriversLoader.java
@@ -16,16 +16,14 @@
 
 package org.onosproject.driver;
 
-import org.apache.felix.scr.annotations.Component;
-import org.apache.felix.scr.annotations.Service;
 import org.onosproject.net.driver.AbstractIndependentDriverLoader;
 import org.onosproject.net.driver.DefaultDriverProviderService;
+import org.osgi.service.component.annotations.Component;
 
 /**
  * Loader for default device drivers.
  */
-@Service
-@Component(immediate = true)
+@Component(immediate = true, service = DefaultDriversLoader.class)
 public class DefaultDriversLoader extends AbstractIndependentDriverLoader
         implements DefaultDriverProviderService {
     public DefaultDriversLoader() {
diff --git a/drivers/flowspec/BUCK b/drivers/flowspec/BUCK
deleted file mode 100644
index 7590eb2..0000000
--- a/drivers/flowspec/BUCK
+++ /dev/null
@@ -1,27 +0,0 @@
-COMPILE_DEPS = [
-    '//lib:CORE_DEPS',
-    '//lib:KRYO',
-    '//drivers/default:onos-drivers-default',
-    '//apps/flowspec-api/flowapi:onos-apps-flowspec-api-flowapi',
-]
-
-TEST_DEPS = [
-    '//lib:TEST_ADAPTERS',
-    '//core/api:onos-api-tests',
-]
-
-osgi_jar_with_tests (
-    deps = COMPILE_DEPS,
-    test_deps = TEST_DEPS,
-    resources_root = 'src/main/resources',
-    resources = glob(['src/main/resources/**']),
-)
-
-onos_app (
-    app_name = 'org.onosproject.drivers.flowspec',
-    title = 'Generic Flow Spec Drivers',
-    category = 'Drivers',
-    url = 'http://onosproject.org',
-    description = 'Adds support for devices using flow specs.',
-    required_apps = [ 'org.onosproject.drivers'],
-)
diff --git a/drivers/flowspec/src/main/java/org/onosproject/drivers/flowspec/FlowSpecDriversLoader.java b/drivers/flowspec/src/main/java/org/onosproject/drivers/flowspec/FlowSpecDriversLoader.java
index dfa3c0b..93a0295 100644
--- a/drivers/flowspec/src/main/java/org/onosproject/drivers/flowspec/FlowSpecDriversLoader.java
+++ b/drivers/flowspec/src/main/java/org/onosproject/drivers/flowspec/FlowSpecDriversLoader.java
@@ -15,7 +15,7 @@
  */
 package org.onosproject.drivers.flowspec;
 
-import org.apache.felix.scr.annotations.Component;
+import org.osgi.service.component.annotations.Component;
 import org.onosproject.net.driver.AbstractDriverLoader;
 
 /**
diff --git a/drivers/fujitsu/BUCK b/drivers/fujitsu/BUCK
deleted file mode 100644
index 71bc9b6..0000000
--- a/drivers/fujitsu/BUCK
+++ /dev/null
@@ -1,37 +0,0 @@
-COMPILE_DEPS = [
-    '//lib:CORE_DEPS',
-    '//drivers/utilities:onos-drivers-utilities',
-    '//protocols/netconf/api:onos-protocols-netconf-api',
-    '//protocols/netconf/ctl:onos-protocols-netconf-ctl',
-    '//lib:org.apache.karaf.shell.console',
-    '//cli:onos-cli',
-    '//apps/optical-model:onos-apps-optical-model',
-    '//incubator/api:onos-incubator-api',
-]
-
-TEST_DEPS = [
-    '//lib:TEST_ADAPTERS',
-    '//core/api:onos-api-tests',
-]
-
-BUNDLES = [
-    ':onos-drivers-fujitsu',
-    '//drivers/utilities:onos-drivers-utilities',
-]
-
-osgi_jar_with_tests (
-    deps = COMPILE_DEPS,
-    test_deps = TEST_DEPS,
-    resources_root = 'src/main/resources',
-    resources = glob(['src/main/resources/**']),
-)
-
-onos_app (
-    app_name = 'org.onosproject.drivers.fujitsu',
-    title = 'Fujitsu Drivers',
-    category = 'Drivers',
-    url = 'http://onosproject.org',
-    description = 'Adds support for Fujitsu devices.',
-    included_bundles = BUNDLES,
-    required_apps = [ 'org.onosproject.netconf', 'org.onosproject.optical-model', 'org.onosproject.drivers.optical' ],
-)
diff --git a/drivers/fujitsu/BUILD b/drivers/fujitsu/BUILD
index f6a2fdd..4c7b0ba 100644
--- a/drivers/fujitsu/BUILD
+++ b/drivers/fujitsu/BUILD
@@ -1,9 +1,7 @@
-COMPILE_DEPS = CORE_DEPS + [
-    "@org_apache_karaf_shell_console//jar",
+COMPILE_DEPS = CORE_DEPS + CLI + [
     "//drivers/utilities:onos-drivers-utilities",
     "//protocols/netconf/api:onos-protocols-netconf-api",
     "//protocols/netconf/ctl:onos-protocols-netconf-ctl",
-    "//cli:onos-cli",
     "//apps/optical-model:onos-apps-optical-model",
     "//incubator/api:onos-incubator-api",
 ]
@@ -15,6 +13,7 @@
 
 osgi_jar_with_tests(
     exclude_tests = ["org.onosproject.drivers.fujitsu.FujitsuNetconfSessionListenerTest"],
+    karaf_command_packages = ["org.onosproject.drivers.fujitsu.cli"],
     resources = glob(["src/main/resources/**"]),
     resources_root = "src/main/resources",
     test_deps = TEST_ADAPTERS,
diff --git a/drivers/fujitsu/features.xml b/drivers/fujitsu/features.xml
deleted file mode 100644
index 5f2b7c4..0000000
--- a/drivers/fujitsu/features.xml
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
-
-<!--
-  ~ Copyright 2016-present Open Networking Foundation
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~     http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License.
-  -->
-<features xmlns="http://karaf.apache.org/xmlns/features/v1.2.0" name="${project.artifactId}-${project.version}">
-    <feature name="${project.artifactId}" version="${project.version}"
-             description="${project.description}">
-        <feature>onos-api</feature>
-        <bundle>mvn:${project.groupId}/${project.artifactId}/${project.version}</bundle>
-
-        <bundle>mvn:${project.groupId}/onos-drivers-utilities/${project.version}</bundle>
-
-        <bundle>mvn:${project.groupId}/onos-protocols-netconf-api/${project.version}</bundle>
-    </feature>
-</features>
diff --git a/drivers/fujitsu/src/main/java/org/onosproject/drivers/fujitsu/FujitsuDriversLoader.java b/drivers/fujitsu/src/main/java/org/onosproject/drivers/fujitsu/FujitsuDriversLoader.java
index 770ed73..c531ddf 100644
--- a/drivers/fujitsu/src/main/java/org/onosproject/drivers/fujitsu/FujitsuDriversLoader.java
+++ b/drivers/fujitsu/src/main/java/org/onosproject/drivers/fujitsu/FujitsuDriversLoader.java
@@ -16,7 +16,7 @@
 
 package org.onosproject.drivers.fujitsu;
 
-import org.apache.felix.scr.annotations.Component;
+import org.osgi.service.component.annotations.Component;
 import org.onosproject.cli.net.DeviceIdCompleter;
 import org.onosproject.net.driver.AbstractDriverLoader;
 import org.onosproject.net.optical.OpticalDevice;
diff --git a/drivers/fujitsu/src/main/java/org/onosproject/drivers/fujitsu/cli/VoltEthLoopbackCommand.java b/drivers/fujitsu/src/main/java/org/onosproject/drivers/fujitsu/cli/VoltEthLoopbackCommand.java
index 8af49b7..dea297d 100644
--- a/drivers/fujitsu/src/main/java/org/onosproject/drivers/fujitsu/cli/VoltEthLoopbackCommand.java
+++ b/drivers/fujitsu/src/main/java/org/onosproject/drivers/fujitsu/cli/VoltEthLoopbackCommand.java
@@ -15,9 +15,12 @@
  */
 package org.onosproject.drivers.fujitsu.cli;
 
-import org.apache.karaf.shell.commands.Argument;
-import org.apache.karaf.shell.commands.Command;
+import org.apache.karaf.shell.api.action.Argument;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.Completion;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.cli.AbstractShellCommand;
+import org.onosproject.cli.net.DeviceIdCompleter;
 import org.onosproject.net.DeviceId;
 import org.onosproject.drivers.fujitsu.behaviour.VoltOnuOperConfig;
 import org.onosproject.net.driver.DriverHandler;
@@ -26,12 +29,14 @@
 /**
  * Operates/releases loopback on Ethernet port of an ONU in vOLT.
  */
+@Service
 @Command(scope = "onos", name = "volt-ethloopback",
         description = "Operates/releases loopback on Ethernet port of an ONU in vOLT")
 public class VoltEthLoopbackCommand extends AbstractShellCommand {
 
     @Argument(index = 0, name = "uri", description = "Device ID",
             required = true, multiValued = false)
+    @Completion(DeviceIdCompleter.class)
     String uri = null;
 
     @Argument(index = 1, name = "target", description = "PON link ID-ONU ID-Eth port ID[:(operate:release)]",
@@ -41,7 +46,7 @@
     private DeviceId deviceId;
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         DriverService service = get(DriverService.class);
         deviceId = DeviceId.deviceId(uri);
         DriverHandler h = service.createHandler(deviceId);
diff --git a/drivers/fujitsu/src/main/java/org/onosproject/drivers/fujitsu/cli/VoltGetAlertFilterCommand.java b/drivers/fujitsu/src/main/java/org/onosproject/drivers/fujitsu/cli/VoltGetAlertFilterCommand.java
index 1834413..5f8a136 100644
--- a/drivers/fujitsu/src/main/java/org/onosproject/drivers/fujitsu/cli/VoltGetAlertFilterCommand.java
+++ b/drivers/fujitsu/src/main/java/org/onosproject/drivers/fujitsu/cli/VoltGetAlertFilterCommand.java
@@ -15,9 +15,12 @@
  */
 package org.onosproject.drivers.fujitsu.cli;
 
-import org.apache.karaf.shell.commands.Argument;
-import org.apache.karaf.shell.commands.Command;
+import org.apache.karaf.shell.api.action.Argument;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.Completion;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.cli.AbstractShellCommand;
+import org.onosproject.cli.net.DeviceIdCompleter;
 import org.onosproject.net.DeviceId;
 import org.onosproject.drivers.fujitsu.behaviour.VoltAlertConfig;
 import org.onosproject.net.driver.DriverHandler;
@@ -26,18 +29,20 @@
 /**
  * Gets alert filter severity level in vOLT.
  */
+@Service
 @Command(scope = "onos", name = "volt-notification-alertfilter",
         description = "Gets alert filter severity level in vOLT")
 public class VoltGetAlertFilterCommand extends AbstractShellCommand {
 
     @Argument(index = 0, name = "uri", description = "Device ID",
             required = true, multiValued = false)
+    @Completion(DeviceIdCompleter.class)
     String uri = null;
 
     private DeviceId deviceId;
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         DriverService service = get(DriverService.class);
         deviceId = DeviceId.deviceId(uri);
         DriverHandler h = service.createHandler(deviceId);
diff --git a/drivers/fujitsu/src/main/java/org/onosproject/drivers/fujitsu/cli/VoltGetAllCommand.java b/drivers/fujitsu/src/main/java/org/onosproject/drivers/fujitsu/cli/VoltGetAllCommand.java
index 59e6d26..72e8c1f 100644
--- a/drivers/fujitsu/src/main/java/org/onosproject/drivers/fujitsu/cli/VoltGetAllCommand.java
+++ b/drivers/fujitsu/src/main/java/org/onosproject/drivers/fujitsu/cli/VoltGetAllCommand.java
@@ -15,9 +15,12 @@
  */
 package org.onosproject.drivers.fujitsu.cli;
 
-import org.apache.karaf.shell.commands.Argument;
-import org.apache.karaf.shell.commands.Command;
+import org.apache.karaf.shell.api.action.Argument;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.Completion;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.cli.AbstractShellCommand;
+import org.onosproject.cli.net.DeviceIdCompleter;
 import org.onosproject.drivers.fujitsu.behaviour.VoltNeConfig;
 import org.onosproject.net.DeviceId;
 import org.onosproject.net.driver.DriverHandler;
@@ -26,18 +29,20 @@
 /**
  * Gets all available data in vOLT.
  */
+@Service
 @Command(scope = "onos", name = "volt-all",
         description = "Gets all available data in vOLT")
 public class VoltGetAllCommand extends AbstractShellCommand {
 
     @Argument(index = 0, name = "uri", description = "Device ID",
             required = true, multiValued = false)
+    @Completion(DeviceIdCompleter.class)
     String uri = null;
 
     private DeviceId deviceId;
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         DriverService service = get(DriverService.class);
         deviceId = DeviceId.deviceId(uri);
         DriverHandler h = service.createHandler(deviceId);
diff --git a/drivers/fujitsu/src/main/java/org/onosproject/drivers/fujitsu/cli/VoltGetNniLinksCommand.java b/drivers/fujitsu/src/main/java/org/onosproject/drivers/fujitsu/cli/VoltGetNniLinksCommand.java
index 2a4e989..8f7d183 100644
--- a/drivers/fujitsu/src/main/java/org/onosproject/drivers/fujitsu/cli/VoltGetNniLinksCommand.java
+++ b/drivers/fujitsu/src/main/java/org/onosproject/drivers/fujitsu/cli/VoltGetNniLinksCommand.java
@@ -15,9 +15,12 @@
  */
 package org.onosproject.drivers.fujitsu.cli;
 
-import org.apache.karaf.shell.commands.Argument;
-import org.apache.karaf.shell.commands.Command;
+import org.apache.karaf.shell.api.action.Argument;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.Completion;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.cli.AbstractShellCommand;
+import org.onosproject.cli.net.DeviceIdCompleter;
 import org.onosproject.net.DeviceId;
 import org.onosproject.drivers.fujitsu.behaviour.VoltNniLinkConfig;
 import org.onosproject.net.driver.DriverHandler;
@@ -26,12 +29,14 @@
 /**
  * Gets NNI links in vOLT.
  */
+@Service
 @Command(scope = "onos", name = "volt-nnilinks",
         description = "Gets NNI links in vOLT")
 public class VoltGetNniLinksCommand extends AbstractShellCommand {
 
     @Argument(index = 0, name = "uri", description = "Device ID",
             required = true, multiValued = false)
+    @Completion(DeviceIdCompleter.class)
     String uri = null;
 
     @Argument(index = 1, name = "target", description = "NNI link ID",
@@ -41,7 +46,7 @@
     private DeviceId deviceId;
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         DriverService service = get(DriverService.class);
         deviceId = DeviceId.deviceId(uri);
         DriverHandler h = service.createHandler(deviceId);
diff --git a/drivers/fujitsu/src/main/java/org/onosproject/drivers/fujitsu/cli/VoltGetOnuStatsCommand.java b/drivers/fujitsu/src/main/java/org/onosproject/drivers/fujitsu/cli/VoltGetOnuStatsCommand.java
index 62ae3e5..8bb673c 100644
--- a/drivers/fujitsu/src/main/java/org/onosproject/drivers/fujitsu/cli/VoltGetOnuStatsCommand.java
+++ b/drivers/fujitsu/src/main/java/org/onosproject/drivers/fujitsu/cli/VoltGetOnuStatsCommand.java
@@ -15,9 +15,12 @@
  */
 package org.onosproject.drivers.fujitsu.cli;
 
-import org.apache.karaf.shell.commands.Argument;
-import org.apache.karaf.shell.commands.Command;
+import org.apache.karaf.shell.api.action.Argument;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.Completion;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.cli.AbstractShellCommand;
+import org.onosproject.cli.net.DeviceIdCompleter;
 import org.onosproject.net.DeviceId;
 import org.onosproject.drivers.fujitsu.behaviour.VoltOnuConfig;
 import org.onosproject.net.driver.DriverHandler;
@@ -26,12 +29,14 @@
 /**
  * Gets ONU statistics in vOLT.
  */
+@Service
 @Command(scope = "onos", name = "volt-onustats",
         description = "Gets ONU statistics in vOLT")
 public class VoltGetOnuStatsCommand extends AbstractShellCommand {
 
     @Argument(index = 0, name = "uri", description = "Device ID",
             required = true, multiValued = false)
+    @Completion(DeviceIdCompleter.class)
     String uri = null;
 
     @Argument(index = 1, name = "target", description = "PON link ID-ONU ID",
@@ -41,7 +46,7 @@
     private DeviceId deviceId;
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         DriverService service = get(DriverService.class);
         deviceId = DeviceId.deviceId(uri);
         DriverHandler h = service.createHandler(deviceId);
diff --git a/drivers/fujitsu/src/main/java/org/onosproject/drivers/fujitsu/cli/VoltGetOnusCommand.java b/drivers/fujitsu/src/main/java/org/onosproject/drivers/fujitsu/cli/VoltGetOnusCommand.java
index a5eaa2d..a07a6fa 100644
--- a/drivers/fujitsu/src/main/java/org/onosproject/drivers/fujitsu/cli/VoltGetOnusCommand.java
+++ b/drivers/fujitsu/src/main/java/org/onosproject/drivers/fujitsu/cli/VoltGetOnusCommand.java
@@ -15,9 +15,12 @@
  */
 package org.onosproject.drivers.fujitsu.cli;
 
-import org.apache.karaf.shell.commands.Argument;
-import org.apache.karaf.shell.commands.Command;
+import org.apache.karaf.shell.api.action.Argument;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.Completion;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.cli.AbstractShellCommand;
+import org.onosproject.cli.net.DeviceIdCompleter;
 import org.onosproject.net.DeviceId;
 import org.onosproject.drivers.fujitsu.behaviour.VoltOnuConfig;
 import org.onosproject.net.driver.DriverHandler;
@@ -26,12 +29,14 @@
 /**
  * Gets ONUs available in vOLT.
  */
+@Service
 @Command(scope = "onos", name = "volt-onus",
         description = "Gets ONUs available in vOLT")
 public class VoltGetOnusCommand extends AbstractShellCommand {
 
     @Argument(index = 0, name = "uri", description = "Device ID",
             required = true, multiValued = false)
+    @Completion(DeviceIdCompleter.class)
     String uri = null;
 
     @Argument(index = 1, name = "target", description = "PON link ID or PON link ID-ONU ID",
@@ -41,7 +46,7 @@
     private DeviceId deviceId;
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         DriverService service = get(DriverService.class);
         deviceId = DeviceId.deviceId(uri);
         DriverHandler h = service.createHandler(deviceId);
diff --git a/drivers/fujitsu/src/main/java/org/onosproject/drivers/fujitsu/cli/VoltGetPonLinksCommand.java b/drivers/fujitsu/src/main/java/org/onosproject/drivers/fujitsu/cli/VoltGetPonLinksCommand.java
index a45caad..443fd78 100644
--- a/drivers/fujitsu/src/main/java/org/onosproject/drivers/fujitsu/cli/VoltGetPonLinksCommand.java
+++ b/drivers/fujitsu/src/main/java/org/onosproject/drivers/fujitsu/cli/VoltGetPonLinksCommand.java
@@ -15,9 +15,12 @@
  */
 package org.onosproject.drivers.fujitsu.cli;
 
-import org.apache.karaf.shell.commands.Argument;
-import org.apache.karaf.shell.commands.Command;
+import org.apache.karaf.shell.api.action.Argument;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.Completion;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.cli.AbstractShellCommand;
+import org.onosproject.cli.net.DeviceIdCompleter;
 import org.onosproject.net.DeviceId;
 import org.onosproject.drivers.fujitsu.behaviour.VoltPonLinkConfig;
 import org.onosproject.net.driver.DriverHandler;
@@ -26,12 +29,14 @@
 /**
  * Gets PON links in vOLT.
  */
+@Service
 @Command(scope = "onos", name = "volt-ponlinks",
         description = "Gets PON links in vOLT")
 public class VoltGetPonLinksCommand extends AbstractShellCommand {
 
     @Argument(index = 0, name = "uri", description = "Device ID",
             required = true, multiValued = false)
+    @Completion(DeviceIdCompleter.class)
     String uri = null;
 
     @Argument(index = 1, name = "target", description = "PON link ID",
@@ -41,7 +46,7 @@
     private DeviceId deviceId;
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         DriverService service = get(DriverService.class);
         deviceId = DeviceId.deviceId(uri);
         DriverHandler h = service.createHandler(deviceId);
diff --git a/drivers/fujitsu/src/main/java/org/onosproject/drivers/fujitsu/cli/VoltOndemandFwdlCommand.java b/drivers/fujitsu/src/main/java/org/onosproject/drivers/fujitsu/cli/VoltOndemandFwdlCommand.java
index fa79f11..14b00c2 100644
--- a/drivers/fujitsu/src/main/java/org/onosproject/drivers/fujitsu/cli/VoltOndemandFwdlCommand.java
+++ b/drivers/fujitsu/src/main/java/org/onosproject/drivers/fujitsu/cli/VoltOndemandFwdlCommand.java
@@ -15,9 +15,12 @@
  */
 package org.onosproject.drivers.fujitsu.cli;
 
-import org.apache.karaf.shell.commands.Argument;
-import org.apache.karaf.shell.commands.Command;
+import org.apache.karaf.shell.api.action.Argument;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.Completion;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.cli.AbstractShellCommand;
+import org.onosproject.cli.net.DeviceIdCompleter;
 import org.onosproject.drivers.fujitsu.behaviour.VoltFwdlConfig;
 import org.onosproject.net.DeviceId;
 import org.onosproject.net.driver.DriverHandler;
@@ -26,12 +29,14 @@
 /**
  * Requests manual firmware upgrade on a list of ONUs in vOLT.
  */
+@Service
 @Command(scope = "onos", name = "volt-ondemandfwdl",
         description = "Requests manual firmware upgrade on a list of ONUs in vOLT")
 public class VoltOndemandFwdlCommand extends AbstractShellCommand {
 
     @Argument(index = 0, name = "uri", description = "Device ID",
             required = true, multiValued = false)
+    @Completion(DeviceIdCompleter.class)
     String uri = null;
 
     @Argument(index = 1, name = "target",
@@ -42,7 +47,7 @@
     private DeviceId deviceId;
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         DriverService service = get(DriverService.class);
         deviceId = DeviceId.deviceId(uri);
         DriverHandler h = service.createHandler(deviceId);
diff --git a/drivers/fujitsu/src/main/java/org/onosproject/drivers/fujitsu/cli/VoltRebootOnuCommand.java b/drivers/fujitsu/src/main/java/org/onosproject/drivers/fujitsu/cli/VoltRebootOnuCommand.java
index d9d7e68..efffaad 100644
--- a/drivers/fujitsu/src/main/java/org/onosproject/drivers/fujitsu/cli/VoltRebootOnuCommand.java
+++ b/drivers/fujitsu/src/main/java/org/onosproject/drivers/fujitsu/cli/VoltRebootOnuCommand.java
@@ -15,9 +15,12 @@
  */
 package org.onosproject.drivers.fujitsu.cli;
 
-import org.apache.karaf.shell.commands.Argument;
-import org.apache.karaf.shell.commands.Command;
+import org.apache.karaf.shell.api.action.Argument;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.Completion;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.cli.AbstractShellCommand;
+import org.onosproject.cli.net.DeviceIdCompleter;
 import org.onosproject.net.DeviceId;
 import org.onosproject.drivers.fujitsu.behaviour.VoltOnuOperConfig;
 import org.onosproject.net.driver.DriverHandler;
@@ -26,12 +29,14 @@
 /**
  * Reboots an ONU in vOLT.
  */
+@Service
 @Command(scope = "onos", name = "volt-rebootonu",
         description = "Reboots an ONU in vOLT")
 public class VoltRebootOnuCommand extends AbstractShellCommand {
 
     @Argument(index = 0, name = "uri", description = "Device ID",
             required = true, multiValued = false)
+    @Completion(DeviceIdCompleter.class)
     String uri = null;
 
     @Argument(index = 1, name = "target", description = "PON link ID-ONU ID",
@@ -41,7 +46,7 @@
     private DeviceId deviceId;
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         DriverService service = get(DriverService.class);
         deviceId = DeviceId.deviceId(uri);
         DriverHandler h = service.createHandler(deviceId);
diff --git a/drivers/fujitsu/src/main/java/org/onosproject/drivers/fujitsu/cli/VoltSetAlertFilterCommand.java b/drivers/fujitsu/src/main/java/org/onosproject/drivers/fujitsu/cli/VoltSetAlertFilterCommand.java
index a9079d3..fff696a 100644
--- a/drivers/fujitsu/src/main/java/org/onosproject/drivers/fujitsu/cli/VoltSetAlertFilterCommand.java
+++ b/drivers/fujitsu/src/main/java/org/onosproject/drivers/fujitsu/cli/VoltSetAlertFilterCommand.java
@@ -15,9 +15,12 @@
  */
 package org.onosproject.drivers.fujitsu.cli;
 
-import org.apache.karaf.shell.commands.Argument;
-import org.apache.karaf.shell.commands.Command;
+import org.apache.karaf.shell.api.action.Argument;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.Completion;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.cli.AbstractShellCommand;
+import org.onosproject.cli.net.DeviceIdCompleter;
 import org.onosproject.net.DeviceId;
 import org.onosproject.drivers.fujitsu.behaviour.VoltAlertConfig;
 import org.onosproject.net.driver.DriverHandler;
@@ -26,12 +29,14 @@
 /**
  * Sets alert filter severity level in vOLT.
  */
+@Service
 @Command(scope = "onos", name = "volt-notification-setalertfilter",
         description = "Sets alert filter severity level in vOLT")
 public class VoltSetAlertFilterCommand extends AbstractShellCommand {
 
     @Argument(index = 0, name = "uri", description = "Device ID",
             required = true, multiValued = false)
+    @Completion(DeviceIdCompleter.class)
     String uri = null;
 
     @Argument(index = 1, name = "target", description = "Severity level",
@@ -41,7 +46,7 @@
     private DeviceId deviceId;
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         DriverService service = get(DriverService.class);
         deviceId = DeviceId.deviceId(uri);
         DriverHandler h = service.createHandler(deviceId);
diff --git a/drivers/fujitsu/src/main/java/org/onosproject/drivers/fujitsu/cli/VoltSetNniLinkCommand.java b/drivers/fujitsu/src/main/java/org/onosproject/drivers/fujitsu/cli/VoltSetNniLinkCommand.java
index ff45fd8..980ebd0 100644
--- a/drivers/fujitsu/src/main/java/org/onosproject/drivers/fujitsu/cli/VoltSetNniLinkCommand.java
+++ b/drivers/fujitsu/src/main/java/org/onosproject/drivers/fujitsu/cli/VoltSetNniLinkCommand.java
@@ -15,9 +15,12 @@
  */
 package org.onosproject.drivers.fujitsu.cli;
 
-import org.apache.karaf.shell.commands.Argument;
-import org.apache.karaf.shell.commands.Command;
+import org.apache.karaf.shell.api.action.Argument;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.Completion;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.cli.AbstractShellCommand;
+import org.onosproject.cli.net.DeviceIdCompleter;
 import org.onosproject.net.DeviceId;
 import org.onosproject.drivers.fujitsu.behaviour.VoltNniLinkConfig;
 import org.onosproject.net.driver.DriverHandler;
@@ -26,12 +29,14 @@
 /**
  * Sets a parameter of a NNI link in vOLT.
  */
+@Service
 @Command(scope = "onos", name = "volt-setnnilink",
         description = "Sets a parameter of a NNI link in vOLT")
 public class VoltSetNniLinkCommand extends AbstractShellCommand {
 
     @Argument(index = 0, name = "uri", description = "Device ID",
             required = true, multiValued = false)
+    @Completion(DeviceIdCompleter.class)
     String uri = null;
 
     @Argument(index = 1, name = "target", description = "NNI link ID:parameter:value",
@@ -41,7 +46,7 @@
     private DeviceId deviceId;
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         DriverService service = get(DriverService.class);
         deviceId = DeviceId.deviceId(uri);
         DriverHandler h = service.createHandler(deviceId);
diff --git a/drivers/fujitsu/src/main/java/org/onosproject/drivers/fujitsu/cli/VoltSetOnuCommand.java b/drivers/fujitsu/src/main/java/org/onosproject/drivers/fujitsu/cli/VoltSetOnuCommand.java
index 6c76986..264e900 100644
--- a/drivers/fujitsu/src/main/java/org/onosproject/drivers/fujitsu/cli/VoltSetOnuCommand.java
+++ b/drivers/fujitsu/src/main/java/org/onosproject/drivers/fujitsu/cli/VoltSetOnuCommand.java
@@ -15,9 +15,12 @@
  */
 package org.onosproject.drivers.fujitsu.cli;
 
-import org.apache.karaf.shell.commands.Argument;
-import org.apache.karaf.shell.commands.Command;
+import org.apache.karaf.shell.api.action.Argument;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.Completion;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.cli.AbstractShellCommand;
+import org.onosproject.cli.net.DeviceIdCompleter;
 import org.onosproject.net.DeviceId;
 import org.onosproject.drivers.fujitsu.behaviour.VoltOnuConfig;
 import org.onosproject.net.driver.DriverHandler;
@@ -26,12 +29,14 @@
 /**
  * Sets a parameter value of an ONU in vOLT.
  */
+@Service
 @Command(scope = "onos", name = "volt-setonu",
         description = "Sets a parameter value of an ONU in vOLT")
 public class VoltSetOnuCommand extends AbstractShellCommand {
 
     @Argument(index = 0, name = "uri", description = "Device ID",
             required = true, multiValued = false)
+    @Completion(DeviceIdCompleter.class)
     String uri = null;
 
     @Argument(index = 1, name = "target", description = "PON link ID-ONU ID:parameter:value",
@@ -41,7 +46,7 @@
     private DeviceId deviceId;
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         DriverService service = get(DriverService.class);
         deviceId = DeviceId.deviceId(uri);
         DriverHandler h = service.createHandler(deviceId);
diff --git a/drivers/fujitsu/src/main/java/org/onosproject/drivers/fujitsu/cli/VoltSetPonLinkCommand.java b/drivers/fujitsu/src/main/java/org/onosproject/drivers/fujitsu/cli/VoltSetPonLinkCommand.java
index c402d15..a615ba4 100644
--- a/drivers/fujitsu/src/main/java/org/onosproject/drivers/fujitsu/cli/VoltSetPonLinkCommand.java
+++ b/drivers/fujitsu/src/main/java/org/onosproject/drivers/fujitsu/cli/VoltSetPonLinkCommand.java
@@ -15,9 +15,12 @@
  */
 package org.onosproject.drivers.fujitsu.cli;
 
-import org.apache.karaf.shell.commands.Argument;
-import org.apache.karaf.shell.commands.Command;
+import org.apache.karaf.shell.api.action.Argument;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.Completion;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.cli.AbstractShellCommand;
+import org.onosproject.cli.net.DeviceIdCompleter;
 import org.onosproject.net.DeviceId;
 import org.onosproject.drivers.fujitsu.behaviour.VoltPonLinkConfig;
 import org.onosproject.net.driver.DriverHandler;
@@ -26,12 +29,14 @@
 /**
  * Sets a parameter of a PON link in vOLT.
  */
+@Service
 @Command(scope = "onos", name = "volt-setponlink",
         description = "Sets a parameter of a PON link in vOLT")
 public class VoltSetPonLinkCommand extends AbstractShellCommand {
 
     @Argument(index = 0, name = "uri", description = "Device ID",
             required = true, multiValued = false)
+    @Completion(DeviceIdCompleter.class)
     String uri = null;
 
     @Argument(index = 1, name = "target", description = "PON link ID:parameter:value",
@@ -41,7 +46,7 @@
     private DeviceId deviceId;
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         DriverService service = get(DriverService.class);
         deviceId = DeviceId.deviceId(uri);
         DriverHandler h = service.createHandler(deviceId);
diff --git a/drivers/fujitsu/src/main/java/org/onosproject/drivers/fujitsu/cli/VoltSubscribeCommand.java b/drivers/fujitsu/src/main/java/org/onosproject/drivers/fujitsu/cli/VoltSubscribeCommand.java
index 4f222dc..67b4d46 100644
--- a/drivers/fujitsu/src/main/java/org/onosproject/drivers/fujitsu/cli/VoltSubscribeCommand.java
+++ b/drivers/fujitsu/src/main/java/org/onosproject/drivers/fujitsu/cli/VoltSubscribeCommand.java
@@ -15,9 +15,12 @@
  */
 package org.onosproject.drivers.fujitsu.cli;
 
-import org.apache.karaf.shell.commands.Argument;
-import org.apache.karaf.shell.commands.Command;
+import org.apache.karaf.shell.api.action.Argument;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.Completion;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.cli.AbstractShellCommand;
+import org.onosproject.cli.net.DeviceIdCompleter;
 import org.onosproject.net.DeviceId;
 import org.onosproject.drivers.fujitsu.behaviour.VoltAlertConfig;
 import org.onosproject.net.driver.DriverHandler;
@@ -26,12 +29,14 @@
 /**
  * Subscribes to receive notifications of vOLT or unsubscribes.
  */
+@Service
 @Command(scope = "onos", name = "volt-notification-subscribe",
         description = "Subscribes to receive notifications of vOLT")
 public class VoltSubscribeCommand extends AbstractShellCommand {
 
     @Argument(index = 0, name = "uri", description = "Device ID",
             required = true, multiValued = false)
+    @Completion(DeviceIdCompleter.class)
     String uri = null;
 
     @Argument(index = 1, name = "mode", description = "Disable subscription",
@@ -41,7 +46,7 @@
     private DeviceId deviceId;
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         DriverService service = get(DriverService.class);
         deviceId = DeviceId.deviceId(uri);
         DriverHandler h = service.createHandler(deviceId);
diff --git a/drivers/fujitsu/src/main/resources/OSGI-INF/blueprint/shell-config.xml b/drivers/fujitsu/src/main/resources/OSGI-INF/blueprint/shell-config.xml
deleted file mode 100644
index 9355ad6..0000000
--- a/drivers/fujitsu/src/main/resources/OSGI-INF/blueprint/shell-config.xml
+++ /dev/null
@@ -1,107 +0,0 @@
-<!--
-  ~ Copyright 2016-present Open Networking Foundation
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~     http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License.
-  -->
-<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0">
-
-    <command-bundle xmlns="http://karaf.apache.org/xmlns/shell/v1.1.0">
-        <!--volt commands -->
-        <command>
-            <action class="org.onosproject.drivers.fujitsu.cli.VoltGetPonLinksCommand"/>
-        <completers>
-            <ref component-id="deviceIdCompleter"/>
-        </completers>
-        </command>
-        <command>
-            <action class="org.onosproject.drivers.fujitsu.cli.VoltSetPonLinkCommand"/>
-        <completers>
-            <ref component-id="deviceIdCompleter"/>
-        </completers>
-        </command>
-        <command>
-            <action class="org.onosproject.drivers.fujitsu.cli.VoltGetOnusCommand"/>
-            <completers>
-                <ref component-id="deviceIdCompleter"/>
-            </completers>
-        </command>
-        <command>
-            <action class="org.onosproject.drivers.fujitsu.cli.VoltSetOnuCommand"/>
-            <completers>
-                <ref component-id="deviceIdCompleter"/>
-            </completers>
-        </command>
-        <command>
-            <action class="org.onosproject.drivers.fujitsu.cli.VoltGetOnuStatsCommand"/>
-            <completers>
-                <ref component-id="deviceIdCompleter"/>
-            </completers>
-        </command>
-        <command>
-            <action class="org.onosproject.drivers.fujitsu.cli.VoltEthLoopbackCommand"/>
-            <completers>
-                <ref component-id="deviceIdCompleter"/>
-            </completers>
-        </command>
-        <command>
-            <action class="org.onosproject.drivers.fujitsu.cli.VoltRebootOnuCommand"/>
-            <completers>
-                <ref component-id="deviceIdCompleter"/>
-            </completers>
-        </command>
-        <command>
-            <action class="org.onosproject.drivers.fujitsu.cli.VoltGetAlertFilterCommand"/>
-            <completers>
-                <ref component-id="deviceIdCompleter"/>
-            </completers>
-        </command>
-        <command>
-            <action class="org.onosproject.drivers.fujitsu.cli.VoltSetAlertFilterCommand"/>
-            <completers>
-                <ref component-id="deviceIdCompleter"/>
-            </completers>
-        </command>
-        <command>
-            <action class="org.onosproject.drivers.fujitsu.cli.VoltSubscribeCommand"/>
-            <completers>
-                <ref component-id="deviceIdCompleter"/>
-            </completers>
-        </command>
-        <command>
-            <action class="org.onosproject.drivers.fujitsu.cli.VoltOndemandFwdlCommand"/>
-            <completers>
-                <ref component-id="deviceIdCompleter"/>
-            </completers>
-        </command>
-        <command>
-            <action class="org.onosproject.drivers.fujitsu.cli.VoltGetAllCommand"/>
-            <completers>
-                <ref component-id="deviceIdCompleter"/>
-            </completers>
-        </command>
-        <command>
-            <action class="org.onosproject.drivers.fujitsu.cli.VoltGetNniLinksCommand"/>
-            <completers>
-                <ref component-id="deviceIdCompleter"/>
-            </completers>
-        </command>
-        <command>
-            <action class="org.onosproject.drivers.fujitsu.cli.VoltSetNniLinkCommand"/>
-            <completers>
-                <ref component-id="deviceIdCompleter"/>
-            </completers>
-        </command>
-    </command-bundle>
-
-    <bean id="deviceIdCompleter" class="org.onosproject.cli.net.DeviceIdCompleter"/>
-</blueprint>
diff --git a/drivers/gnmi/BUCK b/drivers/gnmi/BUCK
deleted file mode 100644
index 0fe379e..0000000
--- a/drivers/gnmi/BUCK
+++ /dev/null
@@ -1,38 +0,0 @@
-PROTOBUF_VER = '3.2.0'
-GRPC_VER = '1.3.1'
-
-COMPILE_DEPS = [
-    '//lib:CORE_DEPS',
-    '//lib:KRYO',
-    '//protocols/grpc/api:onos-protocols-grpc-api',
-    '//protocols/grpc/proto:onos-protocols-grpc-proto',
-    '//incubator/grpc-dependencies:grpc-core-repkg-' + GRPC_VER,
-    '//lib:grpc-netty-' + GRPC_VER,
-    '//lib:protobuf-java-' + PROTOBUF_VER,
-    '//lib:grpc-stub-' + GRPC_VER,
-    '//core/store/serializers:onos-core-serializers',
-    '//protocols/gnmi/stub:onos-protocols-gnmi-stub',
-]
-
-BUNDLES = [
-    ':onos-drivers-gnmi',
-]
-
-osgi_jar (
-    deps = COMPILE_DEPS,
-)
-
-onos_app (
-    app_name = 'org.onosproject.drivers.gnmi',
-    title = 'gNMI Drivers',
-    category = 'Drivers',
-    url = 'http://onosproject.org',
-    description = 'Adds support for devices using gNMI protocol based on ' +
-    ' openconfig models: http://openconfig.net/ .',
-    included_bundles = BUNDLES,
-    required_apps = [
-        'org.onosproject.generaldeviceprovider',
-        'org.onosproject.protocols.grpc',
-        'org.onosproject.protocols.gnmi'
-    ],
-)
\ No newline at end of file
diff --git a/drivers/gnmi/features.xml b/drivers/gnmi/features.xml
deleted file mode 100644
index 448f07a..0000000
--- a/drivers/gnmi/features.xml
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
-<!--
-  ~ Copyright 2017-present Open Networking Foundation
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~     http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License.
-  -->
-<features xmlns="http://karaf.apache.org/xmlns/features/v1.2.0" name="${project.artifactId}-${project.version}">
-    <feature name="${project.artifactId}" version="${project.version}"
-             description="${project.description}">
-        <feature>onos-api</feature>
-        <bundle>mvn:${project.groupId}/${project.artifactId}/${project.version}</bundle>
-
-    </feature>
-</features>
diff --git a/drivers/gnmi/src/main/java/org/onosproject/drivers/gnmi/GnmiDriversLoader.java b/drivers/gnmi/src/main/java/org/onosproject/drivers/gnmi/GnmiDriversLoader.java
index 689a53b..62a5e9f 100644
--- a/drivers/gnmi/src/main/java/org/onosproject/drivers/gnmi/GnmiDriversLoader.java
+++ b/drivers/gnmi/src/main/java/org/onosproject/drivers/gnmi/GnmiDriversLoader.java
@@ -16,7 +16,7 @@
 
 package org.onosproject.drivers.gnmi;
 
-import org.apache.felix.scr.annotations.Component;
+import org.osgi.service.component.annotations.Component;
 import org.onosproject.net.driver.AbstractDriverLoader;
 
 /**
diff --git a/drivers/hp/BUCK b/drivers/hp/BUCK
deleted file mode 100644
index a403221..0000000
--- a/drivers/hp/BUCK
+++ /dev/null
@@ -1,29 +0,0 @@
-COMPILE_DEPS = [
-    '//lib:CORE_DEPS',
-    '//lib:KRYO',
-    '//lib:openflowj',
-    '//drivers/default:onos-drivers-default',
-    '//drivers/utilities:onos-drivers-utilities',
-    '//protocols/openflow/api:onos-protocols-openflow-api',
-]
-
-TEST_DEPS = [
-    '//lib:TEST_ADAPTERS',
-    '//core/api:onos-api-tests',
-]
-
-osgi_jar_with_tests (
-    deps = COMPILE_DEPS,
-    test_deps = TEST_DEPS,
-    resources_root = 'src/main/resources',
-    resources = glob(['src/main/resources/**']),
-)
-
-onos_app (
-    app_name = 'org.onosproject.drivers.hp',
-    title = 'HP Drivers',
-    category = 'Drivers',
-    url = 'http://onosproject.org',
-    description = 'Adds support for HP devices.',
-    required_apps = [ 'org.onosproject.openflow' ],
-)
diff --git a/drivers/hp/features.xml b/drivers/hp/features.xml
deleted file mode 100644
index 1e69ff0..0000000
--- a/drivers/hp/features.xml
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
-<!--
-  ~ Copyright 2017-present Open Networking Foundation
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~     http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License.
-  -->
-<features xmlns="http://karaf.apache.org/xmlns/features/v1.2.0" name="${project.artifactId}-${project.version}">
-    <feature name="${project.artifactId}" version="${project.version}"
-             description="${project.description}">
-        <feature>onos-api</feature>
-        <bundle>mvn:${project.groupId}/${project.artifactId}/${project.version}</bundle>
-        <bundle>mvn:${project.groupId}/onos-drivers-utilities/${project.version}</bundle>
-    </feature>
-</features>
diff --git a/drivers/hp/src/main/java/org/onosproject/drivers/hp/HPDriverLoader.java b/drivers/hp/src/main/java/org/onosproject/drivers/hp/HPDriverLoader.java
index a70c2d7..97343d2 100644
--- a/drivers/hp/src/main/java/org/onosproject/drivers/hp/HPDriverLoader.java
+++ b/drivers/hp/src/main/java/org/onosproject/drivers/hp/HPDriverLoader.java
@@ -16,7 +16,7 @@
 
 package org.onosproject.drivers.hp;
 
-import org.apache.felix.scr.annotations.Component;
+import org.osgi.service.component.annotations.Component;
 import org.onosproject.net.driver.AbstractDriverLoader;
 
 /**
diff --git a/drivers/huawei/BUCK b/drivers/huawei/BUCK
deleted file mode 100644
index e8689ea..0000000
--- a/drivers/huawei/BUCK
+++ /dev/null
@@ -1,49 +0,0 @@
-COMPILE_DEPS = [
-    '//lib:CORE_DEPS',
-    '//lib:org.apache.servicemix.bundles.dom4j',
-    '//models/l3vpn:onos-models-l3vpn',
-    '//models/huawei:onos-models-huawei',
-    '//drivers/utilities:onos-drivers-utilities',
-    '//protocols/netconf/api:onos-protocols-netconf-api',
-    '//apps/l3vpn:onos-apps-l3vpn',
-    '//apps/config:onos-apps-config',
-    '//lib:onos-yang-model',
-    '//lib:onos-yang-runtime',
-    '//apps/yang:onos-apps-yang',
-    '//models/common:onos-models-common',
-]
-
-APPS = [
-    'org.onosproject.yang',
-    'org.onosproject.yang-gui',
-    'org.onosproject.config',
-    'org.onosproject.restconf',
-    'org.onosproject.protocols.restconfserver',
-    'org.onosproject.netconf',
-    'org.onosproject.netconfsb',
-    'org.onosproject.models.common',
-    'org.onosproject.models.l3vpn',
-    'org.onosproject.l3vpn',
-    'org.onosproject.models.huawei',
-]
-
-TEST_DEPS = [
-    '//lib:TEST_ADAPTERS',
-    '//utils/osgi:onlab-osgi-tests',
-]
-
-osgi_jar_with_tests(
-    deps = COMPILE_DEPS,
-    test_deps = TEST_DEPS,
-    resources_root = 'src/main/resources',
-    resources = glob(['src/main/resources/**']),
-)
-
-onos_app(
-    app_name = 'org.onosproject.drivers.huawei',
-    title = 'Huawei Drivers',
-    category = 'Drivers',
-    url = 'http://onosproject.org',
-    description = 'Adds support for Huawei devices.',
-    required_apps = APPS
-)
\ No newline at end of file
diff --git a/drivers/huawei/src/main/java/org/onosproject/drivers/huawei/HuaweiDriversLoader.java b/drivers/huawei/src/main/java/org/onosproject/drivers/huawei/HuaweiDriversLoader.java
index db96787..79f1b9e 100644
--- a/drivers/huawei/src/main/java/org/onosproject/drivers/huawei/HuaweiDriversLoader.java
+++ b/drivers/huawei/src/main/java/org/onosproject/drivers/huawei/HuaweiDriversLoader.java
@@ -16,7 +16,7 @@
 
 package org.onosproject.drivers.huawei;
 
-import org.apache.felix.scr.annotations.Component;
+import org.osgi.service.component.annotations.Component;
 import org.onosproject.net.driver.AbstractDriverLoader;
 
 /**
diff --git a/drivers/juniper/BUCK b/drivers/juniper/BUCK
deleted file mode 100644
index 1339200..0000000
--- a/drivers/juniper/BUCK
+++ /dev/null
@@ -1,26 +0,0 @@
-COMPILE_DEPS = [
-  '//lib:CORE_DEPS',
-  '//drivers/utilities:onos-drivers-utilities',
-  '//protocols/netconf/api:onos-protocols-netconf-api',
-]
-
-BUNDLES = [
-  ':onos-drivers-juniper',
-  '//drivers/utilities:onos-drivers-utilities',
-]
-
-osgi_jar_with_tests (
-  deps = COMPILE_DEPS,
-  resources_root = 'src/main/resources',
-  resources = glob(['src/main/resources/**']),
-)
-
-onos_app (
-  app_name = 'org.onosproject.drivers.juniper',
-  title = 'Juniper Drivers',
-  category = 'Drivers',
-  url = 'http://onosproject.org',
-  description = 'Adds support for Juniper devices.',
-  included_bundles = BUNDLES,
-  required_apps = [ 'org.onosproject.netconf' ],
-)
\ No newline at end of file
diff --git a/drivers/juniper/features.xml b/drivers/juniper/features.xml
deleted file mode 100644
index c6e4911..0000000
--- a/drivers/juniper/features.xml
+++ /dev/null
@@ -1,35 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
-
-<!--
-  ~ Copyright 2016 Open Networking Foundation
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~     http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License.
-  -->
-
-<features xmlns="http://karaf.apache.org/xmlns/features/v1.2.0"
-          name="${project.artifactId}-${project.version}">
-    <feature name="${project.artifactId}" version="${project.version}"
-             description="${project.description}">
-        <feature>onos-api</feature>
-        <bundle>
-            mvn:${project.groupId}/${project.artifactId}/${project.version}
-        </bundle>
-
-        <bundle>
-            mvn:${project.groupId}/onos-drivers-utilities/${project.version}
-        </bundle>
-
-        <bundle>mvn:${project.groupId}/onos-protocols-netconf-api/${project.version}
-        </bundle>
-    </feature>
-</features>
diff --git a/drivers/juniper/src/main/java/org/onosproject/drivers/juniper/JuniperDriversLoader.java b/drivers/juniper/src/main/java/org/onosproject/drivers/juniper/JuniperDriversLoader.java
index 83dc4e1..68f8e77 100644
--- a/drivers/juniper/src/main/java/org/onosproject/drivers/juniper/JuniperDriversLoader.java
+++ b/drivers/juniper/src/main/java/org/onosproject/drivers/juniper/JuniperDriversLoader.java
@@ -16,7 +16,7 @@
 
 package org.onosproject.drivers.juniper;
 
-import org.apache.felix.scr.annotations.Component;
+import org.osgi.service.component.annotations.Component;
 import org.onosproject.net.driver.AbstractDriverLoader;
 
 @Component(immediate = true)
diff --git a/drivers/lisp/BUCK b/drivers/lisp/BUCK
deleted file mode 100644
index 18b053a..0000000
--- a/drivers/lisp/BUCK
+++ /dev/null
@@ -1,40 +0,0 @@
-COMPILE_DEPS = [
-    '//lib:CORE_DEPS',
-    '//lib:JACKSON',
-    '//lib:KRYO',
-    '//protocols/lisp/api:onos-protocols-lisp-api',
-    '//protocols/lisp/msg:onos-protocols-lisp-msg',
-    '//apps/mappingmanagement/api:onos-apps-mappingmanagement-api',
-    '//core/store/serializers:onos-core-serializers'
-]
-
-TEST_DEPS = [
-    '//lib:TEST_ADAPTERS',
-    '//apps/mappingmanagement/api:onos-apps-mappingmanagement-api-tests',
-    '//core/api:onos-api-tests',
-    '//lib:jersey-test-framework-core',
-    '//lib:jersey-test-framework-jetty',
-    '//utils/osgi:onlab-osgi-tests',
-    '//web/api:onos-rest-tests',
-]
-
-BUNDLES = [
-    ':onos-drivers-lisp',
-]
-
-osgi_jar_with_tests (
-    deps = COMPILE_DEPS,
-    test_deps = TEST_DEPS,
-    resources_root = 'src/main/resources',
-    resources = glob(['src/main/resources/**']),
-)
-
-onos_app (
-    app_name = 'org.onosproject.drivers.lisp',
-    title = 'Generic LISP Drivers',
-    category = 'Drivers',
-    url = 'https://wiki.onosproject.org/display/ONOS/LISP+as+SBI',
-    description = 'Adds support for devices using LISP.',
-    included_bundles = BUNDLES,
-    required_apps = [ 'org.onosproject.lisp' ],
-)
diff --git a/drivers/lisp/features.xml b/drivers/lisp/features.xml
deleted file mode 100644
index 9aa99aa..0000000
--- a/drivers/lisp/features.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
-
-<!--
-  ~ Copyright 2017-present Open Networking Foundation
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~     http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License.
-  -->
-<features xmlns="http://karaf.apache.org/xmlns/features/v1.2.0" name="${project.artifactId}-${project.version}">
-    <feature name="${project.artifactId}" version="${project.version}"
-             description="${project.description}">
-        <feature>onos-api</feature>
-        <bundle>mvn:${project.groupId}/${project.artifactId}/${project.version}</bundle>
-        <bundle>mvn:${project.groupId}/onos-lisp-api/${project.version}</bundle>
-    </feature>
-</features>
diff --git a/drivers/lisp/src/main/java/org/onosproject/drivers/lisp/LispDriversLoader.java b/drivers/lisp/src/main/java/org/onosproject/drivers/lisp/LispDriversLoader.java
index faf24d0..33fa28f 100644
--- a/drivers/lisp/src/main/java/org/onosproject/drivers/lisp/LispDriversLoader.java
+++ b/drivers/lisp/src/main/java/org/onosproject/drivers/lisp/LispDriversLoader.java
@@ -16,7 +16,7 @@
 
 package org.onosproject.drivers.lisp;
 
-import org.apache.felix.scr.annotations.Component;
+import org.osgi.service.component.annotations.Component;
 import org.onosproject.net.driver.AbstractDriverLoader;
 
 /**
diff --git a/drivers/lisp/src/main/java/org/onosproject/drivers/lisp/extensions/LispMappingExtensionCodecRegistrator.java b/drivers/lisp/src/main/java/org/onosproject/drivers/lisp/extensions/LispMappingExtensionCodecRegistrator.java
index 569b846..2999ae7 100644
--- a/drivers/lisp/src/main/java/org/onosproject/drivers/lisp/extensions/LispMappingExtensionCodecRegistrator.java
+++ b/drivers/lisp/src/main/java/org/onosproject/drivers/lisp/extensions/LispMappingExtensionCodecRegistrator.java
@@ -15,12 +15,6 @@
  */
 package org.onosproject.drivers.lisp.extensions;
 
-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.onosproject.codec.CodecService;
 import org.onosproject.drivers.lisp.extensions.codec.LispAppDataAddressCodec;
 import org.onosproject.drivers.lisp.extensions.codec.LispAsAddressCodec;
 import org.onosproject.drivers.lisp.extensions.codec.LispGcAddressCodec;
@@ -33,6 +27,9 @@
 import org.onosproject.drivers.lisp.extensions.codec.LispTeAddressCodec;
 import org.onosproject.drivers.lisp.extensions.codec.LispTeRecordCodec;
 import org.onosproject.mapping.MappingCodecRegistrator;
+import org.osgi.service.component.annotations.Activate;
+import org.osgi.service.component.annotations.Component;
+import org.osgi.service.component.annotations.Deactivate;
 import org.slf4j.Logger;
 
 import static org.slf4j.LoggerFactory.getLogger;
@@ -41,15 +38,12 @@
  * Implementation of the JSON codec brokering service for
  * mapping extension primitives.
  */
-@Component(immediate = true)
+@Component(immediate = true, service = MappingCodecRegistrator.class)
 public class LispMappingExtensionCodecRegistrator extends MappingCodecRegistrator {
 
     private final Logger log = getLogger(getClass());
     private MappingCodecRegistrator registrator;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
-    public CodecService codecService;
-
     @Activate
     public void activate() {
 
diff --git a/drivers/lumentum/BUCK b/drivers/lumentum/BUCK
deleted file mode 100644
index 1699870..0000000
--- a/drivers/lumentum/BUCK
+++ /dev/null
@@ -1,41 +0,0 @@
-COMPILE_DEPS = [
-    '//lib:CORE_DEPS',
-    '//lib:org.apache.servicemix.bundles.snmp4j',
-    '//drivers/utilities:onos-drivers-utilities',
-    '//protocols/snmp/api:onos-protocols-snmp-api',
-    '//protocols/tl1/api:onos-protocols-tl1-api',
-    '//protocols/netconf/api:onos-protocols-netconf-api',
-    '//incubator/api:onos-incubator-api',
-    '//apps/optical-model:onos-apps-optical-model',
-    '//drivers/optical:onos-drivers-optical',
-]
-
-TEST_DEPS = [
-    '//lib:TEST_ADAPTERS',
-    '//core/api:onos-api-tests',
-]
-
-BUNDLES = [
-    ':onos-drivers-lumentum',
-    '//drivers/utilities:onos-drivers-utilities',
-]
-
-osgi_jar_with_tests (
-    deps = COMPILE_DEPS,
-    test_deps = TEST_DEPS,
-    resources_root = 'src/main/resources',
-    resources = glob(['src/main/resources/**']),
-)
-
-onos_app (
-    app_name = 'org.onosproject.drivers.lumentum',
-    title = 'Lumentum Drivers',
-    category = 'Drivers',
-    url = 'http://onosproject.org',
-
-    description = 'ONOS Lumentum Device Drivers application.',
-    included_bundles = BUNDLES,
-    required_apps = [ 'org.onosproject.snmp', 'org.onosproject.faultmanagement', 'org.onosproject.optical-model',
-     'org.onosproject.tl1', 'org.onosproject.netconf', 'org.onosproject.drivers.optical'],
-
-)
diff --git a/drivers/lumentum/features.xml b/drivers/lumentum/features.xml
deleted file mode 100644
index 43a8f41..0000000
--- a/drivers/lumentum/features.xml
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
-<!--
-  ~ Copyright 2016-present Open Networking Foundation
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~     http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License.
-  -->
-<features xmlns="http://karaf.apache.org/xmlns/features/v1.2.0" name="${project.artifactId}-${project.version}">
-    <feature name="${project.artifactId}" version="${project.version}"
-             description="${project.description}">
-        <feature>onos-api</feature>
-        <bundle>mvn:${project.groupId}/${project.artifactId}/${project.version}</bundle>
-
-        <bundle>mvn:org.apache.servicemix.bundles/org.apache.servicemix.bundles.snmp4j/2.3.4_1</bundle>
-
-        <bundle>mvn:${project.groupId}/onos-protocols-snmp-api/${project.version}</bundle>
-
-    </feature>
-</features>
diff --git a/drivers/lumentum/src/main/java/org/onosproject/drivers/lumentum/LumentumDriversLoader.java b/drivers/lumentum/src/main/java/org/onosproject/drivers/lumentum/LumentumDriversLoader.java
index bd08367..9b68b62 100644
--- a/drivers/lumentum/src/main/java/org/onosproject/drivers/lumentum/LumentumDriversLoader.java
+++ b/drivers/lumentum/src/main/java/org/onosproject/drivers/lumentum/LumentumDriversLoader.java
@@ -16,7 +16,7 @@
 
 package org.onosproject.drivers.lumentum;
 
-import org.apache.felix.scr.annotations.Component;
+import org.osgi.service.component.annotations.Component;
 import org.onosproject.net.driver.AbstractDriverLoader;
 import org.onosproject.net.optical.OpticalDevice;
 
diff --git a/drivers/mellanox/BUCK b/drivers/mellanox/BUCK
deleted file mode 100644
index bb9bfbc..0000000
--- a/drivers/mellanox/BUCK
+++ /dev/null
@@ -1,25 +0,0 @@
-COMPILE_DEPS = [
-    '//lib:CORE_DEPS',
-    '//drivers/p4runtime:onos-drivers-p4runtime',
-]
-
-BUNDLES = [
-    ':onos-drivers-mellanox',
-]
-
-osgi_jar(
-    deps = COMPILE_DEPS,
-)
-
-onos_app(
-    app_name = 'org.onosproject.drivers.mellanox',
-    title = 'Mellanox Drivers',
-    category = 'Drivers',
-    url = 'https://wiki.onosproject.org/x/aAZkAQ',
-    description = 'Adds support for Mellanox Spectrum-based devices using P4Runtime',
-    included_bundles = BUNDLES,
-    required_apps = [
-        'org.onosproject.drivers.p4runtime',
-        'org.onosproject.pipelines.fabric',
-    ],
-)
diff --git a/drivers/mellanox/src/main/java/org/onosproject/drivers/mellanox/MellanoxDriversLoader.java b/drivers/mellanox/src/main/java/org/onosproject/drivers/mellanox/MellanoxDriversLoader.java
index 2b6ee26..52d9652 100644
--- a/drivers/mellanox/src/main/java/org/onosproject/drivers/mellanox/MellanoxDriversLoader.java
+++ b/drivers/mellanox/src/main/java/org/onosproject/drivers/mellanox/MellanoxDriversLoader.java
@@ -16,7 +16,7 @@
 
 package org.onosproject.drivers.mellanox;
 
-import org.apache.felix.scr.annotations.Component;
+import org.osgi.service.component.annotations.Component;
 import org.onosproject.net.driver.AbstractDriverLoader;
 
 /**
diff --git a/drivers/microsemi/ea1000/BUCK b/drivers/microsemi/ea1000/BUCK
deleted file mode 100644
index 940903e..0000000
--- a/drivers/microsemi/ea1000/BUCK
+++ /dev/null
@@ -1,48 +0,0 @@
-COMPILE_DEPS = [
-    '//lib:CORE_DEPS',
-    '//lib:ONOS_YANG',
-    '//drivers/utilities:onos-drivers-utilities',
-    '//protocols/netconf/api:onos-protocols-netconf-api',
-    '//protocols/netconf/ctl:onos-protocols-netconf-ctl',
-    '//models/common:onos-models-common',
-    '//models/microsemi:onos-models-microsemi',
-    '//lib:org.apache.karaf.shell.console',
-    '//apps/cfm/api:onos-apps-cfm-api',
-] + YANG_TOOLS
-
-TEST_DEPS = [
-    '//lib:TEST_ADAPTERS',
-    '//core/api:onos-api-tests',
-    '//drivers/netconf:onos-drivers-netconf-tests',
-    '//utils/osgi:onlab-osgi-tests',
-    '//apps/cfm/app:onos-apps-cfm-app',
-    '//apps/cfm/app:onos-apps-cfm-app-tests',
-]
-
-APPS = [
-    'org.onosproject.yang',
-#     'org.onosproject.yang-gui',
-    'org.onosproject.config',
-    'org.onosproject.netconf',
-    'org.onosproject.netconfsb',
-    'org.onosproject.drivers.netconf',
-    'org.onosproject.models.common',
-    'org.onosproject.models.microsemi',
-    'org.onosproject.cfm',
-]
-
-osgi_jar_with_tests (
-    deps = COMPILE_DEPS,
-    test_deps = TEST_DEPS,
-    resources_root = 'src/main/resources',
-    resources = glob(['src/main/resources/**']),
-)
-
-onos_app (
-    app_name = 'org.onosproject.drivers.microsemi.ea1000',
-    title = 'Microsemi Drivers EA1000',
-    category = 'Drivers',
-    url = 'http://onosproject.org',
-    description = 'Adds support for Microsemi EA1000 devices.',
-    required_apps = APPS,
-)
diff --git a/drivers/microsemi/ea1000/src/main/java/org/onosproject/drivers/microsemi/EA1000MeterProvider.java b/drivers/microsemi/ea1000/src/main/java/org/onosproject/drivers/microsemi/EA1000MeterProvider.java
index 03405d7..b524345 100644
--- a/drivers/microsemi/ea1000/src/main/java/org/onosproject/drivers/microsemi/EA1000MeterProvider.java
+++ b/drivers/microsemi/ea1000/src/main/java/org/onosproject/drivers/microsemi/EA1000MeterProvider.java
@@ -21,11 +21,11 @@
 
 import java.util.concurrent.atomic.AtomicInteger;
 
-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.onosproject.core.CoreService;
 import org.onosproject.drivers.microsemi.yang.MseaUniEvcServiceNetconfService;
 import org.onosproject.net.DeviceId;
@@ -73,16 +73,16 @@
 
     private final Logger log = getLogger(getClass());
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected NetconfController controller;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected MeterProviderRegistry providerRegistry;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected CoreService coreService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected MseaUniEvcServiceNetconfService mseaUniEvcServiceSvc;
 
     private MeterProviderService providerService;
diff --git a/drivers/microsemi/ea1000/src/main/java/org/onosproject/drivers/microsemi/MicrosemiDriversLoader.java b/drivers/microsemi/ea1000/src/main/java/org/onosproject/drivers/microsemi/MicrosemiDriversLoader.java
index a556765..7499a6d 100644
--- a/drivers/microsemi/ea1000/src/main/java/org/onosproject/drivers/microsemi/MicrosemiDriversLoader.java
+++ b/drivers/microsemi/ea1000/src/main/java/org/onosproject/drivers/microsemi/MicrosemiDriversLoader.java
@@ -15,7 +15,7 @@
  */
 package org.onosproject.drivers.microsemi;
 
-import org.apache.felix.scr.annotations.Component;
+import org.osgi.service.component.annotations.Component;
 import org.onosproject.net.driver.AbstractDriverLoader;
 
 /**
diff --git a/drivers/microsemi/ea1000/src/main/java/org/onosproject/drivers/microsemi/NetconfConfigGetter.java b/drivers/microsemi/ea1000/src/main/java/org/onosproject/drivers/microsemi/NetconfConfigGetter.java
index 039b760..7d937d0 100644
--- a/drivers/microsemi/ea1000/src/main/java/org/onosproject/drivers/microsemi/NetconfConfigGetter.java
+++ b/drivers/microsemi/ea1000/src/main/java/org/onosproject/drivers/microsemi/NetconfConfigGetter.java
@@ -19,8 +19,8 @@
 import static org.onosproject.netconf.DatastoreId.datastore;
 import static org.slf4j.LoggerFactory.getLogger;
 
-import org.apache.felix.scr.annotations.Reference;
-import org.apache.felix.scr.annotations.ReferenceCardinality;
+import org.osgi.service.component.annotations.Reference;
+import org.osgi.service.component.annotations.ReferenceCardinality;
 import org.onosproject.net.DeviceId;
 import org.onosproject.net.behaviour.ConfigGetter;
 import org.onosproject.net.driver.AbstractHandlerBehaviour;
@@ -42,7 +42,7 @@
 
     private final Logger log = getLogger(getClass());
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected PacketService packetService;
 
     private PacketProcessor testProcessor;
diff --git a/drivers/microsemi/ea1000/src/main/java/org/onosproject/drivers/microsemi/yang/impl/AbstractYangServiceImpl.java b/drivers/microsemi/ea1000/src/main/java/org/onosproject/drivers/microsemi/yang/impl/AbstractYangServiceImpl.java
index 074aad4..e61d5e5 100644
--- a/drivers/microsemi/ea1000/src/main/java/org/onosproject/drivers/microsemi/yang/impl/AbstractYangServiceImpl.java
+++ b/drivers/microsemi/ea1000/src/main/java/org/onosproject/drivers/microsemi/yang/impl/AbstractYangServiceImpl.java
@@ -15,21 +15,8 @@
  */
 package org.onosproject.drivers.microsemi.yang.impl;
 
-import java.io.ByteArrayInputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.util.List;
-import java.util.Set;
-import java.util.regex.Pattern;
-
 import com.google.common.base.Charsets;
 import com.google.common.io.ByteSource;
-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.core.ApplicationId;
 import org.onosproject.core.CoreService;
 import org.onosproject.netconf.DatastoreId;
@@ -54,15 +41,26 @@
 import org.onosproject.yang.runtime.YangSerializerContext;
 import org.onosproject.yang.runtime.YangSerializerRegistry;
 import org.onosproject.yang.serializers.xml.XmlSerializer;
+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.io.ByteArrayInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.List;
+import java.util.Set;
+import java.util.regex.Pattern;
+
 /**
  * Abstract class that implements some of the core functions of a YANG model service.
  *
  */
-@Component(immediate = true)
-@Service
+@Component(immediate = true, service = AbstractYangServiceImpl.class)
 public abstract class AbstractYangServiceImpl {
     public static final String NC_OPERATION = "nc:operation";
     public static final String OP_DELETE = "delete";
@@ -70,10 +68,10 @@
     protected final Logger log = LoggerFactory.getLogger(getClass());
     protected boolean alreadyLoaded = false;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected CoreService coreService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected YangModelRegistry yangModelRegistry;
 
     protected ApplicationId appId;
diff --git a/drivers/microsemi/ea1000/src/main/java/org/onosproject/drivers/microsemi/yang/impl/IetfSystemManager.java b/drivers/microsemi/ea1000/src/main/java/org/onosproject/drivers/microsemi/yang/impl/IetfSystemManager.java
index 0411967..16f6be8 100644
--- a/drivers/microsemi/ea1000/src/main/java/org/onosproject/drivers/microsemi/yang/impl/IetfSystemManager.java
+++ b/drivers/microsemi/ea1000/src/main/java/org/onosproject/drivers/microsemi/yang/impl/IetfSystemManager.java
@@ -19,10 +19,9 @@
 import java.time.OffsetDateTime;
 import java.time.format.DateTimeFormatter;
 
-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.osgi.service.component.annotations.Activate;
+import org.osgi.service.component.annotations.Component;
+import org.osgi.service.component.annotations.Deactivate;
 import org.onosproject.drivers.microsemi.yang.IetfSystemNetconfService;
 import org.onosproject.netconf.DatastoreId;
 import org.onosproject.netconf.NetconfException;
@@ -41,8 +40,7 @@
 /**
  * Implementation of the IetfService YANG model service.
  */
-@Component(immediate = true, inherit = true)
-@Service
+@Component(immediate = true, service = AbstractYangServiceImpl.class)
 public class IetfSystemManager extends AbstractYangServiceImpl
     implements IetfSystemNetconfService {
 
diff --git a/drivers/microsemi/ea1000/src/main/java/org/onosproject/drivers/microsemi/yang/impl/MseaCfmManager.java b/drivers/microsemi/ea1000/src/main/java/org/onosproject/drivers/microsemi/yang/impl/MseaCfmManager.java
index ef40928..81581d0 100644
--- a/drivers/microsemi/ea1000/src/main/java/org/onosproject/drivers/microsemi/yang/impl/MseaCfmManager.java
+++ b/drivers/microsemi/ea1000/src/main/java/org/onosproject/drivers/microsemi/yang/impl/MseaCfmManager.java
@@ -15,12 +15,6 @@
  */
 package org.onosproject.drivers.microsemi.yang.impl;
 
-import java.util.ArrayList;
-
-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.onosproject.drivers.microsemi.yang.MseaCfmNetconfService;
 import org.onosproject.incubator.net.l2monitoring.cfm.identifier.MaIdShort;
 import org.onosproject.incubator.net.l2monitoring.cfm.identifier.MdId;
@@ -54,16 +48,19 @@
 import org.onosproject.yang.runtime.DefaultAnnotatedNodeInfo;
 import org.onosproject.yang.runtime.DefaultAnnotation;
 import org.onosproject.yang.runtime.DefaultCompositeStream;
+import org.osgi.service.component.annotations.Activate;
+import org.osgi.service.component.annotations.Component;
+import org.osgi.service.component.annotations.Deactivate;
 
 import java.io.ByteArrayInputStream;
+import java.util.ArrayList;
 import java.util.Optional;
 import java.util.regex.Pattern;
 
 /**
  * Implementation of the MseaCfmServiceNetconf YANG model service.
  */
-@Component(immediate = true, inherit = true)
-@Service
+@Component(immediate = true, service = MseaCfmNetconfService.class)
 public class MseaCfmManager extends AbstractYangServiceImpl
     implements MseaCfmNetconfService {
 
diff --git a/drivers/microsemi/ea1000/src/main/java/org/onosproject/drivers/microsemi/yang/impl/MseaSaFilteringManager.java b/drivers/microsemi/ea1000/src/main/java/org/onosproject/drivers/microsemi/yang/impl/MseaSaFilteringManager.java
index 78c6315..284c732 100644
--- a/drivers/microsemi/ea1000/src/main/java/org/onosproject/drivers/microsemi/yang/impl/MseaSaFilteringManager.java
+++ b/drivers/microsemi/ea1000/src/main/java/org/onosproject/drivers/microsemi/yang/impl/MseaSaFilteringManager.java
@@ -15,10 +15,9 @@
  */
 package org.onosproject.drivers.microsemi.yang.impl;
 
-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.osgi.service.component.annotations.Activate;
+import org.osgi.service.component.annotations.Component;
+import org.osgi.service.component.annotations.Deactivate;
 import org.onosproject.drivers.microsemi.yang.MseaSaFilteringNetconfService;
 import org.onosproject.netconf.DatastoreId;
 import org.onosproject.netconf.NetconfException;
@@ -45,8 +44,7 @@
 /**
  * Implementation of the MseaSaFiltering YANG model service.
  */
-@Component(immediate = true, inherit = true)
-@Service
+@Component(immediate = true, service = AbstractYangServiceImpl.class)
 public class MseaSaFilteringManager extends AbstractYangServiceImpl
     implements MseaSaFilteringNetconfService {
     public static final String MSEA_SA_FILTERING =
diff --git a/drivers/microsemi/ea1000/src/main/java/org/onosproject/drivers/microsemi/yang/impl/MseaUniEvcServiceManager.java b/drivers/microsemi/ea1000/src/main/java/org/onosproject/drivers/microsemi/yang/impl/MseaUniEvcServiceManager.java
index c0cba14..8d2b556 100644
--- a/drivers/microsemi/ea1000/src/main/java/org/onosproject/drivers/microsemi/yang/impl/MseaUniEvcServiceManager.java
+++ b/drivers/microsemi/ea1000/src/main/java/org/onosproject/drivers/microsemi/yang/impl/MseaUniEvcServiceManager.java
@@ -20,10 +20,9 @@
 import java.util.List;
 import java.util.Map;
 
-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.osgi.service.component.annotations.Activate;
+import org.osgi.service.component.annotations.Component;
+import org.osgi.service.component.annotations.Deactivate;
 import org.onosproject.drivers.microsemi.yang.MseaUniEvcServiceNetconfService;
 import org.onosproject.netconf.DatastoreId;
 import org.onosproject.netconf.NetconfException;
@@ -47,8 +46,7 @@
 /**
  * Implementation of the MseaUniEvcServiceService YANG model service.
  */
-@Component(immediate = true, inherit = true)
-@Service
+@Component(immediate = true, service = MseaUniEvcServiceNetconfService.class)
 public class MseaUniEvcServiceManager extends AbstractYangServiceImpl
         implements MseaUniEvcServiceNetconfService {
     public static final String MSEA_UNI_EVC_SVC =
diff --git a/drivers/microsemi/ea1000/src/test/java/org/onosproject/yang/MockYangRuntimeManager.java b/drivers/microsemi/ea1000/src/test/java/org/onosproject/yang/MockYangRuntimeManager.java
index 5cfa3ef..2ed8af3 100644
--- a/drivers/microsemi/ea1000/src/test/java/org/onosproject/yang/MockYangRuntimeManager.java
+++ b/drivers/microsemi/ea1000/src/test/java/org/onosproject/yang/MockYangRuntimeManager.java
@@ -15,10 +15,10 @@
  */
 package org.onosproject.yang;
 
-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.annotations.Activate;
+import org.osgi.service.component.annotations.Deactivate;
+import org.osgi.service.component.annotations.Reference;
+import org.osgi.service.component.annotations.ReferenceCardinality;
 import org.onosproject.core.CoreService;
 import org.onosproject.drivers.netconf.MockCoreService;
 import org.onosproject.yang.model.ModelConverter;
@@ -62,7 +62,7 @@
         private static final String APP_ID = "org.onosproject.yang";
         private final Logger log = LoggerFactory.getLogger(getClass());
 
-        @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+        @Reference(cardinality = ReferenceCardinality.MANDATORY)
         protected CoreService coreService;
 
         private DefaultYangModelRegistry modelRegistry;
diff --git a/drivers/netconf/BUCK b/drivers/netconf/BUCK
deleted file mode 100644
index 560d7b5..0000000
--- a/drivers/netconf/BUCK
+++ /dev/null
@@ -1,33 +0,0 @@
-COMPILE_DEPS = [
-    '//lib:CORE_DEPS',
-    '//drivers/utilities:onos-drivers-utilities',
-    '//protocols/netconf/api:onos-protocols-netconf-api',
-]
-
-TEST_DEPS = [
-    '//lib:TEST_ADAPTERS',
-    '//lib:slf4j-jdk14',
-    '//core/api:onos-api-tests',
-]
-
-BUNDLES = [
-    ':onos-drivers-netconf',
-    '//drivers/utilities:onos-drivers-utilities',
-]
-
-osgi_jar_with_tests (
-    deps = COMPILE_DEPS,
-    test_deps = TEST_DEPS,
-    resources_root = 'src/main/resources',
-    resources = glob(['src/main/resources/**']),
-)
-
-onos_app (
-    app_name = 'org.onosproject.drivers.netconf',
-    title = 'Generic NETCONF Drivers',
-    category = 'Drivers',
-    url = 'http://onosproject.org',
-    description = 'Adds support for devices using NETCONF.',
-    included_bundles = BUNDLES,
-    required_apps = [ 'org.onosproject.netconf' ],
-)
diff --git a/drivers/netconf/features.xml b/drivers/netconf/features.xml
deleted file mode 100644
index 5f2b7c4..0000000
--- a/drivers/netconf/features.xml
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
-
-<!--
-  ~ Copyright 2016-present Open Networking Foundation
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~     http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License.
-  -->
-<features xmlns="http://karaf.apache.org/xmlns/features/v1.2.0" name="${project.artifactId}-${project.version}">
-    <feature name="${project.artifactId}" version="${project.version}"
-             description="${project.description}">
-        <feature>onos-api</feature>
-        <bundle>mvn:${project.groupId}/${project.artifactId}/${project.version}</bundle>
-
-        <bundle>mvn:${project.groupId}/onos-drivers-utilities/${project.version}</bundle>
-
-        <bundle>mvn:${project.groupId}/onos-protocols-netconf-api/${project.version}</bundle>
-    </feature>
-</features>
diff --git a/drivers/netconf/src/main/java/org/onosproject/drivers/netconf/NetconfDriversLoader.java b/drivers/netconf/src/main/java/org/onosproject/drivers/netconf/NetconfDriversLoader.java
index 7c7464a..3ebaa96 100644
--- a/drivers/netconf/src/main/java/org/onosproject/drivers/netconf/NetconfDriversLoader.java
+++ b/drivers/netconf/src/main/java/org/onosproject/drivers/netconf/NetconfDriversLoader.java
@@ -16,7 +16,7 @@
 
 package org.onosproject.drivers.netconf;
 
-import org.apache.felix.scr.annotations.Component;
+import org.osgi.service.component.annotations.Component;
 import org.onosproject.net.driver.AbstractDriverLoader;
 
 /**
diff --git a/drivers/odtn-driver/BUCK b/drivers/odtn-driver/BUCK
deleted file mode 100644
index 86d34bd..0000000
--- a/drivers/odtn-driver/BUCK
+++ /dev/null
@@ -1,42 +0,0 @@
-COMPILE_DEPS = [
-    '//lib:CORE_DEPS',
-    '//drivers/utilities:onos-drivers-utilities',
-    '//protocols/netconf/api:onos-protocols-netconf-api',
-    '//lib:commons-jxpath',
-    '//apps/odtn/api:onos-apps-odtn-api',
-]
-
-TEST_DEPS = [
-    '//lib:TEST_ADAPTERS',
-    '//core/api:onos-api-tests',
-    '//lib:slf4j-jdk14',
-]
-
-BUNDLES = [
-    ':onos-drivers-odtn-driver',
-    '//drivers/utilities:onos-drivers-utilities',
-#     '//lib:commons-jxpath',
-#     '//lib:commons-beanutils', # jxpath dependency
-#     '//lib:jdom',  # jxpath dependency
-]
-
-osgi_jar_with_tests (
-    deps = COMPILE_DEPS,
-    test_deps = TEST_DEPS,
-    resources_root = 'src/main/resources',
-    resources = glob(['src/main/resources/**']),
-)
-
-onos_app (
-    app_name = 'org.onosproject.drivers.odtn-driver',
-    title = 'ODTN Driver',
-    category = 'Drivers',
-    url = 'https://wiki.onosproject.org/display/ODTN/ODTN',
-    description = 'Drivers related to ODTN',
-    included_bundles = BUNDLES,
-    required_apps = [
-        'org.onosproject.netconf',
-        'org.onosproject.config',
-        'org.onosproject.odtn-api',
-    ],
-)
diff --git a/drivers/odtn-driver/BUILD b/drivers/odtn-driver/BUILD
index 28b5474..2ca6cee 100644
--- a/drivers/odtn-driver/BUILD
+++ b/drivers/odtn-driver/BUILD
@@ -13,9 +13,6 @@
 BUNDLES = [
     ":onos-drivers-odtn-driver",
     "//drivers/utilities:onos-drivers-utilities",
-    #     "//lib:commons-jxpath",
-    #     "//lib:commons-beanutils", # jxpath dependency
-    #     "//lib:jdom",  # jxpath dependency
 ]
 
 osgi_jar_with_tests(
diff --git a/drivers/odtn-driver/src/main/java/org/onosproject/drivers/odtn/impl/OdtnDriversLoader.java b/drivers/odtn-driver/src/main/java/org/onosproject/drivers/odtn/impl/OdtnDriversLoader.java
index cf4a2ba..598a450 100644
--- a/drivers/odtn-driver/src/main/java/org/onosproject/drivers/odtn/impl/OdtnDriversLoader.java
+++ b/drivers/odtn-driver/src/main/java/org/onosproject/drivers/odtn/impl/OdtnDriversLoader.java
@@ -15,7 +15,7 @@
  */
 package org.onosproject.drivers.odtn.impl;
 
-import org.apache.felix.scr.annotations.Component;
+import org.osgi.service.component.annotations.Component;
 import org.onosproject.net.driver.AbstractDriverLoader;
 import org.onosproject.odtn.behaviour.ConfigurableTransceiver;
 
diff --git a/drivers/oplink/BUCK b/drivers/oplink/BUCK
deleted file mode 100644
index 43b0826..0000000
--- a/drivers/oplink/BUCK
+++ /dev/null
@@ -1,36 +0,0 @@
-COMPILE_DEPS = [
-    '//lib:CORE_DEPS',
-    '//drivers/default:onos-drivers-default',
-    '//drivers/utilities:onos-drivers-utilities',
-    '//protocols/netconf/api:onos-protocols-netconf-api',
-    '//apps/optical-model:onos-apps-optical-model',
-]
-
-TEST_DEPS = [
-    '//lib:TEST_ADAPTERS',
-    '//core/api:onos-api-tests',
-]
-
-BUNDLES = [
-    ':onos-drivers-oplink',
-    '//drivers/utilities:onos-drivers-utilities',
-]
-
-osgi_jar_with_tests (
-    deps = COMPILE_DEPS,
-    test_deps = TEST_DEPS,
-    resources_root = 'src/main/resources',
-    resources = glob(['src/main/resources/**']),
-)
-
-onos_app(
-    app_name = 'org.onosproject.drivers.oplink',
-    title = 'Oplink Drivers',
-    category = 'Drivers',
-    url = 'http://onosproject.org',
-    description = 'Adds support for Oplink devices.',
-    included_bundles = BUNDLES,
-    required_apps = [
-        'org.onosproject.netconf', 'org.onosproject.optical-model'
-    ],
-)
\ No newline at end of file
diff --git a/drivers/oplink/features.xml b/drivers/oplink/features.xml
deleted file mode 100644
index a716991..0000000
--- a/drivers/oplink/features.xml
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
-
-<!--
-  ~ Copyright 2016 Open Networking Foundation
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~     http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License.
-  -->
-<features xmlns="http://karaf.apache.org/xmlns/features/v1.2.0" name="${project.artifactId}-${project.version}">
-    <feature name="${project.artifactId}" version="${project.version}"
-             description="${project.description}">
-        <feature>onos-api</feature>
-        <bundle>mvn:${project.groupId}/${project.artifactId}/${project.version}</bundle>
-
-        <bundle>mvn:${project.groupId}/onos-drivers-utilities/${project.version}</bundle>
-
-        <bundle>mvn:${project.groupId}/onos-protocols-netconf-api/${project.version}</bundle>
-    </feature>
-</features>
diff --git a/drivers/oplink/src/main/java/org/onosproject/drivers/oplink/OplinkDriversLoader.java b/drivers/oplink/src/main/java/org/onosproject/drivers/oplink/OplinkDriversLoader.java
index 91c5fd4..9f99aab 100644
--- a/drivers/oplink/src/main/java/org/onosproject/drivers/oplink/OplinkDriversLoader.java
+++ b/drivers/oplink/src/main/java/org/onosproject/drivers/oplink/OplinkDriversLoader.java
@@ -16,7 +16,7 @@
 
 package org.onosproject.drivers.oplink;
 
-import org.apache.felix.scr.annotations.Component;
+import org.osgi.service.component.annotations.Component;
 import org.onosproject.net.driver.AbstractDriverLoader;
 import org.onosproject.net.optical.OpticalDevice;
 
diff --git a/drivers/optical/BUCK b/drivers/optical/BUCK
deleted file mode 100644
index f9eef16..0000000
--- a/drivers/optical/BUCK
+++ /dev/null
@@ -1,31 +0,0 @@
-COMPILE_DEPS = [
-    '//lib:CORE_DEPS',
-    '//lib:NETTY',
-    '//lib:JACKSON',
-    '//lib:openflowj',
-    '//protocols/openflow/api:onos-protocols-openflow-api',
-    '//drivers/default:onos-drivers-default',
-    '//apps/optical-model:onos-apps-optical-model',
-]
-
-TEST_DEPS = [
-    '//lib:TEST_ADAPTERS',
-    '//core/api:onos-api-tests',
-    '//utils/osgi:onlab-osgi-tests',
-]
-
-osgi_jar_with_tests (
-    deps = COMPILE_DEPS,
-    test_deps = TEST_DEPS,
-    resources_root = 'src/main/resources',
-    resources = glob(['src/main/resources/**']),
-)
-
-onos_app (
-    app_name = 'org.onosproject.drivers.optical',
-    title = 'Basic Optical Drivers',
-    category = 'Drivers',
-    url = 'http://onosproject.org',
-    description = 'Suite of basic optical device drivers.',
-    required_apps = [ 'org.onosproject.drivers', 'org.onosproject.optical-model' ],
-)
diff --git a/drivers/optical/src/main/java/org/onosproject/driver/optical/flowrule/DefaultCrossConnectCache.java b/drivers/optical/src/main/java/org/onosproject/driver/optical/flowrule/DefaultCrossConnectCache.java
index 77f0ecc..4c561d3 100644
--- a/drivers/optical/src/main/java/org/onosproject/driver/optical/flowrule/DefaultCrossConnectCache.java
+++ b/drivers/optical/src/main/java/org/onosproject/driver/optical/flowrule/DefaultCrossConnectCache.java
@@ -16,9 +16,8 @@
 package org.onosproject.driver.optical.flowrule;
 
 import org.apache.commons.lang3.tuple.Pair;
-import org.apache.felix.scr.annotations.Component;
-import org.apache.felix.scr.annotations.Service;
 import org.onosproject.net.flow.FlowId;
+import org.osgi.service.component.annotations.Component;
 
 import java.util.HashMap;
 import java.util.Map;
@@ -32,8 +31,7 @@
  * for the cache, so do not rely on it to support fail-over in multi-instance deployments.
  * If the instance which holds the cache goes down, you *will* be in trouble.
  */
-@Component(immediate = true, enabled = true)
-@Service
+@Component(immediate = true, service = CrossConnectCache.class)
 public class DefaultCrossConnectCache implements CrossConnectCache {
     private final Map<Integer, Pair<FlowId, Integer>> cache = new HashMap<>();
 
diff --git a/drivers/optical/src/main/java/org/onosproject/drivers/optical/OpticalAdjacencyLinkManager.java b/drivers/optical/src/main/java/org/onosproject/drivers/optical/OpticalAdjacencyLinkManager.java
index 60873f3..d601aa6 100644
--- a/drivers/optical/src/main/java/org/onosproject/drivers/optical/OpticalAdjacencyLinkManager.java
+++ b/drivers/optical/src/main/java/org/onosproject/drivers/optical/OpticalAdjacencyLinkManager.java
@@ -16,12 +16,6 @@
 package org.onosproject.drivers.optical;
 
 import com.google.common.annotations.Beta;
-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.net.ConnectPoint;
 import org.onosproject.net.DeviceId;
 import org.onosproject.net.link.LinkDescription;
@@ -29,6 +23,11 @@
 import org.onosproject.net.link.LinkProviderRegistry;
 import org.onosproject.net.link.LinkProviderService;
 import org.onosproject.net.provider.ProviderId;
+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 static org.slf4j.LoggerFactory.getLogger;
@@ -41,8 +40,7 @@
  * Registers a dummy LinkProvider to get an instance of LinkProviderService.
  */
 @Beta
-@Component(immediate = true)
-@Service
+@Component(immediate = true, service = OpticalAdjacencyLinkService.class)
 public class OpticalAdjacencyLinkManager implements OpticalAdjacencyLinkService {
 
     private static final ProviderId PID =
@@ -53,7 +51,7 @@
     private LinkProvider linkProvider = new StubLinkProvider();
     private LinkProviderService linkProviderService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected LinkProviderRegistry linkProviderRegistry;
 
     @Activate
diff --git a/drivers/optical/src/main/java/org/onosproject/drivers/optical/OpticalDriversLoader.java b/drivers/optical/src/main/java/org/onosproject/drivers/optical/OpticalDriversLoader.java
index f532dc9..b0d7487 100644
--- a/drivers/optical/src/main/java/org/onosproject/drivers/optical/OpticalDriversLoader.java
+++ b/drivers/optical/src/main/java/org/onosproject/drivers/optical/OpticalDriversLoader.java
@@ -20,11 +20,11 @@
 import static org.onosproject.net.config.basics.SubjectFactories.DEVICE_SUBJECT_FACTORY;
 
 import java.util.List;
-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.onosproject.driver.optical.config.FlowTableConfig;
 import org.onosproject.driver.optical.config.LambdaConfig;
 import org.onosproject.net.ConnectPoint;
@@ -47,7 +47,7 @@
     @SuppressWarnings("unused")
     private OpticalDevice optical;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected NetworkConfigRegistry registry = new NetworkConfigRegistryAdapter();
 
     private final List<ConfigFactory> factories = ImmutableList.of(
diff --git a/drivers/ovsdb/BUCK b/drivers/ovsdb/BUCK
deleted file mode 100644
index 3446bd2..0000000
--- a/drivers/ovsdb/BUCK
+++ /dev/null
@@ -1,27 +0,0 @@
-COMPILE_DEPS = [
-    '//lib:CORE_DEPS',
-    '//drivers/utilities:onos-drivers-utilities',
-    '//protocols/ovsdb/api:onos-protocols-ovsdb-api',
-    '//protocols/ovsdb/rfc:onos-protocols-ovsdb-rfc',
-]
-
-TEST_DEPS = [
-    '//lib:TEST_ADAPTERS',
-    '//protocols/ovsdb/api:onos-protocols-ovsdb-api-tests',
-]
-
-osgi_jar_with_tests (
-    deps = COMPILE_DEPS,
-    test_deps = TEST_DEPS,
-    resources_root = 'src/main/resources',
-    resources = glob(['src/main/resources/**']),
-)
-
-onos_app (
-    app_name = 'org.onosproject.drivers.ovsdb',
-    title = 'Generic OVSDB Drivers',
-    category = 'Drivers',
-    url = 'http://onosproject.org',
-    description = 'Adds support for devices using OVSDB.',
-    required_apps = [ 'org.onosproject.ovsdb-base' ],
-)
diff --git a/drivers/ovsdb/features.xml b/drivers/ovsdb/features.xml
deleted file mode 100644
index ea1932d..0000000
--- a/drivers/ovsdb/features.xml
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
-
-<!--
-  ~ Copyright 2016-present Open Networking Foundation
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~     http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License.
-  -->
-
-<features xmlns="http://karaf.apache.org/xmlns/features/v1.2.0" name="${project.artifactId}-${project.version}">
-    <feature name="${project.artifactId}" version="${project.version}"
-             description="${project.description}">
-        <feature>onos-api</feature>
-        <bundle>mvn:${project.groupId}/${project.artifactId}/${project.version}</bundle>
-
-        <bundle>mvn:${project.groupId}/onos-protocols-ovsdb-api/${project.version}</bundle>
-        <bundle>mvn:${project.groupId}/onos-ovsdb-rfc/${project.version}</bundle>
-    </feature>
-</features>
diff --git a/drivers/ovsdb/src/main/java/org/onosproject/drivers/ovsdb/OvsdbDriversLoader.java b/drivers/ovsdb/src/main/java/org/onosproject/drivers/ovsdb/OvsdbDriversLoader.java
index 8a7a2b6..6e545cc 100644
--- a/drivers/ovsdb/src/main/java/org/onosproject/drivers/ovsdb/OvsdbDriversLoader.java
+++ b/drivers/ovsdb/src/main/java/org/onosproject/drivers/ovsdb/OvsdbDriversLoader.java
@@ -16,7 +16,7 @@
 
 package org.onosproject.drivers.ovsdb;
 
-import org.apache.felix.scr.annotations.Component;
+import org.osgi.service.component.annotations.Component;
 import org.onosproject.net.driver.AbstractDriverLoader;
 
 /**
diff --git a/drivers/p4runtime/BUCK b/drivers/p4runtime/BUCK
deleted file mode 100644
index ea135ef..0000000
--- a/drivers/p4runtime/BUCK
+++ /dev/null
@@ -1,32 +0,0 @@
-GRPC_VER = '1.3.1'
-
-COMPILE_DEPS = [
-    '//lib:CORE_DEPS',
-    '//lib:KRYO',
-    '//protocols/p4runtime/api:onos-protocols-p4runtime-api',
-    '//incubator/grpc-dependencies:grpc-core-repkg-' + GRPC_VER,
-    '//core/store/serializers:onos-core-serializers',
-]
-
-BUNDLES = [
-    ':onos-drivers-p4runtime',
-]
-
-osgi_jar (
-    deps = COMPILE_DEPS,
-)
-
-onos_app (
-    app_name = 'org.onosproject.drivers.p4runtime',
-    title = 'P4Runtime Drivers',
-    category = 'Drivers',
-    url = 'http://onosproject.org',
-    description = 'Adds support for devices using P4 Runtime protocol.',
-    included_bundles = BUNDLES,
-    required_apps = [
-        'org.onosproject.generaldeviceprovider',
-        'org.onosproject.protocols.p4runtime',
-        'org.onosproject.p4runtime',
-        'org.onosproject.drivers',
-    ],
-)
diff --git a/drivers/p4runtime/features.xml b/drivers/p4runtime/features.xml
deleted file mode 100644
index 448f07a..0000000
--- a/drivers/p4runtime/features.xml
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
-<!--
-  ~ Copyright 2017-present Open Networking Foundation
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~     http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License.
-  -->
-<features xmlns="http://karaf.apache.org/xmlns/features/v1.2.0" name="${project.artifactId}-${project.version}">
-    <feature name="${project.artifactId}" version="${project.version}"
-             description="${project.description}">
-        <feature>onos-api</feature>
-        <bundle>mvn:${project.groupId}/${project.artifactId}/${project.version}</bundle>
-
-    </feature>
-</features>
diff --git a/drivers/p4runtime/src/main/java/org/onosproject/drivers/p4runtime/P4RuntimeDriversLoader.java b/drivers/p4runtime/src/main/java/org/onosproject/drivers/p4runtime/P4RuntimeDriversLoader.java
index c8717ac..2600c6c 100644
--- a/drivers/p4runtime/src/main/java/org/onosproject/drivers/p4runtime/P4RuntimeDriversLoader.java
+++ b/drivers/p4runtime/src/main/java/org/onosproject/drivers/p4runtime/P4RuntimeDriversLoader.java
@@ -16,7 +16,7 @@
 
 package org.onosproject.drivers.p4runtime;
 
-import org.apache.felix.scr.annotations.Component;
+import org.osgi.service.component.annotations.Component;
 import org.onosproject.net.driver.AbstractDriverLoader;
 
 /**
diff --git a/drivers/p4runtime/src/main/java/org/onosproject/drivers/p4runtime/mirror/AbstractDistributedP4RuntimeMirror.java b/drivers/p4runtime/src/main/java/org/onosproject/drivers/p4runtime/mirror/AbstractDistributedP4RuntimeMirror.java
index fc982be..b98e7ec 100644
--- a/drivers/p4runtime/src/main/java/org/onosproject/drivers/p4runtime/mirror/AbstractDistributedP4RuntimeMirror.java
+++ b/drivers/p4runtime/src/main/java/org/onosproject/drivers/p4runtime/mirror/AbstractDistributedP4RuntimeMirror.java
@@ -18,11 +18,12 @@
 
 import com.google.common.annotations.Beta;
 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.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.util.KryoNamespace;
 import org.onlab.util.SharedExecutors;
 import org.onosproject.net.Annotations;
@@ -62,10 +63,10 @@
 
     private final Logger log = getLogger(getClass());
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     private StorageService storageService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     private PiPipeconfWatchdogService pipeconfWatchdogService;
 
     private EventuallyConsistentMap<H, TimedEntry<E>> mirrorMap;
diff --git a/drivers/p4runtime/src/main/java/org/onosproject/drivers/p4runtime/mirror/DistributedP4RuntimeActionProfileMemberMirror.java b/drivers/p4runtime/src/main/java/org/onosproject/drivers/p4runtime/mirror/DistributedP4RuntimeActionProfileMemberMirror.java
index 83edba4..1ca29c1 100644
--- a/drivers/p4runtime/src/main/java/org/onosproject/drivers/p4runtime/mirror/DistributedP4RuntimeActionProfileMemberMirror.java
+++ b/drivers/p4runtime/src/main/java/org/onosproject/drivers/p4runtime/mirror/DistributedP4RuntimeActionProfileMemberMirror.java
@@ -16,18 +16,16 @@
 
 package org.onosproject.drivers.p4runtime.mirror;
 
-import org.apache.felix.scr.annotations.Component;
-import org.apache.felix.scr.annotations.Service;
 import org.onlab.util.KryoNamespace;
 import org.onosproject.net.pi.runtime.PiActionGroupMember;
 import org.onosproject.net.pi.runtime.PiActionGroupMemberHandle;
 import org.onosproject.store.serializers.KryoNamespaces;
+import org.osgi.service.component.annotations.Component;
 
 /**
  * Distributed implementation of a P4Runtime action profile member mirror.
  */
-@Component(immediate = true)
-@Service
+@Component(immediate = true, service = AbstractDistributedP4RuntimeMirror.class)
 public class DistributedP4RuntimeActionProfileMemberMirror
         extends AbstractDistributedP4RuntimeMirror
         <PiActionGroupMemberHandle, PiActionGroupMember>
diff --git a/drivers/p4runtime/src/main/java/org/onosproject/drivers/p4runtime/mirror/DistributedP4RuntimeGroupMirror.java b/drivers/p4runtime/src/main/java/org/onosproject/drivers/p4runtime/mirror/DistributedP4RuntimeGroupMirror.java
index 4c963a6..e07f417 100644
--- a/drivers/p4runtime/src/main/java/org/onosproject/drivers/p4runtime/mirror/DistributedP4RuntimeGroupMirror.java
+++ b/drivers/p4runtime/src/main/java/org/onosproject/drivers/p4runtime/mirror/DistributedP4RuntimeGroupMirror.java
@@ -16,18 +16,16 @@
 
 package org.onosproject.drivers.p4runtime.mirror;
 
-import org.apache.felix.scr.annotations.Component;
-import org.apache.felix.scr.annotations.Service;
 import org.onlab.util.KryoNamespace;
 import org.onosproject.net.pi.runtime.PiActionGroup;
 import org.onosproject.net.pi.runtime.PiActionGroupHandle;
 import org.onosproject.store.serializers.KryoNamespaces;
+import org.osgi.service.component.annotations.Component;
 
 /**
  * Distributed implementation of a P4Runtime group mirror.
  */
-@Component(immediate = true)
-@Service
+@Component(immediate = true, service = P4RuntimeGroupMirror.class)
 public final class DistributedP4RuntimeGroupMirror
         extends AbstractDistributedP4RuntimeMirror
                         <PiActionGroupHandle, PiActionGroup>
diff --git a/drivers/p4runtime/src/main/java/org/onosproject/drivers/p4runtime/mirror/DistributedP4RuntimeMeterMirror.java b/drivers/p4runtime/src/main/java/org/onosproject/drivers/p4runtime/mirror/DistributedP4RuntimeMeterMirror.java
index f5c1778..bf36274 100644
--- a/drivers/p4runtime/src/main/java/org/onosproject/drivers/p4runtime/mirror/DistributedP4RuntimeMeterMirror.java
+++ b/drivers/p4runtime/src/main/java/org/onosproject/drivers/p4runtime/mirror/DistributedP4RuntimeMeterMirror.java
@@ -16,18 +16,16 @@
 
 package org.onosproject.drivers.p4runtime.mirror;
 
-import org.apache.felix.scr.annotations.Component;
-import org.apache.felix.scr.annotations.Service;
 import org.onlab.util.KryoNamespace;
-import org.onosproject.net.pi.runtime.PiMeterHandle;
 import org.onosproject.net.pi.runtime.PiMeterCellConfig;
+import org.onosproject.net.pi.runtime.PiMeterHandle;
 import org.onosproject.store.serializers.KryoNamespaces;
+import org.osgi.service.component.annotations.Component;
 
 /**
  * Distributed implementation of a P4Runtime meter mirror.
  */
-@Component(immediate = true)
-@Service
+@Component(immediate = true, service = P4RuntimeMeterMirror.class)
 public final class DistributedP4RuntimeMeterMirror
         extends AbstractDistributedP4RuntimeMirror
         <PiMeterHandle, PiMeterCellConfig>
diff --git a/drivers/p4runtime/src/main/java/org/onosproject/drivers/p4runtime/mirror/DistributedP4RuntimeMulticastGroupMirror.java b/drivers/p4runtime/src/main/java/org/onosproject/drivers/p4runtime/mirror/DistributedP4RuntimeMulticastGroupMirror.java
index 4cfe0c5..83c23d8 100644
--- a/drivers/p4runtime/src/main/java/org/onosproject/drivers/p4runtime/mirror/DistributedP4RuntimeMulticastGroupMirror.java
+++ b/drivers/p4runtime/src/main/java/org/onosproject/drivers/p4runtime/mirror/DistributedP4RuntimeMulticastGroupMirror.java
@@ -16,18 +16,16 @@
 
 package org.onosproject.drivers.p4runtime.mirror;
 
-import org.apache.felix.scr.annotations.Component;
-import org.apache.felix.scr.annotations.Service;
 import org.onlab.util.KryoNamespace;
 import org.onosproject.net.pi.runtime.PiMulticastGroupEntry;
 import org.onosproject.net.pi.runtime.PiMulticastGroupEntryHandle;
 import org.onosproject.store.serializers.KryoNamespaces;
+import org.osgi.service.component.annotations.Component;
 
 /**
  * Distributed implementation of a P4Runtime multicast group mirror.
  */
-@Component(immediate = true)
-@Service
+@Component(immediate = true, service = P4RuntimeMulticastGroupMirror.class)
 public final class DistributedP4RuntimeMulticastGroupMirror
         extends AbstractDistributedP4RuntimeMirror
                         <PiMulticastGroupEntryHandle, PiMulticastGroupEntry>
diff --git a/drivers/p4runtime/src/main/java/org/onosproject/drivers/p4runtime/mirror/DistributedP4RuntimeTableMirror.java b/drivers/p4runtime/src/main/java/org/onosproject/drivers/p4runtime/mirror/DistributedP4RuntimeTableMirror.java
index f37cf44..320b3da 100644
--- a/drivers/p4runtime/src/main/java/org/onosproject/drivers/p4runtime/mirror/DistributedP4RuntimeTableMirror.java
+++ b/drivers/p4runtime/src/main/java/org/onosproject/drivers/p4runtime/mirror/DistributedP4RuntimeTableMirror.java
@@ -16,18 +16,16 @@
 
 package org.onosproject.drivers.p4runtime.mirror;
 
-import org.apache.felix.scr.annotations.Component;
-import org.apache.felix.scr.annotations.Service;
 import org.onlab.util.KryoNamespace;
 import org.onosproject.net.pi.runtime.PiTableEntry;
 import org.onosproject.net.pi.runtime.PiTableEntryHandle;
 import org.onosproject.store.serializers.KryoNamespaces;
+import org.osgi.service.component.annotations.Component;
 
 /**
  * Distributed implementation of a P4Runtime table mirror.
  */
-@Component(immediate = true)
-@Service
+@Component(immediate = true, service = P4RuntimeTableMirror.class)
 public final class DistributedP4RuntimeTableMirror
         extends AbstractDistributedP4RuntimeMirror
                         <PiTableEntryHandle, PiTableEntry>
diff --git a/drivers/polatis/netconf/BUCK b/drivers/polatis/netconf/BUCK
deleted file mode 100644
index 061ae0d..0000000
--- a/drivers/polatis/netconf/BUCK
+++ /dev/null
@@ -1,44 +0,0 @@
-COMPILE_DEPS = [
-    '//lib:CORE_DEPS',
-    '//models/polatis:onos-models-polatis',
-    '//drivers/utilities:onos-drivers-utilities',
-    '//protocols/netconf/api:onos-protocols-netconf-api',
-    '//lib:onos-yang-model',
-    '//apps/optical-model:onos-apps-optical-model',
-    '//incubator/api:onos-incubator-api',
-]
-
-APPS = [
-    'org.onosproject.netconf',
-    'org.onosproject.models.common',
-    'org.onosproject.models.polatis',
-    'org.onosproject.optical-model',
-    'org.onosproject.faultmanagement',
-]
-
-TEST_DEPS = [
-    '//lib:TEST_ADAPTERS',
-    '//utils/osgi:onlab-osgi-tests',
-]
-
-BUNDLES = [
-    ':onos-drivers-polatis-netconf',
-    '//drivers/utilities:onos-drivers-utilities',
-]
-
-osgi_jar_with_tests(
-    deps = COMPILE_DEPS,
-    test_deps = TEST_DEPS,
-    resources_root = 'src/main/resources',
-    resources = glob(['src/main/resources/**']),
-)
-
-onos_app(
-    app_name = 'org.onosproject.drivers.polatis.netconf',
-    title = 'Polatis Device Drivers',
-    category = 'Drivers',
-    url = 'http://www.polatis.com',
-    description = 'ONOS Polatis Device Drivers application.',
-    included_bundles = BUNDLES,
-    required_apps = APPS
-)
diff --git a/drivers/polatis/netconf/src/main/java/org/onosproject/drivers/polatis/netconf/PolatisDriversLoader.java b/drivers/polatis/netconf/src/main/java/org/onosproject/drivers/polatis/netconf/PolatisDriversLoader.java
index a5cb3f3..2483aaf 100644
--- a/drivers/polatis/netconf/src/main/java/org/onosproject/drivers/polatis/netconf/PolatisDriversLoader.java
+++ b/drivers/polatis/netconf/src/main/java/org/onosproject/drivers/polatis/netconf/PolatisDriversLoader.java
@@ -18,11 +18,11 @@
 
 import com.google.common.collect.ImmutableList;
 
-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.onosproject.net.driver.AbstractDriverLoader;
 import org.onosproject.net.optical.OpticalDevice;
 import org.onosproject.ui.UiGlyph;
@@ -39,7 +39,7 @@
     @SuppressWarnings("unused")
     private OpticalDevice optical;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected UiExtensionService uiExtensionService;
 
     private UiGlyphFactory glyphFactory =
diff --git a/drivers/polatis/openflow/BUCK b/drivers/polatis/openflow/BUCK
deleted file mode 100644
index 704ad3d..0000000
--- a/drivers/polatis/openflow/BUCK
+++ /dev/null
@@ -1,34 +0,0 @@
-COMPILE_DEPS = [
-    '//lib:CORE_DEPS',
-    '//lib:openflowj',
-    '//protocols/openflow/api:onos-protocols-openflow-api',
-    '//apps/optical-model:onos-apps-optical-model',
-]
-
-APPS = [
-    'org.onosproject.drivers.optical',
-    'org.onosproject.optical-model',
-]
-
-TEST_DEPS = [
-    '//lib:TEST_ADAPTERS',
-    '//core/api:onos-api-tests',
-    '//utils/osgi:onlab-osgi-tests',
-]
-
-osgi_jar_with_tests (
-    deps = COMPILE_DEPS,
-    test_deps = TEST_DEPS,
-    resources_root = 'src/main/resources',
-    resources = glob(['src/main/resources/**']),
-)
-
-onos_app (
-    app_name = 'org.onosproject.drivers.polatis.openflow',
-    title = 'Polatis OpenFlow Device Drivers',
-    category = 'Drivers',
-    url = 'http://www.polatis.com',
-    description = 'ONOS Polatis OpenFlow Device Drivers application.',
-    required_apps = APPS
-)
-
diff --git a/drivers/polatis/openflow/src/main/java/org/onosproject/drivers/polatis/openflow/PolatisDriversLoader.java b/drivers/polatis/openflow/src/main/java/org/onosproject/drivers/polatis/openflow/PolatisDriversLoader.java
index f484e5d..20775d0 100644
--- a/drivers/polatis/openflow/src/main/java/org/onosproject/drivers/polatis/openflow/PolatisDriversLoader.java
+++ b/drivers/polatis/openflow/src/main/java/org/onosproject/drivers/polatis/openflow/PolatisDriversLoader.java
@@ -16,11 +16,11 @@
 
 package org.onosproject.drivers.polatis.openflow;
 
-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.onosproject.net.driver.AbstractDriverLoader;
 import org.onosproject.net.optical.OpticalDevice;
 import org.onosproject.ui.UiGlyph;
@@ -39,7 +39,7 @@
     @SuppressWarnings("unused")
     private OpticalDevice optical;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected UiExtensionService uiExtensionService;
 
     private UiGlyphFactory glyphFactory =
diff --git a/drivers/polatis/snmp/BUCK b/drivers/polatis/snmp/BUCK
deleted file mode 100644
index 5ff6cdf..0000000
--- a/drivers/polatis/snmp/BUCK
+++ /dev/null
@@ -1,35 +0,0 @@
-COMPILE_DEPS = [
-    '//lib:CORE_DEPS',
-    '//lib:org.apache.servicemix.bundles.snmp4j',
-    '//drivers/utilities:onos-drivers-utilities',
-    '//protocols/snmp/api:onos-protocols-snmp-api',
-    '//apps/optical-model:onos-apps-optical-model',
-    '//incubator/api:onos-incubator-api',
-]
-
-APPS = [
-    'org.onosproject.snmp',
-    'org.onosproject.optical-model',
-    'org.onosproject.faultmanagement',
-]
-
-TEST_DEPS = [
-    '//lib:TEST_ADAPTERS',
-    '//core/api:onos-api-tests',
-]
-
-osgi_jar_with_tests(
-    deps = COMPILE_DEPS,
-    test_deps = TEST_DEPS,
-    resources_root = 'src/main/resources',
-    resources = glob(['src/main/resources/**']),
-)
-
-onos_app(
-    app_name = 'org.onosproject.drivers.polatis.snmp',
-    title = 'Polatis SNMP Device Drivers',
-    category = 'Drivers',
-    url = 'http://www.polatis.com',
-    description = 'ONOS Polatis SNMP Device Drivers application.',
-    required_apps = APPS
-)
diff --git a/drivers/polatis/snmp/src/main/java/org/onosproject/drivers/polatis/snmp/PolatisDriversLoader.java b/drivers/polatis/snmp/src/main/java/org/onosproject/drivers/polatis/snmp/PolatisDriversLoader.java
index df63dc3..80528fa 100644
--- a/drivers/polatis/snmp/src/main/java/org/onosproject/drivers/polatis/snmp/PolatisDriversLoader.java
+++ b/drivers/polatis/snmp/src/main/java/org/onosproject/drivers/polatis/snmp/PolatisDriversLoader.java
@@ -16,11 +16,11 @@
 
 package org.onosproject.drivers.polatis.snmp;
 
-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.onosproject.net.driver.AbstractDriverLoader;
 import org.onosproject.net.optical.OpticalDevice;
 import org.onosproject.ui.UiGlyph;
@@ -39,7 +39,7 @@
     @SuppressWarnings("unused")
     private OpticalDevice optical;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected UiExtensionService uiExtensionService;
 
     private UiGlyphFactory glyphFactory =
diff --git a/drivers/server/BUCK b/drivers/server/BUCK
deleted file mode 100644
index cfb6acd..0000000
--- a/drivers/server/BUCK
+++ /dev/null
@@ -1,40 +0,0 @@
-COMPILE_DEPS = [
-    '//lib:CORE_DEPS',
-    '//lib:JACKSON',
-    '//lib:javax.ws.rs-api',
-    '//lib:joda-time',
-    '//incubator/api:onos-incubator-api',
-    '//utils/rest:onlab-rest',
-    '//protocols/rest/api:onos-protocols-rest-api',
-]
-
-TEST_DEPS = [
-    '//lib:TEST_ADAPTERS',
-    '//core/api:onos-api-tests',
-]
-
-BUNDLES = [
-    ':onos-drivers-server',
-]
-
-REQUIRED_APPS = [
-    'org.onosproject.restsb',
-]
-
-osgi_jar_with_tests (
-    deps = COMPILE_DEPS,
-    test_deps = TEST_DEPS,
-    resources_root = 'src/main/resources',
-    resources = glob(['src/main/resources/**']),
-)
-
-onos_app (
-    app_name = 'org.onosproject.drivers.server',
-    title = 'Server Device Drivers',
-    category = 'Drivers',
-    origin = 'KTH Royal Institute of Technology &amp; RISE SICS',
-    url = 'https://github.com/gkatsikas/onos/tree/metron-driver',
-    description = 'ONOS southbound drivers for commodity servers',
-    included_bundles = BUNDLES,
-    required_apps = REQUIRED_APPS,
-)
diff --git a/drivers/server/src/main/java/org/onosproject/drivers/server/ServerDriversLoader.java b/drivers/server/src/main/java/org/onosproject/drivers/server/ServerDriversLoader.java
index cb5cc4f..33e9e5b 100644
--- a/drivers/server/src/main/java/org/onosproject/drivers/server/ServerDriversLoader.java
+++ b/drivers/server/src/main/java/org/onosproject/drivers/server/ServerDriversLoader.java
@@ -16,7 +16,7 @@
 
 package org.onosproject.drivers.server;
 
-import org.apache.felix.scr.annotations.Component;
+import org.osgi.service.component.annotations.Component;
 import org.onosproject.net.driver.AbstractDriverLoader;
 
 /**
diff --git a/drivers/server/src/main/java/org/onosproject/drivers/server/gui/CpuUI.java b/drivers/server/src/main/java/org/onosproject/drivers/server/gui/CpuUI.java
index 31fc57a..915a993 100644
--- a/drivers/server/src/main/java/org/onosproject/drivers/server/gui/CpuUI.java
+++ b/drivers/server/src/main/java/org/onosproject/drivers/server/gui/CpuUI.java
@@ -16,32 +16,28 @@
 
 package org.onosproject.drivers.server.gui;
 
+import com.google.common.collect.ImmutableList;
 import org.onosproject.ui.UiExtension;
 import org.onosproject.ui.UiExtensionService;
 import org.onosproject.ui.UiMessageHandlerFactory;
 import org.onosproject.ui.UiView;
-
-import com.google.common.collect.ImmutableList;
-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.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.util.List;
 
-import static org.onosproject.ui.UiView.Category.NETWORK;
 import static org.onosproject.ui.GlyphConstants.ENDSTATION;
+import static org.onosproject.ui.UiView.Category.NETWORK;
 
 /**
  * Mechanism to stream CPU data to the GUI.
  */
-@Component(immediate = true, enabled = true)
-@Service(value = CpuUI.class)
+@Component(immediate = true, service = CpuUI.class)
 public class CpuUI {
 
     private final Logger log = LoggerFactory.getLogger(getClass());
@@ -73,7 +69,7 @@
     /**
      * Interact with ONOS.
      */
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected UiExtensionService uiExtensionService;
 
     @Activate
diff --git a/drivers/server/src/main/java/org/onosproject/drivers/server/gui/LatencyUI.java b/drivers/server/src/main/java/org/onosproject/drivers/server/gui/LatencyUI.java
index 9b8c864..e71099e 100644
--- a/drivers/server/src/main/java/org/onosproject/drivers/server/gui/LatencyUI.java
+++ b/drivers/server/src/main/java/org/onosproject/drivers/server/gui/LatencyUI.java
@@ -22,13 +22,12 @@
 import org.onosproject.ui.UiView;
 
 import com.google.common.collect.ImmutableList;
-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.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;
 
@@ -40,8 +39,7 @@
 /**
  * Mechanism to stream latency data to the GUI.
  */
-@Component(immediate = true, enabled = true)
-@Service(value = LatencyUI.class)
+@Component(immediate = true, service = LatencyUI.class)
 public class LatencyUI {
 
     private final Logger log = LoggerFactory.getLogger(getClass());
@@ -73,7 +71,7 @@
     /**
      * Interact with ONOS.
      */
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected UiExtensionService uiExtensionService;
 
     @Activate
diff --git a/drivers/server/src/main/java/org/onosproject/drivers/server/gui/ThroughputUI.java b/drivers/server/src/main/java/org/onosproject/drivers/server/gui/ThroughputUI.java
index 9820051..c41a74a 100644
--- a/drivers/server/src/main/java/org/onosproject/drivers/server/gui/ThroughputUI.java
+++ b/drivers/server/src/main/java/org/onosproject/drivers/server/gui/ThroughputUI.java
@@ -22,13 +22,12 @@
 import org.onosproject.ui.UiView;
 
 import com.google.common.collect.ImmutableList;
-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.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;
 
@@ -40,8 +39,7 @@
 /**
  * Mechanism to stream throughput data to the GUI.
  */
-@Component(immediate = true, enabled = true)
-@Service(value = ThroughputUI.class)
+@Component(immediate = true, service = ThroughputUI.class)
 public class ThroughputUI {
 
     private final Logger log = LoggerFactory.getLogger(getClass());
@@ -73,7 +71,7 @@
     /**
      * Interact with ONOS.
      */
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected UiExtensionService uiExtensionService;
 
     @Activate
diff --git a/drivers/utilities/BUCK b/drivers/utilities/BUCK
deleted file mode 100644
index 731ad13..0000000
--- a/drivers/utilities/BUCK
+++ /dev/null
@@ -1,11 +0,0 @@
-COMPILE_DEPS = [
-    '//lib:CORE_DEPS',
-    '//core/net:onos-core-net',
-]
-
-osgi_jar_with_tests (
-    deps = COMPILE_DEPS,
-    resources_root = 'src/main/resources',
-    resources = glob(['src/main/resources/**']),
-)
-
diff --git a/drivers/utilities/BUILD b/drivers/utilities/BUILD
index 88b7c32..a3d550e 100644
--- a/drivers/utilities/BUILD
+++ b/drivers/utilities/BUILD
@@ -1,4 +1,4 @@
-COMPILE_DEPS = CORE_DEPS
+COMPILE_DEPS = CORE_DEPS + JAXB
 
 osgi_jar_with_tests(
     resources = glob(["src/main/resources/**"]),
diff --git a/drivers/utilities/features.xml b/drivers/utilities/features.xml
deleted file mode 100644
index 9c81ada..0000000
--- a/drivers/utilities/features.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
-
-<!--
-  ~ Copyright 2016-present Open Networking Foundation
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~     http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License.
-  -->
-
-<features xmlns="http://karaf.apache.org/xmlns/features/v1.2.0" name="${project.artifactId}-${project.version}">
-    <feature name="${project.artifactId}" version="${project.version}"
-             description="${project.description}">
-        <feature>onos-api</feature>
-        <bundle>mvn:${project.groupId}/${project.artifactId}/${project.version}</bundle>
-    </feature>
-</features>
diff --git a/drivers/utilities/src/test/java/org/onosproject/drivers/utilities/YangXmlUtilsTest.java b/drivers/utilities/src/test/java/org/onosproject/drivers/utilities/YangXmlUtilsTest.java
index f7d898e..7668684 100644
--- a/drivers/utilities/src/test/java/org/onosproject/drivers/utilities/YangXmlUtilsTest.java
+++ b/drivers/utilities/src/test/java/org/onosproject/drivers/utilities/YangXmlUtilsTest.java
@@ -66,6 +66,18 @@
 
     }
 
+    private String canonicalXml(String s) {
+        String[] lines = s.split("\n");
+        StringBuilder xml = new StringBuilder();
+        for (String line : lines) {
+            if (line.contains("<")) {
+                xml.append(line);
+                xml.append("\n");
+            }
+        }
+        return xml.toString().trim();
+    }
+
     /**
      * Tests getting a single object configuration via passing the path and the map of the desired values.
      *
@@ -85,8 +97,8 @@
         assertEquals("Wrong configuaration", IteratorUtils.toList(testCreateConfig.getKeys()),
                      IteratorUtils.toList(cfg.getKeys()));
 
-        assertEquals("Wrong string configuaration", utils.getString(testCreateConfig),
-                     utils.getString(cfg));
+        assertEquals("Wrong string configuaration", canonicalXml(utils.getString(testCreateConfig)),
+                     canonicalXml(utils.getString(cfg)));
     }
 
     /**
@@ -115,8 +127,8 @@
                                              .getXmlConfiguration(OF_CONFIG_XML_PATH, elements));
         assertEquals("Wrong configuaration", IteratorUtils.toList(testCreateConfig.getKeys()),
                      IteratorUtils.toList(cfg.getKeys()));
-        assertEquals("Wrong string configuaration", utils.getString(testCreateConfig),
-                     utils.getString(cfg));
+        assertEquals("Wrong string configuaration", canonicalXml(utils.getString(testCreateConfig)),
+                     canonicalXml(utils.getString(cfg)));
     }
 
     /**
diff --git a/incubator/api/BUCK b/incubator/api/BUCK
deleted file mode 100644
index eb7b036..0000000
--- a/incubator/api/BUCK
+++ /dev/null
@@ -1,15 +0,0 @@
-COMPILE_DEPS = [
-    '//lib:CORE_DEPS',
-    '//lib:JACKSON',
-]
-
-TEST_DEPS = [
-    '//lib:TEST_ADAPTERS',
-]
-
-osgi_jar_with_tests (
-    name = 'onos-incubator-api',
-    deps = COMPILE_DEPS,
-    test_deps = TEST_DEPS,
-    visibility = ['PUBLIC'],
-)
diff --git a/incubator/grpc-dependencies/BUCK b/incubator/grpc-dependencies/BUCK
deleted file mode 100644
index 99d74cc..0000000
--- a/incubator/grpc-dependencies/BUCK
+++ /dev/null
@@ -1,41 +0,0 @@
-include_defs('//bucklets/grpc.bucklet')
-
-fetch_grpc_plugin(version = '1.3.1')
-
-# Repackaging of gRPC 1.3.* to solve the OSGI split package issue.
-# If bumping the gRPC version, please write a new rule.
-
-def grpc_core_repkg_131():
-    repkg_deps = [
-        '//lib:COMPILE',
-        '//lib:google-instrumentation-0.3.0',
-        '//lib:google-errorprone-2.0.19'
-    ]
-    remote_file(
-        name = "grpc-src-zip-131",
-        url = "https://github.com/grpc/grpc-java/archive/v1.3.1.zip",
-        sha1 = "03dc21440fdfa920aa0e905da17df35b0d6c9a44",
-    )
-    srcs = []
-    for pkg in ['core', 'context']:
-        name = 'grpc-' + pkg + '-130'
-        genrule(
-            name = name,
-            bash = 'jar xf $(location :grpc-src-zip-131) grpc-java-1.3.1/' + pkg + '/src/main/java '
-            + '&& cd grpc-java-1.3.1/' + pkg + '/src/main/java '
-            + '&& jar -cf $OUT *',
-            out = pkg + '.src.zip',
-        )
-        srcs.append(':' + name)
-    osgi_jar(
-        name = 'grpc-core-repkg-1.3.1',
-        srcs = srcs,
-        deps = repkg_deps,
-        package_name_root = 'io.grpc',
-        import_packages = '!javax.annotation,!com.google.errorprone.annotations,*',
-        export_packages = '*',
-        do_javadocs = False,
-        do_checkstyle = False,
-    )
-
-grpc_core_repkg_131()
diff --git a/incubator/grpc/features.xml b/incubator/grpc/features.xml
deleted file mode 100644
index 9517edf..0000000
--- a/incubator/grpc/features.xml
+++ /dev/null
@@ -1,51 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
-<!--
-  ~ Copyright 2016-present Open Networking Foundation
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~     http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License.
-  -->
-<features xmlns="http://karaf.apache.org/xmlns/features/v1.2.0" name="${project.artifactId}-${project.version}">
-    <feature name="${project.artifactId}" version="${project.version}"
-             description="${project.description}">
-        <feature version="${project.version}">grpc</feature>
-
-        <bundle>mvn:com.google.protobuf/protobuf-java/3.0.0</bundle>
-        <bundle>mvn:${project.groupId}/${project.artifactId}/${project.version}</bundle>
-    </feature>
-
-    <feature name="grpc-netty" version="${project.version}"
-             description="gRPC Netty dependencies">
-        <bundle>mvn:io.netty/netty-common/${grpc.netty.version}</bundle>
-        <bundle>mvn:io.netty/netty-buffer/${grpc.netty.version}</bundle>
-        <bundle>mvn:io.netty/netty-transport/${grpc.netty.version}</bundle>
-        <bundle>mvn:io.netty/netty-handler/${grpc.netty.version}</bundle>
-        <bundle>mvn:io.netty/netty-codec/${grpc.netty.version}</bundle>
-        <bundle>mvn:io.netty/netty-codec-http/${grpc.netty.version}</bundle>
-        <bundle>mvn:io.netty/netty-codec-http2/${grpc.netty.version}</bundle>
-        <bundle>mvn:io.netty/netty-resolver/${grpc.netty.version}</bundle>
-    </feature>
-
-    <feature name="grpc" version="${project.version}" description="gRPC dependencies">
-        <feature version="${project.version}">grpc-netty</feature>
-        <bundle>wrap:mvn:com.google.auth/google-auth-library-credentials/${google.auth.version}$Bundle-SymbolicName=com.google.auth.google-auth-library-credentials&amp;Bundle-Version=${google.auth.version}</bundle>
-        <bundle>wrap:mvn:com.google.auth/google-auth-library-oauth2-http/${google.auth.version}$Bundle-SymbolicName=com.google.auth.google-auth-library-oauth2-http&amp;Bundle-Version=${google.auth.version}</bundle>
-        <!-- Export for io.grpc.internal required for DnsNameResolverProvider -->
-        <bundle>wrap:mvn:io.grpc/grpc-core/${grpc.version}$Bundle-SymbolicName=io.grpc.grpc-core&amp;Bundle-Version=${grpc.package.version}&amp;Export-Package=*;version=${grpc.package.version},io.grpc.internal;version=${grpc.package.version}&amp;</bundle>
-        <bundle>wrap:mvn:io.grpc/grpc-protobuf-lite/${grpc.version}$Bundle-SymbolicName=io.grpc.grpc-protobuf-lite&amp;Bundle-Version=${grpc.package.version}&amp;</bundle>
-        <bundle>wrap:mvn:io.grpc/grpc-protobuf/${grpc.version}$Bundle-SymbolicName=io.grpc.grpc-protobuf&amp;Bundle-Version=${grpc.package.version}&amp;</bundle>
-        <bundle>wrap:mvn:io.grpc/grpc-stub/${grpc.version}$Bundle-SymbolicName=io.grpc.grpc-stub&amp;Bundle-Version=${grpc.package.version}&amp;</bundle>
-        <bundle>wrap:mvn:io.grpc/grpc-netty/${grpc.version}$Bundle-SymbolicName=io.grpc.grpc-netty&amp;Bundle-Version=${grpc.package.version}&amp;Import-Package=io.netty.*;version=${grpc.netty.package.version},*</bundle>
-        <bundle>wrap:mvn:io.grpc/grpc-auth/${grpc.version}$Bundle-SymbolicName=io.grpc.grpc-auth&amp;Bundle-Version=${grpc.package.version}&amp;Import-Package=javax.net.ssl,*</bundle>
-    </feature>
-
-</features>
diff --git a/incubator/net/BUCK b/incubator/net/BUCK
deleted file mode 100644
index 902434a..0000000
--- a/incubator/net/BUCK
+++ /dev/null
@@ -1,25 +0,0 @@
-COMPILE_DEPS = [
-    '//lib:CORE_DEPS',
-    '//lib:JACKSON',
-    '//lib:METRICS',
-    '//lib:KRYO',
-    '//core/common:onos-core-common',
-    '//incubator/api:onos-incubator-api',
-    '//incubator/store:onos-incubator-store',
-    '//utils/rest:onlab-rest',
-    '//lib:concurrent-trees',
-    '//core/store/serializers:onos-core-serializers',
-]
-
-TEST_DEPS = [
-    '//incubator/api:onos-incubator-api-tests',
-    '//lib:TEST_REST',
-    '//lib:TEST_ADAPTERS',
-    '//core/api:onos-api-tests',
-    '//core/common:onos-core-common-tests',
-]
-
-osgi_jar_with_tests (
-    deps = COMPILE_DEPS,
-    test_deps = TEST_DEPS,
-)
diff --git a/incubator/net/src/main/java/org/onosproject/incubator/net/config/impl/ExtraNetworkConfigs.java b/incubator/net/src/main/java/org/onosproject/incubator/net/config/impl/ExtraNetworkConfigs.java
index 7a8eacf..5886078 100644
--- a/incubator/net/src/main/java/org/onosproject/incubator/net/config/impl/ExtraNetworkConfigs.java
+++ b/incubator/net/src/main/java/org/onosproject/incubator/net/config/impl/ExtraNetworkConfigs.java
@@ -16,11 +16,11 @@
 package org.onosproject.incubator.net.config.impl;
 
 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.onosproject.net.config.ConfigFactory;
 import org.onosproject.net.config.NetworkConfigRegistry;
 import org.slf4j.Logger;
@@ -38,7 +38,7 @@
 
     private final Set<ConfigFactory> factories = ImmutableSet.of();
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected NetworkConfigRegistry registry;
 
     @Activate
diff --git a/incubator/net/src/main/java/org/onosproject/incubator/net/domain/impl/IntentDomainManager.java b/incubator/net/src/main/java/org/onosproject/incubator/net/domain/impl/IntentDomainManager.java
index 553fb0f..5d0270b 100644
--- a/incubator/net/src/main/java/org/onosproject/incubator/net/domain/impl/IntentDomainManager.java
+++ b/incubator/net/src/main/java/org/onosproject/incubator/net/domain/impl/IntentDomainManager.java
@@ -17,10 +17,6 @@
 
 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.Service;
 import org.onosproject.incubator.net.domain.IntentDomain;
 import org.onosproject.incubator.net.domain.IntentDomainEvent;
 import org.onosproject.incubator.net.domain.IntentDomainId;
@@ -35,6 +31,9 @@
 import org.onosproject.net.DeviceId;
 import org.onosproject.net.provider.AbstractListenerProviderRegistry;
 import org.onosproject.net.provider.AbstractProviderService;
+import org.osgi.service.component.annotations.Activate;
+import org.osgi.service.component.annotations.Component;
+import org.osgi.service.component.annotations.Deactivate;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -46,8 +45,7 @@
 /**
  * Implementation of the intent domain service.
  */
-@Component(immediate = true)
-@Service
+@Component(immediate = true, service = {IntentDomainService.class, IntentDomainProviderRegistry.class})
 public class IntentDomainManager
         extends AbstractListenerProviderRegistry<IntentDomainEvent, IntentDomainListener,
                     IntentDomainProvider, IntentDomainProviderService>
diff --git a/incubator/net/src/main/java/org/onosproject/incubator/net/dpi/impl/DpiStatisticsManager.java b/incubator/net/src/main/java/org/onosproject/incubator/net/dpi/impl/DpiStatisticsManager.java
index b49c9cb..8aa02ec 100644
--- a/incubator/net/src/main/java/org/onosproject/incubator/net/dpi/impl/DpiStatisticsManager.java
+++ b/incubator/net/src/main/java/org/onosproject/incubator/net/dpi/impl/DpiStatisticsManager.java
@@ -17,14 +17,6 @@
 package org.onosproject.incubator.net.dpi.impl;
 
 import com.fasterxml.jackson.databind.ObjectMapper;
-
-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.core.ApplicationId;
 import org.onosproject.core.CoreService;
 import org.onosproject.incubator.net.dpi.DpiStatInfo;
@@ -34,6 +26,11 @@
 import org.onosproject.incubator.net.dpi.ProtocolStatInfo;
 import org.onosproject.incubator.net.dpi.TrafficStatInfo;
 import org.osgi.service.component.ComponentContext;
+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.io.BufferedReader;
@@ -63,8 +60,7 @@
 /**
  * DPI Statistics Manager.
  */
-@Component(immediate = true)
-@Service
+@Component(immediate = true, service = DpiStatisticsManagerService.class)
 public class DpiStatisticsManager implements DpiStatisticsManagerService {
 
     private ServerSocket serverSocket;
@@ -72,7 +68,7 @@
 
     private final Logger log = getLogger(getClass());
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected CoreService coreService;
 
     private ApplicationId appId;
diff --git a/incubator/net/src/main/java/org/onosproject/incubator/net/impl/PortStatisticsManager.java b/incubator/net/src/main/java/org/onosproject/incubator/net/impl/PortStatisticsManager.java
index c92bfea..e63fc9c 100644
--- a/incubator/net/src/main/java/org/onosproject/incubator/net/impl/PortStatisticsManager.java
+++ b/incubator/net/src/main/java/org/onosproject/incubator/net/impl/PortStatisticsManager.java
@@ -16,12 +16,6 @@
 package org.onosproject.incubator.net.impl;
 
 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.onosproject.incubator.net.PortStatisticsService;
 import org.onosproject.net.ConnectPoint;
 import org.onosproject.net.DeviceId;
@@ -31,20 +25,26 @@
 import org.onosproject.net.device.PortStatistics;
 import org.onosproject.net.statistic.DefaultLoad;
 import org.onosproject.net.statistic.Load;
+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.Map;
 import java.util.stream.Collectors;
 
 import static org.onosproject.net.PortNumber.portNumber;
-import static org.onosproject.net.device.DeviceEvent.Type.*;
+import static org.onosproject.net.device.DeviceEvent.Type.DEVICE_AVAILABILITY_CHANGED;
+import static org.onosproject.net.device.DeviceEvent.Type.DEVICE_REMOVED;
+import static org.onosproject.net.device.DeviceEvent.Type.PORT_STATS_UPDATED;
 import static org.slf4j.LoggerFactory.getLogger;
 
 /**
  * Implementation of the port statistics service.
  */
-@Component(immediate = true)
-@Service
+@Component(immediate = true, service = PortStatisticsService.class)
 public class PortStatisticsManager implements PortStatisticsService {
 
     private final Logger log = getLogger(getClass());
@@ -53,7 +53,7 @@
     private static final long STALE_LIMIT = (long) (1.5 * POLL_FREQUENCY);
     private static final int SECOND = 1_000; // milliseconds
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected DeviceService deviceService;
 
     private final DeviceListener deviceListener = new InternalDeviceListener();
diff --git a/incubator/net/src/main/java/org/onosproject/incubator/net/resource/label/impl/LabelResourceManager.java b/incubator/net/src/main/java/org/onosproject/incubator/net/resource/label/impl/LabelResourceManager.java
index 56c308e..ad9a133 100644
--- a/incubator/net/src/main/java/org/onosproject/incubator/net/resource/label/impl/LabelResourceManager.java
+++ b/incubator/net/src/main/java/org/onosproject/incubator/net/resource/label/impl/LabelResourceManager.java
@@ -16,13 +16,6 @@
 package org.onosproject.incubator.net.resource.label.impl;
 
 import com.google.common.collect.Multimap;
-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.net.provider.AbstractListenerProviderRegistry;
 import org.onosproject.incubator.net.resource.label.LabelResource;
 import org.onosproject.incubator.net.resource.label.LabelResourceAdminService;
 import org.onosproject.incubator.net.resource.label.LabelResourceDelegate;
@@ -41,7 +34,13 @@
 import org.onosproject.net.device.DeviceEvent.Type;
 import org.onosproject.net.device.DeviceListener;
 import org.onosproject.net.device.DeviceService;
+import org.onosproject.net.provider.AbstractListenerProviderRegistry;
 import org.onosproject.net.provider.AbstractProviderService;
+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;
@@ -55,8 +54,8 @@
  * provides implementation of the label resource NB &amp; SB APIs.
  *
  */
-@Component(immediate = true)
-@Service
+@Component(immediate = true,
+           service = {LabelResourceService.class, LabelResourceAdminService.class, LabelResourceProviderRegistry.class})
 public class LabelResourceManager
         extends AbstractListenerProviderRegistry<LabelResourceEvent, LabelResourceListener,
                                                  LabelResourceProvider, LabelResourceProviderService>
@@ -64,10 +63,10 @@
     private final Logger log = getLogger(getClass());
     private final LabelResourceDelegate delegate = new InternalLabelResourceDelegate();
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected LabelResourceStore store;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected DeviceService deviceService;
 
     private DeviceListener deviceListener = new InternalDeviceListener();
diff --git a/incubator/net/src/main/java/org/onosproject/incubator/net/tunnel/impl/TunnelManager.java b/incubator/net/src/main/java/org/onosproject/incubator/net/tunnel/impl/TunnelManager.java
index 2c1f79b..0d05c92 100644
--- a/incubator/net/src/main/java/org/onosproject/incubator/net/tunnel/impl/TunnelManager.java
+++ b/incubator/net/src/main/java/org/onosproject/incubator/net/tunnel/impl/TunnelManager.java
@@ -15,13 +15,6 @@
  */
 package org.onosproject.incubator.net.tunnel.impl;
 
-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.net.provider.AbstractListenerProviderRegistry;
 import org.onosproject.core.ApplicationId;
 import org.onosproject.incubator.net.tunnel.DefaultTunnel;
 import org.onosproject.incubator.net.tunnel.Tunnel;
@@ -45,8 +38,14 @@
 import org.onosproject.net.DeviceId;
 import org.onosproject.net.ElementId;
 import org.onosproject.net.Path;
+import org.onosproject.net.provider.AbstractListenerProviderRegistry;
 import org.onosproject.net.provider.AbstractProviderService;
 import org.onosproject.net.provider.ProviderId;
+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;
@@ -59,8 +58,7 @@
 /**
  * Provides implementation of the tunnel NB/SB APIs.
  */
-@Component(immediate = true, enabled = true)
-@Service
+@Component(immediate = true, service = {TunnelService.class, TunnelAdminService.class, TunnelProviderRegistry.class})
 public class TunnelManager
         extends AbstractListenerProviderRegistry<TunnelEvent, TunnelListener,
                                                  TunnelProvider, TunnelProviderService>
@@ -73,7 +71,7 @@
 
     private final TunnelStoreDelegate delegate = new InternalStoreDelegate();
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected TunnelStore store;
 
 
diff --git a/incubator/net/src/main/java/org/onosproject/incubator/net/virtual/impl/VirtualNetworkManager.java b/incubator/net/src/main/java/org/onosproject/incubator/net/virtual/impl/VirtualNetworkManager.java
index 2343b3e..e8da5cb 100644
--- a/incubator/net/src/main/java/org/onosproject/incubator/net/virtual/impl/VirtualNetworkManager.java
+++ b/incubator/net/src/main/java/org/onosproject/incubator/net/virtual/impl/VirtualNetworkManager.java
@@ -17,12 +17,6 @@
 
 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.osgi.DefaultServiceDirectory;
 import org.onlab.osgi.ServiceDirectory;
 import org.onlab.packet.IpAddress;
@@ -73,6 +67,11 @@
 import org.onosproject.net.provider.AbstractProviderService;
 import org.onosproject.net.topology.PathService;
 import org.onosproject.net.topology.TopologyService;
+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;
 
@@ -86,13 +85,16 @@
 /**
  * Implementation of the virtual network service.
  */
-@Component(immediate = true)
-@Service
+@Component(service = {
+                   VirtualNetworkService.class,
+                   VirtualNetworkAdminService.class,
+                   VirtualNetworkService.class,
+                   VirtualNetworkProviderRegistry.class
+            })
 public class VirtualNetworkManager
         extends AbstractListenerProviderRegistry<VirtualNetworkEvent,
         VirtualNetworkListener, VirtualNetworkProvider, VirtualNetworkProviderService>
-        implements VirtualNetworkService, VirtualNetworkAdminService,
-        VirtualNetworkProviderRegistry {
+        implements VirtualNetworkService, VirtualNetworkAdminService, VirtualNetworkProviderRegistry {
 
     private final Logger log = LoggerFactory.getLogger(getClass());
 
@@ -104,10 +106,10 @@
     private static final String VIRTUAL_NETWORK_APP_ID_STRING =
             "org.onosproject.virtual-network";
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected VirtualNetworkStore store;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected CoreService coreService;
 
     private VirtualNetworkStoreDelegate delegate = this::post;
diff --git a/incubator/net/src/main/java/org/onosproject/incubator/net/virtual/impl/provider/DefaultVirtualFlowRuleProvider.java b/incubator/net/src/main/java/org/onosproject/incubator/net/virtual/impl/provider/DefaultVirtualFlowRuleProvider.java
index 8e497e8..436e1d4 100644
--- a/incubator/net/src/main/java/org/onosproject/incubator/net/virtual/impl/provider/DefaultVirtualFlowRuleProvider.java
+++ b/incubator/net/src/main/java/org/onosproject/incubator/net/virtual/impl/provider/DefaultVirtualFlowRuleProvider.java
@@ -23,13 +23,6 @@
 import com.google.common.collect.Maps;
 import com.google.common.collect.Sets;
 import com.google.common.collect.Table;
-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.Reference;
-import org.apache.felix.scr.annotations.ReferenceCardinality;
-import org.apache.felix.scr.annotations.Service;
 import org.onlab.packet.VlanId;
 import org.onosproject.core.ApplicationId;
 import org.onosproject.core.CoreService;
@@ -56,8 +49,6 @@
 import org.onosproject.net.flow.DefaultTrafficTreatment;
 import org.onosproject.net.flow.FlowEntry;
 import org.onosproject.net.flow.FlowRule;
-import org.onosproject.net.flow.oldbatch.FlowRuleBatchEntry;
-import org.onosproject.net.flow.oldbatch.FlowRuleBatchOperation;
 import org.onosproject.net.flow.FlowRuleEvent;
 import org.onosproject.net.flow.FlowRuleListener;
 import org.onosproject.net.flow.FlowRuleOperations;
@@ -69,9 +60,17 @@
 import org.onosproject.net.flow.criteria.PortCriterion;
 import org.onosproject.net.flow.instructions.Instruction;
 import org.onosproject.net.flow.instructions.Instructions;
+import org.onosproject.net.flow.oldbatch.FlowRuleBatchEntry;
+import org.onosproject.net.flow.oldbatch.FlowRuleBatchOperation;
 import org.onosproject.net.provider.ProviderId;
 import org.onosproject.net.topology.TopologyService;
 import org.osgi.service.component.ComponentContext;
+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.Dictionary;
@@ -91,8 +90,7 @@
  * This virtualize and de-virtualize virtual flow rules into physical flow rules.
  * {@link org.onosproject.net.flow.FlowRule}
  */
-@Component(immediate = true)
-@Service
+@Component(service = VirtualFlowRuleProvider.class)
 public class DefaultVirtualFlowRuleProvider extends AbstractVirtualProvider
         implements VirtualFlowRuleProvider {
 
@@ -100,22 +98,22 @@
 
     private final Logger log = getLogger(getClass());
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected TopologyService topologyService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected VirtualNetworkService vnService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected CoreService coreService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected FlowRuleService flowRuleService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected DeviceService deviceService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected VirtualProviderRegistryService providerRegistryService;
 
     private InternalRoutingAlgorithm internalRoutingAlgorithm;
diff --git a/incubator/net/src/main/java/org/onosproject/incubator/net/virtual/impl/provider/DefaultVirtualGroupProvider.java b/incubator/net/src/main/java/org/onosproject/incubator/net/virtual/impl/provider/DefaultVirtualGroupProvider.java
index 66657bc..7cc86cc 100644
--- a/incubator/net/src/main/java/org/onosproject/incubator/net/virtual/impl/provider/DefaultVirtualGroupProvider.java
+++ b/incubator/net/src/main/java/org/onosproject/incubator/net/virtual/impl/provider/DefaultVirtualGroupProvider.java
@@ -16,13 +16,6 @@
 
 package org.onosproject.incubator.net.virtual.impl.provider;
 
-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.Reference;
-import org.apache.felix.scr.annotations.ReferenceCardinality;
-import org.apache.felix.scr.annotations.Service;
 import org.onosproject.incubator.net.virtual.NetworkId;
 import org.onosproject.incubator.net.virtual.provider.AbstractVirtualProvider;
 import org.onosproject.incubator.net.virtual.provider.VirtualGroupProvider;
@@ -35,6 +28,12 @@
 import org.onosproject.net.group.GroupService;
 import org.onosproject.net.provider.ProviderId;
 import org.osgi.service.component.ComponentContext;
+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 static org.slf4j.LoggerFactory.getLogger;
@@ -42,17 +41,16 @@
 /**
  * Provider to handle Group for virtual network.
  */
-@Component(immediate = true)
-@Service
+@Component(service = VirtualGroupProvider.class)
 public class DefaultVirtualGroupProvider extends AbstractVirtualProvider
         implements VirtualGroupProvider {
 
     private final Logger log = getLogger(getClass());
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected VirtualProviderRegistryService providerRegistryService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected GroupService groupService;
 
     private InternalGroupEventListener internalGroupEventListener;
diff --git a/incubator/net/src/main/java/org/onosproject/incubator/net/virtual/impl/provider/DefaultVirtualMeterProvider.java b/incubator/net/src/main/java/org/onosproject/incubator/net/virtual/impl/provider/DefaultVirtualMeterProvider.java
index 69639de..26462ad 100644
--- a/incubator/net/src/main/java/org/onosproject/incubator/net/virtual/impl/provider/DefaultVirtualMeterProvider.java
+++ b/incubator/net/src/main/java/org/onosproject/incubator/net/virtual/impl/provider/DefaultVirtualMeterProvider.java
@@ -20,12 +20,6 @@
 import com.google.common.cache.CacheBuilder;
 import com.google.common.cache.RemovalCause;
 import com.google.common.cache.RemovalNotification;
-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.core.IdGenerator;
 import org.onosproject.incubator.net.virtual.NetworkId;
 import org.onosproject.incubator.net.virtual.provider.AbstractVirtualProvider;
@@ -41,6 +35,11 @@
 import org.onosproject.net.meter.MeterOperations;
 import org.onosproject.net.meter.MeterService;
 import org.onosproject.net.provider.ProviderId;
+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.concurrent.TimeUnit;
@@ -51,8 +50,7 @@
 /**
  * Provider to handle meters for virtual networks.
  */
-@Component(immediate = true)
-@Service
+@Component(service = VirtualMeterProvider.class)
 public class DefaultVirtualMeterProvider extends AbstractVirtualProvider
         implements VirtualMeterProvider {
 
@@ -60,10 +58,10 @@
 
     static final long TIMEOUT = 30;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected VirtualProviderRegistryService providerRegistryService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected MeterService meterService;
 
     private MeterListener internalMeterListener;
diff --git a/incubator/net/src/main/java/org/onosproject/incubator/net/virtual/impl/provider/DefaultVirtualNetworkProvider.java b/incubator/net/src/main/java/org/onosproject/incubator/net/virtual/impl/provider/DefaultVirtualNetworkProvider.java
index be08685..3860dee 100644
--- a/incubator/net/src/main/java/org/onosproject/incubator/net/virtual/impl/provider/DefaultVirtualNetworkProvider.java
+++ b/incubator/net/src/main/java/org/onosproject/incubator/net/virtual/impl/provider/DefaultVirtualNetworkProvider.java
@@ -16,12 +16,6 @@
 
 package org.onosproject.incubator.net.virtual.impl.provider;
 
-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.incubator.net.virtual.DefaultVirtualLink;
 import org.onosproject.incubator.net.virtual.provider.VirtualNetworkProvider;
 import org.onosproject.incubator.net.virtual.provider.VirtualNetworkProviderRegistry;
@@ -36,6 +30,11 @@
 import org.onosproject.net.topology.TopologyEvent;
 import org.onosproject.net.topology.TopologyListener;
 import org.onosproject.net.topology.TopologyService;
+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.HashSet;
@@ -49,19 +48,18 @@
 /**
  * Virtual network topology provider.
  */
-@Component(immediate = true)
-@Service
+@Component(service = VirtualNetworkProvider.class)
 public class DefaultVirtualNetworkProvider
         extends AbstractProvider implements VirtualNetworkProvider {
 
     private final Logger log = getLogger(DefaultVirtualNetworkProvider.class);
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected VirtualNetworkProviderRegistry providerRegistry;
 
     private VirtualNetworkProviderService providerService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected TopologyService topologyService;
 
     protected TopologyListener topologyListener = new InternalTopologyListener();
diff --git a/incubator/net/src/main/java/org/onosproject/incubator/net/virtual/impl/provider/DefaultVirtualPacketProvider.java b/incubator/net/src/main/java/org/onosproject/incubator/net/virtual/impl/provider/DefaultVirtualPacketProvider.java
index 2d01774..16c8187 100644
--- a/incubator/net/src/main/java/org/onosproject/incubator/net/virtual/impl/provider/DefaultVirtualPacketProvider.java
+++ b/incubator/net/src/main/java/org/onosproject/incubator/net/virtual/impl/provider/DefaultVirtualPacketProvider.java
@@ -17,12 +17,12 @@
 package org.onosproject.incubator.net.virtual.impl.provider;
 
 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.Modified;
-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.Modified;
+import org.osgi.service.component.annotations.Reference;
+import org.osgi.service.component.annotations.ReferenceCardinality;
 import org.onlab.packet.Ethernet;
 import org.onosproject.core.ApplicationId;
 import org.onosproject.core.CoreService;
@@ -67,7 +67,7 @@
 
 import static org.slf4j.LoggerFactory.getLogger;
 
-@Component(immediate = true)
+@Component(service = VirtualPacketProvider.class)
 public class DefaultVirtualPacketProvider extends AbstractVirtualProvider
         implements VirtualPacketProvider {
 
@@ -76,16 +76,16 @@
 
     private final Logger log = getLogger(getClass());
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected PacketService packetService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected CoreService coreService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected VirtualNetworkAdminService vnaService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected VirtualProviderRegistryService providerRegistryService;
 
     private final VirtualNetworkListener virtualNetListener = new InternalVirtualNetworkListener();
diff --git a/incubator/net/src/main/java/org/onosproject/incubator/net/virtual/impl/provider/VirtualProviderManager.java b/incubator/net/src/main/java/org/onosproject/incubator/net/virtual/impl/provider/VirtualProviderManager.java
index 77cac78..ebd87ea 100644
--- a/incubator/net/src/main/java/org/onosproject/incubator/net/virtual/impl/provider/VirtualProviderManager.java
+++ b/incubator/net/src/main/java/org/onosproject/incubator/net/virtual/impl/provider/VirtualProviderManager.java
@@ -17,14 +17,13 @@
 package org.onosproject.incubator.net.virtual.impl.provider;
 
 import com.google.common.collect.ImmutableSet;
-import org.apache.felix.scr.annotations.Component;
-import org.apache.felix.scr.annotations.Service;
 import org.onosproject.incubator.net.virtual.NetworkId;
 import org.onosproject.incubator.net.virtual.provider.VirtualProvider;
 import org.onosproject.incubator.net.virtual.provider.VirtualProviderRegistryService;
 import org.onosproject.incubator.net.virtual.provider.VirtualProviderService;
 import org.onosproject.net.DeviceId;
 import org.onosproject.net.provider.ProviderId;
+import org.osgi.service.component.annotations.Component;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -40,10 +39,8 @@
 /**
  * Implementation of the virtual provider registry and providerService registry service.
  */
-@Component(immediate = true)
-@Service
-public class VirtualProviderManager
-        implements VirtualProviderRegistryService {
+@Component(service = VirtualProviderRegistryService.class)
+public class VirtualProviderManager implements VirtualProviderRegistryService {
 
     private final Map<ProviderId, VirtualProvider> providers = new HashMap<>();
     private final Map<ProviderId, VirtualProviderService> servicesWithProvider = new HashMap<>();
diff --git a/incubator/protobuf-dependencies/BUCK b/incubator/protobuf-dependencies/BUCK
deleted file mode 100644
index b7705de..0000000
--- a/incubator/protobuf-dependencies/BUCK
+++ /dev/null
@@ -1,4 +0,0 @@
-include_defs('//bucklets/grpc.bucklet')
-
-fetch_protoc(version = '3.0.2')
-fetch_protoc(version = '3.2.0')
\ No newline at end of file
diff --git a/incubator/protobuf/api/BUCK b/incubator/protobuf/api/BUCK
deleted file mode 100644
index 13a04d4..0000000
--- a/incubator/protobuf/api/BUCK
+++ /dev/null
@@ -1,15 +0,0 @@
-COMPILE_DEPS = [
-    '//lib:CORE_DEPS',
-    '//incubator/grpc-dependencies:grpc-core-repkg-1.3.1'
-]
-
-TEST_DEPS = [
-    '//lib:TEST_ADAPTERS',
-]
-
-osgi_jar_with_tests (
-    name = 'onos-grpc-api',
-    deps = COMPILE_DEPS,
-    test_deps = TEST_DEPS,
-    visibility = ['PUBLIC'],
-)
diff --git a/incubator/protobuf/features.xml b/incubator/protobuf/features.xml
deleted file mode 100644
index 881b2dc..0000000
--- a/incubator/protobuf/features.xml
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
-<!--
-  ~ Copyright 2016-present Open Networking Foundation
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~     http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License.
-  -->
-<features xmlns="http://karaf.apache.org/xmlns/features/v1.2.1" name="${project.artifactId}-${project.version}">
-    <feature name="${project.artifactId}" version="${project.version}"
-             description="${project.description}">
-        <feature>onos-api</feature>
-        <bundle>mvn:com.google.protobuf/protobuf-java/${protobuf.version}</bundle>
-        <bundle>mvn:${project.groupId}/${project.artifactId}/${project.version}</bundle>
-    </feature>
-</features>
diff --git a/incubator/protobuf/models/BUCK b/incubator/protobuf/models/BUCK
deleted file mode 100644
index 04f71b0..0000000
--- a/incubator/protobuf/models/BUCK
+++ /dev/null
@@ -1,35 +0,0 @@
-GRPC_VER = '1.3.1'
-
-COMPILE_DEPS = [
-    '//lib:CORE_DEPS',
-    ':onos-incubator-protobuf-models-proto',
-    '//lib:protobuf-java-3.2.0',
-    '//lib:GRPC_1.3',
-    '//incubator/grpc-dependencies:grpc-core-repkg-' + GRPC_VER
-]
-
-GRPC_DEPS = [
-    '//lib:GRPC_1.3',
-    '//lib:protobuf-java-3.2.0',
-    '//lib:com_google_guava_guava',
-    '//incubator/grpc-dependencies:grpc-core-repkg-' + GRPC_VER
-]
-
-BUNDLES = [
-    ':onos-incubator-protobuf-models',
-    ':onos-incubator-protobuf-models-proto',
-    '//lib:protobuf-java-3.2.0',
-]
-
-grpc_jar(
-    name = 'onos-incubator-protobuf-models-proto',
-    deps = GRPC_DEPS,
-    # FIXME should not be manually building absolute path.
-    # Come up with glob(..) equivalent in BUCK which can handle directory.
-    proto_paths = ["$ONOS_ROOT/incubator/protobuf/models/src/main/proto"]
-)
-
-osgi_jar_with_tests(
-    deps = COMPILE_DEPS,
-    visibility = ['PUBLIC'],
-)
diff --git a/incubator/protobuf/registry/BUCK b/incubator/protobuf/registry/BUCK
deleted file mode 100644
index ff95260..0000000
--- a/incubator/protobuf/registry/BUCK
+++ /dev/null
@@ -1,23 +0,0 @@
-GRPC_VER = '1.3.1'
-
-COMPILE_DEPS = [
-    '//lib:CORE_DEPS',
-    '//lib:NETTY',
-    '//lib:GRPC_1.3',
-    '//incubator/grpc-dependencies:grpc-core-repkg-' + GRPC_VER,
-    '//incubator/protobuf/api:onos-grpc-api'
-]
-
-osgi_jar_with_tests (
-    deps = COMPILE_DEPS,
-)
-
-onos_app (
-    title = 'Grpc Service Registry',
-    app_name = "org.onosproject.grpc.registry",
-    included_bundles = ['//incubator/grpc-dependencies:grpc-core-repkg-' + GRPC_VER,
-        '//lib:google-instrumentation-0.3.0'],
-    category = 'Utility',
-    url = 'http://onosproject.org',
-    description = 'Service providing connections for remote apps communicating with the ONOS core via gRPC.',
-)
diff --git a/incubator/protobuf/registry/src/main/java/org/onosproject/protobuf/registry/GrpcServiceRegistryImpl.java b/incubator/protobuf/registry/src/main/java/org/onosproject/protobuf/registry/GrpcServiceRegistryImpl.java
index 2c2d864..9935cdb 100644
--- a/incubator/protobuf/registry/src/main/java/org/onosproject/protobuf/registry/GrpcServiceRegistryImpl.java
+++ b/incubator/protobuf/registry/src/main/java/org/onosproject/protobuf/registry/GrpcServiceRegistryImpl.java
@@ -20,14 +20,13 @@
 import io.grpc.BindableService;
 import io.grpc.Server;
 import io.grpc.ServerBuilder;
-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.Service;
 import org.onosproject.protobuf.api.GrpcServiceRegistry;
 import org.osgi.service.component.ComponentContext;
+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.Property;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -47,8 +46,7 @@
  * service forces a restart of the server, this is sufficient for testing but
  * inappropriate for deployment.
  */
-@Service
-@Component(immediate = false)
+@Component(service = GrpcServiceRegistry.class)
 public class GrpcServiceRegistryImpl implements GrpcServiceRegistry {
 
     private static final int DEFAULT_SERVER_PORT = 64000;
@@ -67,8 +65,7 @@
     clients of nonstandard port usage as there is no mechanism available to
     discover the port hosting gRPC services.
      */
-    @Property(name = PORT_PROPERTY_NAME, intValue = DEFAULT_SERVER_PORT,
-             label = "The port number which ONOS will use to host gRPC services.")
+    /** The port number which ONOS will use to host gRPC services. */
     private int listeningPort = DEFAULT_SERVER_PORT;
 
     @Activate
diff --git a/incubator/protobuf/services/nb/BUCK b/incubator/protobuf/services/nb/BUCK
deleted file mode 100644
index f05f448..0000000
--- a/incubator/protobuf/services/nb/BUCK
+++ /dev/null
@@ -1,78 +0,0 @@
-GRPC_VER = '1.3.1'
-
-COMPILE_DEPS = [
-    '//lib:CORE_DEPS',
-    ':onos-incubator-protobuf-services-nb-proto',
-    '//incubator/protobuf/models:onos-incubator-protobuf-models-proto',
-    '//incubator/protobuf/models:onos-incubator-protobuf-models',
-    '//lib:protobuf-java-3.2.0',
-    '//lib:GRPC_1.3',
-    '//incubator/grpc-dependencies:grpc-core-repkg-' + GRPC_VER,
-    '//lib:grpc-protobuf-lite-' + GRPC_VER,
-    '//incubator/protobuf/api:onos-grpc-api'
-]
-
-TEST_DEPS = [
-    '//lib:TEST',
-    '//lib:TEST_ADAPTERS',
-]
-
-GRPC_DEPS = [
-    '//lib:GRPC_1.3',
-    '//incubator/grpc-dependencies:grpc-core-repkg-' + GRPC_VER,
-    '//incubator/protobuf/models:onos-incubator-protobuf-models-proto',
-    '//lib:protobuf-java-3.2.0',
-    '//lib:com_google_guava_guava',
-]
-
-BUNDLES = [
-    '//incubator/protobuf/models:onos-incubator-protobuf-models',
-    '//incubator/protobuf/models:onos-incubator-protobuf-models-proto',
-    ':onos-incubator-protobuf-services-nb',
-    ':onos-incubator-protobuf-services-nb-proto',
-    '//lib:protobuf-java-3.2.0',
-    '//lib:com_google_guava_guava',
-    '//lib:grpc-core-' + GRPC_VER,
-    '//incubator/grpc-dependencies:grpc-core-repkg-' + GRPC_VER,
-    '//lib:grpc-protobuf-' + GRPC_VER,
-    '//lib:grpc-stub-' + GRPC_VER,
-    '//lib:grpc-netty-' + GRPC_VER,
-    '//lib:grpc-auth-' + GRPC_VER,
-    '//lib:grpc-context-' + GRPC_VER,
-    '//lib:google-truth-0.28',
-    '//core/api:onos-api',
-    '//lib:io_netty_netty_transport',
-    '//lib:io_netty_netty_buffer',
-    '//lib:io_netty_netty_resolver',
-    '//lib:io_netty_netty_common',
-    '//lib:io_netty_netty_codec',
-    '//lib:io_netty_netty_handler',
-    '//lib:io_netty_netty_codec-http2',
-    '//lib:io_netty_netty_codec-http',
-    "//lib:google-instrumentation-0.3.0",
-]
-
-grpc_jar(
-    name = 'onos-incubator-protobuf-services-nb-proto',
-    deps = GRPC_DEPS,
-    # FIXME should not be manually building absolute path
-    # come up with glob(..) equivalent in BUCK which can handle directory
-    proto_paths = ["$ONOS_ROOT/incubator/protobuf/services/nb/src/main/proto",
-        "$ONOS_ROOT/incubator/protobuf/models/src/main/proto"]
-)
-
-osgi_jar_with_tests(
-    deps = COMPILE_DEPS,
-    test_deps = TEST_DEPS,
-    visibility = ['PUBLIC'],
-)
-
-onos_app (
-    title = 'Grpc Northbound Service',
-    app_name = "org.onosproject.grpc.nb.service",
-    category = 'Utility',
-    url = 'http://onosproject.org',
-    included_bundles = ['//incubator/grpc-dependencies:grpc-core-repkg-' + GRPC_VER,
-            '//lib:google-instrumentation-0.3.0'],
-    description = 'gRPC northbound services used to provide fine-grained access to ONOS native northbound interface from off-platform applications',
-)
diff --git a/incubator/protobuf/services/nb/src/main/java/org/onosproject/incubator/protobuf/services/nb/GrpcNbApplicationService.java b/incubator/protobuf/services/nb/src/main/java/org/onosproject/incubator/protobuf/services/nb/GrpcNbApplicationService.java
index 7ec8ed1..f60a36e 100644
--- a/incubator/protobuf/services/nb/src/main/java/org/onosproject/incubator/protobuf/services/nb/GrpcNbApplicationService.java
+++ b/incubator/protobuf/services/nb/src/main/java/org/onosproject/incubator/protobuf/services/nb/GrpcNbApplicationService.java
@@ -18,11 +18,11 @@
 import com.google.common.annotations.Beta;
 import io.grpc.BindableService;
 import io.grpc.stub.StreamObserver;
-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.onosproject.app.ApplicationService;
 import org.onosproject.app.ApplicationState;
 import org.onosproject.core.Application;
@@ -53,10 +53,10 @@
 
     private final Logger log = getLogger(getClass());
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected GrpcServiceRegistry registry;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected ApplicationService applicationService;
 
     private ApplicationServiceNbServerInternal instance = null;
diff --git a/incubator/protobuf/services/nb/src/main/java/org/onosproject/incubator/protobuf/services/nb/GrpcNbComponentConfigService.java b/incubator/protobuf/services/nb/src/main/java/org/onosproject/incubator/protobuf/services/nb/GrpcNbComponentConfigService.java
index 673d126..d9cad10 100644
--- a/incubator/protobuf/services/nb/src/main/java/org/onosproject/incubator/protobuf/services/nb/GrpcNbComponentConfigService.java
+++ b/incubator/protobuf/services/nb/src/main/java/org/onosproject/incubator/protobuf/services/nb/GrpcNbComponentConfigService.java
@@ -19,11 +19,11 @@
 import com.google.common.annotations.Beta;
 import io.grpc.BindableService;
 import io.grpc.stub.StreamObserver;
-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.onosproject.cfg.ComponentConfigService;
 import org.onosproject.incubator.protobuf.models.cfg.ConfigPropertyProtoTranslator;
 import org.onosproject.protobuf.api.GrpcServiceRegistry;
@@ -56,10 +56,10 @@
 
     private final Logger log = getLogger(getClass());
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected GrpcServiceRegistry registry;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected ComponentConfigService componentConfigService;
 
     private ComponentConfigServiceNbServerInternal instance = null;
diff --git a/incubator/protobuf/services/nb/src/main/java/org/onosproject/incubator/protobuf/services/nb/GrpcNbDeviceService.java b/incubator/protobuf/services/nb/src/main/java/org/onosproject/incubator/protobuf/services/nb/GrpcNbDeviceService.java
index a06acf6..5d6ea4c 100644
--- a/incubator/protobuf/services/nb/src/main/java/org/onosproject/incubator/protobuf/services/nb/GrpcNbDeviceService.java
+++ b/incubator/protobuf/services/nb/src/main/java/org/onosproject/incubator/protobuf/services/nb/GrpcNbDeviceService.java
@@ -18,11 +18,11 @@
 import com.google.common.annotations.Beta;
 import io.grpc.BindableService;
 import io.grpc.stub.StreamObserver;
-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.onosproject.grpc.net.device.models.PortEnumsProto;
 import org.onosproject.grpc.net.device.models.PortStatisticsProtoOuterClass.PortStatisticsProto;
 import org.onosproject.grpc.nb.net.device.DeviceServiceGrpc.DeviceServiceImplBase;
@@ -54,10 +54,10 @@
 
     private DeviceServiceNbServerInternal instance = null;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected GrpcServiceRegistry registry;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected DeviceService deviceService;
 
     @Activate
diff --git a/incubator/protobuf/services/nb/src/main/java/org/onosproject/incubator/protobuf/services/nb/GrpcNbHostService.java b/incubator/protobuf/services/nb/src/main/java/org/onosproject/incubator/protobuf/services/nb/GrpcNbHostService.java
index 2ad2bf6..3fee375 100644
--- a/incubator/protobuf/services/nb/src/main/java/org/onosproject/incubator/protobuf/services/nb/GrpcNbHostService.java
+++ b/incubator/protobuf/services/nb/src/main/java/org/onosproject/incubator/protobuf/services/nb/GrpcNbHostService.java
@@ -19,11 +19,11 @@
 import com.google.common.annotations.Beta;
 import io.grpc.BindableService;
 import io.grpc.stub.StreamObserver;
-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.onlab.packet.MacAddress;
 import org.onlab.packet.VlanId;
@@ -68,10 +68,10 @@
 
     private final Logger log = getLogger(getClass());
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected GrpcServiceRegistry registry;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected HostService hostService;
 
     private HostServiceNBServerInternal instance = null;
diff --git a/incubator/protobuf/services/nb/src/main/java/org/onosproject/incubator/protobuf/services/nb/GrpcNbLinkService.java b/incubator/protobuf/services/nb/src/main/java/org/onosproject/incubator/protobuf/services/nb/GrpcNbLinkService.java
index 54ab184..fbf956d 100644
--- a/incubator/protobuf/services/nb/src/main/java/org/onosproject/incubator/protobuf/services/nb/GrpcNbLinkService.java
+++ b/incubator/protobuf/services/nb/src/main/java/org/onosproject/incubator/protobuf/services/nb/GrpcNbLinkService.java
@@ -19,11 +19,11 @@
 import com.google.common.annotations.Beta;
 import io.grpc.BindableService;
 import io.grpc.stub.StreamObserver;
-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.onosproject.grpc.nb.net.link.LinkServiceGrpc.LinkServiceImplBase;
 import org.onosproject.grpc.nb.net.link.LinkServiceNb;
 import org.onosproject.grpc.nb.net.link.LinkServiceNb.getActiveLinksReply;
@@ -62,10 +62,10 @@
 
     private static final Logger log = LoggerFactory.getLogger(GrpcNbLinkService.class);
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected GrpcServiceRegistry registry;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected LinkService linkService;
 
     private LinkServiceNbServerInternal innerClassInstance;
diff --git a/incubator/protobuf/services/nb/src/main/java/org/onosproject/incubator/protobuf/services/nb/GrpcNbMastershipService.java b/incubator/protobuf/services/nb/src/main/java/org/onosproject/incubator/protobuf/services/nb/GrpcNbMastershipService.java
index 34b8cd9..8d2a48f 100644
--- a/incubator/protobuf/services/nb/src/main/java/org/onosproject/incubator/protobuf/services/nb/GrpcNbMastershipService.java
+++ b/incubator/protobuf/services/nb/src/main/java/org/onosproject/incubator/protobuf/services/nb/GrpcNbMastershipService.java
@@ -19,11 +19,11 @@
 import com.google.common.annotations.Beta;
 import io.grpc.BindableService;
 import io.grpc.stub.StreamObserver;
-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.onosproject.cluster.NodeId;
 import org.onosproject.cluster.RoleInfo;
 import org.onosproject.grpc.nb.mastership.MastershipServiceGrpc;
@@ -57,10 +57,10 @@
 
     private final Logger log = getLogger(getClass());
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected GrpcServiceRegistry registry;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected MastershipService mastershipService;
 
     private MastershipServiceNbServerInternal instance = null;
diff --git a/incubator/protobuf/services/nb/src/main/java/org/onosproject/incubator/protobuf/services/nb/GrpcNbMeterService.java b/incubator/protobuf/services/nb/src/main/java/org/onosproject/incubator/protobuf/services/nb/GrpcNbMeterService.java
index b62d0fb..6aed88f 100644
--- a/incubator/protobuf/services/nb/src/main/java/org/onosproject/incubator/protobuf/services/nb/GrpcNbMeterService.java
+++ b/incubator/protobuf/services/nb/src/main/java/org/onosproject/incubator/protobuf/services/nb/GrpcNbMeterService.java
@@ -16,8 +16,8 @@
 
 package org.onosproject.incubator.protobuf.services.nb;
 
-import org.apache.felix.scr.annotations.Reference;
-import org.apache.felix.scr.annotations.ReferenceCardinality;
+import org.osgi.service.component.annotations.Reference;
+import org.osgi.service.component.annotations.ReferenceCardinality;
 import org.onosproject.incubator.protobuf.models.net.meter.MeterRequestProtoTranslator;
 import org.onosproject.net.meter.MeterService;
 import org.onosproject.incubator.protobuf.models.net.meter.MeterProtoTranslator;
@@ -35,10 +35,10 @@
 import org.onosproject.grpc.nb.net.meter.MeterServiceNbProto.getMetersReply;
 
 import io.grpc.stub.StreamObserver;
-import org.apache.felix.scr.annotations.Activate;
-import org.apache.felix.scr.annotations.Deactivate;
+import org.osgi.service.component.annotations.Activate;
+import org.osgi.service.component.annotations.Deactivate;
 import com.google.common.annotations.Beta;
-import org.apache.felix.scr.annotations.Component;
+import org.osgi.service.component.annotations.Component;
 
 import org.onosproject.net.meter.Meter;
 import org.onosproject.net.meter.MeterId;
@@ -54,10 +54,10 @@
 @Component(immediate = true)
 public class GrpcNbMeterService extends MeterServiceImplBase {
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected MeterService meterService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected GrpcServiceRegistry grpcServiceRegistry;
 
     @Activate
diff --git a/incubator/protobuf/services/nb/src/main/java/org/onosproject/incubator/protobuf/services/nb/GrpcNbRegionService.java b/incubator/protobuf/services/nb/src/main/java/org/onosproject/incubator/protobuf/services/nb/GrpcNbRegionService.java
index e697a7a..f98d880 100644
--- a/incubator/protobuf/services/nb/src/main/java/org/onosproject/incubator/protobuf/services/nb/GrpcNbRegionService.java
+++ b/incubator/protobuf/services/nb/src/main/java/org/onosproject/incubator/protobuf/services/nb/GrpcNbRegionService.java
@@ -19,11 +19,11 @@
 import com.google.common.annotations.Beta;
 import io.grpc.BindableService;
 import io.grpc.stub.StreamObserver;
-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.onosproject.grpc.nb.net.region.RegionServiceGrpc.RegionServiceImplBase;
 import org.onosproject.grpc.nb.net.region.RegionServiceNb.getRegionDevicesReply;
 import org.onosproject.grpc.nb.net.region.RegionServiceNb.getRegionDevicesRequest;
@@ -54,10 +54,10 @@
 
     private final Logger log = getLogger(getClass());
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected GrpcServiceRegistry registry;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected RegionService regionService;
 
     private RegionServiceNbServerInternal innerClassInstance = null;
diff --git a/incubator/rpc-grpc/features.xml b/incubator/rpc-grpc/features.xml
deleted file mode 100644
index 9ada9c6..0000000
--- a/incubator/rpc-grpc/features.xml
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
-<!--
-  ~ Copyright 2015-present Open Networking Foundation
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~     http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License.
-  -->
-<features xmlns="http://karaf.apache.org/xmlns/features/v1.2.1" name="${project.artifactId}-${project.version}">
-    <feature name="${project.artifactId}" version="${project.version}"
-             description="${project.description}">
-        <feature version="${project.version}">onos-api</feature>
-
-        <bundle>mvn:${project.groupId}/${project.artifactId}/${project.version}</bundle>
-    </feature>
-</features>
diff --git a/incubator/rpc-grpc/src/main/java/org/onosproject/incubator/rpc/grpc/GrpcRemoteServiceProvider.java b/incubator/rpc-grpc/src/main/java/org/onosproject/incubator/rpc/grpc/GrpcRemoteServiceProvider.java
index a8e2066..e3f0892 100644
--- a/incubator/rpc-grpc/src/main/java/org/onosproject/incubator/rpc/grpc/GrpcRemoteServiceProvider.java
+++ b/incubator/rpc-grpc/src/main/java/org/onosproject/incubator/rpc/grpc/GrpcRemoteServiceProvider.java
@@ -22,11 +22,11 @@
 import java.util.Objects;
 import java.util.concurrent.ConcurrentHashMap;
 
-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.onosproject.incubator.rpc.RemoteServiceContext;
 import org.onosproject.incubator.rpc.RemoteServiceContextProvider;
 import org.onosproject.incubator.rpc.RemoteServiceContextProviderService;
@@ -56,7 +56,7 @@
 
     private final Logger log = LoggerFactory.getLogger(getClass());
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected RemoteServiceProviderRegistry rpcRegistry;
 
     private final Map<URI, ManagedChannel> channels = new ConcurrentHashMap<>();
diff --git a/incubator/rpc-grpc/src/main/java/org/onosproject/incubator/rpc/grpc/GrpcRemoteServiceServer.java b/incubator/rpc-grpc/src/main/java/org/onosproject/incubator/rpc/grpc/GrpcRemoteServiceServer.java
index 7e259fb..2bf2081 100644
--- a/incubator/rpc-grpc/src/main/java/org/onosproject/incubator/rpc/grpc/GrpcRemoteServiceServer.java
+++ b/incubator/rpc-grpc/src/main/java/org/onosproject/incubator/rpc/grpc/GrpcRemoteServiceServer.java
@@ -33,13 +33,13 @@
 import java.util.concurrent.TimeoutException;
 import java.util.concurrent.atomic.AtomicInteger;
 
-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.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.Property;
+import org.osgi.service.component.annotations.Reference;
+import org.osgi.service.component.annotations.ReferenceCardinality;
 import org.onlab.util.Tools;
 import org.onosproject.grpc.net.device.DeviceProviderRegistryRpcGrpc.DeviceProviderRegistryRpcImplBase;
 import org.onosproject.grpc.net.device.DeviceService.DeviceConnected;
@@ -93,15 +93,13 @@
 
     private final Logger log = LoggerFactory.getLogger(getClass());
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected DeviceProviderRegistry deviceProviderRegistry;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected LinkProviderRegistry linkProviderRegistry;
 
-
-    @Property(name = "listenPort", intValue = DEFAULT_LISTEN_PORT,
-            label = "Port to listen on")
+    /** Port to listen on */
     protected int listenPort = DEFAULT_LISTEN_PORT;
 
     private Server server;
diff --git a/incubator/rpc-nb/features.xml b/incubator/rpc-nb/features.xml
deleted file mode 100644
index 0a03ccb..0000000
--- a/incubator/rpc-nb/features.xml
+++ /dev/null
@@ -1,26 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
-<!--
-  ~ Copyright 2016-present Open Networking Foundation
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~     http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License.
-  -->
-<features xmlns="http://karaf.apache.org/xmlns/features/v1.2.0" name="${project.artifactId}-${project.version}">
-    <feature name="${project.artifactId}" version="${project.version}"
-             description="${project.description}">
-        <feature>onos-api</feature>
-        <feature>onos-incubator-grpc</feature>
-
-        <bundle>mvn:${project.groupId}/onos-incubator-protobuf-nb/${project.version}</bundle>
-        <bundle>mvn:${project.groupId}/${project.artifactId}/${project.version}</bundle>
-    </feature>
-</features>
diff --git a/incubator/rpc-nb/src/main/java/org/onosproject/incubator/rpc/nb/impl/GrpcServer.java b/incubator/rpc-nb/src/main/java/org/onosproject/incubator/rpc/nb/impl/GrpcServer.java
index 8019cee..4ea8e50 100644
--- a/incubator/rpc-nb/src/main/java/org/onosproject/incubator/rpc/nb/impl/GrpcServer.java
+++ b/incubator/rpc-nb/src/main/java/org/onosproject/incubator/rpc/nb/impl/GrpcServer.java
@@ -18,11 +18,11 @@
 
 import io.grpc.Server;
 import io.grpc.netty.NettyServerBuilder;
-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.onosproject.incubator.rpc.nb.mcast.MulticastRouteGrpcService;
 import org.onosproject.net.mcast.MulticastRouteService;
 import org.slf4j.Logger;
@@ -38,7 +38,7 @@
 
     private final Logger log = LoggerFactory.getLogger(getClass());
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected MulticastRouteService multicastRouteService;
 
     // TODO make configurable
diff --git a/incubator/rpc/BUCK b/incubator/rpc/BUCK
deleted file mode 100644
index 068a43b..0000000
--- a/incubator/rpc/BUCK
+++ /dev/null
@@ -1,14 +0,0 @@
-COMPILE_DEPS = [
-    '//lib:CORE_DEPS',
-    '//incubator/api:onos-incubator-api',
-]
-
-TEST_DEPS = [
-    '//lib:TEST',
-]
-
-osgi_jar_with_tests (
-    deps = COMPILE_DEPS,
-    test_deps = TEST_DEPS,
-    visibility = ['PUBLIC'],
-)
diff --git a/incubator/rpc/src/main/java/org/onosproject/incubator/rpc/impl/LocalRemoteServiceProvider.java b/incubator/rpc/src/main/java/org/onosproject/incubator/rpc/impl/LocalRemoteServiceProvider.java
index 871e630..5ef0d20 100644
--- a/incubator/rpc/src/main/java/org/onosproject/incubator/rpc/impl/LocalRemoteServiceProvider.java
+++ b/incubator/rpc/src/main/java/org/onosproject/incubator/rpc/impl/LocalRemoteServiceProvider.java
@@ -22,11 +22,11 @@
 import java.util.Objects;
 import java.util.concurrent.ConcurrentHashMap;
 
-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.osgi.DefaultServiceDirectory;
 import org.onlab.osgi.ServiceDirectory;
 import org.onosproject.incubator.rpc.RemoteServiceContext;
@@ -58,7 +58,7 @@
 
     private static final ProviderId PID = new ProviderId("local", "org.onosproject.rpc.provider.local");
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected RemoteServiceProviderRegistry rpcRegistry;
 
     private final Map<Class<? extends Object>, Object> services = new ConcurrentHashMap<>();
diff --git a/incubator/rpc/src/main/java/org/onosproject/incubator/rpc/impl/RemoteServiceManager.java b/incubator/rpc/src/main/java/org/onosproject/incubator/rpc/impl/RemoteServiceManager.java
index 2ce7bc8..b6afe06 100644
--- a/incubator/rpc/src/main/java/org/onosproject/incubator/rpc/impl/RemoteServiceManager.java
+++ b/incubator/rpc/src/main/java/org/onosproject/incubator/rpc/impl/RemoteServiceManager.java
@@ -15,29 +15,26 @@
  */
 package org.onosproject.incubator.rpc.impl;
 
-import java.net.URI;
-
-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 com.google.common.annotations.Beta;
 import org.onosproject.incubator.rpc.RemoteServiceContext;
-import org.onosproject.incubator.rpc.RemoteServiceDirectory;
 import org.onosproject.incubator.rpc.RemoteServiceContextProvider;
 import org.onosproject.incubator.rpc.RemoteServiceContextProviderService;
+import org.onosproject.incubator.rpc.RemoteServiceDirectory;
 import org.onosproject.incubator.rpc.RemoteServiceProviderRegistry;
 import org.onosproject.net.provider.AbstractProviderService;
+import org.osgi.service.component.annotations.Activate;
+import org.osgi.service.component.annotations.Component;
+import org.osgi.service.component.annotations.Deactivate;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import com.google.common.annotations.Beta;
+import java.net.URI;
 
 /**
  * Provides RemoteService related APIs.
  */
 @Beta
-@Component(immediate = true)
-@Service
+@Component(immediate = true, service = { RemoteServiceDirectory.class, RemoteServiceProviderRegistry.class })
 public class RemoteServiceManager extends AbstractProviderRegistry
     implements RemoteServiceDirectory, RemoteServiceProviderRegistry {
 
diff --git a/incubator/store/BUCK b/incubator/store/BUCK
deleted file mode 100644
index e3fa120..0000000
--- a/incubator/store/BUCK
+++ /dev/null
@@ -1,20 +0,0 @@
-COMPILE_DEPS = [
-    '//lib:CORE_DEPS',
-    '//lib:KRYO',
-    '//lib:concurrent-trees',
-    '//incubator/api:onos-incubator-api',
-    '//core/store/dist:onos-core-dist',
-    '//core/store/serializers:onos-core-serializers',
-]
-
-TEST_DEPS = [
-    '//lib:TEST_ADAPTERS',
-    '//core/api:onos-api-tests',
-    '//core/common:onos-core-common-tests',
-]
-
-osgi_jar_with_tests (
-    deps = COMPILE_DEPS,
-    test_deps = TEST_DEPS,
-    visibility = ['PUBLIC'],
-)
diff --git a/incubator/store/src/main/java/org/onosproject/incubator/store/meter/impl/DistributedMeterStore.java b/incubator/store/src/main/java/org/onosproject/incubator/store/meter/impl/DistributedMeterStore.java
index a39e405..5ec5d2e 100644
--- a/incubator/store/src/main/java/org/onosproject/incubator/store/meter/impl/DistributedMeterStore.java
+++ b/incubator/store/src/main/java/org/onosproject/incubator/store/meter/impl/DistributedMeterStore.java
@@ -16,16 +16,10 @@
 package org.onosproject.incubator.store.meter.impl;
 
 import com.google.common.collect.Collections2;
-import com.google.common.collect.Lists;
 import com.google.common.collect.Iterables;
+import com.google.common.collect.Lists;
 import com.google.common.collect.Maps;
 import org.apache.commons.lang.math.RandomUtils;
-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.KryoNamespace;
 import org.onosproject.cluster.ClusterService;
 import org.onosproject.cluster.NodeId;
@@ -64,6 +58,11 @@
 import org.onosproject.store.service.StorageException;
 import org.onosproject.store.service.StorageService;
 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.util.Collection;
@@ -80,8 +79,7 @@
  * A distributed meter store implementation. Meters are stored consistently
  * across the cluster.
  */
-@Component(immediate = true)
-@Service
+@Component(immediate = true, service = MeterStore.class)
 public class DistributedMeterStore extends AbstractStore<MeterEvent, MeterStoreDelegate>
                     implements MeterStore {
 
@@ -104,16 +102,16 @@
 
     private Serializer serializer = Serializer.using(Lists.newArrayList(APP_KRYO_BUILDER.build()));
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     private StorageService storageService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     private MastershipService mastershipService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     private ClusterService clusterService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected DriverService driverService;
 
     private ConsistentMap<MeterKey, MeterData> meters;
diff --git a/incubator/store/src/main/java/org/onosproject/incubator/store/resource/impl/DistributedLabelResourceStore.java b/incubator/store/src/main/java/org/onosproject/incubator/store/resource/impl/DistributedLabelResourceStore.java
index 8361f61..7a26b76 100644
--- a/incubator/store/src/main/java/org/onosproject/incubator/store/resource/impl/DistributedLabelResourceStore.java
+++ b/incubator/store/src/main/java/org/onosproject/incubator/store/resource/impl/DistributedLabelResourceStore.java
@@ -15,28 +15,8 @@
  */
 package org.onosproject.incubator.store.resource.impl;
 
-import static org.onlab.util.Tools.groupedThreads;
-import static org.slf4j.LoggerFactory.getLogger;
-
-import java.util.Collection;
-import java.util.Collections;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.Map;
-import java.util.Set;
-import java.util.concurrent.ExecutionException;
-import java.util.concurrent.ExecutorService;
-import java.util.concurrent.Executors;
-import java.util.concurrent.Future;
-import java.util.concurrent.TimeUnit;
-import java.util.concurrent.TimeoutException;
-
-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.ImmutableSet;
+import com.google.common.collect.Multimap;
 import org.onlab.util.KryoNamespace;
 import org.onosproject.cluster.ClusterService;
 import org.onosproject.cluster.NodeId;
@@ -60,16 +40,33 @@
 import org.onosproject.store.service.Serializer;
 import org.onosproject.store.service.StorageService;
 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 com.google.common.collect.ImmutableSet;
-import com.google.common.collect.Multimap;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.Map;
+import java.util.Set;
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.concurrent.Future;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.TimeoutException;
+
+import static org.onlab.util.Tools.groupedThreads;
+import static org.slf4j.LoggerFactory.getLogger;
 
 /**
  * Manages label resources using copycat.
  */
-@Component(immediate = true, enabled = true)
-@Service
+@Component(immediate = true, service = LabelResourceStore.class)
 public class DistributedLabelResourceStore
         extends AbstractStore<LabelResourceEvent, LabelResourceDelegate>
         implements LabelResourceStore {
@@ -81,19 +78,19 @@
 
     private ConsistentMap<DeviceId, LabelResourcePool> resourcePool = null;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected StorageService storageService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected MastershipService mastershipService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected ClusterCommunicationService clusterCommunicator;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected ClusterService clusterService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected DeviceService deviceService;
 
     private ExecutorService messageHandlingExecutor;
diff --git a/incubator/store/src/main/java/org/onosproject/incubator/store/tunnel/impl/DistributedTunnelStore.java b/incubator/store/src/main/java/org/onosproject/incubator/store/tunnel/impl/DistributedTunnelStore.java
index 82f0140..7338f15 100644
--- a/incubator/store/src/main/java/org/onosproject/incubator/store/tunnel/impl/DistributedTunnelStore.java
+++ b/incubator/store/src/main/java/org/onosproject/incubator/store/tunnel/impl/DistributedTunnelStore.java
@@ -15,24 +15,9 @@
  */
 package org.onosproject.incubator.store.tunnel.impl;
 
-import static org.slf4j.LoggerFactory.getLogger;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Objects;
-import java.util.Set;
-
+import com.google.common.base.MoreObjects;
+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.KryoNamespace;
 import org.onosproject.cluster.ClusterService;
 import org.onosproject.core.ApplicationId;
@@ -62,20 +47,31 @@
 import org.onosproject.store.service.MultiValuedTimestamp;
 import org.onosproject.store.service.StorageService;
 import org.onosproject.store.service.WallClockTimestamp;
+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.base.MoreObjects;
-import com.google.common.collect.ImmutableSet;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+import java.util.Set;
 
 import static org.onosproject.store.service.EventuallyConsistentMapEvent.Type.PUT;
 import static org.onosproject.store.service.EventuallyConsistentMapEvent.Type.REMOVE;
+import static org.slf4j.LoggerFactory.getLogger;
 
 /**
  * Manages inventory of tunnel in distributed data store that uses optimistic
  * replication and gossip based techniques.
  */
-@Component(immediate = true)
-@Service
+@Component(immediate = true, service = TunnelStore.class)
 public class DistributedTunnelStore
         extends AbstractStore<TunnelEvent, TunnelStoreDelegate>
         implements TunnelStore {
@@ -87,16 +83,16 @@
      */
     private String tunnelOpTopic = "tunnel-ops-ids";
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected ClusterCommunicationService clusterCommunicator;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected ClusterService clusterService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected CoreService coreService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected StorageService storageService;
 
     // tunnel identity as map key in the store.
diff --git a/incubator/store/src/main/java/org/onosproject/incubator/store/virtual/impl/ConsistentVirtualDeviceMastershipStore.java b/incubator/store/src/main/java/org/onosproject/incubator/store/virtual/impl/ConsistentVirtualDeviceMastershipStore.java
index 4176130..bf741b0 100644
--- a/incubator/store/src/main/java/org/onosproject/incubator/store/virtual/impl/ConsistentVirtualDeviceMastershipStore.java
+++ b/incubator/store/src/main/java/org/onosproject/incubator/store/virtual/impl/ConsistentVirtualDeviceMastershipStore.java
@@ -16,13 +16,9 @@
 
 package org.onosproject.incubator.store.virtual.impl;
 
+import com.google.common.base.Objects;
+import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableMap;
-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.KryoNamespace;
 import org.onosproject.cluster.ClusterService;
 import org.onosproject.cluster.Leadership;
@@ -44,6 +40,11 @@
 import org.onosproject.store.cluster.messaging.MessageSubject;
 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 java.util.List;
@@ -58,34 +59,30 @@
 import java.util.regex.Pattern;
 import java.util.stream.Collectors;
 
+import static com.google.common.base.Preconditions.checkArgument;
 import static org.onlab.util.Tools.groupedThreads;
 import static org.onosproject.mastership.MastershipEvent.Type.BACKUPS_CHANGED;
 import static org.onosproject.mastership.MastershipEvent.Type.MASTER_CHANGED;
 import static org.onosproject.mastership.MastershipEvent.Type.SUSPENDED;
 import static org.slf4j.LoggerFactory.getLogger;
 
-import com.google.common.base.Objects;
-import com.google.common.collect.ImmutableList;
-import static com.google.common.base.Preconditions.checkArgument;
-
-@Component(immediate = true, enabled = false)
-@Service
+@Component(immediate = true, enabled = false, service = VirtualNetworkMastershipStore.class)
 public class ConsistentVirtualDeviceMastershipStore
         extends AbstractVirtualStore<MastershipEvent, MastershipStoreDelegate>
         implements VirtualNetworkMastershipStore {
 
     private final Logger log = getLogger(getClass());
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected LeadershipService leadershipService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected LeadershipAdminService leadershipAdminService;
 
-    @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 NodeId localNodeId;
diff --git a/incubator/store/src/main/java/org/onosproject/incubator/store/virtual/impl/DistributedVirtualFlowObjectiveStore.java b/incubator/store/src/main/java/org/onosproject/incubator/store/virtual/impl/DistributedVirtualFlowObjectiveStore.java
index 5ae8509..6e8cb7b 100644
--- a/incubator/store/src/main/java/org/onosproject/incubator/store/virtual/impl/DistributedVirtualFlowObjectiveStore.java
+++ b/incubator/store/src/main/java/org/onosproject/incubator/store/virtual/impl/DistributedVirtualFlowObjectiveStore.java
@@ -17,14 +17,13 @@
 package org.onosproject.incubator.store.virtual.impl;
 
 import com.google.common.collect.Maps;
-import org.apache.felix.scr.annotations.Component;
-import org.apache.felix.scr.annotations.Service;
 import org.onlab.util.KryoNamespace;
 import org.onosproject.incubator.net.virtual.NetworkId;
 import org.onosproject.incubator.net.virtual.VirtualNetworkFlowObjectiveStore;
 import org.onosproject.store.serializers.KryoNamespaces;
 import org.onosproject.store.service.ConsistentMap;
 import org.onosproject.store.service.Serializer;
+import org.osgi.service.component.annotations.Component;
 import org.slf4j.Logger;
 
 import java.util.concurrent.ConcurrentMap;
@@ -34,8 +33,7 @@
 /**
  * Distributed flow objective store for virtual network.
  */
-@Component(immediate = true, enabled = false)
-@Service
+@Component(immediate = true, enabled = false, service = VirtualNetworkFlowObjectiveStore.class)
 public class DistributedVirtualFlowObjectiveStore
         extends SimpleVirtualFlowObjectiveStore
         implements VirtualNetworkFlowObjectiveStore {
diff --git a/incubator/store/src/main/java/org/onosproject/incubator/store/virtual/impl/DistributedVirtualFlowRuleStore.java b/incubator/store/src/main/java/org/onosproject/incubator/store/virtual/impl/DistributedVirtualFlowRuleStore.java
index aaaf766..61ea506 100644
--- a/incubator/store/src/main/java/org/onosproject/incubator/store/virtual/impl/DistributedVirtualFlowRuleStore.java
+++ b/incubator/store/src/main/java/org/onosproject/incubator/store/virtual/impl/DistributedVirtualFlowRuleStore.java
@@ -22,14 +22,6 @@
 import com.google.common.collect.Iterables;
 import com.google.common.collect.Maps;
 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.util.KryoNamespace;
 import org.onlab.util.Tools;
 import org.onosproject.cfg.ComponentConfigService;
@@ -54,15 +46,15 @@
 import org.onosproject.net.flow.FlowEntry;
 import org.onosproject.net.flow.FlowId;
 import org.onosproject.net.flow.FlowRule;
-import org.onosproject.net.flow.oldbatch.FlowRuleBatchEntry;
-import org.onosproject.net.flow.oldbatch.FlowRuleBatchEvent;
-import org.onosproject.net.flow.oldbatch.FlowRuleBatchOperation;
-import org.onosproject.net.flow.oldbatch.FlowRuleBatchRequest;
 import org.onosproject.net.flow.FlowRuleEvent;
 import org.onosproject.net.flow.FlowRuleService;
 import org.onosproject.net.flow.FlowRuleStoreDelegate;
 import org.onosproject.net.flow.StoredFlowEntry;
 import org.onosproject.net.flow.TableStatisticsEntry;
+import org.onosproject.net.flow.oldbatch.FlowRuleBatchEntry;
+import org.onosproject.net.flow.oldbatch.FlowRuleBatchEvent;
+import org.onosproject.net.flow.oldbatch.FlowRuleBatchOperation;
+import org.onosproject.net.flow.oldbatch.FlowRuleBatchRequest;
 import org.onosproject.store.Timestamp;
 import org.onosproject.store.cluster.messaging.ClusterCommunicationService;
 import org.onosproject.store.cluster.messaging.ClusterMessage;
@@ -76,6 +68,12 @@
 import org.onosproject.store.service.StorageService;
 import org.onosproject.store.service.WallClockTimestamp;
 import org.osgi.service.component.ComponentContext;
+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.Collections;
@@ -96,6 +94,7 @@
 import static com.google.common.base.Strings.isNullOrEmpty;
 import static org.onlab.util.Tools.get;
 import static org.onlab.util.Tools.groupedThreads;
+import static org.onosproject.incubator.store.virtual.impl.OsgiPropertyConstants.*;
 import static org.onosproject.net.flow.FlowRuleEvent.Type.RULE_REMOVED;
 import static org.slf4j.LoggerFactory.getLogger;
 
@@ -104,8 +103,13 @@
  * for virtual networks.
  */
 //TODO: support backup and persistent mechanism
-@Component(immediate = true, enabled = false)
-@Service
+@Component(immediate = true, enabled = false, service = VirtualNetworkFlowRuleStore.class,
+        property = {
+                MESSAGE_HANDLER_THREAD_POOL_SIZE + ":Integer=" + MESSAGE_HANDLER_THREAD_POOL_SIZE_DEFAULT,
+                BACKUP_PERIOD_MILLIS + ":Integer=" + BACKUP_PERIOD_MILLIS_DEFAULT,
+                PERSISTENCE_ENABLED + ":Boolean=" + PERSISTENCE_ENABLED_DEFAULT,
+        })
+
 public class DistributedVirtualFlowRuleStore
         extends AbstractVirtualStore<FlowRuleBatchEvent, FlowRuleStoreDelegate>
         implements VirtualNetworkFlowRuleStore {
@@ -113,9 +117,6 @@
     private final Logger log = getLogger(getClass());
 
     //TODO: confirm this working fine with multiple thread more than 1
-    private static final int MESSAGE_HANDLER_THREAD_POOL_SIZE = 1;
-    private static final boolean DEFAULT_PERSISTENCE_ENABLED = false;
-    private static final int DEFAULT_BACKUP_PERIOD_MILLIS = 2000;
     private static final long FLOW_RULE_STORE_TIMEOUT_MILLIS = 5000;
 
     private static final String FLOW_OP_TOPIC = "virtual-flow-ops-ids";
@@ -132,35 +133,33 @@
     private static final MessageSubject REMOTE_APPLY_COMPLETED
             = new MessageSubject("virtual-peer-apply-completed");
 
-    @Property(name = "msgHandlerPoolSize", intValue = MESSAGE_HANDLER_THREAD_POOL_SIZE,
-            label = "Number of threads in the message handler pool")
-    private int msgHandlerPoolSize = MESSAGE_HANDLER_THREAD_POOL_SIZE;
+    /** Number of threads in the message handler pool. */
+    private int msgHandlerThreadPoolSize = MESSAGE_HANDLER_THREAD_POOL_SIZE_DEFAULT;
 
-    @Property(name = "backupPeriod", intValue = DEFAULT_BACKUP_PERIOD_MILLIS,
-            label = "Delay in ms between successive backup runs")
-    private int backupPeriod = DEFAULT_BACKUP_PERIOD_MILLIS;
-    @Property(name = "persistenceEnabled", boolValue = false,
-            label = "Indicates whether or not changes in the flow table should be persisted to disk.")
-    private boolean persistenceEnabled = DEFAULT_PERSISTENCE_ENABLED;
+    /** Delay in ms between successive backup runs. */
+    private int backupPeriod = BACKUP_PERIOD_MILLIS_DEFAULT;
+
+    /** Indicates whether or not changes in the flow table should be persisted to disk.. */
+    private boolean persistenceEnabled = PERSISTENCE_ENABLED_DEFAULT;
 
     private InternalFlowTable flowTable = new InternalFlowTable();
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected CoreService coreService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected ClusterService clusterService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected ClusterCommunicationService clusterCommunicator;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected ComponentConfigService configService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected StorageService storageService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected VirtualNetworkService vnaService;
 
     private Map<Long, NodeId> pendingResponses = Maps.newConcurrentMap();
@@ -198,7 +197,7 @@
         eventHandler = Executors.newSingleThreadExecutor(
                 groupedThreads("onos/virtual-flow", "event-handler", log));
         messageHandlingExecutor = Executors.newFixedThreadPool(
-                msgHandlerPoolSize, groupedThreads("onos/store/virtual-flow", "message-handlers", log));
+                msgHandlerThreadPoolSize, groupedThreads("onos/store/virtual-flow", "message-handlers", log));
 
         registerMessageHandlers(messageHandlingExecutor);
 
@@ -238,14 +237,14 @@
         int newPoolSize;
         int newBackupPeriod;
         try {
-            String s = get(properties, "msgHandlerPoolSize");
-            newPoolSize = isNullOrEmpty(s) ? msgHandlerPoolSize : Integer.parseInt(s.trim());
+            String s = get(properties, MESSAGE_HANDLER_THREAD_POOL_SIZE);
+            newPoolSize = isNullOrEmpty(s) ? msgHandlerThreadPoolSize : Integer.parseInt(s.trim());
 
-            s = get(properties, "backupPeriod");
+            s = get(properties, BACKUP_PERIOD_MILLIS);
             newBackupPeriod = isNullOrEmpty(s) ? backupPeriod : Integer.parseInt(s.trim());
         } catch (NumberFormatException | ClassCastException e) {
-            newPoolSize = MESSAGE_HANDLER_THREAD_POOL_SIZE;
-            newBackupPeriod = DEFAULT_BACKUP_PERIOD_MILLIS;
+            newPoolSize = MESSAGE_HANDLER_THREAD_POOL_SIZE_DEFAULT;
+            newBackupPeriod = BACKUP_PERIOD_MILLIS_DEFAULT;
         }
 
         boolean restartBackupTask = false;
@@ -257,11 +256,11 @@
         if (restartBackupTask) {
             log.warn("Currently, backup tasks are not supported.");
         }
-        if (newPoolSize != msgHandlerPoolSize) {
-            msgHandlerPoolSize = newPoolSize;
+        if (newPoolSize != msgHandlerThreadPoolSize) {
+            msgHandlerThreadPoolSize = newPoolSize;
             ExecutorService oldMsgHandler = messageHandlingExecutor;
             messageHandlingExecutor = Executors.newFixedThreadPool(
-                    msgHandlerPoolSize, groupedThreads("onos/store/virtual-flow", "message-handlers", log));
+                    msgHandlerThreadPoolSize, groupedThreads("onos/store/virtual-flow", "message-handlers", log));
 
             // replace previously registered handlers.
             registerMessageHandlers(messageHandlingExecutor);
@@ -567,7 +566,7 @@
 
     private void logConfig(String prefix) {
         log.info("{} with msgHandlerPoolSize = {}; backupPeriod = {}",
-                 prefix, msgHandlerPoolSize, backupPeriod);
+                 prefix, msgHandlerThreadPoolSize, backupPeriod);
     }
 
     private void storeBatchInternal(NetworkId networkId, FlowRuleBatchOperation operation) {
diff --git a/incubator/store/src/main/java/org/onosproject/incubator/store/virtual/impl/DistributedVirtualNetworkStore.java b/incubator/store/src/main/java/org/onosproject/incubator/store/virtual/impl/DistributedVirtualNetworkStore.java
index 5209543..24c8205 100644
--- a/incubator/store/src/main/java/org/onosproject/incubator/store/virtual/impl/DistributedVirtualNetworkStore.java
+++ b/incubator/store/src/main/java/org/onosproject/incubator/store/virtual/impl/DistributedVirtualNetworkStore.java
@@ -17,12 +17,6 @@
 
 import com.google.common.collect.ImmutableSet;
 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.onlab.packet.IpAddress;
 import org.onlab.packet.MacAddress;
 import org.onlab.packet.VlanId;
@@ -67,6 +61,11 @@
 import org.onosproject.store.service.SetEventListener;
 import org.onosproject.store.service.StorageService;
 import org.onosproject.store.service.WallClockTimestamp;
+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.HashSet;
@@ -84,18 +83,17 @@
 /**
  * Implementation of the virtual network store.
  */
-@Component(immediate = true)
-@Service
+@Component(immediate = true, service = VirtualNetworkStore.class)
 public class DistributedVirtualNetworkStore
         extends AbstractStore<VirtualNetworkEvent, VirtualNetworkStoreDelegate>
         implements VirtualNetworkStore {
 
     private final Logger log = getLogger(getClass());
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected StorageService storageService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected CoreService coreService;
 
     private IdGenerator idGenerator;
diff --git a/incubator/store/src/main/java/org/onosproject/incubator/store/virtual/impl/DistributedVirtualPacketStore.java b/incubator/store/src/main/java/org/onosproject/incubator/store/virtual/impl/DistributedVirtualPacketStore.java
index 002cbd4..cbf3860 100644
--- a/incubator/store/src/main/java/org/onosproject/incubator/store/virtual/impl/DistributedVirtualPacketStore.java
+++ b/incubator/store/src/main/java/org/onosproject/incubator/store/virtual/impl/DistributedVirtualPacketStore.java
@@ -20,14 +20,12 @@
 import com.google.common.collect.Lists;
 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.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.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.onlab.util.KryoNamespace;
 import org.onosproject.cfg.ComponentConfigService;
 import org.onosproject.cluster.ClusterService;
@@ -65,6 +63,8 @@
 import static java.util.concurrent.Executors.newFixedThreadPool;
 import static org.onlab.util.Tools.get;
 import static org.onlab.util.Tools.groupedThreads;
+import static org.onosproject.incubator.store.virtual.impl.OsgiPropertyConstants.MESSAGE_HANDLER_THREAD_POOL_SIZE;
+import static org.onosproject.incubator.store.virtual.impl.OsgiPropertyConstants.MESSAGE_HANDLER_THREAD_POOL_SIZE_DEFAULT;
 import static org.onosproject.net.packet.PacketEvent.Type.EMIT;
 import static org.slf4j.LoggerFactory.getLogger;
 
@@ -72,8 +72,10 @@
  * Distributed virtual packet store implementation allowing packets to be sent to
  * remote instances.  Implementation is based on DistributedPacketStore class.
  */
-@Component(immediate = true, enabled = false)
-@Service
+@Component(immediate = true, enabled = false, service = VirtualNetworkPacketStore.class,
+        property = {
+                 MESSAGE_HANDLER_THREAD_POOL_SIZE + ":Integer=" + MESSAGE_HANDLER_THREAD_POOL_SIZE_DEFAULT,
+        })
 public class DistributedVirtualPacketStore
         extends AbstractVirtualStore<PacketEvent, PacketStoreDelegate>
         implements VirtualNetworkPacketStore {
@@ -82,19 +84,19 @@
 
     private static final String FORMAT = "Setting: messageHandlerThreadPoolSize={}";
 
-    @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 communicationService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected StorageService storageService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected ComponentConfigService cfgService;
 
     private PacketRequestTracker tracker;
@@ -106,10 +108,8 @@
 
     private ExecutorService messageHandlingExecutor;
 
-    private static final int DEFAULT_MESSAGE_HANDLER_THREAD_POOL_SIZE = 4;
-    @Property(name = "messageHandlerThreadPoolSize", intValue = DEFAULT_MESSAGE_HANDLER_THREAD_POOL_SIZE,
-            label = "Size of thread pool to assign message handler")
-    private static int messageHandlerThreadPoolSize = DEFAULT_MESSAGE_HANDLER_THREAD_POOL_SIZE;
+    /** Size of thread pool to assign message handler. */
+    private static int messageHandlerThreadPoolSize = MESSAGE_HANDLER_THREAD_POOL_SIZE_DEFAULT;
 
     @Activate
     public void activate(ComponentContext context) {
@@ -149,7 +149,7 @@
         int newMessageHandlerThreadPoolSize;
 
         try {
-            String s = get(properties, "messageHandlerThreadPoolSize");
+            String s = get(properties, MESSAGE_HANDLER_THREAD_POOL_SIZE);
 
             newMessageHandlerThreadPoolSize =
                     isNullOrEmpty(s) ? messageHandlerThreadPoolSize : Integer.parseInt(s.trim());
diff --git a/incubator/store/src/main/java/org/onosproject/incubator/store/virtual/impl/OsgiPropertyConstants.java b/incubator/store/src/main/java/org/onosproject/incubator/store/virtual/impl/OsgiPropertyConstants.java
new file mode 100644
index 0000000..4670429
--- /dev/null
+++ b/incubator/store/src/main/java/org/onosproject/incubator/store/virtual/impl/OsgiPropertyConstants.java
@@ -0,0 +1,38 @@
+/*
+ * Copyright 2018-present Open Networking Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.onosproject.incubator.store.virtual.impl;
+
+/**
+ * Constants for default values of configurable properties.
+ */
+public final class OsgiPropertyConstants {
+
+    private OsgiPropertyConstants() {}
+
+    public static final String MESSAGE_HANDLER_THREAD_POOL_SIZE = "messageHandlerThreadPoolSize";
+    public static final int MESSAGE_HANDLER_THREAD_POOL_SIZE_DEFAULT = 4;
+
+    public static final String BACKUP_PERIOD_MILLIS = "backupPeriod";
+    public static final int BACKUP_PERIOD_MILLIS_DEFAULT = 2000;
+
+    public static final String PERSISTENCE_ENABLED = "persistenceEnabled";
+    public static final boolean PERSISTENCE_ENABLED_DEFAULT = false;
+
+    public static final String PENDING_FUTURE_TIMEOUT_MINUTES = "pendingFutureTimeoutMinutes";
+    public static final int PENDING_FUTURE_TIMEOUT_MINUTES_DEFAULT = 5;
+
+}
diff --git a/incubator/store/src/main/java/org/onosproject/incubator/store/virtual/impl/SimpleVirtualFlowObjectiveStore.java b/incubator/store/src/main/java/org/onosproject/incubator/store/virtual/impl/SimpleVirtualFlowObjectiveStore.java
index f8824b9..6ec1f70 100644
--- a/incubator/store/src/main/java/org/onosproject/incubator/store/virtual/impl/SimpleVirtualFlowObjectiveStore.java
+++ b/incubator/store/src/main/java/org/onosproject/incubator/store/virtual/impl/SimpleVirtualFlowObjectiveStore.java
@@ -17,11 +17,6 @@
 package org.onosproject.incubator.store.virtual.impl;
 
 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.Reference;
-import org.apache.felix.scr.annotations.ReferenceCardinality;
-import org.apache.felix.scr.annotations.Service;
 import org.onosproject.incubator.net.virtual.NetworkId;
 import org.onosproject.incubator.net.virtual.VirtualNetworkFlowObjectiveStore;
 import org.onosproject.net.behaviour.DefaultNextGroup;
@@ -30,6 +25,10 @@
 import org.onosproject.net.flowobjective.ObjectiveEvent;
 import org.onosproject.store.service.AtomicCounter;
 import org.onosproject.store.service.StorageService;
+import org.osgi.service.component.annotations.Activate;
+import org.osgi.service.component.annotations.Component;
+import org.osgi.service.component.annotations.Reference;
+import org.osgi.service.component.annotations.ReferenceCardinality;
 import org.slf4j.Logger;
 
 import java.util.HashMap;
@@ -47,8 +46,7 @@
  * Single instance implementation of store to manage
  * the inventory of created next groups for virtual network.
  */
-@Component(immediate = true)
-@Service
+@Component(immediate = true, service = VirtualNetworkFlowObjectiveStore.class)
 public class SimpleVirtualFlowObjectiveStore
         extends AbstractVirtualStore<ObjectiveEvent, FlowObjectiveStoreDelegate>
         implements VirtualNetworkFlowObjectiveStore {
@@ -63,7 +61,7 @@
     private BlockingQueue<VirtualObjectiveEvent> eventQ;
     private ExecutorService tpool;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected StorageService storageService;
 
     @Activate
diff --git a/incubator/store/src/main/java/org/onosproject/incubator/store/virtual/impl/SimpleVirtualFlowRuleStore.java b/incubator/store/src/main/java/org/onosproject/incubator/store/virtual/impl/SimpleVirtualFlowRuleStore.java
index 502796b..ab2c792 100644
--- a/incubator/store/src/main/java/org/onosproject/incubator/store/virtual/impl/SimpleVirtualFlowRuleStore.java
+++ b/incubator/store/src/main/java/org/onosproject/incubator/store/virtual/impl/SimpleVirtualFlowRuleStore.java
@@ -23,14 +23,6 @@
 import com.google.common.collect.FluentIterable;
 import com.google.common.collect.Sets;
 import com.google.common.util.concurrent.SettableFuture;
-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.util.Tools;
 import org.onosproject.incubator.net.virtual.NetworkId;
 import org.onosproject.incubator.net.virtual.VirtualNetworkFlowRuleStore;
@@ -40,16 +32,22 @@
 import org.onosproject.net.flow.FlowEntry;
 import org.onosproject.net.flow.FlowId;
 import org.onosproject.net.flow.FlowRule;
-import org.onosproject.net.flow.oldbatch.FlowRuleBatchEntry;
-import org.onosproject.net.flow.oldbatch.FlowRuleBatchEvent;
-import org.onosproject.net.flow.oldbatch.FlowRuleBatchOperation;
-import org.onosproject.net.flow.oldbatch.FlowRuleBatchRequest;
 import org.onosproject.net.flow.FlowRuleEvent;
 import org.onosproject.net.flow.FlowRuleStoreDelegate;
 import org.onosproject.net.flow.StoredFlowEntry;
 import org.onosproject.net.flow.TableStatisticsEntry;
+import org.onosproject.net.flow.oldbatch.FlowRuleBatchEntry;
+import org.onosproject.net.flow.oldbatch.FlowRuleBatchEvent;
+import org.onosproject.net.flow.oldbatch.FlowRuleBatchOperation;
+import org.onosproject.net.flow.oldbatch.FlowRuleBatchRequest;
 import org.onosproject.store.service.StorageService;
 import org.osgi.service.component.ComponentContext;
+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;
@@ -64,6 +62,8 @@
 import java.util.concurrent.TimeoutException;
 import java.util.concurrent.atomic.AtomicInteger;
 
+import static org.onosproject.incubator.store.virtual.impl.OsgiPropertyConstants.PENDING_FUTURE_TIMEOUT_MINUTES;
+import static org.onosproject.incubator.store.virtual.impl.OsgiPropertyConstants.PENDING_FUTURE_TIMEOUT_MINUTES_DEFAULT;
 import static org.onosproject.net.flow.FlowRuleEvent.Type.RULE_REMOVED;
 import static org.slf4j.LoggerFactory.getLogger;
 
@@ -73,15 +73,17 @@
  */
 //TODO: support distributed flowrule store for virtual networks
 
-@Component(immediate = true)
-@Service
+@Component(immediate = true, service = VirtualNetworkFlowRuleStore.class,
+        property = {
+                 PENDING_FUTURE_TIMEOUT_MINUTES + ":Integer=" + PENDING_FUTURE_TIMEOUT_MINUTES_DEFAULT,
+        })
 public class SimpleVirtualFlowRuleStore
         extends AbstractVirtualStore<FlowRuleBatchEvent, FlowRuleStoreDelegate>
         implements VirtualNetworkFlowRuleStore {
 
     private final Logger log = getLogger(getClass());
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected StorageService storageService;
 
     private final ConcurrentMap<NetworkId,
@@ -91,10 +93,8 @@
 
     private final AtomicInteger localBatchIdGen = new AtomicInteger();
 
-    private static final int DEFAULT_PENDING_FUTURE_TIMEOUT_MINUTES = 5;
-    @Property(name = "pendingFutureTimeoutMinutes", intValue = DEFAULT_PENDING_FUTURE_TIMEOUT_MINUTES,
-            label = "Expiration time after an entry is created that it should be automatically removed")
-    private int pendingFutureTimeoutMinutes = DEFAULT_PENDING_FUTURE_TIMEOUT_MINUTES;
+    /** Expiration time after an entry is created that it should be automatically removed. */
+    private int pendingFutureTimeoutMinutes = PENDING_FUTURE_TIMEOUT_MINUTES_DEFAULT;
 
     private Cache<Integer, SettableFuture<CompletedBatchOperation>> pendingFutures =
             CacheBuilder.newBuilder()
@@ -139,7 +139,7 @@
         Integer newPendingFutureTimeoutMinutes =
                 Tools.getIntegerProperty(properties, "pendingFutureTimeoutMinutes");
         if (newPendingFutureTimeoutMinutes == null) {
-            pendingFutureTimeoutMinutes = DEFAULT_PENDING_FUTURE_TIMEOUT_MINUTES;
+            pendingFutureTimeoutMinutes = PENDING_FUTURE_TIMEOUT_MINUTES_DEFAULT;
             log.info("Pending future timeout is not configured, " +
                              "using current value of {}", pendingFutureTimeoutMinutes);
         } else {
diff --git a/incubator/store/src/main/java/org/onosproject/incubator/store/virtual/impl/SimpleVirtualGroupStore.java b/incubator/store/src/main/java/org/onosproject/incubator/store/virtual/impl/SimpleVirtualGroupStore.java
index 1992416..4d6709b 100644
--- a/incubator/store/src/main/java/org/onosproject/incubator/store/virtual/impl/SimpleVirtualGroupStore.java
+++ b/incubator/store/src/main/java/org/onosproject/incubator/store/virtual/impl/SimpleVirtualGroupStore.java
@@ -18,10 +18,6 @@
 
 import com.google.common.collect.FluentIterable;
 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.Service;
 import org.onosproject.core.GroupId;
 import org.onosproject.incubator.net.virtual.NetworkId;
 import org.onosproject.incubator.net.virtual.VirtualNetworkGroupStore;
@@ -38,6 +34,9 @@
 import org.onosproject.net.group.GroupStoreDelegate;
 import org.onosproject.net.group.StoredGroupBucketEntry;
 import org.onosproject.net.group.StoredGroupEntry;
+import org.osgi.service.component.annotations.Activate;
+import org.osgi.service.component.annotations.Component;
+import org.osgi.service.component.annotations.Deactivate;
 import org.slf4j.Logger;
 
 import java.util.ArrayList;
@@ -57,8 +56,7 @@
 /**
  * Manages inventory of virtual group entries using trivial in-memory implementation.
  */
-@Component(immediate = true)
-@Service
+@Component(immediate = true, service = VirtualNetworkGroupStore.class)
 public class SimpleVirtualGroupStore
         extends AbstractVirtualStore<GroupEvent, GroupStoreDelegate>
         implements VirtualNetworkGroupStore {
diff --git a/incubator/store/src/main/java/org/onosproject/incubator/store/virtual/impl/SimpleVirtualIntentStore.java b/incubator/store/src/main/java/org/onosproject/incubator/store/virtual/impl/SimpleVirtualIntentStore.java
index bfc42cf..092e65d 100644
--- a/incubator/store/src/main/java/org/onosproject/incubator/store/virtual/impl/SimpleVirtualIntentStore.java
+++ b/incubator/store/src/main/java/org/onosproject/incubator/store/virtual/impl/SimpleVirtualIntentStore.java
@@ -19,10 +19,6 @@
 import com.google.common.collect.ComparisonChain;
 import com.google.common.collect.Lists;
 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.Service;
 import org.onosproject.incubator.net.virtual.NetworkId;
 import org.onosproject.incubator.net.virtual.VirtualNetworkIntentStore;
 import org.onosproject.net.intent.Intent;
@@ -32,6 +28,9 @@
 import org.onosproject.net.intent.IntentStoreDelegate;
 import org.onosproject.net.intent.Key;
 import org.onosproject.store.Timestamp;
+import org.osgi.service.component.annotations.Activate;
+import org.osgi.service.component.annotations.Component;
+import org.osgi.service.component.annotations.Deactivate;
 import org.slf4j.Logger;
 
 import java.util.List;
@@ -47,8 +46,7 @@
  * Simple single-instance implementation of the intent store for virtual networks.
  */
 
-@Component(immediate = true)
-@Service
+@Component(immediate = true, service = VirtualNetworkIntentStore.class)
 public class SimpleVirtualIntentStore
         extends AbstractVirtualStore<IntentEvent, IntentStoreDelegate>
         implements VirtualNetworkIntentStore {
diff --git a/incubator/store/src/main/java/org/onosproject/incubator/store/virtual/impl/SimpleVirtualMastershipStore.java b/incubator/store/src/main/java/org/onosproject/incubator/store/virtual/impl/SimpleVirtualMastershipStore.java
index 32c823e..e3b58ea 100644
--- a/incubator/store/src/main/java/org/onosproject/incubator/store/virtual/impl/SimpleVirtualMastershipStore.java
+++ b/incubator/store/src/main/java/org/onosproject/incubator/store/virtual/impl/SimpleVirtualMastershipStore.java
@@ -19,12 +19,6 @@
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableMap;
 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.apache.felix.scr.annotations.Service;
 import org.onlab.packet.IpAddress;
 import org.onosproject.cluster.ClusterEventListener;
 import org.onosproject.cluster.ClusterService;
@@ -43,6 +37,11 @@
 import org.onosproject.mastership.MastershipTerm;
 import org.onosproject.net.DeviceId;
 import org.onosproject.net.MastershipRole;
+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;
@@ -66,8 +65,7 @@
  * Implementation of the virtual network mastership store to manage inventory of
  * mastership using trivial in-memory implementation.
  */
-@Component(immediate = true)
-@Service
+@Component(immediate = true, service = VirtualNetworkMastershipStore.class)
 public class SimpleVirtualMastershipStore
         extends AbstractVirtualStore<MastershipEvent, MastershipStoreDelegate>
         implements VirtualNetworkMastershipStore {
@@ -77,10 +75,10 @@
     private static final int NOTHING = 0;
     private static final int INIT = 1;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected ClusterService clusterService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected VersionService versionService;
 
     //devices mapped to their masters, to emulate multiple nodes
diff --git a/incubator/store/src/main/java/org/onosproject/incubator/store/virtual/impl/SimpleVirtualMeterStore.java b/incubator/store/src/main/java/org/onosproject/incubator/store/virtual/impl/SimpleVirtualMeterStore.java
index 3042f33..b700c95 100644
--- a/incubator/store/src/main/java/org/onosproject/incubator/store/virtual/impl/SimpleVirtualMeterStore.java
+++ b/incubator/store/src/main/java/org/onosproject/incubator/store/virtual/impl/SimpleVirtualMeterStore.java
@@ -18,12 +18,6 @@
 
 import com.google.common.collect.Collections2;
 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.onosproject.cluster.ClusterService;
 import org.onosproject.cluster.NodeId;
 import org.onosproject.incubator.net.virtual.NetworkId;
@@ -41,6 +35,11 @@
 import org.onosproject.net.meter.MeterStoreDelegate;
 import org.onosproject.net.meter.MeterStoreResult;
 import org.onosproject.store.service.StorageException;
+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;
@@ -55,15 +54,14 @@
  * Implementation of the virtual meter store for a single instance.
  */
 //TODO: support distributed meter store for virtual networks
-@Component(immediate = true)
-@Service
+@Component(immediate = true, service = VirtualNetworkMeterStore.class)
 public class SimpleVirtualMeterStore
         extends AbstractVirtualStore<MeterEvent, MeterStoreDelegate>
         implements VirtualNetworkMeterStore {
 
         private Logger log = getLogger(getClass());
 
-        @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+        @Reference(cardinality = ReferenceCardinality.MANDATORY)
         protected ClusterService clusterService;
 
         private ConcurrentMap<NetworkId, ConcurrentMap<MeterKey, MeterData>> meterMap =
diff --git a/incubator/store/src/main/java/org/onosproject/incubator/store/virtual/impl/SimpleVirtualPacketStore.java b/incubator/store/src/main/java/org/onosproject/incubator/store/virtual/impl/SimpleVirtualPacketStore.java
index 9ed5789..944f3e7 100644
--- a/incubator/store/src/main/java/org/onosproject/incubator/store/virtual/impl/SimpleVirtualPacketStore.java
+++ b/incubator/store/src/main/java/org/onosproject/incubator/store/virtual/impl/SimpleVirtualPacketStore.java
@@ -20,10 +20,6 @@
 import com.google.common.collect.Lists;
 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.Service;
 import org.onosproject.incubator.net.virtual.NetworkId;
 import org.onosproject.incubator.net.virtual.VirtualNetworkPacketStore;
 import org.onosproject.net.flow.TrafficSelector;
@@ -31,6 +27,9 @@
 import org.onosproject.net.packet.PacketEvent;
 import org.onosproject.net.packet.PacketRequest;
 import org.onosproject.net.packet.PacketStoreDelegate;
+import org.osgi.service.component.annotations.Activate;
+import org.osgi.service.component.annotations.Component;
+import org.osgi.service.component.annotations.Deactivate;
 import org.slf4j.Logger;
 
 import java.util.HashSet;
@@ -45,8 +44,7 @@
  */
 //TODO: support distributed packet store for virtual networks
 
-@Component(immediate = true)
-@Service
+@Component(immediate = true, service = VirtualNetworkPacketStore.class)
 public class SimpleVirtualPacketStore
         extends AbstractVirtualStore<PacketEvent, PacketStoreDelegate>
         implements VirtualNetworkPacketStore {
diff --git a/lib/BUCK b/lib/BUCK
deleted file mode 100644
index 7482082..0000000
--- a/lib/BUCK
+++ /dev/null
@@ -1,2049 +0,0 @@
-# ***** This file was auto-generated at Fri, 12 Oct 2018 17:49:41 GMT. Do not edit this file manually. *****
-# ***** Use onos-lib-gen *****
-
-pass_thru_pom(
-    name = 'onos-dependencies-pom',
-    src = 'pom.xml',
-    out = 'onos-dependencies.pom',
-    artifactId = 'onos-dependencies',
-)
-
-osgi_feature_group(
-  name = 'COMPILE',
-  visibility = ['PUBLIC'],
-  exported_deps = [
-    ':commons-configuration',
-    ':commons-logging',
-    ':commons-collections',
-    ':commons-lang',
-    ':commons-lang3',
-    ':commons-io',
-    ':commons-pool',
-    ':com_google_guava_guava',
-    ':slf4j-api',
-    ':osgi-core',
-    ':org.osgi.compendium',
-    ':org.apache.felix.scr.annotations',
-    ':org.apache.felix.scr',
-    ':org.apache.karaf.features.core',
-    ':org.apache.karaf.system.core',
-    ':com_google_code_findbugs_jsr305',
-    ':org.apache.servicemix.bundles.dom4j',
-  ],
-)
-
-osgi_feature_group(
-  name = 'CORE_DEPS',
-  visibility = ['PUBLIC'],
-  exported_deps = [
-    ':COMPILE',
-    '//core/api:onos-api',
-    '//utils/misc:onlab-misc',
-    '//utils/osgi:onlab-osgi',
-  ],
-)
-
-osgi_feature_group(
-  name = 'TEST',
-  visibility = ['PUBLIC'],
-  exported_deps = [
-    ':junit',
-    ':easymock',
-    ':hamcrest-all',
-    ':hamcrest-optional',
-    ':com_google_guava_guava_testlib',
-    '//utils/junit:onlab-junit',
-  ],
-)
-
-osgi_feature_group(
-  name = 'TEST_ADAPTERS',
-  visibility = ['PUBLIC'],
-  exported_deps = [
-    ':TEST',
-    '//core/common:onos-core-common',
-    '//core/api:onos-api-tests',
-    '//core/common:onos-core-common-tests',
-  ],
-)
-
-osgi_feature_group(
-  name = 'TEST_REST',
-  visibility = ['PUBLIC'],
-  exported_deps = [
-    ':TEST_ADAPTERS',
-    ':jersey-client',
-    ':jersey-server',
-    ':jersey-common',
-    ':jersey-hk2',
-    ':jersey-test-framework-core',
-    ':jersey-test-framework-jetty',
-    ':jersey-container-jetty-http',
-    ':jetty-continuation',
-    ':jetty-http',
-    ':jetty-server',
-    ':jetty-io',
-    ':jetty-util',
-    ':javax.servlet-api',
-    ':hk2-api',
-    ':hk2-locator',
-    ':hk2-utils',
-    ':javax.inject',
-    ':hk2-osgi-resource-locator',
-    ':javax.annotation-api-mvn',
-    ':validation-api',
-    '//core/common:onos-core-common',
-    '//core/api:onos-api-tests',
-    '//core/common:onos-core-common-tests',
-    '//utils/osgi:onlab-osgi-tests',
-  ],
-)
-
-osgi_feature_group(
-  name = 'NETTY',
-  visibility = ['PUBLIC'],
-  exported_deps = [
-    ':io_netty_netty_buffer',
-    ':io_netty_netty_common',
-  ],
-)
-
-osgi_feature_group(
-  name = 'ONOS_YANG',
-  visibility = ['PUBLIC'],
-  exported_deps = [
-    ':onos-yang-model',
-    ':onos-yang-compiler-api',
-    ':onos-yang-serializers-json',
-    ':onos-yang-serializers-xml',
-    ':onos-yang-serializers-utils',
-  ],
-)
-
-osgi_feature_group(
-  name = 'JACKSON',
-  visibility = ['PUBLIC'],
-  exported_deps = [
-    ':jackson-annotations',
-    ':jackson-core',
-    ':jackson-databind',
-  ],
-)
-
-osgi_feature_group(
-  name = 'METRICS',
-  visibility = ['PUBLIC'],
-  exported_deps = [
-    ':metrics-core',
-    ':metrics-json',
-  ],
-)
-
-osgi_feature_group(
-  name = 'KRYO',
-  visibility = ['PUBLIC'],
-  exported_deps = [
-    ':kryo',
-    ':reflectasm',
-    ':asm',
-    ':minlog',
-    ':objenesis',
-  ],
-)
-
-osgi_feature_group(
-  name = 'CLI',
-  visibility = ['PUBLIC'],
-  exported_deps = [
-    ':org.apache.karaf.shell.console',
-    '//cli:onos-cli',
-  ],
-)
-
-osgi_feature_group(
-  name = 'REST',
-  visibility = ['PUBLIC'],
-  exported_deps = [
-    ':javax.ws.rs-api',
-    '//utils/rest:onlab-rest',
-  ],
-)
-
-osgi_feature_group(
-  name = 'ATOMIX',
-  visibility = ['PUBLIC'],
-  exported_deps = [
-    ':atomix',
-    ':atomix-cluster',
-    ':atomix-gossip',
-    ':atomix-primary-backup',
-    ':atomix-primitive',
-    ':atomix-raft',
-    ':atomix-storage',
-    ':atomix-utils',
-    ':typesafe-config',
-    ':classgraph',
-  ],
-)
-
-osgi_feature_group(
-  name = 'GRPC_1.3',
-  visibility = ['PUBLIC'],
-  exported_deps = [
-    ':grpc-protobuf-1.3.1',
-    ':grpc-stub-1.3.1',
-    ':grpc-netty-1.3.1',
-    ':grpc-auth-1.3.1',
-    ':grpc-context-1.3.1',
-    ':google-truth-0.28',
-  ],
-)
-
-osgi_feature_group(
-  name = 'GRPC_TEST_1.3',
-  visibility = ['PUBLIC'],
-  exported_deps = [
-    ':grpc-testing-1.3.1',
-    ':grpc-testing-proto-1.3.1',
-    ':google-code-findbugs-3.0.0',
-    ':google-errorprone-2.0.19',
-    ':google-instrumentation-0.3.0',
-    ':junit-dep',
-    ':objenesis',
-  ],
-)
-
-remote_jar (
-  name = 'aopalliance-repackaged',
-  out = 'aopalliance-repackaged-2.5.0-b42.jar',
-  url = 'mvn:org.glassfish.hk2.external:aopalliance-repackaged:jar:2.5.0-b42',
-  sha1 = 'e74beab6ca12e9e745eb47ca61729d9452b96f0c',
-  maven_coords = 'org.glassfish.hk2.external:aopalliance-repackaged:2.5.0-b42',
-  visibility = [ 'PUBLIC' ],
-)
-
-remote_jar (
-  name = 'amqp-client',
-  out = 'amqp-client-3.6.1.jar',
-  url = 'mvn:com.rabbitmq:amqp-client:jar:3.6.1',
-  sha1 = '089be4acfa8a0fa48a775a82d20632f90aecf10b',
-  maven_coords = 'com.rabbitmq:amqp-client:3.6.1',
-  visibility = [ 'PUBLIC' ],
-)
-
-remote_jar (
-  name = 'asm',
-  out = 'asm-5.0.4.jar',
-  url = 'mvn:org.ow2.asm:asm:jar:5.0.4',
-  sha1 = '0da08b8cce7bbf903602a25a3a163ae252435795',
-  maven_coords = 'org.ow2.asm:asm:5.0.4',
-  visibility = [ 'PUBLIC' ],
-)
-
-remote_jar (
-  name = 'atomix',
-  out = 'atomix-3.0.7.jar',
-  url = 'mvn:io.atomix:atomix:jar:3.0.7',
-  sha1 = 'd2c0cdbdc4e7c242d1fe476892fdbc31a1468d43',
-  maven_coords = 'io.atomix:atomix:3.0.7',
-  visibility = [ 'PUBLIC' ],
-)
-
-remote_jar (
-  name = 'atomix-cluster',
-  out = 'atomix-cluster-3.0.7.jar',
-  url = 'mvn:io.atomix:atomix-cluster:jar:3.0.7',
-  sha1 = '1bf4ca3d10f8be0c87588b531a200d982ef6f1a3',
-  maven_coords = 'io.atomix:atomix-cluster:3.0.7',
-  visibility = [ 'PUBLIC' ],
-)
-
-remote_jar (
-  name = 'atomix-gossip',
-  out = 'atomix-gossip-3.0.7.jar',
-  url = 'mvn:io.atomix:atomix-gossip:jar:3.0.7',
-  sha1 = 'c702172c4d77cea0fb95ad953ee36c2bae73db34',
-  maven_coords = 'io.atomix:atomix-gossip:3.0.7',
-  visibility = [ 'PUBLIC' ],
-)
-
-remote_jar (
-  name = 'atomix-primary-backup',
-  out = 'atomix-primary-backup-3.0.7.jar',
-  url = 'mvn:io.atomix:atomix-primary-backup:jar:3.0.7',
-  sha1 = 'b5269c7bc1172966928ec14af098f02c65c78c97',
-  maven_coords = 'io.atomix:atomix-primary-backup:3.0.7',
-  visibility = [ 'PUBLIC' ],
-)
-
-remote_jar (
-  name = 'atomix-primitive',
-  out = 'atomix-primitive-3.0.7.jar',
-  url = 'mvn:io.atomix:atomix-primitive:jar:3.0.7',
-  sha1 = '41c55b48913ceffecaa846395e19dbe2e959d145',
-  maven_coords = 'io.atomix:atomix-primitive:3.0.7',
-  visibility = [ 'PUBLIC' ],
-)
-
-remote_jar (
-  name = 'atomix-raft',
-  out = 'atomix-raft-3.0.7.jar',
-  url = 'mvn:io.atomix:atomix-raft:jar:3.0.7',
-  sha1 = '9b294e0568df35d1a58971b2748426da7d13e849',
-  maven_coords = 'io.atomix:atomix-raft:3.0.7',
-  visibility = [ 'PUBLIC' ],
-)
-
-remote_jar (
-  name = 'atomix-storage',
-  out = 'atomix-storage-3.0.7.jar',
-  url = 'mvn:io.atomix:atomix-storage:jar:3.0.7',
-  sha1 = '451575082ad5bd0257372bd34c29ac0bf1120133',
-  maven_coords = 'io.atomix:atomix-storage:3.0.7',
-  visibility = [ 'PUBLIC' ],
-)
-
-remote_jar (
-  name = 'atomix-utils',
-  out = 'atomix-utils-3.0.7.jar',
-  url = 'mvn:io.atomix:atomix-utils:jar:3.0.7',
-  sha1 = '647aee1cab71c3b816c8a205d0d55bdae9047434',
-  maven_coords = 'io.atomix:atomix-utils:3.0.7',
-  visibility = [ 'PUBLIC' ],
-)
-
-remote_jar (
-  name = 'classgraph',
-  out = 'classgraph-4.2.3.jar',
-  url = 'mvn:io.github.classgraph:classgraph:jar:4.2.3',
-  sha1 = '5c9bfb002097a6cf6c7134821954e24326db3a7b',
-  maven_coords = 'io.github.classgraph:classgraph:4.2.3',
-  visibility = [ 'PUBLIC' ],
-)
-
-remote_jar (
-  name = 'commons-codec',
-  out = 'commons-codec-1.10.jar',
-  url = 'mvn:commons-codec:commons-codec:jar:1.10',
-  sha1 = '4b95f4897fa13f2cd904aee711aeafc0c5295cd8',
-  maven_coords = 'commons-codec:commons-codec:1.10',
-  visibility = [ 'PUBLIC' ],
-)
-
-remote_jar (
-  name = 'commons-cli',
-  out = 'commons-cli-1.3.jar',
-  url = 'mvn:commons-cli:commons-cli:jar:1.3',
-  sha1 = 'a48653b6bcd06b5e61ed63739ca601701fcb6a6c',
-  maven_coords = 'commons-cli:commons-cli:1.3',
-  visibility = [ 'PUBLIC' ],
-)
-
-remote_jar (
-  name = 'commons-collections',
-  out = 'commons-collections-3.2.2.jar',
-  url = 'mvn:commons-collections:commons-collections:jar:3.2.2',
-  sha1 = '8ad72fe39fa8c91eaaf12aadb21e0c3661fe26d5',
-  maven_coords = 'commons-collections:commons-collections:3.2.2',
-  visibility = [ 'PUBLIC' ],
-)
-
-remote_jar (
-  name = 'commons-configuration',
-  out = 'commons-configuration-1.10.jar',
-  url = 'mvn:commons-configuration:commons-configuration:jar:1.10',
-  sha1 = '2b36e4adfb66d966c5aef2d73deb6be716389dc9',
-  maven_coords = 'commons-configuration:commons-configuration:1.10',
-  visibility = [ 'PUBLIC' ],
-)
-
-remote_jar (
-  name = 'commons-io',
-  out = 'commons-io-2.6.jar',
-  url = 'mvn:commons-io:commons-io:jar:2.6',
-  sha1 = '815893df5f31da2ece4040fe0a12fd44b577afaf',
-  maven_coords = 'commons-io:commons-io:2.6',
-  visibility = [ 'PUBLIC' ],
-)
-
-remote_jar (
-  name = 'commons-jxpath',
-  out = 'commons-jxpath-1.3.jar',
-  url = 'mvn:commons-jxpath:commons-jxpath:jar:1.3',
-  sha1 = 'c22d7d0f0f40eb7059a23cfa61773a416768b137',
-  maven_coords = 'commons-jxpath:commons-jxpath:1.3',
-  visibility = [ 'PUBLIC' ],
-)
-
-remote_jar (
-  name = 'commons-beanutils',
-  out = 'commons-beanutils-1.9.3.jar',
-  url = 'mvn:commons-beanutils:commons-beanutils:jar:1.9.3',
-  sha1 = 'c845703de334ddc6b4b3cd26835458cb1cba1f3d',
-  maven_coords = 'commons-beanutils:commons-beanutils:1.9.3',
-  visibility = [ 'PUBLIC' ],
-)
-
-remote_jar (
-  name = 'fast-classpath-scanner',
-  out = 'fast-classpath-scanner-2.21.jar',
-  url = 'mvn:io.github.lukehutch:fast-classpath-scanner:jar:2.21',
-  sha1 = '0cc8e22b412521480c89ac79194e82bd4471dd75',
-  maven_coords = 'io.github.lukehutch:fast-classpath-scanner:2.21',
-  visibility = [ 'PUBLIC' ],
-)
-
-remote_jar (
-  name = 'jdom',
-  out = 'jdom-1.0.jar',
-  url = 'mvn:jdom:jdom:jar:1.0',
-  sha1 = 'a2ac1cd690ab4c80defe7f9bce14d35934c35cec',
-  maven_coords = 'jdom:jdom:jar:NON-OSGI:1.0',
-  visibility = [ 'PUBLIC' ],
-)
-
-remote_jar (
-  name = 'commons-lang',
-  out = 'commons-lang-2.6.jar',
-  url = 'mvn:commons-lang:commons-lang:jar:2.6',
-  sha1 = '0ce1edb914c94ebc388f086c6827e8bdeec71ac2',
-  maven_coords = 'commons-lang:commons-lang:2.6',
-  visibility = [ 'PUBLIC' ],
-)
-
-remote_jar (
-  name = 'commons-lang3',
-  out = 'commons-lang3-3.7.jar',
-  url = 'mvn:org.apache.commons:commons-lang3:jar:3.7',
-  sha1 = '557edd918fd41f9260963583ebf5a61a43a6b423',
-  maven_coords = 'org.apache.commons:commons-lang3:3.7',
-  visibility = [ 'PUBLIC' ],
-)
-
-remote_jar (
-  name = 'commons-logging',
-  out = 'commons-logging-1.2.jar',
-  url = 'mvn:commons-logging:commons-logging:jar:1.2',
-  sha1 = '4bfc12adfe4842bf07b657f0369c4cb522955686',
-  maven_coords = 'commons-logging:commons-logging:1.2',
-  visibility = [ 'PUBLIC' ],
-)
-
-remote_jar (
-  name = 'commons-math3',
-  out = 'commons-math3-3.6.1.jar',
-  url = 'mvn:org.apache.commons:commons-math3:jar:3.6.1',
-  sha1 = 'e4ba98f1d4b3c80ec46392f25e094a6a2e58fcbf',
-  maven_coords = 'org.apache.commons:commons-math3:3.6.1',
-  visibility = [ 'PUBLIC' ],
-)
-
-remote_jar (
-  name = 'commons-net',
-  out = 'commons-net-3.5.jar',
-  url = 'mvn:commons-net:commons-net:jar:3.5',
-  sha1 = '342fc284019f590e1308056990fdb24a08f06318',
-  maven_coords = 'commons-net:commons-net:3.5',
-  visibility = [ 'PUBLIC' ],
-)
-
-remote_jar (
-  name = 'commons-pool',
-  out = 'commons-pool-1.6.jar',
-  url = 'mvn:commons-pool:commons-pool:jar:1.6',
-  sha1 = '4572d589699f09d866a226a14b7f4323c6d8f040',
-  maven_coords = 'commons-pool:commons-pool:1.6',
-  visibility = [ 'PUBLIC' ],
-)
-
-remote_jar (
-  name = 'commons-text',
-  out = 'commons-text-1.3.jar',
-  url = 'mvn:org.apache.commons:commons-text:jar:1.3',
-  sha1 = '9abf61708a66ab5e55f6169a200dbfc584b546d9',
-  maven_coords = 'org.apache.commons:commons-text:1.3',
-  visibility = [ 'PUBLIC' ],
-)
-
-remote_jar (
-  name = 'concurrent-trees',
-  out = 'concurrent-trees-2.6.1.jar',
-  url = 'mvn:com.googlecode.concurrent-trees:concurrent-trees:jar:2.6.1',
-  sha1 = '9b647240522ab67c003de9b6702ca81ac0c15efc',
-  maven_coords = 'com.googlecode.concurrent-trees:concurrent-trees:2.6.1',
-  visibility = [ 'PUBLIC' ],
-)
-
-remote_jar (
-  name = 'easymock',
-  out = 'easymock-3.6.jar',
-  url = 'mvn:org.easymock:easymock:jar:3.6',
-  sha1 = '276883daaf2230e6f1e07c78ad695d2a18c7170b',
-  maven_coords = 'org.easymock:easymock:3.6',
-  visibility = [ 'PUBLIC' ],
-)
-
-remote_jar (
-  name = 'antlr',
-  out = 'antlr-2.7.7.jar',
-  url = 'mvn:antlr:antlr:jar:2.7.7',
-  sha1 = '83cd2cd674a217ade95a4bb83a8a14f351f48bd0',
-  maven_coords = 'antlr:antlr:jar:NON-OSGI:2.7.7',
-  visibility = [ 'PUBLIC' ],
-)
-
-remote_jar (
-  name = 'ganymed-ssh2',
-  out = 'ganymed-ssh2-262.jar',
-  url = 'mvn:ch.ethz.ganymed:ganymed-ssh2:jar:262',
-  sha1 = '7761dc665d0f6993dc846d914214fb93291e2bdf',
-  maven_coords = 'ch.ethz.ganymed:ganymed-ssh2:jar:NON-OSGI:262',
-  visibility = [ 'PUBLIC' ],
-)
-
-remote_jar (
-  name = 'gmetric4j',
-  out = 'gmetric4j-1.0.10.jar',
-  url = 'mvn:info.ganglia.gmetric4j:gmetric4j:jar:1.0.10',
-  sha1 = '3d62003123b586adb86cb028cc0f8a8c3a701d81',
-  maven_coords = 'info.ganglia.gmetric4j:gmetric4j:1.0.10',
-  visibility = [ 'PUBLIC' ],
-)
-
-remote_jar (
-  name = 'com_google_code_gson_gson',
-  out = 'gson-2.7.jar',
-  url = 'mvn:com.google.code.gson:gson:jar:2.7',
-  sha1 = '751f548c85fa49f330cecbb1875893f971b33c4e',
-  maven_coords = 'com.google.code.gson:gson:2.7',
-  visibility = [ 'PUBLIC' ],
-)
-
-remote_jar (
-  name = 'com_google_guava_guava',
-  out = 'guava-22.0.jar',
-  url = 'mvn:com.google.guava:guava:jar:22.0',
-  sha1 = '3564ef3803de51fb0530a8377ec6100b33b0d073',
-  maven_coords = 'com.google.guava:guava:22.0',
-  visibility = [ 'PUBLIC' ],
-)
-
-remote_jar (
-  name = 'com_google_guava_guava_testlib',
-  out = 'guava-testlib-22.0.jar',
-  url = 'mvn:com.google.guava:guava-testlib:jar:22.0',
-  sha1 = '3be1b88f1cfc6592acbcbfe1f3a420f79eb2b146',
-  maven_coords = 'com.google.guava:guava-testlib:jar:NON-OSGI:22.0',
-  visibility = [ 'PUBLIC' ],
-)
-
-remote_jar (
-  name = 'hamcrest-all',
-  out = 'hamcrest-all-1.3.jar',
-  url = 'mvn:org.hamcrest:hamcrest-all:jar:1.3',
-  sha1 = '63a21ebc981131004ad02e0434e799fd7f3a8d5a',
-  maven_coords = 'org.hamcrest:hamcrest-all:jar:NON-OSGI:1.3',
-  visibility = [ 'PUBLIC' ],
-)
-
-remote_jar (
-  name = 'hk2-api',
-  out = 'hk2-api-2.5.0-b42.jar',
-  url = 'mvn:org.glassfish.hk2:hk2-api:jar:2.5.0-b42',
-  sha1 = '7fd4e3d0f2cb37c80ad0dedee3f5ee69503eaf52',
-  maven_coords = 'org.glassfish.hk2:hk2-api:2.5.0-b42',
-  visibility = [ 'PUBLIC' ],
-)
-
-remote_jar (
-  name = 'hk2-locator',
-  out = 'hk2-locator-2.5.0-b42.jar',
-  url = 'mvn:org.glassfish.hk2:hk2-locator:jar:2.5.0-b42',
-  sha1 = '9d6edc0cb226401a8316e67d81bfc37cb626ef91',
-  maven_coords = 'org.glassfish.hk2:hk2-locator:2.5.0-b42',
-  visibility = [ 'PUBLIC' ],
-)
-
-remote_jar (
-  name = 'hk2-osgi-resource-locator',
-  out = 'osgi-resource-locator-1.0.1.jar',
-  url = 'mvn:org.glassfish.hk2:osgi-resource-locator:jar:1.0.1',
-  sha1 = '4ed2b2d4738aed5786cfa64cba5a332779c4c708',
-  maven_coords = 'org.glassfish.hk2:osgi-resource-locator:1.0.1',
-  visibility = [ 'PUBLIC' ],
-)
-
-remote_jar (
-  name = 'hk2-utils',
-  out = 'hk2-utils-2.5.0-b42.jar',
-  url = 'mvn:org.glassfish.hk2:hk2-utils:jar:2.5.0-b42',
-  sha1 = '102a344e1728825e865a8986d7605602aba3c3b6',
-  maven_coords = 'org.glassfish.hk2:hk2-utils:2.5.0-b42',
-  visibility = [ 'PUBLIC' ],
-)
-
-remote_jar (
-  name = 'httpclient-osgi',
-  out = 'httpclient-osgi-4.5.1.jar',
-  url = 'mvn:org.apache.httpcomponents:httpclient-osgi:jar:4.5.1',
-  sha1 = '0220a68ff36e5b0fa71b5dc0b1dc1d4ad2dcf524',
-  maven_coords = 'org.apache.httpcomponents:httpclient-osgi:4.5.1',
-  visibility = [ 'PUBLIC' ],
-)
-
-remote_jar (
-  name = 'httpcore-osgi',
-  out = 'httpcore-osgi-4.4.4.jar',
-  url = 'mvn:org.apache.httpcomponents:httpcore-osgi:jar:4.4.4',
-  sha1 = 'd5c14055e569afca96f4603d6f9d467bc72ccba8',
-  maven_coords = 'org.apache.httpcomponents:httpcore-osgi:4.4.4',
-  visibility = [ 'PUBLIC' ],
-)
-
-remote_jar (
-  name = 'influxdb-java',
-  out = 'influxdb-java-2.9.jar',
-  url = 'mvn:org.influxdb:influxdb-java:jar:2.9',
-  sha1 = '3c1c2b9b977d4ee67b2877eb89943add248a50db',
-  maven_coords = 'org.influxdb:influxdb-java:jar:NON-OSGI:2.9',
-  visibility = [ 'PUBLIC' ],
-)
-
-remote_jar (
-  name = 'simpleclient',
-  out = 'simpleclient-0.5.0.jar',
-  url = 'mvn:io.prometheus:simpleclient:jar:0.5.0',
-  sha1 = 'fbbfe2300098798e3d23f93b7b14befeceacf512',
-  maven_coords = 'io.prometheus:simpleclient:0.5.0',
-  visibility = [ 'PUBLIC' ],
-)
-
-remote_jar (
-  name = 'simpleclient_common',
-  out = 'simpleclient_common-0.5.0.jar',
-  url = 'mvn:io.prometheus:simpleclient_common:jar:0.5.0',
-  sha1 = 'bfd93082d7cf85c0543c2ccc286b96c817d1090c',
-  maven_coords = 'io.prometheus:simpleclient_common:0.5.0',
-  visibility = [ 'PUBLIC' ],
-)
-
-remote_jar (
-  name = 'simpleclient_hotspot',
-  out = 'simpleclient_hotspot-0.5.0.jar',
-  url = 'mvn:io.prometheus:simpleclient_hotspot:jar:0.5.0',
-  sha1 = '0f341cb84d6713255b1ce46c7593eee50a35d414',
-  maven_coords = 'io.prometheus:simpleclient_hotspot:0.5.0',
-  visibility = [ 'PUBLIC' ],
-)
-
-remote_jar (
-  name = 'simpleclient_servlet',
-  out = 'simpleclient_servlet-0.5.0.jar',
-  url = 'mvn:io.prometheus:simpleclient_servlet:jar:0.5.0',
-  sha1 = '28d75ee90a5c2ac70eeebb0864b15885116207a4',
-  maven_coords = 'io.prometheus:simpleclient_servlet:0.5.0',
-  visibility = [ 'PUBLIC' ],
-)
-
-remote_jar (
-  name = 'retrofit',
-  out = 'retrofit-2.3.0.jar',
-  url = 'mvn:com.squareup.retrofit2:retrofit:jar:2.3.0',
-  sha1 = 'bcacde6a8ccedcc56c127403d26b76072fe6214d',
-  maven_coords = 'com.squareup.retrofit2:retrofit:jar:NON-OSGI:2.3.0',
-  visibility = [ 'PUBLIC' ],
-)
-
-remote_jar (
-  name = 'converter-moshi',
-  out = 'converter-moshi-2.3.0.jar',
-  url = 'mvn:com.squareup.retrofit2:converter-moshi:jar:2.3.0',
-  sha1 = '6ad87c2038269d2574fcd90765ce15c74d6bb993',
-  maven_coords = 'com.squareup.retrofit2:converter-moshi:jar:NON-OSGI:2.3.0',
-  visibility = [ 'PUBLIC' ],
-)
-
-remote_jar (
-  name = 'okhttp',
-  out = 'okhttp-3.9.1.jar',
-  url = 'mvn:com.squareup.okhttp3:okhttp:jar:3.9.1',
-  sha1 = '84b4b7d1c4a238e7899972b7446c250691e65f1f',
-  maven_coords = 'com.squareup.okhttp3:okhttp:jar:NON-OSGI:3.9.1',
-  visibility = [ 'PUBLIC' ],
-)
-
-remote_jar (
-  name = 'logging-interceptor',
-  out = 'logging-interceptor-3.9.1.jar',
-  url = 'mvn:com.squareup.okhttp3:logging-interceptor:jar:3.9.1',
-  sha1 = '36e71ab9e903fc4d1b4a58d80572a91d9fd60caf',
-  maven_coords = 'com.squareup.okhttp3:logging-interceptor:jar:NON-OSGI:3.9.1',
-  visibility = [ 'PUBLIC' ],
-)
-
-remote_jar (
-  name = 'moshi',
-  out = 'moshi-1.4.0.jar',
-  url = 'mvn:com.squareup.moshi:moshi:jar:1.4.0',
-  sha1 = 'd67ad038adfd55dc276488a54f4944dfae5ff8ec',
-  maven_coords = 'com.squareup.moshi:moshi:jar:NON-OSGI:1.4.0',
-  visibility = [ 'PUBLIC' ],
-)
-
-remote_jar (
-  name = 'okio',
-  out = 'okio-1.14.0.jar',
-  url = 'mvn:com.squareup.okio:okio:jar:1.14.0',
-  sha1 = '102d7be47241d781ef95f1581d414b0943053130',
-  maven_coords = 'com.squareup.okio:okio:jar:NON-OSGI:1.14.0',
-  visibility = [ 'PUBLIC' ],
-)
-
-remote_jar (
-  name = 'jackson-annotations',
-  out = 'jackson-annotations-2.9.5.jar',
-  url = 'mvn:com.fasterxml.jackson.core:jackson-annotations:jar:2.9.5',
-  sha1 = '9056ec9db21c57d43219a84bb18c129ae51c6a5d',
-  maven_coords = 'com.fasterxml.jackson.core:jackson-annotations:2.9.5',
-  visibility = [ 'PUBLIC' ],
-)
-
-remote_jar (
-  name = 'jackson-core',
-  out = 'jackson-core-2.9.5.jar',
-  url = 'mvn:com.fasterxml.jackson.core:jackson-core:jar:2.9.5',
-  sha1 = 'a22ac51016944b06fd9ffbc9541c6e7ce5eea117',
-  maven_coords = 'com.fasterxml.jackson.core:jackson-core:2.9.5',
-  visibility = [ 'PUBLIC' ],
-)
-
-remote_jar (
-  name = 'jackson-databind',
-  out = 'jackson-databind-2.9.5.jar',
-  url = 'mvn:com.fasterxml.jackson.core:jackson-databind:jar:2.9.5',
-  sha1 = '3490508379d065fe3fcb80042b62f630f7588606',
-  maven_coords = 'com.fasterxml.jackson.core:jackson-databind:2.9.5',
-  visibility = [ 'PUBLIC' ],
-)
-
-remote_jar (
-  name = 'javax.annotation-api-mvn',
-  out = 'javax.annotation-api-1.2.jar',
-  url = 'mvn:javax.annotation:javax.annotation-api:jar:1.2',
-  sha1 = '479c1e06db31c432330183f5cae684163f186146',
-  maven_coords = 'javax.annotation:javax.annotation-api:1.2',
-  visibility = [ 'PUBLIC' ],
-)
-
-remote_jar (
-  name = 'javax.inject',
-  out = 'javax.inject-2.5.0-b42.jar',
-  url = 'mvn:org.glassfish.hk2.external:javax.inject:jar:2.5.0-b42',
-  sha1 = '98e0b7dcef77dc04809f0603868140a1c60bea71',
-  maven_coords = 'org.glassfish.hk2.external:javax.inject:2.5.0-b42',
-  visibility = [ 'PUBLIC' ],
-)
-
-remote_jar (
-  name = 'javax.ws.rs-api',
-  out = 'javax.ws.rs-api-2.1.jar',
-  url = 'mvn:javax.ws.rs:javax.ws.rs-api:jar:2.1',
-  sha1 = '426a0862406536e690c7caa8bb6ed32191986fac',
-  maven_coords = 'javax.ws.rs:javax.ws.rs-api:2.1',
-  visibility = [ 'PUBLIC' ],
-)
-
-remote_jar (
-  name = 'jersey-client',
-  out = 'jersey-client-2.26.jar',
-  url = 'mvn:org.glassfish.jersey.core:jersey-client:jar:2.26',
-  sha1 = '125b8d1040d121a5dc4ce6858e21a6160bed7afa',
-  maven_coords = 'org.glassfish.jersey.core:jersey-client:2.26',
-  visibility = [ 'PUBLIC' ],
-)
-
-remote_jar (
-  name = 'jersey-security',
-  out = 'oauth2-client-2.26.jar',
-  url = 'mvn:org.glassfish.jersey.security:oauth2-client:jar:2.26',
-  sha1 = '968e1d99c9460e29bdb447114fa8440c3dbafb14',
-  maven_coords = 'org.glassfish.jersey.security:oauth2-client:jar:NON-OSGI:2.26',
-  visibility = [ 'PUBLIC' ],
-)
-
-remote_jar (
-  name = 'jersey-common',
-  out = 'jersey-common-2.26.jar',
-  url = 'mvn:org.glassfish.jersey.core:jersey-common:jar:2.26',
-  sha1 = 'd96475745c5e72cafcbc4dc9e2e725f4d9683f21',
-  maven_coords = 'org.glassfish.jersey.core:jersey-common:2.26',
-  visibility = [ 'PUBLIC' ],
-)
-
-remote_jar (
-  name = 'jersey-container-jetty-http',
-  out = 'jersey-container-jetty-http-2.26.jar',
-  url = 'mvn:org.glassfish.jersey.containers:jersey-container-jetty-http:jar:2.26',
-  sha1 = 'c20d58ceb1a5d98aad2b2032ca200403622fe9d6',
-  maven_coords = 'org.glassfish.jersey.containers:jersey-container-jetty-http:2.26',
-  visibility = [ 'PUBLIC' ],
-)
-
-remote_jar (
-  name = 'jersey-container-servlet',
-  out = 'jersey-container-servlet-2.26.jar',
-  url = 'mvn:org.glassfish.jersey.containers:jersey-container-servlet:jar:2.26',
-  sha1 = '8723d05d1fe2fdda54d0921836ea5daa5abe5f00',
-  maven_coords = 'org.glassfish.jersey.containers:jersey-container-servlet:2.26',
-  visibility = [ 'PUBLIC' ],
-)
-
-remote_jar (
-  name = 'jersey-container-servlet-core',
-  out = 'jersey-container-servlet-core-2.26.jar',
-  url = 'mvn:org.glassfish.jersey.containers:jersey-container-servlet-core:jar:2.26',
-  sha1 = '66a0d51facf1e49e2353ff0d2a2d4a9e2fa3f836',
-  maven_coords = 'org.glassfish.jersey.containers:jersey-container-servlet-core:2.26',
-  visibility = [ 'PUBLIC' ],
-)
-
-remote_jar (
-  name = 'jersey-media-multipart',
-  out = 'jersey-media-multipart-2.26.jar',
-  url = 'mvn:org.glassfish.jersey.media:jersey-media-multipart:jar:2.26',
-  sha1 = 'c7ea0a5819e4688317024c9f4b6e3de54f9d0f3d',
-  maven_coords = 'org.glassfish.jersey.media:jersey-media-multipart:2.26',
-  visibility = [ 'PUBLIC' ],
-)
-
-remote_jar (
-  name = 'jersey-media-sse',
-  out = 'jersey-media-sse-2.26.jar',
-  url = 'mvn:org.glassfish.jersey.media:jersey-media-sse:jar:2.26',
-  sha1 = '61cfeb0df911585140f64f3369eb524e0e02f534',
-  maven_coords = 'org.glassfish.jersey.media:jersey-media-sse:2.26',
-  visibility = [ 'PUBLIC' ],
-)
-
-remote_jar (
-  name = 'jersey-server',
-  out = 'jersey-server-2.26.jar',
-  url = 'mvn:org.glassfish.jersey.core:jersey-server:jar:2.26',
-  sha1 = 'aa8eff3d591641dadd7c9880bb73b59bf46d4c82',
-  maven_coords = 'org.glassfish.jersey.core:jersey-server:2.26',
-  visibility = [ 'PUBLIC' ],
-)
-
-remote_jar (
-  name = 'jersey-hk2',
-  out = 'jersey-hk2-2.26.jar',
-  url = 'mvn:org.glassfish.jersey.inject:jersey-hk2:jar:2.26',
-  sha1 = 'df27f7d7577acf4b532684448021632098924dab',
-  maven_coords = 'org.glassfish.jersey.inject:jersey-hk2:2.26',
-  visibility = [ 'PUBLIC' ],
-)
-
-remote_jar (
-  name = 'jersey-test-framework-core',
-  out = 'jersey-test-framework-core-2.26.jar',
-  url = 'mvn:org.glassfish.jersey.test-framework:jersey-test-framework-core:jar:2.26',
-  sha1 = '92698666ae89db58074001a34f09b8233ef5effa',
-  maven_coords = 'org.glassfish.jersey.test-framework:jersey-test-framework-core:jar:NON-OSGI:2.26',
-  visibility = [ 'PUBLIC' ],
-)
-
-remote_jar (
-  name = 'jersey-test-framework-jetty',
-  out = 'jersey-test-framework-provider-jetty-2.26.jar',
-  url = 'mvn:org.glassfish.jersey.test-framework.providers:jersey-test-framework-provider-jetty:jar:2.26',
-  sha1 = '6be06684283e7c90036d9e24f7793fd8bbb04f6a',
-  maven_coords = 'org.glassfish.jersey.test-framework.providers:jersey-test-framework-provider-jetty:jar:NON-OSGI:2.26',
-  visibility = [ 'PUBLIC' ],
-)
-
-remote_jar (
-  name = 'jetty-util',
-  out = 'jetty-util-9.2.21.v20170120.jar',
-  url = 'mvn:org.eclipse.jetty:jetty-util:jar:9.2.21.v20170120',
-  sha1 = '58d9c3a134dc6d6d84b555758015ab3585b88464',
-  maven_coords = 'org.eclipse.jetty:jetty-util:9.2.21.v20170120',
-  visibility = [ 'PUBLIC' ],
-)
-
-remote_jar (
-  name = 'jetty-websocket',
-  out = 'jetty-websocket-8.1.19.v20160209.jar',
-  url = 'mvn:org.eclipse.jetty:jetty-websocket:jar:8.1.19.v20160209',
-  sha1 = 'a423ddda13e52a65d604320472af598ca7122a60',
-  maven_coords = 'org.eclipse.jetty:jetty-websocket:8.1.19.v20160209',
-  visibility = [ 'PUBLIC' ],
-)
-
-remote_jar (
-  name = 'jetty-server',
-  out = 'jetty-server-9.2.21.v20170120.jar',
-  url = 'mvn:org.eclipse.jetty:jetty-server:jar:9.2.21.v20170120',
-  sha1 = 'bdf6a2d58f878652e4b8c3af913e9c56b995e87d',
-  maven_coords = 'org.eclipse.jetty:jetty-server:9.2.21.v20170120',
-  visibility = [ 'PUBLIC' ],
-)
-
-remote_jar (
-  name = 'jetty-servlet',
-  out = 'jetty-servlet-9.2.26.v20180806.jar',
-  url = 'mvn:org.eclipse.jetty:jetty-servlet:jar:9.2.26.v20180806',
-  sha1 = '7d54ae4579454d9df2c3324de7eddfbd81ffb8cc',
-  maven_coords = 'org.eclipse.jetty:jetty-servlet:9.2.26.v20180806',
-  visibility = [ 'PUBLIC' ],
-)
-
-remote_jar (
-  name = 'jetty-security',
-  out = 'jetty-security-9.2.21.v20170120.jar',
-  url = 'mvn:org.eclipse.jetty:jetty-security:jar:9.2.21.v20170120',
-  sha1 = 'ceb39cd058fa22172c6e7ef493af90891e701f23',
-  maven_coords = 'org.eclipse.jetty:jetty-security:9.2.21.v20170120',
-  visibility = [ 'PUBLIC' ],
-)
-
-remote_jar (
-  name = 'jetty-continuation',
-  out = 'jetty-continuation-9.2.21.v20170120.jar',
-  url = 'mvn:org.eclipse.jetty:jetty-continuation:jar:9.2.21.v20170120',
-  sha1 = '38c35ef850d508aa0fae450eee72d784a5dd2d06',
-  maven_coords = 'org.eclipse.jetty:jetty-continuation:9.2.21.v20170120',
-  visibility = [ 'PUBLIC' ],
-)
-
-remote_jar (
-  name = 'jetty-http',
-  out = 'jetty-http-9.2.21.v20170120.jar',
-  url = 'mvn:org.eclipse.jetty:jetty-http:jar:9.2.21.v20170120',
-  sha1 = '24c5a91c48cfd73b863962ec36ba4dc2bb6552ea',
-  maven_coords = 'org.eclipse.jetty:jetty-http:9.2.21.v20170120',
-  visibility = [ 'PUBLIC' ],
-)
-
-remote_jar (
-  name = 'jetty-io',
-  out = 'jetty-io-9.2.21.v20170120.jar',
-  url = 'mvn:org.eclipse.jetty:jetty-io:jar:9.2.21.v20170120',
-  sha1 = 'a25222b557823b59a7b6d121f951926be20cff85',
-  maven_coords = 'org.eclipse.jetty:jetty-io:9.2.21.v20170120',
-  visibility = [ 'PUBLIC' ],
-)
-
-remote_jar (
-  name = 'javax.servlet-api',
-  out = 'javax.servlet-api-3.1.0.jar',
-  url = 'mvn:javax.servlet:javax.servlet-api:jar:3.1.0',
-  sha1 = '3cd63d075497751784b2fa84be59432f4905bf7c',
-  maven_coords = 'javax.servlet:javax.servlet-api:3.1.0',
-  visibility = [ 'PUBLIC' ],
-)
-
-remote_jar (
-  name = 'joda-time',
-  out = 'joda-time-2.9.3.jar',
-  url = 'mvn:joda-time:joda-time:jar:2.9.3',
-  sha1 = '9e46be514a4ed60bcfbaaba88a3c668cf30476ab',
-  maven_coords = 'joda-time:joda-time:2.9.3',
-  visibility = [ 'PUBLIC' ],
-)
-
-remote_jar (
-  name = 'jsch',
-  out = 'jsch-0.1.53.jar',
-  url = 'mvn:com.jcraft:jsch:jar:0.1.53',
-  sha1 = '658b682d5c817b27ae795637dfec047c63d29935',
-  maven_coords = 'com.jcraft:jsch:jar:NON-OSGI:0.1.53',
-  visibility = [ 'PUBLIC' ],
-)
-
-remote_jar (
-  name = 'com_google_code_findbugs_jsr305',
-  out = 'jsr305-3.0.1.jar',
-  url = 'mvn:com.google.code.findbugs:jsr305:jar:3.0.1',
-  sha1 = 'f7be08ec23c21485b9b5a1cf1654c2ec8c58168d',
-  maven_coords = 'com.google.code.findbugs:jsr305:3.0.1',
-  visibility = [ 'PUBLIC' ],
-)
-
-remote_jar (
-  name = 'junit',
-  out = 'junit-4.12.jar',
-  url = 'mvn:junit:junit:jar:4.12',
-  sha1 = '2973d150c0dc1fefe998f834810d68f278ea58ec',
-  maven_coords = 'junit:junit:jar:NON-OSGI:4.12',
-  visibility = [ 'PUBLIC' ],
-)
-
-remote_jar (
-  name = 'junit-dep',
-  out = 'junit-4.10.jar',
-  url = 'mvn:junit:junit:jar:4.10',
-  sha1 = 'e4f1766ce7404a08f45d859fb9c226fc9e41a861',
-  maven_coords = 'junit:junit:jar:NON-OSGI:4.10',
-  visibility = [ 'PUBLIC' ],
-)
-
-remote_jar (
-  name = 'kryo',
-  out = 'kryo-4.0.1.jar',
-  url = 'mvn:com.esotericsoftware:kryo:jar:4.0.1',
-  sha1 = '5053899c213a6ce50a800d4902c5a9de49fe0098',
-  maven_coords = 'com.esotericsoftware:kryo:4.0.1',
-  visibility = [ 'PUBLIC' ],
-)
-
-remote_jar (
-  name = 'mapdb',
-  out = 'mapdb-1.0.9.jar',
-  url = 'mvn:org.mapdb:mapdb:jar:1.0.9',
-  sha1 = 'f8df5e15778eb3e88c03b77aca70c318c6b7c9d0',
-  maven_coords = 'org.mapdb:mapdb:1.0.9',
-  visibility = [ 'PUBLIC' ],
-)
-
-remote_jar (
-  name = 'metrics-core',
-  out = 'metrics-core-3.2.2.jar',
-  url = 'mvn:io.dropwizard.metrics:metrics-core:jar:3.2.2',
-  sha1 = 'cd9886f498ee2ab2d994f0c779e5553b2c450416',
-  maven_coords = 'io.dropwizard.metrics:metrics-core:3.2.2',
-  visibility = [ 'PUBLIC' ],
-)
-
-remote_jar (
-  name = 'metrics-ganglia',
-  out = 'metrics-ganglia-3.2.2.jar',
-  url = 'mvn:io.dropwizard.metrics:metrics-ganglia:jar:3.2.2',
-  sha1 = 'd5bb1883e9b0daf0e4187e558746f5058f4585c1',
-  maven_coords = 'io.dropwizard.metrics:metrics-ganglia:3.2.2',
-  visibility = [ 'PUBLIC' ],
-)
-
-remote_jar (
-  name = 'metrics-graphite',
-  out = 'metrics-graphite-3.2.2.jar',
-  url = 'mvn:io.dropwizard.metrics:metrics-graphite:jar:3.2.2',
-  sha1 = '908e8cbec1bbdb2f4023334e424c7de2832a95af',
-  maven_coords = 'io.dropwizard.metrics:metrics-graphite:3.2.2',
-  visibility = [ 'PUBLIC' ],
-)
-
-remote_jar (
-  name = 'metrics-influxdb',
-  out = 'metrics-influxdb-1.1.1.jar',
-  url = 'mvn:com.izettle:metrics-influxdb:jar:1.1.1',
-  sha1 = 'a911d778c2f8607dd4e7a4cdb9b0cd97adcd0343',
-  maven_coords = 'com.izettle:metrics-influxdb:jar:NON-OSGI:1.1.1',
-  visibility = [ 'PUBLIC' ],
-)
-
-remote_jar (
-  name = 'metrics-json',
-  out = 'metrics-json-3.2.2.jar',
-  url = 'mvn:io.dropwizard.metrics:metrics-json:jar:3.2.2',
-  sha1 = '234612b9739a651eb2b71a8f9e9c4d11d7ccf849',
-  maven_coords = 'io.dropwizard.metrics:metrics-json:3.2.2',
-  visibility = [ 'PUBLIC' ],
-)
-
-remote_jar (
-  name = 'minimal-json',
-  out = 'minimal-json-0.9.4.jar',
-  url = 'mvn:com.eclipsesource.minimal-json:minimal-json:jar:0.9.4',
-  sha1 = 'd6e7dd22569de97c2697a4af301a623f35028972',
-  maven_coords = 'com.eclipsesource.minimal-json:minimal-json:0.9.4',
-  visibility = [ 'PUBLIC' ],
-)
-
-remote_jar (
-  name = 'minlog',
-  out = 'minlog-1.3.0.jar',
-  url = 'mvn:com.esotericsoftware:minlog:jar:1.3.0',
-  sha1 = 'ff07b5f1b01d2f92bb00a337f9a94873712f0827',
-  maven_coords = 'com.esotericsoftware:minlog:1.3.0',
-  visibility = [ 'PUBLIC' ],
-)
-
-remote_jar (
-  name = 'io_netty_netty',
-  out = 'netty-3.10.5.Final.jar',
-  url = 'mvn:io.netty:netty:jar:3.10.5.Final',
-  sha1 = '9ca7d55d246092bddd29b867706e2f6c7db701a0',
-  maven_coords = 'io.netty:netty:3.10.5.Final',
-  visibility = [ 'PUBLIC' ],
-)
-
-remote_jar (
-  name = 'io_netty_netty_buffer',
-  out = 'netty-buffer-4.1.27.Final.jar',
-  url = 'mvn:io.netty:netty-buffer:jar:4.1.27.Final',
-  sha1 = 'aafe2b9fb0d8f3b200cf10b9fd6486c6a722d7a1',
-  maven_coords = 'io.netty:netty-buffer:4.1.27.Final',
-  visibility = [ 'PUBLIC' ],
-)
-
-remote_jar (
-  name = 'io_netty_netty_codec',
-  out = 'netty-codec-4.1.27.Final.jar',
-  url = 'mvn:io.netty:netty-codec:jar:4.1.27.Final',
-  sha1 = 'd2653d78ebaa650064768fb26b10051f5c8efb2c',
-  maven_coords = 'io.netty:netty-codec:4.1.27.Final',
-  visibility = [ 'PUBLIC' ],
-)
-
-remote_jar (
-  name = 'io_netty_netty_common',
-  out = 'netty-common-4.1.27.Final.jar',
-  url = 'mvn:io.netty:netty-common:jar:4.1.27.Final',
-  sha1 = '6a12a969c27fb37b230c4bde5a67bd822fa6b7a4',
-  maven_coords = 'io.netty:netty-common:4.1.27.Final',
-  visibility = [ 'PUBLIC' ],
-)
-
-remote_jar (
-  name = 'io_netty_netty_handler',
-  out = 'netty-handler-4.1.27.Final.jar',
-  url = 'mvn:io.netty:netty-handler:jar:4.1.27.Final',
-  sha1 = '21bd9cf565390a8d72579b8664303e3c175dfc6a',
-  maven_coords = 'io.netty:netty-handler:4.1.27.Final',
-  visibility = [ 'PUBLIC' ],
-)
-
-remote_jar (
-  name = 'io_netty_netty_handler_proxy',
-  out = 'netty-handler-proxy-4.1.27.Final.jar',
-  url = 'mvn:io.netty:netty-handler-proxy:jar:4.1.27.Final',
-  sha1 = '1a822ce7760bc6eb4937b7e448c9e081fedcc807',
-  maven_coords = 'io.netty:netty-handler-proxy:4.1.27.Final',
-  visibility = [ 'PUBLIC' ],
-)
-
-remote_jar (
-  name = 'io_netty_netty_transport',
-  out = 'netty-transport-4.1.27.Final.jar',
-  url = 'mvn:io.netty:netty-transport:jar:4.1.27.Final',
-  sha1 = 'b5c2da3ea89dd67320925f1504c9eb3615241b7c',
-  maven_coords = 'io.netty:netty-transport:4.1.27.Final',
-  visibility = [ 'PUBLIC' ],
-)
-
-remote_jar (
-  name = 'io_netty_netty_transport_native_unix_common',
-  out = 'netty-transport-native-unix-common-4.1.27.Final.jar',
-  url = 'mvn:io.netty:netty-transport-native-unix-common:jar:4.1.27.Final',
-  sha1 = '2b0667fe5c1df78c6cfbf9d53ad8b1fb533fb8e8',
-  maven_coords = 'io.netty:netty-transport-native-unix-common:4.1.27.Final',
-  visibility = [ 'PUBLIC' ],
-)
-
-remote_jar (
-  name = 'io_netty_netty_transport-native-epoll',
-  out = 'netty-transport-native-epoll-4.1.27.Final.jar',
-  url = 'mvn:io.netty:netty-transport-native-epoll:jar:4.1.27.Final',
-  sha1 = 'addbd481940a3cce57cb5736ecef5db909b7b5d0',
-  maven_coords = 'io.netty:netty-transport-native-epoll:4.1.27.Final',
-  visibility = [ 'PUBLIC' ],
-)
-
-remote_jar (
-  name = 'io_netty_netty_resolver',
-  out = 'netty-resolver-4.1.27.Final.jar',
-  url = 'mvn:io.netty:netty-resolver:jar:4.1.27.Final',
-  sha1 = '2536447ef9605ccb2b5203aa22392c6514484ea9',
-  maven_coords = 'io.netty:netty-resolver:4.1.27.Final',
-  visibility = [ 'PUBLIC' ],
-)
-
-remote_jar (
-  name = 'io_netty_netty_codec-http2',
-  out = 'netty-codec-http2-4.1.27.Final.jar',
-  url = 'mvn:io.netty:netty-codec-http2:jar:4.1.27.Final',
-  sha1 = '3769790a2033667d663f9a526d5b63cfecdbdf4e',
-  maven_coords = 'io.netty:netty-codec-http2:4.1.27.Final',
-  visibility = [ 'PUBLIC' ],
-)
-
-remote_jar (
-  name = 'io_netty_netty_codec-http',
-  out = 'netty-codec-http-4.1.27.Final.jar',
-  url = 'mvn:io.netty:netty-codec-http:jar:4.1.27.Final',
-  sha1 = 'a1722d6bcbbef1c4c7877e8bf38b07a3db5ed07f',
-  maven_coords = 'io.netty:netty-codec-http:4.1.27.Final',
-  visibility = [ 'PUBLIC' ],
-)
-
-remote_jar (
-  name = 'io_netty_netty_codec-socks',
-  out = 'netty-codec-socks-4.1.27.Final.jar',
-  url = 'mvn:io.netty:netty-codec-socks:jar:4.1.27.Final',
-  sha1 = '285b09af98764cf02e4b77b3d95af188469a7133',
-  maven_coords = 'io.netty:netty-codec-socks:4.1.27.Final',
-  visibility = [ 'PUBLIC' ],
-)
-
-remote_jar (
-  name = 'objenesis',
-  out = 'objenesis-2.6.jar',
-  url = 'mvn:org.objenesis:objenesis:jar:2.6',
-  sha1 = '639033469776fd37c08358c6b92a4761feb2af4b',
-  maven_coords = 'org.objenesis:objenesis:2.6',
-  visibility = [ 'PUBLIC' ],
-)
-
-remote_jar (
-  name = 'openflowj',
-  out = 'openflowj-3.2.1.onos.jar',
-  url = 'mvn:org.onosproject:openflowj:jar:3.2.1.onos',
-  sha1 = '66544b285cddc8d53485107310f07b7bc90ac63b',
-  maven_coords = 'org.onosproject:openflowj:3.2.1.onos',
-  visibility = [ 'PUBLIC' ],
-)
-
-remote_jar (
-  name = 'org.apache.felix.framework.security',
-  out = 'org.apache.felix.framework.security-2.2.0.onos.jar',
-  url = 'mvn:org.onosproject:org.apache.felix.framework.security:jar:2.2.0.onos',
-  sha1 = '5d39a4ff4a5d3daec8c404789d398c780151de8c',
-  maven_coords = 'org.onosproject:org.apache.felix.framework.security:2.2.0.onos',
-  visibility = [ 'PUBLIC' ],
-)
-
-remote_jar (
-  name = 'org.apache.felix.scr',
-  out = 'org.apache.felix.scr-1.8.2.jar',
-  url = 'mvn:org.apache.felix:org.apache.felix.scr:jar:1.8.2',
-  sha1 = 'c3047d56ee57de0752821fd9c3894dda664f2e37',
-  maven_coords = 'org.apache.felix:org.apache.felix.scr:1.8.2',
-  visibility = [ 'PUBLIC' ],
-)
-
-remote_jar (
-  name = 'org.apache.felix.scr.annotations',
-  out = 'org.apache.felix.scr.annotations-1.9.12.jar',
-  url = 'mvn:org.apache.felix:org.apache.felix.scr.annotations:jar:1.9.12',
-  sha1 = '5fdc34da641dda8b9165c2be93211479a186da9c',
-  maven_coords = 'org.apache.felix:org.apache.felix.scr.annotations:jar:NON-OSGI:1.9.12',
-  visibility = [ 'PUBLIC' ],
-)
-
-remote_jar (
-  name = 'org.apache.karaf.features.core',
-  out = 'org.apache.karaf.features.core-3.0.8.jar',
-  url = 'mvn:org.apache.karaf.features:org.apache.karaf.features.core:jar:3.0.8',
-  sha1 = '4a8bf5dbe10e120158cb69295388274f834ae37a',
-  maven_coords = 'org.apache.karaf.features:org.apache.karaf.features.core:3.0.8',
-  visibility = [ 'PUBLIC' ],
-)
-
-remote_jar (
-  name = 'org.apache.karaf.shell.console',
-  out = 'org.apache.karaf.shell.console-3.0.8.jar',
-  url = 'mvn:org.apache.karaf.shell:org.apache.karaf.shell.console:jar:3.0.8',
-  sha1 = '5bf3e409d2e73bef560face9740b8c1234909b83',
-  maven_coords = 'org.apache.karaf.shell:org.apache.karaf.shell.console:3.0.8',
-  visibility = [ 'PUBLIC' ],
-)
-
-remote_jar (
-  name = 'org.apache.httpcomponents.httpasyncclient-osgi',
-  out = 'httpasyncclient-osgi-4.1.2.jar',
-  url = 'mvn:org.apache.httpcomponents:httpasyncclient-osgi:jar:4.1.2',
-  sha1 = '17eccd8d9f2803ee95e80ee8283155432600e17b',
-  maven_coords = 'org.apache.httpcomponents:httpasyncclient-osgi:4.1.2',
-  visibility = [ 'PUBLIC' ],
-)
-
-remote_jar (
-  name = 'org.apache.httpcomponents.httpcore-nio',
-  out = 'httpcore-nio-4.4.4.jar',
-  url = 'mvn:org.apache.httpcomponents:httpcore-nio:jar:4.4.4',
-  sha1 = '16badfc2d99db264c486ba8c57ae577301a58bd9',
-  maven_coords = 'org.apache.httpcomponents:httpcore-nio:jar:NON-OSGI:4.4.4',
-  visibility = [ 'PUBLIC' ],
-)
-
-remote_jar (
-  name = 'org.apache.karaf.jaas',
-  out = 'org.apache.karaf.jaas.modules-3.0.8.jar',
-  url = 'mvn:org.apache.karaf.jaas:org.apache.karaf.jaas.modules:jar:3.0.8',
-  sha1 = 'e4c97dac488898af1dda2b2cbf5b66318339cd29',
-  maven_coords = 'org.apache.karaf.jaas:org.apache.karaf.jaas.modules:3.0.8',
-  visibility = [ 'PUBLIC' ],
-)
-
-remote_jar (
-  name = 'org.apache.karaf.system.core',
-  out = 'org.apache.karaf.system.core-3.0.8.jar',
-  url = 'mvn:org.apache.karaf.system:org.apache.karaf.system.core:jar:3.0.8',
-  sha1 = '80378de4aeae603889d3408489ff5b9918e6064c',
-  maven_coords = 'org.apache.karaf.system:org.apache.karaf.system.core:3.0.8',
-  visibility = [ 'PUBLIC' ],
-)
-
-remote_jar (
-  name = 'org.apache.servicemix.bundles.snmp4j',
-  out = 'org.apache.servicemix.bundles.snmp4j-2.3.4_1.jar',
-  url = 'mvn:org.apache.servicemix.bundles:org.apache.servicemix.bundles.snmp4j:jar:2.3.4_1',
-  sha1 = '5134e0b60a6d88b26fe4dec03488efe4f2463e65',
-  maven_coords = 'org.apache.servicemix.bundles:org.apache.servicemix.bundles.snmp4j:2.3.4_1',
-  visibility = [ 'PUBLIC' ],
-)
-
-remote_jar (
-  name = 'org.osgi.compendium',
-  out = 'org.osgi.compendium-5.0.0.jar',
-  url = 'mvn:org.osgi:org.osgi.compendium:jar:5.0.0',
-  sha1 = '9d7a9c35591f6fa1c98ac85af32775c12361aee4',
-  maven_coords = 'org.osgi:org.osgi.compendium:5.0.0',
-  visibility = [ 'PUBLIC' ],
-)
-
-remote_jar (
-  name = 'osgi-core',
-  out = 'org.osgi.core-5.0.0.jar',
-  url = 'mvn:org.osgi:org.osgi.core:jar:5.0.0',
-  sha1 = '6e5e8cd3c9059c08e1085540442a490b59a7783c',
-  maven_coords = 'org.osgi:org.osgi.core:5.0.0',
-  visibility = [ 'PUBLIC' ],
-)
-
-remote_jar (
-  name = 'reflectasm',
-  out = 'reflectasm-1.11.0.jar',
-  url = 'mvn:com.esotericsoftware:reflectasm:jar:1.11.0',
-  sha1 = 'f747d8b017a26bac575f8da14e8c1df6aecd3154',
-  maven_coords = 'com.esotericsoftware:reflectasm:1.11.0',
-  visibility = [ 'PUBLIC' ],
-)
-
-remote_jar (
-  name = 'remotetea-oncrpc',
-  out = 'remotetea-oncrpc-1.1.3.jar',
-  url = 'mvn:org.acplt.remotetea:remotetea-oncrpc:jar:1.1.3',
-  sha1 = '2f7d94c5179b0267a882259a03a83eaa320cbcce',
-  maven_coords = 'org.acplt.remotetea:remotetea-oncrpc:1.1.3',
-  visibility = [ 'PUBLIC' ],
-)
-
-remote_jar (
-  name = 'rrd4j',
-  out = 'rrd4j-3.1.jar',
-  url = 'mvn:org.rrd4j:rrd4j:jar:3.1',
-  sha1 = 'e533553fbf52f241dcb0c468b2052a3814dd6722',
-  maven_coords = 'org.rrd4j:rrd4j:jar:NON-OSGI:3.1',
-  visibility = [ 'PUBLIC' ],
-)
-
-remote_jar (
-  name = 'javassist',
-  out = 'javassist-3.22.0-GA.jar',
-  url = 'mvn:org.javassist:javassist:jar:3.22.0-GA',
-  sha1 = '3e83394258ae2089be7219b971ec21a8288528ad',
-  maven_coords = 'org.javassist:javassist:3.22.0-GA',
-  visibility = [ 'PUBLIC' ],
-)
-
-remote_jar (
-  name = 'mimepull',
-  out = 'mimepull-1.9.6.jar',
-  url = 'mvn:org.jvnet.mimepull:mimepull:jar:1.9.6',
-  sha1 = '41c913d791e16f93bc712a8c8a30bb64daa2e9bd',
-  maven_coords = 'org.jvnet.mimepull:mimepull:1.9.6',
-  visibility = [ 'PUBLIC' ],
-)
-
-remote_jar (
-  name = 'servlet-api',
-  out = 'servlet-api-2.5.jar',
-  url = 'mvn:javax.servlet:servlet-api:jar:2.5',
-  sha1 = '5959582d97d8b61f4d154ca9e495aafd16726e34',
-  maven_coords = 'javax.servlet:servlet-api:jar:NON-OSGI:2.5',
-  visibility = [ 'PUBLIC' ],
-)
-
-remote_jar (
-  name = 'slf4j-api',
-  out = 'slf4j-api-1.7.25.jar',
-  url = 'mvn:org.slf4j:slf4j-api:jar:1.7.25',
-  sha1 = 'da76ca59f6a57ee3102f8f9bd9cee742973efa8a',
-  maven_coords = 'org.slf4j:slf4j-api:1.7.25',
-  visibility = [ 'PUBLIC' ],
-)
-
-remote_jar (
-  name = 'slf4j-jdk14',
-  out = 'slf4j-jdk14-1.7.25.jar',
-  url = 'mvn:org.slf4j:slf4j-jdk14:jar:1.7.25',
-  sha1 = 'bccda40ebc8067491b32a88f49615a747d20082d',
-  maven_coords = 'org.slf4j:slf4j-jdk14:1.7.25',
-  visibility = [ 'PUBLIC' ],
-)
-
-remote_jar (
-  name = 'slf4j-nop',
-  out = 'slf4j-nop-1.7.25.jar',
-  url = 'mvn:org.slf4j:slf4j-nop:jar:1.7.25',
-  sha1 = '8c7708c79afec923de8957b7d4f90177628b9fcd',
-  maven_coords = 'org.slf4j:slf4j-nop:1.7.25',
-  visibility = [ 'PUBLIC' ],
-)
-
-remote_jar (
-  name = 'typesafe-config',
-  out = 'config-1.3.2.jar',
-  url = 'mvn:com.typesafe:config:jar:1.3.2',
-  sha1 = 'd6ac0ce079f114adce620f2360c92a70b2cb36dc',
-  maven_coords = 'com.typesafe:config:1.3.2',
-  visibility = [ 'PUBLIC' ],
-)
-
-remote_jar (
-  name = 'validation-api',
-  out = 'validation-api-1.1.0.Final.jar',
-  url = 'mvn:javax.validation:validation-api:jar:1.1.0.Final',
-  sha1 = '8613ae82954779d518631e05daa73a6a954817d5',
-  maven_coords = 'javax.validation:validation-api:1.1.0.Final',
-  visibility = [ 'PUBLIC' ],
-)
-
-remote_jar (
-  name = 'checkstyle',
-  out = 'checkstyle-8.10.jar',
-  url = 'mvn:com.puppycrawl.tools:checkstyle:jar:8.10',
-  sha1 = 'd7cd09c4d1240b3acc3041fcb47fd74ae351698b',
-  maven_coords = 'com.puppycrawl.tools:checkstyle:jar:NON-OSGI:8.10',
-  visibility = [ 'PUBLIC' ],
-)
-
-remote_file (
-  name = 'apache-karaf',
-  out = 'apache-karaf-offline-3.0.8.tar.gz',
-  url = 'http://repo1.maven.org/maven2/org/onosproject/apache-karaf-offline/3.0.8/apache-karaf-offline-3.0.8.tar.gz',
-  sha1 = '2503c5853285e3414da15aef8d8f3f629747c927',
-  visibility = [ 'PUBLIC' ],
-)
-
-remote_file (
-  name = 'apache-karaf-patches',
-  out = 'onos-apache-karaf-patches-3.0.8.tar.gz',
-  url = 'http://repo1.maven.org/maven2/org/onosproject/onos-apache-karaf-patches/3.0.8/onos-apache-karaf-patches-3.0.8.tar.gz',
-  sha1 = 'be5d620a2c4f4c5faa520d2c1b949ad0cc29c84f',
-  visibility = [ 'PUBLIC' ],
-)
-
-remote_jar (
-  name = 'bndlib',
-  out = 'biz.aQute.bndlib-4.0.0.jar',
-  url = 'mvn:biz.aQute.bnd:biz.aQute.bndlib:jar:4.0.0',
-  sha1 = '21e1d6fd1874d9bc201f2de1d0a48e84bff4149d',
-  maven_coords = 'biz.aQute.bnd:biz.aQute.bndlib:4.0.0',
-  visibility = [ 'PUBLIC' ],
-)
-
-remote_jar (
-  name = 'bndexe',
-  out = 'biz.aQute.bnd-4.0.0.jar',
-  url = 'mvn:biz.aQute.bnd:biz.aQute.bnd:jar:4.0.0',
-  sha1 = 'fa7746eb710852498ce1afe5227be3fbfddaf09e',
-  maven_coords = 'biz.aQute.bnd:biz.aQute.bnd:4.0.0',
-  visibility = [ 'PUBLIC' ],
-)
-
-remote_jar (
-  name = 'libthrift',
-  out = 'libthrift-0.11.0.jar',
-  url = 'mvn:org.apache.thrift:libthrift:jar:0.11.0',
-  sha1 = '4f4f1c1fbbae63258625dea71007fa41bee7edb3',
-  maven_coords = 'org.apache.thrift:libthrift:0.11.0',
-  visibility = [ 'PUBLIC' ],
-)
-
-remote_jar (
-  name = 'qdox',
-  out = 'qdox-2.0-M3.jar',
-  url = 'mvn:com.thoughtworks.qdox:qdox:jar:2.0-M3',
-  sha1 = 'f1e9ac82735dc3f2afc38cc051ae0e405f367434',
-  maven_coords = 'com.thoughtworks.qdox:qdox:jar:NON-OSGI:2.0-M3',
-  visibility = [ 'PUBLIC' ],
-)
-
-remote_jar (
-  name = 'org.apache.felix.scr.bnd',
-  out = 'org.apache.felix.scr.bnd-1.4.1-20160328.235003-2.jar',
-  url = 'https://oss.sonatype.org/content/repositories/snapshots/org/onosproject/org.apache.felix.scr.bnd/1.4.1-SNAPSHOT/org.apache.felix.scr.bnd-1.4.1-20160328.235003-2.jar',
-  sha1 = '607cac6eaba5b0eb0787a343b83fe535c42c09aa',
-  maven_coords = 'org.onosproject:org.apache.felix.scr.bnd:1.4.1-SNAPSHOT',
-  visibility = [ 'PUBLIC' ],
-)
-
-remote_jar (
-  name = 'snmp-core',
-  out = 'snmp-core-1.3-20161021.1.jar',
-  url = 'mvn:org.onosproject:snmp-core:jar:1.3-20161021.1',
-  sha1 = '65e1b71d9d0e2fc60c45f631decdb41da3253778',
-  maven_coords = 'org.onosproject:snmp-core:1.3-20161021.1',
-  visibility = [ 'PUBLIC' ],
-)
-
-remote_jar (
-  name = 'mibs-net-snmp',
-  out = 'mibbler-mibs-net-snmp-1.0-20151221.1.jar',
-  url = 'mvn:org.onosproject:mibbler-mibs-net-snmp:jar:1.0-20151221.1',
-  sha1 = 'd2cb918e46f06d4ee764d4a96b2b6fb0ba9bc60c',
-  maven_coords = 'org.onosproject:mibbler-mibs-net-snmp:1.0-20151221.1',
-  visibility = [ 'PUBLIC' ],
-)
-
-remote_jar (
-  name = 'mibs-rfc',
-  out = 'mibbler-mibs-rfc-1.0-20151221.1.jar',
-  url = 'mvn:org.onosproject:mibbler-mibs-rfc:jar:1.0-20151221.1',
-  sha1 = '06ac2a3bf48c79ab444a9deede9d554ccd355a16',
-  maven_coords = 'org.onosproject:mibbler-mibs-rfc:1.0-20151221.1',
-  visibility = [ 'PUBLIC' ],
-)
-
-remote_jar (
-  name = 'io.socket-client',
-  out = 'socket.io-client-0.8.3.jar',
-  url = 'mvn:io.socket:socket.io-client:jar:0.8.3',
-  sha1 = 'b30500232ff0668a47c9f91f02e6935457a52fb5',
-  maven_coords = 'io.socket:socket.io-client:jar:NON-OSGI:0.8.3',
-  visibility = [ 'PUBLIC' ],
-)
-
-remote_jar (
-  name = 'json',
-  out = 'json-20090211.jar',
-  url = 'mvn:org.json:json:jar:20090211',
-  sha1 = 'c183aa3a2a6250293808bba12262c8920ce5a51c',
-  maven_coords = 'org.json:json:jar:NON-OSGI:20090211',
-  visibility = [ 'PUBLIC' ],
-)
-
-remote_jar (
-  name = 'engine.io-client',
-  out = 'engine.io-client-0.8.3.jar',
-  url = 'mvn:io.socket:engine.io-client:jar:0.8.3',
-  sha1 = '854b49396e1e9f9bb0ab025062ddb49c4ed65ca1',
-  maven_coords = 'io.socket:engine.io-client:jar:NON-OSGI:0.8.3',
-  visibility = [ 'PUBLIC' ],
-)
-
-remote_jar (
-  name = 'com_google_api_grpc_proto_google_common_protos',
-  out = 'proto-google-common-protos-1.0.0.jar',
-  url = 'mvn:com.google.api.grpc:proto-google-common-protos:jar:1.0.0',
-  sha1 = '86f070507e28b930e50d218ee5b6788ef0dd05e6',
-  maven_coords = 'com.google.api.grpc:proto-google-common-protos:jar:NON-OSGI:1.0.0',
-  visibility = [ 'PUBLIC' ],
-)
-
-remote_jar (
-  name = 'com_google_errorprone_error_prone_annotations',
-  out = 'error_prone_annotations-2.1.2.jar',
-  url = 'mvn:com.google.errorprone:error_prone_annotations:jar:2.1.2',
-  sha1 = '6dcc08f90f678ac33e5ef78c3c752b6f59e63e0c',
-  maven_coords = 'com.google.errorprone:error_prone_annotations:jar:NON-OSGI:2.1.2',
-  visibility = [ 'PUBLIC' ],
-)
-
-remote_jar (
-  name = 'com_google_auth_google_auth_library_credentials',
-  out = 'google-auth-library-credentials-0.9.0.jar',
-  url = 'mvn:com.google.auth:google-auth-library-credentials:jar:0.9.0',
-  sha1 = '8e2b181feff6005c9cbc6f5c1c1e2d3ec9138d46',
-  maven_coords = 'com.google.auth:google-auth-library-credentials:jar:NON-OSGI:0.9.0',
-  visibility = [ 'PUBLIC' ],
-)
-
-remote_jar (
-  name = 'io_opencensus_opencensus_api',
-  out = 'opencensus-api-0.12.3.jar',
-  url = 'mvn:io.opencensus:opencensus-api:jar:0.12.3',
-  sha1 = '743f074095f29aa985517299545e72cc99c87de0',
-  maven_coords = 'io.opencensus:opencensus-api:jar:NON-OSGI:0.12.3',
-  visibility = [ 'PUBLIC' ],
-)
-
-remote_jar (
-  name = 'io_opencensus_opencensus_contrib_grpc_metrics',
-  out = 'opencensus-contrib-grpc-metrics-0.12.3.jar',
-  url = 'mvn:io.opencensus:opencensus-contrib-grpc-metrics:jar:0.12.3',
-  sha1 = 'a4c7ff238a91b901c8b459889b6d0d7a9d889b4d',
-  maven_coords = 'io.opencensus:opencensus-contrib-grpc-metrics:jar:NON-OSGI:0.12.3',
-  visibility = [ 'PUBLIC' ],
-)
-
-remote_jar (
-  name = 'openstack4j-core',
-  out = 'openstack4j-core-3.1.0.jar',
-  url = 'mvn:org.pacesys:openstack4j-core:jar:3.1.0',
-  sha1 = '634c2ad6728bb6e4cd91c950dd654aacb6f107a6',
-  maven_coords = 'org.pacesys:openstack4j-core:3.1.0',
-  visibility = [ 'PUBLIC' ],
-)
-
-remote_jar (
-  name = 'openstack4j-http-connector',
-  out = 'openstack4j-http-connector-3.1.0.jar',
-  url = 'mvn:org.pacesys.openstack4j.connectors:openstack4j-http-connector:jar:3.1.0',
-  sha1 = '5bbd558313f13daac819bbbe56ae8432e64409d9',
-  maven_coords = 'org.pacesys.openstack4j.connectors:openstack4j-http-connector:3.1.0',
-  visibility = [ 'PUBLIC' ],
-)
-
-remote_jar (
-  name = 'openstack4j-httpclient',
-  out = 'openstack4j-httpclient-3.1.0.jar',
-  url = 'mvn:org.pacesys.openstack4j.connectors:openstack4j-httpclient:jar:3.1.0',
-  sha1 = 'acb413e27cc43f4bbcee99300befffcf667de579',
-  maven_coords = 'org.pacesys.openstack4j.connectors:openstack4j-httpclient:3.1.0',
-  visibility = [ 'PUBLIC' ],
-)
-
-remote_jar (
-  name = 'json-patch',
-  out = 'json-patch-1.9.jar',
-  url = 'mvn:com.github.fge:json-patch:jar:1.9',
-  sha1 = '0a4c3c97a0f5965dec15795acf40d3fbc897af4b',
-  maven_coords = 'com.github.fge:json-patch:1.9',
-  visibility = [ 'PUBLIC' ],
-)
-
-remote_jar (
-  name = 'jackson-coreutils',
-  out = 'jackson-coreutils-1.6.jar',
-  url = 'mvn:com.github.fge:jackson-coreutils:jar:1.6',
-  sha1 = '9e6af56eb7cc2a65700b289abc7ee2bd170fd231',
-  maven_coords = 'com.github.fge:jackson-coreutils:1.6',
-  visibility = [ 'PUBLIC' ],
-)
-
-remote_jar (
-  name = 'btf',
-  out = 'btf-1.2.jar',
-  url = 'mvn:com.github.fge:btf:jar:1.2',
-  sha1 = '9e66651022eb86301b348d57e6f59459effc343b',
-  maven_coords = 'com.github.fge:btf:1.2',
-  visibility = [ 'PUBLIC' ],
-)
-
-remote_jar (
-  name = 'msg-simple',
-  out = 'msg-simple-1.1.jar',
-  url = 'mvn:com.github.fge:msg-simple:jar:1.1',
-  sha1 = 'f261263e13dd4cfa93cc6b83f1f58f619097a2c4',
-  maven_coords = 'com.github.fge:msg-simple:1.1',
-  visibility = [ 'PUBLIC' ],
-)
-
-remote_jar (
-  name = 'snakeyaml',
-  out = 'snakeyaml-1.15.jar',
-  url = 'mvn:org.yaml:snakeyaml:jar:1.15',
-  sha1 = '3b132bea69e8ee099f416044970997bde80f4ea6',
-  maven_coords = 'org.yaml:snakeyaml:1.15',
-  visibility = [ 'PUBLIC' ],
-)
-
-remote_jar (
-  name = 'onos-yang-model',
-  out = 'onos-yang-model-2.5.jar',
-  url = 'mvn:org.onosproject:onos-yang-model:jar:2.5',
-  sha1 = '61339921f42354e499e550c15283e4aa75a03ef7',
-  maven_coords = 'org.onosproject:onos-yang-model:2.5',
-  visibility = [ 'PUBLIC' ],
-)
-
-remote_jar (
-  name = 'onos-yang-compiler-api',
-  out = 'onos-yang-compiler-api-2.5.jar',
-  url = 'mvn:org.onosproject:onos-yang-compiler-api:jar:2.5',
-  sha1 = 'c504df941d1a1b49e4dd8045c935120f3483504e',
-  maven_coords = 'org.onosproject:onos-yang-compiler-api:2.5',
-  visibility = [ 'PUBLIC' ],
-)
-
-remote_jar (
-  name = 'onos-yang-compiler-main',
-  out = 'onos-yang-compiler-main-2.5.jar',
-  url = 'mvn:org.onosproject:onos-yang-compiler-main:jar:2.5',
-  sha1 = '8048db59dab2c813cfbc3f7c176eb12b1c8b2548',
-  maven_coords = 'org.onosproject:onos-yang-compiler-main:2.5',
-  visibility = [ 'PUBLIC' ],
-)
-
-remote_jar (
-  name = 'onos-yang-runtime',
-  out = 'onos-yang-runtime-2.5.jar',
-  url = 'mvn:org.onosproject:onos-yang-runtime:jar:2.5',
-  sha1 = '9d621709f34fd7da4d1954d868ac0eddeba725d2',
-  maven_coords = 'org.onosproject:onos-yang-runtime:2.5',
-  visibility = [ 'PUBLIC' ],
-)
-
-remote_jar (
-  name = 'onos-yang-serializers-json',
-  out = 'onos-yang-serializers-json-2.5.jar',
-  url = 'mvn:org.onosproject:onos-yang-serializers-json:jar:2.5',
-  sha1 = 'cf442f226b9423c22eb5ec9409e99fe3a0f63a37',
-  maven_coords = 'org.onosproject:onos-yang-serializers-json:2.5',
-  visibility = [ 'PUBLIC' ],
-)
-
-remote_jar (
-  name = 'onos-yang-serializers-xml',
-  out = 'onos-yang-serializers-xml-2.5.jar',
-  url = 'mvn:org.onosproject:onos-yang-serializers-xml:jar:2.5',
-  sha1 = '7f7231237da9571f79700d2ee0a218cd6253409c',
-  maven_coords = 'org.onosproject:onos-yang-serializers-xml:2.5',
-  visibility = [ 'PUBLIC' ],
-)
-
-remote_jar (
-  name = 'onos-yang-serializers-utils',
-  out = 'onos-yang-serializers-utils-2.5.jar',
-  url = 'mvn:org.onosproject:onos-yang-serializers-utils:jar:2.5',
-  sha1 = '13f804292e42635fcf28bbadffca8bb72c00b327',
-  maven_coords = 'org.onosproject:onos-yang-serializers-utils:2.5',
-  visibility = [ 'PUBLIC' ],
-)
-
-remote_jar (
-  name = 'org.apache.servicemix.bundles.dom4j',
-  out = 'org.apache.servicemix.bundles.dom4j-1.6.1_5.jar',
-  url = 'mvn:org.apache.servicemix.bundles:org.apache.servicemix.bundles.dom4j:jar:1.6.1_5',
-  sha1 = 'f5da21ae9508008f7b28001983adc143cb310ad7',
-  maven_coords = 'org.apache.servicemix.bundles:org.apache.servicemix.bundles.dom4j:1.6.1_5',
-  visibility = [ 'PUBLIC' ],
-)
-
-remote_jar (
-  name = 'plexus-utils',
-  out = 'plexus-utils-3.0.24.jar',
-  url = 'mvn:org.codehaus.plexus:plexus-utils:jar:3.0.24',
-  sha1 = 'b4ac9780b37cb1b736eae9fbcef27609b7c911ef',
-  maven_coords = 'org.codehaus.plexus:plexus-utils:jar:NON-OSGI:3.0.24',
-  visibility = [ 'PUBLIC' ],
-)
-
-remote_jar (
-  name = 'sshd-core',
-  out = 'sshd-core-1.4.0.jar',
-  url = 'mvn:org.apache.sshd:sshd-core:jar:1.4.0',
-  sha1 = 'c8f3d7457fc9979d1b9ec319f0229b89793c8e56',
-  maven_coords = 'org.apache.sshd:sshd-core:1.4.0',
-  visibility = [ 'PUBLIC' ],
-)
-
-remote_jar (
-  name = 'bcpkix-jdk15on',
-  out = 'bcpkix-jdk15on-1.59.jar',
-  url = 'mvn:org.bouncycastle:bcpkix-jdk15on:jar:1.59',
-  sha1 = '9cef0aab8a4bb849a8476c058ce3ff302aba3fff',
-  maven_coords = 'org.bouncycastle:bcpkix-jdk15on:1.59',
-  visibility = [ 'PUBLIC' ],
-)
-
-remote_jar (
-  name = 'bcprov-jdk15on',
-  out = 'bcprov-jdk15on-1.59.jar',
-  url = 'mvn:org.bouncycastle:bcprov-jdk15on:jar:1.59',
-  sha1 = '2507204241ab450456bdb8e8c0a8f986e418bd99',
-  maven_coords = 'org.bouncycastle:bcprov-jdk15on:1.59',
-  visibility = [ 'PUBLIC' ],
-)
-
-remote_jar (
-  name = 'hamcrest-optional',
-  out = 'hamcrest-optional-1.1.0.jar',
-  url = 'mvn:com.spotify:hamcrest-optional:jar:1.1.0',
-  sha1 = 'c2dfe3a43794b15fb4c28de0027fe6e249855b3b',
-  maven_coords = 'com.spotify:hamcrest-optional:jar:NON-OSGI:1.1.0',
-  visibility = [ 'PUBLIC' ],
-)
-
-remote_jar (
-  name = 'swagger-annotations',
-  out = 'swagger-annotations-1.5.16.jar',
-  url = 'mvn:io.swagger:swagger-annotations:jar:1.5.16',
-  sha1 = '935f1f2fed2cbdd7a0513981d6c53201e21155f4',
-  maven_coords = 'io.swagger:swagger-annotations:1.5.16',
-  visibility = [ 'PUBLIC' ],
-)
-
-remote_jar (
-  name = 'kafka-clients',
-  out = 'org.apache.servicemix.bundles.kafka-clients-0.8.2.2_1.jar',
-  url = 'mvn:org.apache.servicemix.bundles:org.apache.servicemix.bundles.kafka-clients:jar:0.8.2.2_1',
-  sha1 = '19ba66200cc3617fad12843788dff818b9882008',
-  maven_coords = 'org.apache.servicemix.bundles:org.apache.servicemix.bundles.kafka-clients:0.8.2.2_1',
-  visibility = [ 'PUBLIC' ],
-)
-
-remote_jar (
-  name = 'tinder-xmpp',
-  out = 'tinder-1.3.0.jar',
-  url = 'mvn:org.igniterealtime:tinder:jar:1.3.0',
-  sha1 = '46353ded2a1d1a87d17600206d61814eb0b8a711',
-  maven_coords = 'org.igniterealtime:tinder:jar:NON-OSGI:1.3.0',
-  visibility = [ 'PUBLIC' ],
-)
-
-remote_jar (
-  name = 'aalto-xml',
-  out = 'aalto-xml-1.0.0.jar',
-  url = 'mvn:com.fasterxml:aalto-xml:jar:1.0.0',
-  sha1 = 'aeae9e8a71914e7f5efc8a69d2f5cb1f2224f2c6',
-  maven_coords = 'com.fasterxml:aalto-xml:1.0.0',
-  visibility = [ 'PUBLIC' ],
-)
-
-remote_jar (
-  name = 'stax2-api',
-  out = 'stax2-api-4.0.0.jar',
-  url = 'mvn:org.codehaus.woodstox:stax2-api:jar:4.0.0',
-  sha1 = '6fa8b05f7587a3cb819d223ee0b0de0c126e3dd1',
-  maven_coords = 'org.codehaus.woodstox:stax2-api:4.0.0',
-  visibility = [ 'PUBLIC' ],
-)
-
-remote_jar (
-  name = 'concurrent-hashmap',
-  out = 'concurrentlinkedhashmap-lru-1.0.jar',
-  url = 'mvn:com.googlecode.concurrentlinkedhashmap:concurrentlinkedhashmap-lru:jar:1.0',
-  sha1 = 'db7b7a28b835db4717d4aaf31f5d4441887a6d46',
-  maven_coords = 'com.googlecode.concurrentlinkedhashmap:concurrentlinkedhashmap-lru:jar:NON-OSGI:1.0',
-  visibility = [ 'PUBLIC' ],
-)
-
-remote_jar (
-  name = 'gnu-idn',
-  out = 'libidn-1.15.jar',
-  url = 'mvn:org.gnu.inet:libidn:jar:1.15',
-  sha1 = 'b5bede3c1c031a827b604da31768ddaf833495c6',
-  maven_coords = 'org.gnu.inet:libidn:jar:NON-OSGI:1.15',
-  visibility = [ 'PUBLIC' ],
-)
-
-remote_jar (
-  name = 'sigar',
-  out = 'sigar-1.6.5_01.jar',
-  url = 'mvn:org.knowhowlab.osgi:sigar:jar:1.6.5_01',
-  sha1 = '58eb4af0dc4a1d331cd7620767216494e2984dea',
-  maven_coords = 'org.knowhowlab.osgi:sigar:1.6.5_01',
-  visibility = [ 'PUBLIC' ],
-)
-
-remote_jar (
-  name = 'runtime-grpc-core',
-  out = 'grpc-core-1.14.0.jar',
-  url = 'mvn:io.grpc:grpc-core:jar:1.14.0',
-  sha1 = '526e5be291c96e248789d769c108a084febda07f',
-  maven_coords = 'io.grpc:grpc-core:jar:NON-OSGI:1.14.0',
-  visibility = [ 'PUBLIC' ],
-)
-
-remote_jar (
-  name = 'runtime-grpc-context',
-  out = 'grpc-context-1.14.0.jar',
-  url = 'mvn:io.grpc:grpc-context:jar:1.14.0',
-  sha1 = '77252b5f926875891aaae5629e6ab2ef968cd6c6',
-  maven_coords = 'io.grpc:grpc-context:jar:NON-OSGI:1.14.0',
-  visibility = [ 'PUBLIC' ],
-)
-
-remote_jar (
-  name = 'runtime-grpc-stub',
-  out = 'grpc-stub-1.14.0.jar',
-  url = 'mvn:io.grpc:grpc-stub:jar:1.14.0',
-  sha1 = '74bfe83c0dc69bf903fff8df3568cbeb8b387d35',
-  maven_coords = 'io.grpc:grpc-stub:jar:NON-OSGI:1.14.0',
-  visibility = [ 'PUBLIC' ],
-)
-
-remote_jar (
-  name = 'runtime-grpc-netty',
-  out = 'grpc-netty-1.14.0.jar',
-  url = 'mvn:io.grpc:grpc-netty:jar:1.14.0',
-  sha1 = '21c6edadd45b6869384f8aa0df1663d62c503617',
-  maven_coords = 'io.grpc:grpc-netty:jar:NON-OSGI:1.14.0',
-  visibility = [ 'PUBLIC' ],
-)
-
-remote_jar (
-  name = 'runtime-grpc-auth',
-  out = 'grpc-auth-1.14.0.jar',
-  url = 'mvn:io.grpc:grpc-auth:jar:1.14.0',
-  sha1 = '3b88d51b52da96d574f4dfd50ad6d2bc8904a858',
-  maven_coords = 'io.grpc:grpc-auth:jar:NON-OSGI:1.14.0',
-  visibility = [ 'PUBLIC' ],
-)
-
-remote_jar (
-  name = 'runtime-grpc-protobuf',
-  out = 'grpc-protobuf-1.14.0.jar',
-  url = 'mvn:io.grpc:grpc-protobuf:jar:1.14.0',
-  sha1 = 'd429fdc2e0d288b34ea7588bb762eb458f385bd5',
-  maven_coords = 'io.grpc:grpc-protobuf:jar:NON-OSGI:1.14.0',
-  visibility = [ 'PUBLIC' ],
-)
-
-remote_jar (
-  name = 'runtime-grpc-protobuf-lite',
-  out = 'grpc-protobuf-lite-1.14.0.jar',
-  url = 'mvn:io.grpc:grpc-protobuf-lite:jar:1.14.0',
-  sha1 = '2ac8c28ca927f954eaa228a931d9c163cf3d860f',
-  maven_coords = 'io.grpc:grpc-protobuf-lite:jar:NON-OSGI:1.14.0',
-  visibility = [ 'PUBLIC' ],
-)
-
-remote_jar (
-  name = 'runtime-protobuf',
-  out = 'protobuf-java-3.6.1.jar',
-  url = 'mvn:com.google.protobuf:protobuf-java:jar:3.6.1',
-  sha1 = '0d06d46ecfd92ec6d0f3b423b4cd81cb38d8b924',
-  maven_coords = 'com.google.protobuf:protobuf-java:3.6.1',
-  visibility = [ 'PUBLIC' ],
-)
-
-remote_jar (
-  name = 'grpc-core-1.3.1',
-  out = 'grpc-core-1.3.1.jar',
-  url = 'mvn:io.grpc:grpc-core:jar:1.3.1',
-  sha1 = 'a9b38b4a19af3ef208f4f6bf7871876d959c5eb1',
-  maven_coords = 'io.grpc:grpc-core:jar:NON-OSGI:1.3.1',
-  visibility = [ 'PUBLIC' ],
-)
-
-remote_jar (
-  name = 'grpc-protobuf-1.3.1',
-  out = 'grpc-protobuf-1.3.1.jar',
-  url = 'mvn:io.grpc:grpc-protobuf:jar:1.3.1',
-  sha1 = '9562e977cacd6e128a31686c3e6948d61873c496',
-  maven_coords = 'io.grpc:grpc-protobuf:jar:NON-OSGI:1.3.1',
-  visibility = [ 'PUBLIC' ],
-)
-
-remote_jar (
-  name = 'grpc-protobuf-lite-1.3.1',
-  out = 'grpc-protobuf-lite-1.3.1.jar',
-  url = 'mvn:io.grpc:grpc-protobuf-lite:jar:1.3.1',
-  sha1 = '98d1d3d100fdcf92c4331999a504a1a72a5f6e52',
-  maven_coords = 'io.grpc:grpc-protobuf-lite:jar:NON-OSGI:1.3.1',
-  visibility = [ 'PUBLIC' ],
-)
-
-remote_jar (
-  name = 'grpc-stub-1.3.1',
-  out = 'grpc-stub-1.3.1.jar',
-  url = 'mvn:io.grpc:grpc-stub:jar:1.3.1',
-  sha1 = '60bdfa9d8c664a9d87ae461106eff6eed8da6c54',
-  maven_coords = 'io.grpc:grpc-stub:jar:NON-OSGI:1.3.1',
-  visibility = [ 'PUBLIC' ],
-)
-
-remote_jar (
-  name = 'grpc-netty-1.3.1',
-  out = 'grpc-netty-1.3.1.jar',
-  url = 'mvn:io.grpc:grpc-netty:jar:1.3.1',
-  sha1 = 'cc3831fccb76cfe21445f75cc055b5ffd979dc54',
-  maven_coords = 'io.grpc:grpc-netty:jar:NON-OSGI:1.3.1',
-  visibility = [ 'PUBLIC' ],
-)
-
-remote_jar (
-  name = 'grpc-auth-1.3.1',
-  out = 'grpc-auth-1.3.1.jar',
-  url = 'mvn:io.grpc:grpc-auth:jar:1.3.1',
-  sha1 = '57a0e0b9e474842801521fae76f955dd28ad3ae0',
-  maven_coords = 'io.grpc:grpc-auth:jar:NON-OSGI:1.3.1',
-  visibility = [ 'PUBLIC' ],
-)
-
-remote_jar (
-  name = 'protobuf-java-3.3.0',
-  out = 'protobuf-java-3.3.0.jar',
-  url = 'mvn:com.google.protobuf:protobuf-java:jar:3.3.0',
-  sha1 = '9f301d1a27501b1afcb2ed16aad428337dabf9e4',
-  maven_coords = 'com.google.protobuf:protobuf-java:3.3.0',
-  visibility = [ 'PUBLIC' ],
-)
-
-remote_jar (
-  name = 'protobuf-java-3.2.0',
-  out = 'protobuf-java-3.2.0.jar',
-  url = 'mvn:com.google.protobuf:protobuf-java:jar:3.2.0',
-  sha1 = '62ccf171a106ff6791507f2d5364c275f9a3131d',
-  maven_coords = 'com.google.protobuf:protobuf-java:3.2.0',
-  visibility = [ 'PUBLIC' ],
-)
-
-remote_jar (
-  name = 'grpc-testing-1.3.1',
-  out = 'grpc-testing-1.3.1.jar',
-  url = 'mvn:io.grpc:grpc-testing:jar:1.3.1',
-  sha1 = 'fd6c4081cd3415684a0b655327e210aa10153eec',
-  maven_coords = 'io.grpc:grpc-testing:jar:NON-OSGI:1.3.1',
-  visibility = [ 'PUBLIC' ],
-)
-
-remote_jar (
-  name = 'grpc-testing-proto-1.3.1',
-  out = 'grpc-testing-proto-1.3.1.jar',
-  url = 'mvn:io.grpc:grpc-testing-proto:jar:1.3.1',
-  sha1 = '170f0406457b44695562ccd5ec8d0da9cb762643',
-  maven_coords = 'io.grpc:grpc-testing-proto:jar:NON-OSGI:1.3.1',
-  visibility = [ 'PUBLIC' ],
-)
-
-remote_jar (
-  name = 'grpc-context-1.3.1',
-  out = 'grpc-context-1.3.1.jar',
-  url = 'mvn:io.grpc:grpc-context:jar:1.3.1',
-  sha1 = '28accd419b18d59055b8999f78f5cb7767c7bde8',
-  maven_coords = 'io.grpc:grpc-context:jar:NON-OSGI:1.3.1',
-  visibility = [ 'PUBLIC' ],
-)
-
-remote_jar (
-  name = 'google-truth-0.28',
-  out = 'truth-0.28.jar',
-  url = 'mvn:com.google.truth:truth:jar:0.28',
-  sha1 = '0a388c7877c845ff4b8e19689dda5ac9d34622c4',
-  maven_coords = 'com.google.truth:truth:jar:NON-OSGI:0.28',
-  visibility = [ 'PUBLIC' ],
-)
-
-remote_jar (
-  name = 'google-code-findbugs-3.0.0',
-  out = 'jsr305-3.0.0.jar',
-  url = 'mvn:com.google.code.findbugs:jsr305:jar:3.0.0',
-  sha1 = '5871fb60dc68d67da54a663c3fd636a10a532948',
-  maven_coords = 'com.google.code.findbugs:jsr305:jar:NON-OSGI:3.0.0',
-  visibility = [ 'PUBLIC' ],
-)
-
-remote_jar (
-  name = 'google-errorprone-2.0.19',
-  out = 'error_prone_annotations-2.0.19.jar',
-  url = 'mvn:com.google.errorprone:error_prone_annotations:jar:2.0.19',
-  sha1 = 'c3754a0bdd545b00ddc26884f9e7624f8b6a14de',
-  maven_coords = 'com.google.errorprone:error_prone_annotations:jar:NON-OSGI:2.0.19',
-  visibility = [ 'PUBLIC' ],
-)
-
-remote_jar (
-  name = 'google-instrumentation-0.3.0',
-  out = 'instrumentation-api-0.3.0.jar',
-  url = 'mvn:com.google.instrumentation:instrumentation-api:jar:0.3.0',
-  sha1 = 'a2e145e7a7567c6372738f5c5a6f3ba6407ac354',
-  maven_coords = 'com.google.instrumentation:instrumentation-api:jar:NON-OSGI:0.3.0',
-  visibility = [ 'PUBLIC' ],
-)
-
diff --git a/lib/deps.json b/lib/deps.json
index b03c475..b3ea3e8 100644
--- a/lib/deps.json
+++ b/lib/deps.json
@@ -11,13 +11,15 @@
       "com_google_guava_guava",
       "slf4j-api",
       "osgi-core",
-      "org.osgi.compendium",
-      "org.apache.felix.scr.annotations",
-      "org.apache.felix.scr",
+      "org.osgi.util.promise",
+      "org.osgi.service.component",
+      "org.osgi.service.component.annotations",
+      "org.osgi.service.metatype.annotations",
       "org.apache.karaf.features.core",
       "org.apache.karaf.system.core",
-      { "name": "com_google_code_findbugs_jsr305", "compile_only": true },
-      "org.apache.servicemix.bundles.dom4j"
+      "org.apache.servicemix.bundles.dom4j",
+      { "name": "com_google_code_findbugs_jsr305", "compile_only": true }
+
     ],
     "CORE_DEPS": [
       ":COMPILE",
@@ -25,6 +27,12 @@
       "//utils/misc:onlab-misc",
       "//utils/osgi:onlab-osgi"
     ],
+    "JAXB": [
+      "jaxb-api",
+      "jaxb-core",
+      "jaxb-impl",
+      "javax.activation"
+    ],
     "TEST": [
       "junit",
       "easymock",
@@ -94,7 +102,7 @@
       "objenesis"
     ],
     "CLI": [
-      "org.apache.karaf.shell.console",
+      "org.apache.karaf.shell.core",
       "//cli:onos-cli"
     ],
     "REST": [
@@ -137,7 +145,7 @@
   "artifacts": {
     "aopalliance-repackaged": "mvn:org.glassfish.hk2.external:aopalliance-repackaged:2.5.0-b42",
     "amqp-client": "mvn:com.rabbitmq:amqp-client:jar:3.6.1",
-    "asm": "mvn:org.ow2.asm:asm:5.0.4",
+    "asm": "mvn:org.ow2.asm:asm:5.2",
     "atomix": "mvn:io.atomix:atomix:3.0.7",
     "atomix-cluster": "mvn:io.atomix:atomix-cluster:3.0.7",
     "atomix-gossip": "mvn:io.atomix:atomix-gossip:3.0.7",
@@ -152,8 +160,8 @@
     "commons-collections": "mvn:commons-collections:commons-collections:3.2.2",
     "commons-configuration": "mvn:commons-configuration:commons-configuration:1.10",
     "commons-io": "mvn:commons-io:commons-io:2.6",
-    "commons-jxpath": "mvn:commons-jxpath:commons-jxpath:1.3",
     "commons-beanutils": "mvn:commons-beanutils:commons-beanutils:1.9.3",
+    "commons-jxpath": "mvn:commons-jxpath:commons-jxpath:1.3",
     "fast-classpath-scanner": "mvn:io.github.lukehutch:fast-classpath-scanner:2.21",
     "jdom": "mvn:jdom:jdom:1.0",
     "commons-lang": "mvn:commons-lang:commons-lang:2.6",
@@ -199,26 +207,31 @@
 
     "javax.inject": "mvn:org.glassfish.hk2.external:javax.inject:2.5.0-b42",
     "javax.ws.rs-api": "mvn:javax.ws.rs:javax.ws.rs-api:2.1",
-    "jersey-client": "mvn:org.glassfish.jersey.core:jersey-client:2.26",
-    "jersey-security": "mvn:org.glassfish.jersey.security:oauth2-client:jar:2.26",
-    "jersey-common": "mvn:org.glassfish.jersey.core:jersey-common:2.26",
-    "jersey-container-jetty-http": "mvn:org.glassfish.jersey.containers:jersey-container-jetty-http:2.26",
-    "jersey-container-servlet": "mvn:org.glassfish.jersey.containers:jersey-container-servlet:2.26",
-    "jersey-container-servlet-core": "mvn:org.glassfish.jersey.containers:jersey-container-servlet-core:2.26",
-    "jersey-media-multipart": "mvn:org.glassfish.jersey.media:jersey-media-multipart:2.26",
-    "jersey-media-sse": "mvn:org.glassfish.jersey.media:jersey-media-sse:2.26",
-    "jersey-server": "mvn:org.glassfish.jersey.core:jersey-server:2.26",
-    "jersey-hk2":"mvn:org.glassfish.jersey.inject:jersey-hk2:2.26",
-    "jersey-test-framework-core": "mvn:org.glassfish.jersey.test-framework:jersey-test-framework-core:2.26",
-    "jersey-test-framework-jetty": "mvn:org.glassfish.jersey.test-framework.providers:jersey-test-framework-provider-jetty:2.26",
-    "jetty-util": "mvn:org.eclipse.jetty:jetty-util:9.2.21.v20170120",
-    "jetty-websocket": "mvn:org.eclipse.jetty:jetty-websocket:8.1.19.v20160209",
-    "jetty-server": "mvn:org.eclipse.jetty:jetty-server:9.2.21.v20170120",
-    "jetty-servlet": "mvn:org.eclipse.jetty:jetty-servlet:9.2.26.v20180806",
-    "jetty-security": "mvn:org.eclipse.jetty:jetty-security:9.2.21.v20170120",
-    "jetty-continuation": "mvn:org.eclipse.jetty:jetty-continuation:9.2.21.v20170120",
-    "jetty-http": "mvn:org.eclipse.jetty:jetty-http:9.2.21.v20170120",
-    "jetty-io": "mvn:org.eclipse.jetty:jetty-io:9.2.21.v20170120",
+    "javax.activation": "mvn:javax.activation:activation:1.1.1",
+    "jaxb-api": "mvn:javax.xml.bind:jaxb-api:2.3.1",
+    "jaxb-core": "mvn:com.sun.xml.bind:jaxb-core:2.3.0.1",
+    "jaxb-impl": "mvn:com.sun.xml.bind:jaxb-impl:2.3.0.1",
+    "jersey-client": "mvn:org.glassfish.jersey.core:jersey-client:2.27",
+    "jersey-security": "mvn:org.glassfish.jersey.security:oauth2-client:jar:2.27",
+    "jersey-common": "mvn:org.glassfish.jersey.core:jersey-common:2.27",
+    "jersey-container-jetty-http": "mvn:org.glassfish.jersey.containers:jersey-container-jetty-http:2.27",
+    "jersey-container-servlet": "mvn:org.glassfish.jersey.containers:jersey-container-servlet:2.27",
+    "jersey-container-servlet-core": "mvn:org.glassfish.jersey.containers:jersey-container-servlet-core:2.27",
+    "jersey-media-multipart": "mvn:org.glassfish.jersey.media:jersey-media-multipart:2.27",
+    "jersey-media-sse": "mvn:org.glassfish.jersey.media:jersey-media-sse:2.27",
+    "jersey-server": "mvn:org.glassfish.jersey.core:jersey-server:2.27",
+    "jersey-hk2":"mvn:org.glassfish.jersey.inject:jersey-hk2:2.27",
+    "jersey-test-framework-core": "mvn:org.glassfish.jersey.test-framework:jersey-test-framework-core:2.27",
+    "jersey-test-framework-jetty": "mvn:org.glassfish.jersey.test-framework.providers:jersey-test-framework-provider-jetty:2.27",
+    "jetty-util": "mvn:org.eclipse.jetty:jetty-util:9.4.11.v20180605",
+    "jetty-websocket-api": "mvn:org.eclipse.jetty.websocket:websocket-api:9.4.11.v20180605",
+    "jetty-websocket": "mvn:org.eclipse.jetty.websocket:websocket-servlet:9.4.11.v20180605",
+    "jetty-server": "mvn:org.eclipse.jetty:jetty-server:9.4.11.v20180605",
+    "jetty-servlet": "mvn:org.eclipse.jetty:jetty-servlet:9.4.11.v20180605",
+    "jetty-security": "mvn:org.eclipse.jetty:jetty-security:9.4.11.v20180605",
+    "jetty-continuation": "mvn:org.eclipse.jetty:jetty-continuation:9.4.11.v20180605",
+    "jetty-http": "mvn:org.eclipse.jetty:jetty-http:9.4.11.v20180605",
+    "jetty-io": "mvn:org.eclipse.jetty:jetty-io:9.4.11.v20180605",
     "javax.servlet-api": "mvn:javax.servlet:javax.servlet-api:3.1.0",
     "joda-time": "mvn:joda-time:joda-time:2.9.3",
     "jsch": "mvn:com.jcraft:jsch:0.1.53",
@@ -249,19 +262,25 @@
     "io_netty_netty_codec-socks": "mvn:io.netty:netty-codec-socks:4.1.27.Final",
     "objenesis": "mvn:org.objenesis:objenesis:2.6",
     "openflowj": "mvn:org.onosproject:openflowj:3.2.1.onos",
-    "org.apache.felix.framework.security": "mvn:org.onosproject:org.apache.felix.framework.security:jar:2.2.0.onos",
-    "org.apache.felix.scr": "mvn:org.apache.felix:org.apache.felix.scr:1.8.2",
-    "org.apache.felix.scr.annotations": "mvn:org.apache.felix:org.apache.felix.scr.annotations:1.9.12",
-    "org.apache.karaf.features.core": "mvn:org.apache.karaf.features:org.apache.karaf.features.core:3.0.8",
-    "org.apache.karaf.shell.console": "mvn:org.apache.karaf.shell:org.apache.karaf.shell.console:3.0.8",
+    "org.osgi.util.function": "mvn:org.osgi:org.osgi.util.function:1.1.0",
+    "org.osgi.util.promise": "mvn:org.osgi:org.osgi.util.promise:1.1.0",
+    "org.osgi.service.component": "mvn:org.osgi:org.osgi.service.component:1.4.0",
+    "org.osgi.service.component.annotations": "mvn:org.osgi:org.osgi.service.component.annotations:1.4.0",
+    "org.osgi.service.metatype.annotations": "mvn:org.osgi:org.osgi.service.metatype.annotations:1.4.0",
+    "org.osgi.service.cm": "mvn:org.osgi:org.osgi.service.cm:1.6.0",
+    "org.apache.felix.scr.bnd": "mvn:org.apache.felix:org.apache.felix.scr.bnd:1.9.0",
+    "org.apache.karaf.features.core": "mvn:org.apache.karaf.features:org.apache.karaf.features.core:4.2.1",
+    "org.apache.karaf.shell.console": "mvn:org.apache.karaf.shell:org.apache.karaf.shell.console:4.2.1",
+    "org.apache.karaf.shell.core": "mvn:org.apache.karaf.shell:org.apache.karaf.shell.core:4.2.1",
     "org.apache.httpcomponents.httpasyncclient-osgi": "mvn:org.apache.httpcomponents:httpasyncclient-osgi:4.1.2",
     "org.apache.httpcomponents.httpcore-nio": "mvn:org.apache.httpcomponents:httpcore-nio:4.4.4",
-    "org.apache.karaf.jaas": "mvn:org.apache.karaf.jaas:org.apache.karaf.jaas.modules:3.0.8",
-    "org.apache.karaf.system.core": "mvn:org.apache.karaf.system:org.apache.karaf.system.core:3.0.8",
+    "org.apache.karaf.jaas": "mvn:org.apache.karaf.jaas:org.apache.karaf.jaas.modules:4.2.1",
+    "org.apache.karaf.system.core": "mvn:org.apache.karaf.system:org.apache.karaf.system.core:4.2.1",
     "org.apache.servicemix.bundles.snmp4j": "mvn:org.apache.servicemix.bundles:org.apache.servicemix.bundles.snmp4j:2.3.4_1",
     "org.osgi.compendium": "mvn:org.osgi:org.osgi.compendium:5.0.0",
+    "org.osgi.cmpn": "mvn:org.osgi:osgi.cmpn:7.0.0",
     "osgi-core": "mvn:org.osgi:org.osgi.core:5.0.0",
-    "reflectasm": "mvn:com.esotericsoftware:reflectasm:1.11.0",
+    "reflectasm": "mvn:com.esotericsoftware:reflectasm:1.11.7",
     "remotetea-oncrpc": "mvn:org.acplt.remotetea:remotetea-oncrpc:1.1.3",
     "rrd4j": "mvn:org.rrd4j:rrd4j:3.1",
     "javassist": "mvn:org.javassist:javassist:3.22.0-GA", //transitive
@@ -273,16 +292,12 @@
     "typesafe-config": "mvn:com.typesafe:config:1.3.2",
     "validation-api": "mvn:javax.validation:validation-api:1.1.0.Final",
     "checkstyle": "mvn:com.puppycrawl.tools:checkstyle:8.10",
-    "apache-karaf": "http://repo1.maven.org/maven2/org/onosproject/apache-karaf-offline/3.0.8/apache-karaf-offline-3.0.8.tar.gz",
-    "apache-karaf-patches": "http://repo1.maven.org/maven2/org/onosproject/onos-apache-karaf-patches/3.0.8/onos-apache-karaf-patches-3.0.8.tar.gz",
+    "apache-karaf": "http://repo1.maven.org/maven2/org/onosproject/apache-karaf-offline/4.2.1-offline-20181102/apache-karaf-offline-4.2.1-offline-20181102.tar.gz",
     "bndlib": "mvn:biz.aQute.bnd:biz.aQute.bndlib:jar:4.0.0",
     "bndexe": "mvn:biz.aQute.bnd:biz.aQute.bnd:4.0.0",
     "libthrift": "mvn:org.apache.thrift:libthrift:0.11.0",
     "qdox": "mvn:com.thoughtworks.qdox:qdox:2.0-M3",
-    "org.apache.felix.scr.bnd": {
-      "uri": "mvn:org.onosproject:org.apache.felix.scr.bnd:1.4.1-SNAPSHOT",
-      "repo": "https://oss.sonatype.org/content/repositories/snapshots"
-    },"snmp-core": "mvn:org.onosproject:snmp-core:1.3-20161021.1",
+    "snmp-core": "mvn:org.onosproject:snmp-core:1.3-20161021.1",
     "mibs-net-snmp": "mvn:org.onosproject:mibbler-mibs-net-snmp:1.0-20151221.1",
     "mibs-rfc": "mvn:org.onosproject:mibbler-mibs-rfc:1.0-20151221.1",
     "io.socket-client": "mvn:io.socket:socket.io-client:jar:0.8.3",
diff --git a/lib/pom.xml b/lib/pom.xml
index 506fefd..dbbb80c 100644
--- a/lib/pom.xml
+++ b/lib/pom.xml
@@ -29,7 +29,7 @@
     <groupId>org.onosproject</groupId>
     <artifactId>onos-dependencies</artifactId>
     <packaging>pom</packaging>
-    <version>1.15.0-SNAPSHOT</version>
+    <version>2.0.0-SNAPSHOT</version>
 
     <name>${project.artifactId}</name>
     <description>Open Network Operating System shared dependencies</description>
@@ -40,7 +40,7 @@
 
     <properties>
         <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
-        <onos-build-conf.version>1.15.0-SNAPSHOT</onos-build-conf.version>
+        <onos-build-conf.version>2.0.0-SNAPSHOT</onos-build-conf.version>
         <netty4.version>4.1.8.Final</netty4.version>
         <openflowj.version>3.2.1.onos</openflowj.version>
         <onos-maven-plugin.version>1.12</onos-maven-plugin.version>
@@ -555,72 +555,16 @@
             <artifactId>commons-pool</artifactId>
         </dependency>
 
-<!-- transitive Kryo dependency.
-        <dependency>
-            <groupId>org.objenesis</groupId>
-            <artifactId>objenesis</artifactId>
-        </dependency>
- -->
         <dependency>
             <groupId>com.google.guava</groupId>
             <artifactId>guava</artifactId>
         </dependency>
 
-<!-- Fix buck? everyone depending on netty doesn't sound right.
-        <dependency>
-            <groupId>io.netty</groupId>
-            <artifactId>netty</artifactId>
-        </dependency>
-
-        <dependency>
-            <groupId>io.netty</groupId>
-            <artifactId>netty-buffer</artifactId>
-        </dependency>
-
-        <dependency>
-            <groupId>io.netty</groupId>
-            <artifactId>netty-common</artifactId>
-        </dependency>
- -->
-
         <dependency>
             <groupId>com.eclipsesource.minimal-json</groupId>
             <artifactId>minimal-json</artifactId>
         </dependency>
 
-<!-- Fix buck? Kryo and transitive dependency.
-        <dependency>
-            <groupId>com.esotericsoftware</groupId>
-            <artifactId>kryo</artifactId>
-        </dependency>
-
-        <dependency>
-            <groupId>com.esotericsoftware</groupId>
-            <artifactId>reflectasm</artifactId>
-        </dependency>
-
-        <dependency>
-            <groupId>org.ow2.asm</groupId>
-            <artifactId>asm</artifactId>
-        </dependency>
-
-        <dependency>
-            <groupId>com.esotericsoftware</groupId>
-            <artifactId>minlog</artifactId>
-        </dependency>
- -->
-<!-- Fix buck? everyone depending on metrics doesn't sound right.
-        <dependency>
-            <groupId>io.dropwizard.metrics</groupId>
-            <artifactId>metrics-core</artifactId>
-        </dependency>
-
-        <dependency>
-            <groupId>io.dropwizard.metrics</groupId>
-            <artifactId>metrics-json</artifactId>
-        </dependency>
- -->
-
         <dependency>
             <groupId>org.slf4j</groupId>
             <artifactId>slf4j-api</artifactId>
@@ -671,8 +615,6 @@
             <artifactId>org.apache.karaf.system.core</artifactId>
         </dependency>
 
-        <!-- YANG stuff here? Fix buck?-->
-
         <!-- TEST -->
         <dependency>
             <groupId>junit</groupId>
diff --git a/models/ciena/waveserverai/BUCK b/models/ciena/waveserverai/BUCK
deleted file mode 100644
index 576bb9f..0000000
--- a/models/ciena/waveserverai/BUCK
+++ /dev/null
@@ -1,16 +0,0 @@
-COMPILE_DEPS = [
-    '//lib:CORE_DEPS',
-    '//models/common:onos-models-common',
-]
-
-APPS = [
-    'org.onosproject.models.common',
-]
-
-yang_model(
-    app_name = 'org.onosproject.models.ciena.waveserverai',
-    title = 'Ciena Waveserver Ai YANG Models',
-    custom_registrator = True,
-    deps = COMPILE_DEPS,
-    required_apps = APPS,
-)
diff --git a/models/ciena/waveserverai/src/main/java/org/onosproject/models/ciena/waveserverai/CienaWaveserverAiModelRegistrator.java b/models/ciena/waveserverai/src/main/java/org/onosproject/models/ciena/waveserverai/CienaWaveserverAiModelRegistrator.java
index 257428d..c2745e5 100644
--- a/models/ciena/waveserverai/src/main/java/org/onosproject/models/ciena/waveserverai/CienaWaveserverAiModelRegistrator.java
+++ b/models/ciena/waveserverai/src/main/java/org/onosproject/models/ciena/waveserverai/CienaWaveserverAiModelRegistrator.java
@@ -20,7 +20,7 @@
 import org.onosproject.yang.gen.v1.cienawaveserversystem.rev20180104.CienaWaveserverSystem;
 import org.onosproject.yang.gen.v1.cienawaveserverport.rev20170731.CienaWaveserverPort;
 
-import org.apache.felix.scr.annotations.Component;
+import org.osgi.service.component.annotations.Component;
 import org.onosproject.yang.model.DefaultYangModuleId;
 import org.onosproject.yang.model.YangModuleId;
 import org.onosproject.yang.runtime.AppModuleInfo;
diff --git a/models/common/BUCK b/models/common/BUCK
deleted file mode 100644
index a210b1e..0000000
--- a/models/common/BUCK
+++ /dev/null
@@ -1,7 +0,0 @@
-
-yang_model (
-  app_name = 'org.onosproject.models.common',
-  title = 'Common YANG Models',
-  custom_registrator = True,
-  deps = [ '//lib:CORE_DEPS' ]
-)
diff --git a/models/common/src/main/java/org/onosproject/models/common/YangModelRegistrator.java b/models/common/src/main/java/org/onosproject/models/common/YangModelRegistrator.java
index 8a163a4..fcdc644 100644
--- a/models/common/src/main/java/org/onosproject/models/common/YangModelRegistrator.java
+++ b/models/common/src/main/java/org/onosproject/models/common/YangModelRegistrator.java
@@ -20,7 +20,7 @@
 import org.onosproject.yang.gen.v1.ietfinettypes.rev20130715.IetfInetTypes;
 import org.onosproject.yang.gen.v1.ietfsystem.rev20140806.IetfSystem;
 import org.onosproject.yang.gen.v1.ietfyangtypes.rev20130715.IetfYangTypes;
-import org.apache.felix.scr.annotations.Component;
+import org.osgi.service.component.annotations.Component;
 import org.onosproject.yang.model.DefaultYangModuleId;
 import org.onosproject.yang.model.YangModuleId;
 import org.onosproject.yang.runtime.AppModuleInfo;
diff --git a/models/huawei/BUCK b/models/huawei/BUCK
deleted file mode 100644
index 1d8a1d2..0000000
--- a/models/huawei/BUCK
+++ /dev/null
@@ -1,7 +0,0 @@
-
-yang_model (
-  app_name = 'org.onosproject.models.huawei',
-  title = 'Huawei YANG Models',
-  custom_registrator = True,
-  deps = [ '//lib:CORE_DEPS' ]
-)
diff --git a/models/huawei/src/main/java/org/onosproject/HuaweiModelRegistrator.java b/models/huawei/src/main/java/org/onosproject/HuaweiModelRegistrator.java
index 0532af0..ea5e7cc 100644
--- a/models/huawei/src/main/java/org/onosproject/HuaweiModelRegistrator.java
+++ b/models/huawei/src/main/java/org/onosproject/HuaweiModelRegistrator.java
@@ -17,7 +17,7 @@
 package org.onosproject.models.huawei;
 
 import com.google.common.collect.ImmutableMap;
-import org.apache.felix.scr.annotations.Component;
+import org.osgi.service.component.annotations.Component;
 import org.onosproject.yang.AbstractYangModelRegistrator;
 import org.onosproject.yang.gen.v1.nebgpcomm.rev20141225.NeBgpcomm;
 import org.onosproject.yang.gen.v1.nebgpcommtype.rev20141225.NeBgpcommType;
diff --git a/models/ietf/BUCK b/models/ietf/BUCK
deleted file mode 100644
index 6cc9d15..0000000
--- a/models/ietf/BUCK
+++ /dev/null
@@ -1,7 +0,0 @@
-
-yang_model (
-  app_name = 'org.onosproject.models.ietf',
-  title = 'IETF YANG Models',
-  custom_registrator = False,
-  deps = [ '//lib:CORE_DEPS' ]
-)
diff --git a/models/l3vpn/BUCK b/models/l3vpn/BUCK
deleted file mode 100644
index 7f6d5b8..0000000
--- a/models/l3vpn/BUCK
+++ /dev/null
@@ -1,16 +0,0 @@
-COMPILE_DEPS = [
-    '//lib:CORE_DEPS',
-    '//models/common:onos-models-common',
-]
-
-APPS = [
-    'org.onosproject.models.common',
-]
-
-yang_model(
-    app_name = 'org.onosproject.models.l3vpn',
-    title = 'L3VPN YANG Models',
-    custom_registrator = True,
-    deps = COMPILE_DEPS,
-    required_apps = APPS,
-)
diff --git a/models/l3vpn/src/main/java/org/onosproject/models/l3vpn/L3VpnModelRegistrator.java b/models/l3vpn/src/main/java/org/onosproject/models/l3vpn/L3VpnModelRegistrator.java
index 18cb01c..1c3cd64 100644
--- a/models/l3vpn/src/main/java/org/onosproject/models/l3vpn/L3VpnModelRegistrator.java
+++ b/models/l3vpn/src/main/java/org/onosproject/models/l3vpn/L3VpnModelRegistrator.java
@@ -17,7 +17,7 @@
 package org.onosproject.models.l3vpn;
 
 import com.google.common.collect.ImmutableMap;
-import org.apache.felix.scr.annotations.Component;
+import org.osgi.service.component.annotations.Component;
 import org.onosproject.yang.AbstractYangModelRegistrator;
 import org.onosproject.yang.gen.v1.ietfbgpl3vpn.rev20160909.IetfBgpL3Vpn;
 import org.onosproject.yang.gen.v1.ietfinterfaces.rev20140508.IetfInterfaces;
diff --git a/models/microsemi/BUCK b/models/microsemi/BUCK
deleted file mode 100644
index 3ab6536..0000000
--- a/models/microsemi/BUCK
+++ /dev/null
@@ -1,16 +0,0 @@
-COMPILE_DEPS = [
-    '//lib:CORE_DEPS',
-    '//models/common:onos-models-common',
-]
-
-APPS = [
-    'org.onosproject.models.common',
-]
-
-yang_model(
-    app_name = 'org.onosproject.models.microsemi',
-    title = 'Microsemi YANG Models',
-    custom_registrator = True,
-    deps = COMPILE_DEPS,
-    required_apps = APPS,
-)
diff --git a/models/microsemi/src/main/java/org/onosproject/models/microsemi/MicrosemiModelRegistrator.java b/models/microsemi/src/main/java/org/onosproject/models/microsemi/MicrosemiModelRegistrator.java
index 3c6a6c6..bb1b7de 100644
--- a/models/microsemi/src/main/java/org/onosproject/models/microsemi/MicrosemiModelRegistrator.java
+++ b/models/microsemi/src/main/java/org/onosproject/models/microsemi/MicrosemiModelRegistrator.java
@@ -18,7 +18,7 @@
 import com.google.common.collect.ImmutableMap;
 import org.onosproject.yang.AbstractYangModelRegistrator;
 import org.onosproject.yang.gen.v1.ietfsystemmicrosemi.rev20160505.IetfSystemMicrosemi;
-import org.apache.felix.scr.annotations.Component;
+import org.osgi.service.component.annotations.Component;
 import org.onosproject.yang.gen.v1.mseacfm.rev20160229.MseaCfm;
 import org.onosproject.yang.gen.v1.mseasoampm.rev20160229.MseaSoamPm;
 import org.onosproject.yang.gen.v1.mseasoamfm.rev20160229.MseaSoamFm;
diff --git a/models/openconfig-infinera/BUCK b/models/openconfig-infinera/BUCK
deleted file mode 100644
index 69363e2..0000000
--- a/models/openconfig-infinera/BUCK
+++ /dev/null
@@ -1,16 +0,0 @@
-COMPILE_DEPS = [
-    '//lib:CORE_DEPS',
-    '//models/ietf:onos-models-ietf',
-]
-
-APPS = [
-    'org.onosproject.models.ietf',
-]
-
-yang_model(
-  app_name = 'org.onosproject.models.openconfig-infinera',
-  title = 'OpenConfig Infinera XT3300 YANG Models',
-  custom_registrator = False,
-  deps = COMPILE_DEPS,
-  required_apps = APPS,
-)
diff --git a/models/openconfig/BUCK b/models/openconfig/BUCK
deleted file mode 100644
index 5905528..0000000
--- a/models/openconfig/BUCK
+++ /dev/null
@@ -1,16 +0,0 @@
-COMPILE_DEPS = [
-    '//lib:CORE_DEPS',
-    '//models/ietf:onos-models-ietf',
-]
-
-APPS = [
-    'org.onosproject.models.ietf',
-]
-
-yang_model(
-  app_name = 'org.onosproject.models.openconfig',
-  title = 'OpenConfig YANG Models',
-  custom_registrator = True,
-  deps = COMPILE_DEPS,
-  required_apps = APPS,
-)
diff --git a/models/openconfig/src/main/java/org/onosproject/models/openconfig/OpenConfigModelRegistrator.java b/models/openconfig/src/main/java/org/onosproject/models/openconfig/OpenConfigModelRegistrator.java
index d3e985a..9992586 100644
--- a/models/openconfig/src/main/java/org/onosproject/models/openconfig/OpenConfigModelRegistrator.java
+++ b/models/openconfig/src/main/java/org/onosproject/models/openconfig/OpenConfigModelRegistrator.java
@@ -18,7 +18,7 @@
 import static org.slf4j.LoggerFactory.getLogger;
 
 import java.util.Map;
-import org.apache.felix.scr.annotations.Component;
+import org.osgi.service.component.annotations.Component;
 import org.onosproject.yang.AbstractYangModelRegistrator;
 import org.onosproject.yang.gen.v1.ianaiftype.rev20170330.IanaIfType;
 import org.onosproject.yang.gen.v1.ietfinettypes.rev20130715.IetfInetTypes;
diff --git a/models/openroadm/BUCK b/models/openroadm/BUCK
deleted file mode 100644
index 8a1352c..0000000
--- a/models/openroadm/BUCK
+++ /dev/null
@@ -1,5 +0,0 @@
-
-yang_model(
-  app_name = 'org.onosproject.models.openroadm',
-  title = 'Open ROADM YANG Models',
-)
\ No newline at end of file
diff --git a/models/polatis/BUCK b/models/polatis/BUCK
deleted file mode 100644
index 463f600..0000000
--- a/models/polatis/BUCK
+++ /dev/null
@@ -1,14 +0,0 @@
-COMPILE_DEPS = [
-    '//models/common:onos-models-common',
-]
-
-APPS = [
-    'org.onosproject.models.common',
-]
-
-yang_model (
-  app_name = 'org.onosproject.models.polatis',
-  title = 'Polatis YANG Model',
-  deps = COMPILE_DEPS,
-  required_apps = APPS,
-)
diff --git a/models/tapi/BUCK b/models/tapi/BUCK
deleted file mode 100644
index 5276435..0000000
--- a/models/tapi/BUCK
+++ /dev/null
@@ -1,10 +0,0 @@
-COMPILE_DEPS = [
-    '//lib:CORE_DEPS',
-]
-
-yang_model(
-  app_name = 'org.onosproject.models.tapi',
-  title = 'ONF Transport API YANG Models',
-  custom_registrator = True,
-  deps = COMPILE_DEPS,
-)
diff --git a/models/tapi/src/main/java/org/onosproject/models/tapi/TapiModelRegistrator.java b/models/tapi/src/main/java/org/onosproject/models/tapi/TapiModelRegistrator.java
index b5ec202..15fb319 100644
--- a/models/tapi/src/main/java/org/onosproject/models/tapi/TapiModelRegistrator.java
+++ b/models/tapi/src/main/java/org/onosproject/models/tapi/TapiModelRegistrator.java
@@ -20,7 +20,7 @@
 package org.onosproject.models.tapi;
 
 import com.google.common.collect.ImmutableMap;
-import org.apache.felix.scr.annotations.Component;
+import org.osgi.service.component.annotations.Component;
 import org.onosproject.yang.AbstractYangModelRegistrator;
 import org.onosproject.yang.gen.v1.tapicommon.rev20181016.TapiCommon;
 import org.onosproject.yang.gen.v1.tapiconnectivity.rev20181016.TapiConnectivity;
diff --git a/modules.bzl b/modules.bzl
deleted file mode 100644
index c1b22eb..0000000
--- a/modules.bzl
+++ /dev/null
@@ -1,318 +0,0 @@
-UTILS = [
-    "//utils/osgiwrap:osgi-jar",
-    "//utils/osgi:onlab-osgi",
-    "//utils/junit:onlab-junit",
-    "//utils/misc:onlab-misc",
-    "//utils/rest:onlab-rest",
-]
-
-API = [
-    "//core/api:onos-api",
-    "//incubator/api:onos-incubator-api",
-]
-
-CORE = UTILS + API + [
-    "//core/net:onos-core-net",
-    "//core/common:onos-core-common",
-    "//core/store/primitives:onos-core-primitives",
-    "//core/store/serializers:onos-core-serializers",
-    "//core/store/dist:onos-core-dist",
-    "//core/security:onos-security",
-    "//core/store/persistence:onos-core-persistence",
-    "//incubator/net:onos-incubator-net",
-    "//incubator/store:onos-incubator-store",
-    "//incubator/rpc:onos-incubator-rpc",
-    "//cli:onos-cli",
-    "//protocols/rest/api:onos-protocols-rest-api",
-    "//protocols/rest/ctl:onos-protocols-rest-ctl",
-    "//protocols/bgp/bgpio:onos-protocols-bgp-bgpio",
-    "//protocols/bgp/api:onos-protocols-bgp-api",
-    "//protocols/bgp/ctl:onos-protocols-bgp-ctl",
-    "//protocols/netconf/api:onos-protocols-netconf-api",
-    "//protocols/netconf/ctl:onos-protocols-netconf-ctl",
-    "//protocols/openflow/api:onos-protocols-openflow-api",
-    "//protocols/openflow/ctl:onos-protocols-openflow-ctl",
-    "//protocols/ospf/api:onos-protocols-ospf-api",
-    "//protocols/ospf/protocol:onos-protocols-ospf-protocol",
-    "//protocols/ospf/ctl:onos-protocols-ospf-ctl",
-    "//protocols/ovsdb/rfc:onos-protocols-ovsdb-rfc",
-    "//protocols/ovsdb/api:onos-protocols-ovsdb-api",
-    "//protocols/ovsdb/ctl:onos-protocols-ovsdb-ctl",
-    "//protocols/p4runtime/api:onos-protocols-p4runtime-api",
-    "//protocols/p4runtime/model:onos-protocols-p4runtime-model",
-    "//protocols/pcep/pcepio:onos-protocols-pcep-pcepio",
-    "//protocols/pcep/server/api:onos-protocols-pcep-server-api",
-    "//protocols/pcep/server/ctl:onos-protocols-pcep-server-ctl",
-    "//protocols/snmp/api:onos-protocols-snmp-api",
-    "//protocols/snmp/ctl:onos-protocols-snmp-ctl",
-    "//protocols/isis/api:onos-protocols-isis-api",
-    "//protocols/isis/ctl:onos-protocols-isis-ctl",
-    "//protocols/isis/isisio:onos-protocols-isis-isisio",
-    "//protocols/lisp/api:onos-protocols-lisp-api",
-    "//protocols/lisp/ctl:onos-protocols-lisp-ctl",
-    "//protocols/lisp/msg:onos-protocols-lisp-msg",
-    "//protocols/tl1/api:onos-protocols-tl1-api",
-    "//protocols/tl1/ctl:onos-protocols-tl1-ctl",
-    "//protocols/restconf/client/api:onos-protocols-restconf-client-api",
-    "//protocols/restconf/client/ctl:onos-protocols-restconf-client-ctl",
-    "//protocols/xmpp/core/api:onos-protocols-xmpp-core-api",
-    "//protocols/xmpp/core/ctl:onos-protocols-xmpp-core-ctl",
-    "//drivers/utilities:onos-drivers-utilities",
-    "//providers/netconf/device:onos-providers-netconf-device",
-    "//providers/openflow/device:onos-providers-openflow-device",
-    "//providers/openflow/packet:onos-providers-openflow-packet",
-    "//providers/openflow/flow:onos-providers-openflow-flow",
-    "//providers/openflow/group:onos-providers-openflow-group",
-    "//providers/openflow/meter:onos-providers-openflow-meter",
-    "//providers/ovsdb/device:onos-providers-ovsdb-device",
-    "//providers/ovsdb/tunnel:onos-providers-ovsdb-tunnel",
-    "//providers/rest/device:onos-providers-rest-device",
-    "//providers/snmp/device:onos-providers-snmp-device",
-    "//providers/isis/cfg:onos-providers-isis-cfg",
-    "//providers/isis/topology:onos-providers-isis-topology",
-    "//providers/lisp/device:onos-providers-lisp-device",
-    "//providers/tl1/device:onos-providers-tl1-device",
-    "//providers/general/device:onos-providers-general-device",
-    "//providers/p4runtime/packet:onos-providers-p4runtime-packet",
-    "//web/api:onos-rest",
-    "//web/gui2:onos-gui2",
-    "//web/gui:onos-gui",
-    # "//incubator/protobuf/models:onos-incubator-protobuf-models",
-    # "//incubator/protobuf/services/nb:onos-incubator-protobuf-services-nb",
-]
-
-ONOS_DRIVERS = [
-    # Drivers
-    "//drivers/default:onos-drivers-default-oar",
-    "//drivers/arista:onos-drivers-arista-oar",
-    "//drivers/ciena/waveserver:onos-drivers-ciena-waveserver-oar",
-    "//drivers/ciena/c5162:onos-drivers-ciena-c5162-oar",
-    "//drivers/ciena/c5170:onos-drivers-ciena-c5170-oar",
-    "//drivers/ciena/waveserverai:onos-drivers-ciena-waveserverai-oar",
-    "//drivers/cisco/netconf:onos-drivers-cisco-netconf-oar",
-    "//drivers/cisco/rest:onos-drivers-cisco-rest-oar",
-    "//drivers/corsa:onos-drivers-corsa-oar",
-    "//drivers/fujitsu:onos-drivers-fujitsu-oar",
-    "//drivers/lumentum:onos-drivers-lumentum-oar",
-    "//drivers/netconf:onos-drivers-netconf-oar",
-    "//drivers/server:onos-drivers-server-oar",
-    "//drivers/optical:onos-drivers-optical-oar",
-    "//drivers/ovsdb:onos-drivers-ovsdb-oar",
-    "//drivers/juniper:onos-drivers-juniper-oar",
-    "//drivers/lisp:onos-drivers-lisp-oar",
-    "//drivers/flowspec:onos-drivers-flowspec-oar",
-    "//drivers/huawei:onos-drivers-huawei-oar",
-    "//drivers/microsemi/ea1000:onos-drivers-microsemi-ea1000-oar",
-    "//drivers/oplink:onos-drivers-oplink-oar",
-    "//drivers/bmv2:onos-drivers-bmv2-oar",
-    "//drivers/barefoot:onos-drivers-barefoot-oar",
-    "//drivers/mellanox:onos-drivers-mellanox-oar",
-    "//drivers/hp:onos-drivers-hp-oar",
-    "//drivers/p4runtime:onos-drivers-p4runtime-oar",
-    "//drivers/gnmi:onos-drivers-gnmi-oar",
-    "//drivers/polatis/netconf:onos-drivers-polatis-netconf-oar",
-    "//drivers/polatis/openflow:onos-drivers-polatis-openflow-oar",
-    "//drivers/odtn-driver:onos-drivers-odtn-driver-oar",
-]
-
-ONOS_PROVIDERS = [
-    # Providers
-    "//providers/bgp:onos-providers-bgp-oar",
-    "//providers/bgpcep:onos-providers-bgpcep-oar",
-    "//providers/host:onos-providers-host-oar",
-    "//providers/hostprobing:onos-providers-hostprobing-oar",
-    "//providers/lldp:onos-providers-lldp-oar",
-    "//providers/netcfghost:onos-providers-netcfghost-oar",
-    "//providers/netcfglinks:onos-providers-netcfglinks-oar",
-    "//providers/netconf:onos-providers-netconf-oar",
-    "//providers/openflow/message:onos-providers-openflow-message-oar",
-    "//providers/ovsdb:onos-providers-ovsdb-oar",
-    "//providers/ovsdb/host:onos-providers-ovsdb-host-oar",
-    "//providers/ovsdb/base:onos-providers-ovsdb-base-oar",
-    "//providers/pcep:onos-providers-pcep-oar",
-    "//providers/null:onos-providers-null-oar",
-    "//providers/openflow/base:onos-providers-openflow-base-oar",
-    "//providers/openflow/app:onos-providers-openflow-app-oar",
-    "//providers/rest:onos-providers-rest-oar",
-    "//providers/isis:onos-providers-isis-oar",
-    "//providers/snmp:onos-providers-snmp-oar",
-    "//providers/link:onos-providers-link-oar",
-    "//providers/lisp:onos-providers-lisp-oar",
-    "//providers/tl1:onos-providers-tl1-oar",
-    "//providers/general:onos-providers-general-oar",
-    "//providers/p4runtime:onos-providers-p4runtime-oar",
-    # "//providers/ietfte:onos-providers-ietfte-oar",
-    "//providers/xmpp/device:onos-providers-xmpp-device-oar",
-]
-
-ONOS_APPS = [
-    # Apps
-    "//apps/dhcp:onos-apps-dhcp-oar",
-    "//apps/dhcprelay:onos-apps-dhcprelay-oar",
-    "//apps/fwd:onos-apps-fwd-oar",
-    "//apps/packet-stats:onos-apps-packet-stats-oar",
-    "//apps/acl:onos-apps-acl-oar",
-    "//apps/bgprouter:onos-apps-bgprouter-oar",
-    "//apps/cip:onos-apps-cip-oar",
-    "//apps/drivermatrix:onos-apps-drivermatrix-oar",
-    "//apps/events:onos-apps-events-oar",
-    "//apps/proxyarp:onos-apps-proxyarp-oar",
-    "//apps/segmentrouting:onos-apps-segmentrouting-oar",
-    "//apps/gangliametrics:onos-apps-gangliametrics-oar",
-    "//apps/graphitemetrics:onos-apps-graphitemetrics-oar",
-    "//apps/flowanalyzer:onos-apps-flowanalyzer-oar",
-    "//apps/intentsync:onos-apps-intentsync-oar",
-    "//apps/influxdbmetrics:onos-apps-influxdbmetrics-oar",
-    "//apps/metrics:onos-apps-metrics-oar",
-    "//apps/mfwd:onos-apps-mfwd-oar",
-    "//apps/mlb:onos-apps-mlb-oar",
-    "//apps/mobility:onos-apps-mobility-oar",
-    "//apps/newoptical:onos-apps-newoptical-oar",
-    "//apps/optical-model:onos-apps-optical-model-oar",
-    "//apps/optical-rest:onos-apps-optical-rest-oar",
-    "//apps/pathpainter:onos-apps-pathpainter-oar",
-    "//apps/pcep-api:onos-apps-pcep-api-oar",
-    "//apps/pim:onos-apps-pim-oar",
-    "//apps/linkprops:onos-apps-linkprops-oar",
-    "//apps/reactive-routing:onos-apps-reactive-routing-oar",
-    "//apps/roadm:onos-apps-roadm-oar",
-    "//apps/sdnip:onos-apps-sdnip-oar",
-    "//apps/test/cluster-ha:onos-apps-test-cluster-ha-oar",
-    "//apps/test/demo:onos-apps-test-demo-oar",
-    "//apps/test/distributed-primitives:onos-apps-test-distributed-primitives-oar",
-    "//apps/test/election:onos-apps-test-election-oar",
-    "//apps/test/flow-perf:onos-apps-test-flow-perf-oar",
-    "//apps/test/intent-perf:onos-apps-test-intent-perf-oar",
-    "//apps/test/route-scale:onos-apps-test-route-scale-oar",
-    "//apps/test/loadtest:onos-apps-test-loadtest-oar",
-    "//apps/test/netcfg-monitor:onos-apps-test-netcfg-monitor-oar",
-    "//apps/test/messaging-perf:onos-apps-test-messaging-perf-oar",
-    "//apps/test/primitive-perf:onos-apps-test-primitive-perf-oar",
-    "//apps/test/transaction-perf:onos-apps-test-transaction-perf-oar",
-    "//apps/virtualbng:onos-apps-virtualbng-oar",
-    "//apps/vpls:onos-apps-vpls-oar",
-    "//apps/vrouter:onos-apps-vrouter-oar",
-    "//apps/routing/fibinstaller:onos-apps-routing-fibinstaller-oar",
-    "//apps/routing/cpr:onos-apps-routing-cpr-oar",
-    "//apps/routing/fpm:onos-apps-routing-fpm-oar",
-    "//apps/vtn:onos-apps-vtn-oar",
-    "//apps/faultmanagement:onos-apps-faultmanagement-oar",
-    "//apps/openstacknode:onos-apps-openstacknode-oar",
-    "//apps/openstacknetworking:onos-apps-openstacknetworking-oar",
-    "//apps/openstacknetworkingui:onos-apps-openstacknetworkingui-oar",
-    "//apps/openstacktelemetry:onos-apps-openstacktelemetry-oar",
-    "//apps/openstacktroubleshoot:onos-apps-openstacktroubleshoot-oar",
-    "//apps/openstackvtap:onos-apps-openstackvtap-oar",
-    "//apps/cpman/app:onos-apps-cpman-app-oar",
-    "//apps/scalablegateway:onos-apps-scalablegateway-oar",
-    "//apps/castor:onos-apps-castor-oar",
-    # "//apps/yms:onos-apps-yms-oar",
-    "//apps/ofagent:onos-apps-ofagent-oar",
-    "//apps/mappingmanagement:onos-apps-mappingmanagement-oar",
-    "//apps/config:onos-apps-config-oar",
-    "//apps/configsync:onos-apps-configsync-oar",
-    "//apps/configsync-netconf:onos-apps-configsync-netconf-oar",
-    "//apps/netconf/client:onos-apps-netconf-client-oar",
-    "//apps/tetopology:onos-apps-tetopology-oar",
-    "//apps/tetunnel:onos-apps-tetunnel-oar",
-    # "//apps/tenbi/yangmodel:onos-apps-tenbi-yangmodel-feature",
-    # "//apps/tenbi:onos-apps-tenbi-oar",
-    "//protocols/restconf/server:onos-protocols-restconf-server-oar",
-    "//apps/restconf:onos-apps-restconf-oar",
-    "//apps/flowspec-api:onos-apps-flowspec-api-oar",
-    "//apps/yang:onos-apps-yang-oar",
-    "//apps/yang-gui:onos-apps-yang-gui-oar",
-    "//apps/cord-support:onos-apps-cord-support-oar",
-    "//apps/network-troubleshoot:onos-apps-network-troubleshoot-oar",
-    "//apps/l3vpn:onos-apps-l3vpn-oar",
-    "//apps/openroadm:onos-apps-openroadm-oar",
-    "//apps/artemis:onos-apps-artemis-oar",
-    "//apps/pi-demo/ecmp:onos-apps-pi-demo-ecmp-oar",
-    "//apps/gluon:onos-apps-gluon-oar",
-    "//apps/evpnopenflow:onos-apps-evpnopenflow-oar",
-    "//apps/route-service:onos-apps-route-service-oar",
-    "//apps/evpn-route-service:onos-apps-evpn-route-service-oar",
-    # "//incubator/protobuf/registry:onos-incubator-protobuf-registry-oar",
-    # "//incubator/protobuf/services/nb:onos-incubator-protobuf-services-nb-oar",
-    "//apps/p4-tutorial/pipeconf:onos-apps-p4-tutorial-pipeconf-oar",
-    "//apps/p4-tutorial/mytunnel:onos-apps-p4-tutorial-mytunnel-oar",
-    "//apps/cfm:onos-apps-cfm-oar",
-    "//apps/routeradvertisement:onos-apps-routeradvertisement-oar",
-    "//apps/powermanagement:onos-apps-powermanagement-oar",
-    "//apps/t3:onos-apps-t3-oar",
-    "//apps/simplefabric:onos-apps-simplefabric-oar",
-    # "//apps/kafka-integration:onos-apps-kafka-integration-oar",
-    "//apps/rabbitmq:onos-apps-rabbitmq-oar",
-    "//apps/odtn/api:onos-apps-odtn-api-oar",
-    "//apps/odtn/service:onos-apps-odtn-service-oar",
-    "//apps/mcast:onos-apps-mcast-oar",
-    "//apps/layout:onos-apps-layout-oar",
-    "//apps/imr:onos-apps-imr-oar",
-    "//apps/nodemetrics:onos-apps-nodemetrics-oar",
-    "//apps/inbandtelemetry:onos-apps-inbandtelemetry-oar",
-    # "//web/gui2:onos-web-gui2-oar",
-    "//apps/workflow:onos-apps-workflow-oar",
-]
-
-PROTOCOL_APPS = [
-    "//protocols/grpc:onos-protocols-grpc-oar",
-    "//protocols/p4runtime:onos-protocols-p4runtime-oar",
-    "//protocols/gnmi:onos-protocols-gnmi-oar",
-    "//protocols/xmpp/core:onos-protocols-xmpp-core-oar",
-    "//protocols/xmpp/pubsub:onos-protocols-xmpp-pubsub-oar",
-]
-
-MODELS = [
-    "//models/ietf:onos-models-ietf-oar",
-    "//models/common:onos-models-common-oar",
-    "//models/huawei:onos-models-huawei-oar",
-    "//models/openconfig:onos-models-openconfig-oar",
-    "//models/openconfig-infinera:onos-models-openconfig-infinera-oar",
-    "//models/openroadm:onos-models-openroadm-oar",
-    "//models/tapi:onos-models-tapi-oar",
-    "//models/l3vpn:onos-models-l3vpn-oar",
-    "//models/microsemi:onos-models-microsemi-oar",
-    "//models/polatis:onos-models-polatis-oar",
-    "//models/ciena/waveserverai:onos-models-ciena-waveserverai-oar",
-]
-
-PIPELINES = [
-    "//pipelines/basic:onos-pipelines-basic-oar",
-    "//pipelines/fabric:onos-pipelines-fabric-oar",
-]
-
-APP_JARS = [
-    "//apps/cpman/api:onos-apps-cpman-api",
-    "//apps/routing-api:onos-apps-routing-api",
-    "//apps/dhcp/api:onos-apps-dhcp-api",
-    "//apps/dhcp/app:onos-apps-dhcp-app",
-    "//apps/imr/api:onos-apps-imr-api",
-    "//apps/imr/app:onos-apps-imr-app",
-    "//apps/dhcprelay/app:onos-apps-dhcprelay-app",
-    "//apps/dhcprelay/web:onos-apps-dhcprelay-web",
-    "//apps/fwd:onos-apps-fwd",
-    "//apps/iptopology-api:onos-apps-iptopology-api",
-    "//apps/routing/common:onos-apps-routing-common",
-    "//apps/vtn/vtnrsc:onos-apps-vtn-vtnrsc",
-    "//apps/vtn/sfcmgr:onos-apps-vtn-sfcmgr",
-    "//apps/vtn/vtnmgr:onos-apps-vtn-vtnmgr",
-    "//apps/vtn/vtnweb:onos-apps-vtn-vtnweb",
-    "//apps/kafka-integration/api:onos-apps-kafka-integration-api",
-    # "//apps/kafka-integration/app:onos-apps-kafka-integration-app",
-]
-
-FEATURES = [
-    "//tools/package/features:onos-thirdparty-base",
-    "//tools/package/features:onos-thirdparty-web",
-    "//tools/package/features:onos-api",
-    "//tools/package/features:onos-core",
-    "//tools/package/features:onos-incubator",
-    "//tools/package/features:onos-cli",
-    "//tools/package/features:onos-rest",
-    "//tools/package/features:onos-gui",
-    "//tools/package/features:onos-gui2",
-    "//tools/package/features:onos-security",
-]
-
-APPS = ONOS_DRIVERS + ONOS_PROVIDERS + ONOS_APPS + MODELS + PIPELINES + \
-       PROTOCOL_APPS + APP_JARS
diff --git a/onos.defs b/onos.defs
deleted file mode 100644
index 502b4ad..0000000
--- a/onos.defs
+++ /dev/null
@@ -1,8 +0,0 @@
-ONOS_ORIGIN = 'ONOS Community'
-ONOS_GROUP_ID = 'org.onosproject'
-ONOS_VERSION = '1.15.0-SNAPSHOT'
-DEFAULT_APP_CATEGORY = 'Utility'
-ONOS_ARTIFACT_BASE = 'onos-'
-APP_PREFIX = ONOS_GROUP_ID + '.'
-
-include_defs('//modules.defs')
diff --git a/pipelines/basic/BUCK b/pipelines/basic/BUCK
deleted file mode 100644
index 26e74dd..0000000
--- a/pipelines/basic/BUCK
+++ /dev/null
@@ -1,30 +0,0 @@
-COMPILE_DEPS = [
-    '//lib:CORE_DEPS',
-    '//lib:minimal-json',
-    '//drivers/default:onos-drivers-default',
-    '//protocols/p4runtime/model:onos-protocols-p4runtime-model',
-    '//protocols/p4runtime/api:onos-protocols-p4runtime-api',
-    '//apps/inbandtelemetry/api:onos-apps-inbandtelemetry-api',
-]
-
-BUNDLES = [
-    '//pipelines/basic:onos-pipelines-basic',
-    '//apps/inbandtelemetry/api:onos-apps-inbandtelemetry-api',
-]
-
-osgi_jar(
-    deps = COMPILE_DEPS,
-)
-
-onos_app(
-    app_name = 'org.onosproject.pipelines.basic',
-    title = 'Basic Pipelines',
-    category = 'Pipeline',
-    url = 'http://onosproject.org',
-    description = 'Provides pipelines with basic L2/L3 forwarding capabilities and packet-in/out '
-                  + 'support.',
-    included_bundles = BUNDLES,
-    required_apps = [
-        'org.onosproject.drivers.p4runtime',
-    ]
-)
diff --git a/pipelines/basic/src/main/java/org/onosproject/pipelines/basic/IntProgrammableImpl.java b/pipelines/basic/src/main/java/org/onosproject/pipelines/basic/IntProgrammableImpl.java
index 5ed475a..284e7b8 100644
--- a/pipelines/basic/src/main/java/org/onosproject/pipelines/basic/IntProgrammableImpl.java
+++ b/pipelines/basic/src/main/java/org/onosproject/pipelines/basic/IntProgrammableImpl.java
@@ -17,8 +17,8 @@
 
 import com.google.common.collect.ImmutableBiMap;
 import com.google.common.collect.Sets;
-import org.apache.felix.scr.annotations.Reference;
-import org.apache.felix.scr.annotations.ReferenceCardinality;
+import org.osgi.service.component.annotations.Reference;
+import org.osgi.service.component.annotations.ReferenceCardinality;
 import org.onlab.util.ImmutableByteSequence;
 import org.onosproject.core.ApplicationId;
 import org.onosproject.core.CoreService;
@@ -82,10 +82,10 @@
             IntConstants.TBL_INT_SOURCE_ID,
             IntConstants.TBL_GENERATE_REPORT_ID);
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     private FlowRuleService flowRuleService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     private CoreService coreService;
 
     private DeviceId deviceId;
diff --git a/pipelines/basic/src/main/java/org/onosproject/pipelines/basic/PipeconfLoader.java b/pipelines/basic/src/main/java/org/onosproject/pipelines/basic/PipeconfLoader.java
index 0fbc3a9..90b5925 100644
--- a/pipelines/basic/src/main/java/org/onosproject/pipelines/basic/PipeconfLoader.java
+++ b/pipelines/basic/src/main/java/org/onosproject/pipelines/basic/PipeconfLoader.java
@@ -17,11 +17,11 @@
 package org.onosproject.pipelines.basic;
 
 import com.google.common.collect.ImmutableList;
-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.onosproject.core.CoreService;
 import org.onosproject.driver.pipeline.DefaultSingleTablePipeline;
 import org.onosproject.inbandtelemetry.api.IntProgrammable;
@@ -63,10 +63,10 @@
 
     private static final Collection<PiPipeconf> ALL_PIPECONFS = ImmutableList.of(BASIC_PIPECONF, INT_PIPECONF);
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     private PiPipeconfService piPipeconfService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     private CoreService coreService;
 
     @Activate
diff --git a/pipelines/fabric/BUCK b/pipelines/fabric/BUCK
deleted file mode 100644
index 5491289..0000000
--- a/pipelines/fabric/BUCK
+++ /dev/null
@@ -1,37 +0,0 @@
-COMPILE_DEPS = [
-    '//lib:CORE_DEPS',
-    '//lib:KRYO',
-    '//protocols/p4runtime/model:onos-protocols-p4runtime-model',
-    '//protocols/p4runtime/api:onos-protocols-p4runtime-api',
-    '//pipelines/basic:onos-pipelines-basic',
-    '//core/store/serializers:onos-core-serializers',
-    '//apps/inbandtelemetry/api:onos-apps-inbandtelemetry-api',
-    '//providers/general/device:onos-providers-general-device',
-]
-
-TEST_DEPS = [
-    '//lib:TEST_ADAPTERS',
-]
-
-BUNDLES = [
-    '//pipelines/fabric:onos-pipelines-fabric',
-    '//apps/inbandtelemetry/api:onos-apps-inbandtelemetry-api',
-]
-
-osgi_jar_with_tests (
-    deps = COMPILE_DEPS,
-    test_deps = TEST_DEPS,
-)
-
-onos_app(
-    app_name = 'org.onosproject.pipelines.fabric',
-    title = 'Fabric Pipeline',
-    category = 'Pipeline',
-    url = 'http://onosproject.org',
-    description = 'Provides pipelines with CORD fabric underlay support.',
-    included_bundles = BUNDLES,
-    required_apps = [
-        'org.onosproject.drivers.p4runtime',
-        'org.onosproject.pipelines.basic',
-    ]
-)
diff --git a/pipelines/fabric/src/main/java/org/onosproject/pipelines/fabric/IntProgrammableImpl.java b/pipelines/fabric/src/main/java/org/onosproject/pipelines/fabric/IntProgrammableImpl.java
index 15e3f01..dec6332 100644
--- a/pipelines/fabric/src/main/java/org/onosproject/pipelines/fabric/IntProgrammableImpl.java
+++ b/pipelines/fabric/src/main/java/org/onosproject/pipelines/fabric/IntProgrammableImpl.java
@@ -16,6 +16,9 @@
 package org.onosproject.pipelines.fabric;
 
 import com.google.common.collect.Sets;
+import org.osgi.service.component.annotations.Reference;
+import org.osgi.service.component.annotations.ReferenceCardinality;
+
 import org.onosproject.core.ApplicationId;
 import org.onosproject.core.CoreService;
 import org.onosproject.inbandtelemetry.api.IntConfig;
@@ -80,7 +83,9 @@
             FabricConstants.FABRIC_EGRESS_PROCESS_INT_MAIN_PROCESS_INT_REPORT_TB_GENERATE_REPORT
     );
 
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     private FlowRuleService flowRuleService;
+
     private CoreService coreService;
     private NetworkConfigService cfgService;
     private DeviceId deviceId;
diff --git a/pipelines/fabric/src/main/java/org/onosproject/pipelines/fabric/PipeconfLoader.java b/pipelines/fabric/src/main/java/org/onosproject/pipelines/fabric/PipeconfLoader.java
index 1609794..48ec2ab 100644
--- a/pipelines/fabric/src/main/java/org/onosproject/pipelines/fabric/PipeconfLoader.java
+++ b/pipelines/fabric/src/main/java/org/onosproject/pipelines/fabric/PipeconfLoader.java
@@ -16,11 +16,11 @@
 
 package org.onosproject.pipelines.fabric;
 
-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.onosproject.core.CoreService;
 import org.onosproject.inbandtelemetry.api.IntProgrammable;
 import org.onosproject.net.behaviour.Pipeliner;
@@ -84,10 +84,10 @@
 
     private static final Collection<PiPipeconf> PIPECONFS = buildAllPipeconf();
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     private PiPipeconfService piPipeconfService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     private CoreService coreService;
 
     @Activate
diff --git a/protocols/bgp/api/BUCK b/protocols/bgp/api/BUCK
deleted file mode 100644
index 37d94b0..0000000
--- a/protocols/bgp/api/BUCK
+++ /dev/null
@@ -1,10 +0,0 @@
-COMPILE_DEPS = [
-    '//lib:CORE_DEPS',
-    '//protocols/bgp/bgpio:onos-protocols-bgp-bgpio',
-    '//core/api:onos-api',
-    '//lib:io_netty_netty',
-]
-
-osgi_jar_with_tests (
-    deps = COMPILE_DEPS,
-)
diff --git a/protocols/bgp/bgpio/BUCK b/protocols/bgp/bgpio/BUCK
deleted file mode 100644
index 32d5f4d..0000000
--- a/protocols/bgp/bgpio/BUCK
+++ /dev/null
@@ -1,11 +0,0 @@
-COMPILE_DEPS = [
-    '//lib:CORE_DEPS',
-    '//lib:COMPILE',
-    '//lib:NETTY',
-    '//core/api:onos-api',
-    '//lib:io_netty_netty',
-]
-
-osgi_jar_with_tests (
-    deps = COMPILE_DEPS,
-)
diff --git a/protocols/bgp/ctl/BUCK b/protocols/bgp/ctl/BUCK
deleted file mode 100644
index 3568c2e..0000000
--- a/protocols/bgp/ctl/BUCK
+++ /dev/null
@@ -1,17 +0,0 @@
-COMPILE_DEPS = [
-    '//lib:CORE_DEPS',
-    '//lib:jersey-client',
-    '//lib:httpclient-osgi',
-    '//lib:httpcore-osgi',
-    '//lib:javax.ws.rs-api',
-    '//protocols/bgp/api:onos-protocols-bgp-api',
-    '//protocols/bgp/bgpio:onos-protocols-bgp-bgpio',
-    '//lib:io_netty_netty_common',
-    '//lib:io_netty_netty',
-    '//lib:org.osgi.compendium',
-    '//lib:org.apache.felix.scr.annotations',
-]
-
-osgi_jar_with_tests (
-    deps = COMPILE_DEPS,
-)
diff --git a/protocols/bgp/ctl/src/main/java/org/onosproject/bgp/controller/impl/BgpControllerImpl.java b/protocols/bgp/ctl/src/main/java/org/onosproject/bgp/controller/impl/BgpControllerImpl.java
index 92ca7a4..804fb80 100644
--- a/protocols/bgp/ctl/src/main/java/org/onosproject/bgp/controller/impl/BgpControllerImpl.java
+++ b/protocols/bgp/ctl/src/main/java/org/onosproject/bgp/controller/impl/BgpControllerImpl.java
@@ -16,10 +16,6 @@
 
 package org.onosproject.bgp.controller.impl;
 
-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.onosproject.bgp.controller.BgpCfg;
 import org.onosproject.bgp.controller.BgpController;
 import org.onosproject.bgp.controller.BgpId;
@@ -35,22 +31,24 @@
 import org.onosproject.bgpio.types.BgpValueType;
 import org.onosproject.bgpio.types.MpReachNlri;
 import org.onosproject.bgpio.types.MpUnReachNlri;
+import org.osgi.service.component.annotations.Activate;
+import org.osgi.service.component.annotations.Component;
+import org.osgi.service.component.annotations.Deactivate;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 import java.util.Iterator;
 import java.util.LinkedList;
-import java.util.Map;
-import java.util.TreeMap;
 import java.util.List;
+import java.util.Map;
 import java.util.Set;
+import java.util.TreeMap;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.CopyOnWriteArraySet;
 import java.util.concurrent.locks.Lock;
 import java.util.concurrent.locks.ReentrantLock;
 
-@Component(immediate = true)
-@Service
+@Component(immediate = true, service = BgpController.class)
 public class BgpControllerImpl implements BgpController {
 
     private static final Logger log = LoggerFactory.getLogger(BgpControllerImpl.class);
diff --git a/protocols/bmv2/thrift-api/BUCK b/protocols/bmv2/thrift-api/BUCK
deleted file mode 100644
index f9c90ff..0000000
--- a/protocols/bmv2/thrift-api/BUCK
+++ /dev/null
@@ -1,102 +0,0 @@
-COMPILE_DEPS = [
-    '//lib:CORE_DEPS',
-    '//lib:libthrift',
-]
-
-# BMV2_COMMIT should be set to the same value as specified in install-p4-tools.sh
-BMV2_COMMIT = 'a3f0ebe4c0f10a656f8aa1ad68cb20402a62b0ee'
-BMV2_BASEURL = 'https://cdn.rawgit.com/p4lang/behavioral-model/' + BMV2_COMMIT
-BMV2_NAMESPACE = 'org.onosproject.bmv2.thriftapi'
-
-THRIFT_EXE_BASEURL = 'https://cdn.rawgit.com/ccascone/mvn-thrift-compiler/1.1_0.9.3/exe/'
-THRIFT_EXE_SHA1S = {
-    'thrift-linux-x86_64.exe':'9b7b5d6eabc9552b8227e8f63981bc15c0985dd5',
-    'thrift-osx-x86_64.exe':'b9215c5141f56fd277b7cf41d9745af847afe498'
-}
-
-def prebuilt_thrift_compiler():
-    import platform
-    os_name = platform.system().lower()
-    if os_name == 'darwin':
-        os_name = 'osx'
-    arch = '%s-%s' % (os_name, platform.machine())
-    fname = 'thrift-%s.exe' % arch
-    if fname not in THRIFT_EXE_SHA1S:
-        raise Exception('Cannot download thrift compiler, architecture %s not supported' % arch)
-    remote_file(
-        name = 'thrift-binary',
-        out = 'thrift.binary',
-        url = THRIFT_EXE_BASEURL + fname,
-        sha1 = THRIFT_EXE_SHA1S[fname],
-    )
-    genrule (
-        name = 'thrift-exe',
-        srcs = [ ':thrift-binary' ],
-        bash = 'cp $(location :thrift-binary) $OUT && chmod +x $OUT',
-        executable = True,
-        out = 'thrift.exe'
-    )
-
-prebuilt_thrift_compiler()
-
-# TODO: or export local thrift executable
-# export_file(
-#       name = 'thrift-exe',
-#       src = '/usr/bin/thrift',
-#     )
-
-def remote_thrift_def(
-    name,
-    url,
-    sha1):
-    # Download *.thrift definition file.
-    remote_file(
-        name = name + '-rem',
-        out = name + '.thrift',
-        url = url,
-        sha1 = sha1,
-    )
-    # Add java namespace.
-    genrule (
-        name = name+'-ns',
-        srcs = [':' + name + '-rem'],
-        bash = 'cp $(location :' + name + '-rem) $OUT && '
-                + 'echo "namespace java ' + BMV2_NAMESPACE + '" | '
-                + 'cat - $OUT > temp && mv temp $OUT',
-        out = name + '.thrift',
-    )
-    # Generate Java sources.
-    genrule (
-        name = name+'-gen',
-        srcs = [':' + name + '-ns'],
-        # FIXME: is there a better way to get just the output dir of this rule?
-        # ...not the full file path in $OUT
-        cmd = '$(exe :thrift-exe) -o $SRCDIR/../' + name + '-gen '
-                + '--gen java $SRCDIR/' + name + '.thrift',
-        out = 'gen-java',
-    )
-    # Zip them.
-    zip_file(
-        name = name,
-        out = name + '.src.zip',
-        srcs = [':' + name + '-gen']
-    )
-
-
-remote_thrift_def(
-    name = 'simple_pre_lag',
-    url = BMV2_BASEURL + '/thrift_src/simple_pre_lag.thrift',
-    sha1 = 'f468ebebc7bb8577f11ca950939f34add5f5634c',
-)
-
-osgi_jar(
-    # If a source ending with *.src.zip is passed, Buck automatically looks for *.java files inside.
-    srcs = [':simple_pre_lag'],
-    deps = COMPILE_DEPS,
-    do_javadocs = False,
-    do_checkstyle = False
-)
-
-project_config(
-    src_target = ':onos-protocols-bmv2-thrift-api'
-)
diff --git a/protocols/gnmi/BUCK b/protocols/gnmi/BUCK
deleted file mode 100644
index 6c80b9b..0000000
--- a/protocols/gnmi/BUCK
+++ /dev/null
@@ -1,15 +0,0 @@
-BUNDLES = [
-    '//protocols/gnmi/stub:onos-protocols-gnmi-stub',
-]
-
-onos_app(
-    app_name = 'org.onosproject.protocols.gnmi',
-    title = 'gNMI Protocol Subsystem',
-    category = 'Protocol',
-    url = 'http://onosproject.org',
-    description = 'ONOS gNMI protocol subsystem',
-    included_bundles = BUNDLES,
-    required_apps = [
-        'org.onosproject.protocols.grpc'
-    ],
-)
diff --git a/protocols/gnmi/stub/BUCK b/protocols/gnmi/stub/BUCK
deleted file mode 100644
index 8a29090..0000000
--- a/protocols/gnmi/stub/BUCK
+++ /dev/null
@@ -1,24 +0,0 @@
-include_defs('//bucklets/grpc.bucklet')
-
-PROTOBUF_VER = '3.2.0'
-GRPC_VER = '1.3.1'
-
-COMPILE_DEPS = [
-    '//lib:CORE_DEPS',
-    '//incubator/grpc-dependencies:grpc-core-repkg-' + GRPC_VER,
-    '//lib:grpc-stub-' + GRPC_VER,
-    '//lib:grpc-protobuf-' + GRPC_VER,
-    '//lib:protobuf-java-' + PROTOBUF_VER,
-]
-
-grpc_jar(
-    deps = COMPILE_DEPS,
-    # FIXME should not be manually building absolute path.
-    # Come up with glob(..) equivalent in BUCK which can handle directory.
-    proto_paths = ["$ONOS_ROOT/protocols/gnmi/stub/src/main/proto"],
-    include_std_lib = True,
-)
-
-project_config(
-    src_target = ':onos-protocols-gnmi-stub'
-)
diff --git a/protocols/grpc/BUCK b/protocols/grpc/BUCK
deleted file mode 100644
index 093ea7d..0000000
--- a/protocols/grpc/BUCK
+++ /dev/null
@@ -1,38 +0,0 @@
-PROTOBUF_VER = '3.2.0'
-GRPC_VER = '1.3.1'
-
-BUNDLES = [
-    '//protocols/grpc/proto:onos-protocols-grpc-proto',
-    '//protocols/grpc/api:onos-protocols-grpc-api',
-    '//protocols/grpc/ctl:onos-protocols-grpc-ctl',
-    # gRPC dependencies
-    '//incubator/grpc-dependencies:grpc-core-repkg-' + GRPC_VER,
-    '//lib:grpc-protobuf-' + GRPC_VER,
-    '//lib:grpc-protobuf-lite-' + GRPC_VER,
-    '//lib:grpc-stub-' + GRPC_VER,
-    '//lib:grpc-netty-' + GRPC_VER,
-    '//lib:grpc-auth-' + GRPC_VER,
-    '//lib:google-instrumentation-0.3.0',
-    '//lib:protobuf-java-3.2.0',
-    # Lazily adding all netty-related packages.
-    # Some of them might not be necessary.
-    '//lib:io_netty_netty',
-    '//lib:io_netty_netty_buffer',
-    '//lib:io_netty_netty_codec',
-    '//lib:io_netty_netty_codec-http',
-    '//lib:io_netty_netty_codec-http2',
-    '//lib:io_netty_netty_common',
-    '//lib:io_netty_netty_handler',
-    '//lib:io_netty_netty_transport',
-    '//lib:io_netty_netty_transport-native-epoll',
-    '//lib:io_netty_netty_resolver',
-]
-
-onos_app (
-    app_name = 'org.onosproject.protocols.grpc',
-    title = 'gRPC Protocol Subsystem',
-    category = 'Protocol',
-    url = 'http://onosproject.org',
-    description = 'Exposes APIs to store and manage gRPC channels.',
-    included_bundles = BUNDLES,
-)
diff --git a/protocols/grpc/api/BUCK b/protocols/grpc/api/BUCK
deleted file mode 100644
index e0dad74..0000000
--- a/protocols/grpc/api/BUCK
+++ /dev/null
@@ -1,11 +0,0 @@
-GRPC_VER = '1.3.1'
-
-COMPILE_DEPS = [
-    '//lib:CORE_DEPS',
-    '//incubator/grpc-dependencies:grpc-core-repkg-' + GRPC_VER,
-    '//lib:grpc-stub-' + GRPC_VER,
-]
-
-osgi_jar (
-    deps = COMPILE_DEPS,
-)
diff --git a/protocols/grpc/ctl/BUCK b/protocols/grpc/ctl/BUCK
deleted file mode 100644
index 36681b5..0000000
--- a/protocols/grpc/ctl/BUCK
+++ /dev/null
@@ -1,16 +0,0 @@
-PROTOBUF_VER = '3.2.0'
-GRPC_VER = '1.3.1'
-
-COMPILE_DEPS = [
-    '//lib:CORE_DEPS',
-    '//protocols/grpc/api:onos-protocols-grpc-api',
-    '//protocols/grpc/proto:onos-protocols-grpc-proto',
-    '//incubator/grpc-dependencies:grpc-core-repkg-' + GRPC_VER,
-    '//lib:grpc-stub-' + GRPC_VER,
-    '//lib:protobuf-java-' + PROTOBUF_VER,
-]
-
-osgi_jar (
-    deps = COMPILE_DEPS,
-)
-
diff --git a/protocols/grpc/ctl/src/main/java/org/onosproject/grpc/ctl/GrpcControllerImpl.java b/protocols/grpc/ctl/src/main/java/org/onosproject/grpc/ctl/GrpcControllerImpl.java
index fb87571..7d038ce 100644
--- a/protocols/grpc/ctl/src/main/java/org/onosproject/grpc/ctl/GrpcControllerImpl.java
+++ b/protocols/grpc/ctl/src/main/java/org/onosproject/grpc/ctl/GrpcControllerImpl.java
@@ -31,14 +31,6 @@
 import io.grpc.MethodDescriptor;
 import io.grpc.Status;
 import io.grpc.StatusRuntimeException;
-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.util.Tools;
 import org.onosproject.cfg.ComponentConfigService;
 import org.onosproject.grpc.api.GrpcChannelId;
@@ -47,6 +39,12 @@
 import org.onosproject.grpc.proto.dummy.DummyServiceGrpc;
 import org.onosproject.net.DeviceId;
 import org.osgi.service.component.ComponentContext;
+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 org.slf4j.LoggerFactory;
 
@@ -62,24 +60,28 @@
 import java.util.concurrent.locks.Lock;
 
 import static com.google.common.base.Preconditions.checkNotNull;
+import static org.onosproject.grpc.ctl.OsgiPropertyConstants.ENABLE_MESSAGE_LOG;
+import static org.onosproject.grpc.ctl.OsgiPropertyConstants.ENABLE_MESSAGE_LOG_DEFAULT;
 
 /**
  * Default implementation of the GrpcController.
  */
-@Component(immediate = true)
-@Service
+@Component(immediate = true, service = GrpcController.class,
+        property = {
+            ENABLE_MESSAGE_LOG + ":Boolean=" + ENABLE_MESSAGE_LOG_DEFAULT,
+        })
 public class GrpcControllerImpl implements GrpcController {
 
     private  static final String SET_FORWARDING_PIPELINE_CONFIG_METHOD = "p4.P4Runtime/SetForwardingPipelineConfig";
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected ComponentConfigService componentConfigService;
 
     // Hint: set to true to log all gRPC messages received/sent on all channels
     // Does not enable log on existing channels
     private static final boolean DEFAULT_LOG_LEVEL = false;
-    @Property(name = "enableMessageLog", boolValue =  DEFAULT_LOG_LEVEL,
-            label = "Indicates whether to log all gRPC messages sent and received on all channels")
+
+    /** Indicates whether to log all gRPC messages sent and received on all channels. */
     public static boolean enableMessageLog = DEFAULT_LOG_LEVEL;
 
     private final Logger log = LoggerFactory.getLogger(getClass());
@@ -98,7 +100,7 @@
     public void modified(ComponentContext context) {
         if (context != null) {
             Dictionary<?, ?> properties = context.getProperties();
-            enableMessageLog = Tools.isPropertyEnabled(properties, "enableMessageLog",
+            enableMessageLog = Tools.isPropertyEnabled(properties, ENABLE_MESSAGE_LOG,
                     DEFAULT_LOG_LEVEL);
             log.info("Configured. Log of gRPC messages is {}", enableMessageLog ? "enabled" : "disabled");
         }
diff --git a/protocols/grpc/ctl/src/main/java/org/onosproject/grpc/ctl/OsgiPropertyConstants.java b/protocols/grpc/ctl/src/main/java/org/onosproject/grpc/ctl/OsgiPropertyConstants.java
new file mode 100644
index 0000000..576d1da
--- /dev/null
+++ b/protocols/grpc/ctl/src/main/java/org/onosproject/grpc/ctl/OsgiPropertyConstants.java
@@ -0,0 +1,29 @@
+/*
+ * Copyright 2018-present Open Networking Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.onosproject.grpc.ctl;
+
+/**
+ * Constants for default values of configurable properties.
+ */
+public final class OsgiPropertyConstants {
+
+    private OsgiPropertyConstants() {}
+
+    public static final String ENABLE_MESSAGE_LOG = "enableMessageLog";
+    public static final boolean ENABLE_MESSAGE_LOG_DEFAULT = false;
+
+}
diff --git a/protocols/grpc/proto/BUCK b/protocols/grpc/proto/BUCK
deleted file mode 100644
index 8f1b562..0000000
--- a/protocols/grpc/proto/BUCK
+++ /dev/null
@@ -1,26 +0,0 @@
-include_defs(
-    '//bucklets/grpc.bucklet'
-)
-
-PROTOBUF_VER = '3.2.0'
-GRPC_VER = '1.3.1'
-
-COMPILE_DEPS = [
-    '//lib:CORE_DEPS',
-    '//incubator/grpc-dependencies:grpc-core-repkg-' + GRPC_VER,
-    '//lib:grpc-stub-' + GRPC_VER,
-    '//lib:grpc-protobuf-' + GRPC_VER,
-    '//lib:protobuf-java-' + PROTOBUF_VER,
-]
-
-grpc_jar(
-    proto_match_patterns = ["*.proto"],
-    proto_paths = ["$ONOS_ROOT/protocols/grpc/proto/", "$ONOS_ROOT"], #FIXME should not have to include ONOS_ROOT top level here
-    protoc_version = PROTOBUF_VER,
-    plugin_version = GRPC_VER,
-    deps = COMPILE_DEPS,
-)
-
-project_config(
-    src_target = ':onos-protocols-grpc-proto'
-)
diff --git a/protocols/isis/api/BUCK b/protocols/isis/api/BUCK
deleted file mode 100644
index 75c833b..0000000
--- a/protocols/isis/api/BUCK
+++ /dev/null
@@ -1,11 +0,0 @@
-COMPILE_DEPS = [
-    '//lib:CORE_DEPS',
-    '//lib:NETTY',
-    '//lib:JACKSON',
-    '//lib:io_netty_netty',
-]
-
-osgi_jar_with_tests (
-    deps = COMPILE_DEPS,
-)
-
diff --git a/protocols/isis/ctl/BUCK b/protocols/isis/ctl/BUCK
deleted file mode 100644
index 1ab0b4b..0000000
--- a/protocols/isis/ctl/BUCK
+++ /dev/null
@@ -1,12 +0,0 @@
-COMPILE_DEPS = [
-    '//lib:CORE_DEPS',
-    '//lib:NETTY',
-    '//lib:JACKSON',
-    '//protocols/isis/api:onos-protocols-isis-api',
-    '//protocols/isis/isisio:onos-protocols-isis-isisio',
-    '//lib:io_netty_netty',
-]
-
-osgi_jar_with_tests (
-    deps = COMPILE_DEPS,
-)
diff --git a/protocols/isis/ctl/src/main/java/org/onosproject/isis/controller/impl/DefaultIsisController.java b/protocols/isis/ctl/src/main/java/org/onosproject/isis/controller/impl/DefaultIsisController.java
index 9cafc4c..1f17969 100644
--- a/protocols/isis/ctl/src/main/java/org/onosproject/isis/controller/impl/DefaultIsisController.java
+++ b/protocols/isis/ctl/src/main/java/org/onosproject/isis/controller/impl/DefaultIsisController.java
@@ -17,12 +17,6 @@
 
 import com.fasterxml.jackson.databind.JsonNode;
 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.isis.controller.IsisController;
 import org.onosproject.isis.controller.IsisProcess;
 import org.onosproject.isis.controller.topology.IsisAgent;
@@ -31,6 +25,11 @@
 import org.onosproject.isis.controller.topology.IsisRouter;
 import org.onosproject.isis.controller.topology.IsisRouterListener;
 import org.onosproject.net.driver.DriverService;
+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;
 
@@ -41,13 +40,12 @@
 /**
  * Represents ISIS controller implementation.
  */
-@Component(immediate = true)
-@Service
+@Component(immediate = true, service = IsisController.class)
 public class DefaultIsisController implements IsisController {
 
     private static final Logger log = LoggerFactory.getLogger(DefaultIsisController.class);
     private final Controller controller = new Controller();
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected DriverService driverService;
     protected Set<IsisRouterListener> isisRouterListener = new HashSet<>();
     protected Set<IsisLinkListener> isisLinkListener = Sets.newHashSet();
diff --git a/protocols/isis/isisio/BUCK b/protocols/isis/isisio/BUCK
deleted file mode 100644
index abcd593..0000000
--- a/protocols/isis/isisio/BUCK
+++ /dev/null
@@ -1,10 +0,0 @@
-COMPILE_DEPS = [
-    '//lib:CORE_DEPS',
-    '//lib:NETTY',
-    '//protocols/isis/api:onos-protocols-isis-api',
-    '//lib:io_netty_netty',
-]
-
-osgi_jar_with_tests (
-    deps = COMPILE_DEPS,
-)
diff --git a/protocols/isis/isisio/BUILD b/protocols/isis/isisio/BUILD
index ad966c4..1aabfcf 100644
--- a/protocols/isis/isisio/BUILD
+++ b/protocols/isis/isisio/BUILD
@@ -1,4 +1,4 @@
-COMPILE_DEPS = CORE_DEPS + NETTY + [
+COMPILE_DEPS = CORE_DEPS + NETTY + JAXB + [
     "@io_netty_netty//jar",
     "//protocols/isis/api:onos-protocols-isis-api",
 ]
diff --git a/protocols/lisp/api/BUCK b/protocols/lisp/api/BUCK
deleted file mode 100644
index a182f2b..0000000
--- a/protocols/lisp/api/BUCK
+++ /dev/null
@@ -1,11 +0,0 @@
-COMPILE_DEPS = [
-    '//lib:CORE_DEPS',
-    '//lib:NETTY',
-    '//lib:io_netty_netty_transport',
-    '//protocols/lisp/msg:onos-protocols-lisp-msg',
-    '//apps/mappingmanagement/api:onos-apps-mappingmanagement-api',
-]
-
-osgi_jar_with_tests (
-    deps = COMPILE_DEPS,
-)
diff --git a/protocols/lisp/ctl/BUCK b/protocols/lisp/ctl/BUCK
deleted file mode 100644
index 25764e7..0000000
--- a/protocols/lisp/ctl/BUCK
+++ /dev/null
@@ -1,26 +0,0 @@
-COMPILE_DEPS = [
-    '//lib:CORE_DEPS',
-    '//lib:NETTY',
-    '//protocols/lisp/api:onos-protocols-lisp-api',
-    '//protocols/lisp/msg:onos-protocols-lisp-msg',
-    '//lib:io_netty_netty_buffer',
-    '//lib:io_netty_netty_codec',
-    '//lib:io_netty_netty_transport',
-    '//lib:io_netty_netty_transport-native-epoll',
-    '//lib:io_netty_netty_handler',
-    '//lib:io_netty_netty_resolver',
-    '//lib:concurrent-trees',
-]
-
-TEST_DEPS = [
-    '//lib:TEST_ADAPTERS',
-    '//utils/osgi:onlab-osgi-tests',
-    '//core/api:onos-api-tests',
-    '//protocols/lisp/api:onos-protocols-lisp-api-tests',
-]
-
-osgi_jar_with_tests (
-    deps = COMPILE_DEPS,
-    test_deps = TEST_DEPS,
-)
-
diff --git a/protocols/lisp/ctl/src/main/java/org/onosproject/lisp/ctl/impl/LispControllerImpl.java b/protocols/lisp/ctl/src/main/java/org/onosproject/lisp/ctl/impl/LispControllerImpl.java
index ec71050..9fd5200 100644
--- a/protocols/lisp/ctl/src/main/java/org/onosproject/lisp/ctl/impl/LispControllerImpl.java
+++ b/protocols/lisp/ctl/src/main/java/org/onosproject/lisp/ctl/impl/LispControllerImpl.java
@@ -16,14 +16,6 @@
 package org.onosproject.lisp.ctl.impl;
 
 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.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.util.Tools;
 import org.onosproject.cfg.ComponentConfigService;
 import org.onosproject.core.CoreService;
@@ -39,6 +31,12 @@
 import org.onosproject.lisp.msg.protocols.LispInfoRequest;
 import org.onosproject.lisp.msg.protocols.LispMessage;
 import org.osgi.service.component.ComponentContext;
+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.Dictionary;
@@ -53,43 +51,45 @@
 import static org.onlab.util.Tools.get;
 import static org.onlab.util.Tools.getIntegerProperty;
 import static org.onlab.util.Tools.groupedThreads;
+import static org.onosproject.lisp.ctl.impl.OsgiPropertyConstants.*;
 import static org.slf4j.LoggerFactory.getLogger;
 
 /**
  * LISP controller initiation class.
  */
-@Component(immediate = true)
-@Service
+@Component(immediate = true, service = LispController.class,
+        property = {
+                LISP_AUTH_KEY + "=" + LISP_AUTH_KEY_DEFAULT,
+                LISP_AUTH_KEY_ID + ":Integer=" + LISP_AUTH_KEY_ID_DEFAULT,
+                ENABLE_SMR + ":Boolean=" + ENABLE_SMR_DEFAULT,
+        })
 public class LispControllerImpl implements LispController {
 
     private static final String APP_ID = "org.onosproject.lisp-base";
 
     private static final Logger log = getLogger(LispControllerImpl.class);
 
-    private static final String DEFAULT_LISP_AUTH_KEY = "onos";
-    private static final short DEFAULT_LISP_AUTH_KEY_ID = 1;
-
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected CoreService coreService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected ComponentConfigService cfgService;
 
-    @Property(name = "lispAuthKey", value = DEFAULT_LISP_AUTH_KEY,
-            label = "Authentication key which is used to calculate authentication " +
-                    "data for LISP control message; default value is onos")
-    private String lispAuthKey = DEFAULT_LISP_AUTH_KEY;
+    /**
+     * Authentication key which is used to calculate authentication data for
+     * LISP control message; default value is onos.
+     */
+    private String lispAuthKey = LISP_AUTH_KEY_DEFAULT;
 
-    @Property(name = "lispAuthKeyId", intValue = DEFAULT_LISP_AUTH_KEY_ID,
-            label = "Authentication key id which denotes the authentication method " +
-                    "that ONOS uses to calculate the authentication data; " +
-                    "1 denotes HMAC SHA1 encryption, 2 denotes HMAC SHA256 encryption; " +
-                    "default value is 1")
-    private int lispAuthKeyId = DEFAULT_LISP_AUTH_KEY_ID;
+    /**
+     * Authentication key id which denotes the authentication method
+     * that ONOS uses to calculate the authentication data;
+     * 1 denotes HMAC SHA1 encryption, 2 denotes HMAC SHA256 encryption;
+     * default value is 1.
+     */
+    private int lispAuthKeyId = LISP_AUTH_KEY_ID_DEFAULT;
 
-    @Property(name = "enableSmr", boolValue = false,
-            label = "Enable to send SMR(Solicit Map Request) by map server; " +
-                    "By default SMR is not activated")
+    /** Enable to send SMR(Solicit Map Request) by map server; by default SMR is not activated. */
     private boolean enableSmr = false;
 
     ExecutorService executorMessages =
@@ -148,8 +148,8 @@
      * @param properties a set of properties that contained in component context
      */
     private void initAuthConfig(Dictionary<?, ?> properties) {
-        authConfig.updateLispAuthKey(get(properties, "lispAuthKey"));
-        authConfig.updateLispAuthKeyId(getIntegerProperty(properties, "lispAuthKeyId"));
+        authConfig.updateLispAuthKey(get(properties, LISP_AUTH_KEY));
+        authConfig.updateLispAuthKeyId(getIntegerProperty(properties, LISP_AUTH_KEY_ID));
     }
 
     /**
@@ -160,14 +160,14 @@
     private void readComponentConfiguration(ComponentContext context) {
         Dictionary<?, ?> properties = context.getProperties();
 
-        String lispAuthKeyStr = Tools.get(properties, "lispAuthKey");
-        lispAuthKey = lispAuthKeyStr != null ? lispAuthKeyStr : DEFAULT_LISP_AUTH_KEY;
+        String lispAuthKeyStr = Tools.get(properties, LISP_AUTH_KEY);
+        lispAuthKey = lispAuthKeyStr != null ? lispAuthKeyStr : LISP_AUTH_KEY_DEFAULT;
         authConfig.updateLispAuthKey(lispAuthKey);
         log.info("Configured. LISP authentication key is {}", lispAuthKey);
 
-        Integer lispAuthMethodInt = Tools.getIntegerProperty(properties, "lispAuthKeyId");
+        Integer lispAuthMethodInt = Tools.getIntegerProperty(properties, LISP_AUTH_KEY_ID);
         if (lispAuthMethodInt == null) {
-            lispAuthKeyId = DEFAULT_LISP_AUTH_KEY_ID;
+            lispAuthKeyId = LISP_AUTH_KEY_ID_DEFAULT;
             log.info("LISP authentication method is not configured, default value is {}", lispAuthKeyId);
         } else {
             lispAuthKeyId = lispAuthMethodInt;
@@ -175,14 +175,14 @@
         }
         authConfig.updateLispAuthKeyId(lispAuthKeyId);
 
-        Boolean enableSmr = Tools.isPropertyEnabled(properties, "enableSmr");
+        Boolean enableSmr = Tools.isPropertyEnabled(properties, ENABLE_SMR);
         if (enableSmr == null) {
             log.info("Enable SMR is not configured, " +
-                    "using current value of {}", this.enableSmr);
+                             "using current value of {}", this.enableSmr);
         } else {
             this.enableSmr = enableSmr;
             log.info("Configured. Sending SMR through map server is {}",
-                    this.enableSmr ? "enabled" : "disabled");
+                     this.enableSmr ? "enabled" : "disabled");
         }
     }
 
@@ -194,9 +194,9 @@
     @Override
     public Iterable<LispRouter> getSubscribedRouters() {
         return connectedRouters.entrySet()
-                                .stream()
-                                .filter(e -> e.getValue().isSubscribed())
-                                .collect(toConcurrentMap(Map.Entry::getKey,
+                .stream()
+                .filter(e -> e.getValue().isSubscribed())
+                .collect(toConcurrentMap(Map.Entry::getKey,
                                          Map.Entry::getValue)).values();
     }
 
@@ -272,7 +272,7 @@
 
             if (connectedRouters.get(routerId) != null) {
                 log.warn("Trying to add connectedRouter but found a previous " +
-                          "value for routerId: {}", routerId);
+                                 "value for routerId: {}", routerId);
                 return false;
             } else {
                 log.info("Added router {}", routerId);
@@ -289,7 +289,7 @@
 
             if (connectedRouters.get(routerId) == null) {
                 log.error("Trying to remove router {} from connectedRouter " +
-                          "list but no element was found", routerId);
+                                  "list but no element was found", routerId);
             } else {
                 log.info("Removed router {}", routerId);
                 connectedRouters.remove(routerId);
@@ -356,7 +356,7 @@
         private final boolean isIncoming;
 
         LispMessageHandler(LispRouterId routerId,
-                                  LispMessage message, boolean isIncoming) {
+                           LispMessage message, boolean isIncoming) {
             this.routerId = routerId;
             this.message = message;
             this.isIncoming = isIncoming;
@@ -378,10 +378,10 @@
      * LISP incoming message handler.
      */
     protected final class LispIncomingMessageHandler
-                    extends LispMessageHandler implements Runnable {
+            extends LispMessageHandler implements Runnable {
 
         LispIncomingMessageHandler(LispRouterId routerId,
-                                          LispMessage message) {
+                                   LispMessage message) {
             super(routerId, message, true);
         }
     }
@@ -390,10 +390,10 @@
      * LISP outgoing message handler.
      */
     protected final class LispOutgoingMessageHandler
-                    extends LispMessageHandler implements Runnable {
+            extends LispMessageHandler implements Runnable {
 
         LispOutgoingMessageHandler(LispRouterId routerId,
-                                          LispMessage message) {
+                                   LispMessage message) {
             super(routerId, message, false);
         }
     }
diff --git a/protocols/lisp/ctl/src/main/java/org/onosproject/lisp/ctl/impl/OsgiPropertyConstants.java b/protocols/lisp/ctl/src/main/java/org/onosproject/lisp/ctl/impl/OsgiPropertyConstants.java
new file mode 100644
index 0000000..9295734
--- /dev/null
+++ b/protocols/lisp/ctl/src/main/java/org/onosproject/lisp/ctl/impl/OsgiPropertyConstants.java
@@ -0,0 +1,35 @@
+/*
+ * Copyright 2018-present Open Networking Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.onosproject.lisp.ctl.impl;
+
+/**
+ * Constants for default values of configurable properties.
+ */
+public final class OsgiPropertyConstants {
+
+    private OsgiPropertyConstants() {}
+
+    public static final String LISP_AUTH_KEY = "lispAuthKey";
+    public static final String LISP_AUTH_KEY_DEFAULT = "onos";
+
+    public static final String LISP_AUTH_KEY_ID = "lispAuthKeyId";
+    public static final int LISP_AUTH_KEY_ID_DEFAULT = 1;
+
+    public static final String ENABLE_SMR = "enableSmr";
+    public static final boolean ENABLE_SMR_DEFAULT = false;
+
+}
diff --git a/protocols/lisp/msg/BUCK b/protocols/lisp/msg/BUCK
deleted file mode 100644
index 2e2b8a7..0000000
--- a/protocols/lisp/msg/BUCK
+++ /dev/null
@@ -1,17 +0,0 @@
-COMPILE_DEPS = [
-    '//lib:CORE_DEPS',
-    '//lib:NETTY',
-    '//lib:io_netty_netty_buffer'
-]
-
-TEST_DEPS = [
-    '//lib:TEST_ADAPTERS',
-    '//utils/osgi:onlab-osgi-tests',
-    '//core/api:onos-api-tests',
-]
-
-osgi_jar_with_tests (
-    deps = COMPILE_DEPS,
-    test_deps = TEST_DEPS,
-)
-
diff --git a/protocols/netconf/api/BUCK b/protocols/netconf/api/BUCK
deleted file mode 100644
index 61b3a10..0000000
--- a/protocols/netconf/api/BUCK
+++ /dev/null
@@ -1,8 +0,0 @@
-COMPILE_DEPS = [
-    '//lib:CORE_DEPS',
-    '//lib:JACKSON',
-]
-
-osgi_jar_with_tests (
-    deps = COMPILE_DEPS,
-)
diff --git a/protocols/netconf/api/BUILD b/protocols/netconf/api/BUILD
index 2d486c5..61f9d3b 100644
--- a/protocols/netconf/api/BUILD
+++ b/protocols/netconf/api/BUILD
@@ -1,3 +1,3 @@
 osgi_jar_with_tests(
-    deps = CORE_DEPS + JACKSON,
+    deps = CORE_DEPS + JACKSON + JAXB,
 )
diff --git a/protocols/netconf/ctl/BUCK b/protocols/netconf/ctl/BUCK
deleted file mode 100644
index 8abf233..0000000
--- a/protocols/netconf/ctl/BUCK
+++ /dev/null
@@ -1,23 +0,0 @@
-COMPILE_DEPS = [
-    '//lib:CORE_DEPS',
-    '//lib:JACKSON',
-    '//lib:ganymed-ssh2',
-    '//protocols/netconf/api:onos-protocols-netconf-api',
-    '//cli:onos-cli',
-    '//lib:org.apache.karaf.shell.console',
-    '//lib:sshd-core',
-    '//lib:bcpkix-jdk15on',
-    '//lib:bcprov-jdk15on',
-]
-
-TEST_DEPS = [
-    '//lib:TEST_ADAPTERS',
-    '//utils/osgi:onlab-osgi-tests',
-    '//core/api:onos-api-tests',
-]
-
-osgi_jar_with_tests (
-    deps = COMPILE_DEPS,
-    test_deps = TEST_DEPS,
-)
-
diff --git a/protocols/netconf/ctl/BUILD b/protocols/netconf/ctl/BUILD
index 09346b2..0e9a912 100644
--- a/protocols/netconf/ctl/BUILD
+++ b/protocols/netconf/ctl/BUILD
@@ -1,11 +1,9 @@
-COMPILE_DEPS = CORE_DEPS + JACKSON + [
+COMPILE_DEPS = CORE_DEPS + JACKSON + CLI + [
     "@ganymed_ssh2//jar",
-    "@org_apache_karaf_shell_console//jar",
     "@sshd_core//jar",
     "@bcpkix_jdk15on//jar",
     "@bcprov_jdk15on//jar",
     "//protocols/netconf/api:onos-protocols-netconf-api",
-    "//cli:onos-cli",
 ]
 
 TEST_DEPS = TEST_ADAPTERS + [
@@ -14,6 +12,7 @@
 ]
 
 osgi_jar_with_tests(
+    karaf_command_packages = ["org.onosproject.netconf.cli.impl"],
     test_deps = TEST_DEPS,
     deps = COMPILE_DEPS,
 )
diff --git a/protocols/netconf/ctl/src/main/java/org/onosproject/netconf/cli/impl/NetconfGetCommand.java b/protocols/netconf/ctl/src/main/java/org/onosproject/netconf/cli/impl/NetconfGetCommand.java
index 2d29fcd..c99e11e 100644
--- a/protocols/netconf/ctl/src/main/java/org/onosproject/netconf/cli/impl/NetconfGetCommand.java
+++ b/protocols/netconf/ctl/src/main/java/org/onosproject/netconf/cli/impl/NetconfGetCommand.java
@@ -20,10 +20,13 @@
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.TimeoutException;
 
-import org.apache.karaf.shell.commands.Argument;
-import org.apache.karaf.shell.commands.Command;
-import org.apache.karaf.shell.commands.Option;
+import org.apache.karaf.shell.api.action.Argument;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.Completion;
+import org.apache.karaf.shell.api.action.Option;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.cli.AbstractShellCommand;
+import org.onosproject.cli.net.DeviceIdCompleter;
 import org.onosproject.net.DeviceId;
 import org.onosproject.netconf.NetconfController;
 import org.onosproject.netconf.NetconfDevice;
@@ -34,6 +37,7 @@
  * Command that retrieves running configuration and device state.
  * If configuration cannot be retrieved it prints an error string.
  */
+@Service
 @Command(scope = "onos", name = "netconf-get",
         description = "Retrieve running configuration and "
                 + "device state information from specified device.")
@@ -41,6 +45,7 @@
 
     @Argument(index = 0, name = "deviceId", description = "Device ID",
             required = true, multiValued = false)
+    @Completion(DeviceIdCompleter.class)
     String uri = null;
 
     @Option(name = "--timeout",
@@ -49,7 +54,7 @@
     long timeoutSec = 30;
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         DeviceId deviceId = DeviceId.deviceId(uri);
 
         NetconfController controller = get(NetconfController.class);
diff --git a/protocols/netconf/ctl/src/main/java/org/onosproject/netconf/cli/impl/NetconfGetConfigCommand.java b/protocols/netconf/ctl/src/main/java/org/onosproject/netconf/cli/impl/NetconfGetConfigCommand.java
index 2aedaa9..8198102 100644
--- a/protocols/netconf/ctl/src/main/java/org/onosproject/netconf/cli/impl/NetconfGetConfigCommand.java
+++ b/protocols/netconf/ctl/src/main/java/org/onosproject/netconf/cli/impl/NetconfGetConfigCommand.java
@@ -22,20 +22,25 @@
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.TimeoutException;
 
-import org.apache.karaf.shell.commands.Argument;
-import org.apache.karaf.shell.commands.Command;
-import org.apache.karaf.shell.commands.Option;
+import org.apache.karaf.shell.api.action.Argument;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.Completion;
+import org.apache.karaf.shell.api.action.Option;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.cli.AbstractShellCommand;
+import org.onosproject.cli.net.DeviceIdCompleter;
 import org.onosproject.net.DeviceId;
 import org.onosproject.netconf.NetconfController;
 import org.onosproject.netconf.NetconfDevice;
 import org.onosproject.netconf.NetconfException;
 import org.onosproject.netconf.NetconfSession;
+import org.onosproject.netconf.cli.impl.completers.DatastoreIdCompleter;
 
 /**
  * Command that gets the configuration of the specified type from the specified
  * device. If configuration cannot be retrieved it prints an error string.
  */
+@Service
 @Command(scope = "onos", name = "netconf-get-config",
         description = "Gets the configuration of the specified type from the" +
                 "specified device.")
@@ -43,11 +48,13 @@
 
     @Argument(index = 0, name = "deviceId", description = "Device ID",
             required = true, multiValued = false)
+    @Completion(DeviceIdCompleter.class)
     String uri = null;
 
     @Argument(index = 1, name = "datastore",
               description = "Configuration datastore name (running, etc.)",
               required = false, multiValued = false)
+    @Completion(DatastoreIdCompleter.class)
     String datastore = "running";
 
     @Option(name = "--timeout",
@@ -58,7 +65,7 @@
     private DeviceId deviceId;
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         deviceId = DeviceId.deviceId(uri);
 
         NetconfController controller = get(NetconfController.class);
diff --git a/protocols/netconf/ctl/src/main/java/org/onosproject/netconf/cli/impl/NetconfRpcTestCommand.java b/protocols/netconf/ctl/src/main/java/org/onosproject/netconf/cli/impl/NetconfRpcTestCommand.java
index b994789..30113d1 100644
--- a/protocols/netconf/ctl/src/main/java/org/onosproject/netconf/cli/impl/NetconfRpcTestCommand.java
+++ b/protocols/netconf/ctl/src/main/java/org/onosproject/netconf/cli/impl/NetconfRpcTestCommand.java
@@ -15,9 +15,12 @@
  */
 package org.onosproject.netconf.cli.impl;
 
-import org.apache.karaf.shell.commands.Argument;
-import org.apache.karaf.shell.commands.Command;
+import org.apache.karaf.shell.api.action.Argument;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.Completion;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.cli.AbstractShellCommand;
+import org.onosproject.cli.net.DeviceIdCompleter;
 import org.onosproject.net.DeviceId;
 import org.onosproject.net.behaviour.ConfigSetter;
 import org.onosproject.net.driver.DriverHandler;
@@ -35,7 +38,7 @@
 //Temporary Developer tool, NOT TO BE USED in production or as example for
 // future commands.
 //FIXME Remove dependency to ConfigSetter.
-
+@Service
 @Command(scope = "onos", name = "netconf-rpc-test",
         description = "Debug tool to send NETCONF RPC request")
 public class NetconfRpcTestCommand extends AbstractShellCommand {
@@ -46,12 +49,13 @@
 
     @Argument(index = 1, name = "cfgFile", description = "File path to RPC XML",
             required = true, multiValued = false)
+    @Completion(DeviceIdCompleter.class)
     private String cfgFile = null;
 
     private DeviceId deviceId;
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         DriverService service = get(DriverService.class);
         deviceId = DeviceId.deviceId(uri);
         DriverHandler h = service.createHandler(deviceId);
diff --git a/protocols/netconf/ctl/src/main/java/org/onosproject/netconf/cli/impl/NetconfSubscriptionTestCommand.java b/protocols/netconf/ctl/src/main/java/org/onosproject/netconf/cli/impl/NetconfSubscriptionTestCommand.java
index 226f789..aa36d88 100644
--- a/protocols/netconf/ctl/src/main/java/org/onosproject/netconf/cli/impl/NetconfSubscriptionTestCommand.java
+++ b/protocols/netconf/ctl/src/main/java/org/onosproject/netconf/cli/impl/NetconfSubscriptionTestCommand.java
@@ -15,9 +15,11 @@
  */
 package org.onosproject.netconf.cli.impl;
 
-import org.apache.karaf.shell.commands.Argument;
-import org.apache.karaf.shell.commands.Command;
-import org.apache.karaf.shell.commands.Option;
+import org.apache.karaf.shell.api.action.Argument;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.Completion;
+import org.apache.karaf.shell.api.action.Option;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.cli.net.DeviceIdCompleter;
 import org.onosproject.net.DeviceId;
@@ -28,6 +30,7 @@
 /**
  * Debug command to start subscription on specified device.
  */
+@Service
 @Command(scope = "onos", name = "netconf-subscription-test",
          description = "Debug command to start subscription on specified device")
 public class NetconfSubscriptionTestCommand extends AbstractShellCommand {
@@ -37,6 +40,7 @@
 
     @Argument(index = 0, name = "deviceId", description = "Device ID",
             required = true, multiValued = false)
+    @Completion(DeviceIdCompleter.class)
     String uri = null;
 
     @Option(name = "--end",
@@ -46,7 +50,7 @@
 
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         NetconfController controller = get(NetconfController.class);
         DeviceId did = DeviceId.deviceId(uri);
 
diff --git a/protocols/netconf/ctl/src/main/java/org/onosproject/netconf/cli/impl/completers/DatastoreIdCompleter.java b/protocols/netconf/ctl/src/main/java/org/onosproject/netconf/cli/impl/completers/DatastoreIdCompleter.java
index 7a243e6..90df1dd 100644
--- a/protocols/netconf/ctl/src/main/java/org/onosproject/netconf/cli/impl/completers/DatastoreIdCompleter.java
+++ b/protocols/netconf/ctl/src/main/java/org/onosproject/netconf/cli/impl/completers/DatastoreIdCompleter.java
@@ -21,6 +21,7 @@
 import java.util.Objects;
 import java.util.stream.Collectors;
 
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.cli.AbstractChoicesCompleter;
 import org.onosproject.netconf.DatastoreId;
 
@@ -28,6 +29,7 @@
  * Completer for predefined {@link DatastoreId}.
  *
  */
+@Service
 public class DatastoreIdCompleter extends AbstractChoicesCompleter {
 
     @Override
diff --git a/protocols/netconf/ctl/src/main/java/org/onosproject/netconf/ctl/impl/NetconfControllerImpl.java b/protocols/netconf/ctl/src/main/java/org/onosproject/netconf/ctl/impl/NetconfControllerImpl.java
index 75dce05..0395dee 100644
--- a/protocols/netconf/ctl/src/main/java/org/onosproject/netconf/ctl/impl/NetconfControllerImpl.java
+++ b/protocols/netconf/ctl/src/main/java/org/onosproject/netconf/ctl/impl/NetconfControllerImpl.java
@@ -16,14 +16,6 @@
 
 package org.onosproject.netconf.ctl.impl;
 
-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.bouncycastle.jce.provider.BouncyCastleProvider;
 import org.onlab.packet.IpAddress;
 import org.onosproject.cfg.ComponentConfigService;
@@ -47,6 +39,12 @@
 import org.onosproject.netconf.config.NetconfDeviceConfig;
 import org.onosproject.netconf.config.NetconfSshClientLib;
 import org.osgi.service.component.ComponentContext;
+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 org.slf4j.LoggerFactory;
 
@@ -63,51 +61,44 @@
 import static org.onlab.util.Tools.get;
 import static org.onlab.util.Tools.getIntegerProperty;
 import static org.onlab.util.Tools.groupedThreads;
+import static org.onosproject.netconf.ctl.impl.OsgiPropertyConstants.*;
 
 /**
  * The implementation of NetconfController.
  */
-@Component(immediate = true)
-@Service
+@Component(immediate = true, service = NetconfController.class,
+        property = {
+                NETCONF_CONNECT_TIMEOUT + ":Integer=" + NETCONF_CONNECT_TIMEOUT_DEFAULT,
+                NETCONF_REPLY_TIMEOUT + ":Integer=" + NETCONF_REPLY_TIMEOUT_DEFAULT,
+                NETCONF_IDLE_TIMEOUT + ":Integer=" + NETCONF_IDLE_TIMEOUT_DEFAULT,
+                SSH_LIBRARY + "=" + SSH_LIBRARY_DEFAULT,
+        })
 public class NetconfControllerImpl implements NetconfController {
 
-    protected static final int DEFAULT_CONNECT_TIMEOUT_SECONDS = 5;
-    private static final String PROP_NETCONF_CONNECT_TIMEOUT = "netconfConnectTimeout";
-    // FIXME @Property should not be static
-    @Property(name = PROP_NETCONF_CONNECT_TIMEOUT, intValue = DEFAULT_CONNECT_TIMEOUT_SECONDS,
-            label = "Time (in seconds) to wait for a NETCONF connect.")
-    protected static int netconfConnectTimeout = DEFAULT_CONNECT_TIMEOUT_SECONDS;
+    /** Time (in seconds) to wait for a NETCONF connect. */
+    protected static int netconfConnectTimeout = NETCONF_CONNECT_TIMEOUT_DEFAULT;
 
-    private static final String PROP_NETCONF_REPLY_TIMEOUT = "netconfReplyTimeout";
-    protected static final int DEFAULT_REPLY_TIMEOUT_SECONDS = 5;
-    // FIXME @Property should not be static
-    @Property(name = PROP_NETCONF_REPLY_TIMEOUT, intValue = DEFAULT_REPLY_TIMEOUT_SECONDS,
-            label = "Time (in seconds) waiting for a NetConf reply")
-    protected static int netconfReplyTimeout = DEFAULT_REPLY_TIMEOUT_SECONDS;
+    /** Time (in seconds) waiting for a NetConf reply. */
+    protected static int netconfReplyTimeout = NETCONF_REPLY_TIMEOUT_DEFAULT;
 
-    private static final String PROP_NETCONF_IDLE_TIMEOUT = "netconfIdleTimeout";
-    protected static final int DEFAULT_IDLE_TIMEOUT_SECONDS = 300;
-    // FIXME @Property should not be static
-    @Property(name = PROP_NETCONF_IDLE_TIMEOUT, intValue = DEFAULT_IDLE_TIMEOUT_SECONDS,
-            label = "Time (in seconds) SSH session will close if no traffic seen")
-    protected static int netconfIdleTimeout = DEFAULT_IDLE_TIMEOUT_SECONDS;
+    /** Time (in seconds) SSH session will close if no traffic seen. */
+    protected static int netconfIdleTimeout = NETCONF_IDLE_TIMEOUT_DEFAULT;
 
-    private static final String SSH_LIBRARY = "sshLibrary";
-    private static final String APACHE_MINA_STR = "apache-mina";
-    @Property(name = SSH_LIBRARY, value = APACHE_MINA_STR,
-            label = "Ssh client library to use")
-    protected NetconfSshClientLib sshLibrary = NetconfSshClientLib.APACHE_MINA;
+    /** SSH client library to use. */
+    protected static String sshLibrary = SSH_LIBRARY_DEFAULT;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    protected NetconfSshClientLib sshClientLib = NetconfSshClientLib.APACHE_MINA;
+
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected ComponentConfigService cfgService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected DeviceService deviceService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected DeviceKeyService deviceKeyService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected NetworkConfigRegistry netCfgService;
 
     public static final Logger log = LoggerFactory
@@ -118,7 +109,7 @@
     private final NetconfDeviceOutputEventListener downListener = new DeviceDownEventListener();
 
     protected Set<NetconfDeviceListener> netconfDeviceListeners = new CopyOnWriteArraySet<>();
-    protected NetconfDeviceFactory deviceFactory = (deviceInfo) -> new DefaultNetconfDevice(deviceInfo);
+    protected NetconfDeviceFactory deviceFactory = DefaultNetconfDevice::new;
 
     protected final ExecutorService executor =
             Executors.newCachedThreadPool(groupedThreads("onos/netconfdevicecontroller",
@@ -148,10 +139,11 @@
     @Modified
     public void modified(ComponentContext context) {
         if (context == null) {
-            netconfReplyTimeout = DEFAULT_REPLY_TIMEOUT_SECONDS;
-            netconfConnectTimeout = DEFAULT_CONNECT_TIMEOUT_SECONDS;
-            netconfIdleTimeout = DEFAULT_IDLE_TIMEOUT_SECONDS;
-            sshLibrary = NetconfSshClientLib.APACHE_MINA;
+            netconfReplyTimeout = NETCONF_REPLY_TIMEOUT_DEFAULT;
+            netconfConnectTimeout = NETCONF_CONNECT_TIMEOUT_DEFAULT;
+            netconfIdleTimeout = NETCONF_IDLE_TIMEOUT_DEFAULT;
+            sshLibrary = SSH_LIBRARY_DEFAULT;
+            sshClientLib = NetconfSshClientLib.APACHE_MINA;
             log.info("No component configuration");
             return;
         }
@@ -161,11 +153,11 @@
         String newSshLibrary;
 
         int newNetconfReplyTimeout = getIntegerProperty(
-                properties, PROP_NETCONF_REPLY_TIMEOUT, netconfReplyTimeout);
+                properties, NETCONF_REPLY_TIMEOUT, netconfReplyTimeout);
         int newNetconfConnectTimeout = getIntegerProperty(
-                properties, PROP_NETCONF_CONNECT_TIMEOUT, netconfConnectTimeout);
+                properties, NETCONF_CONNECT_TIMEOUT, netconfConnectTimeout);
         int newNetconfIdleTimeout = getIntegerProperty(
-                properties, PROP_NETCONF_IDLE_TIMEOUT, netconfIdleTimeout);
+                properties, NETCONF_IDLE_TIMEOUT, netconfIdleTimeout);
 
         newSshLibrary = get(properties, SSH_LIBRARY);
 
@@ -184,12 +176,13 @@
         netconfConnectTimeout = newNetconfConnectTimeout;
         netconfIdleTimeout = newNetconfIdleTimeout;
         if (newSshLibrary != null) {
-            sshLibrary = NetconfSshClientLib.getEnum(newSshLibrary);
+            sshLibrary = newSshLibrary;
+            sshClientLib = NetconfSshClientLib.getEnum(newSshLibrary);
         }
         log.info("Settings: {} = {}, {} = {}, {} = {}, {} = {}",
-                 PROP_NETCONF_REPLY_TIMEOUT, netconfReplyTimeout,
-                 PROP_NETCONF_CONNECT_TIMEOUT, netconfConnectTimeout,
-                 PROP_NETCONF_IDLE_TIMEOUT, netconfIdleTimeout,
+                 NETCONF_REPLY_TIMEOUT, netconfReplyTimeout,
+                 NETCONF_CONNECT_TIMEOUT, netconfConnectTimeout,
+                 NETCONF_IDLE_TIMEOUT, netconfIdleTimeout,
                  SSH_LIBRARY, sshLibrary);
     }
 
diff --git a/protocols/netconf/ctl/src/main/java/org/onosproject/netconf/ctl/impl/OsgiPropertyConstants.java b/protocols/netconf/ctl/src/main/java/org/onosproject/netconf/ctl/impl/OsgiPropertyConstants.java
new file mode 100644
index 0000000..6fcdcfd
--- /dev/null
+++ b/protocols/netconf/ctl/src/main/java/org/onosproject/netconf/ctl/impl/OsgiPropertyConstants.java
@@ -0,0 +1,37 @@
+/*
+ * Copyright 2018-present Open Networking Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.onosproject.netconf.ctl.impl;
+
+/**
+ * Constants for default values of configurable properties.
+ */
+public final class OsgiPropertyConstants {
+
+    private OsgiPropertyConstants() {}
+
+    public static final String NETCONF_CONNECT_TIMEOUT = "netconfConnectTimeout";
+    public static final int NETCONF_CONNECT_TIMEOUT_DEFAULT = 5;
+
+    public static final String NETCONF_REPLY_TIMEOUT = "netconfReplyTimeout";
+    public static final int NETCONF_REPLY_TIMEOUT_DEFAULT = 5;
+
+    public static final String NETCONF_IDLE_TIMEOUT = "netconfIdleTimeout";
+    public static final int NETCONF_IDLE_TIMEOUT_DEFAULT = 300;
+
+    public static final String SSH_LIBRARY = "sshLibrary";
+    public static final String SSH_LIBRARY_DEFAULT = "apache-mina";
+}
diff --git a/protocols/netconf/ctl/src/main/resources/OSGI-INF/blueprint/shell-config.xml b/protocols/netconf/ctl/src/main/resources/OSGI-INF/blueprint/shell-config.xml
deleted file mode 100644
index 019014e..0000000
--- a/protocols/netconf/ctl/src/main/resources/OSGI-INF/blueprint/shell-config.xml
+++ /dev/null
@@ -1,58 +0,0 @@
-<!--
-  ~ Copyright 2017-present Open Networking Foundation
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~     http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License.
-  -->
-<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0">
-
-    <command-bundle xmlns="http://karaf.apache.org/xmlns/shell/v1.1.0">
-
-        <command>
-            <action class="org.onosproject.netconf.cli.impl.NetconfSubscriptionTestCommand"/>
-            <completers>
-                <ref component-id="deviceIdCompleter"/>
-                <null/>
-            </completers>
-        </command>
-
-        <command>
-            <action class="org.onosproject.netconf.cli.impl.NetconfGetConfigCommand"/>
-            <completers>
-                <ref component-id="deviceIdCompleter"/>
-                <ref component-id="targetConfigurationsCompleter"/>
-                <null/>
-            </completers>
-        </command>
-
-        <command>
-            <action class="org.onosproject.netconf.cli.impl.NetconfGetCommand"/>
-            <completers>
-                <ref component-id="deviceIdCompleter"/>
-                <null/>
-            </completers>
-        </command>
-
-        <command>
-            <action class="org.onosproject.netconf.cli.impl.NetconfRpcTestCommand"/>
-            <completers>
-                <ref component-id="deviceIdCompleter"/>
-                <null/>
-            </completers>
-        </command>
-
-    </command-bundle>
-
-    <bean id="deviceIdCompleter" class="org.onosproject.cli.net.DeviceIdCompleter"/>
-    <bean id="targetConfigurationsCompleter" class="org.onosproject.netconf.cli.impl.completers.DatastoreIdCompleter"/>
-
-</blueprint>
diff --git a/protocols/netconf/ctl/src/test/java/org/onosproject/netconf/ctl/impl/NetconfControllerImplTest.java b/protocols/netconf/ctl/src/test/java/org/onosproject/netconf/ctl/impl/NetconfControllerImplTest.java
index 459559c..44011f1 100644
--- a/protocols/netconf/ctl/src/test/java/org/onosproject/netconf/ctl/impl/NetconfControllerImplTest.java
+++ b/protocols/netconf/ctl/src/test/java/org/onosproject/netconf/ctl/impl/NetconfControllerImplTest.java
@@ -58,6 +58,9 @@
 
 import static org.hamcrest.Matchers.*;
 import static org.junit.Assert.*;
+import static org.onosproject.netconf.ctl.impl.OsgiPropertyConstants.NETCONF_CONNECT_TIMEOUT_DEFAULT;
+import static org.onosproject.netconf.ctl.impl.OsgiPropertyConstants.NETCONF_IDLE_TIMEOUT_DEFAULT;
+import static org.onosproject.netconf.ctl.impl.OsgiPropertyConstants.NETCONF_REPLY_TIMEOUT_DEFAULT;
 
 /**
  * Unit tests for the Netconf controller implementation test.
@@ -125,9 +128,9 @@
         ctrl.deviceService = deviceService;
         ctrl.deviceKeyService = deviceKeyService;
         ctrl.netCfgService = netCfgService;
-        NetconfControllerImpl.netconfConnectTimeout = NetconfControllerImpl.DEFAULT_CONNECT_TIMEOUT_SECONDS;
-        NetconfControllerImpl.netconfIdleTimeout = NetconfControllerImpl.DEFAULT_IDLE_TIMEOUT_SECONDS;
-        NetconfControllerImpl.netconfReplyTimeout = NetconfControllerImpl.DEFAULT_REPLY_TIMEOUT_SECONDS;
+        NetconfControllerImpl.netconfConnectTimeout = NETCONF_CONNECT_TIMEOUT_DEFAULT;
+        NetconfControllerImpl.netconfIdleTimeout = NETCONF_IDLE_TIMEOUT_DEFAULT;
+        NetconfControllerImpl.netconfReplyTimeout = NETCONF_REPLY_TIMEOUT_DEFAULT;
 
         //Creating mock devices
         deviceInfo1 = new NetconfDeviceInfo("device1", "001", IpAddress.valueOf(DEVICE_1_IP), DEVICE_1_PORT);
@@ -183,9 +186,9 @@
     public void tearDown() {
         ctrl.deactivate();
         // resetting static variables..
-        NetconfControllerImpl.netconfConnectTimeout = NetconfControllerImpl.DEFAULT_CONNECT_TIMEOUT_SECONDS;
-        NetconfControllerImpl.netconfIdleTimeout = NetconfControllerImpl.DEFAULT_IDLE_TIMEOUT_SECONDS;
-        NetconfControllerImpl.netconfReplyTimeout = NetconfControllerImpl.DEFAULT_REPLY_TIMEOUT_SECONDS;
+        NetconfControllerImpl.netconfConnectTimeout = NETCONF_CONNECT_TIMEOUT_DEFAULT;
+        NetconfControllerImpl.netconfIdleTimeout = NETCONF_IDLE_TIMEOUT_DEFAULT;
+        NetconfControllerImpl.netconfReplyTimeout = NETCONF_REPLY_TIMEOUT_DEFAULT;
     }
 
     /**
diff --git a/protocols/openflow/api/BUCK b/protocols/openflow/api/BUCK
deleted file mode 100644
index 41fc729..0000000
--- a/protocols/openflow/api/BUCK
+++ /dev/null
@@ -1,16 +0,0 @@
-COMPILE_DEPS = [
-    '//lib:CORE_DEPS',
-    '//lib:NETTY',
-    '//lib:openflowj',
-    '//lib:io_netty_netty_transport',
-]
-
-TEST_DEPS = [
-    '//lib:TEST',
-    '//core/api:onos-api-tests',
-]
-
-osgi_jar_with_tests (
-    deps = COMPILE_DEPS,
-    test_deps = TEST_DEPS,
-)
diff --git a/protocols/openflow/ctl/BUCK b/protocols/openflow/ctl/BUCK
deleted file mode 100644
index 684fb64..0000000
--- a/protocols/openflow/ctl/BUCK
+++ /dev/null
@@ -1,23 +0,0 @@
-COMPILE_DEPS = [
-    '//lib:CORE_DEPS',
-    '//lib:JACKSON',
-    '//lib:openflowj',
-    '//lib:io_netty_netty_buffer',
-    '//lib:io_netty_netty_common',
-    '//lib:io_netty_netty_codec',
-    '//lib:io_netty_netty_handler',
-    '//lib:io_netty_netty_transport',
-    '//lib:io_netty_netty_transport_native_unix_common',
-    '//lib:io_netty_netty_transport-native-epoll',
-    '//protocols/openflow/api:onos-protocols-openflow-api',
-]
-
-TEST_DEPS = [
-    '//lib:TEST',
-    '//core/api:onos-api-tests',
-]
-
-osgi_jar_with_tests (
-    deps = COMPILE_DEPS,
-    test_deps = TEST_DEPS,
-)
diff --git a/protocols/openflow/ctl/src/main/java/org/onosproject/openflow/controller/impl/OpenFlowControllerImpl.java b/protocols/openflow/ctl/src/main/java/org/onosproject/openflow/controller/impl/OpenFlowControllerImpl.java
index bcf9edf..2d5213d 100644
--- a/protocols/openflow/ctl/src/main/java/org/onosproject/openflow/controller/impl/OpenFlowControllerImpl.java
+++ b/protocols/openflow/ctl/src/main/java/org/onosproject/openflow/controller/impl/OpenFlowControllerImpl.java
@@ -18,14 +18,6 @@
 import com.google.common.collect.ArrayListMultimap;
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.Multimap;
-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.onosproject.cfg.ComponentConfigService;
 import org.onosproject.core.CoreService;
 import org.onosproject.net.DeviceId;
@@ -48,6 +40,12 @@
 import org.onosproject.openflow.controller.RoleState;
 import org.onosproject.openflow.controller.driver.OpenFlowAgent;
 import org.osgi.service.component.ComponentContext;
+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.projectfloodlight.openflow.protocol.OFCalientFlowStatsEntry;
 import org.projectfloodlight.openflow.protocol.OFCalientFlowStatsReply;
 import org.projectfloodlight.openflow.protocol.OFCircuitPortStatus;
@@ -93,57 +91,59 @@
 import java.util.concurrent.locks.ReentrantLock;
 
 import static org.onlab.util.Tools.groupedThreads;
+import static org.onosproject.openflow.controller.impl.OsgiPropertyConstants.*;
 
-
-@Component(immediate = true)
-@Service
+@Component(
+        immediate = true,
+        service = OpenFlowController.class,
+        property = {
+                OFPORTS + "=" + OFPORTS_DEFAULT,
+                WORKER_THREADS + ":Integer=" + WORKER_THREADS_DEFAULT,
+                TLS_MODE + "=" + TLS_MODE_DEFAULT,
+                KEY_STORE + "=" + KEY_STORE_DEFAULT,
+                KEY_STORE_PASSWORD + "=" + KEY_STORE_PASSWORD_DEFAULT,
+                TRUST_STORE + "=" + TRUST_STORE_DEFAULT,
+                TRUST_STORE_PASSWORD + "=" + TRUST_STORE_PASSWORD_DEFAULT,
+        }
+)
 public class OpenFlowControllerImpl implements OpenFlowController {
     private static final String APP_ID = "org.onosproject.openflow-base";
-    private static final String DEFAULT_OFPORT = "6633,6653";
-    private static final int DEFAULT_WORKER_THREADS = 0;
     protected static final String SCHEME = "of";
 
     private static final Logger log =
             LoggerFactory.getLogger(OpenFlowControllerImpl.class);
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected CoreService coreService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected DriverService driverService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected ComponentConfigService cfgService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected NetworkConfigRegistry netCfgService;
 
-    @Property(name = "openflowPorts", value = DEFAULT_OFPORT,
-            label = "Port numbers (comma separated) used by OpenFlow protocol; default is 6633,6653")
-    private String openflowPorts = DEFAULT_OFPORT;
+    /** Port numbers (comma separated) used by OpenFlow protocol; default is 6633,6653. */
+    private String openflowPortsValue = OFPORTS_DEFAULT;
 
-    @Property(name = "workerThreads", intValue = DEFAULT_WORKER_THREADS,
-            label = "Number of controller worker threads")
-    private int workerThreads = DEFAULT_WORKER_THREADS;
+    /** Number of controller worker threads. */
+    private int workerThreads = WORKER_THREADS_DEFAULT;
 
-    @Property(name = "tlsMode", value = "",
-              label = "TLS mode for OpenFlow channel; options are: disabled [default], enabled, strict")
+      /** TLS mode for OpenFlow channel; options are: disabled [default], enabled, strict. */
     private String tlsModeString;
 
-    @Property(name = "keyStore", value = "",
-            label = "File path to key store for TLS connections")
+    /** File path to key store for TLS connections. */
     private String keyStore;
 
-    @Property(name = "keyStorePassword", value = "",
-            label = "Key store password")
+    /** Key store password. */
     private String keyStorePassword;
 
-    @Property(name = "trustStore", value = "",
-            label = "File path to trust store for TLS connections")
+    /** File path to trust store for TLS connections. */
     private String trustStore;
 
-    @Property(name = "trustStorePassword", value = "",
-            label = "Trust store password")
+    /** Trust store password. */
     private String trustStorePassword;
 
     protected ExecutorService executorMsgs =
diff --git a/protocols/openflow/ctl/src/main/java/org/onosproject/openflow/controller/impl/OsgiPropertyConstants.java b/protocols/openflow/ctl/src/main/java/org/onosproject/openflow/controller/impl/OsgiPropertyConstants.java
new file mode 100644
index 0000000..a152239
--- /dev/null
+++ b/protocols/openflow/ctl/src/main/java/org/onosproject/openflow/controller/impl/OsgiPropertyConstants.java
@@ -0,0 +1,49 @@
+/*
+ * Copyright 2018-present Open Networking Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.onosproject.openflow.controller.impl;
+
+/**
+ * Name/Value constants for properties.
+ */
+
+public final class OsgiPropertyConstants {
+
+    private OsgiPropertyConstants() {
+    }
+
+    public static final String OFPORTS = "openflowPorts";
+    public static final String OFPORTS_DEFAULT = "6633,6653";
+
+    public static final String WORKER_THREADS = "workerThreads";
+    public static final int WORKER_THREADS_DEFAULT = 0;
+
+    public static final String TLS_MODE = "tlsMode";
+    public static final String TLS_MODE_DEFAULT = "";
+
+    public static final String KEY_STORE = "keyStore";
+    public static final String KEY_STORE_DEFAULT = "";
+
+    public static final String KEY_STORE_PASSWORD = "keyStorePassword";
+    public static final String KEY_STORE_PASSWORD_DEFAULT = "";
+
+    public static final String TRUST_STORE = "trustStore";
+    public static final String TRUST_STORE_DEFAULT = "";
+
+    public static final String TRUST_STORE_PASSWORD = "trustStorePassword";
+    public static final String TRUST_STORE_PASSWORD_DEFAULT = "";
+
+}
diff --git a/protocols/ospf/api/BUCK b/protocols/ospf/api/BUCK
deleted file mode 100644
index 75c833b..0000000
--- a/protocols/ospf/api/BUCK
+++ /dev/null
@@ -1,11 +0,0 @@
-COMPILE_DEPS = [
-    '//lib:CORE_DEPS',
-    '//lib:NETTY',
-    '//lib:JACKSON',
-    '//lib:io_netty_netty',
-]
-
-osgi_jar_with_tests (
-    deps = COMPILE_DEPS,
-)
-
diff --git a/protocols/ospf/ctl/BUCK b/protocols/ospf/ctl/BUCK
deleted file mode 100644
index ec894cc..0000000
--- a/protocols/ospf/ctl/BUCK
+++ /dev/null
@@ -1,13 +0,0 @@
-COMPILE_DEPS = [
-    '//lib:CORE_DEPS',
-    '//lib:NETTY',
-    '//lib:JACKSON',
-    '//protocols/ospf/api:onos-protocols-ospf-api',
-    '//protocols/ospf/protocol:onos-protocols-ospf-protocol',
-    '//lib:io_netty_netty',
-]
-
-osgi_jar_with_tests (
-    deps = COMPILE_DEPS,
-)
-
diff --git a/protocols/ospf/ctl/src/main/java/org/onosproject/ospf/controller/impl/OspfControllerImpl.java b/protocols/ospf/ctl/src/main/java/org/onosproject/ospf/controller/impl/OspfControllerImpl.java
index a9c3309..dc63617 100644
--- a/protocols/ospf/ctl/src/main/java/org/onosproject/ospf/controller/impl/OspfControllerImpl.java
+++ b/protocols/ospf/ctl/src/main/java/org/onosproject/ospf/controller/impl/OspfControllerImpl.java
@@ -18,12 +18,6 @@
 
 import com.fasterxml.jackson.databind.JsonNode;
 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.net.driver.DriverService;
 import org.onosproject.ospf.controller.OspfAgent;
 import org.onosproject.ospf.controller.OspfController;
@@ -32,6 +26,11 @@
 import org.onosproject.ospf.controller.OspfProcess;
 import org.onosproject.ospf.controller.OspfRouter;
 import org.onosproject.ospf.controller.OspfRouterListener;
+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;
 
@@ -43,13 +42,12 @@
  * Representation of an OSPF controller implementation.
  * Serves as a one stop shop for obtaining OSPF devices and (un)register listeners on OSPF events
  */
-@Component(immediate = true)
-@Service
+@Component(immediate = true, service = OspfController.class)
 public class OspfControllerImpl implements OspfController {
 
     private static final Logger log = LoggerFactory.getLogger(OspfControllerImpl.class);
     private final Controller ctrl = new Controller();
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected DriverService driverService;
     protected Set<OspfRouterListener> ospfRouterListener = new HashSet<>();
     protected Set<OspfLinkListener> ospfLinkListener = Sets.newHashSet();
diff --git a/protocols/ospf/protocol/BUCK b/protocols/ospf/protocol/BUCK
deleted file mode 100644
index 46a8746..0000000
--- a/protocols/ospf/protocol/BUCK
+++ /dev/null
@@ -1,10 +0,0 @@
-COMPILE_DEPS = [
-    '//lib:CORE_DEPS',
-    '//lib:NETTY',
-    '//protocols/ospf/api:onos-protocols-ospf-api',
-    '//lib:io_netty_netty',
-]
-
-osgi_jar_with_tests (
-    deps = COMPILE_DEPS,
-)
diff --git a/protocols/ospf/protocol/BUILD b/protocols/ospf/protocol/BUILD
index 6543146..7de13a9 100644
--- a/protocols/ospf/protocol/BUILD
+++ b/protocols/ospf/protocol/BUILD
@@ -1,4 +1,4 @@
-COMPILE_DEPS = CORE_DEPS + NETTY + [
+COMPILE_DEPS = CORE_DEPS + NETTY + JAXB + [
     "@io_netty_netty//jar",
     "//protocols/ospf/api:onos-protocols-ospf-api",
 ]
diff --git a/protocols/ovsdb/api/BUCK b/protocols/ovsdb/api/BUCK
deleted file mode 100644
index f9b5802..0000000
--- a/protocols/ovsdb/api/BUCK
+++ /dev/null
@@ -1,12 +0,0 @@
-COMPILE_DEPS = [
-    '//lib:CORE_DEPS',
-    '//lib:NETTY',
-    '//lib:JACKSON',
-    '//lib:io_netty_netty_transport',
-    '//protocols/ovsdb/rfc:onos-protocols-ovsdb-rfc',
-]
-
-osgi_jar_with_tests (
-    deps = COMPILE_DEPS,
-)
-
diff --git a/protocols/ovsdb/api/src/main/java/org/onosproject/ovsdb/controller/OvsdbConstant.java b/protocols/ovsdb/api/src/main/java/org/onosproject/ovsdb/controller/OvsdbConstant.java
index ddd93eb..ee13e4c 100644
--- a/protocols/ovsdb/api/src/main/java/org/onosproject/ovsdb/controller/OvsdbConstant.java
+++ b/protocols/ovsdb/api/src/main/java/org/onosproject/ovsdb/controller/OvsdbConstant.java
@@ -127,9 +127,4 @@
 
     public static final boolean OVSDB_TLS_FLAG = false;
 
-    //TODO CONFIG_DIR is duplicated from ConfigFileBasedClusterMetadataProvider
-    public static final String CONFIG_DIR = "../config/";
-    public static final String KS_FILE_NAME = "onos.jks";
-    public static final String DEFAULT_KS_FILE = CONFIG_DIR + KS_FILE_NAME;
-    public static final String DEFAULT_KS_PASSWORD = "222222";
 }
diff --git a/protocols/ovsdb/ctl/BUCK b/protocols/ovsdb/ctl/BUCK
deleted file mode 100644
index bd40154..0000000
--- a/protocols/ovsdb/ctl/BUCK
+++ /dev/null
@@ -1,16 +0,0 @@
-COMPILE_DEPS = [
-    '//lib:CORE_DEPS',
-    '//lib:NETTY',
-    '//lib:JACKSON',
-    '//lib:io_netty_netty_transport',
-    '//lib:io_netty_netty_buffer',
-    '//lib:io_netty_netty_codec',
-    '//lib:io_netty_netty_handler',
-    '//protocols/ovsdb/rfc:onos-protocols-ovsdb-rfc',
-    '//protocols/ovsdb/api:onos-protocols-ovsdb-api',
-]
-
-osgi_jar_with_tests (
-    deps = COMPILE_DEPS,
-)
-
diff --git a/protocols/ovsdb/ctl/src/main/java/org/onosproject/ovsdb/controller/impl/OsgiPropertyConstants.java b/protocols/ovsdb/ctl/src/main/java/org/onosproject/ovsdb/controller/impl/OsgiPropertyConstants.java
new file mode 100644
index 0000000..44630c9
--- /dev/null
+++ b/protocols/ovsdb/ctl/src/main/java/org/onosproject/ovsdb/controller/impl/OsgiPropertyConstants.java
@@ -0,0 +1,44 @@
+/*
+ * Copyright 2018-present Open Networking Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.onosproject.ovsdb.controller.impl;
+
+/**
+ * Constants for default values of configurable properties.
+ */
+public final class OsgiPropertyConstants {
+
+    private OsgiPropertyConstants() {}
+
+    public static final String SERVER_MODE = "";
+    public static final boolean SERVER_MODE_DEFAULT = false;
+
+    public static final String OVSDB_TLS_FLAG = "enableOvsdbTls";
+    public static final boolean OVSDB_TLS_FLAG_DEFAULT = false;
+
+    public static final String KS_FILE = "keyStoreLocation";
+    public static final String KS_FILE_DEFAULT = "../config/onos.jks";
+
+    public static final String TS_FILE = "trustStoreLocation";
+    public static final String TS_FILE_DEFAULT = "../config/onos.jks";
+
+    public static final String KS_PASSWORD = "keyStorePassword";
+    public static final String KS_PASSWORD_DEFAULT = "222222";
+
+    public static final String TS_PASSWORD = "trustStorePassword";
+    public static final String TS_PASSWORD_DEFAULT = "222222";
+
+}
diff --git a/protocols/ovsdb/ctl/src/main/java/org/onosproject/ovsdb/controller/impl/OvsdbControllerImpl.java b/protocols/ovsdb/ctl/src/main/java/org/onosproject/ovsdb/controller/impl/OvsdbControllerImpl.java
index 11bfaae..428a411 100644
--- a/protocols/ovsdb/ctl/src/main/java/org/onosproject/ovsdb/controller/impl/OvsdbControllerImpl.java
+++ b/protocols/ovsdb/ctl/src/main/java/org/onosproject/ovsdb/controller/impl/OvsdbControllerImpl.java
@@ -18,14 +18,6 @@
 import com.fasterxml.jackson.databind.JsonNode;
 import com.google.common.base.Strings;
 import com.google.common.collect.ImmutableList;
-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.packet.IpAddress;
 import org.onlab.packet.MacAddress;
 import org.onlab.packet.TpPort;
@@ -63,6 +55,12 @@
 import org.onosproject.ovsdb.rfc.table.TableGenerator;
 import org.onosproject.ovsdb.rfc.utils.FromJsonUtil;
 import org.osgi.service.component.ComponentContext;
+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 org.slf4j.LoggerFactory;
 
@@ -83,17 +81,21 @@
 
 import static com.google.common.base.Preconditions.checkNotNull;
 import static org.onlab.util.Tools.get;
-import static org.onosproject.ovsdb.controller.OvsdbConstant.SERVER_MODE;
-import static org.onosproject.ovsdb.controller.OvsdbConstant.DEFAULT_KS_PASSWORD;
-import static org.onosproject.ovsdb.controller.OvsdbConstant.DEFAULT_KS_FILE;
-import static org.onosproject.ovsdb.controller.OvsdbConstant.OVSDB_TLS_FLAG;
 import static org.onosproject.ovsdb.controller.impl.Controller.MIN_KS_LENGTH;
+import static org.onosproject.ovsdb.controller.impl.OsgiPropertyConstants.*;
 
 /**
  * The implementation of OvsdbController.
  */
-@Component(immediate = true)
-@Service
+@Component(immediate = true, service = OvsdbController.class,
+        property = {
+                "serverMode" + ":Boolean=" + SERVER_MODE_DEFAULT,
+                "enableOvsdbTls" + ":Boolean=" + OVSDB_TLS_FLAG_DEFAULT,
+                "keyStoreLocation" + "=" + KS_FILE_DEFAULT,
+                "keyStorePassword" + "=" + KS_PASSWORD_DEFAULT,
+                "trustStoreLocation" + "=" + TS_FILE_DEFAULT,
+                "trustStorePassword" + "=" + TS_PASSWORD_DEFAULT,
+        })
 public class OvsdbControllerImpl implements OvsdbController {
 
     public static final Logger log = LoggerFactory
@@ -110,32 +112,26 @@
             new ConcurrentHashMap<>();
     protected ConcurrentHashMap<String, String> requestDbName = new ConcurrentHashMap<>();
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected ComponentConfigService configService;
 
-    @Property(name = "serverMode", boolValue = SERVER_MODE,
-            label = "Run as server mode, listen on 6640 port")
-    private boolean serverMode = SERVER_MODE;
+    /** Run as server mode, listen on 6640 port. */
+    private boolean serverMode = SERVER_MODE_DEFAULT;
 
-    @Property(name = "enableOvsdbTls", boolValue = OVSDB_TLS_FLAG,
-            label = "TLS mode for OVSDB channel; options are: true false")
-    private boolean enableOvsdbTls = OVSDB_TLS_FLAG;
+    /** TLS mode for OVSDB channel; options are: true false. */
+    private boolean enableOvsdbTls = OVSDB_TLS_FLAG_DEFAULT;
 
-    @Property(name = "keyStoreLocation", value = DEFAULT_KS_FILE,
-            label = "File path to KeyStore for Ovsdb TLS Connections")
-    protected String keyStoreLocation = DEFAULT_KS_FILE;
+    /** File path to KeyStore for Ovsdb TLS Connections. */
+    protected String keyStoreLocation = KS_FILE_DEFAULT;
 
-    @Property(name = "trustStoreLocation", value = DEFAULT_KS_FILE,
-            label = "File path to TrustStore for Ovsdb TLS Connections")
-    protected String trustStoreLocation = DEFAULT_KS_FILE;
+    /** File path to TrustStore for Ovsdb TLS Connections. */
+    protected String trustStoreLocation = TS_FILE_DEFAULT;
 
-    @Property(name = "keyStorePassword", value = DEFAULT_KS_PASSWORD,
-            label = "KeyStore Password")
-    protected String keyStorePassword = DEFAULT_KS_PASSWORD;
+    /** KeyStore Password. */
+    protected String keyStorePassword = KS_PASSWORD_DEFAULT;
 
-    @Property(name = "trustStorePassword", value = DEFAULT_KS_PASSWORD,
-            label = "TrustStore Password")
-    protected String trustStorePassword = DEFAULT_KS_PASSWORD;
+    /** TrustStore Password. */
+    protected String trustStorePassword = TS_PASSWORD_DEFAULT;
 
     @Activate
     public void activate(ComponentContext context) {
@@ -183,7 +179,7 @@
     private TlsParams getTlsParams(Dictionary<?, ?> properties) {
         TlsMode mode = null;
 
-        boolean flag = Tools.isPropertyEnabled(properties, "enableOvsdbTls");
+        boolean flag = Tools.isPropertyEnabled(properties, OVSDB_TLS_FLAG);
         if (Objects.isNull(flag) || !flag) {
             log.warn("OvsdbTLS Disabled");
             mode = TlsMode.DISABLED;
@@ -194,25 +190,25 @@
 
         String ksLocation = null, tsLocation = null, ksPwd = null, tsPwd = null;
 
-        ksLocation = get(properties, "keyStoreLocation");
+        ksLocation = get(properties, KS_FILE);
         if (Strings.isNullOrEmpty(ksLocation)) {
             log.warn("trustStoreLocation is not configured");
             mode = TlsMode.DISABLED;
         }
 
-        tsLocation = get(properties, "trustStoreLocation");
+        tsLocation = get(properties, TS_FILE);
         if (Strings.isNullOrEmpty(tsLocation)) {
             log.warn("trustStoreLocation is not configured");
             mode = TlsMode.DISABLED;
         }
 
-        ksPwd = get(properties, "keyStorePassword");
+        ksPwd = get(properties, KS_PASSWORD);
         if (Strings.isNullOrEmpty(ksPwd) || MIN_KS_LENGTH > ksPwd.length()) {
             log.warn("keyStorePassword is not configured or Password length too small");
             mode = TlsMode.DISABLED;
         }
 
-        tsPwd = get(properties, "trustStorePassword");
+        tsPwd = get(properties, TS_PASSWORD);
         if (Strings.isNullOrEmpty(tsPwd) || MIN_KS_LENGTH > tsPwd.length()) {
             log.warn("trustStorePassword is not configured or Password length too small");
             mode = TlsMode.DISABLED;
diff --git a/protocols/ovsdb/ctl/src/main/java/org/onosproject/ovsdb/controller/impl/TlsParams.java b/protocols/ovsdb/ctl/src/main/java/org/onosproject/ovsdb/controller/impl/TlsParams.java
index dfe7fa9..f71f8fa 100644
--- a/protocols/ovsdb/ctl/src/main/java/org/onosproject/ovsdb/controller/impl/TlsParams.java
+++ b/protocols/ovsdb/ctl/src/main/java/org/onosproject/ovsdb/controller/impl/TlsParams.java
@@ -29,8 +29,7 @@
 import java.util.EnumSet;
 import java.util.Objects;
 
-import static org.onosproject.ovsdb.controller.OvsdbConstant.DEFAULT_KS_FILE;
-import static org.onosproject.ovsdb.controller.OvsdbConstant.DEFAULT_KS_PASSWORD;
+import static org.onosproject.ovsdb.controller.impl.OsgiPropertyConstants.*;
 
 /**
  * TlsParams Class for properties required for configuring OVSDB TLS Connection.
@@ -69,10 +68,10 @@
      */
     TlsParams() {
         this.mode = TlsMode.DISABLED;
-        this.ksLocation = DEFAULT_KS_FILE;
-        this.tsLocation = DEFAULT_KS_FILE;
-        this.ksPwd = DEFAULT_KS_PASSWORD;
-        this.tsPwd = DEFAULT_KS_PASSWORD;
+        this.ksLocation = KS_FILE_DEFAULT;
+        this.tsLocation = TS_FILE_DEFAULT;
+        this.ksPwd = KS_PASSWORD_DEFAULT;
+        this.tsPwd = TS_PASSWORD_DEFAULT;
         this.ksSignature = getSha1Checksum(ksLocation);
         this.tsSignature = getSha1Checksum(tsLocation);
     }
diff --git a/protocols/ovsdb/rfc/BUCK b/protocols/ovsdb/rfc/BUCK
deleted file mode 100644
index 47f8625..0000000
--- a/protocols/ovsdb/rfc/BUCK
+++ /dev/null
@@ -1,12 +0,0 @@
-COMPILE_DEPS = [
-    '//lib:CORE_DEPS',
-    '//lib:NETTY',
-    '//lib:JACKSON',
-    '//lib:io_netty_netty_buffer',
-    '//lib:io_netty_netty_codec',
-]
-
-osgi_jar_with_tests (
-    deps = COMPILE_DEPS,
-)
-
diff --git a/protocols/p4runtime/BUCK b/protocols/p4runtime/BUCK
deleted file mode 100644
index 9668a16..0000000
--- a/protocols/p4runtime/BUCK
+++ /dev/null
@@ -1,18 +0,0 @@
-BUNDLES = [
-    '//protocols/p4runtime/proto:onos-protocols-p4runtime-proto',
-    '//protocols/p4runtime/api:onos-protocols-p4runtime-api',
-    '//protocols/p4runtime/ctl:onos-protocols-p4runtime-ctl',
-    '//protocols/p4runtime/model:onos-protocols-p4runtime-model',
-]
-
-onos_app(
-    app_name = 'org.onosproject.protocols.p4runtime',
-    title = 'P4Runtime Protocol Subsystem',
-    category = 'Protocol',
-    url = 'http://onosproject.org',
-    description = 'ONOS P4Runtime protocol subsystem',
-    included_bundles = BUNDLES,
-    required_apps = [
-        'org.onosproject.protocols.grpc'
-    ],
-)
diff --git a/protocols/p4runtime/api/BUCK b/protocols/p4runtime/api/BUCK
deleted file mode 100644
index fd05763..0000000
--- a/protocols/p4runtime/api/BUCK
+++ /dev/null
@@ -1,17 +0,0 @@
-GRPC_VER = '1.3.1'
-
-COMPILE_DEPS = [
-    '//lib:CORE_DEPS',
-    '//incubator/grpc-dependencies:grpc-core-repkg-' + GRPC_VER,
-]
-
-TEST_DEPS = [
-    '//core/api:onos-api-tests',
-    '//lib:TEST',
-    '//protocols/p4runtime/api:onos-protocols-p4runtime-api',
-]
-
-osgi_jar_with_tests(
-    deps = COMPILE_DEPS,
-    test_deps = TEST_DEPS,
-)
diff --git a/protocols/p4runtime/ctl/BUCK b/protocols/p4runtime/ctl/BUCK
deleted file mode 100644
index 343d3b2..0000000
--- a/protocols/p4runtime/ctl/BUCK
+++ /dev/null
@@ -1,28 +0,0 @@
-# Buck build of P4-related modules is no longer supported, please use Bazel
-# GRPC_VER = '1.3.1'
-# PROTOBUF_VER = '3.2.0'
-#
-# COMPILE_DEPS = [
-#     '//lib:CORE_DEPS',
-#     '//lib:KRYO',
-#     '//protocols/grpc/api:onos-protocols-grpc-api',
-#     '//protocols/p4runtime/api:onos-protocols-p4runtime-api',
-#     '//protocols/p4runtime/proto:onos-protocols-p4runtime-proto',
-#     '//incubator/grpc-dependencies:grpc-core-repkg-' + GRPC_VER,
-#     '//lib:grpc-stub-' + GRPC_VER,
-#     '//lib:grpc-netty-' + GRPC_VER,
-#     '//lib:protobuf-java-' + PROTOBUF_VER,
-#     '//core/store/serializers:onos-core-serializers',
-# ]
-#
-# TEST_DEPS = [
-#     '//lib:TEST',
-#     '//lib:GRPC_TEST_1.3',
-#     '//lib:minimal-json',
-#     '//lib:grpc-protobuf-lite-' + GRPC_VER,
-# ]
-#
-# osgi_jar_with_tests(
-#     deps = COMPILE_DEPS,
-#     test_deps = TEST_DEPS,
-# )
diff --git a/protocols/p4runtime/ctl/src/main/java/org/onosproject/p4runtime/ctl/P4RuntimeControllerImpl.java b/protocols/p4runtime/ctl/src/main/java/org/onosproject/p4runtime/ctl/P4RuntimeControllerImpl.java
index a140491..953f1ff 100644
--- a/protocols/p4runtime/ctl/src/main/java/org/onosproject/p4runtime/ctl/P4RuntimeControllerImpl.java
+++ b/protocols/p4runtime/ctl/src/main/java/org/onosproject/p4runtime/ctl/P4RuntimeControllerImpl.java
@@ -21,12 +21,6 @@
 import io.grpc.ManagedChannel;
 import io.grpc.ManagedChannelBuilder;
 import io.grpc.netty.NettyChannelBuilder;
-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.event.AbstractListenerManager;
 import org.onosproject.grpc.api.GrpcChannelId;
 import org.onosproject.grpc.api.GrpcController;
@@ -39,6 +33,11 @@
 import org.onosproject.p4runtime.api.P4RuntimeEvent;
 import org.onosproject.p4runtime.api.P4RuntimeEventListener;
 import org.onosproject.store.service.StorageService;
+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.io.IOException;
@@ -55,8 +54,7 @@
 /**
  * P4Runtime controller implementation.
  */
-@Component(immediate = true)
-@Service
+@Component(immediate = true, service = P4RuntimeController.class)
 public class P4RuntimeControllerImpl
         extends AbstractListenerManager<P4RuntimeEvent, P4RuntimeEventListener>
         implements P4RuntimeController {
@@ -77,10 +75,10 @@
 
     private DistributedElectionIdGenerator electionIdGenerator;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     private GrpcController grpcController;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     private StorageService storageService;
 
     @Activate
diff --git a/protocols/p4runtime/model/BUCK b/protocols/p4runtime/model/BUCK
deleted file mode 100644
index 61e5d49..0000000
--- a/protocols/p4runtime/model/BUCK
+++ /dev/null
@@ -1,14 +0,0 @@
-PROTOBUF_VER = '3.2.0'
-
-COMPILE_DEPS = [
-    '//lib:CORE_DEPS',
-    '//protocols/p4runtime/proto:onos-protocols-p4runtime-proto',
-    '//lib:protobuf-java-' + PROTOBUF_VER,
-]
-
-TEST_DEPS = [
-]
-
-osgi_jar_with_tests(
-    deps = COMPILE_DEPS + TEST_DEPS,
-)
diff --git a/protocols/p4runtime/proto/BUCK b/protocols/p4runtime/proto/BUCK
deleted file mode 100644
index 27a8ef6..0000000
--- a/protocols/p4runtime/proto/BUCK
+++ /dev/null
@@ -1,57 +0,0 @@
-include_defs(
-    '//bucklets/grpc.bucklet'
-)
-
-PROTOBUF_VER = '3.2.0'
-GRPC_VER = '1.3.1'
-
-PI_COMMIT = '7e94b025bac6db63bc8534e5dd21a008984e38bc'
-PI_BASEURL = 'https://github.com/p4lang/PI.git'
-
-# Wondering which .proto files to build? Check p4runtime's Makefile:
-# https://github.com/p4lang/PI/blob/master/proto/Makefile.am
-PROTO_SRCS = [
-    '/proto/p4/v1/p4runtime.proto',
-    '/proto/p4/v1/p4data.proto',
-    '/proto/p4/config/v1/p4info.proto',
-    '/proto/p4/config/v1/p4types.proto',
-    '/proto/p4/tmp/p4config.proto',
-    '/proto/google/rpc/status.proto',
-    '/proto/google/rpc/code.proto',
-]
-
-COMPILE_DEPS =[
-    '//lib:CORE_DEPS',
-    '//incubator/grpc-dependencies:grpc-core-repkg-' + GRPC_VER,
-    '//lib:grpc-stub-' + GRPC_VER,
-    '//lib:grpc-protobuf-' + GRPC_VER,
-    '//lib:protobuf-java-' + PROTOBUF_VER,
-]
-
-genrule(
-    name = 'p4lang-pi-repo-' + PI_COMMIT,
-    bash = 'git clone --quiet ' + PI_BASEURL + ' $OUT > /dev/null && '
-            + 'cd $OUT && '
-            + 'git checkout --quiet -b buck-build ' + PI_COMMIT + ' > /dev/null && '
-            + 'git submodule update --quiet --init --recursive > /dev/null',
-    out = 'repo',
-)
-
-def get_proto_src_string():
-    proto_srcs = map(lambda x: "$(location :p4lang-pi-repo-%s)%s"  % (PI_COMMIT, x), PROTO_SRCS)
-    return " ".join(proto_srcs)
-
-grpc_jar(
-    src_string = get_proto_src_string(),
-    proto_paths = [
-        '$(location :p4lang-pi-repo-' + PI_COMMIT + ')/proto',
-    ],
-    protoc_version = PROTOBUF_VER,
-    plugin_version = GRPC_VER,
-    deps = COMPILE_DEPS,
-    include_std_lib = True,
-)
-
-project_config(
-    src_target = ':onos-protocols-p4runtime-proto'
-)
diff --git a/protocols/pcep/pcepio/BUCK b/protocols/pcep/pcepio/BUCK
deleted file mode 100644
index e02623d..0000000
--- a/protocols/pcep/pcepio/BUCK
+++ /dev/null
@@ -1,15 +0,0 @@
-COMPILE_DEPS = [
-    '//lib:CORE_DEPS',
-    '//lib:NETTY',
-    '//lib:jackson-databind',
-    '//lib:jackson-annotations',
-    '//lib:osgi-core',
-    '//lib:org.apache.karaf.shell.console',
-    '//lib:org.apache.felix.scr.annotations',
-    '//lib:io_netty_netty',
-]
-
-osgi_jar_with_tests (
-    deps = COMPILE_DEPS,
-)
-
diff --git a/protocols/pcep/server/BUCK b/protocols/pcep/server/BUCK
deleted file mode 100644
index 1835e30..0000000
--- a/protocols/pcep/server/BUCK
+++ /dev/null
@@ -1,11 +0,0 @@
-BUNDLES = [
-    '//protocols/pcep/server/api:onos-protocols-pcep-server-api',
-    '//protocols/pcep/server/ctl:onos-protocols-pcep-server-ctl',
-]
-
-onos_app (
-  title = 'PCEP Server Module',
-  category = 'Utility',
-  url = 'http://onosproject.org',
-  included_bundles = BUNDLES,
-)
diff --git a/protocols/pcep/server/api/BUCK b/protocols/pcep/server/api/BUCK
deleted file mode 100644
index 4c26105..0000000
--- a/protocols/pcep/server/api/BUCK
+++ /dev/null
@@ -1,12 +0,0 @@
-COMPILE_DEPS = [
-    '//lib:CORE_DEPS',
-    '//protocols/pcep/pcepio:onos-protocols-pcep-pcepio',
-    '//apps/pcep-api:onos-apps-pcep-api',
-    '//incubator/api:onos-incubator-api',
-    '//lib:io_netty_netty',
-]
-
-osgi_jar_with_tests (
-    deps = COMPILE_DEPS,
-)
-
diff --git a/protocols/pcep/server/api/src/test/java/org/onosproject/pcep/server/PcepClientControllerAdapter.java b/protocols/pcep/server/api/src/test/java/org/onosproject/pcep/server/PcepClientControllerAdapter.java
index 80e6561..b5e448e 100644
--- a/protocols/pcep/server/api/src/test/java/org/onosproject/pcep/server/PcepClientControllerAdapter.java
+++ b/protocols/pcep/server/api/src/test/java/org/onosproject/pcep/server/PcepClientControllerAdapter.java
@@ -17,8 +17,8 @@
 
 
 import com.google.common.collect.Sets;
-import org.apache.felix.scr.annotations.Activate;
-import org.apache.felix.scr.annotations.Deactivate;
+import org.osgi.service.component.annotations.Activate;
+import org.osgi.service.component.annotations.Deactivate;
 import org.onlab.packet.IpAddress;
 import org.onosproject.incubator.net.tunnel.DefaultLabelStack;
 import org.onosproject.incubator.net.tunnel.LabelStack;
diff --git a/protocols/pcep/server/ctl/BUCK b/protocols/pcep/server/ctl/BUCK
deleted file mode 100644
index 5295876..0000000
--- a/protocols/pcep/server/ctl/BUCK
+++ /dev/null
@@ -1,25 +0,0 @@
-COMPILE_DEPS = [
-    '//lib:CORE_DEPS',
-    '//lib:NETTY',
-    '//lib:JACKSON',
-    '//lib:KRYO',
-    '//incubator/api:onos-incubator-api',
-    '//protocols/pcep/pcepio:onos-protocols-pcep-pcepio',
-    '//protocols/pcep/server/api:onos-protocols-pcep-server-api',
-    '//core/store/serializers:onos-core-serializers',
-    '//apps/pcep-api:onos-apps-pcep-api',
-    '//lib:io_netty_netty',
-]
-
-TEST_DEPS = [
-    '//lib:TEST',
-    '//lib:TEST_ADAPTERS',
-    '//incubator/api:onos-incubator-api-tests',
-    '//protocols/pcep/server/api:onos-protocols-pcep-server-api-tests',
-]
-
-osgi_jar_with_tests (
-    deps = COMPILE_DEPS,
-    test_deps = TEST_DEPS,
-)
-
diff --git a/protocols/pcep/server/ctl/src/main/java/org/onosproject/pcelabelstore/DistributedPceLabelStore.java b/protocols/pcep/server/ctl/src/main/java/org/onosproject/pcelabelstore/DistributedPceLabelStore.java
index 4c6a3cf..6288134 100644
--- a/protocols/pcep/server/ctl/src/main/java/org/onosproject/pcelabelstore/DistributedPceLabelStore.java
+++ b/protocols/pcep/server/ctl/src/main/java/org/onosproject/pcelabelstore/DistributedPceLabelStore.java
@@ -15,25 +15,10 @@
  */
 package org.onosproject.pcelabelstore;
 
-import static com.google.common.base.Preconditions.checkNotNull;
-
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.stream.Collectors;
-
-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.KryoNamespace;
-import org.onosproject.incubator.net.tunnel.TunnelId;
 import org.onosproject.incubator.net.resource.label.LabelResource;
 import org.onosproject.incubator.net.resource.label.LabelResourceId;
+import org.onosproject.incubator.net.tunnel.TunnelId;
 import org.onosproject.net.DeviceId;
 import org.onosproject.net.Link;
 import org.onosproject.pcelabelstore.api.LspLocalLabelInfo;
@@ -42,15 +27,26 @@
 import org.onosproject.store.service.ConsistentMap;
 import org.onosproject.store.service.Serializer;
 import org.onosproject.store.service.StorageService;
-
+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.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+import static com.google.common.base.Preconditions.checkNotNull;
+
 /**
  * Manages the pool of available labels to devices, links and tunnels.
  */
-@Component(immediate = true)
-@Service
+@Component(immediate = true, service = PceLabelStore.class)
 public class DistributedPceLabelStore implements PceLabelStore {
 
     private static final String DEVICE_ID_NULL = "Device ID cannot be null";
@@ -61,7 +57,7 @@
 
     private final Logger log = LoggerFactory.getLogger(getClass());
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected StorageService storageService;
 
     // Mapping device with global node label
diff --git a/protocols/pcep/server/ctl/src/main/java/org/onosproject/pcep/server/impl/PcepClientControllerImpl.java b/protocols/pcep/server/ctl/src/main/java/org/onosproject/pcep/server/impl/PcepClientControllerImpl.java
index 1bb5610..2624804 100644
--- a/protocols/pcep/server/ctl/src/main/java/org/onosproject/pcep/server/impl/PcepClientControllerImpl.java
+++ b/protocols/pcep/server/ctl/src/main/java/org/onosproject/pcep/server/impl/PcepClientControllerImpl.java
@@ -15,27 +15,7 @@
  */
 package org.onosproject.pcep.server.impl;
 
-import java.util.Map;
-import java.util.TreeMap;
-import java.util.List;
-import java.util.LinkedList;
-import java.util.Set;
-import java.util.HashSet;
-import java.util.HashMap;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.ListIterator;
-import java.util.Arrays;
-import java.util.Iterator;
-import java.util.Map.Entry;
-import java.util.concurrent.ConcurrentHashMap;
-
-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.Sets;
 import org.onlab.packet.Ip4Address;
 import org.onlab.packet.IpAddress;
 import org.onosproject.incubator.net.resource.label.LabelResourceAdminService;
@@ -46,8 +26,8 @@
 import org.onosproject.incubator.net.tunnel.IpTunnelEndPoint;
 import org.onosproject.incubator.net.tunnel.LabelStack;
 import org.onosproject.incubator.net.tunnel.Tunnel;
-import org.onosproject.incubator.net.tunnel.TunnelService;
 import org.onosproject.incubator.net.tunnel.Tunnel.State;
+import org.onosproject.incubator.net.tunnel.TunnelService;
 import org.onosproject.mastership.MastershipService;
 import org.onosproject.net.DefaultAnnotations;
 import org.onosproject.net.DefaultAnnotations.Builder;
@@ -100,64 +80,81 @@
 import org.onosproject.pcepio.types.SrEroSubObject;
 import org.onosproject.pcepio.types.StatefulIPv4LspIdentifiersTlv;
 import org.onosproject.pcepio.types.SymbolicPathNameTlv;
+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 com.google.common.collect.Sets;
-import static com.google.common.base.Preconditions.checkNotNull;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.ListIterator;
+import java.util.Map;
+import java.util.Map.Entry;
+import java.util.Set;
+import java.util.TreeMap;
+import java.util.concurrent.ConcurrentHashMap;
 
-import static org.onosproject.pcep.server.PcepSyncStatus.IN_SYNC;
+import static com.google.common.base.Preconditions.checkNotNull;
 import static org.onosproject.pcep.server.LspType.WITHOUT_SIGNALLING_AND_WITHOUT_SR;
 import static org.onosproject.pcep.server.LspType.WITH_SIGNALLING;
-import static org.onosproject.pcep.server.PcepLspSyncAction.REMOVE;
-import static org.onosproject.pcep.server.PcepLspSyncAction.SEND_UPDATE;
-import static org.onosproject.pcep.server.PcepLspSyncAction.UNSTABLE;
-import static org.onosproject.pcepio.types.PcepErrorDetailInfo.ERROR_TYPE_19;
-import static org.onosproject.pcepio.types.PcepErrorDetailInfo.ERROR_VALUE_5;
 import static org.onosproject.pcep.server.PcepAnnotationKeys.BANDWIDTH;
+import static org.onosproject.pcep.server.PcepAnnotationKeys.COST_TYPE;
+import static org.onosproject.pcep.server.PcepAnnotationKeys.DELEGATE;
 import static org.onosproject.pcep.server.PcepAnnotationKeys.LOCAL_LSP_ID;
 import static org.onosproject.pcep.server.PcepAnnotationKeys.LSP_SIG_TYPE;
 import static org.onosproject.pcep.server.PcepAnnotationKeys.PCC_TUNNEL_ID;
 import static org.onosproject.pcep.server.PcepAnnotationKeys.PCE_INIT;
 import static org.onosproject.pcep.server.PcepAnnotationKeys.PLSP_ID;
-import static org.onosproject.pcep.server.PcepAnnotationKeys.DELEGATE;
-import static org.onosproject.pcep.server.PcepAnnotationKeys.COST_TYPE;
-import static org.onosproject.pcep.server.PcepSyncStatus.SYNCED;
+import static org.onosproject.pcep.server.PcepLspSyncAction.REMOVE;
+import static org.onosproject.pcep.server.PcepLspSyncAction.SEND_UPDATE;
+import static org.onosproject.pcep.server.PcepLspSyncAction.UNSTABLE;
+import static org.onosproject.pcep.server.PcepSyncStatus.IN_SYNC;
 import static org.onosproject.pcep.server.PcepSyncStatus.NOT_SYNCED;
+import static org.onosproject.pcep.server.PcepSyncStatus.SYNCED;
+import static org.onosproject.pcepio.types.PcepErrorDetailInfo.ERROR_TYPE_19;
+import static org.onosproject.pcepio.types.PcepErrorDetailInfo.ERROR_VALUE_5;
 
 /**
  * Implementation of PCEP client controller.
  */
-@Component(immediate = true)
-@Service
+@Component(immediate = true, service = PcepClientController.class)
 public class PcepClientControllerImpl implements PcepClientController {
 
     private static final Logger log = LoggerFactory.getLogger(PcepClientControllerImpl.class);
     private static final long IDENTIFIER_SET = 0x100000000L;
     private static final long SET = 0xFFFFFFFFL;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected DeviceService deviceService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected LinkService linkService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected TunnelService tunnelService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected NetworkConfigService netCfgService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected MastershipService mastershipService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected LabelResourceAdminService labelRsrcAdminService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected LabelResourceService labelRsrcService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected PceLabelStore pceStore;
 
     protected ConcurrentHashMap<PccId, PcepClient> connectedClients =
diff --git a/protocols/pcep/server/ctl/src/main/java/org/onosproject/pcep/server/impl/PcepControllerImpl.java b/protocols/pcep/server/ctl/src/main/java/org/onosproject/pcep/server/impl/PcepControllerImpl.java
index 8d9bc23..2d1477a 100644
--- a/protocols/pcep/server/ctl/src/main/java/org/onosproject/pcep/server/impl/PcepControllerImpl.java
+++ b/protocols/pcep/server/ctl/src/main/java/org/onosproject/pcep/server/impl/PcepControllerImpl.java
@@ -16,11 +16,6 @@
 package org.onosproject.pcep.server.impl;
 
 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.Service;
 import org.onosproject.net.DeviceId;
 import org.onosproject.pcep.api.PcepController;
 import org.onosproject.pcep.api.PcepDpid;
@@ -29,6 +24,9 @@
 import org.onosproject.pcep.api.PcepSwitchListener;
 import org.onosproject.pcep.api.PcepTunnel;
 import org.onosproject.pcep.api.PcepTunnelListener;
+import org.osgi.service.component.annotations.Activate;
+import org.osgi.service.component.annotations.Component;
+import org.osgi.service.component.annotations.Deactivate;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -37,8 +35,7 @@
 /**
  * Implementation of PCEP controller [protocol].
  */
-@Component(immediate = true)
-@Service
+@Component(immediate = true, service = PcepController.class)
 public class PcepControllerImpl implements PcepController {
 
     private static final Logger log = LoggerFactory.getLogger(PcepControllerImpl.class);
diff --git a/protocols/rest/api/BUCK b/protocols/rest/api/BUCK
deleted file mode 100644
index 818ffbd..0000000
--- a/protocols/rest/api/BUCK
+++ /dev/null
@@ -1,18 +0,0 @@
-COMPILE_DEPS = [
-    '//incubator/api:onos-incubator-api',
-    '//utils/rest:onlab-rest',
-    '//lib:CORE_DEPS',
-    '//lib:jersey-client',
-    '//lib:jersey-security',
-    '//lib:jersey-common',
-    '//lib:httpclient-osgi',
-    '//lib:httpcore-osgi',
-    '//lib:javax.ws.rs-api',
-    '//lib:hk2-api',
-    '//lib:aopalliance-repackaged',
-    '//lib:javax.inject',
-]
-
-osgi_jar_with_tests (
-    deps = COMPILE_DEPS,
-)
diff --git a/protocols/rest/ctl/BUCK b/protocols/rest/ctl/BUCK
deleted file mode 100644
index c12164d..0000000
--- a/protocols/rest/ctl/BUCK
+++ /dev/null
@@ -1,24 +0,0 @@
-COMPILE_DEPS = [
-    '//lib:CORE_DEPS',
-    '//lib:jersey-client',
-    '//lib:jersey-common',
-    '//lib:jersey-media-sse',
-    '//lib:httpclient-osgi',
-    '//lib:httpcore-osgi',
-    '//lib:javax.ws.rs-api',
-    '//lib:hk2-api',
-    '//lib:aopalliance-repackaged',
-    '//lib:javax.inject',
-    '//protocols/rest/api:onos-protocols-rest-api',
-]
-
-TEST_DEPS = [
-    '//lib:TEST_REST',
-    '//core/common:onos-core-common-tests'
-]
-
-osgi_jar_with_tests (
-    deps = COMPILE_DEPS,
-    test_deps = TEST_DEPS
-)
-
diff --git a/protocols/rest/ctl/src/main/java/org/onosproject/protocol/rest/ctl/RestSBControllerImpl.java b/protocols/rest/ctl/src/main/java/org/onosproject/protocol/rest/ctl/RestSBControllerImpl.java
index a527e0e..5a75ef9 100644
--- a/protocols/rest/ctl/src/main/java/org/onosproject/protocol/rest/ctl/RestSBControllerImpl.java
+++ b/protocols/rest/ctl/src/main/java/org/onosproject/protocol/rest/ctl/RestSBControllerImpl.java
@@ -17,12 +17,6 @@
 package org.onosproject.protocol.rest.ctl;
 
 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.apache.felix.scr.annotations.Service;
 import org.onosproject.event.EventDeliveryService;
 import org.onosproject.event.ListenerRegistry;
 import org.onosproject.event.ListenerService;
@@ -32,6 +26,11 @@
 import org.onosproject.protocol.rest.RestSBDevice;
 import org.onosproject.protocol.rest.RestSBEventListener;
 import org.onosproject.protocol.rest.RestSBServerSentEvent;
+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;
 
@@ -45,15 +44,14 @@
 /**
  * The implementation of RestSBController.
  */
-@Component(immediate = true)
-@Service
+@Component(immediate = true, service = { RestSBController.class, ListenerService.class })
 public class RestSBControllerImpl extends HttpSBControllerImpl
         implements RestSBController, ListenerService<RestSBServerSentEvent, RestSBEventListener> {
 
     private static final Logger log =
             LoggerFactory.getLogger(RestSBControllerImpl.class);
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected EventDeliveryService eventDispatcher;
 
     protected final ListenerRegistry<RestSBServerSentEvent, RestSBEventListener> listenerRegistry =
diff --git a/protocols/restconf/client/api/BUCK b/protocols/restconf/client/api/BUCK
deleted file mode 100644
index c1f3e2c..0000000
--- a/protocols/restconf/client/api/BUCK
+++ /dev/null
@@ -1,10 +0,0 @@
-COMPILE_DEPS = [
-    '//lib:CORE_DEPS',
-    '//incubator/api:onos-incubator-api',
-    '//utils/rest:onlab-rest',
-    '//protocols/rest/api:onos-protocols-rest-api',
-]
-
-osgi_jar_with_tests (
-    deps = COMPILE_DEPS,
-)
diff --git a/protocols/restconf/client/ctl/BUCK b/protocols/restconf/client/ctl/BUCK
deleted file mode 100644
index 1e1223d..0000000
--- a/protocols/restconf/client/ctl/BUCK
+++ /dev/null
@@ -1,18 +0,0 @@
-COMPILE_DEPS = [
-    '//lib:CORE_DEPS',
-    '//lib:jersey-client',
-    '//lib:jersey-common',
-    '//lib:httpclient-osgi',
-    '//lib:httpcore-osgi',
-    '//lib:javax.ws.rs-api',
-    '//lib:hk2-api',
-    '//lib:aopalliance-repackaged',
-    '//lib:javax.inject',
-    '//protocols/restconf/client/api:onos-protocols-restconf-client-api',
-    '//protocols/rest/api:onos-protocols-rest-api',
-]
-
-osgi_jar_with_tests (
-    deps = COMPILE_DEPS,
-)
-
diff --git a/protocols/restconf/client/ctl/src/main/java/org/onosproject/protocol/restconf/ctl/RestConfSBControllerImpl.java b/protocols/restconf/client/ctl/src/main/java/org/onosproject/protocol/restconf/ctl/RestConfSBControllerImpl.java
index 38f296d..aaa106e 100644
--- a/protocols/restconf/client/ctl/src/main/java/org/onosproject/protocol/restconf/ctl/RestConfSBControllerImpl.java
+++ b/protocols/restconf/client/ctl/src/main/java/org/onosproject/protocol/restconf/ctl/RestConfSBControllerImpl.java
@@ -15,10 +15,6 @@
  */
 package org.onosproject.protocol.restconf.ctl;
 
-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.glassfish.jersey.client.ChunkedInput;
 import org.onlab.packet.IpAddress;
 import org.onosproject.net.DeviceId;
@@ -26,6 +22,9 @@
 import org.onosproject.protocol.rest.RestSBDevice;
 import org.onosproject.protocol.restconf.RestConfSBController;
 import org.onosproject.protocol.restconf.RestconfNotificationEventListener;
+import org.osgi.service.component.annotations.Activate;
+import org.osgi.service.component.annotations.Component;
+import org.osgi.service.component.annotations.Deactivate;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -42,8 +41,7 @@
 /**
  * The implementation of RestConfSBController.
  */
-@Component(immediate = true)
-@Service
+@Component(immediate = true, service = RestConfSBController.class)
 public class RestConfSBControllerImpl extends HttpSBControllerImpl
         implements RestConfSBController {
 
diff --git a/protocols/restconf/server/BUCK b/protocols/restconf/server/BUCK
deleted file mode 100644
index b6ac9d4..0000000
--- a/protocols/restconf/server/BUCK
+++ /dev/null
@@ -1,11 +0,0 @@
-BUNDLES = [
-    '//protocols/restconf/server/rpp:onos-protocols-restconf-server-rpp',
-]
-
-onos_app (
-  app_name = 'org.onosproject.protocols.restconfserver',
-  title = 'RESTCONF Server Module',
-  category = 'Utility',
-  url = 'http://onosproject.org',
-  included_bundles = BUNDLES,
-)
diff --git a/protocols/restconf/server/app/app.xml b/protocols/restconf/server/app/app.xml
deleted file mode 100644
index 3932591..0000000
--- a/protocols/restconf/server/app/app.xml
+++ /dev/null
@@ -1,23 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-  ~ Copyright 2016-present Open Networking Foundation
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~     http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License.
-  -->
-<app name="org.onosproject.protocols.restconfserver" origin="ON.Lab" version="${project.version}"
-     category="Utility" url="http://onosproject.org" title="RESTCONF Service Module App"
-     featuresRepo="mvn:${project.groupId}/${project.artifactId}/${project.version}/xml/features"
-     features="${project.artifactId}" >
-    <description>${project.description}</description>
-    <artifact>mvn:${project.groupId}/onos-restconf-server-rpp/${project.version}</artifact>
-</app>
diff --git a/protocols/restconf/server/app/features.xml b/protocols/restconf/server/app/features.xml
deleted file mode 100644
index 9b3f1d7..0000000
--- a/protocols/restconf/server/app/features.xml
+++ /dev/null
@@ -1,23 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
-<!--
-  ~ Copyright 2016-present Open Networking Foundation
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~     http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License.
-  -->
-<features xmlns="http://karaf.apache.org/xmlns/features/v1.2.0" name="${project.artifactId}-${project.version}">
-    <feature name="${project.artifactId}" version="${project.version}"
-             description="${project.description}">
-        <feature>onos-api</feature>
-        <bundle>mvn:${project.groupId}/onos-restconf-server-rpp/${project.version}</bundle>
-    </feature>
-</features>
diff --git a/protocols/restconf/server/rpp/BUCK b/protocols/restconf/server/rpp/BUCK
deleted file mode 100644
index c21c905..0000000
--- a/protocols/restconf/server/rpp/BUCK
+++ /dev/null
@@ -1,23 +0,0 @@
-COMPILE_DEPS = [
-    '//lib:CORE_DEPS',
-    '//lib:JACKSON',
-    '//lib:jersey-client',
-    '//lib:jersey-server',
-    '//lib:javax.ws.rs-api',
-    '//lib:servlet-api',
-    '//lib:javax.inject',
-    '//utils/rest:onlab-rest',
-    '//apps/restconf/api:onos-apps-restconf-api',
-]
-
-TEST_DEPS = [
-    '//lib:TEST_REST',
-    '//utils/osgi:onlab-osgi-tests',
-    '//web/api:onos-rest-tests',
-]
-
-osgi_jar_with_tests (
-    deps = COMPILE_DEPS,
-    test_deps = TEST_DEPS,
-    web_context = '/onos/restconf',
-)
diff --git a/protocols/snmp/api/BUCK b/protocols/snmp/api/BUCK
deleted file mode 100644
index 897a0ac..0000000
--- a/protocols/snmp/api/BUCK
+++ /dev/null
@@ -1,13 +0,0 @@
-COMPILE_DEPS = [
-    '//lib:CORE_DEPS',
-    '//lib:JACKSON',
-    '//incubator/api:onos-incubator-api',
-    '//lib:org.apache.servicemix.bundles.snmp4j',
-    '//lib:snmp-core',
-    '//lib:mibs-net-snmp',
-    '//lib:mibs-rfc',
-]
-
-osgi_jar_with_tests (
-    deps = COMPILE_DEPS,
-)
diff --git a/protocols/snmp/ctl/BUCK b/protocols/snmp/ctl/BUCK
deleted file mode 100644
index b4357e1..0000000
--- a/protocols/snmp/ctl/BUCK
+++ /dev/null
@@ -1,14 +0,0 @@
-COMPILE_DEPS = [
-    '//lib:CORE_DEPS',
-    '//incubator/api:onos-incubator-api',
-    '//protocols/snmp/api:onos-protocols-snmp-api',
-    '//lib:org.apache.servicemix.bundles.snmp4j',
-    '//lib:snmp-core',
-    '//lib:mibs-net-snmp',
-    '//lib:mibs-rfc',
-]
-
-osgi_jar_with_tests (
-    deps = COMPILE_DEPS,
-)
-
diff --git a/protocols/snmp/ctl/src/main/java/org/onosproject/snmp/ctl/DefaultSnmpController.java b/protocols/snmp/ctl/src/main/java/org/onosproject/snmp/ctl/DefaultSnmpController.java
index 6cc18af..a9eab3d 100644
--- a/protocols/snmp/ctl/src/main/java/org/onosproject/snmp/ctl/DefaultSnmpController.java
+++ b/protocols/snmp/ctl/src/main/java/org/onosproject/snmp/ctl/DefaultSnmpController.java
@@ -23,9 +23,6 @@
 import com.btisystems.pronx.ems.core.snmp.SnmpSessionFactory;
 import com.btisystems.pronx.ems.core.snmp.V2cSnmpConfiguration;
 import com.google.common.base.Preconditions;
-import org.apache.felix.scr.annotations.Activate;
-import org.apache.felix.scr.annotations.Deactivate;
-import org.apache.felix.scr.annotations.Service;
 import org.onosproject.incubator.net.faultmanagement.alarm.Alarm;
 import org.onosproject.incubator.net.faultmanagement.alarm.AlarmId;
 import org.onosproject.incubator.net.faultmanagement.alarm.DefaultAlarm;
@@ -33,7 +30,9 @@
 import org.onosproject.snmp.SnmpController;
 import org.onosproject.snmp.SnmpDevice;
 import org.osgi.service.component.ComponentContext;
+import org.osgi.service.component.annotations.Activate;
 import org.osgi.service.component.annotations.Component;
+import org.osgi.service.component.annotations.Deactivate;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -47,8 +46,7 @@
 /**
  * Default implementation of the SNMP sub-controller.
  */
-@Component(immediate = true)
-@Service
+@Component(immediate = true, service = SnmpController.class)
 public class DefaultSnmpController implements SnmpController {
 
     private final Logger log = LoggerFactory
diff --git a/protocols/tl1/api/BUCK b/protocols/tl1/api/BUCK
deleted file mode 100644
index 52e0753..0000000
--- a/protocols/tl1/api/BUCK
+++ /dev/null
@@ -1,8 +0,0 @@
-COMPILE_DEPS = [
-    '//lib:CORE_DEPS',
-    '//lib:io_netty_netty_transport',
-]
-
-osgi_jar_with_tests (
-    deps = COMPILE_DEPS,
-)
diff --git a/protocols/tl1/ctl/BUCK b/protocols/tl1/ctl/BUCK
deleted file mode 100644
index af235e4..0000000
--- a/protocols/tl1/ctl/BUCK
+++ /dev/null
@@ -1,19 +0,0 @@
-COMPILE_DEPS = [
-    '//lib:CORE_DEPS',
-    '//lib:NETTY',
-    '//lib:io_netty_netty_transport',
-    '//lib:io_netty_netty_buffer',
-    '//lib:io_netty_netty_codec',
-    '//protocols/tl1/api:onos-protocols-tl1-api',
-]
-
-TEST_DEPS = [
-    '//lib:TEST_ADAPTERS',
-    '//utils/osgi:onlab-osgi-tests',
-    '//core/api:onos-api-tests',
-]
-
-osgi_jar_with_tests (
-    deps = COMPILE_DEPS,
-    test_deps = TEST_DEPS,
-)
diff --git a/protocols/tl1/ctl/src/main/java/org/onosproject/tl1/impl/DefaultTl1Controller.java b/protocols/tl1/ctl/src/main/java/org/onosproject/tl1/impl/DefaultTl1Controller.java
index 70ccf1f..6f0ccfe 100644
--- a/protocols/tl1/ctl/src/main/java/org/onosproject/tl1/impl/DefaultTl1Controller.java
+++ b/protocols/tl1/ctl/src/main/java/org/onosproject/tl1/impl/DefaultTl1Controller.java
@@ -32,12 +32,6 @@
 import io.netty.handler.codec.string.StringDecoder;
 import io.netty.util.CharsetUtil;
 import org.apache.commons.lang.StringUtils;
-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.Tools;
 import org.onosproject.mastership.MastershipService;
 import org.onosproject.net.DeviceId;
@@ -45,6 +39,11 @@
 import org.onosproject.tl1.Tl1Controller;
 import org.onosproject.tl1.Tl1Device;
 import org.onosproject.tl1.Tl1Listener;
+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;
 
@@ -70,8 +69,7 @@
  *
  * Per device, we track commands using a simple ctag-keyed map. This assumes the client is sending out unique ctag's.
  */
-@Component(immediate = true)
-@Service
+@Component(immediate = true, service = Tl1Controller.class)
 public class DefaultTl1Controller implements Tl1Controller {
     private final Logger log = LoggerFactory.getLogger(DefaultTl1Controller.class);
 
@@ -80,7 +78,7 @@
     private static final String COMPLD = "COMPLD";
     private static final String DENY = "DENY";
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected MastershipService mastershipService;
 
     private ConcurrentMap<DeviceId, Tl1Device> deviceMap = new ConcurrentHashMap<>();
diff --git a/protocols/xmpp/core/BUCK b/protocols/xmpp/core/BUCK
deleted file mode 100644
index 49a5015..0000000
--- a/protocols/xmpp/core/BUCK
+++ /dev/null
@@ -1,23 +0,0 @@
-BUNDLES = [
-    '//protocols/xmpp/core/api:onos-protocols-xmpp-core-api',
-    '//protocols/xmpp/core/ctl:onos-protocols-xmpp-core-ctl',
-    '//lib:tinder-xmpp',
-    '//lib:org.apache.servicemix.bundles.dom4j',
-    '//lib:io_netty_netty_common',
-    '//lib:io_netty_netty_transport',
-    '//lib:io_netty_netty_buffer',
-    '//lib:io_netty_netty_codec',
-    '//lib:stax2-api',
-    '//lib:aalto-xml',
-    '//lib:concurrent-hashmap',
-    '//lib:gnu-idn',
-]
-
-onos_app(
-    app_name = 'org.onosproject.protocols.xmpp',
-    title = 'XMPP Core Protocol Subsystem',
-    category = 'Protocol',
-    url = 'https://wiki.onosproject.org/display/ONOS/XMPP+as+SBI',
-    description = 'ONOS XMPP core protocol subsystem',
-    included_bundles = BUNDLES,
-)
\ No newline at end of file
diff --git a/protocols/xmpp/core/api/BUCK b/protocols/xmpp/core/api/BUCK
deleted file mode 100644
index 1e7a692..0000000
--- a/protocols/xmpp/core/api/BUCK
+++ /dev/null
@@ -1,12 +0,0 @@
-COMPILE_DEPS = [
-    '//lib:CORE_DEPS',
-    '//core/api:onos-api',
-    '//lib:tinder-xmpp',
-    '//lib:io_netty_netty_transport',
-    '//lib:io_netty_netty_common',
-    '//lib:org.apache.servicemix.bundles.dom4j',
-]
-
-osgi_jar_with_tests (
-    deps = COMPILE_DEPS,
-)
\ No newline at end of file
diff --git a/protocols/xmpp/core/ctl/BUCK b/protocols/xmpp/core/ctl/BUCK
deleted file mode 100644
index 4ce3ed1..0000000
--- a/protocols/xmpp/core/ctl/BUCK
+++ /dev/null
@@ -1,25 +0,0 @@
-COMPILE_DEPS = [
-    '//lib:CORE_DEPS',
-    '//protocols/xmpp/core/api:onos-protocols-xmpp-core-api',
-    '//lib:io_netty_netty_common',
-    '//lib:io_netty_netty_transport',
-    '//lib:io_netty_netty_transport-native-epoll',
-    '//lib:io_netty_netty_buffer',
-    '//lib:io_netty_netty_codec',
-    '//lib:org.apache.servicemix.bundles.dom4j',
-    '//lib:tinder-xmpp',
-    '//lib:stax2-api',
-    '//lib:aalto-xml',
-    '//lib:concurrent-hashmap',
-    '//lib:gnu-idn',
-]
-
-TEST_DEPS = [
-    '//lib:TEST',
-    '//core/api:onos-api-tests',
-]
-
-osgi_jar_with_tests (
-    deps = COMPILE_DEPS,
-    test_deps = TEST_DEPS,
-)
\ No newline at end of file
diff --git a/protocols/xmpp/core/ctl/src/main/java/org/onosproject/xmpp/core/ctl/OsgiPropertyConstants.java b/protocols/xmpp/core/ctl/src/main/java/org/onosproject/xmpp/core/ctl/OsgiPropertyConstants.java
new file mode 100644
index 0000000..24a3b7c
--- /dev/null
+++ b/protocols/xmpp/core/ctl/src/main/java/org/onosproject/xmpp/core/ctl/OsgiPropertyConstants.java
@@ -0,0 +1,29 @@
+/*
+ * Copyright 2018-present Open Networking Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.onosproject.xmpp.core.ctl;
+
+/**
+ * Constants for default values of configurable properties.
+ */
+public final class OsgiPropertyConstants {
+
+    private OsgiPropertyConstants() {}
+
+    public static final String XMPP_PORT = "xmppPort";
+    public static final String XMPP_PORT_DEFAULT = "5269";
+
+}
diff --git a/protocols/xmpp/core/ctl/src/main/java/org/onosproject/xmpp/core/ctl/XmppControllerImpl.java b/protocols/xmpp/core/ctl/src/main/java/org/onosproject/xmpp/core/ctl/XmppControllerImpl.java
index 44db54d..da42c1c 100644
--- a/protocols/xmpp/core/ctl/src/main/java/org/onosproject/xmpp/core/ctl/XmppControllerImpl.java
+++ b/protocols/xmpp/core/ctl/src/main/java/org/onosproject/xmpp/core/ctl/XmppControllerImpl.java
@@ -20,25 +20,23 @@
 import com.google.common.collect.Maps;
 import com.google.common.collect.Multimap;
 import com.google.common.collect.Multimaps;
-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.onosproject.cfg.ComponentConfigService;
 import org.onosproject.core.CoreService;
 import org.onosproject.xmpp.core.XmppController;
 import org.onosproject.xmpp.core.XmppDevice;
+import org.onosproject.xmpp.core.XmppDeviceAgent;
 import org.onosproject.xmpp.core.XmppDeviceId;
 import org.onosproject.xmpp.core.XmppDeviceListener;
 import org.onosproject.xmpp.core.XmppIqListener;
 import org.onosproject.xmpp.core.XmppMessageListener;
 import org.onosproject.xmpp.core.XmppPresenceListener;
-import org.onosproject.xmpp.core.XmppDeviceAgent;
 import org.osgi.service.component.ComponentContext;
+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 org.slf4j.LoggerFactory;
 import org.xmpp.packet.IQ;
@@ -51,6 +49,9 @@
 import java.util.concurrent.ConcurrentMap;
 import java.util.concurrent.CopyOnWriteArraySet;
 
+import static org.onosproject.xmpp.core.ctl.OsgiPropertyConstants.XMPP_PORT;
+import static org.onosproject.xmpp.core.ctl.OsgiPropertyConstants.XMPP_PORT_DEFAULT;
+
 
 /**
  * The main class (bundle) of XMPP protocol.
@@ -60,28 +61,27 @@
  * 3. Configuration parameters initialization.
  * 4. Notifing listeners about XMPP events/packets.
  */
-@Component(immediate = true)
-@Service
+@Component(immediate = true, service = XmppController.class,
+        property = {
+                XMPP_PORT + "=" + XMPP_PORT_DEFAULT,
+        })
 public class XmppControllerImpl implements XmppController {
 
     private static final String APP_ID = "org.onosproject.xmpp";
-    private static final String XMPP_PORT = "5269";
 
     private static final Logger log =
             LoggerFactory.getLogger(XmppControllerImpl.class);
 
     // core services declaration
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected CoreService coreService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected ComponentConfigService cfgService;
 
     // configuration properties definition
-    @Property(name = "xmppPort", value = XMPP_PORT,
-            label = "Port number used by XMPP protocol; default is 5269")
-    private String xmppPort = XMPP_PORT;
-
+    /** Port number used by XMPP protocol; default is 5269. */
+    private String xmppPort = XMPP_PORT_DEFAULT;
 
     // listener declaration
     protected Set<XmppDeviceListener> xmppDeviceListeners = new CopyOnWriteArraySet<XmppDeviceListener>();
diff --git a/protocols/xmpp/core/ctl/src/main/java/org/onosproject/xmpp/core/ctl/XmppServer.java b/protocols/xmpp/core/ctl/src/main/java/org/onosproject/xmpp/core/ctl/XmppServer.java
index 2bc96fd..0970d82 100644
--- a/protocols/xmpp/core/ctl/src/main/java/org/onosproject/xmpp/core/ctl/XmppServer.java
+++ b/protocols/xmpp/core/ctl/src/main/java/org/onosproject/xmpp/core/ctl/XmppServer.java
@@ -35,6 +35,7 @@
 import java.util.Dictionary;
 
 import static org.onlab.util.Tools.get;
+import static org.onosproject.xmpp.core.ctl.OsgiPropertyConstants.XMPP_PORT;
 
 /**
  *  The XMPP server class. Starts XMPP server and listens to new XMPP device TCP connections.
@@ -124,7 +125,7 @@
      * @param properties properties to be set
      */
     public void setConfiguration(Dictionary<?, ?> properties) {
-        String port = get(properties, "xmppPort");
+        String port = get(properties, XMPP_PORT);
         if (!Strings.isNullOrEmpty(port)) {
             this.port = Integer.parseInt(port);
         }
diff --git a/protocols/xmpp/pubsub/BUCK b/protocols/xmpp/pubsub/BUCK
deleted file mode 100644
index 9a69e4c..0000000
--- a/protocols/xmpp/pubsub/BUCK
+++ /dev/null
@@ -1,20 +0,0 @@
-BUNDLES = [
-    '//protocols/xmpp/core/api:onos-protocols-xmpp-core-api',
-    '//protocols/xmpp/pubsub/api:onos-protocols-xmpp-pubsub-api',
-    '//protocols/xmpp/pubsub/ctl:onos-protocols-xmpp-pubsub-ctl',
-    '//lib:tinder-xmpp',
-    '//lib:concurrent-hashmap',
-    '//lib:gnu-idn',
-]
-
-onos_app(
-    app_name = 'org.onosproject.protocols.xmpp.pubsub',
-    title = 'XMPP Publish/Subscribe protocol extension subsystem',
-    category = 'Protocol',
-    url = 'http://onosproject.org',
-    description = 'XMPP Publish/Subscribe protocol extension subsystem',
-    included_bundles = BUNDLES,
-    required_apps = [
-        'org.onosproject.protocols.xmpp',
-    ]
-)
\ No newline at end of file
diff --git a/protocols/xmpp/pubsub/api/BUCK b/protocols/xmpp/pubsub/api/BUCK
deleted file mode 100644
index d856754..0000000
--- a/protocols/xmpp/pubsub/api/BUCK
+++ /dev/null
@@ -1,9 +0,0 @@
-COMPILE_DEPS = [
-    '//lib:CORE_DEPS',
-    '//core/api:onos-api',
-    '//lib:tinder-xmpp',
-]
-
-osgi_jar_with_tests (
-    deps = COMPILE_DEPS,
-)
\ No newline at end of file
diff --git a/protocols/xmpp/pubsub/ctl/BUCK b/protocols/xmpp/pubsub/ctl/BUCK
deleted file mode 100644
index e28ec52..0000000
--- a/protocols/xmpp/pubsub/ctl/BUCK
+++ /dev/null
@@ -1,19 +0,0 @@
-COMPILE_DEPS = [
-    '//lib:CORE_DEPS',
-    '//core/api:onos-api',
-    '//lib:tinder-xmpp',
-    '//lib:concurrent-hashmap',
-    '//lib:gnu-idn',
-    '//protocols/xmpp/pubsub/api:onos-protocols-xmpp-pubsub-api',
-    '//protocols/xmpp/core/api:onos-protocols-xmpp-core-api',
-]
-
-TEST_DEPS = [
-    '//lib:TEST',
-    '//core/api:onos-api-tests',
-]
-
-osgi_jar_with_tests (
-    deps = COMPILE_DEPS,
-    test_deps = TEST_DEPS,
-)
\ No newline at end of file
diff --git a/protocols/xmpp/pubsub/ctl/src/main/java/org/onosproject/xmpp/pubsub/ctl/XmppPubSubControllerImpl.java b/protocols/xmpp/pubsub/ctl/src/main/java/org/onosproject/xmpp/pubsub/ctl/XmppPubSubControllerImpl.java
index cb9900d..04fd01b 100644
--- a/protocols/xmpp/pubsub/ctl/src/main/java/org/onosproject/xmpp/pubsub/ctl/XmppPubSubControllerImpl.java
+++ b/protocols/xmpp/pubsub/ctl/src/main/java/org/onosproject/xmpp/pubsub/ctl/XmppPubSubControllerImpl.java
@@ -16,12 +16,6 @@
 
 package org.onosproject.xmpp.pubsub.ctl;
 
-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.dom4j.Element;
 import org.onosproject.net.DeviceId;
 import org.onosproject.xmpp.core.XmppController;
@@ -37,6 +31,11 @@
 import org.onosproject.xmpp.pubsub.model.XmppRetract;
 import org.onosproject.xmpp.pubsub.model.XmppSubscribe;
 import org.onosproject.xmpp.pubsub.model.XmppUnsubscribe;
+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 org.xmpp.packet.IQ;
@@ -53,14 +52,13 @@
  * The main class implementing XMPP Publish/Subscribe extension.
  * It listens to IQ stanzas and generates PubSub events based on the payload.
  */
-@Component(immediate = true)
-@Service
+@Component(immediate = true, service = XmppPubSubController.class)
 public class XmppPubSubControllerImpl implements XmppPubSubController {
 
     private static final Logger log =
             LoggerFactory.getLogger(XmppPubSubControllerImpl.class);
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected XmppController xmppController;
 
     protected Set<XmppPublishEventsListener> xmppPublishEventsListeners =
diff --git a/providers/bgp/BUCK b/providers/bgp/BUCK
deleted file mode 100644
index 5ebd51c..0000000
--- a/providers/bgp/BUCK
+++ /dev/null
@@ -1,19 +0,0 @@
-BUNDLES = [
-    '//providers/bgp/cfg:onos-providers-bgp-cfg',
-    '//providers/bgp/topology:onos-providers-bgp-topology',
-    '//providers/bgp/route:onos-providers-bgp-route',
-    '//providers/bgp/cli:onos-providers-bgp-cli',
-    '//protocols/bgp/api:onos-protocols-bgp-api',
-    '//protocols/bgp/ctl:onos-protocols-bgp-ctl',
-    '//protocols/bgp/bgpio:onos-protocols-bgp-bgpio',
-]
-
-onos_app (
-    title = 'BGP Provider',
-    category = 'Provider',
-    url = 'http://onosproject.org',
-    included_bundles = BUNDLES,
-    description = 'BGP protocol southbound providers.',
-    required_apps = [ 'org.onosproject.evpn-route-service' ],
-)
-
diff --git a/providers/bgp/app/app.xml b/providers/bgp/app/app.xml
deleted file mode 100644
index 139805c..0000000
--- a/providers/bgp/app/app.xml
+++ /dev/null
@@ -1,37 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-  ~ Copyright 2015-present Open Networking Foundation
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~     http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License.
-  -->
-<app name="org.onosproject.bgp" origin="ON.Lab" version="${project.version}"
-     category="Provider" url="http://onosproject.org" title="BGP Provider"
-     featuresRepo="mvn:${project.groupId}/${project.artifactId}/${project.version}/xml/features"
-     features="${project.artifactId}">
-    <description>${project.description}</description>
-    <artifact>mvn:${project.groupId}/onos-protocols-bgp-bgpio/${project.version}</artifact>
-    <artifact>mvn:${project.groupId}/onos-protocols-bgp-api/${project.version}</artifact>
-    <artifact>mvn:${project.groupId}/onos-protocols-bgp-ctl/${project.version}</artifact>
-    <artifact>mvn:${project.groupId}/onos-pcep-server-api/${project.version}</artifact>
-    <artifact>mvn:${project.groupId}/onos-providers-bgp-topology/${project.version}</artifact>
-    <artifact>mvn:${project.groupId}/onos-providers-bgp-cfg/${project.version}</artifact>
-    <artifact>mvn:${project.groupId}/onos-providers-bgp-cli/${project.version}</artifact>
-    <artifact>mvn:${project.groupId}/onos-pcepio/${project.version}</artifact>
-    <artifact>mvn:${project.groupId}/onos-apps-pcep-api/${project.version}</artifact>
-    <artifact>mvn:${project.groupId}/onos-pcep-server-impl/${project.version}</artifact>
-    <artifact>mvn:${project.groupId}/onos-pcep-provider-topology/${project.version}</artifact>
-    <artifact>mvn:${project.groupId}/onos-pcep-provider-tunnel/${project.version}</artifact>
-    <artifact>mvn:${project.groupId}/onos-apps-pce-app/${project.version}</artifact>
-    <artifact>mvn:${project.groupId}/onos-apps-pce-pceweb/${project.version}</artifact>
-    <artifact>mvn:${project.groupId}/onos-apps-pce-pcerest/${project.version}</artifact>
-</app>
diff --git a/providers/bgp/app/features.xml b/providers/bgp/app/features.xml
deleted file mode 100644
index 18622fb..0000000
--- a/providers/bgp/app/features.xml
+++ /dev/null
@@ -1,37 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
-<!--
-  ~ Copyright 2015-present Open Networking Foundation
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~     http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License.
-  -->
-<features xmlns="http://karaf.apache.org/xmlns/features/v1.2.0" name="${project.artifactId}-${project.version}">
-    <feature name="${project.artifactId}" version="${project.version}"
-             description="${project.description}">
-        <feature>onos-api</feature>
-        <bundle>mvn:${project.groupId}/onos-protocols-bgp-bgpio/${project.version}</bundle>
-        <bundle>mvn:${project.groupId}/onos-protocols-bgp-api/${project.version}</bundle>
-        <bundle>mvn:${project.groupId}/onos-protocols-bgp-ctl/${project.version}</bundle>
-        <bundle>mvn:${project.groupId}/onos-pcep-server-api/${project.version}</bundle>
-        <bundle>mvn:${project.groupId}/onos-providers-bgp-topology/${project.version}</bundle>
-        <bundle>mvn:${project.groupId}/onos-providers-bgp-cli/${project.version}</bundle>
-        <bundle>mvn:${project.groupId}/onos-providers-bgp-cfg/${project.version}</bundle>
-        <bundle>mvn:${project.groupId}/onos-pcepio/${project.version}</bundle>
-        <bundle>mvn:${project.groupId}/onos-apps-pcep-api/${project.version}</bundle>
-        <bundle>mvn:${project.groupId}/onos-pcep-server-impl/${project.version}</bundle>
-        <bundle>mvn:${project.groupId}/onos-pcep-provider-topology/${project.version}</bundle>
-        <bundle>mvn:${project.groupId}/onos-pcep-provider-tunnel/${project.version}</bundle>
-        <bundle>mvn:${project.groupId}/onos-apps-pce-app/${project.version}</bundle>
-        <bundle>mvn:${project.groupId}/onos-apps-pce-pceweb/${project.version}</bundle>
-        <bundle>mvn:${project.groupId}/onos-apps-pce-pcerest/${project.version}</bundle>
-    </feature>
-</features>
diff --git a/providers/bgp/cfg/BUCK b/providers/bgp/cfg/BUCK
deleted file mode 100644
index f3fa14d..0000000
--- a/providers/bgp/cfg/BUCK
+++ /dev/null
@@ -1,9 +0,0 @@
-COMPILE_DEPS = [
-    '//lib:CORE_DEPS',
-    '//lib:JACKSON',
-    '//protocols/bgp/api:onos-protocols-bgp-api',
-]
-
-osgi_jar_with_tests (
-    deps = COMPILE_DEPS,
-)
diff --git a/providers/bgp/cfg/src/main/java/org/onosproject/provider/bgp/cfg/impl/BgpAppConfig.java b/providers/bgp/cfg/src/main/java/org/onosproject/provider/bgp/cfg/impl/BgpAppConfig.java
index 23a4f5a..9f1710a 100644
--- a/providers/bgp/cfg/src/main/java/org/onosproject/provider/bgp/cfg/impl/BgpAppConfig.java
+++ b/providers/bgp/cfg/src/main/java/org/onosproject/provider/bgp/cfg/impl/BgpAppConfig.java
@@ -16,8 +16,8 @@
 package org.onosproject.provider.bgp.cfg.impl;
 
 import com.fasterxml.jackson.databind.JsonNode;
-import org.apache.felix.scr.annotations.Reference;
-import org.apache.felix.scr.annotations.ReferenceCardinality;
+import org.osgi.service.component.annotations.Reference;
+import org.osgi.service.component.annotations.ReferenceCardinality;
 import org.onlab.osgi.DefaultServiceDirectory;
 import org.onlab.packet.IpAddress;
 import org.onosproject.bgp.controller.BgpCfg;
@@ -38,7 +38,7 @@
  * Configuration object for BGP.
  */
 public class BgpAppConfig extends Config<ApplicationId> {
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     BgpController bgpController;
 
     BgpCfg bgpConfig = null;
diff --git a/providers/bgp/cfg/src/main/java/org/onosproject/provider/bgp/cfg/impl/BgpCfgProvider.java b/providers/bgp/cfg/src/main/java/org/onosproject/provider/bgp/cfg/impl/BgpCfgProvider.java
index ad06c1d..c35f4f0 100644
--- a/providers/bgp/cfg/src/main/java/org/onosproject/provider/bgp/cfg/impl/BgpCfgProvider.java
+++ b/providers/bgp/cfg/src/main/java/org/onosproject/provider/bgp/cfg/impl/BgpCfgProvider.java
@@ -15,11 +15,11 @@
  */
 package org.onosproject.provider.bgp.cfg.impl;
 
-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.onosproject.bgp.controller.BgpCfg;
 import org.onosproject.bgp.controller.BgpPeerCfg;
@@ -56,16 +56,16 @@
 
     static final String PROVIDER_ID = "org.onosproject.provider.bgp.cfg";
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected BgpController bgpController;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected CoreService coreService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected NetworkConfigRegistry configRegistry;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected NetworkConfigService configService;
 
     private final ConfigFactory configFactory =
diff --git a/providers/bgp/cli/BUCK b/providers/bgp/cli/BUCK
deleted file mode 100644
index 64ae7f9..0000000
--- a/providers/bgp/cli/BUCK
+++ /dev/null
@@ -1,16 +0,0 @@
-COMPILE_DEPS = [
-    '//lib:CORE_DEPS',
-    '//incubator/api:onos-incubator-api',
-    '//providers/bgp/cfg:onos-providers-bgp-cfg',
-    '//providers/bgp/topology:onos-providers-bgp-topology',
-    '//protocols/bgp/api:onos-protocols-bgp-api',
-    '//protocols/bgp/ctl:onos-protocols-bgp-ctl',
-    '//protocols/bgp/bgpio:onos-protocols-bgp-bgpio',
-    '//lib:org.apache.karaf.shell.console',
-    '//cli:onos-cli',
-]
-
-osgi_jar_with_tests (
-  deps = COMPILE_DEPS,
-)
-
diff --git a/providers/bgp/cli/BUILD b/providers/bgp/cli/BUILD
index 4ac3704..3e909c9 100644
--- a/providers/bgp/cli/BUILD
+++ b/providers/bgp/cli/BUILD
@@ -1,14 +1,13 @@
-COMPILE_DEPS = CORE_DEPS + [
-    "@org_apache_karaf_shell_console//jar",
+COMPILE_DEPS = CORE_DEPS + CLI + [
     "//incubator/api:onos-incubator-api",
     "//providers/bgp/cfg:onos-providers-bgp-cfg",
     "//providers/bgp/topology:onos-providers-bgp-topology",
     "//protocols/bgp/api:onos-protocols-bgp-api",
     "//protocols/bgp/ctl:onos-protocols-bgp-ctl",
     "//protocols/bgp/bgpio:onos-protocols-bgp-bgpio",
-    "//cli:onos-cli",
 ]
 
 osgi_jar_with_tests(
+    karaf_command_packages = ["org.onosproject.bgp.cli"],
     deps = COMPILE_DEPS,
 )
diff --git a/providers/bgp/cli/src/main/java/org/onosproject/bgp/cli/BgpConfiguration.java b/providers/bgp/cli/src/main/java/org/onosproject/bgp/cli/BgpConfiguration.java
index 186fcd1..3123001 100644
--- a/providers/bgp/cli/src/main/java/org/onosproject/bgp/cli/BgpConfiguration.java
+++ b/providers/bgp/cli/src/main/java/org/onosproject/bgp/cli/BgpConfiguration.java
@@ -15,8 +15,9 @@
  */
 package org.onosproject.bgp.cli;
 
-import org.apache.karaf.shell.commands.Argument;
-import org.apache.karaf.shell.commands.Command;
+import org.apache.karaf.shell.api.action.Argument;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.bgp.controller.BgpCfg;
 import org.onosproject.bgp.controller.BgpConnectPeer;
 import org.onosproject.bgp.controller.BgpController;
@@ -28,7 +29,7 @@
 import java.util.Set;
 import java.util.TreeMap;
 
-
+@Service
 @Command(scope = "onos", name = "bgp", description = "lists configuration")
 public class BgpConfiguration extends AbstractShellCommand {
     private static final Logger log = LoggerFactory.getLogger(BgpConfiguration.class);
@@ -48,7 +49,7 @@
     String peer = null;
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         switch (name) {
             case CONFIGURATION:
                 displayBgpConfiguration();
diff --git a/providers/bgp/cli/src/main/java/org/onosproject/bgp/cli/BgpExceptions.java b/providers/bgp/cli/src/main/java/org/onosproject/bgp/cli/BgpExceptions.java
index c145a45..d4e14f8 100644
--- a/providers/bgp/cli/src/main/java/org/onosproject/bgp/cli/BgpExceptions.java
+++ b/providers/bgp/cli/src/main/java/org/onosproject/bgp/cli/BgpExceptions.java
@@ -15,8 +15,9 @@
  */
 package org.onosproject.bgp.cli;
 
-import org.apache.karaf.shell.commands.Argument;
-import org.apache.karaf.shell.commands.Command;
+import org.apache.karaf.shell.api.action.Argument;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.bgp.controller.BgpController;
 import org.onosproject.cli.AbstractShellCommand;
 import org.slf4j.Logger;
@@ -26,7 +27,7 @@
 import java.util.Map;
 import java.util.Set;
 
-
+@Service
 @Command(scope = "onos", name = "bgp-exception", description = "Displays Exceptions")
 public class BgpExceptions extends AbstractShellCommand {
     public static final String ACTIVESESSION = "activesession";
@@ -45,7 +46,7 @@
     private Set<String> closedSessionExceptionKeySet;
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         switch (name) {
             case ACTIVESESSION:
                 displayActiveSessionException();
diff --git a/providers/bgp/cli/src/main/java/org/onosproject/bgp/cli/BgpLocalRibDisplay.java b/providers/bgp/cli/src/main/java/org/onosproject/bgp/cli/BgpLocalRibDisplay.java
index 3f1fee8..6620865 100644
--- a/providers/bgp/cli/src/main/java/org/onosproject/bgp/cli/BgpLocalRibDisplay.java
+++ b/providers/bgp/cli/src/main/java/org/onosproject/bgp/cli/BgpLocalRibDisplay.java
@@ -15,8 +15,9 @@
  */
 package org.onosproject.bgp.cli;
 
-import org.apache.karaf.shell.commands.Argument;
-import org.apache.karaf.shell.commands.Command;
+import org.apache.karaf.shell.api.action.Argument;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.bgp.controller.BgpController;
 import org.onosproject.bgp.controller.BgpLocalRib;
 import org.onosproject.bgpio.protocol.BgpLSNlri;
@@ -54,7 +55,7 @@
 import java.util.Arrays;
 
 
-
+@Service
 @Command(scope = "onos", name = "bgp-rib", description = "lists RIB configuration")
 public class BgpLocalRibDisplay extends AbstractShellCommand {
     private static final Logger log = LoggerFactory.getLogger(BgpLocalRibDisplay.class);
@@ -97,7 +98,7 @@
     private int count = 0;
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         switch (name) {
             case NODETREE:
                 displayNodes();
diff --git a/providers/bgp/cli/src/main/resources/OSGI-INF/blueprint/shell-config.xml b/providers/bgp/cli/src/main/resources/OSGI-INF/blueprint/shell-config.xml
deleted file mode 100644
index 6695a01..0000000
--- a/providers/bgp/cli/src/main/resources/OSGI-INF/blueprint/shell-config.xml
+++ /dev/null
@@ -1,15 +0,0 @@
-<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0">
-
-    <command-bundle xmlns="http://karaf.apache.org/xmlns/shell/v1.1.0">
-        <command>
-            <action class="org.onosproject.bgp.cli.BgpConfiguration"/>
-        </command>
-        <command>
-            <action class="org.onosproject.bgp.cli.BgpLocalRibDisplay"/>
-        </command>
-        <command>
-            <action class="org.onosproject.bgp.cli.BgpExceptions"/>
-        </command>
-    </command-bundle>
-
-</blueprint>
diff --git a/providers/bgp/route/BUCK b/providers/bgp/route/BUCK
deleted file mode 100644
index 5e94e85..0000000
--- a/providers/bgp/route/BUCK
+++ /dev/null
@@ -1,17 +0,0 @@
-COMPILE_DEPS = [
-    '//lib:CORE_DEPS',
-    '//protocols/bgp/api:onos-protocols-bgp-api',
-    '//protocols/bgp/bgpio:onos-protocols-bgp-bgpio',
-    '//incubator/store:onos-incubator-store',
-    '//incubator/api:onos-incubator-api',
-    '//apps/evpn-route-service/api:onos-apps-evpn-route-service-api',
-]
-
-TEST_DEPS = [
-    '//lib:TEST_ADAPTERS',
-]
-
-osgi_jar_with_tests(
-    deps = COMPILE_DEPS,
-    test_deps = TEST_DEPS,
-)
diff --git a/providers/bgp/route/src/main/java/org/onosproject/provider/bgp/route/impl/BgpRouteProvider.java b/providers/bgp/route/src/main/java/org/onosproject/provider/bgp/route/impl/BgpRouteProvider.java
index c7a9b10..2059e56 100644
--- a/providers/bgp/route/src/main/java/org/onosproject/provider/bgp/route/impl/BgpRouteProvider.java
+++ b/providers/bgp/route/src/main/java/org/onosproject/provider/bgp/route/impl/BgpRouteProvider.java
@@ -13,11 +13,11 @@
 
 package org.onosproject.provider.bgp.route.impl;
 
-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.Ip4Address;
 import org.onlab.packet.IpAddress;
 import org.onlab.packet.IpPrefix;
@@ -76,10 +76,10 @@
             .getLogger(BgpRouteProvider.class);
 
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected BgpController controller;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected EvpnRouteAdminService evpnRouteAdminService;
 
     private final InternalEvpnRouteListener routeListener = new
diff --git a/providers/bgp/topology/BUCK b/providers/bgp/topology/BUCK
deleted file mode 100644
index efa8edb..0000000
--- a/providers/bgp/topology/BUCK
+++ /dev/null
@@ -1,18 +0,0 @@
-COMPILE_DEPS = [
-    '//lib:CORE_DEPS',
-    '//lib:JACKSON',
-    '//protocols/bgp/api:onos-protocols-bgp-api',
-    '//protocols/bgp/bgpio:onos-protocols-bgp-bgpio',
-    '//incubator/store:onos-incubator-store',
-    '//incubator/api:onos-incubator-api',
-    '//apps/pcep-api:onos-apps-pcep-api',
-]
-
-TEST_DEPS = [
-    '//lib:TEST_ADAPTERS',
-]
-
-osgi_jar_with_tests (
-    deps = COMPILE_DEPS,
-    test_deps = TEST_DEPS,
-)
diff --git a/providers/bgp/topology/src/main/java/org/onosproject/provider/bgp/topology/impl/BgpTopologyProvider.java b/providers/bgp/topology/src/main/java/org/onosproject/provider/bgp/topology/impl/BgpTopologyProvider.java
index b840a89..8439bb9 100644
--- a/providers/bgp/topology/src/main/java/org/onosproject/provider/bgp/topology/impl/BgpTopologyProvider.java
+++ b/providers/bgp/topology/src/main/java/org/onosproject/provider/bgp/topology/impl/BgpTopologyProvider.java
@@ -13,11 +13,11 @@
 
 package org.onosproject.provider.bgp.topology.impl;
 
-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.ChassisId;
 import org.onlab.packet.Ip4Address;
 import org.onosproject.bgp.controller.BgpController;
@@ -110,28 +110,28 @@
 
     private static final Logger log = LoggerFactory.getLogger(BgpTopologyProvider.class);
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected DeviceProviderRegistry deviceProviderRegistry;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected LinkProviderRegistry linkProviderRegistry;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected BgpController controller;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected LinkService linkService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected DeviceService deviceService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected MastershipService mastershipService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected LabelResourceAdminService labelResourceAdminService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected NetworkConfigService networkConfigService;
 
     private DeviceProviderService deviceProviderService;
diff --git a/providers/bgpcep/BUCK b/providers/bgpcep/BUCK
deleted file mode 100644
index 1f0b14d..0000000
--- a/providers/bgpcep/BUCK
+++ /dev/null
@@ -1,26 +0,0 @@
-BUNDLES = [
-  '//protocols/bgp/bgpio:onos-protocols-bgp-bgpio',
-  '//protocols/bgp/api:onos-protocols-bgp-api',
-  '//protocols/bgp/ctl:onos-protocols-bgp-ctl',
-  '//protocols/pcep/pcepio:onos-protocols-pcep-pcepio',
-  '//apps/pcep-api:onos-apps-pcep-api',
-  '//protocols/pcep/server/api:onos-protocols-pcep-server-api',
-  '//providers/bgp/topology:onos-providers-bgp-topology',
-  '//providers/bgp/cfg:onos-providers-bgp-cfg',
-  '//protocols/pcep/server/ctl:onos-protocols-pcep-server-ctl',
-  '//providers/pcep/topology:onos-providers-pcep-topology',
-  '//providers/pcep/tunnel:onos-providers-pcep-tunnel',
-  '//providers/bgpcep/flow:onos-providers-bgpcep-flow',
-  '//apps/pce/app:onos-apps-pce-app',
-  '//apps/pce/pceweb:onos-apps-pce-pceweb',
-  '//apps/pce/bandwidthmgmt:onos-apps-pce-bandwidthmgmt', 
-]
-
-onos_app (
-    title = 'BGPCEP Provider',
-    category = 'Provider',
-    url = 'http://onosproject.org',
-    included_bundles = BUNDLES,
-    description = 'BGPCEP providers.',
-)
-
diff --git a/providers/bgpcep/app/app.xml b/providers/bgpcep/app/app.xml
deleted file mode 100644
index 28afaad..0000000
--- a/providers/bgpcep/app/app.xml
+++ /dev/null
@@ -1,38 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-  ~ Copyright 2016-present Open Networking Foundation
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~     http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License.
-  -->
-<app name="org.onosproject.bgpcep" origin="ON.Lab" version="${project.version}"
-     category="Provider" url="http://onosproject.org" title="BGP PCEP Provider"
-     featuresRepo="mvn:${project.groupId}/${project.artifactId}/${project.version}/xml/features"
-     features="${project.artifactId}">
-    <description>${project.description}</description>
-    <artifact>mvn:${project.groupId}/onos-protocols-bgp-bgpio/${project.version}</artifact>
-    <artifact>mvn:${project.groupId}/onos-protocols-bgp-api/${project.version}</artifact>
-    <artifact>mvn:${project.groupId}/onos-protocols-bgp-ctl/${project.version}</artifact>
-    <artifact>mvn:${project.groupId}/onos-pcepio/${project.version}</artifact>
-    <artifact>mvn:${project.groupId}/onos-apps-pcep-api/${project.version}</artifact>
-    <artifact>mvn:${project.groupId}/onos-pcep-server-api/${project.version}</artifact>
-    <artifact>mvn:${project.groupId}/onos-providers-bgp-topology/${project.version}</artifact>
-    <artifact>mvn:${project.groupId}/onos-providers-bgp-cfg/${project.version}</artifact>
-    <artifact>mvn:${project.groupId}/onos-pcep-server-impl/${project.version}</artifact>
-    <artifact>mvn:${project.groupId}/onos-pcep-provider-topology/${project.version}</artifact>
-    <artifact>mvn:${project.groupId}/onos-pcep-provider-tunnel/${project.version}</artifact>
-    <artifact>mvn:${project.groupId}/onos-providers-bgpcep-flow/${project.version}</artifact>
-    <artifact>mvn:${project.groupId}/onos-apps-pce-app/${project.version}</artifact>
-    <artifact>mvn:${project.groupId}/onos-apps-pce-pceweb/${project.version}</artifact>
-    <artifact>mvn:${project.groupId}/onos-apps-pce-pcerest/${project.version}</artifact>
-    <artifact>mvn:${project.groupId}/onos-apps-pce-bandwidthmgmt/${project.version}</artifact>
-</app>
diff --git a/providers/bgpcep/app/features.xml b/providers/bgpcep/app/features.xml
deleted file mode 100644
index 378205b..0000000
--- a/providers/bgpcep/app/features.xml
+++ /dev/null
@@ -1,38 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
-<!--
-  ~ Copyright 2016-present Open Networking Foundation
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~     http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License.
-  -->
-<features xmlns="http://karaf.apache.org/xmlns/features/v1.2.0" name="${project.artifactId}-${project.version}">
-    <feature name="${project.artifactId}" version="${project.version}"
-             description="${project.description}">
-        <feature>onos-api</feature>
-        <bundle>mvn:${project.groupId}/onos-protocols-bgp-bgpio/${project.version}</bundle>
-        <bundle>mvn:${project.groupId}/onos-protocols-bgp-api/${project.version}</bundle>
-        <bundle>mvn:${project.groupId}/onos-protocols-bgp-ctl/${project.version}</bundle>
-        <bundle>mvn:${project.groupId}/onos-pcep-server-api/${project.version}</bundle>
-        <bundle>mvn:${project.groupId}/onos-providers-bgp-topology/${project.version}</bundle>
-        <bundle>mvn:${project.groupId}/onos-providers-bgp-cfg/${project.version}</bundle>
-        <bundle>mvn:${project.groupId}/onos-pcepio/${project.version}</bundle>
-        <bundle>mvn:${project.groupId}/onos-apps-pcep-api/${project.version}</bundle>
-        <bundle>mvn:${project.groupId}/onos-pcep-server-impl/${project.version}</bundle>
-        <bundle>mvn:${project.groupId}/onos-pcep-provider-topology/${project.version}</bundle>
-        <bundle>mvn:${project.groupId}/onos-pcep-provider-tunnel/${project.version}</bundle>
-        <bundle>mvn:${project.groupId}/onos-apps-pce-app/${project.version}</bundle>
-        <bundle>mvn:${project.groupId}/onos-apps-pce-pceweb/${project.version}</bundle>
-        <bundle>mvn:${project.groupId}/onos-providers-bgpcep-flow/${project.version}</bundle>
-        <bundle>mvn:${project.groupId}/onos-apps-pce-pcerest/${project.version}</bundle>
-	<bundle>mvn:${project.groupId}/onos-apps-pce-bandwidthmgmt/${project.version}</bundle>
-    </feature>
-</features>
diff --git a/providers/bgpcep/flow/BUCK b/providers/bgpcep/flow/BUCK
deleted file mode 100644
index 2115eb2..0000000
--- a/providers/bgpcep/flow/BUCK
+++ /dev/null
@@ -1,12 +0,0 @@
-COMPILE_DEPS = [
-  '//lib:CORE_DEPS',
-  '//lib:org.osgi.compendium',
-  '//protocols/bgp/api:onos-protocols-bgp-api',
-  '//incubator/api:onos-incubator-api',
-  '//protocols/pcep/server/api:onos-protocols-pcep-server-api',
-  '//protocols/pcep/pcepio:onos-protocols-pcep-pcepio',
-]
-
-osgi_jar_with_tests(
-    deps = COMPILE_DEPS,
-)
diff --git a/providers/bgpcep/flow/src/main/java/org/onosproject/provider/bgpcep/flow/impl/BgpcepFlowRuleProvider.java b/providers/bgpcep/flow/src/main/java/org/onosproject/provider/bgpcep/flow/impl/BgpcepFlowRuleProvider.java
index 83aaac8..024e8a3 100644
--- a/providers/bgpcep/flow/src/main/java/org/onosproject/provider/bgpcep/flow/impl/BgpcepFlowRuleProvider.java
+++ b/providers/bgpcep/flow/src/main/java/org/onosproject/provider/bgpcep/flow/impl/BgpcepFlowRuleProvider.java
@@ -15,11 +15,11 @@
  */
 package org.onosproject.provider.bgpcep.flow.impl;
 
-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.onosproject.core.ApplicationId;
 import org.onosproject.net.flow.FlowRule;
 import org.onosproject.net.flow.oldbatch.FlowRuleBatchOperation;
@@ -42,7 +42,7 @@
 
     private final Logger log = getLogger(getClass());
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected FlowRuleProviderRegistry providerRegistry;
 
     private FlowRuleProviderService providerService;
diff --git a/providers/general/BUCK b/providers/general/BUCK
deleted file mode 100644
index 5d4973e..0000000
--- a/providers/general/BUCK
+++ /dev/null
@@ -1,15 +0,0 @@
-BUNDLES = [
-    '//providers/general/device:onos-providers-general-device',
-]
-
-onos_app (
-    app_name = "org.onosproject.generaldeviceprovider",
-    title = 'General Device Provider',
-    category = 'Provider',
-    url = 'http://onosproject.org',
-    included_bundles = BUNDLES,
-    description = 'General device southbound providers.',
-    required_apps = [],
-)
-
-
diff --git a/providers/general/app/app.xml b/providers/general/app/app.xml
deleted file mode 100644
index 3e9c4e9..0000000
--- a/providers/general/app/app.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-  ~ Copyright 2017-present Open Networking Foundation
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~     http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License.
-  -->
-<app name="org.onosproject.generaldeviceprovider" origin="ON.Lab" version="${project.version}"
-     category="Provider" url="https://wiki.onosproject.org/" title="General Device Provider"
-     featuresRepo="mvn:${project.groupId}/${project.artifactId}/${project.version}/xml/features"
-     features="${project.artifactId}">
-    <description>${project.description}</description>
-
-    <artifact>mvn:${project.groupId}/onos-providers-general-device/${project.version}</artifact>
-
-</app>
diff --git a/providers/general/app/features.xml b/providers/general/app/features.xml
deleted file mode 100644
index 45ff1f0..0000000
--- a/providers/general/app/features.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
-<!--
-  ~ Copyright 2017-present Open Networking Foundation
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~     http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License.
-  -->
-<features xmlns="http://karaf.apache.org/xmlns/features/v1.2.0" name="${project.artifactId}-${project.version}">
-    <feature name="${project.artifactId}" version="${project.version}"
-             description="${project.description}">
-        <feature>onos-api</feature>
-
-        <bundle>mvn:${project.groupId}/onos-providers-general-device/${project.version}</bundle>
-    </feature>
-</features>
-
diff --git a/providers/general/device/BUCK b/providers/general/device/BUCK
deleted file mode 100644
index 4c7bd78..0000000
--- a/providers/general/device/BUCK
+++ /dev/null
@@ -1,13 +0,0 @@
-COMPILE_DEPS = [
-    '//lib:CORE_DEPS',
-    '//lib:JACKSON',
-]
-
-TEST_DEPS = [
-    '//lib:TEST_ADAPTERS',
-]
-
-osgi_jar_with_tests (
-    deps = COMPILE_DEPS,
-    test_deps = TEST_DEPS,
-)
diff --git a/providers/general/device/src/main/java/org/onosproject/provider/general/device/impl/GeneralDeviceProvider.java b/providers/general/device/src/main/java/org/onosproject/provider/general/device/impl/GeneralDeviceProvider.java
index e5c321e..4374089 100644
--- a/providers/general/device/src/main/java/org/onosproject/provider/general/device/impl/GeneralDeviceProvider.java
+++ b/providers/general/device/src/main/java/org/onosproject/provider/general/device/impl/GeneralDeviceProvider.java
@@ -20,13 +20,6 @@
 import com.google.common.collect.ImmutableSet;
 import com.google.common.collect.Maps;
 import com.google.common.util.concurrent.Striped;
-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.onlab.packet.ChassisId;
 import org.onlab.util.ItemNotFoundException;
 import org.onlab.util.Tools;
@@ -79,6 +72,12 @@
 import org.onosproject.net.provider.ProviderId;
 import org.onosproject.provider.general.device.api.GeneralProviderDeviceConfig;
 import org.osgi.service.component.ComponentContext;
+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.security.SecureRandom;
@@ -107,6 +106,7 @@
 import static java.util.concurrent.Executors.newSingleThreadScheduledExecutor;
 import static org.onlab.util.Tools.groupedThreads;
 import static org.onosproject.net.device.DeviceEvent.Type;
+import static org.onosproject.provider.general.device.impl.OsgiPropertyConstants.*;
 import static org.slf4j.LoggerFactory.getLogger;
 
 /**
@@ -115,7 +115,12 @@
  * also delegated to the DeviceHandshaker driver.
  */
 @Beta
-@Component(immediate = true)
+@Component(immediate = true,
+        property = {
+                STATS_POLL_FREQUENCY + ":Integer=" + STATS_POLL_FREQUENCY_DEFAULT,
+                PROBE_FREQUENCY + ":Integer=" + PROBE_FREQUENCY_DEFAULT,
+                OP_TIMEOUT_SHORT + ":Integer=" + OP_TIMEOUT_SHORT_DEFAULT,
+        })
 public class GeneralDeviceProvider extends AbstractProvider
         implements DeviceProvider {
 
@@ -132,54 +137,48 @@
     private static final Set<String> PIPELINE_CONFIGURABLE_PROTOCOLS =
             ImmutableSet.of("p4runtime");
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     private DeviceProviderRegistry providerRegistry;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     private ComponentConfigService componentConfigService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     private NetworkConfigRegistry cfgService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     private CoreService coreService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     private DeviceService deviceService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     private DriverService driverService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     private MastershipService mastershipService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     private PiPipeconfService pipeconfService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     private PiPipeconfWatchdogService pipeconfWatchdogService;
 
-    private static final String STATS_POLL_FREQUENCY = "deviceStatsPollFrequency";
-    private static final int DEFAULT_STATS_POLL_FREQUENCY = 10;
-    @Property(name = STATS_POLL_FREQUENCY, intValue = DEFAULT_STATS_POLL_FREQUENCY,
-            label = "Configure poll frequency for port status and statistics; " +
-                    "default is 10 sec")
-    private int statsPollFrequency = DEFAULT_STATS_POLL_FREQUENCY;
+    /**
+     * Configure poll frequency for port status and statistics; default is 10 sec.
+     */
+    private int statsPollFrequency = STATS_POLL_FREQUENCY_DEFAULT;
 
-    private static final String PROBE_FREQUENCY = "deviceProbeFrequency";
-    private static final int DEFAULT_PROBE_FREQUENCY = 10;
-    @Property(name = PROBE_FREQUENCY, intValue = DEFAULT_PROBE_FREQUENCY,
-            label = "Configure probe frequency for checking device availability; " +
-                    "default is 10 sec")
-    private int probeFrequency = DEFAULT_PROBE_FREQUENCY;
+    /**
+     * Configure probe frequency for checking device availability; default is 10 sec.
+     */
+    private int probeFrequency = PROBE_FREQUENCY_DEFAULT;
 
-    private static final String OP_TIMEOUT_SHORT = "deviceOperationTimeoutShort";
-    private static final int DEFAULT_OP_TIMEOUT_SHORT = 10;
-    @Property(name = OP_TIMEOUT_SHORT, intValue = DEFAULT_OP_TIMEOUT_SHORT,
-            label = "Configure timeout in seconds for device operations " +
-                    "that are supposed to take a short time " +
-                    "(e.g. checking device reachability); default is 10 seconds")
-    private int opTimeoutShort = DEFAULT_OP_TIMEOUT_SHORT;
+    /**
+     * Configure timeout in seconds for device operations that are supposed to take a short time
+     * (e.g. checking device reachability); default is 10 seconds.
+     */
+    private int opTimeoutShort = OP_TIMEOUT_SHORT_DEFAULT;
 
     //FIXME to be removed when netcfg will issue device events in a bundle or
     //ensures all configuration needed is present
@@ -236,16 +235,16 @@
         Dictionary<?, ?> properties = context.getProperties();
         final int oldStatsPollFrequency = statsPollFrequency;
         statsPollFrequency = Tools.getIntegerProperty(
-                properties, STATS_POLL_FREQUENCY, DEFAULT_STATS_POLL_FREQUENCY);
+                properties, STATS_POLL_FREQUENCY, STATS_POLL_FREQUENCY_DEFAULT);
         log.info("Configured. {} is configured to {} seconds",
                  STATS_POLL_FREQUENCY, statsPollFrequency);
         final int oldProbeFrequency = probeFrequency;
         probeFrequency = Tools.getIntegerProperty(
-                properties, PROBE_FREQUENCY, DEFAULT_PROBE_FREQUENCY);
+                properties, PROBE_FREQUENCY, PROBE_FREQUENCY_DEFAULT);
         log.info("Configured. {} is configured to {} seconds",
                  PROBE_FREQUENCY, probeFrequency);
         opTimeoutShort = Tools.getIntegerProperty(
-                properties, OP_TIMEOUT_SHORT, DEFAULT_OP_TIMEOUT_SHORT);
+                properties, OP_TIMEOUT_SHORT, OP_TIMEOUT_SHORT_DEFAULT);
         log.info("Configured. {} is configured to {} seconds",
                  OP_TIMEOUT_SHORT, opTimeoutShort);
 
diff --git a/providers/general/device/src/main/java/org/onosproject/provider/general/device/impl/OsgiPropertyConstants.java b/providers/general/device/src/main/java/org/onosproject/provider/general/device/impl/OsgiPropertyConstants.java
new file mode 100644
index 0000000..84419f4
--- /dev/null
+++ b/providers/general/device/src/main/java/org/onosproject/provider/general/device/impl/OsgiPropertyConstants.java
@@ -0,0 +1,35 @@
+/*
+ * Copyright 2018-present Open Networking Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.onosproject.provider.general.device.impl;
+
+/**
+ * Constants for default values of configurable properties.
+ */
+public final class OsgiPropertyConstants {
+
+    private OsgiPropertyConstants() {}
+
+    public static final String STATS_POLL_FREQUENCY = "deviceStatsPollFrequency";
+    public static final int STATS_POLL_FREQUENCY_DEFAULT = 10;
+
+    public static final String PROBE_FREQUENCY = "deviceProbeFrequency";
+    public static final int PROBE_FREQUENCY_DEFAULT = 10;
+
+    public static final String OP_TIMEOUT_SHORT = "deviceOperationTimeoutShort";
+    public static final int OP_TIMEOUT_SHORT_DEFAULT = 10;
+
+}
diff --git a/providers/host/BUCK b/providers/host/BUCK
deleted file mode 100644
index b7d90f4..0000000
--- a/providers/host/BUCK
+++ /dev/null
@@ -1,22 +0,0 @@
-COMPILE_DEPS = [
-    '//lib:CORE_DEPS',
-    '//incubator/api:onos-incubator-api',
-]
-
-TEST_DEPS = [
-    '//lib:TEST_ADAPTERS',
-    '//utils/osgi:onlab-osgi-tests',
-]
-
-osgi_jar_with_tests (
-    deps = COMPILE_DEPS,
-    test_deps = TEST_DEPS,
-)
-
-onos_app (
-    app_name = 'org.onosproject.hostprovider',
-    title = 'Host Location Provider',
-    category = 'Provider',
-    url = 'http://onosproject.org',
-    description = 'Provides host discovery and location to the ONOS core by eavesdropping on the ARP and NDP packets.',
-)
diff --git a/providers/host/src/main/java/org/onosproject/provider/host/impl/HostLocationProvider.java b/providers/host/src/main/java/org/onosproject/provider/host/impl/HostLocationProvider.java
index 768c4fa..2e4b412 100644
--- a/providers/host/src/main/java/org/onosproject/provider/host/impl/HostLocationProvider.java
+++ b/providers/host/src/main/java/org/onosproject/provider/host/impl/HostLocationProvider.java
@@ -16,14 +16,6 @@
 package org.onosproject.provider.host.impl;
 
 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.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.packet.ARP;
 import org.onlab.packet.BasePacket;
 import org.onlab.packet.DHCP;
@@ -54,6 +46,12 @@
 import org.onosproject.cfg.ComponentConfigService;
 import org.onosproject.core.ApplicationId;
 import org.onosproject.core.CoreService;
+import org.onosproject.net.ConnectPoint;
+import org.onosproject.net.Device;
+import org.onosproject.net.DeviceId;
+import org.onosproject.net.Host;
+import org.onosproject.net.HostId;
+import org.onosproject.net.HostLocation;
 import org.onosproject.net.config.ConfigFactory;
 import org.onosproject.net.config.NetworkConfigEvent;
 import org.onosproject.net.config.NetworkConfigListener;
@@ -62,13 +60,6 @@
 import org.onosproject.net.config.basics.BasicHostConfig;
 import org.onosproject.net.config.basics.HostLearningConfig;
 import org.onosproject.net.config.basics.SubjectFactories;
-import org.onosproject.net.intf.InterfaceService;
-import org.onosproject.net.ConnectPoint;
-import org.onosproject.net.Device;
-import org.onosproject.net.DeviceId;
-import org.onosproject.net.Host;
-import org.onosproject.net.HostId;
-import org.onosproject.net.HostLocation;
 import org.onosproject.net.device.DeviceEvent;
 import org.onosproject.net.device.DeviceListener;
 import org.onosproject.net.device.DeviceService;
@@ -82,6 +73,7 @@
 import org.onosproject.net.host.HostProviderRegistry;
 import org.onosproject.net.host.HostProviderService;
 import org.onosproject.net.host.HostService;
+import org.onosproject.net.intf.InterfaceService;
 import org.onosproject.net.packet.DefaultOutboundPacket;
 import org.onosproject.net.packet.OutboundPacket;
 import org.onosproject.net.packet.PacketContext;
@@ -93,54 +85,69 @@
 import org.onosproject.net.topology.Topology;
 import org.onosproject.net.topology.TopologyService;
 import org.osgi.service.component.ComponentContext;
+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.nio.ByteBuffer;
 import java.util.Dictionary;
 import java.util.Objects;
 import java.util.Optional;
+import java.util.Set;
 import java.util.concurrent.ExecutorService;
 import java.util.stream.Stream;
-import java.util.Set;
 
 import static java.util.concurrent.Executors.newSingleThreadScheduledExecutor;
 import static org.onlab.util.Tools.groupedThreads;
+import static org.onosproject.provider.host.impl.OsgiPropertyConstants.*;
 import static org.slf4j.LoggerFactory.getLogger;
 
 /**
  * Provider which uses an OpenFlow controller to detect network end-station
  * hosts.
  */
-@Component(immediate = true)
-@Service
+@Component(immediate = true, service = HostProvider.class,
+        property = {
+                HOST_REMOVAL_ENABLED + ":Boolean=" + HOST_REMOVAL_ENABLED_DEFAULT,
+                REQUEST_ARP + ":Boolean=" + REQUEST_ARP_DEFAULT,
+                REQUEST_NDP + ":Boolean=" + REQUEST_NDP_DEFAULT,
+                USE_DHCP + ":Boolean=" + USE_DHCP_DEFAULT,
+                USE_DHCP6 + ":Boolean=" + USE_DHCP6_DEFAULT,
+                REQUEST_INTERCEPTS_ENABLED + ":Boolean=" + REQUEST_INTERCEPTS_ENABLED_DEFAULT,
+                MULTIHOMING_ENABLED + ":Boolean=" + MULTIHOMING_ENABLED_DEFAULT,
+        })
 public class HostLocationProvider extends AbstractProvider implements HostProvider {
     private final Logger log = getLogger(getClass());
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected CoreService coreService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected HostProviderRegistry providerRegistry;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected PacketService packetService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected TopologyService topologyService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected HostService hostService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected DeviceService deviceService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected ComponentConfigService cfgService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected NetworkConfigRegistry registry;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected InterfaceService interfaceService;
 
     private final InternalHostProvider processor = new InternalHostProvider();
@@ -149,34 +156,25 @@
 
     private ApplicationId appId;
 
-    @Property(name = "hostRemovalEnabled", boolValue = true,
-            label = "Enable host removal on port/device down events")
+    /** Enable host removal on port/device down events. */
     private boolean hostRemovalEnabled = true;
 
-    @Property(name = "requestArp", boolValue = true,
-            label = "Request ARP packets for neighbor discovery by the " +
-                    "Host Location Provider; default is true")
+    /** Request ARP packets for neighbor discovery by the Host Location Provider; default is true. */
     private boolean requestArp = true;
 
-    @Property(name = "requestIpv6ND", boolValue = false,
-            label = "Requests IPv6 Neighbor Discovery by the " +
-                    "Host Location Provider; default is false")
+    /** Requests IPv6 Neighbor Discovery by the Host Location Provider; default is false. */
     private boolean requestIpv6ND = false;
 
-    @Property(name = "useDhcp", boolValue = false,
-            label = "Use DHCP to update IP address of the host; default is false")
+    /** Use DHCP to update IP address of the host; default is false. */
     private boolean useDhcp = false;
 
-    @Property(name = "useDhcp6", boolValue = false,
-            label = "Use DHCPv6 to update IP address of the host; default is false")
+    /** Use DHCPv6 to update IP address of the host; default is false. */
     private boolean useDhcp6 = false;
 
-    @Property(name = "requestInterceptsEnabled", boolValue = true,
-            label = "Enable requesting packet intercepts")
+    /** Enable requesting packet intercepts. */
     private boolean requestInterceptsEnabled = true;
 
-    @Property(name = "multihomingEnabled", boolValue = false,
-            label = "Allow hosts to be multihomed")
+    /** Allow hosts to be multihomed. */
     private boolean multihomingEnabled = false;
 
     private HostProviderService providerService;
@@ -185,7 +183,7 @@
     private ExecutorService probeEventHandler;
     private ExecutorService packetHandler;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected NetworkConfigService netcfgService;
 
     private ConfigFactory<ConnectPoint, HostLearningConfig> hostLearningConfig =
@@ -316,7 +314,7 @@
         Dictionary<?, ?> properties = context.getProperties();
         Boolean flag;
 
-        flag = Tools.isPropertyEnabled(properties, "hostRemovalEnabled");
+        flag = Tools.isPropertyEnabled(properties, HOST_REMOVAL_ENABLED);
         if (flag == null) {
             log.info("Host removal on port/device down events is not configured, " +
                      "using current value of {}", hostRemovalEnabled);
@@ -326,7 +324,7 @@
                      hostRemovalEnabled ? "enabled" : "disabled");
         }
 
-        flag = Tools.isPropertyEnabled(properties, "requestArp");
+        flag = Tools.isPropertyEnabled(properties, REQUEST_ARP);
         if (flag == null) {
             log.info("Using ARP is not configured, " +
                      "using current value of {}", requestArp);
@@ -336,7 +334,7 @@
                      requestArp ? "enabled" : "disabled");
         }
 
-        flag = Tools.isPropertyEnabled(properties, "requestIpv6ND");
+        flag = Tools.isPropertyEnabled(properties, REQUEST_NDP);
         if (flag == null) {
             log.info("Using IPv6 Neighbor Discovery is not configured, " +
                              "using current value of {}", requestIpv6ND);
@@ -346,7 +344,7 @@
                      requestIpv6ND ? "enabled" : "disabled");
         }
 
-        flag = Tools.isPropertyEnabled(properties, "useDhcp");
+        flag = Tools.isPropertyEnabled(properties, USE_DHCP);
         if (flag == null) {
             log.info("Using DHCP is not configured, " +
                      "using current value of {}", useDhcp);
@@ -356,7 +354,17 @@
                      useDhcp ? "enabled" : "disabled");
         }
 
-        flag = Tools.isPropertyEnabled(properties, "requestInterceptsEnabled");
+        flag = Tools.isPropertyEnabled(properties, USE_DHCP6);
+        if (flag == null) {
+            log.info("Using DHCP6 is not configured, " +
+                             "using current value of {}", useDhcp6);
+        } else {
+            useDhcp6 = flag;
+            log.info("Configured. Using DHCP6 is {}",
+                     useDhcp6 ? "enabled" : "disabled");
+        }
+
+        flag = Tools.isPropertyEnabled(properties, REQUEST_INTERCEPTS_ENABLED);
         if (flag == null) {
             log.info("Request intercepts is not configured, " +
                      "using current value of {}", requestInterceptsEnabled);
@@ -366,7 +374,7 @@
                      requestInterceptsEnabled ? "enabled" : "disabled");
         }
 
-        flag = Tools.isPropertyEnabled(properties, "multihomingEnabled");
+        flag = Tools.isPropertyEnabled(properties, MULTIHOMING_ENABLED);
         if (flag == null) {
             log.info("Multihoming is not configured, " +
                     "using current value of {}", multihomingEnabled);
diff --git a/providers/host/src/main/java/org/onosproject/provider/host/impl/OsgiPropertyConstants.java b/providers/host/src/main/java/org/onosproject/provider/host/impl/OsgiPropertyConstants.java
new file mode 100644
index 0000000..eb8dafe
--- /dev/null
+++ b/providers/host/src/main/java/org/onosproject/provider/host/impl/OsgiPropertyConstants.java
@@ -0,0 +1,48 @@
+/*
+ * Copyright 2018-present Open Networking Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.onosproject.provider.host.impl;
+
+/**
+ * Name/Value constants for properties.
+ */
+
+public final class OsgiPropertyConstants {
+
+    private OsgiPropertyConstants() {
+    }
+
+    public static final String HOST_REMOVAL_ENABLED = "hostRemovalEnabled:Boolean=true";
+    public static final boolean HOST_REMOVAL_ENABLED_DEFAULT = true;
+
+    public static final String REQUEST_ARP = "requestArp";
+    public static final boolean REQUEST_ARP_DEFAULT = true;
+
+    public static final String REQUEST_NDP = "requestIpv6ND";
+    public static final boolean REQUEST_NDP_DEFAULT = false;
+
+    public static final String USE_DHCP = "useDhcp";
+    public static final boolean USE_DHCP_DEFAULT = false;
+
+    public static final String USE_DHCP6 = "useDhcp6";
+    public static final boolean USE_DHCP6_DEFAULT = false;
+
+    public static final String REQUEST_INTERCEPTS_ENABLED = "requestInterceptsEnabled";
+    public static final boolean REQUEST_INTERCEPTS_ENABLED_DEFAULT = true;
+
+    public static final String MULTIHOMING_ENABLED = "multihomingEnabled";
+    public static final boolean MULTIHOMING_ENABLED_DEFAULT = false;
+}
diff --git a/providers/hostprobing/BUCK b/providers/hostprobing/BUCK
deleted file mode 100644
index 21bf493..0000000
--- a/providers/hostprobing/BUCK
+++ /dev/null
@@ -1,22 +0,0 @@
-COMPILE_DEPS = [
-    '//lib:CORE_DEPS',
-    '//incubator/api:onos-incubator-api',
-]
-
-TEST_DEPS = [
-    '//lib:TEST_ADAPTERS',
-    '//utils/osgi:onlab-osgi-tests',
-]
-
-osgi_jar_with_tests (
-    deps = COMPILE_DEPS,
-    test_deps = TEST_DEPS,
-)
-
-onos_app (
-    app_name = 'org.onosproject.hostprobingprovider',
-    title = 'Host Probing Provider',
-    category = 'Provider',
-    url = 'http://onosproject.org',
-    description = 'Provides host probing mechanism that discovers or verifies the existence of a host at specific location',
-)
diff --git a/providers/hostprobing/src/main/java/org/onosproject/provider/hostprobing/impl/DefaultHostProbingProvider.java b/providers/hostprobing/src/main/java/org/onosproject/provider/hostprobing/impl/DefaultHostProbingProvider.java
index dfcbf0b..d590570 100644
--- a/providers/hostprobing/src/main/java/org/onosproject/provider/hostprobing/impl/DefaultHostProbingProvider.java
+++ b/providers/hostprobing/src/main/java/org/onosproject/provider/hostprobing/impl/DefaultHostProbingProvider.java
@@ -16,12 +16,6 @@
 
 package org.onosproject.provider.hostprobing.impl;
 
-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.packet.ARP;
 import org.onlab.packet.Ethernet;
 import org.onlab.packet.IPv6;
@@ -53,6 +47,11 @@
 import org.onosproject.net.provider.AbstractProvider;
 import org.onosproject.net.provider.ProviderId;
 import org.osgi.service.component.ComponentContext;
+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.nio.ByteBuffer;
@@ -69,21 +68,20 @@
 /**
  * Provider which sends host location probes to discover or verify a host at specific location.
  */
-@Component(immediate = true)
-@Service
+@Component(immediate = true, service = { HostProvider.class, HostProbingProvider.class })
 public class DefaultHostProbingProvider extends AbstractProvider implements HostProvider, HostProbingProvider {
     private final Logger log = getLogger(getClass());
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     private HostProviderRegistry providerRegistry;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     private HostProbingProviderRegistry hostProbingProviderRegistry;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     private PacketService packetService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     private MastershipService mastershipService;
 
     private HostProviderService providerService;
diff --git a/providers/ietfte/app/app.xml b/providers/ietfte/app/app.xml
deleted file mode 100644
index ecda3bf..0000000
--- a/providers/ietfte/app/app.xml
+++ /dev/null
@@ -1,29 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-  ~ Copyright 2016-present Open Networking Foundation
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~     http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License.
-  -->
-<app name="org.onosproject.teprovider" origin="HUAWEI" version="${project.version}"
-     category="Provider" url="http://onosproject.org" title="RESTCONF TE Topology Provider"
-     featuresRepo="mvn:${project.groupId}/${project.artifactId}/${project.version}/xml/features"
-     features="${project.artifactId}">
-    <description>${project.description}</description>
-    <artifact>mvn:${project.groupId}/onos-restconf-client-api/${project.version}</artifact>
-    <artifact>mvn:${project.groupId}/onos-restconf-client-ctl/${project.version}</artifact>
-
-    <artifact>mvn:${project.groupId}/onos-ietfte-provider-utils/${project.version}</artifact>
-    <artifact>mvn:${project.groupId}/onos-ietfte-provider-topology/${project.version}</artifact>
-    <artifact>mvn:${project.groupId}/onos-ietfte-provider-tunnel/${project.version}</artifact>
-    <artifact>mvn:${project.groupId}/onos-apps-tenbi-yangmodel/${project.version}</artifact>
-</app>
diff --git a/providers/ietfte/app/features.xml b/providers/ietfte/app/features.xml
deleted file mode 100644
index 21d17eb..0000000
--- a/providers/ietfte/app/features.xml
+++ /dev/null
@@ -1,41 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
-<!--
-  ~ Copyright 2016-present Open Networking Foundation
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~     http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License.
-  -->
-<features xmlns="http://karaf.apache.org/xmlns/features/v1.2.0" name="${project.artifactId}-${project.version}">
-    <repository>mvn:${project.groupId}/onos-apps-tenbi-yangmodel/${project.version}/xml/features</repository>
-    <feature name="${project.artifactId}" version="${project.version}"
-             description="${project.description}">
-        <feature>onos-api</feature>
-        <feature>onos-apps-tenbi-yangmodel</feature>
-        <bundle>mvn:${project.groupId}/onos-restsb-api/${project.version}</bundle>
-        <bundle>mvn:org.apache.httpcomponents/httpclient-osgi/4.5.1</bundle>
-        <bundle>mvn:org.apache.httpcomponents/httpcore-osgi/4.4.4</bundle>
-
-        <bundle>mvn:${project.groupId}/onos-restconf-client-api/${project.version}</bundle>
-        <bundle>mvn:${project.groupId}/onos-restconf-client-ctl/${project.version}</bundle>
-
-        <bundle>mvn:${project.groupId}/onos-apps-tetunnel-api/${project.version}</bundle>
-        <bundle>mvn:${project.groupId}/onos-apps-tetopology/${project.version}</bundle>
-        <bundle>mvn:${project.groupId}/onos-apps-yms-api/${project.version}</bundle>
-        <bundle>mvn:${project.groupId}/onos-apps-tenbi-utils/${project.version}</bundle>
-        <bundle>mvn:${project.groupId}/onos-restconf-server-utils/${project.version}</bundle>
-
-        <bundle>mvn:${project.groupId}/onos-ietfte-provider-utils/${project.version}</bundle>
-        <bundle>mvn:${project.groupId}/onos-ietfte-provider-topology/${project.version}</bundle>
-        <bundle>mvn:${project.groupId}/onos-ietfte-provider-tunnel/${project.version}</bundle>
-    </feature>
-</features>
-
diff --git a/providers/ietfte/topology/src/main/java/org/onosproject/provider/te/topology/TeTopologyRestconfProvider.java b/providers/ietfte/topology/src/main/java/org/onosproject/provider/te/topology/TeTopologyRestconfProvider.java
index 82cc93c..8bc44da 100644
--- a/providers/ietfte/topology/src/main/java/org/onosproject/provider/te/topology/TeTopologyRestconfProvider.java
+++ b/providers/ietfte/topology/src/main/java/org/onosproject/provider/te/topology/TeTopologyRestconfProvider.java
@@ -34,11 +34,11 @@
 import java.util.concurrent.Executors;
 
 import org.apache.commons.io.IOUtils;
-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.onosproject.core.ApplicationId;
 import org.onosproject.core.CoreService;
 import org.onosproject.incubator.net.config.basics.ConfigException;
@@ -107,25 +107,25 @@
 
     private final Logger log = getLogger(getClass());
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected DeviceProviderRegistry deviceProviderRegistry;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected TeTopologyProviderRegistry topologyProviderRegistry;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected RestConfSBController restconfClient;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected NetworkConfigRegistry cfgService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected CoreService coreService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected YmsService ymsService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected TeTopologyService teTopologyService;
 
     private YangCodecHandler codecHandler;
diff --git a/providers/ietfte/tunnel/src/main/java/org/onosproject/provider/te/tunnel/TeTunnelRestconfProvider.java b/providers/ietfte/tunnel/src/main/java/org/onosproject/provider/te/tunnel/TeTunnelRestconfProvider.java
index 33d33f9..3c765aa 100644
--- a/providers/ietfte/tunnel/src/main/java/org/onosproject/provider/te/tunnel/TeTunnelRestconfProvider.java
+++ b/providers/ietfte/tunnel/src/main/java/org/onosproject/provider/te/tunnel/TeTunnelRestconfProvider.java
@@ -18,11 +18,11 @@
 
 import com.fasterxml.jackson.databind.JsonNode;
 import com.fasterxml.jackson.databind.node.ObjectNode;
-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.onosproject.incubator.net.tunnel.Tunnel;
 import org.onosproject.incubator.net.tunnel.TunnelDescription;
 import org.onosproject.incubator.net.tunnel.TunnelId;
@@ -100,22 +100,22 @@
     //private final RestconfNotificationEventListener listener =
     //        new InternalTunnelNotificationListener();
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected RestConfSBController controller;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected YmsService ymsService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected TeTunnelService tunnelService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected TeTunnelProviderService providerService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected TeTopologyService topologyService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected TunnelProviderRegistry tunnelProviderRegistry;
 
     private YangCodecHandler codecHandler;
diff --git a/providers/isis/BUCK b/providers/isis/BUCK
deleted file mode 100644
index adc7a6f..0000000
--- a/providers/isis/BUCK
+++ /dev/null
@@ -1,16 +0,0 @@
-BUNDLES = [
-    '//protocols/isis/api:onos-protocols-isis-api',
-    '//protocols/isis/ctl:onos-protocols-isis-ctl',
-    '//protocols/isis/isisio:onos-protocols-isis-isisio',
-    '//providers/isis/cfg:onos-providers-isis-cfg',
-    '//providers/isis/topology:onos-providers-isis-topology',
-]
-
-onos_app (
-    title = 'ISIS Provider',
-    category = 'Provider',
-    url = 'http://onosproject.org',
-    description = 'ONOS ISIS protocol adapters.',
-    included_bundles = BUNDLES,
-)
-
diff --git a/providers/isis/app/app.xml b/providers/isis/app/app.xml
deleted file mode 100644
index f3441e3..0000000
--- a/providers/isis/app/app.xml
+++ /dev/null
@@ -1,27 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-  ~ Copyright 2016-present Open Networking Foundation
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~     http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License.
-  -->
-<app name="org.onosproject.isis" origin="ON.Lab" version="${project.version}"
-     featuresRepo="mvn:${project.groupId}/${project.artifactId}/${project.version}/xml/features"
-     features="${project.artifactId}">
-    <description>${project.description}</description>
-    <artifact>mvn:${project.groupId}/onos-isis-api/${project.version}</artifact>
-    <artifact>mvn:${project.groupId}/onos-isis-isisio/${project.version}</artifact>
-    <artifact>mvn:${project.groupId}/onos-isis-ctl/${project.version}</artifact>
-    <artifact>mvn:${project.groupId}/onos-isis-provider-topology/${project.version}</artifact>
-    <artifact>mvn:${project.groupId}/onos-isis-provider-cfg/${project.version}</artifact>
-    <artifact>mvn:${project.groupId}/onos-isis-provider-cli/${project.version}</artifact>
-</app>
\ No newline at end of file
diff --git a/providers/isis/app/features.xml b/providers/isis/app/features.xml
deleted file mode 100644
index daacf34..0000000
--- a/providers/isis/app/features.xml
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
-<!--
-  ~ Copyright 2016-present Open Networking Foundation
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~     http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License.
-  -->
-<features xmlns="http://karaf.apache.org/xmlns/features/v1.2.0" name="${project.artifactId}-${project.version}">
-    <feature name="${project.artifactId}" version="${project.version}"
-             description="${project.description}">
-        <feature>onos-api</feature>
-        <bundle>mvn:${project.groupId}/onos-isis-api/${project.version}</bundle>
-        <bundle>mvn:${project.groupId}/onos-isis-isisio/${project.version}</bundle>
-        <bundle>mvn:${project.groupId}/onos-isis-ctl/${project.version}</bundle>
-        <bundle>mvn:${project.groupId}/onos-isis-provider-topology/${project.version}</bundle>
-        <bundle>mvn:${project.groupId}/onos-isis-provider-cfg/${project.version}</bundle>
-        <bundle>mvn:${project.groupId}/onos-isis-provider-cli/${project.version}</bundle>
-    </feature>
-</features>
\ No newline at end of file
diff --git a/providers/isis/cfg/BUCK b/providers/isis/cfg/BUCK
deleted file mode 100644
index 494b810..0000000
--- a/providers/isis/cfg/BUCK
+++ /dev/null
@@ -1,10 +0,0 @@
-COMPILE_DEPS = [
-    '//lib:CORE_DEPS',
-    '//lib:JACKSON',
-    '//protocols/isis/api:onos-protocols-isis-api',
-]
-
-osgi_jar_with_tests (
-    deps = COMPILE_DEPS,
-)
-
diff --git a/providers/isis/cfg/src/main/java/org/onosproject/provider/isis/cfg/impl/IsisAppConfig.java b/providers/isis/cfg/src/main/java/org/onosproject/provider/isis/cfg/impl/IsisAppConfig.java
index ca5b5bd..a880bd0 100644
--- a/providers/isis/cfg/src/main/java/org/onosproject/provider/isis/cfg/impl/IsisAppConfig.java
+++ b/providers/isis/cfg/src/main/java/org/onosproject/provider/isis/cfg/impl/IsisAppConfig.java
@@ -17,8 +17,8 @@
 package org.onosproject.provider.isis.cfg.impl;
 
 import com.fasterxml.jackson.databind.JsonNode;
-import org.apache.felix.scr.annotations.Reference;
-import org.apache.felix.scr.annotations.ReferenceCardinality;
+import org.osgi.service.component.annotations.Reference;
+import org.osgi.service.component.annotations.ReferenceCardinality;
 import org.onlab.osgi.DefaultServiceDirectory;
 import org.onosproject.core.ApplicationId;
 import org.onosproject.isis.controller.IsisController;
@@ -31,7 +31,7 @@
     public static final String METHOD = "method";
     public static final String PROCESSES = "processes";
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     IsisController isisController;
 
     /**
diff --git a/providers/isis/cfg/src/main/java/org/onosproject/provider/isis/cfg/impl/IsisCfgProvider.java b/providers/isis/cfg/src/main/java/org/onosproject/provider/isis/cfg/impl/IsisCfgProvider.java
index 45000e9..f25d00d 100644
--- a/providers/isis/cfg/src/main/java/org/onosproject/provider/isis/cfg/impl/IsisCfgProvider.java
+++ b/providers/isis/cfg/src/main/java/org/onosproject/provider/isis/cfg/impl/IsisCfgProvider.java
@@ -17,12 +17,6 @@
 package org.onosproject.provider.isis.cfg.impl;
 
 import com.fasterxml.jackson.databind.JsonNode;
-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.core.ApplicationId;
 import org.onosproject.core.CoreService;
 import org.onosproject.isis.controller.IsisController;
@@ -34,6 +28,11 @@
 import org.onosproject.net.config.basics.SubjectFactories;
 import org.onosproject.net.provider.AbstractProvider;
 import org.onosproject.net.provider.ProviderId;
+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 static org.slf4j.LoggerFactory.getLogger;
@@ -41,8 +40,7 @@
 /**
  * ISIS config provider to validate and populate the configuration.
  */
-@Component(immediate = true)
-@Service
+@Component(immediate = true, service = IsisCfgProvider.class)
 public class IsisCfgProvider extends AbstractProvider {
 
     private static final String PROVIDER_ID = "org.onosproject.provider.isis.cfg";
@@ -55,13 +53,13 @@
                 }
             };
     private final NetworkConfigListener configListener = new InternalConfigListener();
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected IsisController isisController;
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected CoreService coreService;
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected NetworkConfigRegistry configRegistry;
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected NetworkConfigService configService;
     private ApplicationId appId;
 
diff --git a/providers/isis/cli/src/main/java/org/onosproject/isis/cli/ApplicationIsisCommand.java b/providers/isis/cli/src/main/java/org/onosproject/isis/cli/ApplicationIsisCommand.java
index f8566ac..f15555c 100644
--- a/providers/isis/cli/src/main/java/org/onosproject/isis/cli/ApplicationIsisCommand.java
+++ b/providers/isis/cli/src/main/java/org/onosproject/isis/cli/ApplicationIsisCommand.java
@@ -15,10 +15,11 @@
  */
 package org.onosproject.isis.cli;
 
-import org.apache.felix.scr.annotations.Activate;
-import org.apache.felix.scr.annotations.Deactivate;
-import org.apache.karaf.shell.commands.Argument;
-import org.apache.karaf.shell.commands.Command;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
+import org.osgi.service.component.annotations.Activate;
+import org.osgi.service.component.annotations.Deactivate;
+import org.apache.karaf.shell.api.action.Argument;
+import org.apache.karaf.shell.api.action.Command;
 import org.onlab.packet.MacAddress;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.isis.controller.IsisController;
@@ -43,6 +44,7 @@
 /**
  * Lists ISIS neighbors, database and interfaces details.
  */
+@Service
 @Command(scope = "onos", name = "isis", description = "lists database, neighbors and interfaces")
 public class ApplicationIsisCommand extends AbstractShellCommand {
     private static final Logger log = LoggerFactory.getLogger(ApplicationIsisCommand.class);
@@ -74,7 +76,7 @@
     }
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         switch (name) {
             case INTERFACE:
                 displayIsisInterfaces();
diff --git a/providers/isis/cli/src/main/resources/OSGI-INF/blueprint/shell-config.xml b/providers/isis/cli/src/main/resources/OSGI-INF/blueprint/shell-config.xml
deleted file mode 100644
index d8fcd0c..0000000
--- a/providers/isis/cli/src/main/resources/OSGI-INF/blueprint/shell-config.xml
+++ /dev/null
@@ -1,24 +0,0 @@
-<!--
-  ~ Copyright 2016-present Open Networking Foundation
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~     http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License.
-  -->
-<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0">
-
-    <command-bundle xmlns="http://karaf.apache.org/xmlns/shell/v1.1.0">
-        <command>
-            <action class="org.onosproject.isis.cli.ApplicationIsisCommand"/>
-        </command>
-    </command-bundle>
-
-</blueprint>
\ No newline at end of file
diff --git a/providers/isis/topology/BUCK b/providers/isis/topology/BUCK
deleted file mode 100644
index 883ced2..0000000
--- a/providers/isis/topology/BUCK
+++ /dev/null
@@ -1,15 +0,0 @@
-COMPILE_DEPS = [
-    '//lib:CORE_DEPS',
-    '//lib:JACKSON',
-    '//protocols/isis/api:onos-protocols-isis-api',
-    '//protocols/isis/ctl:onos-protocols-isis-ctl',
-]
-
-TEST_DEPS = [
-    '//lib:TEST_ADAPTERS',
-]
-
-osgi_jar_with_tests (
-    deps = COMPILE_DEPS,
-    test_deps = TEST_DEPS,
-)
diff --git a/providers/isis/topology/src/main/java/org/onosproject/provider/isis/topology/impl/IsisTopologyProvider.java b/providers/isis/topology/src/main/java/org/onosproject/provider/isis/topology/impl/IsisTopologyProvider.java
index 05f87bb..a8d3fc7 100644
--- a/providers/isis/topology/src/main/java/org/onosproject/provider/isis/topology/impl/IsisTopologyProvider.java
+++ b/providers/isis/topology/src/main/java/org/onosproject/provider/isis/topology/impl/IsisTopologyProvider.java
@@ -16,11 +16,11 @@
 
 package org.onosproject.provider.isis.topology.impl;
 
-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.ChassisId;
 import org.onlab.util.Bandwidth;
 import org.onosproject.isis.controller.IsisController;
@@ -81,15 +81,15 @@
     // Default values for tunable parameters
     private static final String UNKNOWN = "unknown";
     final InternalTopologyProvider listener = new InternalTopologyProvider();
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected DeviceProviderRegistry deviceProviderRegistry;
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected LinkProviderRegistry linkProviderRegistry;
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected NetworkConfigService networkConfigService;
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected LinkService linkService;
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected IsisController controller;
     //This Interface that defines how this provider can interact with the core.
     private LinkProviderService linkProviderService;
diff --git a/providers/link/BUCK b/providers/link/BUCK
deleted file mode 100644
index c8a288f..0000000
--- a/providers/link/BUCK
+++ /dev/null
@@ -1,21 +0,0 @@
-COMPILE_DEPS = [
-    '//lib:CORE_DEPS',
-]
-
-TEST_DEPS = [
-    '//lib:TEST_ADAPTERS',
-    '//utils/osgi:onlab-osgi-tests',
-]
-
-osgi_jar_with_tests (
-    deps = COMPILE_DEPS,
-    test_deps = TEST_DEPS,
-)
-
-onos_app (
-  app_name = 'org.onosproject.linkdiscovery',
-  title = 'Link Discovery Provider',
-  category = 'Provider',
-  url = 'http://onosproject.org',
-  description = 'ONOS link discovery provider.',
-)
\ No newline at end of file
diff --git a/providers/link/app.xml b/providers/link/app.xml
deleted file mode 100644
index 0541b17..0000000
--- a/providers/link/app.xml
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-
-<!--
-  ~ Copyright 2016-present Open Networking Foundation
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~     http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License.
-  -->
-<app name="org.onosproject.linkdiscovery" origin="acino.eu" version="${project.version}"
-     category="Provider" url="http://onosproject.org" title="ONOS link discovery provider"
-     featuresRepo="mvn:${project.groupId}/${project.artifactId}/${project.version}/xml/features"
-     features="${project.artifactId}">
-    <description>${project.description}</description>
-    <artifact>mvn:${project.groupId}/onos-linkdiscovery-provider/${project.version}</artifact>
-</app>
diff --git a/providers/link/features.xml b/providers/link/features.xml
deleted file mode 100644
index 80b95b7..0000000
--- a/providers/link/features.xml
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
-
-<!--
-  ~ Copyright 2016-present Open Networking Foundation
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~     http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License.
-  --><features xmlns="http://karaf.apache.org/xmlns/features/v1.2.0" name="${project.artifactId}-${project.version}">
-    <feature name="${project.artifactId}" version="${project.version}"
-             description="${project.description}">
-        <feature>onos-api</feature>
-        <bundle>mvn:${project.groupId}/onos-linkdiscovery-provider/${project.version}</bundle>
-    </feature>
-</features>
-
diff --git a/providers/link/src/main/java/org/onosproject/provider/linkdiscovery/impl/LinkDiscoveryProvider.java b/providers/link/src/main/java/org/onosproject/provider/linkdiscovery/impl/LinkDiscoveryProvider.java
index ebf27e1..dba7add 100644
--- a/providers/link/src/main/java/org/onosproject/provider/linkdiscovery/impl/LinkDiscoveryProvider.java
+++ b/providers/link/src/main/java/org/onosproject/provider/linkdiscovery/impl/LinkDiscoveryProvider.java
@@ -16,13 +16,6 @@
 
 package org.onosproject.provider.linkdiscovery.impl;
 
-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.onosproject.cfg.ComponentConfigService;
 import org.onosproject.core.ApplicationId;
 import org.onosproject.core.CoreService;
@@ -45,6 +38,12 @@
 import org.onosproject.net.provider.AbstractProvider;
 import org.onosproject.net.provider.ProviderId;
 import org.osgi.service.component.ComponentContext;
+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.Dictionary;
@@ -59,13 +58,18 @@
 import static java.util.concurrent.TimeUnit.SECONDS;
 import static org.onlab.util.Tools.get;
 import static org.onlab.util.Tools.groupedThreads;
+import static org.onosproject.provider.linkdiscovery.impl.OsgiPropertyConstants.*;
 import static org.slf4j.LoggerFactory.getLogger;
 
 /**
  * Link provider capable of polling the environment using the device driver
  * {@link LinkDiscovery} behaviour.
  */
-@Component(immediate = true)
+@Component(immediate = true,
+        property = {
+                POLL_DELAY_SECONDS + ":Integer=" + POLL_DELAY_SECONDS_DEFAULT,
+                POLL_FREQUENCY_SECONDS + ":Integer=" + POLL_FREQUENCY_SECONDS_DEFAULT,
+        })
 public class LinkDiscoveryProvider extends AbstractProvider
         implements LinkProvider {
 
@@ -73,30 +77,28 @@
     protected static final String SCHEME_NAME = "linkdiscovery";
     private static final String LINK_PROVIDER_PACKAGE = "org.onosproject.provider.linkdiscovery";
     private final Logger log = getLogger(getClass());
-    private static final int DEFAULT_POLL_DELAY_SECONDS = 20;
-    @Property(name = "linkPollDelaySeconds", intValue = DEFAULT_POLL_DELAY_SECONDS,
-            label = "Initial delay (in seconds) for polling link discovery")
-    protected static int linkPollDelaySeconds = DEFAULT_POLL_DELAY_SECONDS;
-    private static final int DEFAULT_POLL_FREQUENCY_SECONDS = 10;
-    @Property(name = "linkPollFrequencySeconds", intValue = DEFAULT_POLL_FREQUENCY_SECONDS,
-            label = "Frequency (in seconds) for polling link discovery")
-    protected static int linkPollFrequencySeconds = DEFAULT_POLL_FREQUENCY_SECONDS;
+
+    /** Initial delay (in seconds) for polling link discovery. */
+    protected static int linkPollDelaySeconds = POLL_DELAY_SECONDS_DEFAULT;
+
+    /** Frequency (in seconds) for polling link discovery. */
+    protected static int linkPollFrequencySeconds = POLL_FREQUENCY_SECONDS_DEFAULT;
 
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected LinkProviderRegistry providerRegistry;
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected CoreService coreService;
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected LinkService linkService;
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected MastershipService mastershipService;
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected DeviceService deviceService;
     protected ScheduledExecutorService executor =
             newScheduledThreadPool(2, groupedThreads("onos/netconf-link",
                                                      "discovery-%d"));
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected ComponentConfigService cfgService;
 
     protected LinkProviderService providerService;
@@ -119,7 +121,7 @@
         cfgService.registerProperties(getClass());
 
         if (context == null) {
-            linkPollFrequencySeconds = DEFAULT_POLL_FREQUENCY_SECONDS;
+            linkPollFrequencySeconds = POLL_FREQUENCY_SECONDS_DEFAULT;
             log.info("No component configuration");
         } else {
             Dictionary<?, ?> properties = context.getProperties();
@@ -167,10 +169,10 @@
     private int getNewPollFrequency(Dictionary<?, ?> properties, int pollFrequency) {
         int newPollFrequency;
         try {
-            String s = get(properties, "linkPollFrequencySeconds");
+            String s = get(properties, POLL_FREQUENCY_SECONDS);
             newPollFrequency = isNullOrEmpty(s) ? pollFrequency : Integer.parseInt(s.trim());
         } catch (NumberFormatException | ClassCastException e) {
-            newPollFrequency = DEFAULT_POLL_FREQUENCY_SECONDS;
+            newPollFrequency = POLL_FREQUENCY_SECONDS_DEFAULT;
         }
         return newPollFrequency;
     }
@@ -178,10 +180,10 @@
     private int getNewPollDealy(Dictionary<?, ?> properties, int pollDelay) {
         int newPollFrequency;
         try {
-            String s = get(properties, "linkPollDelaySeconds");
+            String s = get(properties, POLL_DELAY_SECONDS);
             newPollFrequency = isNullOrEmpty(s) ? pollDelay : Integer.parseInt(s.trim());
         } catch (NumberFormatException | ClassCastException e) {
-            newPollFrequency = DEFAULT_POLL_DELAY_SECONDS;
+            newPollFrequency = POLL_DELAY_SECONDS_DEFAULT;
         }
         return newPollFrequency;
     }
diff --git a/providers/link/src/main/java/org/onosproject/provider/linkdiscovery/impl/OsgiPropertyConstants.java b/providers/link/src/main/java/org/onosproject/provider/linkdiscovery/impl/OsgiPropertyConstants.java
new file mode 100644
index 0000000..4335fac
--- /dev/null
+++ b/providers/link/src/main/java/org/onosproject/provider/linkdiscovery/impl/OsgiPropertyConstants.java
@@ -0,0 +1,32 @@
+/*
+ * Copyright 2018-present Open Networking Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.onosproject.provider.linkdiscovery.impl;
+
+/**
+ * Constants for default values of configurable properties.
+ */
+public final class OsgiPropertyConstants {
+
+    private OsgiPropertyConstants() {}
+
+    public static final String POLL_DELAY_SECONDS = "linkPollDelaySeconds";
+    public static final int POLL_DELAY_SECONDS_DEFAULT = 20;
+
+    public static final String POLL_FREQUENCY_SECONDS = "linkPollFrequencySeconds";
+    public static final int POLL_FREQUENCY_SECONDS_DEFAULT = 10;
+
+}
diff --git a/providers/lisp/BUCK b/providers/lisp/BUCK
deleted file mode 100644
index cad7de2..0000000
--- a/providers/lisp/BUCK
+++ /dev/null
@@ -1,18 +0,0 @@
-BUNDLES = [
-    '//providers/lisp/device:onos-providers-lisp-device',
-    '//providers/lisp/mapping:onos-providers-lisp-mapping',
-    '//providers/lisp/message:onos-providers-lisp-message',
-    '//protocols/lisp/api:onos-protocols-lisp-api',
-    '//protocols/lisp/ctl:onos-protocols-lisp-ctl',
-    '//protocols/lisp/msg:onos-protocols-lisp-msg',
-    '//apps/mappingmanagement/api:onos-apps-mappingmanagement-api',
-]
-
-onos_app (
-    app_name = 'org.onosproject.lisp',
-    title = 'LISP Provider',
-    category = 'Provider',
-    url = 'http://onosproject.org',
-    included_bundles = BUNDLES,
-    description = 'LISP protocol southbound providers.',
-)
diff --git a/providers/lisp/app/app.xml b/providers/lisp/app/app.xml
deleted file mode 100644
index 884b070..0000000
--- a/providers/lisp/app/app.xml
+++ /dev/null
@@ -1,29 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-  ~ Copyright 2016-present Open Networking Foundation
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~     http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License.
-  -->
-<app name="org.onosproject.lisp" origin="ON.Lab" version="${project.version}"
-     category="Provider" title="LISP Provider"
-     featuresRepo="mvn:${project.groupId}/${project.artifactId}/${project.version}/xml/features"
-     features="${project.artifactId}">
-    <description>${project.description}</description>
-    <artifact>mvn:${project.groupId}/onos-lisp-api/${project.version}</artifact>
-    <artifact>mvn:${project.groupId}/onos-lisp-ctl/${project.version}</artifact>
-    <artifact>mvn:${project.groupId}/onos-lisp-msg/${project.version}</artifact>
-
-    <artifact>mvn:${project.groupId}/onos-lisp-provider-device/${project.version}</artifact>
-    <artifact>mvn:${project.groupId}/onos-lisp-provider-mapping/${project.version}</artifact>
-    <artifact>mvn:${project.groupId}/onos-lisp-provider-message/${project.version}</artifact>
-</app>
diff --git a/providers/lisp/app/features.xml b/providers/lisp/app/features.xml
deleted file mode 100644
index 7a925ca..0000000
--- a/providers/lisp/app/features.xml
+++ /dev/null
@@ -1,30 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
-<!--
-  ~ Copyright 2016-present Open Networking Foundation
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~     http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License.
-  -->
-<features xmlns="http://karaf.apache.org/xmlns/features/v1.2.0" name="${project.artifactId}-${project.version}">
-    <feature name="${project.artifactId}" version="${project.version}"
-             description="${project.description}">
-        <feature>onos-api</feature>
-        <bundle>mvn:${project.groupId}/onos-lisp-api/${project.version}</bundle>
-        <bundle>mvn:${project.groupId}/onos-lisp-ctl/${project.version}</bundle>
-        <bundle>mvn:${project.groupId}/onos-lisp-msg/${project.version}</bundle>
-
-        <bundle>mvn:${project.groupId}/onos-lisp-provider-device/${project.version}</bundle>
-        <bundle>mvn:${project.groupId}/onos-lisp-provider-mapping/${project.version}</bundle>
-        <bundle>mvn:${project.groupId}/onos-lisp-provider-message/${project.version}</bundle>
-    </feature>
-</features>
-
diff --git a/providers/lisp/device/BUCK b/providers/lisp/device/BUCK
deleted file mode 100644
index 153579f..0000000
--- a/providers/lisp/device/BUCK
+++ /dev/null
@@ -1,14 +0,0 @@
-COMPILE_DEPS = [
-    '//lib:CORE_DEPS',
-    '//protocols/lisp/api:onos-protocols-lisp-api',
-]
-
-TEST_DEPS = [
-    '//lib:TEST_ADAPTERS',
-    '//protocols/lisp/api:onos-protocols-lisp-api-tests',
-]
-
-osgi_jar_with_tests (
-    deps = COMPILE_DEPS,
-    test_deps = TEST_DEPS,
-)
diff --git a/providers/lisp/device/src/main/java/org/onosproject/provider/lisp/device/impl/LispDeviceProvider.java b/providers/lisp/device/src/main/java/org/onosproject/provider/lisp/device/impl/LispDeviceProvider.java
index 755df17..8317ae8 100644
--- a/providers/lisp/device/src/main/java/org/onosproject/provider/lisp/device/impl/LispDeviceProvider.java
+++ b/providers/lisp/device/src/main/java/org/onosproject/provider/lisp/device/impl/LispDeviceProvider.java
@@ -16,11 +16,11 @@
 package org.onosproject.provider.lisp.device.impl;
 
 import com.google.common.base.Preconditions;
-import org.apache.felix.scr.annotations.Component;
-import org.apache.felix.scr.annotations.Reference;
-import org.apache.felix.scr.annotations.ReferenceCardinality;
-import org.apache.felix.scr.annotations.Activate;
-import org.apache.felix.scr.annotations.Deactivate;
+import org.osgi.service.component.annotations.Component;
+import org.osgi.service.component.annotations.Reference;
+import org.osgi.service.component.annotations.ReferenceCardinality;
+import org.osgi.service.component.annotations.Activate;
+import org.osgi.service.component.annotations.Deactivate;
 
 import org.onlab.packet.ChassisId;
 import org.onosproject.core.ApplicationId;
@@ -57,16 +57,16 @@
 
     private static final Logger log = LoggerFactory.getLogger(LispDeviceProvider.class);
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected DeviceProviderRegistry providerRegistry;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected DeviceService deviceService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected CoreService coreService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected LispController controller;
 
     private static final String APP_NAME = "org.onosproject.lisp";
diff --git a/providers/lisp/mapping/BUCK b/providers/lisp/mapping/BUCK
deleted file mode 100644
index 7e4bb9d..0000000
--- a/providers/lisp/mapping/BUCK
+++ /dev/null
@@ -1,17 +0,0 @@
-COMPILE_DEPS = [
-    '//lib:CORE_DEPS',
-    '//protocols/lisp/api:onos-protocols-lisp-api',
-    '//protocols/lisp/msg:onos-protocols-lisp-msg',
-    '//apps/mappingmanagement/api:onos-apps-mappingmanagement-api',
-]
-
-TEST_DEPS = [
-    '//lib:TEST_ADAPTERS',
-    '//protocols/lisp/api:onos-protocols-lisp-api-tests',
-    '//apps/mappingmanagement/api:onos-apps-mappingmanagement-api-tests',
-]
-
-osgi_jar_with_tests (
-    deps = COMPILE_DEPS,
-    test_deps = TEST_DEPS,
-)
diff --git a/providers/lisp/mapping/src/main/java/org/onosproject/provider/lisp/mapping/impl/LispMappingProvider.java b/providers/lisp/mapping/src/main/java/org/onosproject/provider/lisp/mapping/impl/LispMappingProvider.java
index 0a628d5..d2ced96 100644
--- a/providers/lisp/mapping/src/main/java/org/onosproject/provider/lisp/mapping/impl/LispMappingProvider.java
+++ b/providers/lisp/mapping/src/main/java/org/onosproject/provider/lisp/mapping/impl/LispMappingProvider.java
@@ -16,11 +16,11 @@
 package org.onosproject.provider.lisp.mapping.impl;
 
 import com.google.common.collect.Lists;
-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.onosproject.lisp.ctl.LispController;
 import org.onosproject.lisp.ctl.LispMessageListener;
 import org.onosproject.lisp.ctl.LispRouterId;
@@ -61,13 +61,13 @@
 
     private static final Logger log = LoggerFactory.getLogger(LispMappingProvider.class);
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected LispController controller;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected MappingProviderRegistry providerRegistry;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected DeviceService deviceService;
 
     protected MappingProviderService providerService;
diff --git a/providers/lisp/message/BUCK b/providers/lisp/message/BUCK
deleted file mode 100644
index a711177..0000000
--- a/providers/lisp/message/BUCK
+++ /dev/null
@@ -1,9 +0,0 @@
-COMPILE_DEPS = [
-    '//lib:CORE_DEPS',
-    '//protocols/lisp/api:onos-protocols-lisp-api',
-    '//protocols/lisp/msg:onos-protocols-lisp-msg',
-]
-
-osgi_jar_with_tests (
-    deps = COMPILE_DEPS,
-)
diff --git a/providers/lisp/message/src/main/java/org/onosproject/provider/lisp/message/impl/LispMessageProvider.java b/providers/lisp/message/src/main/java/org/onosproject/provider/lisp/message/impl/LispMessageProvider.java
index 02ea37f..27533ec 100644
--- a/providers/lisp/message/src/main/java/org/onosproject/provider/lisp/message/impl/LispMessageProvider.java
+++ b/providers/lisp/message/src/main/java/org/onosproject/provider/lisp/message/impl/LispMessageProvider.java
@@ -15,11 +15,11 @@
  */
 package org.onosproject.provider.lisp.message.impl;
 
-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.metrics.MetricsService;
 import org.onosproject.lisp.ctl.LispController;
 import org.onosproject.lisp.ctl.LispMessageListener;
@@ -39,10 +39,10 @@
 
     private static final Logger log = LoggerFactory.getLogger(LispMessageProvider.class);
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected LispController controller;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected MetricsService metricsService;
 
     private static final String SCHEME_NAME = "lisp";
diff --git a/providers/lldp/BUCK b/providers/lldp/BUCK
deleted file mode 100644
index 8315f65..0000000
--- a/providers/lldp/BUCK
+++ /dev/null
@@ -1,32 +0,0 @@
-COMPILE_DEPS = [
-    '//lib:CORE_DEPS',
-    '//lib:NETTY',
-    '//lib:JACKSON',
-    '//providers/lldpcommon:onos-providers-lldpcommon',
-    '//lib:org.apache.karaf.shell.console',
-    '//cli:onos-cli',
-]
-
-TEST_DEPS = [
-    '//lib:TEST_ADAPTERS',
-]
-
-BUNDLES = [
-    '//providers/lldpcommon:onos-providers-lldpcommon',
-    '//providers/lldp:onos-providers-lldp',
-]
-
-osgi_jar_with_tests (
-    deps = COMPILE_DEPS,
-    test_deps = TEST_DEPS,
-)
-
-onos_app (
-    app_name = 'org.onosproject.lldpprovider',
-    title = 'LLDP Link Provider',
-    category = 'Provider',
-    url = 'http://onosproject.org',
-    description = 'Provides link discovery to the ONOS core by eavesdropping on the LLDP control packets.',
-    included_bundles = BUNDLES,
-)
-
diff --git a/providers/lldp/BUILD b/providers/lldp/BUILD
index e21966e..ea8287f 100644
--- a/providers/lldp/BUILD
+++ b/providers/lldp/BUILD
@@ -1,7 +1,5 @@
-COMPILE_DEPS = CORE_DEPS + NETTY + JACKSON + [
-    "@org_apache_karaf_shell_console//jar",
+COMPILE_DEPS = CORE_DEPS + NETTY + JACKSON + CLI + [
     "//providers/lldpcommon:onos-providers-lldpcommon",
-    "//cli:onos-cli",
 ]
 
 BUNDLES = [
@@ -10,6 +8,7 @@
 ]
 
 osgi_jar_with_tests(
+    karaf_command_packages = ["org.onosproject.provider.lldp.cli"],
     test_deps = TEST_ADAPTERS,
     deps = COMPILE_DEPS,
 )
diff --git a/providers/lldp/app.xml b/providers/lldp/app.xml
deleted file mode 100644
index 69a2f39..0000000
--- a/providers/lldp/app.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-  ~ Copyright 2016-present Open Networking Foundation
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~     http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License.
-  -->
-<app name="org.onosproject.lldpprovider" origin="Open Networking Foundation" version="${project.version}"
-     category="Provider" url="http://onosproject.org" title="LLDP Link Provider"
-     featuresRepo="mvn:${project.groupId}/${project.artifactId}/${project.version}/xml/features"
-     features="${project.artifactId}">
-    <description>${project.description}</description>
-    <artifact>mvn:${project.groupId}/onos-lldp-provider/${project.version}</artifact>
-    <artifact>mvn:${project.groupId}/onos-lldp-provider-common/${project.version}</artifact>
-
-</app>
diff --git a/providers/lldp/features.xml b/providers/lldp/features.xml
deleted file mode 100644
index f62512b..0000000
--- a/providers/lldp/features.xml
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
-<!--
-  ~ Copyright 2016-present Open Networking Foundation
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~     http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License.
-  --><features xmlns="http://karaf.apache.org/xmlns/features/v1.2.0" name="${project.artifactId}-${project.version}">
-    <feature name="${project.artifactId}" version="${project.version}"
-             description="${project.description}">
-        <feature>onos-api</feature>
-        <bundle>mvn:${project.groupId}/onos-lldp-provider/${project.version}</bundle>
-        <bundle>mvn:${project.groupId}/onos-lldp-provider-common/${project.version}</bundle>
-    </feature>
-</features>
-
diff --git a/providers/lldp/src/main/java/org/onosproject/provider/lldp/cli/ConfigLinkDiscoveryCommand.java b/providers/lldp/src/main/java/org/onosproject/provider/lldp/cli/ConfigLinkDiscoveryCommand.java
index c0ec6a6..834f101 100644
--- a/providers/lldp/src/main/java/org/onosproject/provider/lldp/cli/ConfigLinkDiscoveryCommand.java
+++ b/providers/lldp/src/main/java/org/onosproject/provider/lldp/cli/ConfigLinkDiscoveryCommand.java
@@ -17,9 +17,11 @@
 
 import java.util.Optional;
 
-import org.apache.karaf.shell.commands.Argument;
-import org.apache.karaf.shell.commands.Command;
-import org.apache.karaf.shell.commands.Option;
+import org.apache.karaf.shell.api.action.Argument;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.Completion;
+import org.apache.karaf.shell.api.action.Option;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.cli.net.DeviceIdCompleter;
 import org.onosproject.cli.net.PortNumberCompleter;
@@ -34,23 +36,21 @@
 /**
  *
  */
+@Service
 @Command(scope = "onos", name = "config-link-discovery",
          description = "Adds configuration to disable LLDP link discovery")
 public class ConfigLinkDiscoveryCommand extends AbstractShellCommand {
 
-    // OSGi workaround to introduce package dependency
-    DeviceIdCompleter deviceIdCompleter;
     @Argument(index = 0, name = "device",
             description = "DeviceID",
             required = true)
+    @Completion(DeviceIdCompleter.class)
     String device = null;
 
-
-    // OSGi workaround to introduce package dependency
-    PortNumberCompleter portNumberCompleter;
     @Argument(index = 1, name = "port",
             description = "Port number",
             required = false)
+    @Completion(PortNumberCompleter.class)
     String port = null;
 
     @Option(name = "--remove", aliases = "-r",
@@ -65,7 +65,7 @@
 
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         DeviceService deviceService = get(DeviceService.class);
         NetworkConfigService netcfgService = get(NetworkConfigService.class);
 
diff --git a/providers/lldp/src/main/java/org/onosproject/provider/lldp/impl/LldpLinkProvider.java b/providers/lldp/src/main/java/org/onosproject/provider/lldp/impl/LldpLinkProvider.java
index 3ea56af..6849119 100644
--- a/providers/lldp/src/main/java/org/onosproject/provider/lldp/impl/LldpLinkProvider.java
+++ b/providers/lldp/src/main/java/org/onosproject/provider/lldp/impl/LldpLinkProvider.java
@@ -15,25 +15,9 @@
  */
 package org.onosproject.provider.lldp.impl;
 
-import java.util.Dictionary;
-import java.util.EnumSet;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.Map;
-import java.util.Optional;
-import java.util.Properties;
-import java.util.Set;
-import java.util.concurrent.ConcurrentHashMap;
-import java.util.concurrent.ExecutorService;
-import java.util.concurrent.ScheduledExecutorService;
-
-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 com.google.common.collect.ImmutableMap;
+import com.google.common.collect.ImmutableSet;
+import com.google.common.collect.Maps;
 import org.onlab.packet.Ethernet;
 import org.onosproject.cfg.ComponentConfigService;
 import org.onosproject.cluster.ClusterMetadataService;
@@ -72,11 +56,25 @@
 import org.onosproject.provider.lldpcommon.LinkDiscovery;
 import org.onosproject.provider.lldpcommon.LinkDiscoveryContext;
 import org.osgi.service.component.ComponentContext;
+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 com.google.common.collect.ImmutableMap;
-import com.google.common.collect.ImmutableSet;
-import com.google.common.collect.Maps;
+import java.util.Dictionary;
+import java.util.EnumSet;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Map;
+import java.util.Optional;
+import java.util.Properties;
+import java.util.Set;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.ScheduledExecutorService;
 
 import static com.google.common.base.Strings.isNullOrEmpty;
 import static java.util.concurrent.Executors.newSingleThreadScheduledExecutor;
@@ -89,12 +87,20 @@
 import static org.onosproject.net.config.basics.SubjectFactories.APP_SUBJECT_FACTORY;
 import static org.onosproject.net.config.basics.SubjectFactories.CONNECT_POINT_SUBJECT_FACTORY;
 import static org.onosproject.net.config.basics.SubjectFactories.DEVICE_SUBJECT_FACTORY;
+import static org.onosproject.provider.lldp.impl.OsgiPropertyConstants.*;
 import static org.slf4j.LoggerFactory.getLogger;
 
 /**
  * Provider which uses LLDP and BDDP packets to detect network infrastructure links.
  */
-@Component(immediate = true)
+@Component(immediate = true,
+        property = {
+                PROP_ENABLED + ":Boolean=" + ENABLED_DEFAULT,
+                PROP_USE_BDDP + ":Boolean=" + USE_BDDP_DEFAULT,
+                PROP_PROBE_RATE + ":Integer=" + PROBE_RATE_DEFAULT,
+                PROP_STALE_LINK_AGE + ":Integer=" + STALE_LINK_AGE_DEFAULT,
+                PROP_DISCOVERY_DELAY + ":Integer=" + DISCOVERY_DELAY_DEFAULT,
+        })
 public class LldpLinkProvider extends AbstractProvider implements ProbedLinkProvider {
 
     private static final String PROVIDER_NAME = "org.onosproject.provider.lldp";
@@ -106,39 +112,36 @@
     // When a Device/Port has this annotation, do not send out LLDP/BDDP
     public static final String NO_LLDP = "no-lldp";
 
-    private static final int MAX_RETRIES = 5;
-    private static final int RETRY_DELAY = 1_000; // millis
-
     private final Logger log = getLogger(getClass());
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected CoreService coreService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected LinkProviderRegistry providerRegistry;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected DeviceService deviceService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected LinkService linkService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected PacketService packetService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected MastershipService masterService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected ComponentConfigService cfgService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected ClusterService clusterService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected NetworkConfigRegistry cfgRegistry;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected ClusterMetadataService clusterMetadataService;
 
     private LinkProviderService providerService;
@@ -152,33 +155,20 @@
     private static final long DEVICE_SYNC_DELAY = 5;
     private static final long LINK_PRUNER_DELAY = 3;
 
-    private static final String PROP_ENABLED = "enabled";
-    @Property(name = PROP_ENABLED, boolValue = true,
-            label = "If false, link discovery is disabled")
-    private boolean enabled = false;
+    /** If false, link discovery is disabled. */
+    protected boolean enabled = false;
 
-    private static final String PROP_USE_BDDP = "useBDDP";
-    @Property(name = PROP_USE_BDDP, boolValue = true,
-            label = "Use BDDP for link discovery")
-    private boolean useBddp = true;
+    /** Use BDDP for link discovery. */
+    protected boolean useBddp = USE_BDDP_DEFAULT;
 
-    private static final String PROP_PROBE_RATE = "probeRate";
-    private static final int DEFAULT_PROBE_RATE = 3000;
-    @Property(name = PROP_PROBE_RATE, intValue = DEFAULT_PROBE_RATE,
-            label = "LLDP and BDDP probe rate specified in millis")
-    private int probeRate = DEFAULT_PROBE_RATE;
+    /** LLDP and BDDP probe rate specified in millis. */
+    protected int probeRate = PROBE_RATE_DEFAULT;
 
-    private static final String PROP_STALE_LINK_AGE = "staleLinkAge";
-    private static final int DEFAULT_STALE_LINK_AGE = 10000;
-    @Property(name = PROP_STALE_LINK_AGE, intValue = DEFAULT_STALE_LINK_AGE,
-            label = "Number of millis beyond which links will be considered stale")
-    private int staleLinkAge = DEFAULT_STALE_LINK_AGE;
+    /** Number of millis beyond which links will be considered stale. */
+    protected int staleLinkAge = STALE_LINK_AGE_DEFAULT;
 
-    private static final String PROP_DISCOVERY_DELAY = "maxLLDPAge";
-    private static final int DEFAULT_DISCOVERY_DELAY = 1000;
-    @Property(name = PROP_DISCOVERY_DELAY, intValue = DEFAULT_DISCOVERY_DELAY,
-            label = "Number of millis beyond which an LLDP packet will not be accepted")
-    private int maxDiscoveryDelayMs = DEFAULT_DISCOVERY_DELAY;
+    /** Number of millis beyond which an LLDP packet will not be accepted. */
+    private int maxDiscoveryDelayMs = DISCOVERY_DELAY_DEFAULT;
 
     private final LinkDiscoveryContext context = new InternalDiscoveryContext();
     private final InternalRoleListener roleListener = new InternalRoleListener();
diff --git a/providers/lldp/src/main/java/org/onosproject/provider/lldp/impl/OsgiPropertyConstants.java b/providers/lldp/src/main/java/org/onosproject/provider/lldp/impl/OsgiPropertyConstants.java
new file mode 100644
index 0000000..77e7167
--- /dev/null
+++ b/providers/lldp/src/main/java/org/onosproject/provider/lldp/impl/OsgiPropertyConstants.java
@@ -0,0 +1,41 @@
+/*
+ * Copyright 2018-present Open Networking Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.onosproject.provider.lldp.impl;
+
+/**
+ * Constants for default values of configurable properties.
+ */
+public final class OsgiPropertyConstants {
+
+    private OsgiPropertyConstants() {}
+
+    public static final String PROP_ENABLED = "enabled";
+    public static final boolean ENABLED_DEFAULT = true;
+
+    public static final String PROP_USE_BDDP = "useBDDP";
+    public static final boolean USE_BDDP_DEFAULT = true;
+
+    public static final String PROP_PROBE_RATE = "probeRate";
+    public static final int PROBE_RATE_DEFAULT = 3000;
+
+    public static final String PROP_STALE_LINK_AGE = "staleLinkAge";
+    public static final int STALE_LINK_AGE_DEFAULT = 10000;
+
+    public static final String PROP_DISCOVERY_DELAY = "maxDiscoveryDelayMs";
+    public static final int DISCOVERY_DELAY_DEFAULT = 1000;
+
+}
diff --git a/providers/lldp/src/main/resources/OSGI-INF/blueprint/shell-config.xml b/providers/lldp/src/main/resources/OSGI-INF/blueprint/shell-config.xml
deleted file mode 100644
index 504945c..0000000
--- a/providers/lldp/src/main/resources/OSGI-INF/blueprint/shell-config.xml
+++ /dev/null
@@ -1,34 +0,0 @@
-<!--
-  ~ Copyright 2017-present Open Networking Foundation
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~     http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License.
-  -->
-<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0">
-
-    <command-bundle xmlns="http://karaf.apache.org/xmlns/shell/v1.1.0">
-
-        <command>
-            <action class="org.onosproject.provider.lldp.cli.ConfigLinkDiscoveryCommand"/>
-            <completers>
-                <ref component-id="deviceIdCompleter"/>
-                <ref component-id="portNumberCompleter"/>
-                <null/>
-            </completers>
-        </command>
-
-    </command-bundle>
-
-    <bean id="deviceIdCompleter" class="org.onosproject.cli.net.DeviceIdCompleter"/>
-    <bean id="portNumberCompleter" class="org.onosproject.cli.net.PortNumberCompleter"/>
-
-</blueprint>
diff --git a/providers/lldp/src/test/java/org/onosproject/provider/lldp/impl/LldpLinkProviderTest.java b/providers/lldp/src/test/java/org/onosproject/provider/lldp/impl/LldpLinkProviderTest.java
index 8389d09..8e53c9a 100644
--- a/providers/lldp/src/test/java/org/onosproject/provider/lldp/impl/LldpLinkProviderTest.java
+++ b/providers/lldp/src/test/java/org/onosproject/provider/lldp/impl/LldpLinkProviderTest.java
@@ -135,6 +135,7 @@
         replay(coreService);
 
         provider.cfgService = new ComponentConfigAdapter();
+        provider.enabled = false;
         provider.coreService = coreService;
         provider.cfgRegistry = configRegistry;
 
diff --git a/providers/lldpcommon/BUCK b/providers/lldpcommon/BUCK
deleted file mode 100644
index 19fa4e7..0000000
--- a/providers/lldpcommon/BUCK
+++ /dev/null
@@ -1,14 +0,0 @@
-COMPILE_DEPS = [
-    '//lib:CORE_DEPS',
-    '//lib:NETTY',
-]
-
-TEST_DEPS = [
-    '//lib:TEST',
-]
-
-osgi_jar_with_tests (
-    deps = COMPILE_DEPS,
-    test_deps = TEST_DEPS,
-)
-
diff --git a/providers/netcfghost/BUCK b/providers/netcfghost/BUCK
deleted file mode 100644
index dfc8af1..0000000
--- a/providers/netcfghost/BUCK
+++ /dev/null
@@ -1,18 +0,0 @@
-COMPILE_DEPS = [
-    '//lib:CORE_DEPS',
-]
-
-osgi_jar_with_tests (
-    deps = COMPILE_DEPS,
-)
-
-onos_app (
-    app_name = 'org.onosproject.netcfghostprovider',
-    title = 'Network Config Host Provider',
-    category = 'Provider',
-    url = 'http://onosproject.org',
-    description = 'Allows operator to prescribe information about known hosts and their locations ' +
-        'using the network configuration subsystem. Such information takes precedence over ' +
-        'information discovered through other host location providers.',
-)
-
diff --git a/providers/netcfghost/src/main/java/org/onosproject/provider/netcfghost/NetworkConfigHostProvider.java b/providers/netcfghost/src/main/java/org/onosproject/provider/netcfghost/NetworkConfigHostProvider.java
index 38db63a..b820573 100644
--- a/providers/netcfghost/src/main/java/org/onosproject/provider/netcfghost/NetworkConfigHostProvider.java
+++ b/providers/netcfghost/src/main/java/org/onosproject/provider/netcfghost/NetworkConfigHostProvider.java
@@ -16,11 +16,11 @@
 
 package org.onosproject.provider.netcfghost;
 
-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.EthType;
 import org.onlab.packet.IpAddress;
 import org.onlab.packet.MacAddress;
@@ -53,13 +53,13 @@
  */
 @Component(immediate = true)
 public class NetworkConfigHostProvider extends AbstractProvider implements HostProvider {
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected CoreService coreService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected HostProviderRegistry providerRegistry;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected NetworkConfigRegistry networkConfigRegistry;
 
     private ApplicationId appId;
diff --git a/providers/netcfglinks/BUCK b/providers/netcfglinks/BUCK
deleted file mode 100644
index 2b643eb..0000000
--- a/providers/netcfglinks/BUCK
+++ /dev/null
@@ -1,30 +0,0 @@
-COMPILE_DEPS = [
-    '//lib:CORE_DEPS',
-    '//lib:NETTY',
-    '//providers/lldpcommon:onos-providers-lldpcommon',
-]
-
-TEST_DEPS = [
-    '//lib:TEST_ADAPTERS',
-]
-
-BUNDLES = [
-    '//providers/lldpcommon:onos-providers-lldpcommon',
-    '//providers/netcfglinks:onos-providers-netcfglinks',
-]
-
-osgi_jar_with_tests (
-    deps = COMPILE_DEPS,
-    test_deps = TEST_DEPS,
-)
-
-onos_app (
-    app_name = 'org.onosproject.netcfglinksprovider',
-    title = 'Network Config Link Provider',
-    category = 'Provider',
-    url = 'http://onosproject.org',
-    description = 'Allows operator to prescribe information about known infrastructure links and ' +
-        'their state using the network configuration subsystem. Such information takes precedence ' +
-        'over information discovered through other link discovery providers.',
-    included_bundles = BUNDLES,
-)
diff --git a/providers/netcfglinks/app.xml b/providers/netcfglinks/app.xml
deleted file mode 100644
index 83ebb521..0000000
--- a/providers/netcfglinks/app.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-  ~ Copyright 2016-present Open Networking Foundation
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~     http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License.
-  -->
-<app name="org.onosproject.netcfglinksprovider" origin="Open Networking Foundation" version="${project.version}"
-     category="Provider" url="http://onosproject.org" title="Network Config Link Provider"
-     featuresRepo="mvn:${project.groupId}/${project.artifactId}/${project.version}/xml/features"
-     features="${project.artifactId}">
-    <description>${project.description}</description>
-    <artifact>mvn:${project.groupId}/onos-netcfg-links-provider/${project.version}</artifact>
-    <artifact>mvn:${project.groupId}/onos-lldp-provider-common/${project.version}</artifact>
-
-</app>
diff --git a/providers/netcfglinks/features.xml b/providers/netcfglinks/features.xml
deleted file mode 100644
index d69a34e..0000000
--- a/providers/netcfglinks/features.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
-<!--
-  ~ Copyright 2016-present Open Networking Foundation
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~     http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License.
-  -->
-<features xmlns="http://karaf.apache.org/xmlns/features/v1.2.0" name="${project.artifactId}-${project.version}">
-    <feature name="${project.artifactId}" version="${project.version}"
-             description="${project.description}">
-        <feature>onos-api</feature>
-        <bundle>mvn:${project.groupId}/onos-netcfg-links-provider/${project.version}</bundle>
-        <bundle>mvn:${project.groupId}/onos-lldp-provider-common/${project.version}</bundle>
-    </feature>
-</features>
-
diff --git a/providers/netcfglinks/src/main/java/org/onosproject/provider/netcfglinks/NetworkConfigLinksProvider.java b/providers/netcfglinks/src/main/java/org/onosproject/provider/netcfglinks/NetworkConfigLinksProvider.java
index e811f96..ac00cf8 100644
--- a/providers/netcfglinks/src/main/java/org/onosproject/provider/netcfglinks/NetworkConfigLinksProvider.java
+++ b/providers/netcfglinks/src/main/java/org/onosproject/provider/netcfglinks/NetworkConfigLinksProvider.java
@@ -15,18 +15,6 @@
  */
 package org.onosproject.provider.netcfglinks;
 
-import java.util.HashSet;
-import java.util.Map;
-import java.util.Optional;
-import java.util.Set;
-import java.util.concurrent.ConcurrentHashMap;
-
-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.Property;
-import org.apache.felix.scr.annotations.Reference;
-import org.apache.felix.scr.annotations.ReferenceCardinality;
 import org.onlab.packet.Ethernet;
 import org.onlab.packet.ONOSLLDP;
 import org.onosproject.cluster.ClusterMetadataService;
@@ -51,9 +39,9 @@
 import org.onosproject.net.flow.DefaultTrafficSelector;
 import org.onosproject.net.flow.TrafficSelector;
 import org.onosproject.net.link.DefaultLinkDescription;
-import org.onosproject.net.link.ProbedLinkProvider;
 import org.onosproject.net.link.LinkProviderRegistry;
 import org.onosproject.net.link.LinkProviderService;
+import org.onosproject.net.link.ProbedLinkProvider;
 import org.onosproject.net.packet.InboundPacket;
 import org.onosproject.net.packet.PacketContext;
 import org.onosproject.net.packet.PacketPriority;
@@ -61,57 +49,70 @@
 import org.onosproject.net.packet.PacketService;
 import org.onosproject.net.provider.AbstractProvider;
 import org.onosproject.net.provider.ProviderId;
-import org.onosproject.provider.lldpcommon.LinkDiscoveryContext;
 import org.onosproject.provider.lldpcommon.LinkDiscovery;
+import org.onosproject.provider.lldpcommon.LinkDiscoveryContext;
+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.util.HashSet;
+import java.util.Map;
+import java.util.Optional;
+import java.util.Set;
+import java.util.concurrent.ConcurrentHashMap;
+
 import static org.onlab.packet.Ethernet.TYPE_BSN;
 import static org.onlab.packet.Ethernet.TYPE_LLDP;
 import static org.onosproject.net.PortNumber.portNumber;
+import static org.onosproject.provider.netcfglinks.OsgiPropertyConstants.DISCOVERY_DELAY_DEFAULT;
+import static org.onosproject.provider.netcfglinks.OsgiPropertyConstants.PROP_DISCOVERY_DELAY;
+import static org.onosproject.provider.netcfglinks.OsgiPropertyConstants.PROP_PROBE_RATE;
+import static org.onosproject.provider.netcfglinks.OsgiPropertyConstants.PROBE_RATE_DEFAULT;
 
 /**
  * Provider to pre-discover links and devices based on a specified network
  * config.
  */
 
-@Component(immediate = true)
+@Component(immediate = true,
+        property = {
+            PROP_PROBE_RATE + ":Integer=" + PROBE_RATE_DEFAULT,
+            PROP_DISCOVERY_DELAY + ":Integer=" + DISCOVERY_DELAY_DEFAULT,
+        })
 public class NetworkConfigLinksProvider
         extends AbstractProvider
         implements ProbedLinkProvider {
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected LinkProviderRegistry providerRegistry;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected DeviceService deviceService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected PacketService packetService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected MastershipService masterService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected NetworkConfigRegistry netCfgService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected CoreService coreService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected ClusterMetadataService metadataService;
 
-    private static final String PROP_PROBE_RATE = "probeRate";
-    private static final int DEFAULT_PROBE_RATE = 3000;
-    @Property(name = PROP_PROBE_RATE, intValue = DEFAULT_PROBE_RATE,
-            label = "LLDP and BDDP probe rate specified in millis")
-    private int probeRate = DEFAULT_PROBE_RATE;
+    /** LLDP and BDDP probe rate specified in millis. */
+    private int probeRate = PROBE_RATE_DEFAULT;
 
-    private static final String PROP_DISCOVERY_DELAY = "maxLLDPAge";
-    private static final int DEFAULT_DISCOVERY_DELAY = 1000;
-    @Property(name = PROP_DISCOVERY_DELAY, intValue = DEFAULT_DISCOVERY_DELAY,
-            label = "Number of millis beyond which an LLDP packet will not be accepted")
-    private int maxDiscoveryDelayMs = DEFAULT_DISCOVERY_DELAY;
+    /** Number of millis beyond which an LLDP packet will not be accepted. */
+    private int maxDiscoveryDelayMs = DISCOVERY_DELAY_DEFAULT;
 
     // Device link discovery helpers.
     protected final Map<DeviceId, LinkDiscovery> discoverers = new ConcurrentHashMap<>();
diff --git a/providers/netcfglinks/src/main/java/org/onosproject/provider/netcfglinks/OsgiPropertyConstants.java b/providers/netcfglinks/src/main/java/org/onosproject/provider/netcfglinks/OsgiPropertyConstants.java
new file mode 100644
index 0000000..5d718ed
--- /dev/null
+++ b/providers/netcfglinks/src/main/java/org/onosproject/provider/netcfglinks/OsgiPropertyConstants.java
@@ -0,0 +1,32 @@
+/*
+ * Copyright 2018-present Open Networking Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.onosproject.provider.netcfglinks;
+
+/**
+ * Constants for default values of configurable properties.
+ */
+public final class OsgiPropertyConstants {
+
+    private OsgiPropertyConstants() {}
+
+    public static final String PROP_PROBE_RATE = "probeRate";
+    public static final int PROBE_RATE_DEFAULT = 3000;
+
+    public static final String PROP_DISCOVERY_DELAY = "maxLLDPAge";
+    public static final int DISCOVERY_DELAY_DEFAULT = 1000;
+
+}
diff --git a/providers/netconf/BUCK b/providers/netconf/BUCK
deleted file mode 100644
index 92f7a72..0000000
--- a/providers/netconf/BUCK
+++ /dev/null
@@ -1,25 +0,0 @@
-BUNDLES = [
-    '//providers/netconf/device:onos-providers-netconf-device',
-    '//providers/netconf/alarm:onos-providers-netconf-alarm',
-    '//protocols/netconf/api:onos-protocols-netconf-api',
-    '//protocols/netconf/ctl:onos-protocols-netconf-ctl',
-    '//lib:sshd-core',
-]
-
-EXCLUDED_BUNDLES = [
-    '//lib:ganymed-ssh2',
-]
-
-onos_app (
-    title = 'NETCONF Provider',
-    category = 'Provider',
-    url = 'https://wiki.onosproject.org/display/ONOS/NETCONF',
-    included_bundles = BUNDLES,
-    excluded_bundles = EXCLUDED_BUNDLES,
-    description = 'Provides means for ONOS to discover and trigger the initial handshake procedure ' +
-        'with NETCONF from information given by network configuration.' +
-        'Also provides capabilities for receiving asynchronous alarm notifications from devices.',
-    required_apps = [ 'org.onosproject.faultmanagement'],
-)
-
-
diff --git a/providers/netconf/alarm/BUCK b/providers/netconf/alarm/BUCK
deleted file mode 100644
index 761f2ed..0000000
--- a/providers/netconf/alarm/BUCK
+++ /dev/null
@@ -1,10 +0,0 @@
-COMPILE_DEPS = [
-    '//lib:CORE_DEPS',
-    '//incubator/api:onos-incubator-api',
-    '//protocols/netconf/api:onos-protocols-netconf-api',
-    '//protocols/netconf/ctl:onos-protocols-netconf-ctl',
-]
-
-osgi_jar_with_tests (
-    deps = COMPILE_DEPS,
-)
diff --git a/providers/netconf/alarm/src/main/java/org/onosproject/provider/netconf/alarm/NetconfAlarmProvider.java b/providers/netconf/alarm/src/main/java/org/onosproject/provider/netconf/alarm/NetconfAlarmProvider.java
index ec4f8ae..20420cd 100644
--- a/providers/netconf/alarm/src/main/java/org/onosproject/provider/netconf/alarm/NetconfAlarmProvider.java
+++ b/providers/netconf/alarm/src/main/java/org/onosproject/provider/netconf/alarm/NetconfAlarmProvider.java
@@ -18,11 +18,11 @@
 
 import com.google.common.collect.ImmutableList;
 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.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.onosproject.incubator.net.faultmanagement.alarm.Alarm;
 import org.onosproject.incubator.net.faultmanagement.alarm.AlarmProvider;
 import org.onosproject.incubator.net.faultmanagement.alarm.AlarmProviderService;
@@ -61,23 +61,23 @@
 /**
  * Provider which uses an Alarm Manager to keep track of device notifications.
  */
-@Component(immediate = true)
+@Component(immediate = true, service = AlarmProvider.class)
 public class NetconfAlarmProvider extends AbstractProvider implements AlarmProvider {
 
     public static final String ACTIVE = "active";
     private final Logger log = getLogger(getClass());
     private final AlarmTranslator translator = new NetconfAlarmTranslator();
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected AlarmProviderRegistry providerRegistry;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected NetconfController controller;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected DriverService driverService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected DeviceService deviceService;
 
     protected AlarmProviderService providerService;
diff --git a/providers/netconf/app/app.xml b/providers/netconf/app/app.xml
deleted file mode 100644
index 00ce4ff..0000000
--- a/providers/netconf/app/app.xml
+++ /dev/null
@@ -1,29 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-  ~ Copyright 2015-present Open Networking Foundation
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~     http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License.
-  -->
-<app name="org.onosproject.netconf" origin="ON.Lab" version="${project.version}"
-     category="Provider" url="https://wiki.onosproject.org/display/ONOS/NETCONF" title="NETCONF Provider"
-     featuresRepo="mvn:${project.groupId}/${project.artifactId}/${project.version}/xml/features"
-     apps="org.onosproject.faultmanagement"
-     features="${project.artifactId}">
-    <description>${project.description}</description>
-    <artifact>mvn:${project.groupId}/onos-protocols-netconf-api/${project.version}</artifact>
-    <artifact>mvn:${project.groupId}/onos-protocols-netconf-ctl/${project.version}</artifact>
-
-    <artifact>mvn:${project.groupId}/onos-netconf-provider-device/${project.version}</artifact>
-    <artifact>mvn:${project.groupId}/onos-netconf-provider-alarm/${project.version}</artifact>
-
-</app>
diff --git a/providers/netconf/app/features.xml b/providers/netconf/app/features.xml
deleted file mode 100644
index 84d0c3b..0000000
--- a/providers/netconf/app/features.xml
+++ /dev/null
@@ -1,29 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
-<!--
-  ~ Copyright 2015-present Open Networking Foundation
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~     http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License.
-  -->
-<features xmlns="http://karaf.apache.org/xmlns/features/v1.2.0" name="${project.artifactId}-${project.version}">
-    <feature name="${project.artifactId}" version="${project.version}"
-             description="${project.description}">
-        <feature>onos-api</feature>
-        <bundle>mvn:io.netty/netty/3.9.2.Final</bundle>
-        <bundle>mvn:${project.groupId}/onos-protocols-netconf-api/${project.version}</bundle>
-        <bundle>mvn:${project.groupId}/onos-protocols-netconf-ctl/${project.version}</bundle>
-
-        <bundle>mvn:${project.groupId}/onos-netconf-provider-device/${project.version}</bundle>
-        <bundle>mvn:${project.groupId}/onos-netconf-provider-alarm/${project.version}</bundle>
-    </feature>
-</features>
-
diff --git a/providers/netconf/device/BUCK b/providers/netconf/device/BUCK
deleted file mode 100644
index 89ee36b..0000000
--- a/providers/netconf/device/BUCK
+++ /dev/null
@@ -1,15 +0,0 @@
-COMPILE_DEPS = [
-    '//lib:CORE_DEPS',
-    '//lib:JACKSON',
-    '//incubator/api:onos-incubator-api',
-    '//protocols/netconf/api:onos-protocols-netconf-api',
-]
-
-TEST_DEPS = [
-    '//lib:TEST_ADAPTERS',
-]
-
-osgi_jar_with_tests (
-    deps = COMPILE_DEPS,
-    test_deps = TEST_DEPS,
-)
diff --git a/providers/netconf/device/src/main/java/org/onosproject/provider/netconf/device/impl/NetconfDeviceProvider.java b/providers/netconf/device/src/main/java/org/onosproject/provider/netconf/device/impl/NetconfDeviceProvider.java
index 6264b91..d9afbe3 100644
--- a/providers/netconf/device/src/main/java/org/onosproject/provider/netconf/device/impl/NetconfDeviceProvider.java
+++ b/providers/netconf/device/src/main/java/org/onosproject/provider/netconf/device/impl/NetconfDeviceProvider.java
@@ -19,13 +19,6 @@
 import com.google.common.base.Objects;
 import com.google.common.base.Preconditions;
 import com.google.common.util.concurrent.Striped;
-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.onlab.packet.ChassisId;
 import org.onlab.util.Tools;
 import org.onosproject.cfg.ComponentConfigService;
@@ -69,6 +62,12 @@
 import org.onosproject.netconf.NetconfException;
 import org.onosproject.netconf.config.NetconfDeviceConfig;
 import org.osgi.service.component.ComponentContext;
+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.io.IOException;
@@ -95,39 +94,44 @@
 
 import static java.util.concurrent.Executors.newScheduledThreadPool;
 import static org.onlab.util.Tools.groupedThreads;
+import static org.onosproject.provider.netconf.device.impl.OsgiPropertyConstants.*;
 import static org.slf4j.LoggerFactory.getLogger;
 
 /**
  * Provider which uses an NETCONF controller to detect device.
  */
-@Component(immediate = true)
+@Component(immediate = true,
+        property = {
+                POLL_FREQUENCY_SECONDS_DEFAULT + ":Integer=" + POLL_FREQUENCY_SECONDS_DEFAULT,
+                MAX_RETRIES + ":Integer=" + MAX_RETRIES_DEFAULT,
+        })
 public class NetconfDeviceProvider extends AbstractProvider
         implements DeviceProvider {
 
     private final Logger log = getLogger(getClass());
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected DeviceProviderRegistry providerRegistry;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected NetconfController controller;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected NetworkConfigRegistry cfgService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected CoreService coreService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected DeviceService deviceService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected DeviceKeyAdminService deviceKeyAdminService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected MastershipService mastershipService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected ComponentConfigService componentConfigService;
 
 
@@ -141,17 +145,11 @@
     private static final String PORT = "port";
     private static final int CORE_POOL_SIZE = 10;
 
-    private static final int DEFAULT_POLL_FREQUENCY_SECONDS = 30;
-    @Property(name = "pollFrequency", intValue = DEFAULT_POLL_FREQUENCY_SECONDS,
-            label = "Configure poll frequency for port status and statistics; " +
-                    "default is 30 sec")
-    private int pollFrequency = DEFAULT_POLL_FREQUENCY_SECONDS;
+    /** Configure poll frequency for port status and statistics; default is 30 sec. */
+    private int pollFrequency = POLL_FREQUENCY_SECONDS_DEFAULT;
 
-    private static final int DEFAULT_MAX_RETRIES = 5;
-    @Property(name = "maxRetries", intValue = DEFAULT_MAX_RETRIES,
-            label = "Configure maximum allowed number of retries for obtaining list of ports; " +
-                    "default is 5 times")
-    private int maxRetries = DEFAULT_MAX_RETRIES;
+    /** Configure maximum allowed number of retries for obtaining list of ports; default is 5 times. */
+    private int maxRetries = MAX_RETRIES_DEFAULT;
 
     protected ExecutorService executor =
             Executors.newFixedThreadPool(5, groupedThreads("onos/netconfdeviceprovider",
@@ -225,12 +223,11 @@
     public void modified(ComponentContext context) {
         if (context != null) {
             Dictionary<?, ?> properties = context.getProperties();
-            pollFrequency = Tools.getIntegerProperty(properties, "pollFrequency",
-                                                     DEFAULT_POLL_FREQUENCY_SECONDS);
+            pollFrequency = Tools.getIntegerProperty(properties, POLL_FREQUENCY_SECONDS,
+                                                     POLL_FREQUENCY_SECONDS_DEFAULT);
             log.info("Configured. Poll frequency is configured to {} seconds", pollFrequency);
 
-            maxRetries = Tools.getIntegerProperty(properties, "maxRetries",
-                    DEFAULT_MAX_RETRIES);
+            maxRetries = Tools.getIntegerProperty(properties, MAX_RETRIES, MAX_RETRIES_DEFAULT);
             log.info("Configured. Number of retries is configured to {} times", maxRetries);
         }
         if (scheduledTask != null) {
diff --git a/providers/netconf/device/src/main/java/org/onosproject/provider/netconf/device/impl/OsgiPropertyConstants.java b/providers/netconf/device/src/main/java/org/onosproject/provider/netconf/device/impl/OsgiPropertyConstants.java
new file mode 100644
index 0000000..8ededfd
--- /dev/null
+++ b/providers/netconf/device/src/main/java/org/onosproject/provider/netconf/device/impl/OsgiPropertyConstants.java
@@ -0,0 +1,32 @@
+/*
+ * Copyright 2018-present Open Networking Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.onosproject.provider.netconf.device.impl;
+
+/**
+ * Constants for default values of configurable properties.
+ */
+public final class OsgiPropertyConstants {
+
+    private OsgiPropertyConstants() {}
+
+    public static final String POLL_FREQUENCY_SECONDS = "pollFrequency";
+    public static final int POLL_FREQUENCY_SECONDS_DEFAULT = 30;
+
+    public static final String MAX_RETRIES = "maxRetries";
+    public static final int MAX_RETRIES_DEFAULT = 5;
+
+}
diff --git a/providers/null/BUCK b/providers/null/BUCK
deleted file mode 100644
index 8e43e3a..0000000
--- a/providers/null/BUCK
+++ /dev/null
@@ -1,23 +0,0 @@
-COMPILE_DEPS = [
-    '//lib:CORE_DEPS',
-    '//lib:NETTY',
-    '//lib:org.apache.karaf.shell.console',
-    '//cli:onos-cli',
-]
-
-osgi_jar_with_tests (
-    deps = COMPILE_DEPS,
-    resources_root = 'src/main/resources',
-    resources = glob(['src/main/resources/**']),
-    import_packages = '*,org.onosproject.cli.net',
-)
-
-onos_app (
-    title = 'Null Provider Suite',
-    category = 'Test Utility',
-    url = 'http://onosproject.org',
-    description = 'Suite of device, link, host, flow and packet providers that allow the operator ' +
-        'to test ONOS against completely fictional network topology. This is useful for conducting ' +
-        'ONOS core performance tests and for developing features that require only control plane ' +
-        '- and not data plane - functionality. ',
-)
diff --git a/providers/null/BUILD b/providers/null/BUILD
index 9120487..77be221 100644
--- a/providers/null/BUILD
+++ b/providers/null/BUILD
@@ -1,10 +1,7 @@
-COMPILE_DEPS = CORE_DEPS + NETTY + [
-    "@org_apache_karaf_shell_console//jar",
-    "//cli:onos-cli",
-]
+COMPILE_DEPS = CORE_DEPS + NETTY + CLI
 
 osgi_jar_with_tests(
-    import_packages = "*,org.onosproject.cli.net",
+    karaf_command_packages = ["org.onosproject.provider.nil.cli"],
     resources = glob(["src/main/resources/**"]),
     resources_root = "src/main/resources",
     deps = COMPILE_DEPS,
diff --git a/providers/null/src/main/java/org/onosproject/provider/nil/NullProviders.java b/providers/null/src/main/java/org/onosproject/provider/nil/NullProviders.java
index 7c45df3..d95943b 100644
--- a/providers/null/src/main/java/org/onosproject/provider/nil/NullProviders.java
+++ b/providers/null/src/main/java/org/onosproject/provider/nil/NullProviders.java
@@ -15,14 +15,6 @@
  */
 package org.onosproject.provider.nil;
 
-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.osgi.DefaultServiceDirectory;
 import org.onosproject.cfg.ComponentConfigService;
 import org.onosproject.cluster.ClusterService;
@@ -54,6 +46,12 @@
 import org.onosproject.net.provider.AbstractProvider;
 import org.onosproject.net.provider.ProviderId;
 import org.osgi.service.component.ComponentContext;
+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.Dictionary;
@@ -66,14 +64,23 @@
 import static org.onosproject.net.DeviceId.deviceId;
 import static org.onosproject.net.MastershipRole.MASTER;
 import static org.onosproject.net.MastershipRole.NONE;
+import static org.onosproject.provider.nil.OsgiPropertyConstants.*;
 import static org.slf4j.LoggerFactory.getLogger;
 
 /**
  * Provider of a fake network environment, i.e. devices, links, hosts, etc.
  * To be used for benchmarking only.
  */
-@Component(immediate = true)
-@Service(value = NullProviders.class)
+@Component(immediate = true, service = NullProviders.class,
+        property = {
+            ENABLED + ":Boolean=" + ENABLED_DEFAULT,
+            TOPO_SHAPE + "=" + TOPO_SHAPE_DEFAULT,
+            DEVICE_COUNT + ":Integer=" + DEVICE_COUNT_DEFAULT,
+            HOST_COUNT + ":Integer=" +  HOST_COUNT_DEFAULT,
+            PACKET_RATE + ":Integer=" +  PACKET_RATE_DEFAULT,
+            MUTATION_RATE + ":Double=" + MUTATION_RATE_DEFAULT,
+            MASTERSHIP + "=" + MASTERSHIP_DEFAULT,
+        })
 public class NullProviders {
 
     private static final Logger log = getLogger(NullProviders.class);
@@ -85,42 +92,40 @@
             "Settings: enabled={}, topoShape={}, deviceCount={}, " +
                     "hostCount={}, packetRate={}, mutationRate={}";
 
-
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected ClusterService clusterService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected MastershipAdminService mastershipService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected ComponentConfigService cfgService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected DeviceAdminService deviceService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected HostService hostService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected LinkService linkService;
 
-
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected DeviceProviderRegistry deviceProviderRegistry;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected HostProviderRegistry hostProviderRegistry;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected LinkProviderRegistry linkProviderRegistry;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected FlowRuleProviderRegistry flowRuleProviderRegistry;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected GroupProviderRegistry groupProviderRegistry;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected PacketProviderRegistry packetProviderRegistry;
 
     private final NullDeviceProvider deviceProvider = new NullDeviceProvider();
@@ -140,39 +145,26 @@
 
     private TopologySimulator simulator;
 
-    @Property(name = "enabled", boolValue = false,
-            label = "Enables or disables the provider")
+    /** Enables or disables the provider. */
     private boolean enabled = false;
 
-    private static final String DEFAULT_TOPO_SHAPE = "configured";
-    @Property(name = "topoShape", value = DEFAULT_TOPO_SHAPE,
-            label = "Topology shape: configured, linear, reroute, tree, spineleaf, mesh, grid")
-    private String topoShape = DEFAULT_TOPO_SHAPE;
+    /** Topology shape: configured, linear, reroute, tree, spineleaf, mesh, grid. */
+    private String topoShape = TOPO_SHAPE_DEFAULT;
 
-    private static final int DEFAULT_DEVICE_COUNT = 10;
-    @Property(name = "deviceCount", intValue = DEFAULT_DEVICE_COUNT,
-            label = "Number of devices to generate")
-    private int deviceCount = DEFAULT_DEVICE_COUNT;
+    /** Number of devices to generate. */
+    private int deviceCount = DEVICE_COUNT_DEFAULT;
 
-    private static final int DEFAULT_HOST_COUNT = 5;
-    @Property(name = "hostCount", intValue = DEFAULT_HOST_COUNT,
-            label = "Number of host to generate per device")
-    private int hostCount = DEFAULT_HOST_COUNT;
+    /** Number of host to generate per device. */
+    private int hostCount = HOST_COUNT_DEFAULT;
 
-    private static final int DEFAULT_PACKET_RATE = 0;
-    @Property(name = "packetRate", intValue = DEFAULT_PACKET_RATE,
-            label = "Packet-in/s rate; 0 for no packets")
-    private int packetRate = DEFAULT_PACKET_RATE;
+    /** Packet-in/s rate; 0 for no packets. */
+    private int packetRate = PACKET_RATE_DEFAULT;
 
-    private static final double DEFAULT_MUTATION_RATE = 0;
-    @Property(name = "mutationRate", doubleValue = DEFAULT_MUTATION_RATE,
-            label = "Link event/s topology mutation rate; 0 for no mutations")
-    private double mutationRate = DEFAULT_MUTATION_RATE;
+    /** Link event/s topology mutation rate; 0 for no mutations. */
+    private double mutationRate = MUTATION_RATE_DEFAULT;
 
-    private static final String DEFAULT_MASTERSHIP = "random";
-    @Property(name = "mastership", value = DEFAULT_MASTERSHIP,
-            label = "Mastership given as 'random' or 'node1=dpid,dpid/node2=dpid,...'")
-    private String mastership = DEFAULT_MASTERSHIP;
+    /** Mastership given as 'random' or 'node1=dpid,dpid/node2=dpid,...'. */
+    private String mastership = MASTERSHIP_DEFAULT;
 
 
     @Activate
@@ -219,22 +211,22 @@
         double newMutationRate;
         String newTopoShape, newMastership;
         try {
-            String s = get(properties, "enabled");
+            String s = get(properties, ENABLED);
             newEnabled = isNullOrEmpty(s) ? enabled : Boolean.parseBoolean(s.trim());
 
-            newTopoShape = get(properties, "topoShape");
-            newMastership = get(properties, "mastership");
+            newTopoShape = get(properties, TOPO_SHAPE);
+            newMastership = get(properties, MASTERSHIP);
 
-            s = get(properties, "deviceCount");
+            s = get(properties, DEVICE_COUNT);
             newDeviceCount = isNullOrEmpty(s) ? deviceCount : Integer.parseInt(s.trim());
 
-            s = get(properties, "hostCount");
+            s = get(properties, HOST_COUNT);
             newHostCount = isNullOrEmpty(s) ? hostCount : Integer.parseInt(s.trim());
 
-            s = get(properties, "packetRate");
+            s = get(properties, PACKET_RATE);
             newPacketRate = isNullOrEmpty(s) ? packetRate : Integer.parseInt(s.trim());
 
-            s = get(properties, "mutationRate");
+            s = get(properties, MUTATION_RATE);
             newMutationRate = isNullOrEmpty(s) ? mutationRate : Double.parseDouble(s.trim());
 
         } catch (NumberFormatException e) {
@@ -410,7 +402,7 @@
 
     // Re-assigns mastership roles.
     private void reassignMastership() {
-        if (mastership.equals(DEFAULT_MASTERSHIP)) {
+        if (mastership.equals(MASTERSHIP_DEFAULT)) {
             mastershipService.balanceRoles();
         } else {
             NodeId localNode = clusterService.getLocalNode().id();
diff --git a/providers/null/src/main/java/org/onosproject/provider/nil/OsgiPropertyConstants.java b/providers/null/src/main/java/org/onosproject/provider/nil/OsgiPropertyConstants.java
new file mode 100644
index 0000000..8cd6d8e
--- /dev/null
+++ b/providers/null/src/main/java/org/onosproject/provider/nil/OsgiPropertyConstants.java
@@ -0,0 +1,47 @@
+/*
+ * Copyright 2018-present Open Networking Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.onosproject.provider.nil;
+
+/**
+ * Constants for default values of configurable properties.
+ */
+public final class OsgiPropertyConstants {
+
+    private OsgiPropertyConstants() {}
+
+    public static final String ENABLED = "enabled";
+    public static final boolean ENABLED_DEFAULT = false;
+
+    public static final String TOPO_SHAPE = "topoShape";
+    public static final String TOPO_SHAPE_DEFAULT = "configured";
+
+    public static final String DEVICE_COUNT = "deviceCount";
+    public static final int DEVICE_COUNT_DEFAULT = 10;
+
+    public static final String HOST_COUNT = "hostCount";
+    public static final int HOST_COUNT_DEFAULT = 5;
+
+    public static final String PACKET_RATE = "packetRate";
+    public static final int PACKET_RATE_DEFAULT = 0;
+
+    public static final String MUTATION_RATE = "mutationRate";
+    public static final double MUTATION_RATE_DEFAULT = 0;
+
+    public static final String MASTERSHIP = "mastership";
+    public static final String MASTERSHIP_DEFAULT = "random";
+
+}
diff --git a/providers/null/src/main/java/org/onosproject/provider/nil/cli/CreateNullDevice.java b/providers/null/src/main/java/org/onosproject/provider/nil/cli/CreateNullDevice.java
index acb9d22..752ef51 100644
--- a/providers/null/src/main/java/org/onosproject/provider/nil/cli/CreateNullDevice.java
+++ b/providers/null/src/main/java/org/onosproject/provider/nil/cli/CreateNullDevice.java
@@ -15,9 +15,11 @@
  */
 package org.onosproject.provider.nil.cli;
 
-import org.apache.karaf.shell.commands.Argument;
-import org.apache.karaf.shell.commands.Command;
-import org.apache.karaf.shell.commands.Option;
+import org.apache.karaf.shell.api.action.Argument;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.Option;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
+
 import org.onlab.util.Tools;
 import org.onosproject.net.Device;
 import org.onosproject.net.DeviceId;
@@ -30,6 +32,7 @@
 /**
  * Adds a simulated device to the custom topology simulation.
  */
+@Service
 @Command(scope = "onos", name = "null-create-device",
         description = "Adds a simulated device to the custom topology simulation")
 public class CreateNullDevice extends CreateNullEntity {
@@ -70,7 +73,7 @@
     String sw = "0.1.2";
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         NullProviders service = get(NullProviders.class);
         NetworkConfigService cfgService = get(NetworkConfigService.class);
 
diff --git a/providers/null/src/main/java/org/onosproject/provider/nil/cli/CreateNullEntity.java b/providers/null/src/main/java/org/onosproject/provider/nil/cli/CreateNullEntity.java
index a9efa78..237c79d 100644
--- a/providers/null/src/main/java/org/onosproject/provider/nil/cli/CreateNullEntity.java
+++ b/providers/null/src/main/java/org/onosproject/provider/nil/cli/CreateNullEntity.java
@@ -17,6 +17,7 @@
 
 import com.google.common.collect.ImmutableList;
 import com.google.common.primitives.Longs;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onlab.util.Tools;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.net.ConnectPoint;
@@ -33,6 +34,7 @@
 /**
  * Base command for adding simulated entities to the custom topology simulation.
  */
+@Service
 public abstract class CreateNullEntity extends AbstractShellCommand {
 
     protected static final String GEO = "geo";
diff --git a/providers/null/src/main/java/org/onosproject/provider/nil/cli/CreateNullHost.java b/providers/null/src/main/java/org/onosproject/provider/nil/cli/CreateNullHost.java
index d079b23..2eb3fe3 100644
--- a/providers/null/src/main/java/org/onosproject/provider/nil/cli/CreateNullHost.java
+++ b/providers/null/src/main/java/org/onosproject/provider/nil/cli/CreateNullHost.java
@@ -17,8 +17,9 @@
 package org.onosproject.provider.nil.cli;
 
 import com.google.common.collect.ImmutableSet;
-import org.apache.karaf.shell.commands.Argument;
-import org.apache.karaf.shell.commands.Command;
+import org.apache.karaf.shell.api.action.Argument;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onlab.packet.IpAddress;
 import org.onlab.util.Tools;
 import org.onosproject.net.ConnectPoint;
@@ -38,6 +39,7 @@
 /**
  * Adds a simulated end-station host to the custom topology simulation.
  */
+@Service
 @Command(scope = "onos", name = "null-create-host",
         description = "Adds a simulated end-station host to the custom topology simulation")
 public class CreateNullHost extends CreateNullEntity {
@@ -65,7 +67,7 @@
     String locType = GEO;
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         NullProviders service = get(NullProviders.class);
         NetworkConfigService cfgService = get(NetworkConfigService.class);
 
diff --git a/providers/null/src/main/java/org/onosproject/provider/nil/cli/CreateNullHosts.java b/providers/null/src/main/java/org/onosproject/provider/nil/cli/CreateNullHosts.java
index c9b9301..cf769fd 100644
--- a/providers/null/src/main/java/org/onosproject/provider/nil/cli/CreateNullHosts.java
+++ b/providers/null/src/main/java/org/onosproject/provider/nil/cli/CreateNullHosts.java
@@ -16,8 +16,9 @@
 
 package org.onosproject.provider.nil.cli;
 
-import org.apache.karaf.shell.commands.Argument;
-import org.apache.karaf.shell.commands.Command;
+import org.apache.karaf.shell.api.action.Argument;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onlab.packet.IpAddress;
 import org.onlab.util.Tools;
 import org.onosproject.net.ConnectPoint;
@@ -34,6 +35,7 @@
 /**
  * Adds a simulated end-station host to the custom topology simulation.
  */
+@Service
 @Command(scope = "onos", name = "null-create-hosts",
         description = "Adds a simulated end-station host to the custom topology simulation")
 public class CreateNullHosts extends CreateNullEntity {
@@ -69,7 +71,7 @@
 
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         NullProviders service = get(NullProviders.class);
         NetworkConfigService cfgService = get(NetworkConfigService.class);
 
diff --git a/providers/null/src/main/java/org/onosproject/provider/nil/cli/CreateNullLink.java b/providers/null/src/main/java/org/onosproject/provider/nil/cli/CreateNullLink.java
index 72e1781..5063e12 100644
--- a/providers/null/src/main/java/org/onosproject/provider/nil/cli/CreateNullLink.java
+++ b/providers/null/src/main/java/org/onosproject/provider/nil/cli/CreateNullLink.java
@@ -16,9 +16,10 @@
 
 package org.onosproject.provider.nil.cli;
 
-import org.apache.karaf.shell.commands.Argument;
-import org.apache.karaf.shell.commands.Command;
-import org.apache.karaf.shell.commands.Option;
+import org.apache.karaf.shell.api.action.Argument;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.Option;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.net.ConnectPoint;
 import org.onosproject.net.Link;
 import org.onosproject.provider.nil.CustomTopologySimulator;
@@ -28,6 +29,7 @@
 /**
  * Adds a simulated link to the custom topology simulation.
  */
+@Service
 @Command(scope = "onos", name = "null-create-link",
         description = "Adds a simulated link to the custom topology simulation")
 public class CreateNullLink extends CreateNullEntity {
@@ -48,7 +50,7 @@
     private boolean unidirectional = false;
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         NullProviders service = get(NullProviders.class);
 
         TopologySimulator simulator = service.currentSimulator();
diff --git a/providers/null/src/main/java/org/onosproject/provider/nil/cli/NullControlCommand.java b/providers/null/src/main/java/org/onosproject/provider/nil/cli/NullControlCommand.java
index 0b3fbe3..1be41d6 100644
--- a/providers/null/src/main/java/org/onosproject/provider/nil/cli/NullControlCommand.java
+++ b/providers/null/src/main/java/org/onosproject/provider/nil/cli/NullControlCommand.java
@@ -15,10 +15,13 @@
  */
 package org.onosproject.provider.nil.cli;
 
-import org.apache.karaf.shell.commands.Argument;
-import org.apache.karaf.shell.commands.Command;
+import org.apache.karaf.shell.api.action.Argument;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.Completion;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.cfg.ComponentConfigService;
 import org.onosproject.cli.AbstractShellCommand;
+import org.onosproject.cli.StartStopCompleter;
 import org.onosproject.provider.nil.NullProviders;
 import org.onosproject.provider.nil.TopologySimulator;
 
@@ -27,21 +30,24 @@
 /**
  * Starts or stops topology simulation.
  */
+@Service
 @Command(scope = "onos", name = "null-simulation",
         description = "Starts or stops topology simulation")
 public class NullControlCommand extends AbstractShellCommand {
 
     @Argument(index = 0, name = "cmd", description = "Control command: start/stop",
             required = true)
+    @Completion(StartStopCompleter.class)
     String cmd = null;
 
     @Argument(index = 1, name = "topoShape",
             description = "Topology shape: e.g. configured, linear, reroute, " +
                     "centipede, tree, spineleaf, mesh, fattree, custom")
+    @Completion(TopologyShapeCompleter.class)
     String topoShape = null;
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         ComponentConfigService service = get(ComponentConfigService.class);
         // If there is an existing topology; make sure it's stopped before restarting
         if (cmd.equals(START)) {
diff --git a/providers/null/src/main/java/org/onosproject/provider/nil/cli/NullDeviceCommand.java b/providers/null/src/main/java/org/onosproject/provider/nil/cli/NullDeviceCommand.java
index 6b463f6..f4100a6 100644
--- a/providers/null/src/main/java/org/onosproject/provider/nil/cli/NullDeviceCommand.java
+++ b/providers/null/src/main/java/org/onosproject/provider/nil/cli/NullDeviceCommand.java
@@ -15,9 +15,13 @@
  */
 package org.onosproject.provider.nil.cli;
 
-import org.apache.karaf.shell.commands.Argument;
-import org.apache.karaf.shell.commands.Command;
+import org.apache.karaf.shell.api.action.Argument;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.Completion;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.cli.AbstractShellCommand;
+import org.onosproject.cli.UpDownCompleter;
+import org.onosproject.cli.net.DeviceIdCompleter;
 import org.onosproject.net.DeviceId;
 import org.onosproject.provider.nil.NullProviders;
 
@@ -27,21 +31,24 @@
 /**
  * Downs or repairs a simulated device.
  */
+@Service
 @Command(scope = "onos", name = "null-device",
         description = "Downs or repairs a simulated device")
 public class NullDeviceCommand extends AbstractShellCommand {
 
     @Argument(index = 0, name = "id", description = "Device identifier",
             required = true, multiValued = false)
+    @Completion(DeviceIdCompleter.class)
     String id = null;
 
     @Argument(index = 1, name = "cmd", description = "up/down",
             required = true, multiValued = false)
+    @Completion(UpDownCompleter.class)
     String cmd = null;
 
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         NullProviders service = get(NullProviders.class);
         DeviceId deviceId = DeviceId.deviceId(id);
 
diff --git a/providers/null/src/main/java/org/onosproject/provider/nil/cli/NullLinkCommand.java b/providers/null/src/main/java/org/onosproject/provider/nil/cli/NullLinkCommand.java
index 1b9729c..2a32cdf 100644
--- a/providers/null/src/main/java/org/onosproject/provider/nil/cli/NullLinkCommand.java
+++ b/providers/null/src/main/java/org/onosproject/provider/nil/cli/NullLinkCommand.java
@@ -15,9 +15,14 @@
  */
 package org.onosproject.provider.nil.cli;
 
-import org.apache.karaf.shell.commands.Argument;
-import org.apache.karaf.shell.commands.Command;
+import org.apache.karaf.shell.api.action.Argument;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.Completion;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.cli.AbstractShellCommand;
+import org.onosproject.cli.UpDownCompleter;
+import org.onosproject.cli.net.LinkDstCompleter;
+import org.onosproject.cli.net.LinkSrcCompleter;
 import org.onosproject.net.ConnectPoint;
 import org.onosproject.provider.nil.NullProviders;
 
@@ -27,25 +32,29 @@
 /**
  * Severs or repairs a simulated link.
  */
+@Service
 @Command(scope = "onos", name = "null-link",
         description = "Severs or repairs a simulated link")
 public class NullLinkCommand extends AbstractShellCommand {
 
     @Argument(index = 0, name = "one", description = "One link end-point as device/port",
             required = true, multiValued = false)
+    @Completion(LinkSrcCompleter.class)
     String one = null;
 
     @Argument(index = 1, name = "two", description = "Another link end-point as device/port",
             required = true, multiValued = false)
+    @Completion(LinkDstCompleter.class)
     String two = null;
 
     @Argument(index = 2, name = "cmd", description = "up/down",
             required = true, multiValued = false)
+    @Completion(UpDownCompleter.class)
     String cmd = null;
 
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         NullProviders service = get(NullProviders.class);
 
         try {
diff --git a/providers/null/src/main/java/org/onosproject/provider/nil/cli/TopologyShapeCompleter.java b/providers/null/src/main/java/org/onosproject/provider/nil/cli/TopologyShapeCompleter.java
index 52a78cb1..dec1467 100644
--- a/providers/null/src/main/java/org/onosproject/provider/nil/cli/TopologyShapeCompleter.java
+++ b/providers/null/src/main/java/org/onosproject/provider/nil/cli/TopologyShapeCompleter.java
@@ -16,6 +16,7 @@
 package org.onosproject.provider.nil.cli;
 
 import com.google.common.collect.ImmutableList;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.cli.AbstractChoicesCompleter;
 
 import java.util.List;
@@ -23,6 +24,7 @@
 /**
  * Topology shape completer.
  */
+@Service
 public class TopologyShapeCompleter extends AbstractChoicesCompleter {
     @Override
     public List<String> choices() {
diff --git a/providers/null/src/main/resources/OSGI-INF/blueprint/shell-config.xml b/providers/null/src/main/resources/OSGI-INF/blueprint/shell-config.xml
deleted file mode 100644
index 7be09e8..0000000
--- a/providers/null/src/main/resources/OSGI-INF/blueprint/shell-config.xml
+++ /dev/null
@@ -1,65 +0,0 @@
-<!--
-  ~ Copyright 2015-present Open Networking Foundation
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~     http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License.
-  -->
-<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0">
-
-    <command-bundle xmlns="http://karaf.apache.org/xmlns/shell/v1.1.0">
-        <command>
-            <action class="org.onosproject.provider.nil.cli.NullControlCommand"/>
-            <completers>
-                <ref component-id="startStopCompleter"/>
-                <ref component-id="topoShapeCompleter"/>
-                <null/>
-            </completers>
-        </command>
-        <command>
-            <action class="org.onosproject.provider.nil.cli.NullLinkCommand"/>
-            <completers>
-                <ref component-id="linkSrcCompleter"/>
-                <ref component-id="linkDstCompleter"/>
-                <ref component-id="upDownCompleter"/>
-                <null/>
-            </completers>
-        </command>
-        <command>
-            <action class="org.onosproject.provider.nil.cli.NullDeviceCommand"/>
-            <completers>
-                <ref component-id="deviceIdCompleter"/>
-                <ref component-id="upDownCompleter"/>
-                <null/>
-            </completers>
-        </command>
-        <command>
-            <action class="org.onosproject.provider.nil.cli.CreateNullDevice"/>
-        </command>
-        <command>
-            <action class="org.onosproject.provider.nil.cli.CreateNullLink"/>
-        </command>
-        <command>
-            <action class="org.onosproject.provider.nil.cli.CreateNullHost"/>
-        </command>
-        <command>
-            <action class="org.onosproject.provider.nil.cli.CreateNullHosts"/>
-        </command>
-    </command-bundle>
-
-    <bean id="startStopCompleter" class="org.onosproject.cli.StartStopCompleter"/>
-    <bean id="upDownCompleter" class="org.onosproject.cli.UpDownCompleter"/>
-    <bean id="topoShapeCompleter" class="org.onosproject.provider.nil.cli.TopologyShapeCompleter"/>
-    <bean id="linkSrcCompleter" class="org.onosproject.cli.net.LinkSrcCompleter"/>
-    <bean id="linkDstCompleter" class="org.onosproject.cli.net.LinkDstCompleter"/>
-    <bean id="deviceIdCompleter" class="org.onosproject.cli.net.DeviceIdCompleter"/>
-
-</blueprint>
diff --git a/providers/openflow/app/BUCK b/providers/openflow/app/BUCK
deleted file mode 100644
index 958004c..0000000
--- a/providers/openflow/app/BUCK
+++ /dev/null
@@ -1,16 +0,0 @@
-APPS = [
-    'org.onosproject.hostprovider',
-    'org.onosproject.lldpprovider',
-    'org.onosproject.openflow-base',
-]
-
-onos_app (
-    app_name = 'org.onosproject.openflow',
-    title = 'OpenFlow Provider Suite',
-    category = 'Provider',
-    url = 'http://onosproject.org',
-    description = 'Suite of the OpenFlow base providers bundled together with ARP/NDP host ' +
-        'location provider and LLDP link provider.',
-    included_bundles = [ '//utils/osgi:onlab-osgi' ],  # FIXME to allow hollow oar files
-    required_apps = APPS,
-)
diff --git a/providers/openflow/base/BUCK b/providers/openflow/base/BUCK
deleted file mode 100644
index 0513e6f..0000000
--- a/providers/openflow/base/BUCK
+++ /dev/null
@@ -1,25 +0,0 @@
-BUNDLES = [
-    '//lib:openflowj',
-    '//protocols/openflow/api:onos-protocols-openflow-api',
-    '//protocols/openflow/ctl:onos-protocols-openflow-ctl',
-    '//providers/openflow/device:onos-providers-openflow-device',
-    '//providers/openflow/packet:onos-providers-openflow-packet',
-    '//providers/openflow/flow:onos-providers-openflow-flow',
-    '//providers/openflow/group:onos-providers-openflow-group',
-    '//providers/openflow/meter:onos-providers-openflow-meter',
-]
-
-APPS = [
-    'org.onosproject.optical-model',
-]
-
-onos_app (
-    app_name = 'org.onosproject.openflow-base',
-    title = 'OpenFlow Base Provider',
-    category = 'Provider',
-    url = 'https://wiki.onosproject.org/display/ONOS/OpenFlow',
-    description = 'Provides the base suite of device, flow and packet providers that rely on the ' +
-        'OpenFlow protocol to interact with network devices.',
-    included_bundles = BUNDLES,
-    required_apps = APPS,
-)
diff --git a/providers/openflow/base/app.xml b/providers/openflow/base/app.xml
deleted file mode 100644
index a3ae69e..0000000
--- a/providers/openflow/base/app.xml
+++ /dev/null
@@ -1,30 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-  ~ Copyright 2015-present Open Networking Foundation
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~     http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License.
-  -->
-<app name="org.onosproject.openflow-base" origin="ON.Lab" version="${project.version}"
-     category="Provider" url="http://onosproject.org" title="OpenFlow Provider"
-     featuresRepo="mvn:${project.groupId}/${project.artifactId}/${project.version}/xml/features"
-     features="${project.artifactId}" apps="org.onosproject.optical-model">
-    <description>${project.description}</description>
-    <artifact>mvn:${project.groupId}/onos-protocols-openflow-api/${project.version}</artifact>
-    <artifact>mvn:${project.groupId}/onos-protocols-openflow-ctl/${project.version}</artifact>
-
-    <artifact>mvn:${project.groupId}/onos-providers-openflow-device/${project.version}</artifact>
-    <artifact>mvn:${project.groupId}/onos-providers-openflow-packet/${project.version}</artifact>
-    <artifact>mvn:${project.groupId}/onos-providers-openflow-flow/${project.version}</artifact>
-    <artifact>mvn:${project.groupId}/onos-providers-openflow-group/${project.version}</artifact>
-    <artifact>mvn:${project.groupId}/onos-providers-openflow-meter/${project.version}</artifact>
-</app>
diff --git a/providers/openflow/base/features.xml b/providers/openflow/base/features.xml
deleted file mode 100644
index ff701c8..0000000
--- a/providers/openflow/base/features.xml
+++ /dev/null
@@ -1,31 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
-<!--
-  ~ Copyright 2015-present Open Networking Foundation
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~     http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License.
-  -->
-<features xmlns="http://karaf.apache.org/xmlns/features/v1.2.0" name="${project.artifactId}-${project.version}">
-    <feature name="${project.artifactId}" version="${project.version}"
-             description="${project.description}">
-        <feature>onos-api</feature>
-        <bundle>mvn:org.onosproject/openflowj/3.2.0.onos</bundle>
-        <bundle>mvn:${project.groupId}/onos-protocols-openflow-api/${project.version}</bundle>
-        <bundle>mvn:${project.groupId}/onos-protocols-openflow-ctl/${project.version}</bundle>
-
-        <bundle>mvn:${project.groupId}/onos-providers-openflow-device/${project.version}</bundle>
-        <bundle>mvn:${project.groupId}/onos-providers-openflow-packet/${project.version}</bundle>
-        <bundle>mvn:${project.groupId}/onos-providers-openflow-flow/${project.version}</bundle>
-        <bundle>mvn:${project.groupId}/onos-providers-openflow-group/${project.version}</bundle>
-        <bundle>mvn:${project.groupId}/onos-providers-openflow-meter/${project.version}</bundle>
-    </feature>
-</features>
diff --git a/providers/openflow/device/BUCK b/providers/openflow/device/BUCK
deleted file mode 100644
index 4d9269c..0000000
--- a/providers/openflow/device/BUCK
+++ /dev/null
@@ -1,15 +0,0 @@
-COMPILE_DEPS = [
-    '//lib:CORE_DEPS',
-    '//lib:openflowj',
-    '//protocols/openflow/api:onos-protocols-openflow-api',
-    '//apps/optical-model:onos-apps-optical-model',
-]
-
-TEST_DEPS = [
-    '//lib:TEST_ADAPTERS',
-]
-
-osgi_jar_with_tests (
-    deps = COMPILE_DEPS,
-    test_deps = TEST_DEPS,
-)
diff --git a/providers/openflow/device/src/main/java/org/onosproject/provider/of/device/impl/OpenFlowDeviceProvider.java b/providers/openflow/device/src/main/java/org/onosproject/provider/of/device/impl/OpenFlowDeviceProvider.java
index 8cd3870..f849467 100644
--- a/providers/openflow/device/src/main/java/org/onosproject/provider/of/device/impl/OpenFlowDeviceProvider.java
+++ b/providers/openflow/device/src/main/java/org/onosproject/provider/of/device/impl/OpenFlowDeviceProvider.java
@@ -20,13 +20,6 @@
 import com.google.common.collect.Lists;
 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.Modified;
-import org.apache.felix.scr.annotations.Property;
-import org.apache.felix.scr.annotations.Reference;
-import org.apache.felix.scr.annotations.ReferenceCardinality;
 import org.onlab.packet.ChassisId;
 import org.onlab.util.Frequency;
 import org.onlab.util.Spectrum;
@@ -73,6 +66,12 @@
 import org.onosproject.openflow.controller.PortDescPropertyType;
 import org.onosproject.openflow.controller.RoleState;
 import org.osgi.service.component.ComponentContext;
+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.projectfloodlight.openflow.protocol.OFCalientPortDescProp;
 import org.projectfloodlight.openflow.protocol.OFCalientPortDescPropOptical;
 import org.projectfloodlight.openflow.protocol.OFCalientPortDescStatsEntry;
@@ -140,13 +139,18 @@
 import static org.onosproject.net.optical.device.OtuPortHelper.otuPortDescription;
 import static org.onosproject.openflow.controller.Dpid.dpid;
 import static org.onosproject.openflow.controller.Dpid.uri;
+import static org.onosproject.provider.of.device.impl.OsgiPropertyConstants.*;
 import static org.slf4j.LoggerFactory.getLogger;
 
 /**
  * Provider which uses an OpenFlow controller to detect network
  * infrastructure devices.
  */
-@Component(immediate = true)
+@Component(immediate = true,
+        property = {
+                POLL_FREQ + ":Integer=" + POLL_FREQ_DEFAULT,
+                PROP_FREQ + ":Boolean=" + PROP_FREQ_DEFAULT,
+        })
 public class OpenFlowDeviceProvider extends AbstractProvider implements DeviceProvider {
 
     private static final Logger LOG = getLogger(OpenFlowDeviceProvider.class);
@@ -430,36 +434,30 @@
     private static final long C = 299792458; // speed of light in m/s
     public static final String SCHEME = "of";
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected DeviceProviderRegistry providerRegistry;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected DeviceService deviceService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected OpenFlowController controller;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected ComponentConfigService cfgService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected DriverService driverService;
 
     private DeviceProviderService providerService;
 
     private final InternalDeviceProvider listener = new InternalDeviceProvider();
 
-    private static final String POLL_PROP_NAME = "portStatsPollFrequency";
-    private static final int POLL_INTERVAL = 5;
-    @Property(name = POLL_PROP_NAME, intValue = POLL_INTERVAL,
-    label = "Frequency (in seconds) for polling switch Port statistics")
-    private int portStatsPollFrequency = POLL_INTERVAL;
+    /** Frequency (in seconds) for polling switch Port statistics. */
+    private int portStatsPollFrequency = POLL_FREQ_DEFAULT;
 
-    private static final String PROP_FREQ = "propertyFrequency";
-    private static final boolean DEFAULT_PROP_FREQ = true;
-    @Property(name = PROP_FREQ, boolValue = DEFAULT_PROP_FREQ,
-    label = "It indicates frequency must be used instead of wavelength for port tuning.")
-    private static boolean propFreq = DEFAULT_PROP_FREQ;
+    /** It indicates frequency must be used instead of wavelength for port tuning. */
+    private static boolean propFreq = PROP_FREQ_DEFAULT;
 
     private final Timer timer = new Timer("onos-openflow-portstats-collector");
 
@@ -502,7 +500,7 @@
         Dictionary<?, ?> properties = context != null ? context.getProperties() : new Properties();
         int newPortStatsPollFrequency;
         try {
-            String s = get(properties, POLL_PROP_NAME);
+            String s = get(properties, POLL_FREQ);
             newPortStatsPollFrequency = isNullOrEmpty(s) ? portStatsPollFrequency : Integer.parseInt(s.trim());
 
         } catch (NumberFormatException | ClassCastException e) {
diff --git a/providers/openflow/device/src/main/java/org/onosproject/provider/of/device/impl/OsgiPropertyConstants.java b/providers/openflow/device/src/main/java/org/onosproject/provider/of/device/impl/OsgiPropertyConstants.java
new file mode 100644
index 0000000..7c6b804
--- /dev/null
+++ b/providers/openflow/device/src/main/java/org/onosproject/provider/of/device/impl/OsgiPropertyConstants.java
@@ -0,0 +1,32 @@
+/*
+ * Copyright 2018-present Open Networking Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.onosproject.provider.of.device.impl;
+
+/**
+ * Constants for default values of configurable properties.
+ */
+public final class OsgiPropertyConstants {
+
+    private OsgiPropertyConstants() {}
+
+    public static final String POLL_FREQ = "portStatsPollFrequency";
+    public static final int POLL_FREQ_DEFAULT = 5;
+
+    public static final String PROP_FREQ = "propertyFrequency";
+    public static final boolean PROP_FREQ_DEFAULT = true;
+
+}
diff --git a/providers/openflow/flow/BUCK b/providers/openflow/flow/BUCK
deleted file mode 100644
index 77af1be..0000000
--- a/providers/openflow/flow/BUCK
+++ /dev/null
@@ -1,11 +0,0 @@
-COMPILE_DEPS = [
-    '//lib:CORE_DEPS',
-    '//lib:NETTY',
-    '//lib:openflowj',
-    '//protocols/openflow/api:onos-protocols-openflow-api',
-]
-
-osgi_jar_with_tests (
-    deps = COMPILE_DEPS,
-)
-
diff --git a/providers/openflow/flow/src/main/java/org/onosproject/provider/of/flow/impl/OpenFlowRuleProvider.java b/providers/openflow/flow/src/main/java/org/onosproject/provider/of/flow/impl/OpenFlowRuleProvider.java
index c6d0769..d1867e2 100644
--- a/providers/openflow/flow/src/main/java/org/onosproject/provider/of/flow/impl/OpenFlowRuleProvider.java
+++ b/providers/openflow/flow/src/main/java/org/onosproject/provider/of/flow/impl/OpenFlowRuleProvider.java
@@ -26,13 +26,12 @@
 
 import io.netty.buffer.ByteBuf;
 import io.netty.buffer.Unpooled;
-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.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.onosproject.cfg.ComponentConfigService;
 import org.onosproject.core.ApplicationId;
 import org.onosproject.net.DeviceId;
@@ -104,42 +103,43 @@
 import static com.google.common.base.Preconditions.checkNotNull;
 import static com.google.common.base.Strings.isNullOrEmpty;
 import static org.onlab.util.Tools.get;
+import static org.onosproject.provider.of.flow.impl.OsgiPropertyConstants.*;
 import static org.slf4j.LoggerFactory.getLogger;
 
 /**
  * Provider which uses an OpenFlow controller to detect network end-station
  * hosts.
  */
-@Component(immediate = true)
+@Component(immediate = true,
+        property = {
+                POLL_FREQUENCY + ":Integer=" + POLL_FREQUENCY_DEFAULT,
+                ADAPTIVE_FLOW_SAMPLING + ":Boolean=" + ADAPTIVE_FLOW_SAMPLING_DEFAULT,
+        })
 public class OpenFlowRuleProvider extends AbstractProvider
         implements FlowRuleProvider {
 
     private final Logger log = getLogger(getClass());
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected FlowRuleProviderRegistry providerRegistry;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected OpenFlowController controller;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected ComponentConfigService cfgService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected DriverService driverService;
 
-    private static final int DEFAULT_POLL_FREQUENCY = 5;
     private static final int MIN_EXPECTED_BYTE_LEN = 56;
     private static final int SKIP_BYTES = 4;
-    private static final boolean DEFAULT_ADAPTIVE_FLOW_SAMPLING = false;
 
-    @Property(name = "flowPollFrequency", intValue = DEFAULT_POLL_FREQUENCY,
-            label = "Frequency (in seconds) for polling flow statistics")
-    private int flowPollFrequency = DEFAULT_POLL_FREQUENCY;
+    /** Frequency (in seconds) for polling flow statistics. */
+    private int flowPollFrequency = POLL_FREQUENCY_DEFAULT;
 
-    @Property(name = "adaptiveFlowSampling", boolValue = DEFAULT_ADAPTIVE_FLOW_SAMPLING,
-            label = "Adaptive Flow Sampling is on or off")
-    private boolean adaptiveFlowSampling = DEFAULT_ADAPTIVE_FLOW_SAMPLING;
+    /** Adaptive Flow Sampling is on or off. */
+    private boolean adaptiveFlowSampling = ADAPTIVE_FLOW_SAMPLING_DEFAULT;
 
     private FlowRuleProviderService providerService;
 
@@ -196,7 +196,7 @@
         Dictionary<?, ?> properties = context.getProperties();
         int newFlowPollFrequency;
         try {
-            String s = get(properties, "flowPollFrequency");
+            String s = get(properties, POLL_FREQUENCY);
             newFlowPollFrequency = isNullOrEmpty(s) ? flowPollFrequency : Integer.parseInt(s.trim());
 
         } catch (NumberFormatException | ClassCastException e) {
@@ -211,7 +211,7 @@
         log.info("Settings: flowPollFrequency={}", flowPollFrequency);
 
         boolean newAdaptiveFlowSampling;
-        String s = get(properties, "adaptiveFlowSampling");
+        String s = get(properties, ADAPTIVE_FLOW_SAMPLING);
         newAdaptiveFlowSampling = isNullOrEmpty(s) ? adaptiveFlowSampling : Boolean.parseBoolean(s.trim());
 
         if (newAdaptiveFlowSampling != adaptiveFlowSampling) {
diff --git a/providers/openflow/flow/src/main/java/org/onosproject/provider/of/flow/impl/OsgiPropertyConstants.java b/providers/openflow/flow/src/main/java/org/onosproject/provider/of/flow/impl/OsgiPropertyConstants.java
new file mode 100644
index 0000000..36022e8
--- /dev/null
+++ b/providers/openflow/flow/src/main/java/org/onosproject/provider/of/flow/impl/OsgiPropertyConstants.java
@@ -0,0 +1,32 @@
+/*
+ * Copyright 2018-present Open Networking Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.onosproject.provider.of.flow.impl;
+
+/**
+ * Constants for default values of configurable properties.
+ */
+public final class OsgiPropertyConstants {
+
+    private OsgiPropertyConstants() {}
+
+    public static final String POLL_FREQUENCY = "flowPollFrequency";
+    public static final String ADAPTIVE_FLOW_SAMPLING = "adaptiveFlowSampling";
+
+    public static final int POLL_FREQUENCY_DEFAULT = 5;
+    public static final boolean ADAPTIVE_FLOW_SAMPLING_DEFAULT = false;
+
+}
diff --git a/providers/openflow/group/BUCK b/providers/openflow/group/BUCK
deleted file mode 100644
index 6c3a325..0000000
--- a/providers/openflow/group/BUCK
+++ /dev/null
@@ -1,16 +0,0 @@
-COMPILE_DEPS = [
-    '//lib:CORE_DEPS',
-    '//lib:NETTY',
-    '//lib:openflowj',
-    '//protocols/openflow/api:onos-protocols-openflow-api',
-    '//providers/openflow/flow:onos-providers-openflow-flow',
-]
-
-TEST_DEPS = [
-    '//lib:TEST_ADAPTERS',
-]
-
-osgi_jar_with_tests (
-    deps = COMPILE_DEPS,
-    test_deps = TEST_DEPS,
-)
diff --git a/providers/openflow/group/src/main/java/org/onosproject/provider/of/group/impl/OpenFlowGroupProvider.java b/providers/openflow/group/src/main/java/org/onosproject/provider/of/group/impl/OpenFlowGroupProvider.java
index da8e694..433cfb6 100644
--- a/providers/openflow/group/src/main/java/org/onosproject/provider/of/group/impl/OpenFlowGroupProvider.java
+++ b/providers/openflow/group/src/main/java/org/onosproject/provider/of/group/impl/OpenFlowGroupProvider.java
@@ -16,26 +16,7 @@
 
 package org.onosproject.provider.of.group.impl;
 
-import static org.onlab.util.Tools.getIntegerProperty;
-import static org.slf4j.LoggerFactory.getLogger;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Dictionary;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-import java.util.Optional;
-import java.util.Properties;
-import java.util.concurrent.atomic.AtomicLong;
-
-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 com.google.common.collect.Maps;
 import org.onlab.util.ItemNotFoundException;
 import org.onosproject.cfg.ComponentConfigService;
 import org.onosproject.core.GroupId;
@@ -66,6 +47,12 @@
 import org.onosproject.openflow.controller.OpenFlowSwitchListener;
 import org.onosproject.openflow.controller.RoleState;
 import org.osgi.service.component.ComponentContext;
+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.projectfloodlight.openflow.protocol.OFBucketCounter;
 import org.projectfloodlight.openflow.protocol.OFCapabilities;
 import org.projectfloodlight.openflow.protocol.OFErrorMsg;
@@ -86,43 +73,56 @@
 import org.projectfloodlight.openflow.protocol.errormsg.OFGroupModFailedErrorMsg;
 import org.slf4j.Logger;
 
-import com.google.common.collect.Maps;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Dictionary;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.Optional;
+import java.util.Properties;
+import java.util.concurrent.atomic.AtomicLong;
+
+import static org.onlab.util.Tools.getIntegerProperty;
+import static org.onosproject.provider.of.group.impl.OsgiPropertyConstants.POLL_FREQUENCY;
+import static org.onosproject.provider.of.group.impl.OsgiPropertyConstants.POLL_FREQUENCY_DEFAULT;
+import static org.slf4j.LoggerFactory.getLogger;
 
 /**
  * Provider which uses an OpenFlow controller to handle Group.
  */
-@Component(immediate = true)
+@Component(immediate = true,
+        property = {
+            POLL_FREQUENCY + ":Integer=" + POLL_FREQUENCY_DEFAULT,
+        })
 public class OpenFlowGroupProvider extends AbstractProvider implements GroupProvider {
 
     private final Logger log = getLogger(getClass());
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected OpenFlowController controller;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected GroupProviderRegistry providerRegistry;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected DriverService driverService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected DeviceService deviceService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected GroupService groupService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected ComponentConfigService cfgService;
 
     private GroupProviderService providerService;
 
-    private static final int DEFAULT_POLL_INTERVAL = 10;
     private static final String COMPONENT = "org.onosproject.provider.of.group.impl.OpenFlowGroupProvider";
-    private static final String GROUP_POLL_INTERVAL_CONST = "groupPollInterval";
 
-    @Property(name = "groupPollInterval", intValue = DEFAULT_POLL_INTERVAL,
-            label = "Frequency (in seconds) for polling group statistics")
-    private int groupPollInterval = DEFAULT_POLL_INTERVAL;
+    /** Frequency (in seconds) for polling group statistics. */
+    private int groupPollInterval = POLL_FREQUENCY_DEFAULT;
 
     private final InternalGroupProvider listener = new InternalGroupProvider();
 
@@ -175,7 +175,7 @@
     @Modified
     public void modified(ComponentContext context) {
         Dictionary<?, ?> properties = context != null ? context.getProperties() : new Properties();
-        Integer newGroupPollInterval = getIntegerProperty(properties, GROUP_POLL_INTERVAL_CONST);
+        Integer newGroupPollInterval = getIntegerProperty(properties, POLL_FREQUENCY);
         if (newGroupPollInterval != null && newGroupPollInterval > 0
                 && newGroupPollInterval != groupPollInterval) {
             groupPollInterval = newGroupPollInterval;
@@ -183,7 +183,7 @@
         } else if (newGroupPollInterval != null && newGroupPollInterval <= 0) {
             log.warn("groupPollInterval must be greater than 0");
             //If the new value <= 0 reset property with old value.
-            cfgService.setProperty(COMPONENT, GROUP_POLL_INTERVAL_CONST, Integer.toString(groupPollInterval));
+            cfgService.setProperty(COMPONENT, POLL_FREQUENCY, Integer.toString(groupPollInterval));
         }
     }
 
diff --git a/providers/openflow/group/src/main/java/org/onosproject/provider/of/group/impl/OsgiPropertyConstants.java b/providers/openflow/group/src/main/java/org/onosproject/provider/of/group/impl/OsgiPropertyConstants.java
new file mode 100644
index 0000000..43bd7e4
--- /dev/null
+++ b/providers/openflow/group/src/main/java/org/onosproject/provider/of/group/impl/OsgiPropertyConstants.java
@@ -0,0 +1,29 @@
+/*
+ * Copyright 2018-present Open Networking Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.onosproject.provider.of.group.impl;
+
+/**
+ * Constants for default values of configurable properties.
+ */
+public final class OsgiPropertyConstants {
+
+    private OsgiPropertyConstants() {}
+
+    public static final String POLL_FREQUENCY = "groupPollInterval";
+    public static final int POLL_FREQUENCY_DEFAULT = 10;
+
+}
diff --git a/providers/openflow/message/BUCK b/providers/openflow/message/BUCK
deleted file mode 100644
index 9abaabd..0000000
--- a/providers/openflow/message/BUCK
+++ /dev/null
@@ -1,25 +0,0 @@
-COMPILE_DEPS = [
-    '//lib:CORE_DEPS',
-    '//lib:METRICS',
-    '//lib:openflowj',
-    '//protocols/openflow/api:onos-protocols-openflow-api',
-    '//apps/cpman/api:onos-apps-cpman-api',
-]
-
-BUNDLES = [
-    '//apps/cpman/api:onos-apps-cpman-api',
-    ':onos-providers-openflow-message',
-]
-
-osgi_jar_with_tests (
-    deps = COMPILE_DEPS,
-)
-
-onos_app (
-    app_name = 'org.onosproject.openflow-message',
-    title = 'Control Message Stats Provider',
-    category = 'Provider',
-    url = 'http://onosproject.org',
-    description = 'ONOS OpenFlow control message provider.',
-    included_bundles = BUNDLES,
-)
diff --git a/providers/openflow/message/app.xml b/providers/openflow/message/app.xml
deleted file mode 100644
index dfe4851..0000000
--- a/providers/openflow/message/app.xml
+++ /dev/null
@@ -1,23 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-  ~ Copyright 2016-present Open Networking Foundation
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~     http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License.
-  -->
-<app name="org.onosproject.openflow-message" origin="Open Networking Foundation" version="${project.version}"
-     category="Provider" url="http://onosproject.org" title="Control Message Stats Provider"
-     featuresRepo="mvn:${project.groupId}/${project.artifactId}/${project.version}/xml/features"
-     features="${project.artifactId}">
-    <description>${project.description}</description>
-    <artifact>mvn:${project.groupId}/onos-providers-openflow-message/${project.version}</artifact>
-</app>
diff --git a/providers/openflow/message/features.xml b/providers/openflow/message/features.xml
deleted file mode 100644
index d7b42fc..0000000
--- a/providers/openflow/message/features.xml
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
-<!--
-  ~ Copyright 2016-present Open Networking Foundation
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~     http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License.
-  -->
-<features xmlns="http://karaf.apache.org/xmlns/features/v1.2.0" name="${project.artifactId}-${project.version}">
-    <feature name="${project.artifactId}" version="${project.version}"
-             description="${project.description}">
-        <feature>onos-api</feature>
-        <bundle>mvn:${project.groupId}/onos-providers-openflow-message/${project.version}</bundle>
-        <bundle>mvn:${project.groupId}/onos-apps-cpman-api/${project.version}</bundle>
-    </feature>
-</features>
diff --git a/providers/openflow/message/src/main/java/org/onosproject/provider/of/message/impl/OpenFlowControlMessageProvider.java b/providers/openflow/message/src/main/java/org/onosproject/provider/of/message/impl/OpenFlowControlMessageProvider.java
index 9ad660b..fc60f74 100644
--- a/providers/openflow/message/src/main/java/org/onosproject/provider/of/message/impl/OpenFlowControlMessageProvider.java
+++ b/providers/openflow/message/src/main/java/org/onosproject/provider/of/message/impl/OpenFlowControlMessageProvider.java
@@ -16,11 +16,11 @@
 package org.onosproject.provider.of.message.impl;
 
 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.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.metrics.MetricsService;
 import org.onlab.util.SharedScheduledExecutorService;
 import org.onlab.util.SharedScheduledExecutors;
@@ -59,13 +59,13 @@
 
     private final Logger log = getLogger(getClass());
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected ControlMessageProviderRegistry providerRegistry;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected OpenFlowController controller;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected MetricsService metricsService;
 
     private ControlMessageProviderService providerService;
diff --git a/providers/openflow/meter/BUCK b/providers/openflow/meter/BUCK
deleted file mode 100644
index 0e94809..0000000
--- a/providers/openflow/meter/BUCK
+++ /dev/null
@@ -1,10 +0,0 @@
-COMPILE_DEPS = [
-    '//lib:CORE_DEPS',
-    '//lib:NETTY',
-    '//lib:openflowj',
-    '//protocols/openflow/api:onos-protocols-openflow-api',
-]
-
-osgi_jar_with_tests (
-    deps = COMPILE_DEPS,
-)
diff --git a/providers/openflow/meter/src/main/java/org/onosproject/provider/of/meter/impl/OpenFlowMeterProvider.java b/providers/openflow/meter/src/main/java/org/onosproject/provider/of/meter/impl/OpenFlowMeterProvider.java
index 87abcd0..0767230 100644
--- a/providers/openflow/meter/src/main/java/org/onosproject/provider/of/meter/impl/OpenFlowMeterProvider.java
+++ b/providers/openflow/meter/src/main/java/org/onosproject/provider/of/meter/impl/OpenFlowMeterProvider.java
@@ -23,11 +23,11 @@
 import com.google.common.cache.RemovalNotification;
 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.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.util.ItemNotFoundException;
 import org.onosproject.core.CoreService;
 import org.onosproject.net.driver.Driver;
@@ -92,16 +92,16 @@
 
     private final Logger log = getLogger(getClass());
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected OpenFlowController controller;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected MeterProviderRegistry providerRegistry;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected CoreService coreService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected DriverService driverService;
 
     private MeterProviderService providerService;
diff --git a/providers/openflow/packet/BUCK b/providers/openflow/packet/BUCK
deleted file mode 100644
index cacd1b1..0000000
--- a/providers/openflow/packet/BUCK
+++ /dev/null
@@ -1,10 +0,0 @@
-COMPILE_DEPS = [
-    '//lib:CORE_DEPS',
-    '//lib:openflowj',
-    '//protocols/openflow/api:onos-protocols-openflow-api',
-]
-
-osgi_jar_with_tests (
-    deps = COMPILE_DEPS,
-)
-
diff --git a/providers/openflow/packet/src/main/java/org/onosproject/provider/of/packet/impl/OpenFlowPacketProvider.java b/providers/openflow/packet/src/main/java/org/onosproject/provider/of/packet/impl/OpenFlowPacketProvider.java
index c5e2a87..a363339 100644
--- a/providers/openflow/packet/src/main/java/org/onosproject/provider/of/packet/impl/OpenFlowPacketProvider.java
+++ b/providers/openflow/packet/src/main/java/org/onosproject/provider/of/packet/impl/OpenFlowPacketProvider.java
@@ -15,11 +15,11 @@
  */
 package org.onosproject.provider.of.packet.impl;
 
-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.onosproject.net.ConnectPoint;
 import org.onosproject.net.DeviceId;
 import org.onosproject.net.PortNumber;
@@ -62,10 +62,10 @@
 
     private final Logger log = getLogger(getClass());
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected PacketProviderRegistry providerRegistry;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected OpenFlowController controller;
 
     private PacketProviderService providerService;
diff --git a/providers/ospf/BUCK b/providers/ospf/BUCK
deleted file mode 100644
index 829827e..0000000
--- a/providers/ospf/BUCK
+++ /dev/null
@@ -1,16 +0,0 @@
-BUNDLES = [
-    '//protocols/ospf/api:onos-protocols-ospf-api',
-    '//protocols/ospf/ctl:onos-protocols-ospf-ctl',
-    '//protocols/ospf/protocol:onos-protocols-ospf-protocol',
-    '//providers/ospf/cfg:onos-providers-ospf-cfg',
-    '//providers/ospf/topology:onos-providers-ospf-topology',
-]
-
-onos_app (
-    title = 'OSPF Provider',
-    category = 'Provider',
-    url = 'http://onosproject.org',
-    description = 'ONOS OSPF protocol adapters.',
-    included_bundles = BUNDLES,
-)
-
diff --git a/providers/ospf/app/app.xml b/providers/ospf/app/app.xml
deleted file mode 100644
index e72d79c..0000000
--- a/providers/ospf/app/app.xml
+++ /dev/null
@@ -1,27 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-  ~ Copyright 2016-present Open Networking Foundation
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~     http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License.
-  -->
-<app name="org.onosproject.ospf" origin="ON.Lab" version="${project.version}"
-     featuresRepo="mvn:${project.groupId}/${project.artifactId}/${project.version}/xml/features"
-     features="${project.artifactId}">
-    <description>${project.description}</description>
-    <artifact>mvn:${project.groupId}/onos-ospf-api/${project.version}</artifact>
-    <artifact>mvn:${project.groupId}/onos-ospf-ctl/${project.version}</artifact>
-    <artifact>mvn:${project.groupId}/onos-ospf-protocol/${project.version}</artifact>
-    <artifact>mvn:${project.groupId}/onos-ospf-provider-topology/${project.version}</artifact>
-    <artifact>mvn:${project.groupId}/onos-ospf-provider-cfg/${project.version}</artifact>
-    <artifact>mvn:${project.groupId}/onos-ospf-provider-cli/${project.version}</artifact>
-</app>
diff --git a/providers/ospf/app/features.xml b/providers/ospf/app/features.xml
deleted file mode 100644
index 0ad3474..0000000
--- a/providers/ospf/app/features.xml
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
-<!--
-  ~ Copyright 2016-present Open Networking Foundation
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~     http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License.
-  -->
-<features xmlns="http://karaf.apache.org/xmlns/features/v1.2.0" name="${project.artifactId}-${project.version}">
-    <feature name="${project.artifactId}" version="${project.version}"
-             description="${project.description}">
-        <feature>onos-api</feature>
-        <bundle>mvn:${project.groupId}/onos-ospf-api/${project.version}</bundle>
-        <bundle>mvn:${project.groupId}/onos-ospf-ctl/${project.version}</bundle>
-        <bundle>mvn:${project.groupId}/onos-ospf-protocol/${project.version}</bundle>
-        <bundle>mvn:${project.groupId}/onos-ospf-provider-topology/${project.version}</bundle>
-        <bundle>mvn:${project.groupId}/onos-ospf-provider-cfg/${project.version}</bundle>
-        <bundle>mvn:${project.groupId}/onos-ospf-provider-cli/${project.version}</bundle>
-    </feature>
-</features>
diff --git a/providers/ospf/cfg/BUCK b/providers/ospf/cfg/BUCK
deleted file mode 100644
index 83c5e19..0000000
--- a/providers/ospf/cfg/BUCK
+++ /dev/null
@@ -1,10 +0,0 @@
-COMPILE_DEPS = [
-    '//lib:CORE_DEPS',
-    '//lib:JACKSON',
-    '//protocols/ospf/api:onos-protocols-ospf-api',
-]
-
-osgi_jar_with_tests (
-    deps = COMPILE_DEPS,
-)
-
diff --git a/providers/ospf/cfg/src/main/java/org/onosproject/provider/ospf/cfg/impl/OspfAppConfig.java b/providers/ospf/cfg/src/main/java/org/onosproject/provider/ospf/cfg/impl/OspfAppConfig.java
index 23bb87a..ca1e461 100644
--- a/providers/ospf/cfg/src/main/java/org/onosproject/provider/ospf/cfg/impl/OspfAppConfig.java
+++ b/providers/ospf/cfg/src/main/java/org/onosproject/provider/ospf/cfg/impl/OspfAppConfig.java
@@ -17,8 +17,8 @@
 package org.onosproject.provider.ospf.cfg.impl;
 
 import com.fasterxml.jackson.databind.JsonNode;
-import org.apache.felix.scr.annotations.Reference;
-import org.apache.felix.scr.annotations.ReferenceCardinality;
+import org.osgi.service.component.annotations.Reference;
+import org.osgi.service.component.annotations.ReferenceCardinality;
 import org.onlab.osgi.DefaultServiceDirectory;
 import org.onosproject.core.ApplicationId;
 import org.onosproject.net.config.Config;
@@ -31,7 +31,7 @@
     public static final String METHOD = "method";
     public static final String ATTRIBUTE = "attribute";
     public static final String PROCESSES = "processes";
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     private OspfController ospfController;
 
     /**
diff --git a/providers/ospf/cfg/src/main/java/org/onosproject/provider/ospf/cfg/impl/OspfCfgProvider.java b/providers/ospf/cfg/src/main/java/org/onosproject/provider/ospf/cfg/impl/OspfCfgProvider.java
index e228d96..4e62d28 100644
--- a/providers/ospf/cfg/src/main/java/org/onosproject/provider/ospf/cfg/impl/OspfCfgProvider.java
+++ b/providers/ospf/cfg/src/main/java/org/onosproject/provider/ospf/cfg/impl/OspfCfgProvider.java
@@ -16,12 +16,11 @@
 package org.onosproject.provider.ospf.cfg.impl;
 
 import com.fasterxml.jackson.databind.JsonNode;
-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.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.onosproject.core.ApplicationId;
 import org.onosproject.core.CoreService;
 import org.onosproject.net.config.ConfigFactory;
@@ -40,8 +39,7 @@
 /**
  * Provider which advertises device descriptions to the core.
  */
-@Component(immediate = true)
-@Service
+@Component(immediate = true, service = OspfCfgProvider.class)
 public class OspfCfgProvider extends AbstractProvider {
 
     static final String PROVIDER_ID = "org.onosproject.provider.ospf.cfg";
@@ -54,15 +52,15 @@
                 }
             };
     private final NetworkConfigListener configListener = new InternalConfigListener();
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected OspfController ospfController;
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected CoreService coreService;
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected NetworkConfigRegistry configRegistry;
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected NetworkConfigService configService;
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected OspfController controller;
     private ApplicationId appId;
 
diff --git a/providers/ospf/cli/src/main/java/org/onosproject/ospf/cli/ApplicationOspfCommand.java b/providers/ospf/cli/src/main/java/org/onosproject/ospf/cli/ApplicationOspfCommand.java
index 5ea0826..15cfa9b 100644
--- a/providers/ospf/cli/src/main/java/org/onosproject/ospf/cli/ApplicationOspfCommand.java
+++ b/providers/ospf/cli/src/main/java/org/onosproject/ospf/cli/ApplicationOspfCommand.java
@@ -15,13 +15,14 @@
 */
 package org.onosproject.ospf.cli;
 
-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.karaf.shell.commands.Argument;
-import org.apache.karaf.shell.commands.Command;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
+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.shell.api.action.Argument;
+import org.apache.karaf.shell.api.action.Command;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.ospf.controller.OspfArea;
 import org.onosproject.ospf.controller.OspfController;
@@ -39,6 +40,7 @@
 /**
  * Representation of OSPF cli commands.
  */
+@Service
 @Component(immediate = true)
 @Command(scope = "onos", name = "ospf", description = "list database")
 public class ApplicationOspfCommand extends AbstractShellCommand {
@@ -57,7 +59,7 @@
     protected static final String DROTHER = "DROther";
     static final String DATABASE = "database";
     static final String NEIGHBORLIST = "neighbors";
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected OspfController ospfController;
     @Argument(index = 0, name = "name",
             description = "database|neighborlist",
@@ -95,7 +97,7 @@
     }
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         if (DATABASE.equals(name)) {
             buildOspfDatabaseInformation();
         } else if (NEIGHBORLIST.equals(name)) {
diff --git a/providers/ospf/cli/src/main/resources/OSGI-INF/blueprint/shell-config.xml b/providers/ospf/cli/src/main/resources/OSGI-INF/blueprint/shell-config.xml
deleted file mode 100644
index 0fe17d2..0000000
--- a/providers/ospf/cli/src/main/resources/OSGI-INF/blueprint/shell-config.xml
+++ /dev/null
@@ -1,24 +0,0 @@
-<!--
-  ~ Copyright 2016-present Open Networking Foundation
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~     http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License.
-  -->
-<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0">
-
-    <command-bundle xmlns="http://karaf.apache.org/xmlns/shell/v1.1.0">
-        <command>
-            <action class="org.onosproject.ospf.cli.ApplicationOspfCommand"/>
-        </command>
-    </command-bundle>
-
-</blueprint>
diff --git a/providers/ospf/topology/BUCK b/providers/ospf/topology/BUCK
deleted file mode 100644
index bb95985..0000000
--- a/providers/ospf/topology/BUCK
+++ /dev/null
@@ -1,16 +0,0 @@
-COMPILE_DEPS = [
-    '//lib:CORE_DEPS',
-    '//protocols/ospf/api:onos-protocols-ospf-api',
-    '//protocols/ospf/ctl:onos-protocols-ospf-ctl',
-]
-
-TEST_DEPS = [
-    '//lib:TEST_ADAPTERS',
-    '//lib:JACKSON',
-]
-
-osgi_jar_with_tests (
-    deps = COMPILE_DEPS,
-    test_deps = TEST_DEPS,
-)
-
diff --git a/providers/ospf/topology/src/main/java/org/onosproject/provider/ospf/topology/impl/OspfTopologyProvider.java b/providers/ospf/topology/src/main/java/org/onosproject/provider/ospf/topology/impl/OspfTopologyProvider.java
index f77cb3e..702d61a 100644
--- a/providers/ospf/topology/src/main/java/org/onosproject/provider/ospf/topology/impl/OspfTopologyProvider.java
+++ b/providers/ospf/topology/src/main/java/org/onosproject/provider/ospf/topology/impl/OspfTopologyProvider.java
@@ -15,11 +15,11 @@
  */
 package org.onosproject.provider.ospf.topology.impl;
 
-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.ChassisId;
 import org.onlab.packet.Ip4Address;
 import org.onosproject.net.AnnotationKeys;
@@ -69,13 +69,13 @@
     // Default values for tunable parameters
     private static final String UNKNOWN = "unknown";
     final InternalTopologyProvider listener = new InternalTopologyProvider();
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected DeviceProviderRegistry deviceProviderRegistry;
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected LinkProviderRegistry linkProviderRegistry;
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected LinkService linkService;
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected OspfController controller;
     //This Interface that defines how this provider can interact with the core.
     private LinkProviderService linkProviderService;
diff --git a/providers/ovsdb/BUCK b/providers/ovsdb/BUCK
deleted file mode 100644
index 0f36e70..0000000
--- a/providers/ovsdb/BUCK
+++ /dev/null
@@ -1,14 +0,0 @@
-APPS = [
-    'org.onosproject.ovsdb-base',
-    'org.onosproject.ovsdbhostprovider',
-]
-
-onos_app (
-    app_name = 'org.onosproject.ovsdb',
-    title = 'OVSDB Southbound Meta',
-    category = 'Provider',
-    url = 'http://onosproject.org',
-    description = 'ONOS OVSDB southbound meta application',
-    included_bundles = [ '//utils/osgi:onlab-osgi' ],  # FIXME to allow hollow oar files
-    required_apps = APPS,
-)
diff --git a/providers/ovsdb/base/BUCK b/providers/ovsdb/base/BUCK
deleted file mode 100644
index 9261e9a..0000000
--- a/providers/ovsdb/base/BUCK
+++ /dev/null
@@ -1,17 +0,0 @@
-BUNDLES = [
-    '//protocols/ovsdb/rfc:onos-protocols-ovsdb-rfc',
-    '//protocols/ovsdb/api:onos-protocols-ovsdb-api',
-    '//protocols/ovsdb/ctl:onos-protocols-ovsdb-ctl',
-
-    '//providers/ovsdb/tunnel:onos-providers-ovsdb-tunnel',
-    '//providers/ovsdb/device:onos-providers-ovsdb-device',
-]
-
-onos_app (
-    app_name = 'org.onosproject.ovsdb-base',
-    title = 'OVSDB Provider',
-    category = 'Provider',
-    url = 'http://onosproject.org',
-    description = 'ONOS OVSDB provider.',
-    included_bundles = BUNDLES,
-)
diff --git a/providers/ovsdb/base/app.xml b/providers/ovsdb/base/app.xml
deleted file mode 100644
index ac46ba2..0000000
--- a/providers/ovsdb/base/app.xml
+++ /dev/null
@@ -1,29 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-  ~ Copyright 2016-present Open Networking Foundation
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~     http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License.
-  -->
-<app name="org.onosproject.ovsdb-base" origin="ON.Lab" version="${project.version}"
-     category="Provider" url="http://onosproject.org" title="OVSDB Provider"
-     featuresRepo="mvn:${project.groupId}/${project.artifactId}/${project.version}/xml/features"
-     features="${project.artifactId}">
-    <description>${project.description}</description>
-    <artifact>mvn:${project.groupId}/onos-ovsdb-rfc/${project.version}</artifact>
-    <artifact>mvn:${project.groupId}/onos-protocols-ovsdb-api/${project.version}</artifact>
-    <artifact>mvn:${project.groupId}/onos-ovsdb-ctl/${project.version}</artifact>
-    <artifact>mvn:${project.groupId}/onos-drivers-ovsdb/${project.version}</artifact>
-
-    <artifact>mvn:${project.groupId}/onos-ovsdb-provider-device/${project.version}</artifact>
-    <artifact>mvn:${project.groupId}/onos-ovsdb-provider-tunnel/${project.version}</artifact>
-</app>
diff --git a/providers/ovsdb/base/features.xml b/providers/ovsdb/base/features.xml
deleted file mode 100644
index 194bf9f..0000000
--- a/providers/ovsdb/base/features.xml
+++ /dev/null
@@ -1,35 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
-<!--
-  ~ Copyright 2016-present Open Networking Foundation
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~     http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License.
-  -->
-<features xmlns="http://karaf.apache.org/xmlns/features/v1.2.0" name="${project.artifactId}-${project.version}">
-    <feature name="${project.artifactId}" version="${project.version}"
-             description="${project.description}">
-        <feature>onos-api</feature>
-        <bundle>mvn:io.netty/netty-common/4.0.23.Final</bundle>
-        <bundle>mvn:io.netty/netty-buffer/4.0.23.Final</bundle>
-        <bundle>mvn:io.netty/netty-transport/4.0.23.Final</bundle>
-        <bundle>mvn:io.netty/netty-handler/4.0.23.Final</bundle>
-        <bundle>mvn:io.netty/netty-codec/4.0.23.Final</bundle>
-        <bundle>mvn:${project.groupId}/onos-ovsdb-rfc/${project.version}</bundle>
-        <bundle>mvn:${project.groupId}/onos-protocols-ovsdb-api/${project.version}</bundle>
-        <bundle>mvn:${project.groupId}/onos-ovsdb-ctl/${project.version}</bundle>
-
-        <bundle>mvn:${project.groupId}/onos-drivers-ovsdb/${project.version}</bundle>
-
-        <bundle>mvn:${project.groupId}/onos-ovsdb-provider-device/${project.version}</bundle>
-        <bundle>mvn:${project.groupId}/onos-ovsdb-provider-tunnel/${project.version}</bundle>
-    </feature>
-</features>
diff --git a/providers/ovsdb/device/BUCK b/providers/ovsdb/device/BUCK
deleted file mode 100644
index 582c16e..0000000
--- a/providers/ovsdb/device/BUCK
+++ /dev/null
@@ -1,15 +0,0 @@
-COMPILE_DEPS = [
-    '//lib:CORE_DEPS',
-    '//protocols/ovsdb/api:onos-protocols-ovsdb-api',
-    '//protocols/ovsdb/rfc:onos-protocols-ovsdb-rfc',
-]
-
-TEST_DEPS = [
-    '//lib:TEST_ADAPTERS'
-]
-
-osgi_jar_with_tests (
-    deps = COMPILE_DEPS,
-    test_deps = TEST_DEPS
-)
-
diff --git a/providers/ovsdb/device/src/main/java/org/onosproject/ovsdb/providers/device/OvsdbDeviceProvider.java b/providers/ovsdb/device/src/main/java/org/onosproject/ovsdb/providers/device/OvsdbDeviceProvider.java
index a520035..5fbf304 100644
--- a/providers/ovsdb/device/src/main/java/org/onosproject/ovsdb/providers/device/OvsdbDeviceProvider.java
+++ b/providers/ovsdb/device/src/main/java/org/onosproject/ovsdb/providers/device/OvsdbDeviceProvider.java
@@ -15,21 +15,6 @@
  */
 package org.onosproject.ovsdb.providers.device;
 
-import static com.google.common.base.Preconditions.checkNotNull;
-import static org.onlab.util.Tools.groupedThreads;
-import static org.slf4j.LoggerFactory.getLogger;
-
-import java.net.URI;
-import java.util.concurrent.ExecutorService;
-import java.util.concurrent.Executors;
-import java.util.concurrent.TimeUnit;
-
-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.packet.ChassisId;
 import org.onlab.packet.IpAddress;
 import org.onosproject.mastership.MastershipService;
@@ -54,27 +39,40 @@
 import org.onosproject.ovsdb.controller.OvsdbController;
 import org.onosproject.ovsdb.controller.OvsdbNodeId;
 import org.onosproject.ovsdb.controller.OvsdbNodeListener;
+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.URI;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.concurrent.TimeUnit;
+
+import static com.google.common.base.Preconditions.checkNotNull;
+import static org.onlab.util.Tools.groupedThreads;
+import static org.slf4j.LoggerFactory.getLogger;
+
 /**
  * Provider which uses an ovsdb controller to detect device.
  */
-@Component(immediate = true)
-@Service
+@Component(immediate = true, service = DeviceProvider.class)
 public class OvsdbDeviceProvider extends AbstractProvider
         implements DeviceProvider {
     private final Logger log = getLogger(getClass());
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected DeviceProviderRegistry providerRegistry;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected OvsdbController controller;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected DeviceService deviceService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected MastershipService mastershipService;
 
     private DeviceProviderService providerService;
diff --git a/providers/ovsdb/host/BUCK b/providers/ovsdb/host/BUCK
deleted file mode 100644
index bdb2b28..0000000
--- a/providers/ovsdb/host/BUCK
+++ /dev/null
@@ -1,17 +0,0 @@
-COMPILE_DEPS = [
-    '//lib:CORE_DEPS',
-    '//protocols/ovsdb/api:onos-protocols-ovsdb-api',
-    '//protocols/ovsdb/rfc:onos-protocols-ovsdb-rfc',
-]
-
-osgi_jar_with_tests (
-    deps = COMPILE_DEPS,
-)
-
-onos_app (
-    app_name = 'org.onosproject.ovsdbhostprovider',
-    title = 'OVSDB host Provider',
-    category = 'Provider',
-    url = 'http://onosproject.org',
-    description = 'OVSDB Host provider.',
-)
diff --git a/providers/ovsdb/host/src/main/java/org/onosproject/ovsdb/provider/host/OvsdbHostProvider.java b/providers/ovsdb/host/src/main/java/org/onosproject/ovsdb/provider/host/OvsdbHostProvider.java
index cacbd1a..9485e9f 100644
--- a/providers/ovsdb/host/src/main/java/org/onosproject/ovsdb/provider/host/OvsdbHostProvider.java
+++ b/providers/ovsdb/host/src/main/java/org/onosproject/ovsdb/provider/host/OvsdbHostProvider.java
@@ -15,19 +15,6 @@
  */
 package org.onosproject.ovsdb.provider.host;
 
-import static com.google.common.base.Preconditions.checkNotNull;
-import static org.onlab.util.Tools.toHex;
-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.apache.felix.scr.annotations.Service;
 import org.onlab.packet.VlanId;
 import org.onosproject.core.CoreService;
 import org.onosproject.net.DefaultAnnotations;
@@ -49,22 +36,33 @@
 import org.onosproject.ovsdb.controller.OvsdbEvent;
 import org.onosproject.ovsdb.controller.OvsdbEventListener;
 import org.onosproject.ovsdb.controller.OvsdbEventSubject;
+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.URI;
+import java.net.URISyntaxException;
+
+import static com.google.common.base.Preconditions.checkNotNull;
+import static org.onlab.util.Tools.toHex;
+import static org.slf4j.LoggerFactory.getLogger;
+
 /**
  * Provider which uses an ovsdb controller to detect host.
  */
-@Component(immediate = true)
-@Service
+@Component(immediate = true, service = HostProvider.class)
 public class OvsdbHostProvider extends AbstractProvider implements HostProvider {
     private final Logger log = getLogger(getClass());
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected HostProviderRegistry providerRegistry;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected CoreService coreService;
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected OvsdbController controller;
 
     private HostProviderService providerService;
diff --git a/providers/ovsdb/tunnel/BUCK b/providers/ovsdb/tunnel/BUCK
deleted file mode 100644
index 571e5ed..0000000
--- a/providers/ovsdb/tunnel/BUCK
+++ /dev/null
@@ -1,10 +0,0 @@
-COMPILE_DEPS = [
-    '//lib:CORE_DEPS',
-    '//protocols/ovsdb/api:onos-protocols-ovsdb-api',
-    '//protocols/ovsdb/rfc:onos-protocols-ovsdb-rfc',
-    '//incubator/api:onos-incubator-api',
-]
-
-osgi_jar_with_tests (
-    deps = COMPILE_DEPS,
-)
diff --git a/providers/ovsdb/tunnel/src/main/java/org/onosproject/ovsdb/provider/tunnel/OvsdbTunnelProvider.java b/providers/ovsdb/tunnel/src/main/java/org/onosproject/ovsdb/provider/tunnel/OvsdbTunnelProvider.java
index 264e05b..af919b1 100644
--- a/providers/ovsdb/tunnel/src/main/java/org/onosproject/ovsdb/provider/tunnel/OvsdbTunnelProvider.java
+++ b/providers/ovsdb/tunnel/src/main/java/org/onosproject/ovsdb/provider/tunnel/OvsdbTunnelProvider.java
@@ -15,14 +15,6 @@
  */
 package org.onosproject.ovsdb.provider.tunnel;
 
-import static org.slf4j.LoggerFactory.getLogger;
-
-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.incubator.net.tunnel.Tunnel;
 import org.onosproject.incubator.net.tunnel.TunnelDescription;
 import org.onosproject.incubator.net.tunnel.TunnelId;
@@ -33,18 +25,24 @@
 import org.onosproject.net.Path;
 import org.onosproject.net.provider.AbstractProvider;
 import org.onosproject.net.provider.ProviderId;
+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 static org.slf4j.LoggerFactory.getLogger;
+
 /**
  * Provider which uses when tunnel added/removed.
  */
-@Component(immediate = true)
-@Service
+@Component(immediate = true, service = TunnelProvider.class)
 public class OvsdbTunnelProvider extends AbstractProvider
         implements TunnelProvider {
     private final Logger log = getLogger(getClass());
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected TunnelProviderRegistry providerRegistry;
 
     private TunnelProviderService providerService;
diff --git a/providers/p4runtime/BUCK b/providers/p4runtime/BUCK
deleted file mode 100644
index 7df28a4..0000000
--- a/providers/p4runtime/BUCK
+++ /dev/null
@@ -1,17 +0,0 @@
-BUNDLES = [
-    '//providers/p4runtime/packet:onos-providers-p4runtime-packet',
-]
-
-onos_app (
-    app_name = 'org.onosproject.p4runtime',
-    title = 'P4Runtime Provider',
-    category = 'Provider',
-    url = 'http://onosproject.org',
-    included_bundles = BUNDLES,
-    description = 'P4Runtime southbound providers.',
-    required_apps = [
-        'org.onosproject.protocols.p4runtime',
-    ]
-)
-
-
diff --git a/providers/p4runtime/packet/BUCK b/providers/p4runtime/packet/BUCK
deleted file mode 100644
index 995095f..0000000
--- a/providers/p4runtime/packet/BUCK
+++ /dev/null
@@ -1,8 +0,0 @@
-COMPILE_DEPS = [
-    '//lib:CORE_DEPS',
-    '//protocols/p4runtime/api:onos-protocols-p4runtime-api',
-]
-
-osgi_jar (
-    deps = COMPILE_DEPS,
-)
\ No newline at end of file
diff --git a/providers/p4runtime/packet/src/main/java/org/onosproject/provider/p4runtime/packet/impl/P4RuntimePacketProvider.java b/providers/p4runtime/packet/src/main/java/org/onosproject/provider/p4runtime/packet/impl/P4RuntimePacketProvider.java
index 8693eff..22cfc02 100644
--- a/providers/p4runtime/packet/src/main/java/org/onosproject/provider/p4runtime/packet/impl/P4RuntimePacketProvider.java
+++ b/providers/p4runtime/packet/src/main/java/org/onosproject/provider/p4runtime/packet/impl/P4RuntimePacketProvider.java
@@ -17,11 +17,11 @@
 package org.onosproject.provider.p4runtime.packet.impl;
 
 
-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.onosproject.mastership.MastershipService;
 import org.onosproject.net.Device;
 import org.onosproject.net.DeviceId;
@@ -59,16 +59,16 @@
 
     private final Logger log = getLogger(getClass());
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected P4RuntimeController controller;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected PacketProviderRegistry providerRegistry;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected DeviceService deviceService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected MastershipService mastershipService;
 
     private PacketProviderService providerService;
diff --git a/providers/pcep/BUCK b/providers/pcep/BUCK
deleted file mode 100644
index 0f5c1d0..0000000
--- a/providers/pcep/BUCK
+++ /dev/null
@@ -1,20 +0,0 @@
-BUNDLES = [
-    '//providers/pcep/topology:onos-providers-pcep-topology',
-    '//providers/pcep/tunnel:onos-providers-pcep-tunnel',
-    '//providers/pcep/cli:onos-providers-pcep-cli',
-    '//protocols/pcep/server/api:onos-protocols-pcep-server-api',
-    '//protocols/pcep/pcepio:onos-protocols-pcep-pcepio',
-    '//protocols/pcep/server/ctl:onos-protocols-pcep-server-ctl',
-    '//apps/pcep-api:onos-apps-pcep-api',
-    '//lib:io_netty_netty',
-]
-
-onos_app (
-    title = 'PCEP Provider',
-    category = 'Provider',
-    url = 'http://onosproject.org',
-    included_bundles = BUNDLES,
-    description = 'PCEP protocol providers root.',
-    required_apps = [ 'org.onosproject.pcep-api', 'org.onosproject.optical-model' ],
-)
-
diff --git a/providers/pcep/app/app.xml b/providers/pcep/app/app.xml
deleted file mode 100644
index a5e4594..0000000
--- a/providers/pcep/app/app.xml
+++ /dev/null
@@ -1,29 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-  ~ Copyright 2015-present Open Networking Foundation
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~     http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License.
-  -->
-<app name="org.onosproject.pcep" origin="ON.Lab" version="${project.version}"
-     category="Provider" url="http://onosproject.org" title="PCEP Provider"
-     featuresRepo="mvn:${project.groupId}/${project.artifactId}/${project.version}/xml/features"
-     features="${project.artifactId}">
-    <description>${project.description}</description>
-    <artifact>mvn:${project.groupId}/onos-apps-pcep-api/${project.version}</artifact>
-    <artifact>mvn:${project.groupId}/onos-pcepio/${project.version}</artifact>
-    <artifact>mvn:${project.groupId}/onos-pcep-server-api/${project.version}</artifact>
-    <artifact>mvn:${project.groupId}/onos-pcep-server-impl/${project.version}</artifact>
-    <artifact>mvn:${project.groupId}/onos-pcep-provider-topology/${project.version}</artifact>
-    <artifact>mvn:${project.groupId}/onos-pcep-provider-tunnel/${project.version}</artifact>
-    <artifact>mvn:${project.groupId}/onos-pcep-provider-cli/${project.version}</artifact>
-</app>
diff --git a/providers/pcep/app/features.xml b/providers/pcep/app/features.xml
deleted file mode 100644
index 08bb24f..0000000
--- a/providers/pcep/app/features.xml
+++ /dev/null
@@ -1,29 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
-<!--
-  ~ Copyright 2015-present Open Networking Foundation
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~     http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License.
-  -->
-<features xmlns="http://karaf.apache.org/xmlns/features/v1.2.0" name="${project.artifactId}-${project.version}">
-    <feature name="${project.artifactId}" version="${project.version}"
-             description="${project.description}">
-        <feature>onos-api</feature>
-        <bundle>mvn:${project.groupId}/onos-apps-pcep-api/${project.version}</bundle>
-    <bundle>mvn:${project.groupId}/onos-pcepio/${project.version}</bundle>
-        <bundle>mvn:${project.groupId}/onos-pcep-server-api/${project.version}</bundle>
-        <bundle>mvn:${project.groupId}/onos-pcep-server-impl/${project.version}</bundle>
-        <bundle>mvn:${project.groupId}/onos-pcep-provider-topology/${project.version}</bundle>
-        <bundle>mvn:${project.groupId}/onos-pcep-provider-tunnel/${project.version}</bundle>
-        <bundle>mvn:${project.groupId}/onos-pcep-provider-cli/${project.version}</bundle>
-    </feature>
-</features>
diff --git a/providers/pcep/cli/BUCK b/providers/pcep/cli/BUCK
deleted file mode 100644
index ed68b8f..0000000
--- a/providers/pcep/cli/BUCK
+++ /dev/null
@@ -1,12 +0,0 @@
-COMPILE_DEPS = [
-  '//lib:CORE_DEPS',
-  '//incubator/api:onos-incubator-api',
-  '//protocols/pcep/server/ctl:onos-protocols-pcep-server-ctl',
-  '//protocols/pcep/server/api:onos-protocols-pcep-server-api',
-  '//lib:org.apache.karaf.shell.console',
-  '//cli:onos-cli',
-]
-
-osgi_jar_with_tests (
-  deps = COMPILE_DEPS,
-)
diff --git a/providers/pcep/cli/BUILD b/providers/pcep/cli/BUILD
index b623bd9..ff1e7ad 100644
--- a/providers/pcep/cli/BUILD
+++ b/providers/pcep/cli/BUILD
@@ -1,11 +1,10 @@
-COMPILE_DEPS = CORE_DEPS + [
-    "@org_apache_karaf_shell_console//jar",
+COMPILE_DEPS = CORE_DEPS + CLI + [
     "//incubator/api:onos-incubator-api",
     "//protocols/pcep/server/ctl:onos-protocols-pcep-server-ctl",
     "//protocols/pcep/server/api:onos-protocols-pcep-server-api",
-    "//cli:onos-cli",
 ]
 
 osgi_jar_with_tests(
+    karaf_command_packages = ["org.onosproject.pcep.cli"],
     deps = COMPILE_DEPS,
 )
diff --git a/providers/pcep/cli/src/main/java/org/onosproject/pcep/cli/PcepSessionCommand.java b/providers/pcep/cli/src/main/java/org/onosproject/pcep/cli/PcepSessionCommand.java
index c46a9a1..68315e3 100644
--- a/providers/pcep/cli/src/main/java/org/onosproject/pcep/cli/PcepSessionCommand.java
+++ b/providers/pcep/cli/src/main/java/org/onosproject/pcep/cli/PcepSessionCommand.java
@@ -16,8 +16,9 @@
 package org.onosproject.pcep.cli;
 
 
-import org.apache.karaf.shell.commands.Argument;
-import org.apache.karaf.shell.commands.Command;
+import org.apache.karaf.shell.api.action.Argument;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.pcep.server.PcepClientController;
 import org.onosproject.pcep.server.PcepErrorDetail;
@@ -31,7 +32,7 @@
 import java.util.ArrayList;
 import java.util.TreeMap;
 
-
+@Service
 @Command(scope = "onos", name = "pcep", description = "Pcep Session Info")
 public class PcepSessionCommand extends AbstractShellCommand {
     private static final Logger log = LoggerFactory.getLogger(PcepSessionCommand.class);
@@ -68,7 +69,7 @@
     String peer = null;
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         switch (name) {
             case SESSION:
                 displayPcepSession();
diff --git a/providers/pcep/cli/src/main/resources/OSGI-INF/blueprint/shell-config.xml b/providers/pcep/cli/src/main/resources/OSGI-INF/blueprint/shell-config.xml
deleted file mode 100644
index aef97fd..0000000
--- a/providers/pcep/cli/src/main/resources/OSGI-INF/blueprint/shell-config.xml
+++ /dev/null
@@ -1,10 +0,0 @@
-<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0">
-
-    <command-bundle xmlns="http://karaf.apache.org/xmlns/shell/v1.1.0">
-
-        <command>
-            <action class="org.onosproject.pcep.cli.PcepSessionCommand"/>
-        </command>
-    </command-bundle>
-
-</blueprint>
diff --git a/providers/pcep/topology/BUCK b/providers/pcep/topology/BUCK
deleted file mode 100644
index b3daa56..0000000
--- a/providers/pcep/topology/BUCK
+++ /dev/null
@@ -1,25 +0,0 @@
-COMPILE_DEPS = [
-    '//lib:CORE_DEPS',
-    '//lib:NETTY',
-    '//lib:JACKSON',
-    '//incubator/api:onos-incubator-api',
-    '//protocols/ovsdb/api:onos-protocols-ovsdb-api',
-    '//protocols/ovsdb/rfc:onos-protocols-ovsdb-rfc',
-    '//apps/pcep-api:onos-apps-pcep-api',
-    '//protocols/pcep/server/api:onos-protocols-pcep-server-api',
-    '//protocols/pcep/pcepio:onos-protocols-pcep-pcepio',
-    '//core/api:onos-api-tests',
-    '//apps/optical-model:onos-apps-optical-model',
-    '//lib:io_netty_netty',
-]
-
-TEST_DEPS = [
-    '//lib:TEST',
-    '//protocols/pcep/server/api:onos-protocols-pcep-server-api-tests',
-    '//apps/pcep-api:onos-apps-pcep-api-tests',
-]
-
-osgi_jar_with_tests (
-    deps = COMPILE_DEPS,
-    test_deps = TEST_DEPS,
-)
diff --git a/providers/pcep/topology/src/main/java/org/onosproject/provider/pcep/topology/impl/PcepTopologyProvider.java b/providers/pcep/topology/src/main/java/org/onosproject/provider/pcep/topology/impl/PcepTopologyProvider.java
index c4f6a50..d0f8c1b 100644
--- a/providers/pcep/topology/src/main/java/org/onosproject/provider/pcep/topology/impl/PcepTopologyProvider.java
+++ b/providers/pcep/topology/src/main/java/org/onosproject/provider/pcep/topology/impl/PcepTopologyProvider.java
@@ -15,11 +15,11 @@
  */
 package org.onosproject.provider.pcep.topology.impl;
 
-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.ChassisId;
 import org.onosproject.net.ConnectPoint;
 import org.onosproject.net.DefaultAnnotations;
@@ -92,25 +92,25 @@
     private static final Logger log = LoggerFactory
             .getLogger(PcepTopologyProvider.class);
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected LinkProviderRegistry linkProviderRegistry;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected DeviceProviderRegistry deviceProviderRegistry;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected PcepController controller;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected DeviceService deviceService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected PcepClientController pcepClientController;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected NetworkConfigRegistry netConfigRegistry;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected NetworkConfigService netConfigService;
 
     private DeviceProviderService deviceProviderService;
diff --git a/providers/pcep/tunnel/BUCK b/providers/pcep/tunnel/BUCK
deleted file mode 100644
index 97adbd1..0000000
--- a/providers/pcep/tunnel/BUCK
+++ /dev/null
@@ -1,25 +0,0 @@
-COMPILE_DEPS = [
-    '//lib:CORE_DEPS',
-    '//lib:NETTY',
-    '//protocols/ovsdb/api:onos-protocols-ovsdb-api',
-    '//protocols/ovsdb/rfc:onos-protocols-ovsdb-rfc',
-    '//apps/pcep-api:onos-apps-pcep-api',
-    '//incubator/api:onos-incubator-api',
-    '//protocols/pcep/pcepio:onos-protocols-pcep-pcepio',
-    '//protocols/pcep/server/api:onos-protocols-pcep-server-api',
-    '//protocols/pcep/server/ctl:onos-protocols-pcep-server-ctl',
-]
-
-TEST_DEPS = [
-    '//lib:TEST_ADAPTERS',
-    '//lib:io_netty_netty',
-    '//lib:io_netty_netty_transport',
-    '//protocols/pcep/server/api:onos-protocols-pcep-server-api-tests',
-    '//apps/pcep-api:onos-apps-pcep-api-tests',
-    '//incubator/api:onos-incubator-api-tests',
-]
-
-osgi_jar_with_tests (
-    deps = COMPILE_DEPS,
-    test_deps = TEST_DEPS,
-)
diff --git a/providers/pcep/tunnel/src/main/java/org/onosproject/provider/pcep/tunnel/impl/OsgiPropertyConstants.java b/providers/pcep/tunnel/src/main/java/org/onosproject/provider/pcep/tunnel/impl/OsgiPropertyConstants.java
new file mode 100644
index 0000000..4d7b840
--- /dev/null
+++ b/providers/pcep/tunnel/src/main/java/org/onosproject/provider/pcep/tunnel/impl/OsgiPropertyConstants.java
@@ -0,0 +1,29 @@
+/*
+ * Copyright 2018-present Open Networking Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.onosproject.provider.pcep.tunnel.impl;
+
+/**
+ * Constants for default values of configurable properties.
+ */
+public final class OsgiPropertyConstants {
+
+    private OsgiPropertyConstants() {}
+
+    public static final String POLL_FREQUENCY = "tunnelStatsPollFrequency";
+    public static final int POLL_FREQUENCY_DEFAULT = 10;
+
+}
diff --git a/providers/pcep/tunnel/src/main/java/org/onosproject/provider/pcep/tunnel/impl/PcepTunnelProvider.java b/providers/pcep/tunnel/src/main/java/org/onosproject/provider/pcep/tunnel/impl/PcepTunnelProvider.java
index 4b7b605..d25c95f 100644
--- a/providers/pcep/tunnel/src/main/java/org/onosproject/provider/pcep/tunnel/impl/PcepTunnelProvider.java
+++ b/providers/pcep/tunnel/src/main/java/org/onosproject/provider/pcep/tunnel/impl/PcepTunnelProvider.java
@@ -16,14 +16,6 @@
 package org.onosproject.provider.pcep.tunnel.impl;
 
 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.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.graph.ScalarWeight;
 import org.onlab.packet.Ip4Address;
 import org.onlab.packet.IpAddress;
@@ -88,8 +80,8 @@
 import org.onosproject.pcep.server.PcepEventListener;
 import org.onosproject.pcep.server.PcepLspStatus;
 import org.onosproject.pcep.server.PcepLspSyncAction;
-import org.onosproject.pcep.server.SrpIdGenerators;
 import org.onosproject.pcep.server.PcepSyncStatus;
+import org.onosproject.pcep.server.SrpIdGenerators;
 import org.onosproject.pcepio.exceptions.PcepParseException;
 import org.onosproject.pcepio.protocol.PcInitiatedLspRequest;
 import org.onosproject.pcepio.protocol.PcepAttribute;
@@ -114,7 +106,12 @@
 import org.onosproject.pcepio.types.StatefulIPv4LspIdentifiersTlv;
 import org.onosproject.pcepio.types.SymbolicPathNameTlv;
 import org.osgi.service.component.ComponentContext;
+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;
@@ -136,39 +133,43 @@
 import static com.google.common.base.Strings.isNullOrEmpty;
 import static org.onlab.util.Tools.get;
 import static org.onosproject.incubator.net.tunnel.Tunnel.State.INIT;
+import static org.onosproject.incubator.net.tunnel.Tunnel.State.UNSTABLE;
 import static org.onosproject.incubator.net.tunnel.Tunnel.Type.MPLS;
 import static org.onosproject.net.DefaultAnnotations.EMPTY;
 import static org.onosproject.net.DeviceId.deviceId;
 import static org.onosproject.net.PortNumber.portNumber;
 import static org.onosproject.pcep.api.PcepDpid.uri;
-import static org.onosproject.pcep.server.LspType.WITH_SIGNALLING;
 import static org.onosproject.pcep.server.LspType.SR_WITHOUT_SIGNALLING;
 import static org.onosproject.pcep.server.LspType.WITHOUT_SIGNALLING_AND_WITHOUT_SR;
+import static org.onosproject.pcep.server.LspType.WITH_SIGNALLING;
 import static org.onosproject.pcep.server.PcepAnnotationKeys.BANDWIDTH;
+import static org.onosproject.pcep.server.PcepAnnotationKeys.COST_TYPE;
+import static org.onosproject.pcep.server.PcepAnnotationKeys.DELEGATE;
 import static org.onosproject.pcep.server.PcepAnnotationKeys.LOCAL_LSP_ID;
 import static org.onosproject.pcep.server.PcepAnnotationKeys.LSP_SIG_TYPE;
 import static org.onosproject.pcep.server.PcepAnnotationKeys.PCC_TUNNEL_ID;
 import static org.onosproject.pcep.server.PcepAnnotationKeys.PCE_INIT;
 import static org.onosproject.pcep.server.PcepAnnotationKeys.PLSP_ID;
-import static org.onosproject.pcep.server.PcepAnnotationKeys.DELEGATE;
-import static org.onosproject.pcep.server.PcepAnnotationKeys.COST_TYPE;
-import static org.onosproject.provider.pcep.tunnel.impl.RequestType.CREATE;
-import static org.onosproject.provider.pcep.tunnel.impl.RequestType.DELETE;
-import static org.onosproject.provider.pcep.tunnel.impl.RequestType.LSP_STATE_RPT;
-import static org.onosproject.provider.pcep.tunnel.impl.RequestType.UPDATE;
-import static org.onosproject.incubator.net.tunnel.Tunnel.State.UNSTABLE;
 import static org.onosproject.pcep.server.PcepLspSyncAction.REMOVE;
 import static org.onosproject.pcep.server.PcepLspSyncAction.SEND_UPDATE;
 import static org.onosproject.pcepio.protocol.ver1.PcepMetricObjectVer1.IGP_METRIC;
 import static org.onosproject.pcepio.protocol.ver1.PcepMetricObjectVer1.TE_METRIC;
+import static org.onosproject.provider.pcep.tunnel.impl.OsgiPropertyConstants.POLL_FREQUENCY;
+import static org.onosproject.provider.pcep.tunnel.impl.OsgiPropertyConstants.POLL_FREQUENCY_DEFAULT;
+import static org.onosproject.provider.pcep.tunnel.impl.RequestType.CREATE;
+import static org.onosproject.provider.pcep.tunnel.impl.RequestType.DELETE;
+import static org.onosproject.provider.pcep.tunnel.impl.RequestType.LSP_STATE_RPT;
+import static org.onosproject.provider.pcep.tunnel.impl.RequestType.UPDATE;
 import static org.slf4j.LoggerFactory.getLogger;
 
 /**
  * Provider which uses an PCEP controller to detect, update, create network
  * tunnels.
  */
-@Component(immediate = true)
-@Service
+@Component(immediate = true, service = TunnelProvider.class,
+        property = {
+                POLL_FREQUENCY + ":Integer=" + POLL_FREQUENCY_DEFAULT,
+        })
 public class PcepTunnelProvider extends AbstractProvider implements TunnelProvider {
 
     private static final Logger log = getLogger(PcepTunnelProvider.class);
@@ -182,38 +183,36 @@
     private static final int WAIT_TIME = 5;
     public static final String LSRID = "lsrId";
 
-    static final int POLL_INTERVAL = 10;
-    @Property(name = "tunnelStatsPollFrequency", intValue = POLL_INTERVAL,
-            label = "Frequency (in seconds) for polling tunnel statistics")
-    private int tunnelStatsPollFrequency = POLL_INTERVAL;
+    /** Frequency (in seconds) for polling tunnel statistics. */
+    private int tunnelStatsPollFrequency = POLL_FREQUENCY_DEFAULT;
 
     private static final String TUNNLE_NOT_NULL = "Create failed,The given port may be wrong or has been occupied.";
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected TunnelProviderRegistry tunnelProviderRegistry;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected PcepController controller;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected PcepClientController pcepClientController;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected TunnelService tunnelService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected ComponentConfigService cfgService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected TunnelAdminService tunnelAdminService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected MastershipService mastershipService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected DeviceService deviceService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected LinkService linkService;
 
     TunnelProviderService service;
@@ -266,7 +265,7 @@
         Dictionary<?, ?> properties = context.getProperties();
         int newTunnelStatsPollFrequency;
         try {
-            String s = get(properties, "tunnelStatsPollFrequency");
+            String s = get(properties, POLL_FREQUENCY);
             newTunnelStatsPollFrequency = isNullOrEmpty(s) ? tunnelStatsPollFrequency : Integer.parseInt(s.trim());
 
         } catch (NumberFormatException | ClassCastException e) {
diff --git a/providers/pcep/tunnel/src/main/java/org/onosproject/provider/pcep/tunnel/impl/TunnelStatsCollector.java b/providers/pcep/tunnel/src/main/java/org/onosproject/provider/pcep/tunnel/impl/TunnelStatsCollector.java
index c629f61..bae93fc 100644
--- a/providers/pcep/tunnel/src/main/java/org/onosproject/provider/pcep/tunnel/impl/TunnelStatsCollector.java
+++ b/providers/pcep/tunnel/src/main/java/org/onosproject/provider/pcep/tunnel/impl/TunnelStatsCollector.java
@@ -17,8 +17,8 @@
 package org.onosproject.provider.pcep.tunnel.impl;
 
 
-import org.apache.felix.scr.annotations.Reference;
-import org.apache.felix.scr.annotations.ReferenceCardinality;
+import org.osgi.service.component.annotations.Reference;
+import org.osgi.service.component.annotations.ReferenceCardinality;
 import org.onlab.util.Timer;
 import org.onosproject.pcep.api.PcepController;
 import org.slf4j.Logger;
@@ -35,7 +35,7 @@
 public class TunnelStatsCollector implements TimerTask {
     private final Logger log = LoggerFactory.getLogger(getClass());
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected PcepController controller;
 
     private int refreshInterval;
diff --git a/providers/rest/BUCK b/providers/rest/BUCK
deleted file mode 100644
index b6e2e2b..0000000
--- a/providers/rest/BUCK
+++ /dev/null
@@ -1,21 +0,0 @@
-BUNDLES = [
-    '//providers/rest/device:onos-providers-rest-device',
-    '//protocols/rest/api:onos-protocols-rest-api',
-    '//protocols/rest/ctl:onos-protocols-rest-ctl',
-    '//lib:jersey-client',
-    '//lib:jersey-security',
-    '//lib:commons-io',
-    '//lib:httpclient-osgi',
-    '//lib:httpcore-osgi',
-]
-
-onos_app (
-    app_name = 'org.onosproject.restsb',
-    title = 'REST Provider',
-    category = 'Provider',
-    url = 'https://wiki.onosproject.org/display/ONOS/REST',
-    included_bundles = BUNDLES,
-    description = 'Provides means for ONOS to discover the existence of a REST API enabled device ' +
-        'or proxy for multiple devices from information given by network configuration.',
-)
-
diff --git a/providers/rest/app/app.xml b/providers/rest/app/app.xml
deleted file mode 100644
index 14b9dc8..0000000
--- a/providers/rest/app/app.xml
+++ /dev/null
@@ -1,27 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-  ~ Copyright 2016-present Open Networking Foundation
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~     http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License.
-  -->
-<app name="org.onosproject.restsb" origin="ON.Lab" version="${project.version}"
-     category="Provider" url="https://wiki.onosproject.org/display/ONOS/REST" title="REST/SB Provider"
-     featuresRepo="mvn:${project.groupId}/${project.artifactId}/${project.version}/xml/features"
-     features="${project.artifactId}">
-    <description>${project.description}</description>
-    <artifact>mvn:${project.groupId}/onos-restsb-api/${project.version}</artifact>
-    <artifact>mvn:${project.groupId}/onos-restsb-ctl/${project.version}</artifact>
-
-    <artifact>mvn:${project.groupId}/onos-restsb-provider-device/${project.version}</artifact>
-
-</app>
diff --git a/providers/rest/app/features.xml b/providers/rest/app/features.xml
deleted file mode 100644
index 2b086fa..0000000
--- a/providers/rest/app/features.xml
+++ /dev/null
@@ -1,32 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
-<!--
-  ~ Copyright 2016-present Open Networking Foundation
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~     http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License.
-  -->
-<features xmlns="http://karaf.apache.org/xmlns/features/v1.2.0" name="${project.artifactId}-${project.version}">
-    <feature name="${project.artifactId}" version="${project.version}"
-             description="${project.description}">
-        <feature>onos-api</feature>
-        <bundle>mvn:${project.groupId}/onos-restsb-api/${project.version}</bundle>
-        <bundle>mvn:${project.groupId}/onos-restsb-ctl/${project.version}</bundle>
-
-        <bundle>mvn:${project.groupId}/onos-restsb-provider-device/${project.version}</bundle>
-
-        <bundle>mvn:org.glassfish.jersey.core/jersey-client/2.25.1</bundle>
-        <bundle>mvn:commons-io/commons-io/2.4</bundle>
-        <bundle>mvn:org.apache.httpcomponents/httpclient-osgi/4.5.1</bundle>
-        <bundle>mvn:org.apache.httpcomponents/httpcore-osgi/4.4.4</bundle>
-    </feature>
-</features>
-
diff --git a/providers/rest/device/BUCK b/providers/rest/device/BUCK
deleted file mode 100644
index d84b307..0000000
--- a/providers/rest/device/BUCK
+++ /dev/null
@@ -1,14 +0,0 @@
-COMPILE_DEPS = [
-    '//lib:CORE_DEPS',
-    '//lib:JACKSON',
-    '//protocols/ovsdb/api:onos-protocols-ovsdb-api',
-    '//protocols/ovsdb/rfc:onos-protocols-ovsdb-rfc',
-    '//apps/pcep-api:onos-apps-pcep-api',
-    '//incubator/api:onos-incubator-api',
-    '//protocols/rest/api:onos-protocols-rest-api',
-    '//lib:javax.ws.rs-api',
-]
-
-osgi_jar_with_tests (
-    deps = COMPILE_DEPS,
-)
diff --git a/providers/rest/device/src/main/java/org/onosproject/provider/rest/device/impl/OsgiPropertyConstants.java b/providers/rest/device/src/main/java/org/onosproject/provider/rest/device/impl/OsgiPropertyConstants.java
new file mode 100644
index 0000000..41e65ba
--- /dev/null
+++ b/providers/rest/device/src/main/java/org/onosproject/provider/rest/device/impl/OsgiPropertyConstants.java
@@ -0,0 +1,29 @@
+/*
+ * Copyright 2018-present Open Networking Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.onosproject.provider.rest.device.impl;
+
+/**
+ * Constants for default values of configurable properties.
+ */
+public final class OsgiPropertyConstants {
+
+    private OsgiPropertyConstants() {}
+
+    public static final String POLL_FREQUENCY = "pollFrequency";
+    public static final int POLL_FREQUENCY_DEFAULT = 30;
+
+}
diff --git a/providers/rest/device/src/main/java/org/onosproject/provider/rest/device/impl/RestDeviceProvider.java b/providers/rest/device/src/main/java/org/onosproject/provider/rest/device/impl/RestDeviceProvider.java
index f289dc9..a302203 100644
--- a/providers/rest/device/src/main/java/org/onosproject/provider/rest/device/impl/RestDeviceProvider.java
+++ b/providers/rest/device/src/main/java/org/onosproject/provider/rest/device/impl/RestDeviceProvider.java
@@ -18,13 +18,6 @@
 
 import com.google.common.base.Objects;
 import com.google.common.collect.ImmutableList;
-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.onlab.packet.ChassisId;
 import org.onlab.util.SharedExecutors;
 import org.onlab.util.SharedScheduledExecutorService;
@@ -68,6 +61,12 @@
 import org.onosproject.protocol.rest.RestSBController;
 import org.onosproject.protocol.rest.RestSBDevice;
 import org.osgi.service.component.ComponentContext;
+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 javax.ws.rs.ProcessingException;
@@ -93,12 +92,17 @@
 import static org.onosproject.net.config.NetworkConfigEvent.Type.CONFIG_ADDED;
 import static org.onosproject.net.config.NetworkConfigEvent.Type.CONFIG_REMOVED;
 import static org.onosproject.net.config.NetworkConfigEvent.Type.CONFIG_UPDATED;
+import static org.onosproject.provider.rest.device.impl.OsgiPropertyConstants.POLL_FREQUENCY;
+import static org.onosproject.provider.rest.device.impl.OsgiPropertyConstants.POLL_FREQUENCY_DEFAULT;
 import static org.slf4j.LoggerFactory.getLogger;
 
 /**
  * Provider for devices that use REST as means of configuration communication.
  */
-@Component(immediate = true)
+@Component(immediate = true, service = DeviceProvider.class,
+        property = {
+                POLL_FREQUENCY + ":Integer=" + POLL_FREQUENCY_DEFAULT,
+        })
 public class RestDeviceProvider extends AbstractProvider
         implements DeviceProvider {
     private static final String APP_NAME = "org.onosproject.restsb";
@@ -107,38 +111,34 @@
     private static final String IPADDRESS = "ipaddress";
     private static final String ISNOTNULL = "Rest device is not null";
     private static final String UNKNOWN = "unknown";
-    private static final String POLL_FREQUENCY = "pollFrequency";
     private static final int REST_TIMEOUT_SEC = 5;
     private static final int EXECUTOR_THREAD_POOL_SIZE = 8;
     private static final int DEVICE_POLL_SEC = 30;
     private final Logger log = getLogger(getClass());
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected DeviceProviderRegistry providerRegistry;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected RestSBController controller;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected NetworkConfigRegistry netCfgService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected ComponentConfigService compCfgService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected CoreService coreService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected DeviceService deviceService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected DriverService driverService;
 
-    private static final int DEFAULT_POLL_FREQUENCY_SECONDS = 30;
-    @Property(name = POLL_FREQUENCY, intValue = DEFAULT_POLL_FREQUENCY_SECONDS,
-            label = "Configure poll frequency for port status and statistics; " +
-                    "default is 30 seconds")
-    private int pollFrequency = DEFAULT_POLL_FREQUENCY_SECONDS;
+    /** Configure poll frequency for port status and statistics; default is 30 seconds. */
+    private int pollFrequency = POLL_FREQUENCY_DEFAULT;
 
     private DeviceProviderService providerService;
     private ApplicationId appId;
@@ -188,7 +188,7 @@
         if (context != null) {
             Dictionary<?, ?> properties = context.getProperties();
             pollFrequency = Tools.getIntegerProperty(properties, POLL_FREQUENCY,
-                                                     DEFAULT_POLL_FREQUENCY_SECONDS);
+                                                     POLL_FREQUENCY_DEFAULT);
             log.info("Configured. Poll frequency is configured to {} seconds", pollFrequency);
         }
 
diff --git a/providers/snmp/BUCK b/providers/snmp/BUCK
deleted file mode 100644
index 598515d..0000000
--- a/providers/snmp/BUCK
+++ /dev/null
@@ -1,21 +0,0 @@
-BUNDLES = [
-  '//providers/snmp/device:onos-providers-snmp-device',
-  '//providers/snmp/alarm:onos-providers-snmp-alarm',
-  '//protocols/snmp/api:onos-protocols-snmp-api',
-  '//protocols/snmp/ctl:onos-protocols-snmp-ctl',
-  '//lib:org.apache.servicemix.bundles.snmp4j',
-  '//lib:mibs-rfc',
-  '//lib:snmp-core',
-  '//lib:mibs-net-snmp',
-]
-
-onos_app (
-    app_name = 'org.onosproject.snmp',
-    title = 'SNMP Provider',
-    category = 'Provider',
-    url = 'https://wiki.onosproject.org/display/ONOS/SNMP',
-    included_bundles = BUNDLES,
-    description = 'Provides means for ONOS to discover and trigger the initial handshake procedure ' +
-        'with SNMP enabled devices from information given by network configuration.',
-    required_apps = [ 'org.onosproject.faultmanagement'],
-)
diff --git a/providers/snmp/alarm/BUCK b/providers/snmp/alarm/BUCK
deleted file mode 100644
index a5f0c4b..0000000
--- a/providers/snmp/alarm/BUCK
+++ /dev/null
@@ -1,13 +0,0 @@
-COMPILE_DEPS = [
-    '//lib:CORE_DEPS',
-    '//lib:JACKSON',
-    '//incubator/api:onos-incubator-api',
-    '//protocols/snmp/api:onos-protocols-snmp-api',
-    '//protocols/snmp/ctl:onos-protocols-snmp-ctl',
-    '//providers/snmp/device:onos-providers-snmp-device',
-    '//lib:org.apache.servicemix.bundles.snmp4j',
-]
-
-osgi_jar_with_tests (
-    deps = COMPILE_DEPS,
-)
diff --git a/providers/snmp/alarm/src/main/java/org/onosproject/provider/snmp/alarm/impl/SnmpAlarmProvider.java b/providers/snmp/alarm/src/main/java/org/onosproject/provider/snmp/alarm/impl/SnmpAlarmProvider.java
index 49874dd..1b29e00 100644
--- a/providers/snmp/alarm/src/main/java/org/onosproject/provider/snmp/alarm/impl/SnmpAlarmProvider.java
+++ b/providers/snmp/alarm/src/main/java/org/onosproject/provider/snmp/alarm/impl/SnmpAlarmProvider.java
@@ -17,12 +17,12 @@
 package org.onosproject.provider.snmp.alarm.impl;
 
 import com.google.common.collect.ImmutableList;
-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.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.Modified;
+import org.osgi.service.component.annotations.Reference;
+import org.osgi.service.component.annotations.ReferenceCardinality;
 import org.onlab.packet.IpAddress;
 import org.onosproject.cluster.ClusterService;
 import org.onosproject.core.ApplicationId;
@@ -80,25 +80,25 @@
     public static final String COLON = ":";
     private final Logger log = getLogger(SnmpAlarmProvider.class);
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected SnmpController controller;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected AlarmProviderRegistry providerRegistry;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected DriverService driverService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected MastershipService mastershipService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected DeviceService deviceService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected CoreService coreService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected ClusterService clusterService;
 
     private static final String APP_NAME = "org.onosproject.snmp";
diff --git a/providers/snmp/app/app.xml b/providers/snmp/app/app.xml
deleted file mode 100644
index 7cedcee..0000000
--- a/providers/snmp/app/app.xml
+++ /dev/null
@@ -1,32 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-  ~ Copyright 2015-present Open Networking Foundation
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~     http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License.
-  -->
-<app name="org.onosproject.snmp" origin="BTI Systems" version="${project.version}"
-     category="Provider" url="http://onosproject.org" title="SNMP Provider"
-     featuresRepo="mvn:${project.groupId}/${project.artifactId}/${project.version}/xml/features"
-     features="${project.artifactId}" apps="org.onosproject.faultmanagement">
-    <description>${project.description}</description>
-    <artifact>mvn:${project.groupId}/onos-providers-snmp-device/${project.version}</artifact>
-    <artifact>mvn:${project.groupId}/onos-providers-snmp-alarm/${project.version}</artifact>
-
-    <artifact>mvn:${project.groupId}/onos-protocols-snmp-api/${project.version}</artifact>
-    <artifact>mvn:${project.groupId}/onos-protocols-snmp-ctl/${project.version}</artifact>
-
-    <artifact>mvn:org.onosproject/snmp-core/1.3-20161021.1</artifact>
-    <artifact>mvn:org.onosproject/mibbler-mibs-bti7000/1.0-20151221.1</artifact>
-    <artifact>mvn:org.onosproject/mibbler-mibs-net-snmp/1.0-20151221.1</artifact>
-
-</app>
diff --git a/providers/snmp/app/features.xml b/providers/snmp/app/features.xml
deleted file mode 100644
index 88176ed..0000000
--- a/providers/snmp/app/features.xml
+++ /dev/null
@@ -1,33 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
-<!--
-  ~ Copyright 2015-present Open Networking Foundation
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~     http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License.
-  -->
-<features xmlns="http://karaf.apache.org/xmlns/features/v1.2.0" name="${project.artifactId}-${project.version}">
-    <feature name="${project.artifactId}" version="${project.version}"
-             description="${project.description}">
-        <feature>onos-api</feature>
-        <bundle>mvn:io.netty/netty/3.9.2.Final</bundle>
-        <bundle>mvn:${project.groupId}/onos-protocols-snmp-api/${project.version}</bundle>
-        <bundle>mvn:${project.groupId}/onos-protocols-snmp-ctl/${project.version}</bundle>
-        <bundle>mvn:${project.groupId}/onos-providers-snmp-device/${project.version}</bundle>
-        <bundle>mvn:${project.groupId}/onos-providers-snmp-alarm/${project.version}</bundle>
-
-        <bundle>mvn:org.apache.servicemix.bundles/org.apache.servicemix.bundles.snmp4j/2.3.4_1</bundle>
-        <bundle>mvn:org.onosproject/snmp-core/1.3-20161021.1</bundle>
-        <bundle>mvn:org.onosproject/mibbler-mibs-bti7000/1.0-20151221.1</bundle>
-        <bundle>mvn:org.onosproject/mibbler-mibs-net-snmp/1.0-20151221.1</bundle>
-    </feature>
-</features>
-
diff --git a/providers/snmp/device/BUCK b/providers/snmp/device/BUCK
deleted file mode 100644
index 317784e..0000000
--- a/providers/snmp/device/BUCK
+++ /dev/null
@@ -1,21 +0,0 @@
-COMPILE_DEPS = [
-    '//lib:CORE_DEPS',
-    '//lib:JACKSON',
-    '//lib:org.apache.servicemix.bundles.snmp4j',
-    '//lib:snmp-core',
-    '//lib:mibs-net-snmp',
-    '//lib:mibs-rfc',
-    '//incubator/api:onos-incubator-api',
-    '//protocols/snmp/api:onos-protocols-snmp-api',
-    '//protocols/snmp/ctl:onos-protocols-snmp-ctl',
-]
-
-TEST_DEPS = [
-    '//lib:TEST',
-    '//core/api:onos-api-tests',
-]
-osgi_jar_with_tests (
-    deps = COMPILE_DEPS,
-    test_deps = TEST_DEPS,
-)
-
diff --git a/providers/snmp/device/src/main/java/org/onosproject/provider/snmp/device/impl/SnmpDeviceProvider.java b/providers/snmp/device/src/main/java/org/onosproject/provider/snmp/device/impl/SnmpDeviceProvider.java
index 66ee7c5..ddd81c7 100644
--- a/providers/snmp/device/src/main/java/org/onosproject/provider/snmp/device/impl/SnmpDeviceProvider.java
+++ b/providers/snmp/device/src/main/java/org/onosproject/provider/snmp/device/impl/SnmpDeviceProvider.java
@@ -15,12 +15,12 @@
  */
 package org.onosproject.provider.snmp.device.impl;
 
-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.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.Modified;
+import org.osgi.service.component.annotations.Reference;
+import org.osgi.service.component.annotations.ReferenceCardinality;
 import org.onlab.packet.ChassisId;
 import org.onosproject.core.ApplicationId;
 import org.onosproject.core.CoreService;
@@ -75,22 +75,22 @@
     private static final String APP_NAME = "org.onosproject.snmp";
     protected static final String SCHEME = "snmp";
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected SnmpController controller;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected DeviceProviderRegistry providerRegistry;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected DeviceService deviceService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected DeviceStore deviceStore;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected CoreService coreService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected NetworkConfigRegistry netCfgService;
 
     protected DeviceProviderService providerService;
diff --git a/providers/tl1/BUCK b/providers/tl1/BUCK
deleted file mode 100644
index 0ccb0ad..0000000
--- a/providers/tl1/BUCK
+++ /dev/null
@@ -1,15 +0,0 @@
-BUNDLES = [
-    '//providers/tl1/device:onos-providers-tl1-device',
-    '//protocols/tl1/api:onos-protocols-tl1-api',
-    '//protocols/tl1/ctl:onos-protocols-tl1-ctl',
-]
-
-onos_app (
-    app_name = 'org.onosproject.tl1',
-    title = 'TL1 Provider',
-    category = 'Provider',
-    url = 'https://wiki.onosproject.org/display/ONOS/TL1',
-    included_bundles = BUNDLES,
-    description = 'Provides means for ONOS to discover and trigger the initial handshake procedure ' +
-        'with TL1 enable devices from information given by network configuration.',
-)
diff --git a/providers/tl1/app/app.xml b/providers/tl1/app/app.xml
deleted file mode 100644
index b0ff85a..0000000
--- a/providers/tl1/app/app.xml
+++ /dev/null
@@ -1,27 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-  ~ Copyright 2016-present Open Networking Foundation
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~     http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License.
-  -->
-<app name="org.onosproject.tl1" origin="ON.Lab" version="${project.version}"
-     category="Provider" title="TL1 Provider"
-     featuresRepo="mvn:${project.groupId}/${project.artifactId}/${project.version}/xml/features"
-     features="${project.artifactId}">
-    <description>${project.description}</description>
-    <artifact>mvn:${project.groupId}/onos-tl1-api/${project.version}</artifact>
-    <artifact>mvn:${project.groupId}/onos-tl1-ctl/${project.version}</artifact>
-
-    <artifact>mvn:${project.groupId}/onos-tl1-provider-device/${project.version}</artifact>
-
-</app>
diff --git a/providers/tl1/app/features.xml b/providers/tl1/app/features.xml
deleted file mode 100644
index 6228823..0000000
--- a/providers/tl1/app/features.xml
+++ /dev/null
@@ -1,27 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
-<!--
-  ~ Copyright 2016-present Open Networking Foundation
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~     http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License.
-  -->
-<features xmlns="http://karaf.apache.org/xmlns/features/v1.2.0" name="${project.artifactId}-${project.version}">
-    <feature name="${project.artifactId}" version="${project.version}"
-             description="${project.description}">
-        <feature>onos-api</feature>
-        <bundle>mvn:${project.groupId}/onos-tl1-api/${project.version}</bundle>
-        <bundle>mvn:${project.groupId}/onos-tl1-ctl/${project.version}</bundle>
-
-        <bundle>mvn:${project.groupId}/onos-tl1-provider-device/${project.version}</bundle>
-    </feature>
-</features>
-
diff --git a/providers/tl1/device/BUCK b/providers/tl1/device/BUCK
deleted file mode 100644
index 988bfb0..0000000
--- a/providers/tl1/device/BUCK
+++ /dev/null
@@ -1,15 +0,0 @@
-COMPILE_DEPS = [
-    '//lib:CORE_DEPS',
-    '//lib:JACKSON',
-    '//incubator/api:onos-incubator-api',
-    '//protocols/tl1/api:onos-protocols-tl1-api',
-]
-
-TEST_DEPS = [
-    '//lib:TEST_ADAPTERS',
-]
-
-osgi_jar_with_tests (
-    deps = COMPILE_DEPS,
-    test_deps = TEST_DEPS,
-)
diff --git a/providers/tl1/device/src/main/java/org/onosproject/provider/tl1/device/impl/Tl1DeviceProvider.java b/providers/tl1/device/src/main/java/org/onosproject/provider/tl1/device/impl/Tl1DeviceProvider.java
index b9a6237..23f7ad2 100644
--- a/providers/tl1/device/src/main/java/org/onosproject/provider/tl1/device/impl/Tl1DeviceProvider.java
+++ b/providers/tl1/device/src/main/java/org/onosproject/provider/tl1/device/impl/Tl1DeviceProvider.java
@@ -15,11 +15,11 @@
  */
 package org.onosproject.provider.tl1.device.impl;
 
-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.ChassisId;
 import org.onosproject.core.ApplicationId;
 import org.onosproject.core.CoreService;
@@ -77,22 +77,22 @@
 
     private final Logger log = getLogger(getClass());
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected NetworkConfigRegistry cfgRegistry;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected CoreService coreService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected DeviceProviderRegistry providerRegistry;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected DeviceAdminService deviceAdminService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected DeviceService deviceService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected Tl1Controller controller;
 
     private ApplicationId appId;
diff --git a/providers/xmpp/device/BUCK b/providers/xmpp/device/BUCK
deleted file mode 100644
index 265d928..0000000
--- a/providers/xmpp/device/BUCK
+++ /dev/null
@@ -1,26 +0,0 @@
-COMPILE_DEPS = [
-    '//lib:CORE_DEPS',
-    '//lib:tinder-xmpp',
-    '//protocols/xmpp/core/api:onos-protocols-xmpp-core-api',
-    '//protocols/xmpp/core/ctl:onos-protocols-xmpp-core-ctl',
-]
-
-TEST_DEPS = [
-    '//lib:TEST_ADAPTERS',
-]
-
-osgi_jar_with_tests (
-    deps = COMPILE_DEPS,
-    test_deps = TEST_DEPS,
-)
-
-onos_app (
-    app_name = 'org.onosproject.xmpp.device',
-    title = 'XMPP Device Provider',
-    category = 'Provider',
-    url = 'https://wiki.onosproject.org/display/ONOS/XMPP+as+SBI',
-    description = 'XMPP protocol southbound provider.',
-    required_apps = [
-        'org.onosproject.protocols.xmpp',
-    ]
-)
\ No newline at end of file
diff --git a/providers/xmpp/device/src/main/java/org/onosproject/provider/xmpp/device/impl/XmppDeviceProvider.java b/providers/xmpp/device/src/main/java/org/onosproject/provider/xmpp/device/impl/XmppDeviceProvider.java
index 069fc05..6d9967e 100644
--- a/providers/xmpp/device/src/main/java/org/onosproject/provider/xmpp/device/impl/XmppDeviceProvider.java
+++ b/providers/xmpp/device/src/main/java/org/onosproject/provider/xmpp/device/impl/XmppDeviceProvider.java
@@ -17,11 +17,11 @@
 package org.onosproject.provider.xmpp.device.impl;
 
 import com.google.common.base.Preconditions;
-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.ChassisId;
 import org.onosproject.core.ApplicationId;
 import org.onosproject.core.CoreService;
@@ -68,16 +68,16 @@
     private static final String SERIAL_NUMBER = "unknown";
     private static final String IS_NULL_MSG = "XMPP device info is null";
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected DeviceProviderRegistry providerRegistry;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected DeviceService deviceService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected CoreService coreService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected XmppController controller;
 
     protected DeviceProviderService providerService;
diff --git a/tools/build/bazel/generate_workspace.bzl b/tools/build/bazel/generate_workspace.bzl
index 53fba24..2252a6e 100644
--- a/tools/build/bazel/generate_workspace.bzl
+++ b/tools/build/bazel/generate_workspace.bzl
@@ -1,4 +1,4 @@
-# ***** This file was auto-generated at Fri, 12 Oct 2018 17:49:17 GMT. Do not edit this file manually. *****
+# ***** This file was auto-generated at Thu, 1 Nov 2018 23:13:54 GMT. Do not edit this file manually. *****
 # ***** Use onos-lib-gen *****
 
 load("//tools/build/bazel:variables.bzl", "ONOS_GROUP_ID", "ONOS_VERSION")
@@ -17,19 +17,26 @@
     "@com_google_guava_guava//jar",
     "@slf4j_api//jar",
     "@osgi_core//jar",
-    "@org_osgi_compendium//jar",
-    "@org_apache_felix_scr_annotations//jar",
-    "@org_apache_felix_scr//jar",
+    "@org_osgi_util_promise//jar",
+    "@org_osgi_service_component//jar",
+    "@org_osgi_service_component_annotations//jar",
+    "@org_osgi_service_metatype_annotations//jar",
     "@org_apache_karaf_features_core//jar",
     "@org_apache_karaf_system_core//jar",
-    "@com_google_code_findbugs_jsr305//jar",
     "@org_apache_servicemix_bundles_dom4j//jar",
+    "@com_google_code_findbugs_jsr305//jar",
 ]
 CORE_DEPS = [] + COMPILE + [
     "//core/api:onos-api",
     "//utils/misc:onlab-misc",
     "//utils/osgi:onlab-osgi",
 ]
+JAXB = [
+    "@jaxb_api//jar",
+    "@jaxb_core//jar",
+    "@jaxb_impl//jar",
+    "@javax_activation//jar",
+]
 TEST = [
     "@junit//jar",
     "@easymock//jar",
@@ -97,7 +104,7 @@
     "@objenesis//jar",
 ]
 CLI = [
-    "@org_apache_karaf_shell_console//jar",
+    "@org_apache_karaf_shell_core//jar",
     "//cli:onos-cli",
 ]
 REST = [
@@ -150,9 +157,9 @@
     if "asm" not in native.existing_rules():
         java_import_external(
             name = "asm",
-            jar_sha256 = "896618ed8ae62702521a78bc7be42b7c491a08e6920a15f89a3ecdec31e9a220",
+            jar_sha256 = "3e5ea0d7da2c5155ef4f470d9092d42de34e3f53db6589c7c07d6721adf4ba3e",
             licenses = ["notice"],
-            jar_urls = ["http://repo1.maven.org/maven2/org/ow2/asm/asm/5.0.4/asm-5.0.4.jar"],        )
+            jar_urls = ["http://repo1.maven.org/maven2/org/ow2/asm/asm/5.2/asm-5.2.jar"],        )
     if "atomix" not in native.existing_rules():
         java_import_external(
             name = "atomix",
@@ -237,18 +244,18 @@
             jar_sha256 = "f877d304660ac2a142f3865badfc971dec7ed73c747c7f8d5d2f5139ca736513",
             licenses = ["notice"],
             jar_urls = ["http://repo1.maven.org/maven2/commons-io/commons-io/2.6/commons-io-2.6.jar"],        )
-    if "commons_jxpath" not in native.existing_rules():
-        java_import_external(
-            name = "commons_jxpath",
-            jar_sha256 = "fcbc0ad917d9d6a73c6df21fac322e00d213ef19cd94815a007c407a8a3ff449",
-            licenses = ["notice"],
-            jar_urls = ["http://repo1.maven.org/maven2/commons-jxpath/commons-jxpath/1.3/commons-jxpath-1.3.jar"],        )
     if "commons_beanutils" not in native.existing_rules():
         java_import_external(
             name = "commons_beanutils",
             jar_sha256 = "c058e39c7c64203d3a448f3adb588cb03d6378ed808485618f26e137f29dae73",
             licenses = ["notice"],
             jar_urls = ["http://repo1.maven.org/maven2/commons-beanutils/commons-beanutils/1.9.3/commons-beanutils-1.9.3.jar"],        )
+    if "commons_jxpath" not in native.existing_rules():
+        java_import_external(
+            name = "commons_jxpath",
+            jar_sha256 = "fcbc0ad917d9d6a73c6df21fac322e00d213ef19cd94815a007c407a8a3ff449",
+            licenses = ["notice"],
+            jar_urls = ["http://repo1.maven.org/maven2/commons-jxpath/commons-jxpath/1.3/commons-jxpath-1.3.jar"],        )
     if "fast_classpath_scanner" not in native.existing_rules():
         java_import_external(
             name = "fast_classpath_scanner",
@@ -495,126 +502,156 @@
             jar_sha256 = "1a4295889416c6972addcd425dfeeee6e6ede110e8b2dc8b49044e9b400ad5db",
             licenses = ["notice"],
             jar_urls = ["http://repo1.maven.org/maven2/javax/ws/rs/javax.ws.rs-api/2.1/javax.ws.rs-api-2.1.jar"],        )
+    if "javax_activation" not in native.existing_rules():
+        java_import_external(
+            name = "javax_activation",
+            jar_sha256 = "ae475120e9fcd99b4b00b38329bd61cdc5eb754eee03fe66c01f50e137724f99",
+            licenses = ["notice"],
+            jar_urls = ["http://repo1.maven.org/maven2/javax/activation/activation/1.1.1/activation-1.1.1.jar"],        )
+    if "jaxb_api" not in native.existing_rules():
+        java_import_external(
+            name = "jaxb_api",
+            jar_sha256 = "88b955a0df57880a26a74708bc34f74dcaf8ebf4e78843a28b50eae945732b06",
+            licenses = ["notice"],
+            jar_urls = ["http://repo1.maven.org/maven2/javax/xml/bind/jaxb-api/2.3.1/jaxb-api-2.3.1.jar"],        )
+    if "jaxb_core" not in native.existing_rules():
+        java_import_external(
+            name = "jaxb_core",
+            jar_sha256 = "d2ecba63615f317a11fb55c6468f6a9480f6411c10951d9881bafd9a9a8d0467",
+            licenses = ["notice"],
+            jar_urls = ["http://repo1.maven.org/maven2/com/sun/xml/bind/jaxb-core/2.3.0.1/jaxb-core-2.3.0.1.jar"],        )
+    if "jaxb_impl" not in native.existing_rules():
+        java_import_external(
+            name = "jaxb_impl",
+            jar_sha256 = "5ec7bb8dd5d36c9199131e06609409e4ea58bdd5d06fb361d8adfa8887b3c068",
+            licenses = ["notice"],
+            jar_urls = ["http://repo1.maven.org/maven2/com/sun/xml/bind/jaxb-impl/2.3.0.1/jaxb-impl-2.3.0.1.jar"],        )
     if "jersey_client" not in native.existing_rules():
         java_import_external(
             name = "jersey_client",
-            jar_sha256 = "3e44b7db8691eb0b2a6751eda888150b9ba1092a5805f11e4727fd4904407a41",
+            jar_sha256 = "aba407bda94df54f590041b4cde5f2fa31db45bd8b4cf7575af48c1f8f81bb04",
             licenses = ["notice"],
-            jar_urls = ["http://repo1.maven.org/maven2/org/glassfish/jersey/core/jersey-client/2.26/jersey-client-2.26.jar"],        )
+            jar_urls = ["http://repo1.maven.org/maven2/org/glassfish/jersey/core/jersey-client/2.27/jersey-client-2.27.jar"],        )
     if "jersey_security" not in native.existing_rules():
         java_import_external(
             name = "jersey_security",
-            jar_sha256 = "aa6ff06b29b6c1811ae3c7eb957ec3858976aad579990d8c2d10ee4a74c73ffa",
+            jar_sha256 = "25052afa8c18f2e98e9160bc4f434179eff592c7c9cfb98bfc582d40280daa0b",
             licenses = ["notice"],
-            jar_urls = ["http://repo1.maven.org/maven2/org/glassfish/jersey/security/oauth2-client/2.26/oauth2-client-2.26.jar"],        )
+            jar_urls = ["http://repo1.maven.org/maven2/org/glassfish/jersey/security/oauth2-client/2.27/oauth2-client-2.27.jar"],        )
     if "jersey_common" not in native.existing_rules():
         java_import_external(
             name = "jersey_common",
-            jar_sha256 = "bc0e95153bef81c44439d25a662168226b9adee94db27c1198f9777e382b1b17",
+            jar_sha256 = "9a9578c6dac52b96195a614150f696d455db6b6d267a645c3120a4d0ee495789",
             licenses = ["notice"],
-            jar_urls = ["http://repo1.maven.org/maven2/org/glassfish/jersey/core/jersey-common/2.26/jersey-common-2.26.jar"],        )
+            jar_urls = ["http://repo1.maven.org/maven2/org/glassfish/jersey/core/jersey-common/2.27/jersey-common-2.27.jar"],        )
     if "jersey_container_jetty_http" not in native.existing_rules():
         java_import_external(
             name = "jersey_container_jetty_http",
-            jar_sha256 = "ee17b37a60e9125cdddaed29256ddac4089cecc2ffb8e5e625a923cddf55bb8e",
+            jar_sha256 = "932390b9381d2bc9b9c1d386c30d7f2245ff0539e5c18b987727eea174256a09",
             licenses = ["notice"],
-            jar_urls = ["http://repo1.maven.org/maven2/org/glassfish/jersey/containers/jersey-container-jetty-http/2.26/jersey-container-jetty-http-2.26.jar"],        )
+            jar_urls = ["http://repo1.maven.org/maven2/org/glassfish/jersey/containers/jersey-container-jetty-http/2.27/jersey-container-jetty-http-2.27.jar"],        )
     if "jersey_container_servlet" not in native.existing_rules():
         java_import_external(
             name = "jersey_container_servlet",
-            jar_sha256 = "915731c814d3c13e8599e6c0d834f6a2521940764eb02023e902ecf34444c7c4",
+            jar_sha256 = "40349db8dabf6327a01ad59eaff172bd9a5f8927b2411bcdc59ceb05ce7731c1",
             licenses = ["notice"],
-            jar_urls = ["http://repo1.maven.org/maven2/org/glassfish/jersey/containers/jersey-container-servlet/2.26/jersey-container-servlet-2.26.jar"],        )
+            jar_urls = ["http://repo1.maven.org/maven2/org/glassfish/jersey/containers/jersey-container-servlet/2.27/jersey-container-servlet-2.27.jar"],        )
     if "jersey_container_servlet_core" not in native.existing_rules():
         java_import_external(
             name = "jersey_container_servlet_core",
-            jar_sha256 = "1daee2b8aaa7379a0d65856e87c74135062c54e3d4afc58760f88396612385fa",
+            jar_sha256 = "39e9fee46f5c6b5d4e49dc03f54741671bd4261090c5f7b5c72541a232873946",
             licenses = ["notice"],
-            jar_urls = ["http://repo1.maven.org/maven2/org/glassfish/jersey/containers/jersey-container-servlet-core/2.26/jersey-container-servlet-core-2.26.jar"],        )
+            jar_urls = ["http://repo1.maven.org/maven2/org/glassfish/jersey/containers/jersey-container-servlet-core/2.27/jersey-container-servlet-core-2.27.jar"],        )
     if "jersey_media_multipart" not in native.existing_rules():
         java_import_external(
             name = "jersey_media_multipart",
-            jar_sha256 = "ef18cfa1426773af3e4425fc4283dcec3a2c2ea942754028b48df6e61057c907",
+            jar_sha256 = "08b303988e99546364283c63da5aa2d79c7c823f7b0d1ca5deabe66fbbb6374e",
             licenses = ["notice"],
-            jar_urls = ["http://repo1.maven.org/maven2/org/glassfish/jersey/media/jersey-media-multipart/2.26/jersey-media-multipart-2.26.jar"],        )
+            jar_urls = ["http://repo1.maven.org/maven2/org/glassfish/jersey/media/jersey-media-multipart/2.27/jersey-media-multipart-2.27.jar"],        )
     if "jersey_media_sse" not in native.existing_rules():
         java_import_external(
             name = "jersey_media_sse",
-            jar_sha256 = "aee0d8f03ec8b873da1bee960743e7749342c50f022f9744d657fa0600453f05",
+            jar_sha256 = "660f0a524761b85a8689cd80c45eff9d1dd8302a1c623710b1e05f95d6748686",
             licenses = ["notice"],
-            jar_urls = ["http://repo1.maven.org/maven2/org/glassfish/jersey/media/jersey-media-sse/2.26/jersey-media-sse-2.26.jar"],        )
+            jar_urls = ["http://repo1.maven.org/maven2/org/glassfish/jersey/media/jersey-media-sse/2.27/jersey-media-sse-2.27.jar"],        )
     if "jersey_server" not in native.existing_rules():
         java_import_external(
             name = "jersey_server",
-            jar_sha256 = "d9f7a1e0d39267eb02c87046d205f2a90e38f2d2a3be885a619263f732a47935",
+            jar_sha256 = "45a2e1e87566cb9808953d1f5ce0b4d99ede51be4a0f22ed92a7ceda7ba9417e",
             licenses = ["notice"],
-            jar_urls = ["http://repo1.maven.org/maven2/org/glassfish/jersey/core/jersey-server/2.26/jersey-server-2.26.jar"],        )
+            jar_urls = ["http://repo1.maven.org/maven2/org/glassfish/jersey/core/jersey-server/2.27/jersey-server-2.27.jar"],        )
     if "jersey_hk2" not in native.existing_rules():
         java_import_external(
             name = "jersey_hk2",
-            jar_sha256 = "4e9ab17a051eaacae0829a45cbdb5c603876006fdc86b5d9c5005be10266dcf7",
+            jar_sha256 = "634a2790f08c2f33feb78586b22a23005a2f8aa483c316ae2435729be0943968",
             licenses = ["notice"],
-            jar_urls = ["http://repo1.maven.org/maven2/org/glassfish/jersey/inject/jersey-hk2/2.26/jersey-hk2-2.26.jar"],        )
+            jar_urls = ["http://repo1.maven.org/maven2/org/glassfish/jersey/inject/jersey-hk2/2.27/jersey-hk2-2.27.jar"],        )
     if "jersey_test_framework_core" not in native.existing_rules():
         java_import_external(
             name = "jersey_test_framework_core",
-            jar_sha256 = "1f1bc56f18fc4ef5bf5ee6575376995af5ddf980fb8d3c27b31789ef748a3500",
+            jar_sha256 = "f2d6a9b9163643864b488f390325ef29c733996ca90089b0dbfa010032421139",
             licenses = ["notice"],
-            jar_urls = ["http://repo1.maven.org/maven2/org/glassfish/jersey/test-framework/jersey-test-framework-core/2.26/jersey-test-framework-core-2.26.jar"],        )
+            jar_urls = ["http://repo1.maven.org/maven2/org/glassfish/jersey/test-framework/jersey-test-framework-core/2.27/jersey-test-framework-core-2.27.jar"],        )
     if "jersey_test_framework_jetty" not in native.existing_rules():
         java_import_external(
             name = "jersey_test_framework_jetty",
-            jar_sha256 = "3e38fcd82a58f74e88c68dda7ff604c34a077c35debc5b67a74541d9a5047811",
+            jar_sha256 = "4308de3001f867d589a4e95085c128d9d33b3022c6f8d5c68ff7ef2e1fb54451",
             licenses = ["notice"],
-            jar_urls = ["http://repo1.maven.org/maven2/org/glassfish/jersey/test-framework/providers/jersey-test-framework-provider-jetty/2.26/jersey-test-framework-provider-jetty-2.26.jar"],        )
+            jar_urls = ["http://repo1.maven.org/maven2/org/glassfish/jersey/test-framework/providers/jersey-test-framework-provider-jetty/2.27/jersey-test-framework-provider-jetty-2.27.jar"],        )
     if "jetty_util" not in native.existing_rules():
         java_import_external(
             name = "jetty_util",
-            jar_sha256 = "142328025e98dbe91e89b1f0cbd747277d4121dfb0519d946b1a1d0f7fc564a9",
+            jar_sha256 = "936e5ed74275c16164cc1eccaeae55900eb00edd9f1b1d3b83d70782dd25f505",
             licenses = ["notice"],
-            jar_urls = ["http://repo1.maven.org/maven2/org/eclipse/jetty/jetty-util/9.2.21.v20170120/jetty-util-9.2.21.v20170120.jar"],        )
+            jar_urls = ["http://repo1.maven.org/maven2/org/eclipse/jetty/jetty-util/9.4.11.v20180605/jetty-util-9.4.11.v20180605.jar"],        )
+    if "jetty_websocket_api" not in native.existing_rules():
+        java_import_external(
+            name = "jetty_websocket_api",
+            jar_sha256 = "924edcf7fb17f2ff2e541afce7fd692305235e51b5a16f7223d7e8b4de77559d",
+            licenses = ["notice"],
+            jar_urls = ["http://repo1.maven.org/maven2/org/eclipse/jetty/websocket/websocket-api/9.4.11.v20180605/websocket-api-9.4.11.v20180605.jar"],        )
     if "jetty_websocket" not in native.existing_rules():
         java_import_external(
             name = "jetty_websocket",
-            jar_sha256 = "c8c07c9200cc8e3353efa6d9505e8ae4405107c84c282fd595ad83738570a5b8",
+            jar_sha256 = "76f52b482ad174944e07f552cbfaaa2ccf498063e0a3837bb930eee8a06373aa",
             licenses = ["notice"],
-            jar_urls = ["http://repo1.maven.org/maven2/org/eclipse/jetty/jetty-websocket/8.1.19.v20160209/jetty-websocket-8.1.19.v20160209.jar"],        )
+            jar_urls = ["http://repo1.maven.org/maven2/org/eclipse/jetty/websocket/websocket-servlet/9.4.11.v20180605/websocket-servlet-9.4.11.v20180605.jar"],        )
     if "jetty_server" not in native.existing_rules():
         java_import_external(
             name = "jetty_server",
-            jar_sha256 = "b47f7bdf72133e7dfd30fc8ae6f08080f2a808026102bd194b70bba98fd5fa7e",
+            jar_sha256 = "b74af5ac482b05c242ed231e00b7c08a0b6649f76f2e039a0885de0cf1376ef8",
             licenses = ["notice"],
-            jar_urls = ["http://repo1.maven.org/maven2/org/eclipse/jetty/jetty-server/9.2.21.v20170120/jetty-server-9.2.21.v20170120.jar"],        )
+            jar_urls = ["http://repo1.maven.org/maven2/org/eclipse/jetty/jetty-server/9.4.11.v20180605/jetty-server-9.4.11.v20180605.jar"],        )
     if "jetty_servlet" not in native.existing_rules():
         java_import_external(
             name = "jetty_servlet",
-            jar_sha256 = "84843dd91905a6e12242f41efe4b58d7009f5714b602b380d2c8e3b0513f0eb8",
+            jar_sha256 = "e24f145a6d95c7653ad2fe0c34cf8ce7311effb7eb8ed9399fae63d8af63eaf4",
             licenses = ["notice"],
-            jar_urls = ["http://repo1.maven.org/maven2/org/eclipse/jetty/jetty-servlet/9.2.26.v20180806/jetty-servlet-9.2.26.v20180806.jar"],        )
+            jar_urls = ["http://repo1.maven.org/maven2/org/eclipse/jetty/jetty-servlet/9.4.11.v20180605/jetty-servlet-9.4.11.v20180605.jar"],        )
     if "jetty_security" not in native.existing_rules():
         java_import_external(
             name = "jetty_security",
-            jar_sha256 = "397d7bb721e51060cb62f01814b9cabbe6700080f2e39143544cc78fddc23f3f",
+            jar_sha256 = "5a12b1c69264466004baff33b14fc1555007c86fb2fece2a420c480aa7f8ef56",
             licenses = ["notice"],
-            jar_urls = ["http://repo1.maven.org/maven2/org/eclipse/jetty/jetty-security/9.2.21.v20170120/jetty-security-9.2.21.v20170120.jar"],        )
+            jar_urls = ["http://repo1.maven.org/maven2/org/eclipse/jetty/jetty-security/9.4.11.v20180605/jetty-security-9.4.11.v20180605.jar"],        )
     if "jetty_continuation" not in native.existing_rules():
         java_import_external(
             name = "jetty_continuation",
-            jar_sha256 = "fb20fe3c416d1f1e24652ab47d2447e2b7a5660c9eb7df558d2d94fa57f01808",
+            jar_sha256 = "0af8353dbe4ab06fb0020a380be60b2c2a63cd9430f5f199509ecd51dc3dd7cd",
             licenses = ["notice"],
-            jar_urls = ["http://repo1.maven.org/maven2/org/eclipse/jetty/jetty-continuation/9.2.21.v20170120/jetty-continuation-9.2.21.v20170120.jar"],        )
+            jar_urls = ["http://repo1.maven.org/maven2/org/eclipse/jetty/jetty-continuation/9.4.11.v20180605/jetty-continuation-9.4.11.v20180605.jar"],        )
     if "jetty_http" not in native.existing_rules():
         java_import_external(
             name = "jetty_http",
-            jar_sha256 = "aa6d9a264789f7f81da2267bc6472ec5ba3e42295fcab2d3e4df31ecd0afb608",
+            jar_sha256 = "963b75730aa92b0dfbe65fe8a2e413edc88aeb53e8686ba6b1617d7caeb14067",
             licenses = ["notice"],
-            jar_urls = ["http://repo1.maven.org/maven2/org/eclipse/jetty/jetty-http/9.2.21.v20170120/jetty-http-9.2.21.v20170120.jar"],        )
+            jar_urls = ["http://repo1.maven.org/maven2/org/eclipse/jetty/jetty-http/9.4.11.v20180605/jetty-http-9.4.11.v20180605.jar"],        )
     if "jetty_io" not in native.existing_rules():
         java_import_external(
             name = "jetty_io",
-            jar_sha256 = "8876d060969e0ea6d761cca5fdab9be703c85b2c9310ea638e5188ab540ebaea",
+            jar_sha256 = "75c82d6e542a3518e2517c4084c83d8216ec2d2458f8747b8b5c944355ebd732",
             licenses = ["notice"],
-            jar_urls = ["http://repo1.maven.org/maven2/org/eclipse/jetty/jetty-io/9.2.21.v20170120/jetty-io-9.2.21.v20170120.jar"],        )
+            jar_urls = ["http://repo1.maven.org/maven2/org/eclipse/jetty/jetty-io/9.4.11.v20180605/jetty-io-9.4.11.v20180605.jar"],        )
     if "javax_servlet_api" not in native.existing_rules():
         java_import_external(
             name = "javax_servlet_api",
@@ -795,36 +832,66 @@
             jar_sha256 = "b5bd490435fd6910ac9d2e0f1b2d71c68d9ff7261bfd0e70c4a0f8ea970c2785",
             licenses = ["notice"],
             jar_urls = ["http://repo1.maven.org/maven2/org/onosproject/openflowj/3.2.1.onos/openflowj-3.2.1.onos.jar"],        )
-    if "org_apache_felix_framework_security" not in native.existing_rules():
+    if "org_osgi_util_function" not in native.existing_rules():
         java_import_external(
-            name = "org_apache_felix_framework_security",
-            jar_sha256 = "53e1333f563b8b00dfb953802ebbc1b91e4bfe2278b79ebdc0e561d46ccb50db",
+            name = "org_osgi_util_function",
+            jar_sha256 = "83d52d198f8bdd4cd9a02ecb7f05e01e0d59d1c960256db6dccd16962f79d7c5",
             licenses = ["notice"],
-            jar_urls = ["http://repo1.maven.org/maven2/org/onosproject/org.apache.felix.framework.security/2.2.0.onos/org.apache.felix.framework.security-2.2.0.onos.jar"],        )
-    if "org_apache_felix_scr" not in native.existing_rules():
+            jar_urls = ["http://repo1.maven.org/maven2/org/osgi/org.osgi.util.function/1.1.0/org.osgi.util.function-1.1.0.jar"],        )
+    if "org_osgi_util_promise" not in native.existing_rules():
         java_import_external(
-            name = "org_apache_felix_scr",
-            jar_sha256 = "19d395d8800d5546397211edc209e2e42d0ee500c93aca9d04ce69e4288f41d9",
+            name = "org_osgi_util_promise",
+            jar_sha256 = "a679e25688e84e1739831e8716a2cc7acbf8348e22f1136d1988e34472e43756",
             licenses = ["notice"],
-            jar_urls = ["http://repo1.maven.org/maven2/org/apache/felix/org.apache.felix.scr/1.8.2/org.apache.felix.scr-1.8.2.jar"],        )
-    if "org_apache_felix_scr_annotations" not in native.existing_rules():
+            jar_urls = ["http://repo1.maven.org/maven2/org/osgi/org.osgi.util.promise/1.1.0/org.osgi.util.promise-1.1.0.jar"],        )
+    if "org_osgi_service_component" not in native.existing_rules():
         java_import_external(
-            name = "org_apache_felix_scr_annotations",
-            jar_sha256 = "c1d6895b5f45351dfbc4290698aeab00ad013339067abfbe73c047b795e72c47",
+            name = "org_osgi_service_component",
+            jar_sha256 = "607b85148c03e9385b91dd355200aeda3cbfaa6374edba737a9460aac5d576e1",
             licenses = ["notice"],
-            jar_urls = ["http://repo1.maven.org/maven2/org/apache/felix/org.apache.felix.scr.annotations/1.9.12/org.apache.felix.scr.annotations-1.9.12.jar"],        )
+            jar_urls = ["http://repo1.maven.org/maven2/org/osgi/org.osgi.service.component/1.4.0/org.osgi.service.component-1.4.0.jar"],        )
+    if "org_osgi_service_component_annotations" not in native.existing_rules():
+        java_import_external(
+            name = "org_osgi_service_component_annotations",
+            jar_sha256 = "8de7c6753f00edc81df24059dcd2efd67fedcd9b020bbcc6aaa170f4a34c010c",
+            licenses = ["notice"],
+            jar_urls = ["http://repo1.maven.org/maven2/org/osgi/org.osgi.service.component.annotations/1.4.0/org.osgi.service.component.annotations-1.4.0.jar"],        )
+    if "org_osgi_service_metatype_annotations" not in native.existing_rules():
+        java_import_external(
+            name = "org_osgi_service_metatype_annotations",
+            jar_sha256 = "c768e569389a25ce0ef2ce32ce9de05624ec093f2f275ce430da573aba554bcb",
+            licenses = ["notice"],
+            jar_urls = ["http://repo1.maven.org/maven2/org/osgi/org.osgi.service.metatype.annotations/1.4.0/org.osgi.service.metatype.annotations-1.4.0.jar"],        )
+    if "org_osgi_service_cm" not in native.existing_rules():
+        java_import_external(
+            name = "org_osgi_service_cm",
+            jar_sha256 = "c1768352603abdeb18ca160ac8c712768f88d2e418fe4c5cf50845e783154233",
+            licenses = ["notice"],
+            jar_urls = ["http://repo1.maven.org/maven2/org/osgi/org.osgi.service.cm/1.6.0/org.osgi.service.cm-1.6.0.jar"],        )
+    if "org_apache_felix_scr_bnd" not in native.existing_rules():
+        java_import_external(
+            name = "org_apache_felix_scr_bnd",
+            jar_sha256 = "fee253dd67f87481c1d29f5ba6e6158604f722eac8b35bce868e3693ee00ccac",
+            licenses = ["notice"],
+            jar_urls = ["http://repo1.maven.org/maven2/org/apache/felix/org.apache.felix.scr.bnd/1.9.0/org.apache.felix.scr.bnd-1.9.0.jar"],        )
     if "org_apache_karaf_features_core" not in native.existing_rules():
         java_import_external(
             name = "org_apache_karaf_features_core",
-            jar_sha256 = "d958d6bdf747576d5a8a878196aabf75dff00d47ccd8eaaa083685ba4394e86d",
+            jar_sha256 = "c659659cd095c6c7026d4f99ebbc5fa946f0177f750e33fca0410cf83d657137",
             licenses = ["notice"],
-            jar_urls = ["http://repo1.maven.org/maven2/org/apache/karaf/features/org.apache.karaf.features.core/3.0.8/org.apache.karaf.features.core-3.0.8.jar"],        )
+            jar_urls = ["http://repo1.maven.org/maven2/org/apache/karaf/features/org.apache.karaf.features.core/4.2.1/org.apache.karaf.features.core-4.2.1.jar"],        )
     if "org_apache_karaf_shell_console" not in native.existing_rules():
         java_import_external(
             name = "org_apache_karaf_shell_console",
-            jar_sha256 = "fbaf38c8dcc5a86116c01c863f0360cab025fbc6b40a08e6823c969c959da716",
+            jar_sha256 = "c87ef5c61745456ded1b2c7652071c83f45de6f3af95b7e290eebafb10870aa3",
             licenses = ["notice"],
-            jar_urls = ["http://repo1.maven.org/maven2/org/apache/karaf/shell/org.apache.karaf.shell.console/3.0.8/org.apache.karaf.shell.console-3.0.8.jar"],        )
+            jar_urls = ["http://repo1.maven.org/maven2/org/apache/karaf/shell/org.apache.karaf.shell.console/4.2.1/org.apache.karaf.shell.console-4.2.1.jar"],        )
+    if "org_apache_karaf_shell_core" not in native.existing_rules():
+        java_import_external(
+            name = "org_apache_karaf_shell_core",
+            jar_sha256 = "7da0d63b450c24c221280be764eae9d117f296c1b5a7e10d424ba14c32f733c8",
+            licenses = ["notice"],
+            jar_urls = ["http://repo1.maven.org/maven2/org/apache/karaf/shell/org.apache.karaf.shell.core/4.2.1/org.apache.karaf.shell.core-4.2.1.jar"],        )
     if "org_apache_httpcomponents_httpasyncclient_osgi" not in native.existing_rules():
         java_import_external(
             name = "org_apache_httpcomponents_httpasyncclient_osgi",
@@ -840,15 +907,15 @@
     if "org_apache_karaf_jaas" not in native.existing_rules():
         java_import_external(
             name = "org_apache_karaf_jaas",
-            jar_sha256 = "c9a0ceba8661947b4f16b3b5d2e9582d75678b315aabd91956d5fdfc3d83b021",
+            jar_sha256 = "86da483352205879822cc014884cf29a54dccc7f9eb19d9c4513b43e1ed7cf25",
             licenses = ["notice"],
-            jar_urls = ["http://repo1.maven.org/maven2/org/apache/karaf/jaas/org.apache.karaf.jaas.modules/3.0.8/org.apache.karaf.jaas.modules-3.0.8.jar"],        )
+            jar_urls = ["http://repo1.maven.org/maven2/org/apache/karaf/jaas/org.apache.karaf.jaas.modules/4.2.1/org.apache.karaf.jaas.modules-4.2.1.jar"],        )
     if "org_apache_karaf_system_core" not in native.existing_rules():
         java_import_external(
             name = "org_apache_karaf_system_core",
-            jar_sha256 = "3e1397c8b09a90ddb591e0815371ffd962d244747c3ddd2dc475f312610cc21b",
+            jar_sha256 = "13a1eafe91f5fd731f0f691b2a9557b7246d5f39d5cfe1ad0913199295efcefe",
             licenses = ["notice"],
-            jar_urls = ["http://repo1.maven.org/maven2/org/apache/karaf/system/org.apache.karaf.system.core/3.0.8/org.apache.karaf.system.core-3.0.8.jar"],        )
+            jar_urls = ["http://repo1.maven.org/maven2/org/apache/karaf/system/org.apache.karaf.system.core/4.2.1/org.apache.karaf.system.core-4.2.1.jar"],        )
     if "org_apache_servicemix_bundles_snmp4j" not in native.existing_rules():
         java_import_external(
             name = "org_apache_servicemix_bundles_snmp4j",
@@ -861,6 +928,12 @@
             jar_sha256 = "f1ef32cc1530f4e66aac606c24363b627ace4780a7737b045bfb3b908d801bcd",
             licenses = ["notice"],
             jar_urls = ["http://repo1.maven.org/maven2/org/osgi/org.osgi.compendium/5.0.0/org.osgi.compendium-5.0.0.jar"],        )
+    if "org_osgi_cmpn" not in native.existing_rules():
+        java_import_external(
+            name = "org_osgi_cmpn",
+            jar_sha256 = "8e6445afe1abb3dcd43c60c8cd6c0f15b052a8f4228812559ba521c5ce91db34",
+            licenses = ["notice"],
+            jar_urls = ["http://repo1.maven.org/maven2/org/osgi/osgi.cmpn/7.0.0/osgi.cmpn-7.0.0.jar"],        )
     if "osgi_core" not in native.existing_rules():
         java_import_external(
             name = "osgi_core",
@@ -870,9 +943,9 @@
     if "reflectasm" not in native.existing_rules():
         java_import_external(
             name = "reflectasm",
-            jar_sha256 = "eef46e43a6861cdbb3356295644341a48d9a4c1cf753eb5f03cf7bff3a07d180",
+            jar_sha256 = "7cd978191b9ff6159810a8ab4646a3e696388c5c41ce25ffcc554d4ec77f3a93",
             licenses = ["notice"],
-            jar_urls = ["http://repo1.maven.org/maven2/com/esotericsoftware/reflectasm/1.11.0/reflectasm-1.11.0.jar"],        )
+            jar_urls = ["http://repo1.maven.org/maven2/com/esotericsoftware/reflectasm/1.11.7/reflectasm-1.11.7.jar"],        )
     if "remotetea_oncrpc" not in native.existing_rules():
         java_import_external(
             name = "remotetea_oncrpc",
@@ -942,15 +1015,9 @@
     if "apache_karaf" not in native.existing_rules():
         java_import_external(
             name = "apache_karaf",
-            jar_sha256 = "2f20bb25ded39f1e9e4148bb840473c89249bbb592106f5451b5a829a5ec8603",
+            jar_sha256 = "a9fc3883d4922d8a03c177e1696407a83b2e8af6b698c70a23d628b6ed1fffbf",
             licenses = ["notice"],
-            jar_urls = ["http://repo1.maven.org/maven2/org/onosproject/apache-karaf-offline/3.0.8/apache-karaf-offline-3.0.8.tar.gz"],        )
-    if "apache_karaf_patches" not in native.existing_rules():
-        java_import_external(
-            name = "apache_karaf_patches",
-            jar_sha256 = "1f9e3e8a53a462f776a931fe851819a43dfe7728b31fbde339b98d04908e702b",
-            licenses = ["notice"],
-            jar_urls = ["http://repo1.maven.org/maven2/org/onosproject/onos-apache-karaf-patches/3.0.8/onos-apache-karaf-patches-3.0.8.tar.gz"],        )
+            jar_urls = ["http://repo1.maven.org/maven2/org/onosproject/apache-karaf-offline/4.2.1-offline-20181102/apache-karaf-offline-4.2.1-offline-20181102.tar.gz"],        )
     if "bndlib" not in native.existing_rules():
         java_import_external(
             name = "bndlib",
@@ -975,12 +1042,6 @@
             jar_sha256 = "5753628390f7ac1665f813bf610b708cc489f3347b9813389e6c052346527cca",
             licenses = ["notice"],
             jar_urls = ["http://repo1.maven.org/maven2/com/thoughtworks/qdox/qdox/2.0-M3/qdox-2.0-M3.jar"],        )
-    if "org_apache_felix_scr_bnd" not in native.existing_rules():
-        java_import_external(
-            name = "org_apache_felix_scr_bnd",
-            jar_sha256 = "acd4ffafbeb517774b7445c6d38a46af982bb81ae631156ce5817979950a24a6",
-            licenses = ["notice"],
-            jar_urls = ["https://oss.sonatype.org/content/repositories/snapshots/org/onosproject/org.apache.felix.scr.bnd/1.4.1-SNAPSHOT/org.apache.felix.scr.bnd-1.4.1-20160328.235003-2.jar"],        )
     if "snmp_core" not in native.existing_rules():
         java_import_external(
             name = "snmp_core",
@@ -1362,7 +1423,7 @@
 artifact_map = {}
 artifact_map["@aopalliance_repackaged//:aopalliance_repackaged"] = "mvn:org.glassfish.hk2.external:aopalliance-repackaged:jar:2.5.0-b42"
 artifact_map["@amqp_client//:amqp_client"] = "mvn:com.rabbitmq:amqp-client:jar:3.6.1"
-artifact_map["@asm//:asm"] = "mvn:org.ow2.asm:asm:jar:5.0.4"
+artifact_map["@asm//:asm"] = "mvn:org.ow2.asm:asm:jar:5.2"
 artifact_map["@atomix//:atomix"] = "mvn:io.atomix:atomix:jar:3.0.7"
 artifact_map["@atomix_cluster//:atomix_cluster"] = "mvn:io.atomix:atomix-cluster:jar:3.0.7"
 artifact_map["@atomix_gossip//:atomix_gossip"] = "mvn:io.atomix:atomix-gossip:jar:3.0.7"
@@ -1377,8 +1438,8 @@
 artifact_map["@commons_collections//:commons_collections"] = "mvn:commons-collections:commons-collections:jar:3.2.2"
 artifact_map["@commons_configuration//:commons_configuration"] = "mvn:commons-configuration:commons-configuration:jar:1.10"
 artifact_map["@commons_io//:commons_io"] = "mvn:commons-io:commons-io:jar:2.6"
-artifact_map["@commons_jxpath//:commons_jxpath"] = "mvn:commons-jxpath:commons-jxpath:jar:1.3"
 artifact_map["@commons_beanutils//:commons_beanutils"] = "mvn:commons-beanutils:commons-beanutils:jar:1.9.3"
+artifact_map["@commons_jxpath//:commons_jxpath"] = "mvn:commons-jxpath:commons-jxpath:jar:1.3"
 artifact_map["@fast_classpath_scanner//:fast_classpath_scanner"] = "mvn:io.github.lukehutch:fast-classpath-scanner:jar:2.21"
 artifact_map["@jdom//:jdom"] = "mvn:jdom:jdom:jar:NON-OSGI:1.0"
 artifact_map["@commons_lang//:commons_lang"] = "mvn:commons-lang:commons-lang:jar:2.6"
@@ -1420,26 +1481,31 @@
 artifact_map["@javax_annotation_api_mvn//:javax_annotation_api_mvn"] = "mvn:javax.annotation:javax.annotation-api:jar:1.2"
 artifact_map["@javax_inject//:javax_inject"] = "mvn:org.glassfish.hk2.external:javax.inject:jar:2.5.0-b42"
 artifact_map["@javax_ws_rs_api//:javax_ws_rs_api"] = "mvn:javax.ws.rs:javax.ws.rs-api:jar:2.1"
-artifact_map["@jersey_client//:jersey_client"] = "mvn:org.glassfish.jersey.core:jersey-client:jar:2.26"
-artifact_map["@jersey_security//:jersey_security"] = "mvn:org.glassfish.jersey.security:oauth2-client:jar:NON-OSGI:2.26"
-artifact_map["@jersey_common//:jersey_common"] = "mvn:org.glassfish.jersey.core:jersey-common:jar:2.26"
-artifact_map["@jersey_container_jetty_http//:jersey_container_jetty_http"] = "mvn:org.glassfish.jersey.containers:jersey-container-jetty-http:jar:2.26"
-artifact_map["@jersey_container_servlet//:jersey_container_servlet"] = "mvn:org.glassfish.jersey.containers:jersey-container-servlet:jar:2.26"
-artifact_map["@jersey_container_servlet_core//:jersey_container_servlet_core"] = "mvn:org.glassfish.jersey.containers:jersey-container-servlet-core:jar:2.26"
-artifact_map["@jersey_media_multipart//:jersey_media_multipart"] = "mvn:org.glassfish.jersey.media:jersey-media-multipart:jar:2.26"
-artifact_map["@jersey_media_sse//:jersey_media_sse"] = "mvn:org.glassfish.jersey.media:jersey-media-sse:jar:2.26"
-artifact_map["@jersey_server//:jersey_server"] = "mvn:org.glassfish.jersey.core:jersey-server:jar:2.26"
-artifact_map["@jersey_hk2//:jersey_hk2"] = "mvn:org.glassfish.jersey.inject:jersey-hk2:jar:2.26"
-artifact_map["@jersey_test_framework_core//:jersey_test_framework_core"] = "mvn:org.glassfish.jersey.test-framework:jersey-test-framework-core:jar:NON-OSGI:2.26"
-artifact_map["@jersey_test_framework_jetty//:jersey_test_framework_jetty"] = "mvn:org.glassfish.jersey.test-framework.providers:jersey-test-framework-provider-jetty:jar:NON-OSGI:2.26"
-artifact_map["@jetty_util//:jetty_util"] = "mvn:org.eclipse.jetty:jetty-util:jar:9.2.21.v20170120"
-artifact_map["@jetty_websocket//:jetty_websocket"] = "mvn:org.eclipse.jetty:jetty-websocket:jar:8.1.19.v20160209"
-artifact_map["@jetty_server//:jetty_server"] = "mvn:org.eclipse.jetty:jetty-server:jar:9.2.21.v20170120"
-artifact_map["@jetty_servlet//:jetty_servlet"] = "mvn:org.eclipse.jetty:jetty-servlet:jar:9.2.26.v20180806"
-artifact_map["@jetty_security//:jetty_security"] = "mvn:org.eclipse.jetty:jetty-security:jar:9.2.21.v20170120"
-artifact_map["@jetty_continuation//:jetty_continuation"] = "mvn:org.eclipse.jetty:jetty-continuation:jar:9.2.21.v20170120"
-artifact_map["@jetty_http//:jetty_http"] = "mvn:org.eclipse.jetty:jetty-http:jar:9.2.21.v20170120"
-artifact_map["@jetty_io//:jetty_io"] = "mvn:org.eclipse.jetty:jetty-io:jar:9.2.21.v20170120"
+artifact_map["@javax_activation//:javax_activation"] = "mvn:javax.activation:activation:jar:NON-OSGI:1.1.1"
+artifact_map["@jaxb_api//:jaxb_api"] = "mvn:javax.xml.bind:jaxb-api:jar:2.3.1"
+artifact_map["@jaxb_core//:jaxb_core"] = "mvn:com.sun.xml.bind:jaxb-core:jar:2.3.0.1"
+artifact_map["@jaxb_impl//:jaxb_impl"] = "mvn:com.sun.xml.bind:jaxb-impl:jar:2.3.0.1"
+artifact_map["@jersey_client//:jersey_client"] = "mvn:org.glassfish.jersey.core:jersey-client:jar:2.27"
+artifact_map["@jersey_security//:jersey_security"] = "mvn:org.glassfish.jersey.security:oauth2-client:jar:NON-OSGI:2.27"
+artifact_map["@jersey_common//:jersey_common"] = "mvn:org.glassfish.jersey.core:jersey-common:jar:2.27"
+artifact_map["@jersey_container_jetty_http//:jersey_container_jetty_http"] = "mvn:org.glassfish.jersey.containers:jersey-container-jetty-http:jar:2.27"
+artifact_map["@jersey_container_servlet//:jersey_container_servlet"] = "mvn:org.glassfish.jersey.containers:jersey-container-servlet:jar:2.27"
+artifact_map["@jersey_container_servlet_core//:jersey_container_servlet_core"] = "mvn:org.glassfish.jersey.containers:jersey-container-servlet-core:jar:2.27"
+artifact_map["@jersey_media_multipart//:jersey_media_multipart"] = "mvn:org.glassfish.jersey.media:jersey-media-multipart:jar:2.27"
+artifact_map["@jersey_media_sse//:jersey_media_sse"] = "mvn:org.glassfish.jersey.media:jersey-media-sse:jar:2.27"
+artifact_map["@jersey_server//:jersey_server"] = "mvn:org.glassfish.jersey.core:jersey-server:jar:2.27"
+artifact_map["@jersey_hk2//:jersey_hk2"] = "mvn:org.glassfish.jersey.inject:jersey-hk2:jar:2.27"
+artifact_map["@jersey_test_framework_core//:jersey_test_framework_core"] = "mvn:org.glassfish.jersey.test-framework:jersey-test-framework-core:jar:NON-OSGI:2.27"
+artifact_map["@jersey_test_framework_jetty//:jersey_test_framework_jetty"] = "mvn:org.glassfish.jersey.test-framework.providers:jersey-test-framework-provider-jetty:jar:NON-OSGI:2.27"
+artifact_map["@jetty_util//:jetty_util"] = "mvn:org.eclipse.jetty:jetty-util:jar:9.4.11.v20180605"
+artifact_map["@jetty_websocket_api//:jetty_websocket_api"] = "mvn:org.eclipse.jetty.websocket:websocket-api:jar:9.4.11.v20180605"
+artifact_map["@jetty_websocket//:jetty_websocket"] = "mvn:org.eclipse.jetty.websocket:websocket-servlet:jar:9.4.11.v20180605"
+artifact_map["@jetty_server//:jetty_server"] = "mvn:org.eclipse.jetty:jetty-server:jar:9.4.11.v20180605"
+artifact_map["@jetty_servlet//:jetty_servlet"] = "mvn:org.eclipse.jetty:jetty-servlet:jar:9.4.11.v20180605"
+artifact_map["@jetty_security//:jetty_security"] = "mvn:org.eclipse.jetty:jetty-security:jar:9.4.11.v20180605"
+artifact_map["@jetty_continuation//:jetty_continuation"] = "mvn:org.eclipse.jetty:jetty-continuation:jar:9.4.11.v20180605"
+artifact_map["@jetty_http//:jetty_http"] = "mvn:org.eclipse.jetty:jetty-http:jar:9.4.11.v20180605"
+artifact_map["@jetty_io//:jetty_io"] = "mvn:org.eclipse.jetty:jetty-io:jar:9.4.11.v20180605"
 artifact_map["@javax_servlet_api//:javax_servlet_api"] = "mvn:javax.servlet:javax.servlet-api:jar:3.1.0"
 artifact_map["@joda_time//:joda_time"] = "mvn:joda-time:joda-time:jar:2.9.3"
 artifact_map["@jsch//:jsch"] = "mvn:com.jcraft:jsch:jar:NON-OSGI:0.1.53"
@@ -1470,19 +1536,25 @@
 artifact_map["@io_netty_netty_codec_socks//:io_netty_netty_codec_socks"] = "mvn:io.netty:netty-codec-socks:jar:4.1.27.Final"
 artifact_map["@objenesis//:objenesis"] = "mvn:org.objenesis:objenesis:jar:2.6"
 artifact_map["@openflowj//:openflowj"] = "mvn:org.onosproject:openflowj:jar:3.2.1.onos"
-artifact_map["@org_apache_felix_framework_security//:org_apache_felix_framework_security"] = "mvn:org.onosproject:org.apache.felix.framework.security:jar:2.2.0.onos"
-artifact_map["@org_apache_felix_scr//:org_apache_felix_scr"] = "mvn:org.apache.felix:org.apache.felix.scr:jar:1.8.2"
-artifact_map["@org_apache_felix_scr_annotations//:org_apache_felix_scr_annotations"] = "mvn:org.apache.felix:org.apache.felix.scr.annotations:jar:NON-OSGI:1.9.12"
-artifact_map["@org_apache_karaf_features_core//:org_apache_karaf_features_core"] = "mvn:org.apache.karaf.features:org.apache.karaf.features.core:jar:3.0.8"
-artifact_map["@org_apache_karaf_shell_console//:org_apache_karaf_shell_console"] = "mvn:org.apache.karaf.shell:org.apache.karaf.shell.console:jar:3.0.8"
+artifact_map["@org_osgi_util_function//:org_osgi_util_function"] = "mvn:org.osgi:org.osgi.util.function:jar:1.1.0"
+artifact_map["@org_osgi_util_promise//:org_osgi_util_promise"] = "mvn:org.osgi:org.osgi.util.promise:jar:1.1.0"
+artifact_map["@org_osgi_service_component//:org_osgi_service_component"] = "mvn:org.osgi:org.osgi.service.component:jar:1.4.0"
+artifact_map["@org_osgi_service_component_annotations//:org_osgi_service_component_annotations"] = "mvn:org.osgi:org.osgi.service.component.annotations:jar:1.4.0"
+artifact_map["@org_osgi_service_metatype_annotations//:org_osgi_service_metatype_annotations"] = "mvn:org.osgi:org.osgi.service.metatype.annotations:jar:1.4.0"
+artifact_map["@org_osgi_service_cm//:org_osgi_service_cm"] = "mvn:org.osgi:org.osgi.service.cm:jar:1.6.0"
+artifact_map["@org_apache_felix_scr_bnd//:org_apache_felix_scr_bnd"] = "mvn:org.apache.felix:org.apache.felix.scr.bnd:jar:NON-OSGI:1.9.0"
+artifact_map["@org_apache_karaf_features_core//:org_apache_karaf_features_core"] = "mvn:org.apache.karaf.features:org.apache.karaf.features.core:jar:4.2.1"
+artifact_map["@org_apache_karaf_shell_console//:org_apache_karaf_shell_console"] = "mvn:org.apache.karaf.shell:org.apache.karaf.shell.console:jar:4.2.1"
+artifact_map["@org_apache_karaf_shell_core//:org_apache_karaf_shell_core"] = "mvn:org.apache.karaf.shell:org.apache.karaf.shell.core:jar:4.2.1"
 artifact_map["@org_apache_httpcomponents_httpasyncclient_osgi//:org_apache_httpcomponents_httpasyncclient_osgi"] = "mvn:org.apache.httpcomponents:httpasyncclient-osgi:jar:4.1.2"
 artifact_map["@org_apache_httpcomponents_httpcore_nio//:org_apache_httpcomponents_httpcore_nio"] = "mvn:org.apache.httpcomponents:httpcore-nio:jar:NON-OSGI:4.4.4"
-artifact_map["@org_apache_karaf_jaas//:org_apache_karaf_jaas"] = "mvn:org.apache.karaf.jaas:org.apache.karaf.jaas.modules:jar:3.0.8"
-artifact_map["@org_apache_karaf_system_core//:org_apache_karaf_system_core"] = "mvn:org.apache.karaf.system:org.apache.karaf.system.core:jar:3.0.8"
+artifact_map["@org_apache_karaf_jaas//:org_apache_karaf_jaas"] = "mvn:org.apache.karaf.jaas:org.apache.karaf.jaas.modules:jar:4.2.1"
+artifact_map["@org_apache_karaf_system_core//:org_apache_karaf_system_core"] = "mvn:org.apache.karaf.system:org.apache.karaf.system.core:jar:4.2.1"
 artifact_map["@org_apache_servicemix_bundles_snmp4j//:org_apache_servicemix_bundles_snmp4j"] = "mvn:org.apache.servicemix.bundles:org.apache.servicemix.bundles.snmp4j:jar:2.3.4_1"
 artifact_map["@org_osgi_compendium//:org_osgi_compendium"] = "mvn:org.osgi:org.osgi.compendium:jar:5.0.0"
+artifact_map["@org_osgi_cmpn//:org_osgi_cmpn"] = "mvn:org.osgi:osgi.cmpn:jar:7.0.0"
 artifact_map["@osgi_core//:osgi_core"] = "mvn:org.osgi:org.osgi.core:jar:5.0.0"
-artifact_map["@reflectasm//:reflectasm"] = "mvn:com.esotericsoftware:reflectasm:jar:1.11.0"
+artifact_map["@reflectasm//:reflectasm"] = "mvn:com.esotericsoftware:reflectasm:jar:1.11.7"
 artifact_map["@remotetea_oncrpc//:remotetea_oncrpc"] = "mvn:org.acplt.remotetea:remotetea-oncrpc:jar:1.1.3"
 artifact_map["@rrd4j//:rrd4j"] = "mvn:org.rrd4j:rrd4j:jar:NON-OSGI:3.1"
 artifact_map["@javassist//:javassist"] = "mvn:org.javassist:javassist:jar:3.22.0-GA"
@@ -1494,13 +1566,11 @@
 artifact_map["@typesafe_config//:typesafe_config"] = "mvn:com.typesafe:config:jar:1.3.2"
 artifact_map["@validation_api//:validation_api"] = "mvn:javax.validation:validation-api:jar:1.1.0.Final"
 artifact_map["@checkstyle//:checkstyle"] = "mvn:com.puppycrawl.tools:checkstyle:jar:NON-OSGI:8.10"
-artifact_map["@apache_karaf//:apache_karaf"] = "http://repo1.maven.org/maven2/org/onosproject/apache-karaf-offline/3.0.8/apache-karaf-offline-3.0.8.tar.gz"
-artifact_map["@apache_karaf_patches//:apache_karaf_patches"] = "http://repo1.maven.org/maven2/org/onosproject/onos-apache-karaf-patches/3.0.8/onos-apache-karaf-patches-3.0.8.tar.gz"
+artifact_map["@apache_karaf//:apache_karaf"] = "http://repo1.maven.org/maven2/org/onosproject/apache-karaf-offline/4.2.1-offline-20181102/apache-karaf-offline-4.2.1-offline-20181102.tar.gz"
 artifact_map["@bndlib//:bndlib"] = "mvn:biz.aQute.bnd:biz.aQute.bndlib:jar:4.0.0"
 artifact_map["@bndexe//:bndexe"] = "mvn:biz.aQute.bnd:biz.aQute.bnd:jar:4.0.0"
 artifact_map["@libthrift//:libthrift"] = "mvn:org.apache.thrift:libthrift:jar:0.11.0"
 artifact_map["@qdox//:qdox"] = "mvn:com.thoughtworks.qdox:qdox:jar:NON-OSGI:2.0-M3"
-artifact_map["@org_apache_felix_scr_bnd//:org_apache_felix_scr_bnd"] = "https://oss.sonatype.org/content/repositories/snapshots/org/onosproject/org.apache.felix.scr.bnd/1.4.1-SNAPSHOT/org.apache.felix.scr.bnd-1.4.1-20160328.235003-2.jar"
 artifact_map["@snmp_core//:snmp_core"] = "mvn:org.onosproject:snmp-core:jar:1.3-20161021.1"
 artifact_map["@mibs_net_snmp//:mibs_net_snmp"] = "mvn:org.onosproject:mibbler-mibs-net-snmp:jar:1.0-20151221.1"
 artifact_map["@mibs_rfc//:mibs_rfc"] = "mvn:org.onosproject:mibbler-mibs-rfc:jar:1.0-20151221.1"
diff --git a/tools/build/bazel/modules.bzl b/tools/build/bazel/modules.bzl
new file mode 100644
index 0000000..26a5da4
--- /dev/null
+++ b/tools/build/bazel/modules.bzl
@@ -0,0 +1,318 @@
+UTILS = [
+    "//utils/osgiwrap:osgi-jar",
+    "//utils/osgi:onlab-osgi",
+    "//utils/junit:onlab-junit",
+    "//utils/misc:onlab-misc",
+    "//utils/rest:onlab-rest",
+]
+
+API = [
+    "//core/api:onos-api",
+    "//incubator/api:onos-incubator-api",
+]
+
+CORE = UTILS + API + [
+    "//core/net:onos-core-net",
+    "//core/common:onos-core-common",
+    "//core/store/primitives:onos-core-primitives",
+    "//core/store/serializers:onos-core-serializers",
+    "//core/store/dist:onos-core-dist",
+    #"//core/security:onos-security",
+    "//core/store/persistence:onos-core-persistence",
+    "//incubator/net:onos-incubator-net",
+    "//incubator/store:onos-incubator-store",
+    "//incubator/rpc:onos-incubator-rpc",
+    "//cli:onos-cli",
+    "//protocols/rest/api:onos-protocols-rest-api",
+    "//protocols/rest/ctl:onos-protocols-rest-ctl",
+    "//protocols/bgp/bgpio:onos-protocols-bgp-bgpio",
+    "//protocols/bgp/api:onos-protocols-bgp-api",
+    "//protocols/bgp/ctl:onos-protocols-bgp-ctl",
+    "//protocols/netconf/api:onos-protocols-netconf-api",
+    "//protocols/netconf/ctl:onos-protocols-netconf-ctl",
+    "//protocols/openflow/api:onos-protocols-openflow-api",
+    "//protocols/openflow/ctl:onos-protocols-openflow-ctl",
+    "//protocols/ospf/api:onos-protocols-ospf-api",
+    "//protocols/ospf/protocol:onos-protocols-ospf-protocol",
+    "//protocols/ospf/ctl:onos-protocols-ospf-ctl",
+    "//protocols/ovsdb/rfc:onos-protocols-ovsdb-rfc",
+    "//protocols/ovsdb/api:onos-protocols-ovsdb-api",
+    "//protocols/ovsdb/ctl:onos-protocols-ovsdb-ctl",
+    "//protocols/p4runtime/api:onos-protocols-p4runtime-api",
+    "//protocols/p4runtime/model:onos-protocols-p4runtime-model",
+    "//protocols/pcep/pcepio:onos-protocols-pcep-pcepio",
+    "//protocols/pcep/server/api:onos-protocols-pcep-server-api",
+    "//protocols/pcep/server/ctl:onos-protocols-pcep-server-ctl",
+    "//protocols/snmp/api:onos-protocols-snmp-api",
+    "//protocols/snmp/ctl:onos-protocols-snmp-ctl",
+    "//protocols/isis/api:onos-protocols-isis-api",
+    "//protocols/isis/ctl:onos-protocols-isis-ctl",
+    "//protocols/isis/isisio:onos-protocols-isis-isisio",
+    "//protocols/lisp/api:onos-protocols-lisp-api",
+    "//protocols/lisp/ctl:onos-protocols-lisp-ctl",
+    "//protocols/lisp/msg:onos-protocols-lisp-msg",
+    "//protocols/tl1/api:onos-protocols-tl1-api",
+    "//protocols/tl1/ctl:onos-protocols-tl1-ctl",
+    "//protocols/restconf/client/api:onos-protocols-restconf-client-api",
+    "//protocols/restconf/client/ctl:onos-protocols-restconf-client-ctl",
+    "//protocols/xmpp/core/api:onos-protocols-xmpp-core-api",
+    "//protocols/xmpp/core/ctl:onos-protocols-xmpp-core-ctl",
+    "//drivers/utilities:onos-drivers-utilities",
+    "//providers/netconf/device:onos-providers-netconf-device",
+    "//providers/openflow/device:onos-providers-openflow-device",
+    "//providers/openflow/packet:onos-providers-openflow-packet",
+    "//providers/openflow/flow:onos-providers-openflow-flow",
+    "//providers/openflow/group:onos-providers-openflow-group",
+    "//providers/openflow/meter:onos-providers-openflow-meter",
+    "//providers/ovsdb/device:onos-providers-ovsdb-device",
+    "//providers/ovsdb/tunnel:onos-providers-ovsdb-tunnel",
+    "//providers/rest/device:onos-providers-rest-device",
+    "//providers/snmp/device:onos-providers-snmp-device",
+    "//providers/isis/cfg:onos-providers-isis-cfg",
+    "//providers/isis/topology:onos-providers-isis-topology",
+    "//providers/lisp/device:onos-providers-lisp-device",
+    "//providers/tl1/device:onos-providers-tl1-device",
+    "//providers/general/device:onos-providers-general-device",
+    "//providers/p4runtime/packet:onos-providers-p4runtime-packet",
+    "//web/api:onos-rest",
+    # "//web/gui2:onos-gui2",
+    "//web/gui:onos-gui",
+    # "//incubator/protobuf/models:onos-incubator-protobuf-models",
+    # "//incubator/protobuf/services/nb:onos-incubator-protobuf-services-nb",
+]
+
+ONOS_DRIVERS = [
+    # Drivers
+    "//drivers/default:onos-drivers-default-oar",
+    "//drivers/arista:onos-drivers-arista-oar",
+    "//drivers/ciena/waveserver:onos-drivers-ciena-waveserver-oar",
+    "//drivers/ciena/c5162:onos-drivers-ciena-c5162-oar",
+    "//drivers/ciena/c5170:onos-drivers-ciena-c5170-oar",
+    "//drivers/ciena/waveserverai:onos-drivers-ciena-waveserverai-oar",
+    "//drivers/cisco/netconf:onos-drivers-cisco-netconf-oar",
+    "//drivers/cisco/rest:onos-drivers-cisco-rest-oar",
+    "//drivers/corsa:onos-drivers-corsa-oar",
+    "//drivers/fujitsu:onos-drivers-fujitsu-oar",
+    "//drivers/lumentum:onos-drivers-lumentum-oar",
+    "//drivers/netconf:onos-drivers-netconf-oar",
+    "//drivers/server:onos-drivers-server-oar",
+    "//drivers/optical:onos-drivers-optical-oar",
+    "//drivers/ovsdb:onos-drivers-ovsdb-oar",
+    "//drivers/juniper:onos-drivers-juniper-oar",
+    "//drivers/lisp:onos-drivers-lisp-oar",
+    "//drivers/flowspec:onos-drivers-flowspec-oar",
+    "//drivers/huawei:onos-drivers-huawei-oar",
+    "//drivers/microsemi/ea1000:onos-drivers-microsemi-ea1000-oar",
+    "//drivers/oplink:onos-drivers-oplink-oar",
+    "//drivers/bmv2:onos-drivers-bmv2-oar",
+    "//drivers/barefoot:onos-drivers-barefoot-oar",
+    "//drivers/mellanox:onos-drivers-mellanox-oar",
+    "//drivers/hp:onos-drivers-hp-oar",
+    "//drivers/p4runtime:onos-drivers-p4runtime-oar",
+    "//drivers/gnmi:onos-drivers-gnmi-oar",
+    "//drivers/polatis/netconf:onos-drivers-polatis-netconf-oar",
+    "//drivers/polatis/openflow:onos-drivers-polatis-openflow-oar",
+    "//drivers/odtn-driver:onos-drivers-odtn-driver-oar",
+]
+
+ONOS_PROVIDERS = [
+    # Providers
+    "//providers/bgp:onos-providers-bgp-oar",
+    "//providers/bgpcep:onos-providers-bgpcep-oar",
+    "//providers/host:onos-providers-host-oar",
+    "//providers/hostprobing:onos-providers-hostprobing-oar",
+    "//providers/lldp:onos-providers-lldp-oar",
+    "//providers/netcfghost:onos-providers-netcfghost-oar",
+    "//providers/netcfglinks:onos-providers-netcfglinks-oar",
+    "//providers/netconf:onos-providers-netconf-oar",
+    "//providers/openflow/message:onos-providers-openflow-message-oar",
+    "//providers/ovsdb:onos-providers-ovsdb-oar",
+    "//providers/ovsdb/host:onos-providers-ovsdb-host-oar",
+    "//providers/ovsdb/base:onos-providers-ovsdb-base-oar",
+    "//providers/pcep:onos-providers-pcep-oar",
+    "//providers/null:onos-providers-null-oar",
+    "//providers/openflow/base:onos-providers-openflow-base-oar",
+    "//providers/openflow/app:onos-providers-openflow-app-oar",
+    "//providers/rest:onos-providers-rest-oar",
+    "//providers/isis:onos-providers-isis-oar",
+    "//providers/snmp:onos-providers-snmp-oar",
+    "//providers/link:onos-providers-link-oar",
+    "//providers/lisp:onos-providers-lisp-oar",
+    "//providers/tl1:onos-providers-tl1-oar",
+    "//providers/general:onos-providers-general-oar",
+    "//providers/p4runtime:onos-providers-p4runtime-oar",
+    # "//providers/ietfte:onos-providers-ietfte-oar",
+    "//providers/xmpp/device:onos-providers-xmpp-device-oar",
+]
+
+ONOS_APPS = [
+    # Apps
+    "//apps/dhcp:onos-apps-dhcp-oar",
+    "//apps/dhcprelay:onos-apps-dhcprelay-oar",
+    "//apps/fwd:onos-apps-fwd-oar",
+    "//apps/packet-stats:onos-apps-packet-stats-oar",
+    "//apps/acl:onos-apps-acl-oar",
+    "//apps/bgprouter:onos-apps-bgprouter-oar",
+    "//apps/cip:onos-apps-cip-oar",
+    "//apps/drivermatrix:onos-apps-drivermatrix-oar",
+    "//apps/events:onos-apps-events-oar",
+    "//apps/proxyarp:onos-apps-proxyarp-oar",
+    "//apps/segmentrouting:onos-apps-segmentrouting-oar",
+    "//apps/gangliametrics:onos-apps-gangliametrics-oar",
+    "//apps/graphitemetrics:onos-apps-graphitemetrics-oar",
+    "//apps/flowanalyzer:onos-apps-flowanalyzer-oar",
+    "//apps/intentsync:onos-apps-intentsync-oar",
+    "//apps/influxdbmetrics:onos-apps-influxdbmetrics-oar",
+    "//apps/metrics:onos-apps-metrics-oar",
+    "//apps/mfwd:onos-apps-mfwd-oar",
+    "//apps/mlb:onos-apps-mlb-oar",
+    "//apps/mobility:onos-apps-mobility-oar",
+    "//apps/newoptical:onos-apps-newoptical-oar",
+    "//apps/optical-model:onos-apps-optical-model-oar",
+    "//apps/optical-rest:onos-apps-optical-rest-oar",
+    "//apps/pathpainter:onos-apps-pathpainter-oar",
+    "//apps/pcep-api:onos-apps-pcep-api-oar",
+    "//apps/pim:onos-apps-pim-oar",
+    "//apps/linkprops:onos-apps-linkprops-oar",
+    "//apps/reactive-routing:onos-apps-reactive-routing-oar",
+    "//apps/roadm:onos-apps-roadm-oar",
+    "//apps/sdnip:onos-apps-sdnip-oar",
+    "//apps/test/cluster-ha:onos-apps-test-cluster-ha-oar",
+    "//apps/test/demo:onos-apps-test-demo-oar",
+    "//apps/test/distributed-primitives:onos-apps-test-distributed-primitives-oar",
+    "//apps/test/election:onos-apps-test-election-oar",
+    "//apps/test/flow-perf:onos-apps-test-flow-perf-oar",
+    "//apps/test/intent-perf:onos-apps-test-intent-perf-oar",
+    "//apps/test/route-scale:onos-apps-test-route-scale-oar",
+    "//apps/test/loadtest:onos-apps-test-loadtest-oar",
+    "//apps/test/netcfg-monitor:onos-apps-test-netcfg-monitor-oar",
+    "//apps/test/messaging-perf:onos-apps-test-messaging-perf-oar",
+    "//apps/test/primitive-perf:onos-apps-test-primitive-perf-oar",
+    "//apps/test/transaction-perf:onos-apps-test-transaction-perf-oar",
+    "//apps/virtualbng:onos-apps-virtualbng-oar",
+    "//apps/vpls:onos-apps-vpls-oar",
+    "//apps/vrouter:onos-apps-vrouter-oar",
+    "//apps/routing/fibinstaller:onos-apps-routing-fibinstaller-oar",
+    "//apps/routing/cpr:onos-apps-routing-cpr-oar",
+    "//apps/routing/fpm:onos-apps-routing-fpm-oar",
+    "//apps/vtn:onos-apps-vtn-oar",
+    "//apps/faultmanagement:onos-apps-faultmanagement-oar",
+    "//apps/openstacknode:onos-apps-openstacknode-oar",
+    "//apps/openstacknetworking:onos-apps-openstacknetworking-oar",
+    "//apps/openstacknetworkingui:onos-apps-openstacknetworkingui-oar",
+    "//apps/openstacktelemetry:onos-apps-openstacktelemetry-oar",
+    "//apps/openstacktroubleshoot:onos-apps-openstacktroubleshoot-oar",
+    "//apps/openstackvtap:onos-apps-openstackvtap-oar",
+    "//apps/cpman/app:onos-apps-cpman-app-oar",
+    "//apps/scalablegateway:onos-apps-scalablegateway-oar",
+    "//apps/castor:onos-apps-castor-oar",
+    # "//apps/yms:onos-apps-yms-oar",
+    "//apps/ofagent:onos-apps-ofagent-oar",
+    "//apps/mappingmanagement:onos-apps-mappingmanagement-oar",
+    "//apps/config:onos-apps-config-oar",
+    "//apps/configsync:onos-apps-configsync-oar",
+    "//apps/configsync-netconf:onos-apps-configsync-netconf-oar",
+    "//apps/netconf/client:onos-apps-netconf-client-oar",
+    "//apps/tetopology:onos-apps-tetopology-oar",
+    "//apps/tetunnel:onos-apps-tetunnel-oar",
+    # "//apps/tenbi/yangmodel:onos-apps-tenbi-yangmodel-feature",
+    # "//apps/tenbi:onos-apps-tenbi-oar",
+    "//protocols/restconf/server:onos-protocols-restconf-server-oar",
+    "//apps/restconf:onos-apps-restconf-oar",
+    "//apps/flowspec-api:onos-apps-flowspec-api-oar",
+    "//apps/yang:onos-apps-yang-oar",
+    "//apps/yang-gui:onos-apps-yang-gui-oar",
+    "//apps/cord-support:onos-apps-cord-support-oar",
+    "//apps/network-troubleshoot:onos-apps-network-troubleshoot-oar",
+    "//apps/l3vpn:onos-apps-l3vpn-oar",
+    "//apps/openroadm:onos-apps-openroadm-oar",
+    "//apps/artemis:onos-apps-artemis-oar",
+    "//apps/pi-demo/ecmp:onos-apps-pi-demo-ecmp-oar",
+    "//apps/gluon:onos-apps-gluon-oar",
+    "//apps/evpnopenflow:onos-apps-evpnopenflow-oar",
+    "//apps/route-service:onos-apps-route-service-oar",
+    "//apps/evpn-route-service:onos-apps-evpn-route-service-oar",
+    # "//incubator/protobuf/registry:onos-incubator-protobuf-registry-oar",
+    # "//incubator/protobuf/services/nb:onos-incubator-protobuf-services-nb-oar",
+    "//apps/p4-tutorial/pipeconf:onos-apps-p4-tutorial-pipeconf-oar",
+    "//apps/p4-tutorial/mytunnel:onos-apps-p4-tutorial-mytunnel-oar",
+    "//apps/cfm:onos-apps-cfm-oar",
+    "//apps/routeradvertisement:onos-apps-routeradvertisement-oar",
+    "//apps/powermanagement:onos-apps-powermanagement-oar",
+    "//apps/t3:onos-apps-t3-oar",
+    "//apps/simplefabric:onos-apps-simplefabric-oar",
+    # "//apps/kafka-integration:onos-apps-kafka-integration-oar",
+    "//apps/rabbitmq:onos-apps-rabbitmq-oar",
+    "//apps/odtn/api:onos-apps-odtn-api-oar",
+    "//apps/odtn/service:onos-apps-odtn-service-oar",
+    "//apps/mcast:onos-apps-mcast-oar",
+    "//apps/layout:onos-apps-layout-oar",
+    "//apps/imr:onos-apps-imr-oar",
+    "//apps/nodemetrics:onos-apps-nodemetrics-oar",
+    "//apps/inbandtelemetry:onos-apps-inbandtelemetry-oar",
+    # "//web/gui2:onos-web-gui2-oar",
+    "//apps/workflow:onos-apps-workflow-oar",
+]
+
+PROTOCOL_APPS = [
+    "//protocols/grpc:onos-protocols-grpc-oar",
+    "//protocols/p4runtime:onos-protocols-p4runtime-oar",
+    "//protocols/gnmi:onos-protocols-gnmi-oar",
+    "//protocols/xmpp/core:onos-protocols-xmpp-core-oar",
+    "//protocols/xmpp/pubsub:onos-protocols-xmpp-pubsub-oar",
+]
+
+MODELS = [
+    "//models/ietf:onos-models-ietf-oar",
+    "//models/common:onos-models-common-oar",
+    "//models/huawei:onos-models-huawei-oar",
+    "//models/openconfig:onos-models-openconfig-oar",
+    "//models/openconfig-infinera:onos-models-openconfig-infinera-oar",
+    "//models/openroadm:onos-models-openroadm-oar",
+    "//models/tapi:onos-models-tapi-oar",
+    "//models/l3vpn:onos-models-l3vpn-oar",
+    "//models/microsemi:onos-models-microsemi-oar",
+    "//models/polatis:onos-models-polatis-oar",
+    "//models/ciena/waveserverai:onos-models-ciena-waveserverai-oar",
+]
+
+PIPELINES = [
+    "//pipelines/basic:onos-pipelines-basic-oar",
+    "//pipelines/fabric:onos-pipelines-fabric-oar",
+]
+
+APP_JARS = [
+    "//apps/cpman/api:onos-apps-cpman-api",
+    "//apps/routing-api:onos-apps-routing-api",
+    "//apps/dhcp/api:onos-apps-dhcp-api",
+    "//apps/dhcp/app:onos-apps-dhcp-app",
+    "//apps/imr/api:onos-apps-imr-api",
+    "//apps/imr/app:onos-apps-imr-app",
+    "//apps/dhcprelay/app:onos-apps-dhcprelay-app",
+    "//apps/dhcprelay/web:onos-apps-dhcprelay-web",
+    "//apps/fwd:onos-apps-fwd",
+    "//apps/iptopology-api:onos-apps-iptopology-api",
+    "//apps/routing/common:onos-apps-routing-common",
+    "//apps/vtn/vtnrsc:onos-apps-vtn-vtnrsc",
+    "//apps/vtn/sfcmgr:onos-apps-vtn-sfcmgr",
+    "//apps/vtn/vtnmgr:onos-apps-vtn-vtnmgr",
+    "//apps/vtn/vtnweb:onos-apps-vtn-vtnweb",
+    "//apps/kafka-integration/api:onos-apps-kafka-integration-api",
+    # "//apps/kafka-integration/app:onos-apps-kafka-integration-app",
+]
+
+FEATURES = [
+    "//tools/package/features:onos-thirdparty-base",
+    "//tools/package/features:onos-thirdparty-web",
+    "//tools/package/features:onos-api",
+    "//tools/package/features:onos-core",
+    "//tools/package/features:onos-incubator",
+    "//tools/package/features:onos-cli",
+    "//tools/package/features:onos-rest",
+    "//tools/package/features:onos-gui",
+    # "//tools/package/features:onos-gui2",
+    # "//tools/package/features:onos-security",
+]
+
+APPS = ONOS_DRIVERS + ONOS_PROVIDERS + ONOS_APPS + MODELS + PIPELINES + \
+       PROTOCOL_APPS + APP_JARS
diff --git a/tools/build/bazel/osgi_features.bzl b/tools/build/bazel/osgi_features.bzl
index d2c8a1e..30f00a8 100644
--- a/tools/build/bazel/osgi_features.bzl
+++ b/tools/build/bazel/osgi_features.bzl
@@ -102,7 +102,7 @@
 <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
 <features xmlns="http://karaf.apache.org/xmlns/features/v1.2.0"
           name="onos-%s">
-    <repository>mvn:org.apache.karaf.features/standard/3.0.8/xml/features</repository>
+    <repository>mvn:org.apache.karaf.features/standard/4.2.1/xml/features</repository>
 ''' % ONOS_VERSION
 
 FEATURES_FOOTER = "</features>"
diff --git a/tools/build/bazel/osgi_java_library.bzl b/tools/build/bazel/osgi_java_library.bzl
index bd68a30..e5065f7 100644
--- a/tools/build/bazel/osgi_java_library.bzl
+++ b/tools/build/bazel/osgi_java_library.bzl
@@ -83,6 +83,7 @@
         web_context = "NONE"
     web_xml = ctx.attr.web_xml
     dynamicimportPackages = ""
+    karaf_commands = ctx.attr.karaf_commands
     cp = ""
 
     inputDependencies = [input_file]
@@ -119,6 +120,7 @@
         dynamicimportPackages,
         "classes",
         bundle_classpath,
+        karaf_commands,
     ]
 
     ctx.actions.run(
@@ -151,6 +153,7 @@
         "web_context": attr.string(),
         "web_xml": attr.label_list(allow_files = True),
         "include_resources": attr.string(),
+        "karaf_commands": attr.string(),
         "_bnd_exe": attr.label(
             executable = True,
             cfg = "host",
@@ -166,6 +169,46 @@
 )
 
 """
+    Implementation of the rule to generate cfgdef files from java class source
+"""
+
+def _cfgdef_impl(ctx):
+    output_jar = ctx.outputs.cfgdef_jar.path
+
+    arguments = [
+        output_jar,
+    ]
+
+    for src in ctx.files.srcs:
+        arguments.append(src.path)
+
+    ctx.actions.run(
+        inputs = ctx.files.srcs,
+        outputs = [ctx.outputs.cfgdef_jar],
+        arguments = arguments,
+        progress_message = "Running cfgdef generator on: %s" % ctx.attr.name,
+        executable = ctx.executable._cfgdef_generator_exe,
+    )
+
+"""
+    Rule definition to call cfgdef generator to create the *.cfgdef files from java sources
+"""
+_cfgdef = rule(
+    attrs = {
+        "srcs": attr.label_list(allow_files = True),
+        "_cfgdef_generator_exe": attr.label(
+            executable = True,
+            cfg = "host",
+            allow_files = True,
+            default = Label("//tools/build/cfgdef:cfgdef_generator"),
+        ),
+        "cfgdef_jar": attr.output(),
+    },
+    fragments = ["java"],
+    implementation = _cfgdef_impl,
+)
+
+"""
     Implementation of the rule to call swagger generator to create the registrator java class source
 """
 
@@ -183,11 +226,9 @@
 
     srcs_arg = ""
     resources_arg = ""
-    input_dependencies = []
 
     for file in ctx.files.srcs:
         srcs_arg += file.path + ","
-        input_dependencies.append(file)
 
     for resource in resources_arg:
         resources_arg += resource.path + ","
@@ -233,11 +274,9 @@
 
     srcs_arg = ""
     resources_arg = ""
-    input_dependencies = []
 
     for file in ctx.files.srcs:
         srcs_arg += file.path + ","
-        input_dependencies.append(file)
 
     for resource in resources_arg:
         resources_arg += resource.path + ","
@@ -281,7 +320,7 @@
             executable = True,
             cfg = "host",
             allow_files = True,
-            default = Label("//tools/build/buck-plugin:swagger_generator"),
+            default = Label("//tools/build/swagger:swagger_generator"),
         ),
         "swagger_java": attr.output(),
     },
@@ -305,7 +344,7 @@
             executable = True,
             cfg = "host",
             allow_files = True,
-            default = Label("//tools/build/buck-plugin:swagger_generator"),
+            default = Label("//tools/build/swagger:swagger_generator"),
         ),
         "swagger_json": attr.output(),
     },
@@ -384,7 +423,8 @@
         api_description = "",
         api_package = "",
         import_packages = None,
-        bundle_classpath = ""):
+        bundle_classpath = "",
+        karaf_command_packages = []):
     if name == None:
         name = _auto_name()
     if srcs == None:
@@ -410,6 +450,7 @@
 
     native_srcs = srcs
     native_resources = resources
+
     if web_context != None and api_title != "" and len(resources) != 0:
         # generate Swagger files if needed
         _swagger_java(
@@ -445,12 +486,19 @@
 
     javacopts = ["-XepDisableAllChecks"] if suppress_errorprone else []
 
+    _cfgdef(
+        name = name + "_cfgdef_jar",
+        srcs = native_srcs,
+        visibility = visibility,
+        cfgdef_jar = name + "_cfgdef.jar",
+    )
+
     # compile the Java code
     if len(resource_jars) > 0:
         native.java_library(
             name = name + "-native",
             srcs = native_srcs,
-            resource_jars = resource_jars,
+            resource_jars = resource_jars + [name + "_cfgdef_jar"],
             deps = deps,
             visibility = visibility,
             javacopts = javacopts,
@@ -459,12 +507,14 @@
         native.java_library(
             name = name + "-native",
             srcs = native_srcs,
+            resource_jars = [name + "_cfgdef_jar"],
             resources = native_resources,
             deps = deps,
             visibility = visibility,
             javacopts = javacopts,
         )
 
+    karaf_command_packages_string = ",".join(karaf_command_packages)
     _bnd(
         name = name,
         source = name + "-native",
@@ -477,6 +527,7 @@
         web_context = web_context,
         web_xml = web_xml,
         include_resources = _include_resources_to_string(include_resources),
+        karaf_commands = karaf_command_packages_string,
     )
 
     # rule for generating pom file for publishing
@@ -564,7 +615,8 @@
         api_version = "",
         api_description = "",
         api_package = "",
-        bundle_classpath = ""):
+        bundle_classpath = "",
+        karaf_command_packages = []):
     if srcs == None:
         srcs = _all_java_sources()
     if deps == None:
@@ -594,6 +646,7 @@
         api_package = api_package,
         web_context = web_context,
         bundle_classpath = bundle_classpath,
+        karaf_command_packages = karaf_command_packages,
     )
 
 """
@@ -637,7 +690,8 @@
         deps = [],
         group = "org.onosproject",
         visibility = ["//visibility:public"],
-        version = ONOS_VERSION):
+        version = ONOS_VERSION,
+        karaf_command_packages = []):
     if name == None:
         name = _auto_name()
     native.java_proto_library(
@@ -679,4 +733,5 @@
         suppress_errorprone = True,
         suppress_checkstyle = True,
         suppress_javadocs = True,
+        karaf_command_packages = karaf_command_packages,
     )
diff --git a/tools/build/bazel/variables.bzl b/tools/build/bazel/variables.bzl
index 1aba667..ca2147a 100644
--- a/tools/build/bazel/variables.bzl
+++ b/tools/build/bazel/variables.bzl
@@ -1,6 +1,6 @@
-ONOS_ORIGIN = "ONOS Community"
-ONOS_GROUP_ID = "org.onosproject"
-ONOS_VERSION = "1.15.0-SNAPSHOT"
-DEFAULT_APP_CATEGORY = "Utility"
+ONOS_VERSION = "2.0.0-SNAPSHOT"
 ONOS_ARTIFACT_BASE = "onos-"
+ONOS_GROUP_ID = "org.onosproject"
+ONOS_ORIGIN = "ONOS Community"
 APP_PREFIX = ONOS_GROUP_ID + "."
+DEFAULT_APP_CATEGORY = "Utility"
diff --git a/tools/build/bazel/yang.bzl b/tools/build/bazel/yang.bzl
index 93b619c..18b60e7 100644
--- a/tools/build/bazel/yang.bzl
+++ b/tools/build/bazel/yang.bzl
@@ -32,9 +32,9 @@
     "package org.onosproject.model.registrator.impl;\n" + \
     "\n" + \
     "import org.onosproject.yang.AbstractYangModelRegistrator;\n" + \
-    "import org.apache.felix.scr.annotations.Component;\n" + \
+    "import org.osgi.service.component.annotations.Component;\n" + \
     "\n" + \
-    "@Component(immediate = true)\n" + \
+    "@Component(immediate = true, service = YangModelRegistrator.class)\n" + \
     "public class YangModelRegistrator extends AbstractYangModelRegistrator {\n" + \
     "    public YangModelRegistrator() {\n" + \
     "        super(YangModelRegistrator.class);\n" + \
diff --git a/tools/build/buck-plugin/BUCK b/tools/build/buck-plugin/BUCK
deleted file mode 100644
index 8593941..0000000
--- a/tools/build/buck-plugin/BUCK
+++ /dev/null
@@ -1,46 +0,0 @@
-# Comment the remote_jar out for local buck development
-remote_jar (
-  name = 'buck-api',
-  out = 'buck.jar',
-  url = 'https://oss.sonatype.org/content/repositories/snapshots/org/onosproject/buck-api/0.1-SNAPSHOT/buck-api-0.1-20161113.012708-6.jar',
-  sha1 = 'da823563b03964eafc9ff76cd721b9253ae473a1',
-  visibility = [],
-)
-
-# Uncomment the prebuilt_jar and copy buck-api to lib/buck.jar for local buck development
-# prebuilt_jar (
-#  name = 'buck-api',
-#  binary_jar = 'lib/buck.jar'
-# )
-
-# Use buck's guava version - 19.0
-remote_jar (
-  name = 'guava',
-  out = 'guava-19.0.jar',
-  url = 'mvn:com.google.guava:guava:jar:19.0',
-  sha1 = '6ce200f6b23222af3d8abb6b6459e6c44f4bb0e9',
-  maven_coords = 'com.google.guava:guava:19.0',
-)
-
-COMPILE = [
-  '//lib:qdox',
-  ':guava',
-  '//lib:bndlib',
-  '//lib:org.apache.felix.scr.bnd'
-]
-
-java_library(
-  name = 'lib',
-  srcs = glob(['src/main/java/**/*.java']),
-  resources = glob(['src/main/resources/**/*']),
-  resources_root = 'src/main/resources',
-  deps = COMPILE,
-  provided_deps = [':buck-api'],
-  visibility = [],
-)
-
-java_binary(
-  name = 'onos',
-  deps = [':lib'],
-  visibility = ['PUBLIC'],
-)
diff --git a/tools/build/buck-plugin/BUILD b/tools/build/buck-plugin/BUILD
deleted file mode 100644
index e8d2c21..0000000
--- a/tools/build/buck-plugin/BUILD
+++ /dev/null
@@ -1,16 +0,0 @@
-SWAGGER_EXECUTABLE = "swagger_generator"
-
-COMPILE_DEPS = JACKSON + [
-    "@com_google_guava_guava//jar",
-    "@qdox//jar",
-    "@org_apache_felix_scr_bnd//jar",
-]
-
-java_binary(
-    name = SWAGGER_EXECUTABLE,
-    srcs = glob(["src/main/java/org/onosproject/onosjar/SwaggerGenerator.java"]),
-    main_class = "org.onosproject.onosjar.SwaggerGenerator",
-    resources = glob(["src/main/resources/registrator.javat"]),
-    visibility = ["//visibility:public"],
-    deps = COMPILE_DEPS,
-)
diff --git a/tools/build/buck-plugin/buck-plugin-install b/tools/build/buck-plugin/buck-plugin-install
deleted file mode 100755
index 15cf0e6..0000000
--- a/tools/build/buck-plugin/buck-plugin-install
+++ /dev/null
@@ -1,14 +0,0 @@
-#!/bin/bash
-
-PLUGINS=$ONOS_ROOT/bin/plugins
-
-set -e
-
-# Build it first
-pluginJar=$(NO_BUCKD=1 onos-buck build //tools/build/buck-plugin:onos --no-cache --show-output | grep onos.jar | cut -d\  -f2)
-
-# Then install it
-mkdir -p $PLUGINS
-cp $ONOS_ROOT/$pluginJar $PLUGINS
-
-ls -l $PLUGINS
diff --git a/tools/build/buck-plugin/buck-plugin-test b/tools/build/buck-plugin/buck-plugin-test
deleted file mode 100755
index cb8fd76..0000000
--- a/tools/build/buck-plugin/buck-plugin-test
+++ /dev/null
@@ -1,3 +0,0 @@
-#!/bin/bash
-
-NO_BUCKD=1 onos-buck build //apps/dhcp/app:onos-apps-dhcp-app --no-cache --show-output
diff --git a/tools/build/buck-plugin/src/main/java/org/onosproject/onosjar/OSGiWrapper.java b/tools/build/buck-plugin/src/main/java/org/onosproject/onosjar/OSGiWrapper.java
deleted file mode 100644
index 86c6938..0000000
--- a/tools/build/buck-plugin/src/main/java/org/onosproject/onosjar/OSGiWrapper.java
+++ /dev/null
@@ -1,496 +0,0 @@
-/*
- * Copyright 2016-present Open Networking Foundation
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.onosproject.onosjar;
-
-import aQute.bnd.header.Attrs;
-import aQute.bnd.header.Parameters;
-import aQute.bnd.osgi.Analyzer;
-import aQute.bnd.osgi.Builder;
-import aQute.bnd.osgi.Constants;
-import aQute.bnd.osgi.Descriptors;
-import aQute.bnd.osgi.FileResource;
-import aQute.bnd.osgi.Jar;
-import aQute.bnd.osgi.Packages;
-import aQute.bnd.osgi.Processor;
-import aQute.bnd.osgi.Resource;
-import com.facebook.buck.step.ExecutionContext;
-import com.facebook.buck.step.Step;
-import com.facebook.buck.step.StepExecutionResult;
-import com.google.common.base.MoreObjects;
-import com.google.common.base.Strings;
-import com.google.common.collect.ImmutableSortedSet;
-import com.google.common.collect.Lists;
-import com.google.common.collect.Maps;
-import com.google.common.collect.Sets;
-import org.apache.felix.scrplugin.bnd.SCRDescriptorBndPlugin;
-import org.codehaus.plexus.util.DirectoryScanner;
-
-import java.io.File;
-import java.io.IOException;
-import java.io.PrintStream;
-import java.nio.file.FileVisitResult;
-import java.nio.file.FileVisitor;
-import java.nio.file.Path;
-import java.nio.file.Paths;
-import java.nio.file.SimpleFileVisitor;
-import java.nio.file.attribute.BasicFileAttributes;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Properties;
-import java.util.Set;
-import java.util.jar.Manifest;
-import java.util.stream.Collectors;
-
-import static java.nio.file.Files.walkFileTree;
-
-/**
- * BND-based wrapper to convert Buck JARs to OSGi-compatible JARs.
- */
-public class OSGiWrapper implements Step {
-
-    private static final String EMBED_DEPENDENCY = "Embed-Dependency";
-    private static final String EMBEDDED_ARTIFACTS = "Embedded-Artifacts";
-
-    private Path inputJar;
-    private Path outputJar;
-    private Path sourcesDir;
-    private Path classesDir;
-    private List<String> classpath;
-
-    private String bundleName;
-    private String groupId;
-    private String bundleSymbolicName;
-    private String bundleVersion;
-
-    private String importPackages;
-    private String privatePackages;
-    private String dynamicimportPackages;
-    private String embeddedDependencies;
-
-    private String exportPackages;
-    private String includeResources;
-    private Set<String> includedResources = Sets.newHashSet();
-
-    private String bundleDescription;
-    private String bundleLicense;
-
-    private String bundleClasspath;
-
-    private String webContext;
-
-    private PrintStream stderr = System.err;
-
-    public OSGiWrapper(Path inputJar,
-                       Path outputJar,
-                       Path sourcesDir,
-                       Path classesDir,
-                       ImmutableSortedSet<Path> classpath,
-                       String bundleName,
-                       String groupId,
-                       String bundleVersion,
-                       String bundleLicense,
-                       String importPackages,
-                       String exportPackages,
-                       String includeResources,
-                       String webContext,
-                       String dynamicimportPackages,
-                       String embeddedDependencies,
-                       String bundleDescription,
-                       String privatePackages,
-                       String bundleClasspath) {
-        this.inputJar = inputJar;
-        this.sourcesDir = sourcesDir;
-        this.classesDir = classesDir;
-        this.classpath = Lists.newArrayList(
-                classpath.stream().map(Path::toString).collect(Collectors.toList()));
-        if (!this.classpath.contains(inputJar.toString())) {
-            this.classpath.add(0, inputJar.toString());
-        }
-        this.outputJar = outputJar;
-
-        this.bundleName = bundleName;
-        this.groupId = groupId;
-        this.bundleSymbolicName = String.format("%s.%s", groupId, bundleName);
-
-        this.bundleVersion = bundleVersion;
-        this.bundleLicense = bundleLicense;
-        this.bundleDescription = bundleDescription;
-
-        this.importPackages = importPackages;
-        this.privatePackages = privatePackages;
-        this.dynamicimportPackages = dynamicimportPackages;
-        this.embeddedDependencies = embeddedDependencies;
-        this.exportPackages = exportPackages;
-        this.includeResources = includeResources;
-
-        this.webContext = webContext;
-
-        this.bundleClasspath = bundleClasspath;
-    }
-
-    private void setProperties(Analyzer analyzer) {
-
-        analyzer.setProperty(Analyzer.BUNDLE_NAME, bundleName);
-        analyzer.setProperty(Analyzer.BUNDLE_SYMBOLICNAME, bundleSymbolicName);
-        analyzer.setProperty(Analyzer.BUNDLE_VERSION, bundleVersion.replace('-', '.'));
-
-        if (bundleDescription != null) {
-            analyzer.setProperty(Analyzer.BUNDLE_DESCRIPTION, bundleDescription);
-        }
-        if (bundleLicense != null) {
-            analyzer.setProperty(Analyzer.BUNDLE_LICENSE, bundleLicense);
-        }
-
-        //TODO consider using stricter version policy
-        //analyzer.setProperty("-provider-policy", "${range;[===,==+)}");
-        //analyzer.setProperty("-consumer-policy", "${range;[===,==+)}");
-
-        if (privatePackages != null) {
-            analyzer.setProperty(Analyzer.PRIVATE_PACKAGE, privatePackages);
-        }
-        analyzer.setProperty(Analyzer.REMOVEHEADERS, "Private-Package,Include-Resource");
-
-        analyzer.setProperty(Analyzer.DYNAMICIMPORT_PACKAGE,
-                             dynamicimportPackages);
-
-        // TODO include version in export, but not in import
-        analyzer.setProperty(Analyzer.EXPORT_PACKAGE, exportPackages);
-
-        // TODO we may need INCLUDE_RESOURCE, or that might be done by Buck
-        // FIXME NOTE we handle this manually below
-        if (includeResources != null) {
-            analyzer.setProperty(Analyzer.INCLUDE_RESOURCE, includeResources);
-        }
-
-        if (embeddedDependencies != null) {
-            analyzer.setProperty(EMBED_DEPENDENCY, embeddedDependencies);
-        }
-
-        // There are no good defaults so make sure you set the Import-Package
-        analyzer.setProperty(Analyzer.IMPORT_PACKAGE, importPackages);
-
-        if (isWab()) {
-            analyzer.setProperty(Analyzer.WAB, "src/main/webapp/");
-            analyzer.setProperty("Web-ContextPath", webContext);
-            analyzer.setProperty(Analyzer.IMPORT_PACKAGE, importPackages +
-                    ",org.glassfish.jersey.servlet,org.jvnet.mimepull\n");
-        }
-    }
-
-    public boolean execute() {
-        Builder analyzer = new Builder();
-        try {
-
-            Jar jar = new Jar(inputJar.toFile());   // where our data is
-            analyzer.setJar(jar);                   // give bnd the contents
-
-            // You can provide additional class path entries to allow
-            // bnd to pickup export version from the packageinfo file,
-            // Version annotation, or their manifests.
-            analyzer.addClasspath(classpath);
-
-            setProperties(analyzer);
-
-            // Analyze the target JAR first
-            analyzer.analyze();
-
-            // Scan the JAR for Felix SCR annotations and generate XML files
-            Map<String, String> properties = Maps.newHashMap();
-            properties.put("destdir", classesDir.toAbsolutePath().toString());
-            SCRDescriptorBndPlugin scrDescriptorBndPlugin = new SCRDescriptorBndPlugin();
-            scrDescriptorBndPlugin.setProperties(properties);
-            scrDescriptorBndPlugin.setReporter(analyzer);
-            scrDescriptorBndPlugin.analyzeJar(analyzer);
-
-            //Add local packges to jar file.
-            //FIXME removing this call for now; not sure what exactly it's doing
-            //addLocalPackages(new File(classesDir.toString()), analyzer);
-
-            //add resources.
-            if (includeResources != null || embeddedDependencies != null) {
-                doIncludeResources(analyzer);
-            }
-
-            // Repack the JAR as a WAR
-            doWabStaging(analyzer);
-
-            // Calculate the manifest
-            Manifest manifest = analyzer.calcManifest();
-
-            //Build the jar files
-            //FIXME this call conflicts with some of the above
-//            analyzer.build();
-
-            if (analyzer.isOk()) {
-                //add calculated manifest file.
-                analyzer.getJar().setManifest(manifest);
-                if (analyzer.save(outputJar.toFile(), true)) {
-                    log("Saved!\n");
-                } else {
-                    warn("Failed to create jar \n");
-                    return false;
-                }
-            } else {
-                warn("Analyzer Errors:\n%s\n", analyzer.getErrors());
-                return false;
-            }
-
-            analyzer.close();
-
-            return true;
-        } catch (Exception e) {
-            e.printStackTrace();
-            return false;
-        }
-    }
-
-    private static void addLocalPackages(File outputDirectory, Analyzer analyzer) throws IOException {
-        Packages packages = new Packages();
-
-        if (outputDirectory != null && outputDirectory.isDirectory()) {
-            // scan classes directory for potential packages
-            DirectoryScanner scanner = new DirectoryScanner();
-            scanner.setBasedir(outputDirectory);
-            scanner.setIncludes(new String[]
-                                        {"**/*.class"});
-
-            scanner.addDefaultExcludes();
-            scanner.scan();
-
-            String[] paths = scanner.getIncludedFiles();
-            for (int i = 0; i < paths.length; i++) {
-                packages.put(analyzer.getPackageRef(getPackageName(paths[i])));
-            }
-        }
-
-        Packages exportedPkgs = new Packages();
-        Packages privatePkgs = new Packages();
-
-        boolean noprivatePackages = "!*".equals(analyzer.getProperty(Analyzer.PRIVATE_PACKAGE));
-
-        for (Descriptors.PackageRef pkg : packages.keySet()) {
-            // mark all source packages as private by default (can be overridden by export list)
-            privatePkgs.put(pkg);
-
-            // we can't export the default package (".") and we shouldn't export internal packages
-            String fqn = pkg.getFQN();
-            if (noprivatePackages || !(".".equals(fqn) || fqn.contains(".internal") || fqn.contains(".impl"))) {
-                exportedPkgs.put(pkg);
-            }
-        }
-
-        Properties properties = analyzer.getProperties();
-        String exported = properties.getProperty(Analyzer.EXPORT_PACKAGE);
-        if (exported == null) {
-            if (!properties.containsKey(Analyzer.EXPORT_CONTENTS)) {
-                // no -exportcontents overriding the exports, so use our computed list
-                for (Attrs attrs : exportedPkgs.values()) {
-                    attrs.put(Constants.SPLIT_PACKAGE_DIRECTIVE, "merge-first");
-                }
-                properties.setProperty(Analyzer.EXPORT_PACKAGE, Processor.printClauses(exportedPkgs));
-            } else {
-                // leave Export-Package empty (but non-null) as we have -exportcontents
-                properties.setProperty(Analyzer.EXPORT_PACKAGE, "");
-            }
-        }
-
-        String internal = properties.getProperty(Analyzer.PRIVATE_PACKAGE);
-        if (internal == null) {
-            if (!privatePkgs.isEmpty()) {
-                for (Attrs attrs : privatePkgs.values()) {
-                    attrs.put(Constants.SPLIT_PACKAGE_DIRECTIVE, "merge-first");
-                }
-                properties.setProperty(Analyzer.PRIVATE_PACKAGE, Processor.printClauses(privatePkgs));
-            } else {
-                // if there are really no private packages then use "!*" as this will keep the Bnd Tool happy
-                properties.setProperty(Analyzer.PRIVATE_PACKAGE, "!*");
-            }
-        }
-    }
-
-    private static String getPackageName(String filename) {
-        int n = filename.lastIndexOf(File.separatorChar);
-        return n < 0 ? "." : filename.substring(0, n).replace(File.separatorChar, '.');
-    }
-
-    private boolean isWab() {
-        return webContext != null;
-    }
-
-    private void doWabStaging(Analyzer analyzer) throws Exception {
-        if (!isWab()) {
-            return;
-        }
-        String wab = analyzer.getProperty(analyzer.WAB);
-        Jar dot = analyzer.getJar();
-
-        log("wab %s", wab);
-
-        if (bundleClasspath != null) {
-            analyzer.setBundleClasspath("WEB-INF/classes," + bundleClasspath);
-        }
-
-        Set<String> paths = new HashSet<>(dot.getResources().keySet());
-
-        for (String path : paths) {
-            if (path.indexOf('/') > 0 && !Character.isUpperCase(path.charAt(0))) {
-                log("wab: moving: %s", path);
-                dot.rename(path, "WEB-INF/classes/" + path);
-            }
-        }
-
-        Path wabRoot = Paths.get(wab);
-        includeFiles(dot, null, wabRoot.toString());
-    }
-
-    /**
-     * Parse the Bundle-Includes header. Files in the bundles Include header are
-     * included in the jar. The source can be a directory or a file.
-     *
-     * @throws Exception
-     */
-    private void doIncludeResources(Analyzer analyzer) throws Exception {
-        String includes = analyzer.getProperty(Analyzer.INCLUDE_RESOURCE);
-        if (includes == null) {
-            return;
-        }
-        Parameters clauses = analyzer.parseHeader(includes);
-        Jar jar = analyzer.getJar();
-
-        for (Map.Entry<String, Attrs> entry : clauses.entrySet()) {
-            String name = entry.getKey();
-            Map<String, String> extra = entry.getValue();
-            // TODO consider doing something with extras
-
-            String[] parts = name.split("\\s*=\\s*");
-            String source = parts[0];
-            String destination = parts[0];
-            if (parts.length == 2) {
-                source = parts[1];
-            }
-
-            includeFiles(jar, destination, source);
-        }
-    }
-
-    private void includeFiles(Jar jar, String destinationRoot, String sourceRoot)
-            throws IOException {
-
-        Path classesBasedPath = classesDir.resolve(sourceRoot);
-        Path sourceBasedPath = sourcesDir.resolve(sourceRoot);
-
-        File classFile = classesBasedPath.toFile();
-        File sourceFile = sourceBasedPath.toFile();
-
-        if (classFile.isFile()) {
-            addFileToJar(jar, destinationRoot, classesBasedPath.toAbsolutePath().toString());
-        } else if (sourceFile.isFile()) {
-            addFileToJar(jar, destinationRoot, sourceBasedPath.toAbsolutePath().toString());
-        } else if (classFile.isDirectory()) {
-            includeDirectory(jar, destinationRoot, classesBasedPath);
-        } else if (sourceFile.isDirectory()) {
-            includeDirectory(jar, destinationRoot, sourceBasedPath);
-        } else {
-            warn("Skipping resource in bundle %s: %s (File Not Found)\n",
-                 bundleSymbolicName, sourceRoot);
-        }
-    }
-
-    private void includeDirectory(Jar jar, String destinationRoot, Path sourceRoot)
-            throws IOException {
-        // iterate through sources
-        // put each source on the jar
-        FileVisitor<Path> visitor = new SimpleFileVisitor<Path>() {
-            @Override
-            public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {
-                Path relativePath = sourceRoot.relativize(file);
-                String destination = destinationRoot != null ?
-                        destinationRoot + "/" + relativePath.toString() : //TODO
-                        relativePath.toString();
-
-                addFileToJar(jar, destination, file.toAbsolutePath().toString());
-                return FileVisitResult.CONTINUE;
-            }
-        };
-
-        walkFileTree(sourceRoot, visitor);
-    }
-
-    private boolean addFileToJar(Jar jar, String destination, String sourceAbsPath) {
-        if (includedResources.contains(sourceAbsPath)) {
-            log("Skipping already included resource: %s\n", sourceAbsPath);
-            return false;
-        }
-        File file = new File(sourceAbsPath);
-        if (!file.isFile()) {
-            throw new RuntimeException(
-                    String.format("Skipping non-existent file: %s\n", sourceAbsPath));
-        }
-        Resource resource = new FileResource(file);
-        if (jar.getResource(destination) != null) {
-            warn("Skipping duplicate resource: %s\n", destination);
-            return false;
-        }
-        jar.putResource(destination, resource);
-        includedResources.add(sourceAbsPath);
-        log("Adding resource: %s\n", destination);
-        return true;
-    }
-
-    private void log(String format, Object... objects) {
-        //System.err.printf(format, objects);
-    }
-
-    private void warn(String format, Object... objects) {
-        stderr.printf(format, objects);
-    }
-
-    @Override
-    public String toString() {
-        return MoreObjects.toStringHelper(this)
-                .add("inputJar", inputJar)
-                .add("outputJar", outputJar)
-                .add("classpath", classpath)
-                .add("bundleName", bundleName)
-                .add("groupId", groupId)
-                .add("bundleSymbolicName", bundleSymbolicName)
-                .add("bundleVersion", bundleVersion)
-                .add("bundleDescription", bundleDescription)
-                .add("bundleLicense", bundleLicense)
-                .toString();
-    }
-
-    @Override
-    public StepExecutionResult execute(ExecutionContext executionContext)
-            throws IOException, InterruptedException {
-        stderr = executionContext.getStdErr();
-        boolean success = execute();
-        stderr = System.err;
-        return success ? StepExecutionResult.SUCCESS : StepExecutionResult.ERROR;
-    }
-
-    @Override
-    public String getShortName() {
-        return "osgiwrap";
-    }
-
-    @Override
-    public String getDescription(ExecutionContext executionContext) {
-        return "osgiwrap"; //FIXME
-    }
-}
diff --git a/tools/build/buck-plugin/src/main/java/org/onosproject/onosjar/OnosJar.java b/tools/build/buck-plugin/src/main/java/org/onosproject/onosjar/OnosJar.java
deleted file mode 100644
index b9ec3d6..0000000
--- a/tools/build/buck-plugin/src/main/java/org/onosproject/onosjar/OnosJar.java
+++ /dev/null
@@ -1,159 +0,0 @@
-/*
- * Copyright 2016-present Open Networking Foundation
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.onosproject.onosjar;
-
-import com.facebook.buck.jvm.java.CompileToJarStepFactory;
-import com.facebook.buck.jvm.java.DefaultJavaLibrary;
-import com.facebook.buck.jvm.java.HasMavenCoordinates;
-import com.facebook.buck.jvm.java.JavaLibrary;
-import com.facebook.buck.jvm.java.MavenPublishable;
-import com.facebook.buck.model.BuildTarget;
-import com.facebook.buck.rules.AddToRuleKey;
-import com.facebook.buck.rules.BuildRule;
-import com.facebook.buck.rules.BuildRuleParams;
-import com.facebook.buck.rules.SourcePath;
-import com.facebook.buck.rules.SourcePathResolver;
-import com.google.common.base.Optional;
-import com.google.common.collect.ImmutableList;
-import com.google.common.collect.ImmutableSet;
-import com.google.common.collect.ImmutableSortedMap;
-import com.google.common.collect.ImmutableSortedSet;
-
-import java.io.IOException;
-import java.math.BigInteger;
-import java.net.URL;
-import java.nio.file.Path;
-import java.security.DigestInputStream;
-import java.security.MessageDigest;
-import java.security.NoSuchAlgorithmException;
-import java.util.Set;
-import java.util.regex.Pattern;
-
-/**
- * Implementation of a build rule that generates a onosjar.json file for a set
- * of Java sources.
- */
-public class OnosJar extends DefaultJavaLibrary
-        implements MavenPublishable{
-
-    // Inject the SHA of this rule's jar into the rule key
-    private static String RULE_VERSION;
-    static {
-        URL pluginJarLocation = OnosJar.class.getProtectionDomain().getCodeSource().getLocation();
-        try {
-            MessageDigest md = MessageDigest.getInstance("SHA");
-            DigestInputStream dis = new DigestInputStream(pluginJarLocation.openStream(), md);
-            // Consume the InputStream...
-            while (dis.read() != -1);
-            RULE_VERSION = String.format("%032x", new BigInteger(1, md.digest()));
-        } catch (NoSuchAlgorithmException | IOException e) {
-            System.err.println("Failed to compute hash for OnosJar rule");
-            RULE_VERSION = "nil";
-            //TODO consider bailing here instead
-        }
-    }
-    @AddToRuleKey
-    private final String ruleVersion = RULE_VERSION;
-
-    @AddToRuleKey
-    final Optional<String> webContext;
-
-    @AddToRuleKey
-    final Optional<String> apiTitle;
-
-    @AddToRuleKey
-    final Optional<String> apiVersion;
-
-    @AddToRuleKey
-    final Optional<String> apiPackage;
-
-    @AddToRuleKey
-    final Optional<String> apiDescription;
-
-    @AddToRuleKey
-    final Optional<ImmutableSortedMap<String, SourcePath>> includedResources;
-
-    private final ImmutableSortedSet<HasMavenCoordinates> mavenDeps;
-
-    public OnosJar(BuildRuleParams params,
-                   SourcePathResolver resolver,
-                   Set<? extends SourcePath> srcs,
-                   Set<? extends SourcePath> resources,
-                   Optional<Path> generatedSourceFolder,
-                   Optional<SourcePath> proguardConfig,
-                   ImmutableList<String> postprocessClassesCommands,
-                   ImmutableSortedSet<BuildRule> exportedDeps,
-                   ImmutableSortedSet<BuildRule> providedDeps,
-                   SourcePath abiJar, boolean trackClassUsage,
-                   ImmutableSet<Path> additionalClasspathEntries,
-                   CompileToJarStepFactory compileStepFactory,
-                   Optional<Path> resourcesRoot,
-                   Optional<SourcePath> manifestFile,
-                   Optional<String> mavenCoords,
-                   ImmutableSortedSet<BuildTarget> tests,
-                   ImmutableSet<Pattern> classesToRemoveFromJar,
-                   Optional<String> webContext,
-                   Optional<String> apiTitle,
-                   Optional<String> apiVersion,
-                   Optional<String> apiPackage,
-                   Optional<String> apiDescription,
-                   Optional<ImmutableSortedMap<String, SourcePath>> includedResources) {
-        super(params, resolver, srcs, resources, generatedSourceFolder,
-              proguardConfig, postprocessClassesCommands, exportedDeps,
-              providedDeps, abiJar, trackClassUsage, additionalClasspathEntries,
-              compileStepFactory, resourcesRoot, manifestFile, mavenCoords,
-              tests, classesToRemoveFromJar);
-        this.webContext = webContext;
-        this.apiTitle = apiTitle;
-        this.apiVersion = apiVersion;
-        this.apiPackage = apiPackage;
-        this.apiDescription = apiDescription;
-        this.includedResources = includedResources;
-        this.mavenDeps = computeMavenDeps();
-    }
-
-    private ImmutableSortedSet<HasMavenCoordinates> computeMavenDeps() {
-        ImmutableSortedSet.Builder<HasMavenCoordinates> mavenDeps = ImmutableSortedSet.naturalOrder();
-        for (JavaLibrary javaLibrary : getTransitiveClasspathDeps()) {
-            if (this.equals(javaLibrary)) {
-                // no need to include ourself
-                continue;
-            } else if (HasMavenCoordinates.MAVEN_COORDS_PRESENT_PREDICATE.apply(javaLibrary)) {
-                mavenDeps.add(javaLibrary);
-                //FIXME BOC do we always want to exclude all of a maven jar's dependencies? probably.
-                mavenDeps.addAll(javaLibrary.getTransitiveClasspathDeps());
-            }
-        }
-        return mavenDeps.build();
-    }
-
-    @Override
-    public Iterable<HasMavenCoordinates> getMavenDeps() {
-        return mavenDeps;
-    }
-
-    @Override
-    public Iterable<BuildRule> getPackagedDependencies() {
-        //FIXME this is not supported at the moment
-        return ImmutableList.of();
-    }
-
-    @Override
-    public Optional<Path> getPomTemplate() {
-        //FIXME we should consider supporting this
-        return Optional.absent();
-    }
-}
diff --git a/tools/build/buck-plugin/src/main/java/org/onosproject/onosjar/OnosJarDescription.java b/tools/build/buck-plugin/src/main/java/org/onosproject/onosjar/OnosJarDescription.java
deleted file mode 100644
index 3f27760..0000000
--- a/tools/build/buck-plugin/src/main/java/org/onosproject/onosjar/OnosJarDescription.java
+++ /dev/null
@@ -1,335 +0,0 @@
-/*
- * Copyright 2016-present Open Networking Foundation
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.onosproject.onosjar;
-
-import com.facebook.buck.cli.BuckConfig;
-import com.facebook.buck.jvm.java.CalculateAbi;
-import com.facebook.buck.jvm.java.DefaultJavaLibrary;
-import com.facebook.buck.jvm.java.JavaBuckConfig;
-import com.facebook.buck.jvm.java.JavaLibrary;
-import com.facebook.buck.jvm.java.JavaLibraryDescription;
-import com.facebook.buck.jvm.java.JavaOptions;
-import com.facebook.buck.jvm.java.JavaSourceJar;
-import com.facebook.buck.jvm.java.JavacOptions;
-import com.facebook.buck.jvm.java.JavacOptionsAmender;
-import com.facebook.buck.jvm.java.JavacOptionsFactory;
-import com.facebook.buck.jvm.java.JavacToJarStepFactory;
-import com.facebook.buck.jvm.java.JavadocJar;
-import com.facebook.buck.jvm.java.MavenUberJar;
-import com.facebook.buck.maven.AetherUtil;
-import com.facebook.buck.model.BuildTarget;
-import com.facebook.buck.model.Flavor;
-import com.facebook.buck.model.Flavored;
-import com.facebook.buck.model.ImmutableFlavor;
-import com.facebook.buck.parser.NoSuchBuildTargetException;
-import com.facebook.buck.rules.BuildRule;
-import com.facebook.buck.rules.BuildRuleParams;
-import com.facebook.buck.rules.BuildRuleResolver;
-import com.facebook.buck.rules.BuildRuleType;
-import com.facebook.buck.rules.BuildRules;
-import com.facebook.buck.rules.BuildTargetSourcePath;
-import com.facebook.buck.rules.Description;
-import com.facebook.buck.rules.SourcePath;
-import com.facebook.buck.rules.SourcePathResolver;
-import com.facebook.buck.rules.SourcePaths;
-import com.facebook.buck.rules.TargetGraph;
-import com.google.common.base.Function;
-import com.google.common.base.Optional;
-import com.google.common.base.Preconditions;
-import com.google.common.collect.ImmutableSet;
-import com.google.common.collect.ImmutableSortedMap;
-import com.google.common.collect.ImmutableSortedSet;
-import com.google.common.collect.Iterables;
-import com.google.common.collect.Lists;
-
-import java.nio.file.Path;
-import java.util.List;
-
-import static com.facebook.buck.jvm.common.ResourceValidator.validateResources;
-
-/**
- * Description for the onos_jar rules.
- *
- * Currently, this only does Swagger generation.
- */
-public class OnosJarDescription implements Description<OnosJarDescription.Arg>, Flavored {
-    public static final BuildRuleType TYPE = BuildRuleType.of("onos_jar");
-    public static final Flavor NON_OSGI_JAR = ImmutableFlavor.of("non-osgi");
-
-    public static final ImmutableSet<Flavor> SUPPORTED_FLAVORS = ImmutableSet.of(
-            JavaLibrary.SRC_JAR,
-            JavaLibrary.MAVEN_JAR,
-            JavaLibrary.JAVADOC_JAR,
-            NON_OSGI_JAR);
-
-    private final JavacOptions defaultJavacOptions;
-    private final JavaOptions defaultJavaOptions;
-
-    public OnosJarDescription(BuckConfig config) {
-        JavaBuckConfig javaConfig = new JavaBuckConfig(config);
-        defaultJavacOptions = javaConfig.getDefaultJavacOptions();
-        defaultJavaOptions = javaConfig.getDefaultJavaOptions();
-    }
-
-    @Override
-    public BuildRuleType getBuildRuleType() {
-        return TYPE;
-    }
-
-    @Override
-    public Arg createUnpopulatedConstructorArg() {
-        return new Arg();
-    }
-
-    @Override
-    public <A extends Arg> BuildRule createBuildRule(TargetGraph targetGraph,
-                                                     BuildRuleParams params,
-                                                     BuildRuleResolver resolver,
-                                                     A args)
-            throws NoSuchBuildTargetException {
-
-
-        SourcePathResolver pathResolver = new SourcePathResolver(resolver);
-        BuildTarget target = params.getBuildTarget();
-
-        // We know that the flavour we're being asked to create is valid, since the check is done when
-        // creating the action graph from the target graph.
-
-        ImmutableSortedSet<Flavor> flavors = target.getFlavors();
-        BuildRuleParams paramsWithMavenFlavor = null;
-
-        if (flavors.contains(JavaLibrary.MAVEN_JAR)) {
-            paramsWithMavenFlavor = params;
-
-            // Maven rules will depend upon their vanilla versions, so the latter have to be constructed
-            // without the maven flavor to prevent output-path conflict
-            params = params.copyWithBuildTarget(
-                    params.getBuildTarget().withoutFlavors(ImmutableSet.of(JavaLibrary.MAVEN_JAR)));
-        }
-
-        if (flavors.contains(JavaLibrary.SRC_JAR)) {
-            args.mavenCoords = args.mavenCoords.transform(
-                    new Function<String, String>() {
-                        @Override
-                        public String apply(String input) {
-                            return AetherUtil.addClassifier(input, AetherUtil.CLASSIFIER_SOURCES);
-                        }
-                    });
-
-            if (!flavors.contains(JavaLibrary.MAVEN_JAR)) {
-                return new JavaSourceJar(
-                        params,
-                        pathResolver,
-                        args.srcs.get(),
-                        args.mavenCoords);
-            } else {
-                return MavenUberJar.SourceJar.create(
-                        Preconditions.checkNotNull(paramsWithMavenFlavor),
-                        pathResolver,
-                        args.srcs.get(),
-                        args.mavenCoords,
-                        Optional.absent()); //FIXME
-            }
-        }
-
-        if (flavors.contains(JavaLibrary.JAVADOC_JAR)) {
-            args.mavenCoords = args.mavenCoords.transform(
-                    new Function<String, String>() {
-                        @Override
-                        public String apply(String input) {
-                            return AetherUtil.addClassifier(input, AetherUtil.CLASSIFIER_JAVADOC);
-                        }
-                    });
-
-            JavadocJar.JavadocArgs.Builder javadocArgs = JavadocJar.JavadocArgs.builder()
-                    .addArg("-windowtitle", target.getShortName())
-                    .addArg("-link", "http://docs.oracle.com/javase/8/docs/api")
-                    .addArg("-tag", "onos.rsModel:a:\"onos model\""); //FIXME from buckconfig + rule
-
-            final ImmutableSortedMap.Builder<SourcePath, Path> javadocFiles = ImmutableSortedMap.naturalOrder();
-            if (args.javadocFiles.isPresent()) {
-                for (SourcePath path : args.javadocFiles.get()) {
-                    javadocFiles.put(path,
-                                     JavadocJar.getDocfileWithPath(pathResolver, path, args.javadocFilesRoot.orNull()));
-                }
-            }
-
-
-            if (!flavors.contains(JavaLibrary.MAVEN_JAR)) {
-                return new JavadocJar(
-                        params,
-                        pathResolver,
-                        args.srcs.get(),
-                        javadocFiles.build(),
-                        javadocArgs.build(),
-                        args.mavenCoords);
-            } else {
-                return MavenUberJar.MavenJavadocJar.create(
-                        Preconditions.checkNotNull(paramsWithMavenFlavor),
-                        pathResolver,
-                        args.srcs.get(),
-                        javadocFiles.build(),
-                        javadocArgs.build(),
-                        args.mavenCoords,
-                        Optional.absent()); //FIXME
-            }
-        }
-
-        JavacOptions javacOptions = JavacOptionsFactory.create(
-                defaultJavacOptions,
-                params,
-                resolver,
-                pathResolver,
-                args
-        );
-
-        BuildTarget abiJarTarget = params.getBuildTarget().withAppendedFlavors(CalculateAbi.FLAVOR);
-
-        ImmutableSortedSet<BuildRule> exportedDeps = resolver.getAllRules(args.exportedDeps.get());
-
-        // Build the resources string
-        List<String> resourceMappings = Lists.newArrayList();
-
-        if (args.includeResources.isPresent()) {
-            args.includeResources.get().entrySet().forEach(p ->
-                resourceMappings.add(String.format("%s=%s", p.getKey(), p.getValue())));
-        }
-
-        if (args.apiTitle.isPresent()) {
-            resourceMappings.add("WEB-INF/classes/apidoc/swagger.json=swagger.json");
-        }
-
-        Optional<String> includedResourcesString = Optional.of(String.join(",", resourceMappings));
-        final DefaultJavaLibrary defaultJavaLibrary;
-        if (!flavors.contains(NON_OSGI_JAR)) {
-            defaultJavaLibrary =
-                    resolver.addToIndex(
-                            new OnosJar(
-                                    params.appendExtraDeps(
-                                            Iterables.concat(
-                                                    BuildRules.getExportedRules(
-                                                            Iterables.concat(
-                                                                    params.getDeclaredDeps().get(),
-                                                                    exportedDeps,
-                                                                    resolver.getAllRules(args.providedDeps.get()))),
-                                                    pathResolver.filterBuildRuleInputs(
-                                                            javacOptions.getInputs(pathResolver)))),
-                                    pathResolver,
-                                    args.srcs.get(),
-                                    validateResources(
-                                            pathResolver,
-                                            params.getProjectFilesystem(),
-                                            args.resources.get()),
-                                    javacOptions.getGeneratedSourceFolderName(),
-                                    args.proguardConfig.transform(
-                                            SourcePaths.toSourcePath(params.getProjectFilesystem())),
-                                    args.postprocessClassesCommands.get(), // FIXME this should be forbidden
-                                    exportedDeps,
-                                    resolver.getAllRules(args.providedDeps.get()),
-                                    new BuildTargetSourcePath(abiJarTarget),
-                                    javacOptions.trackClassUsage(),
-                                /* additionalClasspathEntries */ ImmutableSet.<Path>of(),
-                                    new OnosJarStepFactory(javacOptions, JavacOptionsAmender.IDENTITY,
-                                                           args.webContext, args.apiTitle, args.apiVersion,
-                                                           args.apiPackage, args.apiDescription, args.resources,
-                                                           args.groupId, args.bundleName, args.bundleVersion,
-                                                           args.bundleLicense, args.bundleDescription, args.importPackages,
-                                                           args.exportPackages, includedResourcesString,
-                                                           args.dynamicimportPackages, args.privatePackages, args.embeddedDependencies, args.bundleClasspath),
-                                    args.resourcesRoot,
-                                    args.manifestFile,
-                                    args.mavenCoords,
-                                    args.tests.get(),
-                                    javacOptions.getClassesToRemoveFromJar(),
-                                    args.webContext,
-                                    args.apiTitle,
-                                    args.apiVersion,
-                                    args.apiPackage,
-                                    args.apiDescription,
-                                    args.includeResources));
-        } else {
-            defaultJavaLibrary =
-                    resolver.addToIndex(
-                            new DefaultJavaLibrary(
-                                    params.appendExtraDeps(
-                                            Iterables.concat(
-                                                    BuildRules.getExportedRules(
-                                                            Iterables.concat(
-                                                                    params.getDeclaredDeps().get(),
-                                                                    exportedDeps,
-                                                                    resolver.getAllRules(args.providedDeps.get()))),
-                                                    pathResolver.filterBuildRuleInputs(
-                                                            javacOptions.getInputs(pathResolver)))),
-                                    pathResolver,
-                                    args.srcs.get(),
-                                    validateResources(
-                                            pathResolver,
-                                            params.getProjectFilesystem(),
-                                            args.resources.get()),
-                                    javacOptions.getGeneratedSourceFolderName(),
-                                    args.proguardConfig.transform(
-                                            SourcePaths.toSourcePath(params.getProjectFilesystem())),
-                                    args.postprocessClassesCommands.get(),
-                                    exportedDeps,
-                                    resolver.getAllRules(args.providedDeps.get()),
-                                    new BuildTargetSourcePath(abiJarTarget),
-                                    javacOptions.trackClassUsage(),
-                                    /* additionalClasspathEntries */ ImmutableSet.<Path>of(),
-                                    new JavacToJarStepFactory(javacOptions, JavacOptionsAmender.IDENTITY),
-                                    args.resourcesRoot,
-                                    args.manifestFile,
-                                    args.mavenCoords,
-                                    args.tests.get(),
-                                    javacOptions.getClassesToRemoveFromJar()));
-        }
-
-        resolver.addToIndex(
-                CalculateAbi.of(
-                        abiJarTarget,
-                        pathResolver,
-                        params,
-                        new BuildTargetSourcePath(defaultJavaLibrary.getBuildTarget())));
-
-        return defaultJavaLibrary;
-    }
-
-    @Override
-    public boolean hasFlavors(ImmutableSet<Flavor> flavors) {
-        return SUPPORTED_FLAVORS.containsAll(flavors);
-    }
-
-    public static class Arg extends JavaLibraryDescription.Arg {
-        public Optional<String> webContext;
-        public Optional<String> apiTitle;
-        public Optional<String> apiVersion;
-        public Optional<String> apiPackage;
-        public Optional<String> apiDescription;
-
-        public Optional<String> groupId;
-        public Optional<String> bundleName;
-        public Optional<String> bundleVersion;
-        public Optional<String> bundleLicense;
-        public Optional<String> bundleDescription;
-
-        public Optional<String> importPackages;
-        public Optional<String> privatePackages;
-        public Optional<String> exportPackages;
-        public Optional<ImmutableSortedMap<String, SourcePath>> includeResources;
-        public Optional<String> dynamicimportPackages;
-        public Optional<String> embeddedDependencies;
-        public Optional<String> bundleClasspath;
-    }
-}
\ No newline at end of file
diff --git a/tools/build/buck-plugin/src/main/java/org/onosproject/onosjar/OnosJarStepFactory.java b/tools/build/buck-plugin/src/main/java/org/onosproject/onosjar/OnosJarStepFactory.java
deleted file mode 100644
index 6550d89..0000000
--- a/tools/build/buck-plugin/src/main/java/org/onosproject/onosjar/OnosJarStepFactory.java
+++ /dev/null
@@ -1,227 +0,0 @@
-/*
- * Copyright 2016-present Open Networking Foundation
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.onosproject.onosjar;
-
-import com.facebook.buck.io.ProjectFilesystem;
-import com.facebook.buck.jvm.core.SuggestBuildRules;
-import com.facebook.buck.jvm.java.ClassUsageFileWriter;
-import com.facebook.buck.jvm.java.JarDirectoryStep;
-import com.facebook.buck.jvm.java.JavacOptions;
-import com.facebook.buck.jvm.java.JavacOptionsAmender;
-import com.facebook.buck.jvm.java.JavacToJarStepFactory;
-import com.facebook.buck.model.BuildTarget;
-import com.facebook.buck.rules.BuildContext;
-import com.facebook.buck.rules.BuildableContext;
-import com.facebook.buck.rules.SourcePath;
-import com.facebook.buck.rules.SourcePathResolver;
-import com.facebook.buck.step.Step;
-import com.facebook.buck.step.fs.CopyStep;
-import com.google.common.base.Optional;
-import com.google.common.collect.ImmutableList;
-import com.google.common.collect.ImmutableSet;
-import com.google.common.collect.ImmutableSortedSet;
-
-import java.nio.file.Path;
-import java.nio.file.Paths;
-import java.util.regex.Pattern;
-import java.util.stream.Collectors;
-
-/**
- * Creates the list of build steps for the onos_jar rules.
- */
-public class OnosJarStepFactory extends JavacToJarStepFactory {
-
-    private static final String DEFINITIONS = "/definitions/";
-    private final String webContext;
-    private final String apiTitle;
-    private final String apiVersion;
-    private final String apiPackage;
-    private final String apiDescription;
-    private final Optional<ImmutableSortedSet<SourcePath>> resources;
-    private final String groupId;
-    private final String bundleName;
-    private final String bundleVersion;
-    private final String bundleLicense;
-    private final String bundleDescription;
-    private final String importPackages;
-    private final String privatePackages;
-    private final String exportPackages;
-    private final String includeResources;
-    private final String dynamicimportPackages;
-    private final String embeddedDependencies;
-    private final String bundleClasspath;
-
-    public OnosJarStepFactory(JavacOptions javacOptions,
-                              JavacOptionsAmender amender,
-                              Optional<String> webContext,
-                              Optional<String> apiTitle,
-                              Optional<String> apiVersion,
-                              Optional<String> apiPackage,
-                              Optional<String> apiDescription,
-                              Optional<ImmutableSortedSet<SourcePath>> resources,
-                              Optional<String> groupId,
-                              Optional<String> bundleName,
-                              Optional<String> bundleVersion,
-                              Optional<String> bundleLicense,
-                              Optional<String> bundleDescription,
-                              Optional<String> importPackages,
-                              Optional<String> exportPackages,
-                              Optional<String> includeResources,
-                              Optional<String> dynamicimportPackages,
-                              Optional<String> privatePackages,
-                              Optional<String> embeddedDependencies,
-                              Optional<String> bundleClasspath) {
-        super(javacOptions, amender);
-        this.bundleDescription = processParameter(bundleDescription);
-        this.importPackages = processParameter(importPackages);
-        this.privatePackages = processParameter(privatePackages);
-        this.exportPackages = processParameter(exportPackages);
-        this.includeResources = processParameter(includeResources);
-        this.dynamicimportPackages = processParameter(dynamicimportPackages);
-        this.groupId = processParameter(groupId);
-        this.bundleName = processParameter(bundleName);
-        this.bundleVersion = processParameter(bundleVersion);
-        this.bundleLicense = processParameter(bundleLicense);
-        this.webContext = processParameter(webContext);
-        this.apiTitle = processParameter(apiTitle);
-        this.apiVersion = processParameter(apiVersion);
-        this.apiPackage = processParameter(apiPackage);
-        this.apiDescription = processParameter(apiDescription);
-        this.resources = resources;
-        this.embeddedDependencies = processParameter(embeddedDependencies);
-        this.bundleClasspath = processParameter(bundleClasspath);
-    }
-
-    private String processParameter(Optional<String> p) {
-        return !p.isPresent() || p.get().equals("NONE") ? null : p.get();
-    }
-
-    @Override
-    public void createCompileToJarStep(BuildContext context,
-                                       ImmutableSortedSet<Path> sourceFilePaths,
-                                       BuildTarget invokingRule,
-                                       SourcePathResolver resolver,
-                                       ProjectFilesystem filesystem,
-                                       ImmutableSortedSet<Path> declaredClasspathEntries,
-                                       Path outputDirectory,
-                                       Optional<Path> workingDirectory,
-                                       Path pathToSrcsList,
-                                       Optional<SuggestBuildRules> suggestBuildRules,
-                                       ImmutableList<String> postprocessClassesCommands,
-                                       ImmutableSortedSet<Path> entriesToJar,
-                                       Optional<String> mainClass,
-                                       Optional<Path> manifestFile,
-                                       Path outputJar,
-                                       ClassUsageFileWriter usedClassesFileWriter,
-                                       ImmutableList.Builder<Step> steps,
-                                       BuildableContext buildableContext,
-                                       ImmutableSet<Pattern> classesToRemoveFromJar) {
-
-        ImmutableSet.Builder<Path> sourceFilePathBuilder = ImmutableSet.builder();
-        sourceFilePathBuilder.addAll(sourceFilePaths);
-
-        ImmutableSet.Builder<Pattern> blacklistBuilder = ImmutableSet.builder();
-        blacklistBuilder.addAll(classesToRemoveFromJar);
-
-        // precompilation steps
-        //   - generate sources
-        //     add all generated sources ot pathToSrcsList
-        if (webContext != null && apiTitle != null && resources.isPresent()) {
-            ImmutableSortedSet<Path> resourceFilePaths = findSwaggerModelDefs(resolver, resources.get());
-            blacklistBuilder.addAll(resourceFilePaths.stream()
-                                            .map(rp -> Pattern.compile(rp.getFileName().toString(), Pattern.LITERAL))
-                                            .collect(Collectors.toSet()));
-            Path genSourcesOutput = workingDirectory.get();
-
-            SwaggerStep swaggerStep = new SwaggerStep(filesystem, sourceFilePaths, resourceFilePaths,
-                                                      genSourcesOutput, outputDirectory,
-                                                      webContext, apiTitle, apiVersion,
-                                                      apiPackage, apiDescription);
-            sourceFilePathBuilder.add(swaggerStep.apiRegistratorPath());
-            steps.add(swaggerStep);
-
-//            steps.addAll(sourceFilePaths.stream()
-//                    .filter(sp -> sp.startsWith("src/main/webapp/"))
-//                    .map(sp -> CopyStep.forFile(filesystem, sp, outputDirectory))
-//                    .iterator());
-        }
-
-        createCompileStep(context,
-                          ImmutableSortedSet.copyOf(sourceFilePathBuilder.build()),
-                          invokingRule,
-                          resolver,
-                          filesystem,
-                          declaredClasspathEntries,
-                          outputDirectory,
-                          workingDirectory,
-                          pathToSrcsList,
-                          suggestBuildRules,
-                          usedClassesFileWriter,
-                          steps,
-                          buildableContext);
-
-        // post compilation steps
-
-
-        // FIXME BOC: add mechanism to inject new Steps
-        //context.additionalStepFactory(JavaStep.class);
-
-        // build the jar
-        steps.add(new JarDirectoryStep(filesystem,
-                                       outputJar,
-                                       ImmutableSortedSet.of(outputDirectory),
-                                       mainClass.orNull(),
-                                       manifestFile.orNull(),
-                                       true,
-                                       blacklistBuilder.build()));
-
-        OSGiWrapper osgiStep = new OSGiWrapper(
-                outputJar, //input jar
-                outputJar, //Paths.get(outputJar.toString() + ".jar"), //output jar
-                invokingRule.getBasePath(), // sources dir
-                outputDirectory, // classes dir
-                declaredClasspathEntries, // classpath
-                bundleName, // bundle name
-                groupId, // groupId
-                bundleVersion, // bundle version
-                bundleLicense, // bundle license
-                importPackages, // import packages
-                exportPackages, // export packages
-                includeResources, // include resources
-                webContext, // web context
-                dynamicimportPackages, // dynamic import packages
-                embeddedDependencies, // embedded dependencies
-                bundleDescription,  // bundle description
-                privatePackages, // private packages
-                bundleClasspath // bundle classpath
-        );
-        steps.add(osgiStep);
-
-        //steps.add(CopyStep.forFile(filesystem, Paths.get(outputJar.toString() + ".jar"), outputJar));
-
-    }
-
-    private ImmutableSortedSet<Path> findSwaggerModelDefs(SourcePathResolver resolver,
-                                                          ImmutableSortedSet<SourcePath> resourcePaths) {
-        if (resourcePaths == null) {
-            return ImmutableSortedSet.of();
-        }
-        return ImmutableSortedSet.copyOf(resourcePaths.stream()
-                                                 .filter(sp -> sp.toString().contains(DEFINITIONS))
-                                                 .map(resolver::getRelativePath)
-                                                 .collect(Collectors.toList()));
-    }
-}
diff --git a/tools/build/buck-plugin/src/main/java/org/onosproject/onosjar/ProjectJavadocDescription.java b/tools/build/buck-plugin/src/main/java/org/onosproject/onosjar/ProjectJavadocDescription.java
deleted file mode 100644
index 12cf48e..0000000
--- a/tools/build/buck-plugin/src/main/java/org/onosproject/onosjar/ProjectJavadocDescription.java
+++ /dev/null
@@ -1,156 +0,0 @@
-/*
- * Copyright 2016-present Open Networking Foundation
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.onosproject.onosjar;
-
-import com.facebook.buck.cli.BuckConfig;
-import com.facebook.buck.jvm.java.JavaLibrary;
-import com.facebook.buck.jvm.java.JavadocJar;
-import com.facebook.buck.model.BuildTarget;
-import com.facebook.buck.model.Flavor;
-import com.facebook.buck.model.Flavored;
-import com.facebook.buck.model.Pair;
-import com.facebook.buck.parser.NoSuchBuildTargetException;
-import com.facebook.buck.rules.BuildRule;
-import com.facebook.buck.rules.BuildRuleParams;
-import com.facebook.buck.rules.BuildRuleResolver;
-import com.facebook.buck.rules.BuildRuleType;
-import com.facebook.buck.rules.Description;
-import com.facebook.buck.rules.SourcePath;
-import com.facebook.buck.rules.SourcePathResolver;
-import com.facebook.buck.rules.TargetGraph;
-import com.google.common.base.Optional;
-import com.google.common.base.Suppliers;
-import com.google.common.collect.FluentIterable;
-import com.google.common.collect.ImmutableList;
-import com.google.common.collect.ImmutableSet;
-import com.google.common.collect.ImmutableSortedMap;
-import com.google.common.collect.ImmutableSortedSet;
-import com.google.common.collect.Ordering;
-
-import java.nio.file.Path;
-import java.util.Map;
-
-/**
- * Description for the onos_jar rules.
- *
- * Currently, this only does Swagger generation.
- */
-public class ProjectJavadocDescription implements Description<ProjectJavadocDescription.Arg>, Flavored {
-    public static final BuildRuleType TYPE = BuildRuleType.of("project_javadoc");
-
-    public ProjectJavadocDescription(BuckConfig config) {
-        //TODO
-    }
-
-    @Override
-    public BuildRuleType getBuildRuleType() {
-        return TYPE;
-    }
-
-    @Override
-    public Arg createUnpopulatedConstructorArg() {
-        return new Arg();
-    }
-
-    @Override
-    public <A extends Arg> BuildRule createBuildRule(TargetGraph targetGraph,
-                                                     BuildRuleParams params,
-                                                     BuildRuleResolver resolver,
-                                                     A args)
-            throws NoSuchBuildTargetException {
-
-        ImmutableSet.Builder<SourcePath> srcs = ImmutableSet.builder();
-        ImmutableSet.Builder<BuildRule> deps = ImmutableSet.builder();
-        ImmutableSortedMap.Builder<SourcePath, Path> docfiles = ImmutableSortedMap.naturalOrder();
-        for(BuildTarget dep : args.deps) {
-            BuildRule rule = resolver.requireRule(dep.withFlavors(JavaLibrary.JAVADOC_JAR));
-            if (rule instanceof JavadocJar) {
-                JavadocJar jarRule = (JavadocJar) rule;
-                srcs.addAll(jarRule.getSources());
-                deps.addAll(jarRule.getDeps());
-                docfiles.putAll(jarRule.getDocFiles());
-            } else {
-                throw new RuntimeException("rule is not a javalib"); //FIXME
-            }
-        }
-
-        BuildRuleParams newParams = params.copyWithDeps(
-                Suppliers.ofInstance(
-                    FluentIterable.from(deps.build())
-                                  .toSortedSet(Ordering.<BuildRule>natural())),
-                Suppliers.ofInstance(ImmutableSortedSet.<BuildRule>of()));
-
-        SourcePathResolver sourceResolver = new SourcePathResolver(resolver);
-        ImmutableList.Builder<SourcePath> auxSources = ImmutableList.builder();
-
-        JavadocJar.JavadocArgs.Builder javadocArgs = JavadocJar.JavadocArgs.builder()
-                .addArg("-windowtitle", args.projectTitle)
-                .addArg("-doctitle", args.projectTitle)
-                .addArg("-link", "http://docs.oracle.com/javase/8/docs/api")
-                .addArg("-tag", "onos.rsModel:a:\"onos model\""); //FIXME from buckconfig + rule
-
-        if (args.groups.isPresent()) {
-            for (Pair<String, ImmutableList<String>> pair : args.groups.get()) {
-                javadocArgs.addArg("-group", pair.getFirst(), pair.getSecond());
-            }
-        }
-
-        if (args.excludePackages.isPresent() &&
-                !args.excludePackages.get().isEmpty()) {
-            javadocArgs.addArg("-exclude", args.excludePackages.get());
-        }
-
-        if (args.overview.isPresent()) {
-            javadocArgs.addArg("-overview",
-                   sourceResolver.getAbsolutePath(args.overview.get()).toString());
-
-        }
-
-        if (args.javadocFiles.isPresent()) {
-            for (SourcePath path : args.javadocFiles.get()) {
-                docfiles.put(path,
-                             JavadocJar.getDocfileWithPath(sourceResolver, path, args.javadocFilesRoot.orNull()));
-            }
-        }
-
-
-        JavadocJar javadocJar =  new JavadocJar(newParams,
-                              sourceResolver,
-                              ImmutableSortedSet.copyOf(srcs.build()),
-                              docfiles.build(),
-                              javadocArgs.build(),
-                              /* mavenCoords */ Optional.absent());
-        return javadocJar;
-
-    }
-
-    @Override
-    public boolean hasFlavors(ImmutableSet<Flavor> flavors) {
-        return false;
-    }
-
-    public static class Arg {
-        public ImmutableSortedSet<BuildTarget> deps;
-        public String projectTitle;
-
-        public Optional<SourcePath> overview;
-        public Optional<ImmutableSortedSet<SourcePath>> javadocFiles;
-        public Optional<Path> javadocFilesRoot;
-
-        public Optional<ImmutableList<String>> excludePackages;
-        public Optional<ImmutableList<Pair<String, ImmutableList<String>>>> groups;
-    }
-}
\ No newline at end of file
diff --git a/tools/build/buck-plugin/src/main/java/org/onosproject/onosjar/SwaggerGenerator.java b/tools/build/buck-plugin/src/main/java/org/onosproject/onosjar/SwaggerGenerator.java
deleted file mode 100644
index 518bf8c..0000000
--- a/tools/build/buck-plugin/src/main/java/org/onosproject/onosjar/SwaggerGenerator.java
+++ /dev/null
@@ -1,566 +0,0 @@
-/*
- * Copyright 2016-present Open Networking Foundation
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.onosproject.onosjar;
-
-import com.fasterxml.jackson.databind.ObjectMapper;
-import com.fasterxml.jackson.databind.node.ArrayNode;
-import com.fasterxml.jackson.databind.node.ObjectNode;
-import com.google.common.collect.ImmutableList;
-import com.google.common.io.ByteStreams;
-import com.google.common.io.Files;
-import com.thoughtworks.qdox.JavaProjectBuilder;
-import com.thoughtworks.qdox.model.DocletTag;
-import com.thoughtworks.qdox.model.JavaAnnotation;
-import com.thoughtworks.qdox.model.JavaClass;
-import com.thoughtworks.qdox.model.JavaMethod;
-import com.thoughtworks.qdox.model.JavaParameter;
-import com.thoughtworks.qdox.model.JavaType;
-
-import java.io.File;
-import java.io.FileWriter;
-import java.io.IOException;
-import java.io.PrintWriter;
-import java.time.Year;
-import java.util.Arrays;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Optional;
-
-import static com.google.common.base.Strings.isNullOrEmpty;
-
-/**
- * Generates Swagger JSON artifacts from the Java source files.
- */
-public class SwaggerGenerator {
-
-    private final ObjectMapper mapper = new ObjectMapper();
-
-    private static final String JSON_FILE = "swagger.json";
-    private static final String GEN_SRC = "generated-sources";
-    private static final String REG_SRC = "/registrator.javat";
-
-    private static final String PATH = "javax.ws.rs.Path";
-    private static final String PATH_PARAM = "javax.ws.rs.PathParam";
-    private static final String QUERY_PARAM = "javax.ws.rs.QueryParam";
-    private static final String POST = "javax.ws.rs.POST";
-    private static final String PATCH = "javax.ws.rs.PATCH";
-    private static final String GET = "javax.ws.rs.GET";
-    private static final String PUT = "javax.ws.rs.PUT";
-    private static final String DELETE = "javax.ws.rs.DELETE";
-    private static final String PRODUCES = "javax.ws.rs.Produces";
-    private static final String CONSUMES = "javax.ws.rs.Consumes";
-    private static final String JSON = "MediaType.APPLICATION_JSON";
-    private static final String OCTET_STREAM = "MediaType.APPLICATION_OCTET_STREAM";
-    private static final String RESPONSES = "io.swagger.annotations.ApiResponses";
-
-    private final List<File> srcs;
-    private final List<File> resources;
-    private final File srcDirectory;
-    private final File resourceDirectory;
-    private final File genSrcOutputDirectory;
-    private final File genResourcesOutputDirectory;
-    private final String webContext;
-    private final String apiTitle;
-    private final String apiVersion;
-    private final String apiPackage;
-    private final String apiDescription;
-
-    private String x(File f) {
-        return f == null ? "null" : f.getAbsolutePath();
-    }
-
-    public SwaggerGenerator(List<File> srcs, List<File> resources,
-                            File srcDirectory, File resourceDirectory,
-                            File genSrcOutputDirectory, File genResourcesOutputDirectory,
-                            String webContext, String apiTitle, String apiVersion,
-                            String apiPackage, String apiDescription) {
-        this.srcs = srcs;
-        this.resources = resources;
-        this.srcDirectory = srcDirectory;
-        this.resourceDirectory = resourceDirectory;
-        this.genSrcOutputDirectory = genSrcOutputDirectory;
-        this.genResourcesOutputDirectory = genResourcesOutputDirectory;
-        this.webContext = webContext;
-
-        this.apiTitle = apiTitle;
-        this.apiVersion = apiVersion;
-        this.apiPackage = apiPackage;
-        this.apiDescription = apiDescription;
-    }
-
-    public void execute() {
-        try {
-            JavaProjectBuilder builder = new JavaProjectBuilder();
-            if (srcDirectory != null) {
-                builder.addSourceTree(new File(srcDirectory, "src/main/java"));
-            }
-            if (srcs != null) {
-                srcs.forEach(src -> {
-                    if (src.toString().endsWith(".java")) {
-                        try {
-                            builder.addSource(src);
-                        } catch (IOException e) {
-                            throw new RuntimeException(e);
-                        }
-                    }
-                });
-            }
-
-            ObjectNode root = initializeRoot(webContext, apiTitle, apiVersion, apiDescription);
-            ArrayNode tags = mapper.createArrayNode();
-            ObjectNode paths = mapper.createObjectNode();
-            ObjectNode definitions = mapper.createObjectNode();
-
-            root.set("tags", tags);
-            root.set("paths", paths);
-            root.set("definitions", definitions);
-
-            // TODO: Process resources to allow lookup of files by name
-
-            builder.getClasses().forEach(jc -> processClass(jc, paths, tags, definitions, srcDirectory));
-
-            if (paths.size() > 0) {
-                genCatalog(genResourcesOutputDirectory, root);
-                if (!isNullOrEmpty(apiPackage)) {
-                    genRegistrator(genSrcOutputDirectory, webContext, apiTitle, apiVersion,
-                                   apiPackage, apiDescription);
-                }
-            }
-        } catch (Exception e) {
-            e.printStackTrace();
-            throw new RuntimeException("Unable to generate ONOS REST API documentation", e);
-        }
-    }
-
-    // initializes top level root with Swagger required specifications
-    private ObjectNode initializeRoot(String webContext, String apiTitle,
-                                      String apiVersion, String apiDescription) {
-        ObjectNode root = mapper.createObjectNode();
-        root.put("swagger", "2.0");
-        ObjectNode info = mapper.createObjectNode();
-        root.set("info", info);
-
-        root.put("basePath", webContext);
-        info.put("version", apiVersion);
-        info.put("title", apiTitle);
-        info.put("description", apiDescription);
-
-        ArrayNode produces = mapper.createArrayNode();
-        produces.add("application/json");
-        root.set("produces", produces);
-
-        ArrayNode consumes = mapper.createArrayNode();
-        consumes.add("application/json");
-        root.set("consumes", consumes);
-
-        return root;
-    }
-
-    // Checks whether javaClass has a path tag associated with it and if it does
-    // processes its methods and creates a tag for the class on the root
-    void processClass(JavaClass javaClass, ObjectNode paths, ArrayNode tags,
-                      ObjectNode definitions, File srcDirectory) {
-        // If the class does not have a Path tag then ignore it
-        JavaAnnotation annotation = getPathAnnotation(javaClass);
-        if (annotation == null) {
-            return;
-        }
-
-        String path = getPath(annotation);
-        if (path == null) {
-            return;
-        }
-
-        String resourcePath = "/" + path;
-        String tagPath = path.isEmpty() ? "/" : path;
-
-        // Create tag node for this class.
-        ObjectNode tagObject = mapper.createObjectNode();
-        tagObject.put("name", tagPath);
-        if (javaClass.getComment() != null) {
-            tagObject.put("description", shortText(javaClass.getComment()));
-        }
-        tags.add(tagObject);
-
-        // Create an array node add to all methods from this class.
-        ArrayNode tagArray = mapper.createArrayNode();
-        tagArray.add(tagPath);
-
-        processAllMethods(javaClass, resourcePath, paths, tagArray, definitions, srcDirectory);
-    }
-
-    private JavaAnnotation getPathAnnotation(JavaClass javaClass) {
-        Optional<JavaAnnotation> optional = javaClass.getAnnotations()
-                .stream().filter(a -> a.getType().getName().equals(PATH)).findAny();
-        return optional.orElse(null);
-    }
-
-    // Checks whether a class's methods are REST methods and then places all the
-    // methods under a specific path into the paths node
-    private void processAllMethods(JavaClass javaClass, String resourcePath,
-                                   ObjectNode paths, ArrayNode tagArray, ObjectNode definitions,
-                                   File srcDirectory) {
-        // map of the path to its methods represented by an ObjectNode
-        Map<String, ObjectNode> pathMap = new HashMap<>();
-
-        javaClass.getMethods().forEach(javaMethod -> {
-            javaMethod.getAnnotations().forEach(annotation -> {
-                String name = annotation.getType().getName();
-                if (name.equals(PATCH) || name.equals(POST) || name.equals(GET) || name.equals(DELETE) ||
-                        name.equals(PUT)) {
-                    // substring(12) removes "javax.ws.rs."
-                    String method = annotation.getType().toString().substring(12).toLowerCase();
-                    processRestMethod(javaMethod, method, pathMap, resourcePath, tagArray, definitions, srcDirectory);
-                }
-            });
-        });
-
-        // for each path add its methods to the path node
-        for (Map.Entry<String, ObjectNode> entry : pathMap.entrySet()) {
-            paths.set(entry.getKey(), entry.getValue());
-        }
-
-
-    }
-
-    private void processRestMethod(JavaMethod javaMethod, String method,
-                                   Map<String, ObjectNode> pathMap,
-                                   String resourcePath, ArrayNode tagArray,
-                                   ObjectNode definitions, File srcDirectory) {
-        String fullPath = resourcePath, consumes = "", produces = "",
-                comment = javaMethod.getComment();
-        DocletTag tag = javaMethod.getTagByName("onos.rsModel");
-        for (JavaAnnotation annotation : javaMethod.getAnnotations()) {
-            String name = annotation.getType().getName();
-            if (name.equals(PATH)) {
-                fullPath = resourcePath + "/" + getPath(annotation);
-                fullPath = fullPath.replaceFirst("^//", "/");
-            }
-            if (name.equals(CONSUMES)) {
-                consumes = getIOType(annotation);
-            }
-            if (name.equals(PRODUCES)) {
-                produces = getIOType(annotation);
-            }
-        }
-        ObjectNode methodNode = mapper.createObjectNode();
-        methodNode.set("tags", tagArray);
-
-        addSummaryDescriptions(methodNode, comment);
-        addJsonSchemaDefinition(srcDirectory, definitions, tag);
-
-        processParameters(javaMethod, methodNode, method, tag);
-
-        processConsumesProduces(methodNode, "consumes", consumes);
-        processConsumesProduces(methodNode, "produces", produces);
-        if (tag == null || !(tag.getParameters().size() > 1)) {
-            addResponses(javaMethod, methodNode, tag, false);
-        } else {
-            addResponses(javaMethod, methodNode, tag, true);
-        }
-
-        ObjectNode operations = pathMap.get(fullPath);
-        if (operations == null) {
-            operations = mapper.createObjectNode();
-            operations.set(method, methodNode);
-            pathMap.put(fullPath, operations);
-        } else {
-            operations.set(method, methodNode);
-        }
-    }
-
-    private void addJsonSchemaDefinition(File srcDirectory, ObjectNode definitions, DocletTag tag) {
-        final File definitionsDirectory;
-        if (resourceDirectory != null) {
-            definitionsDirectory = new File(resourceDirectory, "definitions");
-        } else if (srcDirectory != null) {
-            definitionsDirectory = new File(srcDirectory + "/src/main/resources/definitions");
-        } else {
-            definitionsDirectory = null;
-        }
-        if (tag != null) {
-            tag.getParameters().forEach(param -> {
-                try {
-                    File config;
-                    if (definitionsDirectory != null) {
-                        config = new File(definitionsDirectory.getAbsolutePath() + "/" + param + ".json");
-                    } else {
-                        config = resources.stream().filter(f -> f.getName().equals(param + ".json")).findFirst().orElse(null);
-                    }
-                    definitions.set(param, mapper.readTree(config));
-                } catch (IOException e) {
-                    throw new RuntimeException(String.format("Could not process %s in %s@%s: %s",
-                                                             tag.getName(), tag.getContext(), tag.getLineNumber(),
-                                                             e.getMessage()), e);
-                }
-            });
-        }
-    }
-
-    private void processConsumesProduces(ObjectNode methodNode, String type, String io) {
-        if (!io.equals("")) {
-            ArrayNode array = mapper.createArrayNode();
-            methodNode.set(type, array);
-            array.add(io);
-        }
-    }
-
-    private void addSummaryDescriptions(ObjectNode methodNode, String comment) {
-        String summary = "", description;
-        if (comment != null) {
-            if (comment.contains(".")) {
-                int periodIndex = comment.indexOf(".");
-                summary = comment.substring(0, periodIndex);
-                description = comment.length() > periodIndex + 1 ?
-                        comment.substring(periodIndex + 1).trim() : "";
-            } else {
-                description = comment;
-            }
-            methodNode.put("summary", summary);
-            methodNode.put("description", description);
-        }
-    }
-
-    private Optional<JavaAnnotation> getResponsesAnnotation(JavaMethod javaMethod) {
-        return javaMethod.getAnnotations().stream().filter(
-                a -> a.getType().getName().equals(RESPONSES)
-        ).findAny();
-    }
-
-    // TODO: add json schema for responses
-    private void addResponses(JavaMethod javaMethod, ObjectNode methodNode, DocletTag tag, boolean responseJson) {
-        ObjectNode responses = mapper.createObjectNode();
-        methodNode.set("responses", responses);
-
-        Optional<JavaAnnotation> responsesAnnotation = getResponsesAnnotation(javaMethod);
-
-        if (responsesAnnotation.isPresent()) {
-            Object annotationsObj = responsesAnnotation.get().getNamedParameter("value");
-            if (annotationsObj != null && annotationsObj instanceof List) {
-                List<JavaAnnotation> responseAnnotation = (List<JavaAnnotation>) annotationsObj;
-                responseAnnotation.forEach(
-                        javaAnnotation -> {
-                            ObjectNode response = mapper.createObjectNode();
-                            response.put("description",
-                                    String.valueOf(javaAnnotation.getNamedParameter("message"))
-                                            .replaceAll("^\"|\"$", ""));
-                            responses.set(String.valueOf(javaAnnotation.getNamedParameter("code")), response);
-                        }
-                );
-            }
-        } else {
-            ObjectNode success = mapper.createObjectNode();
-            success.put("description", "successful operation");
-            responses.set("200", success);
-
-            ObjectNode defaultObj = mapper.createObjectNode();
-            defaultObj.put("description", "Unexpected error");
-            responses.set("default", defaultObj);
-
-            if (tag != null && responseJson) {
-                ObjectNode schema = mapper.createObjectNode();
-                tag.getParameters().stream().forEach(
-                        param -> schema.put("$ref", "#/definitions/" + param));
-                success.set("schema", schema);
-            }
-        }
-    }
-
-    // Checks if the annotations has a value of JSON and returns the string
-    // that Swagger requires
-    private String getIOType(JavaAnnotation annotation) {
-        if (annotation.getNamedParameter("value").toString().equals(JSON)) {
-            return "application/json";
-        } else if (annotation.getNamedParameter("value").toString().equals(OCTET_STREAM)) {
-            return "application/octet_stream";
-        }
-        return "";
-    }
-
-    // If the annotation has a Path tag, returns the value with leading and
-    // trailing double quotes and slash removed.
-    private String getPath(JavaAnnotation annotation) {
-        String path = annotation.getNamedParameter("value").toString();
-        return path == null ? null : path.replaceAll("(^[\\\"/]*|[/\\\"]*$)", "");
-    }
-
-    // Processes parameters of javaMethod and enters the proper key-values into the methodNode
-    private void processParameters(JavaMethod javaMethod, ObjectNode methodNode, String method, DocletTag tag) {
-        ArrayNode parameters = mapper.createArrayNode();
-        methodNode.set("parameters", parameters);
-        boolean required = true;
-
-        for (JavaParameter javaParameter : javaMethod.getParameters()) {
-            ObjectNode individualParameterNode = mapper.createObjectNode();
-            Optional<JavaAnnotation> optional = javaParameter.getAnnotations().stream().filter(
-                    annotation -> annotation.getType().getName().equals(PATH_PARAM) ||
-                            annotation.getType().getName().equals(QUERY_PARAM)).findAny();
-            JavaAnnotation pathType = optional.orElse(null);
-
-            String annotationName = javaParameter.getName();
-
-
-            if (pathType != null) { //the parameter is a path or query parameter
-                individualParameterNode.put("name",
-                                            pathType.getNamedParameter("value")
-                                                    .toString().replace("\"", ""));
-                if (pathType.getType().getName().equals(PATH_PARAM)) {
-                    individualParameterNode.put("in", "path");
-                } else if (pathType.getType().getName().equals(QUERY_PARAM)) {
-                    individualParameterNode.put("in", "query");
-                }
-                individualParameterNode.put("type", getType(javaParameter.getType()));
-            } else { // the parameter is a body parameter
-                individualParameterNode.put("name", annotationName);
-                individualParameterNode.put("in", "body");
-
-                // Adds the reference to the Json model for the input
-                // that goes in the post or put operation
-                if (tag != null && (method.toLowerCase().equals("post") ||
-                        method.toLowerCase().equals("put"))) {
-                    ObjectNode schema = mapper.createObjectNode();
-                    tag.getParameters().stream().forEach(param -> {
-                        schema.put("$ref", "#/definitions/" + param);
-                    });
-                    individualParameterNode.set("schema", schema);
-                }
-            }
-            for (DocletTag p : javaMethod.getTagsByName("param")) {
-                if (p.getValue().contains(annotationName)) {
-                    String description = "";
-                    if (p.getValue().split(" ", 2).length >= 2) {
-                        description = p.getValue().split(" ", 2)[1].trim();
-                        if (description.contains("optional")) {
-                            required = false;
-                        }
-                    } else {
-                        throw new RuntimeException(String.format("No description for parameter \"%s\" in " +
-                                                                         "method \"%s\" in %s (line %d)",
-                                                                 p.getValue(), javaMethod.getName(),
-                                                                 javaMethod.getDeclaringClass().getName(),
-                                                                 javaMethod.getLineNumber()));
-                    }
-                    individualParameterNode.put("description", description);
-                }
-            }
-            individualParameterNode.put("required", required);
-            parameters.add(individualParameterNode);
-        }
-    }
-
-    // Returns the Swagger specified strings for the type of a parameter
-    private String getType(JavaType javaType) {
-        String type = javaType.getFullyQualifiedName();
-        String value;
-        if (type.equals(String.class.getName())) {
-            value = "string";
-        } else if (type.equals("int")) {
-            value = "integer";
-        } else if (type.equals(boolean.class.getName())) {
-            value = "boolean";
-        } else if (type.equals(long.class.getName())) {
-            value = "number";
-        } else {
-            value = "";
-        }
-        return value;
-    }
-
-    // Writes the swagger.json file using the supplied JSON root.
-    private void genCatalog(File dstDirectory, ObjectNode root) {
-        File swaggerCfg = new File(dstDirectory, JSON_FILE);
-        if (dstDirectory.exists() || dstDirectory.mkdirs()) {
-            try (FileWriter fw = new FileWriter(swaggerCfg);
-                 PrintWriter pw = new PrintWriter(fw)) {
-                pw.println(root.toString());
-            } catch (IOException e) {
-                throw new RuntimeException("Unable to write " + JSON_FILE, e);
-            }
-        } else {
-            throw new RuntimeException("Unable to create " + dstDirectory);
-        }
-    }
-
-    // Generates the registrator Java component.
-    private void genRegistrator(File dstDirectory, String webContext,
-                                String apiTitle, String apiVersion,
-                                String apiPackage, String apiDescription) {
-        File dir = new File(dstDirectory, resourceDirectory != null ? GEN_SRC : ".");
-        File reg = new File(dir, apiRegistratorPath(apiPackage));
-        File pkg = reg.getParentFile();
-        if (pkg.exists() || pkg.mkdirs()) {
-            try {
-                String src = new String(ByteStreams.toByteArray(getClass().getResourceAsStream(REG_SRC)));
-                src = src.replace("${api.package}", apiPackage)
-                        .replace("${web.context}", webContext)
-                        .replace("${api.title}", apiTitle)
-                        .replace("${api.description}", apiDescription)
-                        .replace("${year}", Year.now().toString());
-
-                Files.write(src.getBytes(), reg);
-            } catch (IOException e) {
-                throw new RuntimeException("Unable to write " + reg, e);
-            }
-        } else {
-            throw new RuntimeException("Unable to create " + reg);
-        }
-    }
-
-    private String shortText(String comment) {
-        int i = comment.indexOf('.');
-        return i > 0 ? comment.substring(0, i) : comment;
-    }
-
-    public static String apiRegistratorPath(String apiPackage) {
-        return apiPackage.replaceAll("\\.", "/") + "/ApiDocRegistrator.java";
-    }
-
-    private static List<File> getFiles(String commaSeparatedList) {
-        String[] fileNames = commaSeparatedList.split(",");
-        ImmutableList.Builder<File> files = ImmutableList.builder();
-        Arrays.stream(fileNames).forEach(filename -> files.add(new File(filename)));
-        return files.build();
-    }
-
-    public static void main(String args[]) {
-        List<File> srcs = getFiles(args[0]);
-        List<File> resources = getFiles(args[1]);
-        File srcDirectory = null;//new File(args[2]);
-        File resourceDirectory = new File(args[3]);
-        File genSrcOutputDirectory = new File(args[4]);
-        File genResourcesOutputDirectory = new File(args[5]);
-        String webContext = args[6];
-        String apiTitle = args[7];
-        String apiVersion = args[8];
-        String apiPackage = args[9];
-        String apiDescription = args[10];
-
-        SwaggerGenerator generator = new SwaggerGenerator(
-                srcs,
-                resources,
-                srcDirectory, resourceDirectory,
-                genSrcOutputDirectory,
-                genResourcesOutputDirectory,
-                webContext,
-                apiTitle,
-                apiVersion,
-                apiPackage,
-                apiDescription);
-        generator.execute();
-    }
-}
\ No newline at end of file
diff --git a/tools/build/buck-plugin/src/main/java/org/onosproject/onosjar/SwaggerStep.java b/tools/build/buck-plugin/src/main/java/org/onosproject/onosjar/SwaggerStep.java
deleted file mode 100644
index cbb6e82..0000000
--- a/tools/build/buck-plugin/src/main/java/org/onosproject/onosjar/SwaggerStep.java
+++ /dev/null
@@ -1,99 +0,0 @@
-/*
- * Copyright 2016-present Open Networking Foundation
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.onosproject.onosjar;
-
-import com.facebook.buck.io.ProjectFilesystem;
-import com.facebook.buck.rules.SourcePathResolver;
-import com.facebook.buck.step.AbstractExecutionStep;
-import com.facebook.buck.step.ExecutionContext;
-import com.facebook.buck.step.StepExecutionResult;
-import com.google.common.collect.ImmutableSortedSet;
-
-import java.io.File;
-import java.io.IOException;
-import java.nio.file.Path;
-import java.util.List;
-import java.util.stream.Collectors;
-
-/**
- * Buck build step to trigger SwaggerGenerator.
- */
-public class SwaggerStep extends AbstractExecutionStep {
-
-    private final ProjectFilesystem filesystem;
-
-    private final ImmutableSortedSet<Path> srcs;
-    private final ImmutableSortedSet<Path> resources;
-    private final Path genSourcesOutput;
-    private final Path genResourcesOutput;
-
-    private final String webContext;
-    private final String apiTitle;
-    private final String apiVersion;
-    private final String apiPackage;
-    private final String apiDescription;
-
-
-    public SwaggerStep(ProjectFilesystem filesystem,
-                       ImmutableSortedSet<Path> srcs,
-                       ImmutableSortedSet<Path> resources,
-                       Path genSourcesOutput, Path genResourcesOutput,
-                       String webContext, String apiTitle, String apiVersion,
-                       String apiPackage, String apiDescription) {
-        super("swagger");
-        this.filesystem = filesystem;
-        this.srcs = srcs;
-        this.resources = resources;
-        this.genSourcesOutput = genSourcesOutput;
-        this.genResourcesOutput = genResourcesOutput;
-        this.webContext = webContext;
-        this.apiTitle = apiTitle;
-        this.apiVersion = apiVersion;
-        this.apiPackage = apiPackage;
-        this.apiDescription = apiDescription;
-    }
-
-    @Override
-    public StepExecutionResult execute(ExecutionContext executionContext)
-            throws IOException, InterruptedException {
-        try {
-            List<File> srcFiles = srcs.stream()
-                    .map(src -> filesystem.resolve(src).toFile())
-                    .collect(Collectors.toList());
-            List<File> resourceFiles = resources.stream()
-                    .map(rsrc -> filesystem.resolve(rsrc).toFile())
-                    .collect(Collectors.toList());
-            new SwaggerGenerator(srcFiles, resourceFiles, null, null,
-                                 filesystem.resolve(genSourcesOutput).toFile(),
-                                 filesystem.resolve(genResourcesOutput).toFile(),
-                                 webContext,
-                                 apiTitle,
-                                 apiVersion,
-                                 apiPackage,
-                                 apiDescription).execute();
-
-            return StepExecutionResult.SUCCESS;
-        } catch (Exception e) {
-            e.printStackTrace();
-            // FIXME print the exception
-            return StepExecutionResult.ERROR;
-        }
-    }
-
-    Path apiRegistratorPath() {
-        return genSourcesOutput.resolve(SwaggerGenerator.apiRegistratorPath(apiPackage));
-    }
-}
diff --git a/tools/build/buck-plugin/src/main/resources/registrator.javat b/tools/build/buck-plugin/src/main/resources/registrator.javat
deleted file mode 100644
index 6596450..0000000
--- a/tools/build/buck-plugin/src/main/resources/registrator.javat
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- * Copyright ${year}-present Open Networking Foundation
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- * Auto-generated by OnosSwaggerMojo.
- *
- */
-package ${api.package};
-
-import org.apache.felix.scr.annotations.Component;
-import org.onosproject.rest.AbstractApiDocRegistrator;
-import org.onosproject.rest.ApiDocProvider;
-
-@Component(immediate = true)
-public class ApiDocRegistrator extends AbstractApiDocRegistrator {
-    public ApiDocRegistrator() {
-        super(new ApiDocProvider("${web.context}",
-                                 "${api.title}",
-                                 ApiDocRegistrator.class.getClassLoader()));
-    }
-}
diff --git a/tools/build/buck-publish b/tools/build/buck-publish
deleted file mode 100755
index 01ed7d9..0000000
--- a/tools/build/buck-publish
+++ /dev/null
@@ -1,32 +0,0 @@
-#!/bin/bash
-# -----------------------------------------------------------------------------
-# Build and publish the ONOS version of buck.
-# -----------------------------------------------------------------------------
-
-if [ $# -ne 3  -a $# -ne 4 ]; then
-    echo "Usage: buck-publish-setup buck-branch onos-branch yang-branch [version] [--dry-run]"
-    echo "For example, to build buck branch 11-11-2016, onos branch master, and onos-yang-tools master:"
-    echo "buck-publish 11-11-2016 master master"
-    exit 1
-fi
-
-if [ $# -eq 4 -a "${4}" != "--dry-run" ]; then
-    echo "$4 is an invalid parameter - only --dry-run allowed"
-    exit 1
-fi
-
-BUCK_BRANCH="$1"
-ONOS_BRANCH="$2"
-YANG_BRANCH="$3"
-
-if [ -z "$4" ]; then
-    onos-release-prerequisites
-fi
-
-DIR=$(mktemp -d /tmp/buck-publish.XXXXX) || { echo "Failed to create temp file"; exit 1; }
-
-buck-publish-setup $BUCK_BRANCH $ONOS_BRANCH $YANG_BRANCH $DIR
-pushd $DIR && buck-publish-package $4 && popd
-cp $DIR/onos/tools/build/onos-buck $ONOS_ROOT/tools/build/onos-buck
-
-
diff --git a/tools/build/buck-publish-api b/tools/build/buck-publish-api
deleted file mode 100755
index e27f1d0..0000000
--- a/tools/build/buck-publish-api
+++ /dev/null
@@ -1,56 +0,0 @@
-#!/bin/bash
-
-BUCK_LOCAL_CONFIG=${BUCK_LOCAL_CONFIG:-$ONOS_ROOT/.buckconfig.local}
-MVN_REPO="https://oss.sonatype.org/content/repositories/snapshots"
-NO_BUCKD=1
-
-set -e
-set -x
-
-#FIXME if pwd != buck
-pushd buck
-
-# build buck
-scripts/create_tag.sh
-buck build buck --show-output
-
-# publish cli:main-fixed as buck-api
-cp $BUCK_LOCAL_CONFIG .
-buck publish //src/com/facebook/buck/cli:main-fixed \
-    --remote-repo=https://oss.sonatype.org/content/repositories/snapshots/ \
-    | tee ../api-publish.txt
-
-# Alternatively, we can deploy org.onosproject:buck-api with the following:
-#mvn deploy:deploy-file -DgroupId=org.onosproject -DartifactId=buck-api \
-#  -Dversion=0.1-SNAPSHOT -DgeneratePom=true -Dpackaging=jar \
-#  -DrepositoryId=snapshot -Durl=https://oss.sonatype.org/content/repositories/snapshots/ \
-#  -Dfile=buck-out/gen/src/com/facebook/buck/cli/main-fixed/main-fixed.jar
-
-#FIXME upload API to S3 for backup
-
-popd #buck
-
-SNAPSHOT_VERSION=$(cat api-publish.txt | grep "^org.onosproject:buck-api:jar" \
-                       | cut -d' ' -f1 | cut -d: -f4)
-BUCK_API_URL="$MVN_REPO/org/onosproject/buck-api/0.1-SNAPSHOT/buck-api-$SNAPSHOT_VERSION.jar"
-echo $BUCK_API_URL
-
-BUCK_API_SHA=$(shasum buck/buck-out/gen/src/com/facebook/buck/cli/main-fixed/main-fixed.jar | cut -d' ' -f1)
-echo $BUCK_API_SHA
-
-pushd onos
-sed -i "" -E "s#url =.*#url = '$BUCK_API_URL',#" tools/build/buck-plugin/BUCK
-sed -i "" -E "s#sha1 =.*#sha1 = '$BUCK_API_SHA',#" tools/build/buck-plugin/BUCK
-popd #onos
-
-#pushd onos-yang-tools
-#FIXME update version (assume 0.1-SNAPSHOT for now)
-#popd #onos-yang-tools
-
-set +x
-
-echo
-echo "Please build and verify the ONOS Buck plugin and the Yang tools plugin:"
-echo "  cd onos; buck build //tools/build/buck-plugin:onos"
-echo "  cd onos-yang-tools; mvn clean package"
-echo "You should commit and push any required changes."
diff --git a/tools/build/buck-publish-package b/tools/build/buck-publish-package
deleted file mode 100755
index 09d1612..0000000
--- a/tools/build/buck-publish-package
+++ /dev/null
@@ -1,71 +0,0 @@
-#!/bin/bash
-
-for NEXT_VERSION in 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20; do
-    DEFAULT_TAG=${TAG:-$(date +v%Y.%m.%d.$NEXT_VERSION)}
-    BUCK_ZIP="buck-$DEFAULT_TAG.zip"
-    DOWNLOAD_BASE="http://repo1.maven.org/maven2/org/onosproject/onos-buck/$DEFAULT_TAG"
-
-    if ! curl --output /dev/null --silent --head --fail "$DOWNLOAD_BASE/$BUCK_ZIP"; then
-        break;
-    fi
-done
-
-NO_BUCKD=1
-
-UPLOAD_BASE="https://oss.sonatype.org/service/local/staging/deploy/maven2/org/onosproject/onos-buck/$DEFAULT_TAG"
-BUCK_ZIP="buck-$DEFAULT_TAG.zip"
-ZIP_STAGE="buck-bin"
-
-rm -rf $ZIP_STAGE
-
-set -e
-set -x
-
-# build plugins
-
-pushd buck
-onos-buck build buck
-popd #buck
-
-pushd onos
-onos-buck build //tools/build/buck-plugin:onos
-popd #onos
-
-pushd onos-yang-tools
-mvn clean package
-popd #onos-yang-tools
-
-# assemble zip
-
-mkdir -p buck-bin/plugins
-
-cp buck/buck-out/gen/programs/buck.pex $ZIP_STAGE/buck
-cp onos/buck-out/gen/tools/build/buck-plugin/onos.jar $ZIP_STAGE/plugins/onos.jar
-cp onos-yang-tools/compiler/plugin/buck/target/onos-yang-compiler-buck-plugin-*.jar $ZIP_STAGE/plugins/yang.jar
-
-BUCK_VERSION=$(buck/buck-out/gen/programs/buck.pex -V)
-echo $BUCK_VERSION > $ZIP_STAGE/.buck_version
-
-chmod 555 $ZIP_STAGE/buck
-chmod 444 $ZIP_STAGE/.buck_version
-
-pushd $ZIP_STAGE
-zip -r ../$BUCK_ZIP buck .buck_version plugins
-popd #$ZIP_STAGE
-
-if [ "$1" != "--dry-run" ]; then
-    # publish zip
-    curl -v -u "$SONATYPE_USER:$SONATYPE_PASSWORD" --upload-file $BUCK_ZIP $UPLOAD_BASE/$BUCK_ZIP
-    echo "New buck release is in " $BUCK_ZIP
-fi
-
-# update version in onos-buck
-URL="$DOWNLOAD_BASE/$BUCK_ZIP"
-SHA=$(shasum $BUCK_ZIP | cut -d' ' -f1)
-
-sed -i "" -E "s#BUCK_URL=.*#BUCK_URL=\"$URL\"#" onos/tools/build/onos-buck
-sed -i "" -E "s#BUCK_SHA=.*#BUCK_SHA=\"$SHA\"#" onos/tools/build/onos-buck
-
-set +x
-echo
-echo "Commit and push change to onos-buck on the onos directory."
diff --git a/tools/build/buck-publish-setup b/tools/build/buck-publish-setup
deleted file mode 100755
index d180479..0000000
--- a/tools/build/buck-publish-setup
+++ /dev/null
@@ -1,28 +0,0 @@
-#!/bin/bash
-
-BUCK_REF=${1:-"11-11-2016"}
-ONOS_REF=${2:-"master"}
-YANG_REF=${3:-"master"}
-DIR=$4
-
-set -x
-
-if [ -z "$4" ]; then
-    DIR=$(mktemp -d /tmp/buck-publish.XXXXX) || { echo "Failed to create temp file"; exit 1; }
-fi
-# change to tmpdir
-cd $DIR
-
-# checkout buck
-git clone -b $BUCK_REF https://github.com/bocon13/buck
-
-# checkout plugins
-git clone -b $ONOS_REF https://gerrit.onosproject.org/onos.git
-git clone -b $YANG_REF https://gerrit.onosproject.org/onos-yang-tools.git
-
-set +x
-
-echo
-echo "Buck publish area:"
-echo "  cd $DIR"
-
diff --git a/tools/build/build-offline-karaf b/tools/build/build-offline-karaf
index f7f4a63..24d5821 100755
--- a/tools/build/build-offline-karaf
+++ b/tools/build/build-offline-karaf
@@ -1,12 +1,13 @@
 #!/bin/bash
-
-KARAF_VERSION="3.0.8"
+ 
+KARAF_VERSION="4.2.1"
+KARAF_BASE_PACKAGE_VERSION="4.2.1-20181024"
 KARAF_TARFILE_NAME="apache-karaf-${KARAF_VERSION}.tar"
-BOOT_FEATURES="standard,ssh,scr,war,webconsole"
+ADDED_BOOT_FEATURES="kar/${KARAF_VERSION},webconsole/${KARAF_VERSION},scr/${KARAF_VERSION},war/${KARAF_VERSION}"
 
 # fetch the standard karaf bits
 rm -f /tmp/${KARAF_TARFILE_NAME}
-curl -o /tmp/${KARAF_TARFILE_NAME}.gz http://onlab.vicci.org/onos/third-party/${KARAF_TARFILE_NAME}.gz
+curl -o /tmp/${KARAF_TARFILE_NAME}.gz http://repo1.maven.org/maven2/org/onosproject/apache-karaf-offline/${KARAF_BASE_PACKAGE_VERSION}/apache-karaf-offline-${KARAF_BASE_PACKAGE_VERSION}.tar.gz
 
 # get a small cell
 source ${ONOS_ROOT}/tools/dev/bash_profile
@@ -21,13 +22,13 @@
     cd karaf
     tar xf /tmp/${KARAF_TARFILE_NAME}.gz
 
-    # set the ONOS default boot features
-    perl -pi.old -e 's|^(featuresBoot=).*|\1${BOOT_FEATURES}|' apache-karaf-${KARAF_VERSION}/etc/org.apache.karaf.features.cfg
+    # add the extra ONOS default boot features
+    sed -i.old -e 's|kar/${KARAF_VERSION}.*$|${ADDED_BOOT_FEATURES}|' apache-karaf-${KARAF_VERSION}/etc/org.apache.karaf.features.cfg
 
     # run karaf to fill the maven repo with required artifacts
     apache-karaf-${KARAF_VERSION}/bin/karaf server 1>/tmp/onos.out 2>/tmp/onos.err &
 
-    sleep 15
+    sleep 30
 
     # stop karaf and capture the artifacts that were downloaded into the maven repo
     apache-karaf-${KARAF_VERSION}/bin/karaf stop 1>/tmp/onos.out 2>/tmp/onos.err &
@@ -51,7 +52,7 @@
 "
 
 # fetch the new offline karaf tar ball
-BUILD_NUMBER="apache-karaf-${KARAF_VERSION}-offline-$(date +'%Y%m%d')"
+BUILD_NUMBER="${KARAF_VERSION}-offline-$(date +'%Y%m%d')"
 scp sdn@[${OC1}]:karaf-offline.tar.gz /tmp/${BUILD_NUMBER}.tar.gz
 
 cell return
diff --git a/tools/build/cfgdef/BUILD b/tools/build/cfgdef/BUILD
new file mode 100644
index 0000000..8098840
--- /dev/null
+++ b/tools/build/cfgdef/BUILD
@@ -0,0 +1,14 @@
+CFGDEF_EXECUTABLE = "cfgdef_generator"
+
+COMPILE_DEPS = JACKSON + [
+    "@com_google_guava_guava//jar",
+    "@qdox//jar",
+]
+
+java_binary(
+    name = CFGDEF_EXECUTABLE,
+    srcs = glob(["src/main/java/org/onosproject/cfgdef/CfgDefGenerator.java"]),
+    main_class = "org.onosproject.cfgdef.CfgDefGenerator",
+    visibility = ["//visibility:public"],
+    deps = COMPILE_DEPS,
+)
diff --git a/tools/build/cfgdef/src/main/java/org/onosproject/cfgdef/CfgDefGenerator.java b/tools/build/cfgdef/src/main/java/org/onosproject/cfgdef/CfgDefGenerator.java
new file mode 100644
index 0000000..c46b583
--- /dev/null
+++ b/tools/build/cfgdef/src/main/java/org/onosproject/cfgdef/CfgDefGenerator.java
@@ -0,0 +1,190 @@
+/*
+ * Copyright 2018-present Open Networking Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.onosproject.cfgdef;
+
+import com.google.common.collect.Maps;
+import com.thoughtworks.qdox.JavaProjectBuilder;
+import com.thoughtworks.qdox.model.JavaAnnotation;
+import com.thoughtworks.qdox.model.JavaClass;
+import com.thoughtworks.qdox.model.JavaField;
+import com.thoughtworks.qdox.model.expression.Add;
+import com.thoughtworks.qdox.model.expression.AnnotationValue;
+import com.thoughtworks.qdox.model.expression.AnnotationValueList;
+import com.thoughtworks.qdox.model.expression.FieldRef;
+import com.thoughtworks.qdox.parser.ParseException;
+
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import java.util.Map;
+import java.util.Optional;
+import java.util.jar.JarEntry;
+import java.util.jar.JarOutputStream;
+
+/**
+ * Produces ONOS component configuration catalogue resources.
+ */
+public class CfgDefGenerator {
+
+    private static final String COMPONENT = "org.osgi.service.component.annotations.Component";
+    private static final String PROPERTY = "property";
+    private static final String SEP = "|";
+    private static final String UTF_8 = "UTF-8";
+    private static final String JAVA = ".java";
+    private static final String EXT = ".cfgdef";
+    private static final String STRING = "STRING";
+    private static final String NO_DESCRIPTION = "no description provided";
+
+    private final File resourceJar;
+    private final JavaProjectBuilder builder;
+
+    private final Map<String, String> constants = Maps.newHashMap();
+
+    public static void main(String[] args) throws IOException {
+        if (args.length < 2) {
+            System.err.println("usage: cfgdef outputJar javaSource javaSource ...");
+            System.exit(1);
+        }
+        CfgDefGenerator gen = new CfgDefGenerator(args[0], Arrays.copyOfRange(args, 1, args.length));
+        gen.analyze();
+        gen.generate();
+    }
+
+    private CfgDefGenerator(String resourceJarPath, String[] sourceFilePaths) {
+        this.resourceJar = new File(resourceJarPath);
+        this.builder = new JavaProjectBuilder();
+        Arrays.stream(sourceFilePaths).forEach(filename -> {
+            try {
+                if (filename.endsWith(JAVA))
+                builder.addSource(new File(filename));
+            } catch (ParseException e) {
+                // When unable to parse, skip the source; leave it to javac to fail.
+            } catch (IOException e) {
+                throw new IllegalArgumentException("Unable to open file", e);
+            }
+        });
+    }
+
+    public void analyze() {
+        builder.getClasses().forEach(this::collectConstants);
+    }
+
+    private void collectConstants(JavaClass javaClass) {
+        javaClass.getFields().stream()
+                .filter(f -> f.isStatic() && f.isFinal() && !f.isPrivate())
+                .forEach(f -> constants.put(f.getName(), f.getInitializationExpression()));
+    }
+
+    public void generate() throws IOException {
+        JarOutputStream jar = new JarOutputStream(new FileOutputStream(resourceJar));
+        for (JavaClass javaClass : builder.getClasses()) {
+            processClass(jar, javaClass);
+        }
+        jar.close();
+    }
+
+    private void processClass(JarOutputStream jar, JavaClass javaClass) throws IOException {
+        Optional<JavaAnnotation> annotation = javaClass.getAnnotations().stream()
+                .filter(ja -> ja.getType().getName().equals(COMPONENT))
+                .findFirst();
+        if (annotation.isPresent()) {
+            AnnotationValue property = annotation.get().getProperty(PROPERTY);
+            List<String> lines = new ArrayList<>();
+            if (property instanceof AnnotationValueList) {
+                AnnotationValueList list = (AnnotationValueList) property;
+                list.getValueList().forEach(v -> processProperty(lines, javaClass, v));
+            } else {
+                processProperty(lines, javaClass, property);
+            }
+
+            if (!lines.isEmpty()) {
+                writeCatalog(jar, javaClass, lines);
+            }
+        }
+    }
+
+    private void processProperty(List<String> lines, JavaClass javaClass,
+                                 AnnotationValue value) {
+        String s = elaborate(value);
+        String pex[] = s.split("=", 2);
+
+        if (pex.length == 2) {
+            String rex[] = pex[0].split(":", 2);
+            String name = rex[0];
+            String type = rex.length == 2 ? rex[1].toUpperCase() : STRING;
+            String def = pex[1];
+            String desc = description(javaClass, name);
+
+            if (desc != null) {
+                String line = name + SEP + type + SEP + def + SEP + desc + "\n";
+                lines.add(line);
+            }
+        }
+    }
+
+    // Retrieve description from a comment preceding the field named the same
+    // as the property or
+    // TODO: from an annotated comment.
+    private String description(JavaClass javaClass, String name) {
+        JavaField field = javaClass.getFieldByName(name);
+        if (field != null) {
+            String comment = field.getComment();
+            return comment != null ? comment : NO_DESCRIPTION;
+        }
+        return null;
+    }
+
+    private String elaborate(AnnotationValue value) {
+        if (value instanceof Add) {
+            return elaborate(((Add) value).getLeft()) + elaborate(((Add) value).getRight());
+        } else if (value instanceof FieldRef) {
+            return elaborate((FieldRef) value);
+        } else if (value != null) {
+            return stripped(value.toString());
+        } else {
+            return "";
+        }
+    }
+
+    private String elaborate(FieldRef field) {
+        String name = field.getName();
+        String value = constants.get(name);
+        if (value != null) {
+            return stripped(value);
+        }
+        throw new IllegalStateException("Constant " + name + " cannot be elaborated;" +
+                                                " value not in the same compilation context");
+    }
+
+    private String stripped(String s) {
+        return s.trim().replaceFirst("^[^\"]*\"", "").replaceFirst("\"$", "");
+    }
+
+    private void writeCatalog(JarOutputStream jar, JavaClass javaClass, List<String> lines)
+            throws IOException {
+        String name = javaClass.getPackageName().replace('.', '/') + "/" + javaClass.getName() + EXT;
+        jar.putNextEntry(new JarEntry(name));
+        jar.write("# This file is auto-generated\n".getBytes(UTF_8));
+        for (String line : lines) {
+            jar.write(line.getBytes(UTF_8));
+        }
+        jar.closeEntry();
+    }
+
+}
diff --git a/tools/build/conf/BUCK b/tools/build/conf/BUCK
deleted file mode 100644
index 11ab279..0000000
--- a/tools/build/conf/BUCK
+++ /dev/null
@@ -1,81 +0,0 @@
-checkstyle_source = 'src/main/resources/onos/checkstyle.xml'
-suppression_source = 'src/main/resources/onos/suppressions.xml'
-header_source = 'src/main/resources/onos/onos-java.header'
-
-export_file (
-  name = 'checkstyle-xml',
-  src = checkstyle_source,
-  visibility = [ 'PUBLIC' ],
-)
-
-export_file (
-  name = 'suppressions-xml',
-  src = suppression_source,
-  visibility = [ 'PUBLIC' ],
-)
-
-export_file (
-  name = 'onos-java-header',
-  src = header_source,
-  visibility = [ 'PUBLIC' ],
-)
-
-export_file (
-  name = 'start-buck-daemon',
-  visibility = [ 'PUBLIC' ],
-)
-
-COMPILE = [
-  '//lib:com_google_guava_guava',
-  '//lib:checkstyle',
-]
-
-RUN = [
-  '//lib:commons-logging',
-  '//lib:commons-beanutils',
-  '//lib:commons-lang3',
-  '//lib:commons-collections',
-  '//lib:antlr',
-]
-
-java_library (
-  name = 'checkstyle',
-  srcs = glob([ 'src/main/java/**/*.java' ]),
-  deps = COMPILE,
-)
-
-java_binary (
-  name = 'buck-daemon-jar',
-  deps = [ ':checkstyle' ] + RUN,
-  main_class = 'org.onosproject.buckdaemon.BuckDaemon',
-  blacklist = [ 'META-INF/.*' ],
-  visibility = [ 'PUBLIC' ],
-)
-
-osgi_jar (
-  name = 'onos-build-conf',
-  srcs = [],
-  deps = [ ':checkstyle' ] + RUN,
-)
-
-# cmd = '#!/bin/bash\n'
-# cmd += '$1 &>/dev/null < /dev/null &'
-#
-# genrule(
-#   name = 'checkstyle-sh',
-#   bash = "echo '%s' > $OUT && chmod +x $OUT" % cmd,
-#   out = 'checkstyle.sh',
-# )
-#
-# sh_test(
-#   name = 'checkstyle-runner',
-#   test = ':checkstyle-sh',
-#   args = [
-#   '$(exe :checkstyle-jar)',
-#   '$(location //lib:checkstyle)',
-#   '$(location //tools/build/conf:checkstyle-xml)',
-#   '`mktemp /tmp/%s-checkstyle-XXXXXX`',
-#   ],
-#   labels = [ 'checkstyle' ],
-#   visibility = [ 'PUBLIC' ],
-# )
diff --git a/tools/build/conf/src/main/java/org/onosproject/buckdaemon/BuckDaemon.java b/tools/build/conf/src/main/java/org/onosproject/buckdaemon/BuckDaemon.java
deleted file mode 100644
index a253995..0000000
--- a/tools/build/conf/src/main/java/org/onosproject/buckdaemon/BuckDaemon.java
+++ /dev/null
@@ -1,227 +0,0 @@
-/*
- * Copyright 2016-present Open Networking Foundation
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.onosproject.buckdaemon;
-
-import com.puppycrawl.tools.checkstyle.api.CheckstyleException;
-import org.onosproject.checkstyle.CheckstyleRunner;
-
-import java.io.IOException;
-import java.io.PrintStream;
-import java.io.PrintWriter;
-import java.io.StringWriter;
-import java.net.ServerSocket;
-import java.net.Socket;
-import java.nio.ByteBuffer;
-import java.nio.channels.FileChannel;
-import java.nio.channels.FileLock;
-import java.nio.file.Files;
-import java.nio.file.Path;
-import java.nio.file.Paths;
-import java.util.HashMap;
-import java.util.Map;
-import java.util.Timer;
-import java.util.TimerTask;
-import java.util.concurrent.ExecutorService;
-import java.util.concurrent.Executors;
-
-import static java.nio.file.StandardOpenOption.CREATE;
-import static java.nio.file.StandardOpenOption.WRITE;
-
-/**
- * Buck daemon process.
- */
-public final class BuckDaemon {
-
-    private static final long POLLING_INTERVAL = 1000; //ms
-
-    private final Map<String, BuckTask> tasks = new HashMap<>();
-    private final String portLock;
-    private final String buckPid;
-
-    // Public construction forbidden
-    private BuckDaemon(String[] args) {
-        portLock = args[0];
-        buckPid = args[1];
-    }
-
-    /**
-     * Main entry point for the daemon.
-     *
-     * @param args command-line arguments
-     * @throws CheckstyleException on checkstyle error
-     * @throws IOException on I/O error
-     */
-    public static void main(String[] args)
-            throws CheckstyleException, IOException {
-        BuckDaemon daemon = new BuckDaemon(args);
-        daemon.registerTasks();
-        daemon.startServer();
-    }
-
-    /**
-     * Registers re-entrant tasks by their task name.
-     */
-    private void registerTasks() {
-        tasks.put("checkstyle", new CheckstyleRunner(System.getProperty("checkstyle.config"),
-                                                     System.getProperty("checkstyle.suppressions")));
-        // tasks.put("swagger", new SwaggerGenerator());
-    }
-
-    /**
-     * Monitors another PID and exit when that process exits.
-     */
-    private void watchProcess(String pid) {
-        if (pid == null || pid.equals("0")) {
-            return;
-        }
-        Timer timer = new Timer(true); // start as a daemon, so we don't hang shutdown
-        timer.scheduleAtFixedRate(new TimerTask() {
-            private String cmd = "kill -s 0 " + pid;
-
-            @Override
-            public void run() {
-                try {
-                    Process p = Runtime.getRuntime().exec(cmd);
-                    p.waitFor();
-                    if (p.exitValue() != 0) {
-                        debug("shutting down...");
-                        System.exit(0);
-                    }
-                } catch (IOException | InterruptedException e) {
-                    //no-op
-                    e.printStackTrace();
-                }
-            }
-        }, POLLING_INTERVAL, POLLING_INTERVAL);
-    }
-
-    /**
-     * Initiates a server.
-     */
-    private void startServer() throws IOException, CheckstyleException {
-        // Use a file lock to ensure only one copy of the daemon runs
-        Path portLockPath = Paths.get(portLock);
-        FileChannel channel = FileChannel.open(portLockPath, WRITE, CREATE);
-        FileLock lock = channel.tryLock();
-        if (lock == null) {
-            debug("Server is already running");
-            System.exit(1);
-        } //else, hold the lock until the JVM exits
-
-        // Start the server and bind it to a random port
-        ServerSocket server = new ServerSocket(0);
-
-        // Monitor the parent buck process
-        watchProcess(buckPid);
-
-        // Set up hook to clean up after ourselves
-        Runtime.getRuntime().addShutdownHook(new Thread(() -> {
-            try {
-                channel.truncate(0);
-                channel.close();
-                debug("tear down...");
-                Files.delete(portLockPath);
-            } catch (IOException e) {
-                //no-op: shutting down
-                e.printStackTrace();
-            }
-        }));
-
-        // Write the bound port to the port file
-        int port = server.getLocalPort();
-        channel.truncate(0);
-        channel.write(ByteBuffer.wrap(Integer.toString(port).getBytes()));
-        channel.force(false); // flush the port number to disk
-
-        // Instantiate a Checkstyle runner and executor; serve until exit...
-        ExecutorService executor = Executors.newCachedThreadPool();
-        while (true) {
-            try {
-                executor.submit(new BuckTaskRunner(server.accept()));
-            } catch (Exception e) {
-                e.printStackTrace();
-                //no-op
-            }
-        }
-    }
-
-    /**
-     * Runnable capable of invoking the appropriate Buck task with input
-     * consumed form the specified socket and output produced back to that
-     * socket.
-     */
-    private class BuckTaskRunner implements Runnable {
-
-        private final Socket socket;
-
-        public BuckTaskRunner(Socket socket) {
-            this.socket = socket;
-        }
-
-        @Override
-        public void run() {
-            try {
-                try {
-                    socket.setSoTimeout(1_000); //reads should time out after 1 second
-                    BuckTaskContext context = BuckTaskContext.createBuckTaskContext(socket.getInputStream());
-                    if (context == null) {
-                        socket.close();
-                        return;
-                    }
-
-                    String taskName = context.taskName();
-                    BuckTask task = tasks.get(taskName);
-                    if (task != null) {
-                        debug(String.format("Executing task '%s'", taskName));
-                        try {
-                            task.execute(context);
-                            for (String line : context.output()) {
-                                send(socket, line);
-                            }
-                            // TODO should we catch Exception, RuntimeException, or something specific?
-                        } catch (Throwable e) {
-                            e.printStackTrace(new PrintStream(socket.getOutputStream()));
-                        }
-                    } else {
-                        String message = String.format("No task named '%s'", taskName);
-                        debug(message);
-                        send(socket, message);
-                    }
-                } catch (Throwable e) {
-                    StringWriter writer = new StringWriter();
-                    e.printStackTrace(new PrintWriter(writer));
-                    String stacktrace = writer.toString();
-                    debug(stacktrace);
-                    send(socket, stacktrace);
-                }
-                socket.getOutputStream().flush();
-                socket.close();
-            } catch (IOException e) {
-                e.printStackTrace();
-            }
-        }
-
-    }
-
-    private static void send(Socket socket, String line) throws IOException {
-        socket.getOutputStream().write((line + "\n").getBytes());
-    }
-
-    private static void debug(String message) {
-        // no-op; print to System.out if needed
-    }
-}
diff --git a/tools/build/conf/src/main/java/org/onosproject/buckdaemon/BuckTask.java b/tools/build/conf/src/main/java/org/onosproject/buckdaemon/BuckTask.java
deleted file mode 100644
index d579305..0000000
--- a/tools/build/conf/src/main/java/org/onosproject/buckdaemon/BuckTask.java
+++ /dev/null
@@ -1,31 +0,0 @@
-/*
- * Copyright 2016-present Open Networking Foundation
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.onosproject.buckdaemon;
-
-/**
- * Abstraction of a Buck task that can be spawned by the Buck daemon.
- */
-public interface BuckTask {
-
-    /**
-     * Executes the task, consuming the specified input and producing output.
-     *
-     * @param context context for the tast operation
-     */
-    void execute(BuckTaskContext context);
-
-}
diff --git a/tools/build/conf/src/main/java/org/onosproject/buckdaemon/BuckTaskContext.java b/tools/build/conf/src/main/java/org/onosproject/buckdaemon/BuckTaskContext.java
deleted file mode 100644
index 8dabfd2..0000000
--- a/tools/build/conf/src/main/java/org/onosproject/buckdaemon/BuckTaskContext.java
+++ /dev/null
@@ -1,109 +0,0 @@
-/*
- * Copyright 2016-present Open Networking Foundation
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.onosproject.buckdaemon;
-
-import com.google.common.collect.ImmutableList;
-import com.google.common.collect.Lists;
-
-import java.io.BufferedReader;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.InputStreamReader;
-import java.util.List;
-
-/**
- * Context for executing a single Buck task.
- */
-public class BuckTaskContext {
-
-    private final String taskName;
-    private final ImmutableList<String> input;
-    private final List<String> output;
-
-    public static BuckTaskContext createBuckTaskContext(InputStream inputStream) throws IOException {
-        ImmutableList<String> lines = slurpInput(inputStream);
-        if (lines.size() == 0) {
-            return null;
-        } else {
-            return new BuckTaskContext(lines);
-        }
-    }
-
-    BuckTaskContext(ImmutableList<String> lines) {
-        this.taskName = lines.get(0);
-        this.input = lines.subList(1, lines.size());
-        this.output = Lists.newArrayList();
-    }
-
-    /**
-     * Reads all input, line by line, from a stream until an empty line or EOF is encountered.
-     *
-     * @param stream input stream
-     * @return the lines of the input
-     * @throws IOException
-     */
-    private static ImmutableList<String> slurpInput(InputStream stream) throws IOException {
-        ImmutableList.Builder<String> lines = ImmutableList.builder();
-        BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(stream));
-        while (true) {
-            String line = bufferedReader.readLine();
-            if (line == null || line.trim().length() == 0) {
-                // Empty line or EOF
-                break;
-            }
-            lines.add(line);
-        }
-        return lines.build();
-    }
-
-    /**
-     * Returns the symbolic task name.
-     *
-     * @return symbolic task name
-     */
-    public String taskName() {
-        return taskName;
-    }
-
-    /**
-     * Returns the input data a list of strings.
-     *
-     * @return input data
-     */
-    public List<String> input() {
-        return ImmutableList.copyOf(input);
-    }
-
-    /**
-     * Returns the output data a list of strings.
-     *
-     * @return output data
-     */
-    List<String> output() {
-        return ImmutableList.copyOf(output);
-    }
-
-    /**
-     * Adds a line to the output data.
-     *
-     * @param line line of output data
-     */
-    public void output(String line) {
-        output.add(line);
-    }
-
-}
diff --git a/tools/build/conf/start-buck-daemon b/tools/build/conf/start-buck-daemon
deleted file mode 100755
index b747376..0000000
--- a/tools/build/conf/start-buck-daemon
+++ /dev/null
@@ -1,80 +0,0 @@
-#!/bin/bash
-# -----------------------------------------------------------------------------
-# Launches Buck daemon if not already running and requests Buck task execution.
-# -----------------------------------------------------------------------------
-
-BUCK_DAEMON=$1
-TASK=${2:-unspecified}
-DATA=${3}
-
-# TODO: Figure out how to parametrize better
-BUCK_PROPS="-Dcheckstyle.config=$4 -Dcheckstyle.suppressions=$5"
-
-PORT_FILE="$1.port"
-
-function ppid() {
-    ps -p ${1:-$$} -o ppid= -o pid= -o comm=
-}
-
-function buck_pid() {
-    BUCK_PID=($(ppid))
-    while [ ${BUCK_PID[0]} -ne 0 ]; do
-        BUCK_PID=($(ppid $BUCK_PID))
-        if [ "${BUCK_PID[2]}" == "buck" ]; then
-            # use parent PID of buck
-            echo ${BUCK_PID[0]}
-            return
-        fi
-        if [ "${BUCK_PID[2]}" == "buckd" ] ||
-           [[ "${BUCK_PID[2]}" == *"python"* ]]; then
-            # use PID of buckd or python
-            echo ${BUCK_PID[1]}
-            return
-        fi
-    done
-    # fallback last read PID
-    echo ${BUCK_PID[1]}
-}
-
-function port() {
-    cat $PORT_FILE 2>/dev/null || echo 0
-}
-
-function check_socket() {
-    printf "\n" | nc localhost $(port) 2>/dev/null
-    return $?
-}
-
-# check to see if buck daemon is running; if not, start it
-if ! check_socket; then
-    # Starting buck daemon...
-    #FIXME change to /dev/null if/when we are confident
-    nohup java $BUCK_PROPS -jar $BUCK_DAEMON $PORT_FILE $(buck_pid) >>/tmp/buck.daemon 2>&1 &
-
-    TRIES=20
-    i=0
-    # Wait for buck daemon to start for 2 seconds
-    while [ $i -lt $TRIES ]; do
-        if check_socket; then
-            CONNECTED=true
-            break
-        fi
-        let i=i+1
-        sleep 0.1
-    done
-    if [ -z "$CONNECTED" ]; then
-        echo "Failed to start buck daemon"
-        exit 3
-    fi
-fi
-
-# run the actual buck daemon client
-OUT=$((printf "%s\n" $TASK; cat $DATA) | nc localhost $(port))
-if [ $? -ne 0 ]; then
-    echo "Error connecting to buck daemon server"
-    exit 2
-fi
-if [ -n "$OUT" ]; then
-    printf "$OUT"
-    exit 1
-fi
\ No newline at end of file
diff --git a/tools/build/envDefaults b/tools/build/envDefaults
index 09e6979..2f2f964 100644
--- a/tools/build/envDefaults
+++ b/tools/build/envDefaults
@@ -5,7 +5,7 @@
 
 # M2 repository and Karaf gold bits
 export M2_REPO=${M2_REPO:-~/.m2/repository}
-export KARAF_VERSION=${KARAF_VERSION:-3.0.8}
+export KARAF_VERSION=4.2.1
 export KARAF_ZIP=${KARAF_ZIP:-~/Downloads/apache-karaf-$KARAF_VERSION.zip}
 export KARAF_TAR=${KARAF_TAR:-~/Downloads/apache-karaf-$KARAF_VERSION.tar.gz}
 export KARAF_DIST=$(basename $KARAF_ZIP .zip)
@@ -18,8 +18,8 @@
 export BUILD_NUMBER=${BUILD_NUMBER:-$(id -un)}
 
 # ONOS Version and onos.tar.gz staging environment
-export ONOS_POM_VERSION="1.15.0-SNAPSHOT"
-export ONOS_VERSION=${ONOS_VERSION:-1.15.0.$BUILD_NUMBER}
+export ONOS_POM_VERSION="2.0.0-SNAPSHOT"
+export ONOS_VERSION=${ONOS_VERSION:-2.0.0.$BUILD_NUMBER}
 
 # ONOS production bits (onos.tar.gz, onos.zip, onos.deb, onos.rpm) staging environment
 export ONOS_BITS=onos-${ONOS_VERSION%~*}
diff --git a/tools/build/jenkins/onos-buck-gerrit b/tools/build/jenkins/onos-buck-gerrit
deleted file mode 100644
index 7638a2a..0000000
--- a/tools/build/jenkins/onos-buck-gerrit
+++ /dev/null
@@ -1,37 +0,0 @@
-#!groovy
-
-pipeline {
-
-    agent { node { label 'ubuntu16.04-basebuild-8c-15g' } }
-
-    stages {
-
-        stage('build') {
-            steps {
-                sh '''#!/bin/bash -l
-                    ONOS_ROOT=`pwd`
-                    source tools/build/envDefaults
-                    onos-buck build onos
-                '''
-            }
-        }
-
-        stage('test') {
-            steps {
-                parallel (
-                    "unit-tests": {
-                        sh '''#!/bin/bash -l
-                            ONOS_ROOT=`pwd`
-                            source tools/build/envDefaults
-                            onos-buck test
-                            onos-buck build //docs:external //docs:internal --show-output
-                        '''
-                    },
-                    // additional steps here (STC, docker buld, etc)
-                )
-            }
-        }
-    }
-
-}
-
diff --git a/tools/build/libgen/pom.xml b/tools/build/libgen/pom.xml
index 9288bb3..b56c1c0 100644
--- a/tools/build/libgen/pom.xml
+++ b/tools/build/libgen/pom.xml
@@ -29,9 +29,9 @@
     <groupId>org.onosproject</groupId>
     <artifactId>onos-libgen</artifactId>
     <packaging>jar</packaging>
-    <version>1.6-SNAPSHOT</version>
+    <version>2.1-SNAPSHOT</version>
 
-    <description>Third-party library generator for Buck and Bazel workspaces</description>
+    <description>Third-party library generator for ONOS Bazel workspace</description>
     <url>http://onosproject.org/</url>
 
     <scm>
@@ -116,7 +116,7 @@
                     <transformers>
                         <transformer
                                 implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
-                            <mainClass>org.onosproject.libgen.BuckLibGenerator</mainClass>
+                            <mainClass>org.onosproject.libgen.BazelLibGenerator</mainClass>
                         </transformer>
                     </transformers>
                     <filters>
diff --git a/tools/build/libgen/src/main/java/org/onosproject/libgen/AetherResolver.java b/tools/build/libgen/src/main/java/org/onosproject/libgen/AetherResolver.java
index e97bad5..23ffc9e 100755
--- a/tools/build/libgen/src/main/java/org/onosproject/libgen/AetherResolver.java
+++ b/tools/build/libgen/src/main/java/org/onosproject/libgen/AetherResolver.java
@@ -24,10 +24,9 @@
 import org.eclipse.aether.connector.basic.BasicRepositoryConnectorFactory;
 import org.eclipse.aether.impl.DefaultServiceLocator;
 import org.eclipse.aether.repository.LocalRepository;
+import org.eclipse.aether.repository.Proxy;
 import org.eclipse.aether.repository.RemoteRepository;
 import org.eclipse.aether.repository.RepositoryPolicy;
-import org.eclipse.aether.repository.Proxy;
-import org.eclipse.aether.util.repository.AuthenticationBuilder;
 import org.eclipse.aether.resolution.ArtifactRequest;
 import org.eclipse.aether.resolution.ArtifactResult;
 import org.eclipse.aether.resolution.VersionRangeRequest;
@@ -37,6 +36,7 @@
 import org.eclipse.aether.spi.connector.transport.TransporterFactory;
 import org.eclipse.aether.transport.file.FileTransporterFactory;
 import org.eclipse.aether.transport.http.HttpTransporterFactory;
+import org.eclipse.aether.util.repository.AuthenticationBuilder;
 import org.eclipse.aether.version.Version;
 
 import java.io.BufferedReader;
@@ -49,8 +49,8 @@
 import java.util.List;
 import java.util.jar.Attributes;
 import java.util.jar.JarFile;
-import java.util.regex.Pattern;
 import java.util.regex.Matcher;
+import java.util.regex.Pattern;
 
 import static org.eclipse.aether.repository.RepositoryPolicy.CHECKSUM_POLICY_WARN;
 import static org.eclipse.aether.repository.RepositoryPolicy.UPDATE_POLICY_ALWAYS;
@@ -68,40 +68,38 @@
 
     static {
         DefaultServiceLocator locator = MavenRepositorySystemUtils.newServiceLocator();
-        locator.addService(RepositoryConnectorFactory.class, BasicRepositoryConnectorFactory.class );
-        locator.addService(TransporterFactory.class, FileTransporterFactory.class );
-        locator.addService(TransporterFactory.class, HttpTransporterFactory.class );
+        locator.addService(RepositoryConnectorFactory.class, BasicRepositoryConnectorFactory.class);
+        locator.addService(TransporterFactory.class, FileTransporterFactory.class);
+        locator.addService(TransporterFactory.class, HttpTransporterFactory.class);
 
-        locator.setErrorHandler( new DefaultServiceLocator.ErrorHandler()
-        {
+        locator.setErrorHandler(new DefaultServiceLocator.ErrorHandler() {
             @Override
-            public void serviceCreationFailed( Class<?> type, Class<?> impl, Throwable exception )
-            {
+            public void serviceCreationFailed(Class<?> type, Class<?> impl, Throwable exception) {
                 exception.printStackTrace();
             }
-        } );
+        });
 
-        AetherResolver.system = locator.getService( RepositorySystem.class );
+        AetherResolver.system = locator.getService(RepositorySystem.class);
 
         DefaultRepositorySystemSession session = MavenRepositorySystemUtils.newSession();
 
-        LocalRepository localRepo = new LocalRepository("target/local-repo" );
-        session.setLocalRepositoryManager( system.newLocalRepositoryManager( session, localRepo ) );
+        LocalRepository localRepo = new LocalRepository("target/local-repo");
+        session.setLocalRepositoryManager(system.newLocalRepositoryManager(session, localRepo));
 
         //session.setTransferListener( new ConsoleTransferListener() );
         //session.setRepositoryListener( new ConsoleRepositoryListener() );
         AetherResolver.session = session;
     }
 
-    public static BuckArtifact getArtifact(String name, String uri, String repo, boolean generateForBazel) {
-        return new AetherResolver(repo).build(name, uri, generateForBazel);
+    public static BazelArtifact getArtifact(String name, String uri, String repo) {
+        return new AetherResolver(repo).build(name, uri);
     }
 
     private AetherResolver(String repoUrl) {
         this.repoUrl = repoUrl;
     }
 
-    private BuckArtifact build(String name, String uri, boolean generateForBazel) {
+    private BazelArtifact build(String name, String uri) {
         uri = uri.replaceFirst("mvn:", "");
         Artifact artifact = new DefaultArtifact(uri);
         String originalVersion = artifact.getVersion();
@@ -113,20 +111,20 @@
 
             if (originalVersion.endsWith("-SNAPSHOT")) {
                 String url = String.format("%s/%s/%s/%s/%s-%s.%s",
-                                            repoUrl,
-                                            artifact.getGroupId().replace('.', '/'),
-                                            artifact.getArtifactId(),
-                                            originalVersion,
-                                            artifact.getArtifactId(),
-                                            artifact.getVersion(),
-                                            artifact.getExtension());
+                                           repoUrl,
+                                           artifact.getGroupId().replace('.', '/'),
+                                           artifact.getArtifactId(),
+                                           originalVersion,
+                                           artifact.getArtifactId(),
+                                           artifact.getVersion(),
+                                           artifact.getExtension());
                 String mavenCoords = String.format("%s:%s:%s",
                                                    artifact.getGroupId(),
                                                    artifact.getArtifactId(),
                                                    originalVersion);
-                return BuckArtifact.getArtifact(name, url, sha, mavenCoords, osgiReady, generateForBazel);
+                return BazelArtifact.getArtifact(name, url, sha, mavenCoords, osgiReady);
             }
-            return BuckArtifact.getArtifact(name, artifact, sha, repoUrl, osgiReady, generateForBazel);
+            return BazelArtifact.getArtifact(name, artifact, sha, repoUrl, osgiReady);
         } catch (Exception e) {
             throw new RuntimeException(e);
         }
@@ -157,13 +155,13 @@
 
         // artifactId-version[-classifier].version.sha1
         file.append(artifact.getArtifactId())
-            .append('-').append(artifact.getVersion());
+                .append('-').append(artifact.getVersion());
 
         if (!artifact.getClassifier().isEmpty()) {
             file.append('-').append(artifact.getClassifier());
         }
         file.append('.').append(artifact.getExtension())
-            .append(".sha1");
+                .append(".sha1");
 
         String shaPath = Paths.get(directory, file.toString()).toString();
 
@@ -177,7 +175,7 @@
         rangeRequest.setArtifact(artifact);
         rangeRequest.setRepositories(repositories());
 
-        VersionRangeResult rangeResult = system.resolveVersionRange(session, rangeRequest );
+        VersionRangeResult rangeResult = system.resolveVersionRange(session, rangeRequest);
 
         Version newestVersion = rangeResult.getHighestVersion();
 
@@ -195,19 +193,19 @@
             // set authentication
             if ((proxyHostInfo.get(2) != null) && (proxyHostInfo.get(3) != null)) {
                 central.setProxy(
-                    new Proxy(Proxy.TYPE_HTTP, proxyHostInfo.get(0), Integer.valueOf(proxyHostInfo.get(1)),
-                          new AuthenticationBuilder()
-                          .addUsername(proxyHostInfo.get(2)).addPassword(proxyHostInfo.get(3)).build()));
+                        new Proxy(Proxy.TYPE_HTTP, proxyHostInfo.get(0), Integer.valueOf(proxyHostInfo.get(1)),
+                                  new AuthenticationBuilder()
+                                          .addUsername(proxyHostInfo.get(2)).addPassword(proxyHostInfo.get(3)).build()));
             } else {
                 central.setProxy(
-                    new Proxy(Proxy.TYPE_HTTP, proxyHostInfo.get(0), Integer.valueOf(proxyHostInfo.get(1))));
+                        new Proxy(Proxy.TYPE_HTTP, proxyHostInfo.get(0), Integer.valueOf(proxyHostInfo.get(1))));
             }
         }
 
         if (repoUrl != null && repoUrl.length() > 0) {
             RemoteRepository.Builder other =
-                new RemoteRepository.Builder("temp", "default", repoUrl)
-                    .setSnapshotPolicy(new RepositoryPolicy(true, UPDATE_POLICY_ALWAYS, CHECKSUM_POLICY_WARN));
+                    new RemoteRepository.Builder("temp", "default", repoUrl)
+                            .setSnapshotPolicy(new RepositoryPolicy(true, UPDATE_POLICY_ALWAYS, CHECKSUM_POLICY_WARN));
 
             // set https_proxy
             String env_https_proxy = System.getenv("HTTPS_PROXY");
@@ -217,12 +215,12 @@
                 // set authentication
                 if ((proxyHostInfo.get(2) != null) && (proxyHostInfo.get(3) != null)) {
                     other.setProxy(
-                        new Proxy(Proxy.TYPE_HTTPS, proxyHostInfo.get(0), Integer.valueOf(proxyHostInfo.get(1)),
-                            new AuthenticationBuilder()
-                            .addUsername(proxyHostInfo.get(2)).addPassword(proxyHostInfo.get(3)).build()));
+                            new Proxy(Proxy.TYPE_HTTPS, proxyHostInfo.get(0), Integer.valueOf(proxyHostInfo.get(1)),
+                                      new AuthenticationBuilder()
+                                              .addUsername(proxyHostInfo.get(2)).addPassword(proxyHostInfo.get(3)).build()));
                 } else {
                     other.setProxy(
-                        new Proxy(Proxy.TYPE_HTTPS, proxyHostInfo.get(0), Integer.valueOf(proxyHostInfo.get(1))));
+                            new Proxy(Proxy.TYPE_HTTPS, proxyHostInfo.get(0), Integer.valueOf(proxyHostInfo.get(1))));
                 }
             }
 
diff --git a/tools/build/libgen/src/main/java/org/onosproject/libgen/BazelArtifact.java b/tools/build/libgen/src/main/java/org/onosproject/libgen/BazelArtifact.java
new file mode 100644
index 0000000..ae13b56
--- /dev/null
+++ b/tools/build/libgen/src/main/java/org/onosproject/libgen/BazelArtifact.java
@@ -0,0 +1,235 @@
+/*
+ * Copyright 2016-present Open Networking Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.onosproject.libgen;
+
+import org.eclipse.aether.artifact.Artifact;
+
+/**
+ * Representation of a remote artifact for Bazel.
+ */
+public abstract class BazelArtifact {
+
+    private final String name;
+    private final String sha;
+    private final boolean osgiReady;
+
+    public static BazelArtifact getArtifact(String name, Artifact artifact, String sha, String repo,
+                                            boolean osgiReady) {
+        return new MavenArtifact(name, artifact, sha, repo, osgiReady);
+    }
+
+    public static BazelArtifact getArtifact(String name, String url, String sha, String mavenCoords,
+                                            boolean osgiReady) {
+        return new HTTPArtifact(name, url, sha, mavenCoords, osgiReady);
+    }
+
+    public static org.onosproject.libgen.BazelArtifact getArtifact(String name, String url, String sha) {
+        return new HTTPArtifact(name, url, sha, null, true);
+    }
+
+    public BazelArtifact(String name, String sha, boolean osgiReady) {
+        this.name = name;
+        this.sha = sha;
+        this.osgiReady = osgiReady;
+    }
+
+    public String name() {
+        return name.replaceAll("[.-]", "_");
+    }
+
+    abstract String fileName();
+
+    abstract String url();
+
+    abstract String url(boolean withClassifier);
+
+    private String jarTarget() {
+        return name != null ? name() : fileName();
+    }
+
+    private boolean isPublic() {
+        return name != null;
+    }
+
+    boolean isOsgiReady() {
+        return osgiReady;
+    }
+
+    String httpUrl() {
+        return "";
+    }
+
+    String mavenCoords() {
+        return null;
+    }
+
+    String bazelExport() {
+        return "@" + jarTarget() + "//:" + jarTarget();
+    }
+
+    private boolean isJar() {
+        return fileName().endsWith(".jar");
+    }
+
+    String getMavenJarFragment() {
+        System.out.println(name + " == " + httpUrl());
+        String sha256 = BazelLibGenerator.getHttpSha256(name, httpUrl());
+        String format = "\n" +
+                "    if \"%s\" not in native.existing_rules():\n" +
+                "        java_import_external(\n" +
+                "            name = \"%s\",\n" +
+                "            jar_sha256 = \"%s\",\n" +
+                "            licenses = [\"notice\"],\n" +
+                "            jar_urls = [\"%s\"]," +
+                "        )";
+
+        return String.format(format, jarTarget(), jarTarget(), sha256, httpUrl());
+
+    }
+
+    String getFragment() {
+        String visibility = isPublic() ? "[ 'PUBLIC' ]" : "[]";
+
+        String output = (isJar() ? "remote_jar" : "remote_file") + " (\n" +
+                "  name = '%s',\n" + // jar target
+                "  out = '%s',\n" + // jar file name
+                "  url = '%s',\n" + // maven url
+                "  sha1 = '%s',\n" + // artifact sha
+                (isJar() && mavenCoords() != null ?
+                        "  maven_coords = '" + mavenCoords() + "',\n" : "") +
+                "  visibility = %s,\n" +
+                ")\n\n";
+
+        return String.format(output, jarTarget(), fileName(), url(), sha, visibility);
+    }
+
+    private static class HTTPArtifact extends BazelArtifact {
+        private final String url;
+        private final String mavenCoords;
+
+        public HTTPArtifact(String name, String url, String sha,
+                            String mavenCoords, boolean osgiReady) {
+            super(name, sha, osgiReady);
+            this.url = url;
+            this.mavenCoords = mavenCoords;
+        }
+
+        @Override
+        String fileName() {
+            String[] parts = url.split("/");
+            return parts[parts.length - 1];
+        }
+
+        @Override
+        String mavenCoords() {
+            return mavenCoords;
+        }
+
+        @Override
+        String url() {
+            return url;
+        }
+
+        @Override
+        String url(boolean withClassifier) {
+            return url;
+        }
+
+        @Override
+        String httpUrl() {
+            return url;
+        }
+    }
+
+    private static class MavenArtifact extends BazelArtifact {
+        private final Artifact artifact;
+        private final String repo;
+
+        private MavenArtifact(String name, Artifact artifact, String sha,
+                              String repo, boolean osgiReady) {
+            super(name, sha, osgiReady);
+            this.artifact = artifact;
+            this.repo = repo;
+        }
+
+        @Override
+        String url() {
+            //mvn:[repo:]groupId:artifactId:[extension:[classifier:]]:version
+            StringBuilder mvnUrl = new StringBuilder("mvn:");
+            if (repo != null && repo.length() > 0) {
+                mvnUrl.append(repo).append(':');
+            }
+            mvnUrl.append(artifact.getGroupId()).append(':')
+                    .append(artifact.getArtifactId()).append(':')
+                    .append(artifact.getExtension()).append(':');
+            if (artifact.getClassifier() != null && artifact.getClassifier().length() > 0) {
+                mvnUrl.append(artifact.getClassifier()).append(':');
+            }
+            mvnUrl.append(artifact.getVersion());
+            return mvnUrl.toString();
+        }
+
+        @Override
+        String httpUrl() {
+            return "http://repo1.maven.org/maven2/" +
+                    artifact.getGroupId().replace(".", "/") +
+                    "/" + artifact.getArtifactId() +
+                    "/" + artifact.getVersion() +
+                    "/" + artifact.getFile().getName();
+        }
+
+        @Override
+        String url(boolean withClassifier) {
+            String url = url();
+            if (withClassifier && !isOsgiReady()) {
+                int i = url.lastIndexOf(':');
+                if (i > 0) {
+                    url = url.substring(0, i) + ":NON-OSGI" + url.substring(i);
+                }
+            }
+            return url;
+        }
+
+        //FIXME get sources jars
+
+        @Override
+        String mavenCoords() {
+            String classifer = artifact.getClassifier();
+            if ("jar".equals(artifact.getExtension().toLowerCase()) &&
+                    classifer.length() == 0) {
+                // shorter form
+                return String.format("%s:%s:%s",
+                                     artifact.getGroupId(),
+                                     artifact.getArtifactId(),
+                                     artifact.getVersion());
+            }
+            return String.format("%s:%s:%s:%s:%s",
+                                 artifact.getGroupId(),
+                                 artifact.getArtifactId(),
+                                 artifact.getExtension(),
+                                 classifer,
+                                 artifact.getVersion());
+        }
+
+        @Override
+        String fileName() {
+            return String.format("%s-%s.%s",
+                                 artifact.getArtifactId(),
+                                 artifact.getVersion(),
+                                 artifact.getExtension());
+        }
+    }
+}
diff --git a/tools/build/libgen/src/main/java/org/onosproject/libgen/BazelLibGenerator.java b/tools/build/libgen/src/main/java/org/onosproject/libgen/BazelLibGenerator.java
new file mode 100755
index 0000000..991d4dd
--- /dev/null
+++ b/tools/build/libgen/src/main/java/org/onosproject/libgen/BazelLibGenerator.java
@@ -0,0 +1,320 @@
+/*
+ * Copyright 2016-present Open Networking Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.onosproject.libgen;
+
+import com.fasterxml.jackson.core.JsonParser;
+import com.fasterxml.jackson.databind.JsonNode;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.node.ObjectNode;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.PrintWriter;
+import java.net.Authenticator;
+import java.net.InetSocketAddress;
+import java.net.PasswordAuthentication;
+import java.net.Proxy;
+import java.net.URL;
+import java.net.URLConnection;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.security.MessageDigest;
+import java.security.NoSuchAlgorithmException;
+import java.time.Instant;
+import java.time.ZoneId;
+import java.time.format.DateTimeFormatter;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import java.util.Map;
+import java.util.Optional;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+import java.util.stream.Stream;
+
+/**
+ * Generates a worspace inclusion file from a JSON file containing third-party
+ * library dependencies.
+ */
+public class BazelLibGenerator {
+
+    private final ObjectNode jsonRoot;
+    private final List<BazelArtifact> artifacts = new ArrayList<>();
+    private final List<BazelLibrary> libraries = new ArrayList<>();
+
+    /**
+     * Main entry point.
+     *
+     * @param args command-line arguments; JSON input file and Bazel workspace output file
+     */
+    public static void main(String[] args) throws Exception {
+        if (args.length < 2) {
+            System.err.println("sage: onos-lib-gen <input-deps.json> <output-workspace.bzl>");
+            System.exit(5);
+        }
+
+        // Parse args
+        String jsonFilePath = args[0];
+        String outputWorkspaceFilePath = args[1];
+
+        // Load and parse input JSON file
+        ObjectMapper mapper = new ObjectMapper();
+        mapper.configure(JsonParser.Feature.ALLOW_COMMENTS, true);
+        ObjectNode json = (ObjectNode) mapper.reader()
+                .readTree(new FileInputStream(jsonFilePath));
+
+        // Traverse dependencies and build a dependency graph (DAG)
+        org.onosproject.libgen.BazelLibGenerator generator = new org.onosproject.libgen.BazelLibGenerator(json).resolve();
+
+        // Write the output workspace file
+        generator.write(outputWorkspaceFilePath);
+        System.out.printf("\nFinish writing %s\n", outputWorkspaceFilePath);
+    }
+
+    public BazelLibGenerator(ObjectNode root) {
+        this.jsonRoot = root;
+    }
+
+    private BazelArtifact parseArtifact(Map.Entry<String, JsonNode> entry) {
+        String name = entry.getKey();
+        JsonNode value = entry.getValue();
+        String uri;
+        String repo = null;
+        if (value.isTextual()) {
+            uri = value.asText();
+        } else if (value.isObject()) {
+            uri = value.get("uri").asText();
+            repo = value.get("repo").asText("");
+        } else {
+            throw new RuntimeException("Unknown element for name: " + name +
+                                               " of type: " + value.getNodeType());
+        }
+
+        System.out.print(name + " ");
+        System.out.flush();
+        BazelArtifact bazelArtifact;
+        if (uri.startsWith("http")) {
+            String sha = getHttpSha256(name, uri);
+            bazelArtifact = BazelArtifact.getArtifact(name, uri, sha);
+        } else if (uri.startsWith("mvn")) {
+            uri = uri.replaceFirst("mvn:", "");
+            bazelArtifact = AetherResolver.getArtifact(name, uri, repo);
+        } else {
+            throw new RuntimeException("Unsupported artifact uri: " + uri);
+        }
+        System.out.println(bazelArtifact.url());
+        return bazelArtifact;
+    }
+
+    private BazelLibrary parseLibrary(Map.Entry<String, JsonNode> entry) {
+        String libraryName = entry.getKey();
+        JsonNode list = entry.getValue();
+        if (list.size() == 0) {
+            throw new RuntimeException("Empty library: " + libraryName);
+        }
+
+        List<String> libraryTargets = new ArrayList<>(list.size());
+        list.forEach(node -> {
+            String name;
+            if (node.isObject()) {
+                name = node.get("name").asText();
+            } else if (node.isTextual()) {
+                name = node.asText();
+            } else {
+                throw new RuntimeException("Unknown node type: " + node.getNodeType());
+            }
+            if (!name.contains(":")) {
+                name = ':' + name;
+            }
+            libraryTargets.add(name);
+        });
+
+        return BazelLibrary.getLibrary(libraryName, libraryTargets);
+    }
+
+    public org.onosproject.libgen.BazelLibGenerator resolve() {
+        jsonRoot.get("artifacts").fields().forEachRemaining(entry -> {
+            BazelArtifact bazelArtifact = parseArtifact(entry);
+            artifacts.add(bazelArtifact);
+        });
+
+        jsonRoot.get("libraries").fields().forEachRemaining(entry -> {
+            BazelLibrary library = parseLibrary(entry);
+            libraries.add(library);
+        });
+
+        return this;
+    }
+
+    private String generateArtifacts() {
+        StringBuilder sb = new StringBuilder();
+        StringBuilder mavenJars = new StringBuilder();
+        mavenJars.append("\ndef generated_maven_jars():");
+        artifacts.forEach(artifact -> {
+            mavenJars.append(artifact.getMavenJarFragment());
+        });
+        sb.append(mavenJars);
+        return sb.toString();
+    }
+
+    private String generateArtifactMap() {
+        StringBuilder artifactMap = new StringBuilder();
+
+        artifactMap.append("\nartifact_map = {}");
+
+        artifacts.forEach(artifact -> {
+            artifactMap.append("\nartifact_map[\"" + artifact.bazelExport() + "\"] = \"" + artifact.url(true) + "\"");
+        });
+
+        artifactMap.append(
+                "\n\n" +
+                        "def maven_coordinates(label):\n" +
+                        "    label_string = str(label)\n" +
+                        "    if label_string in artifact_map:\n" +
+                        "        return artifact_map[label_string]\n" +
+                        "    if (label_string.endswith(\":jar\")):\n" +
+                        "        label_string = label_string.replace(\":jar\", \"\")\n" +
+                        "        if label_string in artifact_map:\n" +
+                        "            return artifact_map[label_string]\n" +
+                        "    if type(label) == \"string\":\n" +
+                        "        return \"mvn:%s:%s:%s\" % (ONOS_GROUP_ID, label_string, ONOS_VERSION)\n" +
+                        "    return \"mvn:%s:%s:%s\" % (ONOS_GROUP_ID, label.name, ONOS_VERSION)\n"
+        );
+
+        return artifactMap.toString();
+    }
+
+    void write(String outputFilePath) {
+        DateTimeFormatter formatter = DateTimeFormatter.RFC_1123_DATE_TIME.withZone(ZoneId.of("UTC"));
+        File outputFile = new File(outputFilePath);
+        if (!outputFile.setWritable(true)) {
+            error("Failed to make %s to writeable.", outputFilePath);
+        }
+        try (PrintWriter writer = new PrintWriter(outputFile)) {
+            writer.write(String.format(
+                    "# ***** This file was auto-generated at %s. Do not edit this file manually. *****\n",
+                    formatter.format(Instant.now())));
+            writer.write("# ***** Use onos-lib-gen *****\n");
+
+            writer.write("\nload(\"//tools/build/bazel:variables.bzl\", \"ONOS_GROUP_ID\", \"ONOS_VERSION\")\n\n");
+            writer.write("\nload(\"@bazel_tools//tools/build_defs/repo:java.bzl\", \"java_import_external\")\n\n");
+
+            libraries.forEach(library -> writer.print(library.getFragment()));
+            writer.print(generateArtifacts());
+            writer.print(generateArtifactMap());
+            writer.flush();
+        } catch (FileNotFoundException e) {
+            error("File not found: %s", outputFilePath);
+        }
+        if (!outputFile.setReadOnly()) {
+            error("Failed to set %s to read-only.", outputFilePath);
+        }
+    }
+
+    static String getHttpSha1(String name, String urlStr) {
+        return getHttpSha(name, urlStr, "SHA-1");
+    }
+
+    static String getHttpSha256(String name, String urlStr) {
+        return getHttpSha(name, urlStr, "SHA-256");
+    }
+
+    private static String getHttpSha(String name, String urlStr, String algorithm) {
+        try {
+            MessageDigest md = MessageDigest.getInstance(algorithm);
+            byte[] buffer = new byte[8192];
+
+            URL url = new URL(urlStr);
+
+            Optional<File> cache = Optional.ofNullable(System.getenv("ONOS_ROOT"))
+                    .map(Paths::get)
+                    .map(Stream::of)
+                    .orElseGet(Stream::empty)
+                    .map(Path::toFile)
+                    .filter(File::canRead)
+                    .findAny();
+
+            System.setProperty("jdk.http.auth.tunneling.disabledSchemes", "");
+
+            URLConnection connection;
+            String env_http_proxy = System.getenv("HTTP_PROXY");
+            if (env_http_proxy != null) {
+                List<String> proxyHostInfo = getProxyHostInfo(env_http_proxy);
+                Proxy http_proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress(proxyHostInfo.get(0),
+                                                                                    Integer.valueOf(proxyHostInfo.get(1))));
+
+                if ((proxyHostInfo.get(2) != null) && (proxyHostInfo.get(3) != null)) {
+                    Authenticator authenticator = new Authenticator() {
+                        public PasswordAuthentication getPasswordAuthentication() {
+                            return (new PasswordAuthentication(proxyHostInfo.get(2), proxyHostInfo.get(3).toCharArray()));
+                        }
+                    };
+
+                    Authenticator.setDefault(authenticator);
+                }
+
+                connection = url.openConnection(http_proxy);
+            } else {
+                connection = url.openConnection();
+            }
+
+            connection.connect();
+            InputStream stream = connection.getInputStream();
+
+            int read;
+            while ((read = stream.read(buffer)) >= 0) {
+                md.update(buffer, 0, read);
+            }
+            StringBuilder result = new StringBuilder();
+            byte[] digest = md.digest();
+            for (byte b : digest) {
+                result.append(String.format("%02x", b));
+            }
+            return result.toString();
+        } catch (IOException | NoSuchAlgorithmException e) {
+            throw new RuntimeException(e);
+        }
+    }
+
+    private static List<String> getProxyHostInfo(String proxyUrl) {
+        if (proxyUrl == null) {
+            return null;
+        }
+
+        // matching pattern
+        //  http://(host):(port) or http://(user):(pass)@(host):(port)
+        //  https://(host):(port) or https://(user):(pass)@(host):(port)
+        Pattern p = Pattern.compile("^(http|https):\\/\\/(([^:\\@]+):([^\\@]+)\\@)?([^:\\@\\/]+):([0-9]+)\\/?$");
+        Matcher m = p.matcher(proxyUrl);
+        if (!m.find()) {
+            return null;
+        }
+
+        // matcher group 3:user 4:pass 5:host 6:port (null if not set)
+        return Arrays.asList(m.group(5), m.group(6), m.group(3), m.group(4));
+    }
+
+    private void error(String format, String... args) {
+        if (!format.endsWith("\n")) {
+            format += '\n';
+        }
+        System.err.printf(format, args);
+        System.exit(1);
+    }
+}
diff --git a/tools/build/libgen/src/main/java/org/onosproject/libgen/BazelLibrary.java b/tools/build/libgen/src/main/java/org/onosproject/libgen/BazelLibrary.java
new file mode 100644
index 0000000..1bbbd57
--- /dev/null
+++ b/tools/build/libgen/src/main/java/org/onosproject/libgen/BazelLibrary.java
@@ -0,0 +1,76 @@
+/*
+ * Copyright 2016-present Open Networking Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.onosproject.libgen;
+
+import java.util.List;
+
+/**
+ * Representation of a java library for Bazel.
+ */
+public class BazelLibrary {
+
+    private final String name;
+    private final List<String> targets;
+
+    public static BazelLibrary getLibrary(String libraryName, List<String> libraryTargets) {
+        return new BazelLibrary(libraryName, libraryTargets);
+    }
+
+    private BazelLibrary(String name, List<String> targets) {
+        this.name = name;
+        this.targets = targets;
+    }
+
+    private String normalizeName(String name) {
+        if (!name.startsWith("//")) {
+            return name.replaceAll("[.-]", "_");
+        } else {
+            return name;
+        }
+    }
+
+    private String convertTargetName(String targetName) {
+        return normalizeName((targetName.startsWith("//") ?
+                targetName : targetName.replaceFirst(":", "@")));
+    }
+
+    private boolean isAllUpper(String s) {
+        return s.toUpperCase().equals(s);
+    }
+
+    public String name() {
+        return normalizeName(name);
+    }
+
+    public String getFragment() {
+        StringBuilder output = new StringBuilder()
+                .append(name())
+                .append(" = [");
+
+        targets.forEach(target -> {
+            if (isAllUpper(target)) {
+                output.append(String.format("] + %s + [", target.replaceFirst(":", "")));
+            } else {
+                String pathEnd = target.startsWith("//") ? "" : "//jar";
+                output.append(String.format("\n    \"%s%s\",", convertTargetName(target), pathEnd));
+            }
+        });
+        output.append("\n]\n");
+
+        return output.toString();
+    }
+
+}
\ No newline at end of file
diff --git a/tools/build/libgen/src/main/java/org/onosproject/libgen/BuckArtifact.java b/tools/build/libgen/src/main/java/org/onosproject/libgen/BuckArtifact.java
deleted file mode 100644
index 11f529a..0000000
--- a/tools/build/libgen/src/main/java/org/onosproject/libgen/BuckArtifact.java
+++ /dev/null
@@ -1,265 +0,0 @@
-/*
- * Copyright 2016-present Open Networking Foundation
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.onosproject.libgen;
-
-import org.eclipse.aether.artifact.Artifact;
-
-/**
- * Representation of a remote artifact for Buck.
- */
-public abstract class BuckArtifact {
-
-    private final String name;
-    private final String sha;
-    private final boolean osgiReady;
-    private final boolean generateForBazel;
-
-    public static BuckArtifact getArtifact(String name, Artifact artifact, String sha, String repo,
-                                           boolean osgiReady, boolean generateForBazel) {
-        return new MavenArtifact(name, artifact, sha, repo, osgiReady, generateForBazel);
-    }
-    public static BuckArtifact getArtifact(String name, String url, String sha, String mavenCoords,
-                                           boolean osgiReady, boolean generateForBazel) {
-        return new HTTPArtifact(name, url, sha, mavenCoords, osgiReady, generateForBazel);
-    }
-    public static BuckArtifact getArtifact(String name, String url, String sha, boolean generateForBazel) {
-        return new HTTPArtifact(name, url, sha, null, true, generateForBazel);
-    }
-
-    public BuckArtifact(String name, String sha, boolean osgiReady, boolean generateForBazel) {
-        this.name = name;
-        this.sha = sha;
-        this.osgiReady = osgiReady;
-        this.generateForBazel = generateForBazel;
-    }
-
-    public String name() {
-        if (!generateForBazel) {
-            return name;
-        } else {
-            return name.replaceAll("[.-]", "_");
-        }
-    }
-
-    abstract String fileName();
-
-    abstract String url();
-
-    abstract String url(boolean withClassifier);
-
-    private String jarTarget() {
-        return name != null ? name() : fileName();
-    }
-
-    private boolean isPublic() {
-        return name != null;
-    }
-
-    boolean isOsgiReady() {
-        return osgiReady;
-    }
-
-    boolean isGenerateForBazel() {
-        return generateForBazel;
-    }
-
-    String httpUrl() {
-        return "";
-    }
-
-    String mavenCoords() {
-        return null;
-    }
-
-    String bazelExport() {
-        return "@" + jarTarget() + "//:" + jarTarget();
-    }
-
-    private boolean isJar() {
-        return fileName().endsWith(".jar");
-    }
-
-    private String extractRepo() {
-        // This is a hack because the code above us already got rid of the maven repo
-        // info for artifacts
-        String url = url();
-        if (url.startsWith("http")) {
-            return url.substring(0, url.indexOf(fileName()) - mavenCoords().length() - 1);
-        } else {
-            return "";
-        }
-    }
-
-    String getBazelMavenJarFragment() {
-        System.out.println(name + " == " + httpUrl());
-
-        //String repo = extractRepo();
-        //String repoAttribute = "";
-        //if (!"".equals(repo)) {
-        //    repoAttribute = "            repository = \"" + repo + "\",\n";
-        //}
-
-        String sha256 = BuckLibGenerator.getHttpSha256(name, httpUrl());
-        String format = "\n" +
-                "    if \"%s\" not in native.existing_rules():\n" +
-                "        java_import_external(\n" +
-                "            name = \"%s\",\n" +
-                "            jar_sha256 = \"%s\",\n" +
-                "            licenses = [\"notice\"],\n" +
-                "            jar_urls = [\"%s\"]," +
-                "        )";
-
-        return String.format(format, jarTarget(), jarTarget(), sha256, httpUrl());
-
-    }
-
-    public String getBuckFragment() {
-        String visibility = isPublic() ? "[ 'PUBLIC' ]" : "[]";
-
-        String output = (isJar() ? "remote_jar" : "remote_file") + " (\n" +
-                "  name = '%s',\n" + // jar target
-                "  out = '%s',\n" + // jar file name
-                "  url = '%s',\n" + // maven url
-                "  sha1 = '%s',\n" + // artifact sha
-                ( isJar() && mavenCoords() != null ?
-                "  maven_coords = '"+ mavenCoords()+"',\n" : "" ) +
-                "  visibility = %s,\n" +
-                ")\n\n";
-
-        return String.format(output, jarTarget(), fileName(), url(), sha, visibility);
-    }
-
-    private static class HTTPArtifact extends BuckArtifact {
-        private final String url;
-        private final String mavenCoords;
-
-        public HTTPArtifact(String name, String url, String sha,
-                            String mavenCoords, boolean osgiReady, boolean generateForBazel) {
-            super(name, sha, osgiReady, generateForBazel);
-            this.url = url;
-            this.mavenCoords = mavenCoords;
-        }
-
-        @Override
-        String fileName() {
-            String[] parts = url.split("/");
-            return parts[parts.length - 1];
-        }
-
-        @Override
-        String mavenCoords() {
-            return mavenCoords;
-        }
-
-        @Override
-        String url() {
-            return url;
-        }
-
-        @Override
-        String url(boolean withClassifier) {
-            return url;
-        }
-
-        @Override
-        String httpUrl() {
-            return url;
-        }
-    }
-
-    private static class MavenArtifact extends BuckArtifact {
-        private final Artifact artifact;
-        private final String repo;
-
-        private MavenArtifact(String name, Artifact artifact, String sha,
-                              String repo, boolean osgiReady, boolean generateForBazel) {
-            super(name, sha, osgiReady, generateForBazel);
-            this.artifact = artifact;
-            this.repo = repo;
-        }
-
-        @Override
-        String url() {
-            //mvn:[repo:]groupId:artifactId:[extension:[classifier:]]:version
-            StringBuilder mvnUrl = new StringBuilder("mvn:");
-            if (repo != null && repo.length() > 0) {
-                mvnUrl.append(repo).append(':');
-            }
-            mvnUrl.append(artifact.getGroupId()).append(':')
-                  .append(artifact.getArtifactId()).append(':')
-                  .append(artifact.getExtension()).append(':');
-            if (artifact.getClassifier() != null && artifact.getClassifier().length() > 0) {
-                mvnUrl.append(artifact.getClassifier()).append(':');
-            }
-            mvnUrl.append(artifact.getVersion());
-            return mvnUrl.toString();
-        }
-
-        @Override
-        String httpUrl() {
-            return "http://repo1.maven.org/maven2/" +
-                    artifact.getGroupId().replace(".", "/") +
-                    "/" + artifact.getArtifactId() +
-                    "/" + artifact.getVersion() +
-                    "/" + artifact.getFile().getName();
-        }
-
-        @Override
-        String url(boolean withClassifier) {
-            String url = url();
-            if (withClassifier && !isOsgiReady()) {
-                int i = url.lastIndexOf(':');
-                if (i > 0) {
-                    url = url.substring(0, i) + ":NON-OSGI" + url.substring(i);
-                }
-            }
-            return url;
-        }
-
-        //FIXME get sources jars
-
-        @Override
-        String mavenCoords() {
-            String classifer = artifact.getClassifier();
-            if (!isOsgiReady() && !isGenerateForBazel()) {
-                classifer = "NON-OSGI" + classifer;
-            }
-
-            if ("jar".equals(artifact.getExtension().toLowerCase()) &&
-                    classifer.length() == 0) {
-                // shorter form
-                return String.format("%s:%s:%s",
-                                     artifact.getGroupId(),
-                                     artifact.getArtifactId(),
-                                     artifact.getVersion());
-            }
-            return String.format("%s:%s:%s:%s:%s",
-                                 artifact.getGroupId(),
-                                 artifact.getArtifactId(),
-                                 artifact.getExtension(),
-                                 classifer,
-                                 artifact.getVersion());
-        }
-
-        @Override
-        String fileName() {
-            return String.format("%s-%s.%s",
-                                 artifact.getArtifactId(),
-                                 artifact.getVersion(),
-                                 artifact.getExtension());
-        }
-    }
-}
diff --git a/tools/build/libgen/src/main/java/org/onosproject/libgen/BuckLibGenerator.java b/tools/build/libgen/src/main/java/org/onosproject/libgen/BuckLibGenerator.java
deleted file mode 100755
index 9be3ef7..0000000
--- a/tools/build/libgen/src/main/java/org/onosproject/libgen/BuckLibGenerator.java
+++ /dev/null
@@ -1,382 +0,0 @@
-/*
- * Copyright 2016-present Open Networking Foundation
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.onosproject.libgen;
-
-import com.fasterxml.jackson.core.JsonParser;
-import com.fasterxml.jackson.databind.JsonNode;
-import com.fasterxml.jackson.databind.ObjectMapper;
-import com.fasterxml.jackson.databind.node.ObjectNode;
-
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileNotFoundException;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.PrintWriter;
-import java.net.URL;
-import java.net.URLConnection;
-import java.net.PasswordAuthentication;
-import java.net.Authenticator;
-import java.net.Proxy;
-import java.net.InetSocketAddress;
-import java.nio.file.Path;
-import java.nio.file.Paths;
-import java.security.MessageDigest;
-import java.security.NoSuchAlgorithmException;
-import java.time.Instant;
-import java.time.ZoneId;
-import java.time.format.DateTimeFormatter;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
-import java.util.Map;
-import java.util.Optional;
-import java.util.stream.Stream;
-import java.util.regex.Pattern;
-import java.util.regex.Matcher;
-
-/**
- * Generates a BUCK file from a JSON file containing third-party library
- * dependencies.
- */
-public class BuckLibGenerator {
-
-//    public static final String MAVEN_COORDS = "maven_coords";
-//    public static final String COMPILE_ONLY = "compile_only";
-//    public static final String RUNTIME_ONLY = "runtime_only";
-
-    private final ObjectNode jsonRoot;
-    private final List<BuckArtifact> artifacts = new ArrayList<>();
-    private final List<BuckLibrary> libraries = new ArrayList<>();
-
-    private static boolean generateForBazel = false;
-
-    /**
-     * Main entry point.
-     *
-     * @param args command-line arguments; JSON input file and BUCK output file
-     */
-    public static void main(String[] args) throws Exception {
-        if (args.length < 2) {
-            System.err.println("Not enough args.\n\nUSAGE: <json file> <output>");
-            System.exit(5);
-        }
-
-        if (args.length == 3 && "--bazel".equals(args[2])) {
-            generateForBazel = true;
-        }
-
-        // Parse args
-        String jsonFilePath = args[0];
-        String outputBuckPath = args[1];
-
-        // Load and parse input JSON file
-        ObjectMapper mapper = new ObjectMapper();
-        mapper.configure(JsonParser.Feature.ALLOW_COMMENTS, true);
-        ObjectNode json = (ObjectNode) mapper.reader()
-                .readTree(new FileInputStream(jsonFilePath));
-
-        // Traverse dependencies and build a dependency graph (DAG)
-        BuckLibGenerator generator = new BuckLibGenerator(json).resolve();
-
-        // Write the output BUCK file
-        generator.write(outputBuckPath);
-        System.out.printf("\nFinish writing %s\n", outputBuckPath);
-    }
-
-    public BuckLibGenerator(ObjectNode root) {
-        this.jsonRoot = root;
-    }
-
-    private BuckArtifact parseArtifact(Map.Entry<String, JsonNode> entry) {
-        String name = entry.getKey();
-        JsonNode value = entry.getValue();
-        String uri;
-        String repo = null;
-        if (value.isTextual()) {
-            uri = value.asText();
-        } else if (value.isObject()) {
-            uri = value.get("uri").asText();
-            repo = value.get("repo").asText("");
-        } else {
-            throw new RuntimeException("Unknown element for name: " + name +
-                                       " of type: " + value.getNodeType());
-        }
-
-        System.out.print(name + " ");
-        System.out.flush();
-        BuckArtifact buckArtifact;
-        if (uri.startsWith("http")) {
-            String sha = generateForBazel ? getHttpSha256(name, uri) : getHttpSha1(name, uri);
-            buckArtifact = BuckArtifact.getArtifact(name, uri, sha, generateForBazel);
-        } else if (uri.startsWith("mvn")) {
-            uri = uri.replaceFirst("mvn:", "");
-//            if (repo != null) {
-//                System.out.println(name + " " + repo);
-//            }
-            buckArtifact = AetherResolver.getArtifact(name, uri, repo, generateForBazel);
-        } else {
-            throw new RuntimeException("Unsupported artifact uri: " + uri);
-        }
-        System.out.println(buckArtifact.url());
-        return buckArtifact;
-    }
-
-    private BuckLibrary parseLibrary(Map.Entry<String, JsonNode> entry) {
-        String libraryName = entry.getKey();
-        JsonNode list = entry.getValue();
-        if (list.size() == 0) {
-            throw new RuntimeException("Empty library: " + libraryName);
-        }
-
-        List<String> libraryTargets = new ArrayList<>(list.size());
-        list.forEach(node -> {
-            String name;
-            if (node.isObject()) {
-                name = node.get("name").asText();
-            } else if (node.isTextual()) {
-                name = node.asText();
-            } else {
-                throw new RuntimeException("Unknown node type: " + node.getNodeType());
-            }
-            if (!name.contains(":")) {
-                name = ':' + name;
-            }
-            libraryTargets.add(name);
-        });
-
-        return BuckLibrary.getLibrary(libraryName, libraryTargets, generateForBazel);
-    }
-
-    public BuckLibGenerator resolve() {
-        jsonRoot.get("artifacts").fields().forEachRemaining(entry -> {
-            BuckArtifact buckArtifact = parseArtifact(entry);
-            artifacts.add(buckArtifact);
-//            String artifactName = buckArtifact.name();
-//            if (artifacts.putIfAbsent(artifactName, buckArtifact) != null) {
-//                error("Duplicate artifact: %s", artifactName);
-//            }
-        });
-
-        jsonRoot.get("libraries").fields().forEachRemaining(entry -> {
-            BuckLibrary library = parseLibrary(entry);
-            libraries.add(library);
-//            String libraryName = library.name();
-//            if (libraries.putIfAbsent(libraryName, library) != null) {
-//                error("Duplicate library: %s", libraryName);
-//            }
-        });
-
-        return this;
-    }
-
-    private String generateArtifacts() {
-        StringBuilder sb = new StringBuilder();
-        if (!generateForBazel) {
-            artifacts.forEach(artifact -> sb.append(artifact.getBuckFragment()));
-        } else {
-            StringBuilder mavenJars = new StringBuilder();
-            mavenJars.append("\ndef generated_maven_jars():");
-            artifacts.forEach(artifact -> {
-                mavenJars.append(artifact.getBazelMavenJarFragment());
-            });
-            sb.append(mavenJars);
-        }
-        return sb.toString();
-    }
-
-    private String generateArtifactMap() {
-        StringBuilder artifactMap = new StringBuilder();
-
-        artifactMap.append("\nartifact_map = {}");
-
-        artifacts.forEach(artifact -> {
-            artifactMap.append("\nartifact_map[\"" + artifact.bazelExport() + "\"] = \"" + artifact.url(true) + "\"");
-        });
-
-        artifactMap.append(
-                "\n\n" +
-                "def maven_coordinates(label):\n" +
-                "    label_string = str(label)\n" +
-                "    if label_string in artifact_map:\n" +
-                "        return artifact_map[label_string]\n" +
-                "    if (label_string.endswith(\":jar\")):\n" +
-                "        label_string = label_string.replace(\":jar\", \"\")\n" +
-                "        if label_string in artifact_map:\n" +
-                "            return artifact_map[label_string]\n" +
-                "    if type(label) == \"string\":\n" +
-                "        return \"mvn:%s:%s:%s\" % (ONOS_GROUP_ID, label_string, ONOS_VERSION)\n" +
-                "    return \"mvn:%s:%s:%s\" % (ONOS_GROUP_ID, label.name, ONOS_VERSION)\n"
-        );
-
-        return artifactMap.toString();
-    }
-
-    void write(String outputFilePath) {
-        DateTimeFormatter formatter = DateTimeFormatter.RFC_1123_DATE_TIME.withZone(ZoneId.of("UTC"));
-        File outputFile = new File(outputFilePath);
-        if (!outputFile.setWritable(true)) {
-            error("Failed to make %s to writeable.", outputFilePath);
-        }
-        try (PrintWriter writer = new PrintWriter(outputFile)) {
-            writer.write(String.format(
-                    "# ***** This file was auto-generated at %s. Do not edit this file manually. *****\n",
-                    formatter.format(Instant.now())));
-            writer.write("# ***** Use onos-lib-gen *****\n");
-
-            if (!generateForBazel) {
-                // TODO - have to do this somehow for bazel
-                // rule to publish the onos dependency pom
-                writer.write("\npass_thru_pom(\n" +
-                        "    name = 'onos-dependencies-pom',\n" +
-                        "    src = 'pom.xml',\n" +
-                        "    out = 'onos-dependencies.pom',\n" +
-                        "    artifactId = 'onos-dependencies',\n" +
-                        ")\n\n");
-            } else {
-                writer.write("\nload(\"//tools/build/bazel:variables.bzl\", \"ONOS_GROUP_ID\", \"ONOS_VERSION\")\n\n");
-                writer.write("\nload(\"@bazel_tools//tools/build_defs/repo:java.bzl\", \"java_import_external\")\n\n");
-            }
-
-            libraries.forEach(library -> writer.print(library.getFragment()));
-            writer.print(generateArtifacts());
-            if (generateForBazel) {
-                writer.print(generateArtifactMap());
-            }
-            writer.flush();
-        } catch (FileNotFoundException e) {
-            error("File not found: %s", outputFilePath);
-        }
-        if (!outputFile.setReadOnly()) {
-            error("Failed to set %s to read-only.", outputFilePath);
-        }
-    }
-
-    static String getHttpSha1(String name, String urlStr) {
-        return getHttpSha(name, urlStr, "SHA-1");
-    }
-
-    static String getHttpSha256(String name, String urlStr) {
-        return getHttpSha(name, urlStr, "SHA-256");
-    }
-
-    private static String getHttpSha(String name, String urlStr, String algorithm) {
-        try {
-            MessageDigest md = MessageDigest.getInstance(algorithm);
-            byte[] buffer = new byte[8192];
-
-            URL url = new URL(urlStr);
-            String fname = new File(url.getPath()).getName();
-
-            // naively look for cache in buck-out/gen/
-            // only works for `buck fetch`-ed artifacts
-            // (=doesn't work for bndexe unless manually fetched)
-            Optional<File> cache = Optional.ofNullable(System.getenv("ONOS_ROOT"))
-                .map(Paths::get)
-                .map(Stream::of)
-                .orElseGet(Stream::empty)
-                // look for remote_file, remote_jar path
-                .flatMap(root -> Stream.of(root.resolve("buck-out/gen/lib/" + name + "/" + fname),
-                                           root.resolve("buck-out/gen/lib/" + fname + "/" + fname)))
-                .map(Path::toFile)
-                .filter(File::canRead)
-                .findAny();
-
-            if (cache.isPresent() && !generateForBazel) {
-                try (FileInputStream stream = new FileInputStream(cache.get())) {
-                    int read;
-                    while ((read = stream.read(buffer)) >= 0) {
-                        md.update(buffer, 0, read);
-                    }
-                    StringBuilder result = new StringBuilder();
-                    byte[] digest = md.digest();
-                    for (byte b : digest) {
-                        result.append(String.format("%02x", b));
-                    }
-                    return result.toString();
-                } catch (IOException e) {
-                    // fall back to regular download
-                }
-            }
-
-            System.setProperty("jdk.http.auth.tunneling.disabledSchemes", "");
-
-            URLConnection connection;
-            String env_http_proxy = System.getenv("HTTP_PROXY");
-            if (env_http_proxy != null) {
-                List<String> proxyHostInfo = getProxyHostInfo(env_http_proxy);
-                Proxy http_proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress(proxyHostInfo.get(0),
-                                             Integer.valueOf(proxyHostInfo.get(1))));
-
-                if ((proxyHostInfo.get(2) != null) && (proxyHostInfo.get(3) != null)) {
-                    Authenticator authenticator = new Authenticator() {
-                        public PasswordAuthentication getPasswordAuthentication() {
-                            return (new PasswordAuthentication(proxyHostInfo.get(2), proxyHostInfo.get(3).toCharArray()));
-                        }
-                    };
-
-                    Authenticator.setDefault(authenticator);
-                }
-
-                connection = url.openConnection(http_proxy);
-            } else {
-                connection = url.openConnection();
-            }
-
-            connection.connect();
-            InputStream stream = connection.getInputStream();
-
-            int read;
-            while ((read = stream.read(buffer)) >= 0) {
-                md.update(buffer, 0, read);
-            }
-            StringBuilder result = new StringBuilder();
-            byte[] digest = md.digest();
-            for (byte b : digest) {
-                result.append(String.format("%02x", b));
-            }
-            return result.toString();
-        } catch (IOException | NoSuchAlgorithmException e) {
-            throw new RuntimeException(e);
-        }
-    }
-
-    private static List<String> getProxyHostInfo(String proxyUrl) {
-        if (proxyUrl == null) {
-            return null;
-        }
-
-        // matching pattern
-        //  http://(host):(port) or http://(user):(pass)@(host):(port)
-        //  https://(host):(port) or https://(user):(pass)@(host):(port)
-        Pattern p = Pattern.compile("^(http|https):\\/\\/(([^:\\@]+):([^\\@]+)\\@)?([^:\\@\\/]+):([0-9]+)\\/?$");
-        Matcher m = p.matcher(proxyUrl);
-        if (!m.find()) {
-            return null;
-        }
-
-        // matcher group 3:user 4:pass 5:host 6:port (null if not set)
-        return Arrays.asList(m.group(5), m.group(6), m.group(3), m.group(4));
-    }
-
-    private void error(String format, String... args) {
-        if (!format.endsWith("\n")) {
-            format += '\n';
-        }
-        System.err.printf(format, args);
-        System.exit(1);
-    }
-}
diff --git a/tools/build/libgen/src/main/java/org/onosproject/libgen/BuckLibrary.java b/tools/build/libgen/src/main/java/org/onosproject/libgen/BuckLibrary.java
deleted file mode 100644
index bb89581..0000000
--- a/tools/build/libgen/src/main/java/org/onosproject/libgen/BuckLibrary.java
+++ /dev/null
@@ -1,109 +0,0 @@
-/*
- * Copyright 2016-present Open Networking Foundation
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.onosproject.libgen;
-
-import org.eclipse.aether.artifact.Artifact;
-
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
-
-/**
- * Representation of a java library for Buck.
- */
-public class BuckLibrary {
-
-    private final String name;
-    private final List<String> targets;
-    private final boolean generateForBazel;
-
-    private final Set<Artifact> provided = new HashSet<>();
-    private final Set<Artifact> runtime = new HashSet<>();
-
-    public static BuckLibrary getLibrary(String libraryName, List<String> libraryTargets, boolean generateForBazel) {
-        return new BuckLibrary(libraryName, libraryTargets, generateForBazel);
-    }
-
-    private BuckLibrary(String name, List<String> targets, boolean generateForBazel) {
-        this.name = name;
-        this.targets = targets;
-        this.generateForBazel = generateForBazel;
-    }
-
-    private String normalizeName(String name) {
-        if (!name.startsWith("//")) {
-            return name.replaceAll("[.-]", "_");
-        } else {
-            return name;
-        }
-    }
-
-    private String convertBuckTargetName(String buckTargetName) {
-        return normalizeName((buckTargetName.startsWith("//") ?
-                buckTargetName : buckTargetName.replaceFirst(":", "@")));
-    }
-
-    private boolean isAllUpper(String s) {
-        return s.toUpperCase().equals(s);
-    }
-
-    public String name() {
-        if (!generateForBazel) {
-            return name;
-        } else {
-            return normalizeName(name);
-        }
-    }
-
-    public String getFragment() {
-        if (generateForBazel) {
-            return getBazelFragment();
-        } else {
-            return getBuckFragment();
-        }
-    }
-
-    private String getBazelFragment() {
-        StringBuilder output = new StringBuilder()
-                .append(name())
-                .append(" = [");
-
-        targets.forEach(target -> {
-            if (isAllUpper(target)) {
-                output.append(String.format("] + %s + [", target.replaceFirst(":", "")));
-            } else {
-                String pathEnd = target.startsWith("//") ? "" : "//jar";
-                output.append(String.format("\n    \"%s%s\",", convertBuckTargetName(target), pathEnd));
-            }
-        });
-        output.append("\n]\n");
-
-        return output.toString();
-    }
-
-    private String getBuckFragment() {
-        StringBuilder output = new StringBuilder()
-                .append("osgi_feature_group(\n")
-                .append(String.format("  name = '%s',\n", name))
-                .append("  visibility = ['PUBLIC'],\n")
-                .append("  exported_deps = [");
-
-        targets.forEach(target -> output.append(String.format("\n    '%s',", target)));
-        output.append("\n  ],\n)\n\n");
-
-        return output.toString();
-    }
-}
\ No newline at end of file
diff --git a/tools/build/onos-buck b/tools/build/onos-buck
deleted file mode 100755
index 0a839e0..0000000
--- a/tools/build/onos-buck
+++ /dev/null
@@ -1,130 +0,0 @@
-#!/bin/bash
-# -----------------------------------------------------------------------------
-# Runs the custom version of Buck required by ONOS.
-# -----------------------------------------------------------------------------
-
-set -e
-
-BUCK_URL="http://repo1.maven.org/maven2/org/onosproject/onos-buck/v2018.02.09.01/buck-v2018.02.09.01.zip"
-BUCK_SHA="45d8bd28f441991257babf89f7a317edb3a2b536"
-
-# onos-yang-tools buck plugin version
-YANG_VER="2.5"
-ONOS_PLUGIN_VER="1.0.3"
-MAVEN_BASE="https://repo1.maven.org/maven2"
-MAVEN_ONOSPROJECT="$MAVEN_BASE/org/onosproject"
-
-[  "-U" = "$1" ] && shift && FORCE_UPDATE=True
-
-ROOT_DIR=${ONOS_ROOT:-"$( cd "$( dirname "${BASH_SOURCE[0]}" )/../.." && pwd )"}
-
-mkdir -p $ROOT_DIR/bin
-pushd $ROOT_DIR/bin > /dev/null
-
-if [ -n "$FORCE_UPDATE" ] || [ ! -f "buck" ] || [ "$BUCK_SHA" != "$(cat .buck_sha)" ]; then
-    echo "Updating Buck..." >&2
-    rm -fr .buck_version .buck_sha buck plugins
-    mkdir -p cache
-    BUCK_FILE=$(basename $BUCK_URL)
-    # Check the local cache; download to cache if required
-    [ -f "cache/$BUCK_FILE" ] || curl -o cache/$BUCK_FILE -L $BUCK_URL
-    if [ -n "$(which shasum)" ]; then
-        SHA=$(shasum cache/$BUCK_FILE | cut -d' ' -f1)
-        if [ "$SHA" != "$BUCK_SHA" ]; then
-           echo "ERROR: Downloaded SHA ($SHA) does not match expected SHA ($BUCK_SHA)" &&
-           rm -f cache/$BUCK_FILE && exit 1
-        else
-           echo "$SHA" > .buck_sha
-        fi
-    else
-        echo "SHA cannot be verified"
-    fi
-    unzip -qq cache/$BUCK_FILE
-    # Kill buckd
-    ps -ef | egrep buckd | grep -v egrep | cut -c7-11 | xargs kill 2>/dev/null || :
-    rm -rf $ROOT_DIR/buck-out
-    printf "Successfully updated Buck in $ROOT_DIR/bin/buck to $BUCK_FILE\n\n"
-fi
-
-# Fetch & install onos yang tools buck plugin
-YANG_PLUGIN_CACHE="cache/onos-yang-compiler-buck-plugin-$YANG_VER.jar"
-if hash mvn 2>/dev/null; then
-  if [[ $YANG_VER = *"-SNAPSHOT" ]] || [ ! -f "$YANG_PLUGIN_CACHE" ]; then
-    echo "Updating Yang plugin $YANG_VER..." >&2
-    ARTIFACT="org.onosproject:onos-yang-compiler-buck-plugin:$YANG_VER"
-    mvn org.apache.maven.plugins:maven-dependency-plugin:3.0.2:copy \
-        -Dartifact=$ARTIFACT \
-        -Dtransitive=false -Dmdep.overWriteSnapshots=true \
-        -DoutputDirectory=cache > /dev/null
-  fi
-else
-  if [ ! -f "$YANG_PLUGIN_CACHE" ]; then
-    echo "Updating Yang plugin $YANG_VER..." >&2
-    if [[ $YANG_VER = *"-SNAPSHOT" ]]; then
-      echo "mvn command must be installed to handle SNAPSHOT version"
-      exit 1
-    fi
-
-    curl -o "$YANG_PLUGIN_CACHE" \
-      -L $MAVEN_ONOSPROJECT/onos-yang-compiler-buck-plugin/$YANG_VER/onos-yang-compiler-buck-plugin-$YANG_VER.jar
-  fi
-
-  if [[ $YANG_VER != *"-SNAPSHOT" ]] && hash shasum 2>/dev/null; then
-    SHA=$(shasum $YANG_PLUGIN_CACHE | cut -d' ' -f1)
-    if [ ! -f "$YANG_PLUGIN_CACHE".sha1 ]; then
-      curl -o "$YANG_PLUGIN_CACHE".sha1 \
-        -L $MAVEN_ONOSPROJECT/onos-yang-compiler-buck-plugin/$YANG_VER/onos-yang-compiler-buck-plugin-$YANG_VER.jar.sha1
-    fi
-    YANG_PLUGIN_SHA=$(cat "$YANG_PLUGIN_CACHE".sha1)
-    if [ "$SHA" != "$YANG_PLUGIN_SHA" ]; then
-       echo "ERROR: Downloaded SHA ($SHA) did not match expected SHA ($YANG_PLUGIN_SHA)" &&
-       rm -f $YANG_PLUGIN_CACHE $YANG_PLUGIN_CACHE.sha1 && exit 1
-     fi
-  else
-    echo "SHA verification skipped"
-  fi
-fi
-install -Cv "$YANG_PLUGIN_CACHE" plugins/yang.jar >/dev/null
-
-# Fetch & install onos buck plugin
-
-ONOS_PLUGIN_CACHE="cache/onos-buck-plugin-$ONOS_PLUGIN_VER.jar"
-
-if [ ! -f "$ONOS_PLUGIN_CACHE" ]; then
-  echo "Updating ONOS plugin $ONOS_PLUGIN_VER..." >&2
-  curl -o "$ONOS_PLUGIN_CACHE" \
-    -L $MAVEN_ONOSPROJECT/onos-buck-plugin/$ONOS_PLUGIN_VER/onos-buck-plugin-$ONOS_PLUGIN_VER.jar
-fi
-
-
-if hash shasum 2>/dev/null; then
-  SHA=$(shasum $ONOS_PLUGIN_CACHE | cut -d' ' -f1)
-  if [ ! -f "$ONOS_PLUGIN_CACHE".sha1 ]; then
-    curl -o "$ONOS_PLUGIN_CACHE".sha1 \
-         -L $MAVEN_ONOSPROJECT/onos-buck-plugin/$ONOS_PLUGIN_VER/onos-buck-plugin-$ONOS_PLUGIN_VER.jar.sha1
-  fi
-  ONOS_PLUGIN_SHA=$(cat "$ONOS_PLUGIN_CACHE".sha1)
-  if [ "$SHA" != "$ONOS_PLUGIN_SHA" ]; then
-    echo "ERROR: Downloaded SHA ($SHA) did not match expected SHA ($ONOS_PLUGIN_SHA)" &&
-      rm -f $ONOS_PLUGIN_CACHE $ONOS_PLUGIN_CACHE.sha1 && exit 1
-  fi
-else
-    echo "SHA verification skipped"
-fi
-install -Cv "$ONOS_PLUGIN_CACHE" plugins/onos.jar >/dev/null
-
-popd > /dev/null
-
-BUCK=$ROOT_DIR/bin/buck
-
-if [ "${ONOS_NO_BUCKD:-1}" == "1" ]; then
-  export NO_BUCKD=1
-fi
-
-# HACK: Clean-up frequent problem-causers from buck-out
-#rm -fr \
-#    $ONOS_ROOT/buck-out/bin/lib/.netty \
-#    $ONOS_ROOT/buck-out/bin/lib/.KRYO
-
-# Finally, run the Buck command...
-$BUCK "$@"
diff --git a/tools/build/onos-buck-build-docs b/tools/build/onos-buck-build-docs
deleted file mode 100755
index 658a539..0000000
--- a/tools/build/onos-buck-build-docs
+++ /dev/null
@@ -1,12 +0,0 @@
-#!/bin/bash
-# -----------------------------------------------------------------------------
-# Builds the ONOS Java API docs with buck.
-# -----------------------------------------------------------------------------
-
-set -e
-
-[ ! -d "$ONOS_ROOT" ] && echo "ONOS_ROOT is not defined" >&2 && exit 1
-. $ONOS_ROOT/tools/build/envDefaults
-
-onos-buck build  `onos-buck query "filter('.*-javadoc', '//...')"`
-
diff --git a/tools/build/onos-buck-publish b/tools/build/onos-buck-publish
deleted file mode 100755
index a4db536..0000000
--- a/tools/build/onos-buck-publish
+++ /dev/null
@@ -1,53 +0,0 @@
-#!/bin/bash
-#
-# Script that queries buck for main and test artifacts and publishes them to
-# a remote Maven repository. Main artifacts are published with javadoc and sources
-# jars and auto-generated pom.xml files. Test artifacts are published as compiled
-# jars only. All artifacts are signed.
-#
-
-ARTIFACT_PUB=$(mktemp /tmp/onos-publish.XXXXX) &&
-  echo "Created temp file for artifact publish: $ARTIFACT_PUB" ||
-  { echo "Failed to create temp file"; exit 1; }
-
-TEST_PUB=$(mktemp /tmp/onos-publish-tests.XXXXX) &&
-  echo "Created temp file for test artifact publish: $TEST_PUB" ||
-  { echo "Failed to create temp file"; exit 1; }
-
-trap "rm -f $ARTIFACT_PUB $ARTIFACT_PUB.bak $TEST_PUB $TEST_PUB.bak" EXIT
-
-set -e
-set -x
-
-# Prepare artifact publish commands
-cat ${ONOS_ROOT}/tools/build/publish-target-list | grep -v '#' >> $ARTIFACT_PUB
-sed -i.bak 's/^/onos-buck publish --to-maven-central --include-source --include-javadoc --sign /g' $ARTIFACT_PUB
-cp $ARTIFACT_PUB $ARTIFACT_PUB.bak
-( echo "set -e"; cat $ARTIFACT_PUB.bak ) >$ARTIFACT_PUB
-
-# Print commands to be run and then run them
-cat $ARTIFACT_PUB
-bash $ARTIFACT_PUB
-
-# Prepare feature commands
-onos-buck query "filter('.*-feature', deps(filter('.*-oar', deps('//tools/package:onos-package', 1)),1))" > $TEST_PUB
-echo "//tools/package:onos-features" >> $TEST_PUB
-
-# Prepare test commands
-cat ${ONOS_ROOT}/tools/build/publish-test-target-list | grep -v '#' >> $TEST_PUB
-sed -i.bak 's#^#onos-buck publish --to-maven-central --sign #g' $TEST_PUB
-cp $TEST_PUB $TEST_PUB.bak
-( echo "set -e"; cat $TEST_PUB.bak ) >$TEST_PUB
-
-# Print commands to be run and then run them
-cat $TEST_PUB
-bash $TEST_PUB
-
-# stage ONOS poms
-onos-buck publish --to-maven-central --sign //:top-level-pom
-onos-buck publish --to-maven-central --sign //lib:onos-dependencies-pom
-
-if ! grep "maven_url" $ONOS_ROOT/.buckconfig.local | grep -v '#' | grep -q snapshots ; then
-    # Close the staging area
-    onos-close-staging
-fi
diff --git a/tools/build/onos-buck-publish-local b/tools/build/onos-buck-publish-local
deleted file mode 100755
index 6c52db7..0000000
--- a/tools/build/onos-buck-publish-local
+++ /dev/null
@@ -1,10 +0,0 @@
-#!/bin/bash
-
-set -e
-onos-buck -V
-
-for package in `cat ${ONOS_ROOT}/tools/build/publish-target-list ${ONOS_ROOT}/tools/build/publish-test-target-list | grep -v '#'`; do
-    onos-buck publish --to-local-repo ${package}
-done
-
-
diff --git a/tools/build/onos-lib-gen b/tools/build/onos-lib-gen
index 3a083f8..4030271 100755
--- a/tools/build/onos-lib-gen
+++ b/tools/build/onos-lib-gen
@@ -9,7 +9,7 @@
 cd $ONOS_ROOT
 
 REPO=${M2_REPO:-~/.m2/repository}
-VER=1.5
+VER=2.0
 ARTIFACT=org/onosproject/onos-libgen/$VER/onos-libgen-$VER.jar
 JAR=$REPO/$ARTIFACT
 
@@ -21,5 +21,4 @@
     [ -f $JAR ] && printf "Done.\n"
 fi
 
-[ -z "$1" -o "$1" = "bazel" ] && java -jar $JAR lib/deps.json tools/build/bazel/generate_workspace.bzl --bazel
-[ -z "$1" -o "$1" = "buck" ] && java -jar $JAR lib/deps.json lib/BUCK
+java -jar $JAR lib/deps.json tools/build/bazel/generate_workspace.bzl --bazel
\ No newline at end of file
diff --git a/tools/build/onos-prepare-sonar b/tools/build/onos-prepare-sonar
index 75946ab..1798fda 100755
--- a/tools/build/onos-prepare-sonar
+++ b/tools/build/onos-prepare-sonar
@@ -12,7 +12,7 @@
 from subprocess import call, check_call, check_output
 
 # FIXME pull the version from the Buck version file
-ONOS_VERSION='1.15.0-SNAPSHOT'
+ONOS_VERSION='2.0.0-SNAPSHOT'
 
 # SonarQube property file name and template
 FILE_NAME = 'sonar-project.properties'
diff --git a/tools/build/publish-target-list b/tools/build/publish-target-list
index ca03dec..da1997f 100644
--- a/tools/build/publish-target-list
+++ b/tools/build/publish-target-list
@@ -12,6 +12,8 @@
     //core/store/dist:onos-core-dist
     //core/store/persistence:onos-core-persistence
     //core/store/serializers:onos-core-serializers
+    //drivers/utilities:onos-drivers-utilities
+    //drivers/netconf:onos-drivers-netconf
     //incubator/api:onos-incubator-api
     //incubator/net:onos-incubator-net
     //incubator/rpc:onos-incubator-rpc
diff --git a/tools/build/push-buck-plugin b/tools/build/push-buck-plugin
deleted file mode 100755
index 97df2e5..0000000
--- a/tools/build/push-buck-plugin
+++ /dev/null
@@ -1,31 +0,0 @@
-#!/bin/bash
-# -----------------------------------------------------------------------------
-# Builds and uploads an ONOS buck plugin release
-# -----------------------------------------------------------------------------
-
-if [ $# -ne 1 ]; then
-    echo "Usage: push-buck-plugin version"
-    exit 1
-fi
-
-PLUGIN_VERSION="$1"
-PLUGIN_FILE="buck-out/gen/tools/build/buck-plugin/onos.jar"
-UPLOAD_BASE="https://oss.sonatype.org/service/local/staging/deploy/maven2/org/onosproject/onos-buck-plugin/$PLUGIN_VERSION"
-
-# Build the buck plugin
-onos-buck build //tools/build/buck-plugin:onos
-
-# Make the signature file
-gpg --armor --detach-sig $PLUGIN_FILE
-
-# Make the MD5 checksum file
-md5 -q $PLUGIN_FILE >$PLUGIN_FILE.md5
-
-# Make the SHA1 checksum file
-( shasum $PLUGIN_FILE | cut -d' ' -f1 ) > $PLUGIN_FILE.sha1
-
-curl -v -u "$SONATYPE_USER:$SONATYPE_PASSWORD" --upload-file $PLUGIN_FILE $UPLOAD_BASE/onos-buck-plugin-$PLUGIN_VERSION.jar
-curl -v -u "$SONATYPE_USER:$SONATYPE_PASSWORD" --upload-file $PLUGIN_FILE.asc $UPLOAD_BASE/onos-buck-plugin-$PLUGIN_VERSION.jar.asc
-curl -v -u "$SONATYPE_USER:$SONATYPE_PASSWORD" --upload-file $PLUGIN_FILE.md5 $UPLOAD_BASE/onos-buck-plugin-$PLUGIN_VERSION.jar.md5
-curl -v -u "$SONATYPE_USER:$SONATYPE_PASSWORD" --upload-file $PLUGIN_FILE.sha1 $UPLOAD_BASE/onos-buck-plugin-$PLUGIN_VERSION.jar.sha1
-
diff --git a/tools/build/swagger/BUILD b/tools/build/swagger/BUILD
new file mode 100644
index 0000000..fff3296
--- /dev/null
+++ b/tools/build/swagger/BUILD
@@ -0,0 +1,16 @@
+SWAGGER_EXECUTABLE = "swagger_generator"
+
+COMPILE_DEPS = JACKSON + [
+    "@com_google_guava_guava//jar",
+    "@qdox//jar",
+    "@org_apache_felix_scr_bnd//jar",
+]
+
+java_binary(
+    name = SWAGGER_EXECUTABLE,
+    srcs = glob(["src/main/java/org/onosproject/swagger/SwaggerGenerator.java"]),
+    main_class = "org.onosproject.swagger.SwaggerGenerator",
+    resources = glob(["src/main/resources/registrator.javat"]),
+    visibility = ["//visibility:public"],
+    deps = COMPILE_DEPS,
+)
diff --git a/tools/build/swagger/src/main/java/org/onosproject/swagger/SwaggerGenerator.java b/tools/build/swagger/src/main/java/org/onosproject/swagger/SwaggerGenerator.java
new file mode 100644
index 0000000..f2c6658
--- /dev/null
+++ b/tools/build/swagger/src/main/java/org/onosproject/swagger/SwaggerGenerator.java
@@ -0,0 +1,566 @@
+/*
+ * Copyright 2016-present Open Networking Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.onosproject.swagger;
+
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.node.ArrayNode;
+import com.fasterxml.jackson.databind.node.ObjectNode;
+import com.google.common.collect.ImmutableList;
+import com.google.common.io.ByteStreams;
+import com.google.common.io.Files;
+import com.thoughtworks.qdox.JavaProjectBuilder;
+import com.thoughtworks.qdox.model.DocletTag;
+import com.thoughtworks.qdox.model.JavaAnnotation;
+import com.thoughtworks.qdox.model.JavaClass;
+import com.thoughtworks.qdox.model.JavaMethod;
+import com.thoughtworks.qdox.model.JavaParameter;
+import com.thoughtworks.qdox.model.JavaType;
+
+import java.io.File;
+import java.io.FileWriter;
+import java.io.IOException;
+import java.io.PrintWriter;
+import java.time.Year;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Optional;
+
+import static com.google.common.base.Strings.isNullOrEmpty;
+
+/**
+ * Generates Swagger JSON artifacts from the Java source files.
+ */
+public class SwaggerGenerator {
+
+    private final ObjectMapper mapper = new ObjectMapper();
+
+    private static final String JSON_FILE = "swagger.json";
+    private static final String GEN_SRC = "generated-sources";
+    private static final String REG_SRC = "/registrator.javat";
+
+    private static final String PATH = "javax.ws.rs.Path";
+    private static final String PATH_PARAM = "javax.ws.rs.PathParam";
+    private static final String QUERY_PARAM = "javax.ws.rs.QueryParam";
+    private static final String POST = "javax.ws.rs.POST";
+    private static final String PATCH = "javax.ws.rs.PATCH";
+    private static final String GET = "javax.ws.rs.GET";
+    private static final String PUT = "javax.ws.rs.PUT";
+    private static final String DELETE = "javax.ws.rs.DELETE";
+    private static final String PRODUCES = "javax.ws.rs.Produces";
+    private static final String CONSUMES = "javax.ws.rs.Consumes";
+    private static final String JSON = "MediaType.APPLICATION_JSON";
+    private static final String OCTET_STREAM = "MediaType.APPLICATION_OCTET_STREAM";
+    private static final String RESPONSES = "io.swagger.annotations.ApiResponses";
+
+    private final List<File> srcs;
+    private final List<File> resources;
+    private final File srcDirectory;
+    private final File resourceDirectory;
+    private final File genSrcOutputDirectory;
+    private final File genResourcesOutputDirectory;
+    private final String webContext;
+    private final String apiTitle;
+    private final String apiVersion;
+    private final String apiPackage;
+    private final String apiDescription;
+
+    private String x(File f) {
+        return f == null ? "null" : f.getAbsolutePath();
+    }
+
+    public SwaggerGenerator(List<File> srcs, List<File> resources,
+                            File srcDirectory, File resourceDirectory,
+                            File genSrcOutputDirectory, File genResourcesOutputDirectory,
+                            String webContext, String apiTitle, String apiVersion,
+                            String apiPackage, String apiDescription) {
+        this.srcs = srcs;
+        this.resources = resources;
+        this.srcDirectory = srcDirectory;
+        this.resourceDirectory = resourceDirectory;
+        this.genSrcOutputDirectory = genSrcOutputDirectory;
+        this.genResourcesOutputDirectory = genResourcesOutputDirectory;
+        this.webContext = webContext;
+
+        this.apiTitle = apiTitle;
+        this.apiVersion = apiVersion;
+        this.apiPackage = apiPackage;
+        this.apiDescription = apiDescription;
+    }
+
+    public void execute() {
+        try {
+            JavaProjectBuilder builder = new JavaProjectBuilder();
+            if (srcDirectory != null) {
+                builder.addSourceTree(new File(srcDirectory, "src/main/java"));
+            }
+            if (srcs != null) {
+                srcs.forEach(src -> {
+                    if (src.toString().endsWith(".java")) {
+                        try {
+                            builder.addSource(src);
+                        } catch (IOException e) {
+                            throw new RuntimeException(e);
+                        }
+                    }
+                });
+            }
+
+            ObjectNode root = initializeRoot(webContext, apiTitle, apiVersion, apiDescription);
+            ArrayNode tags = mapper.createArrayNode();
+            ObjectNode paths = mapper.createObjectNode();
+            ObjectNode definitions = mapper.createObjectNode();
+
+            root.set("tags", tags);
+            root.set("paths", paths);
+            root.set("definitions", definitions);
+
+            // TODO: Process resources to allow lookup of files by name
+
+            builder.getClasses().forEach(jc -> processClass(jc, paths, tags, definitions, srcDirectory));
+
+            if (paths.size() > 0) {
+                genCatalog(genResourcesOutputDirectory, root);
+                if (!isNullOrEmpty(apiPackage)) {
+                    genRegistrator(genSrcOutputDirectory, webContext, apiTitle, apiVersion,
+                                   apiPackage, apiDescription);
+                }
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+            throw new RuntimeException("Unable to generate ONOS REST API documentation", e);
+        }
+    }
+
+    // initializes top level root with Swagger required specifications
+    private ObjectNode initializeRoot(String webContext, String apiTitle,
+                                      String apiVersion, String apiDescription) {
+        ObjectNode root = mapper.createObjectNode();
+        root.put("swagger", "2.0");
+        ObjectNode info = mapper.createObjectNode();
+        root.set("info", info);
+
+        root.put("basePath", webContext);
+        info.put("version", apiVersion);
+        info.put("title", apiTitle);
+        info.put("description", apiDescription);
+
+        ArrayNode produces = mapper.createArrayNode();
+        produces.add("application/json");
+        root.set("produces", produces);
+
+        ArrayNode consumes = mapper.createArrayNode();
+        consumes.add("application/json");
+        root.set("consumes", consumes);
+
+        return root;
+    }
+
+    // Checks whether javaClass has a path tag associated with it and if it does
+    // processes its methods and creates a tag for the class on the root
+    void processClass(JavaClass javaClass, ObjectNode paths, ArrayNode tags,
+                      ObjectNode definitions, File srcDirectory) {
+        // If the class does not have a Path tag then ignore it
+        JavaAnnotation annotation = getPathAnnotation(javaClass);
+        if (annotation == null) {
+            return;
+        }
+
+        String path = getPath(annotation);
+        if (path == null) {
+            return;
+        }
+
+        String resourcePath = "/" + path;
+        String tagPath = path.isEmpty() ? "/" : path;
+
+        // Create tag node for this class.
+        ObjectNode tagObject = mapper.createObjectNode();
+        tagObject.put("name", tagPath);
+        if (javaClass.getComment() != null) {
+            tagObject.put("description", shortText(javaClass.getComment()));
+        }
+        tags.add(tagObject);
+
+        // Create an array node add to all methods from this class.
+        ArrayNode tagArray = mapper.createArrayNode();
+        tagArray.add(tagPath);
+
+        processAllMethods(javaClass, resourcePath, paths, tagArray, definitions, srcDirectory);
+    }
+
+    private JavaAnnotation getPathAnnotation(JavaClass javaClass) {
+        Optional<JavaAnnotation> optional = javaClass.getAnnotations()
+                .stream().filter(a -> a.getType().getName().equals(PATH)).findAny();
+        return optional.orElse(null);
+    }
+
+    // Checks whether a class's methods are REST methods and then places all the
+    // methods under a specific path into the paths node
+    private void processAllMethods(JavaClass javaClass, String resourcePath,
+                                   ObjectNode paths, ArrayNode tagArray, ObjectNode definitions,
+                                   File srcDirectory) {
+        // map of the path to its methods represented by an ObjectNode
+        Map<String, ObjectNode> pathMap = new HashMap<>();
+
+        javaClass.getMethods().forEach(javaMethod -> {
+            javaMethod.getAnnotations().forEach(annotation -> {
+                String name = annotation.getType().getName();
+                if (name.equals(PATCH) || name.equals(POST) || name.equals(GET) || name.equals(DELETE) ||
+                        name.equals(PUT)) {
+                    // substring(12) removes "javax.ws.rs."
+                    String method = annotation.getType().toString().substring(12).toLowerCase();
+                    processRestMethod(javaMethod, method, pathMap, resourcePath, tagArray, definitions, srcDirectory);
+                }
+            });
+        });
+
+        // for each path add its methods to the path node
+        for (Map.Entry<String, ObjectNode> entry : pathMap.entrySet()) {
+            paths.set(entry.getKey(), entry.getValue());
+        }
+
+
+    }
+
+    private void processRestMethod(JavaMethod javaMethod, String method,
+                                   Map<String, ObjectNode> pathMap,
+                                   String resourcePath, ArrayNode tagArray,
+                                   ObjectNode definitions, File srcDirectory) {
+        String fullPath = resourcePath, consumes = "", produces = "",
+                comment = javaMethod.getComment();
+        DocletTag tag = javaMethod.getTagByName("onos.rsModel");
+        for (JavaAnnotation annotation : javaMethod.getAnnotations()) {
+            String name = annotation.getType().getName();
+            if (name.equals(PATH)) {
+                fullPath = resourcePath + "/" + getPath(annotation);
+                fullPath = fullPath.replaceFirst("^//", "/");
+            }
+            if (name.equals(CONSUMES)) {
+                consumes = getIOType(annotation);
+            }
+            if (name.equals(PRODUCES)) {
+                produces = getIOType(annotation);
+            }
+        }
+        ObjectNode methodNode = mapper.createObjectNode();
+        methodNode.set("tags", tagArray);
+
+        addSummaryDescriptions(methodNode, comment);
+        addJsonSchemaDefinition(srcDirectory, definitions, tag);
+
+        processParameters(javaMethod, methodNode, method, tag);
+
+        processConsumesProduces(methodNode, "consumes", consumes);
+        processConsumesProduces(methodNode, "produces", produces);
+        if (tag == null || !(tag.getParameters().size() > 1)) {
+            addResponses(javaMethod, methodNode, tag, false);
+        } else {
+            addResponses(javaMethod, methodNode, tag, true);
+        }
+
+        ObjectNode operations = pathMap.get(fullPath);
+        if (operations == null) {
+            operations = mapper.createObjectNode();
+            operations.set(method, methodNode);
+            pathMap.put(fullPath, operations);
+        } else {
+            operations.set(method, methodNode);
+        }
+    }
+
+    private void addJsonSchemaDefinition(File srcDirectory, ObjectNode definitions, DocletTag tag) {
+        final File definitionsDirectory;
+        if (resourceDirectory != null) {
+            definitionsDirectory = new File(resourceDirectory, "definitions");
+        } else if (srcDirectory != null) {
+            definitionsDirectory = new File(srcDirectory + "/src/main/resources/definitions");
+        } else {
+            definitionsDirectory = null;
+        }
+        if (tag != null) {
+            tag.getParameters().forEach(param -> {
+                try {
+                    File config;
+                    if (definitionsDirectory != null) {
+                        config = new File(definitionsDirectory.getAbsolutePath() + "/" + param + ".json");
+                    } else {
+                        config = resources.stream().filter(f -> f.getName().equals(param + ".json")).findFirst().orElse(null);
+                    }
+                    definitions.set(param, mapper.readTree(config));
+                } catch (IOException e) {
+                    throw new RuntimeException(String.format("Could not process %s in %s@%s: %s",
+                                                             tag.getName(), tag.getContext(), tag.getLineNumber(),
+                                                             e.getMessage()), e);
+                }
+            });
+        }
+    }
+
+    private void processConsumesProduces(ObjectNode methodNode, String type, String io) {
+        if (!io.equals("")) {
+            ArrayNode array = mapper.createArrayNode();
+            methodNode.set(type, array);
+            array.add(io);
+        }
+    }
+
+    private void addSummaryDescriptions(ObjectNode methodNode, String comment) {
+        String summary = "", description;
+        if (comment != null) {
+            if (comment.contains(".")) {
+                int periodIndex = comment.indexOf(".");
+                summary = comment.substring(0, periodIndex);
+                description = comment.length() > periodIndex + 1 ?
+                        comment.substring(periodIndex + 1).trim() : "";
+            } else {
+                description = comment;
+            }
+            methodNode.put("summary", summary);
+            methodNode.put("description", description);
+        }
+    }
+
+    private Optional<JavaAnnotation> getResponsesAnnotation(JavaMethod javaMethod) {
+        return javaMethod.getAnnotations().stream().filter(
+                a -> a.getType().getName().equals(RESPONSES)
+        ).findAny();
+    }
+
+    // TODO: add json schema for responses
+    private void addResponses(JavaMethod javaMethod, ObjectNode methodNode, DocletTag tag, boolean responseJson) {
+        ObjectNode responses = mapper.createObjectNode();
+        methodNode.set("responses", responses);
+
+        Optional<JavaAnnotation> responsesAnnotation = getResponsesAnnotation(javaMethod);
+
+        if (responsesAnnotation.isPresent()) {
+            Object annotationsObj = responsesAnnotation.get().getNamedParameter("value");
+            if (annotationsObj != null && annotationsObj instanceof List) {
+                List<JavaAnnotation> responseAnnotation = (List<JavaAnnotation>) annotationsObj;
+                responseAnnotation.forEach(
+                        javaAnnotation -> {
+                            ObjectNode response = mapper.createObjectNode();
+                            response.put("description",
+                                    String.valueOf(javaAnnotation.getNamedParameter("message"))
+                                            .replaceAll("^\"|\"$", ""));
+                            responses.set(String.valueOf(javaAnnotation.getNamedParameter("code")), response);
+                        }
+                );
+            }
+        } else {
+            ObjectNode success = mapper.createObjectNode();
+            success.put("description", "successful operation");
+            responses.set("200", success);
+
+            ObjectNode defaultObj = mapper.createObjectNode();
+            defaultObj.put("description", "Unexpected error");
+            responses.set("default", defaultObj);
+
+            if (tag != null && responseJson) {
+                ObjectNode schema = mapper.createObjectNode();
+                tag.getParameters().stream().forEach(
+                        param -> schema.put("$ref", "#/definitions/" + param));
+                success.set("schema", schema);
+            }
+        }
+    }
+
+    // Checks if the annotations has a value of JSON and returns the string
+    // that Swagger requires
+    private String getIOType(JavaAnnotation annotation) {
+        if (annotation.getNamedParameter("value").toString().equals(JSON)) {
+            return "application/json";
+        } else if (annotation.getNamedParameter("value").toString().equals(OCTET_STREAM)) {
+            return "application/octet_stream";
+        }
+        return "";
+    }
+
+    // If the annotation has a Path tag, returns the value with leading and
+    // trailing double quotes and slash removed.
+    private String getPath(JavaAnnotation annotation) {
+        String path = annotation.getNamedParameter("value").toString();
+        return path == null ? null : path.replaceAll("(^[\\\"/]*|[/\\\"]*$)", "");
+    }
+
+    // Processes parameters of javaMethod and enters the proper key-values into the methodNode
+    private void processParameters(JavaMethod javaMethod, ObjectNode methodNode, String method, DocletTag tag) {
+        ArrayNode parameters = mapper.createArrayNode();
+        methodNode.set("parameters", parameters);
+        boolean required = true;
+
+        for (JavaParameter javaParameter : javaMethod.getParameters()) {
+            ObjectNode individualParameterNode = mapper.createObjectNode();
+            Optional<JavaAnnotation> optional = javaParameter.getAnnotations().stream().filter(
+                    annotation -> annotation.getType().getName().equals(PATH_PARAM) ||
+                            annotation.getType().getName().equals(QUERY_PARAM)).findAny();
+            JavaAnnotation pathType = optional.orElse(null);
+
+            String annotationName = javaParameter.getName();
+
+
+            if (pathType != null) { //the parameter is a path or query parameter
+                individualParameterNode.put("name",
+                                            pathType.getNamedParameter("value")
+                                                    .toString().replace("\"", ""));
+                if (pathType.getType().getName().equals(PATH_PARAM)) {
+                    individualParameterNode.put("in", "path");
+                } else if (pathType.getType().getName().equals(QUERY_PARAM)) {
+                    individualParameterNode.put("in", "query");
+                }
+                individualParameterNode.put("type", getType(javaParameter.getType()));
+            } else { // the parameter is a body parameter
+                individualParameterNode.put("name", annotationName);
+                individualParameterNode.put("in", "body");
+
+                // Adds the reference to the Json model for the input
+                // that goes in the post or put operation
+                if (tag != null && (method.toLowerCase().equals("post") ||
+                        method.toLowerCase().equals("put"))) {
+                    ObjectNode schema = mapper.createObjectNode();
+                    tag.getParameters().stream().forEach(param -> {
+                        schema.put("$ref", "#/definitions/" + param);
+                    });
+                    individualParameterNode.set("schema", schema);
+                }
+            }
+            for (DocletTag p : javaMethod.getTagsByName("param")) {
+                if (p.getValue().contains(annotationName)) {
+                    String description = "";
+                    if (p.getValue().split(" ", 2).length >= 2) {
+                        description = p.getValue().split(" ", 2)[1].trim();
+                        if (description.contains("optional")) {
+                            required = false;
+                        }
+                    } else {
+                        throw new RuntimeException(String.format("No description for parameter \"%s\" in " +
+                                                                         "method \"%s\" in %s (line %d)",
+                                                                 p.getValue(), javaMethod.getName(),
+                                                                 javaMethod.getDeclaringClass().getName(),
+                                                                 javaMethod.getLineNumber()));
+                    }
+                    individualParameterNode.put("description", description);
+                }
+            }
+            individualParameterNode.put("required", required);
+            parameters.add(individualParameterNode);
+        }
+    }
+
+    // Returns the Swagger specified strings for the type of a parameter
+    private String getType(JavaType javaType) {
+        String type = javaType.getFullyQualifiedName();
+        String value;
+        if (type.equals(String.class.getName())) {
+            value = "string";
+        } else if (type.equals("int")) {
+            value = "integer";
+        } else if (type.equals(boolean.class.getName())) {
+            value = "boolean";
+        } else if (type.equals(long.class.getName())) {
+            value = "number";
+        } else {
+            value = "";
+        }
+        return value;
+    }
+
+    // Writes the swagger.json file using the supplied JSON root.
+    private void genCatalog(File dstDirectory, ObjectNode root) {
+        File swaggerCfg = new File(dstDirectory, JSON_FILE);
+        if (dstDirectory.exists() || dstDirectory.mkdirs()) {
+            try (FileWriter fw = new FileWriter(swaggerCfg);
+                 PrintWriter pw = new PrintWriter(fw)) {
+                pw.println(root.toString());
+            } catch (IOException e) {
+                throw new RuntimeException("Unable to write " + JSON_FILE, e);
+            }
+        } else {
+            throw new RuntimeException("Unable to create " + dstDirectory);
+        }
+    }
+
+    // Generates the registrator Java component.
+    private void genRegistrator(File dstDirectory, String webContext,
+                                String apiTitle, String apiVersion,
+                                String apiPackage, String apiDescription) {
+        File dir = new File(dstDirectory, resourceDirectory != null ? GEN_SRC : ".");
+        File reg = new File(dir, apiRegistratorPath(apiPackage));
+        File pkg = reg.getParentFile();
+        if (pkg.exists() || pkg.mkdirs()) {
+            try {
+                String src = new String(ByteStreams.toByteArray(getClass().getResourceAsStream(REG_SRC)));
+                src = src.replace("${api.package}", apiPackage)
+                        .replace("${web.context}", webContext)
+                        .replace("${api.title}", apiTitle)
+                        .replace("${api.description}", apiDescription)
+                        .replace("${year}", Year.now().toString());
+
+                Files.write(src.getBytes(), reg);
+            } catch (IOException e) {
+                throw new RuntimeException("Unable to write " + reg, e);
+            }
+        } else {
+            throw new RuntimeException("Unable to create " + reg);
+        }
+    }
+
+    private String shortText(String comment) {
+        int i = comment.indexOf('.');
+        return i > 0 ? comment.substring(0, i) : comment;
+    }
+
+    public static String apiRegistratorPath(String apiPackage) {
+        return apiPackage.replaceAll("\\.", "/") + "/ApiDocRegistrator.java";
+    }
+
+    private static List<File> getFiles(String commaSeparatedList) {
+        String[] fileNames = commaSeparatedList.split(",");
+        ImmutableList.Builder<File> files = ImmutableList.builder();
+        Arrays.stream(fileNames).forEach(filename -> files.add(new File(filename)));
+        return files.build();
+    }
+
+    public static void main(String args[]) {
+        List<File> srcs = getFiles(args[0]);
+        List<File> resources = getFiles(args[1]);
+        File srcDirectory = null;//new File(args[2]);
+        File resourceDirectory = new File(args[3]);
+        File genSrcOutputDirectory = new File(args[4]);
+        File genResourcesOutputDirectory = new File(args[5]);
+        String webContext = args[6];
+        String apiTitle = args[7];
+        String apiVersion = args[8];
+        String apiPackage = args[9];
+        String apiDescription = args[10];
+
+        SwaggerGenerator generator = new SwaggerGenerator(
+                srcs,
+                resources,
+                srcDirectory, resourceDirectory,
+                genSrcOutputDirectory,
+                genResourcesOutputDirectory,
+                webContext,
+                apiTitle,
+                apiVersion,
+                apiPackage,
+                apiDescription);
+        generator.execute();
+    }
+}
\ No newline at end of file
diff --git a/tools/build/swagger/src/main/resources/registrator.javat b/tools/build/swagger/src/main/resources/registrator.javat
new file mode 100644
index 0000000..aa1d44f
--- /dev/null
+++ b/tools/build/swagger/src/main/resources/registrator.javat
@@ -0,0 +1,32 @@
+/*
+ * Copyright ${year}-present Open Networking Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ * Auto-generated by OnosSwaggerMojo.
+ *
+ */
+package ${api.package};
+
+import org.osgi.service.component.annotations.Component;
+import org.onosproject.rest.AbstractApiDocRegistrator;
+import org.onosproject.rest.ApiDocProvider;
+
+@Component(immediate = true)
+public class ApiDocRegistrator extends AbstractApiDocRegistrator {
+    public ApiDocRegistrator() {
+        super(new ApiDocProvider("${web.context}",
+                                 "${api.title}",
+                                 ApiDocRegistrator.class.getClassLoader()));
+    }
+}
diff --git a/tools/build_rules/prelude_bazel b/tools/build_rules/prelude_bazel
index 0cdc276..85a7203 100644
--- a/tools/build_rules/prelude_bazel
+++ b/tools/build_rules/prelude_bazel
@@ -14,6 +14,7 @@
     "TEST_REST",
     "ONOS_YANG",
     "ATOMIX",
+    "JAXB",
 )
 load("//tools/build/bazel:osgi_java_library.bzl", "osgi_jar", "osgi_jar_with_tests")
 load("//tools/build/bazel:onos_app.bzl", "onos_app")
diff --git a/tools/dev/bash_profile b/tools/dev/bash_profile
index c4f54d0..438932b 100644
--- a/tools/dev/bash_profile
+++ b/tools/dev/bash_profile
@@ -22,7 +22,7 @@
 
 export MAVEN=${MAVEN:-~/Applications/apache-maven-3.3.9}
 
-export KARAF_VERSION=${KARAF_VERSION:-3.0.8}
+export KARAF_VERSION=4.2.1
 export KARAF_ROOT=${KARAF_ROOT:-~/Applications/apache-karaf-$KARAF_VERSION}
 export KARAF_LOG=$KARAF_ROOT/data/log/karaf.log
 
@@ -206,8 +206,8 @@
 export CELL_SLAVE_1=$CELL_WARDEN
 export CELL_SLAVE_2="10.192.19.71"
 export CELL_SLAVE_3="10.192.19.70"
-export CELL_SLAVE_4="10.192.19.77"
-export CELL_SLAVES="$CELL_SLAVE_1 $CELL_SLAVE_2 $CELL_SLAVE_3 $CELL_SLAVE_4"
+export CELL_SLAVE_4="10.192.19.77"   # disabled
+export CELL_SLAVES="$CELL_SLAVE_1 $CELL_SLAVE_2 $CELL_SLAVE_3"
 
 # Clears cell environment
 function clearCell {
diff --git a/tools/package/BUCK b/tools/package/BUCK
deleted file mode 100644
index b7adf19..0000000
--- a/tools/package/BUCK
+++ /dev/null
@@ -1,48 +0,0 @@
-KARAF = '//lib:apache-karaf'
-BRANDING = '//tools/package/branding:onos-tools-package-branding'
-PATCHES = '//lib:apache-karaf-patches'
-
-#TODO move to buck-tools
-export_file (
-  name = 'onos-prep-karaf',
-)
-
-genrule(
-  name = 'onos-karaf',
-  srcs = glob(['bin/*', 'etc/*', 'init/*', 'runtime/bin/*']),
-  bash = '$(location :onos-prep-karaf) $OUT $(location %s) %s $(location %s) $(location %s)'\
-            % (KARAF, ONOS_VERSION, BRANDING, PATCHES),
-  out = 'karaf.zip',
-)
-
-staged_repos = ['$(location %s-repo)' % f for f in FEATURES]
-staged_apps = ['$(location %s)' % a for a in APPS]
-
-# feature_coords = 'foo:bar:1.3'
-sources = [ '$(location //tools/package/features:onos-features)', ]
-sources += staged_repos + staged_apps
-
-tar_file(
-  name = 'onos-package-runtime',
-  srcs = glob(['runtime/bin/*']),
-  root = 'tools/package',
-  out = 'package-runtime.tar.gz',
-  visibility = [ 'PUBLIC' ],
-)
-
-genrule(
-  name = 'onos-package',
-  srcs = glob(['bin/*', 'etc/*', 'init/*', 'config/*', 'runtime/bin/*']),
-  out = 'onos.tar.gz',
-  bash = '$(exe //buck-tools:onos-stage) $OUT ' + ONOS_VERSION + ' $(location :onos-karaf) ' + ' '.join(sources),
-  visibility = [ 'PUBLIC' ],
-)
-
-genrule(
-  name = 'onos-run',
-  out = 'onos-run',
-  srcs = [ 'onos-run-karaf' ],
-  bash = 'sed "s#ONOS_TAR=#ONOS_TAR=$(location :onos-package)#" $SRCS > $OUT; chmod +x $OUT',
-  executable = True,
-  visibility = [ 'PUBLIC' ],
-)
diff --git a/tools/package/archetypes/api/pom.xml b/tools/package/archetypes/api/pom.xml
index b9add47..bef2c86 100644
--- a/tools/package/archetypes/api/pom.xml
+++ b/tools/package/archetypes/api/pom.xml
@@ -20,7 +20,7 @@
   <parent>
     <groupId>org.onosproject</groupId>
     <artifactId>onos-archetypes</artifactId>
-    <version>1.15.0-SNAPSHOT</version>
+    <version>2.0.0-SNAPSHOT</version>
   </parent>
 
   <artifactId>onos-api-archetype</artifactId>
diff --git a/tools/package/archetypes/api/src/main/resources/archetype-resources/pom.xml b/tools/package/archetypes/api/src/main/resources/archetype-resources/pom.xml
index 57d8792..60d8d0f 100644
--- a/tools/package/archetypes/api/src/main/resources/archetype-resources/pom.xml
+++ b/tools/package/archetypes/api/src/main/resources/archetype-resources/pom.xml
@@ -32,7 +32,7 @@
 
     <properties>
         <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
-        <onos.version>1.15.0-SNAPSHOT</onos.version>
+        <onos.version>2.0.0-SNAPSHOT</onos.version>
     </properties>
 
     <dependencies>
diff --git a/tools/package/archetypes/bundle/pom.xml b/tools/package/archetypes/bundle/pom.xml
index d2bea28..02ca566 100644
--- a/tools/package/archetypes/bundle/pom.xml
+++ b/tools/package/archetypes/bundle/pom.xml
@@ -20,7 +20,7 @@
   <parent>
     <groupId>org.onosproject</groupId>
     <artifactId>onos-archetypes</artifactId>
-    <version>1.15.0-SNAPSHOT</version>
+    <version>2.0.0-SNAPSHOT</version>
   </parent>
 
   <artifactId>onos-bundle-archetype</artifactId>
diff --git a/tools/package/archetypes/bundle/src/main/resources/archetype-resources/pom.xml b/tools/package/archetypes/bundle/src/main/resources/archetype-resources/pom.xml
index cc87c54..3150a39 100644
--- a/tools/package/archetypes/bundle/src/main/resources/archetype-resources/pom.xml
+++ b/tools/package/archetypes/bundle/src/main/resources/archetype-resources/pom.xml
@@ -32,7 +32,7 @@
 
     <properties>
         <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
-        <onos.version>1.15.0-SNAPSHOT</onos.version>
+        <onos.version>2.0.0-SNAPSHOT</onos.version>
         <!-- Uncomment to generate ONOS app from this module.
         <onos.app.name>org.foo.app</onos.app.name>
         <onos.app.title>Foo App</onos.app.title>
@@ -72,9 +72,9 @@
         </dependency>
 
         <dependency>
-            <groupId>org.apache.felix</groupId>
-            <artifactId>org.apache.felix.scr.annotations</artifactId>
-            <version>1.9.12</version>
+            <groupId>org.osgi</groupId>
+            <artifactId>org.osgi.service.component.annotations</artifactId>
+            <version>1.4.0</version>
             <scope>provided</scope>
         </dependency>
     </dependencies>
@@ -84,13 +84,13 @@
             <plugin>
                 <groupId>org.apache.felix</groupId>
                 <artifactId>maven-bundle-plugin</artifactId>
-                <version>3.3.0</version>
+                <version>3.5.0</version>
                 <extensions>true</extensions>
             </plugin>
             <plugin>
                 <groupId>org.apache.maven.plugins</groupId>
                 <artifactId>maven-compiler-plugin</artifactId>
-                <version>3.7.0</version>
+                <version>3.8.0</version>
                 <configuration>
                     <source>1.8</source>
                     <target>1.8</target>
@@ -99,15 +99,7 @@
             <plugin>
                 <groupId>org.apache.felix</groupId>
                 <artifactId>maven-scr-plugin</artifactId>
-                <version>1.24.0</version>
-                <executions>
-                    <execution>
-                        <id>generate-scr-srcdescriptor</id>
-                        <goals>
-                            <goal>scr</goal>
-                        </goals>
-                    </execution>
-                </executions>
+                <version>1.26.0</version>
                 <configuration>
                     <supportedProjectTypes>
                         <supportedProjectType>bundle</supportedProjectType>
@@ -118,7 +110,7 @@
             <plugin>
                 <groupId>org.onosproject</groupId>
                 <artifactId>onos-maven-plugin</artifactId>
-                <version>1.11</version>
+                <version>2.0-SNAPSHOT</version>
                 <executions>
                     <execution>
                         <id>cfg</id>
diff --git a/tools/package/archetypes/bundle/src/main/resources/archetype-resources/src/main/java/AppComponent.java b/tools/package/archetypes/bundle/src/main/resources/archetype-resources/src/main/java/AppComponent.java
index 047561b..9fdf0fb 100644
--- a/tools/package/archetypes/bundle/src/main/resources/archetype-resources/src/main/java/AppComponent.java
+++ b/tools/package/archetypes/bundle/src/main/resources/archetype-resources/src/main/java/AppComponent.java
@@ -18,10 +18,9 @@
  */
 package ${package};
 
-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.osgi.service.component.annotations.Activate;
+import org.osgi.service.component.annotations.Component;
+import org.osgi.service.component.annotations.Deactivate;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
diff --git a/tools/package/archetypes/cli/pom.xml b/tools/package/archetypes/cli/pom.xml
index 4913278..8ad7a28 100644
--- a/tools/package/archetypes/cli/pom.xml
+++ b/tools/package/archetypes/cli/pom.xml
@@ -20,7 +20,7 @@
   <parent>
     <groupId>org.onosproject</groupId>
     <artifactId>onos-archetypes</artifactId>
-    <version>1.15.0-SNAPSHOT</version>
+    <version>2.0.0-SNAPSHOT</version>
   </parent>
 
   <artifactId>onos-cli-archetype</artifactId>
diff --git a/tools/package/archetypes/cli/src/main/resources/archetype-resources/pom.xml b/tools/package/archetypes/cli/src/main/resources/archetype-resources/pom.xml
index f05512d..0e2cac0 100644
--- a/tools/package/archetypes/cli/src/main/resources/archetype-resources/pom.xml
+++ b/tools/package/archetypes/cli/src/main/resources/archetype-resources/pom.xml
@@ -32,7 +32,7 @@
 
     <properties>
         <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
-        <onos.version>1.15.0-SNAPSHOT</onos.version>
+        <onos.version>2.0.0-SNAPSHOT</onos.version>
     </properties>
 
     <dependencies>
@@ -77,15 +77,15 @@
             <scope>provided</scope>
         </dependency>
         <dependency>
-            <groupId>org.apache.felix</groupId>
-            <artifactId>org.apache.felix.scr.annotations</artifactId>
-            <version>1.9.12</version>
+            <groupId>org.osgi</groupId>
+            <artifactId>org.osgi.service.component.annotations</artifactId>
+            <version>1.4.0</version>
             <scope>provided</scope>
         </dependency>
         <dependency>
             <groupId>org.apache.karaf.shell</groupId>
             <artifactId>org.apache.karaf.shell.console</artifactId>
-            <version>3.0.8</version>
+            <version>4.2.1</version>
             <scope>provided</scope>
         </dependency>
     </dependencies>
@@ -95,13 +95,18 @@
             <plugin>
                 <groupId>org.apache.felix</groupId>
                 <artifactId>maven-bundle-plugin</artifactId>
-                <version>3.3.0</version>
+                <version>3.5.0</version>
                 <extensions>true</extensions>
+                <configuration>
+                    <instructions>
+                        <Karaf-Commands>${package}</Karaf-Commands>
+                    </instructions>
+                </configuration>
             </plugin>
             <plugin>
                 <groupId>org.apache.maven.plugins</groupId>
                 <artifactId>maven-compiler-plugin</artifactId>
-                <version>3.7.0</version>
+                <version>3.8.0</version>
                 <configuration>
                     <source>1.8</source>
                     <target>1.8</target>
@@ -110,15 +115,7 @@
             <plugin>
                 <groupId>org.apache.felix</groupId>
                 <artifactId>maven-scr-plugin</artifactId>
-                <version>1.24.0</version>
-                <executions>
-                    <execution>
-                        <id>generate-scr-srcdescriptor</id>
-                        <goals>
-                            <goal>scr</goal>
-                        </goals>
-                    </execution>
-                </executions>
+                <version>1.26.0</version>
                 <configuration>
                     <supportedProjectTypes>
                         <supportedProjectType>bundle</supportedProjectType>
diff --git a/tools/package/archetypes/cli/src/main/resources/archetype-resources/src/main/java/AppCommand.java b/tools/package/archetypes/cli/src/main/resources/archetype-resources/src/main/java/AppCommand.java
index 3d82f2c..b9ac3ec 100644
--- a/tools/package/archetypes/cli/src/main/resources/archetype-resources/src/main/java/AppCommand.java
+++ b/tools/package/archetypes/cli/src/main/resources/archetype-resources/src/main/java/AppCommand.java
@@ -15,18 +15,20 @@
  */
 package ${package};
 
-import org.apache.karaf.shell.commands.Command;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.cli.AbstractShellCommand;
 
 /**
  * Sample Apache Karaf CLI command
  */
+@Service
 @Command(scope = "onos", name = "sample",
          description = "Sample Apache Karaf CLI command")
 public class AppCommand extends AbstractShellCommand {
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         print("Hello %s", "World");
     }
 
diff --git a/tools/package/archetypes/cli/src/main/resources/archetype-resources/src/main/resources/OSGI-INF/blueprint/shell-config.xml b/tools/package/archetypes/cli/src/main/resources/archetype-resources/src/main/resources/OSGI-INF/blueprint/shell-config.xml
deleted file mode 100644
index 874f89e..0000000
--- a/tools/package/archetypes/cli/src/main/resources/archetype-resources/src/main/resources/OSGI-INF/blueprint/shell-config.xml
+++ /dev/null
@@ -1,24 +0,0 @@
-<!--
-  ~ Copyright ${year}-present Open Networking Foundation
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~     http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License.
-  -->
-<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0">
-
-    <command-bundle xmlns="http://karaf.apache.org/xmlns/shell/v1.1.0">
-        <command>
-            <action class="${package}.AppCommand"/>
-        </command>
-    </command-bundle>
-
-</blueprint>
diff --git a/tools/package/archetypes/pom.xml b/tools/package/archetypes/pom.xml
index ad48695..5a7a9db 100644
--- a/tools/package/archetypes/pom.xml
+++ b/tools/package/archetypes/pom.xml
@@ -28,7 +28,7 @@
 
     <groupId>org.onosproject</groupId>
     <artifactId>onos-archetypes</artifactId>
-    <version>1.15.0-SNAPSHOT</version>
+    <version>2.0.0-SNAPSHOT</version>
     <packaging>pom</packaging>
 
     <description>ONOS archetypes project</description>
@@ -48,7 +48,7 @@
             <extension>
                 <groupId>org.apache.maven.archetype</groupId>
                 <artifactId>archetype-packaging</artifactId>
-                <version>2.4</version>
+                <version>3.0.1</version>
             </extension>
         </extensions>
 
@@ -56,7 +56,7 @@
             <plugins>
                 <plugin>
                     <artifactId>maven-archetype-plugin</artifactId>
-                    <version>2.4</version>
+                    <version>3.0.1</version>
                 </plugin>
             </plugins>
         </pluginManagement>
diff --git a/tools/package/archetypes/rest/pom.xml b/tools/package/archetypes/rest/pom.xml
index 1351225..a623e9c 100644
--- a/tools/package/archetypes/rest/pom.xml
+++ b/tools/package/archetypes/rest/pom.xml
@@ -20,7 +20,7 @@
   <parent>
     <groupId>org.onosproject</groupId>
     <artifactId>onos-archetypes</artifactId>
-    <version>1.15.0-SNAPSHOT</version>
+    <version>2.0.0-SNAPSHOT</version>
   </parent>
 
   <artifactId>onos-rest-archetype</artifactId>
diff --git a/tools/package/archetypes/rest/src/main/resources/archetype-resources/pom.xml b/tools/package/archetypes/rest/src/main/resources/archetype-resources/pom.xml
index e234bf6..466def5 100644
--- a/tools/package/archetypes/rest/src/main/resources/archetype-resources/pom.xml
+++ b/tools/package/archetypes/rest/src/main/resources/archetype-resources/pom.xml
@@ -32,7 +32,7 @@
 
     <properties>
         <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
-        <onos.version>1.15.0-SNAPSHOT</onos.version>
+        <onos.version>2.0.0-SNAPSHOT</onos.version>
 
         <web.context>/onos/${artifactId}</web.context>
         <api.version>1.0.0</api.version>
@@ -108,13 +108,13 @@
         <dependency>
             <groupId>com.fasterxml.jackson.core</groupId>
             <artifactId>jackson-databind</artifactId>
-            <version>2.8.6</version>
+            <version>2.9.5</version>
             <scope>provided</scope>
         </dependency>
         <dependency>
             <groupId>com.fasterxml.jackson.core</groupId>
             <artifactId>jackson-annotations</artifactId>
-            <version>2.8.6</version>
+            <version>2.9.5</version>
             <scope>provided</scope>
         </dependency>
 
@@ -125,15 +125,15 @@
             <scope>provided</scope>
         </dependency>
         <dependency>
-            <groupId>org.apache.felix</groupId>
-            <artifactId>org.apache.felix.scr.annotations</artifactId>
-            <version>1.9.12</version>
+            <groupId>org.osgi</groupId>
+            <artifactId>org.osgi.service.component.annotations</artifactId>
+            <version>1.4.0</version>
             <scope>provided</scope>
         </dependency>
         <dependency>
             <groupId>org.apache.karaf.shell</groupId>
             <artifactId>org.apache.karaf.shell.console</artifactId>
-            <version>3.0.8</version>
+            <version>4.2.1</version>
             <scope>provided</scope>
         </dependency>
     </dependencies>
@@ -143,7 +143,7 @@
             <plugin>
                 <groupId>org.apache.felix</groupId>
                 <artifactId>maven-bundle-plugin</artifactId>
-                <version>3.3.0</version>
+                <version>3.5.0</version>
                 <extensions>true</extensions>
                 <configuration>
                     <instructions>
@@ -165,7 +165,7 @@
             <plugin>
                 <groupId>org.apache.maven.plugins</groupId>
                 <artifactId>maven-compiler-plugin</artifactId>
-                <version>3.7.0</version>
+                <version>3.8.0</version>
                 <configuration>
                     <source>1.8</source>
                     <target>1.8</target>
@@ -174,15 +174,7 @@
             <plugin>
                 <groupId>org.apache.felix</groupId>
                 <artifactId>maven-scr-plugin</artifactId>
-                <version>1.24.0</version>
-                <executions>
-                    <execution>
-                        <id>generate-scr-srcdescriptor</id>
-                        <goals>
-                            <goal>scr</goal>
-                        </goals>
-                    </execution>
-                </executions>
+                <version>1.26.0</version>
                 <configuration>
                     <supportedProjectTypes>
                         <supportedProjectType>bundle</supportedProjectType>
@@ -193,7 +185,7 @@
             <plugin>
                 <groupId>org.onosproject</groupId>
                 <artifactId>onos-maven-plugin</artifactId>
-                <version>1.11</version>
+                <version>2.0-SNAPSHOT</version>
                 <executions>
                     <execution>
                         <id>cfg</id>
diff --git a/tools/package/archetypes/ui/pom.xml b/tools/package/archetypes/ui/pom.xml
index 505ba16..434cb64 100644
--- a/tools/package/archetypes/ui/pom.xml
+++ b/tools/package/archetypes/ui/pom.xml
@@ -20,7 +20,7 @@
   <parent>
     <groupId>org.onosproject</groupId>
     <artifactId>onos-archetypes</artifactId>
-    <version>1.15.0-SNAPSHOT</version>
+    <version>2.0.0-SNAPSHOT</version>
   </parent>
 
   <artifactId>onos-ui-archetype</artifactId>
diff --git a/tools/package/archetypes/ui/src/main/resources/archetype-resources/pom.xml b/tools/package/archetypes/ui/src/main/resources/archetype-resources/pom.xml
index d85c1a9..3ef5f8e 100644
--- a/tools/package/archetypes/ui/src/main/resources/archetype-resources/pom.xml
+++ b/tools/package/archetypes/ui/src/main/resources/archetype-resources/pom.xml
@@ -32,7 +32,7 @@
 
     <properties>
         <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
-        <onos.version>1.15.0-SNAPSHOT</onos.version>
+        <onos.version>2.0.0-SNAPSHOT</onos.version>
         <!-- Uncomment to generate ONOS app from this module.
         <onos.app.name>org.foo.app</onos.app.name>
         <onos.app.title>Foo App</onos.app.title>
@@ -72,9 +72,9 @@
         </dependency>
 
         <dependency>
-            <groupId>org.apache.felix</groupId>
-            <artifactId>org.apache.felix.scr.annotations</artifactId>
-            <version>1.9.12</version>
+            <groupId>org.osgi</groupId>
+            <artifactId>org.osgi.service.component.annotations</artifactId>
+            <version>1.4.0</version>
             <scope>provided</scope>
         </dependency>
     </dependencies>
@@ -84,13 +84,13 @@
             <plugin>
                 <groupId>org.apache.felix</groupId>
                 <artifactId>maven-bundle-plugin</artifactId>
-                <version>3.3.0</version>
+                <version>3.5.0</version>
                 <extensions>true</extensions>
             </plugin>
             <plugin>
                 <groupId>org.apache.maven.plugins</groupId>
                 <artifactId>maven-compiler-plugin</artifactId>
-                <version>3.7.0</version>
+                <version>3.8.0</version>
                 <configuration>
                     <source>1.8</source>
                     <target>1.8</target>
@@ -99,15 +99,7 @@
             <plugin>
                 <groupId>org.apache.felix</groupId>
                 <artifactId>maven-scr-plugin</artifactId>
-                <version>1.24.0</version>
-                <executions>
-                    <execution>
-                        <id>generate-scr-srcdescriptor</id>
-                        <goals>
-                            <goal>scr</goal>
-                        </goals>
-                    </execution>
-                </executions>
+                <version>1.26.0</version>
                 <configuration>
                     <supportedProjectTypes>
                         <supportedProjectType>bundle</supportedProjectType>
@@ -118,7 +110,7 @@
             <plugin>
                 <groupId>org.onosproject</groupId>
                 <artifactId>onos-maven-plugin</artifactId>
-                <version>1.11</version>
+                <version>2.0-SNAPSHOT</version>
                 <executions>
                     <execution>
                         <id>cfg</id>
diff --git a/tools/package/archetypes/ui/src/main/resources/archetype-resources/src/main/java/AppUiComponent.java b/tools/package/archetypes/ui/src/main/resources/archetype-resources/src/main/java/AppUiComponent.java
index c59fb64..4522692 100644
--- a/tools/package/archetypes/ui/src/main/resources/archetype-resources/src/main/java/AppUiComponent.java
+++ b/tools/package/archetypes/ui/src/main/resources/archetype-resources/src/main/java/AppUiComponent.java
@@ -19,11 +19,11 @@
 package ${package};
 
 import com.google.common.collect.ImmutableList;
-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.onosproject.ui.UiExtension;
 import org.onosproject.ui.UiExtensionService;
 import org.onosproject.ui.UiMessageHandlerFactory;
@@ -44,7 +44,7 @@
 
     private final Logger log = LoggerFactory.getLogger(getClass());
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected UiExtensionService uiExtensionService;
 
     // List of application views
diff --git a/tools/package/archetypes/uitab/pom.xml b/tools/package/archetypes/uitab/pom.xml
index b3eccbc..758a549 100644
--- a/tools/package/archetypes/uitab/pom.xml
+++ b/tools/package/archetypes/uitab/pom.xml
@@ -20,7 +20,7 @@
   <parent>
     <groupId>org.onosproject</groupId>
     <artifactId>onos-archetypes</artifactId>
-    <version>1.15.0-SNAPSHOT</version>
+    <version>2.0.0-SNAPSHOT</version>
   </parent>
 
   <artifactId>onos-uitab-archetype</artifactId>
diff --git a/tools/package/archetypes/uitab/src/main/resources/archetype-resources/pom.xml b/tools/package/archetypes/uitab/src/main/resources/archetype-resources/pom.xml
index 0b16bfe..455b9f2 100644
--- a/tools/package/archetypes/uitab/src/main/resources/archetype-resources/pom.xml
+++ b/tools/package/archetypes/uitab/src/main/resources/archetype-resources/pom.xml
@@ -33,7 +33,7 @@
 
     <properties>
         <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
-        <onos.version>1.15.0-SNAPSHOT</onos.version>
+        <onos.version>2.0.0-SNAPSHOT</onos.version>
         <!-- Uncomment to generate ONOS app from this module.
         <onos.app.name>org.foo.app</onos.app.name>
         <onos.app.title>Foo App</onos.app.title>
@@ -73,9 +73,9 @@
         </dependency>
 
         <dependency>
-            <groupId>org.apache.felix</groupId>
-            <artifactId>org.apache.felix.scr.annotations</artifactId>
-            <version>1.9.12</version>
+            <groupId>org.osgi</groupId>
+            <artifactId>org.osgi.service.component.annotations</artifactId>
+            <version>1.4.0</version>
             <scope>provided</scope>
         </dependency>
     </dependencies>
@@ -85,13 +85,13 @@
             <plugin>
                 <groupId>org.apache.felix</groupId>
                 <artifactId>maven-bundle-plugin</artifactId>
-                <version>3.3.0</version>
+                <version>3.5.0</version>
                 <extensions>true</extensions>
             </plugin>
             <plugin>
                 <groupId>org.apache.maven.plugins</groupId>
                 <artifactId>maven-compiler-plugin</artifactId>
-                <version>3.7.0</version>
+                <version>3.8.0</version>
                 <configuration>
                     <source>1.8</source>
                     <target>1.8</target>
@@ -100,15 +100,7 @@
             <plugin>
                 <groupId>org.apache.felix</groupId>
                 <artifactId>maven-scr-plugin</artifactId>
-                <version>1.24.0</version>
-                <executions>
-                    <execution>
-                        <id>generate-scr-srcdescriptor</id>
-                        <goals>
-                            <goal>scr</goal>
-                        </goals>
-                    </execution>
-                </executions>
+                <version>1.26.0</version>
                 <configuration>
                     <supportedProjectTypes>
                         <supportedProjectType>bundle</supportedProjectType>
@@ -119,7 +111,7 @@
             <plugin>
                 <groupId>org.onosproject</groupId>
                 <artifactId>onos-maven-plugin</artifactId>
-                <version>1.11</version>
+                <version>2.0-SNAPSHOT</version>
                 <executions>
                     <execution>
                         <id>cfg</id>
diff --git a/tools/package/archetypes/uitab/src/main/resources/archetype-resources/src/main/java/AppUiTableComponent.java b/tools/package/archetypes/uitab/src/main/resources/archetype-resources/src/main/java/AppUiTableComponent.java
index 2e82cb6..655fd03 100644
--- a/tools/package/archetypes/uitab/src/main/resources/archetype-resources/src/main/java/AppUiTableComponent.java
+++ b/tools/package/archetypes/uitab/src/main/resources/archetype-resources/src/main/java/AppUiTableComponent.java
@@ -19,11 +19,11 @@
 package ${package};
 
 import com.google.common.collect.ImmutableList;
-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.onosproject.ui.UiExtension;
 import org.onosproject.ui.UiExtensionService;
 import org.onosproject.ui.UiMessageHandlerFactory;
@@ -44,7 +44,7 @@
 
     private final Logger log = LoggerFactory.getLogger(getClass());
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected UiExtensionService uiExtensionService;
 
     // List of application views
diff --git a/tools/package/archetypes/uitopo/pom.xml b/tools/package/archetypes/uitopo/pom.xml
index df8613e..8a52a72 100644
--- a/tools/package/archetypes/uitopo/pom.xml
+++ b/tools/package/archetypes/uitopo/pom.xml
@@ -20,7 +20,7 @@
   <parent>
     <groupId>org.onosproject</groupId>
     <artifactId>onos-archetypes</artifactId>
-    <version>1.15.0-SNAPSHOT</version>
+    <version>2.0.0-SNAPSHOT</version>
   </parent>
 
   <artifactId>onos-uitopo-archetype</artifactId>
diff --git a/tools/package/archetypes/uitopo/src/main/resources/archetype-resources/pom.xml b/tools/package/archetypes/uitopo/src/main/resources/archetype-resources/pom.xml
index 6b966ed..8a027a4 100644
--- a/tools/package/archetypes/uitopo/src/main/resources/archetype-resources/pom.xml
+++ b/tools/package/archetypes/uitopo/src/main/resources/archetype-resources/pom.xml
@@ -33,7 +33,7 @@
 
     <properties>
         <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
-        <onos.version>1.15.0-SNAPSHOT</onos.version>
+        <onos.version>2.0.0-SNAPSHOT</onos.version>
         <!-- Uncomment to generate ONOS app from this module.
         <onos.app.name>org.foo.app</onos.app.name>
         <onos.app.title>Foo App</onos.app.title>
@@ -73,9 +73,9 @@
         </dependency>
 
         <dependency>
-            <groupId>org.apache.felix</groupId>
-            <artifactId>org.apache.felix.scr.annotations</artifactId>
-            <version>1.9.12</version>
+            <groupId>org.osgi</groupId>
+            <artifactId>org.osgi.service.component.annotations</artifactId>
+            <version>1.4.0</version>
             <scope>provided</scope>
         </dependency>
     </dependencies>
@@ -85,13 +85,13 @@
             <plugin>
                 <groupId>org.apache.felix</groupId>
                 <artifactId>maven-bundle-plugin</artifactId>
-                <version>3.3.0</version>
+                <version>3.5.0</version>
                 <extensions>true</extensions>
             </plugin>
             <plugin>
                 <groupId>org.apache.maven.plugins</groupId>
                 <artifactId>maven-compiler-plugin</artifactId>
-                <version>3.7.0</version>
+                <version>3.8.0</version>
                 <configuration>
                     <source>1.8</source>
                     <target>1.8</target>
@@ -100,15 +100,7 @@
             <plugin>
                 <groupId>org.apache.felix</groupId>
                 <artifactId>maven-scr-plugin</artifactId>
-                <version>1.24.0</version>
-                <executions>
-                    <execution>
-                        <id>generate-scr-srcdescriptor</id>
-                        <goals>
-                            <goal>scr</goal>
-                        </goals>
-                    </execution>
-                </executions>
+                <version>1.26.0</version>
                 <configuration>
                     <supportedProjectTypes>
                         <supportedProjectType>bundle</supportedProjectType>
@@ -119,7 +111,7 @@
             <plugin>
                 <groupId>org.onosproject</groupId>
                 <artifactId>onos-maven-plugin</artifactId>
-                <version>1.11</version>
+                <version>2.0-SNAPSHOT</version>
                 <executions>
                     <execution>
                         <id>cfg</id>
diff --git a/tools/package/archetypes/uitopo/src/main/resources/archetype-resources/src/main/java/AppUiTopovComponent.java b/tools/package/archetypes/uitopo/src/main/resources/archetype-resources/src/main/java/AppUiTopovComponent.java
index 55b1e6f..193e41f 100644
--- a/tools/package/archetypes/uitopo/src/main/resources/archetype-resources/src/main/java/AppUiTopovComponent.java
+++ b/tools/package/archetypes/uitopo/src/main/resources/archetype-resources/src/main/java/AppUiTopovComponent.java
@@ -19,11 +19,11 @@
 package ${package};
 
 import com.google.common.collect.ImmutableList;
-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.onosproject.ui.UiExtension;
 import org.onosproject.ui.UiExtensionService;
 import org.onosproject.ui.UiMessageHandlerFactory;
@@ -46,7 +46,7 @@
 
     private final Logger log = LoggerFactory.getLogger(getClass());
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected UiExtensionService uiExtensionService;
 
     // List of application views
diff --git a/tools/package/bin/onos-backup b/tools/package/bin/onos-backup
index a37ee46..72746e4 100755
--- a/tools/package/bin/onos-backup
+++ b/tools/package/bin/onos-backup
@@ -5,7 +5,7 @@
 
 ONOS_HOME=${ONOS_HOME:-$(cd $(dirname $0)/.. >/dev/null 2>&1 && pwd)}
 ONOS_DEFAULT_ARCHIVE=$(dirname $ONOS_HOME)/onos-data.tar.gz
-ONOS_KARAF=$ONOS_HOME/apache-karaf-3.0.8
+ONOS_KARAF=$ONOS_HOME/apache-karaf-4.2.1
 
 # Fetch the name of the archive or use a default if none is specified
 archive=${1:-$ONOS_DEFAULT_ARCHIVE}
diff --git a/tools/package/bin/onos-restore b/tools/package/bin/onos-restore
index b7204e5..b6bc4bc 100755
--- a/tools/package/bin/onos-restore
+++ b/tools/package/bin/onos-restore
@@ -5,7 +5,7 @@
 
 ONOS_HOME=${ONOS_HOME:-$(cd $(dirname $0)/.. >/dev/null 2>&1 && pwd)}
 ONOS_DEFAULT_ARCHIVE=$(dirname $ONOS_HOME)/onos-data.tar.gz
-ONOS_KARAF=$ONOS_HOME/apache-karaf-3.0.8
+ONOS_KARAF=$ONOS_HOME/apache-karaf-4.2.1
 
 # Fetch the name of the archive or use a default if none is specified
 archive=${1:-$ONOS_DEFAULT_ARCHIVE}
diff --git a/tools/package/bin/onos-service b/tools/package/bin/onos-service
index d3717ac..467a04a 100755
--- a/tools/package/bin/onos-service
+++ b/tools/package/bin/onos-service
@@ -19,7 +19,7 @@
 # If ONOS_HOME is not set (e.g. in the init or service environment),
 # set it based on this script's path.
 ONOS_HOME=${ONOS_HOME:-$(cd $(dirname $0)/.. >/dev/null 2>&1 && pwd)}
-KARAF_ARGS=
+KARAF_ARGS=server
 SYS_APPS=drivers
 ONOS_APPS=${ONOS_APPS:-}  # Empty means don't activate any new apps
 
@@ -52,4 +52,6 @@
     fi
 done
 
+KARAF_ARGS+=" server"
+
 exec ${ONOS_HOME}/apache-karaf-$KARAF_VERSION/bin/karaf $KARAF_ARGS
diff --git a/tools/package/branding/BUCK b/tools/package/branding/BUCK
deleted file mode 100644
index 3a2e916..0000000
--- a/tools/package/branding/BUCK
+++ /dev/null
@@ -1,2 +0,0 @@
-osgi_jar()
-# Really... that's it
\ No newline at end of file
diff --git a/tools/package/branding/src/main/resources/org/apache/karaf/branding/branding.properties b/tools/package/branding/src/main/resources/org/apache/karaf/branding/branding.properties
index 69a74ba..e04d327 100644
--- a/tools/package/branding/src/main/resources/org/apache/karaf/branding/branding.properties
+++ b/tools/package/branding/src/main/resources/org/apache/karaf/branding/branding.properties
@@ -27,5 +27,4 @@
 \r\n\
   Hit '\u001B[1m<tab>\u001B[0m' for a list of available commands\r\n\
      and '\u001B[1m[cmd] --help\u001B[0m' for help on a specific command.\r\n\
-  Hit '\u001B[1m<ctrl-d>\u001B[0m' or type '\u001B[1msystem:shutdown\u001B[0m' or '\u001B[1mlogout\u001B[0m' to shutdown ONOS.\r\n
-prompt = \u001B[32monos> \u001B[0m
+  Hit '\u001B[1m<ctrl-d>\u001B[0m' or type '\u001B[1mlogout\u001B[0m' to exit ONOS session.\r\n
diff --git a/tools/package/deb/prerm b/tools/package/deb/prerm
index 264a26c..d1cb8a1 100755
--- a/tools/package/deb/prerm
+++ b/tools/package/deb/prerm
@@ -14,7 +14,7 @@
 
 # Clean up onos runtime directories
 #      TODO don't hardcode karaf version
-rm -rf /opt/onos/apache-karaf-3.0.8/
+rm -rf /opt/onos/apache-karaf-4.2.1/
 rm -rf /opt/onos/var/*
 rm -rf /opt/onos/config
 rm -rf /opt/onos/options
diff --git a/tools/package/etc/keys.properties b/tools/package/etc/keys.properties
new file mode 100644
index 0000000..463a0bb
--- /dev/null
+++ b/tools/package/etc/keys.properties
@@ -0,0 +1,35 @@
+################################################################################
+#
+#    Licensed to the Apache Software Foundation (ASF) under one or more
+#    contributor license agreements.  See the NOTICE file distributed with
+#    this work for additional information regarding copyright ownership.
+#    The ASF licenses this file to You under the Apache License, Version 2.0
+#    (the "License"); you may not use this file except in compliance with
+#    the License.  You may obtain a copy of the License at
+#
+#       http://www.apache.org/licenses/LICENSE-2.0
+#
+#    Unless required by applicable law or agreed to in writing, software
+#    distributed under the License is distributed on an "AS IS" BASIS,
+#    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+#    See the License for the specific language governing permissions and
+#    limitations under the License.
+#
+################################################################################
+
+#
+# This file contains the valid users who can log into Karaf. Each line have to be of
+# the format:
+#
+# USER=KEY,ROLE1,ROLE2,...
+#
+# All users and roles entered in this file are available after Karaf startup
+# and modifiable via the JAAS command group. These users reside in a JAAS domain
+# with the name "karaf"..
+#
+
+#
+# For security reason, the default auto-signed key is disabled.
+# The user guide describes how to generate/update the key.
+#
+_g_\:admingroup = group,admin,manager,viewer,systembundles,ssh
diff --git a/tools/package/etc/org.apache.karaf.features.cfg b/tools/package/etc/org.apache.karaf.features.cfg
new file mode 100644
index 0000000..ed40d61
--- /dev/null
+++ b/tools/package/etc/org.apache.karaf.features.cfg
@@ -0,0 +1,107 @@
+################################################################################
+#
+#    Licensed to the Apache Software Foundation (ASF) under one or more
+#    contributor license agreements.  See the NOTICE file distributed with
+#    this work for additional information regarding copyright ownership.
+#    The ASF licenses this file to You under the Apache License, Version 2.0
+#    (the "License"); you may not use this file except in compliance with
+#    the License.  You may obtain a copy of the License at
+#
+#       http://www.apache.org/licenses/LICENSE-2.0
+#
+#    Unless required by applicable law or agreed to in writing, software
+#    distributed under the License is distributed on an "AS IS" BASIS,
+#    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+#    See the License for the specific language governing permissions and
+#    limitations under the License.
+#
+################################################################################
+
+#
+# Comma separated list of features repositories to register by default
+#
+featuresRepositories = \
+    mvn:org.apache.karaf.features/standard/4.2.1/xml/features, \
+    mvn:org.onosproject/onos-features/$ONOS_VERSION/xml/features, \
+    mvn:org.apache.karaf.features/enterprise/4.2.1/xml/features, \
+    mvn:org.apache.karaf.features/spring/4.2.1/xml/features, \
+    mvn:org.apache.karaf.features/standard/4.2.1/xml/features, \
+    mvn:org.apache.karaf.features/framework/4.2.1/xml/features
+
+#
+# Comma separated list of features to install at startup
+#
+featuresBoot = \
+    instance/4.2.1, \
+    package/4.2.1, \
+    log/4.2.1, \
+    ssh/4.2.1, \
+    framework/4.2.1, \
+    system/4.2.1, \
+    eventadmin/4.2.1, \
+    feature/4.2.1, \
+    shell/4.2.1, \
+    management/4.2.1, \
+    service/4.2.1, \
+    jaas/4.2.1, \
+    deployer/4.2.1, \
+    diagnostic/4.2.1, \
+    (wrap/2.5.4), \
+    bundle/4.2.1, \
+    config/4.2.1, \
+    kar/4.2.1, \
+    webconsole/4.2.1, \
+    scr/4.2.1, \
+    war/4.2.1, \
+    onos-api/$ONOS_VERSION, \
+    onos-core/$ONOS_VERSION, \
+    onos-incubator/$ONOS_VERSION, \
+    onos-cli/$ONOS_VERSION, \
+    onos-rest/$ONOS_VERSION, \
+    onos-gui/$ONOS_VERSION
+
+
+#
+# Resource repositories (OBR) that the features resolver can use
+# to resolve requirements/capabilities
+#
+# The format of the resourceRepositories is
+# resourceRepositories=[xml:url|json:url],...
+# for Instance:
+#
+#resourceRepositories=xml:http://host/path/to/index.xml
+# or
+#resourceRepositories=json:http://host/path/to/index.json
+#
+
+#
+# Defines if the boot features are started in asynchronous mode (in a dedicated thread)
+#
+featuresBootAsynchronous=false
+
+#
+# Service requirements enforcement
+#
+# By default, the feature resolver checks the service requirements/capabilities of
+# bundles for new features (xml schema >= 1.3.0) in order to automatically installs
+# the required bundles.
+# The following flag can have those values:
+#   - disable: service requirements are completely ignored
+#   - default: service requirements are ignored for old features
+#   - enforce: service requirements are always verified
+#
+#serviceRequirements=default
+
+#
+# Store cfg file for config element in feature
+#
+#configCfgStore=true
+
+#
+# Configuration of features processing mechanism (overrides, blacklisting, modification of features)
+# XML file defines instructions related to features processing
+# versions.properties may declare properties to resolve placeholders in XML file
+# both files are relative to ${karaf.etc}
+#
+#featureProcessing=org.apache.karaf.features.xml
+#featureProcessingVersions=versions.properties
diff --git a/tools/package/etc/shell.init.script b/tools/package/etc/shell.init.script
new file mode 100644
index 0000000..ac55755
--- /dev/null
+++ b/tools/package/etc/shell.init.script
@@ -0,0 +1,65 @@
+//
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements.  See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership.  The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License.  You may obtain a copy of the License at
+//
+//   http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied.  See the License for the
+// specific language governing permissions and limitations
+// under the License.
+//
+// This script is run each time a shell is created.
+// You can define here closures or variables that will be available
+// in each session.
+//
+ld = { log:display $args } ;
+lde = { log:exception-display $args } ;
+la = { bundle:list -t 0 $args } ;
+ls = { service:list $args } ;
+cl = { config:list "(service.pid=$args)" } ;
+halt = { system:shutdown -h -f $args } ;
+help = { *:help $args | more } ;
+man = { help $args } ;
+log:list = { log:get ALL } ;
+service:get = { $.context getService ($.context getServiceReference $args) };
+
+env = { shell:set $args }
+edit = { shell:nano $args }
+more = { shell:less -F $args }
+
+\#prompt = { "${USER}@${APPLICATION} ${SUBSHELL}> "?};
+
+__load_class = {
+  (($.reader class) classLoader) loadClass $1
+}
+
+// make sure that we catch exceptions
+// as they do occur if the session is headless / non-interactive
+jlineReader = $.reader
+if { %(jlineReader != null) } {
+
+  # On 256 colors terminal, add a right prompt
+  max_colors = ($.jline.terminal getNumericCapability max_colors)
+  if { %(max_colors >= 256) } {
+    __rprompt_formatter = (((__load_class java.text.SimpleDateFormat) getConstructor (__load_class java.lang.String)) newInstance \'$'\u001B\[90m'\'HH:mm:ss)
+    __date_class = (__load_class java.util.Date)
+    \#rprompt = { $__rprompt_formatter format ($__date_class newInstance) }
+  }
+
+  setopt group
+  setopt auto-fresh-line
+  unsetopt insert-tab
+  keymap "^[OA" up-line-or-search
+  keymap "^[[A" up-line-or-search
+  keymap "^[OB" down-line-or-search
+  keymap "^[[B" down-line-or-search
+
+}
diff --git a/tools/package/etc/users.properties b/tools/package/etc/users.properties
index 95a97bc..cacc254 100644
--- a/tools/package/etc/users.properties
+++ b/tools/package/etc/users.properties
@@ -28,10 +28,11 @@
 # All users, groups, and roles entered in this file are available after Karaf startup
 # and modifiable via the JAAS command group. These users reside in a JAAS domain
 # with the name "karaf".
-#
 karaf = karaf,_g_:admingroup
 onos = rocks,_g_:admingroup
 guest = guest,_g_:guestgroup
-_g_\:admingroup = group,admin,manager,viewer,webconsole
+
+_g_\:admingroup = group,admin,manager,viewer,systembundles,ssh,webconsole
 _g_\:guestgroup = group,viewer
 
+
diff --git a/tools/package/features/BUCK b/tools/package/features/BUCK
deleted file mode 100644
index 3744cc4..0000000
--- a/tools/package/features/BUCK
+++ /dev/null
@@ -1,176 +0,0 @@
-osgi_feature (
-  name="onos-thirdparty-base",
-  title="ONOS 3rd party dependencies",
-  required_features = [],
-  included_bundles = [
-    '//lib:atomix',
-    '//lib:atomix-cluster',
-    '//lib:atomix-gossip',
-    '//lib:atomix-primary-backup',
-    '//lib:atomix-primitive',
-    '//lib:atomix-raft',
-    '//lib:atomix-storage',
-    '//lib:atomix-utils',
-    '//lib:classgraph',
-    '//lib:commons-lang',
-    '//lib:commons-lang3',
-    '//lib:commons-text',
-    '//lib:commons-configuration',
-    '//lib:fast-classpath-scanner',
-    '//lib:com_google_guava_guava',
-    '//lib:io_netty_netty',
-    '//lib:io_netty_netty_common',
-    '//lib:io_netty_netty_buffer',
-    '//lib:io_netty_netty_transport',
-    '//lib:io_netty_netty_handler',
-    '//lib:io_netty_netty_codec',
-    '//lib:io_netty_netty_transport_native_unix_common',
-    '//lib:io_netty_netty_transport-native-epoll',
-    '//lib:io_netty_netty_resolver',
-    '//lib:commons-pool',
-    '//lib:commons-math3',
-    '//lib:joda-time',
-    '//lib:metrics-core',
-    '//lib:metrics-json',
-    '//lib:minimal-json',
-    '//lib:kryo',
-    '//lib:reflectasm',
-    '//lib:asm',
-    '//lib:minlog',
-    '//lib:objenesis',
-    '//lib:jackson-core',
-    '//lib:jackson-annotations',
-    '//lib:jackson-databind',
-    '//lib:commons-collections',
-    '//lib:typesafe-config',
-    '//lib:concurrent-trees',
-    '//lib:commons-io',
-    '//lib:jersey-client',
-    '//lib:mapdb',
-    '//lib:bcpkix-jdk15on',
-    '//lib:bcprov-jdk15on',
-    '//lib:commons-jxpath', # FIXME: move xpath lib dependency to the right place
-    '//lib:commons-beanutils', # jxpath dependency
-    '//lib:jdom',  # jxpath dependency
-    '//lib:sigar',
-  ]
-)
-
-osgi_feature (
-  name="onos-thirdparty-web",
-  title="ONOS 3rd party dependencies for web apps",
-  required_features = [ 'war', 'onos-thirdparty-base' ],
-  included_bundles = [
-    '//lib:jersey-common',
-    '//lib:javax.annotation-api-mvn',
-    '//lib:javax.ws.rs-api',
-    '//lib:hk2-api',
-    '//lib:hk2-locator',
-    '//lib:hk2-osgi-resource-locator',
-    '//lib:javax.inject',
-    '//lib:jersey-server',
-    '//lib:jersey-hk2',
-    '//lib:aopalliance-repackaged',
-    '//lib:hk2-utils',
-    '//lib:validation-api',
-    '//lib:javassist',
-    '//lib:jersey-container-servlet',
-    '//lib:jersey-container-servlet-core',
-    '//lib:jersey-media-multipart',
-    '//lib:mimepull',
-  ]
-)
-
-osgi_feature (
-  name = 'onos-api',
-  title = 'ONOS services and model API',
-  required_features = ['scr', 'onos-thirdparty-base'],
-  included_bundles =[
-    '//utils/misc:onlab-misc',
-    '//utils/osgi:onlab-osgi',
-    '//core/api:onos-api',
-    '//incubator/api:onos-incubator-api',
-  ]
-)
-
-osgi_feature (
-  name='onos-core',
-  title='ONOS core components',
-  required_features = ['onos-api'],
-  included_bundles = [
-    '//core/net:onos-core-net',
-    '//core/common:onos-core-common',
-    '//core/store/dist:onos-core-dist',
-    '//core/store/primitives:onos-core-primitives',
-    '//core/store/persistence:onos-core-persistence',
-    '//core/store/serializers:onos-core-serializers',
-  ]
-)
-
-osgi_feature (
-  name='onos-incubator',
-  title='ONOS core incubator components',
-  required_features = ['onos-core'],
-  included_bundles = [
-    '//incubator/net:onos-incubator-net',
-    '//incubator/store:onos-incubator-store',
-    '//incubator/rpc:onos-incubator-rpc',
-  ]
-)
-
-osgi_feature (
-  name="onos-rest",
-  title="ONOS REST API components",
-  required_features = ['onos-api', 'onos-thirdparty-web'],
-  included_bundles = [
-    '//utils/rest:onlab-rest',
-    '//web/api:onos-rest',
-  ]
-)
-
-osgi_feature (
-  name = 'onos-gui',
-  title = 'ONOS GUI console components',
-  required_features = ['onos-api', 'onos-thirdparty-web'],
-  included_bundles = [
-    '//lib:jetty-websocket',
-    '//utils/rest:onlab-rest',
-    '//web/gui:onos-gui',
-  ]
-)
-
-osgi_feature (
-  name = 'onos-gui2',
-  title = 'ONOS GUI2 console components',
-  required_features = ['onos-api', 'onos-thirdparty-web'],
-  included_bundles = [
-    '//lib:jetty-websocket',
-    '//utils/rest:onlab-rest',
-    '//web/gui2:onos-gui2',
-  ]
-)
-
-osgi_feature (
-  name = 'onos-cli',
-  title="ONOS admin command console components",
-  required_features = ['onos-api'],
-  included_bundles = [
-    '//cli:onos-cli',
-  ]
-)
-
-osgi_feature (
-  name = 'onos-security',
-  title="Security-Mode ONOS",
-  required_features = ['onos-api'],
-  included_bundles = [
-    '//lib:org.apache.felix.framework.security',
-    '//core/security:onos-security',
-  ]
-)
-
-compile_features(
-  name = 'onos-features',
-  features = FEATURES,
-  maven_coords = 'org.onosproject:onos-features:xml:features:' + ONOS_VERSION,
-)
diff --git a/tools/package/features/BUILD b/tools/package/features/BUILD
index f8355c0..3ff75fe 100644
--- a/tools/package/features/BUILD
+++ b/tools/package/features/BUILD
@@ -1,5 +1,5 @@
 load("//tools/build/bazel:osgi_features.bzl", "osgi_feature", "osgi_feature_repo")
-load("//:modules.bzl", "FEATURES")
+load("//tools/build/bazel:modules.bzl", "FEATURES")
 
 osgi_feature_repo(
     name = "onos-features",
@@ -45,10 +45,11 @@
         "@mapdb//jar",
         "@bcpkix_jdk15on//jar",
         "@bcprov_jdk15on//jar",
-        "@commons_jxpath//jar",
         "@commons_beanutils//jar",
         "@jdom//jar",
         "@sigar//jar",
+        "@org_osgi_util_function//jar",
+        "@org_osgi_util_promise//jar",
     ],
     required_features = [],
     visibility = ["//visibility:public"],
@@ -133,12 +134,10 @@
     name = "onos-rest",
     description = "ONOS REST API components",
     included_bundles = [
-        "//utils/rest:onlab-rest",
         "//web/api:onos-rest",
     ],
     required_features = [
         "onos-api",
-        "onos-thirdparty-web",
     ],
     visibility = ["//visibility:public"],
 )
@@ -158,12 +157,9 @@
     description = "ONOS GUI console components",
     included_bundles = [
         "//web/gui:onos-gui",
-        "@jetty_websocket//jar",
-        "//utils/rest:onlab-rest",
     ],
     required_features = [
         "onos-api",
-        "onos-thirdparty-web",
     ],
     visibility = ["//visibility:public"],
 )
@@ -173,23 +169,20 @@
     description = "ONOS GUI2 components",
     included_bundles = [
         "//web/gui2:onos-gui2",
-        "@jetty_websocket//jar",
-        "//utils/rest:onlab-rest",
     ],
     required_features = [
         "onos-api",
-        "onos-thirdparty-web",
     ],
     visibility = ["//visibility:public"],
 )
 
-osgi_feature(
-    name = "onos-security",
-    description = "Security-Mode ONOS",
-    included_bundles = [
-        "@org_apache_felix_framework_security//jar",
-        "//core/security:onos-security",
-    ],
-    required_features = ["onos-api"],
-    visibility = ["//visibility:public"],
-)
+#osgi_feature(
+#    name = "onos-security",
+#    description = "Security-Mode ONOS",
+#    included_bundles = [
+#        "@org_apache_felix_framework_security//jar",
+#        "//core/security:onos-security",
+#    ],
+#    required_features = ["onos-api"],
+#    visibility = ["//visibility:public"],
+#)
diff --git a/tools/package/maven-plugin/pom.xml b/tools/package/maven-plugin/pom.xml
new file mode 100644
index 0000000..31d5160
--- /dev/null
+++ b/tools/package/maven-plugin/pom.xml
@@ -0,0 +1,134 @@
+<!--
+  ~ Copyright 2015-present Open Networking Foundation
+  ~
+  ~ Licensed under the Apache License, Version 2.0 (the "License");
+  ~ you may not use this file except in compliance with the License.
+  ~ You may obtain a copy of the License at
+  ~
+  ~     http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ Unless required by applicable law or agreed to in writing, software
+  ~ distributed under the License is distributed on an "AS IS" BASIS,
+  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  ~ See the License for the specific language governing permissions and
+  ~ limitations under the License.
+  -->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+
+    <parent>
+        <groupId>org.onosproject</groupId>
+        <artifactId>onos-base</artifactId>
+        <version>1</version>
+        <relativePath>../../build/pom.xml</relativePath>
+    </parent>
+
+    <groupId>org.onosproject</groupId>
+    <artifactId>onos-maven-plugin</artifactId>
+    <version>2.0-SNAPSHOT</version>
+    <packaging>maven-plugin</packaging>
+
+    <description>Maven plugin for packaging ONOS applications or generating
+        component configuration resources
+    </description>
+
+    <dependencies>
+        <dependency>
+            <groupId>org.apache.maven</groupId>
+            <artifactId>maven-plugin-api</artifactId>
+            <version>3.3.9</version>
+        </dependency>
+
+        <dependency>
+            <groupId>org.apache.maven</groupId>
+            <artifactId>maven-project</artifactId>
+            <version>2.2.1</version>
+        </dependency>
+
+        <dependency>
+            <groupId>com.thoughtworks.qdox</groupId>
+            <artifactId>qdox</artifactId>
+            <version>2.0-M3</version>
+        </dependency>
+
+        <dependency>
+            <groupId>com.google.guava</groupId>
+            <artifactId>guava</artifactId>
+            <version>20.0</version>
+        </dependency>
+
+        <dependency>
+            <groupId>commons-collections</groupId>
+            <artifactId>commons-collections</artifactId>
+            <version>3.2.2</version>
+        </dependency>
+
+        <dependency>
+            <groupId>commons-configuration</groupId>
+            <artifactId>commons-configuration</artifactId>
+            <version>1.10</version>
+        </dependency>
+
+        <!-- dependencies to annotations -->
+        <dependency>
+            <groupId>org.apache.maven.plugin-tools</groupId>
+            <artifactId>maven-plugin-annotations</artifactId>
+            <version>3.4</version>
+            <scope>provided</scope>
+        </dependency>
+        <dependency>
+            <groupId>com.fasterxml.jackson.core</groupId>
+            <artifactId>jackson-databind</artifactId>
+            <version>2.9.5</version>
+        </dependency>
+        <dependency>
+            <groupId>com.fasterxml.jackson.core</groupId>
+            <artifactId>jackson-annotations</artifactId>
+            <version>2.9.5</version>
+        </dependency>
+        <dependency>
+            <groupId>commons-io</groupId>
+            <artifactId>commons-io</artifactId>
+            <version>2.6</version>
+        </dependency>
+        <dependency>
+            <groupId>com.google.code.gson</groupId>
+            <artifactId>gson</artifactId>
+            <version>2.7</version>
+        </dependency>
+    </dependencies>
+
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-compiler-plugin</artifactId>
+                <version>3.8.0</version>
+                <configuration>
+                    <source>1.8</source>
+                    <target>1.8</target>
+                </configuration>
+            </plugin>
+
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-plugin-plugin</artifactId>
+                <version>3.6.0</version>
+                <executions>
+                    <execution>
+                        <id>default-descriptor</id>
+                        <phase>process-classes</phase>
+                    </execution>
+                    <!-- if you want to generate help goal -->
+                    <execution>
+                        <id>help-goal</id>
+                        <goals>
+                            <goal>helpmojo</goal>
+                        </goals>
+                    </execution>
+                </executions>
+            </plugin>
+        </plugins>
+    </build>
+</project>
diff --git a/tools/package/maven-plugin/src/main/resources/org/onosproject/maven/registrator.javat b/tools/package/maven-plugin/src/main/resources/org/onosproject/maven/registrator.javat
index 6596450..b212129 100644
--- a/tools/package/maven-plugin/src/main/resources/org/onosproject/maven/registrator.javat
+++ b/tools/package/maven-plugin/src/main/resources/org/onosproject/maven/registrator.javat
@@ -14,19 +14,37 @@
  * limitations under the License.
  *
  * Auto-generated by OnosSwaggerMojo.
- *
  */
 package ${api.package};
 
-import org.apache.felix.scr.annotations.Component;
-import org.onosproject.rest.AbstractApiDocRegistrator;
+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.onosproject.rest.ApiDocProvider;
+import org.onosproject.rest.ApiDocService;
 
 @Component(immediate = true)
-public class ApiDocRegistrator extends AbstractApiDocRegistrator {
+public class ApiDocRegistrator {
+
+    protected final ApiDocProvider provider;
+
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
+    protected ApiDocService service;
+
     public ApiDocRegistrator() {
-        super(new ApiDocProvider("${web.context}",
-                                 "${api.title}",
-                                 ApiDocRegistrator.class.getClassLoader()));
+        provider = new ApiDocProvider("${web.context}", "${api.title}",
+                                      getClass().getClassLoader());
+    }
+
+    @Activate
+    protected void activate() {
+        service.register(provider);
+    }
+
+    @Deactivate
+    protected void deactivate() {
+        service.unregister(provider);
     }
 }
diff --git a/tools/package/onos-prep-karaf b/tools/package/onos-prep-karaf
index 1cc21e2..468494f 100755
--- a/tools/package/onos-prep-karaf
+++ b/tools/package/onos-prep-karaf
@@ -3,7 +3,7 @@
 # Packages ONOS distributable into onos.tar.gz, onos.zip or a deb file
 # -----------------------------------------------------------------------------
 
-set -e
+set -eu -o pipefail
 
 OUT=$1
 KARAF_TAR=$2
@@ -12,8 +12,7 @@
 KARAF_PATCHES=$5
 SANDBOX=${6:-.}
 
-#FIXME karaf version
-KARAF_VERSION="3.0.8"
+KARAF_VERSION="4.2.1"
 ONOS_SECURITY_MODE="false"
 
 PREFIX="onos-$ONOS_VERSION"
@@ -22,9 +21,9 @@
 tar xf $KARAF_TAR
 
 # rename path name to match what was distributed with vicci
-mv "$(ls -d apache*)" "apache-karaf-$KARAF_VERSION" || true
+# mv "$(ls -d apache*)" "apache-karaf-$KARAF_VERSION" || true
 
-tar xf $KARAF_PATCHES
+#tar xf $KARAF_PATCHES
 
 # Unroll the Apache Karaf bits, prune them and make ONOS top-level directories.
 KARAF_DIR=$(ls -d apache*)
@@ -43,17 +42,6 @@
 rm -f bin/*.bk
 chmod a+x $SANDBOX/bin/onos-service $SANDBOX/bin/onos
 
-export BOOT_FEATURES="standard,ssh,scr,war,webconsole,onos-api,onos-core,onos-incubator,onos-cli,onos-rest,onos-gui"
-
-# Patch the Apache Karaf distribution file to add ONOS features repository
-perl -pi.old -e "s|^(featuresRepositories=).*|\1mvn:org.apache.karaf.features/standard/$KARAF_VERSION/xml/features,mvn:org.onosproject/onos-features/$ONOS_VERSION/xml/features|" \
-    $KARAF_DIR/etc/org.apache.karaf.features.cfg
-
-# Patch the Apache Karaf distribution file to load default ONOS boot features
-perl -pi.old -e "s|^(featuresBoot ?= ?).*|\1$BOOT_FEATURES|" \
-    $KARAF_DIR/etc/org.apache.karaf.features.cfg
-
-
 # Patch the Apache Karaf distribution with ONOS branding bundle
 cp $BRANDING $KARAF_DIR/lib/onos-tools-package-branding.jar
 
@@ -67,6 +55,9 @@
 cp -r $SANDBOX/init $PREFIX
 cp -r $SANDBOX/etc/* $PREFIX/$KARAF_DIR/etc/
 
+# Fix the onos version string in the features config
+sed -i".VERBACK" -E "s/.ONOS_VERSION/${ONOS_VERSION}/" $PREFIX/$KARAF_DIR/etc/org.apache.karaf.features.cfg
+
 if [ "$ONOS_SECURITY_MODE" = true ]
 then
     # ONOS Patching ----------------------------------------------------------------
diff --git a/tools/package/onos-run-karaf b/tools/package/onos-run-karaf
index ac58826..c22ab95 100755
--- a/tools/package/onos-run-karaf
+++ b/tools/package/onos-run-karaf
@@ -7,8 +7,14 @@
 
 [ -f $ONOS_TAR ] || (echo "$ONOS_TAR not found" && exit 1)
 
+
+function killServer() {
+    echo "Killing ONOS server..."
+    ps -e | grep apache.karaf.main.Main | grep -v grep | cut -c1-6 | xargs kill -9 &>/dev/null
+}
+
 # Kill any running instances
-[ -f /tmp/onos.pid ] && kill -9 $(cat /tmp/onos.pid) &>/dev/null
+killServer
 
 ONOS_DIR=/tmp/$(tar tf $ONOS_TAR | head -n 1 | cut -d/ -f1)
 ONOS_MD5=$ONOS_DIR/CHECKSUM
@@ -80,11 +86,6 @@
 ./bin/onos-service server "$@" &>onos.log &
 echo "$!" > /tmp/onos.pid
 
-function killServer() {
-    echo "Killing ONOS server..."
-    cat /tmp/onos.pid | xargs kill -9
-}
-
 # Hang-on a bit and then start tailing the ONOS log output
 MAX_RETRY=30
 echo "Waiting for karaf.log"
diff --git a/tools/package/onos_stage.py b/tools/package/onos_stage.py
index a9f519f..a6b46d4 100755
--- a/tools/package/onos_stage.py
+++ b/tools/package/onos_stage.py
@@ -27,6 +27,8 @@
 
 written_files = set()
 now = time.time()
+karaf_version = "4.2.1"
+karaf_system = "apache-karaf-" + karaf_version + "/system/"
 
 def addFile(tar, dest, file, file_size):
     if dest not in written_files:
@@ -69,7 +71,7 @@
                     for f in zip_part.infolist():
                         dest = f.filename
                         if base not in dest:
-                            dest = base + 'apache-karaf-3.0.8/system/' + f.filename
+                            dest = base + karaf_system + f.filename
                         addFile(output, dest, zip_part.open(f), f.file_size)
             elif '.oar' in file:
                 with ZipFile(file, 'r') as oar:
@@ -82,12 +84,12 @@
                     for f in oar.infolist():
                         filename = f.filename
                         if 'm2' in filename:
-                            dest = base + 'apache-karaf-3.0.8/system/' + filename[3:]
+                            dest = base + karaf_system + filename[3:]
                             if dest not in written_files:
                                 addFile(output, dest, oar.open(f), f.file_size)
                                 written_files.add(dest)
             elif 'features.xml' in file:
-                dest = base + 'apache-karaf-3.0.8/system/org/onosproject/onos-features/%s/' % version
+                dest = base + karaf_system + 'org/onosproject/onos-features/%s/' % version
                 dest += 'onos-features-%s-features.xml' % version
                 with open(file, 'rb') as f:
                     addFile(output, dest, f, os.stat(file).st_size)
diff --git a/tools/test/bin/onos-archetypes-test b/tools/test/bin/onos-archetypes-test
index 1626180..ba21b14 100755
--- a/tools/test/bin/onos-archetypes-test
+++ b/tools/test/bin/onos-archetypes-test
@@ -19,7 +19,7 @@
 set -e
 
 export AROOT=${ONOS_STAGE_ROOT:-/tmp}/foo
-export ARCHETYPE_OPTS="-DarchetypeGroupId=org.onosproject -DarchetypeVersion=1.15.0-SNAPSHOT"
+export ARCHETYPE_OPTS="-DarchetypeGroupId=org.onosproject -DarchetypeVersion=2.0.0-SNAPSHOT"
 
 mkdir -p $AROOT
 for an in api bundle cli rest ui uitab uitopo; do
diff --git a/tools/test/bin/onos-check-bits b/tools/test/bin/onos-check-bits
index 1196e27..ed7bb7c 100755
--- a/tools/test/bin/onos-check-bits
+++ b/tools/test/bin/onos-check-bits
@@ -32,7 +32,7 @@
   echo "ONOS archive does not contain the proper version file" && exit 1
 fi
 
-tar tzf ${ONOS_TAR} | grep -q apache-karaf-3.0.8
+tar tzf ${ONOS_TAR} | grep -q apache-karaf-4.2.1
 if [ $? -ne 0 ]; then
   echo "ONOS archive does not contain karaf" && exit 1
 fi
diff --git a/tools/test/bin/onos-check-component b/tools/test/bin/onos-check-component
index 0eadf3c..e62786e 100755
--- a/tools/test/bin/onos-check-component
+++ b/tools/test/bin/onos-check-component
@@ -11,7 +11,7 @@
 state=$3
 
 for attempt in {1..30}; do
-    onos ${node:-$OCI} scr:list  | grep $component > $aux
+    onos ${node:-$OCI} onos:scr-list  | grep $component > $aux
 
     if grep $state $aux; then
         exit 0
diff --git a/tools/test/bin/onos-check-components b/tools/test/bin/onos-check-components
index 9275b50..d8cc44c 100755
--- a/tools/test/bin/onos-check-components
+++ b/tools/test/bin/onos-check-components
@@ -7,7 +7,7 @@
 trap "rm -f $aux 2>/dev/null" EXIT
 
 for attempt in {1..30}; do
-    onos ${1:-$OCI} scr:list > $aux
+    onos ${1:-$OCI} onos:scr-list > $aux
 
     if grep -q UNSATISFIED $aux; then
         sleep 1
diff --git a/tools/test/bin/onos-check-logs b/tools/test/bin/onos-check-logs
index f54fad2..86b199c 100755
--- a/tools/test/bin/onos-check-logs
+++ b/tools/test/bin/onos-check-logs
@@ -108,7 +108,7 @@
             }
 
             # Sanctioned exclusions for exceptions in third-party code; one pattern per exclusion
-            /at org\.apache\.felix\.scr\.impl\.ComponentRegistry\.getComponents\(ComponentRegistry\.java:199\)/ { exclusion = 1; }
+            /at org\.apache\.felix\.scr\.impl\.ComponentRegistry\.getComponentHolders\(ComponentRegistry\.java:356\)/ { exclusion = 1; }
             /at org\.apache\.karaf\.service\.guard\.impl\.GuardProxyCatalog.1.run\(GuardProxyCatalog\.java:253\)/ { exclusion = 1; }
 
         END { exit fail; }
diff --git a/tools/test/bin/onos-secure-ssh b/tools/test/bin/onos-secure-ssh
index 45f0401..e62e5dd7 100755
--- a/tools/test/bin/onos-secure-ssh
+++ b/tools/test/bin/onos-secure-ssh
@@ -23,10 +23,11 @@
 
 # ensure known_hosts file exist
 (umask 077; touch "$HOME/.ssh/known_hosts")
-
+set -x
 for node in $nodes; do
     # Setup passwordless login for the local user on the remote node
     ssh $ONOS_USER@$node "
+        set -x
         [ ! -f ~/.ssh/id_rsa.pub ] && ssh-keygen -t rsa -f ~/.ssh/id_rsa -P '' -q
         $ONOS_INSTALL_DIR/bin/onos-user-key \$(id -un) \$(cut -d\\  -f2 ~/.ssh/id_rsa.pub)
         $ONOS_INSTALL_DIR/bin/onos-user-password $user $password
diff --git a/tools/test/bin/onos-wait-for-command b/tools/test/bin/onos-wait-for-command
new file mode 100755
index 0000000..ec4e015
--- /dev/null
+++ b/tools/test/bin/onos-wait-for-command
@@ -0,0 +1,21 @@
+#!/bin/bash
+# -----------------------------------------------------------------------------
+# Waits for a CLI command to be runnable.
+# -----------------------------------------------------------------------------
+
+[ ! -d "$ONOS_ROOT" ] && echo "ONOS_ROOT is not defined" >&2 && exit 1
+. $ONOS_ROOT/tools/build/envDefaults
+. $ONOS_ROOT/tools/test/bin/find-node.sh
+
+node=$(find_node ${1})
+cmd="$2"
+
+remote=$ONOS_USER@$node
+
+for i in {1..10}; do
+    $ONOS_ROOT/tools/test/bin/onos $node  ${cmd} 2>/dev/null | \
+        grep -q -v 'Command not found:' && exit 0 || sleep 3
+done
+
+exit 1
+
diff --git a/tools/test/bin/onos-wait-for-start b/tools/test/bin/onos-wait-for-start
index 2cc5002..aad891c 100755
--- a/tools/test/bin/onos-wait-for-start
+++ b/tools/test/bin/onos-wait-for-start
@@ -19,7 +19,7 @@
 
 ssh -t -t $remote "
     # Wait until ApplicationManager is available
-    for i in {1..10}; do
+    for i in {1..30}; do
         grep -q \" ApplicationManager .* Started\" \
             $ONOS_INSTALL_DIR/log/karaf.log* && break || sleep 1
     done
diff --git a/tools/test/scenarios/archetypes.xml b/tools/test/scenarios/archetypes.xml
index 4a49940..c84685b 100644
--- a/tools/test/scenarios/archetypes.xml
+++ b/tools/test/scenarios/archetypes.xml
@@ -27,7 +27,7 @@
             requires="Install-App" delay="5" >
             <parallel var="${OC#}">
                 <step name="Verify-App-${#}"
-                      exec="onos ${OC#} scr:details org.test.app.AppComponent"/>
+                      exec="onos ${OC#} scr:info org.test.app.AppComponent"/>
             </parallel>
         </group>
 
diff --git a/tools/test/scenarios/dist-setup.xml b/tools/test/scenarios/dist-setup.xml
index 85bce01..e28926a 100644
--- a/tools/test/scenarios/dist-setup.xml
+++ b/tools/test/scenarios/dist-setup.xml
@@ -22,6 +22,9 @@
             <step name="Distributed-Primitives-Setup.Check-Apps-${#}"
                   requires="Distributed-Primitives-Setup.Activate-Distributed-Primitives-Test-App"
                   exec="onos-check-apps ${OC#} distributedprimitives includes"/>
+            <step name="Distributed-Primitives-Setup.Wait-Apps-Cli-${#}"
+                  requires="Distributed-Primitives-Setup.Check-Apps-${#}"
+                  exec="onos-wait-for-command ${#} onos:set-test-get"/>
         </parallel>
     </group>
 </scenario>
diff --git a/tools/test/scenarios/smoke.xml b/tools/test/scenarios/smoke.xml
index b1559fc..1bd4421 100644
--- a/tools/test/scenarios/smoke.xml
+++ b/tools/test/scenarios/smoke.xml
@@ -17,19 +17,19 @@
     <import file="${ONOS_SCENARIOS}/prerequisites.xml"/>
     <import file="${ONOS_SCENARIOS}/net-prerequisites.xml"/>
     <import file="${ONOS_SCENARIOS}/setup.xml"/>
-    <import file="${ONOS_SCENARIOS}/app-reactivate.xml"/>
     <import file="${ONOS_SCENARIOS}/dist-test.xml"/>
     <import file="${ONOS_SCENARIOS}/smoke-internal.xml"/>
+    <import file="${ONOS_SCENARIOS}/app-reactivate.xml"/>
     <import file="${ONOS_SCENARIOS}/yang-smoke.xml"/>
     <import file="${ONOS_SCENARIOS}/yang-live-compile.xml"/>
 
     <dependency name="Setup" requires="Prerequisites,Net-Prerequisites"/>
     <dependency name="Net-Smoke" requires="Setup"/>
-    <dependency name="App-Reactivation" requires="Setup"/>
     <dependency name="Drivers-Test" requires="Setup"/>
     <dependency name="Meta-App" requires="Setup"/>
     <dependency name="Netcfg" requires="Setup"/>
     <dependency name="Distributed-Primitives" requires="Setup"/>
+    <dependency name="App-Reactivation" requires="Setup,~Distributed-Primitives"/>
     <dependency name="YANG-Smoke" requires="Setup,~Distributed-Primitives"/>
     <dependency name="YANG-Live-Compile" requires="Setup,~YANG-Smoke"/>
 
diff --git a/utils/junit/BUCK b/utils/junit/BUCK
deleted file mode 100644
index f4e5444..0000000
--- a/utils/junit/BUCK
+++ /dev/null
@@ -1,21 +0,0 @@
-SRC_DEPS = [
-    '//lib:junit',
-    '//lib:hamcrest-all',
-    '//lib:com_google_guava_guava',
-    '//lib:slf4j-api',
-]
-
-TEST_DEPS = [
-    '//lib:com_google_guava_guava_testlib',
-]
-
-osgi_jar_with_tests(
-    name = 'onlab-junit',
-    srcs = glob([SRC + '/*.java']),
-    deps = SRC_DEPS,
-    test_deps = TEST_DEPS,
-    visibility = ['PUBLIC'],
-    resources_root = 'src/main/resources',
-    resources = glob(['src/main/resources/**']),
-    package_name_root = 'org.onlab',
-)
diff --git a/utils/misc/BUCK b/utils/misc/BUCK
deleted file mode 100644
index 5df6e11..0000000
--- a/utils/misc/BUCK
+++ /dev/null
@@ -1,17 +0,0 @@
-COMPILE_DEPS = [
-    '//lib:COMPILE',
-    '//lib:NETTY',
-    '//lib:METRICS',
-    '//lib:KRYO',
-    '//lib:io_netty_netty',
-    '//lib:JACKSON',
-]
-
-osgi_jar_with_tests(
-    name = 'onlab-misc',
-    deps = COMPILE_DEPS,
-    package_name_root = 'org.onlab',
-    visibility = ['PUBLIC'],
-)
-
-
diff --git a/utils/osgi/BUCK b/utils/osgi/BUCK
deleted file mode 100644
index 36d5819..0000000
--- a/utils/osgi/BUCK
+++ /dev/null
@@ -1,9 +0,0 @@
-COMPILE_DEPS = [
-    '//lib:COMPILE',
-]
-
-osgi_jar_with_tests(
-  name = 'onlab-osgi',
-  deps = COMPILE_DEPS,
-  package_name_root = 'org.onlab',
-)
diff --git a/utils/osgiwrap/BUCK b/utils/osgiwrap/BUCK
deleted file mode 100644
index 3a91e9b..0000000
--- a/utils/osgiwrap/BUCK
+++ /dev/null
@@ -1,26 +0,0 @@
-SRC = 'src/main/java/org/onlab/**/'
-TEST = 'src/test/java/org/onlab/**/'
-CURRENT_NAME = 'onlab-osgiwrap'
-CURRENT_TARGET = ':' + CURRENT_NAME
-
-COMPILE_DEPS = [
-    '//lib:com_google_guava_guava',
-    '//lib:bndlib',
-    '//lib:org.apache.felix.scr.bnd'
-]
-
-
-java_library(
-    name = CURRENT_NAME,
-    #maven_coords = 'org.onosproject:' + CURRENT_NAME + ':' + '1.2.3',
-    srcs = glob([SRC + '/*.java']),
-    deps = COMPILE_DEPS,
-    visibility = ['PUBLIC'],
-)
-
-java_binary(
-    name = 'osgi-jar',
-    deps = COMPILE_DEPS + [ ':' + CURRENT_NAME ],
-    main_class = 'org.onlab.osgiwrap.OSGiWrapper',
-    visibility = [ 'PUBLIC' ]
-)
diff --git a/utils/osgiwrap/src/main/java/org/onlab/osgiwrap/OSGiWrapper.java b/utils/osgiwrap/src/main/java/org/onlab/osgiwrap/OSGiWrapper.java
index 821bf40..b57dab5 100644
--- a/utils/osgiwrap/src/main/java/org/onlab/osgiwrap/OSGiWrapper.java
+++ b/utils/osgiwrap/src/main/java/org/onlab/osgiwrap/OSGiWrapper.java
@@ -84,6 +84,7 @@
     private String destdir;
 
     private String bundleClasspath;
+    private String karafCommands;
 
     // FIXME should consider using Commons CLI, etc.
     public static void main(String[] args) {
@@ -107,6 +108,7 @@
         String dynamicimportPackages = args[12];
         String destdir = args[13];
         String bundleClasspath = args[14];
+        String karafCommands = args[15];
         String desc = Joiner.on(' ').join(Arrays.copyOfRange(args, 12, args.length));
 
         OSGiWrapper wrapper = new OSGiWrapper(jar, output, cp,
@@ -119,7 +121,8 @@
                 dynamicimportPackages,
                 desc,
                 destdir,
-                bundleClasspath);
+                bundleClasspath,
+                karafCommands);
         wrapper.log(wrapper + "\n");
         if (!wrapper.execute()) {
             System.err.printf("Error generating %s\n", name);
@@ -143,7 +146,8 @@
                        String dynamicimportPackages,
                        String bundleDescription,
                        String destdir,
-                       String bundleClasspath) {
+                       String bundleClasspath,
+                       String karafCommands) {
         this.inputJar = inputJar;
         this.classpath = Lists.newArrayList(classpath.split(":"));
         if (!this.classpath.contains(inputJar)) {
@@ -174,6 +178,7 @@
         this.destdir = destdir;
 
         this.bundleClasspath = bundleClasspath;
+        this.karafCommands = karafCommands;
     }
 
     private void setProperties(Analyzer analyzer) {
@@ -189,6 +194,7 @@
         //analyzer.setProperty("-consumer-policy", "${range;[===,==+)}");
 
         analyzer.setProperty(Analyzer.DYNAMICIMPORT_PACKAGE, dynamicimportPackages);
+        analyzer.setProperty(Analyzer.DSANNOTATIONS_OPTIONS, "inherit");
 
         // TODO include version in export, but not in import
         analyzer.setProperty(Analyzer.EXPORT_PACKAGE, exportPackages);
@@ -207,6 +213,7 @@
             analyzer.setProperty(Analyzer.IMPORT_PACKAGE, importPackages +
                     ",org.glassfish.jersey.servlet,org.jvnet.mimepull\n");
         }
+        analyzer.setProperty("Karaf-Commands", karafCommands);
     }
 
     public boolean execute() {
@@ -230,14 +237,14 @@
             // Analyze the target JAR first
             analyzer.analyze();
 
-            // Scan the JAR for Felix SCR annotations and generate XML files
-            Map<String, String> properties = Maps.newHashMap();
-            // destdir hack
-            properties.put("destdir", destdir);
-            SCRDescriptorBndPlugin scrDescriptorBndPlugin = new SCRDescriptorBndPlugin();
-            scrDescriptorBndPlugin.setProperties(properties);
-            scrDescriptorBndPlugin.setReporter(analyzer);
-            scrDescriptorBndPlugin.analyzeJar(analyzer);
+            //// Scan the JAR for Felix SCR annotations and generate XML files
+            //Map<String, String> properties = Maps.newHashMap();
+            //// destdir hack
+            //properties.put("destdir", destdir);
+            //SCRDescriptorBndPlugin scrDescriptorBndPlugin = new SCRDescriptorBndPlugin();
+            //scrDescriptorBndPlugin.setProperties(properties);
+            //scrDescriptorBndPlugin.setReporter(analyzer);
+            //scrDescriptorBndPlugin.analyzeJar(analyzer);
 
             if (includeResources != null) {
                 doIncludeResources(analyzer);
diff --git a/utils/rest/BUCK b/utils/rest/BUCK
deleted file mode 100644
index 2d7885b..0000000
--- a/utils/rest/BUCK
+++ /dev/null
@@ -1,14 +0,0 @@
-COMPILE_DEPS = [
-    '//lib:COMPILE',
-    '//lib:JACKSON',
-    '//utils/osgi:onlab-osgi',
-    '//utils/misc:onlab-misc',
-    '//lib:javax.ws.rs-api',
-    '//lib:jersey-server',
-]
-
-osgi_jar_with_tests (
-    name = 'onlab-rest',
-    deps = COMPILE_DEPS,
-    package_name_root = 'org.onlab',
-)
diff --git a/web/api/BUCK b/web/api/BUCK
deleted file mode 100644
index c1c6ab4..0000000
--- a/web/api/BUCK
+++ /dev/null
@@ -1,25 +0,0 @@
-COMPILE_DEPS = [
-    '//lib:CORE_DEPS',
-    '//lib:JACKSON',
-    '//lib:METRICS',
-    '//incubator/api:onos-incubator-api',
-    '//lib:javax.ws.rs-api',
-    '//utils/rest:onlab-rest',
-]
-
-TEST_DEPS = [
-    '//lib:TEST_REST',
-    '//lib:minimal-json',
-    '//lib:jersey-security'
-]
-
-osgi_jar_with_tests (
-    name = 'onos-rest',
-    deps = COMPILE_DEPS,
-    test_deps = TEST_DEPS,
-    web_context = '/onos/v1',
-    api_title = 'ONOS Core REST API',
-    api_version = '1.0',
-    api_description = 'ONOS Core REST API',
-    api_package = 'org.onosproject.rest.impl',
-)
diff --git a/web/api/src/main/java/org/onosproject/rest/impl/ApiDocManager.java b/web/api/src/main/java/org/onosproject/rest/impl/ApiDocManager.java
index 753f640..f9dd678 100644
--- a/web/api/src/main/java/org/onosproject/rest/impl/ApiDocManager.java
+++ b/web/api/src/main/java/org/onosproject/rest/impl/ApiDocManager.java
@@ -17,12 +17,11 @@
 
 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.Service;
 import org.onosproject.rest.ApiDocProvider;
 import org.onosproject.rest.ApiDocService;
+import org.osgi.service.component.annotations.Activate;
+import org.osgi.service.component.annotations.Component;
+import org.osgi.service.component.annotations.Deactivate;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -32,8 +31,7 @@
 /**
  * Implementation of the REST API documentation tracker.
  */
-@Component(immediate = true)
-@Service
+@Component(immediate = true, service = ApiDocService.class)
 public class ApiDocManager implements ApiDocService {
 
     private final Logger log = LoggerFactory.getLogger(getClass());
diff --git a/web/gui/BUCK b/web/gui/BUCK
deleted file mode 100644
index df70a20..0000000
--- a/web/gui/BUCK
+++ /dev/null
@@ -1,67 +0,0 @@
-NODE_VERSION = 'v8.11.1'
-
-COMPILE_DEPS = [
-    '//lib:CORE_DEPS',
-    '//lib:JACKSON',
-    '//lib:KRYO',
-    '//lib:javax.ws.rs-api',
-    '//lib:servlet-api',
-    '//lib:jetty-websocket',
-    '//lib:jetty-util',
-    '//lib:jersey-media-multipart',
-    '//lib:org.apache.karaf.shell.console',
-    '//cli:onos-cli',
-    '//lib:jersey-server',
-    '//incubator/api:onos-incubator-api',
-    '//incubator/net:onos-incubator-net',
-    '//utils/rest:onlab-rest',
-    '//core/store/serializers:onos-core-serializers',
-    ':onos-tools-gui',
-]
-
-TEST_DEPS = [
-    '//lib:TEST',
-    '//core/api:onos-api-tests',
-    '//drivers/default:onos-drivers-default',
-]
-
-RESOURCES = {
-    'WEB-INF/classes/index.html': 'src/main/webapp/index.html',
-    'WEB-INF/classes/login.html': 'src/main/webapp/login.html',
-    'WEB-INF/classes/error.html': 'src/main/webapp/error.html',
-    'WEB-INF/classes/not-ready.html': 'src/main/webapp/not-ready.html',
-    'WEB-INF/classes/onos.js': 'src/main/webapp/onos.js',
-    'WEB-INF/classes/nav.html': 'src/main/webapp/nav.html',
-    'WEB-INF/classes/app/view': 'src/main/webapp/app/view',
-    'WEB-INF/classes/raw': 'src/main/webapp/raw',
-}
-
-include_defs('//bucklets/node.bucklet')
-sh_src='onos-gui-build'
-
-fetch_node(version = NODE_VERSION)
-
-export_file (
-    name = 'onos-tools-gui-exe',
-    src = sh_src,
-    visibility = [ 'PUBLIC' ],
-)
-
-genrule(
-    name = 'onos-tools-gui',
-    srcs = glob(['src/main/webapp/*.js', 'src/main/webapp/app/**/*.js'], excludes = ['src/main/webapp/dist/*.js']),
-    bash = '$(location :onos-tools-gui-exe) '
-        + ' $(location :node-release-' + NODE_VERSION + ') '
-        + '$(location :node-bin-' + NODE_VERSION + ') > $OUT',
-    out = 'onos-tools-gui.log',
-    visibility = [ 'PUBLIC' ],
-)
-
-osgi_jar_with_tests (
-    name = 'onos-gui',
-    deps = COMPILE_DEPS,
-    test_deps = TEST_DEPS,
-    include_resources = RESOURCES,
-    web_context = '/onos/ui',
-    do_javadocs = False,
-)
diff --git a/web/gui/BUILD b/web/gui/BUILD
index be8e3f3..302e793 100644
--- a/web/gui/BUILD
+++ b/web/gui/BUILD
@@ -28,15 +28,14 @@
     the sandbox at the proper locations and then returned as a tar ball.
 """
 
-COMPILE_DEPS = CORE_DEPS + JACKSON + KRYO + [
+COMPILE_DEPS = CORE_DEPS + JACKSON + KRYO + CLI + [
     "@javax_ws_rs_api//jar",
     "@servlet_api//jar",
     "@jetty_websocket//jar",
+    "@jetty_websocket_api//jar",
     "@jetty_util//jar",
     "@jersey_media_multipart//jar",
-    "@org_apache_karaf_shell_console//jar",
     "@jersey_server//jar",
-    "//cli:onos-cli",
     "//incubator/api:onos-incubator-api",
     "//incubator/net:onos-incubator-net",
     "//utils/rest:onlab-rest",
@@ -195,11 +194,15 @@
 """
 
 osgi_jar_with_tests(
-    name = "_onos-gui-base-jar",
+    name = "onos-gui-jar",
     exclude_tests = [
         "org.onosproject.ui.impl.AbstractUiImplTest",
         "org.onosproject.ui.impl.topo.model.AbstractTopoModelTest",
     ],
+    karaf_command_packages = [
+        "org.onosproject.ui.impl.cli",
+        "org.onosproject.ui.impl.topo",
+    ],
     test_deps = TEST_DEPS,
     web_context = "/onos/ui",
     deps = COMPILE_DEPS,
@@ -224,7 +227,7 @@
     name = "onos-gui",
     srcs = [
         ":_onos-gui-npm-build",
-        ":_onos-gui-base-jar",
+        ":onos-gui-jar",
         ":_root_level_files",
         ":_web_inf_classes_files",
         ":_raw_classes_files",
@@ -240,7 +243,7 @@
           " for i in $(locations :_web_inf_classes_files); do cp $$ROOT/$$i ./WEB-INF/classes/; done &&" +
           " mkdir ./WEB-INF/classes/raw && " +
           " for i in $(locations :_raw_classes_files); do cp $$ROOT/$$i ./WEB-INF/classes/raw/; done &&" +
-          " jar xf $$ROOT/$(location :_onos-gui-base-jar) &&" +
+          " jar xf $$ROOT/$(location :onos-gui-jar) &&" +
           " find . -type f -exec touch -t 201806280000 {} \; &&" +
           " jar cmf META-INF/MANIFEST.MF $$ROOT/$@ .",
     output_to_bindir = 1,
diff --git a/web/gui/src/main/java/org/onosproject/ui/impl/MainIndexResource.java b/web/gui/src/main/java/org/onosproject/ui/impl/MainIndexResource.java
index 12a8621..218e259 100644
--- a/web/gui/src/main/java/org/onosproject/ui/impl/MainIndexResource.java
+++ b/web/gui/src/main/java/org/onosproject/ui/impl/MainIndexResource.java
@@ -36,6 +36,7 @@
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.SequenceInputStream;
+import java.net.URI;
 
 import static com.google.common.collect.ImmutableList.of;
 import static com.google.common.io.ByteStreams.toByteArray;
@@ -46,6 +47,8 @@
 @Path("/")
 public class MainIndexResource extends AbstractInjectionResource {
 
+    private static final String INDEX_REDIRECT = "/onos/ui/index.html";
+
     private static final String INDEX = "index.html";
     private static final String NOT_READY = "not-ready.html";
 
@@ -66,6 +69,16 @@
 
     @GET
     @Produces(MediaType.TEXT_HTML)
+    public Response getMainIndexRedirect() throws IOException {
+        if (ctx == null || ctx.getUserPrincipal() == null) {
+            return Response.temporaryRedirect(URI.create(INDEX_REDIRECT)).build();
+        }
+        return getMainIndex();
+    }
+
+    @GET
+    @Produces(MediaType.TEXT_HTML)
+    @Path("/index.html")
     public Response getMainIndex() throws IOException {
         ClassLoader classLoader = getClass().getClassLoader();
         UiExtensionService service;
diff --git a/web/gui/src/main/java/org/onosproject/ui/impl/UiExtensionManager.java b/web/gui/src/main/java/org/onosproject/ui/impl/UiExtensionManager.java
index bb24c89..c776fb3 100644
--- a/web/gui/src/main/java/org/onosproject/ui/impl/UiExtensionManager.java
+++ b/web/gui/src/main/java/org/onosproject/ui/impl/UiExtensionManager.java
@@ -32,12 +32,6 @@
 import com.google.common.collect.ImmutableSet;
 import com.google.common.collect.Lists;
 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.Tools;
 import org.onosproject.mastership.MastershipService;
 import org.onosproject.store.serializers.KryoNamespaces;
@@ -66,6 +60,11 @@
 import org.onosproject.ui.impl.topo.model.UiSharedTopologyModel;
 import org.onosproject.ui.lion.LionBundle;
 import org.onosproject.ui.lion.LionUtils;
+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;
 
@@ -82,10 +81,10 @@
 import static com.google.common.collect.ImmutableList.of;
 import static java.util.stream.Collectors.toSet;
 import static org.onosproject.security.AppGuard.checkPermission;
-import static org.onosproject.security.AppPermission.Type.UI_READ;
-import static org.onosproject.security.AppPermission.Type.UI_WRITE;
 import static org.onosproject.security.AppPermission.Type.GLYPH_READ;
 import static org.onosproject.security.AppPermission.Type.GLYPH_WRITE;
+import static org.onosproject.security.AppPermission.Type.UI_READ;
+import static org.onosproject.security.AppPermission.Type.UI_WRITE;
 import static org.onosproject.ui.UiView.Category.NETWORK;
 import static org.onosproject.ui.UiView.Category.PLATFORM;
 import static org.onosproject.ui.impl.lion.BundleStitcher.generateBundles;
@@ -93,8 +92,8 @@
 /**
  * Manages the user interface extensions.
  */
-@Component(immediate = true)
-@Service
+@Component(immediate = true, service = { UiExtensionService.class, UiPreferencesService.class, SpriteService.class,
+        UiTokenService.class })
 public class UiExtensionManager
         implements UiExtensionService, UiPreferencesService, SpriteService,
         UiTokenService {
@@ -148,13 +147,13 @@
     // Core views & core extension
     private final UiExtension core = createCoreExtension();
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected MastershipService mastershipService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected StorageService storageService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     private UiSharedTopologyModel sharedModel;
 
     // User preferences
diff --git a/web/gui/src/main/java/org/onosproject/ui/impl/UiWebSocket.java b/web/gui/src/main/java/org/onosproject/ui/impl/UiWebSocket.java
index e53a007..44acba2 100644
--- a/web/gui/src/main/java/org/onosproject/ui/impl/UiWebSocket.java
+++ b/web/gui/src/main/java/org/onosproject/ui/impl/UiWebSocket.java
@@ -18,7 +18,8 @@
 import com.fasterxml.jackson.databind.ObjectMapper;
 import com.fasterxml.jackson.databind.node.ArrayNode;
 import com.fasterxml.jackson.databind.node.ObjectNode;
-import org.eclipse.jetty.websocket.WebSocket;
+import org.eclipse.jetty.websocket.api.Session;
+import org.eclipse.jetty.websocket.api.WebSocketAdapter;
 import org.onlab.osgi.ServiceDirectory;
 import org.onlab.osgi.ServiceNotFoundException;
 import org.onosproject.cluster.ClusterService;
@@ -47,15 +48,18 @@
 import org.slf4j.LoggerFactory;
 
 import java.io.IOException;
+import java.nio.ByteBuffer;
 import java.util.HashMap;
 import java.util.Locale;
 import java.util.Map;
 
+import static org.onosproject.ui.impl.UiWebSocketServlet.PING_DELAY_MS;
+
 /**
  * Web socket capable of interacting with the Web UI.
  */
-public class UiWebSocket
-        implements UiConnection, WebSocket.OnTextMessage, WebSocket.OnControl {
+
+public class UiWebSocket extends WebSocketAdapter implements UiConnection {
 
     private static final Logger log = LoggerFactory.getLogger(UiWebSocket.class);
 
@@ -82,16 +86,13 @@
 
     private static final long MAX_AGE_MS = 30_000;
 
-    private static final byte PING = 0x9;
-    private static final byte PONG = 0xA;
     private static final byte[] PING_DATA = new byte[]{(byte) 0xde, (byte) 0xad};
+    private static final ByteBuffer PING = ByteBuffer.wrap(PING_DATA);
 
     private final ObjectMapper mapper = new ObjectMapper();
     private final ServiceDirectory directory;
     private final UiTopoSession topoSession;
 
-    private Connection connection;
-    private FrameConnection control;
     private String userName;
     private String currentView;
 
@@ -171,10 +172,10 @@
     /**
      * Issues a close on the connection.
      */
-    synchronized void close() {
+    void close() {
         destroyHandlersAndOverlays();
-        if (connection.isOpen()) {
-            connection.close();
+        if (isConnected()) {
+            getSession().close();
         }
     }
 
@@ -183,15 +184,17 @@
      *
      * @return true if idle or closed
      */
-    synchronized boolean isIdle() {
+    boolean isIdle() {
         long quietFor = System.currentTimeMillis() - lastActive;
         boolean idle = quietFor > MAX_AGE_MS;
-        if (idle || (connection != null && !connection.isOpen())) {
+        if (idle || isNotConnected()) {
             log.debug("IDLE (or closed) websocket [{} ms]", quietFor);
             return true;
-        } else if (connection != null) {
+
+        } else if (isConnected() && quietFor > PING_DELAY_MS) {
             try {
-                control.sendControl(PING, PING_DATA, 0, PING_DATA.length);
+                getRemote().sendPing(PING);
+                lastActive = System.currentTimeMillis();
             } catch (IOException e) {
                 log.warn("Unable to send ping message due to: ", e);
             }
@@ -200,26 +203,24 @@
     }
 
     @Override
-    public synchronized void onOpen(Connection connection) {
-        this.connection = connection;
-        this.control = (FrameConnection) connection;
+    public void onWebSocketConnect(Session session) {
+        super.onWebSocketConnect(session);
         try {
             topoSession.init();
             createHandlersAndOverlays();
             sendBootstrapData();
             sendUberLionBundle();
+            lastActive = System.currentTimeMillis();
             log.info("GUI client connected -- user <{}>", userName);
 
         } catch (ServiceNotFoundException e) {
             log.warn("Unable to open GUI connection; services have been shut-down", e);
-            this.connection.close();
-            this.connection = null;
-            this.control = null;
+            getSession().close();
         }
     }
 
     @Override
-    public synchronized void onClose(int closeCode, String message) {
+    public void onWebSocketClose(int closeCode, String reason) {
         try {
             try {
                 tokenService().revokeToken(sessionToken);
@@ -234,18 +235,13 @@
         } catch (Exception e) {
             log.warn("Unexpected error", e);
         }
+        super.onWebSocketClose(closeCode, reason);
         log.info("GUI client disconnected [close-code={}, message={}]",
-                 closeCode, message);
+                 closeCode, reason);
     }
 
     @Override
-    public boolean onControl(byte controlCode, byte[] data, int offset, int length) {
-        lastActive = System.currentTimeMillis();
-        return true;
-    }
-
-    @Override
-    public void onMessage(String data) {
+    public void onWebSocketText(String data) {
         lastActive = System.currentTimeMillis();
         try {
             ObjectNode message = (ObjectNode) mapper.reader().readTree(data);
@@ -270,10 +266,16 @@
     }
 
     @Override
+    public void onWebSocketBinary(byte[] payload, int offset, int length) {
+        lastActive = System.currentTimeMillis();
+        log.warn("Binary messages are currently not supported");
+    }
+
+    @Override
     public synchronized void sendMessage(ObjectNode message) {
         try {
-            if (connection.isOpen()) {
-                connection.sendMessage(message.toString());
+            if (isConnected()) {
+                getRemote().sendString(message.toString());
                 log.debug("TX message: {}", message);
             }
         } catch (IOException e) {
diff --git a/web/gui/src/main/java/org/onosproject/ui/impl/UiWebSocketServlet.java b/web/gui/src/main/java/org/onosproject/ui/impl/UiWebSocketServlet.java
index 650f727..e9a4cbd 100644
--- a/web/gui/src/main/java/org/onosproject/ui/impl/UiWebSocketServlet.java
+++ b/web/gui/src/main/java/org/onosproject/ui/impl/UiWebSocketServlet.java
@@ -18,13 +18,15 @@
 import com.fasterxml.jackson.databind.node.ObjectNode;
 import com.google.common.collect.ImmutableSet;
 import com.google.common.collect.Sets;
-import org.eclipse.jetty.websocket.WebSocket;
-import org.eclipse.jetty.websocket.WebSocketServlet;
+import org.eclipse.jetty.websocket.servlet.ServletUpgradeRequest;
+import org.eclipse.jetty.websocket.servlet.ServletUpgradeResponse;
+import org.eclipse.jetty.websocket.servlet.WebSocketCreator;
+import org.eclipse.jetty.websocket.servlet.WebSocketServlet;
+import org.eclipse.jetty.websocket.servlet.WebSocketServletFactory;
 import org.onlab.osgi.DefaultServiceDirectory;
 import org.onlab.osgi.ServiceDirectory;
 
 import javax.servlet.ServletException;
-import javax.servlet.http.HttpServletRequest;
 import java.security.Principal;
 import java.util.Set;
 import java.util.Timer;
@@ -35,7 +37,7 @@
  */
 public class UiWebSocketServlet extends WebSocketServlet {
 
-    private static final long PING_DELAY_MS = 5000;
+    static final long PING_DELAY_MS = 5000;
 
     private static UiWebSocketServlet instance;
     private static final Object INSTANCE_LOCK = new Object();
@@ -43,10 +45,17 @@
     private static ServiceDirectory directory = new DefaultServiceDirectory();
 
     private final Set<UiWebSocket> sockets = Sets.newConcurrentHashSet();
+
     private final Timer timer = new Timer();
     private final TimerTask pruner = new Pruner();
     private static boolean isStopped = false;
 
+    @Override
+    public void configure(WebSocketServletFactory webSocketServletFactory) {
+        webSocketServletFactory.getPolicy().setIdleTimeout(Long.MAX_VALUE);
+        webSocketServletFactory.setCreator(new UiWebSocketCreator());
+    }
+
     /**
      * Closes all currently open UI web-sockets.
      */
@@ -71,24 +80,6 @@
         timer.schedule(pruner, PING_DELAY_MS, PING_DELAY_MS);
     }
 
-    @Override
-    public WebSocket doWebSocketConnect(HttpServletRequest request, String protocol) {
-        if (isStopped) {
-            return null;
-        }
-
-        // FIXME: Replace this with globally shared opaque token to allow secure failover
-        Principal p = request.getUserPrincipal();
-        String userName = p != null ? p.getName() : FAKE_USERNAME;
-
-        UiWebSocket socket = new UiWebSocket(directory, userName);
-        sockets.add(socket);
-        return socket;
-    }
-
-    // FIXME: This should not be necessary
-    private static final String FAKE_USERNAME = "UI-user";
-
     /**
      * Sends the specified message to all the GUI clients.
      *
@@ -130,4 +121,23 @@
             });
         }
     }
+
+    // FIXME: This should not be necessary
+    private static final String FAKE_USERNAME = "unknown";
+
+    public class UiWebSocketCreator implements WebSocketCreator {
+        @Override
+        public Object createWebSocket(ServletUpgradeRequest request, ServletUpgradeResponse response) {
+            if (!isStopped) {
+                // FIXME: Replace this with globally shared opaque token to allow secure failover
+                Principal p = request.getUserPrincipal();
+                String userName = p != null ? p.getName() : FAKE_USERNAME;
+
+                UiWebSocket socket = new UiWebSocket(directory, userName);
+                sockets.add(socket);
+                return socket;
+            }
+            return null;
+        }
+    }
 }
diff --git a/web/gui/src/main/java/org/onosproject/ui/impl/cli/UiPreferencesListCommand.java b/web/gui/src/main/java/org/onosproject/ui/impl/cli/UiPreferencesListCommand.java
index b79a116..bd26ea7 100644
--- a/web/gui/src/main/java/org/onosproject/ui/impl/cli/UiPreferencesListCommand.java
+++ b/web/gui/src/main/java/org/onosproject/ui/impl/cli/UiPreferencesListCommand.java
@@ -17,19 +17,21 @@
 
 import com.fasterxml.jackson.databind.ObjectMapper;
 import com.fasterxml.jackson.databind.node.ObjectNode;
-import org.apache.karaf.shell.commands.Command;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.ui.UiPreferencesService;
 
 /**
  * Lists all UI user preferences.
  */
+@Service
 @Command(scope = "onos", name = "ui-prefs",
         description = "Lists all UI user preferences")
 public class UiPreferencesListCommand extends AbstractShellCommand {
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         UiPreferencesService service = get(UiPreferencesService.class);
         ObjectMapper mapper = new ObjectMapper();
         ObjectNode root = mapper.createObjectNode();
diff --git a/web/gui/src/main/java/org/onosproject/ui/impl/cli/UiViewListCommand.java b/web/gui/src/main/java/org/onosproject/ui/impl/cli/UiViewListCommand.java
index cea67a0..cb0007d 100644
--- a/web/gui/src/main/java/org/onosproject/ui/impl/cli/UiViewListCommand.java
+++ b/web/gui/src/main/java/org/onosproject/ui/impl/cli/UiViewListCommand.java
@@ -18,7 +18,8 @@
 import com.fasterxml.jackson.databind.JsonNode;
 import com.fasterxml.jackson.databind.ObjectMapper;
 import com.fasterxml.jackson.databind.node.ArrayNode;
-import org.apache.karaf.shell.commands.Command;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.ui.UiExtension;
 import org.onosproject.ui.UiExtensionService;
@@ -28,6 +29,7 @@
 /**
  * Lists all registered UI views.
  */
+@Service
 @Command(scope = "onos", name = "ui-views",
         description = "Lists all registered UI views")
 public class UiViewListCommand extends AbstractShellCommand {
@@ -35,7 +37,7 @@
     private static final String FMT = "id=%s, category=%s, label=%s, icon=%s";
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         UiExtensionService service = get(UiExtensionService.class);
         if (outputJson()) {
             print("%s", json(service.getExtensions()));
diff --git a/web/gui/src/main/java/org/onosproject/ui/impl/topo/UiTopoLayoutManager.java b/web/gui/src/main/java/org/onosproject/ui/impl/topo/UiTopoLayoutManager.java
index d2ab2a7..7441672 100644
--- a/web/gui/src/main/java/org/onosproject/ui/impl/topo/UiTopoLayoutManager.java
+++ b/web/gui/src/main/java/org/onosproject/ui/impl/topo/UiTopoLayoutManager.java
@@ -17,12 +17,6 @@
 package org.onosproject.ui.impl.topo;
 
 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.apache.felix.scr.annotations.Service;
 import org.onosproject.net.config.NetworkConfigEvent;
 import org.onosproject.net.config.NetworkConfigListener;
 import org.onosproject.net.config.NetworkConfigRegistry;
@@ -32,6 +26,11 @@
 import org.onosproject.ui.model.topo.UiRegion;
 import org.onosproject.ui.model.topo.UiTopoLayout;
 import org.onosproject.ui.model.topo.UiTopoLayoutId;
+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;
 
@@ -50,8 +49,7 @@
  * Manages the user interface topology layouts.
  * Note that these layouts are persisted and distributed across the cluster.
  */
-@Component(immediate = true)
-@Service
+@Component(immediate = true, service = UiTopoLayoutService.class)
 public class UiTopoLayoutManager implements UiTopoLayoutService {
 
     private static final String ID_NULL = "Layout ID cannot be null";
@@ -62,7 +60,7 @@
     private final InternalConfigListener cfgListener = new InternalConfigListener();
     private final Map<UiTopoLayoutId, UiTopoLayout> layoutMap = new HashMap<>();
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected NetworkConfigRegistry cfgService;
 
 
diff --git a/web/gui/src/main/java/org/onosproject/ui/impl/topo/cli/UiCacheDevicesCommand.java b/web/gui/src/main/java/org/onosproject/ui/impl/topo/cli/UiCacheDevicesCommand.java
index 612dfac..a2244e8 100644
--- a/web/gui/src/main/java/org/onosproject/ui/impl/topo/cli/UiCacheDevicesCommand.java
+++ b/web/gui/src/main/java/org/onosproject/ui/impl/topo/cli/UiCacheDevicesCommand.java
@@ -16,18 +16,20 @@
 
 package org.onosproject.ui.impl.topo.cli;
 
-import org.apache.karaf.shell.commands.Command;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.ui.impl.topo.model.UiSharedTopologyModel;
 
 /**
  * CLI command to list the UiDevices stored in the ModelCache.
  */
+@Service
 @Command(scope = "onos", name = "ui-cache-devices",
         description = "Lists UiDevices in the Model Cache")
 public class UiCacheDevicesCommand extends AbstractUiCacheElementCommand {
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         UiSharedTopologyModel model = get(UiSharedTopologyModel.class);
         sorted(model.getDevices()).forEach(d -> print("%s", d));
     }
diff --git a/web/gui/src/main/java/org/onosproject/ui/impl/topo/cli/UiCacheHostsCommand.java b/web/gui/src/main/java/org/onosproject/ui/impl/topo/cli/UiCacheHostsCommand.java
index f2ec711..ffb203c 100644
--- a/web/gui/src/main/java/org/onosproject/ui/impl/topo/cli/UiCacheHostsCommand.java
+++ b/web/gui/src/main/java/org/onosproject/ui/impl/topo/cli/UiCacheHostsCommand.java
@@ -16,18 +16,20 @@
 
 package org.onosproject.ui.impl.topo.cli;
 
-import org.apache.karaf.shell.commands.Command;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.ui.impl.topo.model.UiSharedTopologyModel;
 
 /**
  * CLI command to list the UiH0osts stored in the ModelCache.
  */
+@Service
 @Command(scope = "onos", name = "ui-cache-hosts",
         description = "Lists UiHosts in the Model Cache")
 public class UiCacheHostsCommand extends AbstractUiCacheElementCommand {
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         UiSharedTopologyModel model = get(UiSharedTopologyModel.class);
         sorted(model.getHosts()).forEach(h -> print("%s", h));
     }
diff --git a/web/gui/src/main/java/org/onosproject/ui/impl/topo/cli/UiCacheLinksCommand.java b/web/gui/src/main/java/org/onosproject/ui/impl/topo/cli/UiCacheLinksCommand.java
index 30fbe4b..14b8659 100644
--- a/web/gui/src/main/java/org/onosproject/ui/impl/topo/cli/UiCacheLinksCommand.java
+++ b/web/gui/src/main/java/org/onosproject/ui/impl/topo/cli/UiCacheLinksCommand.java
@@ -16,18 +16,20 @@
 
 package org.onosproject.ui.impl.topo.cli;
 
-import org.apache.karaf.shell.commands.Command;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.ui.impl.topo.model.UiSharedTopologyModel;
 
 /**
  * CLI command to list the UiLinks stored in the ModelCache.
  */
+@Service
 @Command(scope = "onos", name = "ui-cache-links",
         description = "Lists UiLinks in the Model Cache")
 public class UiCacheLinksCommand extends AbstractUiCacheElementCommand {
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         UiSharedTopologyModel model = get(UiSharedTopologyModel.class);
         sorted(model.getDeviceLinks()).forEach(l -> print("%s", l));
     }
diff --git a/web/gui/src/main/java/org/onosproject/ui/impl/topo/cli/UiCacheMembersCommand.java b/web/gui/src/main/java/org/onosproject/ui/impl/topo/cli/UiCacheMembersCommand.java
index d54a750..ac3c264 100644
--- a/web/gui/src/main/java/org/onosproject/ui/impl/topo/cli/UiCacheMembersCommand.java
+++ b/web/gui/src/main/java/org/onosproject/ui/impl/topo/cli/UiCacheMembersCommand.java
@@ -16,18 +16,20 @@
 
 package org.onosproject.ui.impl.topo.cli;
 
-import org.apache.karaf.shell.commands.Command;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.ui.impl.topo.model.UiSharedTopologyModel;
 
 /**
  * CLI command to list the UiClusterMembers stored in the ModelCache.
  */
+@Service
 @Command(scope = "onos", name = "ui-cache-members",
         description = "Lists UiClusterMembers in the Model Cache")
 public class UiCacheMembersCommand extends AbstractUiCacheElementCommand {
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         UiSharedTopologyModel model = get(UiSharedTopologyModel.class);
         // note: getClusterMembers() returns an already sorted list...
         model.getClusterMembers().forEach(m -> print("%s", m));
diff --git a/web/gui/src/main/java/org/onosproject/ui/impl/topo/cli/UiCacheRegionsCommand.java b/web/gui/src/main/java/org/onosproject/ui/impl/topo/cli/UiCacheRegionsCommand.java
index 5fef5ff..5a1bb46 100644
--- a/web/gui/src/main/java/org/onosproject/ui/impl/topo/cli/UiCacheRegionsCommand.java
+++ b/web/gui/src/main/java/org/onosproject/ui/impl/topo/cli/UiCacheRegionsCommand.java
@@ -16,18 +16,20 @@
 
 package org.onosproject.ui.impl.topo.cli;
 
-import org.apache.karaf.shell.commands.Command;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.ui.impl.topo.model.UiSharedTopologyModel;
 
 /**
  * CLI command to list the UiRegions stored in the ModelCache.
  */
+@Service
 @Command(scope = "onos", name = "ui-cache-regions",
         description = "Lists UiRegions in the Model Cache")
 public class UiCacheRegionsCommand extends AbstractUiCacheElementCommand {
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         UiSharedTopologyModel model = get(UiSharedTopologyModel.class);
         print("%s", model.getNullRegion());
         sorted(model.getRegions()).forEach(r -> print("%s", r));
diff --git a/web/gui/src/main/java/org/onosproject/ui/impl/topo/cli/UiClearMetaCommand.java b/web/gui/src/main/java/org/onosproject/ui/impl/topo/cli/UiClearMetaCommand.java
index ecbd82a..b53a8dc 100644
--- a/web/gui/src/main/java/org/onosproject/ui/impl/topo/cli/UiClearMetaCommand.java
+++ b/web/gui/src/main/java/org/onosproject/ui/impl/topo/cli/UiClearMetaCommand.java
@@ -17,19 +17,21 @@
 
 package org.onosproject.ui.impl.topo.cli;
 
-import org.apache.karaf.shell.commands.Command;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.ui.impl.TopologyViewMessageHandlerBase;
 
 /**
  * Clears meta-UI data for topology view.
  */
+@Service
 @Command(scope = "onos", name = "ui-clear-meta",
         description = "Clears meta-UI data for topology view")
 public class UiClearMetaCommand extends AbstractShellCommand {
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         TopologyViewMessageHandlerBase.clearMetaUi();
     }
 }
diff --git a/web/gui/src/main/java/org/onosproject/ui/impl/topo/cli/UiGeoMapListCommand.java b/web/gui/src/main/java/org/onosproject/ui/impl/topo/cli/UiGeoMapListCommand.java
index 8134a62..e7594f7 100644
--- a/web/gui/src/main/java/org/onosproject/ui/impl/topo/cli/UiGeoMapListCommand.java
+++ b/web/gui/src/main/java/org/onosproject/ui/impl/topo/cli/UiGeoMapListCommand.java
@@ -17,7 +17,8 @@
 
 package org.onosproject.ui.impl.topo.cli;
 
-import org.apache.karaf.shell.commands.Command;
+import org.apache.karaf.shell.api.action.Command;
+import org.apache.karaf.shell.api.action.lifecycle.Service;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.ui.UiExtensionService;
 import org.onosproject.ui.UiTopoMapFactory;
@@ -26,12 +27,13 @@
  * CLI command to list the registered geographic maps, that may be used
  * by the topology view.
  */
+@Service
 @Command(scope = "onos", name = "ui-geo-map-list",
         description = "Lists available geographic maps for topology view")
 public class UiGeoMapListCommand extends AbstractShellCommand {
 
     @Override
-    protected void execute() {
+    protected void doExecute() {
         UiExtensionService uxs = get(UiExtensionService.class);
         uxs.getExtensions().forEach(ext -> {
             UiTopoMapFactory mapFactory = ext.topoMapFactory();
diff --git a/web/gui/src/main/java/org/onosproject/ui/impl/topo/model/UiSharedTopologyModel.java b/web/gui/src/main/java/org/onosproject/ui/impl/topo/model/UiSharedTopologyModel.java
index 14d29ac..d70ecf6 100644
--- a/web/gui/src/main/java/org/onosproject/ui/impl/topo/model/UiSharedTopologyModel.java
+++ b/web/gui/src/main/java/org/onosproject/ui/impl/topo/model/UiSharedTopologyModel.java
@@ -16,12 +16,6 @@
 
 package org.onosproject.ui.impl.topo.model;
 
-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.ClusterEvent;
 import org.onosproject.cluster.ClusterEventListener;
 import org.onosproject.cluster.ClusterService;
@@ -71,6 +65,11 @@
 import org.onosproject.ui.model.topo.UiModelEvent;
 import org.onosproject.ui.model.topo.UiRegion;
 import org.onosproject.ui.model.topo.UiSynthLink;
+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;
 
@@ -85,41 +84,40 @@
 /**
  * Service that creates and maintains the UI-model of the network topology.
  */
-@Component(immediate = true, enabled = true)
-@Service(value = UiSharedTopologyModel.class)
+@Component(immediate = true, service = UiSharedTopologyModel.class)
 public final class UiSharedTopologyModel
         extends AbstractListenerManager<UiModelEvent, UiModelListener> {
 
     private static final Logger log =
             LoggerFactory.getLogger(UiSharedTopologyModel.class);
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     private UiTopoLayoutService layoutService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     private ClusterService clusterService;
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     private MastershipService mastershipService;
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     private RegionService regionService;
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     private DeviceService deviceService;
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     private LinkService linkService;
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     private HostService hostService;
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     private IntentService intentService;
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     private FlowRuleService flowService;
 
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     private StatisticService flowStatsService;
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     private PortStatisticsService portStatsService;
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     private TopologyService topologyService;
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
     private TunnelService tunnelService;
 
     private final ClusterEventListener clusterListener =
diff --git a/web/gui/src/main/resources/OSGI-INF/blueprint/shell-config.xml b/web/gui/src/main/resources/OSGI-INF/blueprint/shell-config.xml
deleted file mode 100644
index 19abddd..0000000
--- a/web/gui/src/main/resources/OSGI-INF/blueprint/shell-config.xml
+++ /dev/null
@@ -1,53 +0,0 @@
-<!--
-  ~ Copyright 2016-present Open Networking Foundation
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~     http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License.
-  -->
-
-<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0">
-
-    <command-bundle xmlns="http://karaf.apache.org/xmlns/shell/v1.1.0">
-        <command>
-            <action class="org.onosproject.ui.impl.cli.UiViewListCommand"/>
-        </command>
-
-        <command>
-            <action class="org.onosproject.ui.impl.cli.UiPreferencesListCommand"/>
-        </command>
-
-        <command>
-            <action class="org.onosproject.ui.impl.topo.cli.UiCacheMembersCommand"/>
-        </command>
-        <command>
-            <action class="org.onosproject.ui.impl.topo.cli.UiCacheRegionsCommand"/>
-        </command>
-        <command>
-            <action class="org.onosproject.ui.impl.topo.cli.UiCacheDevicesCommand"/>
-        </command>
-        <command>
-            <action class="org.onosproject.ui.impl.topo.cli.UiCacheHostsCommand"/>
-        </command>
-        <command>
-            <action class="org.onosproject.ui.impl.topo.cli.UiCacheLinksCommand"/>
-        </command>
-        <command>
-            <action class="org.onosproject.ui.impl.topo.cli.UiGeoMapListCommand"/>
-        </command>
-        <command>
-            <action class="org.onosproject.ui.impl.topo.cli.UiClearMetaCommand"/>
-        </command>
-    </command-bundle>
-
-    <!--<bean id="macIDCompleter" class="org.onosproject.dhcp.cli.MacIdCompleter"/>-->
-
-</blueprint>
\ No newline at end of file
diff --git a/web/gui/src/main/webapp/WEB-INF/web.xml b/web/gui/src/main/webapp/WEB-INF/web.xml
index 6b65ba4..bb7d7fb 100644
--- a/web/gui/src/main/webapp/WEB-INF/web.xml
+++ b/web/gui/src/main/webapp/WEB-INF/web.xml
@@ -22,7 +22,7 @@
     <display-name>ONOS GUI</display-name>
 
     <welcome-file-list>
-        <welcome-file>index.html</welcome-file>
+        <welcome-file>/index.html</welcome-file>
     </welcome-file-list>
 
     <!--