merge
diff --git a/bazel_tools/docker.bzl b/bazel_tools/docker.bzl
deleted file mode 100644
index b45c72c..0000000
--- a/bazel_tools/docker.bzl
+++ /dev/null
@@ -1,56 +0,0 @@
-__PUSH_TO_DEV_TMPL = """
-#!/bin/sh
-set -eE -o functrace
-# --- begin runfiles.bash initialization ---
-# Copy-pasted from Bazel's Bash runfiles library (tools/bash/runfiles/runfiles.bash).
-set -euo pipefail
-if [[ ! -d "\$${{RUNFILES_DIR:-/dev/null}}" && ! -f "\$${{RUNFILES_MANIFEST_FILE:-/dev/null}}" ]]; then
-    if [[ -f "\$$0.runfiles_manifest" ]]; then
-        export RUNFILES_MANIFEST_FILE="\$$0.runfiles_manifest"
-    elif [[ -f "\$$0.runfiles/MANIFEST" ]]; then
-        export RUNFILES_MANIFEST_FILE="\$$0.runfiles/MANIFEST"
-    elif [[ -f "\$$0.runfiles/bazel_tools/tools/bash/runfiles/runfiles.bash" ]]; then
-        export RUNFILES_DIR="\$$0.runfiles"
-    fi
-fi
-if [[ -f "\$${{RUNFILES_DIR:-/dev/null}}/bazel_tools/tools/bash/runfiles/runfiles.bash" ]]; then
-    source "\$${{RUNFILES_DIR}}/bazel_tools/tools/bash/runfiles/runfiles.bash"
-elif [[ -f "\$${{RUNFILES_MANIFEST_FILE:-/dev/null}}" ]]; then
-    source "\$$(grep -m1 "^bazel_tools/tools/bash/runfiles/runfiles.bash " \
-    	                 "\$$RUNFILES_MANIFEST_FILE" | cut -d ' ' -f 2-)"
-else
-    echo >&2 "ERROR: cannot find @bazel_tools//tools/bash/runfiles:runfiles.bash"
-    exit 1
-fi
-# --- end runfiles.bash initialization ---
-IMAGE="{registry}/{image}:{tag}"
-DOCKERFILE=\$$(rlocation __main__/{package}/{dockerfile})
-docker build \
-      --tag=\$$IMAGE \
-      --file=\$$DOCKERFILE \
-      \$$(dirname "\$$DOCKERFILE")
-docker push \$$IMAGE
-"""
-
-def docker_image(name, registry, image, tag, dockerfile, srcs, **kwargs):
-    native.genrule(
-        name = "%s.sh" % name,
-        executable = False,
-        outs = ["build_and_push.sh"],
-        cmd = """cat > $@ <<EOM
-%s
-EOM
-""" % __PUSH_TO_DEV_TMPL.format(
-            registry = registry,
-            image = image,
-            tag = tag,
-            dockerfile = dockerfile,
-            package = native.package_name(),
-        ),
-    )
-    native.sh_binary(
-        name = name,
-        srcs = ["build_and_push.sh"],
-        data = srcs + [dockerfile],
-        deps = ["@bazel_tools//tools/bash/runfiles"],
-    )
diff --git a/bazel_tools/helm.bzl b/bazel_tools/helm.bzl
deleted file mode 100644
index 8635257..0000000
--- a/bazel_tools/helm.bzl
+++ /dev/null
@@ -1,80 +0,0 @@
-__HELM_INSTALL_TMPL = """
-#!/bin/sh
-# --- begin runfiles.bash initialization ---
-# Copy-pasted from Bazel's Bash runfiles library (tools/bash/runfiles/runfiles.bash).
-set -euo pipefail
-if [[ ! -d "\$${{RUNFILES_DIR:-/dev/null}}" && ! -f "\$${{RUNFILES_MANIFEST_FILE:-/dev/null}}" ]]; then
-    if [[ -f "\$$0.runfiles_manifest" ]]; then
-        export RUNFILES_MANIFEST_FILE="\$$0.runfiles_manifest"
-    elif [[ -f "\$$0.runfiles/MANIFEST" ]]; then
-        export RUNFILES_MANIFEST_FILE="\$$0.runfiles/MANIFEST"
-    elif [[ -f "\$$0.runfiles/bazel_tools/tools/bash/runfiles/runfiles.bash" ]]; then
-        export RUNFILES_DIR="\$$0.runfiles"
-    fi
-fi
-if [[ -f "\$${{RUNFILES_DIR:-/dev/null}}/bazel_tools/tools/bash/runfiles/runfiles.bash" ]]; then
-    source "\$${{RUNFILES_DIR}}/bazel_tools/tools/bash/runfiles/runfiles.bash"
-elif [[ -f "\$${{RUNFILES_MANIFEST_FILE:-/dev/null}}" ]]; then
-    source "\$$(grep -m1 "^bazel_tools/tools/bash/runfiles/runfiles.bash " \
-    	                 "\$$RUNFILES_MANIFEST_FILE" | cut -d ' ' -f 2-)"
-else
-    echo >&2 "ERROR: cannot find @bazel_tools//tools/bash/runfiles:runfiles.bash"
-    exit 1
-fi
-# --- end runfiles.bash initialization ---
-CHART_TARBALL=\$$(rlocation __main__/{package}/{chart})
-helm --namespace={namespace} install --create-namespace {release_name} \$$CHART_TARBALL {args}
-"""
-
-__HELM_UNINSTALL_TMPL = """
-helm --namespace={namespace} uninstall {release_name}
-"""
-
-def helm_install(name, namespace, release_name, chart, args):
-    args_str = ""
-    for arg, value in args.items():
-        args_str += "--set %s=%s " % (arg, value)
-    native.genrule(
-        name = "%s.sh" % name,
-        executable = False,
-        srcs = [chart],
-        outs = ["helm_install.sh"],
-        cmd = """cat > $@ <<EOM
-%s
-EOM
-""" % __HELM_INSTALL_TMPL.format(
-            namespace = namespace,
-            release_name = release_name,
-            package = native.package_name(),
-            chart = "%s.tar.gz" % chart.split(":")[1],
-            args = args_str,
-        ),
-    )
-    native.sh_binary(
-        name = name,
-        srcs = ["helm_install.sh"],
-        data = [
-            chart,
-        ],
-        deps = [
-            "@bazel_tools//tools/bash/runfiles",
-        ],
-    )
-
-def helm_uninstall(name, namespace, release_name):
-    native.genrule(
-        name = "%s.sh" % name,
-        executable = False,
-        outs = ["helm_uninstall.sh"],
-        cmd = """cat > $@ <<EOM
-%s
-EOM
-""" % __HELM_UNINSTALL_TMPL.format(
-            namespace = namespace,
-            release_name = release_name,
-        ),
-    )
-    native.sh_binary(
-        name = name,
-        srcs = ["helm_uninstall.sh"],
-    )
diff --git a/core/vpn/in_memory_manager.go b/core/vpn/in_memory_manager.go
index eef4097..3f12635 100644
--- a/core/vpn/in_memory_manager.go
+++ b/core/vpn/in_memory_manager.go
@@ -183,7 +183,7 @@
 	m.lock.Lock()
 	defer m.lock.Unlock()
 	if d, ok := m.keyToDevices[pubKey]; ok {
-		return m.genNetworkMap(d), nil
+		return m.genNetworkMap(d)
 	}
 	return nil, errorDeviceNotFound(pubKey)
 }
@@ -209,12 +209,12 @@
 	}
 }
 
-func (m *InMemoryManager) genNetworkMap(d *types.DeviceInfo) *types.NetworkMap {
+func (m *InMemoryManager) genNetworkMap(d *types.DeviceInfo) (*types.NetworkMap, error) {
 	vpnIP, err := m.ipm.Get(d.PublicKey)
 	// NOTE(giolekva): Should not happen as devices must have been already registered and assigned IP address.
 	// Maybe should return error anyways instead of panic?
 	if err != nil {
-		panic(err)
+		return nil, err
 	}
 	ret := types.NetworkMap{
 		Self: types.Node{
@@ -243,5 +243,5 @@
 			})
 		}
 	}
-	return &ret
+	return &ret, nil
 }
diff --git a/core/vpn/manager.go b/core/vpn/manager.go
index 13f1d09..d0d3ef0 100644
--- a/core/vpn/manager.go
+++ b/core/vpn/manager.go
@@ -25,7 +25,7 @@
 	AddDeviceToGroup(pubKey types.PublicKey, id types.GroupID) (*types.NetworkMap, error)
 	// Removes device from the group and returns updated network configuration.
 	RemoveDeviceFromGroup(pubKey types.PublicKey, id types.GroupID) (*types.NetworkMap, error)
-	// Returns network configuration for a device with give public key.
+	// Returns network configuration for a device with a given public key.
 	// Result of this call must be encrypted with the same public key before
 	// sending it back to the client, so only the owner of it's corresponding
 	// private key is able to decrypt and use it.