First attempt at supporting builds with Java 11

Includes:
- Bump protobuf to 3.8.0 and grpc-java to 1.21.0 (along with transitive
  dependencies such as Netty)
- Add jaxb_api at compile time when needed (removed in JDK 11)
- Bump Bnd to 4.1 (adds support for Java 11)

To build with JDK 11, uncomment lines in .bazelrc.
Tested with Bazel 0.26.0.

Change-Id: Ib8e0c7310eacf97328762606e57c01e4834e5565
diff --git a/.bazelrc b/.bazelrc
index 3bd8166..64f85c8 100644
--- a/.bazelrc
+++ b/.bazelrc
@@ -1,3 +1,10 @@
+# Build options to use JDK 11
+# build --incompatible_use_jdk11_as_host_javabase
+# build --javabase=@bazel_tools//tools/jdk:remote_jdk11
+# build --host_javabase=@bazel_tools//tools/jdk:remote_jdk11
+# build --host_java_toolchain=@bazel_tools//tools/jdk:toolchain_vanilla
+# build --java_toolchain=@bazel_tools//tools/jdk:toolchain_vanilla
+
 build --nouse_ijars
 build --experimental_strict_action_env
 test --test_summary=terse
diff --git a/WORKSPACE b/WORKSPACE
index 69f47c7..aeadecc 100644
--- a/WORKSPACE
+++ b/WORKSPACE
@@ -32,13 +32,21 @@
 
 generate_protobuf()
 
+load("@com_google_protobuf//:protobuf_deps.bzl", "protobuf_deps")
+
+protobuf_deps()
+
 load("//tools/build/bazel:grpc_workspace.bzl", "generate_grpc")
 
 generate_grpc()
 
 load("@io_grpc_grpc_java//:repositories.bzl", "grpc_java_repositories")
 
+# We omit as many dependencies as we can and instead import the same via
+# deps.json, so they get wrapped properly for Karaf runtime.
 grpc_java_repositories(
+    omit_bazel_skylib = False,
+    omit_com_google_android_annotations = False,
     omit_com_google_api_grpc_google_common_protos = True,
     omit_com_google_auth_google_auth_library_credentials = True,
     omit_com_google_auth_google_auth_library_oauth2_http = True,
@@ -46,14 +54,15 @@
     omit_com_google_code_gson = True,
     omit_com_google_errorprone_error_prone_annotations = True,
     omit_com_google_guava = True,
+    omit_com_google_guava_failureaccess = False,
     omit_com_google_j2objc_j2objc_annotations = True,
     omit_com_google_protobuf = True,
     omit_com_google_protobuf_javalite = True,
     omit_com_google_protobuf_nano_protobuf_javanano = True,
-    omit_com_google_re2j = True,
     omit_com_google_truth_truth = True,
     omit_com_squareup_okhttp = True,
     omit_com_squareup_okio = True,
+    omit_io_grpc_grpc_proto = True,
     omit_io_netty_buffer = True,
     omit_io_netty_codec = True,
     omit_io_netty_codec_http = True,
@@ -67,8 +76,9 @@
     omit_io_netty_transport = True,
     omit_io_opencensus_api = True,
     omit_io_opencensus_grpc_metrics = True,
-    omit_javax_annotation = False,
+    omit_javax_annotation = True,
     omit_junit_junit = True,
+    omit_net_zlib = True,
     omit_org_apache_commons_lang3 = True,
     omit_org_codehaus_mojo_animal_sniffer_annotations = True,
 )
diff --git a/apps/castor/BUILD b/apps/castor/BUILD
index 546453b..d493321 100644
--- a/apps/castor/BUILD
+++ b/apps/castor/BUILD
@@ -2,6 +2,7 @@
     "//core/store/serializers:onos-core-serializers",
     "//apps/routing-api:onos-apps-routing-api",
     "//apps/intentsync:onos-apps-intentsync",
+    "@jaxb_api//jar",
 ]
 
 BUNDLES = [
diff --git a/apps/onlp-demo/BUILD b/apps/onlp-demo/BUILD
index 2ef30c2..8bae746 100644
--- a/apps/onlp-demo/BUILD
+++ b/apps/onlp-demo/BUILD
@@ -1,6 +1,6 @@
 COMPILE_DEPS = CORE_DEPS + JACKSON + [
     "//lib:com_google_protobuf_protobuf_java",
-    "//lib:io_grpc_grpc_core_context",
+    "//lib:io_grpc_grpc_api_context",
     "//lib:io_grpc_grpc_netty",
     "//lib:io_grpc_grpc_stub",
     "//core/store/serializers:onos-core-serializers",
diff --git a/apps/openstacktelemetry/BUILD b/apps/openstacktelemetry/BUILD
index 33b9813..11a1d3d 100644
--- a/apps/openstacktelemetry/BUILD
+++ b/apps/openstacktelemetry/BUILD
@@ -16,7 +16,7 @@
     "@simpleclient_hotspot//jar",
     "@simpleclient_servlet//jar",
     # gRPC dependencies (with patched core)
-    "//lib:io_grpc_grpc_core_context",
+    "//lib:io_grpc_grpc_api_context",
     "//lib:io_grpc_grpc_stub",
     "//lib:io_grpc_grpc_netty",
     "//lib:io_grpc_grpc_auth",
diff --git a/apps/openstacktelemetry/app/BUILD b/apps/openstacktelemetry/app/BUILD
index ecfb34d..76f1247 100644
--- a/apps/openstacktelemetry/app/BUILD
+++ b/apps/openstacktelemetry/app/BUILD
@@ -12,7 +12,7 @@
     "@jetty_util//jar",
     "@jetty_websocket//jar",
     "@servlet_api//jar",
-    "//lib:io_grpc_grpc_core_context",
+    "//lib:io_grpc_grpc_api_context",
     "//lib:io_grpc_grpc_protobuf_lite",
     "//core/store/serializers:onos-core-serializers",
     "//apps/openstacknode/api:onos-apps-openstacknode-api",
diff --git a/apps/pcep-api/BUILD b/apps/pcep-api/BUILD
index 530f2b7..b759412 100644
--- a/apps/pcep-api/BUILD
+++ b/apps/pcep-api/BUILD
@@ -1,6 +1,7 @@
 COMPILE_DEPS = CORE_DEPS + JACKSON + [
     "//protocols/ovsdb/api:onos-protocols-ovsdb-api",
     "//protocols/ovsdb/rfc:onos-protocols-ovsdb-rfc",
+    "@jaxb_api//jar",
 ]
 
 osgi_jar_with_tests(
diff --git a/drivers/bmv2/BUILD b/drivers/bmv2/BUILD
index 9478b50..2b42bdb 100644
--- a/drivers/bmv2/BUILD
+++ b/drivers/bmv2/BUILD
@@ -4,7 +4,7 @@
     "//pipelines/basic:onos-pipelines-basic",
     "//protocols/p4runtime/api:onos-protocols-p4runtime-api",
     "//protocols/p4runtime/model:onos-protocols-p4runtime-model",
-    "//lib:io_grpc_grpc_core_context",
+    "//lib:io_grpc_grpc_api_context",
     "//lib:io_grpc_grpc_netty",
     "@minimal_json//jar",
     # "//protocols/bmv2/thrift-api:onos-protocols-bmv2-thrift-api",
diff --git a/drivers/gnmi/BUILD b/drivers/gnmi/BUILD
index f2c33d0..de00da9 100644
--- a/drivers/gnmi/BUILD
+++ b/drivers/gnmi/BUILD
@@ -1,6 +1,6 @@
 COMPILE_DEPS = CORE_DEPS + KRYO + [
     "//lib:com_google_protobuf_protobuf_java",
-    "//lib:io_grpc_grpc_core_context",
+    "//lib:io_grpc_grpc_api_context",
     "//lib:io_grpc_grpc_netty",
     "//lib:io_grpc_grpc_stub",
     "//core/store/serializers:onos-core-serializers",
diff --git a/drivers/gnoi/BUILD b/drivers/gnoi/BUILD
index 122c961..70b3c83 100644
--- a/drivers/gnoi/BUILD
+++ b/drivers/gnoi/BUILD
@@ -1,6 +1,6 @@
 COMPILE_DEPS = CORE_DEPS + KRYO + [
     "//lib:com_google_protobuf_protobuf_java",
-    "//lib:io_grpc_grpc_core_context",
+    "//lib:io_grpc_grpc_api_context",
     "//lib:io_grpc_grpc_netty",
     "//lib:io_grpc_grpc_stub",
     "//protocols/gnoi/stub:onos-protocols-gnoi-stub",
diff --git a/drivers/p4runtime/BUILD b/drivers/p4runtime/BUILD
index 23c6e9e..ded8842 100644
--- a/drivers/p4runtime/BUILD
+++ b/drivers/p4runtime/BUILD
@@ -3,7 +3,7 @@
     "//protocols/grpc/api:onos-protocols-grpc-api",
     "//protocols/grpc/utils:onos-protocols-grpc-utils",
     "//protocols/p4runtime/api:onos-protocols-p4runtime-api",
-    "//lib:io_grpc_grpc_core_context",
+    "//lib:io_grpc_grpc_api_context",
 ]
 
 BUNDLES = [
diff --git a/drivers/stratum/BUILD b/drivers/stratum/BUILD
index 91b055c..e6e84d8 100644
--- a/drivers/stratum/BUILD
+++ b/drivers/stratum/BUILD
@@ -1,5 +1,5 @@
 COMPILE_DEPS = CORE_DEPS + KRYO + JACKSON + [
-    "//lib:io_grpc_grpc_core_context",
+    "//lib:io_grpc_grpc_api_context",
     "//drivers/p4runtime:onos-drivers-p4runtime",
     "//drivers/gnmi:onos-drivers-gnmi",
     "//drivers/gnoi:onos-drivers-gnoi",
diff --git a/lib/BUILD b/lib/BUILD
index 52c4ea6..cfb43b5 100644
--- a/lib/BUILD
+++ b/lib/BUILD
@@ -4,15 +4,50 @@
 # original ones are built with Bazel and NOT imported via mvn.
 
 wrapped_osgi_jar(
-    # Differently from the official "grpc-core" package, here we also include
+    # Differently from the official "grpc-api" package, here we also include
     # "grpc-context" to solve the OSGI split-brain problem:
     # https://github.com/grpc/grpc-java/issues/2727
-    # We use patched Bazel BUILD files to package together core and context (see
+    # We use patched Bazel BUILD files to package together api and context (see
     # tools/build/bazel/grpc_workspace.bzl). If you need grpc-context as a
     # compile-time dependency, please use this one.
-    name = "io_grpc_grpc_core_context",
+    name = "io_grpc_grpc_api_context",
     generate_pom = True,
-    jar = "@io_grpc_grpc_java//core",
+    # Name resolver and load balancer providers which are part of the internal
+    # package are loaded dynamically, hence this import statement.
+    import_packages = "io.grpc.internal,*",
+    jar = "@io_grpc_grpc_java//api",
+    visibility = ["//visibility:public"],
+    deps = [],
+)
+
+wrapped_osgi_jar(
+    name = "io_grpc_grpc_core_inprocess",
+    generate_pom = True,
+    jar = "@io_grpc_grpc_java//core:inprocess",
+    visibility = ["//visibility:public"],
+    deps = [],
+)
+
+wrapped_osgi_jar(
+    name = "io_grpc_grpc_core_internal",
+    generate_pom = True,
+    jar = "@io_grpc_grpc_java//core:internal",
+    visibility = ["//visibility:public"],
+    deps = [],
+)
+
+wrapped_osgi_jar(
+    name = "io_grpc_grpc_core_util",
+    generate_pom = True,
+    jar = "@io_grpc_grpc_java//core:util",
+    visibility = ["//visibility:public"],
+    deps = [],
+)
+
+wrapped_osgi_jar(
+    name = "io_grpc_grpc_core_perfmark",
+    generate_pom = True,
+    jar = "@io_grpc_grpc_java//core:perfmark",
     visibility = ["//visibility:public"],
     deps = [],
 )
diff --git a/lib/deps.json b/lib/deps.json
index 4b59b68..38aed00 100644
--- a/lib/deps.json
+++ b/lib/deps.json
@@ -67,7 +67,7 @@
       "hk2-utils",
       "javax.inject",
       "hk2-osgi-resource-locator",
-      "javax.annotation-api-mvn",
+      "javax_annotation_javax_annotation_api",
       "validation-api",
       "//core/common:onos-core-common",
       "//core/api:onos-api-tests",
@@ -184,7 +184,7 @@
 
     // Note: grpc imports "javax_annotation_api" has an http file, so we need to give a different name here
     // See WORKSPACE
-    "javax.annotation-api-mvn": "mvn:javax.annotation:javax.annotation-api:1.3",
+    "javax_annotation_javax_annotation_api": "mvn:javax.annotation:javax.annotation-api:1.3",
 
     "javax.inject": "mvn:org.glassfish.hk2.external:javax.inject:2.5.0-b42",
     "javax.ws.rs-api": "mvn:javax.ws.rs:javax.ws.rs-api:2.1",
@@ -229,19 +229,19 @@
     "minimal-json": "mvn:com.eclipsesource.minimal-json:minimal-json:0.9.4",
     "minlog": "mvn:com.esotericsoftware:minlog:1.3.0",
     "io_netty_netty": "mvn:io.netty:netty:3.10.5.Final",
-    "io_netty_netty_buffer": "mvn:io.netty:netty-buffer:4.1.32.Final",
-    "io_netty_netty_codec": "mvn:io.netty:netty-codec:4.1.32.Final",
-    "io_netty_netty_common": "mvn:io.netty:netty-common:4.1.32.Final",
-    "io_netty_netty_handler": "mvn:io.netty:netty-handler:4.1.32.Final",
-    "io_netty_netty_handler_proxy": "mvn:io.netty:netty-handler-proxy:4.1.32.Final",
-    "io_netty_netty_transport": "mvn:io.netty:netty-transport:4.1.32.Final",
-    "io_netty_netty_transport_native_unix_common": "mvn:io.netty:netty-transport-native-unix-common:4.1.32.Final",
-    "io_netty_netty_transport-native-epoll": "mvn:io.netty:netty-transport-native-epoll:4.1.32.Final",
-    "io_netty_netty_resolver": "mvn:io.netty:netty-resolver:4.1.32.Final",
-    "io_netty_netty_codec-http2": "mvn:io.netty:netty-codec-http2:4.1.32.Final",
-    "io_netty_netty_codec-http": "mvn:io.netty:netty-codec-http:4.1.32.Final",
-    "io_netty_netty_codec-socks": "mvn:io.netty:netty-codec-socks:4.1.32.Final",
-    "io_netty_netty_tcnative_boringssl": "mvn:io.netty:netty-tcnative-boringssl-static:2.0.20.Final",
+    "io_netty_netty_buffer": "mvn:io.netty:netty-buffer:4.1.34.Final",
+    "io_netty_netty_codec": "mvn:io.netty:netty-codec:4.1.34.Final",
+    "io_netty_netty_common": "mvn:io.netty:netty-common:4.1.34.Final",
+    "io_netty_netty_handler": "mvn:io.netty:netty-handler:4.1.34.Final",
+    "io_netty_netty_handler_proxy": "mvn:io.netty:netty-handler-proxy:4.1.34.Final",
+    "io_netty_netty_transport": "mvn:io.netty:netty-transport:4.1.34.Final",
+    "io_netty_netty_transport_native_unix_common": "mvn:io.netty:netty-transport-native-unix-common:4.1.34.Final",
+    "io_netty_netty_transport-native-epoll": "mvn:io.netty:netty-transport-native-epoll:4.1.34.Final",
+    "io_netty_netty_resolver": "mvn:io.netty:netty-resolver:4.1.34.Final",
+    "io_netty_netty_codec-http2": "mvn:io.netty:netty-codec-http2:4.1.34.Final",
+    "io_netty_netty_codec-http": "mvn:io.netty:netty-codec-http:4.1.34.Final",
+    "io_netty_netty_codec-socks": "mvn:io.netty:netty-codec-socks:4.1.34.Final",
+    "io_netty_netty_tcnative_boringssl": "mvn:io.netty:netty-tcnative-boringssl-static:2.0.22.Final",
     "objenesis": "mvn:org.objenesis:objenesis:2.6",
     "openflowj": "mvn:org.onosproject:openflowj:3.2.1.onos",
     "org.osgi.util.function": "mvn:org.osgi:org.osgi.util.function:1.1.0",
@@ -275,8 +275,8 @@
     "validation-api": "mvn:javax.validation:validation-api:1.1.0.Final",
     "checkstyle": "mvn:com.puppycrawl.tools:checkstyle:8.10",
     "apache-karaf": "http://repo1.maven.org/maven2/org/onosproject/apache-karaf-offline/4.2.5-offline-201904251/apache-karaf-4.2.5-offline-201904251.tar.gz",
-    "bndlib": "mvn:biz.aQute.bnd:biz.aQute.bndlib:jar:4.0.0",
-    "bndexe": "mvn:biz.aQute.bnd:biz.aQute.bnd:4.0.0",
+    "bndlib": "mvn:biz.aQute.bnd:biz.aQute.bndlib:jar:4.1.0",
+    "bndexe": "mvn:biz.aQute.bnd:biz.aQute.bnd:4.1.0",
     "libthrift": "mvn:org.apache.thrift:libthrift:0.11.0",
     "qdox": "mvn:com.thoughtworks.qdox:qdox:2.0-M3",
     "snmp-core": "mvn:org.onosproject:snmp-core:1.3-20161021.1",
@@ -290,12 +290,12 @@
 
     // grpc related jars
     "com_google_api_grpc_proto_google_common_protos": "mvn:com.google.api.grpc:proto-google-common-protos:1.12.0",
-    "com_google_errorprone_error_prone_annotations": "mvn:com.google.errorprone:error_prone_annotations:2.3.2",
-    "com_google_auth_google_auth_library_credentials": "mvn:com.google.auth:google-auth-library-credentials:0.9.0",
-    "com_google_auth_google_auth_library_oauth2_http": "mvn:com.google.auth:google-auth-library-oauth2-http:0.9.0",
+    "com_google_errorprone_error_prone_annotations": "mvn:com.google.errorprone:error_prone_annotations:2.3.3",
+    "com_google_auth_google_auth_library_credentials": "mvn:com.google.auth:google-auth-library-credentials:0.13.0",
+    "com_google_auth_google_auth_library_oauth2_http": "mvn:com.google.auth:google-auth-library-oauth2-http:0.13.0",
     "com_google_j2objc_j2objc_annotations": "mvn:com.google.j2objc:j2objc-annotations:1.1",
-    "io_opencensus_opencensus_api": "mvn:io.opencensus:opencensus-api:0.18.0",
-    "io_opencensus_opencensus_contrib_grpc_metrics": "mvn:io.opencensus:opencensus-contrib-grpc-metrics:0.18.0",
+    "io_opencensus_opencensus_api": "mvn:io.opencensus:opencensus-api:0.21.0",
+    "io_opencensus_opencensus_contrib_grpc_metrics": "mvn:io.opencensus:opencensus-contrib-grpc-metrics:0.21.0",
 
     // Openstack4j related jars
     "openstack4j-core": "mvn:org.pacesys:openstack4j-core:3.2.0",
diff --git a/protocols/gnmi/ctl/BUILD b/protocols/gnmi/ctl/BUILD
index 482a37f..a82dafd 100644
--- a/protocols/gnmi/ctl/BUILD
+++ b/protocols/gnmi/ctl/BUILD
@@ -3,7 +3,7 @@
     "//protocols/gnmi/stub:onos-protocols-gnmi-stub",
     "//protocols/grpc/api:onos-protocols-grpc-api",
     "//protocols/grpc/ctl:onos-protocols-grpc-ctl",
-    "//lib:io_grpc_grpc_core_context",
+    "//lib:io_grpc_grpc_api_context",
     "//lib:com_google_protobuf_protobuf_java",
     "//lib:io_grpc_grpc_netty",
     "//lib:io_grpc_grpc_protobuf_lite",
@@ -13,7 +13,7 @@
 
 TEST_DEPS = TEST + [
     "@minimal_json//jar",
-    "//lib:io_grpc_grpc_core_context",
+    "//lib:io_grpc_grpc_api_context",
     "//lib:io_grpc_grpc_protobuf_lite",
 ]
 
diff --git a/protocols/gnoi/ctl/BUILD b/protocols/gnoi/ctl/BUILD
index 84322ba..d3659d3 100644
--- a/protocols/gnoi/ctl/BUILD
+++ b/protocols/gnoi/ctl/BUILD
@@ -3,7 +3,7 @@
     "//protocols/gnoi/stub:onos-protocols-gnoi-stub",
     "//protocols/grpc/api:onos-protocols-grpc-api",
     "//protocols/grpc/ctl:onos-protocols-grpc-ctl",
-    "//lib:io_grpc_grpc_core_context",
+    "//lib:io_grpc_grpc_api_context",
     "//lib:com_google_protobuf_protobuf_java",
     "//lib:io_grpc_grpc_netty",
     "//lib:io_grpc_grpc_protobuf_lite",
@@ -13,7 +13,7 @@
 
 TEST_DEPS = TEST + [
     "@minimal_json//jar",
-    "//lib:io_grpc_grpc_core_context",
+    "//lib:io_grpc_grpc_api_context",
     "//lib:io_grpc_grpc_protobuf_lite",
 ]
 
diff --git a/protocols/grpc/BUILD b/protocols/grpc/BUILD
index 59a99f0..3fa5169 100644
--- a/protocols/grpc/BUILD
+++ b/protocols/grpc/BUILD
@@ -3,7 +3,11 @@
     "//protocols/grpc/ctl:onos-protocols-grpc-ctl",
     "//protocols/grpc/utils:onos-protocols-grpc-utils",
     # gRPC dependencies (with patched core)
-    "//lib:io_grpc_grpc_core_context",
+    "//lib:io_grpc_grpc_api_context",
+    "//lib:io_grpc_grpc_core_internal",
+    "//lib:io_grpc_grpc_core_inprocess",
+    "//lib:io_grpc_grpc_core_util",
+    "//lib:io_grpc_grpc_core_perfmark",
     "//lib:io_grpc_grpc_stub",
     "//lib:io_grpc_grpc_netty",
     "//lib:io_grpc_grpc_auth",
diff --git a/protocols/grpc/api/BUILD b/protocols/grpc/api/BUILD
index 5a2b2d7..3247fcd 100644
--- a/protocols/grpc/api/BUILD
+++ b/protocols/grpc/api/BUILD
@@ -1,3 +1,3 @@
 osgi_jar(
-    deps = CORE_DEPS + ["//lib:io_grpc_grpc_core_context"],
+    deps = CORE_DEPS + ["//lib:io_grpc_grpc_api_context"],
 )
diff --git a/protocols/grpc/ctl/BUILD b/protocols/grpc/ctl/BUILD
index 16676c5..77239e4 100644
--- a/protocols/grpc/ctl/BUILD
+++ b/protocols/grpc/ctl/BUILD
@@ -1,6 +1,7 @@
 COMPILE_DEPS = CORE_DEPS + [
     "//protocols/grpc/api:onos-protocols-grpc-api",
-    "//lib:io_grpc_grpc_core_context",
+    "//lib:io_grpc_grpc_api_context",
+    "//lib:io_grpc_grpc_core_internal",
     "//lib:io_grpc_grpc_netty",
     "//lib:io_grpc_grpc_protobuf_lite",
     "//lib:com_google_protobuf_protobuf_java",
diff --git a/protocols/grpc/ctl/src/main/java/org/onosproject/grpc/ctl/GrpcChannelControllerImpl.java b/protocols/grpc/ctl/src/main/java/org/onosproject/grpc/ctl/GrpcChannelControllerImpl.java
index 3be7706..9e2321e 100644
--- a/protocols/grpc/ctl/src/main/java/org/onosproject/grpc/ctl/GrpcChannelControllerImpl.java
+++ b/protocols/grpc/ctl/src/main/java/org/onosproject/grpc/ctl/GrpcChannelControllerImpl.java
@@ -17,8 +17,12 @@
 package org.onosproject.grpc.ctl;
 
 import com.google.common.util.concurrent.Striped;
+import io.grpc.LoadBalancerRegistry;
 import io.grpc.ManagedChannel;
 import io.grpc.ManagedChannelBuilder;
+import io.grpc.NameResolverRegistry;
+import io.grpc.internal.DnsNameResolverProvider;
+import io.grpc.internal.PickFirstLoadBalancerProvider;
 import io.grpc.netty.GrpcSslContexts;
 import io.grpc.netty.NettyChannelBuilder;
 import io.netty.handler.ssl.SslContext;
@@ -68,6 +72,11 @@
     private static final int DEFAULT_MAX_INBOUND_MSG_SIZE = 256; // Megabytes.
     private static final int MEGABYTES = 1024 * 1024;
 
+    private static final PickFirstLoadBalancerProvider PICK_FIRST_LOAD_BALANCER_PROVIDER =
+            new PickFirstLoadBalancerProvider();
+    private static final DnsNameResolverProvider DNS_NAME_RESOLVER_PROVIDER =
+            new DnsNameResolverProvider();
+
     @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected ComponentConfigService componentConfigService;
 
@@ -89,6 +98,10 @@
         componentConfigService.registerProperties(getClass());
         channels = new ConcurrentHashMap<>();
         interceptors = new ConcurrentHashMap<>();
+        LoadBalancerRegistry.getDefaultRegistry()
+                .register(PICK_FIRST_LOAD_BALANCER_PROVIDER);
+        NameResolverRegistry.getDefaultRegistry()
+                .register(DNS_NAME_RESOLVER_PROVIDER);
         log.info("Started");
     }
 
@@ -105,6 +118,10 @@
 
     @Deactivate
     public void deactivate() {
+        LoadBalancerRegistry.getDefaultRegistry()
+                .deregister(PICK_FIRST_LOAD_BALANCER_PROVIDER);
+        NameResolverRegistry.getDefaultRegistry()
+                .register(DNS_NAME_RESOLVER_PROVIDER);
         componentConfigService.unregisterProperties(getClass(), false);
         channels.values().forEach(ManagedChannel::shutdownNow);
         channels.clear();
@@ -162,9 +179,12 @@
         final boolean useTls = channelUri.getScheme().equals(GRPCS);
 
         final NettyChannelBuilder channelBuilder = NettyChannelBuilder
-                .forAddress(channelUri.getHost(),
-                            channelUri.getPort())
-                .maxInboundMessageSize(DEFAULT_MAX_INBOUND_MSG_SIZE * MEGABYTES);
+                .forAddress(channelUri.getHost(), channelUri.getPort())
+                .nameResolverFactory(DNS_NAME_RESOLVER_PROVIDER)
+                .defaultLoadBalancingPolicy(
+                        PICK_FIRST_LOAD_BALANCER_PROVIDER.getPolicyName())
+                .maxInboundMessageSize(
+                        DEFAULT_MAX_INBOUND_MSG_SIZE * MEGABYTES);
 
         if (useTls) {
             try {
diff --git a/protocols/grpc/utils/BUILD b/protocols/grpc/utils/BUILD
index 25a78ad..c3e6e77 100644
--- a/protocols/grpc/utils/BUILD
+++ b/protocols/grpc/utils/BUILD
@@ -1,6 +1,6 @@
 COMPILE_DEPS = CORE_DEPS + [
     "//protocols/grpc/api:onos-protocols-grpc-api",
-    "//lib:io_grpc_grpc_core_context",
+    "//lib:io_grpc_grpc_api_context",
 ]
 
 osgi_jar(
diff --git a/protocols/grpc/utils/src/main/java/org/onosproject/grpc/utils/AbstractGrpcHandshaker.java b/protocols/grpc/utils/src/main/java/org/onosproject/grpc/utils/AbstractGrpcHandshaker.java
index 4cfb63b..cc06d9e 100644
--- a/protocols/grpc/utils/src/main/java/org/onosproject/grpc/utils/AbstractGrpcHandshaker.java
+++ b/protocols/grpc/utils/src/main/java/org/onosproject/grpc/utils/AbstractGrpcHandshaker.java
@@ -90,12 +90,7 @@
                         .orElseThrow(() -> new IllegalStateException(
                                 "Missing gRPC channel in controller"));
             } else {
-                try {
-                    channel = channelController.create(netcfgUri);
-                } catch (IllegalArgumentException ex) {
-                    throw new IllegalStateException(
-                            "A gRPC channel with same URI already exists", ex);
-                }
+                channel = channelController.create(netcfgUri);
                 // Store channel URI for future use.
                 CHANNEL_URIS.put(deviceId, netcfgUri);
                 // Trigger connection.
@@ -178,7 +173,7 @@
                 .removeDeviceAgentListener(data().deviceId(), providerId);
     }
 
-    private void resetChannelConnectBackoffIfNeeded()  {
+    private void resetChannelConnectBackoffIfNeeded() {
         // Stimulate channel reconnect if in failure state.
         final ManagedChannel channel = getExistingChannel();
         if (channel == null) {
@@ -186,7 +181,7 @@
             return;
         }
         if (channel.getState(false)
-                        .equals(ConnectivityState.TRANSIENT_FAILURE)) {
+                .equals(ConnectivityState.TRANSIENT_FAILURE)) {
             channel.resetConnectBackoff();
         }
     }
diff --git a/protocols/p4runtime/api/BUILD b/protocols/p4runtime/api/BUILD
index 47a4dd2..b958045 100644
--- a/protocols/p4runtime/api/BUILD
+++ b/protocols/p4runtime/api/BUILD
@@ -1,6 +1,6 @@
 COMPILE_DEPS = CORE_DEPS + [
     "//protocols/grpc/api:onos-protocols-grpc-api",
-    "//lib:io_grpc_grpc_core_context",
+    "//lib:io_grpc_grpc_api_context",
 ]
 
 TEST_DEPS = TEST + [
diff --git a/protocols/p4runtime/ctl/BUILD b/protocols/p4runtime/ctl/BUILD
index 628d162..5f8db80 100644
--- a/protocols/p4runtime/ctl/BUILD
+++ b/protocols/p4runtime/ctl/BUILD
@@ -5,7 +5,7 @@
     "//protocols/p4runtime/api:onos-protocols-p4runtime-api",
     "//protocols/p4runtime/proto:onos-protocols-p4runtime-proto",
     "//lib:com_google_protobuf_protobuf_java",
-    "//lib:io_grpc_grpc_core_context",
+    "//lib:io_grpc_grpc_api_context",
     "//lib:io_grpc_grpc_netty",
     "//lib:io_grpc_grpc_protobuf_lite",
     "//lib:io_grpc_grpc_stub",
@@ -14,7 +14,9 @@
 
 TEST_DEPS = TEST + [
     "@minimal_json//jar",
-    "//lib:io_grpc_grpc_core_context",
+    "//lib:io_grpc_grpc_api_context",
+    "//lib:io_grpc_grpc_core_internal",
+    "//lib:io_grpc_grpc_core_inprocess",
     "//lib:io_grpc_grpc_protobuf_lite",
 ]
 
diff --git a/tools/build/bazel/bazel_version.bzl b/tools/build/bazel/bazel_version.bzl
index c6e88eb..49434bf 100644
--- a/tools/build/bazel/bazel_version.bzl
+++ b/tools/build/bazel/bazel_version.bzl
@@ -16,12 +16,12 @@
 
 def check_bazel_version():
     if "bazel_version" not in dir(native):
-        fail("\nBazel version is too old; please use 0.19.* official release!\n\n")
+        fail("\nBazel version is too old; please use 0.23.* official release!\n\n")
     elif not native.bazel_version:
-        print("\nBazel is not a release version; please use 0.19.* official release!\n\n")
+        print("\nBazel is not a release version; please use 0.23.* official release!\n\n")
         return
 
     versions = native.bazel_version.split(".")
-    if not int(versions[1]) >= 19:
-        fail("\nBazel version %s is not supported; please use 0.19.* official release!\n\n" %
+    if not int(versions[1]) >= 23:
+        fail("\nBazel version %s is not supported; please use 0.23.* official release!\n\n" %
              native.bazel_version)
diff --git a/tools/build/bazel/generate_workspace.bzl b/tools/build/bazel/generate_workspace.bzl
index 7a63888..c177993 100644
--- a/tools/build/bazel/generate_workspace.bzl
+++ b/tools/build/bazel/generate_workspace.bzl
@@ -1,4 +1,4 @@
-# ***** This file was auto-generated at Thu, 25 Apr 2019 21:24:45 GMT. Do not edit this file manually. *****
+# ***** This file was auto-generated at Wed, 29 May 2019 22:17:30 GMT. Do not edit this file manually. *****
 # ***** Use onos-lib-gen *****
 
 load("//tools/build/bazel:variables.bzl", "ONOS_GROUP_ID", "ONOS_VERSION")
@@ -69,7 +69,7 @@
     "@hk2_utils//jar",
     "@javax_inject//jar",
     "@hk2_osgi_resource_locator//jar",
-    "@javax_annotation_api_mvn//jar",
+    "@javax_annotation_javax_annotation_api//jar",
     "@validation_api//jar",
     "//core/common:onos-core-common",
     "//core/api:onos-api-tests",
@@ -472,9 +472,9 @@
             jar_sha256 = "adc1c495e9c7286bfa1d861ca07e06c8d0980057ad981b48b04f68eb8dcade2c",
             licenses = ["notice"],
             jar_urls = ["http://repo1.maven.org/maven2/com/fasterxml/jackson/dataformat/jackson-dataformat-yaml/2.9.5/jackson-dataformat-yaml-2.9.5.jar"],        )
-    if "javax_annotation_api_mvn" not in native.existing_rules():
+    if "javax_annotation_javax_annotation_api" not in native.existing_rules():
         java_import_external(
-            name = "javax_annotation_api_mvn",
+            name = "javax_annotation_javax_annotation_api",
             jar_sha256 = "f43f8ca10941606fb675785286981c166be1393f584020ffd965c6863f62232c",
             licenses = ["notice"],
             jar_urls = ["http://repo1.maven.org/maven2/javax/annotation/javax.annotation-api/1.3/javax.annotation-api-1.3.jar"],        )
@@ -739,81 +739,81 @@
     if "io_netty_netty_buffer" not in native.existing_rules():
         java_import_external(
             name = "io_netty_netty_buffer",
-            jar_sha256 = "8ac0e30048636bd79ae205c4f9f5d7544290abd3a7ed39d8b6d97dfe3795afc1",
+            jar_sha256 = "39dfe88df8505fd01fbf9c1dbb6b6fa9b0297e453c3dc4ce039ea578aea2eaa3",
             licenses = ["notice"],
-            jar_urls = ["http://repo1.maven.org/maven2/io/netty/netty-buffer/4.1.32.Final/netty-buffer-4.1.32.Final.jar"],        )
+            jar_urls = ["http://repo1.maven.org/maven2/io/netty/netty-buffer/4.1.34.Final/netty-buffer-4.1.34.Final.jar"],        )
     if "io_netty_netty_codec" not in native.existing_rules():
         java_import_external(
             name = "io_netty_netty_codec",
-            jar_sha256 = "dbd6cea7d7bf5a2604e87337cb67c9468730d599be56511ed0979aacb309f879",
+            jar_sha256 = "52e9eeb3638a8ed0911c72a508c05fa4f9d3391125eae46f287d3a8a0776211d",
             licenses = ["notice"],
-            jar_urls = ["http://repo1.maven.org/maven2/io/netty/netty-codec/4.1.32.Final/netty-codec-4.1.32.Final.jar"],        )
+            jar_urls = ["http://repo1.maven.org/maven2/io/netty/netty-codec/4.1.34.Final/netty-codec-4.1.34.Final.jar"],        )
     if "io_netty_netty_common" not in native.existing_rules():
         java_import_external(
             name = "io_netty_netty_common",
-            jar_sha256 = "cc993e660f8f8e3b033f1d25a9e2f70151666bdf878d460a6508cb23daa696dc",
+            jar_sha256 = "122931117eacf370b054d0e8a2411efa81de4956a6c3f938b0f0eb915969a425",
             licenses = ["notice"],
-            jar_urls = ["http://repo1.maven.org/maven2/io/netty/netty-common/4.1.32.Final/netty-common-4.1.32.Final.jar"],        )
+            jar_urls = ["http://repo1.maven.org/maven2/io/netty/netty-common/4.1.34.Final/netty-common-4.1.34.Final.jar"],        )
     if "io_netty_netty_handler" not in native.existing_rules():
         java_import_external(
             name = "io_netty_netty_handler",
-            jar_sha256 = "07d9756e48b5f6edc756e33e8b848fb27ff0b1ae087dab5addca6c6bf17cac2d",
+            jar_sha256 = "035616801fe9894ca2490832cf9976536dac740f41e90de1cdd4ba46f04263d1",
             licenses = ["notice"],
-            jar_urls = ["http://repo1.maven.org/maven2/io/netty/netty-handler/4.1.32.Final/netty-handler-4.1.32.Final.jar"],        )
+            jar_urls = ["http://repo1.maven.org/maven2/io/netty/netty-handler/4.1.34.Final/netty-handler-4.1.34.Final.jar"],        )
     if "io_netty_netty_handler_proxy" not in native.existing_rules():
         java_import_external(
             name = "io_netty_netty_handler_proxy",
-            jar_sha256 = "10d1081ed114bb0e76ebbb5331b66a6c3189cbdefdba232733fc9ca308a6ea34",
+            jar_sha256 = "f506c6acb97b3e0b0795cf9f0971d80bbab7c17086312fa225b98ccc94be6dff",
             licenses = ["notice"],
-            jar_urls = ["http://repo1.maven.org/maven2/io/netty/netty-handler-proxy/4.1.32.Final/netty-handler-proxy-4.1.32.Final.jar"],        )
+            jar_urls = ["http://repo1.maven.org/maven2/io/netty/netty-handler-proxy/4.1.34.Final/netty-handler-proxy-4.1.34.Final.jar"],        )
     if "io_netty_netty_transport" not in native.existing_rules():
         java_import_external(
             name = "io_netty_netty_transport",
-            jar_sha256 = "175bae0d227d7932c0c965c983efbb3cf01f39abe934f5c4071d0319784715fb",
+            jar_sha256 = "2b3f7d3a595101def7d411793a675bf2a325964475fd7bdbbe448e908de09445",
             licenses = ["notice"],
-            jar_urls = ["http://repo1.maven.org/maven2/io/netty/netty-transport/4.1.32.Final/netty-transport-4.1.32.Final.jar"],        )
+            jar_urls = ["http://repo1.maven.org/maven2/io/netty/netty-transport/4.1.34.Final/netty-transport-4.1.34.Final.jar"],        )
     if "io_netty_netty_transport_native_unix_common" not in native.existing_rules():
         java_import_external(
             name = "io_netty_netty_transport_native_unix_common",
-            jar_sha256 = "5c9d5b3b7ca6bcd8f7a40b1f93c96cf8a7fd2238d9d633e5f2b3f0577518074e",
+            jar_sha256 = "f13a550511c8ee30fc0b7b2e687efc01478598c5f4fe525bd49e1a814fbe1bb9",
             licenses = ["notice"],
-            jar_urls = ["http://repo1.maven.org/maven2/io/netty/netty-transport-native-unix-common/4.1.32.Final/netty-transport-native-unix-common-4.1.32.Final.jar"],        )
+            jar_urls = ["http://repo1.maven.org/maven2/io/netty/netty-transport-native-unix-common/4.1.34.Final/netty-transport-native-unix-common-4.1.34.Final.jar"],        )
     if "io_netty_netty_transport_native_epoll" not in native.existing_rules():
         java_import_external(
             name = "io_netty_netty_transport_native_epoll",
-            jar_sha256 = "4702dfaaf295883eb342550d7b52e4e0491bbae6dc3c81129904c5342ad7d8b3",
+            jar_sha256 = "e0291026cd09fd1b3496bc7f41144701e5c344533bef71b162fcae8cb7c6331c",
             licenses = ["notice"],
-            jar_urls = ["http://repo1.maven.org/maven2/io/netty/netty-transport-native-epoll/4.1.32.Final/netty-transport-native-epoll-4.1.32.Final.jar"],        )
+            jar_urls = ["http://repo1.maven.org/maven2/io/netty/netty-transport-native-epoll/4.1.34.Final/netty-transport-native-epoll-4.1.34.Final.jar"],        )
     if "io_netty_netty_resolver" not in native.existing_rules():
         java_import_external(
             name = "io_netty_netty_resolver",
-            jar_sha256 = "9b4a19982047a95ea4791a7ad7ad385c7a08c2ac75f0a3509cc213cb32a726ae",
+            jar_sha256 = "774221ed4c130b532865770b10630bc12d0d400127da617ee0ac8de2a7ac2097",
             licenses = ["notice"],
-            jar_urls = ["http://repo1.maven.org/maven2/io/netty/netty-resolver/4.1.32.Final/netty-resolver-4.1.32.Final.jar"],        )
+            jar_urls = ["http://repo1.maven.org/maven2/io/netty/netty-resolver/4.1.34.Final/netty-resolver-4.1.34.Final.jar"],        )
     if "io_netty_netty_codec_http2" not in native.existing_rules():
         java_import_external(
             name = "io_netty_netty_codec_http2",
-            jar_sha256 = "4d4c6cfc1f19efb969b9b0ae6cc977462d202867f7dcfee6e9069977e623a2f5",
+            jar_sha256 = "319f66f3ab0d3aac3477febf19c259990ee8c639fc7da8822dfa58e7dab1bdcf",
             licenses = ["notice"],
-            jar_urls = ["http://repo1.maven.org/maven2/io/netty/netty-codec-http2/4.1.32.Final/netty-codec-http2-4.1.32.Final.jar"],        )
+            jar_urls = ["http://repo1.maven.org/maven2/io/netty/netty-codec-http2/4.1.34.Final/netty-codec-http2-4.1.34.Final.jar"],        )
     if "io_netty_netty_codec_http" not in native.existing_rules():
         java_import_external(
             name = "io_netty_netty_codec_http",
-            jar_sha256 = "db2c22744f6a4950d1817e4e1a26692e53052c5d54abe6cceecd7df33f4eaac3",
+            jar_sha256 = "5df5556ef6b0e7ce7c72a359e4ca774fcdf8d8fe12f0b6332715eaa44cfe41f8",
             licenses = ["notice"],
-            jar_urls = ["http://repo1.maven.org/maven2/io/netty/netty-codec-http/4.1.32.Final/netty-codec-http-4.1.32.Final.jar"],        )
+            jar_urls = ["http://repo1.maven.org/maven2/io/netty/netty-codec-http/4.1.34.Final/netty-codec-http-4.1.34.Final.jar"],        )
     if "io_netty_netty_codec_socks" not in native.existing_rules():
         java_import_external(
             name = "io_netty_netty_codec_socks",
-            jar_sha256 = "fe2f2e97d6c65dc280623dcfd24337d8a5c7377049c120842f2c59fb83d7408a",
+            jar_sha256 = "9c4ff58b648193942654db20f172d017441625754b902394f620f04074830346",
             licenses = ["notice"],
-            jar_urls = ["http://repo1.maven.org/maven2/io/netty/netty-codec-socks/4.1.32.Final/netty-codec-socks-4.1.32.Final.jar"],        )
+            jar_urls = ["http://repo1.maven.org/maven2/io/netty/netty-codec-socks/4.1.34.Final/netty-codec-socks-4.1.34.Final.jar"],        )
     if "io_netty_netty_tcnative_boringssl" not in native.existing_rules():
         java_import_external(
             name = "io_netty_netty_tcnative_boringssl",
-            jar_sha256 = "c0bbfcb116ae9928ebb17cbfbdd80ee51980ad228a4fffb0cb3137ac91b1bc09",
+            jar_sha256 = "382fef183d2dbb991e2c4ac8c9749673aa90ca1ce3cebf3301533beb664bf92f",
             licenses = ["notice"],
-            jar_urls = ["http://repo1.maven.org/maven2/io/netty/netty-tcnative-boringssl-static/2.0.20.Final/netty-tcnative-boringssl-static-2.0.20.Final.jar"],        )
+            jar_urls = ["http://repo1.maven.org/maven2/io/netty/netty-tcnative-boringssl-static/2.0.22.Final/netty-tcnative-boringssl-static-2.0.22.Final.jar"],        )
     if "objenesis" not in native.existing_rules():
         java_import_external(
             name = "objenesis",
@@ -1015,15 +1015,15 @@
     if "bndlib" not in native.existing_rules():
         java_import_external(
             name = "bndlib",
-            jar_sha256 = "d1a328c8f63aea4f7ce6028a49255137664a7138fadc4af9d25461192b71e098",
+            jar_sha256 = "dfa48c53c124a41e8a21198b49e4a4d68620f2df8a545f9bcdca8c9f5bb5b14c",
             licenses = ["notice"],
-            jar_urls = ["http://repo1.maven.org/maven2/biz/aQute/bnd/biz.aQute.bndlib/4.0.0/biz.aQute.bndlib-4.0.0.jar"],        )
+            jar_urls = ["http://repo1.maven.org/maven2/biz/aQute/bnd/biz.aQute.bndlib/4.1.0/biz.aQute.bndlib-4.1.0.jar"],        )
     if "bndexe" not in native.existing_rules():
         java_import_external(
             name = "bndexe",
-            jar_sha256 = "b18d88ae15db4bf7af53c396feb45a64f27403d7e7d7cd50a68bf8915ca7b6c0",
+            jar_sha256 = "5ad18a5a8702fcfe42d5180ee4ba33cf4728d5f68055b2d3755a86222afac462",
             licenses = ["notice"],
-            jar_urls = ["http://repo1.maven.org/maven2/biz/aQute/bnd/biz.aQute.bnd/4.0.0/biz.aQute.bnd-4.0.0.jar"],        )
+            jar_urls = ["http://repo1.maven.org/maven2/biz/aQute/bnd/biz.aQute.bnd/4.1.0/biz.aQute.bnd-4.1.0.jar"],        )
     if "libthrift" not in native.existing_rules():
         java_import_external(
             name = "libthrift",
@@ -1087,21 +1087,21 @@
     if "com_google_errorprone_error_prone_annotations" not in native.existing_rules():
         java_import_external(
             name = "com_google_errorprone_error_prone_annotations",
-            jar_sha256 = "357cd6cfb067c969226c442451502aee13800a24e950fdfde77bcdb4565a668d",
+            jar_sha256 = "ec59f1b702d9afc09e8c3929f5c42777dec623a6ea2731ac694332c7d7680f5a",
             licenses = ["notice"],
-            jar_urls = ["http://repo1.maven.org/maven2/com/google/errorprone/error_prone_annotations/2.3.2/error_prone_annotations-2.3.2.jar"],        )
+            jar_urls = ["http://repo1.maven.org/maven2/com/google/errorprone/error_prone_annotations/2.3.3/error_prone_annotations-2.3.3.jar"],        )
     if "com_google_auth_google_auth_library_credentials" not in native.existing_rules():
         java_import_external(
             name = "com_google_auth_google_auth_library_credentials",
-            jar_sha256 = "ac9efdd6a930e4df906fa278576fa825d979f74315f2faf5c91fe7e6aabb2788",
+            jar_sha256 = "e117279c52c41b66937a5adae41dfeae0e40e48ae40230d2edeb4adc28ed996c",
             licenses = ["notice"],
-            jar_urls = ["http://repo1.maven.org/maven2/com/google/auth/google-auth-library-credentials/0.9.0/google-auth-library-credentials-0.9.0.jar"],        )
+            jar_urls = ["http://repo1.maven.org/maven2/com/google/auth/google-auth-library-credentials/0.13.0/google-auth-library-credentials-0.13.0.jar"],        )
     if "com_google_auth_google_auth_library_oauth2_http" not in native.existing_rules():
         java_import_external(
             name = "com_google_auth_google_auth_library_oauth2_http",
-            jar_sha256 = "e55d9722102cc1245c8c43d69acd49d3c9bbfcc1bcf722e971425506b970097e",
+            jar_sha256 = "62551f27379f873962e410328fc10a11a2b8f5df7c232e3cbe96a1b5edadf1ba",
             licenses = ["notice"],
-            jar_urls = ["http://repo1.maven.org/maven2/com/google/auth/google-auth-library-oauth2-http/0.9.0/google-auth-library-oauth2-http-0.9.0.jar"],        )
+            jar_urls = ["http://repo1.maven.org/maven2/com/google/auth/google-auth-library-oauth2-http/0.13.0/google-auth-library-oauth2-http-0.13.0.jar"],        )
     if "com_google_j2objc_j2objc_annotations" not in native.existing_rules():
         java_import_external(
             name = "com_google_j2objc_j2objc_annotations",
@@ -1111,15 +1111,15 @@
     if "io_opencensus_opencensus_api" not in native.existing_rules():
         java_import_external(
             name = "io_opencensus_opencensus_api",
-            jar_sha256 = "45421ffe95271aba94686ed8d4c5070fe77dc2ff0b922688097f0dd40f1931b1",
+            jar_sha256 = "8e2cb0f6391d8eb0a1bcd01e7748883f0033b1941754f4ed3f19d2c3e4276fc8",
             licenses = ["notice"],
-            jar_urls = ["http://repo1.maven.org/maven2/io/opencensus/opencensus-api/0.18.0/opencensus-api-0.18.0.jar"],        )
+            jar_urls = ["http://repo1.maven.org/maven2/io/opencensus/opencensus-api/0.21.0/opencensus-api-0.21.0.jar"],        )
     if "io_opencensus_opencensus_contrib_grpc_metrics" not in native.existing_rules():
         java_import_external(
             name = "io_opencensus_opencensus_contrib_grpc_metrics",
-            jar_sha256 = "1f90585e777b1e0493dbf22e678303369a8d5b7c750b4eda070a34ca99271607",
+            jar_sha256 = "29fc79401082301542cab89d7054d2f0825f184492654c950020553ef4ff0ef8",
             licenses = ["notice"],
-            jar_urls = ["http://repo1.maven.org/maven2/io/opencensus/opencensus-contrib-grpc-metrics/0.18.0/opencensus-contrib-grpc-metrics-0.18.0.jar"],        )
+            jar_urls = ["http://repo1.maven.org/maven2/io/opencensus/opencensus-contrib-grpc-metrics/0.21.0/opencensus-contrib-grpc-metrics-0.21.0.jar"],        )
     if "openstack4j_core" not in native.existing_rules():
         java_import_external(
             name = "openstack4j_core",
@@ -1383,7 +1383,7 @@
 artifact_map["@jackson_core//:jackson_core"] = "mvn:com.fasterxml.jackson.core:jackson-core:jar:2.9.5"
 artifact_map["@jackson_databind//:jackson_databind"] = "mvn:com.fasterxml.jackson.core:jackson-databind:jar:2.9.5"
 artifact_map["@jackson_dataformat_yaml//:jackson_dataformat_yaml"] = "mvn:com.fasterxml.jackson.dataformat:jackson-dataformat-yaml:jar:2.9.5"
-artifact_map["@javax_annotation_api_mvn//:javax_annotation_api_mvn"] = "mvn:javax.annotation:javax.annotation-api:jar:1.3"
+artifact_map["@javax_annotation_javax_annotation_api//:javax_annotation_javax_annotation_api"] = "mvn:javax.annotation:javax.annotation-api:jar:1.3"
 artifact_map["@javax_inject//:javax_inject"] = "mvn:org.glassfish.hk2.external:javax.inject:jar:2.5.0-b42"
 artifact_map["@javax_ws_rs_api//:javax_ws_rs_api"] = "mvn:javax.ws.rs:javax.ws.rs-api:jar:2.1"
 artifact_map["@javax_activation//:javax_activation"] = "mvn:javax.activation:activation:jar:NON-OSGI:1.1.1"
@@ -1427,19 +1427,19 @@
 artifact_map["@minimal_json//:minimal_json"] = "mvn:com.eclipsesource.minimal-json:minimal-json:jar:0.9.4"
 artifact_map["@minlog//:minlog"] = "mvn:com.esotericsoftware:minlog:jar:1.3.0"
 artifact_map["@io_netty_netty//:io_netty_netty"] = "mvn:io.netty:netty:jar:3.10.5.Final"
-artifact_map["@io_netty_netty_buffer//:io_netty_netty_buffer"] = "mvn:io.netty:netty-buffer:jar:4.1.32.Final"
-artifact_map["@io_netty_netty_codec//:io_netty_netty_codec"] = "mvn:io.netty:netty-codec:jar:4.1.32.Final"
-artifact_map["@io_netty_netty_common//:io_netty_netty_common"] = "mvn:io.netty:netty-common:jar:4.1.32.Final"
-artifact_map["@io_netty_netty_handler//:io_netty_netty_handler"] = "mvn:io.netty:netty-handler:jar:4.1.32.Final"
-artifact_map["@io_netty_netty_handler_proxy//:io_netty_netty_handler_proxy"] = "mvn:io.netty:netty-handler-proxy:jar:4.1.32.Final"
-artifact_map["@io_netty_netty_transport//:io_netty_netty_transport"] = "mvn:io.netty:netty-transport:jar:4.1.32.Final"
-artifact_map["@io_netty_netty_transport_native_unix_common//:io_netty_netty_transport_native_unix_common"] = "mvn:io.netty:netty-transport-native-unix-common:jar:4.1.32.Final"
-artifact_map["@io_netty_netty_transport_native_epoll//:io_netty_netty_transport_native_epoll"] = "mvn:io.netty:netty-transport-native-epoll:jar:4.1.32.Final"
-artifact_map["@io_netty_netty_resolver//:io_netty_netty_resolver"] = "mvn:io.netty:netty-resolver:jar:4.1.32.Final"
-artifact_map["@io_netty_netty_codec_http2//:io_netty_netty_codec_http2"] = "mvn:io.netty:netty-codec-http2:jar:4.1.32.Final"
-artifact_map["@io_netty_netty_codec_http//:io_netty_netty_codec_http"] = "mvn:io.netty:netty-codec-http:jar:4.1.32.Final"
-artifact_map["@io_netty_netty_codec_socks//:io_netty_netty_codec_socks"] = "mvn:io.netty:netty-codec-socks:jar:4.1.32.Final"
-artifact_map["@io_netty_netty_tcnative_boringssl//:io_netty_netty_tcnative_boringssl"] = "mvn:io.netty:netty-tcnative-boringssl-static:jar:2.0.20.Final"
+artifact_map["@io_netty_netty_buffer//:io_netty_netty_buffer"] = "mvn:io.netty:netty-buffer:jar:4.1.34.Final"
+artifact_map["@io_netty_netty_codec//:io_netty_netty_codec"] = "mvn:io.netty:netty-codec:jar:4.1.34.Final"
+artifact_map["@io_netty_netty_common//:io_netty_netty_common"] = "mvn:io.netty:netty-common:jar:4.1.34.Final"
+artifact_map["@io_netty_netty_handler//:io_netty_netty_handler"] = "mvn:io.netty:netty-handler:jar:4.1.34.Final"
+artifact_map["@io_netty_netty_handler_proxy//:io_netty_netty_handler_proxy"] = "mvn:io.netty:netty-handler-proxy:jar:4.1.34.Final"
+artifact_map["@io_netty_netty_transport//:io_netty_netty_transport"] = "mvn:io.netty:netty-transport:jar:4.1.34.Final"
+artifact_map["@io_netty_netty_transport_native_unix_common//:io_netty_netty_transport_native_unix_common"] = "mvn:io.netty:netty-transport-native-unix-common:jar:4.1.34.Final"
+artifact_map["@io_netty_netty_transport_native_epoll//:io_netty_netty_transport_native_epoll"] = "mvn:io.netty:netty-transport-native-epoll:jar:4.1.34.Final"
+artifact_map["@io_netty_netty_resolver//:io_netty_netty_resolver"] = "mvn:io.netty:netty-resolver:jar:4.1.34.Final"
+artifact_map["@io_netty_netty_codec_http2//:io_netty_netty_codec_http2"] = "mvn:io.netty:netty-codec-http2:jar:4.1.34.Final"
+artifact_map["@io_netty_netty_codec_http//:io_netty_netty_codec_http"] = "mvn:io.netty:netty-codec-http:jar:4.1.34.Final"
+artifact_map["@io_netty_netty_codec_socks//:io_netty_netty_codec_socks"] = "mvn:io.netty:netty-codec-socks:jar:4.1.34.Final"
+artifact_map["@io_netty_netty_tcnative_boringssl//:io_netty_netty_tcnative_boringssl"] = "mvn:io.netty:netty-tcnative-boringssl-static:jar:2.0.22.Final"
 artifact_map["@objenesis//:objenesis"] = "mvn:org.objenesis:objenesis:jar:2.6"
 artifact_map["@openflowj//:openflowj"] = "mvn:org.onosproject:openflowj:jar:3.2.1.onos"
 artifact_map["@org_osgi_util_function//:org_osgi_util_function"] = "mvn:org.osgi:org.osgi.util.function:jar:1.1.0"
@@ -1473,8 +1473,8 @@
 artifact_map["@validation_api//:validation_api"] = "mvn:javax.validation:validation-api:jar:1.1.0.Final"
 artifact_map["@checkstyle//:checkstyle"] = "mvn:com.puppycrawl.tools:checkstyle:jar:NON-OSGI:8.10"
 artifact_map["@apache_karaf//:apache_karaf"] = "http://repo1.maven.org/maven2/org/onosproject/apache-karaf-offline/4.2.5-offline-201904251/apache-karaf-4.2.5-offline-201904251.tar.gz"
-artifact_map["@bndlib//:bndlib"] = "mvn:biz.aQute.bnd:biz.aQute.bndlib:jar:4.0.0"
-artifact_map["@bndexe//:bndexe"] = "mvn:biz.aQute.bnd:biz.aQute.bnd:jar:4.0.0"
+artifact_map["@bndlib//:bndlib"] = "mvn:biz.aQute.bnd:biz.aQute.bndlib:jar:4.1.0"
+artifact_map["@bndexe//:bndexe"] = "mvn:biz.aQute.bnd:biz.aQute.bnd:jar:4.1.0"
 artifact_map["@libthrift//:libthrift"] = "mvn:org.apache.thrift:libthrift:jar:0.11.0"
 artifact_map["@qdox//:qdox"] = "mvn:com.thoughtworks.qdox:qdox:jar:NON-OSGI:2.0-M3"
 artifact_map["@snmp_core//:snmp_core"] = "mvn:org.onosproject:snmp-core:jar:1.3-20161021.1"
@@ -1485,12 +1485,12 @@
 artifact_map["@engine_io_client//:engine_io_client"] = "mvn:io.socket:engine.io-client:jar:NON-OSGI:0.8.3"
 artifact_map["@org_codehaus_mojo_animal_sniffer_annotations//:org_codehaus_mojo_animal_sniffer_annotations"] = "mvn:org.codehaus.mojo:animal-sniffer-annotations:jar:NON-OSGI:1.17"
 artifact_map["@com_google_api_grpc_proto_google_common_protos//:com_google_api_grpc_proto_google_common_protos"] = "mvn:com.google.api.grpc:proto-google-common-protos:jar:NON-OSGI:1.12.0"
-artifact_map["@com_google_errorprone_error_prone_annotations//:com_google_errorprone_error_prone_annotations"] = "mvn:com.google.errorprone:error_prone_annotations:jar:NON-OSGI:2.3.2"
-artifact_map["@com_google_auth_google_auth_library_credentials//:com_google_auth_google_auth_library_credentials"] = "mvn:com.google.auth:google-auth-library-credentials:jar:NON-OSGI:0.9.0"
-artifact_map["@com_google_auth_google_auth_library_oauth2_http//:com_google_auth_google_auth_library_oauth2_http"] = "mvn:com.google.auth:google-auth-library-oauth2-http:jar:NON-OSGI:0.9.0"
+artifact_map["@com_google_errorprone_error_prone_annotations//:com_google_errorprone_error_prone_annotations"] = "mvn:com.google.errorprone:error_prone_annotations:jar:NON-OSGI:2.3.3"
+artifact_map["@com_google_auth_google_auth_library_credentials//:com_google_auth_google_auth_library_credentials"] = "mvn:com.google.auth:google-auth-library-credentials:jar:NON-OSGI:0.13.0"
+artifact_map["@com_google_auth_google_auth_library_oauth2_http//:com_google_auth_google_auth_library_oauth2_http"] = "mvn:com.google.auth:google-auth-library-oauth2-http:jar:NON-OSGI:0.13.0"
 artifact_map["@com_google_j2objc_j2objc_annotations//:com_google_j2objc_j2objc_annotations"] = "mvn:com.google.j2objc:j2objc-annotations:jar:NON-OSGI:1.1"
-artifact_map["@io_opencensus_opencensus_api//:io_opencensus_opencensus_api"] = "mvn:io.opencensus:opencensus-api:jar:NON-OSGI:0.18.0"
-artifact_map["@io_opencensus_opencensus_contrib_grpc_metrics//:io_opencensus_opencensus_contrib_grpc_metrics"] = "mvn:io.opencensus:opencensus-contrib-grpc-metrics:jar:NON-OSGI:0.18.0"
+artifact_map["@io_opencensus_opencensus_api//:io_opencensus_opencensus_api"] = "mvn:io.opencensus:opencensus-api:jar:NON-OSGI:0.21.0"
+artifact_map["@io_opencensus_opencensus_contrib_grpc_metrics//:io_opencensus_opencensus_contrib_grpc_metrics"] = "mvn:io.opencensus:opencensus-contrib-grpc-metrics:jar:NON-OSGI:0.21.0"
 artifact_map["@openstack4j_core//:openstack4j_core"] = "mvn:org.pacesys:openstack4j-core:jar:3.2.0"
 artifact_map["@openstack4j_http_connector//:openstack4j_http_connector"] = "mvn:org.pacesys.openstack4j.connectors:openstack4j-http-connector:jar:3.2.0"
 artifact_map["@openstack4j_httpclient//:openstack4j_httpclient"] = "mvn:org.pacesys.openstack4j.connectors:openstack4j-httpclient:jar:3.2.0"
diff --git a/tools/build/bazel/grpc_workspace.bzl b/tools/build/bazel/grpc_workspace.bzl
index 3c81c9a..cae36ce 100644
--- a/tools/build/bazel/grpc_workspace.bzl
+++ b/tools/build/bazel/grpc_workspace.bzl
@@ -1,13 +1,13 @@
 load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive")
 
-GRPC_JAVA_VERSION = "1.18.0"
-GRPC_SHA = "979cd1873c0f3aefa25f3d20336c023ce34471203bf2d954ad9e3158fc55c16b"
+GRPC_JAVA_VERSION = "1.21.0"
+GRPC_SHA = "eaad045e911587c03cae27364920bcb0c80fb0a37bac5f54eb94af9fa0391db3"
 
 GAPIS_COMMIT = "37cc0e5acae50ee91f00827a7010c3b07dfa5311"
 GAPIS_SHA = "17d023f48ea290f25edaf25a967973b5a42ce6d71b1570862f302d95aa8b9f77"
 
 def generate_grpc():
-    # grpc-java fork that fixes the OSGi split problem.
+    # grpc-java fork that fixes the OSGi split brain problem.
     http_archive(
         name = "io_grpc_grpc_java",
         urls = ["https://github.com/opennetworkinglab/grpc-java/archive/v%s-patched.zip" % GRPC_JAVA_VERSION],
diff --git a/tools/build/bazel/osgi_java_library.bzl b/tools/build/bazel/osgi_java_library.bzl
index 530384c..3720064 100644
--- a/tools/build/bazel/osgi_java_library.bzl
+++ b/tools/build/bazel/osgi_java_library.bzl
@@ -701,34 +701,41 @@
         karaf_command_packages = []):
     if name == None:
         name = _auto_name()
+    proto_name = name + "-java-proto"
     native.java_proto_library(
-        name = name + "-java-proto",
+        name = proto_name,
         deps = proto_libs,
     )
     java_sources_alt(
-        name = name + "-proto-srcjar",
-        srcs = [":%s-java-proto" % name],
+        name = proto_name + "-srcjar",
+        srcs = [":" + proto_name],
     )
     osgi_srcs = [
-        ":%s-proto-srcjar" % name,
+        proto_name + "-srcjar",
     ]
     base_deps = [
         "//lib:com_google_protobuf_protobuf_java",
     ]
     if grpc_proto_lib != None:
+        grpc_name = name + "-java-grpc"
         java_grpc_library(
-            name = name + "-java-grpc",
+            name = grpc_name,
             srcs = [grpc_proto_lib],
-            deps = [":%s-java-proto" % name],
+            deps = [":" + proto_name],
+        )
+        java_sources_alt(
+            name = grpc_name + "-srcjar",
+            srcs = [":lib%s-src.jar" % grpc_name],
         )
         osgi_srcs.append(
-            ":%s-java-grpc__do_not_reference__srcjar" % name,
+            ":" + grpc_name + "-srcjar",
         )
         base_deps.extend([
             "@com_google_guava_guava//jar",
-            "//lib:io_grpc_grpc_core_context",
+            "//lib:io_grpc_grpc_api_context",
             "//lib:io_grpc_grpc_stub",
             "//lib:io_grpc_grpc_protobuf",
+            "@javax_annotation_javax_annotation_api//jar",
         ])
     osgi_jar(
         name = name,
diff --git a/tools/build/bazel/protobuf_workspace.bzl b/tools/build/bazel/protobuf_workspace.bzl
index e67ba91..ebfde6b 100644
--- a/tools/build/bazel/protobuf_workspace.bzl
+++ b/tools/build/bazel/protobuf_workspace.bzl
@@ -1,7 +1,7 @@
 load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive")
 
-PROTOBUF_VERSION = "3.6.1.3"
-SHA = "9510dd2afc29e7245e9e884336f848c8a6600a14ae726adb6befdb4f786f0be2"
+PROTOBUF_VERSION = "3.8.0"
+SHA = "1e622ce4b84b88b6d2cdf1db38d1a634fe2392d74f0b7b74ff98f3a51838ee53"
 
 def generate_protobuf():
     http_archive(
diff --git a/tools/build/publish-target-list b/tools/build/publish-target-list
index 992ed6c..ebe182c 100644
--- a/tools/build/publish-target-list
+++ b/tools/build/publish-target-list
@@ -48,6 +48,6 @@
     //utils/rest:onlab-rest
     //web/api:onos-rest
     //lib:com_google_protobuf_protobuf_java
-    //lib:io_grpc_grpc_core_context
+    //lib:io_grpc_grpc_api_context
     //lib:io_grpc_grpc_stub
     //lib:io_grpc_grpc_protobuf
diff --git a/tools/package/features/BUILD b/tools/package/features/BUILD
index 2ac1236..ebbbdc0 100644
--- a/tools/package/features/BUILD
+++ b/tools/package/features/BUILD
@@ -68,7 +68,7 @@
     description = "ONOS 3rd party dependencies for web apps",
     included_bundles = [
         "@jersey_common//jar",
-        "@javax_annotation_api_mvn//jar",
+        "@javax_annotation_javax_annotation_api//jar",
         "@javax_ws_rs_api//jar",
         "@hk2_api//jar",
         "@hk2_locator//jar",