Repository: piotrkowalczuk/charon (language: python)

Issue:
Mailer with templates



Discussion / hints:

Fix patch:
diff --git a/.circleci/config.yml b/.circleci/config.yml
index 5a7c41b..0866af5 100644
--- a/.circleci/config.yml
+++ b/.circleci/config.yml
@@ -55,7 +55,7 @@ jobs:
     - run:
         name: Install tools
         command: |
-          go get -u github.com/golang/protobuf/{proto,protoc-gen-go}
+          bash ./.circleci/scripts/get_tool.sh github.com/golang/protobuf/protoc-gen-go v1.2.0
           go get -u google.golang.org/grpc
           go get -u golang.org/x/tools/cmd/goimports
           go get -u github.com/codeclimate/test-reporter
@@ -65,7 +65,7 @@ jobs:
         command: bash ./.circleci/scripts/generate.sh golang
     - run:
         name: Check generated code for mismatch
-        command: git diff --exit-code ./charonrpc
+        command: git diff --exit-code ./pb
     - run:
         name: Code Climate (before build)
         command: test-reporter before-build
@@ -177,6 +177,8 @@ jobs:
         name: Install protoc
         command: bash ./.circleci/scripts/install_protoc.sh
     - run:
+        environment:
+          GOPATH: "/go"
         name: Generate protobuf
         command: bash ./.circleci/scripts/generate.sh java
   generate_python:
@@ -204,7 +206,7 @@ jobs:
         key: v1-python-dependency-{{ .Branch }}-{{ .Revision }}
         paths:
         - "venv"
-        - "charonrpc"
+        - "publish/python"
   publish_python:
     executor: python-executor
     steps:
@@ -218,14 +220,15 @@ jobs:
         - v1-python-dependency-{{ .Branch }}-{{ .Revision }}
     - run:
         name: Create package
+        working_directory: /publish/python
         command: |
           python setup.py sdist
           python setup.py bdist_wheel
     - run:
         name: Upload to pypi
         command: |
-          . venv/bin/activate
-          twine upload dist/*
+          . ./venv/bin/activate
+          twine upload ./publish/python/dist/*
 workflows:
   version: 2
   generate:
diff --git a/.circleci/scripts/generate.sh b/.circleci/scripts/generate.sh
index 223bd8a..f02d7ca 100755
--- a/.circleci/scripts/generate.sh
+++ b/.circleci/scripts/generate.sh
@@ -1,26 +1,36 @@
 #@IgnoreInspection BashAddShebang
-: ${PROTOC:="/usr/local/bin/protoc"}
 SERVICE="charon"
-PROTO_INCLUDE="-I=. -I=/usr/include -I=./vendor/github.com/piotrkowalczuk"
+PROTO_INCLUDE="-I=./tmp/pb -I=./vendor/github.com/piotrkowalczuk -I=${GOPATH}/src"
 
-case $1 in
-    lint)
-        ${PROTOC} ${PROTO_INCLUDE} --lint_out=. ./${SERVICE}rpc/*.proto
-        ;;
-    python)
-        python -m grpc_tools.protoc ${PROTO_INCLUDE} --python_out=. --grpc_python_out=. ./${SERVICE}rpc/*.proto
-        ;;
-    java)
-        rm -rf ./tmp/java
-        mkdir -p ./tmp/java
-        ${PROTOC} ${PROTO_INCLUDE} --java_out=./tmp/java ./${SERVICE}rpc/*.proto
-        ;;
-    golang | go)
-        ${PROTOC} ${PROTO_INCLUDE} --go_out=plugins=grpc:${GOPATH}/src ./${SERVICE}rpc/*.proto
-        goimports -w ./${SERVICE}rpc
-        ;;
-	*)
-	    echo "code generation failure due to unknown language: ${1}"
-        exit 1
-        ;;
-esac
+: ${PROTOC:="${PWD}/tmp/bin/protoc"}
+
+protobufs=(
+    "rpc/${SERVICE}d/v1"
+)
+for protobuf in "${protobufs[@]}"
+do
+    case $1 in
+        lint)
+            ${PROTOC} ${PROTO_INCLUDE} --lint_out=. ${PWD}/pb/${protobuf}/*.proto
+            ;;
+        python)
+            python -m grpc_tools.protoc ${PROTO_INCLUDE} --python_out=publish/python --grpc_python_out=publish/python ${PWD}/pb/${protobuf}/*.proto
+            cp publish/python/github.com/piotrkowalczuk/charon/pb/${protobuf}/* publish/python/github/com/piotrkowalczuk/charon/pb/${protobuf}/
+            rm -rf publish/python/github.com
+            ;;
+        java)
+            rm -rf ./publish/java
+            mkdir -p ./publish/java
+            ${PROTOC} ${PROTO_INCLUDE} --java_out=./publish/java ${PWD}/pb/${protobuf}/*.proto
+            ;;
+        golang | go)
+            ${PROTOC} ${PROTO_INCLUDE} --go_out=plugins=grpc:${GOPATH}/src ${PWD}/pb/${protobuf}/*.proto
+            mockery -case=underscore -dir=./pb/${protobuf} -all -outpkg=$(basename $(dirname "./pb/${protobuf}mock"))mock -output=./pb/${protobuf}mock
+            goimports -w ${PWD}/pb
+            ;;
+        *)
+            echo "code generation failure due to unknown language: ${1}"
+            exit 1
+            ;;
+    esac
+done
\ No newline at end of file
diff --git a/.circleci/scripts/get_tool.sh b/.circleci/scripts/get_tool.sh
new file mode 100644
index 0000000..9813869
--- /dev/null
+++ b/.circleci/scripts/get_tool.sh
@@ -0,0 +1,6 @@
+rm -rf tmp/tools/$1
+mkdir -p tmp/tools/$1
+cd tmp/tools/$1
+GO111MODULE=on go mod init
+GO111MODULE=on go get $1@$2
+GO111MODULE=on go install $1
\ No newline at end of file
diff --git a/.circleci/scripts/install_protoc.sh b/.circleci/scripts/install_protoc.sh
index 132b00a..51e6d15 100755
--- a/.circleci/scripts/install_protoc.sh
+++ b/.circleci/scripts/install_protoc.sh
@@ -1,12 +1,15 @@
-curl -L https://github.com/google/protobuf/releases/download/v3.6.1/protoc-3.6.1-linux-x86_64.zip > protoc.zip
+echo "protoc installation in ${PWD}/tmp/bin"
+
+curl -L https://github.com/google/protobuf/releases/download/v3.7.1/protoc-3.7.1-linux-x86_64.zip > protoc.zip
+
+rm -rf ./tmp/protoc ./tmp/pb/google
+mkdir -p ./tmp/protoc ./tmp/bin ./tmp/pb/google
 
-rm -rf ./tmp/protoc
-mkdir -p ./tmp/protoc
 unzip protoc.zip -d ./tmp/protoc
 
-sudo mv -f ./tmp/protoc/bin/protoc /usr/local/bin/protoc
+mv -f ./tmp/protoc/bin/protoc ./tmp/bin/protoc
+mv -f ./tmp/protoc/include/google ./tmp/pb
 
-sudo rm -rf /usr/include/google
-sudo mv -f ./tmp/protoc/include/google/ /usr/include/google
+rm -rf ./tmp/protoc
 
-protoc --version
\ No newline at end of file
+./tmp/bin/protoc --version
\ No newline at end of file
diff --git a/.codeclimate.yml b/.codeclimate.yml
index b7b8cfe..6b282c2 100644
--- a/.codeclimate.yml
+++ b/.codeclimate.yml
@@ -24,7 +24,6 @@ exclude_patterns:
   - "**/*.pb.go"
   - "**/*.pqt.go"
   - "**/mock_*.go"
-  - "charontest/"
-  - "charonrpc/"
+  - "pb/"
   - "scripts/"
   - "vendor/**/*"
\ No newline at end of file
diff --git a/.gitignore b/.gitignore
index 0cd9ac4..a8714c7 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,18 +1,30 @@
 .vagrant
 .idea
 .glide
-.tmp
+tmp
 example/client/client
-/temp
 vendor
 _vendor-*
-charon.iml
 run.sh
 coverage.txt
 *.out
 bin
-charon_client.egg-info
-VERSION.txt
-*.pyc
+
+publish/VERSION.txt
+
 *.xml
 *.test
+*.zip
+
+// Python
+venv
+charon.iml
+charon_client.egg-info
+*.pyc
+publish/python/github*
+publish/python/charon_client*
+publish/python/charon-client*
+publish/python/dist
+
+// Java
+publish/java
\ No newline at end of file
diff --git a/Makefile b/Makefile
index c1db975..788eb08 100644
--- a/Makefile
+++ b/Makefile
@@ -19,7 +19,7 @@ LDFLAGS = -X 'main.version=$(VERSION)'
 all: get install
 
 version:
-	echo ${VERSION} > VERSION.txt
+	echo ${VERSION} > publish/VERSION.txt
 
 build:
 	CGO_ENABLED=0 GOOS=linux go build -ldflags "${LDFLAGS}" -a -o bin/${SERVICE}g ${PACKAGE_CMD_GENERATOR}
@@ -32,7 +32,7 @@ install:
 	go install -ldflags "${LDFLAGS}" ${PACKAGE_CMD_CONTROL}
 
 gen:
-	./scripts/generate.sh
+	#./scripts/generate.sh
 	bash ./.circleci/scripts/generate.sh golang
 
 test:
@@ -43,8 +43,7 @@ cover: test
 	go tool cover -html=cover.out
 
 get:
-	go get -u github.com/golang/protobuf/{proto,protoc-gen-go}
-	go get -u google.golang.org/grpc
+	bash ./.circleci/scripts/get_tool.sh github.com/golang/protobuf/proto v1.2.0
 	go get -u gotest.tools/gotestsum
 	go get -u github.com/vektra/mockery/cmd/mockery
 	go get -u github.com/golang/dep/cmd/dep
@@ -56,3 +55,9 @@ publish:
 		--build-arg BUILD_DATE=`date -u +"%Y-%m-%dT%H:%M:%SZ"` \
 		-t piotrkowalczuk/${SERVICE}:${TAG} .
 	docker push piotrkowalczuk/${SERVICE}:${TAG}
+
+setup-python:
+	python3 -m venv venv
+	source ./venv/bin/activate.fish
+	pip install grpc_tools
+	pip install grpcio-tools
\ No newline at end of file
diff --git a/README.md b/README.md
index ad12b8b..0ebd22c 100644
--- a/README.md
+++ b/README.md
@@ -24,29 +24,7 @@ $ charonctl register -address=localhost:8080 -auth.disabled -register.superuser=
 ```
 ## Example
 
-### Python
-
-```python
-from  charonrpc import auth_pb2, auth_pb2_grpc
-import grpc
-
-charonChannel = grpc.insecure_channel('ADDRESS')
-auth = auth_pb2_grpc.AuthStub(charonChannel)
-try:
-	res = auth.Login(auth_pb2.LoginRequest(
-		username="USERNAME",
-		password="PASSWORD",
-	))
-
-	print "access token: %s" % res.value
-except grpc.RpcError as e:
-	if e.code() == grpc.StatusCode.UNAUTHENTICATED:
-		print "login failure, username and/or password do not match"
-	else:
-	    print "grpc error: %s" % e
-except Exception as e:
-	print "unexpected error: %s" % e
-```
+TODO
 
 ## Contribution
 
diff --git a/charonrpc/__init__.py b/charonrpc/__init__.py
deleted file mode 100644
index e69de29..0000000
diff --git a/charonrpc/auth_pb2_grpc.py b/charonrpc/auth_pb2_grpc.py
deleted file mode 100644
index 7875f70..0000000
--- a/charonrpc/auth_pb2_grpc.py
+++ /dev/null
@@ -1,133 +0,0 @@
-# Generated by the gRPC Python protocol compiler plugin. DO NOT EDIT!
-import grpc
-
-from charonrpc import auth_pb2 as charonrpc_dot_auth__pb2
-from google.protobuf import empty_pb2 as google_dot_protobuf_dot_empty__pb2
-from google.protobuf import wrappers_pb2 as google_dot_protobuf_dot_wrappers__pb2
-
-
-class AuthStub(object):
-  # missing associated documentation comment in .proto file
-  pass
-
-  def __init__(self, channel):
-    """Constructor.
-
-    Args:
-      channel: A grpc.Channel.
-    """
-    self.Login = channel.unary_unary(
-        '/charonrpc.Auth/Login',
-        request_serializer=charonrpc_dot_auth__pb2.LoginRequest.SerializeToString,
-        response_deserializer=google_dot_protobuf_dot_wrappers__pb2.StringValue.FromString,
-        )
-    self.Logout = channel.unary_unary(
-        '/charonrpc.Auth/Logout',
-        request_serializer=charonrpc_dot_auth__pb2.LogoutRequest.SerializeToString,
-        response_deserializer=google_dot_protobuf_dot_empty__pb2.Empty.FromString,
-        )
-    self.IsAuthenticated = channel.unary_unary(
-        '/charonrpc.Auth/IsAuthenticated',
-        request_serializer=charonrpc_dot_auth__pb2.IsAuthenticatedRequest.SerializeToString,
-        response_deserializer=google_dot_protobuf_dot_wrappers__pb2.BoolValue.FromString,
-        )
-    self.Actor = channel.unary_unary(
-        '/charonrpc.Auth/Actor',
-        request_serializer=google_dot_protobuf_dot_wrappers__pb2.StringValue.SerializeToString,
-        response_deserializer=charonrpc_dot_auth__pb2.ActorResponse.FromString,
-        )
-    self.IsGranted = channel.unary_unary(
-        '/charonrpc.Auth/IsGranted',
-        request_serializer=charonrpc_dot_auth__pb2.IsGrantedRequest.SerializeToString,
-        response_deserializer=google_dot_protobuf_dot_wrappers__pb2.BoolValue.FromString,
-        )
-    self.BelongsTo = channel.unary_unary(
-        '/charonrpc.Auth/BelongsTo',
-        request_serializer=charonrpc_dot_auth__pb2.BelongsToRequest.SerializeToString,
-        response_deserializer=google_dot_protobuf_dot_wrappers__pb2.BoolValue.FromString,
-        )
-
-
-class AuthServicer(object):
-  # missing associated documentation comment in .proto file
-  pass
-
-  def Login(self, request, context):
-    # missing associated documentation comment in .proto file
-    pass
-    context.set_code(grpc.StatusCode.UNIMPLEMENTED)
-    context.set_details('Method not implemented!')
-    raise NotImplementedError('Method not implemented!')
-
-  def Logout(self, request, context):
-    # missing associated documentation comment in .proto file
-    pass
-    context.set_code(grpc.StatusCode.UNIMPLEMENTED)
-    context.set_details('Method not implemented!')
-    raise NotImplementedError('Method not implemented!')
-
-  def IsAuthenticated(self, request, context):
-    # missing associated documentation comment in .proto file
-    pass
-    context.set_code(grpc.StatusCode.UNIMPLEMENTED)
-    context.set_details('Method not implemented!')
-    raise NotImplementedError('Method not implemented!')
-
-  def Actor(self, request, context):
-    # missing associated documentation comment in .proto file
-    pass
-    context.set_code(grpc.StatusCode.UNIMPLEMENTED)
-    context.set_details('Method not implemented!')
-    raise NotImplementedError('Method not implemented!')
-
-  def IsGranted(self, request, context):
-    # missing associated documentation comment in .proto file
-    pass
-    context.set_code(grpc.StatusCode.UNIMPLEMENTED)
-    context.set_details('Method not implemented!')
-    raise NotImplementedError('Method not implemented!')
-
-  def BelongsTo(self, request, context):
-    # missing associated documentation comment in .proto file
-    pass
-    context.set_code(grpc.StatusCode.UNIMPLEMENTED)
-    context.set_details('Method not implemented!')
-    raise NotImplementedError('Method not implemented!')
-
-
-def add_AuthServicer_to_server(servicer, server):
-  rpc_method_handlers = {
-      'Login': grpc.unary_unary_rpc_method_handler(
-          servicer.Login,
-          request_deserializer=charonrpc_dot_auth__pb2.LoginRequest.FromString,
-          response_serializer=google_dot_protobuf_dot_wrappers__pb2.StringValue.SerializeToString,
-      ),
-      'Logout': grpc.unary_unary_rpc_method_handler(
-          servicer.Logout,
-          request_deserializer=charonrpc_dot_auth__pb2.LogoutRequest.FromString,
-          response_serializer=google_dot_protobuf_dot_empty__pb2.Empty.SerializeToString,
-      ),
-      'IsAuthenticated': grpc.unary_unary_rpc_method_handler(
-          servicer.IsAuthenticated,
-          request_deserializer=charonrpc_dot_auth__pb2.IsAuthenticatedRequest.FromString,
-          response_serializer=google_dot_protobuf_dot_wrappers__pb2.BoolValue.SerializeToString,
-      ),
-      'Actor': grpc.unary_unary_rpc_method_handler(
-          servicer.Actor,
-          request_deserializer=google_dot_protobuf_dot_wrappers__pb2.StringValue.FromString,
-          response_serializer=charonrpc_dot_auth__pb2.ActorResponse.SerializeToString,
-      ),
-      'IsGranted': grpc.unary_unary_rpc_method_handler(
-          servicer.IsGranted,
-          request_deserializer=charonrpc_dot_auth__pb2.IsGrantedRequest.FromString,
-          response_serializer=google_dot_protobuf_dot_wrappers__pb2.BoolValue.SerializeToString,
-      ),
-      'BelongsTo': grpc.unary_unary_rpc_method_handler(
-          servicer.BelongsTo,
-          request_deserializer=charonrpc_dot_auth__pb2.BelongsToRequest.FromString,
-          response_serializer=google_dot_protobuf_dot_wrappers__pb2.BoolValue.SerializeToString,
-      ),
-  }
-  generic_handler = grpc.method_handlers_generic_handler(
-      'charonrpc.Auth', rpc_method_handlers)
-  server.add_generic_rpc_handlers((generic_handler,))
diff --git a/charonrpc/common.proto b/charonrpc/common.proto
deleted file mode 100644
index ca3455b..0000000
--- a/charonrpc/common.proto
+++ /dev/null
@@ -1,11 +0,0 @@
-syntax = "proto3";
-
-package charonrpc;
-
-option go_package = "github.com/piotrkowalczuk/charon/charonrpc";
-
-// Order represents single field within OrderBy clause.
-message Order {
-    string name = 1;
-    bool descending = 2;
-}
\ No newline at end of file
diff --git a/charonrpc/common_pb2_grpc.py b/charonrpc/common_pb2_grpc.py
deleted file mode 100644
index a894352..0000000
--- a/charonrpc/common_pb2_grpc.py
+++ /dev/null
@@ -1,3 +0,0 @@
-# Generated by the gRPC Python protocol compiler plugin. DO NOT EDIT!
-import grpc
-
diff --git a/charonrpc/group_pb2_grpc.py b/charonrpc/group_pb2_grpc.py
deleted file mode 100644
index 92a866c..0000000
--- a/charonrpc/group_pb2_grpc.py
+++ /dev/null
@@ -1,149 +0,0 @@
-# Generated by the gRPC Python protocol compiler plugin. DO NOT EDIT!
-import grpc
-
-from charonrpc import group_pb2 as charonrpc_dot_group__pb2
-from google.protobuf import wrappers_pb2 as google_dot_protobuf_dot_wrappers__pb2
-
-
-class GroupManagerStub(object):
-  # missing associated documentation comment in .proto file
-  pass
-
-  def __init__(self, channel):
-    """Constructor.
-
-    Args:
-      channel: A grpc.Channel.
-    """
-    self.Create = channel.unary_unary(
-        '/charonrpc.GroupManager/Create',
-        request_serializer=charonrpc_dot_group__pb2.CreateGroupRequest.SerializeToString,
-        response_deserializer=charonrpc_dot_group__pb2.CreateGroupResponse.FromString,
-        )
-    self.Modify = channel.unary_unary(
-        '/charonrpc.GroupManager/Modify',
-        request_serializer=charonrpc_dot_group__pb2.ModifyGroupRequest.SerializeToString,
-        response_deserializer=charonrpc_dot_group__pb2.ModifyGroupResponse.FromString,
-        )
-    self.Get = channel.unary_unary(
-        '/charonrpc.GroupManager/Get',
-        request_serializer=charonrpc_dot_group__pb2.GetGroupRequest.SerializeToString,
-        response_deserializer=charonrpc_dot_group__pb2.GetGroupResponse.FromString,
-        )
-    self.List = channel.unary_unary(
-        '/charonrpc.GroupManager/List',
-        request_serializer=charonrpc_dot_group__pb2.ListGroupsRequest.SerializeToString,
-        response_deserializer=charonrpc_dot_group__pb2.ListGroupsResponse.FromString,
-        )
-    self.Delete = channel.unary_unary(
-        '/charonrpc.GroupManager/Delete',
-        request_serializer=charonrpc_dot_group__pb2.DeleteGroupRequest.SerializeToString,
-        response_deserializer=google_dot_protobuf_dot_wrappers__pb2.BoolValue.FromString,
-        )
-    self.ListPermissions = channel.unary_unary(
-        '/charonrpc.GroupManager/ListPermissions',
-        request_serializer=charonrpc_dot_group__pb2.ListGroupPermissionsRequest.SerializeToString,
-        response_deserializer=charonrpc_dot_group__pb2.ListGroupPermissionsResponse.FromString,
-        )
-    self.SetPermissions = channel.unary_unary(
-        '/charonrpc.GroupManager/SetPermissions',
-        request_serializer=charonrpc_dot_group__pb2.SetGroupPermissionsRequest.SerializeToString,
-        response_deserializer=charonrpc_dot_group__pb2.SetGroupPermissionsResponse.FromString,
-        )
-
-
-class GroupManagerServicer(object):
-  # missing associated documentation comment in .proto file
-  pass
-
-  def Create(self, request, context):
-    # missing associated documentation comment in .proto file
-    pass
-    context.set_code(grpc.StatusCode.UNIMPLEMENTED)
-    context.set_details('Method not implemented!')
-    raise NotImplementedError('Method not implemented!')
-
-  def Modify(self, request, context):
-    # missing associated documentation comment in .proto file
-    pass
-    context.set_code(grpc.StatusCode.UNIMPLEMENTED)
-    context.set_details('Method not implemented!')
-    raise NotImplementedError('Method not implemented!')
-
-  def Get(self, request, context):
-    # missing associated documentation comment in .proto file
-    pass
-    context.set_code(grpc.StatusCode.UNIMPLEMENTED)
-    context.set_details('Method not implemented!')
-    raise NotImplementedError('Method not implemented!')
-
-  def List(self, request, context):
-    # missing associated documentation comment in .proto file
-    pass
-    context.set_code(grpc.StatusCode.UNIMPLEMENTED)
-    context.set_details('Method not implemented!')
-    raise NotImplementedError('Method not implemented!')
-
-  def Delete(self, request, context):
-    # missing associated documentation comment in .proto file
-    pass
-    context.set_code(grpc.StatusCode.UNIMPLEMENTED)
-    context.set_details('Method not implemented!')
-    raise NotImplementedError('Method not implemented!')
-
-  def ListPermissions(self, request, context):
-    # missing associated documentation comment in .proto file
-    pass
-    context.set_code(grpc.StatusCode.UNIMPLEMENTED)
-    context.set_details('Method not implemented!')
-    raise NotImplementedError('Method not implemented!')
-
-  def SetPermissions(self, request, context):
-    # missing associated documentation comment in .proto file
-    pass
-    context.set_code(grpc.StatusCode.UNIMPLEMENTED)
-    context.set_details('Method not implemented!')
-    raise NotImplementedError('Method not implemented!')
-
-
-def add_GroupManagerServicer_to_server(servicer, server):
-  rpc_method_handlers = {
-      'Create': grpc.unary_unary_rpc_method_handler(
-          servicer.Create,
-          request_deserializer=charonrpc_dot_group__pb2.CreateGroupRequest.FromString,
-          response_serializer=charonrpc_dot_group__pb2.CreateGroupResponse.SerializeToString,
-      ),
-      'Modify': grpc.unary_unary_rpc_method_handler(
-          servicer.Modify,
-          request_deserializer=charonrpc_dot_group__pb2.ModifyGroupRequest.FromString,
-          response_serializer=charonrpc_dot_group__pb2.ModifyGroupResponse.SerializeToString,
-      ),
-      'Get': grpc.unary_unary_rpc_method_handler(
-          servicer.Get,
-          request_deserializer=charonrpc_dot_group__pb2.GetGroupRequest.FromString,
-          response_serializer=charonrpc_dot_group__pb2.GetGroupResponse.SerializeToString,
-      ),
-      'List': grpc.unary_unary_rpc_method_handler(
-          servicer.List,
-          request_deserializer=charonrpc_dot_group__pb2.ListGroupsRequest.FromString,
-          response_serializer=charonrpc_dot_group__pb2.ListGroupsResponse.SerializeToString,
-      ),
-      'Delete': grpc.unary_unary_rpc_method_handler(
-          servicer.Delete,
-          request_deserializer=charonrpc_dot_group__pb2.DeleteGroupRequest.FromString,
-          response_serializer=google_dot_protobuf_dot_wrappers__pb2.BoolValue.SerializeToString,
-      ),
-      'ListPermissions': grpc.unary_unary_rpc_method_handler(
-          servicer.ListPermissions,
-          request_deserializer=charonrpc_dot_group__pb2.ListGroupPermissionsRequest.FromString,
-          response_serializer=charonrpc_dot_group__pb2.ListGroupPermissionsResponse.SerializeToString,
-      ),
-      'SetPermissions': grpc.unary_unary_rpc_method_handler(
-          servicer.SetPermissions,
-          request_deserializer=charonrpc_dot_group__pb2.SetGroupPermissionsRequest.FromString,
-          response_serializer=charonrpc_dot_group__pb2.SetGroupPermissionsResponse.SerializeToString,
-      ),
-  }
-  generic_handler = grpc.method_handlers_generic_handler(
-      'charonrpc.GroupManager', rpc_method_handlers)
-  server.add_generic_rpc_handlers((generic_handler,))
diff --git a/charonrpc/permission_pb2_grpc.py b/charonrpc/permission_pb2_grpc.py
deleted file mode 100644
index b7075d5..0000000
--- a/charonrpc/permission_pb2_grpc.py
+++ /dev/null
@@ -1,80 +0,0 @@
-# Generated by the gRPC Python protocol compiler plugin. DO NOT EDIT!
-import grpc
-
-from charonrpc import permission_pb2 as charonrpc_dot_permission__pb2
-
-
-class PermissionManagerStub(object):
-  # missing associated documentation comment in .proto file
-  pass
-
-  def __init__(self, channel):
-    """Constructor.
-
-    Args:
-      channel: A grpc.Channel.
-    """
-    self.Register = channel.unary_unary(
-        '/charonrpc.PermissionManager/Register',
-        request_serializer=charonrpc_dot_permission__pb2.RegisterPermissionsRequest.SerializeToString,
-        response_deserializer=charonrpc_dot_permission__pb2.RegisterPermissionsResponse.FromString,
-        )
-    self.List = channel.unary_unary(
-        '/charonrpc.PermissionManager/List',
-        request_serializer=charonrpc_dot_permission__pb2.ListPermissionsRequest.SerializeToString,
-        response_deserializer=charonrpc_dot_permission__pb2.ListPermissionsResponse.FromString,
-        )
-    self.Get = channel.unary_unary(
-        '/charonrpc.PermissionManager/Get',
-        request_serializer=charonrpc_dot_permission__pb2.GetPermissionRequest.SerializeToString,
-        response_deserializer=charonrpc_dot_permission__pb2.GetPermissionResponse.FromString,
-        )
-
-
-class PermissionManagerServicer(object):
-  # missing associated documentation comment in .proto file
-  pass
-
-  def Register(self, request, context):
-    # missing associated documentation comment in .proto file
-    pass
-    context.set_code(grpc.StatusCode.UNIMPLEMENTED)
-    context.set_details('Method not implemented!')
-    raise NotImplementedError('Method not implemented!')
-
-  def List(self, request, context):
-    # missing associated documentation comment in .proto file
-    pass
-    context.set_code(grpc.StatusCode.UNIMPLEMENTED)
-    context.set_details('Method not implemented!')
-    raise NotImplementedError('Method not implemented!')
-
-  def Get(self, request, context):
-    # missing associated documentation comment in .proto file
-    pass
-    context.set_code(grpc.StatusCode.UNIMPLEMENTED)
-    context.set_details('Method not implemented!')
-    raise NotImplementedError('Method not implemented!')
-
-
-def add_PermissionManagerServicer_to_server(servicer, server):
-  rpc_method_handlers = {
-      'Register': grpc.unary_unary_rpc_method_handler(
-          servicer.Register,
-          request_deserializer=charonrpc_dot_permission__pb2.RegisterPermissionsRequest.FromString,
-          response_serializer=charonrpc_dot_permission__pb2.RegisterPermissionsResponse.SerializeToString,
-      ),
-      'List': grpc.unary_unary_rpc_method_handler(
-          servicer.List,
-          request_deserializer=charonrpc_dot_permission__pb2.ListPermissionsRequest.FromString,
-          response_serializer=charonrpc_dot_permission__pb2.ListPermissionsResponse.SerializeToString,
-      ),
-      'Get': grpc.unary_unary_rpc_method_handler(
-          servicer.Get,
-          request_deserializer=charonrpc_dot_permission__pb2.GetPermissionRequest.FromString,
-          response_serializer=charonrpc_dot_permission__pb2.GetPermissionResponse.SerializeToString,
-      ),
-  }
-  generic_handler = grpc.method_handlers_generic_handler(
-      'charonrpc.PermissionManager', rpc_method_handlers)
-  server.add_generic_rpc_handlers((generic_handler,))
diff --git a/charonrpc/refresh_token_pb2_grpc.py b/charonrpc/refresh_token_pb2_grpc.py
deleted file mode 100644
index 412bebe..0000000
--- a/charonrpc/refresh_token_pb2_grpc.py
+++ /dev/null
@@ -1,80 +0,0 @@
-# Generated by the gRPC Python protocol compiler plugin. DO NOT EDIT!
-import grpc
-
-from charonrpc import refresh_token_pb2 as charonrpc_dot_refresh__token__pb2
-
-
-class RefreshTokenManagerStub(object):
-  # missing associated documentation comment in .proto file
-  pass
-
-  def __init__(self, channel):
-    """Constructor.
-
-    Args:
-      channel: A grpc.Channel.
-    """
-    self.Create = channel.unary_unary(
-        '/charonrpc.RefreshTokenManager/Create',
-        request_serializer=charonrpc_dot_refresh__token__pb2.CreateRefreshTokenRequest.SerializeToString,
-        response_deserializer=charonrpc_dot_refresh__token__pb2.CreateRefreshTokenResponse.FromString,
-        )
-    self.Disable = channel.unary_unary(
-        '/charonrpc.RefreshTokenManager/Disable',
-        request_serializer=charonrpc_dot_refresh__token__pb2.DisableRefreshTokenRequest.SerializeToString,
-        response_deserializer=charonrpc_dot_refresh__token__pb2.DisableRefreshTokenResponse.FromString,
-        )
-    self.List = channel.unary_unary(
-        '/charonrpc.RefreshTokenManager/List',
-        request_serializer=charonrpc_dot_refresh__token__pb2.ListRefreshTokensRequest.SerializeToString,
-        response_deserializer=charonrpc_dot_refresh__token__pb2.ListRefreshTokensResponse.FromString,
-        )
-
-
-class RefreshTokenManagerServicer(object):
-  # missing associated documentation comment in .proto file
-  pass
-
-  def Create(self, request, context):
-    # missing associated documentation comment in .proto file
-    pass
-    context.set_code(grpc.StatusCode.UNIMPLEMENTED)
-    context.set_details('Method not implemented!')
-    raise NotImplementedError('Method not implemented!')
-
-  def Disable(self, request, context):
-    # missing associated documentation comment in .proto file
-    pass
-    context.set_code(grpc.StatusCode.UNIMPLEMENTED)
-    context.set_details('Method not implemented!')
-    raise NotImplementedError('Method not implemented!')
-
-  def List(self, request, context):
-    # missing associated documentation comment in .proto file
-    pass
-    context.set_code(grpc.StatusCode.UNIMPLEMENTED)
-    context.set_details('Method not implemented!')
-    raise NotImplementedError('Method not implemented!')
-
-
-def add_RefreshTokenManagerServicer_to_server(servicer, server):
-  rpc_method_handlers = {
-      'Create': grpc.unary_unary_rpc_method_handler(
-          servicer.Create,
-          request_deserializer=charonrpc_dot_refresh__token__pb2.CreateRefreshTokenRequest.FromString,
-          response_serializer=charonrpc_dot_refresh__token__pb2.CreateRefreshTokenResponse.SerializeToString,
-      ),
-      'Disable': grpc.unary_unary_rpc_method_handler(
-          servicer.Disable,
-          request_deserializer=charonrpc_dot_refresh__token__pb2.DisableRefreshTokenRequest.FromString,
-          response_serializer=charonrpc_dot_refresh__token__pb2.DisableRefreshTokenResponse.SerializeToString,
-      ),
-      'List': grpc.unary_unary_rpc_method_handler(
-          servicer.List,
-          request_deserializer=charonrpc_dot_refresh__token__pb2.ListRefreshTokensRequest.FromString,
-          response_serializer=charonrpc_dot_refresh__token__pb2.ListRefreshTokensResponse.SerializeToString,
-      ),
-  }
-  generic_handler = grpc.method_handlers_generic_handler(
-      'charonrpc.RefreshTokenManager', rpc_method_handlers)
-  server.add_generic_rpc_handlers((generic_handler,))
diff --git a/charonrpc/user.go b/charonrpc/user.go
deleted file mode 100644
index d86532c..0000000
--- a/charonrpc/user.go
+++ /dev/null
@@ -1,6 +0,0 @@
-package charonrpc
-
-// Name return concatenated first and last name.
-func (u *User) Name() string {
-	return u.FirstName + " " + u.LastName
-}
diff --git a/charonrpc/user_pb2_grpc.py b/charonrpc/user_pb2_grpc.py
deleted file mode 100644
index b0494c6..0000000
--- a/charonrpc/user_pb2_grpc.py
+++ /dev/null
@@ -1,183 +0,0 @@
-# Generated by the gRPC Python protocol compiler plugin. DO NOT EDIT!
-import grpc
-
-from charonrpc import user_pb2 as charonrpc_dot_user__pb2
-from google.protobuf import wrappers_pb2 as google_dot_protobuf_dot_wrappers__pb2
-
-
-class UserManagerStub(object):
-  # missing associated documentation comment in .proto file
-  pass
-
-  def __init__(self, channel):
-    """Constructor.
-
-    Args:
-      channel: A grpc.Channel.
-    """
-    self.Create = channel.unary_unary(
-        '/charonrpc.UserManager/Create',
-        request_serializer=charonrpc_dot_user__pb2.CreateUserRequest.SerializeToString,
-        response_deserializer=charonrpc_dot_user__pb2.CreateUserResponse.FromString,
-        )
-    self.Modify = channel.unary_unary(
-        '/charonrpc.UserManager/Modify',
-        request_serializer=charonrpc_dot_user__pb2.ModifyUserRequest.SerializeToString,
-        response_deserializer=charonrpc_dot_user__pb2.ModifyUserResponse.FromString,
-        )
-    self.Get = channel.unary_unary(
-        '/charonrpc.UserManager/Get',
-        request_serializer=charonrpc_dot_user__pb2.GetUserRequest.SerializeToString,
-        response_deserializer=charonrpc_dot_user__pb2.GetUserResponse.FromString,
-        )
-    self.List = channel.unary_unary(
-        '/charonrpc.UserManager/List',
-        request_serializer=charonrpc_dot_user__pb2.ListUsersRequest.SerializeToString,
-        response_deserializer=charonrpc_dot_user__pb2.ListUsersResponse.FromString,
-        )
-    self.Delete = channel.unary_unary(
-        '/charonrpc.UserManager/Delete',
-        request_serializer=charonrpc_dot_user__pb2.DeleteUserRequest.SerializeToString,
-        response_deserializer=google_dot_protobuf_dot_wrappers__pb2.BoolValue.FromString,
-        )
-    self.ListPermissions = channel.unary_unary(
-        '/charonrpc.UserManager/ListPermissions',
-        request_serializer=charonrpc_dot_user__pb2.ListUserPermissionsRequest.SerializeToString,
-        response_deserializer=charonrpc_dot_user__pb2.ListUserPermissionsResponse.FromString,
-        )
-    self.SetPermissions = channel.unary_unary(
-        '/charonrpc.UserManager/SetPermissions',
-        request_serializer=charonrpc_dot_user__pb2.SetUserPermissionsRequest.SerializeToString,
-        response_deserializer=charonrpc_dot_user__pb2.SetUserPermissionsResponse.FromString,
-        )
-    self.ListGroups = channel.unary_unary(
-        '/charonrpc.UserManager/ListGroups',
-        request_serializer=charonrpc_dot_user__pb2.ListUserGroupsRequest.SerializeToString,
-        response_deserializer=charonrpc_dot_user__pb2.ListUserGroupsResponse.FromString,
-        )
-    self.SetGroups = channel.unary_unary(
-        '/charonrpc.UserManager/SetGroups',
-        request_serializer=charonrpc_dot_user__pb2.SetUserGroupsRequest.SerializeToString,
-        response_deserializer=charonrpc_dot_user__pb2.SetUserGroupsResponse.FromString,
-        )
-
-
-class UserManagerServicer(object):
-  # missing associated documentation comment in .proto file
-  pass
-
-  def Create(self, request, context):
-    # missing associated documentation comment in .proto file
-    pass
-    context.set_code(grpc.StatusCode.UNIMPLEMENTED)
-    context.set_details('Method not implemented!')
-    raise NotImplementedError('Method not implemented!')
-
-  def Modify(self, request, context):
-    # missing associated documentation comment in .proto file
-    pass
-    context.set_code(grpc.StatusCode.UNIMPLEMENTED)
-    context.set_details('Method not implemented!')
-    raise NotImplementedError('Method not implemented!')
-
-  def Get(self, request, context):
-    # missing associated documentation comment in .proto file
-    pass
-    context.set_code(grpc.StatusCode.UNIMPLEMENTED)
-    context.set_details('Method not implemented!')
-    raise NotImplementedError('Method not implemented!')
-
-  def List(self, request, context):
-    # missing associated documentation comment in .proto file
-    pass
-    context.set_code(grpc.StatusCode.UNIMPLEMENTED)
-    context.set_details('Method not implemented!')
-    raise NotImplementedError('Method not implemented!')
-
-  def Delete(self, request, context):
-    # missing associated documentation comment in .proto file
-    pass
-    context.set_code(grpc.StatusCode.UNIMPLEMENTED)
-    context.set_details('Method not implemented!')
-    raise NotImplementedError('Method not implemented!')
-
-  def ListPermissions(self, request, context):
-    # missing associated documentation comment in .proto file
-    pass
-    context.set_code(grpc.StatusCode.UNIMPLEMENTED)
-    context.set_details('Method not implemented!')
-    raise NotImplementedError('Method not implemented!')
-
-  def SetPermissions(self, request, context):
-    # missing associated documentation comment in .proto file
-    pass
-    context.set_code(grpc.StatusCode.UNIMPLEMENTED)
-    context.set_details('Method not implemented!')
-    raise NotImplementedError('Method not implemented!')
-
-  def ListGroups(self, request, context):
-    # missing associated documentation comment in .proto file
-    pass
-    context.set_code(grpc.StatusCode.UNIMPLEMENTED)
-    context.set_details('Method not implemented!')
-    raise NotImplementedError('Method not implemented!')
-
-  def SetGroups(self, request, context):
-    # missing associated documentation comment in .proto file
-    pass
-    context.set_code(grpc.StatusCode.UNIMPLEMENTED)
-    context.set_details('Method not implemented!')
-    raise NotImplementedError('Method not implemented!')
-
-
-def add_UserManagerServicer_to_server(servicer, server):
-  rpc_method_handlers = {
-      'Create': grpc.unary_unary_rpc_method_handler(
-          servicer.Create,
-          request_deserializer=charonrpc_dot_user__pb2.CreateUserRequest.FromString,
-          response_serializer=charonrpc_dot_user__pb2.CreateUserResponse.SerializeToString,
-      ),
-      'Modify': grpc.unary_unary_rpc_method_handler(
-          servicer.Modify,
-          request_deserializer=charonrpc_dot_user__pb2.ModifyUserRequest.FromString,
-          response_serializer=charonrpc_dot_user__pb2.ModifyUserResponse.SerializeToString,
-      ),
-      'Get': grpc.unary_unary_rpc_method_handler(
-          servicer.Get,
-          request_deserializer=charonrpc_dot_user__pb2.GetUserRequest.FromString,
-          response_serializer=charonrpc_dot_user__pb2.GetUserResponse.SerializeToString,
-      ),
-      'List': grpc.unary_unary_rpc_method_handler(
-          servicer.List,
-          request_deserializer=charonrpc_dot_user__pb2.ListUsersRequest.FromString,
-          response_serializer=charonrpc_dot_user__pb2.ListUsersResponse.SerializeToString,
-      ),
-      'Delete': grpc.unary_unary_rpc_method_handler(
-          servicer.Delete,
-          request_deserializer=charonrpc_dot_user__pb2.DeleteUserRequest.FromString,
-          response_serializer=google_dot_protobuf_dot_wrappers__pb2.BoolValue.SerializeToString,
-      ),
-      'ListPermissions': grpc.unary_unary_rpc_method_handler(
-          servicer.ListPermissions,
-          request_deserializer=charonrpc_dot_user__pb2.ListUserPermissionsRequest.FromString,
-          response_serializer=charonrpc_dot_user__pb2.ListUserPermissionsResponse.SerializeToString,
-      ),
-      'SetPermissions': grpc.unary_unary_rpc_method_handler(
-          servicer.SetPermissions,
-          request_deserializer=charonrpc_dot_user__pb2.SetUserPermissionsRequest.FromString,
-          response_serializer=charonrpc_dot_user__pb2.SetUserPermissionsResponse.SerializeToString,
-      ),
-      'ListGroups': grpc.unary_unary_rpc_method_handler(
-          servicer.ListGroups,
-          request_deserializer=charonrpc_dot_user__pb2.ListUserGroupsRequest.FromString,
-          response_serializer=charonrpc_dot_user__pb2.ListUserGroupsResponse.SerializeToString,
-      ),
-      'SetGroups': grpc.unary_unary_rpc_method_handler(
-          servicer.SetGroups,
-          request_deserializer=charonrpc_dot_user__pb2.SetUserGroupsRequest.FromString,
-          response_serializer=charonrpc_dot_user__pb2.SetUserGroupsResponse.SerializeToString,
-      ),
-  }
-  generic_handler = grpc.method_handlers_generic_handler(
-      'charonrpc.UserManager', rpc_method_handlers)
-  server.add_generic_rpc_handlers((generic_handler,))
diff --git a/cmd/charonctl/main.go b/cmd/charonctl/main.go
index f8fab1b..6250c5e 100644
--- a/cmd/charonctl/main.go
+++ b/cmd/charonctl/main.go
@@ -8,7 +8,7 @@ import (
 
 	"google.golang.org/grpc/status"
 
-	"github.com/piotrkowalczuk/charon/charonrpc"
+	charonrpc "github.com/piotrkowalczuk/charon/pb/rpc/charond/v1"
 	"github.com/piotrkowalczuk/charon/internal/charonctl"
 	"github.com/piotrkowalczuk/ntypes"
 	"google.golang.org/grpc"
diff --git a/cmd/charonctl/service.go b/cmd/charonctl/service.go
index ee92262..9d979e4 100644
--- a/cmd/charonctl/service.go
+++ b/cmd/charonctl/service.go
@@ -5,7 +5,7 @@ import (
 	"fmt"
 	"os"
 
-	"github.com/piotrkowalczuk/charon/charonrpc"
+	charonrpc "github.com/piotrkowalczuk/charon/pb/rpc/charond/v1"
 	"github.com/piotrkowalczuk/mnemosyne"
 	"google.golang.org/grpc"
 	"google.golang.org/grpc/metadata"
diff --git a/example/client/main.go b/example/client/main.go
index e5355b8..c601a7c 100644
--- a/example/client/main.go
+++ b/example/client/main.go
@@ -9,7 +9,7 @@ import (
 
 	"github.com/golang/protobuf/ptypes/wrappers"
 	"github.com/piotrkowalczuk/charon"
-	"github.com/piotrkowalczuk/charon/charonrpc"
+	charonrpc "github.com/piotrkowalczuk/charon/pb/rpc/charond/v1"
 	"google.golang.org/grpc"
 	"google.golang.org/grpc/metadata"
 	"google.golang.org/grpc/status"
diff --git a/internal/charonctl/console.go b/internal/charonctl/console.go
index d9876aa..3132ef1 100644
--- a/internal/charonctl/console.go
+++ b/internal/charonctl/console.go
@@ -3,7 +3,7 @@ package charonctl
 import (
 	"context"
 
-	"github.com/piotrkowalczuk/charon/charonrpc"
+	charonrpc "github.com/piotrkowalczuk/charon/pb/rpc/charond/v1"
 	"github.com/piotrkowalczuk/mnemosyne"
 	"google.golang.org/grpc"
 	"google.golang.org/grpc/metadata"
diff --git a/internal/charonctl/console_obtain_refresh_token.go b/internal/charonctl/console_obtain_refresh_token.go
index 6ec5044..0af5334 100644
--- a/internal/charonctl/console_obtain_refresh_token.go
+++ b/internal/charonctl/console_obtain_refresh_token.go
@@ -7,7 +7,7 @@ import (
 
 	"github.com/golang/protobuf/ptypes"
 	"github.com/golang/protobuf/ptypes/timestamp"
-	"github.com/piotrkowalczuk/charon/charonrpc"
+	charonrpc "github.com/piotrkowalczuk/charon/pb/rpc/charond/v1"
 	"github.com/piotrkowalczuk/ntypes"
 )
 
diff --git a/internal/charonctl/console_register_user.go b/internal/charonctl/console_register_user.go
index 0ccc75a..cd72a8d 100644
--- a/internal/charonctl/console_register_user.go
+++ b/internal/charonctl/console_register_user.go
@@ -6,7 +6,7 @@ import (
 	"os"
 
 	"github.com/piotrkowalczuk/charon"
-	"github.com/piotrkowalczuk/charon/charonrpc"
+	charonrpc "github.com/piotrkowalczuk/charon/pb/rpc/charond/v1"
 	"github.com/piotrkowalczuk/ntypes"
 	"google.golang.org/grpc/codes"
 	"google.golang.org/grpc/status"
diff --git a/internal/charond/daemon.go b/internal/charond/daemon.go
index 357372b..8414955 100644
--- a/internal/charond/daemon.go
+++ b/internal/charond/daemon.go
@@ -11,7 +11,7 @@ import (
 	"time"
 
 	"github.com/piotrkowalczuk/charon"
-	"github.com/piotrkowalczuk/charon/charonrpc"
+	charonrpc "github.com/piotrkowalczuk/charon/pb/rpc/charond/v1"
 	"github.com/piotrkowalczuk/charon/internal/grpcerr"
 	"github.com/piotrkowalczuk/mnemosyne"
 	"github.com/piotrkowalczuk/mnemosyne/mnemosynerpc"
diff --git a/internal/charond/handler_actor.go b/internal/charond/handler_actor.go
index 1788fe0..c3cfb25 100644
--- a/internal/charond/handler_actor.go
+++ b/internal/charond/handler_actor.go
@@ -5,7 +5,7 @@ import (
 	"database/sql"
 
 	"github.com/golang/protobuf/ptypes/wrappers"
-	"github.com/piotrkowalczuk/charon/charonrpc"
+	charonrpc "github.com/piotrkowalczuk/charon/pb/rpc/charond/v1"
 	"github.com/piotrkowalczuk/charon/internal/grpcerr"
 	"github.com/piotrkowalczuk/charon/internal/session"
 	"github.com/piotrkowalczuk/mnemosyne/mnemosynerpc"
diff --git a/internal/charond/handler_belongs_to.go b/internal/charond/handler_belongs_to.go
index 523e282..36b3c7f 100644
--- a/internal/charond/handler_belongs_to.go
+++ b/internal/charond/handler_belongs_to.go
@@ -5,7 +5,7 @@ import (
 
 	"github.com/golang/protobuf/ptypes/wrappers"
 	"github.com/piotrkowalczuk/charon"
-	"github.com/piotrkowalczuk/charon/charonrpc"
+	charonrpc "github.com/piotrkowalczuk/charon/pb/rpc/charond/v1"
 	"github.com/piotrkowalczuk/charon/internal/grpcerr"
 	"github.com/piotrkowalczuk/charon/internal/session"
 	"google.golang.org/grpc/codes"
diff --git a/internal/charond/handler_create_group.go b/internal/charond/handler_create_group.go
index 2276dd3..5edd2d3 100644
--- a/internal/charond/handler_create_group.go
+++ b/internal/charond/handler_create_group.go
@@ -4,7 +4,7 @@ import (
 	"context"
 
 	"github.com/piotrkowalczuk/charon"
-	"github.com/piotrkowalczuk/charon/charonrpc"
+	charonrpc "github.com/piotrkowalczuk/charon/pb/rpc/charond/v1"
 	"github.com/piotrkowalczuk/charon/internal/grpcerr"
 	"github.com/piotrkowalczuk/charon/internal/mapping"
 	"github.com/piotrkowalczuk/charon/internal/model"
diff --git a/internal/charond/handler_create_refresh_token.go b/internal/charond/handler_create_refresh_token.go
index bda1779..f0b0d82 100644
--- a/internal/charond/handler_create_refresh_token.go
+++ b/internal/charond/handler_create_refresh_token.go
@@ -6,7 +6,7 @@ import (
 	"github.com/golang/protobuf/ptypes"
 	"github.com/lib/pq"
 	"github.com/piotrkowalczuk/charon"
-	"github.com/piotrkowalczuk/charon/charonrpc"
+	charonrpc "github.com/piotrkowalczuk/charon/pb/rpc/charond/v1"
 	"github.com/piotrkowalczuk/charon/internal/grpcerr"
 	"github.com/piotrkowalczuk/charon/internal/mapping"
 	"github.com/piotrkowalczuk/charon/internal/model"
diff --git a/internal/charond/handler_create_user.go b/internal/charond/handler_create_user.go
index c335644..1bebeec 100644
--- a/internal/charond/handler_create_user.go
+++ b/internal/charond/handler_create_user.go
@@ -5,7 +5,7 @@ import (
 
 	"github.com/google/uuid"
 	"github.com/piotrkowalczuk/charon"
-	"github.com/piotrkowalczuk/charon/charonrpc"
+	charonrpc "github.com/piotrkowalczuk/charon/pb/rpc/charond/v1"
 	"github.com/piotrkowalczuk/charon/internal/grpcerr"
 	"github.com/piotrkowalczuk/charon/internal/mapping"
 	"github.com/piotrkowalczuk/charon/internal/model"
diff --git a/internal/charond/handler_delete_group.go b/internal/charond/handler_delete_group.go
index a642b7c..03fc5b5 100644
--- a/internal/charond/handler_delete_group.go
+++ b/internal/charond/handler_delete_group.go
@@ -5,7 +5,7 @@ import (
 
 	"github.com/golang/protobuf/ptypes/wrappers"
 	"github.com/piotrkowalczuk/charon"
-	"github.com/piotrkowalczuk/charon/charonrpc"
+	charonrpc "github.com/piotrkowalczuk/charon/pb/rpc/charond/v1"
 	"github.com/piotrkowalczuk/charon/internal/grpcerr"
 	"github.com/piotrkowalczuk/charon/internal/model"
 	"github.com/piotrkowalczuk/charon/internal/session"
diff --git a/internal/charond/handler_delete_user.go b/internal/charond/handler_delete_user.go
index f5ff049..8ba1e28 100644
--- a/internal/charond/handler_delete_user.go
+++ b/internal/charond/handler_delete_user.go
@@ -6,7 +6,7 @@ import (
 
 	"github.com/golang/protobuf/ptypes/wrappers"
 	"github.com/piotrkowalczuk/charon"
-	"github.com/piotrkowalczuk/charon/charonrpc"
+	charonrpc "github.com/piotrkowalczuk/charon/pb/rpc/charond/v1"
 	"github.com/piotrkowalczuk/charon/internal/grpcerr"
 	"github.com/piotrkowalczuk/charon/internal/model"
 	"github.com/piotrkowalczuk/charon/internal/session"
diff --git a/internal/charond/handler_get_group.go b/internal/charond/handler_get_group.go
index f36d724..2f64aac 100644
--- a/internal/charond/handler_get_group.go
+++ b/internal/charond/handler_get_group.go
@@ -5,7 +5,7 @@ import (
 	"database/sql"
 
 	"github.com/piotrkowalczuk/charon"
-	"github.com/piotrkowalczuk/charon/charonrpc"
+	charonrpc "github.com/piotrkowalczuk/charon/pb/rpc/charond/v1"
 	"github.com/piotrkowalczuk/charon/internal/grpcerr"
 	"github.com/piotrkowalczuk/charon/internal/mapping"
 	"github.com/piotrkowalczuk/charon/internal/model"
diff --git a/internal/charond/handler_get_permission.go b/internal/charond/handler_get_permission.go
index a0a6718..a9472cc 100644
--- a/internal/charond/handler_get_permission.go
+++ b/internal/charond/handler_get_permission.go
@@ -5,7 +5,7 @@ import (
 	"database/sql"
 
 	"github.com/piotrkowalczuk/charon"
-	"github.com/piotrkowalczuk/charon/charonrpc"
+	charonrpc "github.com/piotrkowalczuk/charon/pb/rpc/charond/v1"
 	"github.com/piotrkowalczuk/charon/internal/grpcerr"
 	"github.com/piotrkowalczuk/charon/internal/session"
 
diff --git a/internal/charond/handler_get_user.go b/internal/charond/handler_get_user.go
index d5a5ac5..3b72e6e 100644
--- a/internal/charond/handler_get_user.go
+++ b/internal/charond/handler_get_user.go
@@ -5,7 +5,7 @@ import (
 	"database/sql"
 
 	"github.com/piotrkowalczuk/charon"
-	"github.com/piotrkowalczuk/charon/charonrpc"
+	charonrpc "github.com/piotrkowalczuk/charon/pb/rpc/charond/v1"
 	"github.com/piotrkowalczuk/charon/internal/grpcerr"
 	"github.com/piotrkowalczuk/charon/internal/mapping"
 	"github.com/piotrkowalczuk/charon/internal/model"
diff --git a/internal/charond/handler_is_authenticated.go b/internal/charond/handler_is_authenticated.go
index 347c4a4..5b6c087 100644
--- a/internal/charond/handler_is_authenticated.go
+++ b/internal/charond/handler_is_authenticated.go
@@ -5,7 +5,7 @@ import (
 	"database/sql"
 
 	"github.com/golang/protobuf/ptypes/wrappers"
-	"github.com/piotrkowalczuk/charon/charonrpc"
+	charonrpc "github.com/piotrkowalczuk/charon/pb/rpc/charond/v1"
 	"github.com/piotrkowalczuk/charon/internal/grpcerr"
 	"github.com/piotrkowalczuk/charon/internal/session"
 	"github.com/piotrkowalczuk/mnemosyne/mnemosynerpc"
diff --git a/internal/charond/handler_is_granted.go b/internal/charond/handler_is_granted.go
index 2c674b5..3248277 100644
--- a/internal/charond/handler_is_granted.go
+++ b/internal/charond/handler_is_granted.go
@@ -5,7 +5,7 @@ import (
 
 	"github.com/golang/protobuf/ptypes/wrappers"
 	"github.com/piotrkowalczuk/charon"
-	"github.com/piotrkowalczuk/charon/charonrpc"
+	charonrpc "github.com/piotrkowalczuk/charon/pb/rpc/charond/v1"
 	"github.com/piotrkowalczuk/charon/internal/grpcerr"
 	"github.com/piotrkowalczuk/charon/internal/session"
 
diff --git a/internal/charond/handler_list_group_permissions.go b/internal/charond/handler_list_group_permissions.go
index 7805a87..ec7ef22 100644
--- a/internal/charond/handler_list_group_permissions.go
+++ b/internal/charond/handler_list_group_permissions.go
@@ -5,7 +5,7 @@ import (
 	"database/sql"
 
 	"github.com/piotrkowalczuk/charon"
-	"github.com/piotrkowalczuk/charon/charonrpc"
+	charonrpc "github.com/piotrkowalczuk/charon/pb/rpc/charond/v1"
 	"github.com/piotrkowalczuk/charon/internal/grpcerr"
 	"github.com/piotrkowalczuk/charon/internal/session"
 	"go.uber.org/zap"
diff --git a/internal/charond/handler_list_groups.go b/internal/charond/handler_list_groups.go
index 4f0de5c..7e8285b 100644
--- a/internal/charond/handler_list_groups.go
+++ b/internal/charond/handler_list_groups.go
@@ -4,7 +4,7 @@ import (
 	"context"
 
 	"github.com/piotrkowalczuk/charon"
-	"github.com/piotrkowalczuk/charon/charonrpc"
+	charonrpc "github.com/piotrkowalczuk/charon/pb/rpc/charond/v1"
 	"github.com/piotrkowalczuk/charon/internal/grpcerr"
 	"github.com/piotrkowalczuk/charon/internal/mapping"
 	"github.com/piotrkowalczuk/charon/internal/model"
diff --git a/internal/charond/handler_list_permissions.go b/internal/charond/handler_list_permissions.go
index 47dac04..3de4281 100644
--- a/internal/charond/handler_list_permissions.go
+++ b/internal/charond/handler_list_permissions.go
@@ -4,7 +4,7 @@ import (
 	"context"
 
 	"github.com/piotrkowalczuk/charon"
-	"github.com/piotrkowalczuk/charon/charonrpc"
+	charonrpc "github.com/piotrkowalczuk/charon/pb/rpc/charond/v1"
 	"github.com/piotrkowalczuk/charon/internal/grpcerr"
 	"github.com/piotrkowalczuk/charon/internal/mapping"
 	"github.com/piotrkowalczuk/charon/internal/model"
diff --git a/internal/charond/handler_list_refresh_tokens.go b/internal/charond/handler_list_refresh_tokens.go
index a4bd383..f9b832d 100644
--- a/internal/charond/handler_list_refresh_tokens.go
+++ b/internal/charond/handler_list_refresh_tokens.go
@@ -2,7 +2,7 @@ package charond
 
 import (
 	"github.com/piotrkowalczuk/charon"
-	"github.com/piotrkowalczuk/charon/charonrpc"
+	charonrpc "github.com/piotrkowalczuk/charon/pb/rpc/charond/v1"
 	"github.com/piotrkowalczuk/charon/internal/grpcerr"
 	"github.com/piotrkowalczuk/charon/internal/mapping"
 	"github.com/piotrkowalczuk/charon/internal/model"
diff --git a/internal/charond/handler_list_user_groups.go b/internal/charond/handler_list_user_groups.go
index 773b1b4..6848bb0 100644
--- a/internal/charond/handler_list_user_groups.go
+++ b/internal/charond/handler_list_user_groups.go
@@ -4,7 +4,7 @@ import (
 	"context"
 
 	"github.com/piotrkowalczuk/charon"
-	"github.com/piotrkowalczuk/charon/charonrpc"
+	charonrpc "github.com/piotrkowalczuk/charon/pb/rpc/charond/v1"
 	"github.com/piotrkowalczuk/charon/internal/grpcerr"
 	"github.com/piotrkowalczuk/charon/internal/mapping"
 	"github.com/piotrkowalczuk/charon/internal/session"
diff --git a/internal/charond/handler_list_user_permissions.go b/internal/charond/handler_list_user_permissions.go
index 3213e53..a931d9b 100644
--- a/internal/charond/handler_list_user_permissions.go
+++ b/internal/charond/handler_list_user_permissions.go
@@ -4,7 +4,7 @@ import (
 	"context"
 
 	"github.com/piotrkowalczuk/charon"
-	"github.com/piotrkowalczuk/charon/charonrpc"
+	charonrpc "github.com/piotrkowalczuk/charon/pb/rpc/charond/v1"
 	"github.com/piotrkowalczuk/charon/internal/grpcerr"
 	"github.com/piotrkowalczuk/charon/internal/session"
 	"google.golang.org/grpc/codes"
diff --git a/internal/charond/handler_list_users.go b/internal/charond/handler_list_users.go
index 5515886..079df0b 100644
--- a/internal/charond/handler_list_users.go
+++ b/internal/charond/handler_list_users.go
@@ -4,7 +4,7 @@ import (
 	"context"
 
 	"github.com/piotrkowalczuk/charon"
-	"github.com/piotrkowalczuk/charon/charonrpc"
+	charonrpc "github.com/piotrkowalczuk/charon/pb/rpc/charond/v1"
 	"github.com/piotrkowalczuk/charon/internal/grpcerr"
 	"github.com/piotrkowalczuk/charon/internal/mapping"
 	"github.com/piotrkowalczuk/charon/internal/model"
diff --git a/internal/charond/handler_login.go b/internal/charond/handler_login.go
index d8bb194..eb6a447 100644
--- a/internal/charond/handler_login.go
+++ b/internal/charond/handler_login.go
@@ -8,7 +8,7 @@ import (
 	"go.uber.org/zap"
 
 	"github.com/golang/protobuf/ptypes/wrappers"
-	"github.com/piotrkowalczuk/charon/charonrpc"
+	charonrpc "github.com/piotrkowalczuk/charon/pb/rpc/charond/v1"
 	"github.com/piotrkowalczuk/charon/internal/grpcerr"
 	"github.com/piotrkowalczuk/charon/internal/session"
 	"github.com/piotrkowalczuk/mnemosyne/mnemosynerpc"
diff --git a/internal/charond/handler_logout.go b/internal/charond/handler_logout.go
index c567d01..a00005e 100644
--- a/internal/charond/handler_logout.go
+++ b/internal/charond/handler_logout.go
@@ -4,7 +4,7 @@ import (
 	"context"
 
 	"github.com/golang/protobuf/ptypes/empty"
-	"github.com/piotrkowalczuk/charon/charonrpc"
+	charonrpc "github.com/piotrkowalczuk/charon/pb/rpc/charond/v1"
 	"github.com/piotrkowalczuk/charon/internal/grpcerr"
 	"github.com/piotrkowalczuk/mnemosyne/mnemosynerpc"
 
diff --git a/internal/charond/handler_modify_group.go b/internal/charond/handler_modify_group.go
index 9dc89b5..cc0d354 100644
--- a/internal/charond/handler_modify_group.go
+++ b/internal/charond/handler_modify_group.go
@@ -5,7 +5,7 @@ import (
 	"database/sql"
 
 	"github.com/piotrkowalczuk/charon"
-	"github.com/piotrkowalczuk/charon/charonrpc"
+	charonrpc "github.com/piotrkowalczuk/charon/pb/rpc/charond/v1"
 	"github.com/piotrkowalczuk/charon/internal/grpcerr"
 	"github.com/piotrkowalczuk/charon/internal/mapping"
 	"github.com/piotrkowalczuk/charon/internal/model"
diff --git a/internal/charond/handler_modify_user.go b/internal/charond/handler_modify_user.go
index a2b5a39..b6fcb7e 100644
--- a/internal/charond/handler_modify_user.go
+++ b/internal/charond/handler_modify_user.go
@@ -5,7 +5,7 @@ import (
 	"database/sql"
 
 	"github.com/piotrkowalczuk/charon"
-	"github.com/piotrkowalczuk/charon/charonrpc"
+	charonrpc "github.com/piotrkowalczuk/charon/pb/rpc/charond/v1"
 	"github.com/piotrkowalczuk/charon/internal/grpcerr"
 	"github.com/piotrkowalczuk/charon/internal/mapping"
 	"github.com/piotrkowalczuk/charon/internal/model"
diff --git a/internal/charond/handler_register_permissions.go b/internal/charond/handler_register_permissions.go
index 7480fc4..6f82699 100644
--- a/internal/charond/handler_register_permissions.go
+++ b/internal/charond/handler_register_permissions.go
@@ -4,7 +4,7 @@ import (
 	"context"
 
 	"github.com/piotrkowalczuk/charon"
-	"github.com/piotrkowalczuk/charon/charonrpc"
+	charonrpc "github.com/piotrkowalczuk/charon/pb/rpc/charond/v1"
 	"github.com/piotrkowalczuk/charon/internal/grpcerr"
 	"github.com/piotrkowalczuk/charon/internal/model"
 	"google.golang.org/grpc/codes"
diff --git a/internal/charond/handler_revoke_refresh_token.go b/internal/charond/handler_revoke_refresh_token.go
index 7864329..ca6774c 100644
--- a/internal/charond/handler_revoke_refresh_token.go
+++ b/internal/charond/handler_revoke_refresh_token.go
@@ -4,7 +4,7 @@ import (
 	"database/sql"
 
 	"github.com/piotrkowalczuk/charon"
-	"github.com/piotrkowalczuk/charon/charonrpc"
+	charonrpc "github.com/piotrkowalczuk/charon/pb/rpc/charond/v1"
 	"github.com/piotrkowalczuk/charon/internal/grpcerr"
 	"github.com/piotrkowalczuk/charon/internal/mapping"
 	"github.com/piotrkowalczuk/charon/internal/model"
diff --git a/internal/charond/handler_set_group_permissions.go b/internal/charond/handler_set_group_permissions.go
index 93a3b05..4128776 100644
--- a/internal/charond/handler_set_group_permissions.go
+++ b/internal/charond/handler_set_group_permissions.go
@@ -5,7 +5,7 @@ import (
 
 	"github.com/lib/pq"
 	"github.com/piotrkowalczuk/charon"
-	"github.com/piotrkowalczuk/charon/charonrpc"
+	charonrpc "github.com/piotrkowalczuk/charon/pb/rpc/charond/v1"
 	"github.com/piotrkowalczuk/charon/internal/grpcerr"
 	"github.com/piotrkowalczuk/charon/internal/model"
 	"github.com/piotrkowalczuk/charon/internal/session"
diff --git a/internal/charond/handler_set_user_groups.go b/internal/charond/handler_set_user_groups.go
index 689f4d3..78e466d 100644
--- a/internal/charond/handler_set_user_groups.go
+++ b/internal/charond/handler_set_user_groups.go
@@ -5,7 +5,7 @@ import (
 
 	"github.com/lib/pq"
 	"github.com/piotrkowalczuk/charon"
-	"github.com/piotrkowalczuk/charon/charonrpc"
+	charonrpc "github.com/piotrkowalczuk/charon/pb/rpc/charond/v1"
 	"github.com/piotrkowalczuk/charon/internal/grpcerr"
 	"github.com/piotrkowalczuk/charon/internal/model"
 	"github.com/piotrkowalczuk/charon/internal/session"
diff --git a/internal/charond/handler_set_user_permissions.go b/internal/charond/handler_set_user_permissions.go
index 06f3d01..5fe728d 100644
--- a/internal/charond/handler_set_user_permissions.go
+++ b/internal/charond/handler_set_user_permissions.go
@@ -5,7 +5,7 @@ import (
 
 	"github.com/lib/pq"
 	"github.com/piotrkowalczuk/charon"
-	"github.com/piotrkowalczuk/charon/charonrpc"
+	charonrpc "github.com/piotrkowalczuk/charon/pb/rpc/charond/v1"
 	"github.com/piotrkowalczuk/charon/internal/grpcerr"
 	"github.com/piotrkowalczuk/charon/internal/model"
 	"github.com/piotrkowalczuk/charon/internal/session"
diff --git a/internal/mapping/common.go b/internal/mapping/common.go
index 39bfdef..e1166d6 100644
--- a/internal/mapping/common.go
+++ b/internal/mapping/common.go
@@ -1,7 +1,7 @@
 package mapping
 
 import (
-	"github.com/piotrkowalczuk/charon/charonrpc"
+	charonrpc "github.com/piotrkowalczuk/charon/pb/rpc/charond/v1"
 	"github.com/piotrkowalczuk/charon/internal/model"
 )
 
diff --git a/internal/mapping/group.go b/internal/mapping/group.go
index 935af8c..459782b 100644
--- a/internal/mapping/group.go
+++ b/internal/mapping/group.go
@@ -3,7 +3,7 @@ package mapping
 import (
 	"github.com/golang/protobuf/ptypes"
 	pbts "github.com/golang/protobuf/ptypes/timestamp"
-	"github.com/piotrkowalczuk/charon/charonrpc"
+	charonrpc "github.com/piotrkowalczuk/charon/pb/rpc/charond/v1"
 	"github.com/piotrkowalczuk/charon/internal/model"
 )
 
diff --git a/internal/mapping/refresh_token.go b/internal/mapping/refresh_token.go
index acae134..1cf3b40 100644
--- a/internal/mapping/refresh_token.go
+++ b/internal/mapping/refresh_token.go
@@ -3,7 +3,7 @@ package mapping
 import (
 	"github.com/golang/protobuf/ptypes"
 	pbts "github.com/golang/protobuf/ptypes/timestamp"
-	"github.com/piotrkowalczuk/charon/charonrpc"
+	charonrpc "github.com/piotrkowalczuk/charon/pb/rpc/charond/v1"
 	"github.com/piotrkowalczuk/charon/internal/model"
 	"github.com/piotrkowalczuk/ntypes"
 )
diff --git a/internal/mapping/user.go b/internal/mapping/user.go
index c4aa084..571b092 100644
--- a/internal/mapping/user.go
+++ b/internal/mapping/user.go
@@ -3,7 +3,7 @@ package mapping
 import (
 	"github.com/golang/protobuf/ptypes"
 	pbts "github.com/golang/protobuf/ptypes/timestamp"
-	"github.com/piotrkowalczuk/charon/charonrpc"
+	charonrpc "github.com/piotrkowalczuk/charon/pb/rpc/charond/v1"
 	"github.com/piotrkowalczuk/charon/internal/model"
 )
 
diff --git a/charonrpc/auth.pb.go b/pb/rpc/charond/v1/auth.pb.go
similarity index 75%
rename from charonrpc/auth.pb.go
rename to pb/rpc/charond/v1/auth.pb.go
index 1388a5e..a5a1a1b 100644
--- a/charonrpc/auth.pb.go
+++ b/pb/rpc/charond/v1/auth.pb.go
@@ -1,16 +1,16 @@
 // Code generated by protoc-gen-go. DO NOT EDIT.
-// source: charonrpc/auth.proto
+// source: github.com/piotrkowalczuk/charon/pb/rpc/charond/v1/auth.proto
 
-package charonrpc
+package charond // import "github.com/piotrkowalczuk/charon/pb/rpc/charond/v1"
 
-import (
-	context "context"
-	fmt "fmt"
-	math "math"
+import proto "github.com/golang/protobuf/proto"
+import fmt "fmt"
+import math "math"
+import empty "github.com/golang/protobuf/ptypes/empty"
+import wrappers "github.com/golang/protobuf/ptypes/wrappers"
 
-	proto "github.com/golang/protobuf/proto"
-	empty "github.com/golang/protobuf/ptypes/empty"
-	wrappers "github.com/golang/protobuf/ptypes/wrappers"
+import (
+	context "golang.org/x/net/context"
 	grpc "google.golang.org/grpc"
 )
 
@@ -42,17 +42,16 @@ func (m *LoginRequest) Reset()         { *m = LoginRequest{} }
 func (m *LoginRequest) String() string { return proto.CompactTextString(m) }
 func (*LoginRequest) ProtoMessage()    {}
 func (*LoginRequest) Descriptor() ([]byte, []int) {
-	return fileDescriptor_7189ba2d46c2af9a, []int{0}
+	return fileDescriptor_auth_e4bcd340412162f2, []int{0}
 }
-
 func (m *LoginRequest) XXX_Unmarshal(b []byte) error {
 	return xxx_messageInfo_LoginRequest.Unmarshal(m, b)
 }
 func (m *LoginRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
 	return xxx_messageInfo_LoginRequest.Marshal(b, m, deterministic)
 }
-func (m *LoginRequest) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_LoginRequest.Merge(m, src)
+func (dst *LoginRequest) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_LoginRequest.Merge(dst, src)
 }
 func (m *LoginRequest) XXX_Size() int {
 	return xxx_messageInfo_LoginRequest.Size(m)
@@ -208,17 +207,16 @@ func (m *LogoutRequest) Reset()         { *m = LogoutRequest{} }
 func (m *LogoutRequest) String() string { return proto.CompactTextString(m) }
 func (*LogoutRequest) ProtoMessage()    {}
 func (*LogoutRequest) Descriptor() ([]byte, []int) {
-	return fileDescriptor_7189ba2d46c2af9a, []int{1}
+	return fileDescriptor_auth_e4bcd340412162f2, []int{1}
 }
-
 func (m *LogoutRequest) XXX_Unmarshal(b []byte) error {
 	return xxx_messageInfo_LogoutRequest.Unmarshal(m, b)
 }
 func (m *LogoutRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
 	return xxx_messageInfo_LogoutRequest.Marshal(b, m, deterministic)
 }
-func (m *LogoutRequest) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_LogoutRequest.Merge(m, src)
+func (dst *LogoutRequest) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_LogoutRequest.Merge(dst, src)
 }
 func (m *LogoutRequest) XXX_Size() int {
 	return xxx_messageInfo_LogoutRequest.Size(m)
@@ -247,17 +245,16 @@ func (m *IsAuthenticatedRequest) Reset()         { *m = IsAuthenticatedRequest{}
 func (m *IsAuthenticatedRequest) String() string { return proto.CompactTextString(m) }
 func (*IsAuthenticatedRequest) ProtoMessage()    {}
 func (*IsAuthenticatedRequest) Descriptor() ([]byte, []int) {
-	return fileDescriptor_7189ba2d46c2af9a, []int{2}
+	return fileDescriptor_auth_e4bcd340412162f2, []int{2}
 }
-
 func (m *IsAuthenticatedRequest) XXX_Unmarshal(b []byte) error {
 	return xxx_messageInfo_IsAuthenticatedRequest.Unmarshal(m, b)
 }
 func (m *IsAuthenticatedRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
 	return xxx_messageInfo_IsAuthenticatedRequest.Marshal(b, m, deterministic)
 }
-func (m *IsAuthenticatedRequest) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_IsAuthenticatedRequest.Merge(m, src)
+func (dst *IsAuthenticatedRequest) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_IsAuthenticatedRequest.Merge(dst, src)
 }
 func (m *IsAuthenticatedRequest) XXX_Size() int {
 	return xxx_messageInfo_IsAuthenticatedRequest.Size(m)
@@ -287,17 +284,16 @@ func (m *IsGrantedRequest) Reset()         { *m = IsGrantedRequest{} }
 func (m *IsGrantedRequest) String() string { return proto.CompactTextString(m) }
 func (*IsGrantedRequest) ProtoMessage()    {}
 func (*IsGrantedRequest) Descriptor() ([]byte, []int) {
-	return fileDescriptor_7189ba2d46c2af9a, []int{3}
+	return fileDescriptor_auth_e4bcd340412162f2, []int{3}
 }
-
 func (m *IsGrantedRequest) XXX_Unmarshal(b []byte) error {
 	return xxx_messageInfo_IsGrantedRequest.Unmarshal(m, b)
 }
 func (m *IsGrantedRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
 	return xxx_messageInfo_IsGrantedRequest.Marshal(b, m, deterministic)
 }
-func (m *IsGrantedRequest) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_IsGrantedRequest.Merge(m, src)
+func (dst *IsGrantedRequest) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_IsGrantedRequest.Merge(dst, src)
 }
 func (m *IsGrantedRequest) XXX_Size() int {
 	return xxx_messageInfo_IsGrantedRequest.Size(m)
@@ -334,17 +330,16 @@ func (m *BelongsToRequest) Reset()         { *m = BelongsToRequest{} }
 func (m *BelongsToRequest) String() string { return proto.CompactTextString(m) }
 func (*BelongsToRequest) ProtoMessage()    {}
 func (*BelongsToRequest) Descriptor() ([]byte, []int) {
-	return fileDescriptor_7189ba2d46c2af9a, []int{4}
+	return fileDescriptor_auth_e4bcd340412162f2, []int{4}
 }
-
 func (m *BelongsToRequest) XXX_Unmarshal(b []byte) error {
 	return xxx_messageInfo_BelongsToRequest.Unmarshal(m, b)
 }
 func (m *BelongsToRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
 	return xxx_messageInfo_BelongsToRequest.Marshal(b, m, deterministic)
 }
-func (m *BelongsToRequest) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_BelongsToRequest.Merge(m, src)
+func (dst *BelongsToRequest) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_BelongsToRequest.Merge(dst, src)
 }
 func (m *BelongsToRequest) XXX_Size() int {
 	return xxx_messageInfo_BelongsToRequest.Size(m)
@@ -389,17 +384,16 @@ func (m *ActorResponse) Reset()         { *m = ActorResponse{} }
 func (m *ActorResponse) String() string { return proto.CompactTextString(m) }
 func (*ActorResponse) ProtoMessage()    {}
 func (*ActorResponse) Descriptor() ([]byte, []int) {
-	return fileDescriptor_7189ba2d46c2af9a, []int{5}
+	return fileDescriptor_auth_e4bcd340412162f2, []int{5}
 }
-
 func (m *ActorResponse) XXX_Unmarshal(b []byte) error {
 	return xxx_messageInfo_ActorResponse.Unmarshal(m, b)
 }
 func (m *ActorResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
 	return xxx_messageInfo_ActorResponse.Marshal(b, m, deterministic)
 }
-func (m *ActorResponse) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_ActorResponse.Merge(m, src)
+func (dst *ActorResponse) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_ActorResponse.Merge(dst, src)
 }
 func (m *ActorResponse) XXX_Size() int {
 	return xxx_messageInfo_ActorResponse.Size(m)
@@ -493,17 +487,16 @@ func (m *UsernameAndPasswordStrategy) Reset()         { *m = UsernameAndPassword
 func (m *UsernameAndPasswordStrategy) String() string { return proto.CompactTextString(m) }
 func (*UsernameAndPasswordStrategy) ProtoMessage()    {}
 func (*UsernameAndPasswordStrategy) Descriptor() ([]byte, []int) {
-	return fileDescriptor_7189ba2d46c2af9a, []int{6}
+	return fileDescriptor_auth_e4bcd340412162f2, []int{6}
 }
-
 func (m *UsernameAndPasswordStrategy) XXX_Unmarshal(b []byte) error {
 	return xxx_messageInfo_UsernameAndPasswordStrategy.Unmarshal(m, b)
 }
 func (m *UsernameAndPasswordStrategy) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
 	return xxx_messageInfo_UsernameAndPasswordStrategy.Marshal(b, m, deterministic)
 }
-func (m *UsernameAndPasswordStrategy) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_UsernameAndPasswordStrategy.Merge(m, src)
+func (dst *UsernameAndPasswordStrategy) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_UsernameAndPasswordStrategy.Merge(dst, src)
 }
 func (m *UsernameAndPasswordStrategy) XXX_Size() int {
 	return xxx_messageInfo_UsernameAndPasswordStrategy.Size(m)
@@ -539,17 +532,16 @@ func (m *RefreshTokenStrategy) Reset()         { *m = RefreshTokenStrategy{} }
 func (m *RefreshTokenStrategy) String() string { return proto.CompactTextString(m) }
 func (*RefreshTokenStrategy) ProtoMessage()    {}
 func (*RefreshTokenStrategy) Descriptor() ([]byte, []int) {
-	return fileDescriptor_7189ba2d46c2af9a, []int{7}
+	return fileDescriptor_auth_e4bcd340412162f2, []int{7}
 }
-
 func (m *RefreshTokenStrategy) XXX_Unmarshal(b []byte) error {
 	return xxx_messageInfo_RefreshTokenStrategy.Unmarshal(m, b)
 }
 func (m *RefreshTokenStrategy) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
 	return xxx_messageInfo_RefreshTokenStrategy.Marshal(b, m, deterministic)
 }
-func (m *RefreshTokenStrategy) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_RefreshTokenStrategy.Merge(m, src)
+func (dst *RefreshTokenStrategy) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_RefreshTokenStrategy.Merge(dst, src)
 }
 func (m *RefreshTokenStrategy) XXX_Size() int {
 	return xxx_messageInfo_RefreshTokenStrategy.Size(m)
@@ -568,65 +560,14 @@ func (m *RefreshTokenStrategy) GetRefreshToken() string {
 }
 
 func init() {
-	proto.RegisterType((*LoginRequest)(nil), "charonrpc.LoginRequest")
-	proto.RegisterType((*LogoutRequest)(nil), "charonrpc.LogoutRequest")
-	proto.RegisterType((*IsAuthenticatedRequest)(nil), "charonrpc.IsAuthenticatedRequest")
-	proto.RegisterType((*IsGrantedRequest)(nil), "charonrpc.IsGrantedRequest")
-	proto.RegisterType((*BelongsToRequest)(nil), "charonrpc.BelongsToRequest")
-	proto.RegisterType((*ActorResponse)(nil), "charonrpc.ActorResponse")
-	proto.RegisterType((*UsernameAndPasswordStrategy)(nil), "charonrpc.UsernameAndPasswordStrategy")
-	proto.RegisterType((*RefreshTokenStrategy)(nil), "charonrpc.RefreshTokenStrategy")
-}
-
-func init() { proto.RegisterFile("charonrpc/auth.proto", fileDescriptor_7189ba2d46c2af9a) }
-
-var fileDescriptor_7189ba2d46c2af9a = []byte{
-	// 705 bytes of a gzipped FileDescriptorProto
-	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x94, 0x94, 0x61, 0x6f, 0xd3, 0x3a,
-	0x14, 0x86, 0x6f, 0xdb, 0xad, 0x4d, 0x4f, 0xdb, 0x7b, 0x27, 0xdf, 0xdd, 0x2d, 0x37, 0x65, 0xa3,
-	0x2b, 0x12, 0x9a, 0x10, 0x6a, 0xa5, 0xf1, 0x8d, 0x49, 0xa0, 0x96, 0x31, 0x28, 0x4c, 0x68, 0x4a,
-	0x37, 0x3e, 0x20, 0xa4, 0xca, 0x4b, 0x9c, 0xd4, 0x5a, 0x6b, 0x07, 0xdb, 0x61, 0x1a, 0x3f, 0x06,
-	0x89, 0x3f, 0xc1, 0xef, 0x43, 0x76, 0x9a, 0x34, 0xe9, 0xa6, 0x22, 0x3e, 0xfa, 0x7d, 0x73, 0x9e,
-	0x9c, 0x9c, 0x9c, 0xd7, 0xb0, 0xed, 0x4d, 0xb1, 0xe0, 0x4c, 0x44, 0x5e, 0x1f, 0xc7, 0x6a, 0xda,
-	0x8b, 0x04, 0x57, 0x1c, 0xd5, 0x33, 0xd5, 0x69, 0x87, 0x9c, 0x87, 0x33, 0xd2, 0x37, 0xc6, 0x55,
-	0x1c, 0xf4, 0xc9, 0x3c, 0x52, 0xb7, 0xc9, 0x73, 0xce, 0xfe, 0xaa, 0x79, 0x23, 0x70, 0x14, 0x11,
-	0x21, 0x13, 0xbf, 0xfb, 0xbd, 0x0c, 0xcd, 0x33, 0x1e, 0x52, 0xe6, 0x92, 0x2f, 0x31, 0x91, 0x0a,
-	0xed, 0x83, 0x15, 0x4b, 0x22, 0x18, 0x9e, 0x13, 0xbb, 0xd4, 0x29, 0x1d, 0xd6, 0x87, 0x65, 0xbb,
-	0xe4, 0x66, 0x9a, 0xf6, 0x23, 0x2c, 0xe5, 0x0d, 0x17, 0xbe, 0x5d, 0x5e, 0xfa, 0xa9, 0x86, 0x76,
-	0xa0, 0xea, 0xcd, 0x28, 0x61, 0xca, 0xae, 0x68, 0xd7, 0x5d, 0x9c, 0xd0, 0x67, 0xf8, 0x2f, 0x65,
-	0x4c, 0x30, 0xf3, 0x27, 0x19, 0xa4, 0xd1, 0x29, 0x1d, 0x36, 0x8e, 0x1e, 0xf7, 0xb2, 0x0f, 0xea,
-	0x5d, 0x2e, 0x9e, 0x1b, 0x30, 0xff, 0x7c, 0xf1, 0xd4, 0x58, 0x09, 0xac, 0x48, 0x78, 0xfb, 0xf6,
-	0x2f, 0xf7, 0xdf, 0xf8, 0xae, 0x8d, 0x4e, 0xa1, 0x25, 0x48, 0x20, 0x88, 0x9c, 0x4e, 0x14, 0xbf,
-	0x26, 0xcc, 0x6e, 0x1a, 0xea, 0xc3, 0x1c, 0xd5, 0x4d, 0xfc, 0x0b, 0x6d, 0xe7, 0x70, 0x4d, 0x91,
-	0xd3, 0x87, 0x00, 0x96, 0x5c, 0x78, 0xef, 0x36, 0xac, 0xd6, 0xd6, 0x76, 0xf7, 0x08, 0x5a, 0x67,
-	0x3c, 0xe4, 0xb1, 0x4a, 0x07, 0x74, 0x00, 0x4d, 0xec, 0x79, 0x44, 0xca, 0xc5, 0x9b, 0xcc, 0x90,
-	0xdc, 0x46, 0xa2, 0x19, 0x4a, 0xf7, 0x18, 0x76, 0x46, 0x72, 0x10, 0xab, 0x29, 0x61, 0x8a, 0x7a,
-	0x58, 0x11, 0xff, 0x0f, 0x8a, 0xdf, 0xc3, 0xd6, 0x48, 0xbe, 0x11, 0x98, 0xe5, 0xca, 0x76, 0xa1,
-	0xa6, 0xbf, 0x7a, 0x42, 0x7d, 0x53, 0x51, 0x71, 0xab, 0xfa, 0x38, 0xf2, 0xd1, 0x3e, 0x40, 0x44,
-	0xc4, 0x9c, 0x4a, 0x49, 0x39, 0x4b, 0xfe, 0x87, 0x9b, 0x53, 0xba, 0xa7, 0xb0, 0x35, 0x24, 0x33,
-	0xce, 0x42, 0x79, 0xc1, 0x7f, 0x0b, 0xfb, 0x1f, 0xac, 0x50, 0xf0, 0x38, 0xd2, 0x4e, 0xd9, 0x38,
-	0x35, 0x73, 0x1e, 0xf9, 0xdd, 0x9f, 0x65, 0x68, 0x0d, 0x3c, 0xc5, 0x85, 0x4b, 0x64, 0xc4, 0x99,
-	0x24, 0xe8, 0x6f, 0x28, 0x67, 0x80, 0x32, 0xf5, 0x91, 0x93, 0xdb, 0x9b, 0xa4, 0x8f, 0xe5, 0xce,
-	0xec, 0x01, 0x04, 0x54, 0x48, 0x35, 0x31, 0x6e, 0xb2, 0x17, 0x75, 0xa3, 0x7c, 0xd0, 0x76, 0x1b,
-	0xea, 0x33, 0x9c, 0xba, 0x1b, 0x49, 0xad, 0x16, 0x8c, 0xd9, 0x81, 0xc6, 0xf2, 0x7b, 0xa4, 0xbd,
-	0xd9, 0xa9, 0xe8, 0x81, 0xe5, 0x24, 0x3d, 0x53, 0x2a, 0x27, 0x32, 0x8e, 0x88, 0xd0, 0x6f, 0xb4,
-	0xab, 0x9d, 0xd2, 0xa1, 0xe5, 0x36, 0xa8, 0x1c, 0xa7, 0x92, 0x7e, 0x03, 0x95, 0x13, 0xec, 0x29,
-	0xfa, 0x95, 0xd8, 0x35, 0xe3, 0x5b, 0x54, 0x0e, 0xcc, 0x19, 0xed, 0x81, 0xa5, 0xeb, 0x55, 0x1c,
-	0x04, 0xb6, 0xa5, 0x3d, 0xb3, 0xd1, 0x35, 0x2a, 0xc7, 0x5a, 0x5a, 0xe0, 0x3d, 0xce, 0x02, 0x2a,
-	0xe6, 0xc4, 0xb7, 0xeb, 0x29, 0xfe, 0x55, 0x2a, 0xe9, 0xc1, 0x19, 0x02, 0x0e, 0x02, 0x1b, 0x8c,
-	0x6d, 0xaa, 0x71, 0x10, 0x74, 0x2f, 0xa1, 0xbd, 0x66, 0x9d, 0x0b, 0x53, 0x2b, 0xad, 0x4c, 0xcd,
-	0x59, 0x4d, 0xda, 0x32, 0x65, 0xdd, 0x63, 0xd8, 0xbe, 0x6f, 0x9f, 0xd1, 0xa3, 0xd5, 0x1c, 0x24,
-	0xd0, 0xc2, 0x92, 0x1f, 0xfd, 0xa8, 0xc0, 0x86, 0xde, 0x4e, 0xf4, 0x02, 0x36, 0x4d, 0xf6, 0xd1,
-	0x6e, 0x2e, 0x27, 0xf9, 0xdb, 0xc0, 0x79, 0xd0, 0x4b, 0xee, 0x8f, 0x5e, 0x7a, 0x7f, 0xf4, 0xc6,
-	0x4a, 0x50, 0x16, 0x7e, 0xc4, 0xb3, 0x98, 0xa0, 0xe7, 0x50, 0x4d, 0xb2, 0x81, 0xec, 0x22, 0x60,
-	0x19, 0x17, 0x67, 0xe7, 0x0e, 0xe1, 0xb5, 0xbe, 0x9e, 0xd0, 0x39, 0xfc, 0xb3, 0x92, 0x11, 0x74,
-	0x90, 0x83, 0xdc, 0x9f, 0x1f, 0xc7, 0xb9, 0x43, 0x1b, 0x72, 0x3e, 0x4b, 0xba, 0x79, 0x09, 0x9b,
-	0x66, 0x45, 0xd1, 0xda, 0xa6, 0x9d, 0x7c, 0xab, 0xc5, 0x95, 0x3e, 0x81, 0x7a, 0x96, 0x3c, 0xd4,
-	0x2e, 0x34, 0x53, 0xcc, 0xe3, 0xda, 0x36, 0x4e, 0xa0, 0x9e, 0x45, 0xae, 0x40, 0x59, 0x0d, 0xe2,
-	0x3a, 0xca, 0xf0, 0xe9, 0xa7, 0x27, 0x21, 0x55, 0xd3, 0xf8, 0xaa, 0xe7, 0xf1, 0x79, 0x3f, 0xa2,
-	0x5c, 0x89, 0x6b, 0x7e, 0x83, 0x67, 0xde, 0xb7, 0xf8, 0xba, 0x9f, 0x30, 0xfb, 0x19, 0xfa, 0xaa,
-	0x6a, 0x08, 0xcf, 0x7e, 0x05, 0x00, 0x00, 0xff, 0xff, 0x14, 0x94, 0x47, 0xcd, 0x2c, 0x06, 0x00,
-	0x00,
+	proto.RegisterType((*LoginRequest)(nil), "charon.rpc.charond.v1.LoginRequest")
+	proto.RegisterType((*LogoutRequest)(nil), "charon.rpc.charond.v1.LogoutRequest")
+	proto.RegisterType((*IsAuthenticatedRequest)(nil), "charon.rpc.charond.v1.IsAuthenticatedRequest")
+	proto.RegisterType((*IsGrantedRequest)(nil), "charon.rpc.charond.v1.IsGrantedRequest")
+	proto.RegisterType((*BelongsToRequest)(nil), "charon.rpc.charond.v1.BelongsToRequest")
+	proto.RegisterType((*ActorResponse)(nil), "charon.rpc.charond.v1.ActorResponse")
+	proto.RegisterType((*UsernameAndPasswordStrategy)(nil), "charon.rpc.charond.v1.UsernameAndPasswordStrategy")
+	proto.RegisterType((*RefreshTokenStrategy)(nil), "charon.rpc.charond.v1.RefreshTokenStrategy")
 }
 
 // Reference imports to suppress errors if they are not otherwise used.
@@ -659,7 +600,7 @@ func NewAuthClient(cc *grpc.ClientConn) AuthClient {
 
 func (c *authClient) Login(ctx context.Context, in *LoginRequest, opts ...grpc.CallOption) (*wrappers.StringValue, error) {
 	out := new(wrappers.StringValue)
-	err := c.cc.Invoke(ctx, "/charonrpc.Auth/Login", in, out, opts...)
+	err := c.cc.Invoke(ctx, "/charon.rpc.charond.v1.Auth/Login", in, out, opts...)
 	if err != nil {
 		return nil, err
 	}
@@ -668,7 +609,7 @@ func (c *authClient) Login(ctx context.Context, in *LoginRequest, opts ...grpc.C
 
 func (c *authClient) Logout(ctx context.Context, in *LogoutRequest, opts ...grpc.CallOption) (*empty.Empty, error) {
 	out := new(empty.Empty)
-	err := c.cc.Invoke(ctx, "/charonrpc.Auth/Logout", in, out, opts...)
+	err := c.cc.Invoke(ctx, "/charon.rpc.charond.v1.Auth/Logout", in, out, opts...)
 	if err != nil {
 		return nil, err
 	}
@@ -677,7 +618,7 @@ func (c *authClient) Logout(ctx context.Context, in *LogoutRequest, opts ...grpc
 
 func (c *authClient) IsAuthenticated(ctx context.Context, in *IsAuthenticatedRequest, opts ...grpc.CallOption) (*wrappers.BoolValue, error) {
 	out := new(wrappers.BoolValue)
-	err := c.cc.Invoke(ctx, "/charonrpc.Auth/IsAuthenticated", in, out, opts...)
+	err := c.cc.Invoke(ctx, "/charon.rpc.charond.v1.Auth/IsAuthenticated", in, out, opts...)
 	if err != nil {
 		return nil, err
 	}
@@ -686,7 +627,7 @@ func (c *authClient) IsAuthenticated(ctx context.Context, in *IsAuthenticatedReq
 
 func (c *authClient) Actor(ctx context.Context, in *wrappers.StringValue, opts ...grpc.CallOption) (*ActorResponse, error) {
 	out := new(ActorResponse)
-	err := c.cc.Invoke(ctx, "/charonrpc.Auth/Actor", in, out, opts...)
+	err := c.cc.Invoke(ctx, "/charon.rpc.charond.v1.Auth/Actor", in, out, opts...)
 	if err != nil {
 		return nil, err
 	}
@@ -695,7 +636,7 @@ func (c *authClient) Actor(ctx context.Context, in *wrappers.StringValue, opts .
 
 func (c *authClient) IsGranted(ctx context.Context, in *IsGrantedRequest, opts ...grpc.CallOption) (*wrappers.BoolValue, error) {
 	out := new(wrappers.BoolValue)
-	err := c.cc.Invoke(ctx, "/charonrpc.Auth/IsGranted", in, out, opts...)
+	err := c.cc.Invoke(ctx, "/charon.rpc.charond.v1.Auth/IsGranted", in, out, opts...)
 	if err != nil {
 		return nil, err
 	}
@@ -704,7 +645,7 @@ func (c *authClient) IsGranted(ctx context.Context, in *IsGrantedRequest, opts .
 
 func (c *authClient) BelongsTo(ctx context.Context, in *BelongsToRequest, opts ...grpc.CallOption) (*wrappers.BoolValue, error) {
 	out := new(wrappers.BoolValue)
-	err := c.cc.Invoke(ctx, "/charonrpc.Auth/BelongsTo", in, out, opts...)
+	err := c.cc.Invoke(ctx, "/charon.rpc.charond.v1.Auth/BelongsTo", in, out, opts...)
 	if err != nil {
 		return nil, err
 	}
@@ -735,7 +676,7 @@ func _Auth_Login_Handler(srv interface{}, ctx context.Context, dec func(interfac
 	}
 	info := &grpc.UnaryServerInfo{
 		Server:     srv,
-		FullMethod: "/charonrpc.Auth/Login",
+		FullMethod: "/charon.rpc.charond.v1.Auth/Login",
 	}
 	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
 		return srv.(AuthServer).Login(ctx, req.(*LoginRequest))
@@ -753,7 +694,7 @@ func _Auth_Logout_Handler(srv interface{}, ctx context.Context, dec func(interfa
 	}
 	info := &grpc.UnaryServerInfo{
 		Server:     srv,
-		FullMethod: "/charonrpc.Auth/Logout",
+		FullMethod: "/charon.rpc.charond.v1.Auth/Logout",
 	}
 	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
 		return srv.(AuthServer).Logout(ctx, req.(*LogoutRequest))
@@ -771,7 +712,7 @@ func _Auth_IsAuthenticated_Handler(srv interface{}, ctx context.Context, dec fun
 	}
 	info := &grpc.UnaryServerInfo{
 		Server:     srv,
-		FullMethod: "/charonrpc.Auth/IsAuthenticated",
+		FullMethod: "/charon.rpc.charond.v1.Auth/IsAuthenticated",
 	}
 	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
 		return srv.(AuthServer).IsAuthenticated(ctx, req.(*IsAuthenticatedRequest))
@@ -789,7 +730,7 @@ func _Auth_Actor_Handler(srv interface{}, ctx context.Context, dec func(interfac
 	}
 	info := &grpc.UnaryServerInfo{
 		Server:     srv,
-		FullMethod: "/charonrpc.Auth/Actor",
+		FullMethod: "/charon.rpc.charond.v1.Auth/Actor",
 	}
 	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
 		return srv.(AuthServer).Actor(ctx, req.(*wrappers.StringValue))
@@ -807,7 +748,7 @@ func _Auth_IsGranted_Handler(srv interface{}, ctx context.Context, dec func(inte
 	}
 	info := &grpc.UnaryServerInfo{
 		Server:     srv,
-		FullMethod: "/charonrpc.Auth/IsGranted",
+		FullMethod: "/charon.rpc.charond.v1.Auth/IsGranted",
 	}
 	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
 		return srv.(AuthServer).IsGranted(ctx, req.(*IsGrantedRequest))
@@ -825,7 +766,7 @@ func _Auth_BelongsTo_Handler(srv interface{}, ctx context.Context, dec func(inte
 	}
 	info := &grpc.UnaryServerInfo{
 		Server:     srv,
-		FullMethod: "/charonrpc.Auth/BelongsTo",
+		FullMethod: "/charon.rpc.charond.v1.Auth/BelongsTo",
 	}
 	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
 		return srv.(AuthServer).BelongsTo(ctx, req.(*BelongsToRequest))
@@ -834,7 +775,7 @@ func _Auth_BelongsTo_Handler(srv interface{}, ctx context.Context, dec func(inte
 }
 
 var _Auth_serviceDesc = grpc.ServiceDesc{
-	ServiceName: "charonrpc.Auth",
+	ServiceName: "charon.rpc.charond.v1.Auth",
 	HandlerType: (*AuthServer)(nil),
 	Methods: []grpc.MethodDesc{
 		{
@@ -863,5 +804,60 @@ var _Auth_serviceDesc = grpc.ServiceDesc{
 		},
 	},
 	Streams:  []grpc.StreamDesc{},
-	Metadata: "charonrpc/auth.proto",
+	Metadata: "github.com/piotrkowalczuk/charon/pb/rpc/charond/v1/auth.proto",
+}
+
+func init() {
+	proto.RegisterFile("github.com/piotrkowalczuk/charon/pb/rpc/charond/v1/auth.proto", fileDescriptor_auth_e4bcd340412162f2)
+}
+
+var fileDescriptor_auth_e4bcd340412162f2 = []byte{
+	// 738 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x94, 0x55, 0x5d, 0x6f, 0xdb, 0x36,
+	0x14, 0x9d, 0xed, 0xc4, 0x96, 0xaf, 0xed, 0x2d, 0xe0, 0x92, 0x4c, 0x53, 0x96, 0xc0, 0x73, 0x06,
+	0x2c, 0xc0, 0x30, 0x09, 0xf1, 0xde, 0x16, 0xec, 0xc1, 0x1e, 0x9a, 0xd6, 0x49, 0x50, 0x18, 0x72,
+	0xd2, 0x87, 0xa2, 0x80, 0x4b, 0x4b, 0x94, 0x4c, 0xc4, 0x16, 0x55, 0x92, 0x4a, 0x90, 0xfe, 0xb0,
+	0xfe, 0xa7, 0xfe, 0x8b, 0x82, 0x94, 0xe4, 0xaf, 0xd8, 0x2e, 0xf2, 0x66, 0x9e, 0xc3, 0x7b, 0x2e,
+	0x79, 0x7d, 0x0e, 0x05, 0xff, 0x85, 0x54, 0x8e, 0x93, 0x91, 0xed, 0xb1, 0xa9, 0x13, 0x53, 0x26,
+	0xf9, 0x3d, 0x7b, 0xc4, 0x13, 0xef, 0x73, 0x72, 0xef, 0x78, 0x63, 0xcc, 0x59, 0xe4, 0xc4, 0x23,
+	0x87, 0xc7, 0x5e, 0xb6, 0xf2, 0x9d, 0x87, 0x73, 0x07, 0x27, 0x72, 0x6c, 0xc7, 0x9c, 0x49, 0x86,
+	0x0e, 0x52, 0xd8, 0xe6, 0xb1, 0x67, 0x67, 0x3b, 0xec, 0x87, 0x73, 0xeb, 0x28, 0x64, 0x2c, 0x9c,
+	0x10, 0x47, 0x6f, 0x1a, 0x25, 0x81, 0x43, 0xa6, 0xb1, 0x7c, 0x4a, 0x6b, 0xac, 0x93, 0x55, 0xf2,
+	0x91, 0xe3, 0x38, 0x26, 0x5c, 0xa4, 0x7c, 0xeb, 0x4b, 0x11, 0xea, 0x37, 0x2c, 0xa4, 0x91, 0x4b,
+	0x3e, 0x25, 0x44, 0x48, 0x74, 0x02, 0x46, 0x22, 0x08, 0x8f, 0xf0, 0x94, 0x98, 0x85, 0x66, 0xe1,
+	0xac, 0xda, 0x2d, 0x9a, 0x05, 0x77, 0x86, 0x29, 0x3e, 0xc6, 0x42, 0x3c, 0x32, 0xee, 0x9b, 0xc5,
+	0x39, 0x9f, 0x63, 0xe8, 0x10, 0xca, 0xde, 0x84, 0x92, 0x48, 0x9a, 0x25, 0xc5, 0xba, 0xd9, 0x0a,
+	0x8d, 0xe1, 0x20, 0xd7, 0x18, 0xe2, 0xc8, 0x1f, 0xce, 0x44, 0x6a, 0xcd, 0xc2, 0x59, 0xad, 0xdd,
+	0xb6, 0xd7, 0x5e, 0xce, 0xbe, 0xcb, 0x6a, 0x3a, 0x91, 0xdf, 0xcf, 0x2a, 0x06, 0x92, 0x63, 0x49,
+	0xc2, 0xa7, 0x37, 0x3f, 0xb8, 0x3f, 0x27, 0xcf, 0x69, 0xe4, 0x42, 0x83, 0x93, 0x80, 0x13, 0x31,
+	0x1e, 0x4a, 0x76, 0x4f, 0x22, 0xb3, 0xae, 0x3b, 0xfc, 0xb5, 0xa1, 0x83, 0x9b, 0xee, 0xbd, 0x55,
+	0x5b, 0x17, 0xa4, 0xeb, 0x7c, 0x01, 0xef, 0x02, 0x18, 0x22, 0xe3, 0xae, 0x76, 0x8c, 0xc6, 0xde,
+	0x7e, 0xab, 0x0d, 0x8d, 0x1b, 0x16, 0xb2, 0x44, 0xe6, 0x83, 0xfb, 0x1d, 0xea, 0xd8, 0xf3, 0x88,
+	0x10, 0x59, 0x57, 0x3d, 0x3c, 0xb7, 0x96, 0x62, 0x5a, 0xa5, 0x75, 0x01, 0x87, 0x3d, 0xd1, 0x49,
+	0xe4, 0x98, 0x44, 0x92, 0x7a, 0x58, 0x12, 0xff, 0x05, 0xc5, 0xd7, 0xb0, 0xd7, 0x13, 0xaf, 0x39,
+	0x8e, 0x16, 0xca, 0x7e, 0x81, 0x8a, 0x9a, 0xc0, 0x90, 0xfa, 0xba, 0xa2, 0xe4, 0x96, 0xd5, 0xb2,
+	0xe7, 0xa3, 0x13, 0x80, 0x98, 0xf0, 0x29, 0x15, 0x82, 0xb2, 0x28, 0xfd, 0x9f, 0xdc, 0x05, 0xa4,
+	0x75, 0x09, 0x7b, 0x5d, 0x32, 0x61, 0x51, 0x28, 0x6e, 0xd9, 0x77, 0xc5, 0x7e, 0x05, 0x23, 0xe4,
+	0x2c, 0x89, 0x15, 0x53, 0xd4, 0x4c, 0x45, 0xaf, 0x7b, 0xbe, 0xb2, 0x4f, 0xa3, 0xe3, 0x49, 0xc6,
+	0x5d, 0x22, 0x62, 0x16, 0x09, 0x82, 0x7e, 0x84, 0xe2, 0x4c, 0xa0, 0x48, 0x7d, 0x64, 0x2d, 0xf8,
+	0x29, 0x3d, 0xc7, 0xdc, 0x4b, 0xc7, 0x00, 0x01, 0xe5, 0x42, 0x0e, 0x35, 0x9b, 0xfa, 0xa5, 0xaa,
+	0x91, 0xb7, 0x8a, 0x3e, 0x82, 0xea, 0x04, 0xe7, 0xec, 0x4e, 0x5a, 0xab, 0x00, 0x4d, 0x36, 0xa1,
+	0x36, 0xbf, 0x8f, 0x30, 0x77, 0x9b, 0x25, 0x35, 0xb0, 0x05, 0x48, 0xcd, 0x94, 0x8a, 0xa1, 0x48,
+	0x62, 0xc2, 0x55, 0x47, 0xb3, 0xdc, 0x2c, 0x9c, 0x19, 0x6e, 0x8d, 0x8a, 0x41, 0x0e, 0xa9, 0x0e,
+	0x54, 0x0c, 0xb1, 0x27, 0xe9, 0x03, 0x31, 0x2b, 0x9a, 0x37, 0xa8, 0xe8, 0xe8, 0x35, 0x3a, 0x06,
+	0x43, 0xd5, 0xcb, 0x24, 0x08, 0x4c, 0x43, 0x71, 0xda, 0xe9, 0x15, 0x2a, 0x06, 0x0a, 0xca, 0xe4,
+	0x3d, 0x16, 0x05, 0x94, 0x4f, 0x89, 0x6f, 0x56, 0x73, 0xf9, 0xff, 0x73, 0x48, 0x0d, 0x4e, 0x2b,
+	0xe0, 0x20, 0x30, 0x41, 0xd3, 0xba, 0x1a, 0x07, 0x41, 0xeb, 0x0e, 0x8e, 0xb6, 0x58, 0x7b, 0x69,
+	0x6a, 0x85, 0x95, 0xa9, 0x59, 0xab, 0x09, 0x9c, 0xa7, 0xaf, 0x75, 0x01, 0xfb, 0xeb, 0xfc, 0x8c,
+	0x4e, 0x57, 0x33, 0x91, 0x8a, 0x2e, 0x99, 0xbc, 0xfd, 0xb5, 0x04, 0x3b, 0xca, 0x9d, 0xe8, 0x0a,
+	0x76, 0xf5, 0x9b, 0x80, 0x4e, 0x37, 0x64, 0x66, 0xf1, 0xc5, 0xb0, 0x7e, 0xb3, 0xd3, 0x37, 0xc6,
+	0xce, 0xdf, 0x18, 0x7b, 0x20, 0x39, 0x8d, 0xc2, 0x77, 0x78, 0x92, 0x10, 0x74, 0x09, 0xe5, 0x34,
+	0x27, 0xe8, 0x8f, 0xcd, 0x62, 0xf3, 0x18, 0x59, 0x87, 0xcf, 0xd4, 0x5e, 0xa9, 0xe7, 0x0c, 0x7d,
+	0x80, 0x9f, 0x56, 0xb2, 0x83, 0xfe, 0xde, 0x20, 0xb8, 0x3e, 0x63, 0x96, 0xf5, 0x4c, 0xb9, 0xcb,
+	0xd8, 0x24, 0x3d, 0xe5, 0x35, 0xec, 0x6a, 0x1b, 0xa3, 0xad, 0x97, 0xb1, 0x36, 0x5d, 0x61, 0x39,
+	0x02, 0x7d, 0xa8, 0xce, 0x92, 0x8a, 0xfe, 0xdc, 0x78, 0xc8, 0xe5, 0x2c, 0x6f, 0x3d, 0x5e, 0x1f,
+	0xaa, 0xb3, 0xb8, 0x6e, 0x54, 0x5c, 0x0d, 0xf4, 0x36, 0xc5, 0xee, 0x47, 0x68, 0x7a, 0x6c, 0x6a,
+	0xe7, 0x1f, 0xa4, 0x75, 0x82, 0xfd, 0xc2, 0xfb, 0x7f, 0x5f, 0xfe, 0xc1, 0xba, 0xc8, 0x7e, 0x8e,
+	0xca, 0xba, 0xeb, 0x3f, 0xdf, 0x02, 0x00, 0x00, 0xff, 0xff, 0xd4, 0xc0, 0x2c, 0x83, 0xf5, 0x06,
+	0x00, 0x00,
 }
diff --git a/charonrpc/auth.proto b/pb/rpc/charond/v1/auth.proto
similarity index 85%
rename from charonrpc/auth.proto
rename to pb/rpc/charond/v1/auth.proto
index 08017ca..a907e7a 100644
--- a/charonrpc/auth.proto
+++ b/pb/rpc/charond/v1/auth.proto
@@ -1,68 +1,70 @@
-syntax = "proto3";
-
-package charonrpc;
-
-option go_package = "github.com/piotrkowalczuk/charon/charonrpc";
-
-import "google/protobuf/empty.proto";
-import "google/protobuf/wrappers.proto";
-
-service Auth {
-    rpc Login (LoginRequest) returns (google.protobuf.StringValue);
-    rpc Logout (LogoutRequest) returns (google.protobuf.Empty);
-    rpc IsAuthenticated (IsAuthenticatedRequest) returns (google.protobuf.BoolValue);
-    rpc Actor (google.protobuf.StringValue) returns (ActorResponse);
-    rpc IsGranted (IsGrantedRequest) returns (google.protobuf.BoolValue);
-    rpc BelongsTo (BelongsToRequest) returns (google.protobuf.BoolValue);
-}
-
-message LoginRequest {
-    string username = 1 [deprecated=true];
-    string password = 2 [deprecated=true];
-    string client = 3;
-    reserved 13 to 19;
-    oneof strategy {
-        UsernameAndPasswordStrategy username_and_password = 11;
-        RefreshTokenStrategy refresh_token = 12;
-    }
-}
-
-message LogoutRequest {
-    string access_token = 1;
-}
-
-message IsAuthenticatedRequest {
-    string access_token = 1;
-}
-
-message IsGrantedRequest {
-    int64 user_id = 1;
-    string permission = 2;
-}
-
-message BelongsToRequest {
-    int64 user_id = 1;
-    int64 group_id = 2;
-}
-
-message ActorResponse {
-    int64 id = 1;
-    string username = 2;
-    string first_name = 3;
-    string last_name = 4;
-    repeated string permissions = 5;
-    bool is_superuser = 6;
-    bool is_active = 7;
-    bool is_stuff = 8 [deprecated = true];
-    bool is_confirmed = 9;
-    bool is_staff = 10;
-}
-
-message UsernameAndPasswordStrategy {
-    string username = 1;
-    string password = 2;
-}
-
-message RefreshTokenStrategy {
-    string refresh_token = 1;
-}
+syntax = "proto3";
+
+package charon.rpc.charond.v1;
+
+option go_package = "github.com/piotrkowalczuk/charon/pb/rpc/charond/v1;charond";
+option java_multiple_files = true;
+option java_package = "com.github.charon.rpc.charond.v1";
+
+import "google/protobuf/empty.proto";
+import "google/protobuf/wrappers.proto";
+
+service Auth {
+    rpc Login (LoginRequest) returns (google.protobuf.StringValue);
+    rpc Logout (LogoutRequest) returns (google.protobuf.Empty);
+    rpc IsAuthenticated (IsAuthenticatedRequest) returns (google.protobuf.BoolValue);
+    rpc Actor (google.protobuf.StringValue) returns (ActorResponse);
+    rpc IsGranted (IsGrantedRequest) returns (google.protobuf.BoolValue);
+    rpc BelongsTo (BelongsToRequest) returns (google.protobuf.BoolValue);
+}
+
+message LoginRequest {
+    string username = 1 [deprecated=true];
+    string password = 2 [deprecated=true];
+    string client = 3;
+    reserved 13 to 19;
+    oneof strategy {
+        UsernameAndPasswordStrategy username_and_password = 11;
+        RefreshTokenStrategy refresh_token = 12;
+    }
+}
+
+message LogoutRequest {
+    string access_token = 1;
+}
+
+message IsAuthenticatedRequest {
+    string access_token = 1;
+}
+
+message IsGrantedRequest {
+    int64 user_id = 1;
+    string permission = 2;
+}
+
+message BelongsToRequest {
+    int64 user_id = 1;
+    int64 group_id = 2;
+}
+
+message ActorResponse {
+    int64 id = 1;
+    string username = 2;
+    string first_name = 3;
+    string last_name = 4;
+    repeated string permissions = 5;
+    bool is_superuser = 6;
+    bool is_active = 7;
+    bool is_stuff = 8 [deprecated = true];
+    bool is_confirmed = 9;
+    bool is_staff = 10;
+}
+
+message UsernameAndPasswordStrategy {
+    string username = 1;
+    string password = 2;
+}
+
+message RefreshTokenStrategy {
+    string refresh_token = 1;
+}
diff --git a/charonrpc/common.pb.go b/pb/rpc/charond/v1/common.pb.go
similarity index 52%
rename from charonrpc/common.pb.go
rename to pb/rpc/charond/v1/common.pb.go
index 4cfefce..6cffc4b 100644
--- a/charonrpc/common.pb.go
+++ b/pb/rpc/charond/v1/common.pb.go
@@ -1,14 +1,11 @@
 // Code generated by protoc-gen-go. DO NOT EDIT.
-// source: charonrpc/common.proto
+// source: github.com/piotrkowalczuk/charon/pb/rpc/charond/v1/common.proto
 
-package charonrpc
+package charond // import "github.com/piotrkowalczuk/charon/pb/rpc/charond/v1"
 
-import (
-	fmt "fmt"
-	math "math"
-
-	proto "github.com/golang/protobuf/proto"
-)
+import proto "github.com/golang/protobuf/proto"
+import fmt "fmt"
+import math "math"
 
 // Reference imports to suppress errors if they are not otherwise used.
 var _ = proto.Marshal
@@ -34,17 +31,16 @@ func (m *Order) Reset()         { *m = Order{} }
 func (m *Order) String() string { return proto.CompactTextString(m) }
 func (*Order) ProtoMessage()    {}
 func (*Order) Descriptor() ([]byte, []int) {
-	return fileDescriptor_5375c5aca95b22d3, []int{0}
+	return fileDescriptor_common_6fa0804b816886fd, []int{0}
 }
-
 func (m *Order) XXX_Unmarshal(b []byte) error {
 	return xxx_messageInfo_Order.Unmarshal(m, b)
 }
 func (m *Order) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
 	return xxx_messageInfo_Order.Marshal(b, m, deterministic)
 }
-func (m *Order) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_Order.Merge(m, src)
+func (dst *Order) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_Order.Merge(dst, src)
 }
 func (m *Order) XXX_Size() int {
 	return xxx_messageInfo_Order.Size(m)
@@ -70,20 +66,24 @@ func (m *Order) GetDescending() bool {
 }
 
 func init() {
-	proto.RegisterType((*Order)(nil), "charonrpc.Order")
+	proto.RegisterType((*Order)(nil), "charon.rpc.charond.v1.Order")
 }
 
-func init() { proto.RegisterFile("charonrpc/common.proto", fileDescriptor_5375c5aca95b22d3) }
+func init() {
+	proto.RegisterFile("github.com/piotrkowalczuk/charon/pb/rpc/charond/v1/common.proto", fileDescriptor_common_6fa0804b816886fd)
+}
 
-var fileDescriptor_5375c5aca95b22d3 = []byte{
-	// 141 bytes of a gzipped FileDescriptorProto
-	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0x12, 0x4b, 0xce, 0x48, 0x2c,
-	0xca, 0xcf, 0x2b, 0x2a, 0x48, 0xd6, 0x4f, 0xce, 0xcf, 0xcd, 0xcd, 0xcf, 0xd3, 0x2b, 0x28, 0xca,
-	0x2f, 0xc9, 0x17, 0xe2, 0x84, 0x8b, 0x2b, 0x59, 0x73, 0xb1, 0xfa, 0x17, 0xa5, 0xa4, 0x16, 0x09,
-	0x09, 0x71, 0xb1, 0xe4, 0x25, 0xe6, 0xa6, 0x4a, 0x30, 0x2a, 0x30, 0x6a, 0x70, 0x06, 0x81, 0xd9,
-	0x42, 0x72, 0x5c, 0x5c, 0x29, 0xa9, 0xc5, 0xc9, 0xa9, 0x79, 0x29, 0x99, 0x79, 0xe9, 0x12, 0x4c,
-	0x0a, 0x8c, 0x1a, 0x1c, 0x41, 0x48, 0x22, 0x4e, 0x3a, 0x51, 0x5a, 0xe9, 0x99, 0x25, 0x19, 0xa5,
-	0x49, 0x7a, 0xc9, 0xf9, 0xb9, 0xfa, 0x05, 0x99, 0xf9, 0x25, 0x45, 0xd9, 0xf9, 0xe5, 0x89, 0x39,
-	0xc9, 0x55, 0xa5, 0xd9, 0xfa, 0x10, 0x3b, 0xf4, 0xe1, 0x56, 0x25, 0xb1, 0x81, 0x2d, 0x37, 0x06,
-	0x04, 0x00, 0x00, 0xff, 0xff, 0xb4, 0xb8, 0x8f, 0x74, 0x96, 0x00, 0x00, 0x00,
+var fileDescriptor_common_6fa0804b816886fd = []byte{
+	// 174 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0xb2, 0x4f, 0xcf, 0x2c, 0xc9,
+	0x28, 0x4d, 0xd2, 0x4b, 0xce, 0xcf, 0xd5, 0x2f, 0xc8, 0xcc, 0x2f, 0x29, 0xca, 0xce, 0x2f, 0x4f,
+	0xcc, 0x49, 0xae, 0x2a, 0xcd, 0xd6, 0x4f, 0xce, 0x48, 0x2c, 0xca, 0xcf, 0xd3, 0x2f, 0x48, 0xd2,
+	0x2f, 0x2a, 0x48, 0x86, 0xf2, 0x52, 0xf4, 0xcb, 0x0c, 0xf5, 0x93, 0xf3, 0x73, 0x73, 0xf3, 0xf3,
+	0xf4, 0x0a, 0x8a, 0xf2, 0x4b, 0xf2, 0x85, 0x44, 0x21, 0x12, 0x7a, 0x45, 0x05, 0xc9, 0x7a, 0x50,
+	0x35, 0x7a, 0x65, 0x86, 0x4a, 0xd6, 0x5c, 0xac, 0xfe, 0x45, 0x29, 0xa9, 0x45, 0x42, 0x42, 0x5c,
+	0x2c, 0x79, 0x89, 0xb9, 0xa9, 0x12, 0x8c, 0x0a, 0x8c, 0x1a, 0x9c, 0x41, 0x60, 0xb6, 0x90, 0x1c,
+	0x17, 0x57, 0x4a, 0x6a, 0x71, 0x72, 0x6a, 0x5e, 0x4a, 0x66, 0x5e, 0xba, 0x04, 0x93, 0x02, 0xa3,
+	0x06, 0x47, 0x10, 0x92, 0x88, 0x53, 0x02, 0x97, 0x42, 0x72, 0x7e, 0xae, 0x1e, 0xcc, 0x69, 0xd8,
+	0x2c, 0x08, 0x60, 0x8c, 0xb2, 0x22, 0xdd, 0xe9, 0xd6, 0x50, 0x66, 0x12, 0x1b, 0xd8, 0xf1, 0xc6,
+	0x80, 0x00, 0x00, 0x00, 0xff, 0xff, 0xb2, 0x79, 0xac, 0x27, 0xff, 0x00, 0x00, 0x00,
 }
diff --git a/pb/rpc/charond/v1/common.proto b/pb/rpc/charond/v1/common.proto
new file mode 100644
index 0000000..5bb2705
--- /dev/null
+++ b/pb/rpc/charond/v1/common.proto
@@ -0,0 +1,13 @@
+syntax = "proto3";
+
+package charon.rpc.charond.v1;
+
+option go_package = "github.com/piotrkowalczuk/charon/pb/rpc/charond/v1;charond";
+option java_multiple_files = true;
+option java_package = "com.github.charon.rpc.charond.v1";
+
+// Order represents single field within OrderBy clause.
+message Order {
+    string name = 1;
+    bool descending = 2;
+}
\ No newline at end of file
diff --git a/charonrpc/group.pb.go b/pb/rpc/charond/v1/group.pb.go
similarity index 74%
rename from charonrpc/group.pb.go
rename to pb/rpc/charond/v1/group.pb.go
index c499d27..9792002 100644
--- a/charonrpc/group.pb.go
+++ b/pb/rpc/charond/v1/group.pb.go
@@ -1,17 +1,17 @@
 // Code generated by protoc-gen-go. DO NOT EDIT.
-// source: charonrpc/group.proto
+// source: github.com/piotrkowalczuk/charon/pb/rpc/charond/v1/group.proto
 
-package charonrpc
+package charond // import "github.com/piotrkowalczuk/charon/pb/rpc/charond/v1"
+
+import proto "github.com/golang/protobuf/proto"
+import fmt "fmt"
+import math "math"
+import timestamp "github.com/golang/protobuf/ptypes/timestamp"
+import wrappers "github.com/golang/protobuf/ptypes/wrappers"
+import ntypes "github.com/piotrkowalczuk/ntypes"
 
 import (
-	context "context"
-	fmt "fmt"
-	math "math"
-
-	proto "github.com/golang/protobuf/proto"
-	timestamp "github.com/golang/protobuf/ptypes/timestamp"
-	wrappers "github.com/golang/protobuf/ptypes/wrappers"
-	ntypes "github.com/piotrkowalczuk/ntypes"
+	context "golang.org/x/net/context"
 	grpc "google.golang.org/grpc"
 )
 
@@ -43,17 +43,16 @@ func (m *Group) Reset()         { *m = Group{} }
 func (m *Group) String() string { return proto.CompactTextString(m) }
 func (*Group) ProtoMessage()    {}
 func (*Group) Descriptor() ([]byte, []int) {
-	return fileDescriptor_16567a1ae3b920e4, []int{0}
+	return fileDescriptor_group_a1b9c6fb366f15a1, []int{0}
 }
-
 func (m *Group) XXX_Unmarshal(b []byte) error {
 	return xxx_messageInfo_Group.Unmarshal(m, b)
 }
 func (m *Group) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
 	return xxx_messageInfo_Group.Marshal(b, m, deterministic)
 }
-func (m *Group) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_Group.Merge(m, src)
+func (dst *Group) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_Group.Merge(dst, src)
 }
 func (m *Group) XXX_Size() int {
 	return xxx_messageInfo_Group.Size(m)
@@ -125,17 +124,16 @@ func (m *CreateGroupRequest) Reset()         { *m = CreateGroupRequest{} }
 func (m *CreateGroupRequest) String() string { return proto.CompactTextString(m) }
 func (*CreateGroupRequest) ProtoMessage()    {}
 func (*CreateGroupRequest) Descriptor() ([]byte, []int) {
-	return fileDescriptor_16567a1ae3b920e4, []int{1}
+	return fileDescriptor_group_a1b9c6fb366f15a1, []int{1}
 }
-
 func (m *CreateGroupRequest) XXX_Unmarshal(b []byte) error {
 	return xxx_messageInfo_CreateGroupRequest.Unmarshal(m, b)
 }
 func (m *CreateGroupRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
 	return xxx_messageInfo_CreateGroupRequest.Marshal(b, m, deterministic)
 }
-func (m *CreateGroupRequest) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_CreateGroupRequest.Merge(m, src)
+func (dst *CreateGroupRequest) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_CreateGroupRequest.Merge(dst, src)
 }
 func (m *CreateGroupRequest) XXX_Size() int {
 	return xxx_messageInfo_CreateGroupRequest.Size(m)
@@ -171,17 +169,16 @@ func (m *CreateGroupResponse) Reset()         { *m = CreateGroupResponse{} }
 func (m *CreateGroupResponse) String() string { return proto.CompactTextString(m) }
 func (*CreateGroupResponse) ProtoMessage()    {}
 func (*CreateGroupResponse) Descriptor() ([]byte, []int) {
-	return fileDescriptor_16567a1ae3b920e4, []int{2}
+	return fileDescriptor_group_a1b9c6fb366f15a1, []int{2}
 }
-
 func (m *CreateGroupResponse) XXX_Unmarshal(b []byte) error {
 	return xxx_messageInfo_CreateGroupResponse.Unmarshal(m, b)
 }
 func (m *CreateGroupResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
 	return xxx_messageInfo_CreateGroupResponse.Marshal(b, m, deterministic)
 }
-func (m *CreateGroupResponse) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_CreateGroupResponse.Merge(m, src)
+func (dst *CreateGroupResponse) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_CreateGroupResponse.Merge(dst, src)
 }
 func (m *CreateGroupResponse) XXX_Size() int {
 	return xxx_messageInfo_CreateGroupResponse.Size(m)
@@ -210,17 +207,16 @@ func (m *GetGroupRequest) Reset()         { *m = GetGroupRequest{} }
 func (m *GetGroupRequest) String() string { return proto.CompactTextString(m) }
 func (*GetGroupRequest) ProtoMessage()    {}
 func (*GetGroupRequest) Descriptor() ([]byte, []int) {
-	return fileDescriptor_16567a1ae3b920e4, []int{3}
+	return fileDescriptor_group_a1b9c6fb366f15a1, []int{3}
 }
-
 func (m *GetGroupRequest) XXX_Unmarshal(b []byte) error {
 	return xxx_messageInfo_GetGroupRequest.Unmarshal(m, b)
 }
 func (m *GetGroupRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
 	return xxx_messageInfo_GetGroupRequest.Marshal(b, m, deterministic)
 }
-func (m *GetGroupRequest) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_GetGroupRequest.Merge(m, src)
+func (dst *GetGroupRequest) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_GetGroupRequest.Merge(dst, src)
 }
 func (m *GetGroupRequest) XXX_Size() int {
 	return xxx_messageInfo_GetGroupRequest.Size(m)
@@ -249,17 +245,16 @@ func (m *GetGroupResponse) Reset()         { *m = GetGroupResponse{} }
 func (m *GetGroupResponse) String() string { return proto.CompactTextString(m) }
 func (*GetGroupResponse) ProtoMessage()    {}
 func (*GetGroupResponse) Descriptor() ([]byte, []int) {
-	return fileDescriptor_16567a1ae3b920e4, []int{4}
+	return fileDescriptor_group_a1b9c6fb366f15a1, []int{4}
 }
-
 func (m *GetGroupResponse) XXX_Unmarshal(b []byte) error {
 	return xxx_messageInfo_GetGroupResponse.Unmarshal(m, b)
 }
 func (m *GetGroupResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
 	return xxx_messageInfo_GetGroupResponse.Marshal(b, m, deterministic)
 }
-func (m *GetGroupResponse) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_GetGroupResponse.Merge(m, src)
+func (dst *GetGroupResponse) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_GetGroupResponse.Merge(dst, src)
 }
 func (m *GetGroupResponse) XXX_Size() int {
 	return xxx_messageInfo_GetGroupResponse.Size(m)
@@ -290,17 +285,16 @@ func (m *ListGroupsRequest) Reset()         { *m = ListGroupsRequest{} }
 func (m *ListGroupsRequest) String() string { return proto.CompactTextString(m) }
 func (*ListGroupsRequest) ProtoMessage()    {}
 func (*ListGroupsRequest) Descriptor() ([]byte, []int) {
-	return fileDescriptor_16567a1ae3b920e4, []int{5}
+	return fileDescriptor_group_a1b9c6fb366f15a1, []int{5}
 }
-
 func (m *ListGroupsRequest) XXX_Unmarshal(b []byte) error {
 	return xxx_messageInfo_ListGroupsRequest.Unmarshal(m, b)
 }
 func (m *ListGroupsRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
 	return xxx_messageInfo_ListGroupsRequest.Marshal(b, m, deterministic)
 }
-func (m *ListGroupsRequest) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_ListGroupsRequest.Merge(m, src)
+func (dst *ListGroupsRequest) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_ListGroupsRequest.Merge(dst, src)
 }
 func (m *ListGroupsRequest) XXX_Size() int {
 	return xxx_messageInfo_ListGroupsRequest.Size(m)
@@ -343,17 +337,16 @@ func (m *ListGroupsResponse) Reset()         { *m = ListGroupsResponse{} }
 func (m *ListGroupsResponse) String() string { return proto.CompactTextString(m) }
 func (*ListGroupsResponse) ProtoMessage()    {}
 func (*ListGroupsResponse) Descriptor() ([]byte, []int) {
-	return fileDescriptor_16567a1ae3b920e4, []int{6}
+	return fileDescriptor_group_a1b9c6fb366f15a1, []int{6}
 }
-
 func (m *ListGroupsResponse) XXX_Unmarshal(b []byte) error {
 	return xxx_messageInfo_ListGroupsResponse.Unmarshal(m, b)
 }
 func (m *ListGroupsResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
 	return xxx_messageInfo_ListGroupsResponse.Marshal(b, m, deterministic)
 }
-func (m *ListGroupsResponse) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_ListGroupsResponse.Merge(m, src)
+func (dst *ListGroupsResponse) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_ListGroupsResponse.Merge(dst, src)
 }
 func (m *ListGroupsResponse) XXX_Size() int {
 	return xxx_messageInfo_ListGroupsResponse.Size(m)
@@ -382,17 +375,16 @@ func (m *DeleteGroupRequest) Reset()         { *m = DeleteGroupRequest{} }
 func (m *DeleteGroupRequest) String() string { return proto.CompactTextString(m) }
 func (*DeleteGroupRequest) ProtoMessage()    {}
 func (*DeleteGroupRequest) Descriptor() ([]byte, []int) {
-	return fileDescriptor_16567a1ae3b920e4, []int{7}
+	return fileDescriptor_group_a1b9c6fb366f15a1, []int{7}
 }
-
 func (m *DeleteGroupRequest) XXX_Unmarshal(b []byte) error {
 	return xxx_messageInfo_DeleteGroupRequest.Unmarshal(m, b)
 }
 func (m *DeleteGroupRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
 	return xxx_messageInfo_DeleteGroupRequest.Marshal(b, m, deterministic)
 }
-func (m *DeleteGroupRequest) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_DeleteGroupRequest.Merge(m, src)
+func (dst *DeleteGroupRequest) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_DeleteGroupRequest.Merge(dst, src)
 }
 func (m *DeleteGroupRequest) XXX_Size() int {
 	return xxx_messageInfo_DeleteGroupRequest.Size(m)
@@ -423,17 +415,16 @@ func (m *ModifyGroupRequest) Reset()         { *m = ModifyGroupRequest{} }
 func (m *ModifyGroupRequest) String() string { return proto.CompactTextString(m) }
 func (*ModifyGroupRequest) ProtoMessage()    {}
 func (*ModifyGroupRequest) Descriptor() ([]byte, []int) {
-	return fileDescriptor_16567a1ae3b920e4, []int{8}
+	return fileDescriptor_group_a1b9c6fb366f15a1, []int{8}
 }
-
 func (m *ModifyGroupRequest) XXX_Unmarshal(b []byte) error {
 	return xxx_messageInfo_ModifyGroupRequest.Unmarshal(m, b)
 }
 func (m *ModifyGroupRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
 	return xxx_messageInfo_ModifyGroupRequest.Marshal(b, m, deterministic)
 }
-func (m *ModifyGroupRequest) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_ModifyGroupRequest.Merge(m, src)
+func (dst *ModifyGroupRequest) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_ModifyGroupRequest.Merge(dst, src)
 }
 func (m *ModifyGroupRequest) XXX_Size() int {
 	return xxx_messageInfo_ModifyGroupRequest.Size(m)
@@ -476,17 +467,16 @@ func (m *ModifyGroupResponse) Reset()         { *m = ModifyGroupResponse{} }
 func (m *ModifyGroupResponse) String() string { return proto.CompactTextString(m) }
 func (*ModifyGroupResponse) ProtoMessage()    {}
 func (*ModifyGroupResponse) Descriptor() ([]byte, []int) {
-	return fileDescriptor_16567a1ae3b920e4, []int{9}
+	return fileDescriptor_group_a1b9c6fb366f15a1, []int{9}
 }
-
 func (m *ModifyGroupResponse) XXX_Unmarshal(b []byte) error {
 	return xxx_messageInfo_ModifyGroupResponse.Unmarshal(m, b)
 }
 func (m *ModifyGroupResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
 	return xxx_messageInfo_ModifyGroupResponse.Marshal(b, m, deterministic)
 }
-func (m *ModifyGroupResponse) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_ModifyGroupResponse.Merge(m, src)
+func (dst *ModifyGroupResponse) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_ModifyGroupResponse.Merge(dst, src)
 }
 func (m *ModifyGroupResponse) XXX_Size() int {
 	return xxx_messageInfo_ModifyGroupResponse.Size(m)
@@ -518,17 +508,16 @@ func (m *SetGroupPermissionsRequest) Reset()         { *m = SetGroupPermissionsR
 func (m *SetGroupPermissionsRequest) String() string { return proto.CompactTextString(m) }
 func (*SetGroupPermissionsRequest) ProtoMessage()    {}
 func (*SetGroupPermissionsRequest) Descriptor() ([]byte, []int) {
-	return fileDescriptor_16567a1ae3b920e4, []int{10}
+	return fileDescriptor_group_a1b9c6fb366f15a1, []int{10}
 }
-
 func (m *SetGroupPermissionsRequest) XXX_Unmarshal(b []byte) error {
 	return xxx_messageInfo_SetGroupPermissionsRequest.Unmarshal(m, b)
 }
 func (m *SetGroupPermissionsRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
 	return xxx_messageInfo_SetGroupPermissionsRequest.Marshal(b, m, deterministic)
 }
-func (m *SetGroupPermissionsRequest) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_SetGroupPermissionsRequest.Merge(m, src)
+func (dst *SetGroupPermissionsRequest) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_SetGroupPermissionsRequest.Merge(dst, src)
 }
 func (m *SetGroupPermissionsRequest) XXX_Size() int {
 	return xxx_messageInfo_SetGroupPermissionsRequest.Size(m)
@@ -573,17 +562,16 @@ func (m *SetGroupPermissionsResponse) Reset()         { *m = SetGroupPermissions
 func (m *SetGroupPermissionsResponse) String() string { return proto.CompactTextString(m) }
 func (*SetGroupPermissionsResponse) ProtoMessage()    {}
 func (*SetGroupPermissionsResponse) Descriptor() ([]byte, []int) {
-	return fileDescriptor_16567a1ae3b920e4, []int{11}
+	return fileDescriptor_group_a1b9c6fb366f15a1, []int{11}
 }
-
 func (m *SetGroupPermissionsResponse) XXX_Unmarshal(b []byte) error {
 	return xxx_messageInfo_SetGroupPermissionsResponse.Unmarshal(m, b)
 }
 func (m *SetGroupPermissionsResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
 	return xxx_messageInfo_SetGroupPermissionsResponse.Marshal(b, m, deterministic)
 }
-func (m *SetGroupPermissionsResponse) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_SetGroupPermissionsResponse.Merge(m, src)
+func (dst *SetGroupPermissionsResponse) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_SetGroupPermissionsResponse.Merge(dst, src)
 }
 func (m *SetGroupPermissionsResponse) XXX_Size() int {
 	return xxx_messageInfo_SetGroupPermissionsResponse.Size(m)
@@ -626,17 +614,16 @@ func (m *ListGroupPermissionsRequest) Reset()         { *m = ListGroupPermission
 func (m *ListGroupPermissionsRequest) String() string { return proto.CompactTextString(m) }
 func (*ListGroupPermissionsRequest) ProtoMessage()    {}
 func (*ListGroupPermissionsRequest) Descriptor() ([]byte, []int) {
-	return fileDescriptor_16567a1ae3b920e4, []int{12}
+	return fileDescriptor_group_a1b9c6fb366f15a1, []int{12}
 }
-
 func (m *ListGroupPermissionsRequest) XXX_Unmarshal(b []byte) error {
 	return xxx_messageInfo_ListGroupPermissionsRequest.Unmarshal(m, b)
 }
 func (m *ListGroupPermissionsRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
 	return xxx_messageInfo_ListGroupPermissionsRequest.Marshal(b, m, deterministic)
 }
-func (m *ListGroupPermissionsRequest) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_ListGroupPermissionsRequest.Merge(m, src)
+func (dst *ListGroupPermissionsRequest) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_ListGroupPermissionsRequest.Merge(dst, src)
 }
 func (m *ListGroupPermissionsRequest) XXX_Size() int {
 	return xxx_messageInfo_ListGroupPermissionsRequest.Size(m)
@@ -665,17 +652,16 @@ func (m *ListGroupPermissionsResponse) Reset()         { *m = ListGroupPermissio
 func (m *ListGroupPermissionsResponse) String() string { return proto.CompactTextString(m) }
 func (*ListGroupPermissionsResponse) ProtoMessage()    {}
 func (*ListGroupPermissionsResponse) Descriptor() ([]byte, []int) {
-	return fileDescriptor_16567a1ae3b920e4, []int{13}
+	return fileDescriptor_group_a1b9c6fb366f15a1, []int{13}
 }
-
 func (m *ListGroupPermissionsResponse) XXX_Unmarshal(b []byte) error {
 	return xxx_messageInfo_ListGroupPermissionsResponse.Unmarshal(m, b)
 }
 func (m *ListGroupPermissionsResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
 	return xxx_messageInfo_ListGroupPermissionsResponse.Marshal(b, m, deterministic)
 }
-func (m *ListGroupPermissionsResponse) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_ListGroupPermissionsResponse.Merge(m, src)
+func (dst *ListGroupPermissionsResponse) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_ListGroupPermissionsResponse.Merge(dst, src)
 }
 func (m *ListGroupPermissionsResponse) XXX_Size() int {
 	return xxx_messageInfo_ListGroupPermissionsResponse.Size(m)
@@ -694,74 +680,20 @@ func (m *ListGroupPermissionsResponse) GetPermissions() []string {
 }
 
 func init() {
-	proto.RegisterType((*Group)(nil), "charonrpc.Group")
-	proto.RegisterType((*CreateGroupRequest)(nil), "charonrpc.CreateGroupRequest")
-	proto.RegisterType((*CreateGroupResponse)(nil), "charonrpc.CreateGroupResponse")
-	proto.RegisterType((*GetGroupRequest)(nil), "charonrpc.GetGroupRequest")
-	proto.RegisterType((*GetGroupResponse)(nil), "charonrpc.GetGroupResponse")
-	proto.RegisterType((*ListGroupsRequest)(nil), "charonrpc.ListGroupsRequest")
-	proto.RegisterType((*ListGroupsResponse)(nil), "charonrpc.ListGroupsResponse")
-	proto.RegisterType((*DeleteGroupRequest)(nil), "charonrpc.DeleteGroupRequest")
-	proto.RegisterType((*ModifyGroupRequest)(nil), "charonrpc.ModifyGroupRequest")
-	proto.RegisterType((*ModifyGroupResponse)(nil), "charonrpc.ModifyGroupResponse")
-	proto.RegisterType((*SetGroupPermissionsRequest)(nil), "charonrpc.SetGroupPermissionsRequest")
-	proto.RegisterType((*SetGroupPermissionsResponse)(nil), "charonrpc.SetGroupPermissionsResponse")
-	proto.RegisterType((*ListGroupPermissionsRequest)(nil), "charonrpc.ListGroupPermissionsRequest")
-	proto.RegisterType((*ListGroupPermissionsResponse)(nil), "charonrpc.ListGroupPermissionsResponse")
-}
-
-func init() { proto.RegisterFile("charonrpc/group.proto", fileDescriptor_16567a1ae3b920e4) }
-
-var fileDescriptor_16567a1ae3b920e4 = []byte{
-	// 756 bytes of a gzipped FileDescriptorProto
-	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x94, 0x54, 0xdb, 0x6e, 0xd3, 0x4c,
-	0x10, 0xae, 0xe3, 0x1c, 0xa7, 0xff, 0xdf, 0x96, 0x2d, 0x20, 0xe3, 0x1e, 0x08, 0x86, 0x96, 0x08,
-	0x8a, 0x83, 0x0a, 0x42, 0x02, 0x09, 0x54, 0x02, 0xa8, 0x2a, 0xa2, 0x02, 0xb9, 0x88, 0x8b, 0xde,
-	0x54, 0x8e, 0xbd, 0x49, 0xad, 0xc6, 0x5e, 0xb3, 0x5e, 0x53, 0xa5, 0x8f, 0xc1, 0x0b, 0xf0, 0x24,
-	0xbc, 0x1b, 0xf2, 0xee, 0xda, 0xb1, 0x63, 0x97, 0xd2, 0xab, 0xc4, 0x33, 0xdf, 0x7c, 0xdf, 0x1c,
-	0x17, 0x6e, 0x39, 0xa7, 0x36, 0x25, 0x01, 0x0d, 0x9d, 0xfe, 0x98, 0x92, 0x38, 0x34, 0x43, 0x4a,
-	0x18, 0x41, 0x9d, 0xcc, 0xac, 0xdf, 0x1d, 0x13, 0x32, 0x9e, 0xe0, 0x3e, 0x77, 0x0c, 0xe3, 0x51,
-	0x9f, 0x79, 0x3e, 0x8e, 0x98, 0xed, 0x4b, 0xac, 0xbe, 0x39, 0x0f, 0x38, 0xa7, 0x76, 0x18, 0x62,
-	0x1a, 0x49, 0xff, 0xed, 0x99, 0x84, 0x43, 0x7c, 0x9f, 0x04, 0xd2, 0xbe, 0x1a, 0xb0, 0x69, 0x88,
-	0xa3, 0xbe, 0xf8, 0x11, 0x46, 0xe3, 0x57, 0x0d, 0x1a, 0xfb, 0x49, 0x22, 0x68, 0x09, 0x6a, 0x9e,
-	0xab, 0x29, 0x5d, 0xa5, 0xa7, 0x5a, 0x35, 0xcf, 0x45, 0x08, 0xea, 0x81, 0xed, 0x63, 0xad, 0xd6,
-	0x55, 0x7a, 0x1d, 0x8b, 0xff, 0x47, 0x5d, 0x58, 0x74, 0x71, 0xe4, 0x50, 0x2f, 0x64, 0x1e, 0x09,
-	0x34, 0x95, 0xbb, 0xf2, 0x26, 0xf4, 0x12, 0xc0, 0xa1, 0xd8, 0x66, 0xd8, 0x3d, 0xb1, 0x99, 0x56,
-	0xef, 0x2a, 0xbd, 0xc5, 0x5d, 0xdd, 0x14, 0x19, 0x9b, 0x69, 0xc6, 0xe6, 0xd7, 0xb4, 0x24, 0xab,
-	0x23, 0xd1, 0x6f, 0x19, 0xda, 0x99, 0x85, 0x0e, 0xa7, 0x5a, 0x83, 0x87, 0xfe, 0x6f, 0xca, 0x6c,
-	0x0f, 0x02, 0xf6, 0xe2, 0x79, 0x86, 0x1e, 0x4c, 0x13, 0xa1, 0x38, 0x74, 0x53, 0xa1, 0xe6, 0xd5,
-	0x42, 0x12, 0x2d, 0x84, 0xd2, 0xd0, 0xe1, 0x54, 0x6b, 0x55, 0x0a, 0x49, 0xc0, 0x60, 0x6a, 0x1c,
-	0x03, 0x7a, 0xc7, 0x55, 0x79, 0x9b, 0x2c, 0xfc, 0x3d, 0xc6, 0x11, 0xcb, 0xba, 0xa3, 0xe4, 0xba,
-	0xf3, 0xb4, 0xd8, 0x9d, 0x1a, 0x27, 0x5e, 0x4a, 0x89, 0x8f, 0x18, 0xf5, 0x82, 0x71, 0xa1, 0x5b,
-	0xc6, 0x6b, 0x58, 0x2d, 0x70, 0x47, 0x21, 0x09, 0x22, 0x8c, 0xb6, 0xa1, 0xc1, 0x97, 0x83, 0xb3,
-	0x2f, 0xee, 0xae, 0x98, 0xd9, 0x44, 0x4d, 0x01, 0x14, 0x6e, 0xe3, 0x1e, 0x2c, 0xef, 0x63, 0x56,
-	0xc8, 0x6b, 0x6e, 0x8a, 0xc6, 0x2b, 0x58, 0x99, 0x41, 0xae, 0x49, 0xff, 0x53, 0x81, 0x1b, 0x9f,
-	0xbc, 0x48, 0x44, 0x47, 0xa9, 0xc2, 0x16, 0x34, 0xc9, 0x68, 0x14, 0x61, 0xa6, 0xb9, 0x55, 0x9d,
-	0x93, 0x4e, 0x74, 0x1f, 0x1a, 0x13, 0xcf, 0xf7, 0x98, 0x86, 0xab, 0x50, 0xc2, 0x87, 0x1e, 0x43,
-	0x9b, 0x50, 0x17, 0xd3, 0x64, 0x0e, 0xa3, 0xae, 0x3a, 0x97, 0xcc, 0xe7, 0xc4, 0x65, 0xb5, 0x38,
-	0x62, 0x30, 0xfd, 0x58, 0x6f, 0x2b, 0x2b, 0xae, 0xf1, 0x06, 0x50, 0x3e, 0x27, 0x59, 0x52, 0x0f,
-	0x9a, 0x3c, 0xe7, 0x48, 0x53, 0x4a, 0x34, 0xa2, 0x26, 0xe9, 0x37, 0x1e, 0x00, 0x7a, 0x8f, 0x27,
-	0x78, 0x6e, 0x9c, 0xf3, 0x6d, 0xbb, 0x00, 0x74, 0x48, 0x5c, 0x6f, 0x34, 0xfd, 0x1b, 0x0a, 0x19,
-	0xb9, 0x13, 0x29, 0x4f, 0xba, 0x72, 0x29, 0xd4, 0x7f, 0x5a, 0x8a, 0x82, 0xf6, 0x35, 0xa7, 0x46,
-	0x40, 0x3f, 0x92, 0x13, 0xff, 0x82, 0xa9, 0xef, 0x45, 0x91, 0x47, 0x82, 0x6c, 0x7a, 0x77, 0xa0,
-	0xcd, 0x61, 0x27, 0x59, 0x21, 0x2d, 0xfe, 0x7d, 0xe0, 0x26, 0xc7, 0x1d, 0xce, 0x02, 0xb4, 0x5a,
-	0x57, 0x4d, 0x8e, 0x3b, 0x67, 0x42, 0x37, 0xa1, 0x31, 0x22, 0xd4, 0xc1, 0xbc, 0x8a, 0xb6, 0x25,
-	0x3e, 0x0c, 0x02, 0x6b, 0x95, 0x82, 0x32, 0x6f, 0x0d, 0x5a, 0xf2, 0x6a, 0x53, 0x41, 0xf9, 0x99,
-	0x78, 0x28, 0xf6, 0xc9, 0x0f, 0xec, 0xf2, 0x0e, 0xaa, 0x56, 0xfa, 0x89, 0xd6, 0xa1, 0x13, 0x07,
-	0x8c, 0xc4, 0xce, 0x29, 0x76, 0xb9, 0x98, 0x6a, 0xcd, 0x0c, 0xc6, 0x13, 0x58, 0xcb, 0x56, 0xa0,
-	0xa2, 0xc4, 0xf9, 0x59, 0xee, 0xc1, 0x7a, 0x35, 0x5c, 0x26, 0x38, 0x57, 0xb7, 0x52, 0xaa, 0x7b,
-	0xf7, 0x77, 0x1d, 0xfe, 0xe3, 0xe1, 0x87, 0x76, 0x60, 0x8f, 0x31, 0x45, 0x07, 0xd0, 0x14, 0x77,
-	0x8b, 0x36, 0x72, 0x63, 0x28, 0x3f, 0x13, 0xfa, 0xe6, 0x65, 0x6e, 0xa1, 0x6d, 0x2c, 0x24, 0x54,
-	0x62, 0xda, 0x05, 0xaa, 0xf2, 0xf2, 0x15, 0xa8, 0x2a, 0xf6, 0xc3, 0x58, 0x40, 0x7b, 0xa0, 0xee,
-	0x63, 0x86, 0xf4, 0xfc, 0x66, 0x14, 0x9f, 0x07, 0x7d, 0xad, 0xd2, 0x97, 0x31, 0x7c, 0x80, 0x7a,
-	0xd2, 0x2a, 0xb4, 0x9e, 0x83, 0x95, 0x5e, 0x00, 0x7d, 0xe3, 0x12, 0x6f, 0x8e, 0xa6, 0x29, 0x6e,
-	0xac, 0x50, 0x53, 0xf9, 0xec, 0xf4, 0xf2, 0x83, 0x3d, 0x20, 0x64, 0xf2, 0xcd, 0x9e, 0xc4, 0x09,
-	0x8d, 0x0b, 0xcb, 0x09, 0x7d, 0x6e, 0x66, 0x68, 0xbb, 0x4a, 0xba, 0xbc, 0x03, 0xfa, 0xc3, 0x2b,
-	0x71, 0x59, 0xb2, 0x36, 0x2c, 0x1d, 0xe1, 0x82, 0xc8, 0x56, 0x2e, 0xf8, 0xf2, 0x53, 0xd2, 0xb7,
-	0xaf, 0x82, 0xa5, 0x12, 0x83, 0x9d, 0xe3, 0x47, 0x63, 0x8f, 0x9d, 0xc6, 0x43, 0xd3, 0x21, 0x7e,
-	0x3f, 0xf4, 0x08, 0xa3, 0x67, 0xe4, 0xdc, 0x9e, 0x38, 0x17, 0xf1, 0x59, 0x5f, 0x90, 0xf4, 0x33,
-	0xae, 0x61, 0x93, 0x37, 0xe3, 0xd9, 0x9f, 0x00, 0x00, 0x00, 0xff, 0xff, 0x71, 0xe5, 0x90, 0x38,
-	0x2b, 0x08, 0x00, 0x00,
+	proto.RegisterType((*Group)(nil), "charon.rpc.charond.v1.Group")
+	proto.RegisterType((*CreateGroupRequest)(nil), "charon.rpc.charond.v1.CreateGroupRequest")
+	proto.RegisterType((*CreateGroupResponse)(nil), "charon.rpc.charond.v1.CreateGroupResponse")
+	proto.RegisterType((*GetGroupRequest)(nil), "charon.rpc.charond.v1.GetGroupRequest")
+	proto.RegisterType((*GetGroupResponse)(nil), "charon.rpc.charond.v1.GetGroupResponse")
+	proto.RegisterType((*ListGroupsRequest)(nil), "charon.rpc.charond.v1.ListGroupsRequest")
+	proto.RegisterType((*ListGroupsResponse)(nil), "charon.rpc.charond.v1.ListGroupsResponse")
+	proto.RegisterType((*DeleteGroupRequest)(nil), "charon.rpc.charond.v1.DeleteGroupRequest")
+	proto.RegisterType((*ModifyGroupRequest)(nil), "charon.rpc.charond.v1.ModifyGroupRequest")
+	proto.RegisterType((*ModifyGroupResponse)(nil), "charon.rpc.charond.v1.ModifyGroupResponse")
+	proto.RegisterType((*SetGroupPermissionsRequest)(nil), "charon.rpc.charond.v1.SetGroupPermissionsRequest")
+	proto.RegisterType((*SetGroupPermissionsResponse)(nil), "charon.rpc.charond.v1.SetGroupPermissionsResponse")
+	proto.RegisterType((*ListGroupPermissionsRequest)(nil), "charon.rpc.charond.v1.ListGroupPermissionsRequest")
+	proto.RegisterType((*ListGroupPermissionsResponse)(nil), "charon.rpc.charond.v1.ListGroupPermissionsResponse")
 }
 
 // Reference imports to suppress errors if they are not otherwise used.
@@ -795,7 +727,7 @@ func NewGroupManagerClient(cc *grpc.ClientConn) GroupManagerClient {
 
 func (c *groupManagerClient) Create(ctx context.Context, in *CreateGroupRequest, opts ...grpc.CallOption) (*CreateGroupResponse, error) {
 	out := new(CreateGroupResponse)
-	err := c.cc.Invoke(ctx, "/charonrpc.GroupManager/Create", in, out, opts...)
+	err := c.cc.Invoke(ctx, "/charon.rpc.charond.v1.GroupManager/Create", in, out, opts...)
 	if err != nil {
 		return nil, err
 	}
@@ -804,7 +736,7 @@ func (c *groupManagerClient) Create(ctx context.Context, in *CreateGroupRequest,
 
 func (c *groupManagerClient) Modify(ctx context.Context, in *ModifyGroupRequest, opts ...grpc.CallOption) (*ModifyGroupResponse, error) {
 	out := new(ModifyGroupResponse)
-	err := c.cc.Invoke(ctx, "/charonrpc.GroupManager/Modify", in, out, opts...)
+	err := c.cc.Invoke(ctx, "/charon.rpc.charond.v1.GroupManager/Modify", in, out, opts...)
 	if err != nil {
 		return nil, err
 	}
@@ -813,7 +745,7 @@ func (c *groupManagerClient) Modify(ctx context.Context, in *ModifyGroupRequest,
 
 func (c *groupManagerClient) Get(ctx context.Context, in *GetGroupRequest, opts ...grpc.CallOption) (*GetGroupResponse, error) {
 	out := new(GetGroupResponse)
-	err := c.cc.Invoke(ctx, "/charonrpc.GroupManager/Get", in, out, opts...)
+	err := c.cc.Invoke(ctx, "/charon.rpc.charond.v1.GroupManager/Get", in, out, opts...)
 	if err != nil {
 		return nil, err
 	}
@@ -822,7 +754,7 @@ func (c *groupManagerClient) Get(ctx context.Context, in *GetGroupRequest, opts
 
 func (c *groupManagerClient) List(ctx context.Context, in *ListGroupsRequest, opts ...grpc.CallOption) (*ListGroupsResponse, error) {
 	out := new(ListGroupsResponse)
-	err := c.cc.Invoke(ctx, "/charonrpc.GroupManager/List", in, out, opts...)
+	err := c.cc.Invoke(ctx, "/charon.rpc.charond.v1.GroupManager/List", in, out, opts...)
 	if err != nil {
 		return nil, err
 	}
@@ -831,7 +763,7 @@ func (c *groupManagerClient) List(ctx context.Context, in *ListGroupsRequest, op
 
 func (c *groupManagerClient) Delete(ctx context.Context, in *DeleteGroupRequest, opts ...grpc.CallOption) (*wrappers.BoolValue, error) {
 	out := new(wrappers.BoolValue)
-	err := c.cc.Invoke(ctx, "/charonrpc.GroupManager/Delete", in, out, opts...)
+	err := c.cc.Invoke(ctx, "/charon.rpc.charond.v1.GroupManager/Delete", in, out, opts...)
 	if err != nil {
 		return nil, err
 	}
@@ -840,7 +772,7 @@ func (c *groupManagerClient) Delete(ctx context.Context, in *DeleteGroupRequest,
 
 func (c *groupManagerClient) ListPermissions(ctx context.Context, in *ListGroupPermissionsRequest, opts ...grpc.CallOption) (*ListGroupPermissionsResponse, error) {
 	out := new(ListGroupPermissionsResponse)
-	err := c.cc.Invoke(ctx, "/charonrpc.GroupManager/ListPermissions", in, out, opts...)
+	err := c.cc.Invoke(ctx, "/charon.rpc.charond.v1.GroupManager/ListPermissions", in, out, opts...)
 	if err != nil {
 		return nil, err
 	}
@@ -849,7 +781,7 @@ func (c *groupManagerClient) ListPermissions(ctx context.Context, in *ListGroupP
 
 func (c *groupManagerClient) SetPermissions(ctx context.Context, in *SetGroupPermissionsRequest, opts ...grpc.CallOption) (*SetGroupPermissionsResponse, error) {
 	out := new(SetGroupPermissionsResponse)
-	err := c.cc.Invoke(ctx, "/charonrpc.GroupManager/SetPermissions", in, out, opts...)
+	err := c.cc.Invoke(ctx, "/charon.rpc.charond.v1.GroupManager/SetPermissions", in, out, opts...)
 	if err != nil {
 		return nil, err
 	}
@@ -881,7 +813,7 @@ func _GroupManager_Create_Handler(srv interface{}, ctx context.Context, dec func
 	}
 	info := &grpc.UnaryServerInfo{
 		Server:     srv,
-		FullMethod: "/charonrpc.GroupManager/Create",
+		FullMethod: "/charon.rpc.charond.v1.GroupManager/Create",
 	}
 	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
 		return srv.(GroupManagerServer).Create(ctx, req.(*CreateGroupRequest))
@@ -899,7 +831,7 @@ func _GroupManager_Modify_Handler(srv interface{}, ctx context.Context, dec func
 	}
 	info := &grpc.UnaryServerInfo{
 		Server:     srv,
-		FullMethod: "/charonrpc.GroupManager/Modify",
+		FullMethod: "/charon.rpc.charond.v1.GroupManager/Modify",
 	}
 	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
 		return srv.(GroupManagerServer).Modify(ctx, req.(*ModifyGroupRequest))
@@ -917,7 +849,7 @@ func _GroupManager_Get_Handler(srv interface{}, ctx context.Context, dec func(in
 	}
 	info := &grpc.UnaryServerInfo{
 		Server:     srv,
-		FullMethod: "/charonrpc.GroupManager/Get",
+		FullMethod: "/charon.rpc.charond.v1.GroupManager/Get",
 	}
 	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
 		return srv.(GroupManagerServer).Get(ctx, req.(*GetGroupRequest))
@@ -935,7 +867,7 @@ func _GroupManager_List_Handler(srv interface{}, ctx context.Context, dec func(i
 	}
 	info := &grpc.UnaryServerInfo{
 		Server:     srv,
-		FullMethod: "/charonrpc.GroupManager/List",
+		FullMethod: "/charon.rpc.charond.v1.GroupManager/List",
 	}
 	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
 		return srv.(GroupManagerServer).List(ctx, req.(*ListGroupsRequest))
@@ -953,7 +885,7 @@ func _GroupManager_Delete_Handler(srv interface{}, ctx context.Context, dec func
 	}
 	info := &grpc.UnaryServerInfo{
 		Server:     srv,
-		FullMethod: "/charonrpc.GroupManager/Delete",
+		FullMethod: "/charon.rpc.charond.v1.GroupManager/Delete",
 	}
 	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
 		return srv.(GroupManagerServer).Delete(ctx, req.(*DeleteGroupRequest))
@@ -971,7 +903,7 @@ func _GroupManager_ListPermissions_Handler(srv interface{}, ctx context.Context,
 	}
 	info := &grpc.UnaryServerInfo{
 		Server:     srv,
-		FullMethod: "/charonrpc.GroupManager/ListPermissions",
+		FullMethod: "/charon.rpc.charond.v1.GroupManager/ListPermissions",
 	}
 	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
 		return srv.(GroupManagerServer).ListPermissions(ctx, req.(*ListGroupPermissionsRequest))
@@ -989,7 +921,7 @@ func _GroupManager_SetPermissions_Handler(srv interface{}, ctx context.Context,
 	}
 	info := &grpc.UnaryServerInfo{
 		Server:     srv,
-		FullMethod: "/charonrpc.GroupManager/SetPermissions",
+		FullMethod: "/charon.rpc.charond.v1.GroupManager/SetPermissions",
 	}
 	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
 		return srv.(GroupManagerServer).SetPermissions(ctx, req.(*SetGroupPermissionsRequest))
@@ -998,7 +930,7 @@ func _GroupManager_SetPermissions_Handler(srv interface{}, ctx context.Context,
 }
 
 var _GroupManager_serviceDesc = grpc.ServiceDesc{
-	ServiceName: "charonrpc.GroupManager",
+	ServiceName: "charon.rpc.charond.v1.GroupManager",
 	HandlerType: (*GroupManagerServer)(nil),
 	Methods: []grpc.MethodDesc{
 		{
@@ -1031,5 +963,64 @@ var _GroupManager_serviceDesc = grpc.ServiceDesc{
 		},
 	},
 	Streams:  []grpc.StreamDesc{},
-	Metadata: "charonrpc/group.proto",
+	Metadata: "github.com/piotrkowalczuk/charon/pb/rpc/charond/v1/group.proto",
+}
+
+func init() {
+	proto.RegisterFile("github.com/piotrkowalczuk/charon/pb/rpc/charond/v1/group.proto", fileDescriptor_group_a1b9c6fb366f15a1)
+}
+
+var fileDescriptor_group_a1b9c6fb366f15a1 = []byte{
+	// 802 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xa4, 0x56, 0x6b, 0x4f, 0xdc, 0x46,
+	0x14, 0xc5, 0xeb, 0x7d, 0x71, 0x69, 0x81, 0x0e, 0xad, 0xe4, 0x1a, 0xd4, 0x6e, 0xdd, 0xd7, 0x52,
+	0xb5, 0x76, 0x59, 0x50, 0xab, 0x36, 0x52, 0x1e, 0x9b, 0x28, 0x08, 0x14, 0x14, 0x62, 0xa2, 0x28,
+	0x42, 0x8a, 0x88, 0xd7, 0x9e, 0x5d, 0x2c, 0xd6, 0x1e, 0x67, 0x3c, 0x06, 0x19, 0xe5, 0xb7, 0x24,
+	0xbf, 0x2b, 0xff, 0x26, 0xf2, 0x78, 0xec, 0x7d, 0xd8, 0xe6, 0x11, 0x3e, 0xb1, 0x33, 0x73, 0xee,
+	0x3d, 0xf7, 0xdc, 0x7b, 0x66, 0x30, 0xdc, 0x1f, 0xb9, 0xec, 0x34, 0x1a, 0xe8, 0x36, 0xf1, 0x8c,
+	0xc0, 0x25, 0x8c, 0x9e, 0x91, 0x0b, 0x6b, 0x6c, 0x5f, 0x46, 0x67, 0x86, 0x7d, 0x6a, 0x51, 0xe2,
+	0x1b, 0xc1, 0xc0, 0xa0, 0x81, 0x2d, 0x56, 0x8e, 0x71, 0xbe, 0x65, 0x8c, 0x28, 0x89, 0x02, 0x3d,
+	0xa0, 0x84, 0x11, 0xf4, 0x5d, 0xba, 0xaf, 0xd3, 0xc0, 0xd6, 0x05, 0x44, 0x3f, 0xdf, 0x52, 0x7f,
+	0x1c, 0x11, 0x32, 0x1a, 0x63, 0x83, 0x83, 0x06, 0xd1, 0xd0, 0x60, 0xae, 0x87, 0x43, 0x66, 0x79,
+	0x22, 0x4e, 0xfd, 0x61, 0x1e, 0x70, 0x41, 0xad, 0x20, 0xc0, 0x34, 0x14, 0xe7, 0x0f, 0xbe, 0xa0,
+	0x2e, 0x9b, 0x78, 0x1e, 0xf1, 0x45, 0x82, 0x35, 0x9f, 0xc5, 0x01, 0x0e, 0x8d, 0xf4, 0x4f, 0xba,
+	0xa9, 0x7d, 0xac, 0x41, 0x63, 0x37, 0xa9, 0x1e, 0x2d, 0x43, 0xcd, 0x75, 0x14, 0xa9, 0x23, 0x75,
+	0x65, 0xb3, 0xe6, 0x3a, 0x08, 0x41, 0xdd, 0xb7, 0x3c, 0xac, 0xd4, 0x3a, 0x52, 0x77, 0xd1, 0xe4,
+	0xbf, 0x51, 0x07, 0x96, 0x1c, 0x1c, 0xda, 0xd4, 0x0d, 0x98, 0x4b, 0x7c, 0x45, 0xe6, 0x47, 0xd3,
+	0x5b, 0xe8, 0x3f, 0x00, 0x9b, 0x62, 0x8b, 0x61, 0xe7, 0xc4, 0x62, 0x4a, 0xbd, 0x23, 0x75, 0x97,
+	0x7a, 0xaa, 0x9e, 0x4a, 0xd3, 0x33, 0x69, 0xfa, 0xcb, 0x4c, 0xbb, 0xb9, 0x28, 0xd0, 0x8f, 0x18,
+	0xfa, 0x73, 0x12, 0x3a, 0x88, 0x95, 0x06, 0x0f, 0xfd, 0x5a, 0x17, 0xd5, 0xee, 0xf9, 0xec, 0x9f,
+	0x9d, 0x1c, 0xdd, 0x8f, 0x13, 0xa2, 0x28, 0x70, 0x32, 0xa2, 0xe6, 0xf5, 0x44, 0x02, 0x9d, 0x12,
+	0x65, 0xa1, 0x83, 0x58, 0x69, 0x95, 0x12, 0x09, 0x40, 0x3f, 0xd6, 0x8e, 0x01, 0x3d, 0xe6, 0xac,
+	0xbc, 0x4d, 0x26, 0x7e, 0x17, 0xe1, 0x90, 0xe5, 0xdd, 0x91, 0xa6, 0xba, 0xf3, 0xf7, 0x6c, 0x77,
+	0x6a, 0x3c, 0xf1, 0x72, 0x96, 0xf8, 0x88, 0x51, 0xd7, 0x1f, 0xcd, 0x74, 0x4b, 0xdb, 0x83, 0xb5,
+	0x99, 0xdc, 0x61, 0x40, 0xfc, 0x10, 0xa3, 0x1e, 0x34, 0xb8, 0xa3, 0x78, 0xf6, 0xa5, 0xde, 0x86,
+	0x5e, 0x6a, 0x29, 0x3d, 0x0d, 0x4a, 0xa1, 0xda, 0x4f, 0xb0, 0xb2, 0x8b, 0xd9, 0x4c, 0x8d, 0x73,
+	0x13, 0xd5, 0x9e, 0xc2, 0xea, 0x04, 0x72, 0x07, 0xaa, 0x0f, 0x12, 0x7c, 0xf3, 0xcc, 0x0d, 0xd3,
+	0x4c, 0x61, 0xc6, 0xf6, 0x2b, 0x34, 0xc9, 0x70, 0x18, 0x62, 0xa6, 0x38, 0x65, 0x1d, 0x15, 0x87,
+	0xe8, 0x67, 0x68, 0x8c, 0x5d, 0xcf, 0x65, 0x0a, 0x2e, 0x43, 0xa5, 0x67, 0xe8, 0x5f, 0x68, 0x13,
+	0xea, 0x60, 0x9a, 0xcc, 0x67, 0xd8, 0x91, 0xaf, 0x28, 0xec, 0x79, 0x02, 0x33, 0x5b, 0x1c, 0xdd,
+	0x8f, 0xf7, 0xeb, 0x6d, 0x69, 0xd5, 0xd1, 0xf6, 0x01, 0x4d, 0xd7, 0x27, 0xa4, 0xee, 0x40, 0x93,
+	0xd7, 0x1f, 0x2a, 0xd2, 0x95, 0x29, 0x53, 0xad, 0x02, 0xab, 0xfd, 0x02, 0xe8, 0x09, 0x1e, 0xe3,
+	0xb9, 0xf1, 0xcf, 0xb7, 0xf6, 0x12, 0xd0, 0x01, 0x71, 0xdc, 0x61, 0x7c, 0x15, 0x0a, 0x69, 0x53,
+	0x57, 0xaa, 0xe8, 0x8c, 0x52, 0x13, 0xc9, 0x37, 0x32, 0xd1, 0x0c, 0xf7, 0x1d, 0x26, 0x4b, 0x40,
+	0x3d, 0x12, 0x0e, 0x39, 0xc4, 0xd4, 0x73, 0xc3, 0xd0, 0x25, 0x7e, 0x3e, 0xe1, 0xef, 0xa1, 0xcd,
+	0x61, 0x27, 0xb9, 0xa8, 0x16, 0x5f, 0xef, 0x39, 0xc9, 0xc3, 0x10, 0x4c, 0x02, 0x94, 0x5a, 0x47,
+	0x4e, 0x1e, 0x86, 0xa9, 0x2d, 0xf4, 0x2d, 0x34, 0x86, 0x84, 0xda, 0x98, 0x2b, 0x6a, 0x9b, 0xe9,
+	0x42, 0x23, 0xb0, 0x5e, 0x4a, 0x28, 0x34, 0x28, 0xd0, 0x12, 0x37, 0x3e, 0x23, 0x14, 0xcb, 0xe4,
+	0x84, 0x62, 0x8f, 0x9c, 0x63, 0x87, 0x77, 0x53, 0x36, 0xb3, 0x25, 0xda, 0x80, 0xc5, 0xc8, 0x67,
+	0x24, 0xb2, 0x4f, 0xb1, 0xc3, 0xc9, 0x64, 0x73, 0xb2, 0xa1, 0xfd, 0x05, 0xeb, 0xb9, 0x35, 0x4a,
+	0x24, 0xce, 0xcf, 0xf5, 0x21, 0x6c, 0x94, 0xc3, 0x45, 0x81, 0x73, 0xba, 0xa5, 0x82, 0xee, 0xde,
+	0xa7, 0x06, 0x7c, 0xc5, 0xc3, 0x0f, 0x2c, 0xdf, 0x1a, 0x61, 0x8a, 0x2c, 0x68, 0xa6, 0x77, 0x1e,
+	0x6d, 0x56, 0x8c, 0xa4, 0xf8, 0xdc, 0xa8, 0x7f, 0xdc, 0x04, 0x9a, 0xd6, 0xa4, 0x2d, 0x24, 0x14,
+	0xa9, 0x23, 0x2a, 0x29, 0x8a, 0x66, 0xad, 0xa4, 0x28, 0xf1, 0x96, 0xb6, 0x80, 0x5e, 0x83, 0xbc,
+	0x8b, 0x19, 0xfa, 0xad, 0xca, 0x55, 0xb3, 0x4f, 0x91, 0xfa, 0xfb, 0xb5, 0xb8, 0x3c, 0xf3, 0x1b,
+	0xa8, 0x27, 0x2d, 0x47, 0xdd, 0x8a, 0x90, 0xc2, 0xcb, 0xa3, 0x6e, 0xde, 0x00, 0x99, 0xa7, 0x7f,
+	0x01, 0xcd, 0xf4, 0x3e, 0x57, 0xf6, 0xa6, 0x78, 0xdd, 0xd5, 0xe2, 0x3f, 0x96, 0x3e, 0x21, 0xe3,
+	0x57, 0xd6, 0x38, 0x4a, 0x52, 0xbe, 0x87, 0x95, 0x84, 0x6a, 0xca, 0x1f, 0xa8, 0x77, 0x5d, 0x49,
+	0x45, 0xef, 0xa9, 0xdb, 0xb7, 0x8a, 0xc9, 0x05, 0xc5, 0xb0, 0x7c, 0x84, 0x67, 0xc8, 0xb7, 0x2a,
+	0x12, 0x55, 0x5f, 0x6d, 0xb5, 0x77, 0x9b, 0x90, 0x8c, 0xba, 0xff, 0x16, 0x3a, 0x36, 0xf1, 0xf4,
+	0xec, 0xc3, 0xa4, 0x2c, 0xc3, 0xa1, 0x74, 0xfc, 0xff, 0xed, 0x3f, 0x5c, 0xee, 0x89, 0x9f, 0x83,
+	0x26, 0x6f, 0xf8, 0xf6, 0xe7, 0x00, 0x00, 0x00, 0xff, 0xff, 0x61, 0x7a, 0x66, 0x78, 0x95, 0x09,
+	0x00, 0x00,
 }
diff --git a/charonrpc/group.proto b/pb/rpc/charond/v1/group.proto
similarity index 84%
rename from charonrpc/group.proto
rename to pb/rpc/charond/v1/group.proto
index dbe9765..dd0680e 100644
--- a/charonrpc/group.proto
+++ b/pb/rpc/charond/v1/group.proto
@@ -1,94 +1,96 @@
-syntax = "proto3";
-
-package charonrpc;
-
-option go_package = "github.com/piotrkowalczuk/charon/charonrpc";
-
-import "google/protobuf/timestamp.proto";
-import "google/protobuf/wrappers.proto";
-import "charonrpc/common.proto";
-import "ntypes/ntypes.proto";
-
-service GroupManager {
-    rpc Create(CreateGroupRequest) returns (CreateGroupResponse) {};
-    rpc Modify(ModifyGroupRequest) returns (ModifyGroupResponse) {};
-    rpc Get(GetGroupRequest) returns (GetGroupResponse) {};
-    rpc List(ListGroupsRequest) returns (ListGroupsResponse) {};
-    rpc Delete(DeleteGroupRequest) returns (google.protobuf.BoolValue) {};
-
-    rpc ListPermissions(ListGroupPermissionsRequest) returns (ListGroupPermissionsResponse) {};
-    rpc SetPermissions(SetGroupPermissionsRequest) returns (SetGroupPermissionsResponse) {};
-}
-
-message Group {
-    int64 id = 1;
-    string name = 2;
-    string description = 3;
-    google.protobuf.Timestamp created_at = 4;
-    ntypes.Int64 created_by = 5;
-    google.protobuf.Timestamp updated_at = 6;
-    ntypes.Int64 updated_by = 7;
-}
-
-message CreateGroupRequest {
-    string name = 1;
-    ntypes.String description = 2;
-}
-
-message CreateGroupResponse {
-    Group group = 1;
-}
-
-message GetGroupRequest {
-    int64 id = 1;
-}
-
-message GetGroupResponse {
-    Group group = 1;
-}
-
-message ListGroupsRequest {
-    reserved 1 to 99;
-    ntypes.Int64 offset = 100;
-    ntypes.Int64 limit = 101;
-    repeated Order order_by = 102;
-}
-
-message ListGroupsResponse {
-    repeated Group groups = 1;
-}
-
-message DeleteGroupRequest {
-    int64 id = 1;
-}
-
-message ModifyGroupRequest {
-    int64 id = 1;
-    ntypes.String name = 2;
-    ntypes.String description = 3;
-}
-
-message ModifyGroupResponse {
-    Group group = 1;
-}
-
-message SetGroupPermissionsRequest {
-    int64 group_id = 1;
-    repeated string permissions = 2;
-    // Force tells if permission should be created in case if it does not exists.
-    bool force = 3;
-}
-
-message SetGroupPermissionsResponse {
-    int64 created = 1;
-    int64 removed = 2;
-    int64 untouched = 3;
-}
-
-message ListGroupPermissionsRequest {
-    int64 id = 1;
-}
-
-message ListGroupPermissionsResponse {
-    repeated string permissions = 1;
+syntax = "proto3";
+
+package charon.rpc.charond.v1;
+
+option go_package = "github.com/piotrkowalczuk/charon/pb/rpc/charond/v1;charond";
+option java_multiple_files = true;
+option java_package = "com.github.charon.rpc.charond.v1";
+
+import "google/protobuf/timestamp.proto";
+import "google/protobuf/wrappers.proto";
+import "github.com/piotrkowalczuk/charon/pb/rpc/charond/v1/common.proto";
+import "ntypes/ntypes.proto";
+
+service GroupManager {
+    rpc Create(CreateGroupRequest) returns (CreateGroupResponse) {};
+    rpc Modify(ModifyGroupRequest) returns (ModifyGroupResponse) {};
+    rpc Get(GetGroupRequest) returns (GetGroupResponse) {};
+    rpc List(ListGroupsRequest) returns (ListGroupsResponse) {};
+    rpc Delete(DeleteGroupRequest) returns (google.protobuf.BoolValue) {};
+
+    rpc ListPermissions(ListGroupPermissionsRequest) returns (ListGroupPermissionsResponse) {};
+    rpc SetPermissions(SetGroupPermissionsRequest) returns (SetGroupPermissionsResponse) {};
+}
+
+message Group {
+    int64 id = 1;
+    string name = 2;
+    string description = 3;
+    google.protobuf.Timestamp created_at = 4;
+    ntypes.Int64 created_by = 5;
+    google.protobuf.Timestamp updated_at = 6;
+    ntypes.Int64 updated_by = 7;
+}
+
+message CreateGroupRequest {
+    string name = 1;
+    ntypes.String description = 2;
+}
+
+message CreateGroupResponse {
+    Group group = 1;
+}
+
+message GetGroupRequest {
+    int64 id = 1;
+}
+
+message GetGroupResponse {
+    Group group = 1;
+}
+
+message ListGroupsRequest {
+    reserved 1 to 99;
+    ntypes.Int64 offset = 100;
+    ntypes.Int64 limit = 101;
+    repeated Order order_by = 102;
+}
+
+message ListGroupsResponse {
+    repeated Group groups = 1;
+}
+
+message DeleteGroupRequest {
+    int64 id = 1;
+}
+
+message ModifyGroupRequest {
+    int64 id = 1;
+    ntypes.String name = 2;
+    ntypes.String description = 3;
+}
+
+message ModifyGroupResponse {
+    Group group = 1;
+}
+
+message SetGroupPermissionsRequest {
+    int64 group_id = 1;
+    repeated string permissions = 2;
+    // Force tells if permission should be created in case if it does not exists.
+    bool force = 3;
+}
+
+message SetGroupPermissionsResponse {
+    int64 created = 1;
+    int64 removed = 2;
+    int64 untouched = 3;
+}
+
+message ListGroupPermissionsRequest {
+    int64 id = 1;
+}
+
+message ListGroupPermissionsResponse {
+    repeated string permissions = 1;
 }
\ No newline at end of file
diff --git a/charonrpc/permission.pb.go b/pb/rpc/charond/v1/permission.pb.go
similarity index 69%
rename from charonrpc/permission.pb.go
rename to pb/rpc/charond/v1/permission.pb.go
index 8dd03c5..a34d7d6 100644
--- a/charonrpc/permission.pb.go
+++ b/pb/rpc/charond/v1/permission.pb.go
@@ -1,16 +1,16 @@
 // Code generated by protoc-gen-go. DO NOT EDIT.
-// source: charonrpc/permission.proto
+// source: github.com/piotrkowalczuk/charon/pb/rpc/charond/v1/permission.proto
 
-package charonrpc
+package charond // import "github.com/piotrkowalczuk/charon/pb/rpc/charond/v1"
 
-import (
-	context "context"
-	fmt "fmt"
-	math "math"
+import proto "github.com/golang/protobuf/proto"
+import fmt "fmt"
+import math "math"
+import ntypes "github.com/piotrkowalczuk/ntypes"
+import qtypes "github.com/piotrkowalczuk/qtypes"
 
-	proto "github.com/golang/protobuf/proto"
-	ntypes "github.com/piotrkowalczuk/ntypes"
-	qtypes "github.com/piotrkowalczuk/qtypes"
+import (
+	context "golang.org/x/net/context"
 	grpc "google.golang.org/grpc"
 )
 
@@ -36,17 +36,16 @@ func (m *RegisterPermissionsRequest) Reset()         { *m = RegisterPermissionsR
 func (m *RegisterPermissionsRequest) String() string { return proto.CompactTextString(m) }
 func (*RegisterPermissionsRequest) ProtoMessage()    {}
 func (*RegisterPermissionsRequest) Descriptor() ([]byte, []int) {
-	return fileDescriptor_30e096bb83149b0a, []int{0}
+	return fileDescriptor_permission_466dba486a6a79c2, []int{0}
 }
-
 func (m *RegisterPermissionsRequest) XXX_Unmarshal(b []byte) error {
 	return xxx_messageInfo_RegisterPermissionsRequest.Unmarshal(m, b)
 }
 func (m *RegisterPermissionsRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
 	return xxx_messageInfo_RegisterPermissionsRequest.Marshal(b, m, deterministic)
 }
-func (m *RegisterPermissionsRequest) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_RegisterPermissionsRequest.Merge(m, src)
+func (dst *RegisterPermissionsRequest) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_RegisterPermissionsRequest.Merge(dst, src)
 }
 func (m *RegisterPermissionsRequest) XXX_Size() int {
 	return xxx_messageInfo_RegisterPermissionsRequest.Size(m)
@@ -77,17 +76,16 @@ func (m *RegisterPermissionsResponse) Reset()         { *m = RegisterPermissions
 func (m *RegisterPermissionsResponse) String() string { return proto.CompactTextString(m) }
 func (*RegisterPermissionsResponse) ProtoMessage()    {}
 func (*RegisterPermissionsResponse) Descriptor() ([]byte, []int) {
-	return fileDescriptor_30e096bb83149b0a, []int{1}
+	return fileDescriptor_permission_466dba486a6a79c2, []int{1}
 }
-
 func (m *RegisterPermissionsResponse) XXX_Unmarshal(b []byte) error {
 	return xxx_messageInfo_RegisterPermissionsResponse.Unmarshal(m, b)
 }
 func (m *RegisterPermissionsResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
 	return xxx_messageInfo_RegisterPermissionsResponse.Marshal(b, m, deterministic)
 }
-func (m *RegisterPermissionsResponse) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_RegisterPermissionsResponse.Merge(m, src)
+func (dst *RegisterPermissionsResponse) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_RegisterPermissionsResponse.Merge(dst, src)
 }
 func (m *RegisterPermissionsResponse) XXX_Size() int {
 	return xxx_messageInfo_RegisterPermissionsResponse.Size(m)
@@ -138,17 +136,16 @@ func (m *ListPermissionsRequest) Reset()         { *m = ListPermissionsRequest{}
 func (m *ListPermissionsRequest) String() string { return proto.CompactTextString(m) }
 func (*ListPermissionsRequest) ProtoMessage()    {}
 func (*ListPermissionsRequest) Descriptor() ([]byte, []int) {
-	return fileDescriptor_30e096bb83149b0a, []int{2}
+	return fileDescriptor_permission_466dba486a6a79c2, []int{2}
 }
-
 func (m *ListPermissionsRequest) XXX_Unmarshal(b []byte) error {
 	return xxx_messageInfo_ListPermissionsRequest.Unmarshal(m, b)
 }
 func (m *ListPermissionsRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
 	return xxx_messageInfo_ListPermissionsRequest.Marshal(b, m, deterministic)
 }
-func (m *ListPermissionsRequest) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_ListPermissionsRequest.Merge(m, src)
+func (dst *ListPermissionsRequest) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_ListPermissionsRequest.Merge(dst, src)
 }
 func (m *ListPermissionsRequest) XXX_Size() int {
 	return xxx_messageInfo_ListPermissionsRequest.Size(m)
@@ -234,17 +231,16 @@ func (m *ListPermissionsResponse) Reset()         { *m = ListPermissionsResponse
 func (m *ListPermissionsResponse) String() string { return proto.CompactTextString(m) }
 func (*ListPermissionsResponse) ProtoMessage()    {}
 func (*ListPermissionsResponse) Descriptor() ([]byte, []int) {
-	return fileDescriptor_30e096bb83149b0a, []int{3}
+	return fileDescriptor_permission_466dba486a6a79c2, []int{3}
 }
-
 func (m *ListPermissionsResponse) XXX_Unmarshal(b []byte) error {
 	return xxx_messageInfo_ListPermissionsResponse.Unmarshal(m, b)
 }
 func (m *ListPermissionsResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
 	return xxx_messageInfo_ListPermissionsResponse.Marshal(b, m, deterministic)
 }
-func (m *ListPermissionsResponse) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_ListPermissionsResponse.Merge(m, src)
+func (dst *ListPermissionsResponse) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_ListPermissionsResponse.Merge(dst, src)
 }
 func (m *ListPermissionsResponse) XXX_Size() int {
 	return xxx_messageInfo_ListPermissionsResponse.Size(m)
@@ -273,17 +269,16 @@ func (m *GetPermissionRequest) Reset()         { *m = GetPermissionRequest{} }
 func (m *GetPermissionRequest) String() string { return proto.CompactTextString(m) }
 func (*GetPermissionRequest) ProtoMessage()    {}
 func (*GetPermissionRequest) Descriptor() ([]byte, []int) {
-	return fileDescriptor_30e096bb83149b0a, []int{4}
+	return fileDescriptor_permission_466dba486a6a79c2, []int{4}
 }
-
 func (m *GetPermissionRequest) XXX_Unmarshal(b []byte) error {
 	return xxx_messageInfo_GetPermissionRequest.Unmarshal(m, b)
 }
 func (m *GetPermissionRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
 	return xxx_messageInfo_GetPermissionRequest.Marshal(b, m, deterministic)
 }
-func (m *GetPermissionRequest) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_GetPermissionRequest.Merge(m, src)
+func (dst *GetPermissionRequest) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_GetPermissionRequest.Merge(dst, src)
 }
 func (m *GetPermissionRequest) XXX_Size() int {
 	return xxx_messageInfo_GetPermissionRequest.Size(m)
@@ -312,17 +307,16 @@ func (m *GetPermissionResponse) Reset()         { *m = GetPermissionResponse{} }
 func (m *GetPermissionResponse) String() string { return proto.CompactTextString(m) }
 func (*GetPermissionResponse) ProtoMessage()    {}
 func (*GetPermissionResponse) Descriptor() ([]byte, []int) {
-	return fileDescriptor_30e096bb83149b0a, []int{5}
+	return fileDescriptor_permission_466dba486a6a79c2, []int{5}
 }
-
 func (m *GetPermissionResponse) XXX_Unmarshal(b []byte) error {
 	return xxx_messageInfo_GetPermissionResponse.Unmarshal(m, b)
 }
 func (m *GetPermissionResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
 	return xxx_messageInfo_GetPermissionResponse.Marshal(b, m, deterministic)
 }
-func (m *GetPermissionResponse) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_GetPermissionResponse.Merge(m, src)
+func (dst *GetPermissionResponse) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_GetPermissionResponse.Merge(dst, src)
 }
 func (m *GetPermissionResponse) XXX_Size() int {
 	return xxx_messageInfo_GetPermissionResponse.Size(m)
@@ -341,55 +335,13 @@ func (m *GetPermissionResponse) GetPermission() string {
 }
 
 func init() {
-	proto.RegisterType((*RegisterPermissionsRequest)(nil), "charonrpc.RegisterPermissionsRequest")
-	proto.RegisterType((*RegisterPermissionsResponse)(nil), "charonrpc.RegisterPermissionsResponse")
-	proto.RegisterType((*ListPermissionsRequest)(nil), "charonrpc.ListPermissionsRequest")
-	proto.RegisterMapType((map[string]bool)(nil), "charonrpc.ListPermissionsRequest.SortEntry")
-	proto.RegisterType((*ListPermissionsResponse)(nil), "charonrpc.ListPermissionsResponse")
-	proto.RegisterType((*GetPermissionRequest)(nil), "charonrpc.GetPermissionRequest")
-	proto.RegisterType((*GetPermissionResponse)(nil), "charonrpc.GetPermissionResponse")
-}
-
-func init() { proto.RegisterFile("charonrpc/permission.proto", fileDescriptor_30e096bb83149b0a) }
-
-var fileDescriptor_30e096bb83149b0a = []byte{
-	// 565 bytes of a gzipped FileDescriptorProto
-	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x84, 0x94, 0x6f, 0x6f, 0xd3, 0x30,
-	0x10, 0xc6, 0x69, 0xd2, 0x76, 0xcd, 0x55, 0x4c, 0x9d, 0x19, 0x23, 0x0a, 0x08, 0x4a, 0xd0, 0xaa,
-	0x8a, 0x4d, 0x29, 0x2a, 0x88, 0x21, 0x90, 0x90, 0x28, 0x42, 0x13, 0x13, 0x68, 0x28, 0xe3, 0x15,
-	0xbc, 0x40, 0x69, 0xe2, 0xb6, 0x56, 0x1b, 0x3b, 0xb3, 0x9d, 0xa1, 0xf0, 0x1d, 0xf8, 0xb4, 0x7c,
-	0x01, 0x14, 0xe7, 0xaf, 0x58, 0x46, 0x5f, 0xb5, 0xbe, 0xe7, 0xf7, 0xdc, 0x5d, 0xcf, 0xe7, 0x82,
-	0xe5, 0xaf, 0x3c, 0xce, 0x28, 0x8f, 0xfc, 0x49, 0x84, 0x79, 0x48, 0x84, 0x20, 0x8c, 0x3a, 0x11,
-	0x67, 0x92, 0x21, 0xa3, 0xd4, 0xac, 0x83, 0x0a, 0xf3, 0x59, 0x18, 0x16, 0x88, 0x75, 0xe7, 0x52,
-	0x26, 0x11, 0x16, 0x93, 0xec, 0xa3, 0x08, 0xd2, 0x2c, 0x48, 0x6b, 0x41, 0xfb, 0x2d, 0x58, 0x2e,
-	0x5e, 0x12, 0x21, 0x31, 0xff, 0x52, 0x16, 0x12, 0x2e, 0xbe, 0x8c, 0xb1, 0x90, 0x68, 0x08, 0xfd,
-	0xaa, 0xbc, 0x30, 0x5b, 0x43, 0x7d, 0x6c, 0xb8, 0xf5, 0x90, 0xcd, 0xe0, 0x7e, 0xa3, 0x5f, 0x44,
-	0x8c, 0x0a, 0x8c, 0x4c, 0xd8, 0xf1, 0x39, 0xf6, 0x24, 0x0e, 0xcc, 0xd6, 0xb0, 0x35, 0xd6, 0xdd,
-	0xe2, 0x98, 0x2a, 0x1c, 0x87, 0xec, 0x0a, 0x07, 0xa6, 0x96, 0x29, 0xf9, 0x11, 0x3d, 0x00, 0x23,
-	0xa6, 0x92, 0xc5, 0xfe, 0x0a, 0x07, 0xa6, 0xae, 0xb4, 0x2a, 0x60, 0xff, 0xd1, 0xe1, 0xe0, 0x13,
-	0x11, 0xb2, 0xa1, 0xdb, 0x63, 0x30, 0x44, 0x3c, 0x17, 0x89, 0x90, 0x38, 0x54, 0xe5, 0xfa, 0xd3,
-	0x5d, 0x27, 0x1f, 0xc1, 0x85, 0xe4, 0x84, 0x2e, 0xdd, 0x0a, 0x40, 0x23, 0xe8, 0x86, 0x2c, 0x88,
-	0x37, 0x58, 0xd5, 0xbf, 0x8e, 0xe6, 0x6a, 0xca, 0x79, 0xbe, 0x24, 0x8c, 0xaa, 0x5e, 0x1a, 0xb8,
-	0x4c, 0x45, 0xcf, 0x00, 0xf2, 0xdf, 0xf6, 0xc3, 0x93, 0x66, 0x5b, 0xb1, 0x7b, 0x05, 0xfb, 0x95,
-	0x84, 0x58, 0x48, 0x2f, 0x8c, 0x5c, 0x23, 0x87, 0xde, 0xa5, 0xfd, 0x96, 0x8e, 0x79, 0x62, 0x76,
-	0x94, 0xe3, 0x76, 0xe1, 0xf8, 0x48, 0xe5, 0xcb, 0x17, 0x25, 0x3d, 0x4b, 0xd0, 0x21, 0x74, 0xd9,
-	0x62, 0x21, 0xb0, 0x34, 0x83, 0x9c, 0xa4, 0x75, 0x32, 0x17, 0xd1, 0x13, 0xe8, 0x6c, 0x48, 0x48,
-	0xa4, 0x89, 0x9b, 0xa8, 0x4c, 0x43, 0xef, 0xa1, 0x2d, 0x18, 0x97, 0xe6, 0x62, 0xa8, 0x8f, 0xfb,
-	0xd3, 0x23, 0xa7, 0x5c, 0x23, 0xa7, 0x79, 0xb4, 0xce, 0x05, 0xe3, 0xf2, 0x03, 0x95, 0x3c, 0x99,
-	0x69, 0x66, 0xcb, 0x55, 0x66, 0x74, 0x04, 0x3d, 0xc6, 0x03, 0xcc, 0xd3, 0xe6, 0x97, 0x2a, 0xd1,
-	0xa0, 0x96, 0xe8, 0x3c, 0x95, 0xdc, 0x1d, 0x45, 0xcc, 0x12, 0xeb, 0x04, 0x8c, 0x32, 0x07, 0x1a,
-	0x80, 0xbe, 0xc6, 0x89, 0xba, 0x22, 0xc3, 0x4d, 0xbf, 0xa2, 0x7d, 0xe8, 0x5c, 0x79, 0x9b, 0x38,
-	0xbb, 0x8b, 0x9e, 0x9b, 0x1d, 0x5e, 0x6b, 0xaf, 0x5a, 0x67, 0xed, 0x5e, 0x77, 0x10, 0xd8, 0x6f,
-	0xe0, 0xde, 0xb5, 0xce, 0xf2, 0x15, 0xdb, 0xbe, 0xa3, 0x23, 0xd8, 0x3f, 0xc5, 0x35, 0x6f, 0xb1,
-	0x2f, 0xbb, 0xa0, 0x91, 0x62, 0x2f, 0x35, 0x12, 0xd8, 0x27, 0x70, 0xf7, 0x1f, 0x2e, 0x2f, 0xf1,
-	0x10, 0xa0, 0xca, 0x97, 0xb7, 0x5d, 0x8b, 0x4c, 0x7f, 0x6b, 0xb0, 0x57, 0xd9, 0x3e, 0x7b, 0xd4,
-	0x5b, 0x62, 0x8e, 0xbe, 0x43, 0xaf, 0x78, 0x1a, 0xe8, 0xb0, 0x36, 0x99, 0x9b, 0xdf, 0x9b, 0x35,
-	0xda, 0x86, 0x65, 0x0d, 0xd9, 0xb7, 0xd0, 0x39, 0xb4, 0xd3, 0x81, 0xa0, 0xc7, 0x5b, 0xef, 0xce,
-	0xb2, 0xff, 0x87, 0x94, 0x09, 0xcf, 0x40, 0x3f, 0xc5, 0x12, 0x3d, 0xaa, 0xc1, 0x4d, 0x43, 0xb3,
-	0x86, 0x37, 0x03, 0x45, 0xae, 0xd9, 0xf1, 0xb7, 0xa7, 0x4b, 0x22, 0x57, 0xf1, 0xdc, 0xf1, 0x59,
-	0x38, 0x89, 0x08, 0x93, 0x7c, 0xcd, 0x7e, 0x7a, 0x1b, 0xff, 0x57, 0xbc, 0x9e, 0x64, 0xf6, 0x49,
-	0x99, 0x65, 0xde, 0x55, 0xff, 0x44, 0xcf, 0xff, 0x06, 0x00, 0x00, 0xff, 0xff, 0x26, 0x29, 0x40,
-	0xb0, 0xf4, 0x04, 0x00, 0x00,
+	proto.RegisterType((*RegisterPermissionsRequest)(nil), "charon.rpc.charond.v1.RegisterPermissionsRequest")
+	proto.RegisterType((*RegisterPermissionsResponse)(nil), "charon.rpc.charond.v1.RegisterPermissionsResponse")
+	proto.RegisterType((*ListPermissionsRequest)(nil), "charon.rpc.charond.v1.ListPermissionsRequest")
+	proto.RegisterMapType((map[string]bool)(nil), "charon.rpc.charond.v1.ListPermissionsRequest.SortEntry")
+	proto.RegisterType((*ListPermissionsResponse)(nil), "charon.rpc.charond.v1.ListPermissionsResponse")
+	proto.RegisterType((*GetPermissionRequest)(nil), "charon.rpc.charond.v1.GetPermissionRequest")
+	proto.RegisterType((*GetPermissionResponse)(nil), "charon.rpc.charond.v1.GetPermissionResponse")
 }
 
 // Reference imports to suppress errors if they are not otherwise used.
@@ -419,7 +371,7 @@ func NewPermissionManagerClient(cc *grpc.ClientConn) PermissionManagerClient {
 
 func (c *permissionManagerClient) Register(ctx context.Context, in *RegisterPermissionsRequest, opts ...grpc.CallOption) (*RegisterPermissionsResponse, error) {
 	out := new(RegisterPermissionsResponse)
-	err := c.cc.Invoke(ctx, "/charonrpc.PermissionManager/Register", in, out, opts...)
+	err := c.cc.Invoke(ctx, "/charon.rpc.charond.v1.PermissionManager/Register", in, out, opts...)
 	if err != nil {
 		return nil, err
 	}
@@ -428,7 +380,7 @@ func (c *permissionManagerClient) Register(ctx context.Context, in *RegisterPerm
 
 func (c *permissionManagerClient) List(ctx context.Context, in *ListPermissionsRequest, opts ...grpc.CallOption) (*ListPermissionsResponse, error) {
 	out := new(ListPermissionsResponse)
-	err := c.cc.Invoke(ctx, "/charonrpc.PermissionManager/List", in, out, opts...)
+	err := c.cc.Invoke(ctx, "/charon.rpc.charond.v1.PermissionManager/List", in, out, opts...)
 	if err != nil {
 		return nil, err
 	}
@@ -437,7 +389,7 @@ func (c *permissionManagerClient) List(ctx context.Context, in *ListPermissionsR
 
 func (c *permissionManagerClient) Get(ctx context.Context, in *GetPermissionRequest, opts ...grpc.CallOption) (*GetPermissionResponse, error) {
 	out := new(GetPermissionResponse)
-	err := c.cc.Invoke(ctx, "/charonrpc.PermissionManager/Get", in, out, opts...)
+	err := c.cc.Invoke(ctx, "/charon.rpc.charond.v1.PermissionManager/Get", in, out, opts...)
 	if err != nil {
 		return nil, err
 	}
@@ -465,7 +417,7 @@ func _PermissionManager_Register_Handler(srv interface{}, ctx context.Context, d
 	}
 	info := &grpc.UnaryServerInfo{
 		Server:     srv,
-		FullMethod: "/charonrpc.PermissionManager/Register",
+		FullMethod: "/charon.rpc.charond.v1.PermissionManager/Register",
 	}
 	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
 		return srv.(PermissionManagerServer).Register(ctx, req.(*RegisterPermissionsRequest))
@@ -483,7 +435,7 @@ func _PermissionManager_List_Handler(srv interface{}, ctx context.Context, dec f
 	}
 	info := &grpc.UnaryServerInfo{
 		Server:     srv,
-		FullMethod: "/charonrpc.PermissionManager/List",
+		FullMethod: "/charon.rpc.charond.v1.PermissionManager/List",
 	}
 	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
 		return srv.(PermissionManagerServer).List(ctx, req.(*ListPermissionsRequest))
@@ -501,7 +453,7 @@ func _PermissionManager_Get_Handler(srv interface{}, ctx context.Context, dec fu
 	}
 	info := &grpc.UnaryServerInfo{
 		Server:     srv,
-		FullMethod: "/charonrpc.PermissionManager/Get",
+		FullMethod: "/charon.rpc.charond.v1.PermissionManager/Get",
 	}
 	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
 		return srv.(PermissionManagerServer).Get(ctx, req.(*GetPermissionRequest))
@@ -510,7 +462,7 @@ func _PermissionManager_Get_Handler(srv interface{}, ctx context.Context, dec fu
 }
 
 var _PermissionManager_serviceDesc = grpc.ServiceDesc{
-	ServiceName: "charonrpc.PermissionManager",
+	ServiceName: "charon.rpc.charond.v1.PermissionManager",
 	HandlerType: (*PermissionManagerServer)(nil),
 	Methods: []grpc.MethodDesc{
 		{
@@ -527,5 +479,51 @@ var _PermissionManager_serviceDesc = grpc.ServiceDesc{
 		},
 	},
 	Streams:  []grpc.StreamDesc{},
-	Metadata: "charonrpc/permission.proto",
+	Metadata: "github.com/piotrkowalczuk/charon/pb/rpc/charond/v1/permission.proto",
+}
+
+func init() {
+	proto.RegisterFile("github.com/piotrkowalczuk/charon/pb/rpc/charond/v1/permission.proto", fileDescriptor_permission_466dba486a6a79c2)
+}
+
+var fileDescriptor_permission_466dba486a6a79c2 = []byte{
+	// 601 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x9c, 0x94, 0x6f, 0x6b, 0xd4, 0x4e,
+	0x10, 0xc7, 0x7f, 0x49, 0xae, 0xd7, 0xcb, 0x94, 0x5f, 0x69, 0xd7, 0x56, 0x43, 0x2c, 0x72, 0x44,
+	0x2c, 0x05, 0x6b, 0x62, 0x4f, 0xf1, 0xa4, 0x05, 0xc5, 0x13, 0x29, 0x8a, 0xd2, 0x92, 0xfa, 0xc8,
+	0x27, 0x9a, 0x3f, 0xdb, 0x74, 0xb9, 0xcb, 0x6e, 0xba, 0xbb, 0x39, 0x89, 0x6f, 0xc1, 0xd7, 0xe7,
+	0xfb, 0x91, 0x24, 0x9b, 0xbb, 0xc3, 0xe6, 0xb0, 0xe7, 0xa3, 0x64, 0x66, 0x3e, 0xdf, 0x99, 0xc9,
+	0xec, 0x64, 0xe1, 0x6d, 0x42, 0xe4, 0x55, 0x1e, 0xba, 0x11, 0x4b, 0xbd, 0x8c, 0x30, 0xc9, 0xc7,
+	0xec, 0x7b, 0x30, 0x89, 0x7e, 0xe4, 0x63, 0x2f, 0xba, 0x0a, 0x38, 0xa3, 0x5e, 0x16, 0x7a, 0x3c,
+	0x8b, 0x94, 0x15, 0x7b, 0xd3, 0x23, 0x2f, 0xc3, 0x3c, 0x25, 0x42, 0x10, 0x46, 0xdd, 0x8c, 0x33,
+	0xc9, 0xd0, 0x6e, 0x1d, 0x74, 0x79, 0x16, 0xb9, 0x8a, 0x73, 0xa7, 0x47, 0xf6, 0xeb, 0x7f, 0xc8,
+	0x1d, 0xb1, 0x34, 0x6d, 0xf2, 0xda, 0x77, 0xae, 0x65, 0x91, 0x61, 0xe1, 0xd5, 0x8f, 0xc6, 0x49,
+	0x6b, 0x27, 0x5d, 0x70, 0x3a, 0xaf, 0xc0, 0xf6, 0x71, 0x42, 0x84, 0xc4, 0xfc, 0x7c, 0xd6, 0x9d,
+	0xf0, 0xf1, 0x75, 0x8e, 0x85, 0x44, 0x7d, 0xd8, 0x98, 0xf7, 0x2c, 0x2c, 0xad, 0x6f, 0x1c, 0x98,
+	0xfe, 0xa2, 0xcb, 0x61, 0x70, 0xbf, 0x55, 0x2f, 0x32, 0x46, 0x05, 0x46, 0x16, 0xac, 0x47, 0x1c,
+	0x07, 0x12, 0xc7, 0x96, 0xd6, 0xd7, 0x0e, 0x0c, 0xbf, 0x31, 0xcb, 0x08, 0xc7, 0x29, 0x9b, 0xe2,
+	0xd8, 0xd2, 0xeb, 0x88, 0x32, 0xd1, 0x1e, 0x98, 0x39, 0x95, 0x2c, 0x8f, 0xae, 0x70, 0x6c, 0x19,
+	0x55, 0x6c, 0xee, 0x70, 0x7e, 0x76, 0xe0, 0xee, 0x47, 0x22, 0x64, 0x4b, 0xb7, 0x87, 0x60, 0x8a,
+	0x3c, 0x14, 0x85, 0x90, 0x38, 0xad, 0xca, 0x6d, 0x0c, 0x36, 0x5d, 0x35, 0x82, 0x0b, 0xc9, 0x09,
+	0x4d, 0xfc, 0x39, 0x80, 0xf6, 0xa1, 0x9b, 0xb2, 0x38, 0x9f, 0xe0, 0xaa, 0xfe, 0x4d, 0x54, 0x45,
+	0x4b, 0x2e, 0x88, 0x24, 0x61, 0xb4, 0xea, 0xa5, 0x85, 0xab, 0xa3, 0xe8, 0x29, 0x80, 0xfa, 0xb6,
+	0xaf, 0x81, 0xb4, 0x3a, 0x15, 0xbb, 0xdd, 0xb0, 0x9f, 0x49, 0x8a, 0x85, 0x0c, 0xd2, 0xcc, 0x37,
+	0x15, 0xf4, 0xa6, 0xec, 0x77, 0xa6, 0x08, 0x0b, 0x6b, 0xad, 0x52, 0xfc, 0xdf, 0x28, 0xde, 0x53,
+	0xf9, 0xe2, 0xf9, 0x8c, 0x1e, 0x15, 0xe8, 0x11, 0x74, 0xd9, 0xe5, 0xa5, 0xc0, 0xd2, 0x8a, 0x15,
+	0x49, 0x17, 0x49, 0x15, 0x44, 0x0f, 0x61, 0x6d, 0x42, 0x52, 0x22, 0x2d, 0xdc, 0x46, 0xd5, 0x31,
+	0x74, 0x06, 0x1d, 0xc1, 0xb8, 0xb4, 0x2e, 0xfb, 0xc6, 0xc1, 0xc6, 0x60, 0xe8, 0xb6, 0xae, 0xa1,
+	0xdb, 0x3e, 0x66, 0xf7, 0x82, 0x71, 0xf9, 0x8e, 0x4a, 0x5e, 0x8c, 0x74, 0x4b, 0xf3, 0xab, 0x44,
+	0x68, 0x08, 0x3d, 0xc6, 0x63, 0xcc, 0xcb, 0x0f, 0x49, 0xaa, 0xa4, 0x7b, 0x4b, 0x92, 0x9e, 0x95,
+	0x98, 0xbf, 0x5e, 0xd1, 0xa3, 0xc2, 0x1e, 0x82, 0x39, 0xcb, 0x87, 0xb6, 0xc0, 0x18, 0xe3, 0xa2,
+	0x3a, 0x3a, 0xd3, 0x2f, 0x5f, 0xd1, 0x0e, 0xac, 0x4d, 0x83, 0x49, 0x5e, 0x9f, 0x51, 0xcf, 0xaf,
+	0x8d, 0x63, 0xfd, 0xa5, 0xf6, 0xa1, 0xd3, 0xeb, 0x6e, 0xc5, 0xce, 0x09, 0xdc, 0xbb, 0xd1, 0xa5,
+	0x5a, 0xbd, 0xbf, 0xef, 0xee, 0x3e, 0xec, 0x9c, 0xe2, 0x05, 0x6d, 0xb3, 0x47, 0x9b, 0xa0, 0x93,
+	0x66, 0x5f, 0x75, 0x12, 0x3b, 0x43, 0xd8, 0xfd, 0x83, 0x53, 0x25, 0x1e, 0x00, 0xcc, 0xf3, 0xa9,
+	0xb6, 0x17, 0x3c, 0x83, 0x5f, 0x3a, 0x6c, 0xcf, 0x65, 0x9f, 0x02, 0x1a, 0x24, 0x98, 0x23, 0x01,
+	0xbd, 0xe6, 0x97, 0x41, 0x47, 0x4b, 0xa6, 0xb4, 0xfc, 0x9f, 0xb4, 0x07, 0xab, 0x48, 0xea, 0x46,
+	0x9d, 0xff, 0x50, 0x02, 0x9d, 0x72, 0x50, 0xe8, 0xc9, 0x4a, 0x67, 0x6d, 0xbb, 0xb7, 0xc5, 0x67,
+	0x85, 0x42, 0x30, 0x4e, 0xb1, 0x44, 0x8f, 0x97, 0x08, 0xdb, 0x06, 0x6e, 0x1f, 0xde, 0x0e, 0x6e,
+	0x6a, 0x8c, 0xbe, 0x41, 0x3f, 0x62, 0xa9, 0xdb, 0xdc, 0x92, 0x6d, 0xda, 0x73, 0xed, 0xcb, 0xf1,
+	0xea, 0xb7, 0xe8, 0x89, 0x7a, 0x0d, 0xbb, 0xd5, 0xed, 0xf8, 0xec, 0x77, 0x00, 0x00, 0x00, 0xff,
+	0xff, 0x3b, 0xa1, 0x83, 0x12, 0xe6, 0x05, 0x00, 0x00,
 }
diff --git a/charonrpc/permission.proto b/pb/rpc/charond/v1/permission.proto
similarity index 76%
rename from charonrpc/permission.proto
rename to pb/rpc/charond/v1/permission.proto
index 0fe7163..11d5019 100644
--- a/charonrpc/permission.proto
+++ b/pb/rpc/charond/v1/permission.proto
@@ -1,52 +1,54 @@
-syntax = "proto3";
-
-package charonrpc;
-
-option go_package = "github.com/piotrkowalczuk/charon/charonrpc";
-
-import "charonrpc/common.proto";
-import "qtypes/qtypes.proto";
-import "ntypes/ntypes.proto";
-
-service PermissionManager {
-    rpc Register(RegisterPermissionsRequest) returns (RegisterPermissionsResponse) {};
-    rpc List(ListPermissionsRequest) returns (ListPermissionsResponse) {};
-    rpc Get(GetPermissionRequest) returns (GetPermissionResponse) {};
-}
-
-message RegisterPermissionsRequest {
-    repeated string permissions = 1;
-}
-
-message RegisterPermissionsResponse {
-    int64 created = 1;
-    int64 removed = 2;
-    int64 untouched = 3;
-}
-
-message ListPermissionsRequest {
-    reserved 6 to 99;
-
-    qtypes.String subsystem = 1;
-    qtypes.String module = 2;
-    qtypes.String action = 3;
-    qtypes.Timestamp created_at = 4;
-    qtypes.Int64 created_by = 5;
-
-    ntypes.Int64 offset = 100;
-    ntypes.Int64 limit = 101;
-    map<string, bool> sort = 102 [deprecated=true];
-    repeated Order order_by = 103;
-}
-
-message ListPermissionsResponse {
-    repeated string permissions = 1;
-}
-
-message GetPermissionRequest {
-    int64 id = 1;
-}
-
-message GetPermissionResponse {
-    string permission = 1;
-}
+syntax = "proto3";
+
+package charon.rpc.charond.v1;
+
+option go_package = "github.com/piotrkowalczuk/charon/pb/rpc/charond/v1;charond";
+option java_multiple_files = true;
+option java_package = "com.github.charon.rpc.charond.v1";
+
+import "github.com/piotrkowalczuk/charon/pb/rpc/charond/v1/common.proto";
+import "qtypes/qtypes.proto";
+import "ntypes/ntypes.proto";
+
+service PermissionManager {
+    rpc Register(RegisterPermissionsRequest) returns (RegisterPermissionsResponse) {};
+    rpc List(ListPermissionsRequest) returns (ListPermissionsResponse) {};
+    rpc Get(GetPermissionRequest) returns (GetPermissionResponse) {};
+}
+
+message RegisterPermissionsRequest {
+    repeated string permissions = 1;
+}
+
+message RegisterPermissionsResponse {
+    int64 created = 1;
+    int64 removed = 2;
+    int64 untouched = 3;
+}
+
+message ListPermissionsRequest {
+    reserved 6 to 99;
+
+    qtypes.String subsystem = 1;
+    qtypes.String module = 2;
+    qtypes.String action = 3;
+    qtypes.Timestamp created_at = 4;
+    qtypes.Int64 created_by = 5;
+
+    ntypes.Int64 offset = 100;
+    ntypes.Int64 limit = 101;
+    map<string, bool> sort = 102 [deprecated=true];
+    repeated Order order_by = 103;
+}
+
+message ListPermissionsResponse {
+    repeated string permissions = 1;
+}
+
+message GetPermissionRequest {
+    int64 id = 1;
+}
+
+message GetPermissionResponse {
+    string permission = 1;
+}
diff --git a/charonrpc/refresh_token.pb.go b/pb/rpc/charond/v1/refresh_token.pb.go
similarity index 71%
rename from charonrpc/refresh_token.pb.go
rename to pb/rpc/charond/v1/refresh_token.pb.go
index 098568b..3243957 100644
--- a/charonrpc/refresh_token.pb.go
+++ b/pb/rpc/charond/v1/refresh_token.pb.go
@@ -1,17 +1,17 @@
 // Code generated by protoc-gen-go. DO NOT EDIT.
-// source: charonrpc/refresh_token.proto
+// source: github.com/piotrkowalczuk/charon/pb/rpc/charond/v1/refresh_token.proto
 
-package charonrpc
+package charond // import "github.com/piotrkowalczuk/charon/pb/rpc/charond/v1"
+
+import proto "github.com/golang/protobuf/proto"
+import fmt "fmt"
+import math "math"
+import timestamp "github.com/golang/protobuf/ptypes/timestamp"
+import ntypes "github.com/piotrkowalczuk/ntypes"
+import qtypes "github.com/piotrkowalczuk/qtypes"
 
 import (
-	context "context"
-	fmt "fmt"
-	math "math"
-
-	proto "github.com/golang/protobuf/proto"
-	timestamp "github.com/golang/protobuf/ptypes/timestamp"
-	ntypes "github.com/piotrkowalczuk/ntypes"
-	qtypes "github.com/piotrkowalczuk/qtypes"
+	context "golang.org/x/net/context"
 	grpc "google.golang.org/grpc"
 )
 
@@ -46,17 +46,16 @@ func (m *RefreshToken) Reset()         { *m = RefreshToken{} }
 func (m *RefreshToken) String() string { return proto.CompactTextString(m) }
 func (*RefreshToken) ProtoMessage()    {}
 func (*RefreshToken) Descriptor() ([]byte, []int) {
-	return fileDescriptor_5540bd1101661962, []int{0}
+	return fileDescriptor_refresh_token_1e8e54ee3f1fef8c, []int{0}
 }
-
 func (m *RefreshToken) XXX_Unmarshal(b []byte) error {
 	return xxx_messageInfo_RefreshToken.Unmarshal(m, b)
 }
 func (m *RefreshToken) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
 	return xxx_messageInfo_RefreshToken.Marshal(b, m, deterministic)
 }
-func (m *RefreshToken) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_RefreshToken.Merge(m, src)
+func (dst *RefreshToken) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_RefreshToken.Merge(dst, src)
 }
 func (m *RefreshToken) XXX_Size() int {
 	return xxx_messageInfo_RefreshToken.Size(m)
@@ -154,17 +153,16 @@ func (m *RefreshTokenQuery) Reset()         { *m = RefreshTokenQuery{} }
 func (m *RefreshTokenQuery) String() string { return proto.CompactTextString(m) }
 func (*RefreshTokenQuery) ProtoMessage()    {}
 func (*RefreshTokenQuery) Descriptor() ([]byte, []int) {
-	return fileDescriptor_5540bd1101661962, []int{1}
+	return fileDescriptor_refresh_token_1e8e54ee3f1fef8c, []int{1}
 }
-
 func (m *RefreshTokenQuery) XXX_Unmarshal(b []byte) error {
 	return xxx_messageInfo_RefreshTokenQuery.Unmarshal(m, b)
 }
 func (m *RefreshTokenQuery) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
 	return xxx_messageInfo_RefreshTokenQuery.Marshal(b, m, deterministic)
 }
-func (m *RefreshTokenQuery) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_RefreshTokenQuery.Merge(m, src)
+func (dst *RefreshTokenQuery) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_RefreshTokenQuery.Merge(dst, src)
 }
 func (m *RefreshTokenQuery) XXX_Size() int {
 	return xxx_messageInfo_RefreshTokenQuery.Size(m)
@@ -236,17 +234,16 @@ func (m *CreateRefreshTokenRequest) Reset()         { *m = CreateRefreshTokenReq
 func (m *CreateRefreshTokenRequest) String() string { return proto.CompactTextString(m) }
 func (*CreateRefreshTokenRequest) ProtoMessage()    {}
 func (*CreateRefreshTokenRequest) Descriptor() ([]byte, []int) {
-	return fileDescriptor_5540bd1101661962, []int{2}
+	return fileDescriptor_refresh_token_1e8e54ee3f1fef8c, []int{2}
 }
-
 func (m *CreateRefreshTokenRequest) XXX_Unmarshal(b []byte) error {
 	return xxx_messageInfo_CreateRefreshTokenRequest.Unmarshal(m, b)
 }
 func (m *CreateRefreshTokenRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
 	return xxx_messageInfo_CreateRefreshTokenRequest.Marshal(b, m, deterministic)
 }
-func (m *CreateRefreshTokenRequest) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_CreateRefreshTokenRequest.Merge(m, src)
+func (dst *CreateRefreshTokenRequest) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_CreateRefreshTokenRequest.Merge(dst, src)
 }
 func (m *CreateRefreshTokenRequest) XXX_Size() int {
 	return xxx_messageInfo_CreateRefreshTokenRequest.Size(m)
@@ -282,17 +279,16 @@ func (m *CreateRefreshTokenResponse) Reset()         { *m = CreateRefreshTokenRe
 func (m *CreateRefreshTokenResponse) String() string { return proto.CompactTextString(m) }
 func (*CreateRefreshTokenResponse) ProtoMessage()    {}
 func (*CreateRefreshTokenResponse) Descriptor() ([]byte, []int) {
-	return fileDescriptor_5540bd1101661962, []int{3}
+	return fileDescriptor_refresh_token_1e8e54ee3f1fef8c, []int{3}
 }
-
 func (m *CreateRefreshTokenResponse) XXX_Unmarshal(b []byte) error {
 	return xxx_messageInfo_CreateRefreshTokenResponse.Unmarshal(m, b)
 }
 func (m *CreateRefreshTokenResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
 	return xxx_messageInfo_CreateRefreshTokenResponse.Marshal(b, m, deterministic)
 }
-func (m *CreateRefreshTokenResponse) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_CreateRefreshTokenResponse.Merge(m, src)
+func (dst *CreateRefreshTokenResponse) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_CreateRefreshTokenResponse.Merge(dst, src)
 }
 func (m *CreateRefreshTokenResponse) XXX_Size() int {
 	return xxx_messageInfo_CreateRefreshTokenResponse.Size(m)
@@ -324,17 +320,16 @@ func (m *ListRefreshTokensRequest) Reset()         { *m = ListRefreshTokensReque
 func (m *ListRefreshTokensRequest) String() string { return proto.CompactTextString(m) }
 func (*ListRefreshTokensRequest) ProtoMessage()    {}
 func (*ListRefreshTokensRequest) Descriptor() ([]byte, []int) {
-	return fileDescriptor_5540bd1101661962, []int{4}
+	return fileDescriptor_refresh_token_1e8e54ee3f1fef8c, []int{4}
 }
-
 func (m *ListRefreshTokensRequest) XXX_Unmarshal(b []byte) error {
 	return xxx_messageInfo_ListRefreshTokensRequest.Unmarshal(m, b)
 }
 func (m *ListRefreshTokensRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
 	return xxx_messageInfo_ListRefreshTokensRequest.Marshal(b, m, deterministic)
 }
-func (m *ListRefreshTokensRequest) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_ListRefreshTokensRequest.Merge(m, src)
+func (dst *ListRefreshTokensRequest) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_ListRefreshTokensRequest.Merge(dst, src)
 }
 func (m *ListRefreshTokensRequest) XXX_Size() int {
 	return xxx_messageInfo_ListRefreshTokensRequest.Size(m)
@@ -384,17 +379,16 @@ func (m *ListRefreshTokensResponse) Reset()         { *m = ListRefreshTokensResp
 func (m *ListRefreshTokensResponse) String() string { return proto.CompactTextString(m) }
 func (*ListRefreshTokensResponse) ProtoMessage()    {}
 func (*ListRefreshTokensResponse) Descriptor() ([]byte, []int) {
-	return fileDescriptor_5540bd1101661962, []int{5}
+	return fileDescriptor_refresh_token_1e8e54ee3f1fef8c, []int{5}
 }
-
 func (m *ListRefreshTokensResponse) XXX_Unmarshal(b []byte) error {
 	return xxx_messageInfo_ListRefreshTokensResponse.Unmarshal(m, b)
 }
 func (m *ListRefreshTokensResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
 	return xxx_messageInfo_ListRefreshTokensResponse.Marshal(b, m, deterministic)
 }
-func (m *ListRefreshTokensResponse) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_ListRefreshTokensResponse.Merge(m, src)
+func (dst *ListRefreshTokensResponse) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_ListRefreshTokensResponse.Merge(dst, src)
 }
 func (m *ListRefreshTokensResponse) XXX_Size() int {
 	return xxx_messageInfo_ListRefreshTokensResponse.Size(m)
@@ -424,17 +418,16 @@ func (m *RevokeRefreshTokenRequest) Reset()         { *m = RevokeRefreshTokenReq
 func (m *RevokeRefreshTokenRequest) String() string { return proto.CompactTextString(m) }
 func (*RevokeRefreshTokenRequest) ProtoMessage()    {}
 func (*RevokeRefreshTokenRequest) Descriptor() ([]byte, []int) {
-	return fileDescriptor_5540bd1101661962, []int{6}
+	return fileDescriptor_refresh_token_1e8e54ee3f1fef8c, []int{6}
 }
-
 func (m *RevokeRefreshTokenRequest) XXX_Unmarshal(b []byte) error {
 	return xxx_messageInfo_RevokeRefreshTokenRequest.Unmarshal(m, b)
 }
 func (m *RevokeRefreshTokenRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
 	return xxx_messageInfo_RevokeRefreshTokenRequest.Marshal(b, m, deterministic)
 }
-func (m *RevokeRefreshTokenRequest) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_RevokeRefreshTokenRequest.Merge(m, src)
+func (dst *RevokeRefreshTokenRequest) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_RevokeRefreshTokenRequest.Merge(dst, src)
 }
 func (m *RevokeRefreshTokenRequest) XXX_Size() int {
 	return xxx_messageInfo_RevokeRefreshTokenRequest.Size(m)
@@ -470,17 +463,16 @@ func (m *RevokeRefreshTokenResponse) Reset()         { *m = RevokeRefreshTokenRe
 func (m *RevokeRefreshTokenResponse) String() string { return proto.CompactTextString(m) }
 func (*RevokeRefreshTokenResponse) ProtoMessage()    {}
 func (*RevokeRefreshTokenResponse) Descriptor() ([]byte, []int) {
-	return fileDescriptor_5540bd1101661962, []int{7}
+	return fileDescriptor_refresh_token_1e8e54ee3f1fef8c, []int{7}
 }
-
 func (m *RevokeRefreshTokenResponse) XXX_Unmarshal(b []byte) error {
 	return xxx_messageInfo_RevokeRefreshTokenResponse.Unmarshal(m, b)
 }
 func (m *RevokeRefreshTokenResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
 	return xxx_messageInfo_RevokeRefreshTokenResponse.Marshal(b, m, deterministic)
 }
-func (m *RevokeRefreshTokenResponse) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_RevokeRefreshTokenResponse.Merge(m, src)
+func (dst *RevokeRefreshTokenResponse) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_RevokeRefreshTokenResponse.Merge(dst, src)
 }
 func (m *RevokeRefreshTokenResponse) XXX_Size() int {
 	return xxx_messageInfo_RevokeRefreshTokenResponse.Size(m)
@@ -499,64 +491,14 @@ func (m *RevokeRefreshTokenResponse) GetRefreshToken() *RefreshToken {
 }
 
 func init() {
-	proto.RegisterType((*RefreshToken)(nil), "charonrpc.RefreshToken")
-	proto.RegisterType((*RefreshTokenQuery)(nil), "charonrpc.RefreshTokenQuery")
-	proto.RegisterType((*CreateRefreshTokenRequest)(nil), "charonrpc.CreateRefreshTokenRequest")
-	proto.RegisterType((*CreateRefreshTokenResponse)(nil), "charonrpc.CreateRefreshTokenResponse")
-	proto.RegisterType((*ListRefreshTokensRequest)(nil), "charonrpc.ListRefreshTokensRequest")
-	proto.RegisterType((*ListRefreshTokensResponse)(nil), "charonrpc.ListRefreshTokensResponse")
-	proto.RegisterType((*RevokeRefreshTokenRequest)(nil), "charonrpc.RevokeRefreshTokenRequest")
-	proto.RegisterType((*RevokeRefreshTokenResponse)(nil), "charonrpc.RevokeRefreshTokenResponse")
-}
-
-func init() { proto.RegisterFile("charonrpc/refresh_token.proto", fileDescriptor_5540bd1101661962) }
-
-var fileDescriptor_5540bd1101661962 = []byte{
-	// 704 bytes of a gzipped FileDescriptorProto
-	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xac, 0x54, 0x4d, 0x6b, 0xdb, 0x4a,
-	0x14, 0x8d, 0xfc, 0xed, 0x6b, 0x27, 0x24, 0x93, 0xc7, 0x8b, 0x22, 0xde, 0xe3, 0x19, 0xe5, 0x03,
-	0xf3, 0x1a, 0xa4, 0xe0, 0x94, 0x96, 0x42, 0x28, 0xc4, 0x5d, 0x25, 0xb4, 0x94, 0x2a, 0x29, 0x85,
-	0x74, 0x61, 0x64, 0x6b, 0xec, 0x08, 0xdb, 0x1a, 0x79, 0x66, 0xd4, 0x56, 0xf9, 0x2d, 0xfd, 0x3d,
-	0xdd, 0x75, 0xd3, 0x5f, 0x54, 0xa4, 0x91, 0xec, 0x51, 0x2a, 0xc5, 0x5d, 0x74, 0x65, 0x46, 0xf7,
-	0x9c, 0x33, 0xf7, 0xde, 0x73, 0x3c, 0xf0, 0xef, 0xe8, 0xce, 0xa6, 0xc4, 0xa3, 0xfe, 0xc8, 0xa4,
-	0x78, 0x4c, 0x31, 0xbb, 0x1b, 0x70, 0x32, 0xc5, 0x9e, 0xe1, 0x53, 0xc2, 0x09, 0x6a, 0x2e, 0xcb,
-	0xda, 0x7f, 0x13, 0x42, 0x26, 0x33, 0x6c, 0xc6, 0x85, 0x61, 0x30, 0x36, 0xb9, 0x3b, 0xc7, 0x8c,
-	0xdb, 0x73, 0x5f, 0x60, 0xb5, 0xbf, 0x57, 0x52, 0x23, 0x32, 0x9f, 0x93, 0x44, 0x43, 0xdb, 0x5d,
-	0xf0, 0xd0, 0xc7, 0xcc, 0x14, 0x3f, 0xe9, 0x47, 0x4f, 0x7c, 0xf4, 0xa4, 0x8f, 0xfa, 0xb7, 0x32,
-	0xb4, 0x2d, 0xd1, 0xc5, 0x4d, 0xd4, 0x04, 0xfa, 0x0b, 0xaa, 0x71, 0x37, 0xaa, 0xd2, 0x51, 0xba,
-	0x4d, 0x4b, 0x1c, 0xd0, 0x21, 0x54, 0x3d, 0xc2, 0x31, 0x53, 0x4b, 0x1d, 0xa5, 0xdb, 0xea, 0x6d,
-	0x19, 0x89, 0xc8, 0x35, 0xa7, 0xae, 0x37, 0xb1, 0x44, 0x11, 0xed, 0x41, 0x3d, 0x60, 0x98, 0x0e,
-	0x5c, 0x47, 0x2d, 0x77, 0x94, 0x6e, 0xd9, 0xaa, 0x45, 0xc7, 0x4b, 0x07, 0xa9, 0x50, 0xa7, 0xf8,
-	0x13, 0x99, 0x62, 0x47, 0xad, 0x74, 0x94, 0x6e, 0xc3, 0x4a, 0x8f, 0xe8, 0x39, 0x34, 0xf1, 0x17,
-	0xdf, 0xa5, 0x78, 0x60, 0x73, 0xb5, 0x1a, 0x8b, 0x6b, 0x86, 0x18, 0xdb, 0x48, 0xc7, 0x36, 0x6e,
-	0xd2, 0xb1, 0xad, 0x86, 0x00, 0x5f, 0x70, 0x74, 0x0e, 0xed, 0x99, 0xcd, 0xf8, 0x20, 0x60, 0xd8,
-	0x89, 0xb8, 0xb5, 0xb5, 0x5c, 0x88, 0xf0, 0xef, 0x19, 0x76, 0x2e, 0x38, 0x7a, 0x01, 0x30, 0xa2,
-	0xd8, 0xe6, 0x82, 0x5b, 0x5f, 0xcb, 0x6d, 0x26, 0xe8, 0x0b, 0x8e, 0x4e, 0x56, 0xd4, 0x61, 0xa8,
-	0x36, 0x62, 0xea, 0x66, 0xba, 0x8f, 0x4b, 0x8f, 0x3f, 0x7b, 0xba, 0x44, 0xf7, 0xc3, 0xe8, 0xa2,
-	0xc0, 0x77, 0xd2, 0x8b, 0x9a, 0xeb, 0x2f, 0x4a, 0xd0, 0xe2, 0xa2, 0x94, 0x3a, 0x0c, 0x55, 0xc8,
-	0xbd, 0x28, 0x01, 0xf4, 0x43, 0xfd, 0x47, 0x09, 0x76, 0x64, 0x23, 0xdf, 0x05, 0x98, 0x86, 0xe8,
-	0x78, 0xe5, 0x88, 0x92, 0x08, 0x2c, 0x64, 0x81, 0xd4, 0xa0, 0x5f, 0xfc, 0x5d, 0xe4, 0xf9, 0x7b,
-	0xbc, 0xb2, 0xb1, 0x1c, 0xe3, 0xda, 0x69, 0x3b, 0x7d, 0x42, 0x66, 0x2b, 0x53, 0x0d, 0xd9, 0xd4,
-	0x4a, 0x8c, 0xdc, 0x49, 0x15, 0xf3, 0xbc, 0x3c, 0x7b, 0xe0, 0x65, 0xb5, 0x88, 0x22, 0x5b, 0x78,
-	0x9a, 0xb1, 0xb0, 0x56, 0x44, 0x91, 0x9c, 0x3b, 0xcd, 0x78, 0x51, 0x2f, 0x64, 0x2c, 0x2d, 0xd0,
-	0xef, 0x61, 0xff, 0x55, 0x4c, 0x97, 0x37, 0x6b, 0xe1, 0x45, 0x80, 0x19, 0x5f, 0xed, 0x4c, 0x79,
-	0xec, 0x3f, 0x91, 0x09, 0x78, 0xe9, 0xf7, 0x03, 0xae, 0xdf, 0x82, 0x96, 0x77, 0x37, 0xf3, 0x89,
-	0xc7, 0x30, 0x3a, 0x87, 0xcd, 0xcc, 0xe3, 0x91, 0x34, 0xb1, 0x67, 0x2c, 0x5f, 0x04, 0x23, 0xc3,
-	0x6b, 0x53, 0xe9, 0xa4, 0x7f, 0x57, 0x40, 0x7d, 0xed, 0x32, 0x2e, 0x43, 0x58, 0x3a, 0xd7, 0x11,
-	0xd4, 0xc8, 0x78, 0xcc, 0x30, 0x5f, 0x46, 0x26, 0x93, 0xb9, 0xa4, 0x88, 0x0e, 0xa0, 0x3a, 0x73,
-	0xe7, 0x6e, 0x3a, 0xd4, 0x03, 0x94, 0xa8, 0xa1, 0x27, 0xd0, 0x20, 0xd4, 0xc1, 0x34, 0x4a, 0x70,
-	0xb9, 0x53, 0xee, 0xb6, 0x7a, 0xdb, 0x52, 0x87, 0x6f, 0xa3, 0x92, 0x55, 0x8f, 0x11, 0xfd, 0x10,
-	0xf5, 0xa0, 0xba, 0x88, 0x52, 0xab, 0xb6, 0x62, 0xc5, 0x7f, 0x0a, 0x66, 0x89, 0x93, 0x6d, 0x09,
-	0xe8, 0x55, 0xa5, 0x51, 0xd9, 0x6e, 0xe9, 0x1f, 0x61, 0x3f, 0x67, 0x9c, 0x64, 0x55, 0x2f, 0x61,
-	0x2b, 0xb3, 0xaa, 0xc8, 0xb0, 0xf2, 0x63, 0xbb, 0xda, 0x94, 0x77, 0xc5, 0xf4, 0x2b, 0xd8, 0xb7,
-	0xe2, 0x60, 0xe7, 0x85, 0x20, 0xff, 0xb9, 0x94, 0x1e, 0xc2, 0x92, 0xfc, 0x10, 0x46, 0xa6, 0xe6,
-	0x69, 0xfd, 0x09, 0x53, 0x7b, 0x5f, 0x4b, 0xb0, 0x2b, 0x97, 0xdf, 0xd8, 0x9e, 0x3d, 0xc1, 0x14,
-	0x7d, 0x80, 0x9a, 0x08, 0x12, 0x3a, 0x94, 0x84, 0x0a, 0x73, 0xad, 0x1d, 0xad, 0x41, 0x89, 0x66,
-	0xf5, 0x8d, 0x48, 0x58, 0x0c, 0x93, 0x11, 0x2e, 0xdc, 0x55, 0x46, 0xb8, 0x78, 0x0b, 0xfa, 0x06,
-	0xba, 0x86, 0x4a, 0x64, 0x27, 0x3a, 0x90, 0x08, 0x45, 0x71, 0xd5, 0x0e, 0x1f, 0x07, 0xa5, 0xa2,
-	0xfd, 0x93, 0xdb, 0xff, 0x27, 0x2e, 0xbf, 0x0b, 0x86, 0xc6, 0x88, 0xcc, 0x4d, 0xdf, 0x25, 0x9c,
-	0x4e, 0xc9, 0x67, 0x7b, 0x36, 0xba, 0x0f, 0xa6, 0xa6, 0x90, 0x30, 0x97, 0x4a, 0xc3, 0x5a, 0xfc,
-	0xdf, 0x3c, 0xfb, 0x19, 0x00, 0x00, 0xff, 0xff, 0xca, 0xef, 0xaa, 0x55, 0xad, 0x07, 0x00, 0x00,
+	proto.RegisterType((*RefreshToken)(nil), "charon.rpc.charond.v1.RefreshToken")
+	proto.RegisterType((*RefreshTokenQuery)(nil), "charon.rpc.charond.v1.RefreshTokenQuery")
+	proto.RegisterType((*CreateRefreshTokenRequest)(nil), "charon.rpc.charond.v1.CreateRefreshTokenRequest")
+	proto.RegisterType((*CreateRefreshTokenResponse)(nil), "charon.rpc.charond.v1.CreateRefreshTokenResponse")
+	proto.RegisterType((*ListRefreshTokensRequest)(nil), "charon.rpc.charond.v1.ListRefreshTokensRequest")
+	proto.RegisterType((*ListRefreshTokensResponse)(nil), "charon.rpc.charond.v1.ListRefreshTokensResponse")
+	proto.RegisterType((*RevokeRefreshTokenRequest)(nil), "charon.rpc.charond.v1.RevokeRefreshTokenRequest")
+	proto.RegisterType((*RevokeRefreshTokenResponse)(nil), "charon.rpc.charond.v1.RevokeRefreshTokenResponse")
 }
 
 // Reference imports to suppress errors if they are not otherwise used.
@@ -586,7 +528,7 @@ func NewRefreshTokenManagerClient(cc *grpc.ClientConn) RefreshTokenManagerClient
 
 func (c *refreshTokenManagerClient) Create(ctx context.Context, in *CreateRefreshTokenRequest, opts ...grpc.CallOption) (*CreateRefreshTokenResponse, error) {
 	out := new(CreateRefreshTokenResponse)
-	err := c.cc.Invoke(ctx, "/charonrpc.RefreshTokenManager/Create", in, out, opts...)
+	err := c.cc.Invoke(ctx, "/charon.rpc.charond.v1.RefreshTokenManager/Create", in, out, opts...)
 	if err != nil {
 		return nil, err
 	}
@@ -595,7 +537,7 @@ func (c *refreshTokenManagerClient) Create(ctx context.Context, in *CreateRefres
 
 func (c *refreshTokenManagerClient) Revoke(ctx context.Context, in *RevokeRefreshTokenRequest, opts ...grpc.CallOption) (*RevokeRefreshTokenResponse, error) {
 	out := new(RevokeRefreshTokenResponse)
-	err := c.cc.Invoke(ctx, "/charonrpc.RefreshTokenManager/Revoke", in, out, opts...)
+	err := c.cc.Invoke(ctx, "/charon.rpc.charond.v1.RefreshTokenManager/Revoke", in, out, opts...)
 	if err != nil {
 		return nil, err
 	}
@@ -604,7 +546,7 @@ func (c *refreshTokenManagerClient) Revoke(ctx context.Context, in *RevokeRefres
 
 func (c *refreshTokenManagerClient) List(ctx context.Context, in *ListRefreshTokensRequest, opts ...grpc.CallOption) (*ListRefreshTokensResponse, error) {
 	out := new(ListRefreshTokensResponse)
-	err := c.cc.Invoke(ctx, "/charonrpc.RefreshTokenManager/List", in, out, opts...)
+	err := c.cc.Invoke(ctx, "/charon.rpc.charond.v1.RefreshTokenManager/List", in, out, opts...)
 	if err != nil {
 		return nil, err
 	}
@@ -632,7 +574,7 @@ func _RefreshTokenManager_Create_Handler(srv interface{}, ctx context.Context, d
 	}
 	info := &grpc.UnaryServerInfo{
 		Server:     srv,
-		FullMethod: "/charonrpc.RefreshTokenManager/Create",
+		FullMethod: "/charon.rpc.charond.v1.RefreshTokenManager/Create",
 	}
 	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
 		return srv.(RefreshTokenManagerServer).Create(ctx, req.(*CreateRefreshTokenRequest))
@@ -650,7 +592,7 @@ func _RefreshTokenManager_Revoke_Handler(srv interface{}, ctx context.Context, d
 	}
 	info := &grpc.UnaryServerInfo{
 		Server:     srv,
-		FullMethod: "/charonrpc.RefreshTokenManager/Revoke",
+		FullMethod: "/charon.rpc.charond.v1.RefreshTokenManager/Revoke",
 	}
 	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
 		return srv.(RefreshTokenManagerServer).Revoke(ctx, req.(*RevokeRefreshTokenRequest))
@@ -668,7 +610,7 @@ func _RefreshTokenManager_List_Handler(srv interface{}, ctx context.Context, dec
 	}
 	info := &grpc.UnaryServerInfo{
 		Server:     srv,
-		FullMethod: "/charonrpc.RefreshTokenManager/List",
+		FullMethod: "/charon.rpc.charond.v1.RefreshTokenManager/List",
 	}
 	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
 		return srv.(RefreshTokenManagerServer).List(ctx, req.(*ListRefreshTokensRequest))
@@ -677,7 +619,7 @@ func _RefreshTokenManager_List_Handler(srv interface{}, ctx context.Context, dec
 }
 
 var _RefreshTokenManager_serviceDesc = grpc.ServiceDesc{
-	ServiceName: "charonrpc.RefreshTokenManager",
+	ServiceName: "charon.rpc.charond.v1.RefreshTokenManager",
 	HandlerType: (*RefreshTokenManagerServer)(nil),
 	Methods: []grpc.MethodDesc{
 		{
@@ -694,5 +636,60 @@ var _RefreshTokenManager_serviceDesc = grpc.ServiceDesc{
 		},
 	},
 	Streams:  []grpc.StreamDesc{},
-	Metadata: "charonrpc/refresh_token.proto",
+	Metadata: "github.com/piotrkowalczuk/charon/pb/rpc/charond/v1/refresh_token.proto",
+}
+
+func init() {
+	proto.RegisterFile("github.com/piotrkowalczuk/charon/pb/rpc/charond/v1/refresh_token.proto", fileDescriptor_refresh_token_1e8e54ee3f1fef8c)
+}
+
+var fileDescriptor_refresh_token_1e8e54ee3f1fef8c = []byte{
+	// 737 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xac, 0x55, 0xdd, 0x6e, 0xd3, 0x4a,
+	0x10, 0xae, 0xf3, 0x9f, 0x49, 0x5a, 0x9d, 0x6e, 0xcf, 0xd1, 0x71, 0x23, 0x24, 0x22, 0x17, 0xaa,
+	0x5c, 0x20, 0x3b, 0x6d, 0x11, 0x15, 0x3f, 0x02, 0x35, 0x48, 0x88, 0x56, 0x20, 0xc0, 0x94, 0x1b,
+	0x6e, 0x82, 0x63, 0x6f, 0x52, 0x2b, 0x89, 0xd7, 0xd9, 0x5d, 0x17, 0xdc, 0x07, 0xe4, 0x01, 0x78,
+	0x06, 0x78, 0x0f, 0x64, 0xaf, 0xb7, 0xb1, 0x8b, 0x4d, 0x53, 0xc4, 0x55, 0xb2, 0xbb, 0xdf, 0x37,
+	0xb3, 0x33, 0xdf, 0xb7, 0x63, 0x78, 0x31, 0x71, 0xf9, 0x59, 0x30, 0xd2, 0x6d, 0x32, 0x37, 0x7c,
+	0x97, 0x70, 0x3a, 0x25, 0x9f, 0xad, 0x99, 0x7d, 0x11, 0x4c, 0x0d, 0xfb, 0xcc, 0xa2, 0xc4, 0x33,
+	0xfc, 0x91, 0x41, 0x7d, 0x3b, 0x59, 0x39, 0xc6, 0xf9, 0x9e, 0x41, 0xf1, 0x98, 0x62, 0x76, 0x36,
+	0xe4, 0x64, 0x8a, 0x3d, 0xdd, 0xa7, 0x84, 0x13, 0xf4, 0x9f, 0x38, 0xd7, 0xa9, 0x6f, 0xeb, 0x09,
+	0x54, 0x3f, 0xdf, 0xeb, 0xdc, 0x9e, 0x10, 0x32, 0x99, 0x61, 0x23, 0x06, 0x8d, 0x82, 0xb1, 0xc1,
+	0xdd, 0x39, 0x66, 0xdc, 0x9a, 0xfb, 0x82, 0xd7, 0x79, 0xf6, 0x07, 0xf9, 0x6d, 0x32, 0x9f, 0x93,
+	0x24, 0x71, 0x67, 0x6b, 0xc1, 0x43, 0x1f, 0x33, 0x43, 0xfc, 0xc8, 0x4d, 0x4f, 0x6c, 0x7a, 0xa9,
+	0x4d, 0xed, 0x6b, 0x19, 0xda, 0xa6, 0xb8, 0xfa, 0x69, 0x74, 0x73, 0xf4, 0x2f, 0x54, 0xe3, 0x12,
+	0x54, 0xa5, 0xab, 0xf4, 0x9a, 0xa6, 0x58, 0xa0, 0x3b, 0x50, 0xf5, 0x08, 0xc7, 0x4c, 0x2d, 0x75,
+	0x95, 0x5e, 0x6b, 0x7f, 0x43, 0x4f, 0x82, 0xbc, 0xe7, 0xd4, 0xf5, 0x26, 0xa6, 0x38, 0x44, 0xff,
+	0x43, 0x3d, 0x60, 0x98, 0x0e, 0x5d, 0x47, 0x2d, 0x77, 0x95, 0x5e, 0xd9, 0xac, 0x45, 0xcb, 0x63,
+	0x07, 0xa9, 0x50, 0xa7, 0xf8, 0x9c, 0x4c, 0xb1, 0xa3, 0x56, 0xba, 0x4a, 0xaf, 0x61, 0xca, 0x25,
+	0x3a, 0x84, 0x26, 0xfe, 0xe2, 0xbb, 0x14, 0x0f, 0x2d, 0xae, 0x56, 0xe3, 0xe0, 0x1d, 0x5d, 0xf4,
+	0x47, 0x97, 0xfd, 0xd1, 0x4f, 0x65, 0x7f, 0xcc, 0x86, 0x00, 0x1f, 0x71, 0xf4, 0x04, 0xda, 0x33,
+	0x8b, 0xf1, 0x61, 0xc0, 0xb0, 0x13, 0x71, 0x6b, 0xd7, 0x72, 0x21, 0xc2, 0x7f, 0x60, 0xd8, 0x39,
+	0xe2, 0xe8, 0x21, 0x80, 0x4d, 0xb1, 0xc5, 0x05, 0xb7, 0x7e, 0x2d, 0xb7, 0x99, 0xa0, 0x8f, 0x38,
+	0xba, 0xb7, 0xa4, 0x8e, 0x42, 0xb5, 0x11, 0x53, 0xd7, 0x65, 0x3f, 0x8e, 0x3d, 0xfe, 0xe0, 0xfe,
+	0x25, 0x7a, 0x10, 0x46, 0x89, 0x02, 0xdf, 0x91, 0x89, 0x9a, 0xd7, 0x27, 0x4a, 0xd0, 0x22, 0x91,
+	0xa4, 0x8e, 0x42, 0x15, 0x72, 0x13, 0x25, 0x80, 0x41, 0xa8, 0x7d, 0x2b, 0xc1, 0x66, 0x5a, 0xc8,
+	0x77, 0x01, 0xa6, 0x21, 0xda, 0x5d, 0x2a, 0xa2, 0x24, 0x01, 0x16, 0xe9, 0x00, 0x52, 0xa0, 0x5f,
+	0xf4, 0x5d, 0xe4, 0xe9, 0xbb, 0xbb, 0x94, 0xb1, 0x1c, 0xe3, 0xda, 0xf2, 0x3a, 0x03, 0x42, 0x66,
+	0x4b, 0x51, 0xf5, 0xb4, 0xa8, 0x95, 0x18, 0xb9, 0x29, 0x23, 0xe6, 0x69, 0x79, 0x70, 0x45, 0xcb,
+	0x6a, 0x11, 0x25, 0x2d, 0x61, 0x3f, 0x23, 0x61, 0xad, 0x88, 0x92, 0x52, 0xae, 0x9f, 0xd1, 0xa2,
+	0x5e, 0xc8, 0xb8, 0x94, 0x40, 0xbb, 0x80, 0xed, 0xe7, 0x31, 0x3d, 0xdd, 0x59, 0x13, 0x2f, 0x02,
+	0xcc, 0xf8, 0xb2, 0x67, 0xca, 0xef, 0xde, 0x44, 0xc6, 0xe0, 0xa5, 0xd5, 0x0d, 0xae, 0x8d, 0xa1,
+	0x93, 0x97, 0x9b, 0xf9, 0xc4, 0x63, 0x18, 0xbd, 0x84, 0xf5, 0xcc, 0xc4, 0x49, 0x2e, 0xb1, 0xa3,
+	0xe7, 0x8e, 0x1c, 0x3d, 0x13, 0xa3, 0x4d, 0x53, 0x2b, 0xed, 0x87, 0x02, 0xea, 0x2b, 0x97, 0xf1,
+	0x34, 0x84, 0xc9, 0x1a, 0xef, 0x42, 0x8d, 0x8c, 0xc7, 0x0c, 0xf3, 0x4b, 0xfb, 0x64, 0xfc, 0x97,
+	0x1c, 0xa2, 0x1d, 0xa8, 0xce, 0xdc, 0xb9, 0x2b, 0x0b, 0xbc, 0x82, 0x12, 0x67, 0xe8, 0x10, 0x1a,
+	0x84, 0x3a, 0x98, 0x46, 0x6e, 0x2e, 0x77, 0xcb, 0xbd, 0xd6, 0xfe, 0xad, 0x82, 0xdb, 0xbe, 0x89,
+	0x60, 0x66, 0x3d, 0x46, 0x0f, 0x42, 0xf4, 0x14, 0xaa, 0x8b, 0xc8, 0xcd, 0x6a, 0x2b, 0x8e, 0xde,
+	0x5b, 0xa1, 0xc6, 0xd8, 0xfd, 0xa6, 0xa0, 0x9d, 0x54, 0x1a, 0x95, 0x7f, 0x5a, 0xda, 0x04, 0xb6,
+	0x73, 0xca, 0x4c, 0xda, 0x79, 0x02, 0x1b, 0x99, 0x76, 0x46, 0xa2, 0x96, 0x57, 0xed, 0xe7, 0x7a,
+	0xba, 0x9f, 0x4c, 0x3b, 0x81, 0x6d, 0x33, 0x7e, 0x08, 0x79, 0xa6, 0xc9, 0x1f, 0xaf, 0xa9, 0xc1,
+	0x59, 0x4a, 0x0f, 0xce, 0xc8, 0x04, 0x79, 0xb1, 0xfe, 0xb6, 0x09, 0xf6, 0xbf, 0x97, 0x60, 0x2b,
+	0x7d, 0xfc, 0xda, 0xf2, 0xac, 0x09, 0xa6, 0x88, 0x40, 0x4d, 0x98, 0x10, 0xf5, 0x0b, 0x82, 0x16,
+	0xbe, 0x8f, 0xce, 0xde, 0x0d, 0x18, 0xa2, 0x20, 0x6d, 0x2d, 0x4a, 0x28, 0x0a, 0x2e, 0x4c, 0x58,
+	0xd8, 0xdb, 0xc2, 0x84, 0xc5, 0x1d, 0xd4, 0xd6, 0xd0, 0x14, 0x2a, 0x91, 0x2d, 0x90, 0x51, 0x40,
+	0x2e, 0x7a, 0x1a, 0x9d, 0xfe, 0xea, 0x04, 0x99, 0x6c, 0xf0, 0x09, 0xba, 0x36, 0x99, 0xeb, 0xf2,
+	0xf3, 0x9e, 0xc7, 0x7f, 0xab, 0x7c, 0x7c, 0x74, 0xf3, 0xcf, 0xff, 0xe3, 0xe4, 0xef, 0xa8, 0x16,
+	0xcf, 0x94, 0x83, 0x9f, 0x01, 0x00, 0x00, 0xff, 0xff, 0xbf, 0x47, 0x0d, 0x45, 0xc3, 0x08, 0x00,
+	0x00,
 }
diff --git a/charonrpc/refresh_token.proto b/pb/rpc/charond/v1/refresh_token.proto
similarity index 82%
rename from charonrpc/refresh_token.proto
rename to pb/rpc/charond/v1/refresh_token.proto
index ea13d8c..c221e81 100644
--- a/charonrpc/refresh_token.proto
+++ b/pb/rpc/charond/v1/refresh_token.proto
@@ -1,70 +1,72 @@
-syntax = "proto3";
-
-package charonrpc;
-
-option go_package = "github.com/piotrkowalczuk/charon/charonrpc";
-
-import "google/protobuf/timestamp.proto";
-import "charonrpc/common.proto";
-import "qtypes/qtypes.proto";
-import "ntypes/ntypes.proto";
-
-service RefreshTokenManager {
-    rpc Create(CreateRefreshTokenRequest) returns (CreateRefreshTokenResponse) {};
-    rpc Revoke(RevokeRefreshTokenRequest) returns (RevokeRefreshTokenResponse) {};
-    rpc List(ListRefreshTokensRequest) returns (ListRefreshTokensResponse) {};
-}
-
-message RefreshToken {
-    string token = 1;
-    ntypes.String notes = 2;
-    int64 user_id = 3;
-    bool revoked = 4;
-    google.protobuf.Timestamp expire_at = 5;
-    google.protobuf.Timestamp last_used_at = 6;
-    google.protobuf.Timestamp created_at = 7;
-    ntypes.Int64 created_by = 8;
-    google.protobuf.Timestamp updated_at = 9;
-    ntypes.Int64 updated_by = 10;
-}
-
-message RefreshTokenQuery {
-    qtypes.Int64 user_id = 1;
-    qtypes.String notes = 2;
-    ntypes.Bool revoked = 3;
-    qtypes.Timestamp expire_at = 4;
-    qtypes.Timestamp last_used_at = 5;
-    qtypes.Timestamp created_at = 6;
-    qtypes.Timestamp updated_at = 7;
-}
-
-message CreateRefreshTokenRequest {
-    ntypes.String notes = 1;
-    google.protobuf.Timestamp expire_at = 2;
-}
-
-message CreateRefreshTokenResponse {
-    RefreshToken refresh_token = 1;
-}
-
-message ListRefreshTokensRequest {
-    ntypes.Int64 offset = 1;
-    ntypes.Int64 limit = 2;
-    repeated Order order_by = 3;
-    reserved 4 to 10;
-
-    RefreshTokenQuery query = 11;
-}
-
-message ListRefreshTokensResponse {
-    repeated RefreshToken refresh_tokens = 1;
-}
-
-message RevokeRefreshTokenRequest {
-    string token = 1;
-    int64 user_id = 2;
-}
-
-message RevokeRefreshTokenResponse {
-    RefreshToken refresh_token = 1;
-}
+syntax = "proto3";
+
+package charon.rpc.charond.v1;
+
+option go_package = "github.com/piotrkowalczuk/charon/pb/rpc/charond/v1;charond";
+option java_multiple_files = true;
+option java_package = "com.github.charon.rpc.charond.v1";
+
+import "google/protobuf/timestamp.proto";
+import "github.com/piotrkowalczuk/charon/pb/rpc/charond/v1/common.proto";
+import "qtypes/qtypes.proto";
+import "ntypes/ntypes.proto";
+
+service RefreshTokenManager {
+    rpc Create(CreateRefreshTokenRequest) returns (CreateRefreshTokenResponse) {};
+    rpc Revoke(RevokeRefreshTokenRequest) returns (RevokeRefreshTokenResponse) {};
+    rpc List(ListRefreshTokensRequest) returns (ListRefreshTokensResponse) {};
+}
+
+message RefreshToken {
+    string token = 1;
+    ntypes.String notes = 2;
+    int64 user_id = 3;
+    bool revoked = 4;
+    google.protobuf.Timestamp expire_at = 5;
+    google.protobuf.Timestamp last_used_at = 6;
+    google.protobuf.Timestamp created_at = 7;
+    ntypes.Int64 created_by = 8;
+    google.protobuf.Timestamp updated_at = 9;
+    ntypes.Int64 updated_by = 10;
+}
+
+message RefreshTokenQuery {
+    qtypes.Int64 user_id = 1;
+    qtypes.String notes = 2;
+    ntypes.Bool revoked = 3;
+    qtypes.Timestamp expire_at = 4;
+    qtypes.Timestamp last_used_at = 5;
+    qtypes.Timestamp created_at = 6;
+    qtypes.Timestamp updated_at = 7;
+}
+
+message CreateRefreshTokenRequest {
+    ntypes.String notes = 1;
+    google.protobuf.Timestamp expire_at = 2;
+}
+
+message CreateRefreshTokenResponse {
+    RefreshToken refresh_token = 1;
+}
+
+message ListRefreshTokensRequest {
+    ntypes.Int64 offset = 1;
+    ntypes.Int64 limit = 2;
+    repeated Order order_by = 3;
+    reserved 4 to 10;
+
+    RefreshTokenQuery query = 11;
+}
+
+message ListRefreshTokensResponse {
+    repeated RefreshToken refresh_tokens = 1;
+}
+
+message RevokeRefreshTokenRequest {
+    string token = 1;
+    int64 user_id = 2;
+}
+
+message RevokeRefreshTokenResponse {
+    RefreshToken refresh_token = 1;
+}
diff --git a/charonrpc/user.pb.go b/pb/rpc/charond/v1/user.pb.go
similarity index 75%
rename from charonrpc/user.pb.go
rename to pb/rpc/charond/v1/user.pb.go
index 94da20e..9e6b7d4 100644
--- a/charonrpc/user.pb.go
+++ b/pb/rpc/charond/v1/user.pb.go
@@ -1,18 +1,18 @@
 // Code generated by protoc-gen-go. DO NOT EDIT.
-// source: charonrpc/user.proto
+// source: github.com/piotrkowalczuk/charon/pb/rpc/charond/v1/user.proto
 
-package charonrpc
+package charond // import "github.com/piotrkowalczuk/charon/pb/rpc/charond/v1"
+
+import proto "github.com/golang/protobuf/proto"
+import fmt "fmt"
+import math "math"
+import timestamp "github.com/golang/protobuf/ptypes/timestamp"
+import wrappers "github.com/golang/protobuf/ptypes/wrappers"
+import ntypes "github.com/piotrkowalczuk/ntypes"
+import qtypes "github.com/piotrkowalczuk/qtypes"
 
 import (
-	context "context"
-	fmt "fmt"
-	math "math"
-
-	proto "github.com/golang/protobuf/proto"
-	timestamp "github.com/golang/protobuf/ptypes/timestamp"
-	wrappers "github.com/golang/protobuf/ptypes/wrappers"
-	ntypes "github.com/piotrkowalczuk/ntypes"
-	qtypes "github.com/piotrkowalczuk/qtypes"
+	context "golang.org/x/net/context"
 	grpc "google.golang.org/grpc"
 )
 
@@ -49,17 +49,16 @@ func (m *User) Reset()         { *m = User{} }
 func (m *User) String() string { return proto.CompactTextString(m) }
 func (*User) ProtoMessage()    {}
 func (*User) Descriptor() ([]byte, []int) {
-	return fileDescriptor_a3607882576ce369, []int{0}
+	return fileDescriptor_user_ddd072e15a450679, []int{0}
 }
-
 func (m *User) XXX_Unmarshal(b []byte) error {
 	return xxx_messageInfo_User.Unmarshal(m, b)
 }
 func (m *User) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
 	return xxx_messageInfo_User.Marshal(b, m, deterministic)
 }
-func (m *User) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_User.Merge(m, src)
+func (dst *User) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_User.Merge(dst, src)
 }
 func (m *User) XXX_Size() int {
 	return xxx_messageInfo_User.Size(m)
@@ -173,17 +172,16 @@ func (m *CreateUserRequest) Reset()         { *m = CreateUserRequest{} }
 func (m *CreateUserRequest) String() string { return proto.CompactTextString(m) }
 func (*CreateUserRequest) ProtoMessage()    {}
 func (*CreateUserRequest) Descriptor() ([]byte, []int) {
-	return fileDescriptor_a3607882576ce369, []int{1}
+	return fileDescriptor_user_ddd072e15a450679, []int{1}
 }
-
 func (m *CreateUserRequest) XXX_Unmarshal(b []byte) error {
 	return xxx_messageInfo_CreateUserRequest.Unmarshal(m, b)
 }
 func (m *CreateUserRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
 	return xxx_messageInfo_CreateUserRequest.Marshal(b, m, deterministic)
 }
-func (m *CreateUserRequest) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_CreateUserRequest.Merge(m, src)
+func (dst *CreateUserRequest) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_CreateUserRequest.Merge(dst, src)
 }
 func (m *CreateUserRequest) XXX_Size() int {
 	return xxx_messageInfo_CreateUserRequest.Size(m)
@@ -268,17 +266,16 @@ func (m *CreateUserResponse) Reset()         { *m = CreateUserResponse{} }
 func (m *CreateUserResponse) String() string { return proto.CompactTextString(m) }
 func (*CreateUserResponse) ProtoMessage()    {}
 func (*CreateUserResponse) Descriptor() ([]byte, []int) {
-	return fileDescriptor_a3607882576ce369, []int{2}
+	return fileDescriptor_user_ddd072e15a450679, []int{2}
 }
-
 func (m *CreateUserResponse) XXX_Unmarshal(b []byte) error {
 	return xxx_messageInfo_CreateUserResponse.Unmarshal(m, b)
 }
 func (m *CreateUserResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
 	return xxx_messageInfo_CreateUserResponse.Marshal(b, m, deterministic)
 }
-func (m *CreateUserResponse) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_CreateUserResponse.Merge(m, src)
+func (dst *CreateUserResponse) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_CreateUserResponse.Merge(dst, src)
 }
 func (m *CreateUserResponse) XXX_Size() int {
 	return xxx_messageInfo_CreateUserResponse.Size(m)
@@ -307,17 +304,16 @@ func (m *GetUserRequest) Reset()         { *m = GetUserRequest{} }
 func (m *GetUserRequest) String() string { return proto.CompactTextString(m) }
 func (*GetUserRequest) ProtoMessage()    {}
 func (*GetUserRequest) Descriptor() ([]byte, []int) {
-	return fileDescriptor_a3607882576ce369, []int{3}
+	return fileDescriptor_user_ddd072e15a450679, []int{3}
 }
-
 func (m *GetUserRequest) XXX_Unmarshal(b []byte) error {
 	return xxx_messageInfo_GetUserRequest.Unmarshal(m, b)
 }
 func (m *GetUserRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
 	return xxx_messageInfo_GetUserRequest.Marshal(b, m, deterministic)
 }
-func (m *GetUserRequest) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_GetUserRequest.Merge(m, src)
+func (dst *GetUserRequest) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_GetUserRequest.Merge(dst, src)
 }
 func (m *GetUserRequest) XXX_Size() int {
 	return xxx_messageInfo_GetUserRequest.Size(m)
@@ -346,17 +342,16 @@ func (m *GetUserResponse) Reset()         { *m = GetUserResponse{} }
 func (m *GetUserResponse) String() string { return proto.CompactTextString(m) }
 func (*GetUserResponse) ProtoMessage()    {}
 func (*GetUserResponse) Descriptor() ([]byte, []int) {
-	return fileDescriptor_a3607882576ce369, []int{4}
+	return fileDescriptor_user_ddd072e15a450679, []int{4}
 }
-
 func (m *GetUserResponse) XXX_Unmarshal(b []byte) error {
 	return xxx_messageInfo_GetUserResponse.Unmarshal(m, b)
 }
 func (m *GetUserResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
 	return xxx_messageInfo_GetUserResponse.Marshal(b, m, deterministic)
 }
-func (m *GetUserResponse) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_GetUserResponse.Merge(m, src)
+func (dst *GetUserResponse) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_GetUserResponse.Merge(dst, src)
 }
 func (m *GetUserResponse) XXX_Size() int {
 	return xxx_messageInfo_GetUserResponse.Size(m)
@@ -391,17 +386,16 @@ func (m *ListUsersRequest) Reset()         { *m = ListUsersRequest{} }
 func (m *ListUsersRequest) String() string { return proto.CompactTextString(m) }
 func (*ListUsersRequest) ProtoMessage()    {}
 func (*ListUsersRequest) Descriptor() ([]byte, []int) {
-	return fileDescriptor_a3607882576ce369, []int{5}
+	return fileDescriptor_user_ddd072e15a450679, []int{5}
 }
-
 func (m *ListUsersRequest) XXX_Unmarshal(b []byte) error {
 	return xxx_messageInfo_ListUsersRequest.Unmarshal(m, b)
 }
 func (m *ListUsersRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
 	return xxx_messageInfo_ListUsersRequest.Marshal(b, m, deterministic)
 }
-func (m *ListUsersRequest) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_ListUsersRequest.Merge(m, src)
+func (dst *ListUsersRequest) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_ListUsersRequest.Merge(dst, src)
 }
 func (m *ListUsersRequest) XXX_Size() int {
 	return xxx_messageInfo_ListUsersRequest.Size(m)
@@ -473,17 +467,16 @@ func (m *ListUsersResponse) Reset()         { *m = ListUsersResponse{} }
 func (m *ListUsersResponse) String() string { return proto.CompactTextString(m) }
 func (*ListUsersResponse) ProtoMessage()    {}
 func (*ListUsersResponse) Descriptor() ([]byte, []int) {
-	return fileDescriptor_a3607882576ce369, []int{6}
+	return fileDescriptor_user_ddd072e15a450679, []int{6}
 }
-
 func (m *ListUsersResponse) XXX_Unmarshal(b []byte) error {
 	return xxx_messageInfo_ListUsersResponse.Unmarshal(m, b)
 }
 func (m *ListUsersResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
 	return xxx_messageInfo_ListUsersResponse.Marshal(b, m, deterministic)
 }
-func (m *ListUsersResponse) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_ListUsersResponse.Merge(m, src)
+func (dst *ListUsersResponse) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_ListUsersResponse.Merge(dst, src)
 }
 func (m *ListUsersResponse) XXX_Size() int {
 	return xxx_messageInfo_ListUsersResponse.Size(m)
@@ -512,17 +505,16 @@ func (m *DeleteUserRequest) Reset()         { *m = DeleteUserRequest{} }
 func (m *DeleteUserRequest) String() string { return proto.CompactTextString(m) }
 func (*DeleteUserRequest) ProtoMessage()    {}
 func (*DeleteUserRequest) Descriptor() ([]byte, []int) {
-	return fileDescriptor_a3607882576ce369, []int{7}
+	return fileDescriptor_user_ddd072e15a450679, []int{7}
 }
-
 func (m *DeleteUserRequest) XXX_Unmarshal(b []byte) error {
 	return xxx_messageInfo_DeleteUserRequest.Unmarshal(m, b)
 }
 func (m *DeleteUserRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
 	return xxx_messageInfo_DeleteUserRequest.Marshal(b, m, deterministic)
 }
-func (m *DeleteUserRequest) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_DeleteUserRequest.Merge(m, src)
+func (dst *DeleteUserRequest) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_DeleteUserRequest.Merge(dst, src)
 }
 func (m *DeleteUserRequest) XXX_Size() int {
 	return xxx_messageInfo_DeleteUserRequest.Size(m)
@@ -560,17 +552,16 @@ func (m *ModifyUserRequest) Reset()         { *m = ModifyUserRequest{} }
 func (m *ModifyUserRequest) String() string { return proto.CompactTextString(m) }
 func (*ModifyUserRequest) ProtoMessage()    {}
 func (*ModifyUserRequest) Descriptor() ([]byte, []int) {
-	return fileDescriptor_a3607882576ce369, []int{8}
+	return fileDescriptor_user_ddd072e15a450679, []int{8}
 }
-
 func (m *ModifyUserRequest) XXX_Unmarshal(b []byte) error {
 	return xxx_messageInfo_ModifyUserRequest.Unmarshal(m, b)
 }
 func (m *ModifyUserRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
 	return xxx_messageInfo_ModifyUserRequest.Marshal(b, m, deterministic)
 }
-func (m *ModifyUserRequest) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_ModifyUserRequest.Merge(m, src)
+func (dst *ModifyUserRequest) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_ModifyUserRequest.Merge(dst, src)
 }
 func (m *ModifyUserRequest) XXX_Size() int {
 	return xxx_messageInfo_ModifyUserRequest.Size(m)
@@ -662,17 +653,16 @@ func (m *ModifyUserResponse) Reset()         { *m = ModifyUserResponse{} }
 func (m *ModifyUserResponse) String() string { return proto.CompactTextString(m) }
 func (*ModifyUserResponse) ProtoMessage()    {}
 func (*ModifyUserResponse) Descriptor() ([]byte, []int) {
-	return fileDescriptor_a3607882576ce369, []int{9}
+	return fileDescriptor_user_ddd072e15a450679, []int{9}
 }
-
 func (m *ModifyUserResponse) XXX_Unmarshal(b []byte) error {
 	return xxx_messageInfo_ModifyUserResponse.Unmarshal(m, b)
 }
 func (m *ModifyUserResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
 	return xxx_messageInfo_ModifyUserResponse.Marshal(b, m, deterministic)
 }
-func (m *ModifyUserResponse) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_ModifyUserResponse.Merge(m, src)
+func (dst *ModifyUserResponse) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_ModifyUserResponse.Merge(dst, src)
 }
 func (m *ModifyUserResponse) XXX_Size() int {
 	return xxx_messageInfo_ModifyUserResponse.Size(m)
@@ -701,17 +691,16 @@ func (m *ListUserPermissionsRequest) Reset()         { *m = ListUserPermissionsR
 func (m *ListUserPermissionsRequest) String() string { return proto.CompactTextString(m) }
 func (*ListUserPermissionsRequest) ProtoMessage()    {}
 func (*ListUserPermissionsRequest) Descriptor() ([]byte, []int) {
-	return fileDescriptor_a3607882576ce369, []int{10}
+	return fileDescriptor_user_ddd072e15a450679, []int{10}
 }
-
 func (m *ListUserPermissionsRequest) XXX_Unmarshal(b []byte) error {
 	return xxx_messageInfo_ListUserPermissionsRequest.Unmarshal(m, b)
 }
 func (m *ListUserPermissionsRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
 	return xxx_messageInfo_ListUserPermissionsRequest.Marshal(b, m, deterministic)
 }
-func (m *ListUserPermissionsRequest) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_ListUserPermissionsRequest.Merge(m, src)
+func (dst *ListUserPermissionsRequest) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_ListUserPermissionsRequest.Merge(dst, src)
 }
 func (m *ListUserPermissionsRequest) XXX_Size() int {
 	return xxx_messageInfo_ListUserPermissionsRequest.Size(m)
@@ -740,17 +729,16 @@ func (m *ListUserPermissionsResponse) Reset()         { *m = ListUserPermissions
 func (m *ListUserPermissionsResponse) String() string { return proto.CompactTextString(m) }
 func (*ListUserPermissionsResponse) ProtoMessage()    {}
 func (*ListUserPermissionsResponse) Descriptor() ([]byte, []int) {
-	return fileDescriptor_a3607882576ce369, []int{11}
+	return fileDescriptor_user_ddd072e15a450679, []int{11}
 }
-
 func (m *ListUserPermissionsResponse) XXX_Unmarshal(b []byte) error {
 	return xxx_messageInfo_ListUserPermissionsResponse.Unmarshal(m, b)
 }
 func (m *ListUserPermissionsResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
 	return xxx_messageInfo_ListUserPermissionsResponse.Marshal(b, m, deterministic)
 }
-func (m *ListUserPermissionsResponse) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_ListUserPermissionsResponse.Merge(m, src)
+func (dst *ListUserPermissionsResponse) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_ListUserPermissionsResponse.Merge(dst, src)
 }
 func (m *ListUserPermissionsResponse) XXX_Size() int {
 	return xxx_messageInfo_ListUserPermissionsResponse.Size(m)
@@ -782,17 +770,16 @@ func (m *SetUserPermissionsRequest) Reset()         { *m = SetUserPermissionsReq
 func (m *SetUserPermissionsRequest) String() string { return proto.CompactTextString(m) }
 func (*SetUserPermissionsRequest) ProtoMessage()    {}
 func (*SetUserPermissionsRequest) Descriptor() ([]byte, []int) {
-	return fileDescriptor_a3607882576ce369, []int{12}
+	return fileDescriptor_user_ddd072e15a450679, []int{12}
 }
-
 func (m *SetUserPermissionsRequest) XXX_Unmarshal(b []byte) error {
 	return xxx_messageInfo_SetUserPermissionsRequest.Unmarshal(m, b)
 }
 func (m *SetUserPermissionsRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
 	return xxx_messageInfo_SetUserPermissionsRequest.Marshal(b, m, deterministic)
 }
-func (m *SetUserPermissionsRequest) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_SetUserPermissionsRequest.Merge(m, src)
+func (dst *SetUserPermissionsRequest) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_SetUserPermissionsRequest.Merge(dst, src)
 }
 func (m *SetUserPermissionsRequest) XXX_Size() int {
 	return xxx_messageInfo_SetUserPermissionsRequest.Size(m)
@@ -837,17 +824,16 @@ func (m *SetUserPermissionsResponse) Reset()         { *m = SetUserPermissionsRe
 func (m *SetUserPermissionsResponse) String() string { return proto.CompactTextString(m) }
 func (*SetUserPermissionsResponse) ProtoMessage()    {}
 func (*SetUserPermissionsResponse) Descriptor() ([]byte, []int) {
-	return fileDescriptor_a3607882576ce369, []int{13}
+	return fileDescriptor_user_ddd072e15a450679, []int{13}
 }
-
 func (m *SetUserPermissionsResponse) XXX_Unmarshal(b []byte) error {
 	return xxx_messageInfo_SetUserPermissionsResponse.Unmarshal(m, b)
 }
 func (m *SetUserPermissionsResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
 	return xxx_messageInfo_SetUserPermissionsResponse.Marshal(b, m, deterministic)
 }
-func (m *SetUserPermissionsResponse) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_SetUserPermissionsResponse.Merge(m, src)
+func (dst *SetUserPermissionsResponse) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_SetUserPermissionsResponse.Merge(dst, src)
 }
 func (m *SetUserPermissionsResponse) XXX_Size() int {
 	return xxx_messageInfo_SetUserPermissionsResponse.Size(m)
@@ -890,17 +876,16 @@ func (m *ListUserGroupsRequest) Reset()         { *m = ListUserGroupsRequest{} }
 func (m *ListUserGroupsRequest) String() string { return proto.CompactTextString(m) }
 func (*ListUserGroupsRequest) ProtoMessage()    {}
 func (*ListUserGroupsRequest) Descriptor() ([]byte, []int) {
-	return fileDescriptor_a3607882576ce369, []int{14}
+	return fileDescriptor_user_ddd072e15a450679, []int{14}
 }
-
 func (m *ListUserGroupsRequest) XXX_Unmarshal(b []byte) error {
 	return xxx_messageInfo_ListUserGroupsRequest.Unmarshal(m, b)
 }
 func (m *ListUserGroupsRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
 	return xxx_messageInfo_ListUserGroupsRequest.Marshal(b, m, deterministic)
 }
-func (m *ListUserGroupsRequest) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_ListUserGroupsRequest.Merge(m, src)
+func (dst *ListUserGroupsRequest) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_ListUserGroupsRequest.Merge(dst, src)
 }
 func (m *ListUserGroupsRequest) XXX_Size() int {
 	return xxx_messageInfo_ListUserGroupsRequest.Size(m)
@@ -929,17 +914,16 @@ func (m *ListUserGroupsResponse) Reset()         { *m = ListUserGroupsResponse{}
 func (m *ListUserGroupsResponse) String() string { return proto.CompactTextString(m) }
 func (*ListUserGroupsResponse) ProtoMessage()    {}
 func (*ListUserGroupsResponse) Descriptor() ([]byte, []int) {
-	return fileDescriptor_a3607882576ce369, []int{15}
+	return fileDescriptor_user_ddd072e15a450679, []int{15}
 }
-
 func (m *ListUserGroupsResponse) XXX_Unmarshal(b []byte) error {
 	return xxx_messageInfo_ListUserGroupsResponse.Unmarshal(m, b)
 }
 func (m *ListUserGroupsResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
 	return xxx_messageInfo_ListUserGroupsResponse.Marshal(b, m, deterministic)
 }
-func (m *ListUserGroupsResponse) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_ListUserGroupsResponse.Merge(m, src)
+func (dst *ListUserGroupsResponse) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_ListUserGroupsResponse.Merge(dst, src)
 }
 func (m *ListUserGroupsResponse) XXX_Size() int {
 	return xxx_messageInfo_ListUserGroupsResponse.Size(m)
@@ -969,17 +953,16 @@ func (m *SetUserGroupsRequest) Reset()         { *m = SetUserGroupsRequest{} }
 func (m *SetUserGroupsRequest) String() string { return proto.CompactTextString(m) }
 func (*SetUserGroupsRequest) ProtoMessage()    {}
 func (*SetUserGroupsRequest) Descriptor() ([]byte, []int) {
-	return fileDescriptor_a3607882576ce369, []int{16}
+	return fileDescriptor_user_ddd072e15a450679, []int{16}
 }
-
 func (m *SetUserGroupsRequest) XXX_Unmarshal(b []byte) error {
 	return xxx_messageInfo_SetUserGroupsRequest.Unmarshal(m, b)
 }
 func (m *SetUserGroupsRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
 	return xxx_messageInfo_SetUserGroupsRequest.Marshal(b, m, deterministic)
 }
-func (m *SetUserGroupsRequest) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_SetUserGroupsRequest.Merge(m, src)
+func (dst *SetUserGroupsRequest) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_SetUserGroupsRequest.Merge(dst, src)
 }
 func (m *SetUserGroupsRequest) XXX_Size() int {
 	return xxx_messageInfo_SetUserGroupsRequest.Size(m)
@@ -1017,17 +1000,16 @@ func (m *SetUserGroupsResponse) Reset()         { *m = SetUserGroupsResponse{} }
 func (m *SetUserGroupsResponse) String() string { return proto.CompactTextString(m) }
 func (*SetUserGroupsResponse) ProtoMessage()    {}
 func (*SetUserGroupsResponse) Descriptor() ([]byte, []int) {
-	return fileDescriptor_a3607882576ce369, []int{17}
+	return fileDescriptor_user_ddd072e15a450679, []int{17}
 }
-
 func (m *SetUserGroupsResponse) XXX_Unmarshal(b []byte) error {
 	return xxx_messageInfo_SetUserGroupsResponse.Unmarshal(m, b)
 }
 func (m *SetUserGroupsResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
 	return xxx_messageInfo_SetUserGroupsResponse.Marshal(b, m, deterministic)
 }
-func (m *SetUserGroupsResponse) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_SetUserGroupsResponse.Merge(m, src)
+func (dst *SetUserGroupsResponse) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_SetUserGroupsResponse.Merge(dst, src)
 }
 func (m *SetUserGroupsResponse) XXX_Size() int {
 	return xxx_messageInfo_SetUserGroupsResponse.Size(m)
@@ -1060,104 +1042,25 @@ func (m *SetUserGroupsResponse) GetUntouched() int64 {
 }
 
 func init() {
-	proto.RegisterType((*User)(nil), "charonrpc.User")
-	proto.RegisterType((*CreateUserRequest)(nil), "charonrpc.CreateUserRequest")
-	proto.RegisterType((*CreateUserResponse)(nil), "charonrpc.CreateUserResponse")
-	proto.RegisterType((*GetUserRequest)(nil), "charonrpc.GetUserRequest")
-	proto.RegisterType((*GetUserResponse)(nil), "charonrpc.GetUserResponse")
-	proto.RegisterType((*ListUsersRequest)(nil), "charonrpc.ListUsersRequest")
-	proto.RegisterMapType((map[string]bool)(nil), "charonrpc.ListUsersRequest.SortEntry")
-	proto.RegisterType((*ListUsersResponse)(nil), "charonrpc.ListUsersResponse")
-	proto.RegisterType((*DeleteUserRequest)(nil), "charonrpc.DeleteUserRequest")
-	proto.RegisterType((*ModifyUserRequest)(nil), "charonrpc.ModifyUserRequest")
-	proto.RegisterType((*ModifyUserResponse)(nil), "charonrpc.ModifyUserResponse")
-	proto.RegisterType((*ListUserPermissionsRequest)(nil), "charonrpc.ListUserPermissionsRequest")
-	proto.RegisterType((*ListUserPermissionsResponse)(nil), "charonrpc.ListUserPermissionsResponse")
-	proto.RegisterType((*SetUserPermissionsRequest)(nil), "charonrpc.SetUserPermissionsRequest")
-	proto.RegisterType((*SetUserPermissionsResponse)(nil), "charonrpc.SetUserPermissionsResponse")
-	proto.RegisterType((*ListUserGroupsRequest)(nil), "charonrpc.ListUserGroupsRequest")
-	proto.RegisterType((*ListUserGroupsResponse)(nil), "charonrpc.ListUserGroupsResponse")
-	proto.RegisterType((*SetUserGroupsRequest)(nil), "charonrpc.SetUserGroupsRequest")
-	proto.RegisterType((*SetUserGroupsResponse)(nil), "charonrpc.SetUserGroupsResponse")
-}
-
-func init() { proto.RegisterFile("charonrpc/user.proto", fileDescriptor_a3607882576ce369) }
-
-var fileDescriptor_a3607882576ce369 = []byte{
-	// 1155 bytes of a gzipped FileDescriptorProto
-	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xb4, 0x56, 0xdd, 0x6e, 0xe3, 0x44,
-	0x14, 0x6e, 0xe2, 0xfc, 0xf9, 0xa4, 0x9b, 0xb6, 0x43, 0x5b, 0x5c, 0xb7, 0xcb, 0x66, 0x5d, 0x4a,
-	0xc3, 0x6e, 0x49, 0xa4, 0x02, 0x0b, 0xbb, 0x12, 0xa0, 0x4d, 0x17, 0x55, 0x8b, 0x58, 0xa8, 0x1c,
-	0xe0, 0x82, 0x9b, 0xc8, 0x49, 0x26, 0xe9, 0xa8, 0x89, 0xc7, 0x9d, 0x19, 0xb7, 0x0a, 0x6f, 0xc1,
-	0x0b, 0x21, 0xf1, 0x12, 0xbc, 0x07, 0x6f, 0x80, 0x66, 0xfc, 0x13, 0xdb, 0x71, 0xda, 0xed, 0x05,
-	0x57, 0xc9, 0x9c, 0xf3, 0x9d, 0xef, 0x9c, 0x39, 0x7f, 0x63, 0xd8, 0x1e, 0x5e, 0x3a, 0x8c, 0xba,
-	0xcc, 0x1b, 0x76, 0x7c, 0x8e, 0x59, 0xdb, 0x63, 0x54, 0x50, 0xa4, 0xc7, 0x52, 0xf3, 0xc9, 0x84,
-	0xd2, 0xc9, 0x14, 0x77, 0x94, 0x62, 0xe0, 0x8f, 0x3b, 0x82, 0xcc, 0x30, 0x17, 0xce, 0xcc, 0x0b,
-	0xb0, 0xe6, 0x47, 0x59, 0xc0, 0x2d, 0x73, 0x3c, 0x0f, 0x33, 0x1e, 0xea, 0x77, 0x17, 0x1e, 0x86,
-	0x74, 0x36, 0xa3, 0x6e, 0x28, 0xdf, 0x59, 0xc8, 0x27, 0x8c, 0xfa, 0x11, 0xdd, 0x07, 0xd7, 0x62,
-	0xee, 0x61, 0xde, 0x09, 0x7e, 0x22, 0xa1, 0x1b, 0x08, 0xdd, 0x84, 0xd0, 0xfa, 0x4b, 0x83, 0xd2,
-	0xaf, 0x1c, 0x33, 0xd4, 0x80, 0x22, 0x19, 0x19, 0x85, 0x66, 0xa1, 0xa5, 0xd9, 0x45, 0x32, 0x42,
-	0x26, 0xd4, 0xe4, 0x5d, 0x5c, 0x67, 0x86, 0x8d, 0x62, 0xb3, 0xd0, 0xd2, 0xed, 0xf8, 0x8c, 0x1e,
-	0x03, 0x8c, 0x09, 0xe3, 0xa2, 0xaf, 0xb4, 0x9a, 0xd2, 0xea, 0x4a, 0xf2, 0x93, 0x54, 0xef, 0x83,
-	0x3e, 0x75, 0x22, 0x6d, 0x29, 0xb0, 0x95, 0x02, 0xa5, 0x7c, 0x0a, 0xeb, 0x84, 0xf7, 0xb9, 0xef,
-	0x61, 0x26, 0xf9, 0x8c, 0x72, 0xb3, 0xd0, 0xaa, 0xd9, 0x75, 0xc2, 0x7b, 0x91, 0x48, 0xda, 0x13,
-	0xde, 0x77, 0x86, 0x82, 0xdc, 0x60, 0xa3, 0xa2, 0xf4, 0x35, 0xc2, 0x5f, 0xab, 0x33, 0xda, 0x83,
-	0x9a, 0xb4, 0x17, 0xce, 0x78, 0x6c, 0x54, 0x95, 0xae, 0x4a, 0x78, 0x4f, 0x1e, 0x43, 0xea, 0x21,
-	0x75, 0xc7, 0x84, 0xcd, 0xf0, 0xc8, 0xa8, 0x45, 0xd4, 0x67, 0x91, 0x08, 0xbd, 0x04, 0x18, 0x32,
-	0xec, 0x08, 0x3c, 0xea, 0x3b, 0xc2, 0xd0, 0x9b, 0x85, 0x56, 0xfd, 0xd4, 0x6c, 0x07, 0xc9, 0x6f,
-	0x47, 0xc9, 0x6f, 0xff, 0x12, 0x55, 0xc7, 0xd6, 0x43, 0xf4, 0x6b, 0x81, 0x4e, 0x16, 0xa6, 0x83,
-	0xb9, 0x01, 0xca, 0xf4, 0x51, 0x3b, 0x4c, 0xe6, 0x5b, 0x57, 0xbc, 0xf8, 0x22, 0x46, 0x77, 0xe7,
-	0xd2, 0x91, 0xef, 0x8d, 0x22, 0x47, 0xf5, 0xfb, 0x1d, 0x85, 0xe8, 0xc0, 0x51, 0x64, 0x3a, 0x98,
-	0x1b, 0xeb, 0xb9, 0x8e, 0x42, 0x40, 0x77, 0x6e, 0xfd, 0x5b, 0x84, 0xad, 0x33, 0xe5, 0x56, 0x96,
-	0xd1, 0xc6, 0xd7, 0x3e, 0xe6, 0x22, 0x55, 0xbd, 0x42, 0xa6, 0x7a, 0x47, 0xd0, 0xf0, 0xa6, 0x0e,
-	0x71, 0xfb, 0x9e, 0xc3, 0xf9, 0x2d, 0x65, 0xa3, 0xb0, 0xbe, 0x8f, 0x94, 0xf4, 0x22, 0x14, 0xa2,
-	0x63, 0xd8, 0xe0, 0x78, 0xe8, 0x33, 0xbc, 0xc0, 0xc9, 0x4a, 0xaf, 0xdb, 0x8d, 0x40, 0x1c, 0x03,
-	0xd3, 0xdd, 0x50, 0xba, 0xb3, 0x1b, 0xca, 0x99, 0x6e, 0xe8, 0x64, 0xba, 0xa1, 0xa2, 0x6e, 0xbb,
-	0x1e, 0xdd, 0xb6, 0x4b, 0xe9, 0x34, 0xdd, 0x1b, 0x9f, 0x26, 0x7b, 0xa3, 0x9a, 0x83, 0x5e, 0x74,
-	0xca, 0x71, 0xa2, 0x53, 0x6a, 0x39, 0xc8, 0xb8, 0x6f, 0x3a, 0x99, 0xbe, 0xd1, 0xf3, 0x83, 0x88,
-	0xbb, 0xc8, 0x7a, 0x09, 0x28, 0x99, 0x72, 0xee, 0x51, 0x97, 0x63, 0x74, 0x08, 0x25, 0x75, 0x87,
-	0x82, 0x32, 0xdf, 0x68, 0xc7, 0xa3, 0xd9, 0x56, 0x30, 0xa5, 0xb4, 0x9a, 0xd0, 0x38, 0xc7, 0x22,
-	0x59, 0xaa, 0xcc, 0xe0, 0x59, 0x2f, 0x60, 0x23, 0x46, 0x3c, 0x84, 0xf9, 0x4f, 0x0d, 0x36, 0x7f,
-	0x24, 0x5c, 0x59, 0xf2, 0x88, 0x3c, 0x9b, 0xdf, 0xc2, 0x7d, 0xf9, 0x4d, 0x26, 0xad, 0x78, 0x57,
-	0xd2, 0xd2, 0xe3, 0xa0, 0x85, 0x5d, 0x7a, 0xbd, 0x62, 0x1c, 0x8e, 0xa0, 0x42, 0xc7, 0x63, 0x8e,
-	0x85, 0x31, 0xca, 0xeb, 0xe7, 0x50, 0x89, 0x0e, 0xa1, 0x3c, 0x25, 0x33, 0x22, 0x0c, 0x9c, 0x87,
-	0x0a, 0x74, 0xe8, 0x1b, 0x28, 0x71, 0xca, 0x84, 0x31, 0x6e, 0x6a, 0xad, 0xfa, 0xe9, 0x51, 0x22,
-	0x1b, 0xd9, 0xeb, 0xb7, 0x7b, 0x94, 0x89, 0xef, 0x5d, 0xc1, 0xe6, 0xdd, 0xa2, 0x51, 0xb0, 0x95,
-	0x19, 0x7a, 0x0e, 0x35, 0xca, 0x46, 0x98, 0xc9, 0xb0, 0x27, 0x8a, 0x62, 0x33, 0x41, 0xf1, 0xb3,
-	0x54, 0xd9, 0x55, 0x85, 0xe8, 0xce, 0xcd, 0xaf, 0x40, 0x8f, 0x39, 0xd0, 0x26, 0x68, 0x57, 0x78,
-	0x1e, 0xce, 0x93, 0xfc, 0x8b, 0xb6, 0xa1, 0x7c, 0xe3, 0x4c, 0xfd, 0x60, 0x43, 0xd6, 0xec, 0xe0,
-	0xf0, 0xaa, 0xf8, 0x75, 0xe1, 0x87, 0x52, 0xad, 0xb4, 0x39, 0xb2, 0x5e, 0xc1, 0x56, 0x22, 0xa6,
-	0xb0, 0x9a, 0x47, 0x50, 0x96, 0xa9, 0xe6, 0x46, 0x41, 0x79, 0x5f, 0x2a, 0x67, 0xa0, 0xb5, 0x0e,
-	0x61, 0xeb, 0x0d, 0x9e, 0xe2, 0xf4, 0x5c, 0x67, 0x9b, 0xe5, 0x6f, 0x0d, 0xb6, 0xde, 0xd1, 0x11,
-	0x19, 0xcf, 0xef, 0x40, 0xa1, 0x67, 0x99, 0x5d, 0x5e, 0x3f, 0x6d, 0x44, 0x99, 0xed, 0x09, 0x46,
-	0xdc, 0x49, 0x62, 0x3b, 0x7c, 0xb9, 0xb4, 0x1d, 0xb4, 0x5c, 0x8b, 0xfb, 0xb7, 0x45, 0x29, 0x77,
-	0x5b, 0x7c, 0x96, 0xda, 0x16, 0xe5, 0x5c, 0xee, 0xc4, 0xf6, 0x78, 0x9e, 0xdc, 0x1e, 0x95, 0xfc,
-	0xd8, 0x57, 0x6e, 0x93, 0xea, 0x83, 0xb6, 0x49, 0xed, 0xbd, 0xb7, 0x89, 0xfe, 0x90, 0x6d, 0x02,
-	0xef, 0xb1, 0x4d, 0x92, 0x25, 0x7c, 0xc8, 0xcc, 0x9f, 0x80, 0x19, 0xf5, 0xd7, 0x05, 0x66, 0x33,
-	0xc2, 0x39, 0xa1, 0x2e, 0x5f, 0xd5, 0x2c, 0xdf, 0xc1, 0x7e, 0x2e, 0x3a, 0xf4, 0xd8, 0x84, 0xba,
-	0xb7, 0x10, 0xab, 0xee, 0xd4, 0xed, 0xa4, 0xc8, 0x9a, 0xc2, 0x5e, 0x0f, 0xaf, 0xf2, 0xf6, 0x21,
-	0x54, 0x65, 0x4c, 0xfd, 0xd8, 0x65, 0x45, 0x1e, 0xdf, 0x8e, 0xb2, 0xbc, 0xc5, 0x25, 0x5e, 0x39,
-	0x46, 0x63, 0xca, 0x86, 0xc1, 0xa7, 0x44, 0xcd, 0x0e, 0x0e, 0x96, 0x0b, 0x66, 0x9e, 0xb7, 0x30,
-	0x5a, 0x03, 0xaa, 0xe1, 0x7a, 0x09, 0xdd, 0x45, 0x47, 0xa9, 0x61, 0x78, 0x46, 0x6f, 0x70, 0xf0,
-	0xb0, 0x69, 0x76, 0x74, 0x44, 0x07, 0xa0, 0xfb, 0xae, 0xa0, 0xfe, 0xf0, 0x12, 0x07, 0x6d, 0xad,
-	0xd9, 0x0b, 0x81, 0x75, 0x0c, 0x3b, 0x51, 0x7a, 0xce, 0xe5, 0xb7, 0xd4, 0xca, 0x3c, 0x76, 0x61,
-	0x37, 0x0b, 0x0c, 0x83, 0x6a, 0x41, 0x45, 0x7d, 0x86, 0x45, 0xb3, 0x9d, 0xdc, 0x2c, 0x0a, 0x6a,
-	0x87, 0x7a, 0xeb, 0x1c, 0xb6, 0xc3, 0xcb, 0xa5, 0x7d, 0xad, 0xcc, 0xe2, 0x6e, 0x4c, 0x2d, 0x13,
-	0xa8, 0xc5, 0x44, 0x04, 0x76, 0x32, 0x44, 0xff, 0x57, 0x82, 0x4e, 0xff, 0x29, 0x43, 0x5d, 0x3a,
-	0x7a, 0xe7, 0xb8, 0xce, 0x04, 0x33, 0x74, 0x0e, 0x95, 0xe0, 0x19, 0x44, 0x07, 0x89, 0x7b, 0x2e,
-	0x7d, 0x8c, 0x98, 0x8f, 0x57, 0x68, 0x83, 0x40, 0xad, 0x35, 0x49, 0x14, 0x4c, 0x40, 0x8a, 0x68,
-	0x69, 0xaf, 0xa5, 0x88, 0x96, 0x47, 0xc6, 0x5a, 0x43, 0xdf, 0x82, 0x76, 0x8e, 0x05, 0xda, 0x4b,
-	0xa6, 0x3d, 0xf5, 0xda, 0x9a, 0x66, 0x9e, 0x2a, 0xb6, 0x3f, 0x83, 0x92, 0xac, 0x2c, 0xda, 0xbf,
-	0xe3, 0x51, 0x31, 0x0f, 0xf2, 0x95, 0x31, 0xc9, 0x1b, 0xa8, 0x04, 0x8b, 0x3b, 0x75, 0x9b, 0xa5,
-	0x5d, 0x6e, 0x2e, 0x7f, 0x0e, 0xca, 0xdd, 0xf0, 0x9b, 0x7c, 0x42, 0xac, 0x35, 0x34, 0x80, 0x0d,
-	0x49, 0x9e, 0x68, 0x7d, 0x94, 0xf7, 0xd4, 0x2d, 0x0f, 0xa2, 0xf9, 0xc9, 0x7d, 0xb0, 0x38, 0xd2,
-	0x3e, 0x34, 0x7a, 0x38, 0xe5, 0xe2, 0xe3, 0x84, 0xed, 0xca, 0x51, 0x37, 0x8f, 0xee, 0x41, 0xc5,
-	0x0e, 0x7a, 0x00, 0x32, 0x82, 0xa0, 0x33, 0x51, 0x33, 0x27, 0xb0, 0x54, 0xf7, 0x9b, 0x4f, 0xef,
-	0x40, 0xc4, 0xa4, 0x17, 0xa0, 0xf7, 0x70, 0xc4, 0xf9, 0x64, 0x39, 0x94, 0x34, 0x65, 0x73, 0x35,
-	0x20, 0x62, 0xec, 0x9e, 0xfc, 0xfe, 0x6c, 0x42, 0xc4, 0xa5, 0x3f, 0x68, 0x0f, 0xe9, 0xac, 0xe3,
-	0x11, 0x2a, 0xd8, 0x15, 0xbd, 0x75, 0xa6, 0xc3, 0x3f, 0xfc, 0xab, 0x4e, 0x60, 0xde, 0x89, 0x59,
-	0x06, 0x15, 0x55, 0xaf, 0xcf, 0xff, 0x0b, 0x00, 0x00, 0xff, 0xff, 0xfc, 0x84, 0xd1, 0xc8, 0xf6,
-	0x0d, 0x00, 0x00,
+	proto.RegisterType((*User)(nil), "charon.rpc.charond.v1.User")
+	proto.RegisterType((*CreateUserRequest)(nil), "charon.rpc.charond.v1.CreateUserRequest")
+	proto.RegisterType((*CreateUserResponse)(nil), "charon.rpc.charond.v1.CreateUserResponse")
+	proto.RegisterType((*GetUserRequest)(nil), "charon.rpc.charond.v1.GetUserRequest")
+	proto.RegisterType((*GetUserResponse)(nil), "charon.rpc.charond.v1.GetUserResponse")
+	proto.RegisterType((*ListUsersRequest)(nil), "charon.rpc.charond.v1.ListUsersRequest")
+	proto.RegisterMapType((map[string]bool)(nil), "charon.rpc.charond.v1.ListUsersRequest.SortEntry")
+	proto.RegisterType((*ListUsersResponse)(nil), "charon.rpc.charond.v1.ListUsersResponse")
+	proto.RegisterType((*DeleteUserRequest)(nil), "charon.rpc.charond.v1.DeleteUserRequest")
+	proto.RegisterType((*ModifyUserRequest)(nil), "charon.rpc.charond.v1.ModifyUserRequest")
+	proto.RegisterType((*ModifyUserResponse)(nil), "charon.rpc.charond.v1.ModifyUserResponse")
+	proto.RegisterType((*ListUserPermissionsRequest)(nil), "charon.rpc.charond.v1.ListUserPermissionsRequest")
+	proto.RegisterType((*ListUserPermissionsResponse)(nil), "charon.rpc.charond.v1.ListUserPermissionsResponse")
+	proto.RegisterType((*SetUserPermissionsRequest)(nil), "charon.rpc.charond.v1.SetUserPermissionsRequest")
+	proto.RegisterType((*SetUserPermissionsResponse)(nil), "charon.rpc.charond.v1.SetUserPermissionsResponse")
+	proto.RegisterType((*ListUserGroupsRequest)(nil), "charon.rpc.charond.v1.ListUserGroupsRequest")
+	proto.RegisterType((*ListUserGroupsResponse)(nil), "charon.rpc.charond.v1.ListUserGroupsResponse")
+	proto.RegisterType((*SetUserGroupsRequest)(nil), "charon.rpc.charond.v1.SetUserGroupsRequest")
+	proto.RegisterType((*SetUserGroupsResponse)(nil), "charon.rpc.charond.v1.SetUserGroupsResponse")
 }
 
 // Reference imports to suppress errors if they are not otherwise used.
@@ -1193,7 +1096,7 @@ func NewUserManagerClient(cc *grpc.ClientConn) UserManagerClient {
 
 func (c *userManagerClient) Create(ctx context.Context, in *CreateUserRequest, opts ...grpc.CallOption) (*CreateUserResponse, error) {
 	out := new(CreateUserResponse)
-	err := c.cc.Invoke(ctx, "/charonrpc.UserManager/Create", in, out, opts...)
+	err := c.cc.Invoke(ctx, "/charon.rpc.charond.v1.UserManager/Create", in, out, opts...)
 	if err != nil {
 		return nil, err
 	}
@@ -1202,7 +1105,7 @@ func (c *userManagerClient) Create(ctx context.Context, in *CreateUserRequest, o
 
 func (c *userManagerClient) Modify(ctx context.Context, in *ModifyUserRequest, opts ...grpc.CallOption) (*ModifyUserResponse, error) {
 	out := new(ModifyUserResponse)
-	err := c.cc.Invoke(ctx, "/charonrpc.UserManager/Modify", in, out, opts...)
+	err := c.cc.Invoke(ctx, "/charon.rpc.charond.v1.UserManager/Modify", in, out, opts...)
 	if err != nil {
 		return nil, err
 	}
@@ -1211,7 +1114,7 @@ func (c *userManagerClient) Modify(ctx context.Context, in *ModifyUserRequest, o
 
 func (c *userManagerClient) Get(ctx context.Context, in *GetUserRequest, opts ...grpc.CallOption) (*GetUserResponse, error) {
 	out := new(GetUserResponse)
-	err := c.cc.Invoke(ctx, "/charonrpc.UserManager/Get", in, out, opts...)
+	err := c.cc.Invoke(ctx, "/charon.rpc.charond.v1.UserManager/Get", in, out, opts...)
 	if err != nil {
 		return nil, err
 	}
@@ -1220,7 +1123,7 @@ func (c *userManagerClient) Get(ctx context.Context, in *GetUserRequest, opts ..
 
 func (c *userManagerClient) List(ctx context.Context, in *ListUsersRequest, opts ...grpc.CallOption) (*ListUsersResponse, error) {
 	out := new(ListUsersResponse)
-	err := c.cc.Invoke(ctx, "/charonrpc.UserManager/List", in, out, opts...)
+	err := c.cc.Invoke(ctx, "/charon.rpc.charond.v1.UserManager/List", in, out, opts...)
 	if err != nil {
 		return nil, err
 	}
@@ -1229,7 +1132,7 @@ func (c *userManagerClient) List(ctx context.Context, in *ListUsersRequest, opts
 
 func (c *userManagerClient) Delete(ctx context.Context, in *DeleteUserRequest, opts ...grpc.CallOption) (*wrappers.BoolValue, error) {
 	out := new(wrappers.BoolValue)
-	err := c.cc.Invoke(ctx, "/charonrpc.UserManager/Delete", in, out, opts...)
+	err := c.cc.Invoke(ctx, "/charon.rpc.charond.v1.UserManager/Delete", in, out, opts...)
 	if err != nil {
 		return nil, err
 	}
@@ -1238,7 +1141,7 @@ func (c *userManagerClient) Delete(ctx context.Context, in *DeleteUserRequest, o
 
 func (c *userManagerClient) ListPermissions(ctx context.Context, in *ListUserPermissionsRequest, opts ...grpc.CallOption) (*ListUserPermissionsResponse, error) {
 	out := new(ListUserPermissionsResponse)
-	err := c.cc.Invoke(ctx, "/charonrpc.UserManager/ListPermissions", in, out, opts...)
+	err := c.cc.Invoke(ctx, "/charon.rpc.charond.v1.UserManager/ListPermissions", in, out, opts...)
 	if err != nil {
 		return nil, err
 	}
@@ -1247,7 +1150,7 @@ func (c *userManagerClient) ListPermissions(ctx context.Context, in *ListUserPer
 
 func (c *userManagerClient) SetPermissions(ctx context.Context, in *SetUserPermissionsRequest, opts ...grpc.CallOption) (*SetUserPermissionsResponse, error) {
 	out := new(SetUserPermissionsResponse)
-	err := c.cc.Invoke(ctx, "/charonrpc.UserManager/SetPermissions", in, out, opts...)
+	err := c.cc.Invoke(ctx, "/charon.rpc.charond.v1.UserManager/SetPermissions", in, out, opts...)
 	if err != nil {
 		return nil, err
 	}
@@ -1256,7 +1159,7 @@ func (c *userManagerClient) SetPermissions(ctx context.Context, in *SetUserPermi
 
 func (c *userManagerClient) ListGroups(ctx context.Context, in *ListUserGroupsRequest, opts ...grpc.CallOption) (*ListUserGroupsResponse, error) {
 	out := new(ListUserGroupsResponse)
-	err := c.cc.Invoke(ctx, "/charonrpc.UserManager/ListGroups", in, out, opts...)
+	err := c.cc.Invoke(ctx, "/charon.rpc.charond.v1.UserManager/ListGroups", in, out, opts...)
 	if err != nil {
 		return nil, err
 	}
@@ -1265,7 +1168,7 @@ func (c *userManagerClient) ListGroups(ctx context.Context, in *ListUserGroupsRe
 
 func (c *userManagerClient) SetGroups(ctx context.Context, in *SetUserGroupsRequest, opts ...grpc.CallOption) (*SetUserGroupsResponse, error) {
 	out := new(SetUserGroupsResponse)
-	err := c.cc.Invoke(ctx, "/charonrpc.UserManager/SetGroups", in, out, opts...)
+	err := c.cc.Invoke(ctx, "/charon.rpc.charond.v1.UserManager/SetGroups", in, out, opts...)
 	if err != nil {
 		return nil, err
 	}
@@ -1299,7 +1202,7 @@ func _UserManager_Create_Handler(srv interface{}, ctx context.Context, dec func(
 	}
 	info := &grpc.UnaryServerInfo{
 		Server:     srv,
-		FullMethod: "/charonrpc.UserManager/Create",
+		FullMethod: "/charon.rpc.charond.v1.UserManager/Create",
 	}
 	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
 		return srv.(UserManagerServer).Create(ctx, req.(*CreateUserRequest))
@@ -1317,7 +1220,7 @@ func _UserManager_Modify_Handler(srv interface{}, ctx context.Context, dec func(
 	}
 	info := &grpc.UnaryServerInfo{
 		Server:     srv,
-		FullMethod: "/charonrpc.UserManager/Modify",
+		FullMethod: "/charon.rpc.charond.v1.UserManager/Modify",
 	}
 	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
 		return srv.(UserManagerServer).Modify(ctx, req.(*ModifyUserRequest))
@@ -1335,7 +1238,7 @@ func _UserManager_Get_Handler(srv interface{}, ctx context.Context, dec func(int
 	}
 	info := &grpc.UnaryServerInfo{
 		Server:     srv,
-		FullMethod: "/charonrpc.UserManager/Get",
+		FullMethod: "/charon.rpc.charond.v1.UserManager/Get",
 	}
 	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
 		return srv.(UserManagerServer).Get(ctx, req.(*GetUserRequest))
@@ -1353,7 +1256,7 @@ func _UserManager_List_Handler(srv interface{}, ctx context.Context, dec func(in
 	}
 	info := &grpc.UnaryServerInfo{
 		Server:     srv,
-		FullMethod: "/charonrpc.UserManager/List",
+		FullMethod: "/charon.rpc.charond.v1.UserManager/List",
 	}
 	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
 		return srv.(UserManagerServer).List(ctx, req.(*ListUsersRequest))
@@ -1371,7 +1274,7 @@ func _UserManager_Delete_Handler(srv interface{}, ctx context.Context, dec func(
 	}
 	info := &grpc.UnaryServerInfo{
 		Server:     srv,
-		FullMethod: "/charonrpc.UserManager/Delete",
+		FullMethod: "/charon.rpc.charond.v1.UserManager/Delete",
 	}
 	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
 		return srv.(UserManagerServer).Delete(ctx, req.(*DeleteUserRequest))
@@ -1389,7 +1292,7 @@ func _UserManager_ListPermissions_Handler(srv interface{}, ctx context.Context,
 	}
 	info := &grpc.UnaryServerInfo{
 		Server:     srv,
-		FullMethod: "/charonrpc.UserManager/ListPermissions",
+		FullMethod: "/charon.rpc.charond.v1.UserManager/ListPermissions",
 	}
 	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
 		return srv.(UserManagerServer).ListPermissions(ctx, req.(*ListUserPermissionsRequest))
@@ -1407,7 +1310,7 @@ func _UserManager_SetPermissions_Handler(srv interface{}, ctx context.Context, d
 	}
 	info := &grpc.UnaryServerInfo{
 		Server:     srv,
-		FullMethod: "/charonrpc.UserManager/SetPermissions",
+		FullMethod: "/charon.rpc.charond.v1.UserManager/SetPermissions",
 	}
 	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
 		return srv.(UserManagerServer).SetPermissions(ctx, req.(*SetUserPermissionsRequest))
@@ -1425,7 +1328,7 @@ func _UserManager_ListGroups_Handler(srv interface{}, ctx context.Context, dec f
 	}
 	info := &grpc.UnaryServerInfo{
 		Server:     srv,
-		FullMethod: "/charonrpc.UserManager/ListGroups",
+		FullMethod: "/charon.rpc.charond.v1.UserManager/ListGroups",
 	}
 	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
 		return srv.(UserManagerServer).ListGroups(ctx, req.(*ListUserGroupsRequest))
@@ -1443,7 +1346,7 @@ func _UserManager_SetGroups_Handler(srv interface{}, ctx context.Context, dec fu
 	}
 	info := &grpc.UnaryServerInfo{
 		Server:     srv,
-		FullMethod: "/charonrpc.UserManager/SetGroups",
+		FullMethod: "/charon.rpc.charond.v1.UserManager/SetGroups",
 	}
 	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
 		return srv.(UserManagerServer).SetGroups(ctx, req.(*SetUserGroupsRequest))
@@ -1452,7 +1355,7 @@ func _UserManager_SetGroups_Handler(srv interface{}, ctx context.Context, dec fu
 }
 
 var _UserManager_serviceDesc = grpc.ServiceDesc{
-	ServiceName: "charonrpc.UserManager",
+	ServiceName: "charon.rpc.charond.v1.UserManager",
 	HandlerType: (*UserManagerServer)(nil),
 	Methods: []grpc.MethodDesc{
 		{
@@ -1493,5 +1396,88 @@ var _UserManager_serviceDesc = grpc.ServiceDesc{
 		},
 	},
 	Streams:  []grpc.StreamDesc{},
-	Metadata: "charonrpc/user.proto",
+	Metadata: "github.com/piotrkowalczuk/charon/pb/rpc/charond/v1/user.proto",
+}
+
+func init() {
+	proto.RegisterFile("github.com/piotrkowalczuk/charon/pb/rpc/charond/v1/user.proto", fileDescriptor_user_ddd072e15a450679)
+}
+
+var fileDescriptor_user_ddd072e15a450679 = []byte{
+	// 1198 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xb4, 0x57, 0x6d, 0x73, 0xdb, 0x44,
+	0x10, 0xae, 0x2c, 0xbf, 0xae, 0x53, 0x27, 0x39, 0x9a, 0xa2, 0x2a, 0x05, 0x8c, 0x3a, 0x21, 0x2e,
+	0x4d, 0x65, 0x12, 0x0a, 0x85, 0x32, 0xd0, 0xa9, 0x4b, 0xc9, 0x84, 0xa1, 0x25, 0x23, 0x43, 0x3f,
+	0xc0, 0x07, 0x23, 0x4b, 0x67, 0x47, 0x13, 0x5b, 0xa7, 0xdc, 0x49, 0xc9, 0xb8, 0x3f, 0x87, 0x6f,
+	0xfc, 0x09, 0x66, 0xf8, 0x49, 0xfc, 0x03, 0xe6, 0x4e, 0x2f, 0x91, 0x65, 0x29, 0x76, 0x32, 0xc3,
+	0xa7, 0xe4, 0xf6, 0x9e, 0xdd, 0x67, 0x6f, 0x77, 0xef, 0x39, 0x19, 0xbe, 0x1d, 0x3b, 0xfe, 0x49,
+	0x30, 0xd4, 0x2d, 0x32, 0xed, 0x7a, 0x0e, 0xf1, 0xe9, 0x29, 0xb9, 0x30, 0x27, 0xd6, 0xbb, 0xe0,
+	0xb4, 0x6b, 0x9d, 0x98, 0x94, 0xb8, 0x5d, 0x6f, 0xd8, 0xa5, 0x9e, 0x15, 0xad, 0xec, 0xee, 0xf9,
+	0x7e, 0x37, 0x60, 0x98, 0xea, 0x1e, 0x25, 0x3e, 0x41, 0x5b, 0xa1, 0x59, 0xa7, 0x9e, 0xa5, 0x47,
+	0x08, 0xfd, 0x7c, 0x5f, 0xfd, 0x68, 0x4c, 0xc8, 0x78, 0x82, 0xbb, 0x02, 0x34, 0x0c, 0x46, 0x5d,
+	0xdf, 0x99, 0x62, 0xe6, 0x9b, 0x53, 0x2f, 0xf4, 0x53, 0x3f, 0xcc, 0x02, 0x2e, 0xa8, 0xe9, 0x79,
+	0x98, 0xb2, 0x68, 0xff, 0xf9, 0x0d, 0xd2, 0xb2, 0xc8, 0x74, 0x4a, 0xdc, 0x28, 0xc0, 0x77, 0x37,
+	0x08, 0x30, 0xa6, 0x24, 0x88, 0x13, 0x7c, 0xef, 0xcc, 0x9f, 0x79, 0x98, 0x75, 0xc3, 0x3f, 0xb1,
+	0xd1, 0x0d, 0x8d, 0x6e, 0xca, 0xa8, 0xfd, 0x2d, 0x43, 0xf9, 0x57, 0x86, 0x29, 0x6a, 0x41, 0xc9,
+	0xb1, 0x15, 0xa9, 0x2d, 0x75, 0x64, 0xa3, 0xe4, 0xd8, 0x48, 0x85, 0x3a, 0xaf, 0x94, 0x6b, 0x4e,
+	0xb1, 0x52, 0x6a, 0x4b, 0x9d, 0x86, 0x91, 0xac, 0xd1, 0x07, 0x00, 0x23, 0x87, 0x32, 0x7f, 0x20,
+	0x76, 0x65, 0xb1, 0xdb, 0x10, 0x96, 0x37, 0x7c, 0x7b, 0x1b, 0x1a, 0x13, 0x33, 0xde, 0x2d, 0x87,
+	0xbe, 0xdc, 0x20, 0x36, 0x3f, 0x86, 0x35, 0x87, 0x0d, 0x58, 0xe0, 0x61, 0xca, 0xe3, 0x29, 0x95,
+	0xb6, 0xd4, 0xa9, 0x1b, 0x4d, 0x87, 0xf5, 0x63, 0x13, 0xf7, 0x77, 0xd8, 0xc0, 0xb4, 0x7c, 0xe7,
+	0x1c, 0x2b, 0x55, 0xb1, 0x5f, 0x77, 0xd8, 0x0b, 0xb1, 0x46, 0xf7, 0xa0, 0xce, 0xfd, 0x7d, 0x73,
+	0x34, 0x52, 0x6a, 0x62, 0xaf, 0xe6, 0xb0, 0x3e, 0x5f, 0x46, 0xa1, 0x2d, 0xe2, 0x8e, 0x1c, 0x3a,
+	0xc5, 0xb6, 0x52, 0x8f, 0x43, 0xbf, 0x8c, 0x4d, 0xe8, 0x6b, 0x00, 0x8b, 0x62, 0xd3, 0xc7, 0xf6,
+	0xc0, 0xf4, 0x95, 0x46, 0x5b, 0xea, 0x34, 0x0f, 0x54, 0x3d, 0x6c, 0xa7, 0x1e, 0xb7, 0x53, 0xff,
+	0x25, 0xee, 0xb7, 0xd1, 0x88, 0xd0, 0x2f, 0x7c, 0xb4, 0x77, 0xe9, 0x3a, 0x9c, 0x29, 0x20, 0x5c,
+	0x6f, 0xeb, 0x51, 0x31, 0x8f, 0x5c, 0xff, 0xcb, 0x27, 0x09, 0xba, 0x37, 0xe3, 0x44, 0x81, 0x67,
+	0xc7, 0x44, 0xcd, 0xe5, 0x44, 0x11, 0x3a, 0x24, 0x8a, 0x5d, 0x87, 0x33, 0x65, 0x2d, 0x97, 0x28,
+	0x02, 0xf4, 0x66, 0xda, 0xbf, 0x25, 0xd8, 0x7c, 0x29, 0x68, 0x79, 0x1b, 0x0d, 0x7c, 0x16, 0x60,
+	0xe6, 0xcf, 0x75, 0x4f, 0xca, 0x74, 0x6f, 0x07, 0x5a, 0xde, 0xc4, 0x74, 0xdc, 0x81, 0x67, 0x32,
+	0x76, 0x41, 0xa8, 0x1d, 0xf5, 0xf7, 0xb6, 0xb0, 0x1e, 0x47, 0x46, 0xb4, 0x0b, 0xeb, 0x0c, 0x5b,
+	0x01, 0xc5, 0x97, 0x38, 0xde, 0xe9, 0x35, 0xa3, 0x15, 0x9a, 0x13, 0xe0, 0xfc, 0x34, 0x94, 0xaf,
+	0x9c, 0x86, 0x4a, 0x66, 0x1a, 0xba, 0x99, 0x69, 0xa8, 0x8a, 0xd3, 0xae, 0xc5, 0xa7, 0xed, 0x11,
+	0x32, 0x99, 0x9f, 0x8d, 0x87, 0xe9, 0xd9, 0xa8, 0xe5, 0xa0, 0x2f, 0x27, 0x65, 0x37, 0x35, 0x29,
+	0xf5, 0x1c, 0x64, 0x32, 0x37, 0xdd, 0xcc, 0xdc, 0x34, 0xf2, 0x93, 0x48, 0xa6, 0x48, 0x7b, 0x05,
+	0x28, 0x5d, 0x72, 0xe6, 0x11, 0x97, 0xf1, 0xb3, 0x94, 0xc5, 0x19, 0x24, 0xe1, 0xbe, 0xad, 0xe7,
+	0x8a, 0x8b, 0x2e, 0x5c, 0x04, 0x50, 0x6b, 0x43, 0xeb, 0x10, 0xfb, 0xe9, 0xb6, 0x65, 0x2e, 0xa1,
+	0xd6, 0x83, 0xf5, 0x04, 0x71, 0x53, 0x96, 0xbf, 0x64, 0xd8, 0xf8, 0xc9, 0x61, 0x22, 0x0a, 0x8b,
+	0x89, 0xb2, 0x75, 0x97, 0x96, 0xd5, 0x3d, 0x5d, 0xcc, 0xd2, 0x55, 0xc5, 0x9c, 0xbf, 0x26, 0x72,
+	0x34, 0xbd, 0x67, 0x05, 0xd7, 0x64, 0x07, 0xaa, 0x64, 0x34, 0x62, 0xd8, 0x57, 0xec, 0xbc, 0x39,
+	0x8f, 0x36, 0xd1, 0x03, 0xa8, 0x4c, 0x9c, 0xa9, 0xe3, 0x2b, 0x38, 0x0f, 0x15, 0xee, 0xa1, 0x23,
+	0x28, 0x33, 0x42, 0x7d, 0x65, 0xd4, 0x96, 0x3b, 0xcd, 0x83, 0xfd, 0x82, 0xca, 0x64, 0x4b, 0xa1,
+	0xf7, 0x09, 0xf5, 0x5f, 0xb9, 0x3e, 0x9d, 0xf5, 0x4a, 0x8a, 0x64, 0x88, 0x10, 0xe8, 0x29, 0xd4,
+	0x09, 0xb5, 0x31, 0xe5, 0x47, 0x18, 0x8b, 0x70, 0xf7, 0x0b, 0xc2, 0xfd, 0xcc, 0x61, 0x46, 0x4d,
+	0xa0, 0x7b, 0x33, 0xf5, 0x29, 0x34, 0x92, 0x78, 0x68, 0x03, 0xe4, 0x53, 0x3c, 0x8b, 0xee, 0x1f,
+	0xff, 0x17, 0xdd, 0x81, 0xca, 0xb9, 0x39, 0x09, 0x42, 0x45, 0xad, 0x1b, 0xe1, 0xe2, 0x59, 0xe9,
+	0x2b, 0xe9, 0xc7, 0x72, 0xbd, 0xbc, 0x61, 0x6b, 0x3f, 0xc0, 0x66, 0x2a, 0xbf, 0xa8, 0xe3, 0xfb,
+	0x50, 0xe1, 0x2d, 0x60, 0x8a, 0x24, 0x32, 0xb9, 0xb2, 0xe5, 0x21, 0x52, 0x7b, 0x00, 0x9b, 0xdf,
+	0xe3, 0x09, 0x9e, 0xd7, 0x84, 0xec, 0x70, 0xfd, 0x23, 0xc3, 0xe6, 0x6b, 0x62, 0x3b, 0xa3, 0xd9,
+	0x15, 0x28, 0xf4, 0x69, 0xe6, 0x1d, 0x68, 0x1e, 0xb4, 0xe2, 0xea, 0xf7, 0x7d, 0xea, 0xb8, 0xe3,
+	0x94, 0xb2, 0x7c, 0xb1, 0xa0, 0x2c, 0x72, 0xae, 0xc7, 0x72, 0xa5, 0x29, 0xe7, 0x2a, 0xcd, 0xe3,
+	0x39, 0xa5, 0xa9, 0xe4, 0xc6, 0x4e, 0x29, 0xcf, 0xa3, 0xb4, 0xf2, 0x54, 0xf3, 0x73, 0x2f, 0x54,
+	0xa2, 0xda, 0xb5, 0x94, 0xa8, 0xbe, 0xb2, 0x12, 0x35, 0xae, 0xa3, 0x44, 0xb0, 0x82, 0x12, 0xa5,
+	0x5b, 0x78, 0x53, 0x8d, 0xd8, 0x03, 0x35, 0x9e, 0xbb, 0x63, 0x4c, 0xa7, 0x0e, 0x63, 0x0e, 0x71,
+	0x59, 0xd1, 0xe0, 0x3c, 0x87, 0xed, 0x5c, 0x74, 0xc4, 0xde, 0x86, 0xa6, 0x77, 0x69, 0x16, 0x53,
+	0xdb, 0x30, 0xd2, 0x26, 0x6d, 0x02, 0xf7, 0xfa, 0xb8, 0x88, 0xed, 0x7d, 0xa8, 0xf1, 0x9c, 0x06,
+	0x09, 0x65, 0x95, 0x2f, 0x8f, 0xec, 0x6c, 0xdc, 0xd2, 0x42, 0x5c, 0x7e, 0xbd, 0x46, 0x84, 0x5a,
+	0xe1, 0x27, 0x49, 0xdd, 0x08, 0x17, 0x9a, 0x0b, 0x6a, 0x1e, 0x5b, 0x94, 0xad, 0x02, 0xb5, 0x48,
+	0x8e, 0x22, 0xba, 0x78, 0xc9, 0x77, 0x28, 0x9e, 0x92, 0x73, 0x1c, 0x3e, 0x90, 0xb2, 0x11, 0x2f,
+	0xd1, 0x7d, 0x68, 0x04, 0xae, 0x4f, 0x02, 0xeb, 0x04, 0x87, 0x23, 0x2e, 0x1b, 0x97, 0x06, 0x6d,
+	0x17, 0xb6, 0xe2, 0xf2, 0x1c, 0xf2, 0x6f, 0xb2, 0xc2, 0x3a, 0xbe, 0x81, 0xbb, 0x59, 0x60, 0x94,
+	0xd4, 0x13, 0xa8, 0x8a, 0xcf, 0xb9, 0xf8, 0xce, 0x17, 0xa9, 0x8f, 0x70, 0x33, 0x22, 0xac, 0x76,
+	0x08, 0x77, 0xa2, 0x83, 0xce, 0xf3, 0x16, 0x56, 0xf4, 0x6e, 0x42, 0xc3, 0x8b, 0x29, 0x27, 0x81,
+	0x1c, 0xd8, 0xca, 0x04, 0xfa, 0xbf, 0x8a, 0x75, 0xf0, 0x67, 0x0d, 0x9a, 0x9c, 0xe8, 0xb5, 0xe9,
+	0x9a, 0x63, 0x4c, 0xd1, 0x00, 0xaa, 0xe1, 0xd3, 0x8a, 0x3a, 0x05, 0x67, 0x5e, 0xf8, 0xd8, 0x51,
+	0x1f, 0xae, 0x80, 0x0c, 0x0f, 0xa0, 0xdd, 0xe2, 0x04, 0xe1, 0x8d, 0x29, 0x24, 0x58, 0xd0, 0xc4,
+	0x42, 0x82, 0xc5, 0xab, 0xa7, 0xdd, 0x42, 0x6f, 0x41, 0x3e, 0xc4, 0x3e, 0xda, 0x29, 0x6a, 0xd9,
+	0xdc, 0x8b, 0xaf, 0x7e, 0xb2, 0x0c, 0x96, 0xc4, 0xfd, 0x1d, 0xca, 0x7c, 0x5a, 0xd0, 0xee, 0x8a,
+	0x0f, 0x9b, 0xda, 0x59, 0x0e, 0x4c, 0x82, 0x1f, 0x43, 0x35, 0x7c, 0x30, 0x0a, 0xab, 0xb2, 0xf0,
+	0x9e, 0xa8, 0x8b, 0x9f, 0xb3, 0x5c, 0x9f, 0xde, 0xf2, 0x27, 0x4d, 0xbb, 0x85, 0xde, 0xc1, 0x3a,
+	0x27, 0x4a, 0x5d, 0x39, 0xb4, 0xec, 0x49, 0x5e, 0x14, 0x03, 0xf5, 0xe0, 0x3a, 0x2e, 0xc9, 0x69,
+	0x2e, 0xa0, 0xd5, 0xc7, 0x73, 0xd4, 0x9f, 0x15, 0xc4, 0x29, 0x94, 0x21, 0x75, 0xff, 0x1a, 0x1e,
+	0x09, 0xf1, 0x29, 0x00, 0xcf, 0x2c, 0xbc, 0x35, 0x68, 0x6f, 0x49, 0xf2, 0x73, 0xb7, 0x54, 0x7d,
+	0xbc, 0x22, 0x3a, 0x21, 0x3b, 0x81, 0x46, 0x1f, 0xc7, 0x5c, 0x8f, 0xae, 0x4e, 0x77, 0x9e, 0x6a,
+	0x6f, 0x35, 0x70, 0xcc, 0xd4, 0xfb, 0x03, 0xda, 0x16, 0x99, 0xea, 0xf1, 0x8f, 0xd2, 0x3c, 0xdf,
+	0x63, 0xe9, 0xb7, 0x67, 0xd7, 0xff, 0xd1, 0xfa, 0x4d, 0xf4, 0xef, 0xb0, 0x2a, 0x66, 0xe8, 0xf3,
+	0xff, 0x02, 0x00, 0x00, 0xff, 0xff, 0x49, 0xe1, 0xfd, 0xc5, 0xd1, 0x0f, 0x00, 0x00,
 }
diff --git a/charonrpc/user.proto b/pb/rpc/charond/v1/user.proto
similarity index 86%
rename from charonrpc/user.proto
rename to pb/rpc/charond/v1/user.proto
index 731fdce..617bcd7 100644
--- a/charonrpc/user.proto
+++ b/pb/rpc/charond/v1/user.proto
@@ -1,142 +1,144 @@
-syntax = "proto3";
-
-package charonrpc;
-
-option go_package = "github.com/piotrkowalczuk/charon/charonrpc";
-
-import "google/protobuf/timestamp.proto";
-import "google/protobuf/wrappers.proto";
-import "charonrpc/common.proto";
-import "charonrpc/group.proto";
-import "qtypes/qtypes.proto";
-import "ntypes/ntypes.proto";
-
-service UserManager {
-    rpc Create(CreateUserRequest) returns (CreateUserResponse) {};
-    rpc Modify(ModifyUserRequest) returns (ModifyUserResponse) {};
-    rpc Get(GetUserRequest) returns (GetUserResponse) {};
-    rpc List(ListUsersRequest) returns (ListUsersResponse) {};
-    rpc Delete(DeleteUserRequest) returns (google.protobuf.BoolValue) {};
-
-    rpc ListPermissions(ListUserPermissionsRequest) returns (ListUserPermissionsResponse) {};
-    rpc SetPermissions(SetUserPermissionsRequest) returns (SetUserPermissionsResponse) {};
-
-    rpc ListGroups(ListUserGroupsRequest) returns (ListUserGroupsResponse) {};
-    rpc SetGroups(SetUserGroupsRequest) returns (SetUserGroupsResponse) {};
-}
-
-
-message User {
-    int64 id = 1;
-    string username = 2;
-    string first_name = 3;
-    string last_name = 4;
-    bool is_superuser = 5;
-    bool is_active = 6;
-    bool is_staff = 7;
-    bool is_confirmed = 8;
-    google.protobuf.Timestamp created_at = 9;
-    ntypes.Int64 created_by = 10;
-    google.protobuf.Timestamp updated_at = 11;
-    ntypes.Int64 updated_by = 12;
-}
-
-message CreateUserRequest {
-    string username = 1;
-    string plain_password = 2;
-    bytes secure_password = 3;
-    string first_name = 4;
-    string last_name = 5;
-    ntypes.Bool is_superuser = 6;
-    ntypes.Bool is_active = 7;
-    ntypes.Bool is_staff = 8;
-    ntypes.Bool is_confirmed = 9;
-}
-
-message CreateUserResponse {
-    User user = 1;
-}
-
-message GetUserRequest {
-    int64 id = 1;
-}
-
-message GetUserResponse {
-    User user = 1;
-}
-
-message ListUsersRequest {
-    reserved 4 to 99;
-    ntypes.Bool is_superuser = 1;
-    ntypes.Bool is_staff = 2;
-    qtypes.Int64 created_by = 3;
-    ntypes.Int64 offset = 100;
-    ntypes.Int64 limit = 101;
-    map<string, bool> sort = 102 [deprecated=true];
-    repeated Order order_by = 103;
-}
-
-message ListUsersResponse {
-    repeated User users = 1;
-}
-
-message DeleteUserRequest {
-    int64 id = 1;
-}
-
-message ModifyUserRequest {
-    int64 id = 1;
-    ntypes.String username = 2;
-    ntypes.String plain_password = 3;
-    bytes secure_password = 4;
-    ntypes.String first_name = 5;
-    ntypes.String last_name = 6;
-    ntypes.Bool is_superuser = 7;
-    ntypes.Bool is_active = 8;
-    ntypes.Bool is_staff = 9;
-    ntypes.Bool is_confirmed = 10;
-}
-
-message ModifyUserResponse {
-    User user = 1;
-}
-
-message ListUserPermissionsRequest {
-    int64 id = 1;
-}
-
-message ListUserPermissionsResponse {
-    repeated string permissions = 1;
-}
-
-message SetUserPermissionsRequest {
-    int64 user_id = 1;
-    repeated string permissions = 2;
-    // Force tells if permission should be created in case if it does not exists.
-    bool force = 3;
-}
-
-message SetUserPermissionsResponse {
-    int64 created = 1;
-    int64 removed = 2;
-    int64 untouched = 3;
-}
-
-message ListUserGroupsRequest {
-    int64 id = 1;
-}
-
-message ListUserGroupsResponse {
-    repeated Group groups = 1;
-}
-
-message SetUserGroupsRequest {
-    int64 user_id = 1;
-    repeated int64 groups = 2;
-}
-
-message SetUserGroupsResponse {
-    int64 created = 1;
-    int64 removed = 2;
-    int64 untouched = 3;
+syntax = "proto3";
+
+package charon.rpc.charond.v1;
+
+option go_package = "github.com/piotrkowalczuk/charon/pb/rpc/charond/v1;charond";
+option java_multiple_files = true;
+option java_package = "com.github.charon.rpc.charond.v1";
+
+import "google/protobuf/timestamp.proto";
+import "google/protobuf/wrappers.proto";
+import "github.com/piotrkowalczuk/charon/pb/rpc/charond/v1/common.proto";
+import "github.com/piotrkowalczuk/charon/pb/rpc/charond/v1/group.proto";
+import "qtypes/qtypes.proto";
+import "ntypes/ntypes.proto";
+
+service UserManager {
+    rpc Create(CreateUserRequest) returns (CreateUserResponse) {};
+    rpc Modify(ModifyUserRequest) returns (ModifyUserResponse) {};
+    rpc Get(GetUserRequest) returns (GetUserResponse) {};
+    rpc List(ListUsersRequest) returns (ListUsersResponse) {};
+    rpc Delete(DeleteUserRequest) returns (google.protobuf.BoolValue) {};
+
+    rpc ListPermissions(ListUserPermissionsRequest) returns (ListUserPermissionsResponse) {};
+    rpc SetPermissions(SetUserPermissionsRequest) returns (SetUserPermissionsResponse) {};
+
+    rpc ListGroups(ListUserGroupsRequest) returns (ListUserGroupsResponse) {};
+    rpc SetGroups(SetUserGroupsRequest) returns (SetUserGroupsResponse) {};
+}
+
+
+message User {
+    int64 id = 1;
+    string username = 2;
+    string first_name = 3;
+    string last_name = 4;
+    bool is_superuser = 5;
+    bool is_active = 6;
+    bool is_staff = 7;
+    bool is_confirmed = 8;
+    google.protobuf.Timestamp created_at = 9;
+    ntypes.Int64 created_by = 10;
+    google.protobuf.Timestamp updated_at = 11;
+    ntypes.Int64 updated_by = 12;
+}
+
+message CreateUserRequest {
+    string username = 1;
+    string plain_password = 2;
+    bytes secure_password = 3;
+    string first_name = 4;
+    string last_name = 5;
+    ntypes.Bool is_superuser = 6;
+    ntypes.Bool is_active = 7;
+    ntypes.Bool is_staff = 8;
+    ntypes.Bool is_confirmed = 9;
+}
+
+message CreateUserResponse {
+    User user = 1;
+}
+
+message GetUserRequest {
+    int64 id = 1;
+}
+
+message GetUserResponse {
+    User user = 1;
+}
+
+message ListUsersRequest {
+    reserved 4 to 99;
+    ntypes.Bool is_superuser = 1;
+    ntypes.Bool is_staff = 2;
+    qtypes.Int64 created_by = 3;
+    ntypes.Int64 offset = 100;
+    ntypes.Int64 limit = 101;
+    map<string, bool> sort = 102 [deprecated=true];
+    repeated Order order_by = 103;
+}
+
+message ListUsersResponse {
+    repeated User users = 1;
+}
+
+message DeleteUserRequest {
+    int64 id = 1;
+}
+
+message ModifyUserRequest {
+    int64 id = 1;
+    ntypes.String username = 2;
+    ntypes.String plain_password = 3;
+    bytes secure_password = 4;
+    ntypes.String first_name = 5;
+    ntypes.String last_name = 6;
+    ntypes.Bool is_superuser = 7;
+    ntypes.Bool is_active = 8;
+    ntypes.Bool is_staff = 9;
+    ntypes.Bool is_confirmed = 10;
+}
+
+message ModifyUserResponse {
+    User user = 1;
+}
+
+message ListUserPermissionsRequest {
+    int64 id = 1;
+}
+
+message ListUserPermissionsResponse {
+    repeated string permissions = 1;
+}
+
+message SetUserPermissionsRequest {
+    int64 user_id = 1;
+    repeated string permissions = 2;
+    // Force tells if permission should be created in case if it does not exists.
+    bool force = 3;
+}
+
+message SetUserPermissionsResponse {
+    int64 created = 1;
+    int64 removed = 2;
+    int64 untouched = 3;
+}
+
+message ListUserGroupsRequest {
+    int64 id = 1;
+}
+
+message ListUserGroupsResponse {
+    repeated Group groups = 1;
+}
+
+message SetUserGroupsRequest {
+    int64 user_id = 1;
+    repeated int64 groups = 2;
+}
+
+message SetUserGroupsResponse {
+    int64 created = 1;
+    int64 removed = 2;
+    int64 untouched = 3;
 }
\ No newline at end of file
diff --git a/charontest/auth_client.go b/pb/rpc/charond/v1mock/auth_client.go
similarity index 63%
rename from charontest/auth_client.go
rename to pb/rpc/charond/v1mock/auth_client.go
index 85dc390..1de397d 100644
--- a/charontest/auth_client.go
+++ b/pb/rpc/charond/v1mock/auth_client.go
@@ -1,8 +1,8 @@
 // Code generated by mockery v1.0.0. DO NOT EDIT.
 
-package charontest
+package charondmock
 
-import charonrpc "github.com/piotrkowalczuk/charon/charonrpc"
+import charond "github.com/piotrkowalczuk/charon/pb/rpc/charond/v1"
 import context "context"
 import empty "github.com/golang/protobuf/ptypes/empty"
 import grpc "google.golang.org/grpc"
@@ -15,7 +15,7 @@ type AuthClient struct {
 }
 
 // Actor provides a mock function with given fields: ctx, in, opts
-func (_m *AuthClient) Actor(ctx context.Context, in *wrappers.StringValue, opts ...grpc.CallOption) (*charonrpc.ActorResponse, error) {
+func (_m *AuthClient) Actor(ctx context.Context, in *wrappers.StringValue, opts ...grpc.CallOption) (*charond.ActorResponse, error) {
 	_va := make([]interface{}, len(opts))
 	for _i := range opts {
 		_va[_i] = opts[_i]
@@ -25,12 +25,12 @@ func (_m *AuthClient) Actor(ctx context.Context, in *wrappers.StringValue, opts
 	_ca = append(_ca, _va...)
 	ret := _m.Called(_ca...)
 
-	var r0 *charonrpc.ActorResponse
-	if rf, ok := ret.Get(0).(func(context.Context, *wrappers.StringValue, ...grpc.CallOption) *charonrpc.ActorResponse); ok {
+	var r0 *charond.ActorResponse
+	if rf, ok := ret.Get(0).(func(context.Context, *wrappers.StringValue, ...grpc.CallOption) *charond.ActorResponse); ok {
 		r0 = rf(ctx, in, opts...)
 	} else {
 		if ret.Get(0) != nil {
-			r0 = ret.Get(0).(*charonrpc.ActorResponse)
+			r0 = ret.Get(0).(*charond.ActorResponse)
 		}
 	}
 
@@ -45,7 +45,7 @@ func (_m *AuthClient) Actor(ctx context.Context, in *wrappers.StringValue, opts
 }
 
 // BelongsTo provides a mock function with given fields: ctx, in, opts
-func (_m *AuthClient) BelongsTo(ctx context.Context, in *charonrpc.BelongsToRequest, opts ...grpc.CallOption) (*wrappers.BoolValue, error) {
+func (_m *AuthClient) BelongsTo(ctx context.Context, in *charond.BelongsToRequest, opts ...grpc.CallOption) (*wrappers.BoolValue, error) {
 	_va := make([]interface{}, len(opts))
 	for _i := range opts {
 		_va[_i] = opts[_i]
@@ -56,7 +56,7 @@ func (_m *AuthClient) BelongsTo(ctx context.Context, in *charonrpc.BelongsToRequ
 	ret := _m.Called(_ca...)
 
 	var r0 *wrappers.BoolValue
-	if rf, ok := ret.Get(0).(func(context.Context, *charonrpc.BelongsToRequest, ...grpc.CallOption) *wrappers.BoolValue); ok {
+	if rf, ok := ret.Get(0).(func(context.Context, *charond.BelongsToRequest, ...grpc.CallOption) *wrappers.BoolValue); ok {
 		r0 = rf(ctx, in, opts...)
 	} else {
 		if ret.Get(0) != nil {
@@ -65,7 +65,7 @@ func (_m *AuthClient) BelongsTo(ctx context.Context, in *charonrpc.BelongsToRequ
 	}
 
 	var r1 error
-	if rf, ok := ret.Get(1).(func(context.Context, *charonrpc.BelongsToRequest, ...grpc.CallOption) error); ok {
+	if rf, ok := ret.Get(1).(func(context.Context, *charond.BelongsToRequest, ...grpc.CallOption) error); ok {
 		r1 = rf(ctx, in, opts...)
 	} else {
 		r1 = ret.Error(1)
@@ -75,7 +75,7 @@ func (_m *AuthClient) BelongsTo(ctx context.Context, in *charonrpc.BelongsToRequ
 }
 
 // IsAuthenticated provides a mock function with given fields: ctx, in, opts
-func (_m *AuthClient) IsAuthenticated(ctx context.Context, in *charonrpc.IsAuthenticatedRequest, opts ...grpc.CallOption) (*wrappers.BoolValue, error) {
+func (_m *AuthClient) IsAuthenticated(ctx context.Context, in *charond.IsAuthenticatedRequest, opts ...grpc.CallOption) (*wrappers.BoolValue, error) {
 	_va := make([]interface{}, len(opts))
 	for _i := range opts {
 		_va[_i] = opts[_i]
@@ -86,7 +86,7 @@ func (_m *AuthClient) IsAuthenticated(ctx context.Context, in *charonrpc.IsAuthe
 	ret := _m.Called(_ca...)
 
 	var r0 *wrappers.BoolValue
-	if rf, ok := ret.Get(0).(func(context.Context, *charonrpc.IsAuthenticatedRequest, ...grpc.CallOption) *wrappers.BoolValue); ok {
+	if rf, ok := ret.Get(0).(func(context.Context, *charond.IsAuthenticatedRequest, ...grpc.CallOption) *wrappers.BoolValue); ok {
 		r0 = rf(ctx, in, opts...)
 	} else {
 		if ret.Get(0) != nil {
@@ -95,7 +95,7 @@ func (_m *AuthClient) IsAuthenticated(ctx context.Context, in *charonrpc.IsAuthe
 	}
 
 	var r1 error
-	if rf, ok := ret.Get(1).(func(context.Context, *charonrpc.IsAuthenticatedRequest, ...grpc.CallOption) error); ok {
+	if rf, ok := ret.Get(1).(func(context.Context, *charond.IsAuthenticatedRequest, ...grpc.CallOption) error); ok {
 		r1 = rf(ctx, in, opts...)
 	} else {
 		r1 = ret.Error(1)
@@ -105,7 +105,7 @@ func (_m *AuthClient) IsAuthenticated(ctx context.Context, in *charonrpc.IsAuthe
 }
 
 // IsGranted provides a mock function with given fields: ctx, in, opts
-func (_m *AuthClient) IsGranted(ctx context.Context, in *charonrpc.IsGrantedRequest, opts ...grpc.CallOption) (*wrappers.BoolValue, error) {
+func (_m *AuthClient) IsGranted(ctx context.Context, in *charond.IsGrantedRequest, opts ...grpc.CallOption) (*wrappers.BoolValue, error) {
 	_va := make([]interface{}, len(opts))
 	for _i := range opts {
 		_va[_i] = opts[_i]
@@ -116,7 +116,7 @@ func (_m *AuthClient) IsGranted(ctx context.Context, in *charonrpc.IsGrantedRequ
 	ret := _m.Called(_ca...)
 
 	var r0 *wrappers.BoolValue
-	if rf, ok := ret.Get(0).(func(context.Context, *charonrpc.IsGrantedRequest, ...grpc.CallOption) *wrappers.BoolValue); ok {
+	if rf, ok := ret.Get(0).(func(context.Context, *charond.IsGrantedRequest, ...grpc.CallOption) *wrappers.BoolValue); ok {
 		r0 = rf(ctx, in, opts...)
 	} else {
 		if ret.Get(0) != nil {
@@ -125,7 +125,7 @@ func (_m *AuthClient) IsGranted(ctx context.Context, in *charonrpc.IsGrantedRequ
 	}
 
 	var r1 error
-	if rf, ok := ret.Get(1).(func(context.Context, *charonrpc.IsGrantedRequest, ...grpc.CallOption) error); ok {
+	if rf, ok := ret.Get(1).(func(context.Context, *charond.IsGrantedRequest, ...grpc.CallOption) error); ok {
 		r1 = rf(ctx, in, opts...)
 	} else {
 		r1 = ret.Error(1)
@@ -135,7 +135,7 @@ func (_m *AuthClient) IsGranted(ctx context.Context, in *charonrpc.IsGrantedRequ
 }
 
 // Login provides a mock function with given fields: ctx, in, opts
-func (_m *AuthClient) Login(ctx context.Context, in *charonrpc.LoginRequest, opts ...grpc.CallOption) (*wrappers.StringValue, error) {
+func (_m *AuthClient) Login(ctx context.Context, in *charond.LoginRequest, opts ...grpc.CallOption) (*wrappers.StringValue, error) {
 	_va := make([]interface{}, len(opts))
 	for _i := range opts {
 		_va[_i] = opts[_i]
@@ -146,7 +146,7 @@ func (_m *AuthClient) Login(ctx context.Context, in *charonrpc.LoginRequest, opt
 	ret := _m.Called(_ca...)
 
 	var r0 *wrappers.StringValue
-	if rf, ok := ret.Get(0).(func(context.Context, *charonrpc.LoginRequest, ...grpc.CallOption) *wrappers.StringValue); ok {
+	if rf, ok := ret.Get(0).(func(context.Context, *charond.LoginRequest, ...grpc.CallOption) *wrappers.StringValue); ok {
 		r0 = rf(ctx, in, opts...)
 	} else {
 		if ret.Get(0) != nil {
@@ -155,7 +155,7 @@ func (_m *AuthClient) Login(ctx context.Context, in *charonrpc.LoginRequest, opt
 	}
 
 	var r1 error
-	if rf, ok := ret.Get(1).(func(context.Context, *charonrpc.LoginRequest, ...grpc.CallOption) error); ok {
+	if rf, ok := ret.Get(1).(func(context.Context, *charond.LoginRequest, ...grpc.CallOption) error); ok {
 		r1 = rf(ctx, in, opts...)
 	} else {
 		r1 = ret.Error(1)
@@ -165,7 +165,7 @@ func (_m *AuthClient) Login(ctx context.Context, in *charonrpc.LoginRequest, opt
 }
 
 // Logout provides a mock function with given fields: ctx, in, opts
-func (_m *AuthClient) Logout(ctx context.Context, in *charonrpc.LogoutRequest, opts ...grpc.CallOption) (*empty.Empty, error) {
+func (_m *AuthClient) Logout(ctx context.Context, in *charond.LogoutRequest, opts ...grpc.CallOption) (*empty.Empty, error) {
 	_va := make([]interface{}, len(opts))
 	for _i := range opts {
 		_va[_i] = opts[_i]
@@ -176,7 +176,7 @@ func (_m *AuthClient) Logout(ctx context.Context, in *charonrpc.LogoutRequest, o
 	ret := _m.Called(_ca...)
 
 	var r0 *empty.Empty
-	if rf, ok := ret.Get(0).(func(context.Context, *charonrpc.LogoutRequest, ...grpc.CallOption) *empty.Empty); ok {
+	if rf, ok := ret.Get(0).(func(context.Context, *charond.LogoutRequest, ...grpc.CallOption) *empty.Empty); ok {
 		r0 = rf(ctx, in, opts...)
 	} else {
 		if ret.Get(0) != nil {
@@ -185,7 +185,7 @@ func (_m *AuthClient) Logout(ctx context.Context, in *charonrpc.LogoutRequest, o
 	}
 
 	var r1 error
-	if rf, ok := ret.Get(1).(func(context.Context, *charonrpc.LogoutRequest, ...grpc.CallOption) error); ok {
+	if rf, ok := ret.Get(1).(func(context.Context, *charond.LogoutRequest, ...grpc.CallOption) error); ok {
 		r1 = rf(ctx, in, opts...)
 	} else {
 		r1 = ret.Error(1)
diff --git a/charontest/auth_server.go b/pb/rpc/charond/v1mock/auth_server.go
similarity index 61%
rename from charontest/auth_server.go
rename to pb/rpc/charond/v1mock/auth_server.go
index 496199d..0497256 100644
--- a/charontest/auth_server.go
+++ b/pb/rpc/charond/v1mock/auth_server.go
@@ -1,8 +1,8 @@
 // Code generated by mockery v1.0.0. DO NOT EDIT.
 
-package charontest
+package charondmock
 
-import charonrpc "github.com/piotrkowalczuk/charon/charonrpc"
+import charond "github.com/piotrkowalczuk/charon/pb/rpc/charond/v1"
 import context "context"
 import empty "github.com/golang/protobuf/ptypes/empty"
 import mock "github.com/stretchr/testify/mock"
@@ -14,15 +14,15 @@ type AuthServer struct {
 }
 
 // Actor provides a mock function with given fields: _a0, _a1
-func (_m *AuthServer) Actor(_a0 context.Context, _a1 *wrappers.StringValue) (*charonrpc.ActorResponse, error) {
+func (_m *AuthServer) Actor(_a0 context.Context, _a1 *wrappers.StringValue) (*charond.ActorResponse, error) {
 	ret := _m.Called(_a0, _a1)
 
-	var r0 *charonrpc.ActorResponse
-	if rf, ok := ret.Get(0).(func(context.Context, *wrappers.StringValue) *charonrpc.ActorResponse); ok {
+	var r0 *charond.ActorResponse
+	if rf, ok := ret.Get(0).(func(context.Context, *wrappers.StringValue) *charond.ActorResponse); ok {
 		r0 = rf(_a0, _a1)
 	} else {
 		if ret.Get(0) != nil {
-			r0 = ret.Get(0).(*charonrpc.ActorResponse)
+			r0 = ret.Get(0).(*charond.ActorResponse)
 		}
 	}
 
@@ -37,11 +37,11 @@ func (_m *AuthServer) Actor(_a0 context.Context, _a1 *wrappers.StringValue) (*ch
 }
 
 // BelongsTo provides a mock function with given fields: _a0, _a1
-func (_m *AuthServer) BelongsTo(_a0 context.Context, _a1 *charonrpc.BelongsToRequest) (*wrappers.BoolValue, error) {
+func (_m *AuthServer) BelongsTo(_a0 context.Context, _a1 *charond.BelongsToRequest) (*wrappers.BoolValue, error) {
 	ret := _m.Called(_a0, _a1)
 
 	var r0 *wrappers.BoolValue
-	if rf, ok := ret.Get(0).(func(context.Context, *charonrpc.BelongsToRequest) *wrappers.BoolValue); ok {
+	if rf, ok := ret.Get(0).(func(context.Context, *charond.BelongsToRequest) *wrappers.BoolValue); ok {
 		r0 = rf(_a0, _a1)
 	} else {
 		if ret.Get(0) != nil {
@@ -50,7 +50,7 @@ func (_m *AuthServer) BelongsTo(_a0 context.Context, _a1 *charonrpc.BelongsToReq
 	}
 
 	var r1 error
-	if rf, ok := ret.Get(1).(func(context.Context, *charonrpc.BelongsToRequest) error); ok {
+	if rf, ok := ret.Get(1).(func(context.Context, *charond.BelongsToRequest) error); ok {
 		r1 = rf(_a0, _a1)
 	} else {
 		r1 = ret.Error(1)
@@ -60,11 +60,11 @@ func (_m *AuthServer) BelongsTo(_a0 context.Context, _a1 *charonrpc.BelongsToReq
 }
 
 // IsAuthenticated provides a mock function with given fields: _a0, _a1
-func (_m *AuthServer) IsAuthenticated(_a0 context.Context, _a1 *charonrpc.IsAuthenticatedRequest) (*wrappers.BoolValue, error) {
+func (_m *AuthServer) IsAuthenticated(_a0 context.Context, _a1 *charond.IsAuthenticatedRequest) (*wrappers.BoolValue, error) {
 	ret := _m.Called(_a0, _a1)
 
 	var r0 *wrappers.BoolValue
-	if rf, ok := ret.Get(0).(func(context.Context, *charonrpc.IsAuthenticatedRequest) *wrappers.BoolValue); ok {
+	if rf, ok := ret.Get(0).(func(context.Context, *charond.IsAuthenticatedRequest) *wrappers.BoolValue); ok {
 		r0 = rf(_a0, _a1)
 	} else {
 		if ret.Get(0) != nil {
@@ -73,7 +73,7 @@ func (_m *AuthServer) IsAuthenticated(_a0 context.Context, _a1 *charonrpc.IsAuth
 	}
 
 	var r1 error
-	if rf, ok := ret.Get(1).(func(context.Context, *charonrpc.IsAuthenticatedRequest) error); ok {
+	if rf, ok := ret.Get(1).(func(context.Context, *charond.IsAuthenticatedRequest) error); ok {
 		r1 = rf(_a0, _a1)
 	} else {
 		r1 = ret.Error(1)
@@ -83,11 +83,11 @@ func (_m *AuthServer) IsAuthenticated(_a0 context.Context, _a1 *charonrpc.IsAuth
 }
 
 // IsGranted provides a mock function with given fields: _a0, _a1
-func (_m *AuthServer) IsGranted(_a0 context.Context, _a1 *charonrpc.IsGrantedRequest) (*wrappers.BoolValue, error) {
+func (_m *AuthServer) IsGranted(_a0 context.Context, _a1 *charond.IsGrantedRequest) (*wrappers.BoolValue, error) {
 	ret := _m.Called(_a0, _a1)
 
 	var r0 *wrappers.BoolValue
-	if rf, ok := ret.Get(0).(func(context.Context, *charonrpc.IsGrantedRequest) *wrappers.BoolValue); ok {
+	if rf, ok := ret.Get(0).(func(context.Context, *charond.IsGrantedRequest) *wrappers.BoolValue); ok {
 		r0 = rf(_a0, _a1)
 	} else {
 		if ret.Get(0) != nil {
@@ -96,7 +96,7 @@ func (_m *AuthServer) IsGranted(_a0 context.Context, _a1 *charonrpc.IsGrantedReq
 	}
 
 	var r1 error
-	if rf, ok := ret.Get(1).(func(context.Context, *charonrpc.IsGrantedRequest) error); ok {
+	if rf, ok := ret.Get(1).(func(context.Context, *charond.IsGrantedRequest) error); ok {
 		r1 = rf(_a0, _a1)
 	} else {
 		r1 = ret.Error(1)
@@ -106,11 +106,11 @@ func (_m *AuthServer) IsGranted(_a0 context.Context, _a1 *charonrpc.IsGrantedReq
 }
 
 // Login provides a mock function with given fields: _a0, _a1
-func (_m *AuthServer) Login(_a0 context.Context, _a1 *charonrpc.LoginRequest) (*wrappers.StringValue, error) {
+func (_m *AuthServer) Login(_a0 context.Context, _a1 *charond.LoginRequest) (*wrappers.StringValue, error) {
 	ret := _m.Called(_a0, _a1)
 
 	var r0 *wrappers.StringValue
-	if rf, ok := ret.Get(0).(func(context.Context, *charonrpc.LoginRequest) *wrappers.StringValue); ok {
+	if rf, ok := ret.Get(0).(func(context.Context, *charond.LoginRequest) *wrappers.StringValue); ok {
 		r0 = rf(_a0, _a1)
 	} else {
 		if ret.Get(0) != nil {
@@ -119,7 +119,7 @@ func (_m *AuthServer) Login(_a0 context.Context, _a1 *charonrpc.LoginRequest) (*
 	}
 
 	var r1 error
-	if rf, ok := ret.Get(1).(func(context.Context, *charonrpc.LoginRequest) error); ok {
+	if rf, ok := ret.Get(1).(func(context.Context, *charond.LoginRequest) error); ok {
 		r1 = rf(_a0, _a1)
 	} else {
 		r1 = ret.Error(1)
@@ -129,11 +129,11 @@ func (_m *AuthServer) Login(_a0 context.Context, _a1 *charonrpc.LoginRequest) (*
 }
 
 // Logout provides a mock function with given fields: _a0, _a1
-func (_m *AuthServer) Logout(_a0 context.Context, _a1 *charonrpc.LogoutRequest) (*empty.Empty, error) {
+func (_m *AuthServer) Logout(_a0 context.Context, _a1 *charond.LogoutRequest) (*empty.Empty, error) {
 	ret := _m.Called(_a0, _a1)
 
 	var r0 *empty.Empty
-	if rf, ok := ret.Get(0).(func(context.Context, *charonrpc.LogoutRequest) *empty.Empty); ok {
+	if rf, ok := ret.Get(0).(func(context.Context, *charond.LogoutRequest) *empty.Empty); ok {
 		r0 = rf(_a0, _a1)
 	} else {
 		if ret.Get(0) != nil {
@@ -142,7 +142,7 @@ func (_m *AuthServer) Logout(_a0 context.Context, _a1 *charonrpc.LogoutRequest)
 	}
 
 	var r1 error
-	if rf, ok := ret.Get(1).(func(context.Context, *charonrpc.LogoutRequest) error); ok {
+	if rf, ok := ret.Get(1).(func(context.Context, *charond.LogoutRequest) error); ok {
 		r1 = rf(_a0, _a1)
 	} else {
 		r1 = ret.Error(1)
diff --git a/charontest/group_manager_client.go b/pb/rpc/charond/v1mock/group_manager_client.go
similarity index 55%
rename from charontest/group_manager_client.go
rename to pb/rpc/charond/v1mock/group_manager_client.go
index f6a8c59..636e039 100644
--- a/charontest/group_manager_client.go
+++ b/pb/rpc/charond/v1mock/group_manager_client.go
@@ -1,8 +1,8 @@
 // Code generated by mockery v1.0.0. DO NOT EDIT.
 
-package charontest
+package charondmock
 
-import charonrpc "github.com/piotrkowalczuk/charon/charonrpc"
+import charond "github.com/piotrkowalczuk/charon/pb/rpc/charond/v1"
 import context "context"
 import grpc "google.golang.org/grpc"
 import mock "github.com/stretchr/testify/mock"
@@ -14,7 +14,7 @@ type GroupManagerClient struct {
 }
 
 // Create provides a mock function with given fields: ctx, in, opts
-func (_m *GroupManagerClient) Create(ctx context.Context, in *charonrpc.CreateGroupRequest, opts ...grpc.CallOption) (*charonrpc.CreateGroupResponse, error) {
+func (_m *GroupManagerClient) Create(ctx context.Context, in *charond.CreateGroupRequest, opts ...grpc.CallOption) (*charond.CreateGroupResponse, error) {
 	_va := make([]interface{}, len(opts))
 	for _i := range opts {
 		_va[_i] = opts[_i]
@@ -24,17 +24,17 @@ func (_m *GroupManagerClient) Create(ctx context.Context, in *charonrpc.CreateGr
 	_ca = append(_ca, _va...)
 	ret := _m.Called(_ca...)
 
-	var r0 *charonrpc.CreateGroupResponse
-	if rf, ok := ret.Get(0).(func(context.Context, *charonrpc.CreateGroupRequest, ...grpc.CallOption) *charonrpc.CreateGroupResponse); ok {
+	var r0 *charond.CreateGroupResponse
+	if rf, ok := ret.Get(0).(func(context.Context, *charond.CreateGroupRequest, ...grpc.CallOption) *charond.CreateGroupResponse); ok {
 		r0 = rf(ctx, in, opts...)
 	} else {
 		if ret.Get(0) != nil {
-			r0 = ret.Get(0).(*charonrpc.CreateGroupResponse)
+			r0 = ret.Get(0).(*charond.CreateGroupResponse)
 		}
 	}
 
 	var r1 error
-	if rf, ok := ret.Get(1).(func(context.Context, *charonrpc.CreateGroupRequest, ...grpc.CallOption) error); ok {
+	if rf, ok := ret.Get(1).(func(context.Context, *charond.CreateGroupRequest, ...grpc.CallOption) error); ok {
 		r1 = rf(ctx, in, opts...)
 	} else {
 		r1 = ret.Error(1)
@@ -44,7 +44,7 @@ func (_m *GroupManagerClient) Create(ctx context.Context, in *charonrpc.CreateGr
 }
 
 // Delete provides a mock function with given fields: ctx, in, opts
-func (_m *GroupManagerClient) Delete(ctx context.Context, in *charonrpc.DeleteGroupRequest, opts ...grpc.CallOption) (*wrappers.BoolValue, error) {
+func (_m *GroupManagerClient) Delete(ctx context.Context, in *charond.DeleteGroupRequest, opts ...grpc.CallOption) (*wrappers.BoolValue, error) {
 	_va := make([]interface{}, len(opts))
 	for _i := range opts {
 		_va[_i] = opts[_i]
@@ -55,7 +55,7 @@ func (_m *GroupManagerClient) Delete(ctx context.Context, in *charonrpc.DeleteGr
 	ret := _m.Called(_ca...)
 
 	var r0 *wrappers.BoolValue
-	if rf, ok := ret.Get(0).(func(context.Context, *charonrpc.DeleteGroupRequest, ...grpc.CallOption) *wrappers.BoolValue); ok {
+	if rf, ok := ret.Get(0).(func(context.Context, *charond.DeleteGroupRequest, ...grpc.CallOption) *wrappers.BoolValue); ok {
 		r0 = rf(ctx, in, opts...)
 	} else {
 		if ret.Get(0) != nil {
@@ -64,7 +64,7 @@ func (_m *GroupManagerClient) Delete(ctx context.Context, in *charonrpc.DeleteGr
 	}
 
 	var r1 error
-	if rf, ok := ret.Get(1).(func(context.Context, *charonrpc.DeleteGroupRequest, ...grpc.CallOption) error); ok {
+	if rf, ok := ret.Get(1).(func(context.Context, *charond.DeleteGroupRequest, ...grpc.CallOption) error); ok {
 		r1 = rf(ctx, in, opts...)
 	} else {
 		r1 = ret.Error(1)
@@ -74,7 +74,7 @@ func (_m *GroupManagerClient) Delete(ctx context.Context, in *charonrpc.DeleteGr
 }
 
 // Get provides a mock function with given fields: ctx, in, opts
-func (_m *GroupManagerClient) Get(ctx context.Context, in *charonrpc.GetGroupRequest, opts ...grpc.CallOption) (*charonrpc.GetGroupResponse, error) {
+func (_m *GroupManagerClient) Get(ctx context.Context, in *charond.GetGroupRequest, opts ...grpc.CallOption) (*charond.GetGroupResponse, error) {
 	_va := make([]interface{}, len(opts))
 	for _i := range opts {
 		_va[_i] = opts[_i]
@@ -84,17 +84,17 @@ func (_m *GroupManagerClient) Get(ctx context.Context, in *charonrpc.GetGroupReq
 	_ca = append(_ca, _va...)
 	ret := _m.Called(_ca...)
 
-	var r0 *charonrpc.GetGroupResponse
-	if rf, ok := ret.Get(0).(func(context.Context, *charonrpc.GetGroupRequest, ...grpc.CallOption) *charonrpc.GetGroupResponse); ok {
+	var r0 *charond.GetGroupResponse
+	if rf, ok := ret.Get(0).(func(context.Context, *charond.GetGroupRequest, ...grpc.CallOption) *charond.GetGroupResponse); ok {
 		r0 = rf(ctx, in, opts...)
 	} else {
 		if ret.Get(0) != nil {
-			r0 = ret.Get(0).(*charonrpc.GetGroupResponse)
+			r0 = ret.Get(0).(*charond.GetGroupResponse)
 		}
 	}
 
 	var r1 error
-	if rf, ok := ret.Get(1).(func(context.Context, *charonrpc.GetGroupRequest, ...grpc.CallOption) error); ok {
+	if rf, ok := ret.Get(1).(func(context.Context, *charond.GetGroupRequest, ...grpc.CallOption) error); ok {
 		r1 = rf(ctx, in, opts...)
 	} else {
 		r1 = ret.Error(1)
@@ -104,7 +104,7 @@ func (_m *GroupManagerClient) Get(ctx context.Context, in *charonrpc.GetGroupReq
 }
 
 // List provides a mock function with given fields: ctx, in, opts
-func (_m *GroupManagerClient) List(ctx context.Context, in *charonrpc.ListGroupsRequest, opts ...grpc.CallOption) (*charonrpc.ListGroupsResponse, error) {
+func (_m *GroupManagerClient) List(ctx context.Context, in *charond.ListGroupsRequest, opts ...grpc.CallOption) (*charond.ListGroupsResponse, error) {
 	_va := make([]interface{}, len(opts))
 	for _i := range opts {
 		_va[_i] = opts[_i]
@@ -114,17 +114,17 @@ func (_m *GroupManagerClient) List(ctx context.Context, in *charonrpc.ListGroups
 	_ca = append(_ca, _va...)
 	ret := _m.Called(_ca...)
 
-	var r0 *charonrpc.ListGroupsResponse
-	if rf, ok := ret.Get(0).(func(context.Context, *charonrpc.ListGroupsRequest, ...grpc.CallOption) *charonrpc.ListGroupsResponse); ok {
+	var r0 *charond.ListGroupsResponse
+	if rf, ok := ret.Get(0).(func(context.Context, *charond.ListGroupsRequest, ...grpc.CallOption) *charond.ListGroupsResponse); ok {
 		r0 = rf(ctx, in, opts...)
 	} else {
 		if ret.Get(0) != nil {
-			r0 = ret.Get(0).(*charonrpc.ListGroupsResponse)
+			r0 = ret.Get(0).(*charond.ListGroupsResponse)
 		}
 	}
 
 	var r1 error
-	if rf, ok := ret.Get(1).(func(context.Context, *charonrpc.ListGroupsRequest, ...grpc.CallOption) error); ok {
+	if rf, ok := ret.Get(1).(func(context.Context, *charond.ListGroupsRequest, ...grpc.CallOption) error); ok {
 		r1 = rf(ctx, in, opts...)
 	} else {
 		r1 = ret.Error(1)
@@ -134,7 +134,7 @@ func (_m *GroupManagerClient) List(ctx context.Context, in *charonrpc.ListGroups
 }
 
 // ListPermissions provides a mock function with given fields: ctx, in, opts
-func (_m *GroupManagerClient) ListPermissions(ctx context.Context, in *charonrpc.ListGroupPermissionsRequest, opts ...grpc.CallOption) (*charonrpc.ListGroupPermissionsResponse, error) {
+func (_m *GroupManagerClient) ListPermissions(ctx context.Context, in *charond.ListGroupPermissionsRequest, opts ...grpc.CallOption) (*charond.ListGroupPermissionsResponse, error) {
 	_va := make([]interface{}, len(opts))
 	for _i := range opts {
 		_va[_i] = opts[_i]
@@ -144,17 +144,17 @@ func (_m *GroupManagerClient) ListPermissions(ctx context.Context, in *charonrpc
 	_ca = append(_ca, _va...)
 	ret := _m.Called(_ca...)
 
-	var r0 *charonrpc.ListGroupPermissionsResponse
-	if rf, ok := ret.Get(0).(func(context.Context, *charonrpc.ListGroupPermissionsRequest, ...grpc.CallOption) *charonrpc.ListGroupPermissionsResponse); ok {
+	var r0 *charond.ListGroupPermissionsResponse
+	if rf, ok := ret.Get(0).(func(context.Context, *charond.ListGroupPermissionsRequest, ...grpc.CallOption) *charond.ListGroupPermissionsResponse); ok {
 		r0 = rf(ctx, in, opts...)
 	} else {
 		if ret.Get(0) != nil {
-			r0 = ret.Get(0).(*charonrpc.ListGroupPermissionsResponse)
+			r0 = ret.Get(0).(*charond.ListGroupPermissionsResponse)
 		}
 	}
 
 	var r1 error
-	if rf, ok := ret.Get(1).(func(context.Context, *charonrpc.ListGroupPermissionsRequest, ...grpc.CallOption) error); ok {
+	if rf, ok := ret.Get(1).(func(context.Context, *charond.ListGroupPermissionsRequest, ...grpc.CallOption) error); ok {
 		r1 = rf(ctx, in, opts...)
 	} else {
 		r1 = ret.Error(1)
@@ -164,7 +164,7 @@ func (_m *GroupManagerClient) ListPermissions(ctx context.Context, in *charonrpc
 }
 
 // Modify provides a mock function with given fields: ctx, in, opts
-func (_m *GroupManagerClient) Modify(ctx context.Context, in *charonrpc.ModifyGroupRequest, opts ...grpc.CallOption) (*charonrpc.ModifyGroupResponse, error) {
+func (_m *GroupManagerClient) Modify(ctx context.Context, in *charond.ModifyGroupRequest, opts ...grpc.CallOption) (*charond.ModifyGroupResponse, error) {
 	_va := make([]interface{}, len(opts))
 	for _i := range opts {
 		_va[_i] = opts[_i]
@@ -174,17 +174,17 @@ func (_m *GroupManagerClient) Modify(ctx context.Context, in *charonrpc.ModifyGr
 	_ca = append(_ca, _va...)
 	ret := _m.Called(_ca...)
 
-	var r0 *charonrpc.ModifyGroupResponse
-	if rf, ok := ret.Get(0).(func(context.Context, *charonrpc.ModifyGroupRequest, ...grpc.CallOption) *charonrpc.ModifyGroupResponse); ok {
+	var r0 *charond.ModifyGroupResponse
+	if rf, ok := ret.Get(0).(func(context.Context, *charond.ModifyGroupRequest, ...grpc.CallOption) *charond.ModifyGroupResponse); ok {
 		r0 = rf(ctx, in, opts...)
 	} else {
 		if ret.Get(0) != nil {
-			r0 = ret.Get(0).(*charonrpc.ModifyGroupResponse)
+			r0 = ret.Get(0).(*charond.ModifyGroupResponse)
 		}
 	}
 
 	var r1 error
-	if rf, ok := ret.Get(1).(func(context.Context, *charonrpc.ModifyGroupRequest, ...grpc.CallOption) error); ok {
+	if rf, ok := ret.Get(1).(func(context.Context, *charond.ModifyGroupRequest, ...grpc.CallOption) error); ok {
 		r1 = rf(ctx, in, opts...)
 	} else {
 		r1 = ret.Error(1)
@@ -194,7 +194,7 @@ func (_m *GroupManagerClient) Modify(ctx context.Context, in *charonrpc.ModifyGr
 }
 
 // SetPermissions provides a mock function with given fields: ctx, in, opts
-func (_m *GroupManagerClient) SetPermissions(ctx context.Context, in *charonrpc.SetGroupPermissionsRequest, opts ...grpc.CallOption) (*charonrpc.SetGroupPermissionsResponse, error) {
+func (_m *GroupManagerClient) SetPermissions(ctx context.Context, in *charond.SetGroupPermissionsRequest, opts ...grpc.CallOption) (*charond.SetGroupPermissionsResponse, error) {
 	_va := make([]interface{}, len(opts))
 	for _i := range opts {
 		_va[_i] = opts[_i]
@@ -204,17 +204,17 @@ func (_m *GroupManagerClient) SetPermissions(ctx context.Context, in *charonrpc.
 	_ca = append(_ca, _va...)
 	ret := _m.Called(_ca...)
 
-	var r0 *charonrpc.SetGroupPermissionsResponse
-	if rf, ok := ret.Get(0).(func(context.Context, *charonrpc.SetGroupPermissionsRequest, ...grpc.CallOption) *charonrpc.SetGroupPermissionsResponse); ok {
+	var r0 *charond.SetGroupPermissionsResponse
+	if rf, ok := ret.Get(0).(func(context.Context, *charond.SetGroupPermissionsRequest, ...grpc.CallOption) *charond.SetGroupPermissionsResponse); ok {
 		r0 = rf(ctx, in, opts...)
 	} else {
 		if ret.Get(0) != nil {
-			r0 = ret.Get(0).(*charonrpc.SetGroupPermissionsResponse)
+			r0 = ret.Get(0).(*charond.SetGroupPermissionsResponse)
 		}
 	}
 
 	var r1 error
-	if rf, ok := ret.Get(1).(func(context.Context, *charonrpc.SetGroupPermissionsRequest, ...grpc.CallOption) error); ok {
+	if rf, ok := ret.Get(1).(func(context.Context, *charond.SetGroupPermissionsRequest, ...grpc.CallOption) error); ok {
 		r1 = rf(ctx, in, opts...)
 	} else {
 		r1 = ret.Error(1)
diff --git a/pb/rpc/charond/v1mock/group_manager_server.go b/pb/rpc/charond/v1mock/group_manager_server.go
new file mode 100644
index 0000000..ed5557a
--- /dev/null
+++ b/pb/rpc/charond/v1mock/group_manager_server.go
@@ -0,0 +1,174 @@
+// Code generated by mockery v1.0.0. DO NOT EDIT.
+
+package charondmock
+
+import charond "github.com/piotrkowalczuk/charon/pb/rpc/charond/v1"
+import context "context"
+import mock "github.com/stretchr/testify/mock"
+import wrappers "github.com/golang/protobuf/ptypes/wrappers"
+
+// GroupManagerServer is an autogenerated mock type for the GroupManagerServer type
+type GroupManagerServer struct {
+	mock.Mock
+}
+
+// Create provides a mock function with given fields: _a0, _a1
+func (_m *GroupManagerServer) Create(_a0 context.Context, _a1 *charond.CreateGroupRequest) (*charond.CreateGroupResponse, error) {
+	ret := _m.Called(_a0, _a1)
+
+	var r0 *charond.CreateGroupResponse
+	if rf, ok := ret.Get(0).(func(context.Context, *charond.CreateGroupRequest) *charond.CreateGroupResponse); ok {
+		r0 = rf(_a0, _a1)
+	} else {
+		if ret.Get(0) != nil {
+			r0 = ret.Get(0).(*charond.CreateGroupResponse)
+		}
+	}
+
+	var r1 error
+	if rf, ok := ret.Get(1).(func(context.Context, *charond.CreateGroupRequest) error); ok {
+		r1 = rf(_a0, _a1)
+	} else {
+		r1 = ret.Error(1)
+	}
+
+	return r0, r1
+}
+
+// Delete provides a mock function with given fields: _a0, _a1
+func (_m *GroupManagerServer) Delete(_a0 context.Context, _a1 *charond.DeleteGroupRequest) (*wrappers.BoolValue, error) {
+	ret := _m.Called(_a0, _a1)
+
+	var r0 *wrappers.BoolValue
+	if rf, ok := ret.Get(0).(func(context.Context, *charond.DeleteGroupRequest) *wrappers.BoolValue); ok {
+		r0 = rf(_a0, _a1)
+	} else {
+		if ret.Get(0) != nil {
+			r0 = ret.Get(0).(*wrappers.BoolValue)
+		}
+	}
+
+	var r1 error
+	if rf, ok := ret.Get(1).(func(context.Context, *charond.DeleteGroupRequest) error); ok {
+		r1 = rf(_a0, _a1)
+	} else {
+		r1 = ret.Error(1)
+	}
+
+	return r0, r1
+}
+
+// Get provides a mock function with given fields: _a0, _a1
+func (_m *GroupManagerServer) Get(_a0 context.Context, _a1 *charond.GetGroupRequest) (*charond.GetGroupResponse, error) {
+	ret := _m.Called(_a0, _a1)
+
+	var r0 *charond.GetGroupResponse
+	if rf, ok := ret.Get(0).(func(context.Context, *charond.GetGroupRequest) *charond.GetGroupResponse); ok {
+		r0 = rf(_a0, _a1)
+	} else {
+		if ret.Get(0) != nil {
+			r0 = ret.Get(0).(*charond.GetGroupResponse)
+		}
+	}
+
+	var r1 error
+	if rf, ok := ret.Get(1).(func(context.Context, *charond.GetGroupRequest) error); ok {
+		r1 = rf(_a0, _a1)
+	} else {
+		r1 = ret.Error(1)
+	}
+
+	return r0, r1
+}
+
+// List provides a mock function with given fields: _a0, _a1
+func (_m *GroupManagerServer) List(_a0 context.Context, _a1 *charond.ListGroupsRequest) (*charond.ListGroupsResponse, error) {
+	ret := _m.Called(_a0, _a1)
+
+	var r0 *charond.ListGroupsResponse
+	if rf, ok := ret.Get(0).(func(context.Context, *charond.ListGroupsRequest) *charond.ListGroupsResponse); ok {
+		r0 = rf(_a0, _a1)
+	} else {
+		if ret.Get(0) != nil {
+			r0 = ret.Get(0).(*charond.ListGroupsResponse)
+		}
+	}
+
+	var r1 error
+	if rf, ok := ret.Get(1).(func(context.Context, *charond.ListGroupsRequest) error); ok {
+		r1 = rf(_a0, _a1)
+	} else {
+		r1 = ret.Error(1)
+	}
+
+	return r0, r1
+}
+
+// ListPermissions provides a mock function with given fields: _a0, _a1
+func (_m *GroupManagerServer) ListPermissions(_a0 context.Context, _a1 *charond.ListGroupPermissionsRequest) (*charond.ListGroupPermissionsResponse, error) {
+	ret := _m.Called(_a0, _a1)
+
+	var r0 *charond.ListGroupPermissionsResponse
+	if rf, ok := ret.Get(0).(func(context.Context, *charond.ListGroupPermissionsRequest) *charond.ListGroupPermissionsResponse); ok {
+		r0 = rf(_a0, _a1)
+	} else {
+		if ret.Get(0) != nil {
+			r0 = ret.Get(0).(*charond.ListGroupPermissionsResponse)
+		}
+	}
+
+	var r1 error
+	if rf, ok := ret.Get(1).(func(context.Context, *charond.ListGroupPermissionsRequest) error); ok {
+		r1 = rf(_a0, _a1)
+	} else {
+		r1 = ret.Error(1)
+	}
+
+	return r0, r1
+}
+
+// Modify provides a mock function with given fields: _a0, _a1
+func (_m *GroupManagerServer) Modify(_a0 context.Context, _a1 *charond.ModifyGroupRequest) (*charond.ModifyGroupResponse, error) {
+	ret := _m.Called(_a0, _a1)
+
+	var r0 *charond.ModifyGroupResponse
+	if rf, ok := ret.Get(0).(func(context.Context, *charond.ModifyGroupRequest) *charond.ModifyGroupResponse); ok {
+		r0 = rf(_a0, _a1)
+	} else {
+		if ret.Get(0) != nil {
+			r0 = ret.Get(0).(*charond.ModifyGroupResponse)
+		}
+	}
+
+	var r1 error
+	if rf, ok := ret.Get(1).(func(context.Context, *charond.ModifyGroupRequest) error); ok {
+		r1 = rf(_a0, _a1)
+	} else {
+		r1 = ret.Error(1)
+	}
+
+	return r0, r1
+}
+
+// SetPermissions provides a mock function with given fields: _a0, _a1
+func (_m *GroupManagerServer) SetPermissions(_a0 context.Context, _a1 *charond.SetGroupPermissionsRequest) (*charond.SetGroupPermissionsResponse, error) {
+	ret := _m.Called(_a0, _a1)
+
+	var r0 *charond.SetGroupPermissionsResponse
+	if rf, ok := ret.Get(0).(func(context.Context, *charond.SetGroupPermissionsRequest) *charond.SetGroupPermissionsResponse); ok {
+		r0 = rf(_a0, _a1)
+	} else {
+		if ret.Get(0) != nil {
+			r0 = ret.Get(0).(*charond.SetGroupPermissionsResponse)
+		}
+	}
+
+	var r1 error
+	if rf, ok := ret.Get(1).(func(context.Context, *charond.SetGroupPermissionsRequest) error); ok {
+		r1 = rf(_a0, _a1)
+	} else {
+		r1 = ret.Error(1)
+	}
+
+	return r0, r1
+}
diff --git a/charontest/is_login_request__strategy.go b/pb/rpc/charond/v1mock/is_login_request__strategy.go
similarity index 95%
rename from charontest/is_login_request__strategy.go
rename to pb/rpc/charond/v1mock/is_login_request__strategy.go
index 6dd0156..587c587 100644
--- a/charontest/is_login_request__strategy.go
+++ b/pb/rpc/charond/v1mock/is_login_request__strategy.go
@@ -1,6 +1,6 @@
 // Code generated by mockery v1.0.0. DO NOT EDIT.
 
-package charontest
+package charondmock
 
 import mock "github.com/stretchr/testify/mock"
 
diff --git a/charontest/permission_manager_client.go b/pb/rpc/charond/v1mock/permission_manager_client.go
similarity index 54%
rename from charontest/permission_manager_client.go
rename to pb/rpc/charond/v1mock/permission_manager_client.go
index 85f3163..f38d7f7 100644
--- a/charontest/permission_manager_client.go
+++ b/pb/rpc/charond/v1mock/permission_manager_client.go
@@ -1,8 +1,8 @@
 // Code generated by mockery v1.0.0. DO NOT EDIT.
 
-package charontest
+package charondmock
 
-import charonrpc "github.com/piotrkowalczuk/charon/charonrpc"
+import charond "github.com/piotrkowalczuk/charon/pb/rpc/charond/v1"
 import context "context"
 import grpc "google.golang.org/grpc"
 import mock "github.com/stretchr/testify/mock"
@@ -13,7 +13,7 @@ type PermissionManagerClient struct {
 }
 
 // Get provides a mock function with given fields: ctx, in, opts
-func (_m *PermissionManagerClient) Get(ctx context.Context, in *charonrpc.GetPermissionRequest, opts ...grpc.CallOption) (*charonrpc.GetPermissionResponse, error) {
+func (_m *PermissionManagerClient) Get(ctx context.Context, in *charond.GetPermissionRequest, opts ...grpc.CallOption) (*charond.GetPermissionResponse, error) {
 	_va := make([]interface{}, len(opts))
 	for _i := range opts {
 		_va[_i] = opts[_i]
@@ -23,17 +23,17 @@ func (_m *PermissionManagerClient) Get(ctx context.Context, in *charonrpc.GetPer
 	_ca = append(_ca, _va...)
 	ret := _m.Called(_ca...)
 
-	var r0 *charonrpc.GetPermissionResponse
-	if rf, ok := ret.Get(0).(func(context.Context, *charonrpc.GetPermissionRequest, ...grpc.CallOption) *charonrpc.GetPermissionResponse); ok {
+	var r0 *charond.GetPermissionResponse
+	if rf, ok := ret.Get(0).(func(context.Context, *charond.GetPermissionRequest, ...grpc.CallOption) *charond.GetPermissionResponse); ok {
 		r0 = rf(ctx, in, opts...)
 	} else {
 		if ret.Get(0) != nil {
-			r0 = ret.Get(0).(*charonrpc.GetPermissionResponse)
+			r0 = ret.Get(0).(*charond.GetPermissionResponse)
 		}
 	}
 
 	var r1 error
-	if rf, ok := ret.Get(1).(func(context.Context, *charonrpc.GetPermissionRequest, ...grpc.CallOption) error); ok {
+	if rf, ok := ret.Get(1).(func(context.Context, *charond.GetPermissionRequest, ...grpc.CallOption) error); ok {
 		r1 = rf(ctx, in, opts...)
 	} else {
 		r1 = ret.Error(1)
@@ -43,7 +43,7 @@ func (_m *PermissionManagerClient) Get(ctx context.Context, in *charonrpc.GetPer
 }
 
 // List provides a mock function with given fields: ctx, in, opts
-func (_m *PermissionManagerClient) List(ctx context.Context, in *charonrpc.ListPermissionsRequest, opts ...grpc.CallOption) (*charonrpc.ListPermissionsResponse, error) {
+func (_m *PermissionManagerClient) List(ctx context.Context, in *charond.ListPermissionsRequest, opts ...grpc.CallOption) (*charond.ListPermissionsResponse, error) {
 	_va := make([]interface{}, len(opts))
 	for _i := range opts {
 		_va[_i] = opts[_i]
@@ -53,17 +53,17 @@ func (_m *PermissionManagerClient) List(ctx context.Context, in *charonrpc.ListP
 	_ca = append(_ca, _va...)
 	ret := _m.Called(_ca...)
 
-	var r0 *charonrpc.ListPermissionsResponse
-	if rf, ok := ret.Get(0).(func(context.Context, *charonrpc.ListPermissionsRequest, ...grpc.CallOption) *charonrpc.ListPermissionsResponse); ok {
+	var r0 *charond.ListPermissionsResponse
+	if rf, ok := ret.Get(0).(func(context.Context, *charond.ListPermissionsRequest, ...grpc.CallOption) *charond.ListPermissionsResponse); ok {
 		r0 = rf(ctx, in, opts...)
 	} else {
 		if ret.Get(0) != nil {
-			r0 = ret.Get(0).(*charonrpc.ListPermissionsResponse)
+			r0 = ret.Get(0).(*charond.ListPermissionsResponse)
 		}
 	}
 
 	var r1 error
-	if rf, ok := ret.Get(1).(func(context.Context, *charonrpc.ListPermissionsRequest, ...grpc.CallOption) error); ok {
+	if rf, ok := ret.Get(1).(func(context.Context, *charond.ListPermissionsRequest, ...grpc.CallOption) error); ok {
 		r1 = rf(ctx, in, opts...)
 	} else {
 		r1 = ret.Error(1)
@@ -73,7 +73,7 @@ func (_m *PermissionManagerClient) List(ctx context.Context, in *charonrpc.ListP
 }
 
 // Register provides a mock function with given fields: ctx, in, opts
-func (_m *PermissionManagerClient) Register(ctx context.Context, in *charonrpc.RegisterPermissionsRequest, opts ...grpc.CallOption) (*charonrpc.RegisterPermissionsResponse, error) {
+func (_m *PermissionManagerClient) Register(ctx context.Context, in *charond.RegisterPermissionsRequest, opts ...grpc.CallOption) (*charond.RegisterPermissionsResponse, error) {
 	_va := make([]interface{}, len(opts))
 	for _i := range opts {
 		_va[_i] = opts[_i]
@@ -83,17 +83,17 @@ func (_m *PermissionManagerClient) Register(ctx context.Context, in *charonrpc.R
 	_ca = append(_ca, _va...)
 	ret := _m.Called(_ca...)
 
-	var r0 *charonrpc.RegisterPermissionsResponse
-	if rf, ok := ret.Get(0).(func(context.Context, *charonrpc.RegisterPermissionsRequest, ...grpc.CallOption) *charonrpc.RegisterPermissionsResponse); ok {
+	var r0 *charond.RegisterPermissionsResponse
+	if rf, ok := ret.Get(0).(func(context.Context, *charond.RegisterPermissionsRequest, ...grpc.CallOption) *charond.RegisterPermissionsResponse); ok {
 		r0 = rf(ctx, in, opts...)
 	} else {
 		if ret.Get(0) != nil {
-			r0 = ret.Get(0).(*charonrpc.RegisterPermissionsResponse)
+			r0 = ret.Get(0).(*charond.RegisterPermissionsResponse)
 		}
 	}
 
 	var r1 error
-	if rf, ok := ret.Get(1).(func(context.Context, *charonrpc.RegisterPermissionsRequest, ...grpc.CallOption) error); ok {
+	if rf, ok := ret.Get(1).(func(context.Context, *charond.RegisterPermissionsRequest, ...grpc.CallOption) error); ok {
 		r1 = rf(ctx, in, opts...)
 	} else {
 		r1 = ret.Error(1)
diff --git a/pb/rpc/charond/v1mock/permission_manager_server.go b/pb/rpc/charond/v1mock/permission_manager_server.go
new file mode 100644
index 0000000..6ad5b9b
--- /dev/null
+++ b/pb/rpc/charond/v1mock/permission_manager_server.go
@@ -0,0 +1,81 @@
+// Code generated by mockery v1.0.0. DO NOT EDIT.
+
+package charondmock
+
+import charond "github.com/piotrkowalczuk/charon/pb/rpc/charond/v1"
+import context "context"
+import mock "github.com/stretchr/testify/mock"
+
+// PermissionManagerServer is an autogenerated mock type for the PermissionManagerServer type
+type PermissionManagerServer struct {
+	mock.Mock
+}
+
+// Get provides a mock function with given fields: _a0, _a1
+func (_m *PermissionManagerServer) Get(_a0 context.Context, _a1 *charond.GetPermissionRequest) (*charond.GetPermissionResponse, error) {
+	ret := _m.Called(_a0, _a1)
+
+	var r0 *charond.GetPermissionResponse
+	if rf, ok := ret.Get(0).(func(context.Context, *charond.GetPermissionRequest) *charond.GetPermissionResponse); ok {
+		r0 = rf(_a0, _a1)
+	} else {
+		if ret.Get(0) != nil {
+			r0 = ret.Get(0).(*charond.GetPermissionResponse)
+		}
+	}
+
+	var r1 error
+	if rf, ok := ret.Get(1).(func(context.Context, *charond.GetPermissionRequest) error); ok {
+		r1 = rf(_a0, _a1)
+	} else {
+		r1 = ret.Error(1)
+	}
+
+	return r0, r1
+}
+
+// List provides a mock function with given fields: _a0, _a1
+func (_m *PermissionManagerServer) List(_a0 context.Context, _a1 *charond.ListPermissionsRequest) (*charond.ListPermissionsResponse, error) {
+	ret := _m.Called(_a0, _a1)
+
+	var r0 *charond.ListPermissionsResponse
+	if rf, ok := ret.Get(0).(func(context.Context, *charond.ListPermissionsRequest) *charond.ListPermissionsResponse); ok {
+		r0 = rf(_a0, _a1)
+	} else {
+		if ret.Get(0) != nil {
+			r0 = ret.Get(0).(*charond.ListPermissionsResponse)
+		}
+	}
+
+	var r1 error
+	if rf, ok := ret.Get(1).(func(context.Context, *charond.ListPermissionsRequest) error); ok {
+		r1 = rf(_a0, _a1)
+	} else {
+		r1 = ret.Error(1)
+	}
+
+	return r0, r1
+}
+
+// Register provides a mock function with given fields: _a0, _a1
+func (_m *PermissionManagerServer) Register(_a0 context.Context, _a1 *charond.RegisterPermissionsRequest) (*charond.RegisterPermissionsResponse, error) {
+	ret := _m.Called(_a0, _a1)
+
+	var r0 *charond.RegisterPermissionsResponse
+	if rf, ok := ret.Get(0).(func(context.Context, *charond.RegisterPermissionsRequest) *charond.RegisterPermissionsResponse); ok {
+		r0 = rf(_a0, _a1)
+	} else {
+		if ret.Get(0) != nil {
+			r0 = ret.Get(0).(*charond.RegisterPermissionsResponse)
+		}
+	}
+
+	var r1 error
+	if rf, ok := ret.Get(1).(func(context.Context, *charond.RegisterPermissionsRequest) error); ok {
+		r1 = rf(_a0, _a1)
+	} else {
+		r1 = ret.Error(1)
+	}
+
+	return r0, r1
+}
diff --git a/charontest/refresh_token_manager_client.go b/pb/rpc/charond/v1mock/refresh_token_manager_client.go
similarity index 53%
rename from charontest/refresh_token_manager_client.go
rename to pb/rpc/charond/v1mock/refresh_token_manager_client.go
index 82ececc..912c203 100644
--- a/charontest/refresh_token_manager_client.go
+++ b/pb/rpc/charond/v1mock/refresh_token_manager_client.go
@@ -1,8 +1,8 @@
 // Code generated by mockery v1.0.0. DO NOT EDIT.
 
-package charontest
+package charondmock
 
-import charonrpc "github.com/piotrkowalczuk/charon/charonrpc"
+import charond "github.com/piotrkowalczuk/charon/pb/rpc/charond/v1"
 import context "context"
 import grpc "google.golang.org/grpc"
 import mock "github.com/stretchr/testify/mock"
@@ -13,7 +13,7 @@ type RefreshTokenManagerClient struct {
 }
 
 // Create provides a mock function with given fields: ctx, in, opts
-func (_m *RefreshTokenManagerClient) Create(ctx context.Context, in *charonrpc.CreateRefreshTokenRequest, opts ...grpc.CallOption) (*charonrpc.CreateRefreshTokenResponse, error) {
+func (_m *RefreshTokenManagerClient) Create(ctx context.Context, in *charond.CreateRefreshTokenRequest, opts ...grpc.CallOption) (*charond.CreateRefreshTokenResponse, error) {
 	_va := make([]interface{}, len(opts))
 	for _i := range opts {
 		_va[_i] = opts[_i]
@@ -23,17 +23,17 @@ func (_m *RefreshTokenManagerClient) Create(ctx context.Context, in *charonrpc.C
 	_ca = append(_ca, _va...)
 	ret := _m.Called(_ca...)
 
-	var r0 *charonrpc.CreateRefreshTokenResponse
-	if rf, ok := ret.Get(0).(func(context.Context, *charonrpc.CreateRefreshTokenRequest, ...grpc.CallOption) *charonrpc.CreateRefreshTokenResponse); ok {
+	var r0 *charond.CreateRefreshTokenResponse
+	if rf, ok := ret.Get(0).(func(context.Context, *charond.CreateRefreshTokenRequest, ...grpc.CallOption) *charond.CreateRefreshTokenResponse); ok {
 		r0 = rf(ctx, in, opts...)
 	} else {
 		if ret.Get(0) != nil {
-			r0 = ret.Get(0).(*charonrpc.CreateRefreshTokenResponse)
+			r0 = ret.Get(0).(*charond.CreateRefreshTokenResponse)
 		}
 	}
 
 	var r1 error
-	if rf, ok := ret.Get(1).(func(context.Context, *charonrpc.CreateRefreshTokenRequest, ...grpc.CallOption) error); ok {
+	if rf, ok := ret.Get(1).(func(context.Context, *charond.CreateRefreshTokenRequest, ...grpc.CallOption) error); ok {
 		r1 = rf(ctx, in, opts...)
 	} else {
 		r1 = ret.Error(1)
@@ -43,7 +43,7 @@ func (_m *RefreshTokenManagerClient) Create(ctx context.Context, in *charonrpc.C
 }
 
 // List provides a mock function with given fields: ctx, in, opts
-func (_m *RefreshTokenManagerClient) List(ctx context.Context, in *charonrpc.ListRefreshTokensRequest, opts ...grpc.CallOption) (*charonrpc.ListRefreshTokensResponse, error) {
+func (_m *RefreshTokenManagerClient) List(ctx context.Context, in *charond.ListRefreshTokensRequest, opts ...grpc.CallOption) (*charond.ListRefreshTokensResponse, error) {
 	_va := make([]interface{}, len(opts))
 	for _i := range opts {
 		_va[_i] = opts[_i]
@@ -53,17 +53,17 @@ func (_m *RefreshTokenManagerClient) List(ctx context.Context, in *charonrpc.Lis
 	_ca = append(_ca, _va...)
 	ret := _m.Called(_ca...)
 
-	var r0 *charonrpc.ListRefreshTokensResponse
-	if rf, ok := ret.Get(0).(func(context.Context, *charonrpc.ListRefreshTokensRequest, ...grpc.CallOption) *charonrpc.ListRefreshTokensResponse); ok {
+	var r0 *charond.ListRefreshTokensResponse
+	if rf, ok := ret.Get(0).(func(context.Context, *charond.ListRefreshTokensRequest, ...grpc.CallOption) *charond.ListRefreshTokensResponse); ok {
 		r0 = rf(ctx, in, opts...)
 	} else {
 		if ret.Get(0) != nil {
-			r0 = ret.Get(0).(*charonrpc.ListRefreshTokensResponse)
+			r0 = ret.Get(0).(*charond.ListRefreshTokensResponse)
 		}
 	}
 
 	var r1 error
-	if rf, ok := ret.Get(1).(func(context.Context, *charonrpc.ListRefreshTokensRequest, ...grpc.CallOption) error); ok {
+	if rf, ok := ret.Get(1).(func(context.Context, *charond.ListRefreshTokensRequest, ...grpc.CallOption) error); ok {
 		r1 = rf(ctx, in, opts...)
 	} else {
 		r1 = ret.Error(1)
@@ -73,7 +73,7 @@ func (_m *RefreshTokenManagerClient) List(ctx context.Context, in *charonrpc.Lis
 }
 
 // Revoke provides a mock function with given fields: ctx, in, opts
-func (_m *RefreshTokenManagerClient) Revoke(ctx context.Context, in *charonrpc.RevokeRefreshTokenRequest, opts ...grpc.CallOption) (*charonrpc.RevokeRefreshTokenResponse, error) {
+func (_m *RefreshTokenManagerClient) Revoke(ctx context.Context, in *charond.RevokeRefreshTokenRequest, opts ...grpc.CallOption) (*charond.RevokeRefreshTokenResponse, error) {
 	_va := make([]interface{}, len(opts))
 	for _i := range opts {
 		_va[_i] = opts[_i]
@@ -83,17 +83,17 @@ func (_m *RefreshTokenManagerClient) Revoke(ctx context.Context, in *charonrpc.R
 	_ca = append(_ca, _va...)
 	ret := _m.Called(_ca...)
 
-	var r0 *charonrpc.RevokeRefreshTokenResponse
-	if rf, ok := ret.Get(0).(func(context.Context, *charonrpc.RevokeRefreshTokenRequest, ...grpc.CallOption) *charonrpc.RevokeRefreshTokenResponse); ok {
+	var r0 *charond.RevokeRefreshTokenResponse
+	if rf, ok := ret.Get(0).(func(context.Context, *charond.RevokeRefreshTokenRequest, ...grpc.CallOption) *charond.RevokeRefreshTokenResponse); ok {
 		r0 = rf(ctx, in, opts...)
 	} else {
 		if ret.Get(0) != nil {
-			r0 = ret.Get(0).(*charonrpc.RevokeRefreshTokenResponse)
+			r0 = ret.Get(0).(*charond.RevokeRefreshTokenResponse)
 		}
 	}
 
 	var r1 error
-	if rf, ok := ret.Get(1).(func(context.Context, *charonrpc.RevokeRefreshTokenRequest, ...grpc.CallOption) error); ok {
+	if rf, ok := ret.Get(1).(func(context.Context, *charond.RevokeRefreshTokenRequest, ...grpc.CallOption) error); ok {
 		r1 = rf(ctx, in, opts...)
 	} else {
 		r1 = ret.Error(1)
diff --git a/pb/rpc/charond/v1mock/refresh_token_manager_server.go b/pb/rpc/charond/v1mock/refresh_token_manager_server.go
new file mode 100644
index 0000000..2c993ed
--- /dev/null
+++ b/pb/rpc/charond/v1mock/refresh_token_manager_server.go
@@ -0,0 +1,81 @@
+// Code generated by mockery v1.0.0. DO NOT EDIT.
+
+package charondmock
+
+import charond "github.com/piotrkowalczuk/charon/pb/rpc/charond/v1"
+import context "context"
+import mock "github.com/stretchr/testify/mock"
+
+// RefreshTokenManagerServer is an autogenerated mock type for the RefreshTokenManagerServer type
+type RefreshTokenManagerServer struct {
+	mock.Mock
+}
+
+// Create provides a mock function with given fields: _a0, _a1
+func (_m *RefreshTokenManagerServer) Create(_a0 context.Context, _a1 *charond.CreateRefreshTokenRequest) (*charond.CreateRefreshTokenResponse, error) {
+	ret := _m.Called(_a0, _a1)
+
+	var r0 *charond.CreateRefreshTokenResponse
+	if rf, ok := ret.Get(0).(func(context.Context, *charond.CreateRefreshTokenRequest) *charond.CreateRefreshTokenResponse); ok {
+		r0 = rf(_a0, _a1)
+	} else {
+		if ret.Get(0) != nil {
+			r0 = ret.Get(0).(*charond.CreateRefreshTokenResponse)
+		}
+	}
+
+	var r1 error
+	if rf, ok := ret.Get(1).(func(context.Context, *charond.CreateRefreshTokenRequest) error); ok {
+		r1 = rf(_a0, _a1)
+	} else {
+		r1 = ret.Error(1)
+	}
+
+	return r0, r1
+}
+
+// List provides a mock function with given fields: _a0, _a1
+func (_m *RefreshTokenManagerServer) List(_a0 context.Context, _a1 *charond.ListRefreshTokensRequest) (*charond.ListRefreshTokensResponse, error) {
+	ret := _m.Called(_a0, _a1)
+
+	var r0 *charond.ListRefreshTokensResponse
+	if rf, ok := ret.Get(0).(func(context.Context, *charond.ListRefreshTokensRequest) *charond.ListRefreshTokensResponse); ok {
+		r0 = rf(_a0, _a1)
+	} else {
+		if ret.Get(0) != nil {
+			r0 = ret.Get(0).(*charond.ListRefreshTokensResponse)
+		}
+	}
+
+	var r1 error
+	if rf, ok := ret.Get(1).(func(context.Context, *charond.ListRefreshTokensRequest) error); ok {
+		r1 = rf(_a0, _a1)
+	} else {
+		r1 = ret.Error(1)
+	}
+
+	return r0, r1
+}
+
+// Revoke provides a mock function with given fields: _a0, _a1
+func (_m *RefreshTokenManagerServer) Revoke(_a0 context.Context, _a1 *charond.RevokeRefreshTokenRequest) (*charond.RevokeRefreshTokenResponse, error) {
+	ret := _m.Called(_a0, _a1)
+
+	var r0 *charond.RevokeRefreshTokenResponse
+	if rf, ok := ret.Get(0).(func(context.Context, *charond.RevokeRefreshTokenRequest) *charond.RevokeRefreshTokenResponse); ok {
+		r0 = rf(_a0, _a1)
+	} else {
+		if ret.Get(0) != nil {
+			r0 = ret.Get(0).(*charond.RevokeRefreshTokenResponse)
+		}
+	}
+
+	var r1 error
+	if rf, ok := ret.Get(1).(func(context.Context, *charond.RevokeRefreshTokenRequest) error); ok {
+		r1 = rf(_a0, _a1)
+	} else {
+		r1 = ret.Error(1)
+	}
+
+	return r0, r1
+}
diff --git a/charontest/user_manager_client.go b/pb/rpc/charond/v1mock/user_manager_client.go
similarity index 54%
rename from charontest/user_manager_client.go
rename to pb/rpc/charond/v1mock/user_manager_client.go
index 8273b0e..e277441 100644
--- a/charontest/user_manager_client.go
+++ b/pb/rpc/charond/v1mock/user_manager_client.go
@@ -1,8 +1,8 @@
 // Code generated by mockery v1.0.0. DO NOT EDIT.
 
-package charontest
+package charondmock
 
-import charonrpc "github.com/piotrkowalczuk/charon/charonrpc"
+import charond "github.com/piotrkowalczuk/charon/pb/rpc/charond/v1"
 import context "context"
 import grpc "google.golang.org/grpc"
 import mock "github.com/stretchr/testify/mock"
@@ -14,7 +14,7 @@ type UserManagerClient struct {
 }
 
 // Create provides a mock function with given fields: ctx, in, opts
-func (_m *UserManagerClient) Create(ctx context.Context, in *charonrpc.CreateUserRequest, opts ...grpc.CallOption) (*charonrpc.CreateUserResponse, error) {
+func (_m *UserManagerClient) Create(ctx context.Context, in *charond.CreateUserRequest, opts ...grpc.CallOption) (*charond.CreateUserResponse, error) {
 	_va := make([]interface{}, len(opts))
 	for _i := range opts {
 		_va[_i] = opts[_i]
@@ -24,17 +24,17 @@ func (_m *UserManagerClient) Create(ctx context.Context, in *charonrpc.CreateUse
 	_ca = append(_ca, _va...)
 	ret := _m.Called(_ca...)
 
-	var r0 *charonrpc.CreateUserResponse
-	if rf, ok := ret.Get(0).(func(context.Context, *charonrpc.CreateUserRequest, ...grpc.CallOption) *charonrpc.CreateUserResponse); ok {
+	var r0 *charond.CreateUserResponse
+	if rf, ok := ret.Get(0).(func(context.Context, *charond.CreateUserRequest, ...grpc.CallOption) *charond.CreateUserResponse); ok {
 		r0 = rf(ctx, in, opts...)
 	} else {
 		if ret.Get(0) != nil {
-			r0 = ret.Get(0).(*charonrpc.CreateUserResponse)
+			r0 = ret.Get(0).(*charond.CreateUserResponse)
 		}
 	}
 
 	var r1 error
-	if rf, ok := ret.Get(1).(func(context.Context, *charonrpc.CreateUserRequest, ...grpc.CallOption) error); ok {
+	if rf, ok := ret.Get(1).(func(context.Context, *charond.CreateUserRequest, ...grpc.CallOption) error); ok {
 		r1 = rf(ctx, in, opts...)
 	} else {
 		r1 = ret.Error(1)
@@ -44,7 +44,7 @@ func (_m *UserManagerClient) Create(ctx context.Context, in *charonrpc.CreateUse
 }
 
 // Delete provides a mock function with given fields: ctx, in, opts
-func (_m *UserManagerClient) Delete(ctx context.Context, in *charonrpc.DeleteUserRequest, opts ...grpc.CallOption) (*wrappers.BoolValue, error) {
+func (_m *UserManagerClient) Delete(ctx context.Context, in *charond.DeleteUserRequest, opts ...grpc.CallOption) (*wrappers.BoolValue, error) {
 	_va := make([]interface{}, len(opts))
 	for _i := range opts {
 		_va[_i] = opts[_i]
@@ -55,7 +55,7 @@ func (_m *UserManagerClient) Delete(ctx context.Context, in *charonrpc.DeleteUse
 	ret := _m.Called(_ca...)
 
 	var r0 *wrappers.BoolValue
-	if rf, ok := ret.Get(0).(func(context.Context, *charonrpc.DeleteUserRequest, ...grpc.CallOption) *wrappers.BoolValue); ok {
+	if rf, ok := ret.Get(0).(func(context.Context, *charond.DeleteUserRequest, ...grpc.CallOption) *wrappers.BoolValue); ok {
 		r0 = rf(ctx, in, opts...)
 	} else {
 		if ret.Get(0) != nil {
@@ -64,7 +64,7 @@ func (_m *UserManagerClient) Delete(ctx context.Context, in *charonrpc.DeleteUse
 	}
 
 	var r1 error
-	if rf, ok := ret.Get(1).(func(context.Context, *charonrpc.DeleteUserRequest, ...grpc.CallOption) error); ok {
+	if rf, ok := ret.Get(1).(func(context.Context, *charond.DeleteUserRequest, ...grpc.CallOption) error); ok {
 		r1 = rf(ctx, in, opts...)
 	} else {
 		r1 = ret.Error(1)
@@ -74,7 +74,7 @@ func (_m *UserManagerClient) Delete(ctx context.Context, in *charonrpc.DeleteUse
 }
 
 // Get provides a mock function with given fields: ctx, in, opts
-func (_m *UserManagerClient) Get(ctx context.Context, in *charonrpc.GetUserRequest, opts ...grpc.CallOption) (*charonrpc.GetUserResponse, error) {
+func (_m *UserManagerClient) Get(ctx context.Context, in *charond.GetUserRequest, opts ...grpc.CallOption) (*charond.GetUserResponse, error) {
 	_va := make([]interface{}, len(opts))
 	for _i := range opts {
 		_va[_i] = opts[_i]
@@ -84,17 +84,17 @@ func (_m *UserManagerClient) Get(ctx context.Context, in *charonrpc.GetUserReque
 	_ca = append(_ca, _va...)
 	ret := _m.Called(_ca...)
 
-	var r0 *charonrpc.GetUserResponse
-	if rf, ok := ret.Get(0).(func(context.Context, *charonrpc.GetUserRequest, ...grpc.CallOption) *charonrpc.GetUserResponse); ok {
+	var r0 *charond.GetUserResponse
+	if rf, ok := ret.Get(0).(func(context.Context, *charond.GetUserRequest, ...grpc.CallOption) *charond.GetUserResponse); ok {
 		r0 = rf(ctx, in, opts...)
 	} else {
 		if ret.Get(0) != nil {
-			r0 = ret.Get(0).(*charonrpc.GetUserResponse)
+			r0 = ret.Get(0).(*charond.GetUserResponse)
 		}
 	}
 
 	var r1 error
-	if rf, ok := ret.Get(1).(func(context.Context, *charonrpc.GetUserRequest, ...grpc.CallOption) error); ok {
+	if rf, ok := ret.Get(1).(func(context.Context, *charond.GetUserRequest, ...grpc.CallOption) error); ok {
 		r1 = rf(ctx, in, opts...)
 	} else {
 		r1 = ret.Error(1)
@@ -104,7 +104,7 @@ func (_m *UserManagerClient) Get(ctx context.Context, in *charonrpc.GetUserReque
 }
 
 // List provides a mock function with given fields: ctx, in, opts
-func (_m *UserManagerClient) List(ctx context.Context, in *charonrpc.ListUsersRequest, opts ...grpc.CallOption) (*charonrpc.ListUsersResponse, error) {
+func (_m *UserManagerClient) List(ctx context.Context, in *charond.ListUsersRequest, opts ...grpc.CallOption) (*charond.ListUsersResponse, error) {
 	_va := make([]interface{}, len(opts))
 	for _i := range opts {
 		_va[_i] = opts[_i]
@@ -114,17 +114,17 @@ func (_m *UserManagerClient) List(ctx context.Context, in *charonrpc.ListUsersRe
 	_ca = append(_ca, _va...)
 	ret := _m.Called(_ca...)
 
-	var r0 *charonrpc.ListUsersResponse
-	if rf, ok := ret.Get(0).(func(context.Context, *charonrpc.ListUsersRequest, ...grpc.CallOption) *charonrpc.ListUsersResponse); ok {
+	var r0 *charond.ListUsersResponse
+	if rf, ok := ret.Get(0).(func(context.Context, *charond.ListUsersRequest, ...grpc.CallOption) *charond.ListUsersResponse); ok {
 		r0 = rf(ctx, in, opts...)
 	} else {
 		if ret.Get(0) != nil {
-			r0 = ret.Get(0).(*charonrpc.ListUsersResponse)
+			r0 = ret.Get(0).(*charond.ListUsersResponse)
 		}
 	}
 
 	var r1 error
-	if rf, ok := ret.Get(1).(func(context.Context, *charonrpc.ListUsersRequest, ...grpc.CallOption) error); ok {
+	if rf, ok := ret.Get(1).(func(context.Context, *charond.ListUsersRequest, ...grpc.CallOption) error); ok {
 		r1 = rf(ctx, in, opts...)
 	} else {
 		r1 = ret.Error(1)
@@ -134,7 +134,7 @@ func (_m *UserManagerClient) List(ctx context.Context, in *charonrpc.ListUsersRe
 }
 
 // ListGroups provides a mock function with given fields: ctx, in, opts
-func (_m *UserManagerClient) ListGroups(ctx context.Context, in *charonrpc.ListUserGroupsRequest, opts ...grpc.CallOption) (*charonrpc.ListUserGroupsResponse, error) {
+func (_m *UserManagerClient) ListGroups(ctx context.Context, in *charond.ListUserGroupsRequest, opts ...grpc.CallOption) (*charond.ListUserGroupsResponse, error) {
 	_va := make([]interface{}, len(opts))
 	for _i := range opts {
 		_va[_i] = opts[_i]
@@ -144,17 +144,17 @@ func (_m *UserManagerClient) ListGroups(ctx context.Context, in *charonrpc.ListU
 	_ca = append(_ca, _va...)
 	ret := _m.Called(_ca...)
 
-	var r0 *charonrpc.ListUserGroupsResponse
-	if rf, ok := ret.Get(0).(func(context.Context, *charonrpc.ListUserGroupsRequest, ...grpc.CallOption) *charonrpc.ListUserGroupsResponse); ok {
+	var r0 *charond.ListUserGroupsResponse
+	if rf, ok := ret.Get(0).(func(context.Context, *charond.ListUserGroupsRequest, ...grpc.CallOption) *charond.ListUserGroupsResponse); ok {
 		r0 = rf(ctx, in, opts...)
 	} else {
 		if ret.Get(0) != nil {
-			r0 = ret.Get(0).(*charonrpc.ListUserGroupsResponse)
+			r0 = ret.Get(0).(*charond.ListUserGroupsResponse)
 		}
 	}
 
 	var r1 error
-	if rf, ok := ret.Get(1).(func(context.Context, *charonrpc.ListUserGroupsRequest, ...grpc.CallOption) error); ok {
+	if rf, ok := ret.Get(1).(func(context.Context, *charond.ListUserGroupsRequest, ...grpc.CallOption) error); ok {
 		r1 = rf(ctx, in, opts...)
 	} else {
 		r1 = ret.Error(1)
@@ -164,7 +164,7 @@ func (_m *UserManagerClient) ListGroups(ctx context.Context, in *charonrpc.ListU
 }
 
 // ListPermissions provides a mock function with given fields: ctx, in, opts
-func (_m *UserManagerClient) ListPermissions(ctx context.Context, in *charonrpc.ListUserPermissionsRequest, opts ...grpc.CallOption) (*charonrpc.ListUserPermissionsResponse, error) {
+func (_m *UserManagerClient) ListPermissions(ctx context.Context, in *charond.ListUserPermissionsRequest, opts ...grpc.CallOption) (*charond.ListUserPermissionsResponse, error) {
 	_va := make([]interface{}, len(opts))
 	for _i := range opts {
 		_va[_i] = opts[_i]
@@ -174,17 +174,17 @@ func (_m *UserManagerClient) ListPermissions(ctx context.Context, in *charonrpc.
 	_ca = append(_ca, _va...)
 	ret := _m.Called(_ca...)
 
-	var r0 *charonrpc.ListUserPermissionsResponse
-	if rf, ok := ret.Get(0).(func(context.Context, *charonrpc.ListUserPermissionsRequest, ...grpc.CallOption) *charonrpc.ListUserPermissionsResponse); ok {
+	var r0 *charond.ListUserPermissionsResponse
+	if rf, ok := ret.Get(0).(func(context.Context, *charond.ListUserPermissionsRequest, ...grpc.CallOption) *charond.ListUserPermissionsResponse); ok {
 		r0 = rf(ctx, in, opts...)
 	} else {
 		if ret.Get(0) != nil {
-			r0 = ret.Get(0).(*charonrpc.ListUserPermissionsResponse)
+			r0 = ret.Get(0).(*charond.ListUserPermissionsResponse)
 		}
 	}
 
 	var r1 error
-	if rf, ok := ret.Get(1).(func(context.Context, *charonrpc.ListUserPermissionsRequest, ...grpc.CallOption) error); ok {
+	if rf, ok := ret.Get(1).(func(context.Context, *charond.ListUserPermissionsRequest, ...grpc.CallOption) error); ok {
 		r1 = rf(ctx, in, opts...)
 	} else {
 		r1 = ret.Error(1)
@@ -194,7 +194,7 @@ func (_m *UserManagerClient) ListPermissions(ctx context.Context, in *charonrpc.
 }
 
 // Modify provides a mock function with given fields: ctx, in, opts
-func (_m *UserManagerClient) Modify(ctx context.Context, in *charonrpc.ModifyUserRequest, opts ...grpc.CallOption) (*charonrpc.ModifyUserResponse, error) {
+func (_m *UserManagerClient) Modify(ctx context.Context, in *charond.ModifyUserRequest, opts ...grpc.CallOption) (*charond.ModifyUserResponse, error) {
 	_va := make([]interface{}, len(opts))
 	for _i := range opts {
 		_va[_i] = opts[_i]
@@ -204,17 +204,17 @@ func (_m *UserManagerClient) Modify(ctx context.Context, in *charonrpc.ModifyUse
 	_ca = append(_ca, _va...)
 	ret := _m.Called(_ca...)
 
-	var r0 *charonrpc.ModifyUserResponse
-	if rf, ok := ret.Get(0).(func(context.Context, *charonrpc.ModifyUserRequest, ...grpc.CallOption) *charonrpc.ModifyUserResponse); ok {
+	var r0 *charond.ModifyUserResponse
+	if rf, ok := ret.Get(0).(func(context.Context, *charond.ModifyUserRequest, ...grpc.CallOption) *charond.ModifyUserResponse); ok {
 		r0 = rf(ctx, in, opts...)
 	} else {
 		if ret.Get(0) != nil {
-			r0 = ret.Get(0).(*charonrpc.ModifyUserResponse)
+			r0 = ret.Get(0).(*charond.ModifyUserResponse)
 		}
 	}
 
 	var r1 error
-	if rf, ok := ret.Get(1).(func(context.Context, *charonrpc.ModifyUserRequest, ...grpc.CallOption) error); ok {
+	if rf, ok := ret.Get(1).(func(context.Context, *charond.ModifyUserRequest, ...grpc.CallOption) error); ok {
 		r1 = rf(ctx, in, opts...)
 	} else {
 		r1 = ret.Error(1)
@@ -224,7 +224,7 @@ func (_m *UserManagerClient) Modify(ctx context.Context, in *charonrpc.ModifyUse
 }
 
 // SetGroups provides a mock function with given fields: ctx, in, opts
-func (_m *UserManagerClient) SetGroups(ctx context.Context, in *charonrpc.SetUserGroupsRequest, opts ...grpc.CallOption) (*charonrpc.SetUserGroupsResponse, error) {
+func (_m *UserManagerClient) SetGroups(ctx context.Context, in *charond.SetUserGroupsRequest, opts ...grpc.CallOption) (*charond.SetUserGroupsResponse, error) {
 	_va := make([]interface{}, len(opts))
 	for _i := range opts {
 		_va[_i] = opts[_i]
@@ -234,17 +234,17 @@ func (_m *UserManagerClient) SetGroups(ctx context.Context, in *charonrpc.SetUse
 	_ca = append(_ca, _va...)
 	ret := _m.Called(_ca...)
 
-	var r0 *charonrpc.SetUserGroupsResponse
-	if rf, ok := ret.Get(0).(func(context.Context, *charonrpc.SetUserGroupsRequest, ...grpc.CallOption) *charonrpc.SetUserGroupsResponse); ok {
+	var r0 *charond.SetUserGroupsResponse
+	if rf, ok := ret.Get(0).(func(context.Context, *charond.SetUserGroupsRequest, ...grpc.CallOption) *charond.SetUserGroupsResponse); ok {
 		r0 = rf(ctx, in, opts...)
 	} else {
 		if ret.Get(0) != nil {
-			r0 = ret.Get(0).(*charonrpc.SetUserGroupsResponse)
+			r0 = ret.Get(0).(*charond.SetUserGroupsResponse)
 		}
 	}
 
 	var r1 error
-	if rf, ok := ret.Get(1).(func(context.Context, *charonrpc.SetUserGroupsRequest, ...grpc.CallOption) error); ok {
+	if rf, ok := ret.Get(1).(func(context.Context, *charond.SetUserGroupsRequest, ...grpc.CallOption) error); ok {
 		r1 = rf(ctx, in, opts...)
 	} else {
 		r1 = ret.Error(1)
@@ -254,7 +254,7 @@ func (_m *UserManagerClient) SetGroups(ctx context.Context, in *charonrpc.SetUse
 }
 
 // SetPermissions provides a mock function with given fields: ctx, in, opts
-func (_m *UserManagerClient) SetPermissions(ctx context.Context, in *charonrpc.SetUserPermissionsRequest, opts ...grpc.CallOption) (*charonrpc.SetUserPermissionsResponse, error) {
+func (_m *UserManagerClient) SetPermissions(ctx context.Context, in *charond.SetUserPermissionsRequest, opts ...grpc.CallOption) (*charond.SetUserPermissionsResponse, error) {
 	_va := make([]interface{}, len(opts))
 	for _i := range opts {
 		_va[_i] = opts[_i]
@@ -264,17 +264,17 @@ func (_m *UserManagerClient) SetPermissions(ctx context.Context, in *charonrpc.S
 	_ca = append(_ca, _va...)
 	ret := _m.Called(_ca...)
 
-	var r0 *charonrpc.SetUserPermissionsResponse
-	if rf, ok := ret.Get(0).(func(context.Context, *charonrpc.SetUserPermissionsRequest, ...grpc.CallOption) *charonrpc.SetUserPermissionsResponse); ok {
+	var r0 *charond.SetUserPermissionsResponse
+	if rf, ok := ret.Get(0).(func(context.Context, *charond.SetUserPermissionsRequest, ...grpc.CallOption) *charond.SetUserPermissionsResponse); ok {
 		r0 = rf(ctx, in, opts...)
 	} else {
 		if ret.Get(0) != nil {
-			r0 = ret.Get(0).(*charonrpc.SetUserPermissionsResponse)
+			r0 = ret.Get(0).(*charond.SetUserPermissionsResponse)
 		}
 	}
 
 	var r1 error
-	if rf, ok := ret.Get(1).(func(context.Context, *charonrpc.SetUserPermissionsRequest, ...grpc.CallOption) error); ok {
+	if rf, ok := ret.Get(1).(func(context.Context, *charond.SetUserPermissionsRequest, ...grpc.CallOption) error); ok {
 		r1 = rf(ctx, in, opts...)
 	} else {
 		r1 = ret.Error(1)
diff --git a/pb/rpc/charond/v1mock/user_manager_server.go b/pb/rpc/charond/v1mock/user_manager_server.go
new file mode 100644
index 0000000..a54c9da
--- /dev/null
+++ b/pb/rpc/charond/v1mock/user_manager_server.go
@@ -0,0 +1,220 @@
+// Code generated by mockery v1.0.0. DO NOT EDIT.
+
+package charondmock
+
+import charond "github.com/piotrkowalczuk/charon/pb/rpc/charond/v1"
+import context "context"
+import mock "github.com/stretchr/testify/mock"
+import wrappers "github.com/golang/protobuf/ptypes/wrappers"
+
+// UserManagerServer is an autogenerated mock type for the UserManagerServer type
+type UserManagerServer struct {
+	mock.Mock
+}
+
+// Create provides a mock function with given fields: _a0, _a1
+func (_m *UserManagerServer) Create(_a0 context.Context, _a1 *charond.CreateUserRequest) (*charond.CreateUserResponse, error) {
+	ret := _m.Called(_a0, _a1)
+
+	var r0 *charond.CreateUserResponse
+	if rf, ok := ret.Get(0).(func(context.Context, *charond.CreateUserRequest) *charond.CreateUserResponse); ok {
+		r0 = rf(_a0, _a1)
+	} else {
+		if ret.Get(0) != nil {
+			r0 = ret.Get(0).(*charond.CreateUserResponse)
+		}
+	}
+
+	var r1 error
+	if rf, ok := ret.Get(1).(func(context.Context, *charond.CreateUserRequest) error); ok {
+		r1 = rf(_a0, _a1)
+	} else {
+		r1 = ret.Error(1)
+	}
+
+	return r0, r1
+}
+
+// Delete provides a mock function with given fields: _a0, _a1
+func (_m *UserManagerServer) Delete(_a0 context.Context, _a1 *charond.DeleteUserRequest) (*wrappers.BoolValue, error) {
+	ret := _m.Called(_a0, _a1)
+
+	var r0 *wrappers.BoolValue
+	if rf, ok := ret.Get(0).(func(context.Context, *charond.DeleteUserRequest) *wrappers.BoolValue); ok {
+		r0 = rf(_a0, _a1)
+	} else {
+		if ret.Get(0) != nil {
+			r0 = ret.Get(0).(*wrappers.BoolValue)
+		}
+	}
+
+	var r1 error
+	if rf, ok := ret.Get(1).(func(context.Context, *charond.DeleteUserRequest) error); ok {
+		r1 = rf(_a0, _a1)
+	} else {
+		r1 = ret.Error(1)
+	}
+
+	return r0, r1
+}
+
+// Get provides a mock function with given fields: _a0, _a1
+func (_m *UserManagerServer) Get(_a0 context.Context, _a1 *charond.GetUserRequest) (*charond.GetUserResponse, error) {
+	ret := _m.Called(_a0, _a1)
+
+	var r0 *charond.GetUserResponse
+	if rf, ok := ret.Get(0).(func(context.Context, *charond.GetUserRequest) *charond.GetUserResponse); ok {
+		r0 = rf(_a0, _a1)
+	} else {
+		if ret.Get(0) != nil {
+			r0 = ret.Get(0).(*charond.GetUserResponse)
+		}
+	}
+
+	var r1 error
+	if rf, ok := ret.Get(1).(func(context.Context, *charond.GetUserRequest) error); ok {
+		r1 = rf(_a0, _a1)
+	} else {
+		r1 = ret.Error(1)
+	}
+
+	return r0, r1
+}
+
+// List provides a mock function with given fields: _a0, _a1
+func (_m *UserManagerServer) List(_a0 context.Context, _a1 *charond.ListUsersRequest) (*charond.ListUsersResponse, error) {
+	ret := _m.Called(_a0, _a1)
+
+	var r0 *charond.ListUsersResponse
+	if rf, ok := ret.Get(0).(func(context.Context, *charond.ListUsersRequest) *charond.ListUsersResponse); ok {
+		r0 = rf(_a0, _a1)
+	} else {
+		if ret.Get(0) != nil {
+			r0 = ret.Get(0).(*charond.ListUsersResponse)
+		}
+	}
+
+	var r1 error
+	if rf, ok := ret.Get(1).(func(context.Context, *charond.ListUsersRequest) error); ok {
+		r1 = rf(_a0, _a1)
+	} else {
+		r1 = ret.Error(1)
+	}
+
+	return r0, r1
+}
+
+// ListGroups provides a mock function with given fields: _a0, _a1
+func (_m *UserManagerServer) ListGroups(_a0 context.Context, _a1 *charond.ListUserGroupsRequest) (*charond.ListUserGroupsResponse, error) {
+	ret := _m.Called(_a0, _a1)
+
+	var r0 *charond.ListUserGroupsResponse
+	if rf, ok := ret.Get(0).(func(context.Context, *charond.ListUserGroupsRequest) *charond.ListUserGroupsResponse); ok {
+		r0 = rf(_a0, _a1)
+	} else {
+		if ret.Get(0) != nil {
+			r0 = ret.Get(0).(*charond.ListUserGroupsResponse)
+		}
+	}
+
+	var r1 error
+	if rf, ok := ret.Get(1).(func(context.Context, *charond.ListUserGroupsRequest) error); ok {
+		r1 = rf(_a0, _a1)
+	} else {
+		r1 = ret.Error(1)
+	}
+
+	return r0, r1
+}
+
+// ListPermissions provides a mock function with given fields: _a0, _a1
+func (_m *UserManagerServer) ListPermissions(_a0 context.Context, _a1 *charond.ListUserPermissionsRequest) (*charond.ListUserPermissionsResponse, error) {
+	ret := _m.Called(_a0, _a1)
+
+	var r0 *charond.ListUserPermissionsResponse
+	if rf, ok := ret.Get(0).(func(context.Context, *charond.ListUserPermissionsRequest) *charond.ListUserPermissionsResponse); ok {
+		r0 = rf(_a0, _a1)
+	} else {
+		if ret.Get(0) != nil {
+			r0 = ret.Get(0).(*charond.ListUserPermissionsResponse)
+		}
+	}
+
+	var r1 error
+	if rf, ok := ret.Get(1).(func(context.Context, *charond.ListUserPermissionsRequest) error); ok {
+		r1 = rf(_a0, _a1)
+	} else {
+		r1 = ret.Error(1)
+	}
+
+	return r0, r1
+}
+
+// Modify provides a mock function with given fields: _a0, _a1
+func (_m *UserManagerServer) Modify(_a0 context.Context, _a1 *charond.ModifyUserRequest) (*charond.ModifyUserResponse, error) {
+	ret := _m.Called(_a0, _a1)
+
+	var r0 *charond.ModifyUserResponse
+	if rf, ok := ret.Get(0).(func(context.Context, *charond.ModifyUserRequest) *charond.ModifyUserResponse); ok {
+		r0 = rf(_a0, _a1)
+	} else {
+		if ret.Get(0) != nil {
+			r0 = ret.Get(0).(*charond.ModifyUserResponse)
+		}
+	}
+
+	var r1 error
+	if rf, ok := ret.Get(1).(func(context.Context, *charond.ModifyUserRequest) error); ok {
+		r1 = rf(_a0, _a1)
+	} else {
+		r1 = ret.Error(1)
+	}
+
+	return r0, r1
+}
+
+// SetGroups provides a mock function with given fields: _a0, _a1
+func (_m *UserManagerServer) SetGroups(_a0 context.Context, _a1 *charond.SetUserGroupsRequest) (*charond.SetUserGroupsResponse, error) {
+	ret := _m.Called(_a0, _a1)
+
+	var r0 *charond.SetUserGroupsResponse
+	if rf, ok := ret.Get(0).(func(context.Context, *charond.SetUserGroupsRequest) *charond.SetUserGroupsResponse); ok {
+		r0 = rf(_a0, _a1)
+	} else {
+		if ret.Get(0) != nil {
+			r0 = ret.Get(0).(*charond.SetUserGroupsResponse)
+		}
+	}
+
+	var r1 error
+	if rf, ok := ret.Get(1).(func(context.Context, *charond.SetUserGroupsRequest) error); ok {
+		r1 = rf(_a0, _a1)
+	} else {
+		r1 = ret.Error(1)
+	}
+
+	return r0, r1
+}
+
+// SetPermissions provides a mock function with given fields: _a0, _a1
+func (_m *UserManagerServer) SetPermissions(_a0 context.Context, _a1 *charond.SetUserPermissionsRequest) (*charond.SetUserPermissionsResponse, error) {
+	ret := _m.Called(_a0, _a1)
+
+	var r0 *charond.SetUserPermissionsResponse
+	if rf, ok := ret.Get(0).(func(context.Context, *charond.SetUserPermissionsRequest) *charond.SetUserPermissionsResponse); ok {
+		r0 = rf(_a0, _a1)
+	} else {
+		if ret.Get(0) != nil {
+			r0 = ret.Get(0).(*charond.SetUserPermissionsResponse)
+		}
+	}
+
+	var r1 error
+	if rf, ok := ret.Get(1).(func(context.Context, *charond.SetUserPermissionsRequest) error); ok {
+		r1 = rf(_a0, _a1)
+	} else {
+		r1 = ret.Error(1)
+	}
+
+	return r0, r1
+}
diff --git a/presentation.slide b/presentation.slide
index 6bef1ba..e6f43fd 100644
--- a/presentation.slide
+++ b/presentation.slide
@@ -84,7 +84,7 @@ Examples:
 
 Management:
 
-.code charonrpc/permission.pb.go /^type PermissionManagerServer interface/,/^}/
+.code pb/rpc/charond/v1/permission.pb.go /^type PermissionManagerServer interface/,/^}/
 
 * Security Context
 
diff --git a/MANIFEST.in b/publish/python/MANIFEST.in
similarity index 100%
rename from MANIFEST.in
rename to publish/python/MANIFEST.in
diff --git a/publish/python/README.rst b/publish/python/README.rst
new file mode 100644
index 0000000..454ecda
--- /dev/null
+++ b/publish/python/README.rst
@@ -0,0 +1,38 @@
+#################
+Charon Client
+#################
+
+TODO
+
+*************
+Example
+*************
+
+::
+
+  $ pip install charon-client
+
+
+.. code-block:: python
+
+    from  github.com.piotrkowalczuk.charon.pb.rpc.charond.v1 import auth_pb2, auth_pb2_grpc
+    import grpc
+
+    charonChannel = grpc.insecure_channel('ADDRESS')
+    auth = auth_pb2_grpc.AuthStub(charonChannel)
+    try:
+        res = auth.Login(auth_pb2.LoginRequest(
+            username="USERNAME",
+            password="PASSWORD",
+        ))
+
+        print "access token: %s" % res.value
+    except grpc.RpcError as e:
+        if e.code() == grpc.StatusCode.UNAUTHENTICATED:
+            print "login failure, username and/or password do not match"
+        else:
+            print "grpc error: %s" % e
+    except Exception as e:
+        print "unexpected error: %s" % e
+
+
diff --git a/publish/python/setup.cfg b/publish/python/setup.cfg
new file mode 100644
index 0000000..81d4a7f
--- /dev/null
+++ b/publish/python/setup.cfg
@@ -0,0 +1,2 @@
+[metadata]
+description-file=README.txt
\ No newline at end of file
diff --git a/setup.py b/publish/python/setup.py
similarity index 86%
rename from setup.py
rename to publish/python/setup.py
index a0cb9cd..44104a0 100644
--- a/setup.py
+++ b/publish/python/setup.py
@@ -1,7 +1,7 @@
 from setuptools import setup
 from subprocess import check_output
 
-with open('VERSION.txt', 'r') as content_file:
+with open('../VERSION.txt', 'r') as content_file:
     version = content_file.read()
 
     setup(
@@ -12,7 +12,7 @@
         author='Piotr Kowalczuk',
         author_email='p.kowalczuk.priv@gmail.com',
         license='MIT',
-        packages=['charonrpc'],
+        packages=['github.com.piotrkowalczuk.charon.pb.rpc.charond.v1'],
         install_requires=[
             'protobuf',
             'grpcio',
diff --git a/scripts/generate.sh b/scripts/generate.sh
index c2febf3..f170cc1 100755
--- a/scripts/generate.sh
+++ b/scripts/generate.sh
@@ -1,6 +1,7 @@
 #!/usr/bin/env bash
 
 SERVICE=charon
+
 cd ./internal/model && charong && cd -
 goimports -w ./internal/model
 mockery -case=underscore -dir=./internal/model -all -output=./internal/model/modelmock -outpkg=modelmock
@@ -10,3 +11,4 @@ mockery -case=underscore -dir=./internal/service -all -output=./internal/service
 mockery -case=underscore -dir=./${SERVICE}rpc -all -output=./${SERVICE}test -outpkg=${SERVICE}test
 goimports -w ./internal/model
 
+
diff --git a/setup.cfg b/setup.cfg
deleted file mode 100644
index 4489b56..0000000
--- a/setup.cfg
+++ /dev/null
@@ -1,2 +0,0 @@
-[metadata]
-description-file=README.md
\ No newline at end of file


Test patch:
diff --git a/.circleci/scripts/test.sh b/.circleci/scripts/test.sh
index a61d543..5510a6a 100755
--- a/.circleci/scripts/test.sh
+++ b/.circleci/scripts/test.sh
@@ -8,7 +8,7 @@ set -e
 gotestsum --junitfile results.xml -- -p=1 -count=1 -race -coverprofile=cover-source.out -covermode=atomic -v ./...
 cat cover-source.out | grep -v '.pb.go' > cover-step1.out
 cat cover-step1.out | grep -v 'mock' > cover-step2.out
-cat cover-step2.out | grep -v '/charontest/' > cover-step3.out
+cat cover-step2.out | grep -v '/pb/' > cover-step3.out
 cat cover-step3.out | grep -v '/example/' > cover-step4.out
 cat cover-step4.out | grep -v '.pqt.go' > cover.out
 
diff --git a/charon.test b/charon.test
deleted file mode 100755
index 8fb2944..0000000
Binary files a/charon.test and /dev/null differ
diff --git a/charonrpc/user_test.go b/charonrpc/user_test.go
deleted file mode 100644
index 3b5db7c..0000000
--- a/charonrpc/user_test.go
+++ /dev/null
@@ -1,17 +0,0 @@
-package charonrpc_test
-
-import (
-	"testing"
-
-	"github.com/piotrkowalczuk/charon/charonrpc"
-)
-
-func TestUser_Name(t *testing.T) {
-	given := &charonrpc.User{FirstName: "John", LastName: "Snow"}
-	expected := "John Snow"
-
-	got := given.Name()
-	if got != expected {
-		t.Errorf("output do not match, expected %s but got %s", expected, got)
-	}
-}
diff --git a/charontest/charonrpc.mock_test.go b/charontest/charonrpc.mock_test.go
deleted file mode 100644
index 8fea3c1..0000000
--- a/charontest/charonrpc.mock_test.go
+++ /dev/null
@@ -1,40 +0,0 @@
-package charontest_test
-
-import (
-	"testing"
-
-	"github.com/piotrkowalczuk/charon/charonrpc"
-	"github.com/piotrkowalczuk/charon/charontest"
-)
-
-func TestAuthClient(t *testing.T) {
-	var mock interface{} = &charontest.AuthClient{}
-
-	if _, ok := mock.(charonrpc.AuthClient); !ok {
-		t.Error("auth client mock should implement original interface, but does not")
-	}
-}
-
-func TestUserManagerClient(t *testing.T) {
-	var mock interface{} = &charontest.UserManagerClient{}
-
-	if _, ok := mock.(charonrpc.UserManagerClient); !ok {
-		t.Error("user manager client mock should implement original interface, but does not")
-	}
-}
-
-func TestGroupManagerClient(t *testing.T) {
-	var mock interface{} = &charontest.GroupManagerClient{}
-
-	if _, ok := mock.(charonrpc.GroupManagerClient); !ok {
-		t.Error("group manager client mock should implement original interface, but does not")
-	}
-}
-
-func TestPermissionManagerClient(t *testing.T) {
-	var mock interface{} = &charontest.PermissionManagerClient{}
-
-	if _, ok := mock.(charonrpc.PermissionManagerClient); !ok {
-		t.Error("permission manager client mock should implement original interface, but does not")
-	}
-}
diff --git a/charontest/group_manager_server.go b/charontest/group_manager_server.go
deleted file mode 100644
index 1b1d84f..0000000
--- a/charontest/group_manager_server.go
+++ /dev/null
@@ -1,174 +0,0 @@
-// Code generated by mockery v1.0.0. DO NOT EDIT.
-
-package charontest
-
-import charonrpc "github.com/piotrkowalczuk/charon/charonrpc"
-import context "context"
-import mock "github.com/stretchr/testify/mock"
-import wrappers "github.com/golang/protobuf/ptypes/wrappers"
-
-// GroupManagerServer is an autogenerated mock type for the GroupManagerServer type
-type GroupManagerServer struct {
-	mock.Mock
-}
-
-// Create provides a mock function with given fields: _a0, _a1
-func (_m *GroupManagerServer) Create(_a0 context.Context, _a1 *charonrpc.CreateGroupRequest) (*charonrpc.CreateGroupResponse, error) {
-	ret := _m.Called(_a0, _a1)
-
-	var r0 *charonrpc.CreateGroupResponse
-	if rf, ok := ret.Get(0).(func(context.Context, *charonrpc.CreateGroupRequest) *charonrpc.CreateGroupResponse); ok {
-		r0 = rf(_a0, _a1)
-	} else {
-		if ret.Get(0) != nil {
-			r0 = ret.Get(0).(*charonrpc.CreateGroupResponse)
-		}
-	}
-
-	var r1 error
-	if rf, ok := ret.Get(1).(func(context.Context, *charonrpc.CreateGroupRequest) error); ok {
-		r1 = rf(_a0, _a1)
-	} else {
-		r1 = ret.Error(1)
-	}
-
-	return r0, r1
-}
-
-// Delete provides a mock function with given fields: _a0, _a1
-func (_m *GroupManagerServer) Delete(_a0 context.Context, _a1 *charonrpc.DeleteGroupRequest) (*wrappers.BoolValue, error) {
-	ret := _m.Called(_a0, _a1)
-
-	var r0 *wrappers.BoolValue
-	if rf, ok := ret.Get(0).(func(context.Context, *charonrpc.DeleteGroupRequest) *wrappers.BoolValue); ok {
-		r0 = rf(_a0, _a1)
-	} else {
-		if ret.Get(0) != nil {
-			r0 = ret.Get(0).(*wrappers.BoolValue)
-		}
-	}
-
-	var r1 error
-	if rf, ok := ret.Get(1).(func(context.Context, *charonrpc.DeleteGroupRequest) error); ok {
-		r1 = rf(_a0, _a1)
-	} else {
-		r1 = ret.Error(1)
-	}
-
-	return r0, r1
-}
-
-// Get provides a mock function with given fields: _a0, _a1
-func (_m *GroupManagerServer) Get(_a0 context.Context, _a1 *charonrpc.GetGroupRequest) (*charonrpc.GetGroupResponse, error) {
-	ret := _m.Called(_a0, _a1)
-
-	var r0 *charonrpc.GetGroupResponse
-	if rf, ok := ret.Get(0).(func(context.Context, *charonrpc.GetGroupRequest) *charonrpc.GetGroupResponse); ok {
-		r0 = rf(_a0, _a1)
-	} else {
-		if ret.Get(0) != nil {
-			r0 = ret.Get(0).(*charonrpc.GetGroupResponse)
-		}
-	}
-
-	var r1 error
-	if rf, ok := ret.Get(1).(func(context.Context, *charonrpc.GetGroupRequest) error); ok {
-		r1 = rf(_a0, _a1)
-	} else {
-		r1 = ret.Error(1)
-	}
-
-	return r0, r1
-}
-
-// List provides a mock function with given fields: _a0, _a1
-func (_m *GroupManagerServer) List(_a0 context.Context, _a1 *charonrpc.ListGroupsRequest) (*charonrpc.ListGroupsResponse, error) {
-	ret := _m.Called(_a0, _a1)
-
-	var r0 *charonrpc.ListGroupsResponse
-	if rf, ok := ret.Get(0).(func(context.Context, *charonrpc.ListGroupsRequest) *charonrpc.ListGroupsResponse); ok {
-		r0 = rf(_a0, _a1)
-	} else {
-		if ret.Get(0) != nil {
-			r0 = ret.Get(0).(*charonrpc.ListGroupsResponse)
-		}
-	}
-
-	var r1 error
-	if rf, ok := ret.Get(1).(func(context.Context, *charonrpc.ListGroupsRequest) error); ok {
-		r1 = rf(_a0, _a1)
-	} else {
-		r1 = ret.Error(1)
-	}
-
-	return r0, r1
-}
-
-// ListPermissions provides a mock function with given fields: _a0, _a1
-func (_m *GroupManagerServer) ListPermissions(_a0 context.Context, _a1 *charonrpc.ListGroupPermissionsRequest) (*charonrpc.ListGroupPermissionsResponse, error) {
-	ret := _m.Called(_a0, _a1)
-
-	var r0 *charonrpc.ListGroupPermissionsResponse
-	if rf, ok := ret.Get(0).(func(context.Context, *charonrpc.ListGroupPermissionsRequest) *charonrpc.ListGroupPermissionsResponse); ok {
-		r0 = rf(_a0, _a1)
-	} else {
-		if ret.Get(0) != nil {
-			r0 = ret.Get(0).(*charonrpc.ListGroupPermissionsResponse)
-		}
-	}
-
-	var r1 error
-	if rf, ok := ret.Get(1).(func(context.Context, *charonrpc.ListGroupPermissionsRequest) error); ok {
-		r1 = rf(_a0, _a1)
-	} else {
-		r1 = ret.Error(1)
-	}
-
-	return r0, r1
-}
-
-// Modify provides a mock function with given fields: _a0, _a1
-func (_m *GroupManagerServer) Modify(_a0 context.Context, _a1 *charonrpc.ModifyGroupRequest) (*charonrpc.ModifyGroupResponse, error) {
-	ret := _m.Called(_a0, _a1)
-
-	var r0 *charonrpc.ModifyGroupResponse
-	if rf, ok := ret.Get(0).(func(context.Context, *charonrpc.ModifyGroupRequest) *charonrpc.ModifyGroupResponse); ok {
-		r0 = rf(_a0, _a1)
-	} else {
-		if ret.Get(0) != nil {
-			r0 = ret.Get(0).(*charonrpc.ModifyGroupResponse)
-		}
-	}
-
-	var r1 error
-	if rf, ok := ret.Get(1).(func(context.Context, *charonrpc.ModifyGroupRequest) error); ok {
-		r1 = rf(_a0, _a1)
-	} else {
-		r1 = ret.Error(1)
-	}
-
-	return r0, r1
-}
-
-// SetPermissions provides a mock function with given fields: _a0, _a1
-func (_m *GroupManagerServer) SetPermissions(_a0 context.Context, _a1 *charonrpc.SetGroupPermissionsRequest) (*charonrpc.SetGroupPermissionsResponse, error) {
-	ret := _m.Called(_a0, _a1)
-
-	var r0 *charonrpc.SetGroupPermissionsResponse
-	if rf, ok := ret.Get(0).(func(context.Context, *charonrpc.SetGroupPermissionsRequest) *charonrpc.SetGroupPermissionsResponse); ok {
-		r0 = rf(_a0, _a1)
-	} else {
-		if ret.Get(0) != nil {
-			r0 = ret.Get(0).(*charonrpc.SetGroupPermissionsResponse)
-		}
-	}
-
-	var r1 error
-	if rf, ok := ret.Get(1).(func(context.Context, *charonrpc.SetGroupPermissionsRequest) error); ok {
-		r1 = rf(_a0, _a1)
-	} else {
-		r1 = ret.Error(1)
-	}
-
-	return r0, r1
-}
diff --git a/charontest/permission_manager_server.go b/charontest/permission_manager_server.go
deleted file mode 100644
index 37ee670..0000000
--- a/charontest/permission_manager_server.go
+++ /dev/null
@@ -1,81 +0,0 @@
-// Code generated by mockery v1.0.0. DO NOT EDIT.
-
-package charontest
-
-import charonrpc "github.com/piotrkowalczuk/charon/charonrpc"
-import context "context"
-import mock "github.com/stretchr/testify/mock"
-
-// PermissionManagerServer is an autogenerated mock type for the PermissionManagerServer type
-type PermissionManagerServer struct {
-	mock.Mock
-}
-
-// Get provides a mock function with given fields: _a0, _a1
-func (_m *PermissionManagerServer) Get(_a0 context.Context, _a1 *charonrpc.GetPermissionRequest) (*charonrpc.GetPermissionResponse, error) {
-	ret := _m.Called(_a0, _a1)
-
-	var r0 *charonrpc.GetPermissionResponse
-	if rf, ok := ret.Get(0).(func(context.Context, *charonrpc.GetPermissionRequest) *charonrpc.GetPermissionResponse); ok {
-		r0 = rf(_a0, _a1)
-	} else {
-		if ret.Get(0) != nil {
-			r0 = ret.Get(0).(*charonrpc.GetPermissionResponse)
-		}
-	}
-
-	var r1 error
-	if rf, ok := ret.Get(1).(func(context.Context, *charonrpc.GetPermissionRequest) error); ok {
-		r1 = rf(_a0, _a1)
-	} else {
-		r1 = ret.Error(1)
-	}
-
-	return r0, r1
-}
-
-// List provides a mock function with given fields: _a0, _a1
-func (_m *PermissionManagerServer) List(_a0 context.Context, _a1 *charonrpc.ListPermissionsRequest) (*charonrpc.ListPermissionsResponse, error) {
-	ret := _m.Called(_a0, _a1)
-
-	var r0 *charonrpc.ListPermissionsResponse
-	if rf, ok := ret.Get(0).(func(context.Context, *charonrpc.ListPermissionsRequest) *charonrpc.ListPermissionsResponse); ok {
-		r0 = rf(_a0, _a1)
-	} else {
-		if ret.Get(0) != nil {
-			r0 = ret.Get(0).(*charonrpc.ListPermissionsResponse)
-		}
-	}
-
-	var r1 error
-	if rf, ok := ret.Get(1).(func(context.Context, *charonrpc.ListPermissionsRequest) error); ok {
-		r1 = rf(_a0, _a1)
-	} else {
-		r1 = ret.Error(1)
-	}
-
-	return r0, r1
-}
-
-// Register provides a mock function with given fields: _a0, _a1
-func (_m *PermissionManagerServer) Register(_a0 context.Context, _a1 *charonrpc.RegisterPermissionsRequest) (*charonrpc.RegisterPermissionsResponse, error) {
-	ret := _m.Called(_a0, _a1)
-
-	var r0 *charonrpc.RegisterPermissionsResponse
-	if rf, ok := ret.Get(0).(func(context.Context, *charonrpc.RegisterPermissionsRequest) *charonrpc.RegisterPermissionsResponse); ok {
-		r0 = rf(_a0, _a1)
-	} else {
-		if ret.Get(0) != nil {
-			r0 = ret.Get(0).(*charonrpc.RegisterPermissionsResponse)
-		}
-	}
-
-	var r1 error
-	if rf, ok := ret.Get(1).(func(context.Context, *charonrpc.RegisterPermissionsRequest) error); ok {
-		r1 = rf(_a0, _a1)
-	} else {
-		r1 = ret.Error(1)
-	}
-
-	return r0, r1
-}
diff --git a/charontest/refresh_token_manager_server.go b/charontest/refresh_token_manager_server.go
deleted file mode 100644
index c0db463..0000000
--- a/charontest/refresh_token_manager_server.go
+++ /dev/null
@@ -1,81 +0,0 @@
-// Code generated by mockery v1.0.0. DO NOT EDIT.
-
-package charontest
-
-import charonrpc "github.com/piotrkowalczuk/charon/charonrpc"
-import context "context"
-import mock "github.com/stretchr/testify/mock"
-
-// RefreshTokenManagerServer is an autogenerated mock type for the RefreshTokenManagerServer type
-type RefreshTokenManagerServer struct {
-	mock.Mock
-}
-
-// Create provides a mock function with given fields: _a0, _a1
-func (_m *RefreshTokenManagerServer) Create(_a0 context.Context, _a1 *charonrpc.CreateRefreshTokenRequest) (*charonrpc.CreateRefreshTokenResponse, error) {
-	ret := _m.Called(_a0, _a1)
-
-	var r0 *charonrpc.CreateRefreshTokenResponse
-	if rf, ok := ret.Get(0).(func(context.Context, *charonrpc.CreateRefreshTokenRequest) *charonrpc.CreateRefreshTokenResponse); ok {
-		r0 = rf(_a0, _a1)
-	} else {
-		if ret.Get(0) != nil {
-			r0 = ret.Get(0).(*charonrpc.CreateRefreshTokenResponse)
-		}
-	}
-
-	var r1 error
-	if rf, ok := ret.Get(1).(func(context.Context, *charonrpc.CreateRefreshTokenRequest) error); ok {
-		r1 = rf(_a0, _a1)
-	} else {
-		r1 = ret.Error(1)
-	}
-
-	return r0, r1
-}
-
-// List provides a mock function with given fields: _a0, _a1
-func (_m *RefreshTokenManagerServer) List(_a0 context.Context, _a1 *charonrpc.ListRefreshTokensRequest) (*charonrpc.ListRefreshTokensResponse, error) {
-	ret := _m.Called(_a0, _a1)
-
-	var r0 *charonrpc.ListRefreshTokensResponse
-	if rf, ok := ret.Get(0).(func(context.Context, *charonrpc.ListRefreshTokensRequest) *charonrpc.ListRefreshTokensResponse); ok {
-		r0 = rf(_a0, _a1)
-	} else {
-		if ret.Get(0) != nil {
-			r0 = ret.Get(0).(*charonrpc.ListRefreshTokensResponse)
-		}
-	}
-
-	var r1 error
-	if rf, ok := ret.Get(1).(func(context.Context, *charonrpc.ListRefreshTokensRequest) error); ok {
-		r1 = rf(_a0, _a1)
-	} else {
-		r1 = ret.Error(1)
-	}
-
-	return r0, r1
-}
-
-// Revoke provides a mock function with given fields: _a0, _a1
-func (_m *RefreshTokenManagerServer) Revoke(_a0 context.Context, _a1 *charonrpc.RevokeRefreshTokenRequest) (*charonrpc.RevokeRefreshTokenResponse, error) {
-	ret := _m.Called(_a0, _a1)
-
-	var r0 *charonrpc.RevokeRefreshTokenResponse
-	if rf, ok := ret.Get(0).(func(context.Context, *charonrpc.RevokeRefreshTokenRequest) *charonrpc.RevokeRefreshTokenResponse); ok {
-		r0 = rf(_a0, _a1)
-	} else {
-		if ret.Get(0) != nil {
-			r0 = ret.Get(0).(*charonrpc.RevokeRefreshTokenResponse)
-		}
-	}
-
-	var r1 error
-	if rf, ok := ret.Get(1).(func(context.Context, *charonrpc.RevokeRefreshTokenRequest) error); ok {
-		r1 = rf(_a0, _a1)
-	} else {
-		r1 = ret.Error(1)
-	}
-
-	return r0, r1
-}
diff --git a/charontest/user_manager_server.go b/charontest/user_manager_server.go
deleted file mode 100644
index 6af39ff..0000000
--- a/charontest/user_manager_server.go
+++ /dev/null
@@ -1,220 +0,0 @@
-// Code generated by mockery v1.0.0. DO NOT EDIT.
-
-package charontest
-
-import charonrpc "github.com/piotrkowalczuk/charon/charonrpc"
-import context "context"
-import mock "github.com/stretchr/testify/mock"
-import wrappers "github.com/golang/protobuf/ptypes/wrappers"
-
-// UserManagerServer is an autogenerated mock type for the UserManagerServer type
-type UserManagerServer struct {
-	mock.Mock
-}
-
-// Create provides a mock function with given fields: _a0, _a1
-func (_m *UserManagerServer) Create(_a0 context.Context, _a1 *charonrpc.CreateUserRequest) (*charonrpc.CreateUserResponse, error) {
-	ret := _m.Called(_a0, _a1)
-
-	var r0 *charonrpc.CreateUserResponse
-	if rf, ok := ret.Get(0).(func(context.Context, *charonrpc.CreateUserRequest) *charonrpc.CreateUserResponse); ok {
-		r0 = rf(_a0, _a1)
-	} else {
-		if ret.Get(0) != nil {
-			r0 = ret.Get(0).(*charonrpc.CreateUserResponse)
-		}
-	}
-
-	var r1 error
-	if rf, ok := ret.Get(1).(func(context.Context, *charonrpc.CreateUserRequest) error); ok {
-		r1 = rf(_a0, _a1)
-	} else {
-		r1 = ret.Error(1)
-	}
-
-	return r0, r1
-}
-
-// Delete provides a mock function with given fields: _a0, _a1
-func (_m *UserManagerServer) Delete(_a0 context.Context, _a1 *charonrpc.DeleteUserRequest) (*wrappers.BoolValue, error) {
-	ret := _m.Called(_a0, _a1)
-
-	var r0 *wrappers.BoolValue
-	if rf, ok := ret.Get(0).(func(context.Context, *charonrpc.DeleteUserRequest) *wrappers.BoolValue); ok {
-		r0 = rf(_a0, _a1)
-	} else {
-		if ret.Get(0) != nil {
-			r0 = ret.Get(0).(*wrappers.BoolValue)
-		}
-	}
-
-	var r1 error
-	if rf, ok := ret.Get(1).(func(context.Context, *charonrpc.DeleteUserRequest) error); ok {
-		r1 = rf(_a0, _a1)
-	} else {
-		r1 = ret.Error(1)
-	}
-
-	return r0, r1
-}
-
-// Get provides a mock function with given fields: _a0, _a1
-func (_m *UserManagerServer) Get(_a0 context.Context, _a1 *charonrpc.GetUserRequest) (*charonrpc.GetUserResponse, error) {
-	ret := _m.Called(_a0, _a1)
-
-	var r0 *charonrpc.GetUserResponse
-	if rf, ok := ret.Get(0).(func(context.Context, *charonrpc.GetUserRequest) *charonrpc.GetUserResponse); ok {
-		r0 = rf(_a0, _a1)
-	} else {
-		if ret.Get(0) != nil {
-			r0 = ret.Get(0).(*charonrpc.GetUserResponse)
-		}
-	}
-
-	var r1 error
-	if rf, ok := ret.Get(1).(func(context.Context, *charonrpc.GetUserRequest) error); ok {
-		r1 = rf(_a0, _a1)
-	} else {
-		r1 = ret.Error(1)
-	}
-
-	return r0, r1
-}
-
-// List provides a mock function with given fields: _a0, _a1
-func (_m *UserManagerServer) List(_a0 context.Context, _a1 *charonrpc.ListUsersRequest) (*charonrpc.ListUsersResponse, error) {
-	ret := _m.Called(_a0, _a1)
-
-	var r0 *charonrpc.ListUsersResponse
-	if rf, ok := ret.Get(0).(func(context.Context, *charonrpc.ListUsersRequest) *charonrpc.ListUsersResponse); ok {
-		r0 = rf(_a0, _a1)
-	} else {
-		if ret.Get(0) != nil {
-			r0 = ret.Get(0).(*charonrpc.ListUsersResponse)
-		}
-	}
-
-	var r1 error
-	if rf, ok := ret.Get(1).(func(context.Context, *charonrpc.ListUsersRequest) error); ok {
-		r1 = rf(_a0, _a1)
-	} else {
-		r1 = ret.Error(1)
-	}
-
-	return r0, r1
-}
-
-// ListGroups provides a mock function with given fields: _a0, _a1
-func (_m *UserManagerServer) ListGroups(_a0 context.Context, _a1 *charonrpc.ListUserGroupsRequest) (*charonrpc.ListUserGroupsResponse, error) {
-	ret := _m.Called(_a0, _a1)
-
-	var r0 *charonrpc.ListUserGroupsResponse
-	if rf, ok := ret.Get(0).(func(context.Context, *charonrpc.ListUserGroupsRequest) *charonrpc.ListUserGroupsResponse); ok {
-		r0 = rf(_a0, _a1)
-	} else {
-		if ret.Get(0) != nil {
-			r0 = ret.Get(0).(*charonrpc.ListUserGroupsResponse)
-		}
-	}
-
-	var r1 error
-	if rf, ok := ret.Get(1).(func(context.Context, *charonrpc.ListUserGroupsRequest) error); ok {
-		r1 = rf(_a0, _a1)
-	} else {
-		r1 = ret.Error(1)
-	}
-
-	return r0, r1
-}
-
-// ListPermissions provides a mock function with given fields: _a0, _a1
-func (_m *UserManagerServer) ListPermissions(_a0 context.Context, _a1 *charonrpc.ListUserPermissionsRequest) (*charonrpc.ListUserPermissionsResponse, error) {
-	ret := _m.Called(_a0, _a1)
-
-	var r0 *charonrpc.ListUserPermissionsResponse
-	if rf, ok := ret.Get(0).(func(context.Context, *charonrpc.ListUserPermissionsRequest) *charonrpc.ListUserPermissionsResponse); ok {
-		r0 = rf(_a0, _a1)
-	} else {
-		if ret.Get(0) != nil {
-			r0 = ret.Get(0).(*charonrpc.ListUserPermissionsResponse)
-		}
-	}
-
-	var r1 error
-	if rf, ok := ret.Get(1).(func(context.Context, *charonrpc.ListUserPermissionsRequest) error); ok {
-		r1 = rf(_a0, _a1)
-	} else {
-		r1 = ret.Error(1)
-	}
-
-	return r0, r1
-}
-
-// Modify provides a mock function with given fields: _a0, _a1
-func (_m *UserManagerServer) Modify(_a0 context.Context, _a1 *charonrpc.ModifyUserRequest) (*charonrpc.ModifyUserResponse, error) {
-	ret := _m.Called(_a0, _a1)
-
-	var r0 *charonrpc.ModifyUserResponse
-	if rf, ok := ret.Get(0).(func(context.Context, *charonrpc.ModifyUserRequest) *charonrpc.ModifyUserResponse); ok {
-		r0 = rf(_a0, _a1)
-	} else {
-		if ret.Get(0) != nil {
-			r0 = ret.Get(0).(*charonrpc.ModifyUserResponse)
-		}
-	}
-
-	var r1 error
-	if rf, ok := ret.Get(1).(func(context.Context, *charonrpc.ModifyUserRequest) error); ok {
-		r1 = rf(_a0, _a1)
-	} else {
-		r1 = ret.Error(1)
-	}
-
-	return r0, r1
-}
-
-// SetGroups provides a mock function with given fields: _a0, _a1
-func (_m *UserManagerServer) SetGroups(_a0 context.Context, _a1 *charonrpc.SetUserGroupsRequest) (*charonrpc.SetUserGroupsResponse, error) {
-	ret := _m.Called(_a0, _a1)
-
-	var r0 *charonrpc.SetUserGroupsResponse
-	if rf, ok := ret.Get(0).(func(context.Context, *charonrpc.SetUserGroupsRequest) *charonrpc.SetUserGroupsResponse); ok {
-		r0 = rf(_a0, _a1)
-	} else {
-		if ret.Get(0) != nil {
-			r0 = ret.Get(0).(*charonrpc.SetUserGroupsResponse)
-		}
-	}
-
-	var r1 error
-	if rf, ok := ret.Get(1).(func(context.Context, *charonrpc.SetUserGroupsRequest) error); ok {
-		r1 = rf(_a0, _a1)
-	} else {
-		r1 = ret.Error(1)
-	}
-
-	return r0, r1
-}
-
-// SetPermissions provides a mock function with given fields: _a0, _a1
-func (_m *UserManagerServer) SetPermissions(_a0 context.Context, _a1 *charonrpc.SetUserPermissionsRequest) (*charonrpc.SetUserPermissionsResponse, error) {
-	ret := _m.Called(_a0, _a1)
-
-	var r0 *charonrpc.SetUserPermissionsResponse
-	if rf, ok := ret.Get(0).(func(context.Context, *charonrpc.SetUserPermissionsRequest) *charonrpc.SetUserPermissionsResponse); ok {
-		r0 = rf(_a0, _a1)
-	} else {
-		if ret.Get(0) != nil {
-			r0 = ret.Get(0).(*charonrpc.SetUserPermissionsResponse)
-		}
-	}
-
-	var r1 error
-	if rf, ok := ret.Get(1).(func(context.Context, *charonrpc.SetUserPermissionsRequest) error); ok {
-		r1 = rf(_a0, _a1)
-	} else {
-		r1 = ret.Error(1)
-	}
-
-	return r0, r1
-}
diff --git a/internal/charond/handler_actor_test.go b/internal/charond/handler_actor_test.go
index 514a3c9..3bf2e92 100644
--- a/internal/charond/handler_actor_test.go
+++ b/internal/charond/handler_actor_test.go
@@ -2,17 +2,16 @@ package charond
 
 import (
 	"context"
-	"testing"
-
 	"database/sql"
+	"testing"
 
 	"github.com/golang/protobuf/ptypes/wrappers"
 	"github.com/lib/pq"
 	"github.com/piotrkowalczuk/charon"
-	"github.com/piotrkowalczuk/charon/charonrpc"
 	"github.com/piotrkowalczuk/charon/internal/grpcerr"
 	"github.com/piotrkowalczuk/charon/internal/model"
 	"github.com/piotrkowalczuk/charon/internal/model/modelmock"
+	charonrpc "github.com/piotrkowalczuk/charon/pb/rpc/charond/v1"
 	"github.com/piotrkowalczuk/mnemosyne"
 	"github.com/piotrkowalczuk/mnemosyne/mnemosynerpc"
 	"github.com/piotrkowalczuk/mnemosyne/mnemosynetest"
diff --git a/internal/charond/handler_belongs_to_test.go b/internal/charond/handler_belongs_to_test.go
index a2e491a..1a74e58 100644
--- a/internal/charond/handler_belongs_to_test.go
+++ b/internal/charond/handler_belongs_to_test.go
@@ -6,12 +6,12 @@ import (
 
 	"github.com/golang/protobuf/ptypes/wrappers"
 	"github.com/piotrkowalczuk/charon"
-	"github.com/piotrkowalczuk/charon/charonrpc"
 	"github.com/piotrkowalczuk/charon/internal/grpcerr"
 	"github.com/piotrkowalczuk/charon/internal/model"
 	"github.com/piotrkowalczuk/charon/internal/model/modelmock"
 	"github.com/piotrkowalczuk/charon/internal/session"
 	"github.com/piotrkowalczuk/charon/internal/session/sessionmock"
+	charonrpc "github.com/piotrkowalczuk/charon/pb/rpc/charond/v1"
 	"github.com/stretchr/testify/mock"
 	"google.golang.org/grpc/codes"
 )
diff --git a/internal/charond/handler_create_group_test.go b/internal/charond/handler_create_group_test.go
index a0e4f65..3969d26 100644
--- a/internal/charond/handler_create_group_test.go
+++ b/internal/charond/handler_create_group_test.go
@@ -7,12 +7,12 @@ import (
 
 	"github.com/lib/pq"
 	"github.com/piotrkowalczuk/charon"
-	"github.com/piotrkowalczuk/charon/charonrpc"
 	"github.com/piotrkowalczuk/charon/internal/grpcerr"
 	"github.com/piotrkowalczuk/charon/internal/model"
 	"github.com/piotrkowalczuk/charon/internal/model/modelmock"
 	"github.com/piotrkowalczuk/charon/internal/session"
 	"github.com/piotrkowalczuk/charon/internal/session/sessionmock"
+	charonrpc "github.com/piotrkowalczuk/charon/pb/rpc/charond/v1"
 	"github.com/piotrkowalczuk/ntypes"
 	"github.com/stretchr/testify/mock"
 	"google.golang.org/grpc/codes"
diff --git a/internal/charond/handler_create_refresh_token_test.go b/internal/charond/handler_create_refresh_token_test.go
index 9d36f44..19477ef 100644
--- a/internal/charond/handler_create_refresh_token_test.go
+++ b/internal/charond/handler_create_refresh_token_test.go
@@ -9,12 +9,12 @@ import (
 	"github.com/golang/protobuf/ptypes/timestamp"
 	"github.com/lib/pq"
 	"github.com/piotrkowalczuk/charon"
-	"github.com/piotrkowalczuk/charon/charonrpc"
 	"github.com/piotrkowalczuk/charon/internal/grpcerr"
 	"github.com/piotrkowalczuk/charon/internal/model"
 	"github.com/piotrkowalczuk/charon/internal/model/modelmock"
 	"github.com/piotrkowalczuk/charon/internal/session"
 	"github.com/piotrkowalczuk/charon/internal/session/sessionmock"
+	charonrpc "github.com/piotrkowalczuk/charon/pb/rpc/charond/v1"
 	"github.com/piotrkowalczuk/ntypes"
 	"github.com/stretchr/testify/mock"
 	"google.golang.org/grpc/codes"
diff --git a/internal/charond/handler_create_user_test.go b/internal/charond/handler_create_user_test.go
index f2b9eb7..0262889 100644
--- a/internal/charond/handler_create_user_test.go
+++ b/internal/charond/handler_create_user_test.go
@@ -11,13 +11,13 @@ import (
 
 	"github.com/lib/pq"
 	"github.com/piotrkowalczuk/charon"
-	"github.com/piotrkowalczuk/charon/charonrpc"
 	"github.com/piotrkowalczuk/charon/internal/grpcerr"
 	"github.com/piotrkowalczuk/charon/internal/model"
 	"github.com/piotrkowalczuk/charon/internal/model/modelmock"
 	"github.com/piotrkowalczuk/charon/internal/password/passwordmock"
 	"github.com/piotrkowalczuk/charon/internal/session"
 	"github.com/piotrkowalczuk/charon/internal/session/sessionmock"
+	charonrpc "github.com/piotrkowalczuk/charon/pb/rpc/charond/v1"
 	"github.com/piotrkowalczuk/ntypes"
 	"github.com/stretchr/testify/mock"
 	"google.golang.org/grpc/codes"
diff --git a/internal/charond/handler_delete_group_test.go b/internal/charond/handler_delete_group_test.go
index c5dcd88..8f0e0bb 100644
--- a/internal/charond/handler_delete_group_test.go
+++ b/internal/charond/handler_delete_group_test.go
@@ -10,12 +10,12 @@ import (
 	"github.com/golang/protobuf/ptypes/wrappers"
 	"github.com/lib/pq"
 	"github.com/piotrkowalczuk/charon"
-	"github.com/piotrkowalczuk/charon/charonrpc"
 	"github.com/piotrkowalczuk/charon/internal/grpcerr"
 	"github.com/piotrkowalczuk/charon/internal/model"
 	"github.com/piotrkowalczuk/charon/internal/model/modelmock"
 	"github.com/piotrkowalczuk/charon/internal/session"
 	"github.com/piotrkowalczuk/charon/internal/session/sessionmock"
+	charonrpc "github.com/piotrkowalczuk/charon/pb/rpc/charond/v1"
 	"github.com/piotrkowalczuk/ntypes"
 	"github.com/stretchr/testify/mock"
 	"google.golang.org/grpc/codes"
diff --git a/internal/charond/handler_delete_user_test.go b/internal/charond/handler_delete_user_test.go
index 08b32f5..2300d58 100644
--- a/internal/charond/handler_delete_user_test.go
+++ b/internal/charond/handler_delete_user_test.go
@@ -9,12 +9,12 @@ import (
 	"github.com/golang/protobuf/ptypes/wrappers"
 	"github.com/lib/pq"
 	"github.com/piotrkowalczuk/charon"
-	"github.com/piotrkowalczuk/charon/charonrpc"
 	"github.com/piotrkowalczuk/charon/internal/grpcerr"
 	"github.com/piotrkowalczuk/charon/internal/model"
 	"github.com/piotrkowalczuk/charon/internal/model/modelmock"
 	"github.com/piotrkowalczuk/charon/internal/session"
 	"github.com/piotrkowalczuk/charon/internal/session/sessionmock"
+	charonrpc "github.com/piotrkowalczuk/charon/pb/rpc/charond/v1"
 	"github.com/piotrkowalczuk/ntypes"
 	"github.com/stretchr/testify/mock"
 	"google.golang.org/grpc/codes"
diff --git a/internal/charond/handler_get_group_test.go b/internal/charond/handler_get_group_test.go
index 4a2710e..b63008d 100644
--- a/internal/charond/handler_get_group_test.go
+++ b/internal/charond/handler_get_group_test.go
@@ -8,12 +8,12 @@ import (
 	"context"
 
 	"github.com/piotrkowalczuk/charon"
-	"github.com/piotrkowalczuk/charon/charonrpc"
 	"github.com/piotrkowalczuk/charon/internal/grpcerr"
 	"github.com/piotrkowalczuk/charon/internal/model"
 	"github.com/piotrkowalczuk/charon/internal/model/modelmock"
 	"github.com/piotrkowalczuk/charon/internal/session"
 	"github.com/piotrkowalczuk/charon/internal/session/sessionmock"
+	charonrpc "github.com/piotrkowalczuk/charon/pb/rpc/charond/v1"
 	"github.com/piotrkowalczuk/ntypes"
 	"github.com/stretchr/testify/mock"
 	"go.uber.org/zap"
diff --git a/internal/charond/handler_get_permission_test.go b/internal/charond/handler_get_permission_test.go
index 8dd1e96..c753f58 100644
--- a/internal/charond/handler_get_permission_test.go
+++ b/internal/charond/handler_get_permission_test.go
@@ -6,12 +6,12 @@ import (
 	"testing"
 
 	"github.com/piotrkowalczuk/charon"
-	"github.com/piotrkowalczuk/charon/charonrpc"
 	"github.com/piotrkowalczuk/charon/internal/grpcerr"
 	"github.com/piotrkowalczuk/charon/internal/model"
 	"github.com/piotrkowalczuk/charon/internal/model/modelmock"
 	"github.com/piotrkowalczuk/charon/internal/session"
 	"github.com/piotrkowalczuk/charon/internal/session/sessionmock"
+	charonrpc "github.com/piotrkowalczuk/charon/pb/rpc/charond/v1"
 	"github.com/stretchr/testify/mock"
 	"go.uber.org/zap"
 	"google.golang.org/grpc/codes"
diff --git a/internal/charond/handler_get_user_test.go b/internal/charond/handler_get_user_test.go
index 8d0f288..5cb6301 100644
--- a/internal/charond/handler_get_user_test.go
+++ b/internal/charond/handler_get_user_test.go
@@ -8,12 +8,12 @@ import (
 	"database/sql"
 
 	"github.com/piotrkowalczuk/charon"
-	"github.com/piotrkowalczuk/charon/charonrpc"
 	"github.com/piotrkowalczuk/charon/internal/grpcerr"
 	"github.com/piotrkowalczuk/charon/internal/model"
 	"github.com/piotrkowalczuk/charon/internal/model/modelmock"
 	"github.com/piotrkowalczuk/charon/internal/session"
 	"github.com/piotrkowalczuk/charon/internal/session/sessionmock"
+	charonrpc "github.com/piotrkowalczuk/charon/pb/rpc/charond/v1"
 	"github.com/piotrkowalczuk/ntypes"
 	"github.com/stretchr/testify/mock"
 	"google.golang.org/grpc/codes"
diff --git a/internal/charond/handler_is_authenticated_test.go b/internal/charond/handler_is_authenticated_test.go
index 77b48c3..06a4bff 100644
--- a/internal/charond/handler_is_authenticated_test.go
+++ b/internal/charond/handler_is_authenticated_test.go
@@ -5,9 +5,9 @@ import (
 	"database/sql"
 	"testing"
 
-	"github.com/piotrkowalczuk/charon/charonrpc"
 	"github.com/piotrkowalczuk/charon/internal/grpcerr"
 	"github.com/piotrkowalczuk/charon/internal/model/modelmock"
+	charonrpc "github.com/piotrkowalczuk/charon/pb/rpc/charond/v1"
 	"github.com/piotrkowalczuk/mnemosyne"
 	"github.com/piotrkowalczuk/mnemosyne/mnemosynerpc"
 	"github.com/piotrkowalczuk/mnemosyne/mnemosynetest"
diff --git a/internal/charond/handler_is_granted_test.go b/internal/charond/handler_is_granted_test.go
index 7e1be9c..48563ee 100644
--- a/internal/charond/handler_is_granted_test.go
+++ b/internal/charond/handler_is_granted_test.go
@@ -5,12 +5,12 @@ import (
 	"testing"
 
 	"github.com/piotrkowalczuk/charon"
-	"github.com/piotrkowalczuk/charon/charonrpc"
 	"github.com/piotrkowalczuk/charon/internal/grpcerr"
 	"github.com/piotrkowalczuk/charon/internal/model"
 	"github.com/piotrkowalczuk/charon/internal/model/modelmock"
 	"github.com/piotrkowalczuk/charon/internal/session"
 	"github.com/piotrkowalczuk/charon/internal/session/sessionmock"
+	charonrpc "github.com/piotrkowalczuk/charon/pb/rpc/charond/v1"
 	"github.com/stretchr/testify/mock"
 	"go.uber.org/zap"
 	"google.golang.org/grpc/codes"
diff --git a/internal/charond/handler_list_group_permissions_test.go b/internal/charond/handler_list_group_permissions_test.go
index dd357bd..b42e3be 100644
--- a/internal/charond/handler_list_group_permissions_test.go
+++ b/internal/charond/handler_list_group_permissions_test.go
@@ -11,12 +11,12 @@ import (
 	"database/sql"
 
 	"github.com/piotrkowalczuk/charon"
-	"github.com/piotrkowalczuk/charon/charonrpc"
 	"github.com/piotrkowalczuk/charon/internal/grpcerr"
 	"github.com/piotrkowalczuk/charon/internal/model"
 	"github.com/piotrkowalczuk/charon/internal/model/modelmock"
 	"github.com/piotrkowalczuk/charon/internal/session"
 	"github.com/piotrkowalczuk/charon/internal/session/sessionmock"
+	charonrpc "github.com/piotrkowalczuk/charon/pb/rpc/charond/v1"
 	"github.com/stretchr/testify/mock"
 	"go.uber.org/zap"
 	"google.golang.org/grpc/codes"
diff --git a/internal/charond/handler_list_groups_test.go b/internal/charond/handler_list_groups_test.go
index 23bc644..7b7408f 100644
--- a/internal/charond/handler_list_groups_test.go
+++ b/internal/charond/handler_list_groups_test.go
@@ -8,12 +8,12 @@ import (
 	"net"
 
 	"github.com/piotrkowalczuk/charon"
-	"github.com/piotrkowalczuk/charon/charonrpc"
 	"github.com/piotrkowalczuk/charon/internal/grpcerr"
 	"github.com/piotrkowalczuk/charon/internal/model"
 	"github.com/piotrkowalczuk/charon/internal/model/modelmock"
 	"github.com/piotrkowalczuk/charon/internal/session"
 	"github.com/piotrkowalczuk/charon/internal/session/sessionmock"
+	charonrpc "github.com/piotrkowalczuk/charon/pb/rpc/charond/v1"
 	"github.com/piotrkowalczuk/ntypes"
 	"github.com/stretchr/testify/mock"
 	"go.uber.org/zap"
diff --git a/internal/charond/handler_list_permissions_test.go b/internal/charond/handler_list_permissions_test.go
index 17cdc49..2c902f6 100644
--- a/internal/charond/handler_list_permissions_test.go
+++ b/internal/charond/handler_list_permissions_test.go
@@ -8,12 +8,12 @@ import (
 	"net"
 
 	"github.com/piotrkowalczuk/charon"
-	"github.com/piotrkowalczuk/charon/charonrpc"
 	"github.com/piotrkowalczuk/charon/internal/grpcerr"
 	"github.com/piotrkowalczuk/charon/internal/model"
 	"github.com/piotrkowalczuk/charon/internal/model/modelmock"
 	"github.com/piotrkowalczuk/charon/internal/session"
 	"github.com/piotrkowalczuk/charon/internal/session/sessionmock"
+	charonrpc "github.com/piotrkowalczuk/charon/pb/rpc/charond/v1"
 	"github.com/piotrkowalczuk/ntypes"
 	"github.com/stretchr/testify/mock"
 	"go.uber.org/zap"
diff --git a/internal/charond/handler_list_refresh_tokens_test.go b/internal/charond/handler_list_refresh_tokens_test.go
index 50fee91..95fd246 100644
--- a/internal/charond/handler_list_refresh_tokens_test.go
+++ b/internal/charond/handler_list_refresh_tokens_test.go
@@ -7,12 +7,12 @@ import (
 
 	"github.com/golang/protobuf/ptypes"
 	"github.com/piotrkowalczuk/charon"
-	"github.com/piotrkowalczuk/charon/charonrpc"
 	"github.com/piotrkowalczuk/charon/internal/grpcerr"
 	"github.com/piotrkowalczuk/charon/internal/model"
 	"github.com/piotrkowalczuk/charon/internal/model/modelmock"
 	"github.com/piotrkowalczuk/charon/internal/session"
 	"github.com/piotrkowalczuk/charon/internal/session/sessionmock"
+	charonrpc "github.com/piotrkowalczuk/charon/pb/rpc/charond/v1"
 	"github.com/stretchr/testify/mock"
 	"google.golang.org/grpc/codes"
 )
diff --git a/internal/charond/handler_list_user_groups_test.go b/internal/charond/handler_list_user_groups_test.go
index fc5c0f5..73f0574 100644
--- a/internal/charond/handler_list_user_groups_test.go
+++ b/internal/charond/handler_list_user_groups_test.go
@@ -5,12 +5,12 @@ import (
 	"testing"
 
 	"github.com/piotrkowalczuk/charon"
-	"github.com/piotrkowalczuk/charon/charonrpc"
 	"github.com/piotrkowalczuk/charon/internal/grpcerr"
 	"github.com/piotrkowalczuk/charon/internal/model"
 	"github.com/piotrkowalczuk/charon/internal/model/modelmock"
 	"github.com/piotrkowalczuk/charon/internal/session"
 	"github.com/piotrkowalczuk/charon/internal/session/sessionmock"
+	charonrpc "github.com/piotrkowalczuk/charon/pb/rpc/charond/v1"
 	"github.com/stretchr/testify/mock"
 	"go.uber.org/zap"
 	"google.golang.org/grpc/codes"
diff --git a/internal/charond/handler_list_user_permissions_test.go b/internal/charond/handler_list_user_permissions_test.go
index d817afb..a966479 100644
--- a/internal/charond/handler_list_user_permissions_test.go
+++ b/internal/charond/handler_list_user_permissions_test.go
@@ -7,12 +7,12 @@ import (
 	"net"
 
 	"github.com/piotrkowalczuk/charon"
-	"github.com/piotrkowalczuk/charon/charonrpc"
 	"github.com/piotrkowalczuk/charon/internal/grpcerr"
 	"github.com/piotrkowalczuk/charon/internal/model"
 	"github.com/piotrkowalczuk/charon/internal/model/modelmock"
 	"github.com/piotrkowalczuk/charon/internal/session"
 	"github.com/piotrkowalczuk/charon/internal/session/sessionmock"
+	charonrpc "github.com/piotrkowalczuk/charon/pb/rpc/charond/v1"
 	"github.com/stretchr/testify/mock"
 	"go.uber.org/zap"
 	"google.golang.org/grpc/codes"
diff --git a/internal/charond/handler_list_users_test.go b/internal/charond/handler_list_users_test.go
index 330d480..3547649 100644
--- a/internal/charond/handler_list_users_test.go
+++ b/internal/charond/handler_list_users_test.go
@@ -8,12 +8,12 @@ import (
 	"net"
 
 	"github.com/piotrkowalczuk/charon"
-	"github.com/piotrkowalczuk/charon/charonrpc"
 	"github.com/piotrkowalczuk/charon/internal/grpcerr"
 	"github.com/piotrkowalczuk/charon/internal/model"
 	"github.com/piotrkowalczuk/charon/internal/model/modelmock"
 	"github.com/piotrkowalczuk/charon/internal/session"
 	"github.com/piotrkowalczuk/charon/internal/session/sessionmock"
+	charonrpc "github.com/piotrkowalczuk/charon/pb/rpc/charond/v1"
 	"github.com/piotrkowalczuk/ntypes"
 	"github.com/piotrkowalczuk/qtypes"
 	"github.com/stretchr/testify/mock"
diff --git a/internal/charond/handler_login_test.go b/internal/charond/handler_login_test.go
index 26f741c..a61fa00 100644
--- a/internal/charond/handler_login_test.go
+++ b/internal/charond/handler_login_test.go
@@ -10,11 +10,11 @@ import (
 
 	"github.com/piotrkowalczuk/charon/internal/model"
 
-	"github.com/piotrkowalczuk/charon/charonrpc"
 	"github.com/piotrkowalczuk/charon/internal/grpcerr"
 	"github.com/piotrkowalczuk/charon/internal/model/modelmock"
 	"github.com/piotrkowalczuk/charon/internal/password"
 	"github.com/piotrkowalczuk/charon/internal/service"
+	charonrpc "github.com/piotrkowalczuk/charon/pb/rpc/charond/v1"
 	"github.com/piotrkowalczuk/mnemosyne/mnemosynetest"
 	"github.com/piotrkowalczuk/ntypes"
 	"github.com/stretchr/testify/mock"
diff --git a/internal/charond/handler_logout_test.go b/internal/charond/handler_logout_test.go
index 4e00833..5a5d0ec 100644
--- a/internal/charond/handler_logout_test.go
+++ b/internal/charond/handler_logout_test.go
@@ -4,7 +4,7 @@ import (
 	"context"
 	"testing"
 
-	"github.com/piotrkowalczuk/charon/charonrpc"
+	charonrpc "github.com/piotrkowalczuk/charon/pb/rpc/charond/v1"
 	"google.golang.org/grpc/codes"
 	"google.golang.org/grpc/status"
 )
diff --git a/internal/charond/handler_modify_group_test.go b/internal/charond/handler_modify_group_test.go
index eadc029..cf6ae31 100644
--- a/internal/charond/handler_modify_group_test.go
+++ b/internal/charond/handler_modify_group_test.go
@@ -9,12 +9,12 @@ import (
 	"database/sql"
 
 	"github.com/piotrkowalczuk/charon"
-	"github.com/piotrkowalczuk/charon/charonrpc"
 	"github.com/piotrkowalczuk/charon/internal/grpcerr"
 	"github.com/piotrkowalczuk/charon/internal/model"
 	"github.com/piotrkowalczuk/charon/internal/model/modelmock"
 	"github.com/piotrkowalczuk/charon/internal/session"
 	"github.com/piotrkowalczuk/charon/internal/session/sessionmock"
+	charonrpc "github.com/piotrkowalczuk/charon/pb/rpc/charond/v1"
 	"github.com/piotrkowalczuk/ntypes"
 	"github.com/stretchr/testify/mock"
 	"go.uber.org/zap"
diff --git a/internal/charond/handler_modify_user_test.go b/internal/charond/handler_modify_user_test.go
index 7c06334..c70f1eb 100644
--- a/internal/charond/handler_modify_user_test.go
+++ b/internal/charond/handler_modify_user_test.go
@@ -8,12 +8,12 @@ import (
 
 	"github.com/lib/pq"
 	"github.com/piotrkowalczuk/charon"
-	"github.com/piotrkowalczuk/charon/charonrpc"
 	"github.com/piotrkowalczuk/charon/internal/grpcerr"
 	"github.com/piotrkowalczuk/charon/internal/model"
 	"github.com/piotrkowalczuk/charon/internal/model/modelmock"
 	"github.com/piotrkowalczuk/charon/internal/session"
 	"github.com/piotrkowalczuk/charon/internal/session/sessionmock"
+	charonrpc "github.com/piotrkowalczuk/charon/pb/rpc/charond/v1"
 	"github.com/piotrkowalczuk/ntypes"
 	"github.com/stretchr/testify/mock"
 	"go.uber.org/zap"
diff --git a/internal/charond/handler_register_permissions_test.go b/internal/charond/handler_register_permissions_test.go
index b87538c..0fe90e1 100644
--- a/internal/charond/handler_register_permissions_test.go
+++ b/internal/charond/handler_register_permissions_test.go
@@ -5,10 +5,10 @@ import (
 
 	"context"
 
-	"github.com/piotrkowalczuk/charon/charonrpc"
 	"github.com/piotrkowalczuk/charon/internal/grpcerr"
 	"github.com/piotrkowalczuk/charon/internal/model"
 	"github.com/piotrkowalczuk/charon/internal/model/modelmock"
+	charonrpc "github.com/piotrkowalczuk/charon/pb/rpc/charond/v1"
 	"github.com/stretchr/testify/mock"
 	"google.golang.org/grpc/codes"
 	"google.golang.org/grpc/status"
diff --git a/internal/charond/handler_revoke_refresh_token_test.go b/internal/charond/handler_revoke_refresh_token_test.go
index 807eadd..de8a025 100644
--- a/internal/charond/handler_revoke_refresh_token_test.go
+++ b/internal/charond/handler_revoke_refresh_token_test.go
@@ -8,12 +8,12 @@ import (
 
 	"github.com/golang/protobuf/ptypes/wrappers"
 	"github.com/piotrkowalczuk/charon"
-	"github.com/piotrkowalczuk/charon/charonrpc"
 	"github.com/piotrkowalczuk/charon/internal/grpcerr"
 	"github.com/piotrkowalczuk/charon/internal/model"
 	"github.com/piotrkowalczuk/charon/internal/model/modelmock"
 	"github.com/piotrkowalczuk/charon/internal/session"
 	"github.com/piotrkowalczuk/charon/internal/session/sessionmock"
+	charonrpc "github.com/piotrkowalczuk/charon/pb/rpc/charond/v1"
 	"github.com/piotrkowalczuk/mnemosyne/mnemosynetest"
 	"github.com/piotrkowalczuk/ntypes"
 	"github.com/stretchr/testify/mock"
diff --git a/internal/charond/handler_set_group_permissions_test.go b/internal/charond/handler_set_group_permissions_test.go
index c5d328e..72a5983 100644
--- a/internal/charond/handler_set_group_permissions_test.go
+++ b/internal/charond/handler_set_group_permissions_test.go
@@ -4,9 +4,9 @@ import (
 	"testing"
 
 	"github.com/piotrkowalczuk/charon"
-	"github.com/piotrkowalczuk/charon/charonrpc"
 	"github.com/piotrkowalczuk/charon/internal/model"
 	"github.com/piotrkowalczuk/charon/internal/session"
+	charonrpc "github.com/piotrkowalczuk/charon/pb/rpc/charond/v1"
 	"google.golang.org/grpc/codes"
 	"google.golang.org/grpc/status"
 )
diff --git a/internal/charond/handler_set_user_groups_test.go b/internal/charond/handler_set_user_groups_test.go
index c0a3d7a..60500ea 100644
--- a/internal/charond/handler_set_user_groups_test.go
+++ b/internal/charond/handler_set_user_groups_test.go
@@ -7,9 +7,9 @@ import (
 	"google.golang.org/grpc/status"
 
 	"github.com/piotrkowalczuk/charon"
-	"github.com/piotrkowalczuk/charon/charonrpc"
 	"github.com/piotrkowalczuk/charon/internal/model"
 	"github.com/piotrkowalczuk/charon/internal/session"
+	charonrpc "github.com/piotrkowalczuk/charon/pb/rpc/charond/v1"
 )
 
 func TestSetUserGroupsHandler_SetGroups(t *testing.T) {
diff --git a/internal/charond/handler_set_user_permissions_test.go b/internal/charond/handler_set_user_permissions_test.go
index 8e3eec1..ebd87ed 100644
--- a/internal/charond/handler_set_user_permissions_test.go
+++ b/internal/charond/handler_set_user_permissions_test.go
@@ -7,9 +7,9 @@ import (
 	"google.golang.org/grpc/status"
 
 	"github.com/piotrkowalczuk/charon"
-	"github.com/piotrkowalczuk/charon/charonrpc"
 	"github.com/piotrkowalczuk/charon/internal/model"
 	"github.com/piotrkowalczuk/charon/internal/session"
+	charonrpc "github.com/piotrkowalczuk/charon/pb/rpc/charond/v1"
 )
 
 func TestSetUserPermissionsHandler_SetPermissions(t *testing.T) {
diff --git a/internal/charond/rpc_test.go b/internal/charond/rpc_test.go
index 3839f49..059ed50 100644
--- a/internal/charond/rpc_test.go
+++ b/internal/charond/rpc_test.go
@@ -4,7 +4,7 @@ import (
 	"context"
 	"testing"
 
-	"github.com/piotrkowalczuk/charon/charonrpc"
+	charonrpc "github.com/piotrkowalczuk/charon/pb/rpc/charond/v1"
 	"github.com/piotrkowalczuk/mnemosyne"
 	"google.golang.org/grpc/metadata"
 	"google.golang.org/grpc/status"
diff --git a/internal/charond/suite_e2e_test.go b/internal/charond/suite_e2e_test.go
index bcc9d65..f79e5d9 100644
--- a/internal/charond/suite_e2e_test.go
+++ b/internal/charond/suite_e2e_test.go
@@ -9,8 +9,8 @@ import (
 	"testing"
 	"time"
 
-	"github.com/piotrkowalczuk/charon/charonrpc"
 	"github.com/piotrkowalczuk/charon/internal/password"
+	charonrpc "github.com/piotrkowalczuk/charon/pb/rpc/charond/v1"
 	"github.com/piotrkowalczuk/mnemosyne/mnemosyned"
 	"github.com/piotrkowalczuk/mnemosyne/mnemosynerpc"
 	"github.com/piotrkowalczuk/ntypes"
diff --git a/internal/mapping/user_test.go b/internal/mapping/user_test.go
index ccd68f2..7d69033 100644
--- a/internal/mapping/user_test.go
+++ b/internal/mapping/user_test.go
@@ -8,9 +8,9 @@ import (
 	"github.com/golang/protobuf/ptypes"
 	"github.com/golang/protobuf/ptypes/timestamp"
 	"github.com/lib/pq"
-	"github.com/piotrkowalczuk/charon/charonrpc"
 	"github.com/piotrkowalczuk/charon/internal/mapping"
 	"github.com/piotrkowalczuk/charon/internal/model"
+	charonrpc "github.com/piotrkowalczuk/charon/pb/rpc/charond/v1"
 	"github.com/piotrkowalczuk/ntypes"
 )