diff --git a/graveyard/README.md b/graveyard/README.md
deleted file mode 100644
index 599b340..0000000
--- a/graveyard/README.md
+++ /dev/null
@@ -1,4 +0,0 @@
-# Old Incubator Graveyard
-
-This area contains defunct code. All other code has been moved out from the incubator to the core or to the apps area as separate extensions.
-This area will be entirely removed in a not-so-distant future.
diff --git a/graveyard/api/src/main/java/org/onosproject/incubator/rpc/RemoteServiceContext.java b/graveyard/api/src/main/java/org/onosproject/incubator/rpc/RemoteServiceContext.java
deleted file mode 100644
index ede8c8a..0000000
--- a/graveyard/api/src/main/java/org/onosproject/incubator/rpc/RemoteServiceContext.java
+++ /dev/null
@@ -1,40 +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.
- */
-
-package org.onosproject.incubator.rpc;
-
-import com.google.common.annotations.Beta;
-
-// Implementation is expected to be a handler for RPC channel
-// and shim-layer to convert Java Service interface calls to/from RPC call
-/**
- * Context for Remote service.
- */
-@Beta
-public interface RemoteServiceContext {
-
-    // we may need a method to check connection state?
-
-    /**
-     * Returns implementation of the specified service class.
-     *
-     * @param serviceClass service class
-     * @param <T>          type of service
-     * @return implementation class
-     * @throws UnsupportedOperationException if this context does not support it.
-     */
-    <T> T get(Class<T> serviceClass);
-}
diff --git a/graveyard/api/src/main/java/org/onosproject/incubator/rpc/RemoteServiceContextProvider.java b/graveyard/api/src/main/java/org/onosproject/incubator/rpc/RemoteServiceContextProvider.java
deleted file mode 100644
index 294ae9c..0000000
--- a/graveyard/api/src/main/java/org/onosproject/incubator/rpc/RemoteServiceContextProvider.java
+++ /dev/null
@@ -1,38 +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.
- */
-package org.onosproject.incubator.rpc;
-
-import java.net.URI;
-
-import org.onosproject.net.provider.Provider;
-
-import com.google.common.annotations.Beta;
-
-//Factory to create RemoteServiceContext
-/**
- * Abstraction of a remote service implementation provider.
- */
-@Beta
-public interface RemoteServiceContextProvider extends Provider {
-
-    /**
-     * Returns {@link RemoteServiceContext} for given URI.
-     *
-     * @param uri  URI for remote end point.
-     * @return {@link RemoteServiceContext}
-     */
-    RemoteServiceContext get(URI uri);
-}
diff --git a/graveyard/api/src/main/java/org/onosproject/incubator/rpc/RemoteServiceContextProviderService.java b/graveyard/api/src/main/java/org/onosproject/incubator/rpc/RemoteServiceContextProviderService.java
deleted file mode 100644
index 05d9795..0000000
--- a/graveyard/api/src/main/java/org/onosproject/incubator/rpc/RemoteServiceContextProviderService.java
+++ /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.
- */
-package org.onosproject.incubator.rpc;
-
-import org.onosproject.net.provider.ProviderService;
-
-import com.google.common.annotations.Beta;
-
-// Not completely sure if we will make use of this at the moment
-// added to follow existing  {@link ProviderRegistry} pattern
-@Beta
-public interface RemoteServiceContextProviderService
-        extends ProviderService<RemoteServiceContextProvider> {
-
-}
diff --git a/graveyard/api/src/main/java/org/onosproject/incubator/rpc/RemoteServiceDirectory.java b/graveyard/api/src/main/java/org/onosproject/incubator/rpc/RemoteServiceDirectory.java
deleted file mode 100644
index a40a837..0000000
--- a/graveyard/api/src/main/java/org/onosproject/incubator/rpc/RemoteServiceDirectory.java
+++ /dev/null
@@ -1,40 +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.
- */
-package org.onosproject.incubator.rpc;
-
-import java.net.URI;
-
-import com.google.common.annotations.Beta;
-
-// This is actually the RPC Service, where consumers get
-// RemoteSericeContext (~= RPC Session) for given URI
-// expected to be implemented by some Manager class on Lower-side ONOS
-/**
- * Service for retrieving RPC session handler ({@link RemoteServiceContext}).
- */
-@Beta
-public interface RemoteServiceDirectory {
-
-    /**
-     * Returns remote service context.
-     *
-     * @param uri URI representing remote end point. e.g., (grpc://hostname:port)
-     * @return remote service context
-     * @throws UnsupportedOperationException if URI scheme was not supported.
-     */
-    RemoteServiceContext get(URI uri);
-
-}
diff --git a/graveyard/api/src/main/java/org/onosproject/incubator/rpc/RemoteServiceProviderRegistry.java b/graveyard/api/src/main/java/org/onosproject/incubator/rpc/RemoteServiceProviderRegistry.java
deleted file mode 100644
index f7e3df0..0000000
--- a/graveyard/api/src/main/java/org/onosproject/incubator/rpc/RemoteServiceProviderRegistry.java
+++ /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.
- */
-package org.onosproject.incubator.rpc;
-
-import org.onosproject.net.provider.ProviderRegistry;
-
-import com.google.common.annotations.Beta;
-
-/**
- * Abstraction of a remote service provider registry.
- */
-@Beta
-public interface RemoteServiceProviderRegistry
-    extends ProviderRegistry<RemoteServiceContextProvider,
-                             RemoteServiceContextProviderService> {
-
-}
diff --git a/graveyard/api/src/main/java/org/onosproject/incubator/rpc/package-info.java b/graveyard/api/src/main/java/org/onosproject/incubator/rpc/package-info.java
deleted file mode 100644
index 1ce7de4..0000000
--- a/graveyard/api/src/main/java/org/onosproject/incubator/rpc/package-info.java
+++ /dev/null
@@ -1,20 +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.
- */
-
-/**
- * Incubating inter-cluster RPC APIs.
- */
-package org.onosproject.incubator.rpc;
diff --git a/graveyard/protobuf-dead/api/src/main/java/org/onosproject/protobuf/api/GrpcServiceRegistry.java b/graveyard/protobuf-dead/api/src/main/java/org/onosproject/protobuf/api/GrpcServiceRegistry.java
deleted file mode 100644
index 5e7e4bc..0000000
--- a/graveyard/protobuf-dead/api/src/main/java/org/onosproject/protobuf/api/GrpcServiceRegistry.java
+++ /dev/null
@@ -1,52 +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.
- */
-
-package org.onosproject.protobuf.api;
-
-import com.google.common.annotations.Beta;
-import io.grpc.BindableService;
-
-/**
- * A service that allows for de/registration of gRPC services, and determining
- * whether a service is present.
- */
-@Beta
-public interface GrpcServiceRegistry {
-    /**
-     * Register a gRPC service with this registry.
-     * @param service the service to be registered
-     * @return true if the service was added and server successfully started,
-     * false otherwise
-     */
-    boolean register(BindableService service);
-
-    /**
-     * Unregister a gRPC service with this registry.
-     * @param service the service to be unregistered
-     * @return true if the service was removed and the server successfully
-     * started, false otherwise
-     */
-    boolean unregister(BindableService service);
-
-    /**
-     * Checks if an instance of the  provided serviceClass is currently
-     * registered with this registry.
-     * @param serviceClass the class being queries
-     * @return true if an instance of this specified class has been registered,
-     * false otherwise
-     */
-    boolean containsService(Class<BindableService> serviceClass);
-}
diff --git a/graveyard/protobuf-dead/api/src/main/java/org/onosproject/protobuf/api/package-info.java b/graveyard/protobuf-dead/api/src/main/java/org/onosproject/protobuf/api/package-info.java
deleted file mode 100644
index 0541b49..0000000
--- a/graveyard/protobuf-dead/api/src/main/java/org/onosproject/protobuf/api/package-info.java
+++ /dev/null
@@ -1,20 +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.
- */
-
-/**
- * Abstractions for interacting with the gRPC subsystem.
- */
-package org.onosproject.protobuf.api;
diff --git a/graveyard/protobuf-dead/registry/src/main/java/org/onosproject/protobuf/registry/GrpcServiceRegistryImpl.java b/graveyard/protobuf-dead/registry/src/main/java/org/onosproject/protobuf/registry/GrpcServiceRegistryImpl.java
deleted file mode 100644
index 9935cdb..0000000
--- a/graveyard/protobuf-dead/registry/src/main/java/org/onosproject/protobuf/registry/GrpcServiceRegistryImpl.java
+++ /dev/null
@@ -1,203 +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.
- */
-
-package org.onosproject.protobuf.registry;
-
-import com.google.common.collect.Maps;
-import io.grpc.BindableService;
-import io.grpc.Server;
-import io.grpc.ServerBuilder;
-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;
-
-import java.io.IOException;
-import java.util.Dictionary;
-import java.util.Map;
-import java.util.concurrent.TimeUnit;
-import java.util.concurrent.atomic.AtomicBoolean;
-
-import static org.onlab.util.Tools.get;
-
-/**
- * A basic implementation of {@link GrpcServiceRegistry} designed for use with
- * built in gRPC services.
- *
- * NOTE: this is an early implementation in which the addition of any new
- * service forces a restart of the server, this is sufficient for testing but
- * inappropriate for deployment.
- */
-@Component(service = GrpcServiceRegistry.class)
-public class GrpcServiceRegistryImpl implements GrpcServiceRegistry {
-
-    private static final int DEFAULT_SERVER_PORT = 64000;
-    private static final int DEFAULT_SHUTDOWN_TIME = 1;
-    private static final AtomicBoolean SERVICES_MODIFIED_SINCE_START = new AtomicBoolean(false);
-
-    private static final String PORT_PROPERTY_NAME = "listeningPort";
-
-    private final Map<Class<? extends BindableService>, BindableService> registeredServices =
-            Maps.newHashMap();
-    private final Logger log = LoggerFactory.getLogger(getClass());
-
-    private Server server;
-
-    /* It is currently the responsibility of the administrator to notify
-    clients of nonstandard port usage as there is no mechanism available to
-    discover the port hosting gRPC services.
-     */
-    /** The port number which ONOS will use to host gRPC services. */
-    private int listeningPort = DEFAULT_SERVER_PORT;
-
-    @Activate
-    public void activate() {
-        log.info("Started");
-    }
-
-    @Deactivate
-    public void deactivate() {
-        attemptGracefulShutdownThenForce(DEFAULT_SHUTDOWN_TIME);
-        log.info("Stopped");
-    }
-
-    @Modified
-    public void modified(ComponentContext context) {
-        if (context != null) {
-            setProperties(context);
-        }
-        log.info("Connection was restarted to allow service to be added, " +
-                         "this is a temporary workaround");
-        restartServer(listeningPort);
-    }
-
-    @Override
-    public boolean register(BindableService service) {
-        synchronized (registeredServices) {
-            if (!registeredServices.containsKey(service.getClass())) {
-                registeredServices.put(service.getClass(), service);
-            } else {
-                log.warn("The specified class \"{}\" was not added becuase an " +
-                                 "instance of the class is already registered.",
-                         service.getClass().toString());
-                return false;
-            }
-        }
-        return restartServer(listeningPort);
-    }
-
-    @Override
-    public boolean unregister(BindableService service) {
-        synchronized (registeredServices) {
-            if (registeredServices.containsKey(service.getClass())) {
-                registeredServices.remove(service.getClass());
-            } else {
-                log.warn("The specified class \"{}\" was not removed because it " +
-                                 "was not present.", service.getClass().toString());
-                return false;
-            }
-        }
-        return restartServer(listeningPort);
-    }
-
-    @Override
-    public boolean containsService(Class<BindableService> serviceClass) {
-        return registeredServices.containsKey(serviceClass);
-    }
-
-    private void setProperties(ComponentContext context) {
-        Dictionary<String, Object> properties = context.getProperties();
-        String listeningPort = get(properties, PORT_PROPERTY_NAME);
-        this.listeningPort = listeningPort == null ? DEFAULT_SERVER_PORT :
-                Integer.parseInt(listeningPort.trim());
-    }
-
-    /**
-     * Attempts a graceful shutdown allowing {@code timeLimitSeconds} to elapse
-     * before forcing a shutdown.
-     *
-     * @param timeLimitSeconds time before a shutdown is forced in seconds
-     * @return true if the server is terminated, false otherwise
-     */
-    private boolean attemptGracefulShutdownThenForce(int timeLimitSeconds) {
-        if (!server.isShutdown()) {
-            server.shutdown();
-        }
-        try {
-            /*This is not conditional in case the server is shutdown but
-            handling requests submitted before shutdown was called.*/
-            server.awaitTermination(timeLimitSeconds, TimeUnit.SECONDS);
-        } catch (InterruptedException e) {
-            log.error("Awaiting server termination failed with error {}",
-                      e.getMessage());
-            Thread.currentThread().interrupt();
-        }
-        if (!server.isTerminated()) {
-            server.shutdownNow();
-            try {
-                server.awaitTermination(10, TimeUnit.MILLISECONDS);
-            } catch (InterruptedException e) {
-                log.error("Server failed to terminate as expected with error" +
-                                  " {}", e.getMessage());
-                Thread.currentThread().interrupt();
-            }
-        }
-        return server.isTerminated();
-    }
-
-    private boolean restartServer(int port) {
-        if (!attemptGracefulShutdownThenForce(DEFAULT_SHUTDOWN_TIME)) {
-            log.error("Shutdown failed, the previous server may still be" +
-                              " active.");
-        }
-        return createServerAndStart(port);
-    }
-
-    /**
-     * Creates a server with the set of registered services on the specified
-     * port.
-     *
-     * @param port the port on which this server will listen
-     * @return true if the server was started successfully, false otherwise
-     */
-    private boolean createServerAndStart(int port) {
-
-        ServerBuilder serverBuilder =
-                ServerBuilder.forPort(port);
-        synchronized (registeredServices) {
-            registeredServices.values().forEach(
-                    service -> serverBuilder.addService(service));
-        }
-        server = serverBuilder.build();
-        try {
-            server.start();
-        } catch (IllegalStateException e) {
-            log.error("The server could not be started because an existing " +
-                              "server is already running: {}", e.getMessage());
-            return false;
-        } catch (IOException e) {
-            log.error("The server could not be started due to a failure to " +
-                              "bind: {} ", e.getMessage());
-            return false;
-        }
-        return true;
-    }
-}
diff --git a/graveyard/protobuf-dead/registry/src/main/java/org/onosproject/protobuf/registry/package-info.java b/graveyard/protobuf-dead/registry/src/main/java/org/onosproject/protobuf/registry/package-info.java
deleted file mode 100644
index 818c4e8..0000000
--- a/graveyard/protobuf-dead/registry/src/main/java/org/onosproject/protobuf/registry/package-info.java
+++ /dev/null
@@ -1,20 +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.
- */
-
-/**
- * Services for interacting remotely with the gRPC subsystem.
- */
-package org.onosproject.protobuf.registry;
diff --git a/graveyard/protobuf-dead/services/nb/src/main/java/org/onosproject/incubator/protobuf/services/nb/GrpcNbApplicationService.java b/graveyard/protobuf-dead/services/nb/src/main/java/org/onosproject/incubator/protobuf/services/nb/GrpcNbApplicationService.java
deleted file mode 100644
index f60a36e..0000000
--- a/graveyard/protobuf-dead/services/nb/src/main/java/org/onosproject/incubator/protobuf/services/nb/GrpcNbApplicationService.java
+++ /dev/null
@@ -1,162 +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.
- */
-package org.onosproject.incubator.protobuf.services.nb;
-
-import com.google.common.annotations.Beta;
-import io.grpc.BindableService;
-import io.grpc.stub.StreamObserver;
-import org.osgi.service.component.annotations.Activate;
-import org.osgi.service.component.annotations.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;
-import org.onosproject.core.ApplicationId;
-import org.onosproject.grpc.nb.app.ApplicationServiceGrpc.ApplicationServiceImplBase;
-import org.onosproject.grpc.nb.app.ApplicationServiceNb;
-import org.onosproject.grpc.nb.app.ApplicationServiceNb.getApplicationReply;
-import org.onosproject.grpc.nb.app.ApplicationServiceNb.getApplicationsReply;
-import org.onosproject.grpc.nb.app.ApplicationServiceNb.getIdReply;
-import org.onosproject.grpc.nb.app.ApplicationServiceNb.getPermissionsReply;
-import org.onosproject.grpc.nb.app.ApplicationServiceNb.getStateReply;
-import org.onosproject.incubator.protobuf.models.core.ApplicationEnumsProtoTranslator;
-import org.onosproject.incubator.protobuf.models.core.ApplicationIdProtoTranslator;
-import org.onosproject.incubator.protobuf.models.core.ApplicationProtoTranslator;
-import org.onosproject.incubator.protobuf.models.security.PermissionProtoTranslator;
-import org.onosproject.protobuf.api.GrpcServiceRegistry;
-import org.slf4j.Logger;
-
-import static org.slf4j.LoggerFactory.getLogger;
-
-/**
- * A server that provides access to the methods exposed by {@link ApplicationService}.
- */
-
-@Beta
-@Component(immediate = true)
-public class GrpcNbApplicationService {
-
-    private final Logger log = getLogger(getClass());
-
-    @Reference(cardinality = ReferenceCardinality.MANDATORY)
-    protected GrpcServiceRegistry registry;
-
-    @Reference(cardinality = ReferenceCardinality.MANDATORY)
-    protected ApplicationService applicationService;
-
-    private ApplicationServiceNbServerInternal instance = null;
-
-
-    @Activate
-    public void activate() {
-        registry.register(getInnerInstance());
-        log.info("Started.");
-    }
-
-    @Deactivate
-    public void deactivate() {
-        registry.unregister(getInnerInstance());
-        log.info("Stopped");
-    }
-
-    /**
-     * Register Application Service, Used for unit testing purposes.
-     *
-     * @return An instance of binding Application service
-     */
-    public InProcessServer<BindableService> registerInProcessServer() {
-        InProcessServer<BindableService> inprocessServer =
-                new InProcessServer(GrpcNbApplicationService.ApplicationServiceNbServerInternal.class);
-        inprocessServer.addServiceToBind(getInnerInstance());
-
-        return inprocessServer;
-    }
-
-    private class ApplicationServiceNbServerInternal extends ApplicationServiceImplBase {
-
-        public ApplicationServiceNbServerInternal() {
-            super();
-        }
-
-        @Override
-        public void getApplications(ApplicationServiceNb.getApplicationsRequest request,
-                                    StreamObserver<getApplicationsReply> responseObserver) {
-            getApplicationsReply.Builder replyBuilder = getApplicationsReply.newBuilder();
-
-            applicationService.getApplications().forEach(a ->
-                    replyBuilder.addApplication(ApplicationProtoTranslator.translate(a)));
-            responseObserver.onNext(replyBuilder.build());
-            responseObserver.onCompleted();
-        }
-
-        @Override
-        public void getId(ApplicationServiceNb.getIdRequest request,
-                          StreamObserver<getIdReply> responseObserver) {
-            ApplicationId appId = applicationService.getId(request.getName());
-
-            responseObserver.onNext(getIdReply.newBuilder()
-                    .setApplicationId(ApplicationIdProtoTranslator.translate(appId)).build());
-            responseObserver.onCompleted();
-        }
-
-        @Override
-        public void getApplication(ApplicationServiceNb.getApplicationRequest request,
-                                   StreamObserver<getApplicationReply> responseObserver) {
-
-            Application application = applicationService.getApplication(
-                    ApplicationIdProtoTranslator.translate(request.getApplicationId()));
-
-            responseObserver.onNext(getApplicationReply.newBuilder()
-                    .setApplication(ApplicationProtoTranslator
-                            .translate(application)).build());
-            responseObserver.onCompleted();
-        }
-
-        @Override
-        public void getState(ApplicationServiceNb.getStateRequest request,
-                             StreamObserver<getStateReply> responseObserver) {
-            ApplicationState state = applicationService.getState(
-                    ApplicationIdProtoTranslator.translate(request.getApplicationId()));
-
-            responseObserver.onNext(getStateReply
-                    .newBuilder().setState(ApplicationEnumsProtoTranslator
-                            .translate(state)).build());
-            responseObserver.onCompleted();
-        }
-
-        @Override
-        public void getPermissions(ApplicationServiceNb.getPermissionsRequest request,
-                                   StreamObserver<getPermissionsReply> responseObserver) {
-            getPermissionsReply.Builder replyBuilder = getPermissionsReply.newBuilder();
-
-            applicationService.getPermissions(ApplicationIdProtoTranslator
-                    .translate(request.getApplicationId()))
-                    .forEach(p -> replyBuilder.addPermission(
-                            PermissionProtoTranslator.translate(p)));
-            responseObserver.onNext(replyBuilder.build());
-            responseObserver.onCompleted();
-        }
-    }
-
-    private ApplicationServiceNbServerInternal getInnerInstance() {
-        if (instance == null) {
-            instance = new ApplicationServiceNbServerInternal();
-        }
-        return instance;
-    }
-}
diff --git a/graveyard/protobuf-dead/services/nb/src/main/java/org/onosproject/incubator/protobuf/services/nb/GrpcNbComponentConfigService.java b/graveyard/protobuf-dead/services/nb/src/main/java/org/onosproject/incubator/protobuf/services/nb/GrpcNbComponentConfigService.java
deleted file mode 100644
index d9cad10..0000000
--- a/graveyard/protobuf-dead/services/nb/src/main/java/org/onosproject/incubator/protobuf/services/nb/GrpcNbComponentConfigService.java
+++ /dev/null
@@ -1,181 +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.
- */
-
-package org.onosproject.incubator.protobuf.services.nb;
-
-import com.google.common.annotations.Beta;
-import io.grpc.BindableService;
-import io.grpc.stub.StreamObserver;
-import org.osgi.service.component.annotations.Activate;
-import org.osgi.service.component.annotations.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;
-import org.slf4j.Logger;
-
-import static org.onosproject.grpc.nb.cfg.ComponentConfigServiceGrpc.ComponentConfigServiceImplBase;
-import static org.onosproject.grpc.nb.cfg.ComponentConfigServiceNb.getComponentNamesRequest;
-import static org.onosproject.grpc.nb.cfg.ComponentConfigServiceNb.getComponentNamesReply;
-import static org.onosproject.grpc.nb.cfg.ComponentConfigServiceNb.registerPropertiesRequest;
-import static org.onosproject.grpc.nb.cfg.ComponentConfigServiceNb.registerPropertiesReply;
-import static org.onosproject.grpc.nb.cfg.ComponentConfigServiceNb.unregisterPropertiesRequest;
-import static org.onosproject.grpc.nb.cfg.ComponentConfigServiceNb.unregisterPropertiesReply;
-import static org.onosproject.grpc.nb.cfg.ComponentConfigServiceNb.getPropertiesRequest;
-import static org.onosproject.grpc.nb.cfg.ComponentConfigServiceNb.getPropertiesReply;
-import static org.onosproject.grpc.nb.cfg.ComponentConfigServiceNb.setPropertyRequest;
-import static org.onosproject.grpc.nb.cfg.ComponentConfigServiceNb.setPropertyReply;
-import static org.onosproject.grpc.nb.cfg.ComponentConfigServiceNb.preSetPropertyRequest;
-import static org.onosproject.grpc.nb.cfg.ComponentConfigServiceNb.preSetPropertyReply;
-import static org.onosproject.grpc.nb.cfg.ComponentConfigServiceNb.unsetPropertyRequest;
-import static org.onosproject.grpc.nb.cfg.ComponentConfigServiceNb.unsetPropertyReply;
-import static org.slf4j.LoggerFactory.getLogger;
-
-
-/**
- * A server that provides access to the methods exposed by {@link ComponentConfigService}.
- */
-@Beta
-@Component(immediate = true)
-public class GrpcNbComponentConfigService {
-
-    private final Logger log = getLogger(getClass());
-
-    @Reference(cardinality = ReferenceCardinality.MANDATORY)
-    protected GrpcServiceRegistry registry;
-
-    @Reference(cardinality = ReferenceCardinality.MANDATORY)
-    protected ComponentConfigService componentConfigService;
-
-    private ComponentConfigServiceNbServerInternal instance = null;
-
-    @Activate
-    public void activate() {
-
-        registry.register(getInnerInstance());
-        log.info("Started.");
-    }
-
-    @Deactivate
-    public void deactivate() {
-
-        registry.unregister(getInnerInstance());
-        log.info("Stopped");
-    }
-
-    /**
-     * Register ComponentConfig Service, Used for unit testing purposes.
-     *
-     * @return An instance of binding ComponentConfig service
-     */
-    public InProcessServer<BindableService> registerInProcessServer() {
-        InProcessServer<BindableService> inprocessServer =
-                new InProcessServer(ComponentConfigServiceNbServerInternal.class);
-        inprocessServer.addServiceToBind(getInnerInstance());
-
-        return inprocessServer;
-    }
-
-    private final class ComponentConfigServiceNbServerInternal extends ComponentConfigServiceImplBase {
-
-        private ComponentConfigServiceNbServerInternal() {
-            super();
-        }
-
-        @Override
-        public void getComponentNames(getComponentNamesRequest request,
-                                      StreamObserver<getComponentNamesReply> responseObserver) {
-
-            getComponentNamesReply.Builder replyBuilder = getComponentNamesReply.newBuilder();
-
-            componentConfigService.getComponentNames().forEach(n -> replyBuilder.addNames(n));
-            responseObserver.onNext(replyBuilder.build());
-            responseObserver.onCompleted();
-        }
-
-        @Override
-        public void registerProperties(registerPropertiesRequest request,
-                                       StreamObserver<registerPropertiesReply> responseObserver) {
-
-            try {
-                componentConfigService.registerProperties(Class.forName(request.getComponentClass()));
-                responseObserver.onNext(registerPropertiesReply.getDefaultInstance());
-                responseObserver.onCompleted();
-            } catch (ClassNotFoundException e) {
-                responseObserver.onError(e);
-            }
-        }
-
-        @Override
-        public void unregisterProperties(unregisterPropertiesRequest request,
-                                         StreamObserver<unregisterPropertiesReply> responseObserver) {
-
-            try {
-                componentConfigService.unregisterProperties(Class.forName(request.getComponentClass()),
-                                                            request.getClear());
-                responseObserver.onNext(unregisterPropertiesReply.getDefaultInstance());
-                responseObserver.onCompleted();
-            } catch (ClassNotFoundException e) {
-                responseObserver.onError(e);
-            }
-        }
-
-        @Override
-        public void getProperties(getPropertiesRequest request, StreamObserver<getPropertiesReply> responseObserver) {
-
-            getPropertiesReply.Builder replyBuilder = getPropertiesReply.newBuilder();
-
-            componentConfigService.getProperties(request.getComponentName())
-                    .forEach(n -> replyBuilder.addConfigProperties(ConfigPropertyProtoTranslator.translate(n)));
-            responseObserver.onNext(replyBuilder.build());
-            responseObserver.onCompleted();
-        }
-
-        @Override
-        public void setProperty(setPropertyRequest request, StreamObserver<setPropertyReply> responseObserver) {
-
-            componentConfigService.setProperty(request.getComponentName(), request.getName(), request.getValue());
-            responseObserver.onNext(setPropertyReply.getDefaultInstance());
-            responseObserver.onCompleted();
-        }
-
-        @Override
-        public void preSetProperty(preSetPropertyRequest request,
-                                   StreamObserver<preSetPropertyReply> responseObserver) {
-
-            componentConfigService.preSetProperty(request.getComponentName(), request.getName(), request.getValue());
-            responseObserver.onNext(preSetPropertyReply.getDefaultInstance());
-            responseObserver.onCompleted();
-        }
-
-        @Override
-        public void unsetProperty(unsetPropertyRequest request, StreamObserver<unsetPropertyReply> responseObserver) {
-
-            componentConfigService.unsetProperty(request.getComponentName(), request.getName());
-            responseObserver.onNext(unsetPropertyReply.getDefaultInstance());
-            responseObserver.onCompleted();
-        }
-    }
-
-    private ComponentConfigServiceNbServerInternal getInnerInstance() {
-        if (instance == null) {
-            instance = new ComponentConfigServiceNbServerInternal();
-        }
-        return instance;
-    }
-}
diff --git a/graveyard/protobuf-dead/services/nb/src/main/java/org/onosproject/incubator/protobuf/services/nb/GrpcNbDeviceService.java b/graveyard/protobuf-dead/services/nb/src/main/java/org/onosproject/incubator/protobuf/services/nb/GrpcNbDeviceService.java
deleted file mode 100644
index 5d6ea4c..0000000
--- a/graveyard/protobuf-dead/services/nb/src/main/java/org/onosproject/incubator/protobuf/services/nb/GrpcNbDeviceService.java
+++ /dev/null
@@ -1,387 +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.
- */
-package org.onosproject.incubator.protobuf.services.nb;
-
-import com.google.common.annotations.Beta;
-import io.grpc.BindableService;
-import io.grpc.stub.StreamObserver;
-import org.osgi.service.component.annotations.Activate;
-import org.osgi.service.component.annotations.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;
-import org.onosproject.grpc.net.models.MastershipRoleProtoOuterClass;
-import org.onosproject.grpc.net.models.PortProtoOuterClass.PortProto;
-import org.onosproject.grpc.net.device.models.DeviceEnumsProto;
-import org.onosproject.protobuf.api.GrpcServiceRegistry;
-import org.onosproject.net.ConnectPoint;
-import org.onosproject.net.DeviceId;
-import org.onosproject.net.MastershipRole;
-import org.onosproject.net.PortNumber;
-import org.onosproject.net.device.DeviceService;
-import org.onosproject.incubator.protobuf.models.net.device.DeviceProtoTranslator;
-import org.slf4j.Logger;
-
-import static org.onosproject.grpc.nb.net.device.DeviceServiceNb.*;
-import static org.slf4j.LoggerFactory.getLogger;
-
-/**
- * A server that provides access to the methods exposed by {@link DeviceService}.
- * TODO this requires major refactoring, translation should be delegated to calls to
- * TODO{@link DeviceProtoTranslator}.
- */
-@Beta
-@Component(immediate = true)
-public class GrpcNbDeviceService {
-
-    private final Logger log = getLogger(getClass());
-
-    private DeviceServiceNbServerInternal instance = null;
-
-    @Reference(cardinality = ReferenceCardinality.MANDATORY)
-    protected GrpcServiceRegistry registry;
-
-    @Reference(cardinality = ReferenceCardinality.MANDATORY)
-    protected DeviceService deviceService;
-
-    @Activate
-    public void activate() {
-        registry.register(getInnerInstance());
-        log.info("Started.");
-    }
-
-    @Deactivate
-    public void deactivate() {
-        registry.unregister(getInnerInstance());
-        log.info("Stopped");
-    }
-
-    /**
-     * Register Device Service, Used for unit testing purposes.
-     *
-     * @return An instance of binding Device service
-     */
-    public InProcessServer<BindableService> registerInProcessServer() {
-        InProcessServer<BindableService> inprocessServer =
-                new InProcessServer(GrpcNbDeviceService.DeviceServiceNbServerInternal.class);
-        inprocessServer.addServiceToBind(getInnerInstance());
-
-        return inprocessServer;
-    }
-
-    private final class DeviceServiceNbServerInternal extends DeviceServiceImplBase {
-
-        private DeviceServiceNbServerInternal() {
-            super();
-        }
-
-        @Override
-        public void getDeviceCount(
-                getDeviceCountRequest request,
-                StreamObserver<getDeviceCountReply> responseObserver) {
-            responseObserver
-                    .onNext(getDeviceCountReply
-                            .newBuilder()
-                            .setDeviceCount(
-                                    deviceService.getDeviceCount())
-                            .build());
-            responseObserver.onCompleted();
-        }
-
-        //FIXME NOTE: this will be switched to a streaming version.
-        @Override
-        public void getDevices(getDevicesRequest request,
-                               StreamObserver<getDevicesReply> responseObserver) {
-            getDevicesReply.Builder replyBuilder = getDevicesReply.newBuilder();
-            deviceService.getDevices().forEach(d -> {
-                replyBuilder.addDevice(
-                        org.onosproject.grpc.net.models.DeviceProtoOuterClass.DeviceProto
-                                .newBuilder()
-                                .setDeviceId(d.id().toString())
-                                .setType(
-                                        DeviceEnumsProto.DeviceTypeProto
-                                                .valueOf(d.type().toString()))
-                                .setManufacturer(d.manufacturer())
-                                .setHwVersion(d.hwVersion())
-                                .setSwVersion(d.swVersion())
-                                .setSerialNumber(d.serialNumber())
-                                .setChassisId(d.chassisId().toString())
-                                .build());
-            });
-            responseObserver.onNext(replyBuilder.build());
-            responseObserver.onCompleted();
-        }
-
-        //FIXME NOTE: this will be switched to a streaming version.
-        @Override
-        public void getAvailableDevices(getAvailableDevicesRequest request,
-                                        StreamObserver
-                                                <getAvailableDevicesReply> responseObserver) {
-            getAvailableDevicesReply.Builder replyBuilder = getAvailableDevicesReply.newBuilder();
-            deviceService.getAvailableDevices().forEach(d -> {
-                replyBuilder.addDevice(
-                        org.onosproject.grpc.net.models.DeviceProtoOuterClass.DeviceProto
-                                .newBuilder()
-                                .setDeviceId(d.id().toString())
-                                .setType(DeviceEnumsProto.DeviceTypeProto.valueOf(
-                                        d.type().toString()))
-                                .setManufacturer(d.manufacturer())
-                                .setHwVersion(d.hwVersion())
-                                .setSwVersion(d.swVersion())
-                                .setSerialNumber(d.serialNumber())
-                                .setChassisId(d.chassisId().toString())
-                                .build());
-            });
-            responseObserver.onNext(replyBuilder.build());
-            responseObserver.onCompleted();
-        }
-
-        @Override
-        public void getDevice(getDeviceRequest request,
-                              io.grpc.stub.StreamObserver<getDeviceReply> responseObserver) {
-            org.onosproject.net.Device device = deviceService.getDevice(
-                    DeviceId.deviceId(request.getDeviceId()));
-            responseObserver.onNext(
-                    getDeviceReply.newBuilder().setDevice(
-                            org.onosproject.grpc.net.models.DeviceProtoOuterClass.DeviceProto
-                                    .newBuilder()
-                                    .setDeviceId(device.id().toString())
-                                    .setType(
-                                            //TODO check for better approach to mapping between enum varieties
-                                            DeviceEnumsProto.DeviceTypeProto.valueOf(device.type().toString()))
-                                    .setManufacturer(device.manufacturer())
-                                    .setHwVersion(device.hwVersion())
-                                    .setSwVersion(device.swVersion())
-                                    .setSerialNumber(device.serialNumber())
-                                    .setChassisId(device.chassisId().toString())
-                                    .build()).build());
-            responseObserver.onCompleted();
-        }
-
-        @Override
-        public void getRole(getRoleRequest request,
-                            StreamObserver<getRoleReply> responseObserver) {
-            DeviceId deviceId = DeviceId.deviceId(request.getDeviceId());
-            MastershipRole role = deviceService.getRole(deviceId);
-            MastershipRoleProtoOuterClass.MastershipRoleProto mastershipRole =
-                    MastershipRoleProtoOuterClass.MastershipRoleProto.valueOf(role.toString());
-            responseObserver.onNext(getRoleReply.newBuilder()
-                    .setRole(mastershipRole).build());
-            responseObserver.onCompleted();
-        }
-
-        //FIXME NOTE: this may be switched to a streaming version.
-        @Override
-        public void getPorts(getPortsRequest request, StreamObserver<getPortsReply> responseObserver) {
-            getPortsReply.Builder replyBuilder = getPortsReply.newBuilder();
-            deviceService.getPorts(
-                    DeviceId.deviceId(request.getDeviceId()))
-                    .forEach(port -> {
-                        PortProto.Builder portBuilder = PortProto
-                                .newBuilder()
-                                .setPortNumber(port.number().toString())
-                                .setIsEnabled(port.isEnabled())
-                                .setType(PortEnumsProto.PortTypeProto.valueOf(port.type().toString()))
-                                .setPortSpeed(port.portSpeed());
-                        port.annotations().keys().forEach(key -> portBuilder
-                                .putAnnotations(key, port.annotations().value(key)));
-
-                        replyBuilder.addPort(portBuilder.build());
-                    });
-            responseObserver.onNext(replyBuilder.build());
-            responseObserver.onCompleted();
-        }
-
-        //FIXME NOTE: this may be switched to a streaming version.
-        @Override
-        public void getPortStatistics(getPortStatisticsRequest request,
-                                      StreamObserver<getPortStatisticsReply> responseObserver) {
-            getPortStatisticsReply.Builder replyBuilder = getPortStatisticsReply.newBuilder();
-            deviceService.getPortStatistics(DeviceId.deviceId(request.getDeviceId()))
-                    .forEach(statistic -> {
-                        replyBuilder.addPortStatistics(
-                                PortStatisticsProto
-                                        .newBuilder()
-                                        .setPort(statistic.port())
-                                        .setPacketsReceived(statistic.packetsReceived())
-                                        .setPacketsSent(statistic.packetsSent())
-                                        .setBytesReceived(statistic.bytesReceived())
-                                        .setBytesSent(statistic.bytesSent())
-                                        .setPacketsRxDropped(statistic.packetsRxDropped())
-                                        .setPacketsTxDropped(statistic.packetsTxDropped())
-                                        .setPacketsRxErrors(statistic.packetsRxErrors())
-                                        .setPacketsTxErrors(statistic.packetsTxErrors())
-                                        .setDurationSec(statistic.durationSec())
-                                        .setDurationNano(statistic.durationNano())
-                                        .setIsZero(statistic.isZero())
-                                        .build());
-                    });
-            responseObserver.onNext(replyBuilder.build());
-            responseObserver.onCompleted();
-        }
-
-        //FIXME NOTE: this may be switched to a streaming version.
-        @Override
-        public void getPortDeltaStatistics(getPortDeltaStatisticsRequest request,
-                                           StreamObserver<getPortDeltaStatisticsReply> responseObserver) {
-            getPortDeltaStatisticsReply.Builder replyBuilder = getPortDeltaStatisticsReply.newBuilder();
-            deviceService.getPortDeltaStatistics(DeviceId.deviceId(request.getDeviceId()))
-                    .forEach(statistic -> {
-                        replyBuilder.addPortStatistics(
-                                PortStatisticsProto
-                                        .newBuilder()
-                                        .setPort(statistic.port())
-                                        .setPacketsReceived(statistic.packetsReceived())
-                                        .setPacketsSent(statistic.packetsSent())
-                                        .setBytesReceived(statistic.bytesReceived())
-                                        .setBytesSent(statistic.bytesSent())
-                                        .setPacketsRxDropped(statistic.packetsRxDropped())
-                                        .setPacketsTxDropped(statistic.packetsTxDropped())
-                                        .setPacketsRxErrors(statistic.packetsRxErrors())
-                                        .setPacketsTxErrors(statistic.packetsTxErrors())
-                                        .setDurationSec(statistic.durationSec())
-                                        .setDurationNano(statistic.durationNano())
-                                        .setIsZero(statistic.isZero())
-                                        .build());
-                    });
-            responseObserver.onNext(replyBuilder.build());
-            responseObserver.onCompleted();
-        }
-
-        @Override
-        public void getStatisticsForPort(getStatisticsForPortRequest request,
-                                         StreamObserver<getStatisticsForPortReply> responseObserver) {
-            org.onosproject.net.device.PortStatistics statistics = deviceService
-                    .getStatisticsForPort(DeviceId.deviceId(request.getDeviceId()),
-                            PortNumber.portNumber(request.getPortNumber()));
-            responseObserver.onNext(
-                    getStatisticsForPortReply
-                            .newBuilder()
-                            .setPortStatistics(
-                                    PortStatisticsProto
-                                            .newBuilder()
-                                            .setPort(statistics.port())
-                                            .setPacketsReceived(statistics.packetsReceived())
-                                            .setPacketsSent(statistics.packetsSent())
-                                            .setBytesReceived(statistics.bytesReceived())
-                                            .setBytesSent(statistics.bytesSent())
-                                            .setPacketsRxDropped(statistics.packetsRxDropped())
-                                            .setPacketsTxDropped(statistics.packetsTxDropped())
-                                            .setPacketsRxErrors(statistics.packetsRxErrors())
-                                            .setPacketsTxErrors(statistics.packetsTxErrors())
-                                            .setDurationSec(statistics.durationSec())
-                                            .setDurationNano(statistics.durationNano())
-                                            .setIsZero(statistics.isZero())
-                                            .build()).build());
-            responseObserver.onCompleted();
-
-        }
-
-        @Override
-        public void getDeltaStatisticsForPort(getDeltaStatisticsForPortRequest request,
-                                              StreamObserver<getDeltaStatisticsForPortReply> responseObserver) {
-            org.onosproject.net.device.PortStatistics statistics = deviceService
-                    .getDeltaStatisticsForPort(DeviceId.deviceId(request.getDeviceId()),
-                            PortNumber.portNumber(request.getPortNumber()));
-            responseObserver.onNext(
-                    getDeltaStatisticsForPortReply
-                            .newBuilder()
-                            .setPortStatistics(
-                                    PortStatisticsProto
-                                            .newBuilder()
-                                            .setPort(statistics.port())
-                                            .setPacketsReceived(statistics.packetsReceived())
-                                            .setPacketsSent(statistics.packetsSent())
-                                            .setBytesReceived(statistics.bytesReceived())
-                                            .setBytesSent(statistics.bytesSent())
-                                            .setPacketsRxDropped(statistics.packetsRxDropped())
-                                            .setPacketsTxDropped(statistics.packetsTxDropped())
-                                            .setPacketsRxErrors(statistics.packetsRxErrors())
-                                            .setPacketsTxErrors(statistics.packetsTxErrors())
-                                            .setDurationSec(statistics.durationSec())
-                                            .setDurationNano(statistics.durationNano())
-                                            .setIsZero(statistics.isZero())
-                                            .build()).build());
-            responseObserver.onCompleted();
-        }
-
-        @Override
-        public void getPort(getPortRequest request,
-                            StreamObserver<getPortReply> responseObserver) {
-            //FIXME getting deviceId here is dangerous because it is not guaranteed to be populated as port of a OneOf
-            org.onosproject.net.Port port = deviceService.getPort(
-                    new ConnectPoint(DeviceId.deviceId(
-                            request.getConnectPoint().getDeviceId()),
-                            PortNumber.portNumber(
-                                    request.getConnectPoint()
-                                            .getPortNumber())));
-            PortProto.Builder portBuilder =
-                    PortProto.newBuilder()
-                            .setPortNumber(port.number().toString())
-                            .setIsEnabled(port.isEnabled())
-                            .setType(
-                                    PortEnumsProto.PortTypeProto
-                                            .valueOf(port.type().toString()))
-                            .setPortSpeed(port.portSpeed());
-
-            port.annotations().keys().forEach(key -> portBuilder
-                    .putAnnotations(key, port.annotations().value(key)));
-
-            responseObserver.onNext(getPortReply
-                    .newBuilder()
-                    .setPort(portBuilder.build())
-                    .build());
-            responseObserver.onCompleted();
-        }
-
-        @Override
-        public void isAvailable(isAvailableRequest request,
-                                StreamObserver<isAvailableReply> responseObserver) {
-            responseObserver.onNext(
-                    isAvailableReply
-                            .newBuilder()
-                            .setIsAvailable(
-                                    deviceService.isAvailable(
-                                            DeviceId.deviceId(
-                                                    request.getDeviceId())))
-                            .build());
-            responseObserver.onCompleted();
-        }
-
-        @Override
-        public void localStatus(localStatusRequest request,
-                                StreamObserver<localStatusReply> responseObserver) {
-            responseObserver.onNext(
-                    localStatusReply
-                            .newBuilder()
-                            .setStatus(
-                                    deviceService.localStatus(
-                                            DeviceId.deviceId(request.getDeviceId())))
-                            .build());
-            responseObserver.onCompleted();
-        }
-    }
-
-    private DeviceServiceNbServerInternal getInnerInstance() {
-        if (instance == null) {
-            instance = new DeviceServiceNbServerInternal();
-        }
-        return instance;
-    }
-}
\ No newline at end of file
diff --git a/graveyard/protobuf-dead/services/nb/src/main/java/org/onosproject/incubator/protobuf/services/nb/GrpcNbHostService.java b/graveyard/protobuf-dead/services/nb/src/main/java/org/onosproject/incubator/protobuf/services/nb/GrpcNbHostService.java
deleted file mode 100644
index 3fee375..0000000
--- a/graveyard/protobuf-dead/services/nb/src/main/java/org/onosproject/incubator/protobuf/services/nb/GrpcNbHostService.java
+++ /dev/null
@@ -1,236 +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.
- */
-
-package org.onosproject.incubator.protobuf.services.nb;
-
-import com.google.common.annotations.Beta;
-import io.grpc.BindableService;
-import io.grpc.stub.StreamObserver;
-import org.osgi.service.component.annotations.Activate;
-import org.osgi.service.component.annotations.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;
-import org.onosproject.net.DeviceId;
-import org.onosproject.net.HostId;
-import org.onosproject.net.Host;
-import org.onosproject.net.host.HostService;
-import org.onosproject.protobuf.api.GrpcServiceRegistry;
-import org.slf4j.Logger;
-import org.onosproject.grpc.nb.net.host.HostServiceGrpc.HostServiceImplBase;
-import org.onosproject.incubator.protobuf.models.net.ConnectPointProtoTranslator;
-import org.onosproject.incubator.protobuf.models.net.HostProtoTranslator;
-
-import static org.onosproject.grpc.nb.net.host.HostServiceNb.getHostCountRequest;
-import static org.onosproject.grpc.nb.net.host.HostServiceNb.getHostCountReply;
-import static org.onosproject.grpc.nb.net.host.HostServiceNb.getHostsRequest;
-import static org.onosproject.grpc.nb.net.host.HostServiceNb.getHostsReply;
-import static org.onosproject.grpc.nb.net.host.HostServiceNb.getHostRequest;
-import static org.onosproject.grpc.nb.net.host.HostServiceNb.getHostReply;
-import static org.onosproject.grpc.nb.net.host.HostServiceNb.getHostsByVlanRequest;
-import static org.onosproject.grpc.nb.net.host.HostServiceNb.getHostsByVlanReply;
-import static org.onosproject.grpc.nb.net.host.HostServiceNb.getHostsByMacRequest;
-import static org.onosproject.grpc.nb.net.host.HostServiceNb.getHostsByMacReply;
-import static org.onosproject.grpc.nb.net.host.HostServiceNb.getHostsByIpRequest;
-import static org.onosproject.grpc.nb.net.host.HostServiceNb.getHostsByIpReply;
-import static org.onosproject.grpc.nb.net.host.HostServiceNb.getConnectedHostsRequest;
-import static org.onosproject.grpc.nb.net.host.HostServiceNb.getConnectedHostsReply;
-import static org.onosproject.grpc.nb.net.host.HostServiceNb.startMonitoringIpRequest;
-import static org.onosproject.grpc.nb.net.host.HostServiceNb.startMonitoringIpReply;
-import static org.onosproject.grpc.nb.net.host.HostServiceNb.stopMonitoringIpRequest;
-import static org.onosproject.grpc.nb.net.host.HostServiceNb.stopMonitoringIpReply;
-import static org.onosproject.grpc.nb.net.host.HostServiceNb.requestMacRequest;
-import static org.onosproject.grpc.nb.net.host.HostServiceNb.requestMacReply;
-import static org.slf4j.LoggerFactory.getLogger;
-
-/**
- * A server that provides access to the methods exposed by {@link HostService}.
- */
-@Beta
-@Component(immediate = true)
-public class GrpcNbHostService {
-
-    private final Logger log = getLogger(getClass());
-
-    @Reference(cardinality = ReferenceCardinality.MANDATORY)
-    protected GrpcServiceRegistry registry;
-
-    @Reference(cardinality = ReferenceCardinality.MANDATORY)
-    protected HostService hostService;
-
-    private HostServiceNBServerInternal instance = null;
-
-    @Activate
-    public void activate() {
-
-        registry.register(getInnerInstance());
-        log.info("Started");
-    }
-
-    @Deactivate
-    public void deactivate() {
-
-        registry.unregister(getInnerInstance());
-        log.info("Stoped");
-    }
-
-    /**
-     * Register Host Service, Used for unit testing purposes.
-     *
-     * @return An instance of binding Host service
-     */
-    public InProcessServer<BindableService> registerInProcessServer() {
-        InProcessServer<BindableService> inprocessServer =
-                new InProcessServer(HostServiceNBServerInternal.class);
-        inprocessServer.addServiceToBind(getInnerInstance());
-
-        return inprocessServer;
-    }
-
-    /**
-     * Host Service NorthBound implementation.
-     */
-    private final class HostServiceNBServerInternal extends HostServiceImplBase {
-
-        private HostServiceNBServerInternal() {
-            super();
-        }
-
-        @Override
-        public void getHostCount(getHostCountRequest request,
-                                 StreamObserver<getHostCountReply> responseObserver) {
-
-            responseObserver.onNext(getHostCountReply.newBuilder()
-                                            .setHostCount(hostService.getHostCount())
-                                            .build());
-            responseObserver.onCompleted();
-        }
-
-        @Override
-        public void getHosts(getHostsRequest request,
-                             StreamObserver<getHostsReply> responseObserver) {
-
-            getHostsReply.Builder replyBuilder = getHostsReply.newBuilder();
-
-            hostService.getHosts().forEach(d -> replyBuilder.addHost(HostProtoTranslator.translate(d)));
-            responseObserver.onNext(replyBuilder.build());
-            responseObserver.onCompleted();
-        }
-
-        @Override
-        public void getHost(getHostRequest request,
-                            StreamObserver<getHostReply> responseObserver) {
-
-            Host host = hostService.getHost(HostId.hostId(request.getHostId().toString()));
-
-            responseObserver.onNext(getHostReply.newBuilder().setHost(HostProtoTranslator.translate(host)).build());
-            responseObserver.onCompleted();
-        }
-
-        @Override
-        public void getHostsByVlan(getHostsByVlanRequest request,
-                                   StreamObserver<getHostsByVlanReply> responseObserver) {
-
-            getHostsByVlanReply.Builder replyBuilder = getHostsByVlanReply.newBuilder();
-
-            hostService.getHostsByVlan(VlanId.vlanId(request.getVlanId())).forEach(
-                    d -> replyBuilder.addHost(HostProtoTranslator.translate(d)));
-            responseObserver.onNext(replyBuilder.build());
-            responseObserver.onCompleted();
-        }
-
-        @Override
-        public void getHostsByMac(getHostsByMacRequest request,
-                                  StreamObserver<getHostsByMacReply> responseObserver) {
-
-            getHostsByMacReply.Builder replyBuilder = getHostsByMacReply.newBuilder();
-
-            hostService.getHostsByMac(MacAddress.valueOf(request.getMac())).forEach(
-                    d -> replyBuilder.addHost(HostProtoTranslator.translate(d)));
-            responseObserver.onNext(replyBuilder.build());
-            responseObserver.onCompleted();
-        }
-
-        @Override
-        public void getHostsByIp(getHostsByIpRequest request,
-                                 StreamObserver<getHostsByIpReply> responseObserver) {
-
-            getHostsByIpReply.Builder replyBuilder = getHostsByIpReply.newBuilder();
-
-            hostService.getHostsByIp(IpAddress.valueOf(request.getIpAddress())).forEach(
-                    d -> replyBuilder.addHost(HostProtoTranslator.translate(d)));
-            responseObserver.onNext(replyBuilder.build());
-            responseObserver.onCompleted();
-        }
-
-        @Override
-        public void getConnectedHosts(getConnectedHostsRequest request,
-                                      StreamObserver<getConnectedHostsReply> responseObserver) {
-
-            getConnectedHostsReply.Builder replyBuilder = getConnectedHostsReply.newBuilder();
-
-            if (getConnectedHostsRequest.ConnectedHostCase.DEVICEID == request.getConnectedHostCase()) {
-                hostService.getConnectedHosts(DeviceId.deviceId(request.getDeviceId()))
-                        .forEach(d -> replyBuilder.addHost(HostProtoTranslator.translate(d)));
-            } else if (getConnectedHostsRequest.ConnectedHostCase.CONNECT_POINT == request.getConnectedHostCase()) {
-                hostService.getConnectedHosts(ConnectPointProtoTranslator.translate(request.getConnectPoint()).get())
-                        .forEach(d -> replyBuilder.addHost(HostProtoTranslator.translate(d)));
-            } else {
-                log.warn("Both DeviceId and ConnectPoint are not set.");
-            }
-
-            responseObserver.onNext(replyBuilder.build());
-            responseObserver.onCompleted();
-        }
-
-        @Override
-        public void startMonitoringIp(startMonitoringIpRequest request,
-                                      StreamObserver<startMonitoringIpReply> responseObserver) {
-
-            hostService.startMonitoringIp(IpAddress.valueOf(request.getIpAddress()));
-            responseObserver.onNext(startMonitoringIpReply.getDefaultInstance());
-            responseObserver.onCompleted();
-        }
-
-        @Override
-        public void stopMonitoringIp(stopMonitoringIpRequest request,
-                                     StreamObserver<stopMonitoringIpReply> responseObserver) {
-
-            hostService.stopMonitoringIp(IpAddress.valueOf(request.getIpAddress()));
-            responseObserver.onNext(stopMonitoringIpReply.getDefaultInstance());
-            responseObserver.onCompleted();
-        }
-
-        @Override
-        public void requestMac(requestMacRequest request,
-                               StreamObserver<requestMacReply> responseObserver) {
-
-            hostService.requestMac(IpAddress.valueOf(request.getIpAddress()));
-            responseObserver.onNext(requestMacReply.getDefaultInstance());
-            responseObserver.onCompleted();
-        }
-    }
-
-    private HostServiceNBServerInternal getInnerInstance() {
-        if (instance == null) {
-            instance = new HostServiceNBServerInternal();
-        }
-        return instance;
-    }
-}
diff --git a/graveyard/protobuf-dead/services/nb/src/main/java/org/onosproject/incubator/protobuf/services/nb/GrpcNbLinkService.java b/graveyard/protobuf-dead/services/nb/src/main/java/org/onosproject/incubator/protobuf/services/nb/GrpcNbLinkService.java
deleted file mode 100644
index fbf956d..0000000
--- a/graveyard/protobuf-dead/services/nb/src/main/java/org/onosproject/incubator/protobuf/services/nb/GrpcNbLinkService.java
+++ /dev/null
@@ -1,226 +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.
-*/
-
-package org.onosproject.incubator.protobuf.services.nb;
-
-import com.google.common.annotations.Beta;
-import io.grpc.BindableService;
-import io.grpc.stub.StreamObserver;
-import org.osgi.service.component.annotations.Activate;
-import org.osgi.service.component.annotations.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;
-import org.onosproject.grpc.nb.net.link.LinkServiceNb.getActiveLinksRequest;
-import org.onosproject.grpc.nb.net.link.LinkServiceNb.getDeviceEgressLinksReply;
-import org.onosproject.grpc.nb.net.link.LinkServiceNb.getDeviceEgressLinksRequest;
-import org.onosproject.grpc.nb.net.link.LinkServiceNb.getDeviceIngressLinksReply;
-import org.onosproject.grpc.nb.net.link.LinkServiceNb.getDeviceIngressLinksRequest;
-import org.onosproject.grpc.nb.net.link.LinkServiceNb.getDeviceLinksReply;
-import org.onosproject.grpc.nb.net.link.LinkServiceNb.getDeviceLinksRequest;
-import org.onosproject.grpc.nb.net.link.LinkServiceNb.getEgressLinksReply;
-import org.onosproject.grpc.nb.net.link.LinkServiceNb.getEgressLinksRequest;
-import org.onosproject.grpc.nb.net.link.LinkServiceNb.getIngressLinksReply;
-import org.onosproject.grpc.nb.net.link.LinkServiceNb.getIngressLinksRequest;
-import org.onosproject.grpc.nb.net.link.LinkServiceNb.getLinkCountReply;
-import org.onosproject.grpc.nb.net.link.LinkServiceNb.getLinkCountRequest;
-import org.onosproject.grpc.nb.net.link.LinkServiceNb.getLinkReply;
-import org.onosproject.grpc.nb.net.link.LinkServiceNb.getLinkRequest;
-import org.onosproject.grpc.nb.net.link.LinkServiceNb.getLinksReply;
-import org.onosproject.grpc.nb.net.link.LinkServiceNb.getLinksRequest;
-import org.onosproject.incubator.protobuf.models.net.ConnectPointProtoTranslator;
-import org.onosproject.incubator.protobuf.models.net.LinkProtoTranslator;
-import org.onosproject.net.ConnectPoint;
-import org.onosproject.net.DeviceId;
-import org.onosproject.net.link.LinkService;
-import org.onosproject.protobuf.api.GrpcServiceRegistry;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-/**
- * A server that provides access to the methods exposed by {@link org.onosproject.net.link.LinkService}.
- */
-@Beta
-@Component(immediate = true)
-public class GrpcNbLinkService {
-
-    private static final Logger log = LoggerFactory.getLogger(GrpcNbLinkService.class);
-
-    @Reference(cardinality = ReferenceCardinality.MANDATORY)
-    protected GrpcServiceRegistry registry;
-
-    @Reference(cardinality = ReferenceCardinality.MANDATORY)
-    protected LinkService linkService;
-
-    private LinkServiceNbServerInternal innerClassInstance;
-
-    @Activate
-    public void activate() {
-
-        registry.register(getInnerInstance());
-        log.info("Started.");
-    }
-
-    @Deactivate
-    public void deactivate() {
-
-        registry.unregister(getInnerInstance());
-        log.info("Stopped.");
-    }
-
-    /**
-     * Register Link Service, used for unit testing purposes.
-     *
-     * @return An instance of binding Link service
-     */
-    public InProcessServer<BindableService> registerInProcessServer() {
-        InProcessServer<BindableService> inprocessServer =
-                new InProcessServer(LinkServiceNb.class);
-        inprocessServer.addServiceToBind(getInnerInstance());
-
-        return inprocessServer;
-    }
-
-    private class LinkServiceNbServerInternal extends LinkServiceImplBase {
-
-        public LinkServiceNbServerInternal() {
-            super();
-        }
-
-        @Override
-        public void getLinkCount(getLinkCountRequest request,
-                                 StreamObserver<getLinkCountReply> responseObserver) {
-            responseObserver
-                    .onNext(getLinkCountReply
-                                    .newBuilder()
-                                    .setLinkCount(linkService.getLinkCount())
-                                    .build());
-            responseObserver.onCompleted();
-        }
-
-        @Override
-        public void getLink(getLinkRequest request,
-                            StreamObserver<getLinkReply> responseObserver) {
-            ConnectPoint src = ConnectPointProtoTranslator.translate(request.getSrc()).get();
-            ConnectPoint dst = ConnectPointProtoTranslator.translate(request.getDst()).get();
-
-            org.onosproject.net.Link link = linkService.getLink(src, dst);
-            getLinkReply reply = getLinkReply.newBuilder()
-                    .setLink(LinkProtoTranslator.translate(link)).build();
-
-            responseObserver.onNext(reply);
-            responseObserver.onCompleted();
-        }
-
-        @Override
-        public void getActiveLinks(getActiveLinksRequest request,
-                                   StreamObserver<getActiveLinksReply> responseObserver) {
-            getActiveLinksReply.Builder builder = getActiveLinksReply.newBuilder();
-            linkService.getActiveLinks().forEach(l -> {
-                builder.addLink(LinkProtoTranslator.translate(l));
-            });
-            responseObserver.onNext(builder.build());
-            responseObserver.onCompleted();
-        }
-
-        @Override
-        public void getDeviceLinks(getDeviceLinksRequest request,
-                                   StreamObserver<getDeviceLinksReply> responseObserver) {
-            DeviceId deviceId = DeviceId.deviceId(request.getDeviceId());
-            getDeviceLinksReply.Builder builder = getDeviceLinksReply.newBuilder();
-            linkService.getDeviceLinks(deviceId).forEach(l -> {
-                builder.addLink(LinkProtoTranslator.translate(l));
-            });
-            responseObserver.onNext(builder.build());
-            responseObserver.onCompleted();
-        }
-
-        @Override
-        public void getDeviceEgressLinks(getDeviceEgressLinksRequest request,
-                                         StreamObserver<getDeviceEgressLinksReply> responseObserver) {
-            DeviceId deviceId = DeviceId.deviceId(request.getDeviceId());
-            getDeviceEgressLinksReply.Builder builder = getDeviceEgressLinksReply.newBuilder();
-            linkService.getDeviceEgressLinks(deviceId).forEach(l -> {
-                builder.addLink(LinkProtoTranslator.translate(l));
-            });
-            responseObserver.onNext(builder.build());
-            responseObserver.onCompleted();
-        }
-
-        @Override
-        public void getDeviceIngressLinks(getDeviceIngressLinksRequest request,
-                                          StreamObserver<getDeviceIngressLinksReply> responseObserver) {
-            DeviceId deviceId = DeviceId.deviceId(request.getDeviceId());
-            getDeviceIngressLinksReply.Builder builder = getDeviceIngressLinksReply.newBuilder();
-            linkService.getDeviceIngressLinks(deviceId).forEach(l -> {
-                builder.addLink(LinkProtoTranslator.translate(l));
-            });
-            responseObserver.onNext(builder.build());
-            responseObserver.onCompleted();
-        }
-
-        @Override
-        public void getEgressLinks(getEgressLinksRequest request,
-                                   StreamObserver<getEgressLinksReply> responseObserver) {
-            ConnectPoint connectPoint = ConnectPointProtoTranslator.translate(request.getConnectPoint()).get();
-            getEgressLinksReply.Builder builder = getEgressLinksReply.newBuilder();
-            linkService.getEgressLinks(connectPoint).forEach(l -> {
-                builder.addLink(LinkProtoTranslator.translate(l));
-            });
-            responseObserver.onNext(builder.build());
-            responseObserver.onCompleted();
-        }
-
-        @Override
-        public void getIngressLinks(getIngressLinksRequest request,
-                                    StreamObserver<getIngressLinksReply> responseObserver) {
-            ConnectPoint connectPoint = ConnectPointProtoTranslator.translate(request.getConnectPoint()).get();
-
-            getIngressLinksReply.Builder builder = getIngressLinksReply.newBuilder();
-            linkService.getIngressLinks(connectPoint).forEach(l -> {
-                builder.addLink(LinkProtoTranslator.translate(l));
-            });
-            responseObserver.onNext(builder.build());
-            responseObserver.onCompleted();
-        }
-
-        @Override
-        public void getLinks(getLinksRequest request,
-                             StreamObserver<getLinksReply> responseObserver) {
-            ConnectPoint connectPoint = ConnectPointProtoTranslator.translate(request.getConnectPoint()).get();
-
-            getLinksReply.Builder builder = getLinksReply.newBuilder();
-            linkService.getLinks(connectPoint).forEach(l -> {
-                builder.addLink(LinkProtoTranslator.translate(l));
-            });
-            responseObserver.onNext(builder.build());
-            responseObserver.onCompleted();
-        }
-    }
-
-    private LinkServiceNbServerInternal getInnerInstance() {
-        if (innerClassInstance == null) {
-            innerClassInstance = new LinkServiceNbServerInternal();
-        }
-        return innerClassInstance;
-    }
-}
-
-
-
diff --git a/graveyard/protobuf-dead/services/nb/src/main/java/org/onosproject/incubator/protobuf/services/nb/GrpcNbMastershipService.java b/graveyard/protobuf-dead/services/nb/src/main/java/org/onosproject/incubator/protobuf/services/nb/GrpcNbMastershipService.java
deleted file mode 100644
index 8d2a48f..0000000
--- a/graveyard/protobuf-dead/services/nb/src/main/java/org/onosproject/incubator/protobuf/services/nb/GrpcNbMastershipService.java
+++ /dev/null
@@ -1,167 +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.
- */
-package org.onosproject.incubator.protobuf.services.nb;
-
-
-import com.google.common.annotations.Beta;
-import io.grpc.BindableService;
-import io.grpc.stub.StreamObserver;
-import org.osgi.service.component.annotations.Activate;
-import org.osgi.service.component.annotations.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;
-import org.onosproject.grpc.nb.mastership.MastershipServiceNb;
-import org.onosproject.grpc.nb.mastership.MastershipServiceNb.getLocalRoleReply;
-import org.onosproject.grpc.nb.mastership.MastershipServiceNb.getLocalRoleRequest;
-import org.onosproject.grpc.nb.mastership.MastershipServiceNb.isLocalMasterReply;
-import org.onosproject.grpc.nb.mastership.MastershipServiceNb.isLocalMasterRequest;
-import org.onosproject.grpc.nb.mastership.MastershipServiceNb.relinquishMastershipSyncReply;
-import org.onosproject.grpc.nb.mastership.MastershipServiceNb.relinquishMastershipSyncRequest;
-import org.onosproject.grpc.nb.mastership.MastershipServiceNb.requestRoleForSyncReply;
-import org.onosproject.grpc.nb.mastership.MastershipServiceNb.requestRoleForSyncRequest;
-import org.onosproject.incubator.protobuf.models.cluster.NodeIdProtoTranslator;
-import org.onosproject.incubator.protobuf.models.cluster.RoleInfoProtoTranslator;
-import org.onosproject.incubator.protobuf.models.net.MastershipRoleProtoTranslator;
-import org.onosproject.mastership.MastershipService;
-import org.onosproject.net.DeviceId;
-import org.onosproject.net.MastershipRole;
-import org.onosproject.protobuf.api.GrpcServiceRegistry;
-import org.slf4j.Logger;
-
-import static org.slf4j.LoggerFactory.getLogger;
-
-/**
- * A server that provides access to the methods exposed by {@link MastershipService}.
- */
-
-@Beta
-@Component(immediate = true)
-public class GrpcNbMastershipService {
-
-    private final Logger log = getLogger(getClass());
-
-    @Reference(cardinality = ReferenceCardinality.MANDATORY)
-    protected GrpcServiceRegistry registry;
-
-    @Reference(cardinality = ReferenceCardinality.MANDATORY)
-    protected MastershipService mastershipService;
-
-    private MastershipServiceNbServerInternal instance = null;
-
-    @Activate
-    public void activate() {
-        registry.register(getInnerInstance());
-        log.info("Started.");
-    }
-
-    @Deactivate
-    public void deactivate() {
-        registry.unregister(getInnerInstance());
-        log.info("Stopped");
-    }
-
-    /**
-     * Register Mastership Service, used for unit testing purposes.
-     *
-     * @return an instance of binding Mastership service
-     */
-    public InProcessServer<BindableService> registerInProcessServer() {
-        InProcessServer<BindableService> inprocessServer =
-                new InProcessServer(GrpcNbMastershipService.MastershipServiceNbServerInternal.class);
-        inprocessServer.addServiceToBind(getInnerInstance());
-
-        return inprocessServer;
-    }
-
-    private class MastershipServiceNbServerInternal extends MastershipServiceGrpc.MastershipServiceImplBase {
-
-        @Override
-        public void getLocalRole(getLocalRoleRequest request,
-                                 StreamObserver<getLocalRoleReply> responseObserver) {
-            MastershipRole mr = mastershipService.getLocalRole(DeviceId.deviceId(request.getDeviceId()));
-
-            responseObserver.onNext(getLocalRoleReply.newBuilder()
-                    .setMastershipRole(MastershipRoleProtoTranslator.translate(mr))
-                    .build());
-            responseObserver.onCompleted();
-        }
-
-        @Override
-        public void isLocalMaster(isLocalMasterRequest request,
-                                  StreamObserver<isLocalMasterReply> responseObserver) {
-            boolean isLocalMaster = mastershipService.isLocalMaster(DeviceId.deviceId(request.getDeviceId()));
-
-            responseObserver.onNext(isLocalMasterReply.newBuilder()
-                    .setIsLocalMaster(isLocalMaster)
-                    .build());
-            responseObserver.onCompleted();
-        }
-
-        @Override
-        public void requestRoleForSync(requestRoleForSyncRequest request,
-                                       StreamObserver<requestRoleForSyncReply> responseObserver) {
-            MastershipRole mr = mastershipService.requestRoleForSync(DeviceId.deviceId(request.getDeviceId()));
-
-            responseObserver.onNext(requestRoleForSyncReply.newBuilder()
-                    .setMastershipRole(MastershipRoleProtoTranslator.translate(mr))
-                    .build());
-            responseObserver.onCompleted();
-        }
-
-        @Override
-        public void relinquishMastershipSync(relinquishMastershipSyncRequest request,
-                                             StreamObserver<relinquishMastershipSyncReply> responseObserver) {
-            relinquishMastershipSyncReply.Builder replyBuilder = relinquishMastershipSyncReply.newBuilder();
-            mastershipService.relinquishMastershipSync(DeviceId.deviceId(request.getDeviceId()));
-
-            responseObserver.onNext(replyBuilder.build());
-            responseObserver.onCompleted();
-        }
-
-        @Override
-        public void getMasterFor(MastershipServiceNb.getMasterForRequest request,
-                                 StreamObserver<MastershipServiceNb.getMasterForReply> responseObserver) {
-            NodeId nodeId = mastershipService.getMasterFor(DeviceId.deviceId(request.getDeviceId()));
-
-            responseObserver.onNext(MastershipServiceNb.getMasterForReply.newBuilder()
-                    .setNodeId(NodeIdProtoTranslator.translate(nodeId))
-                    .build());
-            responseObserver.onCompleted();
-        }
-
-        @Override
-        public void getNodesFor(MastershipServiceNb.getNodesForRequest request,
-                                StreamObserver<MastershipServiceNb.getNodesForReply> responseObserver) {
-            RoleInfo roleInfo = mastershipService.getNodesFor(DeviceId.deviceId(request.getDeviceId()));
-
-            responseObserver.onNext(MastershipServiceNb.getNodesForReply.newBuilder()
-                    .setRoleInfo(RoleInfoProtoTranslator.translate(roleInfo))
-                    .build());
-            responseObserver.onCompleted();
-        }
-    }
-
-    private MastershipServiceNbServerInternal getInnerInstance() {
-        if (instance == null) {
-            instance = new MastershipServiceNbServerInternal();
-        }
-        return instance;
-    }
-}
diff --git a/graveyard/protobuf-dead/services/nb/src/main/java/org/onosproject/incubator/protobuf/services/nb/GrpcNbMeterService.java b/graveyard/protobuf-dead/services/nb/src/main/java/org/onosproject/incubator/protobuf/services/nb/GrpcNbMeterService.java
deleted file mode 100644
index 6aed88f..0000000
--- a/graveyard/protobuf-dead/services/nb/src/main/java/org/onosproject/incubator/protobuf/services/nb/GrpcNbMeterService.java
+++ /dev/null
@@ -1,125 +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.
- */
-
-package org.onosproject.incubator.protobuf.services.nb;
-
-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;
-
-import org.onosproject.grpc.nb.net.meter.MeterServiceGrpc.MeterServiceImplBase;
-import org.onosproject.grpc.nb.net.meter.MeterServiceNbProto.submitRequest;
-import org.onosproject.grpc.nb.net.meter.MeterServiceNbProto.submitReply;
-import org.onosproject.grpc.nb.net.meter.MeterServiceNbProto.withdrawRequest;
-import org.onosproject.grpc.nb.net.meter.MeterServiceNbProto.withdrawReply;
-import org.onosproject.grpc.nb.net.meter.MeterServiceNbProto.getMeterRequest;
-import org.onosproject.grpc.nb.net.meter.MeterServiceNbProto.getMeterReply;
-import org.onosproject.grpc.nb.net.meter.MeterServiceNbProto.getAllMetersRequest;
-import org.onosproject.grpc.nb.net.meter.MeterServiceNbProto.getAllMetersReply;
-import org.onosproject.grpc.nb.net.meter.MeterServiceNbProto.getMetersRequest;
-import org.onosproject.grpc.nb.net.meter.MeterServiceNbProto.getMetersReply;
-
-import io.grpc.stub.StreamObserver;
-import org.osgi.service.component.annotations.Activate;
-import org.osgi.service.component.annotations.Deactivate;
-import com.google.common.annotations.Beta;
-import org.osgi.service.component.annotations.Component;
-
-import org.onosproject.net.meter.Meter;
-import org.onosproject.net.meter.MeterId;
-import org.onosproject.net.DeviceId;
-import org.onosproject.protobuf.api.GrpcServiceRegistry;
-
-/**
- * A server that provides access to the methods exposed by {@link MeterService}.
- * TODO this requires major refactoring, translation should be delegated to calls to
- * TODO{@link MeterProtoTranslator}.
- */
-@Beta
-@Component(immediate = true)
-public class GrpcNbMeterService extends MeterServiceImplBase {
-
-    @Reference(cardinality = ReferenceCardinality.MANDATORY)
-    protected MeterService meterService;
-
-    @Reference(cardinality = ReferenceCardinality.MANDATORY)
-    protected GrpcServiceRegistry grpcServiceRegistry;
-
-    @Activate
-    public void activate() {
-        grpcServiceRegistry.register(this);
-    }
-
-    @Deactivate
-    public void deactivate() {
-        grpcServiceRegistry.unregister(this);
-    }
-
-    @Override
-    public void submit(submitRequest request,
-                       StreamObserver<submitReply> responseObserver) {
-        submitReply.Builder replyBuilder = submitReply.newBuilder();
-        Meter meter = meterService.submit(MeterRequestProtoTranslator.translate(request.getMeter()));
-        responseObserver.onNext(replyBuilder.setSubmitMeter(MeterProtoTranslator.translate(meter)).build());
-        responseObserver.onCompleted();
-    }
-
-    @Override
-    public void withdraw(withdrawRequest request,
-                         StreamObserver<withdrawReply> responseObserver) {
-        withdrawReply.Builder replyBuilder = withdrawReply.newBuilder();
-        meterService.withdraw(MeterRequestProtoTranslator.translate(request.getMeter()),
-                MeterId.meterId(request.getMeterId()));
-        responseObserver.onNext(replyBuilder.build());
-        responseObserver.onCompleted();
-    }
-
-    @Override
-    public void getMeter(getMeterRequest request,
-                         StreamObserver<getMeterReply> responseObserver) {
-        getMeterReply.Builder replyBuilder = getMeterReply.newBuilder();
-        Meter meter = meterService.getMeter(DeviceId.deviceId(request.getDeviceId()),
-                MeterId.meterId(request.getMeterId()));
-        responseObserver.onNext(replyBuilder.setMeter(MeterProtoTranslator.translate(meter)).build());
-        responseObserver.onCompleted();
-    }
-
-    @Override
-    public void getAllMeters(getAllMetersRequest request,
-                             StreamObserver<getAllMetersReply> responseObserver) {
-        getAllMetersReply.Builder replyBuilder = getAllMetersReply.newBuilder();
-        meterService.getAllMeters().forEach(d -> {
-            replyBuilder.addMeters(MeterProtoTranslator.translate(d));
-        });
-        responseObserver.onNext(replyBuilder.build());
-        responseObserver.onCompleted();
-    }
-
-    @Override
-    public void getMeters(getMetersRequest request,
-                          StreamObserver<getMetersReply> responseObserver) {
-        getMetersReply.Builder replyBuilder = getMetersReply.newBuilder();
-        meterService.getMeters(DeviceId.deviceId(request.getDeviceId())).forEach(d -> {
-            replyBuilder.addMeters(MeterProtoTranslator.translate(d));
-        });
-        responseObserver.onNext(replyBuilder.build());
-        responseObserver.onCompleted();
-    }
-
-}
-
diff --git a/graveyard/protobuf-dead/services/nb/src/main/java/org/onosproject/incubator/protobuf/services/nb/GrpcNbRegionService.java b/graveyard/protobuf-dead/services/nb/src/main/java/org/onosproject/incubator/protobuf/services/nb/GrpcNbRegionService.java
deleted file mode 100644
index f98d880..0000000
--- a/graveyard/protobuf-dead/services/nb/src/main/java/org/onosproject/incubator/protobuf/services/nb/GrpcNbRegionService.java
+++ /dev/null
@@ -1,175 +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.
-*/
-
-package org.onosproject.incubator.protobuf.services.nb;
-
-import com.google.common.annotations.Beta;
-import io.grpc.BindableService;
-import io.grpc.stub.StreamObserver;
-import org.osgi.service.component.annotations.Activate;
-import org.osgi.service.component.annotations.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;
-import org.onosproject.grpc.nb.net.region.RegionServiceNb.getRegionForDeviceReply;
-import org.onosproject.grpc.nb.net.region.RegionServiceNb.getRegionForDeviceRequest;
-import org.onosproject.grpc.nb.net.region.RegionServiceNb.getRegionHostsReply;
-import org.onosproject.grpc.nb.net.region.RegionServiceNb.getRegionHostsRequest;
-import org.onosproject.grpc.nb.net.region.RegionServiceNb.getRegionReply;
-import org.onosproject.grpc.nb.net.region.RegionServiceNb.getRegionRequest;
-import org.onosproject.grpc.nb.net.region.RegionServiceNb.getRegionsReply;
-import org.onosproject.grpc.nb.net.region.RegionServiceNb.getRegionsRequest;
-import org.onosproject.incubator.protobuf.models.net.RegionProtoTranslator;
-import org.onosproject.net.DeviceId;
-import org.onosproject.net.region.Region;
-import org.onosproject.net.region.RegionId;
-import org.onosproject.net.region.RegionService;
-import org.onosproject.protobuf.api.GrpcServiceRegistry;
-import org.slf4j.Logger;
-
-import static org.slf4j.LoggerFactory.getLogger;
-
-/**
- * A server that provides access to the methods exposed by {@link RegionService}.
- */
-@Beta
-@Component(immediate = true)
-public class GrpcNbRegionService {
-
-    private final Logger log = getLogger(getClass());
-
-    @Reference(cardinality = ReferenceCardinality.MANDATORY)
-    protected GrpcServiceRegistry registry;
-
-    @Reference(cardinality = ReferenceCardinality.MANDATORY)
-    protected RegionService regionService;
-
-    private RegionServiceNbServerInternal innerClassInstance = null;
-
-    @Activate
-    public void activate() {
-
-        registry.register(getInnerClassInstance());
-        log.info("Started.");
-    }
-
-    @Deactivate
-    public void deactivate() {
-
-        registry.unregister(getInnerClassInstance());
-        log.info("Stopped.");
-    }
-
-    /**
-     * Register Region Service, used for unit testing purposes.
-     *
-     * @return An instance of binding Region service
-     */
-    public InProcessServer<BindableService> registerInProcessServer() {
-        InProcessServer<BindableService> inprocessServer =
-                new InProcessServer(GrpcNbRegionService.RegionServiceNbServerInternal.class);
-        inprocessServer.addServiceToBind(getInnerClassInstance());
-
-        return inprocessServer;
-    }
-
-    private final class RegionServiceNbServerInternal extends RegionServiceImplBase {
-        /**
-         * Service for interacting with inventory of network control regions.
-         */
-        @Override
-        public void getRegions(getRegionsRequest request,
-                               StreamObserver<getRegionsReply> responseObserver) {
-            getRegionsReply.Builder builder = getRegionsReply.newBuilder();
-            regionService.getRegions().forEach(r -> {
-                builder.addRegion(RegionProtoTranslator.translate(r));
-            });
-            responseObserver.onNext(builder.build());
-            responseObserver.onCompleted();
-        }
-
-        @Override
-        public void getRegion(getRegionRequest request,
-                              StreamObserver<getRegionReply> responseObserver) {
-            RegionId regionId = RegionId.regionId(request.getRegionId());
-            Region region = regionService.getRegion(regionId);
-
-            getRegionReply reply = getRegionReply.newBuilder()
-                    .setRegion(RegionProtoTranslator.translate(region)).build();
-
-            responseObserver.onNext(reply);
-            responseObserver.onCompleted();
-        }
-
-        @Override
-        public void getRegionForDevice(getRegionForDeviceRequest request,
-                                       StreamObserver<getRegionForDeviceReply> responseObserver) {
-            DeviceId deviceId = DeviceId.deviceId(request.getDeviceId());
-            Region region = regionService.getRegionForDevice(deviceId);
-
-            getRegionForDeviceReply reply = getRegionForDeviceReply.newBuilder()
-                    .setRegion(RegionProtoTranslator.translate(region)).build();
-
-            responseObserver.onNext(reply);
-            responseObserver.onCompleted();
-        }
-
-        @Override
-        public void getRegionDevices(getRegionDevicesRequest request,
-                                     StreamObserver<getRegionDevicesReply> responseObserver) {
-            RegionId regionId = RegionId.regionId(request.getRegionId());
-            getRegionDevicesReply.Builder builder = getRegionDevicesReply.newBuilder();
-
-            regionService.getRegionDevices(regionId).forEach(d -> {
-                builder.addDeviceId(d.toString());
-            });
-
-            responseObserver.onNext(builder.build());
-            responseObserver.onCompleted();
-        }
-
-        @Override
-        public void getRegionHosts(getRegionHostsRequest request,
-                                   StreamObserver<getRegionHostsReply> responseObserver) {
-            RegionId regionId = RegionId.regionId(request.getRegionId());
-            getRegionHostsReply.Builder builder = getRegionHostsReply.newBuilder();
-
-            regionService.getRegionHosts(regionId).forEach(h -> {
-                builder.addHostId(h.toString());
-            });
-
-            responseObserver.onNext(builder.build());
-            responseObserver.onCompleted();
-        }
-    }
-
-    private RegionServiceNbServerInternal getInnerClassInstance() {
-        if (innerClassInstance == null) {
-            innerClassInstance = new RegionServiceNbServerInternal();
-        }
-        return innerClassInstance;
-    }
-}
-
-
-
-
-
-
-
diff --git a/graveyard/protobuf-dead/services/nb/src/main/java/org/onosproject/incubator/protobuf/services/nb/InProcessServer.java b/graveyard/protobuf-dead/services/nb/src/main/java/org/onosproject/incubator/protobuf/services/nb/InProcessServer.java
deleted file mode 100644
index f7ccdcb..0000000
--- a/graveyard/protobuf-dead/services/nb/src/main/java/org/onosproject/incubator/protobuf/services/nb/InProcessServer.java
+++ /dev/null
@@ -1,78 +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.
-*/
-
-package org.onosproject.incubator.protobuf.services.nb;
-
-import com.google.common.collect.Sets;
-import io.grpc.Server;
-import io.grpc.inprocess.InProcessServerBuilder;
-import io.grpc.internal.AbstractServerImplBuilder;
-
-import java.io.IOException;
-import java.util.Set;
-/**
- * InProcessServer that manages startup/shutdown of a service within the same process
- * as the client is running. Used for unit testing purposes.
- */
-public class InProcessServer<T extends io.grpc.BindableService> {
-    private Server server;
-
-    Set<T> services = Sets.newHashSet();
-
-    private Class<T> clazz;
-
-    public InProcessServer(Class<T> clazz) {
-        this.clazz = clazz;
-    }
-
-    public void addServiceToBind(T service) {
-        if (service != null) {
-            services.add(service);
-        }
-    }
-
-    public void start() throws IOException, InstantiationException, IllegalAccessException {
-
-        AbstractServerImplBuilder builder = InProcessServerBuilder.forName("test").directExecutor();
-        services.forEach(service -> builder.addService(service));
-        server = builder.build().start();
-        Runtime.getRuntime().addShutdownHook(new Thread() {
-            @Override
-            public void run() {
-                // Use stderr here since the logger may have been reset by its JVM shutdown hook.
-                System.err.println("*** shutting down gRPC server since JVM is shutting down");
-                InProcessServer.this.stop();
-                System.err.println("*** server shut down");
-            }
-        });
-    }
-
-    public void stop() {
-        if (server != null) {
-            server.shutdown();
-        }
-    }
-
-    /**
-     * Await termination on the main thread since the grpc library uses daemon threads.
-     * @throws InterruptedException if there is an issue
-     */
-    public void blockUntilShutdown() throws InterruptedException {
-        if (server != null) {
-            server.awaitTermination();
-        }
-    }
-}
\ No newline at end of file
diff --git a/graveyard/protobuf-dead/services/nb/src/main/java/org/onosproject/incubator/protobuf/services/nb/package-info.java b/graveyard/protobuf-dead/services/nb/src/main/java/org/onosproject/incubator/protobuf/services/nb/package-info.java
deleted file mode 100644
index 51cb983..0000000
--- a/graveyard/protobuf-dead/services/nb/src/main/java/org/onosproject/incubator/protobuf/services/nb/package-info.java
+++ /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.
- */
-/**
- * gRPC server implementations for northbound services.
- */
-package org.onosproject.incubator.protobuf.services.nb;
diff --git a/graveyard/protobuf-dead/services/nb/src/main/proto/app/ApplicationServiceNb.proto b/graveyard/protobuf-dead/services/nb/src/main/proto/app/ApplicationServiceNb.proto
deleted file mode 100644
index a6132a3..0000000
--- a/graveyard/protobuf-dead/services/nb/src/main/proto/app/ApplicationServiceNb.proto
+++ /dev/null
@@ -1,71 +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.
- */
-syntax="proto3";
-option java_package = "org.onosproject.grpc.nb.app";
-
-package nb.app;
-
-import "core/ApplicationProto.proto";
-import "core/ApplicationIdProto.proto";
-import "app/ApplicationEnumsProto.proto";
-import "security/PermissionProto.proto";
-
-message getApplicationsRequest {
-}
-
-message getApplicationsReply {
-    repeated .core.ApplicationProto application = 1;
-}
-
-message getIdRequest {
-    string name = 1;
-}
-
-message getIdReply {
-    .core.ApplicationIdProto application_id = 1;
-}
-
-message getApplicationRequest {
-    .core.ApplicationIdProto application_id = 1;
-}
-
-message getApplicationReply {
-    .core.ApplicationProto application = 1;
-}
-
-message getStateRequest {
-    .core.ApplicationIdProto application_id = 1;
-}
-
-message getStateReply {
-    .app.ApplicationStateProto state = 1;
-}
-
-message getPermissionsRequest {
-    .core.ApplicationIdProto application_id = 1;
-}
-
-message getPermissionsReply {
-    repeated .security.PermissionProto permission = 1;
-}
-
-service ApplicationService {
-    rpc getApplications(getApplicationsRequest) returns (getApplicationsReply) {}
-    rpc getId(getIdRequest) returns (getIdReply) {}
-    rpc getApplication(getApplicationRequest) returns (getApplicationReply) {}
-    rpc getState(getStateRequest) returns (getStateReply) {}
-    rpc getPermissions(getPermissionsRequest) returns (getPermissionsReply) {}
-}
\ No newline at end of file
diff --git a/graveyard/protobuf-dead/services/nb/src/main/proto/cfg/ComponentConfigServiceNb.proto b/graveyard/protobuf-dead/services/nb/src/main/proto/cfg/ComponentConfigServiceNb.proto
deleted file mode 100644
index 5c17997..0000000
--- a/graveyard/protobuf-dead/services/nb/src/main/proto/cfg/ComponentConfigServiceNb.proto
+++ /dev/null
@@ -1,87 +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.
- */
-syntax="proto3";
-option java_package = "org.onosproject.grpc.nb.cfg";
-
-package nb.cfg;
-
-import "cfg/ConfigPropertyProto.proto";
-
-message getComponentNamesRequest {
-}
-
-message getComponentNamesReply {
-    repeated string names = 1;
-}
-
-message registerPropertiesRequest {
-    string component_class = 1;
-}
-
-message registerPropertiesReply {
-}
-
-message unregisterPropertiesRequest {
-    string component_class = 1;
-    bool clear = 2;
-}
-
-message unregisterPropertiesReply {
-}
-
-message getPropertiesRequest {
-    string component_name = 1;
-}
-
-message getPropertiesReply {
-    repeated .cfg.ConfigPropertyProto config_properties = 1;
-}
-
-message setPropertyRequest {
-    string component_name = 1;
-    string name = 2;
-    string value = 3;
-}
-
-message setPropertyReply {
-}
-
-message preSetPropertyRequest {
-    string component_name = 1;
-    string name = 2;
-    string value = 3;
-}
-
-message preSetPropertyReply {
-}
-
-message unsetPropertyRequest {
-    string component_name = 1;
-    string name = 2;
-}
-
-message unsetPropertyReply {
-}
-
-service ComponentConfigService {
-    rpc getComponentNames(getComponentNamesRequest) returns (getComponentNamesReply) {}
-    rpc registerProperties(registerPropertiesRequest) returns (registerPropertiesReply) {}
-    rpc unregisterProperties(unregisterPropertiesRequest) returns (unregisterPropertiesReply) {}
-    rpc getProperties(getPropertiesRequest) returns (getPropertiesReply) {}
-    rpc setProperty(setPropertyRequest) returns (setPropertyReply) {}
-    rpc preSetProperty(preSetPropertyRequest) returns (preSetPropertyReply) {}
-    rpc unsetProperty(unsetPropertyRequest) returns (unsetPropertyReply) {}
-}
\ No newline at end of file
diff --git a/graveyard/protobuf-dead/services/nb/src/main/proto/mastership/MastershipServiceNb.proto b/graveyard/protobuf-dead/services/nb/src/main/proto/mastership/MastershipServiceNb.proto
deleted file mode 100644
index 4944d84..0000000
--- a/graveyard/protobuf-dead/services/nb/src/main/proto/mastership/MastershipServiceNb.proto
+++ /dev/null
@@ -1,79 +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.
- */
-syntax="proto3";
-option java_package = "org.onosproject.grpc.nb.mastership";
-
-package nb.mastership;
-
-import "net/MastershipRoleProto.proto";
-import "cluster/RoleInfoProto.proto";
-import "cluster/NodeIdProto.proto";
-
-message getLocalRoleRequest {
-    string device_id = 1;
-}
-
-message getLocalRoleReply {
-    .net.MastershipRoleProto mastership_role = 1;
-}
-
-message isLocalMasterRequest {
-    string device_id = 1;
-}
-
-message isLocalMasterReply {
-    bool is_local_master = 1;
-}
-
-message requestRoleForSyncRequest {
-    string device_id = 1;
-}
-
-message requestRoleForSyncReply {
-    .net.MastershipRoleProto mastership_role = 1;
-}
-
-message relinquishMastershipSyncRequest {
-    string device_id = 1;
-}
-
-message relinquishMastershipSyncReply {
-}
-
-message getMasterForRequest {
-    string device_id = 1;
-}
-
-message getMasterForReply {
-    .cluster.NodeIdProto node_id = 1;
-}
-
-message getNodesForRequest {
-    string device_id = 1;
-}
-
-message getNodesForReply {
-    .cluster.RoleInfoProto role_info = 1;
-}
-
-service MastershipService {
-    rpc getLocalRole(getLocalRoleRequest) returns (getLocalRoleReply) {}
-    rpc isLocalMaster(isLocalMasterRequest) returns (isLocalMasterReply) {}
-    rpc requestRoleForSync(requestRoleForSyncRequest) returns (requestRoleForSyncReply) {}
-    rpc relinquishMastershipSync(relinquishMastershipSyncRequest) returns (relinquishMastershipSyncReply) {}
-    rpc getMasterFor(getMasterForRequest) returns (getMasterForReply) {}
-    rpc getNodesFor(getNodesForRequest) returns (getNodesForReply) {}
-}
\ No newline at end of file
diff --git a/graveyard/protobuf-dead/services/nb/src/main/proto/net/device/DeviceServiceNb.proto b/graveyard/protobuf-dead/services/nb/src/main/proto/net/device/DeviceServiceNb.proto
deleted file mode 100644
index da27de9..0000000
--- a/graveyard/protobuf-dead/services/nb/src/main/proto/net/device/DeviceServiceNb.proto
+++ /dev/null
@@ -1,149 +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.
- */
-syntax="proto3";
-option java_package = "org.onosproject.grpc.nb.net.device";
-
-package nb.net.device;
-
-import "net/DeviceProto.proto";
-import "net/device/DeviceEnumsProto.proto";
-import "net/MastershipRoleProto.proto";
-import "net/device/PortStatisticsProto.proto";
-import "net/PortProto.proto";
-import "net/ConnectPointProto.proto";
-
-message getDeviceCountRequest {
-}
-
-message getDeviceCountReply {
-    int32 device_count = 1;
-}
-
-message getDevicesRequest {
-}
-
-message getDevicesReply {
-    repeated .net.DeviceProto device = 1;
-}
-
-message getAvailableDevicesReply {
-    repeated .net.DeviceProto device = 1;
-}
-
-message getAvailableDevicesRequest {
-    .net.device.DeviceTypeProto type = 1;
-}
-
-message getDeviceRequest {
-    string device_id = 1;
-}
-
-message getDeviceReply {
-    .net.DeviceProto device = 1;
-}
-
-message getRoleRequest {
-    string device_id = 1;
-}
-
-message getRoleReply {
-    .net.MastershipRoleProto role = 1;
-}
-
-message getPortsRequest {
-    string device_id = 1;
-}
-
-message getPortsReply {
-    repeated .net.PortProto port = 1;
-}
-
-message getPortStatisticsRequest {
-    string device_id = 1;
-}
-
-message getPortStatisticsReply {
-    repeated .net.device.PortStatisticsProto port_statistics = 1;
-}
-
-message getPortDeltaStatisticsRequest {
-    string device_id = 1;
-}
-
-message getPortDeltaStatisticsReply {
-    repeated .net.device.PortStatisticsProto port_statistics = 1;
-}
-
-message getStatisticsForPortRequest {
-    string device_id = 1;
-    uint64 port_number = 2;
-}
-
-message getStatisticsForPortReply {
-    .net.device.PortStatisticsProto port_statistics = 1;
-}
-
-message getDeltaStatisticsForPortRequest {
-    string device_id = 1;
-    uint64 port_number = 2;
-}
-
-message getDeltaStatisticsForPortReply {
-    .net.device.PortStatisticsProto port_statistics = 1;
-}
-
-message getPortRequest {
-    .net.ConnectPointProto connect_point = 1;
-}
-
-message getPortReply {
-    .net.PortProto port = 1;
-}
-
-message isAvailableRequest {
-    string device_id = 1;
-}
-
-message isAvailableReply {
-    bool is_available = 1;
-}
-
-message localStatusRequest {
-    string device_id = 1;
-}
-
-message localStatusReply {
-    string status = 1;
-}
-
-service DeviceService {
-    rpc getDeviceCount(getDeviceCountRequest) returns (getDeviceCountReply) {}
-    rpc getDevices(getDevicesRequest) returns (getDevicesReply) {}
-    rpc getAvailableDevices(getAvailableDevicesRequest) returns (getAvailableDevicesReply) {}
-    rpc getDevice(getDeviceRequest) returns (getDeviceReply) {}
-    rpc getRole(getRoleRequest) returns (getRoleReply) {}
-    rpc getPorts(getPortsRequest) returns (getPortsReply) {}
-    rpc getPortStatistics(getPortStatisticsRequest) returns (getPortStatisticsReply) {}
-    rpc getPortDeltaStatistics(getPortDeltaStatisticsRequest)
-    returns (getPortDeltaStatisticsReply) {}
-    rpc getStatisticsForPort(getStatisticsForPortRequest)
-    returns (getStatisticsForPortReply) {}
-    rpc getDeltaStatisticsForPort(getDeltaStatisticsForPortRequest)
-    returns (getDeltaStatisticsForPortReply) {}
-    rpc getPort(getPortRequest) returns (getPortReply) {}
-    rpc isAvailable(isAvailableRequest) returns (isAvailableReply) {}
-    rpc localStatus(localStatusRequest) returns (localStatusReply) {}
-}
\ No newline at end of file
diff --git a/graveyard/protobuf-dead/services/nb/src/main/proto/net/host/HostServiceNb.proto b/graveyard/protobuf-dead/services/nb/src/main/proto/net/host/HostServiceNb.proto
deleted file mode 100644
index 56f2577..0000000
--- a/graveyard/protobuf-dead/services/nb/src/main/proto/net/host/HostServiceNb.proto
+++ /dev/null
@@ -1,134 +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.
- */
-syntax="proto3";
-option java_package = "org.onosproject.grpc.nb.net.host";
-
-package nb.net.host;
-
-import "net/HostProto.proto";
-import "net/HostIdProto.proto";
-import "net/ConnectPointProto.proto";
-
-message getHostCountRequest {
-}
-
-message getHostCountReply {
-    int32 host_count = 1;
-}
-
-message getHostsRequest {
-}
-
-message getHostsReply {
-    repeated .net.HostProto host = 1;
-}
-
-message getHostRequest {
-    .net.HostIdProto host_id = 1;
-}
-
-message getHostReply {
-    .net.HostProto host = 1;
-}
-
-message getHostsByVlanRequest {
-    string vlan_id = 1;
-}
-
-message getHostsByVlanReply {
-    repeated .net.HostProto host = 1;
-}
-
-message getHostsByMacRequest {
-    string mac = 1;
-}
-
-message getHostsByMacReply {
-    repeated .net.HostProto host = 1;
-}
-
-message getHostsByIpRequest {
-    string ip_address = 1;
-}
-
-message getHostsByIpReply {
-    repeated .net.HostProto host = 1;
-}
-
-message getConnectedHostsRequest {
-    oneof connected_host {
-        .net.ConnectPointProto connect_point = 1;
-        string deviceId = 2;
-    }
-}
-
-message getConnectedHostsReply {
-    repeated .net.HostProto host = 1;
-}
-
-message startMonitoringIpRequest {
-    string ip_address = 1;
-}
-
-message startMonitoringIpReply {
-}
-
-message stopMonitoringIpRequest {
-    string ip_address = 1;
-}
-
-message stopMonitoringIpReply {
-}
-
-message requestMacRequest {
-    string ip_address = 1;
-}
-
-message requestMacReply {
-}
-
-// Host Interface exported by the server.
-service HostService {
-    // GRPC Obtains the host count.
-    rpc getHostCount(getHostCountRequest) returns (getHostCountReply) {}
-
-    // GRPC Obtains the hosts.
-    rpc getHosts(getHostsRequest) returns (getHostsReply) {}
-
-    // GRPC Obtains the host at a given HostId.
-    rpc getHost(getHostRequest) returns (getHostReply) {}
-
-    // GRPC Obtains the hosts at a given VlanId.
-    rpc getHostsByVlan(getHostsByVlanRequest) returns (getHostsByVlanReply) {}
-
-    // GRPC Obtains the hosts at a given MacAddress.
-    rpc getHostsByMac(getHostsByMacRequest) returns (getHostsByMacReply) {}
-
-    // GRPC Obtains the hosts at a given IpAddress.
-    rpc getHostsByIp(getHostsByIpRequest) returns (getHostsByIpReply) {}
-
-    // GRPC Obtains the hosts at a given connectPoint or DeviceId.
-    rpc getConnectedHosts(getConnectedHostsRequest) returns (getConnectedHostsReply) {}
-
-    // GRPC Requests the host service to monitor hosts with the given IP address.
-    rpc startMonitoringIp(startMonitoringIpRequest) returns (startMonitoringIpReply) {}
-
-    // GRPC Stops the host service from monitoring an IP address.
-    rpc stopMonitoringIp(stopMonitoringIpRequest) returns (stopMonitoringIpReply) {}
-
-    // GRPC Requests the host service to resolve the MAC address for the given IP address.
-    rpc requestMac(requestMacRequest) returns (requestMacReply) {}
-}
\ No newline at end of file
diff --git a/graveyard/protobuf-dead/services/nb/src/main/proto/net/link/LinkServiceNb.proto b/graveyard/protobuf-dead/services/nb/src/main/proto/net/link/LinkServiceNb.proto
deleted file mode 100644
index 30ad08e..0000000
--- a/graveyard/protobuf-dead/services/nb/src/main/proto/net/link/LinkServiceNb.proto
+++ /dev/null
@@ -1,105 +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.
- */
-syntax="proto3";
-option java_package = "org.onosproject.grpc.nb.net.link";
-
-package nb.net.link;
-
-import "net/LinkProto.proto";
-import "net/ConnectPointProto.proto";
-
-message getLinkCountRequest {
-}
-
-message getLinkCountReply {
-    int32 link_count = 1;
-}
-
-message getActiveLinksRequest {
-}
-
-message getActiveLinksReply {
-    repeated .net.LinkProto link = 1;
-}
-
-message getDeviceLinksRequest {
-    string device_id = 1;
-}
-
-message getDeviceLinksReply {
-    repeated .net.LinkProto link = 1;
-}
-
-message getDeviceEgressLinksRequest {
-    string device_id = 1;
-}
-
-message getDeviceEgressLinksReply {
-    repeated .net.LinkProto link = 1;
-}
-
-message getDeviceIngressLinksRequest {
-    string device_id = 1;
-}
-
-message getDeviceIngressLinksReply {
-    repeated .net.LinkProto link = 1;
-}
-
-message getLinksRequest {
-    .net.ConnectPointProto connect_point = 1;
-}
-
-message getLinksReply {
-    repeated .net.LinkProto link = 1;
-}
-
-message getEgressLinksRequest {
-    .net.ConnectPointProto connect_point = 1;
-}
-
-message getEgressLinksReply {
-    repeated .net.LinkProto link = 1;
-}
-
-message getIngressLinksRequest {
-    .net.ConnectPointProto connect_point = 1;
-}
-
-message getIngressLinksReply {
-    repeated .net.LinkProto link = 1;
-}
-
-message getLinkRequest {
-    .net.ConnectPointProto src = 1;
-    .net.ConnectPointProto dst = 2;
-}
-
-message getLinkReply {
-    .net.LinkProto link = 1;
-}
-
-service LinkService {
-    rpc getLinkCount(getLinkCountRequest) returns(getLinkCountReply) {}
-    rpc getLinks(getLinksRequest) returns(getLinksReply) {}
-    rpc getActiveLinks(getActiveLinksRequest) returns(getActiveLinksReply) {}
-    rpc getDeviceLinks(getDeviceLinksRequest) returns(getDeviceLinksReply) {}
-    rpc getDeviceEgressLinks(getDeviceEgressLinksRequest) returns(getDeviceEgressLinksReply) {}
-    rpc getDeviceIngressLinks(getDeviceIngressLinksRequest) returns(getDeviceIngressLinksReply) {}
-    rpc getEgressLinks(getEgressLinksRequest) returns(getEgressLinksReply) {}
-    rpc getIngressLinks(getIngressLinksRequest) returns(getIngressLinksReply) {}
-    rpc getLink(getLinkRequest) returns(getLinkReply) {}
-}
diff --git a/graveyard/protobuf-dead/services/nb/src/main/proto/net/meter/MeterServiceNbProto.proto b/graveyard/protobuf-dead/services/nb/src/main/proto/net/meter/MeterServiceNbProto.proto
deleted file mode 100644
index 377f0bf..0000000
--- a/graveyard/protobuf-dead/services/nb/src/main/proto/net/meter/MeterServiceNbProto.proto
+++ /dev/null
@@ -1,70 +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.
- */
-syntax = "proto3";
-option java_package = "org.onosproject.grpc.nb.net.meter";
-
-package nb.net.meter;
-
-import "net/meter/MeterProto.proto";
-import "net/meter/MeterRequestProto.proto";
-
-message submitRequest {
-    .net.meter.MeterRequestProto meter = 1;
-}
-
-message submitReply {
-    .net.meter.MeterProto submit_meter = 1;
-}
-
-message withdrawRequest {
-    .net.meter.MeterRequestProto meter = 1;
-    uint64 meter_id = 2;
-}
-
-message withdrawReply {
-}
-
-message getMeterRequest {
-    string device_id = 1;
-    uint64 meter_id = 2;
-}
-
-message getMeterReply {
-    .net.meter.MeterProto meter = 1;
-}
-
-message getAllMetersRequest {
-}
-
-message getAllMetersReply {
-    repeated .net.meter.MeterProto meters = 1;
-}
-
-message getMetersRequest {
-    string device_id = 1;
-}
-
-message getMetersReply {
-    repeated .net.meter.MeterProto meters = 1;
-}
-
-service MeterService {
-     rpc submit(submitRequest) returns (submitReply) {}
-     rpc withdraw(withdrawRequest) returns (withdrawReply) {}
-     rpc getMeter(getMeterRequest) returns (getMeterReply) {}
-     rpc getAllMeters(getAllMetersRequest) returns (getAllMetersReply) {}
-     rpc getMeters(getMetersRequest) returns (getMetersReply) {}
-}
\ No newline at end of file
diff --git a/graveyard/protobuf-dead/services/nb/src/main/proto/net/packet/PacketServiceNb.proto b/graveyard/protobuf-dead/services/nb/src/main/proto/net/packet/PacketServiceNb.proto
deleted file mode 100644
index a7d2d02..0000000
--- a/graveyard/protobuf-dead/services/nb/src/main/proto/net/packet/PacketServiceNb.proto
+++ /dev/null
@@ -1,90 +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.
- */
-syntax="proto3";
-option java_package = "org.onosproject.grpc.nb.net.packet";
-
-package nb.net.packet;
-
-import "net/packet/PacketRequestProto.proto";
-import "net/packet/PacketProcessorProto.proto";
-import "net/packet/PacketProcessorEntryProto.proto";
-import "net/packet/OutboundPacketProto.proto";
-import "core/ApplicationIdProto.proto";
-import "net/flow/TrafficSelectorProto.proto";
-
-message addProcessorRequest {
-    .net.packet.PacketProcessorProto packet_processor = 1;
-    int32 priority = 2;
-}
-
-message addProcessorReply {
-}
-
-message removeProcessorRequest {
-    .net.packet.PacketProcessorProto packet_processor = 1;
-}
-
-message removeProcessorReply {
-}
-
-message getProcessorsRequest {
-}
-
-message getProcessorsReply {
-    repeated .net.packet.PacketProcessorEntryProto packetProcessor_entry = 1;
-}
-
-message requestPacketsRequest {
-    .net.flow.TrafficSelectorProto traffic_selector = 1;
-    int32 priority = 2;
-    .core.ApplicationIdProto application_id = 3;
-}
-
-message requestPacketsReply {
-}
-
-message cancelPacketsRequest {
-    .net.flow.TrafficSelectorProto traffic_selector = 1;
-    int32 priority = 2;
-    .core.ApplicationIdProto application_id = 3;
-}
-
-message cancelPacketsReply {
-}
-
-message getRequestsRequest {
-}
-
-message getRequestsReply {
-    repeated .net.packet.PacketRequestProto packet_request = 1;
-}
-
-message emitRequest {
-    .net.packet.OutboundPacketProto outbound_packet = 1;
-}
-
-message emitReply {
-}
-
-service DeviceService {
-    rpc addProcessor(addProcessorRequest) returns (addProcessorReply) {}
-    rpc removeProcessor(removeProcessorRequest) returns (removeProcessorReply) {}
-    rpc getProcessors(getProcessorsRequest) returns (getProcessorsReply) {}
-    rpc requestPackets(requestPacketsRequest) returns (requestPacketsReply) {}
-    rpc cancelPackets(cancelPacketsRequest) returns (cancelPacketsReply) {}
-    rpc getRequests(getRequestsRequest) returns (getRequestsReply) {}
-    rpc emit(emitRequest) returns (emitReply) {}
-}
\ No newline at end of file
diff --git a/graveyard/protobuf-dead/services/nb/src/main/proto/net/region/RegionServiceNb.proto b/graveyard/protobuf-dead/services/nb/src/main/proto/net/region/RegionServiceNb.proto
deleted file mode 100644
index feabc50..0000000
--- a/graveyard/protobuf-dead/services/nb/src/main/proto/net/region/RegionServiceNb.proto
+++ /dev/null
@@ -1,68 +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.
- */
-syntax="proto3";
-option java_package = "org.onosproject.grpc.nb.net.region";
-
-package nb.net.region;
-
-import "net/RegionProto.proto";
-
-message getRegionsRequest {
-}
-
-message getRegionsReply {
-    repeated .net.RegionProto region = 1;
-}
-
-message getRegionRequest {
-    string regionId = 1;
-}
-
-message getRegionReply {
-    .net.RegionProto region = 1;
-}
-
-message getRegionForDeviceRequest {
-    string deviceId = 1;
-}
-
-message getRegionForDeviceReply {
-    .net.RegionProto region = 1;
-}
-
-message getRegionDevicesRequest {
-    string regionId = 1;
-}
-
-message getRegionDevicesReply {
-    repeated string deviceId = 1;
-}
-
-message getRegionHostsRequest {
-    string regionId = 1;
-}
-
-message getRegionHostsReply {
-    repeated string hostId = 1;
-}
-
-service RegionService {
-    rpc getRegions(getRegionsRequest) returns (getRegionsReply) {}
-    rpc getRegion(getRegionRequest) returns (getRegionReply) {}
-    rpc getRegionForDevice(getRegionForDeviceRequest) returns (getRegionForDeviceReply) {}
-    rpc getRegionDevices(getRegionDevicesRequest) returns (getRegionDevicesReply) {}
-    rpc getRegionHosts(getRegionHostsRequest) returns (getRegionHostsReply) {}
-}
\ No newline at end of file
diff --git a/graveyard/protobuf-dead/services/nb/src/test/java/org/onosproject/incubator/protobuf/services/nb/GrpcNbApplicationServiceTest.java b/graveyard/protobuf-dead/services/nb/src/test/java/org/onosproject/incubator/protobuf/services/nb/GrpcNbApplicationServiceTest.java
deleted file mode 100644
index f04618f..0000000
--- a/graveyard/protobuf-dead/services/nb/src/test/java/org/onosproject/incubator/protobuf/services/nb/GrpcNbApplicationServiceTest.java
+++ /dev/null
@@ -1,292 +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.
- */
-
-package org.onosproject.incubator.protobuf.services.nb;
-
-import com.google.common.collect.ImmutableList;
-import com.google.common.collect.ImmutableSet;
-import io.grpc.BindableService;
-import io.grpc.ManagedChannel;
-import io.grpc.inprocess.InProcessChannelBuilder;
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Test;
-import org.onosproject.app.ApplicationListener;
-import org.onosproject.app.ApplicationService;
-import org.onosproject.app.ApplicationState;
-import org.onosproject.core.Application;
-import org.onosproject.core.ApplicationId;
-import org.onosproject.core.ApplicationRole;
-import org.onosproject.core.DefaultApplication;
-import org.onosproject.core.DefaultApplicationId;
-import org.onosproject.core.Version;
-import org.onosproject.grpc.app.models.ApplicationEnumsProto;
-import org.onosproject.grpc.core.models.ApplicationIdProtoOuterClass;
-import org.onosproject.grpc.core.models.ApplicationProtoOuterClass;
-import org.onosproject.grpc.nb.app.ApplicationServiceGrpc;
-import org.onosproject.incubator.protobuf.models.core.ApplicationEnumsProtoTranslator;
-import org.onosproject.incubator.protobuf.models.core.ApplicationIdProtoTranslator;
-import org.onosproject.incubator.protobuf.models.core.ApplicationProtoTranslator;
-import org.onosproject.security.Permission;
-
-import java.io.IOException;
-import java.util.Optional;
-import java.util.Set;
-
-import static org.junit.Assert.assertEquals;
-import static org.onosproject.grpc.nb.app.ApplicationServiceNb.*;
-
-/**
- * Unit tests for applications gRPC NB services.
- */
-public class GrpcNbApplicationServiceTest {
-
-    private static InProcessServer<BindableService> inprocessServer;
-    private static ApplicationServiceGrpc.ApplicationServiceBlockingStub blockingStub;
-    private static ManagedChannel channel;
-
-    private final ApplicationService appService = new MockApplicationService();
-
-    private ApplicationId id1 = new DefaultApplicationId(1, "app1");
-    private ApplicationId id2 = new DefaultApplicationId(2, "app2");
-    private ApplicationId id3 = new DefaultApplicationId(3, "app3");
-    private ApplicationId id4 = new DefaultApplicationId(4, "app4");
-
-    private static final Version VER = Version.version(1, 2, "a", "b");
-
-    private DefaultApplication.Builder baseBuilder = DefaultApplication.builder()
-            .withVersion(VER)
-            .withIcon(new byte[0])
-            .withRole(ApplicationRole.ADMIN)
-            .withPermissions(ImmutableSet.of())
-            .withFeaturesRepo(Optional.empty())
-            .withFeatures(ImmutableList.of("My Feature"))
-            .withRequiredApps(ImmutableList.of());
-
-    private Application app1 =
-            DefaultApplication.builder(baseBuilder)
-                    .withAppId(id1)
-                    .withTitle("title1")
-                    .withDescription("desc1")
-                    .withOrigin("origin1")
-                    .withCategory("category1")
-                    .withUrl("url1")
-                    .withReadme("readme1")
-                    .build();
-    private Application app2 =
-            DefaultApplication.builder(baseBuilder)
-                    .withAppId(id2)
-                    .withTitle("title2")
-                    .withDescription("desc2")
-                    .withOrigin("origin2")
-                    .withCategory("category2")
-                    .withUrl("url2")
-                    .withReadme("readme2")
-                    .build();
-    private Application app3 =
-            DefaultApplication.builder(baseBuilder)
-                    .withAppId(id3)
-                    .withTitle("title3")
-                    .withDescription("desc3")
-                    .withOrigin("origin3")
-                    .withCategory("category3")
-                    .withUrl("url3")
-                    .withReadme("readme3")
-                    .build();
-    private Application app4 =
-            DefaultApplication.builder(baseBuilder)
-                    .withAppId(id4)
-                    .withTitle("title4")
-                    .withDescription("desc4")
-                    .withOrigin("origin4")
-                    .withCategory("category4")
-                    .withUrl("url4")
-                    .withReadme("readme4")
-                    .build();
-
-    private Set apps = ImmutableSet.of(app1, app2, app3, app4);
-
-    /**
-     * Initializes the test environment.
-     */
-    @Before
-    public void setUp() throws IllegalAccessException, IOException, InstantiationException {
-
-        GrpcNbApplicationService grpcAppService = new GrpcNbApplicationService();
-        grpcAppService.applicationService = appService;
-        inprocessServer = grpcAppService.registerInProcessServer();
-        inprocessServer.start();
-
-        channel = InProcessChannelBuilder.forName("test").directExecutor()
-                .usePlaintext(true).build();
-
-        blockingStub = ApplicationServiceGrpc.newBlockingStub(channel);
-    }
-
-    /**
-     * Finalizes the test setup.
-     */
-    @After
-    public void tearDown() {
-        channel.shutdownNow();
-        inprocessServer.stop();
-    }
-
-    /**
-     * Tests the invocation result of getApplications method.
-     *
-     * @throws InterruptedException
-     */
-    @Test
-    public void testGetApplications() throws InterruptedException {
-        getApplicationsRequest request = getApplicationsRequest.getDefaultInstance();
-        getApplicationsReply reply;
-
-        reply = blockingStub.getApplications(request);
-        assertEquals(4, reply.getApplicationCount());
-    }
-
-    /**
-     * Tests the invocation result of getId method.
-     *
-     * @throws InterruptedException
-     */
-    @Test
-    public void testGetId() throws InterruptedException {
-        getIdRequest request = getIdRequest.newBuilder()
-                .setName("one")
-                .build();
-
-        getIdReply reply = blockingStub.getId(request);
-        ApplicationIdProtoOuterClass.ApplicationIdProto appIdProto = reply.getApplicationId();
-        assertEquals(id1, ApplicationIdProtoTranslator.translate(appIdProto));
-    }
-
-    /**
-     * Tests the invocation result of getApplication method.
-     *
-     * @throws InterruptedException
-     */
-    @Test
-    public void testGetApplication() throws InterruptedException {
-        getApplicationRequest request = getApplicationRequest.newBuilder()
-                .setApplicationId(ApplicationIdProtoTranslator.translate(id1))
-                .build();
-
-        getApplicationReply reply = blockingStub.getApplication(request);
-        ApplicationProtoOuterClass.ApplicationProto appProto = reply.getApplication();
-        assertEquals(app1, ApplicationProtoTranslator.translate(appProto));
-    }
-
-    /**
-     * Tests the invocation result of getState method.
-     *
-     * @throws InterruptedException
-     */
-    @Test
-    public void testGetState() throws InterruptedException {
-        getStateRequest request = getStateRequest.newBuilder()
-                .setApplicationId(ApplicationIdProtoTranslator.translate(id1))
-                .build();
-
-        getStateReply reply = blockingStub.getState(request);
-        ApplicationEnumsProto.ApplicationStateProto stateProto = reply.getState();
-        assertEquals(Optional.of(ApplicationState.INSTALLED),
-                ApplicationEnumsProtoTranslator.translate(stateProto));
-    }
-
-    /**
-     * Mock class for application service.
-     */
-    private class MockApplicationService implements ApplicationService {
-
-        MockApplicationService() {}
-
-        @Override
-        public Set<Application> getApplications() {
-            return apps;
-        }
-
-        @Override
-        public ApplicationId getId(String name) {
-
-            if ("one".equals(name)) {
-                return id1;
-            }
-
-            if ("two".equals(name)) {
-                return id2;
-            }
-
-            if ("three".equals(name)) {
-                return id3;
-            }
-
-            if ("four".equals(name)) {
-                return id4;
-            }
-
-            return null;
-        }
-
-        @Override
-        public Application getApplication(ApplicationId appId) {
-
-            if (id1.equals(appId)) {
-                return app1;
-            }
-
-            if (id2.equals(appId)) {
-                return app2;
-            }
-
-            if (id3.equals(appId)) {
-                return app3;
-            }
-
-            if (id4.equals(appId)) {
-                return app4;
-            }
-
-            return null;
-        }
-
-        @Override
-        public ApplicationState getState(ApplicationId appId) {
-            return ApplicationState.INSTALLED;
-        }
-
-        @Override
-        public Set<Permission> getPermissions(ApplicationId appId) {
-            return null;
-        }
-
-        @Override
-        public void registerDeactivateHook(ApplicationId appId, Runnable hook) {
-
-        }
-
-        @Override
-        public void addListener(ApplicationListener listener) {
-
-        }
-
-        @Override
-        public void removeListener(ApplicationListener listener) {
-
-        }
-    }
-}
diff --git a/graveyard/protobuf-dead/services/nb/src/test/java/org/onosproject/incubator/protobuf/services/nb/GrpcNbComponentConfigServiceTest.java b/graveyard/protobuf-dead/services/nb/src/test/java/org/onosproject/incubator/protobuf/services/nb/GrpcNbComponentConfigServiceTest.java
deleted file mode 100644
index 2b6021c..0000000
--- a/graveyard/protobuf-dead/services/nb/src/test/java/org/onosproject/incubator/protobuf/services/nb/GrpcNbComponentConfigServiceTest.java
+++ /dev/null
@@ -1,282 +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.
-*/
-
-package org.onosproject.incubator.protobuf.services.nb;
-
-import com.google.common.collect.ImmutableSet;
-import com.google.common.collect.Maps;
-import io.grpc.BindableService;
-import io.grpc.ManagedChannel;
-import io.grpc.inprocess.InProcessChannelBuilder;
-import org.junit.AfterClass;
-import org.junit.BeforeClass;
-import org.junit.Test;
-import org.onosproject.cfg.ComponentConfigService;
-import org.onosproject.cfg.ConfigProperty;
-import org.onosproject.grpc.cfg.models.ConfigPropertyProtoOuterClass;
-import org.onosproject.grpc.nb.cfg.ComponentConfigServiceGrpc;
-import org.onosproject.grpc.nb.cfg.ComponentConfigServiceNb;
-import org.onosproject.grpc.nb.cfg.ComponentConfigServiceGrpc.ComponentConfigServiceBlockingStub;
-import org.onosproject.incubator.protobuf.models.cfg.ConfigPropertyProtoTranslator;
-import java.io.IOException;
-import java.util.Collections;
-import java.util.HashSet;
-import java.util.Map;
-import java.util.Set;
-
-import static org.onosproject.grpc.nb.cfg.ComponentConfigServiceNb.*;
-import static org.junit.Assert.assertTrue;
-import static org.onosproject.cfg.ConfigProperty.Type.STRING;
-
-/**
- * Unit tests of gRPC northbound component config service.
- */
-public class GrpcNbComponentConfigServiceTest {
-
-    private static InProcessServer<BindableService> inprocessServer;
-    private static ComponentConfigServiceBlockingStub blockingStub;
-    private static ManagedChannel channel;
-
-    private static Set<String> componentNames = new HashSet<>();
-    private static final Map<String, ConfigProperty> PROPERTY_MAP = Maps.newConcurrentMap();
-    private static final Map<String, ConfigProperty> PROPERTY_MAP1 = Maps.newConcurrentMap();
-    private static final Map<String, String> STRING_MAP = Maps.newConcurrentMap();
-    private static final Map<String, String> STRING_MAP1 = Maps.newConcurrentMap();
-    private static final Map<String, String> STRING_MAP2 = Maps.newConcurrentMap();
-    private static final ComponentConfigService MOCK_COMPONENTCONFIG = new MockComponentConfigService();
-    private static final String COMPONENTCONFIGNAME = "org.onosprject.test";
-    private static final String COMPONENTCONFIGNAME1 = "org.onosprject.test1";
-    private static final String COMPONENTCONFIGNAME2 = "org.onosprject.test2";
-    private static final String PROPERTY_TEST_KEY = COMPONENTCONFIGNAME + "#" + "test";
-    private static final ConfigProperty C1 = ConfigProperty.defineProperty("foo", STRING, "dingo", "FOO");
-    private static final ConfigProperty C2 = ConfigProperty.defineProperty("bar", STRING, "bat", "BAR");
-
-    public GrpcNbComponentConfigServiceTest() {}
-
-    private static void populateComponentNames() {
-
-        componentNames.add(COMPONENTCONFIGNAME);
-        componentNames.add(COMPONENTCONFIGNAME1);
-        componentNames.add(COMPONENTCONFIGNAME2);
-        PROPERTY_MAP1.put(COMPONENTCONFIGNAME, C1);
-        STRING_MAP2.put(PROPERTY_TEST_KEY, "true");
-    }
-
-    /**
-     * Tests gRPC getComponentNames interface.
-     */
-    @Test
-    public void testGetComponentNames() throws InterruptedException {
-        getComponentNamesRequest request = ComponentConfigServiceNb.getComponentNamesRequest.getDefaultInstance();
-        getComponentNamesReply reply;
-
-        try {
-            reply = blockingStub.getComponentNames(request);
-            assertTrue(componentNames.size() == reply.getNamesCount());
-
-            Set expectedNames = Collections.emptySet();
-            expectedNames.addAll(componentNames);
-            assertTrue(reply.equals(expectedNames));
-        } catch (Exception e) {
-            e.printStackTrace();
-        }
-    }
-
-    /**
-     * Tests gRPC registerProperties interface.
-     */
-    @Test
-    public void testRegisterProperties() throws InterruptedException {
-        registerPropertiesRequest request = ComponentConfigServiceNb.registerPropertiesRequest
-                .newBuilder().setComponentClass(COMPONENTCONFIGNAME).build();
-
-        try {
-            blockingStub.registerProperties(request);
-            assertTrue(PROPERTY_MAP.get(COMPONENTCONFIGNAME).equals(C1));
-        } catch (Exception e) {
-            e.printStackTrace();
-        }
-    }
-
-    /**
-     * Tests gRPC unregisterProperties interface.
-     */
-    @Test
-    public void testUnregisterProperties() throws InterruptedException {
-        unregisterPropertiesRequest request = ComponentConfigServiceNb.unregisterPropertiesRequest
-                .newBuilder().setComponentClass(COMPONENTCONFIGNAME).build();
-
-        try {
-            blockingStub.unregisterProperties(request);
-            assertTrue(PROPERTY_MAP1.get(COMPONENTCONFIGNAME) == null);
-        } catch (Exception e) {
-            e.printStackTrace();
-        }
-    }
-
-    /**
-     * Tests gRPC getProperty interface.
-     */
-    @Test
-    public void tesGetProperties() throws InterruptedException {
-        getPropertiesRequest request = ComponentConfigServiceNb.getPropertiesRequest.newBuilder()
-                .setComponentName(COMPONENTCONFIGNAME).build();
-        getPropertiesReply reply;
-
-        try {
-            reply = blockingStub.getProperties(request);
-
-            Set<ConfigProperty> configProperties = new HashSet<>();
-            for (ConfigPropertyProtoOuterClass.ConfigPropertyProto cfg : reply.getConfigPropertiesList()) {
-                configProperties.add(ConfigPropertyProtoTranslator.translate(cfg));
-            }
-
-            assertTrue(configProperties.equals(ImmutableSet.of(C1, C2)));
-        } catch (Exception e) {
-            e.printStackTrace();
-        }
-    }
-
-    /**
-     * Tests gRPC setProperty interface.
-     */
-    @Test
-    public void testSetProperty() throws InterruptedException {
-        setPropertyRequest request = ComponentConfigServiceNb.setPropertyRequest.newBuilder()
-                .setComponentName(COMPONENTCONFIGNAME)
-                .setName("test")
-                .setValue("true")
-                .build();
-
-        try {
-            blockingStub.setProperty(request);
-            assertTrue(STRING_MAP.get(PROPERTY_TEST_KEY).equals("true"));
-        } catch (Exception e) {
-            e.printStackTrace();
-        }
-    }
-
-    /**
-     * Tests gRPC preSetProperty interface.
-     */
-    @Test
-    public void testPreSetProperty() throws InterruptedException {
-        preSetPropertyRequest request = ComponentConfigServiceNb.preSetPropertyRequest.newBuilder()
-                .setComponentName(COMPONENTCONFIGNAME)
-                .setName("test")
-                .setValue("true")
-                .build();
-
-        try {
-            blockingStub.preSetProperty(request);
-            assertTrue(STRING_MAP1.get(PROPERTY_TEST_KEY).equals("true"));
-        } catch (Exception e) {
-            e.printStackTrace();
-        }
-    }
-
-    /**
-     * Tests gRPC unsetProperty interface.
-     */
-    @Test
-    public void testUnsetProperty() throws InterruptedException {
-        unsetPropertyRequest request = ComponentConfigServiceNb.unsetPropertyRequest.newBuilder()
-                .setComponentName(COMPONENTCONFIGNAME)
-                .setName("test")
-                .build();
-
-        try {
-            blockingStub.unsetProperty(request);
-            assertTrue(STRING_MAP2.get(PROPERTY_TEST_KEY) == null);
-        } catch (Exception e) {
-            e.printStackTrace();
-        }
-    }
-
-    /**
-     * Initialization before start testing gRPC northbound component config service.
-     */
-    @BeforeClass
-    public static void beforeClass() throws InstantiationException, IllegalAccessException, IOException {
-        GrpcNbComponentConfigService componentConfigService = new GrpcNbComponentConfigService();
-        componentConfigService.componentConfigService = MOCK_COMPONENTCONFIG;
-        inprocessServer = componentConfigService.registerInProcessServer();
-        inprocessServer.start();
-
-        channel = InProcessChannelBuilder.forName("test").directExecutor()
-                // Channels are secure by default (via SSL/TLS). For the example we disable TLS to avoid
-                // needing certificates.
-                .usePlaintext(true).build();
-        blockingStub = ComponentConfigServiceGrpc.newBlockingStub(channel);
-        populateComponentNames();
-    }
-
-    /**
-     * Finalization after test gRPC northbound component config service.
-     */
-    @AfterClass
-    public static void afterClass() {
-
-        channel.shutdownNow();
-        inprocessServer.stop();
-    }
-
-    private static class MockComponentConfigService implements ComponentConfigService {
-
-        MockComponentConfigService() {
-        }
-
-        @Override
-        public Set<String> getComponentNames() {
-            return componentNames;
-        }
-
-        @Override
-        public void registerProperties(Class<?> componentClass) {
-            PROPERTY_MAP.put(componentClass.getName(), C1);
-        }
-
-        @Override
-        public void unregisterProperties(Class<?> componentClass, boolean clear) {
-            PROPERTY_MAP1.remove(componentClass.getName());
-        }
-
-        @Override
-        public Set<ConfigProperty> getProperties(String componentName) {
-            return ImmutableSet.of(C1, C2);
-        }
-
-        @Override
-        public void setProperty(String componentName, String name, String value) {
-            STRING_MAP.put(componentName + "#" + name, value);
-        }
-
-        @Override
-        public void preSetProperty(String componentName, String name, String value) {
-            STRING_MAP1.put(componentName + "#" + name, value);
-        }
-
-        @Override
-        public void unsetProperty(String componentName, String name) {
-            STRING_MAP2.remove(componentName + "#" + name);
-        }
-
-        @Override
-        public ConfigProperty getProperty(String componentName, String attribute) {
-            return null;
-        }
-    }
-}
diff --git a/graveyard/protobuf-dead/services/nb/src/test/java/org/onosproject/incubator/protobuf/services/nb/GrpcNbHostServiceTest.java b/graveyard/protobuf-dead/services/nb/src/test/java/org/onosproject/incubator/protobuf/services/nb/GrpcNbHostServiceTest.java
deleted file mode 100644
index 62e5cfa..0000000
--- a/graveyard/protobuf-dead/services/nb/src/test/java/org/onosproject/incubator/protobuf/services/nb/GrpcNbHostServiceTest.java
+++ /dev/null
@@ -1,435 +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.
-*/
-
-package org.onosproject.incubator.protobuf.services.nb;
-
-import com.google.common.collect.ImmutableSet;
-import io.grpc.BindableService;
-import io.grpc.inprocess.InProcessChannelBuilder;
-import org.junit.AfterClass;
-import org.junit.BeforeClass;
-import org.junit.Test;
-import io.grpc.ManagedChannel;
-import org.onlab.packet.IpAddress;
-import org.onlab.packet.MacAddress;
-import org.onlab.packet.VlanId;
-import org.onosproject.grpc.net.models.HostProtoOuterClass;
-import org.onosproject.incubator.protobuf.models.net.HostProtoTranslator;
-import org.onosproject.incubator.protobuf.models.net.HostIdProtoTranslator;
-import org.onosproject.incubator.protobuf.models.net.ConnectPointProtoTranslator;
-import org.onosproject.grpc.nb.net.host.HostServiceGrpc.HostServiceBlockingStub;
-import org.onosproject.net.ConnectPoint;
-import org.onosproject.net.DefaultHost;
-import org.onosproject.net.DeviceId;
-import org.onosproject.net.Host;
-import org.onosproject.net.HostId;
-import org.onosproject.net.HostLocation;
-import org.onosproject.net.PortNumber;
-import org.onosproject.net.host.HostListener;
-import org.onosproject.net.host.HostService;
-
-import org.onosproject.grpc.nb.net.host.HostServiceGrpc;
-import org.onosproject.net.provider.ProviderId;
-import org.slf4j.Logger;
-
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
-import java.util.stream.Collectors;
-
-import static org.junit.Assert.assertTrue;
-import static org.onosproject.grpc.nb.net.host.HostServiceNb.*;
-import static org.slf4j.LoggerFactory.getLogger;
-
-/**
- * Unit tests of gRPC northbound host service.
- */
-public class GrpcNbHostServiceTest {
-    private final Logger log = getLogger(getClass());
-
-    private static InProcessServer<BindableService> inprocessServer;
-    private static HostServiceBlockingStub blockingStub;
-    private static ManagedChannel channel;
-    private static final HostService MOCK_HOST = new MockHostService();
-    private static List<Host> allHosts = new ArrayList<>();
-    private static Host h1;
-    private static HostId id1;
-    private static IpAddress ip1;
-    private static MacAddress mac1;
-    private static DeviceId deviceId;
-    private static ConnectPoint c1;
-    private static boolean started = false;
-    private static boolean stopped = false;
-    private static boolean requestMac = false;
-
-    public GrpcNbHostServiceTest() {}
-
-    private static void populateHosts() {
-        ip1 = IpAddress.valueOf("10.1.1.1");
-        IpAddress ip2 = IpAddress.valueOf("10.1.1.2");
-        IpAddress ip3 = IpAddress.valueOf("10.1.1.3");
-        mac1 = MacAddress.valueOf("67:11:23:45:87:11");
-        MacAddress mac2 = MacAddress.valueOf("67:11:23:45:87:12");
-        MacAddress mac3 = MacAddress.valueOf("67:11:23:45:87:13");
-        id1 = HostId.hostId(mac1);
-        HostId id2 = HostId.hostId(mac2);
-        HostId id3 = HostId.hostId(mac3);
-        deviceId = DeviceId.deviceId("test");
-
-        c1 = new ConnectPoint(deviceId, PortNumber.portNumber(101));
-        HostLocation hostLocation1 = new HostLocation(deviceId, PortNumber.portNumber(101), 0);
-        HostLocation hostLocation2 = new HostLocation(deviceId, PortNumber.portNumber(102), 0);
-        HostLocation hostLocation3 = new HostLocation(deviceId, PortNumber.portNumber(103), 0);
-
-        h1 = new DefaultHost(ProviderId.NONE, id1, mac1, VlanId.NONE,
-                             hostLocation1, ImmutableSet.of(ip1));
-        allHosts.add(h1);
-        allHosts.add(new DefaultHost(ProviderId.NONE, id2, mac2, VlanId.NONE,
-                                     hostLocation2, ImmutableSet.of(ip2)));
-        allHosts.add(new DefaultHost(ProviderId.NONE, id3, mac3, VlanId.NONE,
-                                     hostLocation3, ImmutableSet.of(ip3)));
-    }
-
-    /**
-     * Tests gRPC getComponentNames interface.
-     */
-    @Test
-    public void testGetHostCount() throws InterruptedException {
-        getHostCountRequest request = getHostCountRequest.getDefaultInstance();
-        getHostCountReply reply;
-
-        try {
-            reply = blockingStub.getHostCount(request);
-            assertTrue(allHosts.size() == reply.getHostCount());
-        } catch (Exception e) {
-            log.error("Get host count error! Exception={}", e.toString());
-        }
-    }
-
-    /**
-     * Tests gRPC getComponentNames interface.
-     */
-    @Test
-    public void testGetHosts() throws InterruptedException {
-        getHostsRequest request = getHostsRequest.getDefaultInstance();
-        getHostsReply reply;
-
-        try {
-            reply = blockingStub.getHosts(request);
-            Set<Host> actualHosts = new HashSet<>();
-            for (HostProtoOuterClass.HostProto host : reply.getHostList()) {
-                actualHosts.add(HostProtoTranslator.translate(host));
-            }
-
-            Set<Host> expectedHosts = new HashSet<>();
-            for (Host h : allHosts) {
-                expectedHosts.add(h);
-            }
-            assertTrue(actualHosts.equals(expectedHosts));
-        } catch (Exception e) {
-            log.error("Get all hosts error! Exception={}", e.toString());
-        }
-    }
-
-    /**
-     * Tests gRPC getHost interface.
-     */
-    @Test
-    public void testGetHost() throws InterruptedException {
-        getHostRequest request = getHostRequest.newBuilder().setHostId(HostIdProtoTranslator.translate(id1)).build();
-        getHostReply reply;
-
-        try {
-            reply = blockingStub.getHost(request);
-            assertTrue(HostProtoTranslator.translate(reply.getHost()).equals(h1));
-        } catch (Exception e) {
-            log.error("Get host with hostId error! Exception={}", e.toString());
-        }
-    }
-
-    /**
-     * Tests gRPC getHostsByVlan interface.
-     */
-    @Test
-    public void testGetHostsByVlan() throws InterruptedException {
-        getHostsByVlanRequest request = getHostsByVlanRequest.newBuilder().setVlanId(VlanId.NONE.toString()).build();
-        getHostsByVlanReply reply;
-
-        try {
-            reply = blockingStub.getHostsByVlan(request);
-
-            Set<Host> actualHosts = new HashSet<>();
-            for (HostProtoOuterClass.HostProto host : reply.getHostList()) {
-                actualHosts.add(HostProtoTranslator.translate(host));
-            }
-
-            Set<Host> expectedHosts = new HashSet<>();
-            for (Host h : allHosts) {
-                expectedHosts.add(h);
-            }
-            assertTrue(actualHosts.equals(expectedHosts));
-        } catch (Exception e) {
-            log.error("Get hosts that belong to the specified VLAN error! Exception={}", e.toString());
-        }
-    }
-
-    /**
-     * Tests gRPC getHostsByMac interface.
-     */
-    @Test
-    public void testGetHostsByMac() throws InterruptedException {
-        getHostsByMacRequest request = getHostsByMacRequest.newBuilder().setMac(mac1.toString()).build();
-        getHostsByMacReply reply;
-
-        try {
-            reply = blockingStub.getHostsByMac(request);
-
-            Set<Host> actualHosts = new HashSet<>();
-            for (HostProtoOuterClass.HostProto host : reply.getHostList()) {
-                actualHosts.add(HostProtoTranslator.translate(host));
-            }
-            Set<Host> expectedHosts = new HashSet<>();
-            expectedHosts.add(allHosts.get(0));
-            assertTrue(actualHosts.equals(expectedHosts));
-        } catch (Exception e) {
-            log.error("Get hosts that have the specified MAC address error! Exception={}", e.toString());
-        }
-    }
-
-    /**
-     * Tests gRPC getHostsByIp interface.
-     */
-    @Test
-    public void testGetHostsByIp() throws InterruptedException {
-        getHostsByIpRequest request = getHostsByIpRequest.newBuilder().setIpAddress(ip1.toString()).build();
-        getHostsByIpReply reply;
-
-        try {
-            reply = blockingStub.getHostsByIp(request);
-
-            Set<Host> actualHosts = new HashSet<>();
-            for (HostProtoOuterClass.HostProto host : reply.getHostList()) {
-                actualHosts.add(HostProtoTranslator.translate(host));
-            }
-
-            Set<Host> expectedHosts = new HashSet<>();
-            expectedHosts.add(allHosts.get(0));
-            assertTrue(actualHosts.equals(expectedHosts));
-        } catch (Exception e) {
-            log.error("Get hosts that have the specified IP address error! Exception={}", e.toString());
-        }
-    }
-
-    /**
-     * Tests gRPC getConnectedHosts interface.
-     */
-    @Test
-    public void testGetConnectedHosts() throws InterruptedException {
-        getConnectedHostsRequest request = getConnectedHostsRequest.newBuilder()
-                .setConnectPoint(ConnectPointProtoTranslator.translate(c1))
-                .build();
-        getConnectedHostsReply reply;
-
-        try {
-            reply = blockingStub.getConnectedHosts(request);
-
-            Set<Host> actualHosts = new HashSet<>();
-            for (HostProtoOuterClass.HostProto host : reply.getHostList()) {
-                actualHosts.add(HostProtoTranslator.translate(host));
-            }
-
-            Set<Host> expectedHosts = new HashSet<>();
-            expectedHosts.add(allHosts.get(0));
-            assertTrue(actualHosts.equals(expectedHosts));
-        } catch (Exception e) {
-            log.error("Get connected hosts with connect point error! Exception={}", e.toString());
-        }
-    }
-
-    /**
-     * Tests gRPC getConnectedHostsByDeviceId interface.
-     */
-    @Test
-    public void testGetConnectedHostsByDeviceId() throws InterruptedException {
-        getConnectedHostsRequest request = getConnectedHostsRequest.newBuilder()
-                .setDeviceId(deviceId.toString())
-                .build();
-        getConnectedHostsReply reply;
-
-        try {
-            reply = blockingStub.getConnectedHosts(request);
-
-            Set<Host> actualHosts = new HashSet<>();
-            for (HostProtoOuterClass.HostProto host : reply.getHostList()) {
-                actualHosts.add(HostProtoTranslator.translate(host));
-            }
-
-            Set<Host> expectedHosts = new HashSet<>();
-            for (Host h : allHosts) {
-                expectedHosts.add(h);
-            }
-            assertTrue(actualHosts.equals(expectedHosts));
-        } catch (Exception e) {
-            log.error("Get connected hosts with deviceId error! Exception={}", e.toString());
-        }
-    }
-
-    /**
-     * Tests gRPC startMonitoringIp interface.
-     */
-    @Test
-    public void testStartMonitoringIp() throws InterruptedException {
-        startMonitoringIpRequest request = startMonitoringIpRequest.newBuilder().setIpAddress(ip1.toString()).build();
-
-        try {
-            blockingStub.startMonitoringIp(request);
-            assertTrue(started);
-        } catch (Exception e) {
-            log.error("Start monitoring hosts with the given IP address error! Exception={}", e.toString());
-        }
-    }
-
-    /**
-     * Tests gRPC stopMonitoringIp interface.
-     */
-    @Test
-    public void testStopMonitoringIp() throws InterruptedException {
-        stopMonitoringIpRequest request = stopMonitoringIpRequest.newBuilder().setIpAddress(ip1.toString()).build();
-
-        try {
-            blockingStub.stopMonitoringIp(request);
-            assertTrue(stopped);
-        } catch (Exception e) {
-            log.error("Stop monitoring hosts with the given IP address error! Exception={}", e.toString());
-        }
-    }
-
-    /**
-     * Tests gRPC requestMac interface.
-     */
-    @Test
-    public void testRequestMac() throws InterruptedException {
-        requestMacRequest request = requestMacRequest.newBuilder().setIpAddress(ip1.toString()).build();
-
-        try {
-            blockingStub.requestMac(request);
-            assertTrue(requestMac);
-        } catch (Exception e) {
-            log.error("Resolve the MAC address for the given IP address error! Exception={}", e.toString());
-        }
-    }
-
-    /**
-     * Initialization before start testing gRPC northbound host service.
-     */
-    @BeforeClass
-    public static void beforeClass() throws InstantiationException, IllegalAccessException, IOException {
-        GrpcNbHostService hostService = new GrpcNbHostService();
-        hostService.hostService = MOCK_HOST;
-        inprocessServer = hostService.registerInProcessServer();
-
-        inprocessServer.start();
-        channel = InProcessChannelBuilder.forName("test").directExecutor()
-                // Channels are secure by default (via SSL/TLS). For the example we disable TLS to avoid
-                // needing certificates.
-                .usePlaintext(true).build();
-        blockingStub = HostServiceGrpc.newBlockingStub(channel);
-        populateHosts();
-    }
-
-    /**
-     * Finalization after test gRPC northbound host service.
-     */
-    @AfterClass
-    public static void afterClass() {
-
-        channel.shutdownNow();
-        inprocessServer.stop();
-    }
-
-    private static class MockHostService implements HostService {
-
-        MockHostService() {
-        }
-
-        @Override
-        public int getHostCount() {
-            return allHosts.size();
-        }
-
-        @Override
-        public Iterable<Host> getHosts() {
-            return allHosts;
-        }
-
-        @Override
-        public Host getHost(HostId hostId) {
-            return allHosts.stream().filter(h -> h.id().equals(hostId)).findFirst().get();
-        }
-
-        @Override
-        public Set<Host> getHostsByVlan(VlanId vlanId) {
-            return allHosts.stream().filter(h -> h.vlan().equals(vlanId)).collect(Collectors.toSet());
-        }
-
-        @Override
-        public Set<Host> getHostsByMac(MacAddress mac) {
-            return allHosts.stream().filter(h -> h.mac().equals(mac)).collect(Collectors.toSet());
-        }
-
-        @Override
-        public Set<Host> getHostsByIp(IpAddress ip) {
-            return allHosts.stream().filter(h -> h.ipAddresses().contains(ip)).collect(Collectors.toSet());
-        }
-
-        @Override
-        public Set<Host> getConnectedHosts(ConnectPoint connectPoint) {
-            return allHosts.stream().filter(h -> h.location().deviceId().equals(connectPoint.deviceId())
-                    && h.location().port().equals(connectPoint.port()))
-                    .collect(Collectors.toSet());
-        }
-
-        @Override
-        public Set<Host> getConnectedHosts(DeviceId deviceId) {
-            return allHosts.stream().filter(h -> h.location().deviceId().equals(deviceId)).collect(Collectors.toSet());
-        }
-
-        @Override
-        public void startMonitoringIp(IpAddress ip) {
-            started = true;
-        }
-
-        @Override
-        public void stopMonitoringIp(IpAddress ip) {
-            stopped = true;
-        }
-
-        @Override
-        public void requestMac(IpAddress ip) {
-            requestMac = true;
-        }
-
-        @Override
-        public void addListener(HostListener listener) {
-        }
-
-        @Override
-        public void removeListener(HostListener listener) {
-        }
-    }
-}
diff --git a/graveyard/protobuf-dead/services/nb/src/test/java/org/onosproject/incubator/protobuf/services/nb/GrpcNbLinkServiceTest.java b/graveyard/protobuf-dead/services/nb/src/test/java/org/onosproject/incubator/protobuf/services/nb/GrpcNbLinkServiceTest.java
deleted file mode 100644
index d45b985..0000000
--- a/graveyard/protobuf-dead/services/nb/src/test/java/org/onosproject/incubator/protobuf/services/nb/GrpcNbLinkServiceTest.java
+++ /dev/null
@@ -1,444 +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.
-*/
-
-package org.onosproject.incubator.protobuf.services.nb;
-
-import com.google.common.collect.FluentIterable;
-import com.google.common.collect.ImmutableList;
-import com.google.common.collect.ImmutableSet;
-import io.grpc.BindableService;
-import io.grpc.ManagedChannel;
-import io.grpc.inprocess.InProcessChannelBuilder;
-import org.junit.AfterClass;
-import org.junit.BeforeClass;
-import org.junit.Test;
-import org.onosproject.grpc.nb.net.link.LinkServiceGrpc;
-import org.onosproject.grpc.nb.net.link.LinkServiceGrpc.LinkServiceBlockingStub;
-import org.onosproject.grpc.nb.net.link.LinkServiceNb;
-import org.onosproject.grpc.net.models.LinkProtoOuterClass;
-import org.onosproject.incubator.protobuf.models.net.ConnectPointProtoTranslator;
-import org.onosproject.incubator.protobuf.models.net.LinkProtoTranslator;
-import org.onosproject.net.ConnectPoint;
-import org.onosproject.net.DefaultLink;
-import org.onosproject.net.DeviceId;
-import org.onosproject.net.Link;
-import org.onosproject.net.PortNumber;
-import org.onosproject.net.link.LinkService;
-import org.onosproject.net.provider.ProviderId;
-
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
-
-import static org.junit.Assert.assertTrue;
-import static org.onosproject.net.DeviceId.deviceId;
-import static org.onosproject.net.PortNumber.portNumber;
-
-public class GrpcNbLinkServiceTest {
-    private static InProcessServer<BindableService> inprocessServer;
-    private static ManagedChannel channel;
-    private static LinkServiceBlockingStub blockingStub;
-
-    private static final String D1 = "d1";
-    private static final String D2 = "d2";
-    private static final String D3 = "d3";
-    private static final String D4 = "d4";
-    private static final String D5 = "d5";
-    private static final String D6 = "d6";
-    private static final String D7 = "d7";
-    private static final String D8 = "d8";
-    private static final String D9 = "d9";
-
-    private static final String[][] LINK_CONNECT_DATA = {
-            {D1, "12", D2, "21"},
-            {D2, "23", D3, "32"},
-            {D4, "41", D1, "14"},
-            {D5, "51", D1, "15"},
-            {D6, "61", D1, "16"},
-            {D7, "73", D3, "37"},
-            {D8, "83", D3, "38"},
-            {D9, "93", D3, "39"},
-    };
-
-    private static final DeviceId DEVID_1 = deviceId(D1);
-    private static final PortNumber PORT_14 = portNumber("14");
-
-    private static final DeviceId DEVID_4 = deviceId(D4);
-    private static final PortNumber PORT_41 = portNumber("41");
-
-    private static final DeviceId DEVID_3 = deviceId(D3);
-    private static final PortNumber PORT_32 = portNumber("32");
-
-    private static final ConnectPoint DEVID_1_14 = new ConnectPoint(DEVID_1, PORT_14);
-    private static final ConnectPoint DEVID_4_41 = new ConnectPoint(DEVID_4, PORT_41);
-
-    private static final ProviderId PID = new ProviderId("Test", "Test");
-
-    private static List<Link> allLinks = new ArrayList<Link>();
-
-    private static final LinkService MOCK_LINK = new MockLinkService();
-
-    /**
-     * Creates a list of links.
-     *
-     */
-    private static void populateLinks() {
-        for (String[] linkPair : LINK_CONNECT_DATA) {
-            allLinks.addAll(makeLinkPair(linkPair));
-        }
-    }
-
-    /**
-     * Synthesizes a pair of unidirectional links between two devices. The
-     * string array should be of the form:
-     * <pre>
-     *     { "device-A-id", "device-A-port", "device-B-id", "device-B-port" }
-     * </pre>
-     *
-     * @param linkPairData device ids and ports
-     * @return pair of synthesized links
-     */
-    private static List<Link> makeLinkPair(String[] linkPairData) {
-        DeviceId devA = deviceId(linkPairData[0]);
-        PortNumber portA = portNumber(linkPairData[1]);
-
-        DeviceId devB = deviceId(linkPairData[2]);
-        PortNumber portB = portNumber(linkPairData[3]);
-
-        Link linkA = DefaultLink.builder()
-                .providerId(PID)
-                .type(Link.Type.DIRECT)
-                .src(new ConnectPoint(devA, portA))
-                .dst(new ConnectPoint(devB, portB))
-                .build();
-
-        Link linkB = DefaultLink.builder()
-                .providerId(PID)
-                .type(Link.Type.DIRECT)
-                .src(new ConnectPoint(devB, portB))
-                .dst(new ConnectPoint(devA, portA))
-                .build();
-
-        return ImmutableList.of(linkA, linkB);
-    }
-
-    public GrpcNbLinkServiceTest() {
-    }
-
-    @Test
-    public void testGetLinkCount() throws InterruptedException {
-        LinkServiceNb.getLinkCountRequest request = LinkServiceNb.getLinkCountRequest.getDefaultInstance();
-        LinkServiceNb.getLinkCountReply response;
-
-        try {
-            response = blockingStub.getLinkCount(request);
-            int linkCount = response.getLinkCount();
-            assertTrue(allLinks.size() == linkCount);
-        } catch (Exception e) {
-            e.printStackTrace();
-        }
-    }
-
-    @Test
-    public void testGetLink() throws InterruptedException {
-        LinkServiceNb.getLinkRequest request = LinkServiceNb.getLinkRequest.newBuilder()
-                .setSrc(ConnectPointProtoTranslator.translate(DEVID_1_14))
-                .setDst(ConnectPointProtoTranslator.translate(DEVID_4_41))
-                .build();
-        LinkServiceNb.getLinkReply response;
-
-        try {
-            response = blockingStub.getLink(request);
-            LinkProtoOuterClass.LinkProto link = response.getLink();
-            assertTrue(LinkProtoTranslator.translate(allLinks.get(5)).equals(link));
-        } catch (Exception e) {
-            e.printStackTrace();
-        }
-    }
-
-    @Test
-    public void testGetLinks() throws InterruptedException {
-        LinkServiceNb.getLinksRequest request = LinkServiceNb.getLinksRequest.newBuilder()
-                .setConnectPoint(ConnectPointProtoTranslator.translate(DEVID_1_14))
-                .build();
-        LinkServiceNb.getLinksReply response;
-
-        try {
-            response = blockingStub.getLinks(request);
-
-            Set<Link> actualLinks = new HashSet<Link>();
-            for (LinkProtoOuterClass.LinkProto link : response.getLinkList()) {
-                actualLinks.add(LinkProtoTranslator.translate(link));
-            }
-            Set<Link> expectedLinks = new HashSet<Link>();
-            expectedLinks.add(allLinks.get(4));
-            expectedLinks.add(allLinks.get(5));
-
-            assertTrue(expectedLinks.equals(actualLinks));
-        } catch (Exception e) {
-            e.printStackTrace();
-        }
-    }
-
-    @Test
-    public void testGetActiveLinks() throws InterruptedException {
-        LinkServiceNb.getActiveLinksRequest request = LinkServiceNb.getActiveLinksRequest.getDefaultInstance();
-        LinkServiceNb.getActiveLinksReply response;
-
-        try {
-            response = blockingStub.getActiveLinks(request);
-
-            Set<Link> actualLinks = new HashSet<Link>();
-            for (LinkProtoOuterClass.LinkProto link : response.getLinkList()) {
-                actualLinks.add(LinkProtoTranslator.translate(link));
-            }
-
-            Set<Link> expectedLinks = new HashSet<Link>(allLinks);
-            assertTrue((expectedLinks).equals(actualLinks));
-        } catch (Exception e) {
-            e.printStackTrace();
-        }
-    }
-
-    @Test
-    public void testGetDeviceLinks() throws InterruptedException {
-        LinkServiceNb.getDeviceLinksRequest request = LinkServiceNb.getDeviceLinksRequest.newBuilder()
-                .setDeviceId(D1)
-                .build();
-        LinkServiceNb.getDeviceLinksReply response;
-
-        try {
-            response = blockingStub.getDeviceLinks(request);
-
-            Set<Link> actualLinks = new HashSet<Link>();
-            for (LinkProtoOuterClass.LinkProto link : response.getLinkList()) {
-                actualLinks.add(LinkProtoTranslator.translate(link));
-            }
-
-            Set<Link> expectedLinks = new HashSet<Link>();
-            expectedLinks.add(allLinks.get(4));
-            expectedLinks.add(allLinks.get(5));
-            expectedLinks.add(allLinks.get(6));
-            expectedLinks.add(allLinks.get(7));
-            expectedLinks.add(allLinks.get(8));
-            expectedLinks.add(allLinks.get(9));
-            expectedLinks.add(allLinks.get(0));
-            expectedLinks.add(allLinks.get(1));
-
-            assertTrue((expectedLinks).equals(actualLinks));
-        } catch (Exception e) {
-            e.printStackTrace();
-        }
-    }
-
-    @Test
-    public void testGetDeviceEgressLinks() throws InterruptedException {
-        LinkServiceNb.getDeviceEgressLinksRequest request = LinkServiceNb.getDeviceEgressLinksRequest.newBuilder()
-                .setDeviceId(D1)
-                .build();
-        LinkServiceNb.getDeviceEgressLinksReply response;
-
-        try {
-            response = blockingStub.getDeviceEgressLinks(request);
-
-            Set<Link> actualLinks = new HashSet<Link>();
-            for (LinkProtoOuterClass.LinkProto link : response.getLinkList()) {
-                actualLinks.add(LinkProtoTranslator.translate(link));
-            }
-            Set<Link> expectedLinks = new HashSet<Link>();
-            expectedLinks.add(allLinks.get(0));
-            expectedLinks.add(allLinks.get(5));
-            expectedLinks.add(allLinks.get(7));
-            expectedLinks.add(allLinks.get(9));
-
-            assertTrue((expectedLinks).equals(actualLinks));
-        } catch (Exception e) {
-            e.printStackTrace();
-        }
-    }
-
-    @Test
-    public void testGetDeviceIngressLinks() throws InterruptedException {
-        LinkServiceNb.getDeviceIngressLinksRequest request = LinkServiceNb.getDeviceIngressLinksRequest.newBuilder()
-                .setDeviceId(D1)
-                .build();
-        LinkServiceNb.getDeviceIngressLinksReply response;
-
-        try {
-            response = blockingStub.getDeviceIngressLinks(request);
-
-            Set<Link> actualLinks = new HashSet<Link>();
-            for (LinkProtoOuterClass.LinkProto link : response.getLinkList()) {
-                actualLinks.add(LinkProtoTranslator.translate(link));
-            }
-
-            Set<Link> expectedLinks = new HashSet<Link>();
-            expectedLinks.add(allLinks.get(1));
-            expectedLinks.add(allLinks.get(4));
-            expectedLinks.add(allLinks.get(6));
-            expectedLinks.add(allLinks.get(8));
-
-            assertTrue((expectedLinks).equals(actualLinks));
-        } catch (Exception e) {
-            e.printStackTrace();
-        }
-    }
-
-    @Test
-    public void testGetEgressLinks() throws InterruptedException {
-        LinkServiceNb.getEgressLinksRequest request = LinkServiceNb.getEgressLinksRequest.newBuilder()
-                .setConnectPoint(ConnectPointProtoTranslator.translate(DEVID_1_14))
-                .build();
-        LinkServiceNb.getEgressLinksReply response;
-
-        try {
-            response = blockingStub.getEgressLinks(request);
-
-            Set<Link> actualLinks = new HashSet<Link>();
-            for (LinkProtoOuterClass.LinkProto link : response.getLinkList()) {
-                actualLinks.add(LinkProtoTranslator.translate(link));
-            }
-            Set<Link> expectedLinks = new HashSet<Link>();
-            expectedLinks.add(allLinks.get(5));
-
-            assertTrue((expectedLinks).equals(actualLinks));
-        } catch (Exception e) {
-            e.printStackTrace();
-        }
-    }
-
-    @Test
-    public void testGetIngressLinks() throws InterruptedException {
-        LinkServiceNb.getIngressLinksRequest request = LinkServiceNb.getIngressLinksRequest.newBuilder()
-                .setConnectPoint(ConnectPointProtoTranslator.translate(DEVID_1_14))
-                .build();
-        LinkServiceNb.getIngressLinksReply response;
-
-        try {
-            response = blockingStub.getIngressLinks(request);
-
-            Set<Link> actualLinks = new HashSet<Link>();
-            for (LinkProtoOuterClass.LinkProto link : response.getLinkList()) {
-                actualLinks.add(LinkProtoTranslator.translate(link));
-            }
-            Set<Link> expectedLinks = new HashSet<Link>();
-            expectedLinks.add(allLinks.get(4));
-
-            assertTrue((expectedLinks).equals(actualLinks));
-        } catch (Exception e) {
-            e.printStackTrace();
-        }
-    }
-
-
-    @BeforeClass
-    public static void beforeClass() throws InstantiationException, IllegalAccessException, IOException {
-        GrpcNbLinkService linkService = new GrpcNbLinkService();
-        linkService.linkService = MOCK_LINK;
-        inprocessServer = linkService.registerInProcessServer();
-        inprocessServer.start();
-
-        channel = InProcessChannelBuilder.forName("test").directExecutor()
-                // Channels are secure by default (via SSL/TLS). For the example we disable TLS to avoid
-                // needing certificates.
-                .usePlaintext(true).build();
-        blockingStub = LinkServiceGrpc.newBlockingStub(channel);
-
-        populateLinks();
-    }
-
-    @AfterClass
-    public static void afterClass() {
-        channel.shutdownNow();
-
-        inprocessServer.stop();
-    }
-
-    private static class MockLinkService implements LinkService {
-        MockLinkService() {
-        }
-
-        @Override
-        public int getLinkCount() {
-            return allLinks.size();
-        }
-
-        @Override
-        public Iterable<Link> getLinks() {
-            return ImmutableSet.copyOf(allLinks);
-        }
-
-        @Override
-        public Iterable<Link> getActiveLinks() {
-            return FluentIterable.from(getLinks())
-                    .filter(input -> input.state() == Link.State.ACTIVE);
-        }
-
-        @Override
-        public Set<Link> getDeviceLinks(DeviceId deviceId) {
-            return FluentIterable.from(getLinks())
-                    .filter(input -> (input.src().deviceId().equals(deviceId)) ||
-                            (input.dst().deviceId().equals(deviceId))).toSet();
-        }
-
-        @Override
-        public Set<Link> getDeviceEgressLinks(DeviceId deviceId) {
-            return FluentIterable.from(getLinks())
-                    .filter(input -> (input.src().deviceId().equals(deviceId))).toSet();
-        }
-
-        @Override
-        public Set<Link> getDeviceIngressLinks(DeviceId deviceId) {
-            return FluentIterable.from(getLinks())
-                    .filter(input -> (input.dst().deviceId().equals(deviceId))).toSet();
-        }
-
-        @Override
-        public Set<Link> getLinks(ConnectPoint connectPoint) {
-            return FluentIterable.from(getLinks())
-                    .filter(input -> (input.src().equals(connectPoint)) || (input.dst().equals(connectPoint))).toSet();
-        }
-
-        @Override
-        public Set<Link> getEgressLinks(ConnectPoint connectPoint) {
-            return FluentIterable.from(getLinks())
-                    .filter(input -> (input.src().equals(connectPoint))).toSet();
-        }
-
-        @Override
-        public Set<Link> getIngressLinks(ConnectPoint connectPoint) {
-            return FluentIterable.from(getLinks())
-                    .filter(input -> (input.dst().equals(connectPoint))).toSet();
-        }
-
-        @Override
-        public Link getLink(ConnectPoint src, ConnectPoint dst) {
-            return FluentIterable.from(getLinks())
-                    .filter(input -> (input.src().equals(src)) && (input.dst().equals(dst)))
-                    .first().get();
-        }
-
-        @Override
-        public void addListener(org.onosproject.net.link.LinkListener listener) {
-        }
-
-        @Override
-        public void removeListener(org.onosproject.net.link.LinkListener listener) {
-        }
-    }
-}
\ No newline at end of file
diff --git a/graveyard/protobuf-dead/services/nb/src/test/java/org/onosproject/incubator/protobuf/services/nb/GrpcNbMastershipServiceTest.java b/graveyard/protobuf-dead/services/nb/src/test/java/org/onosproject/incubator/protobuf/services/nb/GrpcNbMastershipServiceTest.java
deleted file mode 100644
index 88c65a2..0000000
--- a/graveyard/protobuf-dead/services/nb/src/test/java/org/onosproject/incubator/protobuf/services/nb/GrpcNbMastershipServiceTest.java
+++ /dev/null
@@ -1,215 +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.
- */
-package org.onosproject.incubator.protobuf.services.nb;
-
-import com.google.common.collect.ImmutableList;
-import com.google.common.collect.Maps;
-import io.grpc.BindableService;
-import io.grpc.ManagedChannel;
-import io.grpc.inprocess.InProcessChannelBuilder;
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Test;
-import org.onosproject.cluster.NodeId;
-import org.onosproject.cluster.RoleInfo;
-import org.onosproject.grpc.nb.mastership.MastershipServiceGrpc;
-import org.onosproject.grpc.nb.mastership.MastershipServiceNb.getLocalRoleReply;
-import org.onosproject.grpc.nb.mastership.MastershipServiceNb.getLocalRoleRequest;
-import org.onosproject.grpc.nb.mastership.MastershipServiceNb.getMasterForReply;
-import org.onosproject.grpc.nb.mastership.MastershipServiceNb.getMasterForRequest;
-import org.onosproject.grpc.nb.mastership.MastershipServiceNb.getNodesForReply;
-import org.onosproject.grpc.nb.mastership.MastershipServiceNb.getNodesForRequest;
-import org.onosproject.grpc.nb.mastership.MastershipServiceNb.requestRoleForSyncReply;
-import org.onosproject.grpc.nb.mastership.MastershipServiceNb.requestRoleForSyncRequest;
-import org.onosproject.incubator.protobuf.models.cluster.NodeIdProtoTranslator;
-import org.onosproject.incubator.protobuf.models.net.MastershipRoleProtoTranslator;
-import org.onosproject.mastership.MastershipService;
-import org.onosproject.mastership.MastershipServiceAdapter;
-import org.onosproject.net.DeviceId;
-import org.onosproject.net.MastershipRole;
-
-import java.io.IOException;
-import java.util.Map;
-import java.util.Optional;
-
-import static org.junit.Assert.assertEquals;
-
-/**
- * Unit tests for mastership gRPC NB service.
- */
-public class GrpcNbMastershipServiceTest {
-
-    private static InProcessServer<BindableService> inprocessServer;
-    private static MastershipServiceGrpc.MastershipServiceBlockingStub blockingStub;
-    private static ManagedChannel channel;
-
-    private final MastershipService mastershipService = new MockMastershipService();
-
-    private Map<DeviceId, MastershipRole> mastershipMap = Maps.newHashMap();
-    private Map<DeviceId, NodeId> nodeIdMap = Maps.newHashMap();
-    private Map<DeviceId, RoleInfo> roleInfoMap = Maps.newHashMap();
-
-    private static final String DEVICE_ID_1 = "1";
-    private static final String DEVICE_ID_2 = "2";
-    private static final String DEVICE_ID_3 = "3";
-
-    private DeviceId did1 = DeviceId.deviceId(DEVICE_ID_1);
-    private DeviceId did2 = DeviceId.deviceId(DEVICE_ID_2);
-    private DeviceId did3 = DeviceId.deviceId(DEVICE_ID_3);
-
-    private NodeId nid1 = NodeId.nodeId("1");
-    private NodeId nid2 = NodeId.nodeId("2");
-    private NodeId nid3 = NodeId.nodeId("3");
-
-    /**
-     * Initializes the test environment.
-     */
-    @Before
-    public void setUp() throws IllegalAccessException, IOException, InstantiationException {
-        GrpcNbMastershipService grpcMastershipService = new GrpcNbMastershipService();
-        grpcMastershipService.mastershipService = mastershipService;
-        inprocessServer = grpcMastershipService.registerInProcessServer();
-        inprocessServer.start();
-
-        channel = InProcessChannelBuilder.forName("test").directExecutor()
-                .usePlaintext(true).build();
-
-        blockingStub = MastershipServiceGrpc.newBlockingStub(channel);
-
-        initMastershipMap();
-        initNodeIdMap();
-        initRoleInfoMap();
-    }
-
-    /**
-     * Finalizes the test setup.
-     */
-    @After
-    public void tearDown() {
-        channel.shutdownNow();
-        inprocessServer.stop();
-    }
-
-    private void initMastershipMap() {
-        mastershipMap.put(did1, MastershipRole.MASTER);
-        mastershipMap.put(did2, MastershipRole.STANDBY);
-        mastershipMap.put(did3, MastershipRole.NONE);
-    }
-
-    private void initNodeIdMap() {
-        nodeIdMap.put(did1, nid1);
-        nodeIdMap.put(did2, nid2);
-        nodeIdMap.put(did3, nid3);
-    }
-
-    private void initRoleInfoMap() {
-        RoleInfo roleInfo1 = new RoleInfo(nid1, ImmutableList.of(nid2, nid3));
-        RoleInfo roleInfo2 = new RoleInfo(nid2, ImmutableList.of(nid1, nid3));
-        RoleInfo roleInfo3 = new RoleInfo(nid3, ImmutableList.of(nid2, nid3));
-        roleInfoMap.put(did1, roleInfo1);
-        roleInfoMap.put(did2, roleInfo2);
-        roleInfoMap.put(did3, roleInfo3);
-    }
-
-    /**
-     * Tests the invocation result of getLocalRole method.
-     *
-     * @throws InterruptedException
-     */
-    @Test
-    public void testGetLocalRole() throws InterruptedException {
-        getLocalRoleRequest request = getLocalRoleRequest.newBuilder()
-                .setDeviceId(DEVICE_ID_1)
-                .build();
-        getLocalRoleReply reply;
-
-        reply = blockingStub.getLocalRole(request);
-        assertEquals(Optional.of(MastershipRole.MASTER),
-                MastershipRoleProtoTranslator.translate(reply.getMastershipRole()));
-    }
-
-    /**
-     * Tests the invocation result of requestRoleForSync method.
-     *
-     * @throws InterruptedException
-     */
-    @Test
-    public void testRequestRoleForSync() throws InterruptedException {
-        requestRoleForSyncRequest request = requestRoleForSyncRequest.newBuilder()
-                .setDeviceId(DEVICE_ID_2)
-                .build();
-        requestRoleForSyncReply reply;
-
-        reply = blockingStub.requestRoleForSync(request);
-        assertEquals(Optional.of(MastershipRole.STANDBY),
-                MastershipRoleProtoTranslator.translate(reply.getMastershipRole()));
-    }
-
-    /**
-     * Tests the invocation result of getMasterFor method.
-     *
-     * @throws InterruptedException
-     */
-    @Test
-    public void testGetMasterFor() {
-        getMasterForRequest request = getMasterForRequest.newBuilder()
-                .setDeviceId(DEVICE_ID_1)
-                .build();
-        getMasterForReply reply;
-
-        reply = blockingStub.getMasterFor(request);
-        assertEquals(nid1, NodeIdProtoTranslator.translate(reply.getNodeId()));
-    }
-
-    /**
-     * Tests the invocation result of getNodesFor method.
-     *
-     * @throws InterruptedException
-     */
-    @Test
-    public void testGetNodesFor() {
-        getNodesForRequest request = getNodesForRequest.newBuilder()
-                .setDeviceId(DEVICE_ID_3)
-                .build();
-        getNodesForReply reply;
-
-        reply = blockingStub.getNodesFor(request);
-        assertEquals(nid3, NodeIdProtoTranslator.translate(reply.getRoleInfo().getMaster()));
-    }
-
-    private class MockMastershipService extends MastershipServiceAdapter {
-
-        @Override
-        public MastershipRole getLocalRole(DeviceId deviceId) {
-            return mastershipMap.get(deviceId);
-        }
-
-        @Override
-        public MastershipRole requestRoleForSync(DeviceId deviceId) {
-            return mastershipMap.get(deviceId);
-        }
-
-        @Override
-        public NodeId getMasterFor(DeviceId deviceId) {
-            return nodeIdMap.get(deviceId);
-        }
-
-        @Override
-        public RoleInfo getNodesFor(DeviceId deviceId) {
-            return roleInfoMap.get(deviceId);
-        }
-    }
-}
diff --git a/graveyard/protobuf-dead/services/nb/src/test/java/org/onosproject/incubator/protobuf/services/nb/GrpcNbMeterServiceTest.java b/graveyard/protobuf-dead/services/nb/src/test/java/org/onosproject/incubator/protobuf/services/nb/GrpcNbMeterServiceTest.java
deleted file mode 100644
index c9e7180..0000000
--- a/graveyard/protobuf-dead/services/nb/src/test/java/org/onosproject/incubator/protobuf/services/nb/GrpcNbMeterServiceTest.java
+++ /dev/null
@@ -1,355 +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.
-*/
-
-package org.onosproject.incubator.protobuf.services.nb;
-
-import io.grpc.BindableService;
-import io.grpc.ManagedChannel;
-import io.grpc.inprocess.InProcessChannelBuilder;
-import org.junit.AfterClass;
-import org.junit.BeforeClass;
-import org.junit.Test;
-import org.onosproject.core.ApplicationId;
-import org.onosproject.core.DefaultApplicationId;
-import org.onosproject.grpc.core.models.ApplicationIdProtoOuterClass;
-import org.onosproject.grpc.nb.net.meter.MeterServiceGrpc;
-import org.onosproject.grpc.nb.net.meter.MeterServiceNbProto;
-import org.onosproject.grpc.net.meter.models.BandProtoOuterClass;
-import org.onosproject.grpc.net.meter.models.MeterEnumsProto;
-import org.onosproject.grpc.net.meter.models.MeterProtoOuterClass;
-import org.onosproject.grpc.net.meter.models.MeterRequestProtoOuterClass;
-import org.onosproject.net.DeviceId;
-import org.onosproject.net.meter.Band;
-import org.onosproject.net.meter.DefaultBand;
-import org.onosproject.net.meter.Meter;
-import org.onosproject.net.meter.MeterCellId;
-import org.onosproject.net.meter.MeterId;
-import org.onosproject.net.meter.MeterListener;
-import org.onosproject.net.meter.MeterRequest;
-import org.onosproject.net.meter.MeterService;
-import org.onosproject.net.meter.MeterState;
-
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
-
-import static org.junit.Assert.assertTrue;
-
-
-public class GrpcNbMeterServiceTest {
-
-    private static InProcessServer<BindableService> inProcessServer;
-    private static ManagedChannel channel;
-    private static MeterServiceGrpc.MeterServiceBlockingStub blockingStub;
-
-    private static final MeterService MOCK_METER = new MockMeterService();
-
-    private static final DeviceId DEVICE_ID_1 = DeviceId.deviceId("d1");
-    private static final DeviceId DEVICE_ID_2 = DeviceId.deviceId("d2");
-    private static final DeviceId DEVICE_ID_3 = DeviceId.deviceId("d3");
-
-    private static final long METER_ID_1 = 1L;
-    private static final long METER_ID_2 = 2L;
-    private static final long METER_ID_3 = 3L;
-    private static final long METER_ID_4 = 4L;
-
-    private static final Meter METER_1 = new MockMeter(DEVICE_ID_1, 1, METER_ID_1, 1);
-    private static final Meter METER_2 = new MockMeter(DEVICE_ID_2, 1, METER_ID_2, 2);
-    private static final Meter METER_3 = new MockMeter(DEVICE_ID_3, 1, METER_ID_3, 3);
-    private static final Meter METER_4 = new MockMeter(DEVICE_ID_3, 1, METER_ID_4, 4);
-
-    private static Set<Meter> allMeters = new HashSet<>();
-
-    /**
-     * Create inProcessServer and bind grpcNbMeterService.
-     *
-     * @throws IllegalAccessException
-     * @throws IOException
-     * @throws InstantiationException
-     */
-    @BeforeClass
-    public static void setup() throws IllegalAccessException, IOException, InstantiationException {
-
-        GrpcNbMeterService grpcNbMeterService = new GrpcNbMeterService();
-        grpcNbMeterService.meterService = MOCK_METER;
-        inProcessServer = new InProcessServer(GrpcNbMeterService.class);
-        inProcessServer.addServiceToBind(grpcNbMeterService);
-
-        inProcessServer.start();
-        channel = InProcessChannelBuilder.forName("test").directExecutor()
-                // Channels are secure by default (via SSL/TLS). For the example we disable TLS to avoid
-                // needing certificates.
-                .usePlaintext(true).build();
-        blockingStub = MeterServiceGrpc.newBlockingStub(channel);
-
-        allMeters.add(METER_2);
-        allMeters.add(METER_3);
-        allMeters.add(METER_4);
-    }
-
-    @AfterClass
-    public static void down() {
-        channel.shutdown();
-
-        inProcessServer.stop();
-    }
-
-    @Test
-    public void testSubmit() {
-        MeterServiceNbProto.submitRequest request = MeterServiceNbProto.submitRequest.newBuilder()
-                .setMeter(MeterRequestProtoOuterClass.MeterRequestProto.newBuilder()
-                        .setDeviceId(DEVICE_ID_1.toString())
-                        .setApplicationId(ApplicationIdProtoOuterClass.ApplicationIdProto.newBuilder()
-                                .setId(METER_1.appId().id())
-                                .build())
-                        .setUnit(MeterEnumsProto.MeterUnitProto.KB_PER_SEC)
-                        .setIsBurst(false)
-                        .addBands(BandProtoOuterClass.BandProto.getDefaultInstance())
-                        .setType(MeterEnumsProto.MeterRequestTypeProto.ADD)
-                        .build())
-                .build();
-        MeterServiceNbProto.submitReply reply;
-
-        int size = allMeters.size();
-        reply = blockingStub.submit(request);
-        MeterProtoOuterClass.MeterProto meter = reply.getSubmitMeter();
-        assertTrue(allMeters.size() == (size + 1)
-                && meter.getDeviceId().equals(METER_1.deviceId().toString())
-                && meter.getApplicationId().getId() == METER_1.appId().id());
-
-    }
-
-    @Test
-    public void testWithdraw() {
-        MeterServiceNbProto.withdrawRequest request = MeterServiceNbProto.withdrawRequest.newBuilder()
-                .setMeter(MeterRequestProtoOuterClass.MeterRequestProto.newBuilder()
-                        .setDeviceId(DEVICE_ID_2.toString())
-                        .setApplicationId(ApplicationIdProtoOuterClass.ApplicationIdProto.newBuilder()
-                                .setId(1)
-                                .build())
-                        .setUnit(MeterEnumsProto.MeterUnitProto.KB_PER_SEC)
-                        .setIsBurst(false)
-                        .addBands(BandProtoOuterClass.BandProto.getDefaultInstance())
-                        .setType(MeterEnumsProto.MeterRequestTypeProto.REMOVE)
-                        .build())
-                .setMeterId(METER_ID_2)
-                .build();
-        MeterServiceNbProto.withdrawReply reply;
-
-        int size = allMeters.size();
-        reply = blockingStub.withdraw(request);
-        assertTrue(allMeters.size() == (size - 1));
-    }
-
-    @Test
-    public void testGetMeter() {
-        MeterServiceNbProto.getMeterRequest request = MeterServiceNbProto.getMeterRequest.newBuilder()
-                .setDeviceId(DEVICE_ID_3.toString())
-                .setMeterId(METER_ID_3)
-                .build();
-        MeterServiceNbProto.getMeterReply reply;
-
-        reply = blockingStub.getMeter(request);
-        MeterProtoOuterClass.MeterProto meter = reply.getMeter();
-        assertTrue(meter.getApplicationId().getId() == METER_3.appId().id()
-                && meter.getDeviceId().equals(DEVICE_ID_3.toString()));
-    }
-
-    @Test
-    public void testGetAllMeters() {
-        MeterServiceNbProto.getAllMetersRequest request = MeterServiceNbProto.getAllMetersRequest.getDefaultInstance();
-        MeterServiceNbProto.getAllMetersReply reply;
-
-        reply = blockingStub.getAllMeters(request);
-        assertTrue(reply.getMetersCount() == allMeters.size());
-
-    }
-
-    @Test
-    public void testGetMeters() {
-        MeterServiceNbProto.getMetersRequest request = MeterServiceNbProto.getMetersRequest.newBuilder()
-                .setDeviceId(DEVICE_ID_3.toString())
-                .build();
-        MeterServiceNbProto.getMetersReply reply;
-
-        reply = blockingStub.getMeters(request);
-        assertTrue(reply.getMetersCount() == 2);
-    }
-
-
-    /**
-     * A mock class of meter.
-     */
-    private static class MockMeter implements Meter {
-
-        final DeviceId deviceId;
-        final ApplicationId appId;
-        final MeterId meterId;
-        final long baseValue;
-        final List<Band> bandList;
-
-        public MockMeter(DeviceId deviceId, int appId, long meterId, int id) {
-            this.deviceId = deviceId;
-            this.appId = new DefaultApplicationId(appId, String.valueOf(appId));
-            this.baseValue = id * 200L;
-            this.meterId = MeterId.meterId(meterId);
-
-            Band band = DefaultBand.builder()
-                    .ofType(Band.Type.REMARK)
-                    .withRate(10)
-                    .dropPrecedence((short) 20)
-                    .burstSize(30).build();
-
-            this.bandList = new ArrayList<>();
-            this.bandList.add(band);
-        }
-
-        @Override
-        public DeviceId deviceId() {
-            return this.deviceId;
-        }
-
-        @Override
-        public MeterId id() {
-            return this.meterId;
-        }
-
-        @Override
-        public MeterCellId meterCellId() {
-            return this.id();
-        }
-
-        @Override
-        public ApplicationId appId() {
-            return this.appId;
-        }
-
-        @Override
-        public Unit unit() {
-            return Unit.KB_PER_SEC;
-        }
-
-        @Override
-        public boolean isBurst() {
-            return false;
-        }
-
-        @Override
-        public Collection<Band> bands() {
-            return this.bandList;
-        }
-
-        @Override
-        public MeterState state() {
-            return MeterState.ADDED;
-        }
-
-        @Override
-        public long life() {
-            return baseValue + 11;
-        }
-
-        @Override
-        public long referenceCount() {
-            return baseValue + 22;
-        }
-
-        @Override
-        public long packetsSeen() {
-            return baseValue + 33;
-        }
-
-        @Override
-        public long bytesSeen() {
-            return baseValue + 44;
-        }
-    }
-
-    /**
-     * A mock class of MeterService.
-     */
-    public static class MockMeterService implements MeterService {
-        @Override
-        public void addListener(MeterListener listener) {
-        }
-
-        @Override
-        public void removeListener(MeterListener listener) {
-        }
-
-        @Override
-        public Meter submit(MeterRequest meter) {
-            Meter m = new MockMeter(meter.deviceId(), meter.appId().id(), METER_ID_1, 1);
-            allMeters.add(m);
-            return m;
-        }
-
-        @Override
-        public void withdraw(MeterRequest meter, MeterId meterId) {
-            Meter toRemove = null;
-            for (Meter m: allMeters) {
-                if (meter.appId().id() == m.appId().id() && meter.deviceId().equals(m.deviceId())
-                        && m.id().equals(meterId)) {
-                    toRemove = m;
-                    break;
-                }
-            }
-            if (null != toRemove) {
-                allMeters.remove(toRemove);
-            }
-        }
-
-        @Override
-        public Meter getMeter(DeviceId deviceId, MeterId id) {
-            for (Meter m: allMeters) {
-                if (deviceId.equals(m.deviceId()) && m.id().equals(id)) {
-                    return m;
-                }
-            }
-            return null;
-        }
-
-        @Override
-        public Collection<Meter> getAllMeters() {
-            return allMeters;
-        }
-
-        @Override
-        public Collection<Meter> getMeters(DeviceId deviceId) {
-            List<Meter> meters = new ArrayList<>();
-            for (Meter m: allMeters) {
-                if (deviceId.equals(m.deviceId())) {
-                    meters.add(m);
-                }
-            }
-            return meters;
-        }
-
-        @Override
-        public MeterId allocateMeterId(DeviceId deviceId) {
-            return null;
-        }
-
-        @Override
-        public void freeMeterId(DeviceId deviceId, MeterId meterId) {
-
-        }
-    }
-
-}
diff --git a/graveyard/protobuf-dead/services/nb/src/test/java/org/onosproject/incubator/protobuf/services/nb/GrpcNbRegionServiceTest.java b/graveyard/protobuf-dead/services/nb/src/test/java/org/onosproject/incubator/protobuf/services/nb/GrpcNbRegionServiceTest.java
deleted file mode 100644
index 7e03dce..0000000
--- a/graveyard/protobuf-dead/services/nb/src/test/java/org/onosproject/incubator/protobuf/services/nb/GrpcNbRegionServiceTest.java
+++ /dev/null
@@ -1,375 +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.
-*/
-
-package org.onosproject.incubator.protobuf.services.nb;
-
-import com.google.common.collect.ImmutableList;
-import com.google.common.collect.ImmutableSet;
-import io.grpc.BindableService;
-import io.grpc.ManagedChannel;
-import io.grpc.inprocess.InProcessChannelBuilder;
-import org.junit.AfterClass;
-import org.junit.BeforeClass;
-import org.junit.Test;
-import org.onosproject.cluster.NodeId;
-import org.onosproject.grpc.nb.net.region.RegionServiceGrpc;
-import org.onosproject.grpc.nb.net.region.RegionServiceGrpc.RegionServiceBlockingStub;
-import org.onosproject.grpc.nb.net.region.RegionServiceNb;
-import org.onosproject.grpc.net.models.RegionProtoOuterClass;
-import org.onosproject.incubator.protobuf.models.net.RegionProtoTranslator;
-import org.onosproject.net.DefaultAnnotations;
-import org.onosproject.net.DefaultDevice;
-import org.onosproject.net.Device;
-import org.onosproject.net.DeviceId;
-import org.onosproject.net.HostId;
-import org.onosproject.net.provider.ProviderId;
-import org.onosproject.net.region.DefaultRegion;
-import org.onosproject.net.region.Region;
-import org.onosproject.net.region.RegionId;
-import org.onosproject.net.region.RegionListener;
-import org.onosproject.net.region.RegionService;
-
-import java.io.IOException;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-import static org.junit.Assert.assertTrue;
-import static org.onosproject.cluster.NodeId.nodeId;
-import static org.onosproject.net.DeviceId.deviceId;
-import static org.onosproject.net.HostId.hostId;
-
-public class GrpcNbRegionServiceTest {
-
-    private static InProcessServer<BindableService> inprocessServer;
-    private static RegionServiceBlockingStub blockingStub;
-    private static ManagedChannel channel;
-
-    private static final String C1 = "C1";
-    private static final String C2 = "C2";
-    private static final String C3 = "C3";
-
-    private static final NodeId CNID_1 = nodeId(C1);
-    private static final NodeId CNID_2 = nodeId(C2);
-    private static final NodeId CNID_3 = nodeId(C3);
-
-    private static final String R1 = "R1";
-    private static final String R2 = "R2";
-    private static final String R3 = "R3";
-
-    private static final Set<NodeId> SET_C1 = ImmutableSet.of(CNID_1);
-    private static final Set<NodeId> SET_C2 = ImmutableSet.of(CNID_2);
-    private static final Set<NodeId> SET_C3 = ImmutableSet.of(CNID_3);
-
-    private static final Region REGION_1 =
-            region(R1, Region.Type.METRO, ImmutableList.of(SET_C1, SET_C2));
-    private static final Region REGION_2 =
-            region(R2, Region.Type.CAMPUS, ImmutableList.of(SET_C2, SET_C1));
-    private static final Region REGION_3 =
-            region(R3, Region.Type.CAMPUS, ImmutableList.of(SET_C3, SET_C1));
-
-    private static final Set<Region> REGION_SET =
-            ImmutableSet.of(REGION_1, REGION_2, REGION_3);
-
-    private static final String D1 = "d1";
-    private static final String D2 = "d2";
-    private static final String D3 = "d3";
-    private static final String D4 = "d4";
-    private static final String D5 = "d5";
-    private static final String D6 = "d6";
-    private static final String D7 = "d7";
-    private static final String D8 = "d8";
-    private static final String D9 = "d9";
-
-    private static final String MFR = "Mfr";
-    private static final String HW = "h/w";
-    private static final String SW = "s/w";
-    private static final String SERIAL = "ser123";
-
-    private static final DeviceId DEVID_1 = deviceId(D1);
-    private static final DeviceId DEVID_2 = deviceId(D2);
-    private static final DeviceId DEVID_3 = deviceId(D3);
-    private static final DeviceId DEVID_4 = deviceId(D4);
-    private static final DeviceId DEVID_5 = deviceId(D5);
-    private static final DeviceId DEVID_6 = deviceId(D6);
-    private static final DeviceId DEVID_7 = deviceId(D7);
-    private static final DeviceId DEVID_8 = deviceId(D8);
-    private static final DeviceId DEVID_9 = deviceId(D9);
-
-    private static final Set<DeviceId> DEVS_TRUNK =
-            ImmutableSet.of(DEVID_1, DEVID_2, DEVID_3);
-
-    private static final Set<DeviceId> DEVS_LEFT =
-            ImmutableSet.of(DEVID_4, DEVID_5, DEVID_6);
-
-    private static final Set<DeviceId> DEVS_RIGHT =
-            ImmutableSet.of(DEVID_7, DEVID_8, DEVID_9);
-
-    private static final String[][] HOST_DATA = {
-            {"AA:00:00:00:00:1A/None", R1},
-            {"AA:00:00:00:00:1B/None", R1},
-            {"AA:00:00:00:00:2A/None", R1},
-            {"AA:00:00:00:00:2B/None", R1},
-            {"AA:00:00:00:00:3A/None", R1},
-            {"AA:00:00:00:00:3B/None", R1},
-            {"AA:00:00:00:00:4A/None", R2},
-            {"AA:00:00:00:00:4B/None", R2},
-            {"AA:00:00:00:00:5A/None", R2},
-            {"AA:00:00:00:00:5B/None", R2},
-            {"AA:00:00:00:00:6A/None", R2},
-            {"AA:00:00:00:00:6B/None", R2},
-            {"AA:00:00:00:00:7A/None", R3},
-            {"AA:00:00:00:00:7B/None", R3},
-            {"AA:00:00:00:00:8A/None", R3},
-            {"AA:00:00:00:00:8B/None", R3},
-            {"AA:00:00:00:00:9A/None", R3},
-            {"AA:00:00:00:00:9B/None", R3},
-    };
-
-    private static final Map<HostId, RegionId> HOSTS = new HashMap<>();
-    private static final RegionService MOCK_REGION = new MockRegionService();
-
-    /**
-     * Returns device with given ID.
-     *
-     * @param id device ID
-     * @return device instance
-     */
-    protected static Device device(String id) {
-        return new DefaultDevice(ProviderId.NONE, deviceId(id),
-                                 Device.Type.SWITCH, MFR, HW, SW, SERIAL, null);
-    }
-
-    /**
-     * Returns a region instance with specified parameters.
-     *
-     * @param id      region id
-     * @param type    region type
-     * @param masters ordered list of master sets
-     * @return region instance
-     */
-    private static Region region(String id, Region.Type type,
-                                   List<Set<NodeId>> masters) {
-        return new DefaultRegion(RegionId.regionId(id), "Region-" + id,
-                                 type, DefaultAnnotations.EMPTY, masters);
-    }
-
-    /**
-     * Creates a map of hostIds corresponding to their regionIds.
-     *
-     */
-    private static void populateHosts() {
-        for (String[] row : HOST_DATA) {
-            HOSTS.put(hostId(row[0]), RegionId.regionId(row[1]));
-        }
-    }
-
-    public GrpcNbRegionServiceTest() {
-    }
-
-    @Test
-    public void testGetRegion() throws InterruptedException {
-
-        RegionServiceNb.getRegionRequest request = RegionServiceNb.getRegionRequest.newBuilder()
-                                                                                   .setRegionId(R1).build();
-        RegionServiceNb.getRegionReply response;
-
-        try {
-            response = blockingStub.getRegion(request);
-            Region actualRegion = RegionProtoTranslator.translate(response.getRegion());
-            assertTrue(REGION_1.equals(actualRegion));
-        } catch (Exception e) {
-            e.printStackTrace();
-        }
-    }
-
-    @Test
-    public void testGetRegions() throws InterruptedException {
-
-        RegionServiceNb.getRegionsRequest request = RegionServiceNb.getRegionsRequest.newBuilder()
-                .build();
-        RegionServiceNb.getRegionsReply response;
-
-        try {
-            response = blockingStub.getRegions(request);
-            Set<Region> actualRegions = new HashSet<Region>();
-            for (RegionProtoOuterClass.RegionProto region : response.getRegionList()) {
-                actualRegions.add(RegionProtoTranslator.translate(region));
-            }
-            assertTrue(REGION_SET.equals(actualRegions));
-        } catch (Exception e) {
-            e.printStackTrace();
-        }
-    }
-
-    @Test
-    public void testGetRegionForDevice() throws InterruptedException {
-
-        RegionServiceNb.getRegionForDeviceRequest request = RegionServiceNb.getRegionForDeviceRequest.newBuilder()
-                .setDeviceId(D1).build();
-        RegionServiceNb.getRegionForDeviceReply response;
-
-        try {
-            response = blockingStub.getRegionForDevice(request);
-            Region actualRegion = RegionProtoTranslator.translate(response.getRegion());
-            assertTrue(REGION_1.equals(actualRegion));
-        } catch (Exception e) {
-            e.printStackTrace();
-        }
-    }
-
-    @Test
-    public void testGetRegionDevices() throws InterruptedException {
-
-        RegionServiceNb.getRegionDevicesRequest request = RegionServiceNb.getRegionDevicesRequest.newBuilder()
-                .setRegionId(R1).build();
-        RegionServiceNb.getRegionDevicesReply response;
-
-        try {
-            response = blockingStub.getRegionDevices(request);
-            Set<DeviceId> actualDevices = new HashSet<DeviceId>();
-            for (String deviceId : response.getDeviceIdList()) {
-                actualDevices.add(DeviceId.deviceId(deviceId));
-            }
-            assertTrue(DEVS_TRUNK.equals(actualDevices));
-        } catch (Exception e) {
-            e.printStackTrace();
-        }
-    }
-
-    @Test
-    public void testGetRegionHosts() throws InterruptedException {
-        RegionServiceNb.getRegionHostsRequest request = RegionServiceNb.getRegionHostsRequest.newBuilder()
-                .setRegionId(R1).build();
-        RegionServiceNb.getRegionHostsReply response;
-
-        Set<HostId> expectedHosts = new HashSet<HostId>();
-
-        expectedHosts.add(HostId.hostId(HOST_DATA[0][0]));
-        expectedHosts.add(HostId.hostId(HOST_DATA[1][0]));
-        expectedHosts.add(HostId.hostId(HOST_DATA[2][0]));
-        expectedHosts.add(HostId.hostId(HOST_DATA[3][0]));
-        expectedHosts.add(HostId.hostId(HOST_DATA[4][0]));
-        expectedHosts.add(HostId.hostId(HOST_DATA[5][0]));
-
-        Set<HostId> actualHosts = new HashSet<HostId>();
-
-        try {
-            response = blockingStub.getRegionHosts(request);
-            for (String hostId : response.getHostIdList()) {
-                actualHosts.add(HostId.hostId(hostId));
-            }
-        } catch (Exception e) {
-            e.printStackTrace();
-        }
-        assertTrue(expectedHosts.equals(actualHosts));
-    }
-
-    @BeforeClass
-    public static void beforeClass() throws InstantiationException, IllegalAccessException, IOException {
-        GrpcNbRegionService regionService = new GrpcNbRegionService();
-        regionService.regionService = MOCK_REGION;
-        inprocessServer = regionService.registerInProcessServer();
-        inprocessServer.start();
-
-        channel = InProcessChannelBuilder.forName("test").directExecutor()
-                // Channels are secure by default (via SSL/TLS). For the example we disable TLS to avoid
-                // needing certificates.
-                .usePlaintext(true).build();
-        blockingStub = RegionServiceGrpc.newBlockingStub(channel);
-        populateHosts();
-    }
-
-    @AfterClass
-    public static void afterClass() {
-        channel.shutdownNow();
-
-        inprocessServer.stop();
-    }
-
-    private static class MockRegionService implements RegionService {
-
-        private final Map<RegionId, Region> lookup = new HashMap<>();
-
-        MockRegionService() {
-            lookup.put(REGION_1.id(), REGION_1);
-            lookup.put(REGION_2.id(), REGION_2);
-            lookup.put(REGION_3.id(), REGION_3);
-        }
-
-        @Override
-        public Set<Region> getRegions() {
-            return REGION_SET;
-        }
-
-        @Override
-        public Region getRegion(RegionId regionId) {
-            return lookup.get(regionId);
-        }
-
-        @Override
-        public Region getRegionForDevice(DeviceId deviceId) {
-            if (DEVS_TRUNK.contains(deviceId)) {
-                return REGION_1;
-            }
-            if (DEVS_LEFT.contains(deviceId)) {
-                return REGION_2;
-            }
-            if (DEVS_RIGHT.contains(deviceId)) {
-                return REGION_3;
-            }
-            return null;
-        }
-
-        @Override
-        public Set<DeviceId> getRegionDevices(RegionId regionId) {
-            if (REGION_1.id().equals(regionId)) {
-                return DEVS_TRUNK;
-            }
-            if (REGION_2.id().equals(regionId)) {
-                return DEVS_LEFT;
-            }
-            if (REGION_3.id().equals(regionId)) {
-                return DEVS_RIGHT;
-            }
-            return Collections.emptySet();
-        }
-
-        @Override
-        public Set<HostId> getRegionHosts(RegionId regionId) {
-            Set<HostId> hosts = new HashSet<HostId>();
-            for (HostId hostId : HOSTS.keySet()) {
-                if (HOSTS.get(hostId).equals(regionId)) {
-                    hosts.add(hostId);
-                }
-            }
-            return hosts;
-        }
-
-        @Override
-        public void addListener(RegionListener listener) {
-
-        }
-
-        @Override
-        public void removeListener(RegionListener listener) {
-
-        }
-    }
-}
\ No newline at end of file
diff --git a/graveyard/protobuf-dead/src/main/java/org/onosproject/incubator/protobuf/net/package-info.java b/graveyard/protobuf-dead/src/main/java/org/onosproject/incubator/protobuf/net/package-info.java
deleted file mode 100644
index f193ee8..0000000
--- a/graveyard/protobuf-dead/src/main/java/org/onosproject/incubator/protobuf/net/package-info.java
+++ /dev/null
@@ -1,20 +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.
- */
-
-/**
- * A package contains gRPC service registry implementations.
- */
-package org.onosproject.incubator.protobuf.net;
\ No newline at end of file
diff --git a/graveyard/protobuf-nb/src/main/proto/MulticastRouteService.proto b/graveyard/protobuf-nb/src/main/proto/MulticastRouteService.proto
deleted file mode 100644
index f74048a..0000000
--- a/graveyard/protobuf-nb/src/main/proto/MulticastRouteService.proto
+++ /dev/null
@@ -1,51 +0,0 @@
-syntax = "proto3";
-option java_package = "org.onosproject.grpc.net.mcast";
-
-package Multicast;
-
-// TODO move model objects to common protobuf package
-
-message ConnectPoint {
-  string deviceId = 1;
-  uint64 portNumber = 2;
-}
-
-enum MulticastRouteType {
-  PIM = 0;
-  IGMP = 1;
-  STATIC = 2;
-}
-
-enum MulticastOperationResult {
-  SUCCESS = 0;
-  FAIL = 1;
-}
-
-enum MulticastOperation {
-  ADD_ROUTE = 0;
-  ADD_SOURCE = 1;
-  ADD_SINK = 2;
-  REMOVE_ROUTE = 3;
-  REMOVE_SOURCE = 4;
-  REMOVE_SINK = 5;
-}
-
-message MulticastRoute {
-  fixed32 source = 1; // TODO assumes ipv4
-  fixed32 group = 2;
-  MulticastRouteType type = 3;
-}
-
-message MulticastReply {
-  MulticastOperationResult result = 1;
-}
-
-message MulticastRequest {
-  MulticastOperation operation = 1;
-  MulticastRoute route = 2;
-  ConnectPoint connectPoint = 3;
-}
-
-service MulticastRouteService {
-  rpc operation(stream MulticastRequest) returns (stream MulticastReply) {}
-}
diff --git a/graveyard/rpc-grpc/src/main/java/org/onosproject/incubator/rpc/grpc/DeviceProviderRegistryClientProxy.java b/graveyard/rpc-grpc/src/main/java/org/onosproject/incubator/rpc/grpc/DeviceProviderRegistryClientProxy.java
deleted file mode 100644
index 59b780f..0000000
--- a/graveyard/rpc-grpc/src/main/java/org/onosproject/incubator/rpc/grpc/DeviceProviderRegistryClientProxy.java
+++ /dev/null
@@ -1,77 +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.
- */
-package org.onosproject.incubator.rpc.grpc;
-
-import java.util.Map;
-
-import org.onosproject.net.device.DeviceProvider;
-import org.onosproject.net.device.DeviceProviderRegistry;
-import org.onosproject.net.device.DeviceProviderService;
-import org.onosproject.net.provider.AbstractProviderRegistry;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import com.google.common.collect.Maps;
-
-import io.grpc.Channel;
-import io.grpc.ManagedChannel;
-
-// gRPC Client side
-/**
- * Proxy object to handle DeviceProviderRegistry calls.
- *
- * RPC wise, this will start/stop bidirectional streaming service sessions.
- */
-final class DeviceProviderRegistryClientProxy
-        extends AbstractProviderRegistry<DeviceProvider, DeviceProviderService>
-        implements DeviceProviderRegistry {
-
-    private final Logger log = LoggerFactory.getLogger(getClass());
-
-    private final Channel channel;
-
-    private final Map<DeviceProvider, DeviceProviderServiceClientProxy> pServices;
-
-    DeviceProviderRegistryClientProxy(ManagedChannel channel) {
-        this.channel = channel;
-        pServices = Maps.newIdentityHashMap();
-    }
-
-    @Override
-    protected synchronized DeviceProviderService createProviderService(DeviceProvider provider) {
-
-        // Create session
-        DeviceProviderServiceClientProxy pService = new DeviceProviderServiceClientProxy(provider, channel);
-        log.debug("Created DeviceProviderServiceClientProxy {}", pService);
-
-        DeviceProviderServiceClientProxy old = pServices.put(provider, pService);
-        if (old != null) {
-            // sanity check, can go away
-            log.warn("Duplicate registration detected for {}", provider.id());
-        }
-        return pService;
-    }
-
-    @Override
-    public synchronized void unregister(DeviceProvider provider) {
-        DeviceProviderServiceClientProxy pService = pServices.remove(provider);
-        log.debug("Unregistering DeviceProviderServiceClientProxy {}", pService);
-        super.unregister(provider);
-        if (pService != null) {
-            pService.shutdown();
-        }
-    }
-}
diff --git a/graveyard/rpc-grpc/src/main/java/org/onosproject/incubator/rpc/grpc/DeviceProviderServiceClientProxy.java b/graveyard/rpc-grpc/src/main/java/org/onosproject/incubator/rpc/grpc/DeviceProviderServiceClientProxy.java
deleted file mode 100644
index 5438c67..0000000
--- a/graveyard/rpc-grpc/src/main/java/org/onosproject/incubator/rpc/grpc/DeviceProviderServiceClientProxy.java
+++ /dev/null
@@ -1,322 +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.
- */
-package org.onosproject.incubator.rpc.grpc;
-
-import static com.google.common.base.Preconditions.checkNotNull;
-import static java.util.stream.Collectors.toList;
-import static org.onosproject.net.DeviceId.deviceId;
-
-import java.util.Collection;
-import java.util.List;
-import java.util.concurrent.atomic.AtomicBoolean;
-
-import org.onosproject.grpc.net.device.DeviceProviderRegistryRpcGrpc;
-import org.onosproject.grpc.net.device.DeviceProviderRegistryRpcGrpc.DeviceProviderRegistryRpcStub;
-import org.onosproject.grpc.net.device.DeviceService.DeviceProviderMsg;
-import org.onosproject.grpc.net.device.DeviceService.DeviceProviderServiceMsg;
-import org.onosproject.grpc.net.device.DeviceService.IsReachableRequest;
-import org.onosproject.grpc.net.device.DeviceService.RoleChanged;
-import org.onosproject.grpc.net.device.DeviceService.TriggerProbe;
-import org.onosproject.grpc.net.device.models.PortDescriptionProtoOuterClass.PortDescriptionProto;
-import org.onosproject.grpc.net.device.models.PortStatisticsProtoOuterClass.PortStatisticsProto;
-import org.onosproject.net.DeviceId;
-import org.onosproject.net.MastershipRole;
-import org.onosproject.net.device.DeviceDescription;
-import org.onosproject.net.device.DeviceProvider;
-import org.onosproject.net.device.DeviceProviderService;
-import org.onosproject.net.device.PortDescription;
-import org.onosproject.net.device.PortStatistics;
-import org.onosproject.net.provider.AbstractProviderService;
-import org.onosproject.incubator.protobuf.models.net.device.DeviceProtoTranslator;
-import org.onosproject.incubator.protobuf.models.net.device.PortProtoTranslator;
-import org.onosproject.incubator.protobuf.models.net.MastershipRoleProtoTranslator;
-
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import com.google.common.base.MoreObjects;
-
-import io.grpc.Channel;
-import io.grpc.stub.StreamObserver;
-
-// gRPC Client side
-// gRPC wise, this object represents bidirectional streaming service session
-// and deals with outgoing message stream
-/**
- * DeviceProviderService instance associated with given DeviceProvider.
- */
-final class DeviceProviderServiceClientProxy
-        extends AbstractProviderService<DeviceProvider>
-        implements DeviceProviderService {
-
-    private final Logger log = LoggerFactory.getLogger(getClass());
-
-    private final StreamObserver<DeviceProviderServiceMsg> devProvService;
-    private final AtomicBoolean hasShutdown = new AtomicBoolean(false);
-
-    private final Channel channel;
-
-    private Throwable error;
-
-    DeviceProviderServiceClientProxy(DeviceProvider provider, Channel channel) {
-        super(provider);
-        this.channel = channel;
-
-        DeviceProviderRegistryRpcStub stub = DeviceProviderRegistryRpcGrpc.newStub(channel);
-        log.debug("Calling RPC register({}) against {}", provider.id(), channel.authority());
-        devProvService = stub.register(new DeviceProviderClientProxy(provider));
-
-        // send initialize message
-        DeviceProviderServiceMsg.Builder builder = DeviceProviderServiceMsg.newBuilder();
-        builder.setRegisterProvider(builder.getRegisterProviderBuilder()
-                                    .setProviderScheme(provider.id().scheme())
-                                    .build());
-        devProvService.onNext(builder.build());
-    }
-
-    @Override
-    public void deviceConnected(DeviceId deviceId,
-                                DeviceDescription deviceDescription) {
-        checkValidity();
-
-        DeviceProviderServiceMsg.Builder builder = DeviceProviderServiceMsg.newBuilder();
-        builder.setDeviceConnected(builder.getDeviceConnectedBuilder()
-                                      .setDeviceId(deviceId.toString())
-                                      .setDeviceDescription(DeviceProtoTranslator.translate(deviceDescription))
-                                      .build());
-
-        devProvService.onNext(builder.build());
-    }
-
-    @Override
-    public void deviceDisconnected(DeviceId deviceId) {
-        checkValidity();
-
-        DeviceProviderServiceMsg.Builder builder = DeviceProviderServiceMsg.newBuilder();
-        builder.setDeviceDisconnected(builder.getDeviceDisconnectedBuilder()
-                                      .setDeviceId(deviceId.toString())
-                                      .build());
-
-        devProvService.onNext(builder.build());
-    }
-
-    @Override
-    public void updatePorts(DeviceId deviceId,
-                            List<PortDescription> portDescriptions) {
-        checkValidity();
-
-        DeviceProviderServiceMsg.Builder builder = DeviceProviderServiceMsg.newBuilder();
-        List<PortDescriptionProto> portDescs =
-                portDescriptions.stream()
-                    .map(PortProtoTranslator::translate)
-                    .collect(toList());
-
-        builder.setUpdatePorts(builder.getUpdatePortsBuilder()
-                               .setDeviceId(deviceId.toString())
-                               .addAllPortDescriptions(portDescs)
-                               .build());
-
-        devProvService.onNext(builder.build());
-    }
-
-    @Override
-    public void deletePort(DeviceId deviceId, PortDescription portDescription) {
-
-    }
-
-    @Override
-    public void portStatusChanged(DeviceId deviceId,
-                                  PortDescription portDescription) {
-        checkValidity();
-
-        DeviceProviderServiceMsg.Builder builder = DeviceProviderServiceMsg.newBuilder();
-        builder.setPortStatusChanged(builder.getPortStatusChangedBuilder()
-                                      .setDeviceId(deviceId.toString())
-                                      .setPortDescription(PortProtoTranslator.translate(portDescription))
-                                      .build());
-
-        devProvService.onNext(builder.build());
-    }
-
-    @Override
-    public void receivedRoleReply(DeviceId deviceId, MastershipRole requested,
-                                  MastershipRole response) {
-        checkValidity();
-
-        DeviceProviderServiceMsg.Builder builder = DeviceProviderServiceMsg.newBuilder();
-        builder.setReceivedRoleReply(builder.getReceivedRoleReplyBuilder()
-                                      .setDeviceId(deviceId.toString())
-                                      .setRequested(MastershipRoleProtoTranslator.translate(requested))
-                                      .setResponse(MastershipRoleProtoTranslator.translate(response))
-                                      .build());
-
-        devProvService.onNext(builder.build());
-    }
-
-    @Override
-    public void updatePortStatistics(DeviceId deviceId,
-                                     Collection<PortStatistics> portStatistics) {
-        checkValidity();
-
-        DeviceProviderServiceMsg.Builder builder = DeviceProviderServiceMsg.newBuilder();
-        List<PortStatisticsProto> portStats =
-                portStatistics.stream()
-                    .map(PortProtoTranslator::translate)
-                    .collect(toList());
-        builder.setUpdatePortStatistics(builder.getUpdatePortStatisticsBuilder()
-                                      .setDeviceId(deviceId.toString())
-                                      .addAllPortStatistics(portStats)
-                                      .build());
-
-        devProvService.onNext(builder.build());
-    }
-
-    /**
-     * Shutdown this session.
-     */
-    public void shutdown() {
-        if (hasShutdown.compareAndSet(false, true)) {
-            log.info("Shutting down session over {}", channel.authority());
-            // initiate clean shutdown from client
-            devProvService.onCompleted();
-            invalidate();
-        }
-    }
-
-    /**
-     * Abnormally terminate this session.
-     * @param t error details
-     */
-    public void shutdown(Throwable t) {
-        if (hasShutdown.compareAndSet(false, true)) {
-            log.error("Shutting down session over {}", channel.authority());
-            // initiate abnormal termination from client
-            devProvService.onError(t);
-            invalidate(t);
-        }
-    }
-
-    /**
-     * Invalidates the ProviderService indicating Failure.
-     * @param t {@link Throwable} describing last failure
-     */
-    private void invalidate(Throwable t) {
-        this.error = t;
-        invalidate();
-    }
-
-    @Override
-    public void checkValidity() {
-        if (error != null) {
-            throw new IllegalStateException("DeviceProviderService no longer valid",
-                                            error);
-        }
-        super.checkValidity();
-    }
-
-    @Override
-    public String toString() {
-        return MoreObjects.toStringHelper(this)
-            .add("channel", channel.authority())
-            .add("hasShutdown", hasShutdown.get())
-            .toString();
-    }
-
-    // gRPC wise, this object handles incoming message stream
-    /**
-     * Translates DeviceProvider instructions received from RPC to Java calls.
-     */
-    private final class DeviceProviderClientProxy
-            implements StreamObserver<DeviceProviderMsg> {
-
-        private final DeviceProvider provider;
-
-        DeviceProviderClientProxy(DeviceProvider provider) {
-            this.provider = checkNotNull(provider);
-        }
-
-        @Override
-        public void onNext(DeviceProviderMsg msg) {
-            try {
-                log.trace("DeviceProviderClientProxy received: {}", msg);
-                onMethod(msg);
-            } catch (Exception e) {
-                log.error("Exception caught handling {} at DeviceProviderClientProxy", msg, e);
-                // initiate shutdown from client
-                shutdown(e);
-            }
-        }
-
-        /**
-         * Translates received RPC message to {@link DeviceProvider} method calls.
-         * @param msg DeviceProvider message
-         */
-        private void onMethod(DeviceProviderMsg msg) {
-            switch (msg.getMethodCase()) {
-            case TRIGGER_PROBE:
-                TriggerProbe triggerProbe = msg.getTriggerProbe();
-                provider.triggerProbe(deviceId(triggerProbe.getDeviceId()));
-                break;
-            case ROLE_CHANGED:
-                RoleChanged roleChanged = msg.getRoleChanged();
-                provider.roleChanged(deviceId(roleChanged.getDeviceId()),
-                        (MastershipRole) MastershipRoleProtoTranslator.translate(roleChanged.getNewRole()).get());
-                break;
-            case IS_REACHABLE_REQUEST:
-                IsReachableRequest isReachableRequest = msg.getIsReachableRequest();
-                // check if reachable
-                boolean reachable = provider.isReachable(deviceId(isReachableRequest.getDeviceId()));
-
-                int xid = isReachableRequest.getXid();
-                // send response back DeviceProviderService channel
-                DeviceProviderServiceMsg.Builder builder = DeviceProviderServiceMsg.newBuilder();
-                builder.setIsReachableResponse(builder.getIsReachableResponseBuilder()
-                                               .setXid(xid)
-                                               .setIsReachable(reachable)
-                                               .build());
-                devProvService.onNext(builder.build());
-                break;
-
-            case METHOD_NOT_SET:
-            default:
-                log.warn("Unexpected method, ignoring", msg);
-                break;
-            }
-        }
-
-        @Override
-        public void onCompleted() {
-            log.info("DeviceProviderClientProxy completed");
-            // session terminated from remote
-            invalidate();
-        }
-
-        @Override
-        public void onError(Throwable t) {
-            log.error("DeviceProviderClientProxy#onError", t);
-            // session terminated from remote
-            invalidate(t);
-        }
-
-        @Override
-        public String toString() {
-            return MoreObjects.toStringHelper(this)
-                    .add("channel", channel.authority())
-                    .toString();
-        }
-    }
-}
-
diff --git a/graveyard/rpc-grpc/src/main/java/org/onosproject/incubator/rpc/grpc/GrpcRemoteServiceContext.java b/graveyard/rpc-grpc/src/main/java/org/onosproject/incubator/rpc/grpc/GrpcRemoteServiceContext.java
deleted file mode 100644
index 44674e3..0000000
--- a/graveyard/rpc-grpc/src/main/java/org/onosproject/incubator/rpc/grpc/GrpcRemoteServiceContext.java
+++ /dev/null
@@ -1,77 +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.
- */
-package org.onosproject.incubator.rpc.grpc;
-
-import static com.google.common.base.Preconditions.checkNotNull;
-
-import java.util.Map;
-import java.util.NoSuchElementException;
-import java.util.concurrent.ConcurrentHashMap;
-
-import org.onosproject.incubator.rpc.RemoteServiceContext;
-import org.onosproject.net.device.DeviceProviderRegistry;
-import org.onosproject.net.link.LinkProviderRegistry;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import com.google.common.base.MoreObjects;
-
-import io.grpc.ManagedChannel;
-
-// gRPC Client side
-// Probably there should be plug-in mechanism in the future.
-/**
- * RemoteServiceContext based on gRPC.
- *
- * <p>
- * Currently it supports {@link DeviceProviderRegistry}.
- */
-public class GrpcRemoteServiceContext implements RemoteServiceContext {
-
-    private final Logger log = LoggerFactory.getLogger(getClass());
-
-    private final Map<Class<? extends Object>, Object> services = new ConcurrentHashMap<>();
-
-    private final ManagedChannel channel;
-
-    public GrpcRemoteServiceContext(ManagedChannel channel) {
-        this.channel = checkNotNull(channel);
-        services.put(DeviceProviderRegistry.class, new DeviceProviderRegistryClientProxy(channel));
-        services.put(LinkProviderRegistry.class, new LinkProviderRegistryClientProxy(channel));
-    }
-
-
-    @Override
-    public <T> T get(Class<T> serviceClass) {
-        @SuppressWarnings("unchecked")
-        T service = (T) services.get(serviceClass);
-        if (service != null) {
-            return service;
-        }
-        log.error("{} not supported", serviceClass);
-        throw new NoSuchElementException(serviceClass.getTypeName() + " not supported");
-    }
-
-
-    @Override
-    public String toString() {
-        return MoreObjects.toStringHelper(this)
-                .add("services", services.keySet())
-                .add("channel", channel.authority())
-                .toString();
-    }
-
-}
diff --git a/graveyard/rpc-grpc/src/main/java/org/onosproject/incubator/rpc/grpc/GrpcRemoteServiceProvider.java b/graveyard/rpc-grpc/src/main/java/org/onosproject/incubator/rpc/grpc/GrpcRemoteServiceProvider.java
deleted file mode 100644
index e3f0892..0000000
--- a/graveyard/rpc-grpc/src/main/java/org/onosproject/incubator/rpc/grpc/GrpcRemoteServiceProvider.java
+++ /dev/null
@@ -1,126 +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.
- */
-package org.onosproject.incubator.rpc.grpc;
-
-import static com.google.common.base.Preconditions.checkArgument;
-
-import java.net.URI;
-import java.util.Map;
-import java.util.Objects;
-import java.util.concurrent.ConcurrentHashMap;
-
-import org.osgi.service.component.annotations.Activate;
-import org.osgi.service.component.annotations.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;
-import org.onosproject.incubator.rpc.RemoteServiceProviderRegistry;
-import org.onosproject.net.provider.ProviderId;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import io.grpc.ManagedChannel;
-import io.grpc.internal.DnsNameResolverProvider;
-import io.grpc.netty.NegotiationType;
-import io.grpc.netty.NettyChannelBuilder;
-
-
-// gRPC Client side
-/**
- * RemoteServiceContextProvider based on gRPC.
- */
-@Component(immediate = true)
-public class GrpcRemoteServiceProvider implements RemoteServiceContextProvider {
-
-    public static final String GRPC_SCHEME = "grpc";
-
-    public static final String RPC_PROVIDER_NAME = "org.onosproject.rpc.provider.grpc";
-
-    private static final ProviderId PID = new ProviderId(GRPC_SCHEME, RPC_PROVIDER_NAME);
-
-    private final Logger log = LoggerFactory.getLogger(getClass());
-
-    @Reference(cardinality = ReferenceCardinality.MANDATORY)
-    protected RemoteServiceProviderRegistry rpcRegistry;
-
-    private final Map<URI, ManagedChannel> channels = new ConcurrentHashMap<>();
-
-    private RemoteServiceContextProviderService providerService;
-
-    @Activate
-    protected void activate() {
-        providerService = rpcRegistry.register(this);
-
-        // Uncomment to test if gRPC can be loaded in karaf
-        //getChannel(URI.create("grpc://localhost:11984"));
-
-        log.info("Started");
-    }
-
-    @Deactivate
-    protected void deactivate() {
-        rpcRegistry.unregister(this);
-
-        // shutdown all channels
-        channels.values().forEach(ManagedChannel::shutdown);
-        // Should we wait for shutdown? How?
-        channels.clear();
-        log.info("Stopped");
-    }
-
-    @Override
-    public ProviderId id() {
-        return PID;
-    }
-
-    @Override
-    public RemoteServiceContext get(URI uri) {
-        // Create gRPC client
-        return new GrpcRemoteServiceContext(getChannel(uri));
-    }
-
-    private ManagedChannel getChannel(URI uri) {
-        checkArgument(Objects.equals(GRPC_SCHEME, uri.getScheme()),
-                      "Invalid URI scheme: %s", uri.getScheme());
-
-        return channels.compute(uri, (u, ch) -> {
-            if (ch != null && !ch.isShutdown()) {
-                return ch;
-            } else {
-                return createChannel(u);
-            }
-        });
-    }
-
-    private ManagedChannel createChannel(URI uri) {
-        log.debug("Creating channel for {}", uri);
-        int port = GrpcRemoteServiceServer.DEFAULT_LISTEN_PORT;
-        if (uri.getPort() != -1) {
-            port = uri.getPort();
-        }
-        return NettyChannelBuilder.forAddress(uri.getHost(), port)
-                .negotiationType(NegotiationType.PLAINTEXT)
-                // TODO Not ideal fix, gRPC discovers name resolvers
-                // in the class path, but OSGi was preventing it.
-                // Manually specifying the default dns resolver for now.
-                .nameResolverFactory(new DnsNameResolverProvider())
-                .build();
-    }
-
-}
diff --git a/graveyard/rpc-grpc/src/main/java/org/onosproject/incubator/rpc/grpc/GrpcRemoteServiceServer.java b/graveyard/rpc-grpc/src/main/java/org/onosproject/incubator/rpc/grpc/GrpcRemoteServiceServer.java
deleted file mode 100644
index 2bf2081..0000000
--- a/graveyard/rpc-grpc/src/main/java/org/onosproject/incubator/rpc/grpc/GrpcRemoteServiceServer.java
+++ /dev/null
@@ -1,501 +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.
- */
-package org.onosproject.incubator.rpc.grpc;
-
-import static com.google.common.base.Preconditions.checkNotNull;
-import static java.util.concurrent.Executors.newScheduledThreadPool;
-import static java.util.stream.Collectors.toList;
-import org.onosproject.incubator.protobuf.models.net.device.DeviceProtoTranslator;
-import org.onosproject.incubator.protobuf.models.net.device.PortProtoTranslator;
-import org.onosproject.incubator.protobuf.models.net.MastershipRoleProtoTranslator;
-import static org.onosproject.net.DeviceId.deviceId;
-
-import java.io.IOException;
-import java.util.Map;
-import java.util.Set;
-import java.util.concurrent.CompletableFuture;
-import java.util.concurrent.ExecutionException;
-import java.util.concurrent.ScheduledExecutorService;
-import java.util.concurrent.TimeUnit;
-import java.util.concurrent.TimeoutException;
-import java.util.concurrent.atomic.AtomicInteger;
-
-import org.osgi.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;
-import org.onosproject.grpc.net.device.DeviceService.DeviceDisconnected;
-import org.onosproject.grpc.net.device.DeviceService.DeviceProviderMsg;
-import org.onosproject.grpc.net.device.DeviceService.DeviceProviderServiceMsg;
-import org.onosproject.grpc.net.device.DeviceService.IsReachableResponse;
-import org.onosproject.grpc.net.device.DeviceService.PortStatusChanged;
-import org.onosproject.grpc.net.device.DeviceService.ReceivedRoleReply;
-import org.onosproject.grpc.net.device.DeviceService.RegisterProvider;
-import org.onosproject.grpc.net.device.DeviceService.UpdatePortStatistics;
-import org.onosproject.grpc.net.device.DeviceService.UpdatePorts;
-import org.onosproject.net.DeviceId;
-import org.onosproject.net.MastershipRole;
-import org.onosproject.net.PortNumber;
-import org.onosproject.net.device.DeviceProvider;
-import org.onosproject.net.device.DeviceProviderRegistry;
-import org.onosproject.net.device.DeviceProviderService;
-import org.onosproject.net.link.LinkProvider;
-import org.onosproject.net.link.LinkProviderRegistry;
-import org.onosproject.net.link.LinkProviderService;
-import org.onosproject.net.provider.ProviderId;
-import org.osgi.service.component.ComponentContext;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import com.google.common.cache.Cache;
-import com.google.common.cache.CacheBuilder;
-import com.google.common.collect.Maps;
-import com.google.common.collect.Sets;
-
-import io.grpc.Server;
-import io.grpc.netty.NettyServerBuilder;
-import io.grpc.stub.StreamObserver;
-
-// gRPC Server on Metro-side
-// Translates request received on RPC channel, and calls corresponding Service on
-// Metro-ONOS cluster.
-
-// Currently supports DeviceProviderRegistry, LinkProviderService
-/**
- * Server side implementation of gRPC based RemoteService.
- */
-@Component(immediate = true)
-public class GrpcRemoteServiceServer {
-
-    static final String RPC_PROVIDER_NAME = "org.onosproject.rpc.provider.grpc";
-
-    // TODO pick a number
-    public static final int DEFAULT_LISTEN_PORT = 11984;
-
-    private final Logger log = LoggerFactory.getLogger(getClass());
-
-    @Reference(cardinality = ReferenceCardinality.MANDATORY)
-    protected DeviceProviderRegistry deviceProviderRegistry;
-
-    @Reference(cardinality = ReferenceCardinality.MANDATORY)
-    protected LinkProviderRegistry linkProviderRegistry;
-
-    /** Port to listen on */
-    protected int listenPort = DEFAULT_LISTEN_PORT;
-
-    private Server server;
-    private final Set<DeviceProviderServerProxy> registeredProviders = Sets.newConcurrentHashSet();
-
-    // scheme -> ...
-    // updates must be guarded by synchronizing `this`
-    private final Map<String, LinkProviderService> linkProviderServices = Maps.newConcurrentMap();
-    private final Map<String, LinkProvider> linkProviders = Maps.newConcurrentMap();
-
-    private ScheduledExecutorService executor;
-
-    @Activate
-    protected void activate(ComponentContext context) throws IOException {
-        executor = newScheduledThreadPool(1, Tools.groupedThreads("grpc", "%d", log));
-        modified(context);
-
-        log.debug("Server starting on {}", listenPort);
-        try {
-            server  = NettyServerBuilder.forPort(listenPort)
-                    .addService(new DeviceProviderRegistryServerProxy())
-                    .addService(new LinkProviderServiceServerProxy(this))
-                    .build().start();
-        } catch (IOException e) {
-            log.error("Failed to start gRPC server", e);
-            throw e;
-        }
-
-        log.info("Started on {}", listenPort);
-    }
-
-    @Deactivate
-    protected void deactivate() {
-        executor.shutdown();
-        try {
-            executor.awaitTermination(5, TimeUnit.SECONDS);
-        } catch (InterruptedException e) {
-            Thread.currentThread().interrupt();
-        }
-
-        registeredProviders.forEach(deviceProviderRegistry::unregister);
-
-        server.shutdown();
-        // Should we wait for shutdown?
-
-        unregisterLinkProviders();
-
-        log.info("Stopped");
-    }
-
-    @Modified
-    public void modified(ComponentContext context) {
-        // TODO support dynamic reconfiguration and restarting server?
-    }
-
-    /**
-     * Registers {@link StubLinkProvider} for given ProviderId scheme.
-     *
-     * DO NOT DIRECTLY CALL THIS METHOD.
-     * Only expected to be called from {@link #getLinkProviderServiceFor(String)}.
-     *
-     * @param scheme ProviderId scheme.
-     * @return {@link LinkProviderService} registered.
-     */
-    private synchronized LinkProviderService registerStubLinkProvider(String scheme) {
-        StubLinkProvider provider = new StubLinkProvider(scheme);
-        linkProviders.put(scheme, provider);
-        return linkProviderRegistry.register(provider);
-    }
-
-    /**
-     * Unregisters all registered LinkProviders.
-     */
-    private synchronized void unregisterLinkProviders() {
-        // TODO remove all links registered by these providers
-        linkProviders.values().forEach(linkProviderRegistry::unregister);
-        linkProviders.clear();
-        linkProviderServices.clear();
-    }
-
-    /**
-     * Gets or creates {@link LinkProviderService} registered for given ProviderId scheme.
-     *
-     * @param scheme ProviderId scheme.
-     * @return {@link LinkProviderService}
-     */
-    protected LinkProviderService getLinkProviderServiceFor(String scheme) {
-        return linkProviderServices.computeIfAbsent(scheme, this::registerStubLinkProvider);
-    }
-
-    protected ScheduledExecutorService getSharedExecutor() {
-        return executor;
-    }
-
-    // RPC Server-side code
-    // RPC session Factory
-    /**
-     * Relays DeviceProviderRegistry calls from RPC client.
-     */
-    class DeviceProviderRegistryServerProxy extends DeviceProviderRegistryRpcImplBase {
-
-        @Override
-        public StreamObserver<DeviceProviderServiceMsg> register(StreamObserver<DeviceProviderMsg> toDeviceProvider) {
-            log.trace("DeviceProviderRegistryServerProxy#register called!");
-
-            DeviceProviderServerProxy provider = new DeviceProviderServerProxy(toDeviceProvider);
-
-            return new DeviceProviderServiceServerProxy(provider, toDeviceProvider);
-        }
-    }
-
-    // Lower -> Upper Controller message
-    // RPC Server-side code
-    // RPC session handler
-    private final class DeviceProviderServiceServerProxy
-            implements StreamObserver<DeviceProviderServiceMsg> {
-
-        // intentionally shadowing
-        private final Logger log = LoggerFactory.getLogger(getClass());
-
-        private final DeviceProviderServerProxy pairedProvider;
-        private final StreamObserver<DeviceProviderMsg> toDeviceProvider;
-
-        private final Cache<Integer, CompletableFuture<Boolean>> outstandingIsReachable;
-
-        // wrapped providerService
-        private DeviceProviderService deviceProviderService;
-
-
-        DeviceProviderServiceServerProxy(DeviceProviderServerProxy provider,
-                                         StreamObserver<DeviceProviderMsg> toDeviceProvider) {
-            this.pairedProvider = provider;
-            this.toDeviceProvider = toDeviceProvider;
-            outstandingIsReachable = CacheBuilder.newBuilder()
-                        .expireAfterWrite(1, TimeUnit.MINUTES)
-                        .build();
-
-            // pair RPC session in other direction
-            provider.pair(this);
-        }
-
-        @Override
-        public void onNext(DeviceProviderServiceMsg msg) {
-            try {
-                log.trace("DeviceProviderServiceServerProxy received: {}", msg);
-                onMethod(msg);
-            } catch (Exception e) {
-                log.error("Exception thrown handling {}", msg, e);
-                onError(e);
-                throw e;
-            }
-        }
-
-        /**
-         * Translates received RPC message to {@link DeviceProviderService} method calls.
-         * @param msg DeviceProviderService message
-         */
-        private void onMethod(DeviceProviderServiceMsg msg) {
-            switch (msg.getMethodCase()) {
-            case REGISTER_PROVIDER:
-                RegisterProvider registerProvider = msg.getRegisterProvider();
-                // TODO Do we care about provider name?
-                pairedProvider.setProviderId(new ProviderId(registerProvider.getProviderScheme(), RPC_PROVIDER_NAME));
-                registeredProviders.add(pairedProvider);
-                log.info("registering DeviceProvider {} via gRPC", pairedProvider.id());
-                deviceProviderService = deviceProviderRegistry.register(pairedProvider);
-                break;
-
-            case DEVICE_CONNECTED:
-                DeviceConnected deviceConnected = msg.getDeviceConnected();
-                deviceProviderService.deviceConnected(deviceId(deviceConnected.getDeviceId()),
-                        DeviceProtoTranslator.translate(deviceConnected.getDeviceDescription()));
-                break;
-            case DEVICE_DISCONNECTED:
-                DeviceDisconnected deviceDisconnected = msg.getDeviceDisconnected();
-                deviceProviderService.deviceDisconnected(deviceId(deviceDisconnected.getDeviceId()));
-                break;
-            case UPDATE_PORTS:
-                UpdatePorts updatePorts = msg.getUpdatePorts();
-                deviceProviderService.updatePorts(deviceId(updatePorts.getDeviceId()),
-                                                  updatePorts.getPortDescriptionsList()
-                                                      .stream()
-                                                          .map(PortProtoTranslator::translate)
-                                                          .collect(toList()));
-                break;
-            case PORT_STATUS_CHANGED:
-                PortStatusChanged portStatusChanged = msg.getPortStatusChanged();
-                deviceProviderService.portStatusChanged(deviceId(portStatusChanged.getDeviceId()),
-                        PortProtoTranslator.translate(portStatusChanged.getPortDescription()));
-                break;
-            case RECEIVED_ROLE_REPLY:
-                ReceivedRoleReply receivedRoleReply = msg.getReceivedRoleReply();
-                deviceProviderService.receivedRoleReply(deviceId(receivedRoleReply.getDeviceId()),
-                        (MastershipRole) MastershipRoleProtoTranslator
-                                .translate(receivedRoleReply.getRequested()).get(),
-                        (MastershipRole) MastershipRoleProtoTranslator
-                                .translate(receivedRoleReply.getResponse()).get());
-                break;
-            case UPDATE_PORT_STATISTICS:
-                UpdatePortStatistics updatePortStatistics = msg.getUpdatePortStatistics();
-                deviceProviderService.updatePortStatistics(deviceId(updatePortStatistics.getDeviceId()),
-                                                           updatePortStatistics.getPortStatisticsList()
-                                                             .stream()
-                                                                .map(PortProtoTranslator::translate)
-                                                                .collect(toList()));
-                break;
-
-            // return value of DeviceProvider#isReachable
-            case IS_REACHABLE_RESPONSE:
-                IsReachableResponse isReachableResponse = msg.getIsReachableResponse();
-                int xid = isReachableResponse.getXid();
-                boolean isReachable = isReachableResponse.getIsReachable();
-                CompletableFuture<Boolean> result = outstandingIsReachable.asMap().remove(xid);
-                if (result != null) {
-                    result.complete(isReachable);
-                }
-                break;
-
-            case METHOD_NOT_SET:
-            default:
-                log.warn("Unexpected message received {}", msg);
-                break;
-            }
-        }
-
-        @Override
-        public void onCompleted() {
-            log.info("DeviceProviderServiceServerProxy completed");
-            deviceProviderRegistry.unregister(pairedProvider);
-            registeredProviders.remove(pairedProvider);
-            toDeviceProvider.onCompleted();
-        }
-
-        @Override
-        public void onError(Throwable e) {
-            log.error("DeviceProviderServiceServerProxy#onError", e);
-            if (pairedProvider != null) {
-                // TODO call deviceDisconnected against all devices
-                // registered for this provider scheme
-                log.info("unregistering DeviceProvider {} via gRPC", pairedProvider.id());
-                deviceProviderRegistry.unregister(pairedProvider);
-                registeredProviders.remove(pairedProvider);
-            }
-            // TODO What is the proper clean up for bi-di stream on error?
-            // sample suggests no-op
-            toDeviceProvider.onError(e);
-        }
-
-
-        /**
-         * Registers Future for {@link DeviceProvider#isReachable(DeviceId)} return value.
-         * @param xid   IsReachable call ID.
-         * @param reply Future to
-         */
-        void register(int xid, CompletableFuture<Boolean> reply) {
-            outstandingIsReachable.put(xid, reply);
-        }
-
-    }
-
-    // Upper -> Lower Controller message
-    /**
-     * Relay DeviceProvider calls to RPC client.
-     */
-    private final class DeviceProviderServerProxy
-            implements DeviceProvider {
-
-        private final Logger log = LoggerFactory.getLogger(getClass());
-
-        // xid for isReachable calls
-        private final AtomicInteger xidPool = new AtomicInteger();
-        private final StreamObserver<DeviceProviderMsg> toDeviceProvider;
-
-        private DeviceProviderServiceServerProxy deviceProviderServiceProxy = null;
-        private ProviderId providerId;
-
-        DeviceProviderServerProxy(StreamObserver<DeviceProviderMsg> toDeviceProvider) {
-            this.toDeviceProvider = toDeviceProvider;
-        }
-
-        void setProviderId(ProviderId pid) {
-            this.providerId = pid;
-        }
-
-        /**
-         * Registers RPC stream in other direction.
-         *
-         * @param deviceProviderServiceProxy {@link DeviceProviderServiceServerProxy}
-         */
-        void pair(DeviceProviderServiceServerProxy deviceProviderServiceProxy) {
-            this.deviceProviderServiceProxy  = deviceProviderServiceProxy;
-        }
-
-        @Override
-        public void triggerProbe(DeviceId deviceId) {
-            try {
-                onTriggerProbe(deviceId);
-            } catch (Exception e) {
-                log.error("Exception caught handling triggerProbe({})",
-                          deviceId, e);
-                toDeviceProvider.onError(e);
-            }
-        }
-
-        private void onTriggerProbe(DeviceId deviceId) {
-            log.trace("triggerProbe({})", deviceId);
-            DeviceProviderMsg.Builder msgBuilder = DeviceProviderMsg.newBuilder();
-            msgBuilder.setTriggerProbe(msgBuilder.getTriggerProbeBuilder()
-                                       .setDeviceId(deviceId.toString())
-                                       .build());
-            DeviceProviderMsg triggerProbeMsg = msgBuilder.build();
-            toDeviceProvider.onNext(triggerProbeMsg);
-        }
-
-        @Override
-        public void roleChanged(DeviceId deviceId, MastershipRole newRole) {
-            try {
-                onRoleChanged(deviceId, newRole);
-            } catch (Exception e) {
-                log.error("Exception caught handling onRoleChanged({}, {})",
-                          deviceId, newRole, e);
-                toDeviceProvider.onError(e);
-            }
-        }
-
-        private void onRoleChanged(DeviceId deviceId, MastershipRole newRole) {
-            log.trace("roleChanged({}, {})", deviceId, newRole);
-            DeviceProviderMsg.Builder msgBuilder = DeviceProviderMsg.newBuilder();
-            msgBuilder.setRoleChanged(msgBuilder.getRoleChangedBuilder()
-                                          .setDeviceId(deviceId.toString())
-                                          .setNewRole(MastershipRoleProtoTranslator.translate(newRole))
-                                          .build());
-            toDeviceProvider.onNext(msgBuilder.build());
-        }
-
-        @Override
-        public boolean isReachable(DeviceId deviceId) {
-            try {
-                return onIsReachable(deviceId);
-            } catch (Exception e) {
-                log.error("Exception caught handling onIsReachable({})",
-                          deviceId, e);
-                toDeviceProvider.onError(e);
-                return false;
-            }
-        }
-
-        private boolean onIsReachable(DeviceId deviceId) {
-
-            log.trace("isReachable({})", deviceId);
-            CompletableFuture<Boolean> result = new CompletableFuture<>();
-            final int xid = xidPool.incrementAndGet();
-
-            DeviceProviderMsg.Builder msgBuilder = DeviceProviderMsg.newBuilder();
-            msgBuilder.setIsReachableRequest(msgBuilder.getIsReachableRequestBuilder()
-                                                 .setXid(xid)
-                                                 .setDeviceId(deviceId.toString())
-                                                 .build());
-
-            // Associate xid and register above future some where
-            // in DeviceProviderService channel to receive reply
-            if (deviceProviderServiceProxy != null) {
-                deviceProviderServiceProxy.register(xid, result);
-            }
-
-            // send message down RPC
-            toDeviceProvider.onNext(msgBuilder.build());
-
-            // wait for reply
-            try {
-                return result.get(10, TimeUnit.SECONDS);
-            } catch (InterruptedException e) {
-                log.debug("isReachable({}) was Interrupted", deviceId, e);
-                Thread.currentThread().interrupt();
-            } catch (TimeoutException e) {
-                log.warn("isReachable({}) Timed out", deviceId, e);
-            } catch (ExecutionException e) {
-                log.error("isReachable({}) Execution failed", deviceId, e);
-                // close session
-                toDeviceProvider.onError(e);
-            }
-            return false;
-        }
-
-        @Override
-        public ProviderId id() {
-            return checkNotNull(providerId, "not initialized yet");
-        }
-
-        @Override
-        public void changePortState(DeviceId deviceId, PortNumber portNumber,
-                                    boolean enable) {
-            // TODO Implement if required
-            log.error("changePortState not supported yet");
-            toDeviceProvider.onError(new UnsupportedOperationException("not implemented yet"));
-        }
-
-    }
-}
diff --git a/graveyard/rpc-grpc/src/main/java/org/onosproject/incubator/rpc/grpc/LinkProviderRegistryClientProxy.java b/graveyard/rpc-grpc/src/main/java/org/onosproject/incubator/rpc/grpc/LinkProviderRegistryClientProxy.java
deleted file mode 100644
index 0dc5678..0000000
--- a/graveyard/rpc-grpc/src/main/java/org/onosproject/incubator/rpc/grpc/LinkProviderRegistryClientProxy.java
+++ /dev/null
@@ -1,48 +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.
- */
-package org.onosproject.incubator.rpc.grpc;
-
-import static com.google.common.base.Preconditions.checkNotNull;
-
-import org.onosproject.net.link.LinkProvider;
-import org.onosproject.net.link.LinkProviderRegistry;
-import org.onosproject.net.link.LinkProviderService;
-import org.onosproject.net.provider.AbstractProviderRegistry;
-
-import com.google.common.annotations.Beta;
-
-import io.grpc.Channel;
-
-/**
- * Proxy object to handle LinkProviderRegistry calls.
- */
-@Beta
-public class LinkProviderRegistryClientProxy
-    extends AbstractProviderRegistry<LinkProvider, LinkProviderService>
-    implements LinkProviderRegistry {
-
-    private final Channel channel;
-
-    public LinkProviderRegistryClientProxy(Channel channel) {
-        this.channel = checkNotNull(channel);
-    }
-
-    @Override
-    protected LinkProviderService createProviderService(LinkProvider provider) {
-        return new LinkProviderServiceClientProxy(provider, channel);
-    }
-
-}
diff --git a/graveyard/rpc-grpc/src/main/java/org/onosproject/incubator/rpc/grpc/LinkProviderServiceClientProxy.java b/graveyard/rpc-grpc/src/main/java/org/onosproject/incubator/rpc/grpc/LinkProviderServiceClientProxy.java
deleted file mode 100644
index d80fb8d..0000000
--- a/graveyard/rpc-grpc/src/main/java/org/onosproject/incubator/rpc/grpc/LinkProviderServiceClientProxy.java
+++ /dev/null
@@ -1,264 +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.
- */
-package org.onosproject.incubator.rpc.grpc;
-
-import com.google.common.annotations.Beta;
-import com.google.common.util.concurrent.ListenableFuture;
-import io.grpc.Channel;
-import org.onosproject.grpc.net.link.LinkProviderServiceRpcGrpc;
-import org.onosproject.grpc.net.link.LinkProviderServiceRpcGrpc.LinkProviderServiceRpcFutureStub;
-import org.onosproject.grpc.net.link.LinkService.LinkDetectedMsg;
-import org.onosproject.grpc.net.link.LinkService.LinkVanishedMsg;
-import org.onosproject.grpc.net.link.LinkService.Void;
-import org.onosproject.grpc.net.link.models.LinkEnumsProto.LinkTypeProto;
-import org.onosproject.grpc.net.models.ConnectPointProtoOuterClass.ConnectPointProto;
-import org.onosproject.net.ConnectPoint;
-import org.onosproject.net.DeviceId;
-import org.onosproject.net.Link.Type;
-import org.onosproject.net.link.LinkDescription;
-import org.onosproject.net.link.LinkProvider;
-import org.onosproject.net.link.LinkProviderService;
-import org.onosproject.net.provider.AbstractProviderService;
-import org.onosproject.net.provider.ProviderId;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.util.concurrent.ExecutionException;
-import java.util.concurrent.TimeUnit;
-import java.util.concurrent.TimeoutException;
-
-import static org.onosproject.incubator.protobuf.models.net.LinkProtoTranslator.asMap;
-
-/**
- * Proxy object to handle LinkProviderService calls.
- *
- * RPC wise, this will initiate a RPC call on each method invocation.
- */
-@Beta
-class LinkProviderServiceClientProxy
-    extends AbstractProviderService<LinkProvider>
-    implements LinkProviderService {
-
-    private final Logger log = LoggerFactory.getLogger(getClass());
-
-    private final Channel channel;
-
-    /**
-     * Constructs {@link LinkProviderServiceClientProxy}.
-     *
-     * @param provider {@link LinkProvider}. Only ProviderId scheme is used.
-     * @param channel channel to use to call RPC
-     */
-    protected LinkProviderServiceClientProxy(LinkProvider provider, Channel channel) {
-        super(provider);
-        this.channel = channel;
-    }
-
-    @Override
-    public void linkDetected(LinkDescription linkDescription) {
-        checkValidity();
-
-        LinkProviderServiceRpcFutureStub newStub = LinkProviderServiceRpcGrpc.newFutureStub(channel);
-        ListenableFuture<Void> future = newStub.linkDetected(detectMsg(provider().id(), linkDescription));
-
-        try {
-            // There's no need to wait, but just checking server
-            future.get(500, TimeUnit.MILLISECONDS);
-        } catch (InterruptedException e) {
-            log.error("linkDetected({}) failed", linkDescription, e);
-            invalidate();
-            Thread.currentThread().interrupt();
-        } catch (ExecutionException | TimeoutException e) {
-            log.error("linkDetected({}) failed", linkDescription, e);
-            invalidate();
-        }
-    }
-
-    @Override
-    public void linkVanished(LinkDescription linkDescription) {
-        checkValidity();
-
-        LinkProviderServiceRpcFutureStub newStub = LinkProviderServiceRpcGrpc.newFutureStub(channel);
-        ListenableFuture<Void> future = newStub.linkVanished(vanishMsg(provider().id(), linkDescription));
-
-        try {
-            // There's no need to wait, but just checking server
-            future.get(500, TimeUnit.MILLISECONDS);
-        } catch (InterruptedException e) {
-            log.error("linkVanished({}) failed", linkDescription, e);
-            invalidate();
-            Thread.currentThread().interrupt();
-        } catch (ExecutionException | TimeoutException e) {
-            log.error("linkVanished({}) failed", linkDescription, e);
-            invalidate();
-        }
-    }
-
-    @Override
-    public void linksVanished(ConnectPoint connectPoint) {
-        checkValidity();
-
-        LinkProviderServiceRpcFutureStub newStub = LinkProviderServiceRpcGrpc.newFutureStub(channel);
-        ListenableFuture<Void> future = newStub.linkVanished(vanishMsg(provider().id(), connectPoint));
-
-        try {
-            // There's no need to wait, but just checking server
-            future.get(500, TimeUnit.MILLISECONDS);
-        } catch (InterruptedException e) {
-            log.error("linksVanished({}) failed", connectPoint, e);
-            invalidate();
-            Thread.currentThread().interrupt();
-        } catch (ExecutionException | TimeoutException e) {
-            log.error("linksVanished({}) failed", connectPoint, e);
-            invalidate();
-        }
-    }
-
-    @Override
-    public void linksVanished(DeviceId deviceId) {
-        checkValidity();
-
-        LinkProviderServiceRpcFutureStub newStub = LinkProviderServiceRpcGrpc.newFutureStub(channel);
-        ListenableFuture<Void> future = newStub.linkVanished(vanishMsg(provider().id(), deviceId));
-
-        try {
-            // There's no need to wait, but just checking server
-            future.get(500, TimeUnit.MILLISECONDS);
-        } catch (InterruptedException e) {
-            log.error("linksVanished({}) failed", deviceId, e);
-            invalidate();
-            Thread.currentThread().interrupt();
-        } catch (ExecutionException | TimeoutException e) {
-            log.error("linksVanished({}) failed", deviceId, e);
-            invalidate();
-        }
-    }
-
-    /**
-     * Builds {@link LinkDetectedMsg}.
-     *
-     * @param id ProviderId
-     * @param linkDescription {@link LinkDescription}
-     * @return {@link LinkDetectedMsg}
-     */
-    private LinkDetectedMsg detectMsg(ProviderId id,
-                                      LinkDescription linkDescription) {
-        LinkDetectedMsg.Builder builder = LinkDetectedMsg.newBuilder();
-        builder.setProviderId(id.scheme())
-               .setLinkDescription(builder.getLinkDescriptionBuilder()
-                                    .setSrc(translate(linkDescription.src()))
-                                    .setDst(translate(linkDescription.dst()))
-                                    .setType(translate(linkDescription.type()))
-                                    .putAllAnnotations(asMap(linkDescription.annotations()))
-                                    .build()
-                                    );
-        return builder.build();
-    }
-
-    /**
-     * Builds {@link LinkVanishedMsg}.
-     *
-     * @param id ProviderId
-     * @param linkDescription {@link LinkDescription}
-     * @return {@link LinkVanishedMsg}
-     */
-    private LinkVanishedMsg vanishMsg(ProviderId id,
-                                      LinkDescription linkDescription) {
-
-        LinkVanishedMsg.Builder builder = LinkVanishedMsg.newBuilder();
-        builder.setProviderId(id.scheme())
-            .setLinkDescription(builder.getLinkDescriptionBuilder()
-                             .setSrc(translate(linkDescription.src()))
-                             .setDst(translate(linkDescription.dst()))
-                             .setType(translate(linkDescription.type()))
-                             .putAllAnnotations(asMap(linkDescription.annotations()))
-                             .build()
-                             );
-        return builder.build();
-    }
-
-    /**
-     * Builds {@link LinkVanishedMsg}.
-     *
-     * @param id ProviderId
-     * @param connectPoint {@link ConnectPoint}
-     * @return {@link LinkVanishedMsg}
-     */
-    private LinkVanishedMsg vanishMsg(ProviderId id,
-                                      ConnectPoint connectPoint) {
-
-        LinkVanishedMsg.Builder builder = LinkVanishedMsg.newBuilder();
-        builder.setProviderId(id.scheme())
-            .setConnectPoint(translate(connectPoint));
-        return builder.build();
-    }
-
-    /**
-     * Builds {@link LinkVanishedMsg}.
-     *
-     * @param id ProviderId
-     * @param deviceId {@link DeviceId}
-     * @return {@link LinkVanishedMsg}
-     */
-    private LinkVanishedMsg vanishMsg(ProviderId id, DeviceId deviceId) {
-
-        LinkVanishedMsg.Builder builder = LinkVanishedMsg.newBuilder();
-        builder.setProviderId(id.scheme())
-            .setDeviceId(deviceId.toString());
-        return builder.build();
-    }
-
-    /**
-     * Translates ONOS object to gRPC message.
-     *
-     * @param type {@link org.onosproject.net.Link.Type Link.Type}
-     * @return gRPC LinkTypeProto
-     */
-    private LinkTypeProto translate(Type type) {
-        switch (type) {
-        case DIRECT:
-            return LinkTypeProto.DIRECT;
-        case EDGE:
-            return LinkTypeProto.EDGE;
-        case INDIRECT:
-            return LinkTypeProto.INDIRECT;
-        case OPTICAL:
-            return LinkTypeProto.OPTICAL;
-        case TUNNEL:
-            return LinkTypeProto.TUNNEL;
-        case VIRTUAL:
-            return LinkTypeProto.VIRTUAL;
-
-        default:
-            return LinkTypeProto.DIRECT;
-
-        }
-    }
-
-    /**
-     * Translates ONOS object to gRPC message.
-     *
-     * @param cp {@link ConnectPoint}
-     * @return gRPC ConnectPointProto
-     */
-    private ConnectPointProto translate(ConnectPoint cp) {
-        return ConnectPointProto.newBuilder()
-                .setDeviceId(cp.deviceId().toString())
-                .setPortNumber(cp.port().toString())
-                .build();
-    }
-
-}
diff --git a/graveyard/rpc-grpc/src/main/java/org/onosproject/incubator/rpc/grpc/LinkProviderServiceServerProxy.java b/graveyard/rpc-grpc/src/main/java/org/onosproject/incubator/rpc/grpc/LinkProviderServiceServerProxy.java
deleted file mode 100644
index 55c93fb..0000000
--- a/graveyard/rpc-grpc/src/main/java/org/onosproject/incubator/rpc/grpc/LinkProviderServiceServerProxy.java
+++ /dev/null
@@ -1,225 +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.
- */
-package org.onosproject.incubator.rpc.grpc;
-
-import com.google.common.annotations.Beta;
-import com.google.common.cache.Cache;
-import com.google.common.cache.CacheBuilder;
-import com.google.common.cache.RemovalNotification;
-import io.grpc.stub.StreamObserver;
-import org.apache.commons.lang3.tuple.Pair;
-import org.onosproject.grpc.net.link.LinkProviderServiceRpcGrpc.LinkProviderServiceRpcImplBase;
-import org.onosproject.grpc.net.link.LinkService.LinkDetectedMsg;
-import org.onosproject.grpc.net.link.LinkService.LinkVanishedMsg;
-import org.onosproject.grpc.net.link.LinkService.Void;
-import org.onosproject.grpc.net.link.models.LinkDescriptionProtoOuterClass.LinkDescriptionProto;
-import org.onosproject.grpc.net.link.models.LinkEnumsProto.LinkTypeProto;
-import org.onosproject.grpc.net.models.ConnectPointProtoOuterClass.ConnectPointProto;
-import org.onosproject.grpc.net.models.ConnectPointProtoOuterClass.ConnectPointProto.ElementIdCase;
-import org.onosproject.incubator.protobuf.models.net.LinkProtoTranslator;
-import org.onosproject.net.ConnectPoint;
-import org.onosproject.net.DeviceId;
-import org.onosproject.net.Link.Type;
-import org.onosproject.net.LinkKey;
-import org.onosproject.net.PortNumber;
-import org.onosproject.net.SparseAnnotations;
-import org.onosproject.net.link.DefaultLinkDescription;
-import org.onosproject.net.link.LinkDescription;
-import org.onosproject.net.link.LinkProviderService;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.util.concurrent.ScheduledExecutorService;
-import java.util.concurrent.TimeUnit;
-
-import static com.google.common.base.Preconditions.checkArgument;
-import static com.google.common.base.Preconditions.checkNotNull;
-import static com.google.common.cache.RemovalListeners.asynchronous;
-import static org.onosproject.net.DeviceId.deviceId;
-import static org.onosproject.net.LinkKey.linkKey;
-
-// Only single instance will be created and bound to gRPC LinkProviderService
-/**
- * Server-side implementation of gRPC version of LinkProviderService.
- */
-@Beta
-final class LinkProviderServiceServerProxy
-        extends LinkProviderServiceRpcImplBase {
-
-    /**
-     * Silence time in seconds, until link gets treated as vanished.
-     */
-    private static final int EVICT_LIMIT = 3 * 3;
-
-    private final Logger log = LoggerFactory.getLogger(getClass());
-
-    private final GrpcRemoteServiceServer server;
-
-    // TODO implement aging mechanism to automatically remove
-    // stale links reported by dead client, etc.
-    /**
-     * Evicting Cache to track last seen time.
-     */
-    private final Cache<Pair<String, LinkKey>, LinkDescription> lastSeen;
-
-    LinkProviderServiceServerProxy(GrpcRemoteServiceServer server) {
-        this.server = checkNotNull(server);
-        ScheduledExecutorService executor = server.getSharedExecutor();
-        lastSeen = CacheBuilder.newBuilder()
-                .expireAfterWrite(EVICT_LIMIT, TimeUnit.SECONDS)
-                .removalListener(asynchronous(this::onRemove, executor))
-                .build();
-
-        executor.scheduleWithFixedDelay(lastSeen::cleanUp,
-                                        EVICT_LIMIT, EVICT_LIMIT, TimeUnit.SECONDS);
-    }
-
-    private void onRemove(RemovalNotification<Pair<String, LinkKey>, LinkDescription> n) {
-        if (n.wasEvicted()) {
-            getLinkProviderServiceFor(n.getKey().getLeft())
-                .linkVanished(n.getValue());
-        }
-    }
-
-    /**
-     * Gets or creates {@link LinkProviderService} registered for given ProviderId scheme.
-     *
-     * @param scheme ProviderId scheme.
-     * @return {@link LinkProviderService}
-     */
-    private LinkProviderService getLinkProviderServiceFor(String scheme) {
-        return server.getLinkProviderServiceFor(scheme);
-    }
-
-    @Override
-    public void linkDetected(LinkDetectedMsg request,
-                             StreamObserver<Void> responseObserver) {
-
-        try {
-            onLinkDetected(request, responseObserver);
-            // If onNext call was not mandatory, it can be removed.
-            responseObserver.onNext(Void.getDefaultInstance());
-            responseObserver.onCompleted();
-        } catch (Exception e) {
-            log.error("Exception caught", e);
-            responseObserver.onError(e);
-        }
-    }
-
-    private void onLinkDetected(LinkDetectedMsg request,
-                                StreamObserver<Void> responseObserver) {
-        String scheme = request.getProviderId();
-
-        LinkProviderService linkProviderService = getLinkProviderServiceFor(scheme);
-
-        LinkDescription linkDescription = translate(request.getLinkDescription());
-        linkProviderService.linkDetected(linkDescription);
-        lastSeen.put(Pair.of(scheme, linkKey(linkDescription)), linkDescription);
-    }
-
-    @Override
-    public void linkVanished(LinkVanishedMsg request,
-                             StreamObserver<Void> responseObserver) {
-        try {
-            onLinksVanished(request, responseObserver);
-            // If onNext call was not mandatory, it can be removed.
-            responseObserver.onNext(Void.getDefaultInstance());
-            responseObserver.onCompleted();
-        } catch (Exception e) {
-            log.error("Exception caught", e);
-            responseObserver.onError(e);
-        }
-    }
-
-    private void onLinksVanished(LinkVanishedMsg request,
-                                 StreamObserver<Void> responseObserver) {
-        String scheme = request.getProviderId();
-        switch (request.getSubjectCase()) {
-        case CONNECT_POINT:
-            ConnectPoint cp = translate(request.getConnectPoint());
-            getLinkProviderServiceFor(scheme).linksVanished(cp);
-            break;
-        case DEVICE_ID:
-            DeviceId did = deviceId(request.getDeviceId());
-            getLinkProviderServiceFor(scheme).linksVanished(did);
-            break;
-        case LINK_DESCRIPTION:
-            LinkDescription desc = translate(request.getLinkDescription());
-            getLinkProviderServiceFor(scheme).linkVanished(desc);
-            lastSeen.invalidate(Pair.of(scheme, linkKey(desc)));
-            break;
-        case SUBJECT_NOT_SET:
-        default:
-            // do nothing
-            break;
-        }
-    }
-
-    /**
-     * Translates gRPC message to corresponding ONOS object.
-     *
-     * @param connectPoint gRPC message.
-     * @return {@link ConnectPoint}
-     */
-    private ConnectPoint translate(ConnectPointProto connectPoint) {
-        checkArgument(connectPoint.getElementIdCase() == ElementIdCase.DEVICE_ID,
-                      "Only DeviceId supported.");
-        return new ConnectPoint(deviceId(connectPoint.getDeviceId()),
-                                PortNumber.fromString(connectPoint.getPortNumber()));
-    }
-
-    /**
-     * Translates gRPC message to corresponding ONOS object.
-     *
-     * @param linkDescription gRPC message
-     * @return {@link LinkDescription}
-     */
-    private LinkDescription translate(LinkDescriptionProto linkDescription) {
-        ConnectPoint src = translate(linkDescription.getSrc());
-        ConnectPoint dst = translate(linkDescription.getDst());
-        Type type = translate(linkDescription.getType());
-        SparseAnnotations annotations = LinkProtoTranslator.asAnnotations(linkDescription.getAnnotations());
-        return new DefaultLinkDescription(src, dst, type, annotations);
-    }
-
-    /**
-     * Translates gRPC message to corresponding ONOS object.
-     *
-     * @param type gRPC message enum
-     * @return {@link Type Link.Type}
-     */
-    private Type translate(LinkTypeProto type) {
-        switch (type) {
-        case DIRECT:
-            return Type.DIRECT;
-        case EDGE:
-            return Type.EDGE;
-        case INDIRECT:
-            return Type.INDIRECT;
-        case OPTICAL:
-            return Type.INDIRECT;
-        case TUNNEL:
-            return Type.TUNNEL;
-        case VIRTUAL:
-            return Type.VIRTUAL;
-
-        case UNRECOGNIZED:
-        default:
-            return Type.DIRECT;
-        }
-    }
-
-}
diff --git a/graveyard/rpc-grpc/src/main/java/org/onosproject/incubator/rpc/grpc/StubLinkProvider.java b/graveyard/rpc-grpc/src/main/java/org/onosproject/incubator/rpc/grpc/StubLinkProvider.java
deleted file mode 100644
index bf8145b..0000000
--- a/graveyard/rpc-grpc/src/main/java/org/onosproject/incubator/rpc/grpc/StubLinkProvider.java
+++ /dev/null
@@ -1,40 +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.
- */
-package org.onosproject.incubator.rpc.grpc;
-
-import org.onosproject.net.link.LinkProvider;
-import org.onosproject.net.provider.AbstractProvider;
-import org.onosproject.net.provider.ProviderId;
-
-import com.google.common.annotations.Beta;
-import com.google.common.base.MoreObjects;
-
-/**
- * Stub LinkProvider to be registered on Server-side.
- */
-@Beta
-final class StubLinkProvider extends AbstractProvider implements LinkProvider {
-    protected StubLinkProvider(String scheme) {
-        super(new ProviderId(scheme, GrpcRemoteServiceServer.RPC_PROVIDER_NAME));
-    }
-
-    @Override
-    public String toString() {
-        return MoreObjects.toStringHelper(this)
-                .add("id", id())
-                .toString();
-    }
-}
diff --git a/graveyard/rpc-grpc/src/main/java/org/onosproject/incubator/rpc/grpc/package-info.java b/graveyard/rpc-grpc/src/main/java/org/onosproject/incubator/rpc/grpc/package-info.java
deleted file mode 100644
index e837950..0000000
--- a/graveyard/rpc-grpc/src/main/java/org/onosproject/incubator/rpc/grpc/package-info.java
+++ /dev/null
@@ -1,20 +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.
- */
-
-/**
- * gRPC based RemoteServiceProvider implementation.
- */
-package org.onosproject.incubator.rpc.grpc;
diff --git a/graveyard/rpc-grpc/src/main/proto/DeviceService.proto b/graveyard/rpc-grpc/src/main/proto/DeviceService.proto
deleted file mode 100644
index 023af13..0000000
--- a/graveyard/rpc-grpc/src/main/proto/DeviceService.proto
+++ /dev/null
@@ -1,101 +0,0 @@
-syntax = "proto3";
-option java_package = "org.onosproject.grpc.net.device";
-
-import "net/device/DeviceDescriptionProto.proto";
-import "net/device/PortDescriptionProto.proto";
-import "net/device/PortStatisticsProto.proto";
-import "net/MastershipRoleProto.proto";
-
-package Device;
-
-message DeviceConnected {
-  // DeviceID as String DeviceId#toString
-  string device_id = 1;
-  net.device.DeviceDescriptionProto device_description = 2;
-}
-
-message DeviceDisconnected {
-  // DeviceID as String DeviceId#toString
-  string device_id = 1;
-}
-
-message UpdatePorts {
-  // DeviceID as String DeviceId#toString
-  string device_id = 1;
-  repeated net.device.PortDescriptionProto port_descriptions= 2;
-}
-
-message PortStatusChanged {
-  // DeviceID as String DeviceId#toString
-  string device_id = 1;
-  net.device.PortDescriptionProto port_description= 2;
-}
-
-message ReceivedRoleReply {
-  // DeviceID as String DeviceId#toString
-  string device_id = 1;
-  net.MastershipRoleProto requested = 2;
-  net.MastershipRoleProto response = 3;
-}
-
-message UpdatePortStatistics {
-  // DeviceID as String DeviceId#toString
-  string device_id = 1;
-  repeated net.device.PortStatisticsProto port_statistics = 2;
-}
-
-message RegisterProvider {
-  // DeviceProvider's ProviderId scheme
-  string provider_scheme = 1;
-}
-
-message DeviceProviderServiceMsg {
-  oneof method {
-    DeviceConnected device_connected= 1;
-    DeviceDisconnected device_disconnected = 2;
-    UpdatePorts update_ports= 3;
-    PortStatusChanged port_status_changed = 4;
-    ReceivedRoleReply received_role_reply = 5;
-    UpdatePortStatistics update_port_statistics = 6;
-
-    // This message is for return value of DeviceProvider#isReachable
-    IsReachableResponse is_reachable_response = 7;
-
-    // This MUST be the 1st message over the stream
-    RegisterProvider register_provider = 8;
-  }
-}
-
-message TriggerProbe {
-  // DeviceID as String DeviceId#toString
-  string device_id = 1;
-}
-
-message RoleChanged {
-  // DeviceID as String DeviceId#toString
-  string device_id = 1;
-  net.MastershipRoleProto new_role = 2;
-}
-
-message IsReachableRequest {
-  int32 xid = 1;
-  // DeviceID as String DeviceId#toString
-  string device_id = 2;
-}
-
-message IsReachableResponse {
-  int32 xid = 1;
-  bool is_reachable = 2;
-}
-
-message DeviceProviderMsg {
-  oneof method {
-    TriggerProbe trigger_probe = 1;
-    RoleChanged role_changed = 2;
-    IsReachableRequest is_reachable_request= 3;
-  }
-}
-
-service DeviceProviderRegistryRpc {
-  rpc Register(stream DeviceProviderServiceMsg) returns (stream DeviceProviderMsg);
-}
diff --git a/graveyard/rpc-grpc/src/main/proto/LinkService.proto b/graveyard/rpc-grpc/src/main/proto/LinkService.proto
deleted file mode 100644
index e211e11..0000000
--- a/graveyard/rpc-grpc/src/main/proto/LinkService.proto
+++ /dev/null
@@ -1,31 +0,0 @@
-syntax = "proto3";
-option java_package = "org.onosproject.grpc.net.link";
-
-import "net/link/LinkDescriptionProto.proto";
-import "net/ConnectPointProto.proto";
-
-package Link;
-
-// Message to represent no return value
-message Void {}
-
-message LinkDetectedMsg {
-  // ProviderId scheme only
-  string provider_id = 1;
-  net.link.LinkDescriptionProto link_description = 2;
-}
-
-message LinkVanishedMsg {
-  // ProviderId scheme only
-  string provider_id = 1;
-  oneof subject {
-    net.link.LinkDescriptionProto link_description = 2;
-    net.ConnectPointProto connect_point = 3;
-    string device_id = 4;
-  }
-}
-
-service LinkProviderServiceRpc {
-  rpc LinkDetected(LinkDetectedMsg) returns (Void);
-  rpc LinkVanished(LinkVanishedMsg) returns (Void);
-}
diff --git a/graveyard/rpc-grpc/src/test/java/org/onosproject/incubator/rpc/grpc/GrpcRemoteServiceTest.java b/graveyard/rpc-grpc/src/test/java/org/onosproject/incubator/rpc/grpc/GrpcRemoteServiceTest.java
deleted file mode 100644
index 8990b6e..0000000
--- a/graveyard/rpc-grpc/src/test/java/org/onosproject/incubator/rpc/grpc/GrpcRemoteServiceTest.java
+++ /dev/null
@@ -1,578 +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.
- */
-package org.onosproject.incubator.rpc.grpc;
-
-import static org.junit.Assert.*;
-import static org.onosproject.net.DeviceId.deviceId;
-import static org.onosproject.net.PortNumber.portNumber;
-
-import java.net.URI;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.List;
-import java.util.Set;
-import java.util.concurrent.CountDownLatch;
-import java.util.concurrent.TimeUnit;
-
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Test;
-import org.onlab.junit.TestTools;
-import org.onlab.packet.ChassisId;
-import org.onosproject.incubator.rpc.RemoteServiceContext;
-import org.onosproject.incubator.rpc.RemoteServiceContextProvider;
-import org.onosproject.incubator.rpc.RemoteServiceContextProviderService;
-import org.onosproject.incubator.rpc.RemoteServiceProviderRegistry;
-import org.onosproject.net.ConnectPoint;
-import org.onosproject.net.DefaultAnnotations;
-import org.onosproject.net.Device.Type;
-import org.onosproject.net.DeviceId;
-import org.onosproject.net.Link;
-import org.onosproject.net.MastershipRole;
-import org.onosproject.net.PortNumber;
-import org.onosproject.net.SparseAnnotations;
-import org.onosproject.net.device.DefaultDeviceDescription;
-import org.onosproject.net.device.DefaultPortDescription;
-import org.onosproject.net.device.DeviceDescription;
-import org.onosproject.net.device.DeviceProvider;
-import org.onosproject.net.device.DeviceProviderRegistry;
-import org.onosproject.net.device.DeviceProviderService;
-import org.onosproject.net.device.PortDescription;
-import org.onosproject.net.device.PortStatistics;
-import org.onosproject.net.link.DefaultLinkDescription;
-import org.onosproject.net.link.LinkDescription;
-import org.onosproject.net.link.LinkProvider;
-import org.onosproject.net.link.LinkProviderRegistry;
-import org.onosproject.net.link.LinkProviderService;
-import org.onosproject.net.provider.AbstractProviderRegistry;
-import org.onosproject.net.provider.AbstractProviderService;
-import org.onosproject.net.provider.ProviderId;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import com.google.common.collect.ImmutableList;
-
-/**
- * Set of tests of the gRPC RemoteService components.
- */
-public class GrpcRemoteServiceTest {
-
-    private static final DeviceId DEVICE_ID = deviceId("dev:000001");
-
-    private final Logger log = LoggerFactory.getLogger(getClass());
-
-    private static final ProviderId PID = new ProviderId("test", "com.example.test");
-
-    private static final URI DURI = URI.create("dev:000001");
-
-    private static final String MFR = "mfr";
-
-    private static final String HW = "hw";
-
-    private static final String SW = "sw";
-
-    private static final String SN = "serial";
-
-    private static final ChassisId CHASSIS = new ChassisId(42);
-
-    private static final SparseAnnotations ANON = DefaultAnnotations.builder()
-                                                    .set("foo", "var")
-                                                    .build();
-
-    private static final PortNumber PORT = PortNumber.portNumber(99);
-
-    private static final DeviceDescription DDESC
-        = new DefaultDeviceDescription(DURI, Type.SWITCH, MFR, HW, SW, SN,
-                                       CHASSIS, ANON);
-
-    private GrpcRemoteServiceServer server;
-    private GrpcRemoteServiceProvider client;
-
-    private DeviceProvider svSideDeviceProvider;
-
-    private MTestDeviceProviderService svDeviceProviderService;
-
-    private ServerSideLinkProviderService svLinkProviderService;
-
-
-    private CountDownLatch serverReady;
-
-    private URI uri;
-
-    @Before
-    public void setUp() throws Exception {
-        serverReady = new CountDownLatch(1);
-        server = new GrpcRemoteServiceServer();
-        server.deviceProviderRegistry = new MTestDeviceProviderRegistry();
-        server.linkProviderRegistry = new ServerSideLinkProviderRegistry();
-        server.listenPort = TestTools.findAvailablePort(11984);
-        uri = URI.create("grpc://localhost:" + server.listenPort);
-        // todo: pass proper ComponentContext
-        server.activate(null);
-
-        client = new GrpcRemoteServiceProvider();
-        client.rpcRegistry = new NoOpRemoteServiceProviderRegistry();
-        client.activate();
-    }
-
-    @After
-    public void tearDown() {
-        client.deactivate();
-        server.deactivate();
-        svLinkProviderService = null;
-    }
-
-    private static void assertEqualsButNotSame(Object expected, Object actual) {
-        assertEquals(expected, actual);
-        assertNotSame("Cannot be same instance if it properly went through gRPC",
-                      expected, actual);
-    }
-
-    @Test
-    public void deviceServiceBasics() throws InterruptedException {
-        RemoteServiceContext remoteServiceContext = client.get(uri);
-        assertNotNull(remoteServiceContext);
-
-        DeviceProviderRegistry deviceProviderRegistry = remoteServiceContext.get(DeviceProviderRegistry.class);
-        assertNotNull(deviceProviderRegistry);
-
-        CTestDeviceProvider clDeviceProvider = new CTestDeviceProvider();
-        DeviceProviderService clDeviceProviderService = deviceProviderRegistry.register(clDeviceProvider);
-
-        assertTrue(serverReady.await(10, TimeUnit.SECONDS));
-
-        // client to server communication
-        clDeviceProviderService.deviceConnected(DEVICE_ID, DDESC);
-        assertTrue(svDeviceProviderService.deviceConnected.await(10, TimeUnit.SECONDS));
-        assertEqualsButNotSame(DEVICE_ID, svDeviceProviderService.deviceConnectedDid);
-        assertEqualsButNotSame(DDESC, svDeviceProviderService.deviceConnectedDesc);
-
-        PortDescription portDescription = DefaultPortDescription.builder().withPortNumber(PORT)
-                .isEnabled(true).annotations(ANON).build();
-        List<PortDescription> portDescriptions = ImmutableList.of(portDescription);
-        clDeviceProviderService.updatePorts(DEVICE_ID, portDescriptions);
-        assertTrue(svDeviceProviderService.updatePorts.await(10, TimeUnit.SECONDS));
-        assertEqualsButNotSame(DEVICE_ID, svDeviceProviderService.updatePortsDid);
-        assertEqualsButNotSame(portDescriptions, svDeviceProviderService.updatePortsDescs);
-
-        MastershipRole cRole = MastershipRole.MASTER;
-        MastershipRole dRole = MastershipRole.STANDBY;
-        clDeviceProviderService.receivedRoleReply(DEVICE_ID, cRole, dRole);
-        assertTrue(svDeviceProviderService.receivedRoleReply.await(10, TimeUnit.SECONDS));
-        assertEqualsButNotSame(DEVICE_ID, svDeviceProviderService.receivedRoleReplyDid);
-        assertEquals(cRole, svDeviceProviderService.receivedRoleReplyRequested);
-        assertEquals(dRole, svDeviceProviderService.receivedRoleReplyResponse);
-
-        clDeviceProviderService.portStatusChanged(DEVICE_ID, portDescription);
-        assertTrue(svDeviceProviderService.portStatusChanged.await(10, TimeUnit.SECONDS));
-        assertEqualsButNotSame(DEVICE_ID, svDeviceProviderService.portStatusChangedDid);
-        assertEqualsButNotSame(portDescription, svDeviceProviderService.portStatusChangedDesc);
-
-        Collection<PortStatistics> portStatistics = Collections.emptyList();
-        clDeviceProviderService.updatePortStatistics(DEVICE_ID, portStatistics);
-        assertTrue(svDeviceProviderService.updatePortStatistics.await(10, TimeUnit.SECONDS));
-        assertEqualsButNotSame(DEVICE_ID, svDeviceProviderService.updatePortStatisticsDid);
-        assertEqualsButNotSame(portStatistics, svDeviceProviderService.updatePortStatisticsStats);
-
-        clDeviceProviderService.deviceDisconnected(DEVICE_ID);
-        assertTrue(svDeviceProviderService.deviceDisconnected.await(10, TimeUnit.SECONDS));
-        assertEqualsButNotSame(DEVICE_ID, svDeviceProviderService.deviceDisconnectedDid);
-
-
-
-        // server to client communication
-        svSideDeviceProvider.triggerProbe(DEVICE_ID);
-        assertTrue(clDeviceProvider.triggerProbe.await(10, TimeUnit.SECONDS));
-        assertEquals(DEVICE_ID, clDeviceProvider.triggerProbeDid);
-        assertNotSame("Cannot be same instance if it properly went through gRPC",
-                      DEVICE_ID, clDeviceProvider.triggerProbeDid);
-
-        svSideDeviceProvider.roleChanged(DEVICE_ID, MastershipRole.STANDBY);
-        assertTrue(clDeviceProvider.roleChanged.await(10, TimeUnit.SECONDS));
-        assertEquals(DEVICE_ID, clDeviceProvider.roleChangedDid);
-        assertNotSame("Cannot be same instance if it properly went through gRPC",
-                      DEVICE_ID, clDeviceProvider.roleChangedDid);
-        assertEquals(MastershipRole.STANDBY, clDeviceProvider.roleChangedNewRole);
-
-        clDeviceProvider.isReachableReply = false;
-        assertEquals(clDeviceProvider.isReachableReply,
-                     svSideDeviceProvider.isReachable(DEVICE_ID));
-        assertTrue(clDeviceProvider.isReachable.await(10, TimeUnit.SECONDS));
-        assertEquals(DEVICE_ID, clDeviceProvider.isReachableDid);
-        assertNotSame("Cannot be same instance if it properly went through gRPC",
-                      DEVICE_ID, clDeviceProvider.isReachableDid);
-    }
-
-    @Test
-    public void linkVanishedDevice() throws InterruptedException {
-        RemoteServiceContext remoteServiceContext = client.get(uri);
-        assertNotNull(remoteServiceContext);
-
-        LinkProviderRegistry providerRegistry = remoteServiceContext.get(LinkProviderRegistry.class);
-        assertNotNull(providerRegistry);
-
-        final String schemeTest = "test";
-        LinkProviderService client = providerRegistry.register(new StubLinkProvider(schemeTest));
-        assertNotNull(client);
-
-        client.linksVanished(DEVICE_ID);
-
-        assertEquals(schemeTest, svLinkProviderService.provider().id().scheme());
-        assertTrue(svLinkProviderService.calls.await(10, TimeUnit.SECONDS));
-        assertEqualsButNotSame(DEVICE_ID, svLinkProviderService.arg);
-    }
-
-    @Test
-    public void linkVanishedPort() throws InterruptedException {
-        RemoteServiceContext remoteServiceContext = client.get(uri);
-        assertNotNull(remoteServiceContext);
-
-        LinkProviderRegistry providerRegistry = remoteServiceContext.get(LinkProviderRegistry.class);
-        assertNotNull(providerRegistry);
-
-        final String schemeTest = "test";
-        LinkProviderService client = providerRegistry.register(new StubLinkProvider(schemeTest));
-        assertNotNull(client);
-
-
-        final ConnectPoint cp = new ConnectPoint(DEVICE_ID, PORT);
-        client.linksVanished(cp);
-        assertEquals(schemeTest, svLinkProviderService.provider().id().scheme());
-        assertTrue(svLinkProviderService.calls.await(10, TimeUnit.SECONDS));
-        assertEqualsButNotSame(cp, svLinkProviderService.arg);
-    }
-
-    @Test
-    public void linkVanishedDescription() throws InterruptedException {
-        RemoteServiceContext remoteServiceContext = client.get(uri);
-        assertNotNull(remoteServiceContext);
-
-        LinkProviderRegistry providerRegistry = remoteServiceContext.get(LinkProviderRegistry.class);
-        assertNotNull(providerRegistry);
-
-        final String schemeTest = "test";
-        LinkProviderService client = providerRegistry.register(new StubLinkProvider(schemeTest));
-        assertNotNull(client);
-
-        ConnectPoint src = new ConnectPoint(deviceId("dev:1"), portNumber(10));
-        ConnectPoint dst = new ConnectPoint(deviceId("dev:2"), portNumber(20));
-        LinkDescription linkDescription = new DefaultLinkDescription(src, dst, Link.Type.DIRECT, ANON);
-        client.linkVanished(linkDescription);
-        assertEquals(schemeTest, svLinkProviderService.provider().id().scheme());
-        assertTrue(svLinkProviderService.calls.await(10, TimeUnit.SECONDS));
-        assertEqualsButNotSame(linkDescription, svLinkProviderService.arg);
-    }
-
-    @Test
-    public void linkDetected() throws InterruptedException {
-        RemoteServiceContext remoteServiceContext = client.get(uri);
-        assertNotNull(remoteServiceContext);
-
-        LinkProviderRegistry providerRegistry = remoteServiceContext.get(LinkProviderRegistry.class);
-        assertNotNull(providerRegistry);
-
-        final String schemeTest = "test";
-        LinkProviderService client = providerRegistry.register(new StubLinkProvider(schemeTest));
-        assertNotNull(client);
-
-        ConnectPoint src = new ConnectPoint(deviceId("dev:1"), portNumber(10));
-        ConnectPoint dst = new ConnectPoint(deviceId("dev:2"), portNumber(20));
-        LinkDescription linkDescription = new DefaultLinkDescription(src, dst, Link.Type.DIRECT, ANON);
-        client.linkDetected(linkDescription);
-        assertEquals(schemeTest, svLinkProviderService.provider().id().scheme());
-        assertTrue(svLinkProviderService.calls.await(10, TimeUnit.SECONDS));
-        assertEqualsButNotSame(linkDescription, svLinkProviderService.arg);
-    }
-
-    @Test
-    public void linkServiceBasics() throws InterruptedException {
-        RemoteServiceContext remoteServiceContext = client.get(uri);
-        assertNotNull(remoteServiceContext);
-
-        LinkProviderRegistry providerRegistry = remoteServiceContext.get(LinkProviderRegistry.class);
-        assertNotNull(providerRegistry);
-
-        final String schemeTest = "test";
-        LinkProviderService client = providerRegistry.register(new StubLinkProvider(schemeTest));
-        assertNotNull(client);
-
-        ConnectPoint src = new ConnectPoint(deviceId("dev:1"), portNumber(10));
-        ConnectPoint dst = new ConnectPoint(deviceId("dev:2"), portNumber(20));
-        LinkDescription linkDescription = new DefaultLinkDescription(src, dst, Link.Type.DIRECT, ANON);
-
-        client.linkDetected(linkDescription);
-        assertEquals(schemeTest, svLinkProviderService.provider().id().scheme());
-        assertTrue(svLinkProviderService.calls.await(10, TimeUnit.SECONDS));
-        assertEqualsButNotSame(linkDescription, svLinkProviderService.arg);
-
-        svLinkProviderService.reset();
-
-        client.linkVanished(linkDescription);
-        assertEquals(schemeTest, svLinkProviderService.provider().id().scheme());
-        assertTrue(svLinkProviderService.calls.await(10, TimeUnit.SECONDS));
-        assertEqualsButNotSame(linkDescription, svLinkProviderService.arg);
-    }
-
-    /**
-     * Device Provider on CO side.
-     */
-    public class CTestDeviceProvider implements DeviceProvider {
-
-        final CountDownLatch triggerProbe = new CountDownLatch(1);
-        DeviceId triggerProbeDid;
-
-        final CountDownLatch roleChanged = new CountDownLatch(1);
-        DeviceId roleChangedDid;
-        MastershipRole roleChangedNewRole;
-
-        final CountDownLatch isReachable = new CountDownLatch(1);
-        DeviceId isReachableDid;
-        boolean isReachableReply = false;
-
-        final CountDownLatch portStateChanged = new CountDownLatch(1);
-        DeviceId portStateChangedDid;
-        PortNumber portStateChangedPort;
-
-        @Override
-        public ProviderId id() {
-            return PID;
-        }
-
-        @Override
-        public void triggerProbe(DeviceId deviceId) {
-            log.info("triggerProbe({}) on Client called", deviceId);
-            triggerProbeDid = deviceId;
-            triggerProbe.countDown();
-        }
-
-        @Override
-        public void roleChanged(DeviceId deviceId, MastershipRole newRole) {
-            log.info("roleChanged({},{}) on Client called", deviceId, newRole);
-            roleChangedDid = deviceId;
-            roleChangedNewRole = newRole;
-            roleChanged.countDown();
-        }
-
-        @Override
-        public boolean isReachable(DeviceId deviceId) {
-            log.info("isReachable({}) on Client called", deviceId);
-            isReachableDid = deviceId;
-            isReachable.countDown();
-            return isReachableReply;
-        }
-
-        @Override
-        public void changePortState(DeviceId deviceId, PortNumber portNumber,
-                                    boolean enable) {
-            log.info("portState change to {} on ({},{}) on Client called", enable,
-                     deviceId, portNumber);
-            portStateChangedDid = deviceId;
-            portStateChangedPort = portNumber;
-            portStateChanged.countDown();
-
-        }
-
-    }
-
-    class NoOpRemoteServiceProviderRegistry
-        implements RemoteServiceProviderRegistry {
-
-        @Override
-        public RemoteServiceContextProviderService register(RemoteServiceContextProvider provider) {
-            return new RemoteServiceContextProviderService() {
-
-                @Override
-                public RemoteServiceContextProvider provider() {
-                    return provider;
-                }
-            };
-        }
-
-        @Override
-        public void unregister(RemoteServiceContextProvider provider) {
-        }
-
-        @Override
-        public Set<ProviderId> getProviders() {
-            return Collections.emptySet();
-        }
-    }
-
-    /**
-     * DeviceProvider on Metro side.
-     */
-    public class MTestDeviceProviderRegistry
-        extends AbstractProviderRegistry<DeviceProvider, DeviceProviderService>
-        implements DeviceProviderRegistry {
-
-        @Override
-        protected DeviceProviderService createProviderService(DeviceProvider provider) {
-            log.info("createProviderService({})", provider);
-            svSideDeviceProvider = provider;
-            svDeviceProviderService = new MTestDeviceProviderService(provider);
-            serverReady.countDown();
-            return svDeviceProviderService;
-        }
-
-    }
-
-    private final class MTestDeviceProviderService
-            extends AbstractProviderService<DeviceProvider>
-            implements DeviceProviderService {
-
-        public MTestDeviceProviderService(DeviceProvider provider) {
-            super(provider);
-        }
-
-
-        final CountDownLatch deviceConnected = new CountDownLatch(1);
-        DeviceId deviceConnectedDid;
-        DeviceDescription deviceConnectedDesc;
-
-        @Override
-        public void deviceConnected(DeviceId deviceId,
-                                    DeviceDescription deviceDescription) {
-            log.info("deviceConnected({}, {}) on Server called", deviceId, deviceDescription);
-            deviceConnectedDid = deviceId;
-            deviceConnectedDesc = deviceDescription;
-            deviceConnected.countDown();
-        }
-
-        final CountDownLatch updatePorts = new CountDownLatch(1);
-        DeviceId updatePortsDid;
-        List<PortDescription> updatePortsDescs;
-
-        @Override
-        public void updatePorts(DeviceId deviceId,
-                                List<PortDescription> portDescriptions) {
-            log.info("updatePorts({}, {}) on Server called", deviceId, portDescriptions);
-            updatePortsDid = deviceId;
-            updatePortsDescs = portDescriptions;
-            updatePorts.countDown();
-        }
-
-        final CountDownLatch receivedRoleReply = new CountDownLatch(1);
-        DeviceId receivedRoleReplyDid;
-        MastershipRole receivedRoleReplyRequested;
-        MastershipRole receivedRoleReplyResponse;
-
-        @Override
-        public void receivedRoleReply(DeviceId deviceId, MastershipRole requested,
-                                      MastershipRole response) {
-            log.info("receivedRoleReply({}, {}, {}) on Server called", deviceId, requested, response);
-            receivedRoleReplyDid = deviceId;
-            receivedRoleReplyRequested = requested;
-            receivedRoleReplyResponse = response;
-            receivedRoleReply.countDown();
-        }
-
-        final CountDownLatch portStatusChanged = new CountDownLatch(1);
-        DeviceId portStatusChangedDid;
-        PortDescription portStatusChangedDesc;
-
-
-        @Override
-        public void portStatusChanged(DeviceId deviceId,
-                                      PortDescription portDescription) {
-            log.info("portStatusChanged({}, {}) on Server called", deviceId, portDescription);
-            portStatusChangedDid = deviceId;
-            portStatusChangedDesc = portDescription;
-            portStatusChanged.countDown();
-        }
-
-        final CountDownLatch updatePortStatistics = new CountDownLatch(1);
-        DeviceId updatePortStatisticsDid;
-        Collection<PortStatistics> updatePortStatisticsStats;
-
-
-        @Override
-        public void updatePortStatistics(DeviceId deviceId,
-                                         Collection<PortStatistics> portStatistics) {
-            log.info("updatePortStatistics({}, {}) on Server called", deviceId, portStatistics);
-            updatePortStatisticsDid = deviceId;
-            updatePortStatisticsStats = portStatistics;
-            updatePortStatistics.countDown();
-        }
-
-        final CountDownLatch deviceDisconnected = new CountDownLatch(1);
-        DeviceId deviceDisconnectedDid;
-
-        @Override
-        public void deviceDisconnected(DeviceId deviceId) {
-            log.info("deviceDisconnected({}) on Server called", deviceId);
-            deviceDisconnectedDid = deviceId;
-            deviceDisconnected.countDown();
-        }
-    }
-
-    public class ServerSideLinkProviderRegistry
-            extends AbstractProviderRegistry<LinkProvider, LinkProviderService>
-            implements LinkProviderRegistry {
-
-        @Override
-        protected LinkProviderService createProviderService(LinkProvider provider) {
-            svLinkProviderService = new ServerSideLinkProviderService(provider);
-            return svLinkProviderService;
-        }
-
-    }
-
-    public class ServerSideLinkProviderService
-            extends AbstractProviderService<LinkProvider>
-            implements LinkProviderService {
-
-        CountDownLatch calls = new CountDownLatch(1);
-        Object arg = null;
-
-        public void reset() {
-            calls = new CountDownLatch(1);
-            arg = null;
-        }
-
-        public ServerSideLinkProviderService(LinkProvider provider) {
-            super(provider);
-        }
-
-        @Override
-        public void linksVanished(DeviceId deviceId) {
-            log.info("linksVanished({})", deviceId);
-            arg = deviceId;
-            calls.countDown();
-        }
-
-        @Override
-        public void linksVanished(ConnectPoint connectPoint) {
-            log.info("linksVanished({})", connectPoint);
-            arg = connectPoint;
-            calls.countDown();
-        }
-
-        @Override
-        public void linkVanished(LinkDescription linkDescription) {
-            log.info("linksVanished({})", linkDescription);
-            arg = linkDescription;
-            calls.countDown();
-        }
-
-        @Override
-        public void linkDetected(LinkDescription linkDescription) {
-            log.info("linkDetected({})", linkDescription);
-            arg = linkDescription;
-            calls.countDown();
-        }
-    }
-
-}
diff --git a/graveyard/rpc-nb/src/main/java/org/onosproject/incubator/rpc/nb/impl/GrpcServer.java b/graveyard/rpc-nb/src/main/java/org/onosproject/incubator/rpc/nb/impl/GrpcServer.java
deleted file mode 100644
index 4ea8e50..0000000
--- a/graveyard/rpc-nb/src/main/java/org/onosproject/incubator/rpc/nb/impl/GrpcServer.java
+++ /dev/null
@@ -1,78 +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.incubator.rpc.nb.impl;
-
-import io.grpc.Server;
-import io.grpc.netty.NettyServerBuilder;
-import org.osgi.service.component.annotations.Activate;
-import org.osgi.service.component.annotations.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;
-import org.slf4j.LoggerFactory;
-
-import java.io.IOException;
-
-/**
- * gRPC server for northbound APIs.
- */
-@Component(immediate = true)
-public class GrpcServer {
-
-    private final Logger log = LoggerFactory.getLogger(getClass());
-
-    @Reference(cardinality = ReferenceCardinality.MANDATORY)
-    protected MulticastRouteService multicastRouteService;
-
-    // TODO make configurable
-    private int port = 50051;
-
-    private Server server;
-
-    @Activate
-    public void activate() {
-        start();
-        log.info("Started");
-    }
-
-    @Deactivate
-    public void deactivate() {
-        stop();
-        log.info("Stopped");
-    }
-
-    private void start() {
-        try {
-            server = NettyServerBuilder.forPort(port)
-                    .addService(new MulticastRouteGrpcService(multicastRouteService))
-                    .build()
-                    .start();
-            log.info("gRPC server started listening on " + port);
-        } catch (IOException e) {
-            log.error("Failed to start gRPC server", e);
-        }
-    }
-
-    private void stop() {
-        if (server != null) {
-            server.shutdown();
-        }
-    }
-}
diff --git a/graveyard/rpc-nb/src/main/java/org/onosproject/incubator/rpc/nb/impl/package-info.java b/graveyard/rpc-nb/src/main/java/org/onosproject/incubator/rpc/nb/impl/package-info.java
deleted file mode 100644
index ca2f905..0000000
--- a/graveyard/rpc-nb/src/main/java/org/onosproject/incubator/rpc/nb/impl/package-info.java
+++ /dev/null
@@ -1,20 +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.
- */
-
-/**
- * Northbound gPRC implementation.
- */
-package org.onosproject.incubator.rpc.nb.impl;
diff --git a/graveyard/rpc-nb/src/main/java/org/onosproject/incubator/rpc/nb/mcast/MulticastRouteGrpcService.java b/graveyard/rpc-nb/src/main/java/org/onosproject/incubator/rpc/nb/mcast/MulticastRouteGrpcService.java
deleted file mode 100644
index f3f6e8c..0000000
--- a/graveyard/rpc-nb/src/main/java/org/onosproject/incubator/rpc/nb/mcast/MulticastRouteGrpcService.java
+++ /dev/null
@@ -1,102 +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.incubator.rpc.nb.mcast;
-
-import io.grpc.stub.StreamObserver;
-import org.onlab.packet.IpAddress;
-import org.onosproject.grpc.net.mcast.MulticastRouteServiceGrpc;
-import org.onosproject.grpc.net.mcast.MulticastRouteServiceOuterClass;
-import org.onosproject.net.mcast.McastRoute;
-import org.onosproject.net.mcast.MulticastRouteService;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import com.google.common.annotations.Beta;
-
-/**
- * Implementation of multicast gRPC service.
- */
-@Beta
-public class MulticastRouteGrpcService
-    extends MulticastRouteServiceGrpc.MulticastRouteServiceImplBase {
-
-    private final Logger log = LoggerFactory.getLogger(getClass());
-
-    private final MulticastRouteService multicastRouteService;
-
-    public MulticastRouteGrpcService(MulticastRouteService service) {
-        this.multicastRouteService = service;
-    }
-
-    @Override
-    public StreamObserver<MulticastRouteServiceOuterClass.MulticastRequest>
-            operation(StreamObserver<MulticastRouteServiceOuterClass.MulticastReply> responseObserver) {
-
-        return new MulticastServiceServerProxy(responseObserver);
-    }
-
-    private final class MulticastServiceServerProxy
-            implements StreamObserver<MulticastRouteServiceOuterClass.MulticastRequest> {
-
-        private final StreamObserver<MulticastRouteServiceOuterClass.MulticastReply> responseObserver;
-
-        public MulticastServiceServerProxy(
-                StreamObserver<MulticastRouteServiceOuterClass.MulticastReply> responseObserver) {
-            this.responseObserver = responseObserver;
-        }
-
-        @Override
-        public void onNext(MulticastRouteServiceOuterClass.MulticastRequest value) {
-            MulticastRouteServiceOuterClass.MulticastRoute route = value.getRoute();
-
-            switch (value.getOperation()) {
-            case ADD_ROUTE:
-                multicastRouteService.add(
-                        new McastRoute(IpAddress.valueOf(route.getSource()),
-                                IpAddress.valueOf(route.getGroup()),
-                                McastRoute.Type.STATIC));
-                break;
-            case ADD_SOURCE:
-                break;
-            case ADD_SINK:
-                break;
-            case REMOVE_ROUTE:
-                break;
-            case REMOVE_SOURCE:
-                break;
-            case REMOVE_SINK:
-                break;
-            case UNRECOGNIZED:
-            default:
-                break;
-            }
-
-            responseObserver.onNext(MulticastRouteServiceOuterClass.MulticastReply.newBuilder().build());
-        }
-
-        @Override
-        public void onError(Throwable t) {
-            log.warn("Error receiving multicast route", t);
-        }
-
-        @Override
-        public void onCompleted() {
-            // When the client closes their stream, we'll close ours too
-            responseObserver.onCompleted();
-        }
-    }
-}
diff --git a/graveyard/rpc-nb/src/main/java/org/onosproject/incubator/rpc/nb/mcast/package-info.java b/graveyard/rpc-nb/src/main/java/org/onosproject/incubator/rpc/nb/mcast/package-info.java
deleted file mode 100644
index 60fc7d0..0000000
--- a/graveyard/rpc-nb/src/main/java/org/onosproject/incubator/rpc/nb/mcast/package-info.java
+++ /dev/null
@@ -1,20 +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.
- */
-
-/**
- * Multicast gRPC implementation.
- */
-package org.onosproject.incubator.rpc.nb.mcast;
diff --git a/graveyard/rpc/src/main/java/org/onosproject/incubator/rpc/impl/AbstractProviderRegistry.java b/graveyard/rpc/src/main/java/org/onosproject/incubator/rpc/impl/AbstractProviderRegistry.java
deleted file mode 100644
index 2638064..0000000
--- a/graveyard/rpc/src/main/java/org/onosproject/incubator/rpc/impl/AbstractProviderRegistry.java
+++ /dev/null
@@ -1,73 +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.
- */
-package org.onosproject.incubator.rpc.impl;
-
-import java.util.Map;
-import java.util.Set;
-
-import org.onosproject.incubator.rpc.RemoteServiceContextProvider;
-import org.onosproject.incubator.rpc.RemoteServiceContextProviderService;
-import org.onosproject.incubator.rpc.RemoteServiceProviderRegistry;
-import org.onosproject.net.provider.ProviderId;
-
-import com.google.common.annotations.Beta;
-import com.google.common.collect.ImmutableSet;
-import com.google.common.collect.Maps;
-
-// Probably should change name or add missing feature (provider from scheme) to
-//  org.onosproject.net.provider.AbstractProviderRegistry<P, S>
-@Beta
-abstract class AbstractProviderRegistry
-    implements RemoteServiceProviderRegistry {
-
-
-    private final Map<ProviderId, RemoteServiceContextProvider> pidToProvider = Maps.newConcurrentMap();
-    private final Map<String, RemoteServiceContextProvider> schemeToProvider = Maps.newConcurrentMap();
-
-    public AbstractProviderRegistry() {
-        super();
-    }
-
-    protected abstract RemoteServiceContextProviderService createProviderService(RemoteServiceContextProvider provider);
-
-    @Override
-    public synchronized RemoteServiceContextProviderService register(RemoteServiceContextProvider provider) {
-        // TODO check if it already exists
-        pidToProvider.put(provider.id(), provider);
-        schemeToProvider.put(provider.id().scheme(), provider);
-        return createProviderService(provider);
-    }
-
-    @Override
-    public synchronized void unregister(RemoteServiceContextProvider provider) {
-        pidToProvider.remove(provider.id(), provider);
-        schemeToProvider.remove(provider.id().scheme(), provider);
-    }
-
-    @Override
-    public Set<ProviderId> getProviders() {
-        return ImmutableSet.copyOf(pidToProvider.keySet());
-    }
-
-    protected RemoteServiceContextProvider getProvider(ProviderId pid) {
-        return pidToProvider.get(pid);
-    }
-
-    protected RemoteServiceContextProvider getProvider(String scheme) {
-        return schemeToProvider.get(scheme);
-    }
-
-}
diff --git a/graveyard/rpc/src/main/java/org/onosproject/incubator/rpc/impl/LocalRemoteServiceProvider.java b/graveyard/rpc/src/main/java/org/onosproject/incubator/rpc/impl/LocalRemoteServiceProvider.java
deleted file mode 100644
index 5ef0d20..0000000
--- a/graveyard/rpc/src/main/java/org/onosproject/incubator/rpc/impl/LocalRemoteServiceProvider.java
+++ /dev/null
@@ -1,124 +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.
- */
-package org.onosproject.incubator.rpc.impl;
-
-import static com.google.common.base.Preconditions.checkArgument;
-
-import java.net.URI;
-import java.util.Map;
-import java.util.Objects;
-import java.util.concurrent.ConcurrentHashMap;
-
-import org.osgi.service.component.annotations.Activate;
-import org.osgi.service.component.annotations.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;
-import org.onosproject.incubator.rpc.RemoteServiceContextProvider;
-import org.onosproject.incubator.rpc.RemoteServiceContextProviderService;
-import org.onosproject.incubator.rpc.RemoteServiceProviderRegistry;
-import org.onosproject.net.provider.ProviderId;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import com.google.common.annotations.Beta;
-
-/**
- * Sample implementation of RemoteServiceContextProvider.
- *
- * Scheme: "local", calling corresponding local service on request.
- * Only expected for testing until real RPC implementation is ready.
- *
- * Note: This is expected to be removed or separated out as separate bundle
- * once other RPC implementaion became available.
- */
-@Beta
-@Component(immediate = true)
-public class LocalRemoteServiceProvider implements RemoteServiceContextProvider {
-
-    private final Logger log = LoggerFactory.getLogger(getClass());
-
-    private RemoteServiceContext theOne = new LocalServiceContext();
-
-    private static final ProviderId PID = new ProviderId("local", "org.onosproject.rpc.provider.local");
-
-    @Reference(cardinality = ReferenceCardinality.MANDATORY)
-    protected RemoteServiceProviderRegistry rpcRegistry;
-
-    private final Map<Class<? extends Object>, Object> services = new ConcurrentHashMap<>();
-
-    private RemoteServiceContextProviderService providerService;
-
-    @Activate
-    protected void activate() {
-
-        services.put(SomeOtherService.class, new SomeOtherServiceImpl());
-
-        providerService = rpcRegistry.register(this);
-        log.info("Started");
-    }
-
-    @Deactivate
-    protected void deactivate() {
-        rpcRegistry.unregister(this);
-        log.info("Stopped");
-    }
-
-    @Override
-    public ProviderId id() {
-        return PID;
-    }
-
-    @Override
-    public RemoteServiceContext get(URI uri) {
-        checkArgument(Objects.equals(uri.getScheme(), "local"));
-        return theOne;
-    }
-
-    private final class LocalServiceContext implements RemoteServiceContext {
-
-        private final ServiceDirectory directory = new DefaultServiceDirectory();
-
-        @Override
-        public <T> T get(Class<T> serviceClass) {
-            @SuppressWarnings("unchecked")
-            T service = (T) services.get(serviceClass);
-            if (service != null) {
-                return service;
-            }
-            // look up OSGi services on this host.
-            // provided to unblock development depending on RPC.
-            return directory.get(serviceClass);
-        }
-    }
-
-    // Service provided by RPC can be non-OSGi Service
-    public static interface SomeOtherService {
-        String hello();
-    }
-
-    public static class SomeOtherServiceImpl implements SomeOtherService {
-
-        @Override
-        public String hello() {
-            return "Goodbye";
-        }
-    }
-
-}
diff --git a/graveyard/rpc/src/main/java/org/onosproject/incubator/rpc/impl/RemoteServiceManager.java b/graveyard/rpc/src/main/java/org/onosproject/incubator/rpc/impl/RemoteServiceManager.java
deleted file mode 100644
index b6afe06..0000000
--- a/graveyard/rpc/src/main/java/org/onosproject/incubator/rpc/impl/RemoteServiceManager.java
+++ /dev/null
@@ -1,77 +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.
- */
-package org.onosproject.incubator.rpc.impl;
-
-import com.google.common.annotations.Beta;
-import org.onosproject.incubator.rpc.RemoteServiceContext;
-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 java.net.URI;
-
-/**
- * Provides RemoteService related APIs.
- */
-@Beta
-@Component(immediate = true, service = { RemoteServiceDirectory.class, RemoteServiceProviderRegistry.class })
-public class RemoteServiceManager extends AbstractProviderRegistry
-    implements RemoteServiceDirectory, RemoteServiceProviderRegistry {
-
-    private final Logger log = LoggerFactory.getLogger(getClass());
-
-    @Activate
-    protected void activate() {
-        log.info("Started");
-    }
-
-    @Deactivate
-    protected void deactivate() {
-        log.info("Stopped");
-    }
-
-    @Override
-    public RemoteServiceContext get(URI uri) {
-        RemoteServiceContextProvider factory = getProvider(uri.getScheme());
-        if (factory != null) {
-            return factory.get(uri);
-        }
-        throw new UnsupportedOperationException(uri.getScheme() + " not supported");
-    }
-
-    private final class InternalRemoteServiceContextProviderService
-            extends AbstractProviderService<RemoteServiceContextProvider>
-            implements RemoteServiceContextProviderService {
-
-        public InternalRemoteServiceContextProviderService(RemoteServiceContextProvider provider) {
-            super(provider);
-        }
-    }
-
-    // make this abstract method if slicing out
-    @Override
-    protected RemoteServiceContextProviderService createProviderService(RemoteServiceContextProvider provider) {
-        return new InternalRemoteServiceContextProviderService(provider);
-    }
-
-}
diff --git a/graveyard/rpc/src/main/java/org/onosproject/incubator/rpc/impl/package-info.java b/graveyard/rpc/src/main/java/org/onosproject/incubator/rpc/impl/package-info.java
deleted file mode 100644
index 79017c1..0000000
--- a/graveyard/rpc/src/main/java/org/onosproject/incubator/rpc/impl/package-info.java
+++ /dev/null
@@ -1,20 +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.
- */
-
-/**
- * Implementation of the inter-cluster RPC service.
- */
-package org.onosproject.incubator.rpc.impl;
diff --git a/graveyard/rpc/src/test/java/org/onosproject/incubator/rpc/impl/RemoteServiceManagerTest.java b/graveyard/rpc/src/test/java/org/onosproject/incubator/rpc/impl/RemoteServiceManagerTest.java
deleted file mode 100644
index 40458e5..0000000
--- a/graveyard/rpc/src/test/java/org/onosproject/incubator/rpc/impl/RemoteServiceManagerTest.java
+++ /dev/null
@@ -1,71 +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.
- */
-package org.onosproject.incubator.rpc.impl;
-
-import static org.junit.Assert.*;
-
-import java.net.URI;
-
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Test;
-import org.onosproject.incubator.rpc.RemoteServiceContext;
-import org.onosproject.incubator.rpc.RemoteServiceDirectory;
-import org.onosproject.incubator.rpc.impl.LocalRemoteServiceProvider.SomeOtherService;
-
-/**
- * Set of tests of the RemoteServiceManager component.
- */
-public class RemoteServiceManagerTest {
-
-    private static final URI LOCAL_URI = URI.create("local://whateverIgnored");
-
-    private RemoteServiceManager rpcManager;
-    private RemoteServiceDirectory rpcDirectory;
-
-    private LocalRemoteServiceProvider rpcProvider;
-
-    @Before
-    public void setUp() {
-        rpcManager = new RemoteServiceManager();
-        rpcManager.activate();
-        rpcDirectory = rpcManager;
-
-        rpcProvider = new LocalRemoteServiceProvider();
-        rpcProvider.rpcRegistry = rpcManager;
-        rpcProvider.activate();
-
-    }
-
-    @After
-    public void tearDown() {
-        rpcProvider.deactivate();
-
-        rpcManager.deactivate();
-    }
-
-    @Test
-    public void basics() {
-        RemoteServiceContext remoteServiceContext = rpcDirectory.get(LOCAL_URI);
-        assertNotNull("Expecting valid RPC context", remoteServiceContext);
-
-        SomeOtherService someService = remoteServiceContext.get(SomeOtherService.class);
-        assertNotNull("Expecting reference to sample service", someService);
-
-        assertEquals("Goodbye", someService.hello());
-    }
-
-}
