From c3c51afff6e53092165c2b238a463995012393c4 Mon Sep 17 00:00:00 2001
From: Georgiy <goshik_e@mail.ru>
Date: Wed, 24 Mar 2021 15:06:05 +0300
Subject: [PATCH] Add src

---
 .drone.yml                                    |   25 +
 .gitignore                                    |  131 +
 CHANGES.md                                    |    0
 LICENSE.txt                                   |    0
 MANIFEST.in                                   |   11 +
 Makefile                                      |   59 +
 build-requirements.txt                        |   24 +
 perxis/__init__.py                            |    0
 perxis/accountmanagement/__init__.py          |    0
 .../accountmanagement_pb2.py                  | 2981 +++++++++++++++
 .../accountmanagement_pb2_grpc.py             | 1024 +++++
 perxis/collaborators/__init__.py              |    0
 perxis/collaborators/collaborators_pb2.py     |  503 +++
 .../collaborators/collaborators_pb2_grpc.py   |  199 +
 perxis/collections/__init__.py                |    0
 perxis/collections/collections_pb2.py         |  618 +++
 perxis/collections/collections_pb2_grpc.py    |  199 +
 perxis/common/__init__.py                     |    0
 perxis/common/common_pb2.py                   | 1378 +++++++
 perxis/common/common_pb2_grpc.py              |    4 +
 perxis/contentcontrol/__init__.py             |    0
 perxis/contentcontrol/contentcontrol_pb2.py   |  547 +++
 .../contentcontrol/contentcontrol_pb2_grpc.py |  200 +
 perxis/contentdelivery/__init__.py            |    0
 perxis/contentdelivery/contentdelivery_pb2.py |  799 ++++
 .../contentdelivery_pb2_grpc.py               |  264 ++
 perxis/contentmanagement/__init__.py          |    0
 .../contentmanagement/contentmanagment_pb2.py | 3367 +++++++++++++++++
 .../contentmanagment_pb2_grpc.py              | 1062 ++++++
 perxis/environments/__init__.py               |    0
 perxis/environments/environments_pb2.py       |  698 ++++
 perxis/environments/environments_pb2_grpc.py  |  265 ++
 perxis/file/__init__.py                       |    0
 perxis/file/file_pb2.py                       |  702 ++++
 perxis/file/file_pb2_grpc.py                  |  245 ++
 perxis/invitations/__init__.py                |    0
 perxis/invitations/invitations_pb2.py         |  867 +++++
 perxis/invitations/invitations_pb2_grpc.py    |  206 +
 perxis/locales/__init__.py                    |    0
 perxis/locales/locales_pb2.py                 |  356 ++
 perxis/locales/locales_pb2_grpc.py            |  133 +
 perxis/members/__init__.py                    |    0
 perxis/members/members_pb2.py                 |  548 +++
 perxis/members/members_pb2_grpc.py            |  199 +
 perxis/organizations/__init__.py              |    0
 perxis/organizations/organizations_pb2.py     |  589 +++
 .../organizations/organizations_pb2_grpc.py   |  199 +
 perxis/spaces/__init__.py                     |    0
 perxis/spaces/spaces_pb2.py                   |  643 ++++
 perxis/spaces/spaces_pb2_grpc.py              |  199 +
 perxis/users/__init__.py                      |    0
 perxis/users/users_pb2.py                     |  624 +++
 perxis/users/users_pb2_grpc.py                |  207 +
 .../accountmanagement/accountmanagement.proto |  414 ++
 proto/collaborators/collaborators.proto       |   57 +
 proto/collections/collections.proto           |   72 +
 proto/common/common.proto                     |  179 +
 proto/contentcontrol/contentcontrol.proto     |   59 +
 proto/contentdelivery/contentdelivery.proto   |   88 +
 .../contentmanagement/contentmanagment.proto  |  323 ++
 proto/environments/environments.proto         |   81 +
 proto/file/file.proto                         |   89 +
 proto/invitations/invitations.proto           |  107 +
 proto/locales/locales.proto                   |   41 +
 proto/members/members.proto                   |   65 +
 proto/organizations/organizations.proto       |   73 +
 proto/spaces/spaces.proto                     |   78 +
 proto/users/users.proto                       |   87 +
 requirements.txt                              |    3 +
 setup.py                                      |   40 +
 70 files changed, 21931 insertions(+)
 create mode 100644 .drone.yml
 create mode 100644 .gitignore
 create mode 100644 CHANGES.md
 create mode 100644 LICENSE.txt
 create mode 100644 MANIFEST.in
 create mode 100644 Makefile
 create mode 100644 build-requirements.txt
 create mode 100644 perxis/__init__.py
 create mode 100644 perxis/accountmanagement/__init__.py
 create mode 100644 perxis/accountmanagement/accountmanagement_pb2.py
 create mode 100644 perxis/accountmanagement/accountmanagement_pb2_grpc.py
 create mode 100644 perxis/collaborators/__init__.py
 create mode 100644 perxis/collaborators/collaborators_pb2.py
 create mode 100644 perxis/collaborators/collaborators_pb2_grpc.py
 create mode 100644 perxis/collections/__init__.py
 create mode 100644 perxis/collections/collections_pb2.py
 create mode 100644 perxis/collections/collections_pb2_grpc.py
 create mode 100644 perxis/common/__init__.py
 create mode 100644 perxis/common/common_pb2.py
 create mode 100644 perxis/common/common_pb2_grpc.py
 create mode 100644 perxis/contentcontrol/__init__.py
 create mode 100644 perxis/contentcontrol/contentcontrol_pb2.py
 create mode 100644 perxis/contentcontrol/contentcontrol_pb2_grpc.py
 create mode 100644 perxis/contentdelivery/__init__.py
 create mode 100644 perxis/contentdelivery/contentdelivery_pb2.py
 create mode 100644 perxis/contentdelivery/contentdelivery_pb2_grpc.py
 create mode 100644 perxis/contentmanagement/__init__.py
 create mode 100644 perxis/contentmanagement/contentmanagment_pb2.py
 create mode 100644 perxis/contentmanagement/contentmanagment_pb2_grpc.py
 create mode 100644 perxis/environments/__init__.py
 create mode 100644 perxis/environments/environments_pb2.py
 create mode 100644 perxis/environments/environments_pb2_grpc.py
 create mode 100644 perxis/file/__init__.py
 create mode 100644 perxis/file/file_pb2.py
 create mode 100644 perxis/file/file_pb2_grpc.py
 create mode 100644 perxis/invitations/__init__.py
 create mode 100644 perxis/invitations/invitations_pb2.py
 create mode 100644 perxis/invitations/invitations_pb2_grpc.py
 create mode 100644 perxis/locales/__init__.py
 create mode 100644 perxis/locales/locales_pb2.py
 create mode 100644 perxis/locales/locales_pb2_grpc.py
 create mode 100644 perxis/members/__init__.py
 create mode 100644 perxis/members/members_pb2.py
 create mode 100644 perxis/members/members_pb2_grpc.py
 create mode 100644 perxis/organizations/__init__.py
 create mode 100644 perxis/organizations/organizations_pb2.py
 create mode 100644 perxis/organizations/organizations_pb2_grpc.py
 create mode 100644 perxis/spaces/__init__.py
 create mode 100644 perxis/spaces/spaces_pb2.py
 create mode 100644 perxis/spaces/spaces_pb2_grpc.py
 create mode 100644 perxis/users/__init__.py
 create mode 100644 perxis/users/users_pb2.py
 create mode 100644 perxis/users/users_pb2_grpc.py
 create mode 100644 proto/accountmanagement/accountmanagement.proto
 create mode 100644 proto/collaborators/collaborators.proto
 create mode 100644 proto/collections/collections.proto
 create mode 100644 proto/common/common.proto
 create mode 100644 proto/contentcontrol/contentcontrol.proto
 create mode 100644 proto/contentdelivery/contentdelivery.proto
 create mode 100644 proto/contentmanagement/contentmanagment.proto
 create mode 100644 proto/environments/environments.proto
 create mode 100644 proto/file/file.proto
 create mode 100644 proto/invitations/invitations.proto
 create mode 100644 proto/locales/locales.proto
 create mode 100644 proto/members/members.proto
 create mode 100644 proto/organizations/organizations.proto
 create mode 100644 proto/spaces/spaces.proto
 create mode 100644 proto/users/users.proto
 create mode 100644 requirements.txt
 create mode 100644 setup.py

diff --git a/.drone.yml b/.drone.yml
new file mode 100644
index 0000000..ef53916
--- /dev/null
+++ b/.drone.yml
@@ -0,0 +1,25 @@
+kind: pipeline
+name: default
+
+trigger:
+  event:
+    - push
+    - tag
+  branch:
+    - master
+  refs:
+    - refs/tags/v*
+
+steps:
+  - name: upload-python-client
+    image: python:3.8-alpine
+    environment:
+      PYPI_REPO:
+        from_secret: pypi_repo
+      PYPI_PASSWORD:
+        from_secret: pypi_password
+    commands:
+      - make release
+    when:
+      branch: [ "master" ]
+      event: [ "push" ]
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..0566878
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,131 @@
+.idea
+
+# Byte-compiled / optimized / DLL files
+__pycache__/
+*.py[cod]
+*$py.class
+
+# C extensions
+*.so
+
+# Distribution / packaging
+.Python
+build/
+develop-eggs/
+dist/
+downloads/
+eggs/
+.eggs/
+lib/
+lib64/
+parts/
+sdist/
+var/
+wheels/
+pip-wheel-metadata/
+share/python-wheels/
+*.egg-info/
+.installed.cfg
+*.egg
+MANIFEST
+
+# PyInstaller
+#  Usually these files are written by a python script from a template
+#  before PyInstaller builds the exe, so as to inject date/other infos into it.
+*.manifest
+*.spec
+
+# Installer logs
+pip-log.txt
+pip-delete-this-directory.txt
+
+# Unit test / coverage reports
+htmlcov/
+.tox/
+.nox/
+.coverage
+.coverage.*
+.cache
+nosetests.xml
+coverage.xml
+*.cover
+*.py,cover
+.hypothesis/
+.pytest_cache/
+
+# Translations
+*.mo
+*.pot
+
+# Django stuff:
+*.log
+local_settings.py
+db.sqlite3
+db.sqlite3-journal
+
+# Flask stuff:
+instance/
+.webassets-cache
+
+# Scrapy stuff:
+.scrapy
+
+# Sphinx documentation
+docs/_build/
+
+# PyBuilder
+target/
+
+# Jupyter Notebook
+.ipynb_checkpoints
+
+# IPython
+profile_default/
+ipython_config.py
+
+# pyenv
+.python-version
+
+# pipenv
+#   According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control.
+#   However, in case of collaboration, if having platform-specific dependencies or dependencies
+#   having no cross-platform support, pipenv may install dependencies that don't work, or not
+#   install all needed dependencies.
+#Pipfile.lock
+
+# PEP 582; used by e.g. github.com/David-OConnor/pyflow
+__pypackages__/
+
+# Celery stuff
+celerybeat-schedule
+celerybeat.pid
+
+# SageMath parsed files
+*.sage.py
+
+# Environments
+.env
+.venv
+env/
+venv/
+ENV/
+env.bak/
+venv.bak/
+
+# Spyder project settings
+.spyderproject
+.spyproject
+
+# Rope project settings
+.ropeproject
+
+# mkdocs documentation
+/site
+
+# mypy
+.mypy_cache/
+.dmypy.json
+dmypy.json
+
+# Pyre type checker
+.pyre/
\ No newline at end of file
diff --git a/CHANGES.md b/CHANGES.md
new file mode 100644
index 0000000..e69de29
diff --git a/LICENSE.txt b/LICENSE.txt
new file mode 100644
index 0000000..e69de29
diff --git a/MANIFEST.in b/MANIFEST.in
new file mode 100644
index 0000000..f7b46d3
--- /dev/null
+++ b/MANIFEST.in
@@ -0,0 +1,11 @@
+# Include the README
+include *.md
+
+# Include the license file
+include LICENSE.txt
+
+# Include setup.py
+include setup.py
+
+# Include the data files
+recursive-include data *
\ No newline at end of file
diff --git a/Makefile b/Makefile
new file mode 100644
index 0000000..5647f27
--- /dev/null
+++ b/Makefile
@@ -0,0 +1,59 @@
+.PHONY: clean-pyc clean-build generate clean
+SHELL = bash
+
+PROTO_FILES_DIR=./proto
+OUTPUT_FILES_DIR=./perxis
+
+help:
+	@echo "clean - remove all build, test, coverage and Python artifacts"
+	@echo "clean-build - remove build artifacts"
+	@echo "clean-pyc - remove Python file artifacts"
+	@echo "clean-test - remove test and coverage artifacts"
+	@echo "clean-proto - remove generated gRPC code"
+	@echo "generate - generate gRPC code"
+	@echo "dist - package"
+	@echo "release - package and upload a release"
+	@echo "install - install the package to the active Python's site-packages"
+
+clean: clean-build clean-pyc clean-test clean-proto
+
+clean-build:
+	rm -fr build/
+	rm -fr dist/
+	rm -fr .eggs/
+	find . -name '*.egg-info' -exec rm -fr {} +
+	find . -name '*.egg' -exec rm -f {} +
+
+clean-pyc:
+	find . -name '*.pyc' -exec rm -f {} +
+	find . -name '*.pyo' -exec rm -f {} +
+	find . -name '*~' -exec rm -f {} +
+	find . -name '__pycache__' -exec rm -fr {} +
+
+clean-test:
+	rm -fr .tox/
+	rm -f .coverage
+	rm -fr htmlcov/
+
+clean-proto:
+	find . -name '*_pb2.py' -exec rm -f {} +
+	find . -name '*_pb2_grpc.py' -exec rm -f {} +
+
+install-requirements:
+	pip install -r build-requirements.txt
+
+generate: clean-proto install-requirements
+	find $(PROTO_FILES_DIR) -name '*.proto' -exec python3 -m grpc_tools.protoc -I${PROTO_FILES_DIR} --python_out=$(OUTPUT_FILES_DIR) --grpc_python_out=$(OUTPUT_FILES_DIR) {} +
+
+dist: clean generate
+	python setup.py sdist
+	python setup.py bdist_wheel
+	ls -l dist
+
+release: clean generate
+	devpi use $(PYPI_REPO)
+	devpi login root --password $(PYPI_PASSWORD)
+	devpi upload --no-vcs
+
+install: clean generate
+	python setup.py install
diff --git a/build-requirements.txt b/build-requirements.txt
new file mode 100644
index 0000000..7732a83
--- /dev/null
+++ b/build-requirements.txt
@@ -0,0 +1,24 @@
+appdirs==1.4.4
+build==0.3.1.post1
+certifi==2020.12.5
+chardet==4.0.0
+check-manifest==0.46
+devpi-client==5.2.2
+devpi-common==3.6.0
+distlib==0.3.1
+filelock==3.0.12
+grpcio-tools==1.36.1
+idna==2.10
+lazy==1.4
+packaging==20.9
+pep517==0.9.1
+pkginfo==1.7.0
+pluggy==0.13.1
+py==1.10.0
+pyparsing==2.4.7
+requests==2.25.1
+six==1.15.0
+toml==0.10.2
+tox==3.23.0
+urllib3==1.26.3
+virtualenv==20.4.2
diff --git a/perxis/__init__.py b/perxis/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/perxis/accountmanagement/__init__.py b/perxis/accountmanagement/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/perxis/accountmanagement/accountmanagement_pb2.py b/perxis/accountmanagement/accountmanagement_pb2.py
new file mode 100644
index 0000000..21f2857
--- /dev/null
+++ b/perxis/accountmanagement/accountmanagement_pb2.py
@@ -0,0 +1,2981 @@
+# -*- coding: utf-8 -*-
+# Generated by the protocol buffer compiler.  DO NOT EDIT!
+# source: accountmanagement/accountmanagement.proto
+"""Generated protocol buffer code."""
+from google.protobuf import descriptor as _descriptor
+from google.protobuf import message as _message
+from google.protobuf import reflection as _reflection
+from google.protobuf import symbol_database as _symbol_database
+# @@protoc_insertion_point(imports)
+
+_sym_db = _symbol_database.Default()
+
+
+from google.protobuf import timestamp_pb2 as google_dot_protobuf_dot_timestamp__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
+from common import common_pb2 as common_dot_common__pb2
+
+
+DESCRIPTOR = _descriptor.FileDescriptor(
+  name='accountmanagement/accountmanagement.proto',
+  package='accountmanagement',
+  syntax='proto3',
+  serialized_options=b'ZDgithub.com/perxteam/perxis/proto/accountmanagement;accountmanagement',
+  create_key=_descriptor._internal_create_key,
+  serialized_pb=b'\n)accountmanagement/accountmanagement.proto\x12\x11\x61\x63\x63ountmanagement\x1a\x1fgoogle/protobuf/timestamp.proto\x1a\x1bgoogle/protobuf/empty.proto\x1a\x1egoogle/protobuf/wrappers.proto\x1a\x13\x63ommon/common.proto\"P\n\x19\x43reateOrganizationRequest\x12\x0c\n\x04name\x18\x02 \x01(\t\x12\x13\n\x0b\x64\x65scription\x18\x03 \x01(\t\x12\x10\n\x08logo_uri\x18\x04 \x01(\t\"H\n\x1a\x43reateOrganizationResponse\x12*\n\x0corganization\x18\x01 \x01(\x0b\x32\x14.common.Organization\"i\n\x19UpdateOrganizationRequest\x12\x17\n\x0forganization_id\x18\x01 \x01(\t\x12\x0c\n\x04name\x18\x02 \x01(\t\x12\x13\n\x0b\x64\x65scription\x18\x03 \x01(\t\x12\x10\n\x08logo_uri\x18\x04 \x01(\t\"H\n\x1aUpdateOrganizationResponse\x12*\n\x0corganization\x18\x01 \x01(\x0b\x32\x14.common.Organization\"4\n\x19\x44\x65leteOrganizationRequest\x12\x17\n\x0forganization_id\x18\x01 \x01(\t\"\x1c\n\x1a\x44\x65leteOrganizationResponse\"[\n\x18\x46indOrganizationsRequest\x12\x10\n\x08page_num\x18\x01 \x01(\x05\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x0b\n\x03ids\x18\x03 \x03(\t\x12\r\n\x05names\x18\x04 \x03(\t\"W\n\x19\x46indOrganizationsResponse\x12+\n\rorganizations\x18\x01 \x03(\x0b\x32\x14.common.Organization\x12\r\n\x05total\x18\x02 \x01(\x05\"k\n#UpdateOrganizationMembershipRequest\x12\x0f\n\x07user_id\x18\x01 \x01(\t\x12\x17\n\x0forganization_id\x18\x02 \x01(\t\x12\x1a\n\x04role\x18\x03 \x01(\x0e\x32\x0c.common.Role\"O\n#DeleteOrganizationMembershipRequest\x12\x0f\n\x07user_id\x18\x01 \x01(\t\x12\x17\n\x0forganization_id\x18\x02 \x01(\t\"\x92\x01\n\"FindOrganizationMembershipsRequest\x12\x18\n\x10organization_ids\x18\x01 \x03(\t\x12\x10\n\x08user_ids\x18\x02 \x03(\t\x12\x1b\n\x05roles\x18\x03 \x03(\x0e\x32\x0c.common.Role\x12\x10\n\x08page_num\x18\t \x01(\x05\x12\x11\n\tpage_size\x18\n \x01(\x05\"i\n#FindOrganizationMembershipsResponse\x12\x33\n\x0bmemberships\x18\x01 \x03(\x0b\x32\x1e.common.OrganizationMembership\x12\r\n\x05total\x18\x02 \x01(\x05\"P\n\x12\x43reateSpaceRequest\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x13\n\x0b\x64\x65scription\x18\x02 \x01(\t\x12\x17\n\x0forganization_id\x18\x03 \x01(\t\"3\n\x13\x43reateSpaceResponse\x12\x1c\n\x05space\x18\x01 \x01(\x0b\x32\r.common.Space\"#\n\x0fGetSpaceRequest\x12\x10\n\x08space_id\x18\x01 \x01(\t\"0\n\x10GetSpaceResponse\x12\x1c\n\x05space\x18\x01 \x01(\x0b\x32\r.common.Space\"8\n\x1dListOrganizationSpacesRequest\x12\x17\n\x0forganization_id\x18\x01 \x01(\t\"?\n\x1eListOrganizationSpacesResponse\x12\x1d\n\x06spaces\x18\x01 \x03(\x0b\x32\r.common.Space\"Z\n\x12UpdateSpaceRequest\x12\x10\n\x08space_id\x18\x01 \x01(\t\x12\x0c\n\x04name\x18\x02 \x01(\t\x12\x13\n\x0b\x64\x65scription\x18\x03 \x01(\t\x12\x0f\n\x07\x61pi_url\x18\x04 \x01(\t\"3\n\x13UpdateSpaceResponse\x12\x1c\n\x05space\x18\x01 \x01(\x0b\x32\r.common.Space\"&\n\x12\x44\x65leteSpaceRequest\x12\x10\n\x08space_id\x18\x01 \x01(\t\"\x15\n\x13\x44\x65leteSpaceResponse\"S\n\x1c\x43reateSpaceInvitationRequest\x12\x10\n\x08space_id\x18\x01 \x01(\t\x12\x12\n\nspace_role\x18\x02 \x01(\t\x12\r\n\x05\x65mail\x18\x03 \x01(\t\"L\n\x1d\x43reateSpaceInvitationResponse\x12+\n\ninvitation\x18\x01 \x01(\x0b\x32\x17.common.SpaceInvitation\"2\n\x19GetSpaceInvitationRequest\x12\x15\n\rinvitation_id\x18\x01 \x01(\t\"I\n\x1aGetSpaceInvitationResponse\x12+\n\ninvitation\x18\x01 \x01(\x0b\x32\x17.common.SpaceInvitation\"\xea\x01\n\x1cUpdateSpaceInvitationRequest\x12\x15\n\rinvitation_id\x18\x01 \x01(\t\x12(\n\x04sent\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.BoolValue\x12+\n\x07pending\x18\x03 \x01(\x0b\x32\x1a.google.protobuf.BoolValue\x12+\n\x07sent_at\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12/\n\x0bvalid_until\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\"\x1f\n\x1dUpdateSpaceInvitationResponse\"5\n\x1c\x41\x63\x63\x65ptSpaceInvitationRequest\x12\x15\n\rinvitation_id\x18\x01 \x01(\t\"\x1f\n\x1d\x41\x63\x63\x65ptSpaceInvitationResponse\"\x83\x02\n\x1b\x46indSpaceInvitationsRequest\x12\x16\n\x0einvitation_ids\x18\x01 \x03(\t\x12\x18\n\x10organization_ids\x18\x02 \x03(\t\x12\x11\n\tspace_ids\x18\x03 \x03(\t\x12\x0e\n\x06\x65mails\x18\x04 \x03(\t\x12\x13\n\x0bspace_roles\x18\x05 \x03(\t\x12(\n\x04sent\x18\x06 \x01(\x0b\x32\x1a.google.protobuf.BoolValue\x12+\n\x07pending\x18\x07 \x01(\x0b\x32\x1a.google.protobuf.BoolValue\x12\x10\n\x08page_num\x18\t \x01(\x05\x12\x11\n\tpage_size\x18\n \x01(\x05\"[\n\x1c\x46indSpaceInvitationsResponse\x12,\n\x0binvitations\x18\x01 \x03(\x0b\x32\x17.common.SpaceInvitation\x12\r\n\x05total\x18\x02 \x01(\x05\"5\n\x1c\x44\x65leteSpaceInvitationRequest\x12\x15\n\rinvitation_id\x18\x01 \x01(\t\"\x1f\n\x1d\x44\x65leteSpaceInvitationResponse\"R\n\x19SetSpaceMembershipRequest\x12\x10\n\x08space_id\x18\x01 \x01(\t\x12\x0f\n\x07user_id\x18\x02 \x01(\t\x12\x12\n\nspace_role\x18\x03 \x01(\t\"\x1c\n\x1aSetSpaceMembershipResponse\"A\n\x1c\x44\x65leteSpaceMembershipRequest\x12\x10\n\x08space_id\x18\x01 \x01(\t\x12\x0f\n\x07user_id\x18\x02 \x01(\t\"\x1f\n\x1d\x44\x65leteSpaceMembershipResponse\"\x96\x01\n\x1b\x46indSpaceMembershipsRequest\x12\x18\n\x10organization_ids\x18\x01 \x03(\t\x12\x11\n\tspace_ids\x18\x02 \x03(\t\x12\x10\n\x08user_ids\x18\x03 \x03(\t\x12\x13\n\x0bspace_roles\x18\x04 \x03(\t\x12\x10\n\x08page_num\x18\t \x01(\x05\x12\x11\n\tpage_size\x18\n \x01(\x05\"\xe6\x01\n\x1c\x46indSpaceMembershipsResponse\x12T\n\x0bmemberships\x18\x01 \x03(\x0b\x32?.accountmanagement.FindSpaceMembershipsResponse.SpaceMembership\x12\r\n\x05total\x18\x02 \x01(\x05\x1a\x61\n\x0fSpaceMembership\x12\x17\n\x0forganization_id\x18\x01 \x01(\t\x12\x10\n\x08space_id\x18\x02 \x01(\t\x12\x0f\n\x07user_id\x18\x03 \x01(\t\x12\x12\n\nspace_role\x18\x04 \x01(\t\"\x96\x01\n\x11\x43reateUserRequest\x12\x0c\n\x04name\x18\x02 \x01(\t\x12\x14\n\x0c\x64isplay_name\x18\x03 \x01(\t\x12\x12\n\nidentities\x18\x04 \x03(\t\x12\r\n\x05\x65mail\x18\x05 \x01(\t\x12\x16\n\x0e\x65mail_verified\x18\x06 \x01(\x08\x12\x12\n\navatar_uri\x18\x07 \x01(\t\x12\x0e\n\x06system\x18\n \x01(\x08\"0\n\x12\x43reateUserResponse\x12\x1a\n\x04user\x18\x01 \x01(\x0b\x32\x0c.common.User\"\x17\n\x15GetCurrentUserRequest\"4\n\x16GetCurrentUserResponse\x12\x1a\n\x04user\x18\x01 \x01(\x0b\x32\x0c.common.User\"a\n\x18UpdateCurrentUserRequest\x12\x0c\n\x04name\x18\x02 \x01(\t\x12\x14\n\x0c\x64isplay_name\x18\x03 \x01(\t\x12\r\n\x05\x65mail\x18\x04 \x01(\t\x12\x12\n\navatar_uri\x18\x06 \x01(\t\"7\n\x19UpdateCurrentUserResponse\x12\x1a\n\x04user\x18\x01 \x01(\x0b\x32\x0c.common.User\"!\n\x0eGetUserRequest\x12\x0f\n\x07user_id\x18\x01 \x01(\t\"-\n\x0fGetUserResponse\x12\x1a\n\x04user\x18\x01 \x01(\x0b\x32\x0c.common.User\"\x82\x02\n\x10\x46indUsersRequest\x12\x0b\n\x03ids\x18\x01 \x03(\t\x12\x12\n\nidentities\x18\x02 \x03(\t\x12\r\n\x05names\x18\x03 \x03(\t\x12\x15\n\rdisplay_names\x18\x04 \x03(\t\x12\x0e\n\x06\x65mails\x18\x05 \x03(\t\x12\x32\n\x0e\x65mail_verified\x18\x06 \x01(\x0b\x32\x1a.google.protobuf.BoolValue\x12\x12\n\navatar_uri\x18\t \x03(\t\x12*\n\x06system\x18\n \x01(\x0b\x32\x1a.google.protobuf.BoolValue\x12\x10\n\x08page_num\x18\x0b \x01(\x05\x12\x11\n\tpage_size\x18\x0c \x01(\x05\"?\n\x11\x46indUsersResponse\x12\x1b\n\x05users\x18\x01 \x03(\x0b\x32\x0c.common.User\x12\r\n\x05total\x18\x02 \x01(\x05\"B\n\x11UpdateUserRequest\x12\x0f\n\x07user_id\x18\x01 \x01(\t\x12\x1c\n\x06update\x18\x02 \x01(\x0b\x32\x0c.common.User\"0\n\x12UpdateUserResponse\x12\x1a\n\x04user\x18\x01 \x01(\x0b\x32\x0c.common.User\"$\n\x11\x44\x65leteUserRequest\x12\x0f\n\x07user_id\x18\x01 \x01(\t\"\x14\n\x12\x44\x65leteUserResponse2\x80\x17\n\x11\x41\x63\x63ountManagement\x12[\n\nCreateUser\x12$.accountmanagement.CreateUserRequest\x1a%.accountmanagement.CreateUserResponse\"\x00\x12R\n\x07GetUser\x12!.accountmanagement.GetUserRequest\x1a\".accountmanagement.GetUserResponse\"\x00\x12X\n\tFindUsers\x12#.accountmanagement.FindUsersRequest\x1a$.accountmanagement.FindUsersResponse\"\x00\x12[\n\nUpdateUser\x12$.accountmanagement.UpdateUserRequest\x1a%.accountmanagement.UpdateUserResponse\"\x00\x12L\n\nDeleteUser\x12$.accountmanagement.DeleteUserRequest\x1a\x16.google.protobuf.Empty\"\x00\x12U\n\x0eGetCurrentUser\x12\x16.google.protobuf.Empty\x1a).accountmanagement.GetCurrentUserResponse\"\x00\x12p\n\x11UpdateCurrentUser\x12+.accountmanagement.UpdateCurrentUserRequest\x1a,.accountmanagement.UpdateCurrentUserResponse\"\x00\x12s\n\x12\x43reateOrganization\x12,.accountmanagement.CreateOrganizationRequest\x1a-.accountmanagement.CreateOrganizationResponse\"\x00\x12\\\n\x12\x44\x65leteOrganization\x12,.accountmanagement.DeleteOrganizationRequest\x1a\x16.google.protobuf.Empty\"\x00\x12p\n\x11\x46indOrganizations\x12+.accountmanagement.FindOrganizationsRequest\x1a,.accountmanagement.FindOrganizationsResponse\"\x00\x12s\n\x12UpdateOrganization\x12,.accountmanagement.UpdateOrganizationRequest\x1a-.accountmanagement.UpdateOrganizationResponse\"\x00\x12p\n\x1cUpdateOrganizationMembership\x12\x36.accountmanagement.UpdateOrganizationMembershipRequest\x1a\x16.google.protobuf.Empty\"\x00\x12p\n\x1c\x44\x65leteOrganizationMembership\x12\x36.accountmanagement.DeleteOrganizationMembershipRequest\x1a\x16.google.protobuf.Empty\"\x00\x12\x8e\x01\n\x1b\x46indOrganizationMemberships\x12\x35.accountmanagement.FindOrganizationMembershipsRequest\x1a\x36.accountmanagement.FindOrganizationMembershipsResponse\"\x00\x12^\n\x0b\x43reateSpace\x12%.accountmanagement.CreateSpaceRequest\x1a&.accountmanagement.CreateSpaceResponse\"\x00\x12U\n\x08GetSpace\x12\".accountmanagement.GetSpaceRequest\x1a#.accountmanagement.GetSpaceResponse\"\x00\x12\x7f\n\x16ListOrganizationSpaces\x12\x30.accountmanagement.ListOrganizationSpacesRequest\x1a\x31.accountmanagement.ListOrganizationSpacesResponse\"\x00\x12^\n\x0bUpdateSpace\x12%.accountmanagement.UpdateSpaceRequest\x1a&.accountmanagement.UpdateSpaceResponse\"\x00\x12N\n\x0b\x44\x65leteSpace\x12%.accountmanagement.DeleteSpaceRequest\x1a\x16.google.protobuf.Empty\"\x00\x12|\n\x15\x43reateSpaceInvitation\x12/.accountmanagement.CreateSpaceInvitationRequest\x1a\x30.accountmanagement.CreateSpaceInvitationResponse\"\x00\x12s\n\x12GetSpaceInvitation\x12,.accountmanagement.GetSpaceInvitationRequest\x1a-.accountmanagement.GetSpaceInvitationResponse\"\x00\x12\x62\n\x15UpdateSpaceInvitation\x12/.accountmanagement.UpdateSpaceInvitationRequest\x1a\x16.google.protobuf.Empty\"\x00\x12\x62\n\x15\x41\x63\x63\x65ptSpaceInvitation\x12/.accountmanagement.AcceptSpaceInvitationRequest\x1a\x16.google.protobuf.Empty\"\x00\x12y\n\x14\x46indSpaceInvitations\x12..accountmanagement.FindSpaceInvitationsRequest\x1a/.accountmanagement.FindSpaceInvitationsResponse\"\x00\x12\x62\n\x15\x44\x65leteSpaceInvitation\x12/.accountmanagement.DeleteSpaceInvitationRequest\x1a\x16.google.protobuf.Empty\"\x00\x12\\\n\x12SetSpaceMembership\x12,.accountmanagement.SetSpaceMembershipRequest\x1a\x16.google.protobuf.Empty\"\x00\x12\x62\n\x15\x44\x65leteSpaceMembership\x12/.accountmanagement.DeleteSpaceMembershipRequest\x1a\x16.google.protobuf.Empty\"\x00\x12y\n\x14\x46indSpaceMemberships\x12..accountmanagement.FindSpaceMembershipsRequest\x1a/.accountmanagement.FindSpaceMembershipsResponse\"\x00\x42\x46ZDgithub.com/perxteam/perxis/proto/accountmanagement;accountmanagementb\x06proto3'
+  ,
+  dependencies=[google_dot_protobuf_dot_timestamp__pb2.DESCRIPTOR,google_dot_protobuf_dot_empty__pb2.DESCRIPTOR,google_dot_protobuf_dot_wrappers__pb2.DESCRIPTOR,common_dot_common__pb2.DESCRIPTOR,])
+
+
+
+
+_CREATEORGANIZATIONREQUEST = _descriptor.Descriptor(
+  name='CreateOrganizationRequest',
+  full_name='accountmanagement.CreateOrganizationRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='name', full_name='accountmanagement.CreateOrganizationRequest.name', index=0,
+      number=2, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='description', full_name='accountmanagement.CreateOrganizationRequest.description', index=1,
+      number=3, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='logo_uri', full_name='accountmanagement.CreateOrganizationRequest.logo_uri', index=2,
+      number=4, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=179,
+  serialized_end=259,
+)
+
+
+_CREATEORGANIZATIONRESPONSE = _descriptor.Descriptor(
+  name='CreateOrganizationResponse',
+  full_name='accountmanagement.CreateOrganizationResponse',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='organization', full_name='accountmanagement.CreateOrganizationResponse.organization', index=0,
+      number=1, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=261,
+  serialized_end=333,
+)
+
+
+_UPDATEORGANIZATIONREQUEST = _descriptor.Descriptor(
+  name='UpdateOrganizationRequest',
+  full_name='accountmanagement.UpdateOrganizationRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='organization_id', full_name='accountmanagement.UpdateOrganizationRequest.organization_id', index=0,
+      number=1, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='name', full_name='accountmanagement.UpdateOrganizationRequest.name', index=1,
+      number=2, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='description', full_name='accountmanagement.UpdateOrganizationRequest.description', index=2,
+      number=3, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='logo_uri', full_name='accountmanagement.UpdateOrganizationRequest.logo_uri', index=3,
+      number=4, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=335,
+  serialized_end=440,
+)
+
+
+_UPDATEORGANIZATIONRESPONSE = _descriptor.Descriptor(
+  name='UpdateOrganizationResponse',
+  full_name='accountmanagement.UpdateOrganizationResponse',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='organization', full_name='accountmanagement.UpdateOrganizationResponse.organization', index=0,
+      number=1, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=442,
+  serialized_end=514,
+)
+
+
+_DELETEORGANIZATIONREQUEST = _descriptor.Descriptor(
+  name='DeleteOrganizationRequest',
+  full_name='accountmanagement.DeleteOrganizationRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='organization_id', full_name='accountmanagement.DeleteOrganizationRequest.organization_id', index=0,
+      number=1, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=516,
+  serialized_end=568,
+)
+
+
+_DELETEORGANIZATIONRESPONSE = _descriptor.Descriptor(
+  name='DeleteOrganizationResponse',
+  full_name='accountmanagement.DeleteOrganizationResponse',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=570,
+  serialized_end=598,
+)
+
+
+_FINDORGANIZATIONSREQUEST = _descriptor.Descriptor(
+  name='FindOrganizationsRequest',
+  full_name='accountmanagement.FindOrganizationsRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='page_num', full_name='accountmanagement.FindOrganizationsRequest.page_num', index=0,
+      number=1, type=5, cpp_type=1, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='page_size', full_name='accountmanagement.FindOrganizationsRequest.page_size', index=1,
+      number=2, type=5, cpp_type=1, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='ids', full_name='accountmanagement.FindOrganizationsRequest.ids', index=2,
+      number=3, type=9, cpp_type=9, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='names', full_name='accountmanagement.FindOrganizationsRequest.names', index=3,
+      number=4, type=9, cpp_type=9, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=600,
+  serialized_end=691,
+)
+
+
+_FINDORGANIZATIONSRESPONSE = _descriptor.Descriptor(
+  name='FindOrganizationsResponse',
+  full_name='accountmanagement.FindOrganizationsResponse',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='organizations', full_name='accountmanagement.FindOrganizationsResponse.organizations', index=0,
+      number=1, type=11, cpp_type=10, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='total', full_name='accountmanagement.FindOrganizationsResponse.total', index=1,
+      number=2, type=5, cpp_type=1, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=693,
+  serialized_end=780,
+)
+
+
+_UPDATEORGANIZATIONMEMBERSHIPREQUEST = _descriptor.Descriptor(
+  name='UpdateOrganizationMembershipRequest',
+  full_name='accountmanagement.UpdateOrganizationMembershipRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='user_id', full_name='accountmanagement.UpdateOrganizationMembershipRequest.user_id', index=0,
+      number=1, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='organization_id', full_name='accountmanagement.UpdateOrganizationMembershipRequest.organization_id', index=1,
+      number=2, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='role', full_name='accountmanagement.UpdateOrganizationMembershipRequest.role', index=2,
+      number=3, type=14, cpp_type=8, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=782,
+  serialized_end=889,
+)
+
+
+_DELETEORGANIZATIONMEMBERSHIPREQUEST = _descriptor.Descriptor(
+  name='DeleteOrganizationMembershipRequest',
+  full_name='accountmanagement.DeleteOrganizationMembershipRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='user_id', full_name='accountmanagement.DeleteOrganizationMembershipRequest.user_id', index=0,
+      number=1, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='organization_id', full_name='accountmanagement.DeleteOrganizationMembershipRequest.organization_id', index=1,
+      number=2, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=891,
+  serialized_end=970,
+)
+
+
+_FINDORGANIZATIONMEMBERSHIPSREQUEST = _descriptor.Descriptor(
+  name='FindOrganizationMembershipsRequest',
+  full_name='accountmanagement.FindOrganizationMembershipsRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='organization_ids', full_name='accountmanagement.FindOrganizationMembershipsRequest.organization_ids', index=0,
+      number=1, type=9, cpp_type=9, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='user_ids', full_name='accountmanagement.FindOrganizationMembershipsRequest.user_ids', index=1,
+      number=2, type=9, cpp_type=9, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='roles', full_name='accountmanagement.FindOrganizationMembershipsRequest.roles', index=2,
+      number=3, type=14, cpp_type=8, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='page_num', full_name='accountmanagement.FindOrganizationMembershipsRequest.page_num', index=3,
+      number=9, type=5, cpp_type=1, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='page_size', full_name='accountmanagement.FindOrganizationMembershipsRequest.page_size', index=4,
+      number=10, type=5, cpp_type=1, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=973,
+  serialized_end=1119,
+)
+
+
+_FINDORGANIZATIONMEMBERSHIPSRESPONSE = _descriptor.Descriptor(
+  name='FindOrganizationMembershipsResponse',
+  full_name='accountmanagement.FindOrganizationMembershipsResponse',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='memberships', full_name='accountmanagement.FindOrganizationMembershipsResponse.memberships', index=0,
+      number=1, type=11, cpp_type=10, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='total', full_name='accountmanagement.FindOrganizationMembershipsResponse.total', index=1,
+      number=2, type=5, cpp_type=1, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=1121,
+  serialized_end=1226,
+)
+
+
+_CREATESPACEREQUEST = _descriptor.Descriptor(
+  name='CreateSpaceRequest',
+  full_name='accountmanagement.CreateSpaceRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='name', full_name='accountmanagement.CreateSpaceRequest.name', index=0,
+      number=1, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='description', full_name='accountmanagement.CreateSpaceRequest.description', index=1,
+      number=2, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='organization_id', full_name='accountmanagement.CreateSpaceRequest.organization_id', index=2,
+      number=3, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=1228,
+  serialized_end=1308,
+)
+
+
+_CREATESPACERESPONSE = _descriptor.Descriptor(
+  name='CreateSpaceResponse',
+  full_name='accountmanagement.CreateSpaceResponse',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='space', full_name='accountmanagement.CreateSpaceResponse.space', index=0,
+      number=1, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=1310,
+  serialized_end=1361,
+)
+
+
+_GETSPACEREQUEST = _descriptor.Descriptor(
+  name='GetSpaceRequest',
+  full_name='accountmanagement.GetSpaceRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='space_id', full_name='accountmanagement.GetSpaceRequest.space_id', index=0,
+      number=1, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=1363,
+  serialized_end=1398,
+)
+
+
+_GETSPACERESPONSE = _descriptor.Descriptor(
+  name='GetSpaceResponse',
+  full_name='accountmanagement.GetSpaceResponse',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='space', full_name='accountmanagement.GetSpaceResponse.space', index=0,
+      number=1, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=1400,
+  serialized_end=1448,
+)
+
+
+_LISTORGANIZATIONSPACESREQUEST = _descriptor.Descriptor(
+  name='ListOrganizationSpacesRequest',
+  full_name='accountmanagement.ListOrganizationSpacesRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='organization_id', full_name='accountmanagement.ListOrganizationSpacesRequest.organization_id', index=0,
+      number=1, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=1450,
+  serialized_end=1506,
+)
+
+
+_LISTORGANIZATIONSPACESRESPONSE = _descriptor.Descriptor(
+  name='ListOrganizationSpacesResponse',
+  full_name='accountmanagement.ListOrganizationSpacesResponse',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='spaces', full_name='accountmanagement.ListOrganizationSpacesResponse.spaces', index=0,
+      number=1, type=11, cpp_type=10, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=1508,
+  serialized_end=1571,
+)
+
+
+_UPDATESPACEREQUEST = _descriptor.Descriptor(
+  name='UpdateSpaceRequest',
+  full_name='accountmanagement.UpdateSpaceRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='space_id', full_name='accountmanagement.UpdateSpaceRequest.space_id', index=0,
+      number=1, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='name', full_name='accountmanagement.UpdateSpaceRequest.name', index=1,
+      number=2, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='description', full_name='accountmanagement.UpdateSpaceRequest.description', index=2,
+      number=3, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='api_url', full_name='accountmanagement.UpdateSpaceRequest.api_url', index=3,
+      number=4, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=1573,
+  serialized_end=1663,
+)
+
+
+_UPDATESPACERESPONSE = _descriptor.Descriptor(
+  name='UpdateSpaceResponse',
+  full_name='accountmanagement.UpdateSpaceResponse',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='space', full_name='accountmanagement.UpdateSpaceResponse.space', index=0,
+      number=1, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=1665,
+  serialized_end=1716,
+)
+
+
+_DELETESPACEREQUEST = _descriptor.Descriptor(
+  name='DeleteSpaceRequest',
+  full_name='accountmanagement.DeleteSpaceRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='space_id', full_name='accountmanagement.DeleteSpaceRequest.space_id', index=0,
+      number=1, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=1718,
+  serialized_end=1756,
+)
+
+
+_DELETESPACERESPONSE = _descriptor.Descriptor(
+  name='DeleteSpaceResponse',
+  full_name='accountmanagement.DeleteSpaceResponse',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=1758,
+  serialized_end=1779,
+)
+
+
+_CREATESPACEINVITATIONREQUEST = _descriptor.Descriptor(
+  name='CreateSpaceInvitationRequest',
+  full_name='accountmanagement.CreateSpaceInvitationRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='space_id', full_name='accountmanagement.CreateSpaceInvitationRequest.space_id', index=0,
+      number=1, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='space_role', full_name='accountmanagement.CreateSpaceInvitationRequest.space_role', index=1,
+      number=2, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='email', full_name='accountmanagement.CreateSpaceInvitationRequest.email', index=2,
+      number=3, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=1781,
+  serialized_end=1864,
+)
+
+
+_CREATESPACEINVITATIONRESPONSE = _descriptor.Descriptor(
+  name='CreateSpaceInvitationResponse',
+  full_name='accountmanagement.CreateSpaceInvitationResponse',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='invitation', full_name='accountmanagement.CreateSpaceInvitationResponse.invitation', index=0,
+      number=1, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=1866,
+  serialized_end=1942,
+)
+
+
+_GETSPACEINVITATIONREQUEST = _descriptor.Descriptor(
+  name='GetSpaceInvitationRequest',
+  full_name='accountmanagement.GetSpaceInvitationRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='invitation_id', full_name='accountmanagement.GetSpaceInvitationRequest.invitation_id', index=0,
+      number=1, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=1944,
+  serialized_end=1994,
+)
+
+
+_GETSPACEINVITATIONRESPONSE = _descriptor.Descriptor(
+  name='GetSpaceInvitationResponse',
+  full_name='accountmanagement.GetSpaceInvitationResponse',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='invitation', full_name='accountmanagement.GetSpaceInvitationResponse.invitation', index=0,
+      number=1, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=1996,
+  serialized_end=2069,
+)
+
+
+_UPDATESPACEINVITATIONREQUEST = _descriptor.Descriptor(
+  name='UpdateSpaceInvitationRequest',
+  full_name='accountmanagement.UpdateSpaceInvitationRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='invitation_id', full_name='accountmanagement.UpdateSpaceInvitationRequest.invitation_id', index=0,
+      number=1, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='sent', full_name='accountmanagement.UpdateSpaceInvitationRequest.sent', index=1,
+      number=2, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='pending', full_name='accountmanagement.UpdateSpaceInvitationRequest.pending', index=2,
+      number=3, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='sent_at', full_name='accountmanagement.UpdateSpaceInvitationRequest.sent_at', index=3,
+      number=4, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='valid_until', full_name='accountmanagement.UpdateSpaceInvitationRequest.valid_until', index=4,
+      number=5, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=2072,
+  serialized_end=2306,
+)
+
+
+_UPDATESPACEINVITATIONRESPONSE = _descriptor.Descriptor(
+  name='UpdateSpaceInvitationResponse',
+  full_name='accountmanagement.UpdateSpaceInvitationResponse',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=2308,
+  serialized_end=2339,
+)
+
+
+_ACCEPTSPACEINVITATIONREQUEST = _descriptor.Descriptor(
+  name='AcceptSpaceInvitationRequest',
+  full_name='accountmanagement.AcceptSpaceInvitationRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='invitation_id', full_name='accountmanagement.AcceptSpaceInvitationRequest.invitation_id', index=0,
+      number=1, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=2341,
+  serialized_end=2394,
+)
+
+
+_ACCEPTSPACEINVITATIONRESPONSE = _descriptor.Descriptor(
+  name='AcceptSpaceInvitationResponse',
+  full_name='accountmanagement.AcceptSpaceInvitationResponse',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=2396,
+  serialized_end=2427,
+)
+
+
+_FINDSPACEINVITATIONSREQUEST = _descriptor.Descriptor(
+  name='FindSpaceInvitationsRequest',
+  full_name='accountmanagement.FindSpaceInvitationsRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='invitation_ids', full_name='accountmanagement.FindSpaceInvitationsRequest.invitation_ids', index=0,
+      number=1, type=9, cpp_type=9, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='organization_ids', full_name='accountmanagement.FindSpaceInvitationsRequest.organization_ids', index=1,
+      number=2, type=9, cpp_type=9, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='space_ids', full_name='accountmanagement.FindSpaceInvitationsRequest.space_ids', index=2,
+      number=3, type=9, cpp_type=9, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='emails', full_name='accountmanagement.FindSpaceInvitationsRequest.emails', index=3,
+      number=4, type=9, cpp_type=9, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='space_roles', full_name='accountmanagement.FindSpaceInvitationsRequest.space_roles', index=4,
+      number=5, type=9, cpp_type=9, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='sent', full_name='accountmanagement.FindSpaceInvitationsRequest.sent', index=5,
+      number=6, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='pending', full_name='accountmanagement.FindSpaceInvitationsRequest.pending', index=6,
+      number=7, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='page_num', full_name='accountmanagement.FindSpaceInvitationsRequest.page_num', index=7,
+      number=9, type=5, cpp_type=1, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='page_size', full_name='accountmanagement.FindSpaceInvitationsRequest.page_size', index=8,
+      number=10, type=5, cpp_type=1, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=2430,
+  serialized_end=2689,
+)
+
+
+_FINDSPACEINVITATIONSRESPONSE = _descriptor.Descriptor(
+  name='FindSpaceInvitationsResponse',
+  full_name='accountmanagement.FindSpaceInvitationsResponse',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='invitations', full_name='accountmanagement.FindSpaceInvitationsResponse.invitations', index=0,
+      number=1, type=11, cpp_type=10, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='total', full_name='accountmanagement.FindSpaceInvitationsResponse.total', index=1,
+      number=2, type=5, cpp_type=1, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=2691,
+  serialized_end=2782,
+)
+
+
+_DELETESPACEINVITATIONREQUEST = _descriptor.Descriptor(
+  name='DeleteSpaceInvitationRequest',
+  full_name='accountmanagement.DeleteSpaceInvitationRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='invitation_id', full_name='accountmanagement.DeleteSpaceInvitationRequest.invitation_id', index=0,
+      number=1, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=2784,
+  serialized_end=2837,
+)
+
+
+_DELETESPACEINVITATIONRESPONSE = _descriptor.Descriptor(
+  name='DeleteSpaceInvitationResponse',
+  full_name='accountmanagement.DeleteSpaceInvitationResponse',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=2839,
+  serialized_end=2870,
+)
+
+
+_SETSPACEMEMBERSHIPREQUEST = _descriptor.Descriptor(
+  name='SetSpaceMembershipRequest',
+  full_name='accountmanagement.SetSpaceMembershipRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='space_id', full_name='accountmanagement.SetSpaceMembershipRequest.space_id', index=0,
+      number=1, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='user_id', full_name='accountmanagement.SetSpaceMembershipRequest.user_id', index=1,
+      number=2, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='space_role', full_name='accountmanagement.SetSpaceMembershipRequest.space_role', index=2,
+      number=3, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=2872,
+  serialized_end=2954,
+)
+
+
+_SETSPACEMEMBERSHIPRESPONSE = _descriptor.Descriptor(
+  name='SetSpaceMembershipResponse',
+  full_name='accountmanagement.SetSpaceMembershipResponse',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=2956,
+  serialized_end=2984,
+)
+
+
+_DELETESPACEMEMBERSHIPREQUEST = _descriptor.Descriptor(
+  name='DeleteSpaceMembershipRequest',
+  full_name='accountmanagement.DeleteSpaceMembershipRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='space_id', full_name='accountmanagement.DeleteSpaceMembershipRequest.space_id', index=0,
+      number=1, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='user_id', full_name='accountmanagement.DeleteSpaceMembershipRequest.user_id', index=1,
+      number=2, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=2986,
+  serialized_end=3051,
+)
+
+
+_DELETESPACEMEMBERSHIPRESPONSE = _descriptor.Descriptor(
+  name='DeleteSpaceMembershipResponse',
+  full_name='accountmanagement.DeleteSpaceMembershipResponse',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=3053,
+  serialized_end=3084,
+)
+
+
+_FINDSPACEMEMBERSHIPSREQUEST = _descriptor.Descriptor(
+  name='FindSpaceMembershipsRequest',
+  full_name='accountmanagement.FindSpaceMembershipsRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='organization_ids', full_name='accountmanagement.FindSpaceMembershipsRequest.organization_ids', index=0,
+      number=1, type=9, cpp_type=9, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='space_ids', full_name='accountmanagement.FindSpaceMembershipsRequest.space_ids', index=1,
+      number=2, type=9, cpp_type=9, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='user_ids', full_name='accountmanagement.FindSpaceMembershipsRequest.user_ids', index=2,
+      number=3, type=9, cpp_type=9, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='space_roles', full_name='accountmanagement.FindSpaceMembershipsRequest.space_roles', index=3,
+      number=4, type=9, cpp_type=9, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='page_num', full_name='accountmanagement.FindSpaceMembershipsRequest.page_num', index=4,
+      number=9, type=5, cpp_type=1, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='page_size', full_name='accountmanagement.FindSpaceMembershipsRequest.page_size', index=5,
+      number=10, type=5, cpp_type=1, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=3087,
+  serialized_end=3237,
+)
+
+
+_FINDSPACEMEMBERSHIPSRESPONSE_SPACEMEMBERSHIP = _descriptor.Descriptor(
+  name='SpaceMembership',
+  full_name='accountmanagement.FindSpaceMembershipsResponse.SpaceMembership',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='organization_id', full_name='accountmanagement.FindSpaceMembershipsResponse.SpaceMembership.organization_id', index=0,
+      number=1, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='space_id', full_name='accountmanagement.FindSpaceMembershipsResponse.SpaceMembership.space_id', index=1,
+      number=2, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='user_id', full_name='accountmanagement.FindSpaceMembershipsResponse.SpaceMembership.user_id', index=2,
+      number=3, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='space_role', full_name='accountmanagement.FindSpaceMembershipsResponse.SpaceMembership.space_role', index=3,
+      number=4, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=3373,
+  serialized_end=3470,
+)
+
+_FINDSPACEMEMBERSHIPSRESPONSE = _descriptor.Descriptor(
+  name='FindSpaceMembershipsResponse',
+  full_name='accountmanagement.FindSpaceMembershipsResponse',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='memberships', full_name='accountmanagement.FindSpaceMembershipsResponse.memberships', index=0,
+      number=1, type=11, cpp_type=10, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='total', full_name='accountmanagement.FindSpaceMembershipsResponse.total', index=1,
+      number=2, type=5, cpp_type=1, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[_FINDSPACEMEMBERSHIPSRESPONSE_SPACEMEMBERSHIP, ],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=3240,
+  serialized_end=3470,
+)
+
+
+_CREATEUSERREQUEST = _descriptor.Descriptor(
+  name='CreateUserRequest',
+  full_name='accountmanagement.CreateUserRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='name', full_name='accountmanagement.CreateUserRequest.name', index=0,
+      number=2, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='display_name', full_name='accountmanagement.CreateUserRequest.display_name', index=1,
+      number=3, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='identities', full_name='accountmanagement.CreateUserRequest.identities', index=2,
+      number=4, type=9, cpp_type=9, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='email', full_name='accountmanagement.CreateUserRequest.email', index=3,
+      number=5, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='email_verified', full_name='accountmanagement.CreateUserRequest.email_verified', index=4,
+      number=6, type=8, cpp_type=7, label=1,
+      has_default_value=False, default_value=False,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='avatar_uri', full_name='accountmanagement.CreateUserRequest.avatar_uri', index=5,
+      number=7, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='system', full_name='accountmanagement.CreateUserRequest.system', index=6,
+      number=10, type=8, cpp_type=7, label=1,
+      has_default_value=False, default_value=False,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=3473,
+  serialized_end=3623,
+)
+
+
+_CREATEUSERRESPONSE = _descriptor.Descriptor(
+  name='CreateUserResponse',
+  full_name='accountmanagement.CreateUserResponse',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='user', full_name='accountmanagement.CreateUserResponse.user', index=0,
+      number=1, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=3625,
+  serialized_end=3673,
+)
+
+
+_GETCURRENTUSERREQUEST = _descriptor.Descriptor(
+  name='GetCurrentUserRequest',
+  full_name='accountmanagement.GetCurrentUserRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=3675,
+  serialized_end=3698,
+)
+
+
+_GETCURRENTUSERRESPONSE = _descriptor.Descriptor(
+  name='GetCurrentUserResponse',
+  full_name='accountmanagement.GetCurrentUserResponse',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='user', full_name='accountmanagement.GetCurrentUserResponse.user', index=0,
+      number=1, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=3700,
+  serialized_end=3752,
+)
+
+
+_UPDATECURRENTUSERREQUEST = _descriptor.Descriptor(
+  name='UpdateCurrentUserRequest',
+  full_name='accountmanagement.UpdateCurrentUserRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='name', full_name='accountmanagement.UpdateCurrentUserRequest.name', index=0,
+      number=2, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='display_name', full_name='accountmanagement.UpdateCurrentUserRequest.display_name', index=1,
+      number=3, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='email', full_name='accountmanagement.UpdateCurrentUserRequest.email', index=2,
+      number=4, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='avatar_uri', full_name='accountmanagement.UpdateCurrentUserRequest.avatar_uri', index=3,
+      number=6, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=3754,
+  serialized_end=3851,
+)
+
+
+_UPDATECURRENTUSERRESPONSE = _descriptor.Descriptor(
+  name='UpdateCurrentUserResponse',
+  full_name='accountmanagement.UpdateCurrentUserResponse',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='user', full_name='accountmanagement.UpdateCurrentUserResponse.user', index=0,
+      number=1, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=3853,
+  serialized_end=3908,
+)
+
+
+_GETUSERREQUEST = _descriptor.Descriptor(
+  name='GetUserRequest',
+  full_name='accountmanagement.GetUserRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='user_id', full_name='accountmanagement.GetUserRequest.user_id', index=0,
+      number=1, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=3910,
+  serialized_end=3943,
+)
+
+
+_GETUSERRESPONSE = _descriptor.Descriptor(
+  name='GetUserResponse',
+  full_name='accountmanagement.GetUserResponse',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='user', full_name='accountmanagement.GetUserResponse.user', index=0,
+      number=1, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=3945,
+  serialized_end=3990,
+)
+
+
+_FINDUSERSREQUEST = _descriptor.Descriptor(
+  name='FindUsersRequest',
+  full_name='accountmanagement.FindUsersRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='ids', full_name='accountmanagement.FindUsersRequest.ids', index=0,
+      number=1, type=9, cpp_type=9, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='identities', full_name='accountmanagement.FindUsersRequest.identities', index=1,
+      number=2, type=9, cpp_type=9, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='names', full_name='accountmanagement.FindUsersRequest.names', index=2,
+      number=3, type=9, cpp_type=9, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='display_names', full_name='accountmanagement.FindUsersRequest.display_names', index=3,
+      number=4, type=9, cpp_type=9, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='emails', full_name='accountmanagement.FindUsersRequest.emails', index=4,
+      number=5, type=9, cpp_type=9, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='email_verified', full_name='accountmanagement.FindUsersRequest.email_verified', index=5,
+      number=6, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='avatar_uri', full_name='accountmanagement.FindUsersRequest.avatar_uri', index=6,
+      number=9, type=9, cpp_type=9, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='system', full_name='accountmanagement.FindUsersRequest.system', index=7,
+      number=10, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='page_num', full_name='accountmanagement.FindUsersRequest.page_num', index=8,
+      number=11, type=5, cpp_type=1, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='page_size', full_name='accountmanagement.FindUsersRequest.page_size', index=9,
+      number=12, type=5, cpp_type=1, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=3993,
+  serialized_end=4251,
+)
+
+
+_FINDUSERSRESPONSE = _descriptor.Descriptor(
+  name='FindUsersResponse',
+  full_name='accountmanagement.FindUsersResponse',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='users', full_name='accountmanagement.FindUsersResponse.users', index=0,
+      number=1, type=11, cpp_type=10, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='total', full_name='accountmanagement.FindUsersResponse.total', index=1,
+      number=2, type=5, cpp_type=1, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=4253,
+  serialized_end=4316,
+)
+
+
+_UPDATEUSERREQUEST = _descriptor.Descriptor(
+  name='UpdateUserRequest',
+  full_name='accountmanagement.UpdateUserRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='user_id', full_name='accountmanagement.UpdateUserRequest.user_id', index=0,
+      number=1, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='update', full_name='accountmanagement.UpdateUserRequest.update', index=1,
+      number=2, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=4318,
+  serialized_end=4384,
+)
+
+
+_UPDATEUSERRESPONSE = _descriptor.Descriptor(
+  name='UpdateUserResponse',
+  full_name='accountmanagement.UpdateUserResponse',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='user', full_name='accountmanagement.UpdateUserResponse.user', index=0,
+      number=1, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=4386,
+  serialized_end=4434,
+)
+
+
+_DELETEUSERREQUEST = _descriptor.Descriptor(
+  name='DeleteUserRequest',
+  full_name='accountmanagement.DeleteUserRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='user_id', full_name='accountmanagement.DeleteUserRequest.user_id', index=0,
+      number=1, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=4436,
+  serialized_end=4472,
+)
+
+
+_DELETEUSERRESPONSE = _descriptor.Descriptor(
+  name='DeleteUserResponse',
+  full_name='accountmanagement.DeleteUserResponse',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=4474,
+  serialized_end=4494,
+)
+
+_CREATEORGANIZATIONRESPONSE.fields_by_name['organization'].message_type = common_dot_common__pb2._ORGANIZATION
+_UPDATEORGANIZATIONRESPONSE.fields_by_name['organization'].message_type = common_dot_common__pb2._ORGANIZATION
+_FINDORGANIZATIONSRESPONSE.fields_by_name['organizations'].message_type = common_dot_common__pb2._ORGANIZATION
+_UPDATEORGANIZATIONMEMBERSHIPREQUEST.fields_by_name['role'].enum_type = common_dot_common__pb2._ROLE
+_FINDORGANIZATIONMEMBERSHIPSREQUEST.fields_by_name['roles'].enum_type = common_dot_common__pb2._ROLE
+_FINDORGANIZATIONMEMBERSHIPSRESPONSE.fields_by_name['memberships'].message_type = common_dot_common__pb2._ORGANIZATIONMEMBERSHIP
+_CREATESPACERESPONSE.fields_by_name['space'].message_type = common_dot_common__pb2._SPACE
+_GETSPACERESPONSE.fields_by_name['space'].message_type = common_dot_common__pb2._SPACE
+_LISTORGANIZATIONSPACESRESPONSE.fields_by_name['spaces'].message_type = common_dot_common__pb2._SPACE
+_UPDATESPACERESPONSE.fields_by_name['space'].message_type = common_dot_common__pb2._SPACE
+_CREATESPACEINVITATIONRESPONSE.fields_by_name['invitation'].message_type = common_dot_common__pb2._SPACEINVITATION
+_GETSPACEINVITATIONRESPONSE.fields_by_name['invitation'].message_type = common_dot_common__pb2._SPACEINVITATION
+_UPDATESPACEINVITATIONREQUEST.fields_by_name['sent'].message_type = google_dot_protobuf_dot_wrappers__pb2._BOOLVALUE
+_UPDATESPACEINVITATIONREQUEST.fields_by_name['pending'].message_type = google_dot_protobuf_dot_wrappers__pb2._BOOLVALUE
+_UPDATESPACEINVITATIONREQUEST.fields_by_name['sent_at'].message_type = google_dot_protobuf_dot_timestamp__pb2._TIMESTAMP
+_UPDATESPACEINVITATIONREQUEST.fields_by_name['valid_until'].message_type = google_dot_protobuf_dot_timestamp__pb2._TIMESTAMP
+_FINDSPACEINVITATIONSREQUEST.fields_by_name['sent'].message_type = google_dot_protobuf_dot_wrappers__pb2._BOOLVALUE
+_FINDSPACEINVITATIONSREQUEST.fields_by_name['pending'].message_type = google_dot_protobuf_dot_wrappers__pb2._BOOLVALUE
+_FINDSPACEINVITATIONSRESPONSE.fields_by_name['invitations'].message_type = common_dot_common__pb2._SPACEINVITATION
+_FINDSPACEMEMBERSHIPSRESPONSE_SPACEMEMBERSHIP.containing_type = _FINDSPACEMEMBERSHIPSRESPONSE
+_FINDSPACEMEMBERSHIPSRESPONSE.fields_by_name['memberships'].message_type = _FINDSPACEMEMBERSHIPSRESPONSE_SPACEMEMBERSHIP
+_CREATEUSERRESPONSE.fields_by_name['user'].message_type = common_dot_common__pb2._USER
+_GETCURRENTUSERRESPONSE.fields_by_name['user'].message_type = common_dot_common__pb2._USER
+_UPDATECURRENTUSERRESPONSE.fields_by_name['user'].message_type = common_dot_common__pb2._USER
+_GETUSERRESPONSE.fields_by_name['user'].message_type = common_dot_common__pb2._USER
+_FINDUSERSREQUEST.fields_by_name['email_verified'].message_type = google_dot_protobuf_dot_wrappers__pb2._BOOLVALUE
+_FINDUSERSREQUEST.fields_by_name['system'].message_type = google_dot_protobuf_dot_wrappers__pb2._BOOLVALUE
+_FINDUSERSRESPONSE.fields_by_name['users'].message_type = common_dot_common__pb2._USER
+_UPDATEUSERREQUEST.fields_by_name['update'].message_type = common_dot_common__pb2._USER
+_UPDATEUSERRESPONSE.fields_by_name['user'].message_type = common_dot_common__pb2._USER
+DESCRIPTOR.message_types_by_name['CreateOrganizationRequest'] = _CREATEORGANIZATIONREQUEST
+DESCRIPTOR.message_types_by_name['CreateOrganizationResponse'] = _CREATEORGANIZATIONRESPONSE
+DESCRIPTOR.message_types_by_name['UpdateOrganizationRequest'] = _UPDATEORGANIZATIONREQUEST
+DESCRIPTOR.message_types_by_name['UpdateOrganizationResponse'] = _UPDATEORGANIZATIONRESPONSE
+DESCRIPTOR.message_types_by_name['DeleteOrganizationRequest'] = _DELETEORGANIZATIONREQUEST
+DESCRIPTOR.message_types_by_name['DeleteOrganizationResponse'] = _DELETEORGANIZATIONRESPONSE
+DESCRIPTOR.message_types_by_name['FindOrganizationsRequest'] = _FINDORGANIZATIONSREQUEST
+DESCRIPTOR.message_types_by_name['FindOrganizationsResponse'] = _FINDORGANIZATIONSRESPONSE
+DESCRIPTOR.message_types_by_name['UpdateOrganizationMembershipRequest'] = _UPDATEORGANIZATIONMEMBERSHIPREQUEST
+DESCRIPTOR.message_types_by_name['DeleteOrganizationMembershipRequest'] = _DELETEORGANIZATIONMEMBERSHIPREQUEST
+DESCRIPTOR.message_types_by_name['FindOrganizationMembershipsRequest'] = _FINDORGANIZATIONMEMBERSHIPSREQUEST
+DESCRIPTOR.message_types_by_name['FindOrganizationMembershipsResponse'] = _FINDORGANIZATIONMEMBERSHIPSRESPONSE
+DESCRIPTOR.message_types_by_name['CreateSpaceRequest'] = _CREATESPACEREQUEST
+DESCRIPTOR.message_types_by_name['CreateSpaceResponse'] = _CREATESPACERESPONSE
+DESCRIPTOR.message_types_by_name['GetSpaceRequest'] = _GETSPACEREQUEST
+DESCRIPTOR.message_types_by_name['GetSpaceResponse'] = _GETSPACERESPONSE
+DESCRIPTOR.message_types_by_name['ListOrganizationSpacesRequest'] = _LISTORGANIZATIONSPACESREQUEST
+DESCRIPTOR.message_types_by_name['ListOrganizationSpacesResponse'] = _LISTORGANIZATIONSPACESRESPONSE
+DESCRIPTOR.message_types_by_name['UpdateSpaceRequest'] = _UPDATESPACEREQUEST
+DESCRIPTOR.message_types_by_name['UpdateSpaceResponse'] = _UPDATESPACERESPONSE
+DESCRIPTOR.message_types_by_name['DeleteSpaceRequest'] = _DELETESPACEREQUEST
+DESCRIPTOR.message_types_by_name['DeleteSpaceResponse'] = _DELETESPACERESPONSE
+DESCRIPTOR.message_types_by_name['CreateSpaceInvitationRequest'] = _CREATESPACEINVITATIONREQUEST
+DESCRIPTOR.message_types_by_name['CreateSpaceInvitationResponse'] = _CREATESPACEINVITATIONRESPONSE
+DESCRIPTOR.message_types_by_name['GetSpaceInvitationRequest'] = _GETSPACEINVITATIONREQUEST
+DESCRIPTOR.message_types_by_name['GetSpaceInvitationResponse'] = _GETSPACEINVITATIONRESPONSE
+DESCRIPTOR.message_types_by_name['UpdateSpaceInvitationRequest'] = _UPDATESPACEINVITATIONREQUEST
+DESCRIPTOR.message_types_by_name['UpdateSpaceInvitationResponse'] = _UPDATESPACEINVITATIONRESPONSE
+DESCRIPTOR.message_types_by_name['AcceptSpaceInvitationRequest'] = _ACCEPTSPACEINVITATIONREQUEST
+DESCRIPTOR.message_types_by_name['AcceptSpaceInvitationResponse'] = _ACCEPTSPACEINVITATIONRESPONSE
+DESCRIPTOR.message_types_by_name['FindSpaceInvitationsRequest'] = _FINDSPACEINVITATIONSREQUEST
+DESCRIPTOR.message_types_by_name['FindSpaceInvitationsResponse'] = _FINDSPACEINVITATIONSRESPONSE
+DESCRIPTOR.message_types_by_name['DeleteSpaceInvitationRequest'] = _DELETESPACEINVITATIONREQUEST
+DESCRIPTOR.message_types_by_name['DeleteSpaceInvitationResponse'] = _DELETESPACEINVITATIONRESPONSE
+DESCRIPTOR.message_types_by_name['SetSpaceMembershipRequest'] = _SETSPACEMEMBERSHIPREQUEST
+DESCRIPTOR.message_types_by_name['SetSpaceMembershipResponse'] = _SETSPACEMEMBERSHIPRESPONSE
+DESCRIPTOR.message_types_by_name['DeleteSpaceMembershipRequest'] = _DELETESPACEMEMBERSHIPREQUEST
+DESCRIPTOR.message_types_by_name['DeleteSpaceMembershipResponse'] = _DELETESPACEMEMBERSHIPRESPONSE
+DESCRIPTOR.message_types_by_name['FindSpaceMembershipsRequest'] = _FINDSPACEMEMBERSHIPSREQUEST
+DESCRIPTOR.message_types_by_name['FindSpaceMembershipsResponse'] = _FINDSPACEMEMBERSHIPSRESPONSE
+DESCRIPTOR.message_types_by_name['CreateUserRequest'] = _CREATEUSERREQUEST
+DESCRIPTOR.message_types_by_name['CreateUserResponse'] = _CREATEUSERRESPONSE
+DESCRIPTOR.message_types_by_name['GetCurrentUserRequest'] = _GETCURRENTUSERREQUEST
+DESCRIPTOR.message_types_by_name['GetCurrentUserResponse'] = _GETCURRENTUSERRESPONSE
+DESCRIPTOR.message_types_by_name['UpdateCurrentUserRequest'] = _UPDATECURRENTUSERREQUEST
+DESCRIPTOR.message_types_by_name['UpdateCurrentUserResponse'] = _UPDATECURRENTUSERRESPONSE
+DESCRIPTOR.message_types_by_name['GetUserRequest'] = _GETUSERREQUEST
+DESCRIPTOR.message_types_by_name['GetUserResponse'] = _GETUSERRESPONSE
+DESCRIPTOR.message_types_by_name['FindUsersRequest'] = _FINDUSERSREQUEST
+DESCRIPTOR.message_types_by_name['FindUsersResponse'] = _FINDUSERSRESPONSE
+DESCRIPTOR.message_types_by_name['UpdateUserRequest'] = _UPDATEUSERREQUEST
+DESCRIPTOR.message_types_by_name['UpdateUserResponse'] = _UPDATEUSERRESPONSE
+DESCRIPTOR.message_types_by_name['DeleteUserRequest'] = _DELETEUSERREQUEST
+DESCRIPTOR.message_types_by_name['DeleteUserResponse'] = _DELETEUSERRESPONSE
+_sym_db.RegisterFileDescriptor(DESCRIPTOR)
+
+CreateOrganizationRequest = _reflection.GeneratedProtocolMessageType('CreateOrganizationRequest', (_message.Message,), {
+  'DESCRIPTOR' : _CREATEORGANIZATIONREQUEST,
+  '__module__' : 'accountmanagement.accountmanagement_pb2'
+  # @@protoc_insertion_point(class_scope:accountmanagement.CreateOrganizationRequest)
+  })
+_sym_db.RegisterMessage(CreateOrganizationRequest)
+
+CreateOrganizationResponse = _reflection.GeneratedProtocolMessageType('CreateOrganizationResponse', (_message.Message,), {
+  'DESCRIPTOR' : _CREATEORGANIZATIONRESPONSE,
+  '__module__' : 'accountmanagement.accountmanagement_pb2'
+  # @@protoc_insertion_point(class_scope:accountmanagement.CreateOrganizationResponse)
+  })
+_sym_db.RegisterMessage(CreateOrganizationResponse)
+
+UpdateOrganizationRequest = _reflection.GeneratedProtocolMessageType('UpdateOrganizationRequest', (_message.Message,), {
+  'DESCRIPTOR' : _UPDATEORGANIZATIONREQUEST,
+  '__module__' : 'accountmanagement.accountmanagement_pb2'
+  # @@protoc_insertion_point(class_scope:accountmanagement.UpdateOrganizationRequest)
+  })
+_sym_db.RegisterMessage(UpdateOrganizationRequest)
+
+UpdateOrganizationResponse = _reflection.GeneratedProtocolMessageType('UpdateOrganizationResponse', (_message.Message,), {
+  'DESCRIPTOR' : _UPDATEORGANIZATIONRESPONSE,
+  '__module__' : 'accountmanagement.accountmanagement_pb2'
+  # @@protoc_insertion_point(class_scope:accountmanagement.UpdateOrganizationResponse)
+  })
+_sym_db.RegisterMessage(UpdateOrganizationResponse)
+
+DeleteOrganizationRequest = _reflection.GeneratedProtocolMessageType('DeleteOrganizationRequest', (_message.Message,), {
+  'DESCRIPTOR' : _DELETEORGANIZATIONREQUEST,
+  '__module__' : 'accountmanagement.accountmanagement_pb2'
+  # @@protoc_insertion_point(class_scope:accountmanagement.DeleteOrganizationRequest)
+  })
+_sym_db.RegisterMessage(DeleteOrganizationRequest)
+
+DeleteOrganizationResponse = _reflection.GeneratedProtocolMessageType('DeleteOrganizationResponse', (_message.Message,), {
+  'DESCRIPTOR' : _DELETEORGANIZATIONRESPONSE,
+  '__module__' : 'accountmanagement.accountmanagement_pb2'
+  # @@protoc_insertion_point(class_scope:accountmanagement.DeleteOrganizationResponse)
+  })
+_sym_db.RegisterMessage(DeleteOrganizationResponse)
+
+FindOrganizationsRequest = _reflection.GeneratedProtocolMessageType('FindOrganizationsRequest', (_message.Message,), {
+  'DESCRIPTOR' : _FINDORGANIZATIONSREQUEST,
+  '__module__' : 'accountmanagement.accountmanagement_pb2'
+  # @@protoc_insertion_point(class_scope:accountmanagement.FindOrganizationsRequest)
+  })
+_sym_db.RegisterMessage(FindOrganizationsRequest)
+
+FindOrganizationsResponse = _reflection.GeneratedProtocolMessageType('FindOrganizationsResponse', (_message.Message,), {
+  'DESCRIPTOR' : _FINDORGANIZATIONSRESPONSE,
+  '__module__' : 'accountmanagement.accountmanagement_pb2'
+  # @@protoc_insertion_point(class_scope:accountmanagement.FindOrganizationsResponse)
+  })
+_sym_db.RegisterMessage(FindOrganizationsResponse)
+
+UpdateOrganizationMembershipRequest = _reflection.GeneratedProtocolMessageType('UpdateOrganizationMembershipRequest', (_message.Message,), {
+  'DESCRIPTOR' : _UPDATEORGANIZATIONMEMBERSHIPREQUEST,
+  '__module__' : 'accountmanagement.accountmanagement_pb2'
+  # @@protoc_insertion_point(class_scope:accountmanagement.UpdateOrganizationMembershipRequest)
+  })
+_sym_db.RegisterMessage(UpdateOrganizationMembershipRequest)
+
+DeleteOrganizationMembershipRequest = _reflection.GeneratedProtocolMessageType('DeleteOrganizationMembershipRequest', (_message.Message,), {
+  'DESCRIPTOR' : _DELETEORGANIZATIONMEMBERSHIPREQUEST,
+  '__module__' : 'accountmanagement.accountmanagement_pb2'
+  # @@protoc_insertion_point(class_scope:accountmanagement.DeleteOrganizationMembershipRequest)
+  })
+_sym_db.RegisterMessage(DeleteOrganizationMembershipRequest)
+
+FindOrganizationMembershipsRequest = _reflection.GeneratedProtocolMessageType('FindOrganizationMembershipsRequest', (_message.Message,), {
+  'DESCRIPTOR' : _FINDORGANIZATIONMEMBERSHIPSREQUEST,
+  '__module__' : 'accountmanagement.accountmanagement_pb2'
+  # @@protoc_insertion_point(class_scope:accountmanagement.FindOrganizationMembershipsRequest)
+  })
+_sym_db.RegisterMessage(FindOrganizationMembershipsRequest)
+
+FindOrganizationMembershipsResponse = _reflection.GeneratedProtocolMessageType('FindOrganizationMembershipsResponse', (_message.Message,), {
+  'DESCRIPTOR' : _FINDORGANIZATIONMEMBERSHIPSRESPONSE,
+  '__module__' : 'accountmanagement.accountmanagement_pb2'
+  # @@protoc_insertion_point(class_scope:accountmanagement.FindOrganizationMembershipsResponse)
+  })
+_sym_db.RegisterMessage(FindOrganizationMembershipsResponse)
+
+CreateSpaceRequest = _reflection.GeneratedProtocolMessageType('CreateSpaceRequest', (_message.Message,), {
+  'DESCRIPTOR' : _CREATESPACEREQUEST,
+  '__module__' : 'accountmanagement.accountmanagement_pb2'
+  # @@protoc_insertion_point(class_scope:accountmanagement.CreateSpaceRequest)
+  })
+_sym_db.RegisterMessage(CreateSpaceRequest)
+
+CreateSpaceResponse = _reflection.GeneratedProtocolMessageType('CreateSpaceResponse', (_message.Message,), {
+  'DESCRIPTOR' : _CREATESPACERESPONSE,
+  '__module__' : 'accountmanagement.accountmanagement_pb2'
+  # @@protoc_insertion_point(class_scope:accountmanagement.CreateSpaceResponse)
+  })
+_sym_db.RegisterMessage(CreateSpaceResponse)
+
+GetSpaceRequest = _reflection.GeneratedProtocolMessageType('GetSpaceRequest', (_message.Message,), {
+  'DESCRIPTOR' : _GETSPACEREQUEST,
+  '__module__' : 'accountmanagement.accountmanagement_pb2'
+  # @@protoc_insertion_point(class_scope:accountmanagement.GetSpaceRequest)
+  })
+_sym_db.RegisterMessage(GetSpaceRequest)
+
+GetSpaceResponse = _reflection.GeneratedProtocolMessageType('GetSpaceResponse', (_message.Message,), {
+  'DESCRIPTOR' : _GETSPACERESPONSE,
+  '__module__' : 'accountmanagement.accountmanagement_pb2'
+  # @@protoc_insertion_point(class_scope:accountmanagement.GetSpaceResponse)
+  })
+_sym_db.RegisterMessage(GetSpaceResponse)
+
+ListOrganizationSpacesRequest = _reflection.GeneratedProtocolMessageType('ListOrganizationSpacesRequest', (_message.Message,), {
+  'DESCRIPTOR' : _LISTORGANIZATIONSPACESREQUEST,
+  '__module__' : 'accountmanagement.accountmanagement_pb2'
+  # @@protoc_insertion_point(class_scope:accountmanagement.ListOrganizationSpacesRequest)
+  })
+_sym_db.RegisterMessage(ListOrganizationSpacesRequest)
+
+ListOrganizationSpacesResponse = _reflection.GeneratedProtocolMessageType('ListOrganizationSpacesResponse', (_message.Message,), {
+  'DESCRIPTOR' : _LISTORGANIZATIONSPACESRESPONSE,
+  '__module__' : 'accountmanagement.accountmanagement_pb2'
+  # @@protoc_insertion_point(class_scope:accountmanagement.ListOrganizationSpacesResponse)
+  })
+_sym_db.RegisterMessage(ListOrganizationSpacesResponse)
+
+UpdateSpaceRequest = _reflection.GeneratedProtocolMessageType('UpdateSpaceRequest', (_message.Message,), {
+  'DESCRIPTOR' : _UPDATESPACEREQUEST,
+  '__module__' : 'accountmanagement.accountmanagement_pb2'
+  # @@protoc_insertion_point(class_scope:accountmanagement.UpdateSpaceRequest)
+  })
+_sym_db.RegisterMessage(UpdateSpaceRequest)
+
+UpdateSpaceResponse = _reflection.GeneratedProtocolMessageType('UpdateSpaceResponse', (_message.Message,), {
+  'DESCRIPTOR' : _UPDATESPACERESPONSE,
+  '__module__' : 'accountmanagement.accountmanagement_pb2'
+  # @@protoc_insertion_point(class_scope:accountmanagement.UpdateSpaceResponse)
+  })
+_sym_db.RegisterMessage(UpdateSpaceResponse)
+
+DeleteSpaceRequest = _reflection.GeneratedProtocolMessageType('DeleteSpaceRequest', (_message.Message,), {
+  'DESCRIPTOR' : _DELETESPACEREQUEST,
+  '__module__' : 'accountmanagement.accountmanagement_pb2'
+  # @@protoc_insertion_point(class_scope:accountmanagement.DeleteSpaceRequest)
+  })
+_sym_db.RegisterMessage(DeleteSpaceRequest)
+
+DeleteSpaceResponse = _reflection.GeneratedProtocolMessageType('DeleteSpaceResponse', (_message.Message,), {
+  'DESCRIPTOR' : _DELETESPACERESPONSE,
+  '__module__' : 'accountmanagement.accountmanagement_pb2'
+  # @@protoc_insertion_point(class_scope:accountmanagement.DeleteSpaceResponse)
+  })
+_sym_db.RegisterMessage(DeleteSpaceResponse)
+
+CreateSpaceInvitationRequest = _reflection.GeneratedProtocolMessageType('CreateSpaceInvitationRequest', (_message.Message,), {
+  'DESCRIPTOR' : _CREATESPACEINVITATIONREQUEST,
+  '__module__' : 'accountmanagement.accountmanagement_pb2'
+  # @@protoc_insertion_point(class_scope:accountmanagement.CreateSpaceInvitationRequest)
+  })
+_sym_db.RegisterMessage(CreateSpaceInvitationRequest)
+
+CreateSpaceInvitationResponse = _reflection.GeneratedProtocolMessageType('CreateSpaceInvitationResponse', (_message.Message,), {
+  'DESCRIPTOR' : _CREATESPACEINVITATIONRESPONSE,
+  '__module__' : 'accountmanagement.accountmanagement_pb2'
+  # @@protoc_insertion_point(class_scope:accountmanagement.CreateSpaceInvitationResponse)
+  })
+_sym_db.RegisterMessage(CreateSpaceInvitationResponse)
+
+GetSpaceInvitationRequest = _reflection.GeneratedProtocolMessageType('GetSpaceInvitationRequest', (_message.Message,), {
+  'DESCRIPTOR' : _GETSPACEINVITATIONREQUEST,
+  '__module__' : 'accountmanagement.accountmanagement_pb2'
+  # @@protoc_insertion_point(class_scope:accountmanagement.GetSpaceInvitationRequest)
+  })
+_sym_db.RegisterMessage(GetSpaceInvitationRequest)
+
+GetSpaceInvitationResponse = _reflection.GeneratedProtocolMessageType('GetSpaceInvitationResponse', (_message.Message,), {
+  'DESCRIPTOR' : _GETSPACEINVITATIONRESPONSE,
+  '__module__' : 'accountmanagement.accountmanagement_pb2'
+  # @@protoc_insertion_point(class_scope:accountmanagement.GetSpaceInvitationResponse)
+  })
+_sym_db.RegisterMessage(GetSpaceInvitationResponse)
+
+UpdateSpaceInvitationRequest = _reflection.GeneratedProtocolMessageType('UpdateSpaceInvitationRequest', (_message.Message,), {
+  'DESCRIPTOR' : _UPDATESPACEINVITATIONREQUEST,
+  '__module__' : 'accountmanagement.accountmanagement_pb2'
+  # @@protoc_insertion_point(class_scope:accountmanagement.UpdateSpaceInvitationRequest)
+  })
+_sym_db.RegisterMessage(UpdateSpaceInvitationRequest)
+
+UpdateSpaceInvitationResponse = _reflection.GeneratedProtocolMessageType('UpdateSpaceInvitationResponse', (_message.Message,), {
+  'DESCRIPTOR' : _UPDATESPACEINVITATIONRESPONSE,
+  '__module__' : 'accountmanagement.accountmanagement_pb2'
+  # @@protoc_insertion_point(class_scope:accountmanagement.UpdateSpaceInvitationResponse)
+  })
+_sym_db.RegisterMessage(UpdateSpaceInvitationResponse)
+
+AcceptSpaceInvitationRequest = _reflection.GeneratedProtocolMessageType('AcceptSpaceInvitationRequest', (_message.Message,), {
+  'DESCRIPTOR' : _ACCEPTSPACEINVITATIONREQUEST,
+  '__module__' : 'accountmanagement.accountmanagement_pb2'
+  # @@protoc_insertion_point(class_scope:accountmanagement.AcceptSpaceInvitationRequest)
+  })
+_sym_db.RegisterMessage(AcceptSpaceInvitationRequest)
+
+AcceptSpaceInvitationResponse = _reflection.GeneratedProtocolMessageType('AcceptSpaceInvitationResponse', (_message.Message,), {
+  'DESCRIPTOR' : _ACCEPTSPACEINVITATIONRESPONSE,
+  '__module__' : 'accountmanagement.accountmanagement_pb2'
+  # @@protoc_insertion_point(class_scope:accountmanagement.AcceptSpaceInvitationResponse)
+  })
+_sym_db.RegisterMessage(AcceptSpaceInvitationResponse)
+
+FindSpaceInvitationsRequest = _reflection.GeneratedProtocolMessageType('FindSpaceInvitationsRequest', (_message.Message,), {
+  'DESCRIPTOR' : _FINDSPACEINVITATIONSREQUEST,
+  '__module__' : 'accountmanagement.accountmanagement_pb2'
+  # @@protoc_insertion_point(class_scope:accountmanagement.FindSpaceInvitationsRequest)
+  })
+_sym_db.RegisterMessage(FindSpaceInvitationsRequest)
+
+FindSpaceInvitationsResponse = _reflection.GeneratedProtocolMessageType('FindSpaceInvitationsResponse', (_message.Message,), {
+  'DESCRIPTOR' : _FINDSPACEINVITATIONSRESPONSE,
+  '__module__' : 'accountmanagement.accountmanagement_pb2'
+  # @@protoc_insertion_point(class_scope:accountmanagement.FindSpaceInvitationsResponse)
+  })
+_sym_db.RegisterMessage(FindSpaceInvitationsResponse)
+
+DeleteSpaceInvitationRequest = _reflection.GeneratedProtocolMessageType('DeleteSpaceInvitationRequest', (_message.Message,), {
+  'DESCRIPTOR' : _DELETESPACEINVITATIONREQUEST,
+  '__module__' : 'accountmanagement.accountmanagement_pb2'
+  # @@protoc_insertion_point(class_scope:accountmanagement.DeleteSpaceInvitationRequest)
+  })
+_sym_db.RegisterMessage(DeleteSpaceInvitationRequest)
+
+DeleteSpaceInvitationResponse = _reflection.GeneratedProtocolMessageType('DeleteSpaceInvitationResponse', (_message.Message,), {
+  'DESCRIPTOR' : _DELETESPACEINVITATIONRESPONSE,
+  '__module__' : 'accountmanagement.accountmanagement_pb2'
+  # @@protoc_insertion_point(class_scope:accountmanagement.DeleteSpaceInvitationResponse)
+  })
+_sym_db.RegisterMessage(DeleteSpaceInvitationResponse)
+
+SetSpaceMembershipRequest = _reflection.GeneratedProtocolMessageType('SetSpaceMembershipRequest', (_message.Message,), {
+  'DESCRIPTOR' : _SETSPACEMEMBERSHIPREQUEST,
+  '__module__' : 'accountmanagement.accountmanagement_pb2'
+  # @@protoc_insertion_point(class_scope:accountmanagement.SetSpaceMembershipRequest)
+  })
+_sym_db.RegisterMessage(SetSpaceMembershipRequest)
+
+SetSpaceMembershipResponse = _reflection.GeneratedProtocolMessageType('SetSpaceMembershipResponse', (_message.Message,), {
+  'DESCRIPTOR' : _SETSPACEMEMBERSHIPRESPONSE,
+  '__module__' : 'accountmanagement.accountmanagement_pb2'
+  # @@protoc_insertion_point(class_scope:accountmanagement.SetSpaceMembershipResponse)
+  })
+_sym_db.RegisterMessage(SetSpaceMembershipResponse)
+
+DeleteSpaceMembershipRequest = _reflection.GeneratedProtocolMessageType('DeleteSpaceMembershipRequest', (_message.Message,), {
+  'DESCRIPTOR' : _DELETESPACEMEMBERSHIPREQUEST,
+  '__module__' : 'accountmanagement.accountmanagement_pb2'
+  # @@protoc_insertion_point(class_scope:accountmanagement.DeleteSpaceMembershipRequest)
+  })
+_sym_db.RegisterMessage(DeleteSpaceMembershipRequest)
+
+DeleteSpaceMembershipResponse = _reflection.GeneratedProtocolMessageType('DeleteSpaceMembershipResponse', (_message.Message,), {
+  'DESCRIPTOR' : _DELETESPACEMEMBERSHIPRESPONSE,
+  '__module__' : 'accountmanagement.accountmanagement_pb2'
+  # @@protoc_insertion_point(class_scope:accountmanagement.DeleteSpaceMembershipResponse)
+  })
+_sym_db.RegisterMessage(DeleteSpaceMembershipResponse)
+
+FindSpaceMembershipsRequest = _reflection.GeneratedProtocolMessageType('FindSpaceMembershipsRequest', (_message.Message,), {
+  'DESCRIPTOR' : _FINDSPACEMEMBERSHIPSREQUEST,
+  '__module__' : 'accountmanagement.accountmanagement_pb2'
+  # @@protoc_insertion_point(class_scope:accountmanagement.FindSpaceMembershipsRequest)
+  })
+_sym_db.RegisterMessage(FindSpaceMembershipsRequest)
+
+FindSpaceMembershipsResponse = _reflection.GeneratedProtocolMessageType('FindSpaceMembershipsResponse', (_message.Message,), {
+
+  'SpaceMembership' : _reflection.GeneratedProtocolMessageType('SpaceMembership', (_message.Message,), {
+    'DESCRIPTOR' : _FINDSPACEMEMBERSHIPSRESPONSE_SPACEMEMBERSHIP,
+    '__module__' : 'accountmanagement.accountmanagement_pb2'
+    # @@protoc_insertion_point(class_scope:accountmanagement.FindSpaceMembershipsResponse.SpaceMembership)
+    })
+  ,
+  'DESCRIPTOR' : _FINDSPACEMEMBERSHIPSRESPONSE,
+  '__module__' : 'accountmanagement.accountmanagement_pb2'
+  # @@protoc_insertion_point(class_scope:accountmanagement.FindSpaceMembershipsResponse)
+  })
+_sym_db.RegisterMessage(FindSpaceMembershipsResponse)
+_sym_db.RegisterMessage(FindSpaceMembershipsResponse.SpaceMembership)
+
+CreateUserRequest = _reflection.GeneratedProtocolMessageType('CreateUserRequest', (_message.Message,), {
+  'DESCRIPTOR' : _CREATEUSERREQUEST,
+  '__module__' : 'accountmanagement.accountmanagement_pb2'
+  # @@protoc_insertion_point(class_scope:accountmanagement.CreateUserRequest)
+  })
+_sym_db.RegisterMessage(CreateUserRequest)
+
+CreateUserResponse = _reflection.GeneratedProtocolMessageType('CreateUserResponse', (_message.Message,), {
+  'DESCRIPTOR' : _CREATEUSERRESPONSE,
+  '__module__' : 'accountmanagement.accountmanagement_pb2'
+  # @@protoc_insertion_point(class_scope:accountmanagement.CreateUserResponse)
+  })
+_sym_db.RegisterMessage(CreateUserResponse)
+
+GetCurrentUserRequest = _reflection.GeneratedProtocolMessageType('GetCurrentUserRequest', (_message.Message,), {
+  'DESCRIPTOR' : _GETCURRENTUSERREQUEST,
+  '__module__' : 'accountmanagement.accountmanagement_pb2'
+  # @@protoc_insertion_point(class_scope:accountmanagement.GetCurrentUserRequest)
+  })
+_sym_db.RegisterMessage(GetCurrentUserRequest)
+
+GetCurrentUserResponse = _reflection.GeneratedProtocolMessageType('GetCurrentUserResponse', (_message.Message,), {
+  'DESCRIPTOR' : _GETCURRENTUSERRESPONSE,
+  '__module__' : 'accountmanagement.accountmanagement_pb2'
+  # @@protoc_insertion_point(class_scope:accountmanagement.GetCurrentUserResponse)
+  })
+_sym_db.RegisterMessage(GetCurrentUserResponse)
+
+UpdateCurrentUserRequest = _reflection.GeneratedProtocolMessageType('UpdateCurrentUserRequest', (_message.Message,), {
+  'DESCRIPTOR' : _UPDATECURRENTUSERREQUEST,
+  '__module__' : 'accountmanagement.accountmanagement_pb2'
+  # @@protoc_insertion_point(class_scope:accountmanagement.UpdateCurrentUserRequest)
+  })
+_sym_db.RegisterMessage(UpdateCurrentUserRequest)
+
+UpdateCurrentUserResponse = _reflection.GeneratedProtocolMessageType('UpdateCurrentUserResponse', (_message.Message,), {
+  'DESCRIPTOR' : _UPDATECURRENTUSERRESPONSE,
+  '__module__' : 'accountmanagement.accountmanagement_pb2'
+  # @@protoc_insertion_point(class_scope:accountmanagement.UpdateCurrentUserResponse)
+  })
+_sym_db.RegisterMessage(UpdateCurrentUserResponse)
+
+GetUserRequest = _reflection.GeneratedProtocolMessageType('GetUserRequest', (_message.Message,), {
+  'DESCRIPTOR' : _GETUSERREQUEST,
+  '__module__' : 'accountmanagement.accountmanagement_pb2'
+  # @@protoc_insertion_point(class_scope:accountmanagement.GetUserRequest)
+  })
+_sym_db.RegisterMessage(GetUserRequest)
+
+GetUserResponse = _reflection.GeneratedProtocolMessageType('GetUserResponse', (_message.Message,), {
+  'DESCRIPTOR' : _GETUSERRESPONSE,
+  '__module__' : 'accountmanagement.accountmanagement_pb2'
+  # @@protoc_insertion_point(class_scope:accountmanagement.GetUserResponse)
+  })
+_sym_db.RegisterMessage(GetUserResponse)
+
+FindUsersRequest = _reflection.GeneratedProtocolMessageType('FindUsersRequest', (_message.Message,), {
+  'DESCRIPTOR' : _FINDUSERSREQUEST,
+  '__module__' : 'accountmanagement.accountmanagement_pb2'
+  # @@protoc_insertion_point(class_scope:accountmanagement.FindUsersRequest)
+  })
+_sym_db.RegisterMessage(FindUsersRequest)
+
+FindUsersResponse = _reflection.GeneratedProtocolMessageType('FindUsersResponse', (_message.Message,), {
+  'DESCRIPTOR' : _FINDUSERSRESPONSE,
+  '__module__' : 'accountmanagement.accountmanagement_pb2'
+  # @@protoc_insertion_point(class_scope:accountmanagement.FindUsersResponse)
+  })
+_sym_db.RegisterMessage(FindUsersResponse)
+
+UpdateUserRequest = _reflection.GeneratedProtocolMessageType('UpdateUserRequest', (_message.Message,), {
+  'DESCRIPTOR' : _UPDATEUSERREQUEST,
+  '__module__' : 'accountmanagement.accountmanagement_pb2'
+  # @@protoc_insertion_point(class_scope:accountmanagement.UpdateUserRequest)
+  })
+_sym_db.RegisterMessage(UpdateUserRequest)
+
+UpdateUserResponse = _reflection.GeneratedProtocolMessageType('UpdateUserResponse', (_message.Message,), {
+  'DESCRIPTOR' : _UPDATEUSERRESPONSE,
+  '__module__' : 'accountmanagement.accountmanagement_pb2'
+  # @@protoc_insertion_point(class_scope:accountmanagement.UpdateUserResponse)
+  })
+_sym_db.RegisterMessage(UpdateUserResponse)
+
+DeleteUserRequest = _reflection.GeneratedProtocolMessageType('DeleteUserRequest', (_message.Message,), {
+  'DESCRIPTOR' : _DELETEUSERREQUEST,
+  '__module__' : 'accountmanagement.accountmanagement_pb2'
+  # @@protoc_insertion_point(class_scope:accountmanagement.DeleteUserRequest)
+  })
+_sym_db.RegisterMessage(DeleteUserRequest)
+
+DeleteUserResponse = _reflection.GeneratedProtocolMessageType('DeleteUserResponse', (_message.Message,), {
+  'DESCRIPTOR' : _DELETEUSERRESPONSE,
+  '__module__' : 'accountmanagement.accountmanagement_pb2'
+  # @@protoc_insertion_point(class_scope:accountmanagement.DeleteUserResponse)
+  })
+_sym_db.RegisterMessage(DeleteUserResponse)
+
+
+DESCRIPTOR._options = None
+
+_ACCOUNTMANAGEMENT = _descriptor.ServiceDescriptor(
+  name='AccountManagement',
+  full_name='accountmanagement.AccountManagement',
+  file=DESCRIPTOR,
+  index=0,
+  serialized_options=None,
+  create_key=_descriptor._internal_create_key,
+  serialized_start=4497,
+  serialized_end=7441,
+  methods=[
+  _descriptor.MethodDescriptor(
+    name='CreateUser',
+    full_name='accountmanagement.AccountManagement.CreateUser',
+    index=0,
+    containing_service=None,
+    input_type=_CREATEUSERREQUEST,
+    output_type=_CREATEUSERRESPONSE,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='GetUser',
+    full_name='accountmanagement.AccountManagement.GetUser',
+    index=1,
+    containing_service=None,
+    input_type=_GETUSERREQUEST,
+    output_type=_GETUSERRESPONSE,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='FindUsers',
+    full_name='accountmanagement.AccountManagement.FindUsers',
+    index=2,
+    containing_service=None,
+    input_type=_FINDUSERSREQUEST,
+    output_type=_FINDUSERSRESPONSE,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='UpdateUser',
+    full_name='accountmanagement.AccountManagement.UpdateUser',
+    index=3,
+    containing_service=None,
+    input_type=_UPDATEUSERREQUEST,
+    output_type=_UPDATEUSERRESPONSE,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='DeleteUser',
+    full_name='accountmanagement.AccountManagement.DeleteUser',
+    index=4,
+    containing_service=None,
+    input_type=_DELETEUSERREQUEST,
+    output_type=google_dot_protobuf_dot_empty__pb2._EMPTY,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='GetCurrentUser',
+    full_name='accountmanagement.AccountManagement.GetCurrentUser',
+    index=5,
+    containing_service=None,
+    input_type=google_dot_protobuf_dot_empty__pb2._EMPTY,
+    output_type=_GETCURRENTUSERRESPONSE,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='UpdateCurrentUser',
+    full_name='accountmanagement.AccountManagement.UpdateCurrentUser',
+    index=6,
+    containing_service=None,
+    input_type=_UPDATECURRENTUSERREQUEST,
+    output_type=_UPDATECURRENTUSERRESPONSE,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='CreateOrganization',
+    full_name='accountmanagement.AccountManagement.CreateOrganization',
+    index=7,
+    containing_service=None,
+    input_type=_CREATEORGANIZATIONREQUEST,
+    output_type=_CREATEORGANIZATIONRESPONSE,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='DeleteOrganization',
+    full_name='accountmanagement.AccountManagement.DeleteOrganization',
+    index=8,
+    containing_service=None,
+    input_type=_DELETEORGANIZATIONREQUEST,
+    output_type=google_dot_protobuf_dot_empty__pb2._EMPTY,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='FindOrganizations',
+    full_name='accountmanagement.AccountManagement.FindOrganizations',
+    index=9,
+    containing_service=None,
+    input_type=_FINDORGANIZATIONSREQUEST,
+    output_type=_FINDORGANIZATIONSRESPONSE,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='UpdateOrganization',
+    full_name='accountmanagement.AccountManagement.UpdateOrganization',
+    index=10,
+    containing_service=None,
+    input_type=_UPDATEORGANIZATIONREQUEST,
+    output_type=_UPDATEORGANIZATIONRESPONSE,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='UpdateOrganizationMembership',
+    full_name='accountmanagement.AccountManagement.UpdateOrganizationMembership',
+    index=11,
+    containing_service=None,
+    input_type=_UPDATEORGANIZATIONMEMBERSHIPREQUEST,
+    output_type=google_dot_protobuf_dot_empty__pb2._EMPTY,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='DeleteOrganizationMembership',
+    full_name='accountmanagement.AccountManagement.DeleteOrganizationMembership',
+    index=12,
+    containing_service=None,
+    input_type=_DELETEORGANIZATIONMEMBERSHIPREQUEST,
+    output_type=google_dot_protobuf_dot_empty__pb2._EMPTY,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='FindOrganizationMemberships',
+    full_name='accountmanagement.AccountManagement.FindOrganizationMemberships',
+    index=13,
+    containing_service=None,
+    input_type=_FINDORGANIZATIONMEMBERSHIPSREQUEST,
+    output_type=_FINDORGANIZATIONMEMBERSHIPSRESPONSE,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='CreateSpace',
+    full_name='accountmanagement.AccountManagement.CreateSpace',
+    index=14,
+    containing_service=None,
+    input_type=_CREATESPACEREQUEST,
+    output_type=_CREATESPACERESPONSE,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='GetSpace',
+    full_name='accountmanagement.AccountManagement.GetSpace',
+    index=15,
+    containing_service=None,
+    input_type=_GETSPACEREQUEST,
+    output_type=_GETSPACERESPONSE,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='ListOrganizationSpaces',
+    full_name='accountmanagement.AccountManagement.ListOrganizationSpaces',
+    index=16,
+    containing_service=None,
+    input_type=_LISTORGANIZATIONSPACESREQUEST,
+    output_type=_LISTORGANIZATIONSPACESRESPONSE,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='UpdateSpace',
+    full_name='accountmanagement.AccountManagement.UpdateSpace',
+    index=17,
+    containing_service=None,
+    input_type=_UPDATESPACEREQUEST,
+    output_type=_UPDATESPACERESPONSE,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='DeleteSpace',
+    full_name='accountmanagement.AccountManagement.DeleteSpace',
+    index=18,
+    containing_service=None,
+    input_type=_DELETESPACEREQUEST,
+    output_type=google_dot_protobuf_dot_empty__pb2._EMPTY,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='CreateSpaceInvitation',
+    full_name='accountmanagement.AccountManagement.CreateSpaceInvitation',
+    index=19,
+    containing_service=None,
+    input_type=_CREATESPACEINVITATIONREQUEST,
+    output_type=_CREATESPACEINVITATIONRESPONSE,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='GetSpaceInvitation',
+    full_name='accountmanagement.AccountManagement.GetSpaceInvitation',
+    index=20,
+    containing_service=None,
+    input_type=_GETSPACEINVITATIONREQUEST,
+    output_type=_GETSPACEINVITATIONRESPONSE,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='UpdateSpaceInvitation',
+    full_name='accountmanagement.AccountManagement.UpdateSpaceInvitation',
+    index=21,
+    containing_service=None,
+    input_type=_UPDATESPACEINVITATIONREQUEST,
+    output_type=google_dot_protobuf_dot_empty__pb2._EMPTY,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='AcceptSpaceInvitation',
+    full_name='accountmanagement.AccountManagement.AcceptSpaceInvitation',
+    index=22,
+    containing_service=None,
+    input_type=_ACCEPTSPACEINVITATIONREQUEST,
+    output_type=google_dot_protobuf_dot_empty__pb2._EMPTY,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='FindSpaceInvitations',
+    full_name='accountmanagement.AccountManagement.FindSpaceInvitations',
+    index=23,
+    containing_service=None,
+    input_type=_FINDSPACEINVITATIONSREQUEST,
+    output_type=_FINDSPACEINVITATIONSRESPONSE,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='DeleteSpaceInvitation',
+    full_name='accountmanagement.AccountManagement.DeleteSpaceInvitation',
+    index=24,
+    containing_service=None,
+    input_type=_DELETESPACEINVITATIONREQUEST,
+    output_type=google_dot_protobuf_dot_empty__pb2._EMPTY,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='SetSpaceMembership',
+    full_name='accountmanagement.AccountManagement.SetSpaceMembership',
+    index=25,
+    containing_service=None,
+    input_type=_SETSPACEMEMBERSHIPREQUEST,
+    output_type=google_dot_protobuf_dot_empty__pb2._EMPTY,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='DeleteSpaceMembership',
+    full_name='accountmanagement.AccountManagement.DeleteSpaceMembership',
+    index=26,
+    containing_service=None,
+    input_type=_DELETESPACEMEMBERSHIPREQUEST,
+    output_type=google_dot_protobuf_dot_empty__pb2._EMPTY,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='FindSpaceMemberships',
+    full_name='accountmanagement.AccountManagement.FindSpaceMemberships',
+    index=27,
+    containing_service=None,
+    input_type=_FINDSPACEMEMBERSHIPSREQUEST,
+    output_type=_FINDSPACEMEMBERSHIPSRESPONSE,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+])
+_sym_db.RegisterServiceDescriptor(_ACCOUNTMANAGEMENT)
+
+DESCRIPTOR.services_by_name['AccountManagement'] = _ACCOUNTMANAGEMENT
+
+# @@protoc_insertion_point(module_scope)
diff --git a/perxis/accountmanagement/accountmanagement_pb2_grpc.py b/perxis/accountmanagement/accountmanagement_pb2_grpc.py
new file mode 100644
index 0000000..242b7b8
--- /dev/null
+++ b/perxis/accountmanagement/accountmanagement_pb2_grpc.py
@@ -0,0 +1,1024 @@
+# Generated by the gRPC Python protocol compiler plugin. DO NOT EDIT!
+"""Client and server classes corresponding to protobuf-defined services."""
+import grpc
+
+from accountmanagement import accountmanagement_pb2 as accountmanagement_dot_accountmanagement__pb2
+from google.protobuf import empty_pb2 as google_dot_protobuf_dot_empty__pb2
+
+
+class AccountManagementStub(object):
+    """Пользователи
+    """
+
+    def __init__(self, channel):
+        """Constructor.
+
+        Args:
+            channel: A grpc.Channel.
+        """
+        self.CreateUser = channel.unary_unary(
+                '/accountmanagement.AccountManagement/CreateUser',
+                request_serializer=accountmanagement_dot_accountmanagement__pb2.CreateUserRequest.SerializeToString,
+                response_deserializer=accountmanagement_dot_accountmanagement__pb2.CreateUserResponse.FromString,
+                )
+        self.GetUser = channel.unary_unary(
+                '/accountmanagement.AccountManagement/GetUser',
+                request_serializer=accountmanagement_dot_accountmanagement__pb2.GetUserRequest.SerializeToString,
+                response_deserializer=accountmanagement_dot_accountmanagement__pb2.GetUserResponse.FromString,
+                )
+        self.FindUsers = channel.unary_unary(
+                '/accountmanagement.AccountManagement/FindUsers',
+                request_serializer=accountmanagement_dot_accountmanagement__pb2.FindUsersRequest.SerializeToString,
+                response_deserializer=accountmanagement_dot_accountmanagement__pb2.FindUsersResponse.FromString,
+                )
+        self.UpdateUser = channel.unary_unary(
+                '/accountmanagement.AccountManagement/UpdateUser',
+                request_serializer=accountmanagement_dot_accountmanagement__pb2.UpdateUserRequest.SerializeToString,
+                response_deserializer=accountmanagement_dot_accountmanagement__pb2.UpdateUserResponse.FromString,
+                )
+        self.DeleteUser = channel.unary_unary(
+                '/accountmanagement.AccountManagement/DeleteUser',
+                request_serializer=accountmanagement_dot_accountmanagement__pb2.DeleteUserRequest.SerializeToString,
+                response_deserializer=google_dot_protobuf_dot_empty__pb2.Empty.FromString,
+                )
+        self.GetCurrentUser = channel.unary_unary(
+                '/accountmanagement.AccountManagement/GetCurrentUser',
+                request_serializer=google_dot_protobuf_dot_empty__pb2.Empty.SerializeToString,
+                response_deserializer=accountmanagement_dot_accountmanagement__pb2.GetCurrentUserResponse.FromString,
+                )
+        self.UpdateCurrentUser = channel.unary_unary(
+                '/accountmanagement.AccountManagement/UpdateCurrentUser',
+                request_serializer=accountmanagement_dot_accountmanagement__pb2.UpdateCurrentUserRequest.SerializeToString,
+                response_deserializer=accountmanagement_dot_accountmanagement__pb2.UpdateCurrentUserResponse.FromString,
+                )
+        self.CreateOrganization = channel.unary_unary(
+                '/accountmanagement.AccountManagement/CreateOrganization',
+                request_serializer=accountmanagement_dot_accountmanagement__pb2.CreateOrganizationRequest.SerializeToString,
+                response_deserializer=accountmanagement_dot_accountmanagement__pb2.CreateOrganizationResponse.FromString,
+                )
+        self.DeleteOrganization = channel.unary_unary(
+                '/accountmanagement.AccountManagement/DeleteOrganization',
+                request_serializer=accountmanagement_dot_accountmanagement__pb2.DeleteOrganizationRequest.SerializeToString,
+                response_deserializer=google_dot_protobuf_dot_empty__pb2.Empty.FromString,
+                )
+        self.FindOrganizations = channel.unary_unary(
+                '/accountmanagement.AccountManagement/FindOrganizations',
+                request_serializer=accountmanagement_dot_accountmanagement__pb2.FindOrganizationsRequest.SerializeToString,
+                response_deserializer=accountmanagement_dot_accountmanagement__pb2.FindOrganizationsResponse.FromString,
+                )
+        self.UpdateOrganization = channel.unary_unary(
+                '/accountmanagement.AccountManagement/UpdateOrganization',
+                request_serializer=accountmanagement_dot_accountmanagement__pb2.UpdateOrganizationRequest.SerializeToString,
+                response_deserializer=accountmanagement_dot_accountmanagement__pb2.UpdateOrganizationResponse.FromString,
+                )
+        self.UpdateOrganizationMembership = channel.unary_unary(
+                '/accountmanagement.AccountManagement/UpdateOrganizationMembership',
+                request_serializer=accountmanagement_dot_accountmanagement__pb2.UpdateOrganizationMembershipRequest.SerializeToString,
+                response_deserializer=google_dot_protobuf_dot_empty__pb2.Empty.FromString,
+                )
+        self.DeleteOrganizationMembership = channel.unary_unary(
+                '/accountmanagement.AccountManagement/DeleteOrganizationMembership',
+                request_serializer=accountmanagement_dot_accountmanagement__pb2.DeleteOrganizationMembershipRequest.SerializeToString,
+                response_deserializer=google_dot_protobuf_dot_empty__pb2.Empty.FromString,
+                )
+        self.FindOrganizationMemberships = channel.unary_unary(
+                '/accountmanagement.AccountManagement/FindOrganizationMemberships',
+                request_serializer=accountmanagement_dot_accountmanagement__pb2.FindOrganizationMembershipsRequest.SerializeToString,
+                response_deserializer=accountmanagement_dot_accountmanagement__pb2.FindOrganizationMembershipsResponse.FromString,
+                )
+        self.CreateSpace = channel.unary_unary(
+                '/accountmanagement.AccountManagement/CreateSpace',
+                request_serializer=accountmanagement_dot_accountmanagement__pb2.CreateSpaceRequest.SerializeToString,
+                response_deserializer=accountmanagement_dot_accountmanagement__pb2.CreateSpaceResponse.FromString,
+                )
+        self.GetSpace = channel.unary_unary(
+                '/accountmanagement.AccountManagement/GetSpace',
+                request_serializer=accountmanagement_dot_accountmanagement__pb2.GetSpaceRequest.SerializeToString,
+                response_deserializer=accountmanagement_dot_accountmanagement__pb2.GetSpaceResponse.FromString,
+                )
+        self.ListOrganizationSpaces = channel.unary_unary(
+                '/accountmanagement.AccountManagement/ListOrganizationSpaces',
+                request_serializer=accountmanagement_dot_accountmanagement__pb2.ListOrganizationSpacesRequest.SerializeToString,
+                response_deserializer=accountmanagement_dot_accountmanagement__pb2.ListOrganizationSpacesResponse.FromString,
+                )
+        self.UpdateSpace = channel.unary_unary(
+                '/accountmanagement.AccountManagement/UpdateSpace',
+                request_serializer=accountmanagement_dot_accountmanagement__pb2.UpdateSpaceRequest.SerializeToString,
+                response_deserializer=accountmanagement_dot_accountmanagement__pb2.UpdateSpaceResponse.FromString,
+                )
+        self.DeleteSpace = channel.unary_unary(
+                '/accountmanagement.AccountManagement/DeleteSpace',
+                request_serializer=accountmanagement_dot_accountmanagement__pb2.DeleteSpaceRequest.SerializeToString,
+                response_deserializer=google_dot_protobuf_dot_empty__pb2.Empty.FromString,
+                )
+        self.CreateSpaceInvitation = channel.unary_unary(
+                '/accountmanagement.AccountManagement/CreateSpaceInvitation',
+                request_serializer=accountmanagement_dot_accountmanagement__pb2.CreateSpaceInvitationRequest.SerializeToString,
+                response_deserializer=accountmanagement_dot_accountmanagement__pb2.CreateSpaceInvitationResponse.FromString,
+                )
+        self.GetSpaceInvitation = channel.unary_unary(
+                '/accountmanagement.AccountManagement/GetSpaceInvitation',
+                request_serializer=accountmanagement_dot_accountmanagement__pb2.GetSpaceInvitationRequest.SerializeToString,
+                response_deserializer=accountmanagement_dot_accountmanagement__pb2.GetSpaceInvitationResponse.FromString,
+                )
+        self.UpdateSpaceInvitation = channel.unary_unary(
+                '/accountmanagement.AccountManagement/UpdateSpaceInvitation',
+                request_serializer=accountmanagement_dot_accountmanagement__pb2.UpdateSpaceInvitationRequest.SerializeToString,
+                response_deserializer=google_dot_protobuf_dot_empty__pb2.Empty.FromString,
+                )
+        self.AcceptSpaceInvitation = channel.unary_unary(
+                '/accountmanagement.AccountManagement/AcceptSpaceInvitation',
+                request_serializer=accountmanagement_dot_accountmanagement__pb2.AcceptSpaceInvitationRequest.SerializeToString,
+                response_deserializer=google_dot_protobuf_dot_empty__pb2.Empty.FromString,
+                )
+        self.FindSpaceInvitations = channel.unary_unary(
+                '/accountmanagement.AccountManagement/FindSpaceInvitations',
+                request_serializer=accountmanagement_dot_accountmanagement__pb2.FindSpaceInvitationsRequest.SerializeToString,
+                response_deserializer=accountmanagement_dot_accountmanagement__pb2.FindSpaceInvitationsResponse.FromString,
+                )
+        self.DeleteSpaceInvitation = channel.unary_unary(
+                '/accountmanagement.AccountManagement/DeleteSpaceInvitation',
+                request_serializer=accountmanagement_dot_accountmanagement__pb2.DeleteSpaceInvitationRequest.SerializeToString,
+                response_deserializer=google_dot_protobuf_dot_empty__pb2.Empty.FromString,
+                )
+        self.SetSpaceMembership = channel.unary_unary(
+                '/accountmanagement.AccountManagement/SetSpaceMembership',
+                request_serializer=accountmanagement_dot_accountmanagement__pb2.SetSpaceMembershipRequest.SerializeToString,
+                response_deserializer=google_dot_protobuf_dot_empty__pb2.Empty.FromString,
+                )
+        self.DeleteSpaceMembership = channel.unary_unary(
+                '/accountmanagement.AccountManagement/DeleteSpaceMembership',
+                request_serializer=accountmanagement_dot_accountmanagement__pb2.DeleteSpaceMembershipRequest.SerializeToString,
+                response_deserializer=google_dot_protobuf_dot_empty__pb2.Empty.FromString,
+                )
+        self.FindSpaceMemberships = channel.unary_unary(
+                '/accountmanagement.AccountManagement/FindSpaceMemberships',
+                request_serializer=accountmanagement_dot_accountmanagement__pb2.FindSpaceMembershipsRequest.SerializeToString,
+                response_deserializer=accountmanagement_dot_accountmanagement__pb2.FindSpaceMembershipsResponse.FromString,
+                )
+
+
+class AccountManagementServicer(object):
+    """Пользователи
+    """
+
+    def CreateUser(self, request, context):
+        """Создать пользователя
+        System API: только системный пользователь может использовать
+        """
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def GetUser(self, request, context):
+        """Получить текущего пользователя
+        """
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def FindUsers(self, request, context):
+        """Получить список пользователей
+        """
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def UpdateUser(self, request, context):
+        """Обновить текущего пользователя
+        System API: только системный пользователь может использовать
+        """
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def DeleteUser(self, request, context):
+        """Удалить пользователя
+        """
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def GetCurrentUser(self, request, context):
+        """Получить текущего пользователя
+        """
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def UpdateCurrentUser(self, request, context):
+        """Обновить или зарегистрировать текущего пользователя
+        """
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def CreateOrganization(self, request, context):
+        """
+        Organizations (Организации)
+
+
+        Создает организацию
+        """
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def DeleteOrganization(self, request, context):
+        """Удалить организацию
+        """
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def FindOrganizations(self, request, context):
+        """Поиск организаций
+
+        """
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def UpdateOrganization(self, request, context):
+        """Обновление организации
+
+        """
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def UpdateOrganizationMembership(self, request, context):
+        """
+        Memberships (Членство в организации)
+
+
+        Обновить членство пользователя в организации
+        """
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def DeleteOrganizationMembership(self, request, context):
+        """Удалить пользователя из организации
+        """
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def FindOrganizationMemberships(self, request, context):
+        """Получить членство пользователей в организации или команде
+        Использование параметров
+        - Для поиска членов организации: organization_id
+        - Для поиска организаций где пользователь является членом: user_id
+        - Для поиска организаций владельцем которых является пользователь: user_id, Role = OWNER
+        - Для поиска организаций которыми пользователь может управлять: user_id, Role = [OWNER, ADMIN]
+        """
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def CreateSpace(self, request, context):
+        """
+        Spaces (Пространства)
+
+
+        Создает пространство в организации или пользователе
+        """
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def GetSpace(self, request, context):
+        """Получить информацию о пространстве
+        """
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def ListOrganizationSpaces(self, request, context):
+        """Получить список пространств в организации доступных
+        """
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def UpdateSpace(self, request, context):
+        """Обновить информацию о пространстве
+        """
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def DeleteSpace(self, request, context):
+        """Удалить пространство
+        """
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def CreateSpaceInvitation(self, request, context):
+        """
+        Членство в Spaces
+
+
+        Создать приглашение для пользователя в space
+        """
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def GetSpaceInvitation(self, request, context):
+        """Получить данные о приглашении
+        """
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def UpdateSpaceInvitation(self, request, context):
+        """Обновить данные о приглашении
+        """
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def AcceptSpaceInvitation(self, request, context):
+        """Принять приглашение
+        """
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def FindSpaceInvitations(self, request, context):
+        """Получить список приглашений для пространства
+        """
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def DeleteSpaceInvitation(self, request, context):
+        """Удалить приглашение
+        """
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def SetSpaceMembership(self, request, context):
+        """Обновляет участие пользователя в пространстве
+        """
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def DeleteSpaceMembership(self, request, context):
+        """Удаляет участия пользователя в пространстве
+        """
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def FindSpaceMemberships(self, request, context):
+        """Поиск членства пользователей в пространствах
+        Доступы:
+        - System - может получать что хочет
+        - Owner, Admin - может запрашивать что хочет в своих организациях (даже если сам не является членом пространства)
+        - стальные - может запрашивать что хочет в пространствах в которых является членом (не только свои но и других пользователей в пространстве)
+        Использование параметров
+        - Для поиска членств для всех пространств организации: organization_id
+        - Для поиска членов пространства: space_id
+        - Для поиска пространств, где пользователь является членом: user_id
+        - Для поиска пространств, где пользователю соответствует данная роль - user_id, space_role
+        Сортировка по умолчанию по "organization_id", "space_id", "user_id"
+        """
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+
+def add_AccountManagementServicer_to_server(servicer, server):
+    rpc_method_handlers = {
+            'CreateUser': grpc.unary_unary_rpc_method_handler(
+                    servicer.CreateUser,
+                    request_deserializer=accountmanagement_dot_accountmanagement__pb2.CreateUserRequest.FromString,
+                    response_serializer=accountmanagement_dot_accountmanagement__pb2.CreateUserResponse.SerializeToString,
+            ),
+            'GetUser': grpc.unary_unary_rpc_method_handler(
+                    servicer.GetUser,
+                    request_deserializer=accountmanagement_dot_accountmanagement__pb2.GetUserRequest.FromString,
+                    response_serializer=accountmanagement_dot_accountmanagement__pb2.GetUserResponse.SerializeToString,
+            ),
+            'FindUsers': grpc.unary_unary_rpc_method_handler(
+                    servicer.FindUsers,
+                    request_deserializer=accountmanagement_dot_accountmanagement__pb2.FindUsersRequest.FromString,
+                    response_serializer=accountmanagement_dot_accountmanagement__pb2.FindUsersResponse.SerializeToString,
+            ),
+            'UpdateUser': grpc.unary_unary_rpc_method_handler(
+                    servicer.UpdateUser,
+                    request_deserializer=accountmanagement_dot_accountmanagement__pb2.UpdateUserRequest.FromString,
+                    response_serializer=accountmanagement_dot_accountmanagement__pb2.UpdateUserResponse.SerializeToString,
+            ),
+            'DeleteUser': grpc.unary_unary_rpc_method_handler(
+                    servicer.DeleteUser,
+                    request_deserializer=accountmanagement_dot_accountmanagement__pb2.DeleteUserRequest.FromString,
+                    response_serializer=google_dot_protobuf_dot_empty__pb2.Empty.SerializeToString,
+            ),
+            'GetCurrentUser': grpc.unary_unary_rpc_method_handler(
+                    servicer.GetCurrentUser,
+                    request_deserializer=google_dot_protobuf_dot_empty__pb2.Empty.FromString,
+                    response_serializer=accountmanagement_dot_accountmanagement__pb2.GetCurrentUserResponse.SerializeToString,
+            ),
+            'UpdateCurrentUser': grpc.unary_unary_rpc_method_handler(
+                    servicer.UpdateCurrentUser,
+                    request_deserializer=accountmanagement_dot_accountmanagement__pb2.UpdateCurrentUserRequest.FromString,
+                    response_serializer=accountmanagement_dot_accountmanagement__pb2.UpdateCurrentUserResponse.SerializeToString,
+            ),
+            'CreateOrganization': grpc.unary_unary_rpc_method_handler(
+                    servicer.CreateOrganization,
+                    request_deserializer=accountmanagement_dot_accountmanagement__pb2.CreateOrganizationRequest.FromString,
+                    response_serializer=accountmanagement_dot_accountmanagement__pb2.CreateOrganizationResponse.SerializeToString,
+            ),
+            'DeleteOrganization': grpc.unary_unary_rpc_method_handler(
+                    servicer.DeleteOrganization,
+                    request_deserializer=accountmanagement_dot_accountmanagement__pb2.DeleteOrganizationRequest.FromString,
+                    response_serializer=google_dot_protobuf_dot_empty__pb2.Empty.SerializeToString,
+            ),
+            'FindOrganizations': grpc.unary_unary_rpc_method_handler(
+                    servicer.FindOrganizations,
+                    request_deserializer=accountmanagement_dot_accountmanagement__pb2.FindOrganizationsRequest.FromString,
+                    response_serializer=accountmanagement_dot_accountmanagement__pb2.FindOrganizationsResponse.SerializeToString,
+            ),
+            'UpdateOrganization': grpc.unary_unary_rpc_method_handler(
+                    servicer.UpdateOrganization,
+                    request_deserializer=accountmanagement_dot_accountmanagement__pb2.UpdateOrganizationRequest.FromString,
+                    response_serializer=accountmanagement_dot_accountmanagement__pb2.UpdateOrganizationResponse.SerializeToString,
+            ),
+            'UpdateOrganizationMembership': grpc.unary_unary_rpc_method_handler(
+                    servicer.UpdateOrganizationMembership,
+                    request_deserializer=accountmanagement_dot_accountmanagement__pb2.UpdateOrganizationMembershipRequest.FromString,
+                    response_serializer=google_dot_protobuf_dot_empty__pb2.Empty.SerializeToString,
+            ),
+            'DeleteOrganizationMembership': grpc.unary_unary_rpc_method_handler(
+                    servicer.DeleteOrganizationMembership,
+                    request_deserializer=accountmanagement_dot_accountmanagement__pb2.DeleteOrganizationMembershipRequest.FromString,
+                    response_serializer=google_dot_protobuf_dot_empty__pb2.Empty.SerializeToString,
+            ),
+            'FindOrganizationMemberships': grpc.unary_unary_rpc_method_handler(
+                    servicer.FindOrganizationMemberships,
+                    request_deserializer=accountmanagement_dot_accountmanagement__pb2.FindOrganizationMembershipsRequest.FromString,
+                    response_serializer=accountmanagement_dot_accountmanagement__pb2.FindOrganizationMembershipsResponse.SerializeToString,
+            ),
+            'CreateSpace': grpc.unary_unary_rpc_method_handler(
+                    servicer.CreateSpace,
+                    request_deserializer=accountmanagement_dot_accountmanagement__pb2.CreateSpaceRequest.FromString,
+                    response_serializer=accountmanagement_dot_accountmanagement__pb2.CreateSpaceResponse.SerializeToString,
+            ),
+            'GetSpace': grpc.unary_unary_rpc_method_handler(
+                    servicer.GetSpace,
+                    request_deserializer=accountmanagement_dot_accountmanagement__pb2.GetSpaceRequest.FromString,
+                    response_serializer=accountmanagement_dot_accountmanagement__pb2.GetSpaceResponse.SerializeToString,
+            ),
+            'ListOrganizationSpaces': grpc.unary_unary_rpc_method_handler(
+                    servicer.ListOrganizationSpaces,
+                    request_deserializer=accountmanagement_dot_accountmanagement__pb2.ListOrganizationSpacesRequest.FromString,
+                    response_serializer=accountmanagement_dot_accountmanagement__pb2.ListOrganizationSpacesResponse.SerializeToString,
+            ),
+            'UpdateSpace': grpc.unary_unary_rpc_method_handler(
+                    servicer.UpdateSpace,
+                    request_deserializer=accountmanagement_dot_accountmanagement__pb2.UpdateSpaceRequest.FromString,
+                    response_serializer=accountmanagement_dot_accountmanagement__pb2.UpdateSpaceResponse.SerializeToString,
+            ),
+            'DeleteSpace': grpc.unary_unary_rpc_method_handler(
+                    servicer.DeleteSpace,
+                    request_deserializer=accountmanagement_dot_accountmanagement__pb2.DeleteSpaceRequest.FromString,
+                    response_serializer=google_dot_protobuf_dot_empty__pb2.Empty.SerializeToString,
+            ),
+            'CreateSpaceInvitation': grpc.unary_unary_rpc_method_handler(
+                    servicer.CreateSpaceInvitation,
+                    request_deserializer=accountmanagement_dot_accountmanagement__pb2.CreateSpaceInvitationRequest.FromString,
+                    response_serializer=accountmanagement_dot_accountmanagement__pb2.CreateSpaceInvitationResponse.SerializeToString,
+            ),
+            'GetSpaceInvitation': grpc.unary_unary_rpc_method_handler(
+                    servicer.GetSpaceInvitation,
+                    request_deserializer=accountmanagement_dot_accountmanagement__pb2.GetSpaceInvitationRequest.FromString,
+                    response_serializer=accountmanagement_dot_accountmanagement__pb2.GetSpaceInvitationResponse.SerializeToString,
+            ),
+            'UpdateSpaceInvitation': grpc.unary_unary_rpc_method_handler(
+                    servicer.UpdateSpaceInvitation,
+                    request_deserializer=accountmanagement_dot_accountmanagement__pb2.UpdateSpaceInvitationRequest.FromString,
+                    response_serializer=google_dot_protobuf_dot_empty__pb2.Empty.SerializeToString,
+            ),
+            'AcceptSpaceInvitation': grpc.unary_unary_rpc_method_handler(
+                    servicer.AcceptSpaceInvitation,
+                    request_deserializer=accountmanagement_dot_accountmanagement__pb2.AcceptSpaceInvitationRequest.FromString,
+                    response_serializer=google_dot_protobuf_dot_empty__pb2.Empty.SerializeToString,
+            ),
+            'FindSpaceInvitations': grpc.unary_unary_rpc_method_handler(
+                    servicer.FindSpaceInvitations,
+                    request_deserializer=accountmanagement_dot_accountmanagement__pb2.FindSpaceInvitationsRequest.FromString,
+                    response_serializer=accountmanagement_dot_accountmanagement__pb2.FindSpaceInvitationsResponse.SerializeToString,
+            ),
+            'DeleteSpaceInvitation': grpc.unary_unary_rpc_method_handler(
+                    servicer.DeleteSpaceInvitation,
+                    request_deserializer=accountmanagement_dot_accountmanagement__pb2.DeleteSpaceInvitationRequest.FromString,
+                    response_serializer=google_dot_protobuf_dot_empty__pb2.Empty.SerializeToString,
+            ),
+            'SetSpaceMembership': grpc.unary_unary_rpc_method_handler(
+                    servicer.SetSpaceMembership,
+                    request_deserializer=accountmanagement_dot_accountmanagement__pb2.SetSpaceMembershipRequest.FromString,
+                    response_serializer=google_dot_protobuf_dot_empty__pb2.Empty.SerializeToString,
+            ),
+            'DeleteSpaceMembership': grpc.unary_unary_rpc_method_handler(
+                    servicer.DeleteSpaceMembership,
+                    request_deserializer=accountmanagement_dot_accountmanagement__pb2.DeleteSpaceMembershipRequest.FromString,
+                    response_serializer=google_dot_protobuf_dot_empty__pb2.Empty.SerializeToString,
+            ),
+            'FindSpaceMemberships': grpc.unary_unary_rpc_method_handler(
+                    servicer.FindSpaceMemberships,
+                    request_deserializer=accountmanagement_dot_accountmanagement__pb2.FindSpaceMembershipsRequest.FromString,
+                    response_serializer=accountmanagement_dot_accountmanagement__pb2.FindSpaceMembershipsResponse.SerializeToString,
+            ),
+    }
+    generic_handler = grpc.method_handlers_generic_handler(
+            'accountmanagement.AccountManagement', rpc_method_handlers)
+    server.add_generic_rpc_handlers((generic_handler,))
+
+
+ # This class is part of an EXPERIMENTAL API.
+class AccountManagement(object):
+    """Пользователи
+    """
+
+    @staticmethod
+    def CreateUser(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/accountmanagement.AccountManagement/CreateUser',
+            accountmanagement_dot_accountmanagement__pb2.CreateUserRequest.SerializeToString,
+            accountmanagement_dot_accountmanagement__pb2.CreateUserResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def GetUser(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/accountmanagement.AccountManagement/GetUser',
+            accountmanagement_dot_accountmanagement__pb2.GetUserRequest.SerializeToString,
+            accountmanagement_dot_accountmanagement__pb2.GetUserResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def FindUsers(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/accountmanagement.AccountManagement/FindUsers',
+            accountmanagement_dot_accountmanagement__pb2.FindUsersRequest.SerializeToString,
+            accountmanagement_dot_accountmanagement__pb2.FindUsersResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def UpdateUser(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/accountmanagement.AccountManagement/UpdateUser',
+            accountmanagement_dot_accountmanagement__pb2.UpdateUserRequest.SerializeToString,
+            accountmanagement_dot_accountmanagement__pb2.UpdateUserResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def DeleteUser(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/accountmanagement.AccountManagement/DeleteUser',
+            accountmanagement_dot_accountmanagement__pb2.DeleteUserRequest.SerializeToString,
+            google_dot_protobuf_dot_empty__pb2.Empty.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def GetCurrentUser(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/accountmanagement.AccountManagement/GetCurrentUser',
+            google_dot_protobuf_dot_empty__pb2.Empty.SerializeToString,
+            accountmanagement_dot_accountmanagement__pb2.GetCurrentUserResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def UpdateCurrentUser(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/accountmanagement.AccountManagement/UpdateCurrentUser',
+            accountmanagement_dot_accountmanagement__pb2.UpdateCurrentUserRequest.SerializeToString,
+            accountmanagement_dot_accountmanagement__pb2.UpdateCurrentUserResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def CreateOrganization(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/accountmanagement.AccountManagement/CreateOrganization',
+            accountmanagement_dot_accountmanagement__pb2.CreateOrganizationRequest.SerializeToString,
+            accountmanagement_dot_accountmanagement__pb2.CreateOrganizationResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def DeleteOrganization(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/accountmanagement.AccountManagement/DeleteOrganization',
+            accountmanagement_dot_accountmanagement__pb2.DeleteOrganizationRequest.SerializeToString,
+            google_dot_protobuf_dot_empty__pb2.Empty.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def FindOrganizations(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/accountmanagement.AccountManagement/FindOrganizations',
+            accountmanagement_dot_accountmanagement__pb2.FindOrganizationsRequest.SerializeToString,
+            accountmanagement_dot_accountmanagement__pb2.FindOrganizationsResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def UpdateOrganization(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/accountmanagement.AccountManagement/UpdateOrganization',
+            accountmanagement_dot_accountmanagement__pb2.UpdateOrganizationRequest.SerializeToString,
+            accountmanagement_dot_accountmanagement__pb2.UpdateOrganizationResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def UpdateOrganizationMembership(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/accountmanagement.AccountManagement/UpdateOrganizationMembership',
+            accountmanagement_dot_accountmanagement__pb2.UpdateOrganizationMembershipRequest.SerializeToString,
+            google_dot_protobuf_dot_empty__pb2.Empty.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def DeleteOrganizationMembership(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/accountmanagement.AccountManagement/DeleteOrganizationMembership',
+            accountmanagement_dot_accountmanagement__pb2.DeleteOrganizationMembershipRequest.SerializeToString,
+            google_dot_protobuf_dot_empty__pb2.Empty.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def FindOrganizationMemberships(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/accountmanagement.AccountManagement/FindOrganizationMemberships',
+            accountmanagement_dot_accountmanagement__pb2.FindOrganizationMembershipsRequest.SerializeToString,
+            accountmanagement_dot_accountmanagement__pb2.FindOrganizationMembershipsResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def CreateSpace(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/accountmanagement.AccountManagement/CreateSpace',
+            accountmanagement_dot_accountmanagement__pb2.CreateSpaceRequest.SerializeToString,
+            accountmanagement_dot_accountmanagement__pb2.CreateSpaceResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def GetSpace(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/accountmanagement.AccountManagement/GetSpace',
+            accountmanagement_dot_accountmanagement__pb2.GetSpaceRequest.SerializeToString,
+            accountmanagement_dot_accountmanagement__pb2.GetSpaceResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def ListOrganizationSpaces(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/accountmanagement.AccountManagement/ListOrganizationSpaces',
+            accountmanagement_dot_accountmanagement__pb2.ListOrganizationSpacesRequest.SerializeToString,
+            accountmanagement_dot_accountmanagement__pb2.ListOrganizationSpacesResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def UpdateSpace(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/accountmanagement.AccountManagement/UpdateSpace',
+            accountmanagement_dot_accountmanagement__pb2.UpdateSpaceRequest.SerializeToString,
+            accountmanagement_dot_accountmanagement__pb2.UpdateSpaceResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def DeleteSpace(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/accountmanagement.AccountManagement/DeleteSpace',
+            accountmanagement_dot_accountmanagement__pb2.DeleteSpaceRequest.SerializeToString,
+            google_dot_protobuf_dot_empty__pb2.Empty.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def CreateSpaceInvitation(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/accountmanagement.AccountManagement/CreateSpaceInvitation',
+            accountmanagement_dot_accountmanagement__pb2.CreateSpaceInvitationRequest.SerializeToString,
+            accountmanagement_dot_accountmanagement__pb2.CreateSpaceInvitationResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def GetSpaceInvitation(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/accountmanagement.AccountManagement/GetSpaceInvitation',
+            accountmanagement_dot_accountmanagement__pb2.GetSpaceInvitationRequest.SerializeToString,
+            accountmanagement_dot_accountmanagement__pb2.GetSpaceInvitationResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def UpdateSpaceInvitation(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/accountmanagement.AccountManagement/UpdateSpaceInvitation',
+            accountmanagement_dot_accountmanagement__pb2.UpdateSpaceInvitationRequest.SerializeToString,
+            google_dot_protobuf_dot_empty__pb2.Empty.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def AcceptSpaceInvitation(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/accountmanagement.AccountManagement/AcceptSpaceInvitation',
+            accountmanagement_dot_accountmanagement__pb2.AcceptSpaceInvitationRequest.SerializeToString,
+            google_dot_protobuf_dot_empty__pb2.Empty.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def FindSpaceInvitations(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/accountmanagement.AccountManagement/FindSpaceInvitations',
+            accountmanagement_dot_accountmanagement__pb2.FindSpaceInvitationsRequest.SerializeToString,
+            accountmanagement_dot_accountmanagement__pb2.FindSpaceInvitationsResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def DeleteSpaceInvitation(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/accountmanagement.AccountManagement/DeleteSpaceInvitation',
+            accountmanagement_dot_accountmanagement__pb2.DeleteSpaceInvitationRequest.SerializeToString,
+            google_dot_protobuf_dot_empty__pb2.Empty.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def SetSpaceMembership(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/accountmanagement.AccountManagement/SetSpaceMembership',
+            accountmanagement_dot_accountmanagement__pb2.SetSpaceMembershipRequest.SerializeToString,
+            google_dot_protobuf_dot_empty__pb2.Empty.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def DeleteSpaceMembership(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/accountmanagement.AccountManagement/DeleteSpaceMembership',
+            accountmanagement_dot_accountmanagement__pb2.DeleteSpaceMembershipRequest.SerializeToString,
+            google_dot_protobuf_dot_empty__pb2.Empty.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def FindSpaceMemberships(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/accountmanagement.AccountManagement/FindSpaceMemberships',
+            accountmanagement_dot_accountmanagement__pb2.FindSpaceMembershipsRequest.SerializeToString,
+            accountmanagement_dot_accountmanagement__pb2.FindSpaceMembershipsResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
diff --git a/perxis/collaborators/__init__.py b/perxis/collaborators/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/perxis/collaborators/collaborators_pb2.py b/perxis/collaborators/collaborators_pb2.py
new file mode 100644
index 0000000..0b3dcd8
--- /dev/null
+++ b/perxis/collaborators/collaborators_pb2.py
@@ -0,0 +1,503 @@
+# -*- coding: utf-8 -*-
+# Generated by the protocol buffer compiler.  DO NOT EDIT!
+# source: collaborators/collaborators.proto
+"""Generated protocol buffer code."""
+from google.protobuf import descriptor as _descriptor
+from google.protobuf import message as _message
+from google.protobuf import reflection as _reflection
+from google.protobuf import symbol_database as _symbol_database
+# @@protoc_insertion_point(imports)
+
+_sym_db = _symbol_database.Default()
+
+
+from google.protobuf import empty_pb2 as google_dot_protobuf_dot_empty__pb2
+
+
+DESCRIPTOR = _descriptor.FileDescriptor(
+  name='collaborators/collaborators.proto',
+  package='content.collaborators',
+  syntax='proto3',
+  serialized_options=b'Z<github.com/perxteam/perxis/proto/collaborators;collaborators',
+  create_key=_descriptor._internal_create_key,
+  serialized_pb=b'\n!collaborators/collaborators.proto\x12\x15\x63ontent.collaborators\x1a\x1bgoogle/protobuf/empty.proto\"?\n\x0c\x43ollaborator\x12\x10\n\x08space_id\x18\x01 \x01(\t\x12\x0f\n\x07user_id\x18\x02 \x01(\t\x12\x0c\n\x04role\x18\x03 \x01(\t\"=\n\nSetRequest\x12\x10\n\x08space_id\x18\x01 \x01(\t\x12\x0f\n\x07user_id\x18\x02 \x01(\t\x12\x0c\n\x04role\x18\x03 \x01(\t\"/\n\nGetRequest\x12\x10\n\x08space_id\x18\x01 \x01(\t\x12\x0f\n\x07user_id\x18\x02 \x01(\t\"\x1b\n\x0bGetResponse\x12\x0c\n\x04role\x18\x03 \x01(\t\"2\n\rRemoveRequest\x12\x10\n\x08space_id\x18\x01 \x01(\t\x12\x0f\n\x07user_id\x18\x02 \x01(\t\",\n\x18ListCollaboratorsRequest\x12\x10\n\x08space_id\x18\x01 \x01(\t\"W\n\x19ListCollaboratorsResponse\x12:\n\rcollaborators\x18\x01 \x03(\x0b\x32#.content.collaborators.Collaborator\"$\n\x11ListSpacesRequest\x12\x0f\n\x07user_id\x18\x01 \x01(\t\"I\n\x12ListSpacesResponse\x12\x33\n\x06spaces\x18\x01 \x03(\x0b\x32#.content.collaborators.Collaborator2\xcc\x03\n\rCollaborators\x12\x42\n\x03Set\x12!.content.collaborators.SetRequest\x1a\x16.google.protobuf.Empty\"\x00\x12N\n\x03Get\x12!.content.collaborators.GetRequest\x1a\".content.collaborators.GetResponse\"\x00\x12H\n\x06Remove\x12$.content.collaborators.RemoveRequest\x1a\x16.google.protobuf.Empty\"\x00\x12x\n\x11ListCollaborators\x12/.content.collaborators.ListCollaboratorsRequest\x1a\x30.content.collaborators.ListCollaboratorsResponse\"\x00\x12\x63\n\nListSpaces\x12(.content.collaborators.ListSpacesRequest\x1a).content.collaborators.ListSpacesResponse\"\x00\x42>Z<github.com/perxteam/perxis/proto/collaborators;collaboratorsb\x06proto3'
+  ,
+  dependencies=[google_dot_protobuf_dot_empty__pb2.DESCRIPTOR,])
+
+
+
+
+_COLLABORATOR = _descriptor.Descriptor(
+  name='Collaborator',
+  full_name='content.collaborators.Collaborator',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='space_id', full_name='content.collaborators.Collaborator.space_id', index=0,
+      number=1, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='user_id', full_name='content.collaborators.Collaborator.user_id', index=1,
+      number=2, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='role', full_name='content.collaborators.Collaborator.role', index=2,
+      number=3, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=89,
+  serialized_end=152,
+)
+
+
+_SETREQUEST = _descriptor.Descriptor(
+  name='SetRequest',
+  full_name='content.collaborators.SetRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='space_id', full_name='content.collaborators.SetRequest.space_id', index=0,
+      number=1, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='user_id', full_name='content.collaborators.SetRequest.user_id', index=1,
+      number=2, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='role', full_name='content.collaborators.SetRequest.role', index=2,
+      number=3, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=154,
+  serialized_end=215,
+)
+
+
+_GETREQUEST = _descriptor.Descriptor(
+  name='GetRequest',
+  full_name='content.collaborators.GetRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='space_id', full_name='content.collaborators.GetRequest.space_id', index=0,
+      number=1, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='user_id', full_name='content.collaborators.GetRequest.user_id', index=1,
+      number=2, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=217,
+  serialized_end=264,
+)
+
+
+_GETRESPONSE = _descriptor.Descriptor(
+  name='GetResponse',
+  full_name='content.collaborators.GetResponse',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='role', full_name='content.collaborators.GetResponse.role', index=0,
+      number=3, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=266,
+  serialized_end=293,
+)
+
+
+_REMOVEREQUEST = _descriptor.Descriptor(
+  name='RemoveRequest',
+  full_name='content.collaborators.RemoveRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='space_id', full_name='content.collaborators.RemoveRequest.space_id', index=0,
+      number=1, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='user_id', full_name='content.collaborators.RemoveRequest.user_id', index=1,
+      number=2, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=295,
+  serialized_end=345,
+)
+
+
+_LISTCOLLABORATORSREQUEST = _descriptor.Descriptor(
+  name='ListCollaboratorsRequest',
+  full_name='content.collaborators.ListCollaboratorsRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='space_id', full_name='content.collaborators.ListCollaboratorsRequest.space_id', index=0,
+      number=1, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=347,
+  serialized_end=391,
+)
+
+
+_LISTCOLLABORATORSRESPONSE = _descriptor.Descriptor(
+  name='ListCollaboratorsResponse',
+  full_name='content.collaborators.ListCollaboratorsResponse',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='collaborators', full_name='content.collaborators.ListCollaboratorsResponse.collaborators', index=0,
+      number=1, type=11, cpp_type=10, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=393,
+  serialized_end=480,
+)
+
+
+_LISTSPACESREQUEST = _descriptor.Descriptor(
+  name='ListSpacesRequest',
+  full_name='content.collaborators.ListSpacesRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='user_id', full_name='content.collaborators.ListSpacesRequest.user_id', index=0,
+      number=1, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=482,
+  serialized_end=518,
+)
+
+
+_LISTSPACESRESPONSE = _descriptor.Descriptor(
+  name='ListSpacesResponse',
+  full_name='content.collaborators.ListSpacesResponse',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='spaces', full_name='content.collaborators.ListSpacesResponse.spaces', index=0,
+      number=1, type=11, cpp_type=10, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=520,
+  serialized_end=593,
+)
+
+_LISTCOLLABORATORSRESPONSE.fields_by_name['collaborators'].message_type = _COLLABORATOR
+_LISTSPACESRESPONSE.fields_by_name['spaces'].message_type = _COLLABORATOR
+DESCRIPTOR.message_types_by_name['Collaborator'] = _COLLABORATOR
+DESCRIPTOR.message_types_by_name['SetRequest'] = _SETREQUEST
+DESCRIPTOR.message_types_by_name['GetRequest'] = _GETREQUEST
+DESCRIPTOR.message_types_by_name['GetResponse'] = _GETRESPONSE
+DESCRIPTOR.message_types_by_name['RemoveRequest'] = _REMOVEREQUEST
+DESCRIPTOR.message_types_by_name['ListCollaboratorsRequest'] = _LISTCOLLABORATORSREQUEST
+DESCRIPTOR.message_types_by_name['ListCollaboratorsResponse'] = _LISTCOLLABORATORSRESPONSE
+DESCRIPTOR.message_types_by_name['ListSpacesRequest'] = _LISTSPACESREQUEST
+DESCRIPTOR.message_types_by_name['ListSpacesResponse'] = _LISTSPACESRESPONSE
+_sym_db.RegisterFileDescriptor(DESCRIPTOR)
+
+Collaborator = _reflection.GeneratedProtocolMessageType('Collaborator', (_message.Message,), {
+  'DESCRIPTOR' : _COLLABORATOR,
+  '__module__' : 'collaborators.collaborators_pb2'
+  # @@protoc_insertion_point(class_scope:content.collaborators.Collaborator)
+  })
+_sym_db.RegisterMessage(Collaborator)
+
+SetRequest = _reflection.GeneratedProtocolMessageType('SetRequest', (_message.Message,), {
+  'DESCRIPTOR' : _SETREQUEST,
+  '__module__' : 'collaborators.collaborators_pb2'
+  # @@protoc_insertion_point(class_scope:content.collaborators.SetRequest)
+  })
+_sym_db.RegisterMessage(SetRequest)
+
+GetRequest = _reflection.GeneratedProtocolMessageType('GetRequest', (_message.Message,), {
+  'DESCRIPTOR' : _GETREQUEST,
+  '__module__' : 'collaborators.collaborators_pb2'
+  # @@protoc_insertion_point(class_scope:content.collaborators.GetRequest)
+  })
+_sym_db.RegisterMessage(GetRequest)
+
+GetResponse = _reflection.GeneratedProtocolMessageType('GetResponse', (_message.Message,), {
+  'DESCRIPTOR' : _GETRESPONSE,
+  '__module__' : 'collaborators.collaborators_pb2'
+  # @@protoc_insertion_point(class_scope:content.collaborators.GetResponse)
+  })
+_sym_db.RegisterMessage(GetResponse)
+
+RemoveRequest = _reflection.GeneratedProtocolMessageType('RemoveRequest', (_message.Message,), {
+  'DESCRIPTOR' : _REMOVEREQUEST,
+  '__module__' : 'collaborators.collaborators_pb2'
+  # @@protoc_insertion_point(class_scope:content.collaborators.RemoveRequest)
+  })
+_sym_db.RegisterMessage(RemoveRequest)
+
+ListCollaboratorsRequest = _reflection.GeneratedProtocolMessageType('ListCollaboratorsRequest', (_message.Message,), {
+  'DESCRIPTOR' : _LISTCOLLABORATORSREQUEST,
+  '__module__' : 'collaborators.collaborators_pb2'
+  # @@protoc_insertion_point(class_scope:content.collaborators.ListCollaboratorsRequest)
+  })
+_sym_db.RegisterMessage(ListCollaboratorsRequest)
+
+ListCollaboratorsResponse = _reflection.GeneratedProtocolMessageType('ListCollaboratorsResponse', (_message.Message,), {
+  'DESCRIPTOR' : _LISTCOLLABORATORSRESPONSE,
+  '__module__' : 'collaborators.collaborators_pb2'
+  # @@protoc_insertion_point(class_scope:content.collaborators.ListCollaboratorsResponse)
+  })
+_sym_db.RegisterMessage(ListCollaboratorsResponse)
+
+ListSpacesRequest = _reflection.GeneratedProtocolMessageType('ListSpacesRequest', (_message.Message,), {
+  'DESCRIPTOR' : _LISTSPACESREQUEST,
+  '__module__' : 'collaborators.collaborators_pb2'
+  # @@protoc_insertion_point(class_scope:content.collaborators.ListSpacesRequest)
+  })
+_sym_db.RegisterMessage(ListSpacesRequest)
+
+ListSpacesResponse = _reflection.GeneratedProtocolMessageType('ListSpacesResponse', (_message.Message,), {
+  'DESCRIPTOR' : _LISTSPACESRESPONSE,
+  '__module__' : 'collaborators.collaborators_pb2'
+  # @@protoc_insertion_point(class_scope:content.collaborators.ListSpacesResponse)
+  })
+_sym_db.RegisterMessage(ListSpacesResponse)
+
+
+DESCRIPTOR._options = None
+
+_COLLABORATORS = _descriptor.ServiceDescriptor(
+  name='Collaborators',
+  full_name='content.collaborators.Collaborators',
+  file=DESCRIPTOR,
+  index=0,
+  serialized_options=None,
+  create_key=_descriptor._internal_create_key,
+  serialized_start=596,
+  serialized_end=1056,
+  methods=[
+  _descriptor.MethodDescriptor(
+    name='Set',
+    full_name='content.collaborators.Collaborators.Set',
+    index=0,
+    containing_service=None,
+    input_type=_SETREQUEST,
+    output_type=google_dot_protobuf_dot_empty__pb2._EMPTY,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='Get',
+    full_name='content.collaborators.Collaborators.Get',
+    index=1,
+    containing_service=None,
+    input_type=_GETREQUEST,
+    output_type=_GETRESPONSE,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='Remove',
+    full_name='content.collaborators.Collaborators.Remove',
+    index=2,
+    containing_service=None,
+    input_type=_REMOVEREQUEST,
+    output_type=google_dot_protobuf_dot_empty__pb2._EMPTY,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='ListCollaborators',
+    full_name='content.collaborators.Collaborators.ListCollaborators',
+    index=3,
+    containing_service=None,
+    input_type=_LISTCOLLABORATORSREQUEST,
+    output_type=_LISTCOLLABORATORSRESPONSE,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='ListSpaces',
+    full_name='content.collaborators.Collaborators.ListSpaces',
+    index=4,
+    containing_service=None,
+    input_type=_LISTSPACESREQUEST,
+    output_type=_LISTSPACESRESPONSE,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+])
+_sym_db.RegisterServiceDescriptor(_COLLABORATORS)
+
+DESCRIPTOR.services_by_name['Collaborators'] = _COLLABORATORS
+
+# @@protoc_insertion_point(module_scope)
diff --git a/perxis/collaborators/collaborators_pb2_grpc.py b/perxis/collaborators/collaborators_pb2_grpc.py
new file mode 100644
index 0000000..b7f685c
--- /dev/null
+++ b/perxis/collaborators/collaborators_pb2_grpc.py
@@ -0,0 +1,199 @@
+# Generated by the gRPC Python protocol compiler plugin. DO NOT EDIT!
+"""Client and server classes corresponding to protobuf-defined services."""
+import grpc
+
+from collaborators import collaborators_pb2 as collaborators_dot_collaborators__pb2
+from google.protobuf import empty_pb2 as google_dot_protobuf_dot_empty__pb2
+
+
+class CollaboratorsStub(object):
+    """Missing associated documentation comment in .proto file."""
+
+    def __init__(self, channel):
+        """Constructor.
+
+        Args:
+            channel: A grpc.Channel.
+        """
+        self.Set = channel.unary_unary(
+                '/content.collaborators.Collaborators/Set',
+                request_serializer=collaborators_dot_collaborators__pb2.SetRequest.SerializeToString,
+                response_deserializer=google_dot_protobuf_dot_empty__pb2.Empty.FromString,
+                )
+        self.Get = channel.unary_unary(
+                '/content.collaborators.Collaborators/Get',
+                request_serializer=collaborators_dot_collaborators__pb2.GetRequest.SerializeToString,
+                response_deserializer=collaborators_dot_collaborators__pb2.GetResponse.FromString,
+                )
+        self.Remove = channel.unary_unary(
+                '/content.collaborators.Collaborators/Remove',
+                request_serializer=collaborators_dot_collaborators__pb2.RemoveRequest.SerializeToString,
+                response_deserializer=google_dot_protobuf_dot_empty__pb2.Empty.FromString,
+                )
+        self.ListCollaborators = channel.unary_unary(
+                '/content.collaborators.Collaborators/ListCollaborators',
+                request_serializer=collaborators_dot_collaborators__pb2.ListCollaboratorsRequest.SerializeToString,
+                response_deserializer=collaborators_dot_collaborators__pb2.ListCollaboratorsResponse.FromString,
+                )
+        self.ListSpaces = channel.unary_unary(
+                '/content.collaborators.Collaborators/ListSpaces',
+                request_serializer=collaborators_dot_collaborators__pb2.ListSpacesRequest.SerializeToString,
+                response_deserializer=collaborators_dot_collaborators__pb2.ListSpacesResponse.FromString,
+                )
+
+
+class CollaboratorsServicer(object):
+    """Missing associated documentation comment in .proto file."""
+
+    def Set(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        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."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def Remove(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def ListCollaborators(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def ListSpaces(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+
+def add_CollaboratorsServicer_to_server(servicer, server):
+    rpc_method_handlers = {
+            'Set': grpc.unary_unary_rpc_method_handler(
+                    servicer.Set,
+                    request_deserializer=collaborators_dot_collaborators__pb2.SetRequest.FromString,
+                    response_serializer=google_dot_protobuf_dot_empty__pb2.Empty.SerializeToString,
+            ),
+            'Get': grpc.unary_unary_rpc_method_handler(
+                    servicer.Get,
+                    request_deserializer=collaborators_dot_collaborators__pb2.GetRequest.FromString,
+                    response_serializer=collaborators_dot_collaborators__pb2.GetResponse.SerializeToString,
+            ),
+            'Remove': grpc.unary_unary_rpc_method_handler(
+                    servicer.Remove,
+                    request_deserializer=collaborators_dot_collaborators__pb2.RemoveRequest.FromString,
+                    response_serializer=google_dot_protobuf_dot_empty__pb2.Empty.SerializeToString,
+            ),
+            'ListCollaborators': grpc.unary_unary_rpc_method_handler(
+                    servicer.ListCollaborators,
+                    request_deserializer=collaborators_dot_collaborators__pb2.ListCollaboratorsRequest.FromString,
+                    response_serializer=collaborators_dot_collaborators__pb2.ListCollaboratorsResponse.SerializeToString,
+            ),
+            'ListSpaces': grpc.unary_unary_rpc_method_handler(
+                    servicer.ListSpaces,
+                    request_deserializer=collaborators_dot_collaborators__pb2.ListSpacesRequest.FromString,
+                    response_serializer=collaborators_dot_collaborators__pb2.ListSpacesResponse.SerializeToString,
+            ),
+    }
+    generic_handler = grpc.method_handlers_generic_handler(
+            'content.collaborators.Collaborators', rpc_method_handlers)
+    server.add_generic_rpc_handlers((generic_handler,))
+
+
+ # This class is part of an EXPERIMENTAL API.
+class Collaborators(object):
+    """Missing associated documentation comment in .proto file."""
+
+    @staticmethod
+    def Set(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/content.collaborators.Collaborators/Set',
+            collaborators_dot_collaborators__pb2.SetRequest.SerializeToString,
+            google_dot_protobuf_dot_empty__pb2.Empty.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def Get(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/content.collaborators.Collaborators/Get',
+            collaborators_dot_collaborators__pb2.GetRequest.SerializeToString,
+            collaborators_dot_collaborators__pb2.GetResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def Remove(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/content.collaborators.Collaborators/Remove',
+            collaborators_dot_collaborators__pb2.RemoveRequest.SerializeToString,
+            google_dot_protobuf_dot_empty__pb2.Empty.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def ListCollaborators(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/content.collaborators.Collaborators/ListCollaborators',
+            collaborators_dot_collaborators__pb2.ListCollaboratorsRequest.SerializeToString,
+            collaborators_dot_collaborators__pb2.ListCollaboratorsResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def ListSpaces(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/content.collaborators.Collaborators/ListSpaces',
+            collaborators_dot_collaborators__pb2.ListSpacesRequest.SerializeToString,
+            collaborators_dot_collaborators__pb2.ListSpacesResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
diff --git a/perxis/collections/__init__.py b/perxis/collections/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/perxis/collections/collections_pb2.py b/perxis/collections/collections_pb2.py
new file mode 100644
index 0000000..2cabc52
--- /dev/null
+++ b/perxis/collections/collections_pb2.py
@@ -0,0 +1,618 @@
+# -*- coding: utf-8 -*-
+# Generated by the protocol buffer compiler.  DO NOT EDIT!
+# source: collections/collections.proto
+"""Generated protocol buffer code."""
+from google.protobuf import descriptor as _descriptor
+from google.protobuf import message as _message
+from google.protobuf import reflection as _reflection
+from google.protobuf import symbol_database as _symbol_database
+# @@protoc_insertion_point(imports)
+
+_sym_db = _symbol_database.Default()
+
+
+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
+
+
+DESCRIPTOR = _descriptor.FileDescriptor(
+  name='collections/collections.proto',
+  package='content.collections',
+  syntax='proto3',
+  serialized_options=b'Z8github.com/perxteam/perxis/proto/collections;collections',
+  create_key=_descriptor._internal_create_key,
+  serialized_pb=b'\n\x1d\x63ollections/collections.proto\x12\x13\x63ontent.collections\x1a\x1bgoogle/protobuf/empty.proto\x1a\x1egoogle/protobuf/wrappers.proto\"x\n\nCollection\x12\n\n\x02id\x18\x01 \x01(\t\x12\x10\n\x08space_id\x18\x02 \x01(\t\x12\x0e\n\x06\x65nv_id\x18\x03 \x01(\t\x12\x0c\n\x04name\x18\x04 \x01(\t\x12\x0e\n\x06single\x18\x05 \x01(\x08\x12\x0e\n\x06system\x18\x06 \x01(\x08\x12\x0e\n\x06schema\x18\x07 \x01(\t\"\x86\x01\n\rCreateRequest\x12\x10\n\x08space_id\x18\x01 \x01(\t\x12\x0e\n\x06\x65nv_id\x18\x02 \x01(\t\x12\x15\n\rcollection_id\x18\x03 \x01(\t\x12\x0c\n\x04name\x18\x04 \x01(\t\x12\x0e\n\x06single\x18\x05 \x01(\x08\x12\x0e\n\x06system\x18\x06 \x01(\x08\x12\x0e\n\x06schema\x18\x07 \x01(\t\"E\n\x0e\x43reateResponse\x12\x33\n\ncollection\x18\x01 \x01(\x0b\x32\x1f.content.collections.Collection\"E\n\nGetRequest\x12\x10\n\x08space_id\x18\x01 \x01(\t\x12\x0e\n\x06\x65nv_id\x18\x02 \x01(\t\x12\x15\n\rcollection_id\x18\x03 \x01(\t\"B\n\x0bGetResponse\x12\x33\n\ncollection\x18\x01 \x01(\x0b\x32\x1f.content.collections.Collection\"/\n\x0bListRequest\x12\x10\n\x08space_id\x18\x01 \x01(\t\x12\x0e\n\x06\x65nv_id\x18\x02 \x01(\t\"D\n\x0cListResponse\x12\x34\n\x0b\x63ollections\x18\x01 \x03(\x0b\x32\x1f.content.collections.Collection\"\x92\x01\n\rUpdateRequest\x12\x10\n\x08space_id\x18\x01 \x01(\t\x12\x0e\n\x06\x65nv_id\x18\x02 \x01(\t\x12\x15\n\rcollection_id\x18\x03 \x01(\t\x12\x0c\n\x04name\x18\x04 \x01(\t\x12*\n\x06single\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.BoolValue\x12\x0e\n\x06schema\x18\x06 \x01(\t\"H\n\rDeleteRequest\x12\x10\n\x08space_id\x18\x01 \x01(\t\x12\x0e\n\x06\x65nv_id\x18\x02 \x01(\t\x12\x15\n\rcollection_id\x18\x03 \x01(\t2\x8d\x03\n\x0b\x43ollections\x12S\n\x06\x43reate\x12\".content.collections.CreateRequest\x1a#.content.collections.CreateResponse\"\x00\x12J\n\x03Get\x12\x1f.content.collections.GetRequest\x1a .content.collections.GetResponse\"\x00\x12M\n\x04List\x12 .content.collections.ListRequest\x1a!.content.collections.ListResponse\"\x00\x12\x46\n\x06Update\x12\".content.collections.UpdateRequest\x1a\x16.google.protobuf.Empty\"\x00\x12\x46\n\x06\x44\x65lete\x12\".content.collections.DeleteRequest\x1a\x16.google.protobuf.Empty\"\x00\x42:Z8github.com/perxteam/perxis/proto/collections;collectionsb\x06proto3'
+  ,
+  dependencies=[google_dot_protobuf_dot_empty__pb2.DESCRIPTOR,google_dot_protobuf_dot_wrappers__pb2.DESCRIPTOR,])
+
+
+
+
+_COLLECTION = _descriptor.Descriptor(
+  name='Collection',
+  full_name='content.collections.Collection',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='id', full_name='content.collections.Collection.id', index=0,
+      number=1, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='space_id', full_name='content.collections.Collection.space_id', index=1,
+      number=2, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='env_id', full_name='content.collections.Collection.env_id', index=2,
+      number=3, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='name', full_name='content.collections.Collection.name', index=3,
+      number=4, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='single', full_name='content.collections.Collection.single', index=4,
+      number=5, type=8, cpp_type=7, label=1,
+      has_default_value=False, default_value=False,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='system', full_name='content.collections.Collection.system', index=5,
+      number=6, type=8, cpp_type=7, label=1,
+      has_default_value=False, default_value=False,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='schema', full_name='content.collections.Collection.schema', index=6,
+      number=7, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=115,
+  serialized_end=235,
+)
+
+
+_CREATEREQUEST = _descriptor.Descriptor(
+  name='CreateRequest',
+  full_name='content.collections.CreateRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='space_id', full_name='content.collections.CreateRequest.space_id', index=0,
+      number=1, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='env_id', full_name='content.collections.CreateRequest.env_id', index=1,
+      number=2, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='collection_id', full_name='content.collections.CreateRequest.collection_id', index=2,
+      number=3, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='name', full_name='content.collections.CreateRequest.name', index=3,
+      number=4, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='single', full_name='content.collections.CreateRequest.single', index=4,
+      number=5, type=8, cpp_type=7, label=1,
+      has_default_value=False, default_value=False,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='system', full_name='content.collections.CreateRequest.system', index=5,
+      number=6, type=8, cpp_type=7, label=1,
+      has_default_value=False, default_value=False,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='schema', full_name='content.collections.CreateRequest.schema', index=6,
+      number=7, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=238,
+  serialized_end=372,
+)
+
+
+_CREATERESPONSE = _descriptor.Descriptor(
+  name='CreateResponse',
+  full_name='content.collections.CreateResponse',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='collection', full_name='content.collections.CreateResponse.collection', index=0,
+      number=1, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=374,
+  serialized_end=443,
+)
+
+
+_GETREQUEST = _descriptor.Descriptor(
+  name='GetRequest',
+  full_name='content.collections.GetRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='space_id', full_name='content.collections.GetRequest.space_id', index=0,
+      number=1, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='env_id', full_name='content.collections.GetRequest.env_id', index=1,
+      number=2, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='collection_id', full_name='content.collections.GetRequest.collection_id', index=2,
+      number=3, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=445,
+  serialized_end=514,
+)
+
+
+_GETRESPONSE = _descriptor.Descriptor(
+  name='GetResponse',
+  full_name='content.collections.GetResponse',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='collection', full_name='content.collections.GetResponse.collection', index=0,
+      number=1, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=516,
+  serialized_end=582,
+)
+
+
+_LISTREQUEST = _descriptor.Descriptor(
+  name='ListRequest',
+  full_name='content.collections.ListRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='space_id', full_name='content.collections.ListRequest.space_id', index=0,
+      number=1, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='env_id', full_name='content.collections.ListRequest.env_id', index=1,
+      number=2, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=584,
+  serialized_end=631,
+)
+
+
+_LISTRESPONSE = _descriptor.Descriptor(
+  name='ListResponse',
+  full_name='content.collections.ListResponse',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='collections', full_name='content.collections.ListResponse.collections', index=0,
+      number=1, type=11, cpp_type=10, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=633,
+  serialized_end=701,
+)
+
+
+_UPDATEREQUEST = _descriptor.Descriptor(
+  name='UpdateRequest',
+  full_name='content.collections.UpdateRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='space_id', full_name='content.collections.UpdateRequest.space_id', index=0,
+      number=1, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='env_id', full_name='content.collections.UpdateRequest.env_id', index=1,
+      number=2, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='collection_id', full_name='content.collections.UpdateRequest.collection_id', index=2,
+      number=3, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='name', full_name='content.collections.UpdateRequest.name', index=3,
+      number=4, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='single', full_name='content.collections.UpdateRequest.single', index=4,
+      number=5, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='schema', full_name='content.collections.UpdateRequest.schema', index=5,
+      number=6, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=704,
+  serialized_end=850,
+)
+
+
+_DELETEREQUEST = _descriptor.Descriptor(
+  name='DeleteRequest',
+  full_name='content.collections.DeleteRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='space_id', full_name='content.collections.DeleteRequest.space_id', index=0,
+      number=1, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='env_id', full_name='content.collections.DeleteRequest.env_id', index=1,
+      number=2, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='collection_id', full_name='content.collections.DeleteRequest.collection_id', index=2,
+      number=3, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=852,
+  serialized_end=924,
+)
+
+_CREATERESPONSE.fields_by_name['collection'].message_type = _COLLECTION
+_GETRESPONSE.fields_by_name['collection'].message_type = _COLLECTION
+_LISTRESPONSE.fields_by_name['collections'].message_type = _COLLECTION
+_UPDATEREQUEST.fields_by_name['single'].message_type = google_dot_protobuf_dot_wrappers__pb2._BOOLVALUE
+DESCRIPTOR.message_types_by_name['Collection'] = _COLLECTION
+DESCRIPTOR.message_types_by_name['CreateRequest'] = _CREATEREQUEST
+DESCRIPTOR.message_types_by_name['CreateResponse'] = _CREATERESPONSE
+DESCRIPTOR.message_types_by_name['GetRequest'] = _GETREQUEST
+DESCRIPTOR.message_types_by_name['GetResponse'] = _GETRESPONSE
+DESCRIPTOR.message_types_by_name['ListRequest'] = _LISTREQUEST
+DESCRIPTOR.message_types_by_name['ListResponse'] = _LISTRESPONSE
+DESCRIPTOR.message_types_by_name['UpdateRequest'] = _UPDATEREQUEST
+DESCRIPTOR.message_types_by_name['DeleteRequest'] = _DELETEREQUEST
+_sym_db.RegisterFileDescriptor(DESCRIPTOR)
+
+Collection = _reflection.GeneratedProtocolMessageType('Collection', (_message.Message,), {
+  'DESCRIPTOR' : _COLLECTION,
+  '__module__' : 'collections.collections_pb2'
+  # @@protoc_insertion_point(class_scope:content.collections.Collection)
+  })
+_sym_db.RegisterMessage(Collection)
+
+CreateRequest = _reflection.GeneratedProtocolMessageType('CreateRequest', (_message.Message,), {
+  'DESCRIPTOR' : _CREATEREQUEST,
+  '__module__' : 'collections.collections_pb2'
+  # @@protoc_insertion_point(class_scope:content.collections.CreateRequest)
+  })
+_sym_db.RegisterMessage(CreateRequest)
+
+CreateResponse = _reflection.GeneratedProtocolMessageType('CreateResponse', (_message.Message,), {
+  'DESCRIPTOR' : _CREATERESPONSE,
+  '__module__' : 'collections.collections_pb2'
+  # @@protoc_insertion_point(class_scope:content.collections.CreateResponse)
+  })
+_sym_db.RegisterMessage(CreateResponse)
+
+GetRequest = _reflection.GeneratedProtocolMessageType('GetRequest', (_message.Message,), {
+  'DESCRIPTOR' : _GETREQUEST,
+  '__module__' : 'collections.collections_pb2'
+  # @@protoc_insertion_point(class_scope:content.collections.GetRequest)
+  })
+_sym_db.RegisterMessage(GetRequest)
+
+GetResponse = _reflection.GeneratedProtocolMessageType('GetResponse', (_message.Message,), {
+  'DESCRIPTOR' : _GETRESPONSE,
+  '__module__' : 'collections.collections_pb2'
+  # @@protoc_insertion_point(class_scope:content.collections.GetResponse)
+  })
+_sym_db.RegisterMessage(GetResponse)
+
+ListRequest = _reflection.GeneratedProtocolMessageType('ListRequest', (_message.Message,), {
+  'DESCRIPTOR' : _LISTREQUEST,
+  '__module__' : 'collections.collections_pb2'
+  # @@protoc_insertion_point(class_scope:content.collections.ListRequest)
+  })
+_sym_db.RegisterMessage(ListRequest)
+
+ListResponse = _reflection.GeneratedProtocolMessageType('ListResponse', (_message.Message,), {
+  'DESCRIPTOR' : _LISTRESPONSE,
+  '__module__' : 'collections.collections_pb2'
+  # @@protoc_insertion_point(class_scope:content.collections.ListResponse)
+  })
+_sym_db.RegisterMessage(ListResponse)
+
+UpdateRequest = _reflection.GeneratedProtocolMessageType('UpdateRequest', (_message.Message,), {
+  'DESCRIPTOR' : _UPDATEREQUEST,
+  '__module__' : 'collections.collections_pb2'
+  # @@protoc_insertion_point(class_scope:content.collections.UpdateRequest)
+  })
+_sym_db.RegisterMessage(UpdateRequest)
+
+DeleteRequest = _reflection.GeneratedProtocolMessageType('DeleteRequest', (_message.Message,), {
+  'DESCRIPTOR' : _DELETEREQUEST,
+  '__module__' : 'collections.collections_pb2'
+  # @@protoc_insertion_point(class_scope:content.collections.DeleteRequest)
+  })
+_sym_db.RegisterMessage(DeleteRequest)
+
+
+DESCRIPTOR._options = None
+
+_COLLECTIONS = _descriptor.ServiceDescriptor(
+  name='Collections',
+  full_name='content.collections.Collections',
+  file=DESCRIPTOR,
+  index=0,
+  serialized_options=None,
+  create_key=_descriptor._internal_create_key,
+  serialized_start=927,
+  serialized_end=1324,
+  methods=[
+  _descriptor.MethodDescriptor(
+    name='Create',
+    full_name='content.collections.Collections.Create',
+    index=0,
+    containing_service=None,
+    input_type=_CREATEREQUEST,
+    output_type=_CREATERESPONSE,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='Get',
+    full_name='content.collections.Collections.Get',
+    index=1,
+    containing_service=None,
+    input_type=_GETREQUEST,
+    output_type=_GETRESPONSE,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='List',
+    full_name='content.collections.Collections.List',
+    index=2,
+    containing_service=None,
+    input_type=_LISTREQUEST,
+    output_type=_LISTRESPONSE,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='Update',
+    full_name='content.collections.Collections.Update',
+    index=3,
+    containing_service=None,
+    input_type=_UPDATEREQUEST,
+    output_type=google_dot_protobuf_dot_empty__pb2._EMPTY,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='Delete',
+    full_name='content.collections.Collections.Delete',
+    index=4,
+    containing_service=None,
+    input_type=_DELETEREQUEST,
+    output_type=google_dot_protobuf_dot_empty__pb2._EMPTY,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+])
+_sym_db.RegisterServiceDescriptor(_COLLECTIONS)
+
+DESCRIPTOR.services_by_name['Collections'] = _COLLECTIONS
+
+# @@protoc_insertion_point(module_scope)
diff --git a/perxis/collections/collections_pb2_grpc.py b/perxis/collections/collections_pb2_grpc.py
new file mode 100644
index 0000000..d8ebb26
--- /dev/null
+++ b/perxis/collections/collections_pb2_grpc.py
@@ -0,0 +1,199 @@
+# Generated by the gRPC Python protocol compiler plugin. DO NOT EDIT!
+"""Client and server classes corresponding to protobuf-defined services."""
+import grpc
+
+from collections import collections_pb2 as collections_dot_collections__pb2
+from google.protobuf import empty_pb2 as google_dot_protobuf_dot_empty__pb2
+
+
+class CollectionsStub(object):
+    """Missing associated documentation comment in .proto file."""
+
+    def __init__(self, channel):
+        """Constructor.
+
+        Args:
+            channel: A grpc.Channel.
+        """
+        self.Create = channel.unary_unary(
+                '/content.collections.Collections/Create',
+                request_serializer=collections_dot_collections__pb2.CreateRequest.SerializeToString,
+                response_deserializer=collections_dot_collections__pb2.CreateResponse.FromString,
+                )
+        self.Get = channel.unary_unary(
+                '/content.collections.Collections/Get',
+                request_serializer=collections_dot_collections__pb2.GetRequest.SerializeToString,
+                response_deserializer=collections_dot_collections__pb2.GetResponse.FromString,
+                )
+        self.List = channel.unary_unary(
+                '/content.collections.Collections/List',
+                request_serializer=collections_dot_collections__pb2.ListRequest.SerializeToString,
+                response_deserializer=collections_dot_collections__pb2.ListResponse.FromString,
+                )
+        self.Update = channel.unary_unary(
+                '/content.collections.Collections/Update',
+                request_serializer=collections_dot_collections__pb2.UpdateRequest.SerializeToString,
+                response_deserializer=google_dot_protobuf_dot_empty__pb2.Empty.FromString,
+                )
+        self.Delete = channel.unary_unary(
+                '/content.collections.Collections/Delete',
+                request_serializer=collections_dot_collections__pb2.DeleteRequest.SerializeToString,
+                response_deserializer=google_dot_protobuf_dot_empty__pb2.Empty.FromString,
+                )
+
+
+class CollectionsServicer(object):
+    """Missing associated documentation comment in .proto file."""
+
+    def Create(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        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."""
+        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."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def Update(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        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."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+
+def add_CollectionsServicer_to_server(servicer, server):
+    rpc_method_handlers = {
+            'Create': grpc.unary_unary_rpc_method_handler(
+                    servicer.Create,
+                    request_deserializer=collections_dot_collections__pb2.CreateRequest.FromString,
+                    response_serializer=collections_dot_collections__pb2.CreateResponse.SerializeToString,
+            ),
+            'Get': grpc.unary_unary_rpc_method_handler(
+                    servicer.Get,
+                    request_deserializer=collections_dot_collections__pb2.GetRequest.FromString,
+                    response_serializer=collections_dot_collections__pb2.GetResponse.SerializeToString,
+            ),
+            'List': grpc.unary_unary_rpc_method_handler(
+                    servicer.List,
+                    request_deserializer=collections_dot_collections__pb2.ListRequest.FromString,
+                    response_serializer=collections_dot_collections__pb2.ListResponse.SerializeToString,
+            ),
+            'Update': grpc.unary_unary_rpc_method_handler(
+                    servicer.Update,
+                    request_deserializer=collections_dot_collections__pb2.UpdateRequest.FromString,
+                    response_serializer=google_dot_protobuf_dot_empty__pb2.Empty.SerializeToString,
+            ),
+            'Delete': grpc.unary_unary_rpc_method_handler(
+                    servicer.Delete,
+                    request_deserializer=collections_dot_collections__pb2.DeleteRequest.FromString,
+                    response_serializer=google_dot_protobuf_dot_empty__pb2.Empty.SerializeToString,
+            ),
+    }
+    generic_handler = grpc.method_handlers_generic_handler(
+            'content.collections.Collections', rpc_method_handlers)
+    server.add_generic_rpc_handlers((generic_handler,))
+
+
+ # This class is part of an EXPERIMENTAL API.
+class Collections(object):
+    """Missing associated documentation comment in .proto file."""
+
+    @staticmethod
+    def Create(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/content.collections.Collections/Create',
+            collections_dot_collections__pb2.CreateRequest.SerializeToString,
+            collections_dot_collections__pb2.CreateResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def Get(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/content.collections.Collections/Get',
+            collections_dot_collections__pb2.GetRequest.SerializeToString,
+            collections_dot_collections__pb2.GetResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def List(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/content.collections.Collections/List',
+            collections_dot_collections__pb2.ListRequest.SerializeToString,
+            collections_dot_collections__pb2.ListResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def Update(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/content.collections.Collections/Update',
+            collections_dot_collections__pb2.UpdateRequest.SerializeToString,
+            google_dot_protobuf_dot_empty__pb2.Empty.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def Delete(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/content.collections.Collections/Delete',
+            collections_dot_collections__pb2.DeleteRequest.SerializeToString,
+            google_dot_protobuf_dot_empty__pb2.Empty.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
diff --git a/perxis/common/__init__.py b/perxis/common/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/perxis/common/common_pb2.py b/perxis/common/common_pb2.py
new file mode 100644
index 0000000..c3ba47f
--- /dev/null
+++ b/perxis/common/common_pb2.py
@@ -0,0 +1,1378 @@
+# -*- coding: utf-8 -*-
+# Generated by the protocol buffer compiler.  DO NOT EDIT!
+# source: common/common.proto
+"""Generated protocol buffer code."""
+from google.protobuf.internal import enum_type_wrapper
+from google.protobuf import descriptor as _descriptor
+from google.protobuf import message as _message
+from google.protobuf import reflection as _reflection
+from google.protobuf import symbol_database as _symbol_database
+# @@protoc_insertion_point(imports)
+
+_sym_db = _symbol_database.Default()
+
+
+from google.protobuf import timestamp_pb2 as google_dot_protobuf_dot_timestamp__pb2
+from google.protobuf import struct_pb2 as google_dot_protobuf_dot_struct__pb2
+from google.protobuf import wrappers_pb2 as google_dot_protobuf_dot_wrappers__pb2
+
+
+DESCRIPTOR = _descriptor.FileDescriptor(
+  name='common/common.proto',
+  package='common',
+  syntax='proto3',
+  serialized_options=b'Z.github.com/perxteam/perxis/proto/common;common',
+  create_key=_descriptor._internal_create_key,
+  serialized_pb=b'\n\x13\x63ommon/common.proto\x12\x06\x63ommon\x1a\x1fgoogle/protobuf/timestamp.proto\x1a\x1cgoogle/protobuf/struct.proto\x1a\x1egoogle/protobuf/wrappers.proto\"\xb1\x01\n\x04User\x12\n\n\x02id\x18\x01 \x01(\t\x12\x0c\n\x04name\x18\x02 \x01(\t\x12\x12\n\nidentities\x18\x03 \x03(\t\x12\x14\n\x0c\x64isplay_name\x18\x04 \x01(\t\x12\r\n\x05\x65mail\x18\x05 \x01(\t\x12\x16\n\x0e\x65mail_verified\x18\x06 \x01(\x08\x12\x12\n\navatar_uri\x18\x07 \x01(\t\x12*\n\x06system\x18\n \x01(\x0b\x32\x1a.google.protobuf.BoolValue\"O\n\x0cOrganization\x12\n\n\x02id\x18\x01 \x01(\t\x12\x0c\n\x04name\x18\x02 \x01(\t\x12\x13\n\x0b\x64\x65scription\x18\x03 \x01(\t\x12\x10\n\x08logo_uri\x18\x05 \x01(\t\"j\n\x16OrganizationMembership\x12\n\n\x02id\x18\x01 \x01(\t\x12\x17\n\x0forganization_id\x18\x02 \x01(\t\x12\x0f\n\x07user_id\x18\x03 \x01(\t\x12\x1a\n\x04role\x18\x04 \x01(\x0e\x32\x0c.common.Role\"\xac\x02\n\x0fSpaceInvitation\x12\n\n\x02id\x18\x01 \x01(\t\x12\r\n\x05\x65mail\x18\x02 \x01(\t\x12\x17\n\x0forganization_id\x18\x03 \x01(\t\x12\x10\n\x08space_id\x18\x04 \x01(\t\x12\x12\n\ncreated_by\x18\x05 \x01(\t\x12\x12\n\nspace_role\x18\x06 \x01(\t\x12\x0c\n\x04sent\x18\x07 \x01(\x08\x12\x0f\n\x07pending\x18\x08 \x01(\x08\x12.\n\ncreated_at\x18\t \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12+\n\x07sent_at\x18\n \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12/\n\x0bvalid_until\x18\x0b \x01(\x0b\x32\x1a.google.protobuf.Timestamp\"n\n\x05Space\x12\n\n\x02id\x18\x01 \x01(\t\x12\x17\n\x0forganization_id\x18\x02 \x01(\t\x12\x0c\n\x04name\x18\x03 \x01(\t\x12\x13\n\x0b\x64\x65scription\x18\x04 \x01(\t\x12\x0c\n\x04host\x18\x05 \x01(\t\x12\x0f\n\x07\x61pi_url\x18\x06 \x01(\t\"\xe4\x01\n\nCollection\x12\n\n\x02id\x18\x01 \x01(\t\x12\x10\n\x08space_id\x18\x02 \x01(\t\x12\x16\n\x0e\x65nvironment_id\x18\x03 \x01(\t\x12\x0c\n\x04name\x18\x04 \x01(\t\x12\x0e\n\x06schema\x18\x05 \x01(\t\x12*\n\x06single\x18\x06 \x01(\x0b\x32\x1a.google.protobuf.BoolValue\x12*\n\x06hidden\x18\x07 \x01(\x0b\x32\x1a.google.protobuf.BoolValue\x12*\n\x06system\x18\x08 \x01(\x0b\x32\x1a.google.protobuf.BoolValue\"\xf5\x03\n\x04Item\x12\n\n\x02id\x18\x01 \x01(\t\x12\x10\n\x08space_id\x18\x02 \x01(\t\x12\x16\n\x0e\x65nvironment_id\x18\x03 \x01(\t\x12\x15\n\rcollection_id\x18\x04 \x01(\t\x12\x0e\n\x06status\x18\x05 \x01(\t\x12.\n\ncreated_at\x18\x06 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x12\n\ncreated_by\x18\x07 \x01(\t\x12%\n\x04\x64\x61ta\x18\x08 \x01(\x0b\x32\x17.google.protobuf.Struct\x12\x34\n\x0ctranslations\x18\t \x03(\x0b\x32\x1e.common.Item.TranslationsEntry\x12\x13\n\x0brevision_id\x18\n \x01(\t\x12\x30\n\x0cpublished_at\x18\x0b \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x14\n\x0cpublished_by\x18\x0c \x01(\t\x12/\n\x0b\x61rchived_at\x18\r \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x13\n\x0b\x61rchived_by\x18\x0e \x01(\t\x1aL\n\x11TranslationsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12&\n\x05value\x18\x02 \x01(\x0b\x32\x17.google.protobuf.Struct:\x02\x38\x01\"\xa7\x01\n\x10\x46indItemsOptions\x12\x10\n\x08space_id\x18\x01 \x01(\t\x12\x16\n\x0e\x65nvironment_id\x18\x02 \x01(\t\x12\x15\n\rcollection_id\x18\x03 \x01(\t\x12\x1f\n\x07\x66ilters\x18\x04 \x03(\x0b\x32\x0e.common.Filter\x12\x10\n\x08page_num\x18\x08 \x01(\x05\x12\x11\n\tpage_size\x18\t \x01(\x05\x12\x0c\n\x04sort\x18\n \x03(\t\"\xb5\x01\n\x0b\x45nvironment\x12\n\n\x02id\x18\x01 \x01(\t\x12\x10\n\x08space_id\x18\x02 \x01(\t\x12\x13\n\x0b\x64\x65scription\x18\x03 \x01(\t\x12(\n\x05state\x18\x04 \x01(\x0e\x32\x19.common.Environment.State\x12\x0f\n\x07\x61liases\x18\x05 \x03(\t\"8\n\x05State\x12\x0b\n\x07UNKNOWN\x10\x00\x12\x0b\n\x07PENDING\x10\x01\x12\t\n\x05READY\x10\x02\x12\n\n\x06\x46\x41ILED\x10\x03\"4\n\x06Locale\x12\n\n\x02id\x18\x01 \x01(\t\x12\x0c\n\x04name\x18\x02 \x01(\t\x12\x10\n\x08space_id\x18\x03 \x01(\t\"x\n\tSpaceRole\x12\n\n\x02id\x18\x01 \x01(\t\x12\x0c\n\x04name\x18\x02 \x01(\t\x12\x10\n\x08space_id\x18\x03 \x01(\t\x12\x13\n\x0b\x64\x65scription\x18\x05 \x01(\t\x12*\n\rcontent_rules\x18\x06 \x03(\x0b\x32\x13.common.ContentRule\"\xfd\x01\n\x0b\x43ontentRule\x12\n\n\x02id\x18\x01 \x01(\t\x12\x15\n\rcollection_id\x18\x02 \x01(\t\x12\"\n\x06\x63reate\x18\x05 \x01(\x0e\x32\x12.common.ItemAccess\x12 \n\x04read\x18\x06 \x01(\x0e\x32\x12.common.ItemAccess\x12\"\n\x06update\x18\x07 \x01(\x0e\x32\x12.common.ItemAccess\x12\"\n\x06\x64\x65lete\x18\x08 \x01(\x0e\x32\x12.common.ItemAccess\x12\x1d\n\x15\x66ields_read_blacklist\x18\n \x03(\t\x12\x1e\n\x16\x66ields_write_blacklist\x18\x0b \x03(\t\"J\n\x06\x46ilter\x12\n\n\x02op\x18\x01 \x01(\t\x12\r\n\x05\x66ield\x18\x02 \x01(\t\x12%\n\x05value\x18\x03 \x01(\x0b\x32\x16.google.protobuf.Value\"N\n\x04\x46ile\x12\n\n\x02id\x18\x01 \x01(\t\x12\x0c\n\x04name\x18\x02 \x01(\t\x12\x0c\n\x04size\x18\x03 \x01(\x05\x12\x11\n\tmime_type\x18\x04 \x01(\t\x12\x0b\n\x03url\x18\x05 \x01(\t\"@\n\x0b\x46indOptions\x12\x0c\n\x04sort\x18\x01 \x03(\t\x12\x10\n\x08page_num\x18\x02 \x01(\x05\x12\x11\n\tpage_size\x18\x03 \x01(\x05*8\n\x04Role\x12\x0e\n\nNOT_MEMBER\x10\x00\x12\n\n\x06MEMBER\x10\x01\x12\t\n\x05OWNER\x10\x02\x12\t\n\x05\x41\x44MIN\x10\x03*3\n\nItemAccess\x12\x08\n\x04NONE\x10\x00\x12\x07\n\x03\x41NY\x10\x01\x12\x08\n\x04MINE\x10\x02\x12\x08\n\x04ROLE\x10\x03\x42\x30Z.github.com/perxteam/perxis/proto/common;commonb\x06proto3'
+  ,
+  dependencies=[google_dot_protobuf_dot_timestamp__pb2.DESCRIPTOR,google_dot_protobuf_dot_struct__pb2.DESCRIPTOR,google_dot_protobuf_dot_wrappers__pb2.DESCRIPTOR,])
+
+_ROLE = _descriptor.EnumDescriptor(
+  name='Role',
+  full_name='common.Role',
+  filename=None,
+  file=DESCRIPTOR,
+  create_key=_descriptor._internal_create_key,
+  values=[
+    _descriptor.EnumValueDescriptor(
+      name='NOT_MEMBER', index=0, number=0,
+      serialized_options=None,
+      type=None,
+      create_key=_descriptor._internal_create_key),
+    _descriptor.EnumValueDescriptor(
+      name='MEMBER', index=1, number=1,
+      serialized_options=None,
+      type=None,
+      create_key=_descriptor._internal_create_key),
+    _descriptor.EnumValueDescriptor(
+      name='OWNER', index=2, number=2,
+      serialized_options=None,
+      type=None,
+      create_key=_descriptor._internal_create_key),
+    _descriptor.EnumValueDescriptor(
+      name='ADMIN', index=3, number=3,
+      serialized_options=None,
+      type=None,
+      create_key=_descriptor._internal_create_key),
+  ],
+  containing_type=None,
+  serialized_options=None,
+  serialized_start=2653,
+  serialized_end=2709,
+)
+_sym_db.RegisterEnumDescriptor(_ROLE)
+
+Role = enum_type_wrapper.EnumTypeWrapper(_ROLE)
+_ITEMACCESS = _descriptor.EnumDescriptor(
+  name='ItemAccess',
+  full_name='common.ItemAccess',
+  filename=None,
+  file=DESCRIPTOR,
+  create_key=_descriptor._internal_create_key,
+  values=[
+    _descriptor.EnumValueDescriptor(
+      name='NONE', index=0, number=0,
+      serialized_options=None,
+      type=None,
+      create_key=_descriptor._internal_create_key),
+    _descriptor.EnumValueDescriptor(
+      name='ANY', index=1, number=1,
+      serialized_options=None,
+      type=None,
+      create_key=_descriptor._internal_create_key),
+    _descriptor.EnumValueDescriptor(
+      name='MINE', index=2, number=2,
+      serialized_options=None,
+      type=None,
+      create_key=_descriptor._internal_create_key),
+    _descriptor.EnumValueDescriptor(
+      name='ROLE', index=3, number=3,
+      serialized_options=None,
+      type=None,
+      create_key=_descriptor._internal_create_key),
+  ],
+  containing_type=None,
+  serialized_options=None,
+  serialized_start=2711,
+  serialized_end=2762,
+)
+_sym_db.RegisterEnumDescriptor(_ITEMACCESS)
+
+ItemAccess = enum_type_wrapper.EnumTypeWrapper(_ITEMACCESS)
+NOT_MEMBER = 0
+MEMBER = 1
+OWNER = 2
+ADMIN = 3
+NONE = 0
+ANY = 1
+MINE = 2
+ROLE = 3
+
+
+_ENVIRONMENT_STATE = _descriptor.EnumDescriptor(
+  name='State',
+  full_name='common.Environment.State',
+  filename=None,
+  file=DESCRIPTOR,
+  create_key=_descriptor._internal_create_key,
+  values=[
+    _descriptor.EnumValueDescriptor(
+      name='UNKNOWN', index=0, number=0,
+      serialized_options=None,
+      type=None,
+      create_key=_descriptor._internal_create_key),
+    _descriptor.EnumValueDescriptor(
+      name='PENDING', index=1, number=1,
+      serialized_options=None,
+      type=None,
+      create_key=_descriptor._internal_create_key),
+    _descriptor.EnumValueDescriptor(
+      name='READY', index=2, number=2,
+      serialized_options=None,
+      type=None,
+      create_key=_descriptor._internal_create_key),
+    _descriptor.EnumValueDescriptor(
+      name='FAILED', index=3, number=3,
+      serialized_options=None,
+      type=None,
+      create_key=_descriptor._internal_create_key),
+  ],
+  containing_type=None,
+  serialized_options=None,
+  serialized_start=1941,
+  serialized_end=1997,
+)
+_sym_db.RegisterEnumDescriptor(_ENVIRONMENT_STATE)
+
+
+_USER = _descriptor.Descriptor(
+  name='User',
+  full_name='common.User',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='id', full_name='common.User.id', index=0,
+      number=1, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='name', full_name='common.User.name', index=1,
+      number=2, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='identities', full_name='common.User.identities', index=2,
+      number=3, type=9, cpp_type=9, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='display_name', full_name='common.User.display_name', index=3,
+      number=4, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='email', full_name='common.User.email', index=4,
+      number=5, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='email_verified', full_name='common.User.email_verified', index=5,
+      number=6, type=8, cpp_type=7, label=1,
+      has_default_value=False, default_value=False,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='avatar_uri', full_name='common.User.avatar_uri', index=6,
+      number=7, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='system', full_name='common.User.system', index=7,
+      number=10, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=127,
+  serialized_end=304,
+)
+
+
+_ORGANIZATION = _descriptor.Descriptor(
+  name='Organization',
+  full_name='common.Organization',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='id', full_name='common.Organization.id', index=0,
+      number=1, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='name', full_name='common.Organization.name', index=1,
+      number=2, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='description', full_name='common.Organization.description', index=2,
+      number=3, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='logo_uri', full_name='common.Organization.logo_uri', index=3,
+      number=5, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=306,
+  serialized_end=385,
+)
+
+
+_ORGANIZATIONMEMBERSHIP = _descriptor.Descriptor(
+  name='OrganizationMembership',
+  full_name='common.OrganizationMembership',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='id', full_name='common.OrganizationMembership.id', index=0,
+      number=1, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='organization_id', full_name='common.OrganizationMembership.organization_id', index=1,
+      number=2, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='user_id', full_name='common.OrganizationMembership.user_id', index=2,
+      number=3, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='role', full_name='common.OrganizationMembership.role', index=3,
+      number=4, type=14, cpp_type=8, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=387,
+  serialized_end=493,
+)
+
+
+_SPACEINVITATION = _descriptor.Descriptor(
+  name='SpaceInvitation',
+  full_name='common.SpaceInvitation',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='id', full_name='common.SpaceInvitation.id', index=0,
+      number=1, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='email', full_name='common.SpaceInvitation.email', index=1,
+      number=2, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='organization_id', full_name='common.SpaceInvitation.organization_id', index=2,
+      number=3, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='space_id', full_name='common.SpaceInvitation.space_id', index=3,
+      number=4, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='created_by', full_name='common.SpaceInvitation.created_by', index=4,
+      number=5, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='space_role', full_name='common.SpaceInvitation.space_role', index=5,
+      number=6, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='sent', full_name='common.SpaceInvitation.sent', index=6,
+      number=7, type=8, cpp_type=7, label=1,
+      has_default_value=False, default_value=False,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='pending', full_name='common.SpaceInvitation.pending', index=7,
+      number=8, type=8, cpp_type=7, label=1,
+      has_default_value=False, default_value=False,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='created_at', full_name='common.SpaceInvitation.created_at', index=8,
+      number=9, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='sent_at', full_name='common.SpaceInvitation.sent_at', index=9,
+      number=10, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='valid_until', full_name='common.SpaceInvitation.valid_until', index=10,
+      number=11, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=496,
+  serialized_end=796,
+)
+
+
+_SPACE = _descriptor.Descriptor(
+  name='Space',
+  full_name='common.Space',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='id', full_name='common.Space.id', index=0,
+      number=1, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='organization_id', full_name='common.Space.organization_id', index=1,
+      number=2, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='name', full_name='common.Space.name', index=2,
+      number=3, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='description', full_name='common.Space.description', index=3,
+      number=4, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='host', full_name='common.Space.host', index=4,
+      number=5, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='api_url', full_name='common.Space.api_url', index=5,
+      number=6, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=798,
+  serialized_end=908,
+)
+
+
+_COLLECTION = _descriptor.Descriptor(
+  name='Collection',
+  full_name='common.Collection',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='id', full_name='common.Collection.id', index=0,
+      number=1, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='space_id', full_name='common.Collection.space_id', index=1,
+      number=2, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='environment_id', full_name='common.Collection.environment_id', index=2,
+      number=3, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='name', full_name='common.Collection.name', index=3,
+      number=4, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='schema', full_name='common.Collection.schema', index=4,
+      number=5, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='single', full_name='common.Collection.single', index=5,
+      number=6, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='hidden', full_name='common.Collection.hidden', index=6,
+      number=7, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='system', full_name='common.Collection.system', index=7,
+      number=8, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=911,
+  serialized_end=1139,
+)
+
+
+_ITEM_TRANSLATIONSENTRY = _descriptor.Descriptor(
+  name='TranslationsEntry',
+  full_name='common.Item.TranslationsEntry',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='key', full_name='common.Item.TranslationsEntry.key', index=0,
+      number=1, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='value', full_name='common.Item.TranslationsEntry.value', index=1,
+      number=2, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=b'8\001',
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=1567,
+  serialized_end=1643,
+)
+
+_ITEM = _descriptor.Descriptor(
+  name='Item',
+  full_name='common.Item',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='id', full_name='common.Item.id', index=0,
+      number=1, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='space_id', full_name='common.Item.space_id', index=1,
+      number=2, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='environment_id', full_name='common.Item.environment_id', index=2,
+      number=3, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='collection_id', full_name='common.Item.collection_id', index=3,
+      number=4, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='status', full_name='common.Item.status', index=4,
+      number=5, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='created_at', full_name='common.Item.created_at', index=5,
+      number=6, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='created_by', full_name='common.Item.created_by', index=6,
+      number=7, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='data', full_name='common.Item.data', index=7,
+      number=8, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='translations', full_name='common.Item.translations', index=8,
+      number=9, type=11, cpp_type=10, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='revision_id', full_name='common.Item.revision_id', index=9,
+      number=10, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='published_at', full_name='common.Item.published_at', index=10,
+      number=11, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='published_by', full_name='common.Item.published_by', index=11,
+      number=12, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='archived_at', full_name='common.Item.archived_at', index=12,
+      number=13, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='archived_by', full_name='common.Item.archived_by', index=13,
+      number=14, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[_ITEM_TRANSLATIONSENTRY, ],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=1142,
+  serialized_end=1643,
+)
+
+
+_FINDITEMSOPTIONS = _descriptor.Descriptor(
+  name='FindItemsOptions',
+  full_name='common.FindItemsOptions',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='space_id', full_name='common.FindItemsOptions.space_id', index=0,
+      number=1, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='environment_id', full_name='common.FindItemsOptions.environment_id', index=1,
+      number=2, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='collection_id', full_name='common.FindItemsOptions.collection_id', index=2,
+      number=3, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='filters', full_name='common.FindItemsOptions.filters', index=3,
+      number=4, type=11, cpp_type=10, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='page_num', full_name='common.FindItemsOptions.page_num', index=4,
+      number=8, type=5, cpp_type=1, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='page_size', full_name='common.FindItemsOptions.page_size', index=5,
+      number=9, type=5, cpp_type=1, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='sort', full_name='common.FindItemsOptions.sort', index=6,
+      number=10, type=9, cpp_type=9, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=1646,
+  serialized_end=1813,
+)
+
+
+_ENVIRONMENT = _descriptor.Descriptor(
+  name='Environment',
+  full_name='common.Environment',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='id', full_name='common.Environment.id', index=0,
+      number=1, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='space_id', full_name='common.Environment.space_id', index=1,
+      number=2, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='description', full_name='common.Environment.description', index=2,
+      number=3, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='state', full_name='common.Environment.state', index=3,
+      number=4, type=14, cpp_type=8, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='aliases', full_name='common.Environment.aliases', index=4,
+      number=5, type=9, cpp_type=9, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+    _ENVIRONMENT_STATE,
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=1816,
+  serialized_end=1997,
+)
+
+
+_LOCALE = _descriptor.Descriptor(
+  name='Locale',
+  full_name='common.Locale',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='id', full_name='common.Locale.id', index=0,
+      number=1, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='name', full_name='common.Locale.name', index=1,
+      number=2, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='space_id', full_name='common.Locale.space_id', index=2,
+      number=3, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=1999,
+  serialized_end=2051,
+)
+
+
+_SPACEROLE = _descriptor.Descriptor(
+  name='SpaceRole',
+  full_name='common.SpaceRole',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='id', full_name='common.SpaceRole.id', index=0,
+      number=1, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='name', full_name='common.SpaceRole.name', index=1,
+      number=2, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='space_id', full_name='common.SpaceRole.space_id', index=2,
+      number=3, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='description', full_name='common.SpaceRole.description', index=3,
+      number=5, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='content_rules', full_name='common.SpaceRole.content_rules', index=4,
+      number=6, type=11, cpp_type=10, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=2053,
+  serialized_end=2173,
+)
+
+
+_CONTENTRULE = _descriptor.Descriptor(
+  name='ContentRule',
+  full_name='common.ContentRule',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='id', full_name='common.ContentRule.id', index=0,
+      number=1, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='collection_id', full_name='common.ContentRule.collection_id', index=1,
+      number=2, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='create', full_name='common.ContentRule.create', index=2,
+      number=5, type=14, cpp_type=8, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='read', full_name='common.ContentRule.read', index=3,
+      number=6, type=14, cpp_type=8, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='update', full_name='common.ContentRule.update', index=4,
+      number=7, type=14, cpp_type=8, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='delete', full_name='common.ContentRule.delete', index=5,
+      number=8, type=14, cpp_type=8, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='fields_read_blacklist', full_name='common.ContentRule.fields_read_blacklist', index=6,
+      number=10, type=9, cpp_type=9, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='fields_write_blacklist', full_name='common.ContentRule.fields_write_blacklist', index=7,
+      number=11, type=9, cpp_type=9, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=2176,
+  serialized_end=2429,
+)
+
+
+_FILTER = _descriptor.Descriptor(
+  name='Filter',
+  full_name='common.Filter',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='op', full_name='common.Filter.op', index=0,
+      number=1, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='field', full_name='common.Filter.field', index=1,
+      number=2, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='value', full_name='common.Filter.value', index=2,
+      number=3, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=2431,
+  serialized_end=2505,
+)
+
+
+_FILE = _descriptor.Descriptor(
+  name='File',
+  full_name='common.File',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='id', full_name='common.File.id', index=0,
+      number=1, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='name', full_name='common.File.name', index=1,
+      number=2, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='size', full_name='common.File.size', index=2,
+      number=3, type=5, cpp_type=1, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='mime_type', full_name='common.File.mime_type', index=3,
+      number=4, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='url', full_name='common.File.url', index=4,
+      number=5, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=2507,
+  serialized_end=2585,
+)
+
+
+_FINDOPTIONS = _descriptor.Descriptor(
+  name='FindOptions',
+  full_name='common.FindOptions',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='sort', full_name='common.FindOptions.sort', index=0,
+      number=1, type=9, cpp_type=9, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='page_num', full_name='common.FindOptions.page_num', index=1,
+      number=2, type=5, cpp_type=1, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='page_size', full_name='common.FindOptions.page_size', index=2,
+      number=3, type=5, cpp_type=1, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=2587,
+  serialized_end=2651,
+)
+
+_USER.fields_by_name['system'].message_type = google_dot_protobuf_dot_wrappers__pb2._BOOLVALUE
+_ORGANIZATIONMEMBERSHIP.fields_by_name['role'].enum_type = _ROLE
+_SPACEINVITATION.fields_by_name['created_at'].message_type = google_dot_protobuf_dot_timestamp__pb2._TIMESTAMP
+_SPACEINVITATION.fields_by_name['sent_at'].message_type = google_dot_protobuf_dot_timestamp__pb2._TIMESTAMP
+_SPACEINVITATION.fields_by_name['valid_until'].message_type = google_dot_protobuf_dot_timestamp__pb2._TIMESTAMP
+_COLLECTION.fields_by_name['single'].message_type = google_dot_protobuf_dot_wrappers__pb2._BOOLVALUE
+_COLLECTION.fields_by_name['hidden'].message_type = google_dot_protobuf_dot_wrappers__pb2._BOOLVALUE
+_COLLECTION.fields_by_name['system'].message_type = google_dot_protobuf_dot_wrappers__pb2._BOOLVALUE
+_ITEM_TRANSLATIONSENTRY.fields_by_name['value'].message_type = google_dot_protobuf_dot_struct__pb2._STRUCT
+_ITEM_TRANSLATIONSENTRY.containing_type = _ITEM
+_ITEM.fields_by_name['created_at'].message_type = google_dot_protobuf_dot_timestamp__pb2._TIMESTAMP
+_ITEM.fields_by_name['data'].message_type = google_dot_protobuf_dot_struct__pb2._STRUCT
+_ITEM.fields_by_name['translations'].message_type = _ITEM_TRANSLATIONSENTRY
+_ITEM.fields_by_name['published_at'].message_type = google_dot_protobuf_dot_timestamp__pb2._TIMESTAMP
+_ITEM.fields_by_name['archived_at'].message_type = google_dot_protobuf_dot_timestamp__pb2._TIMESTAMP
+_FINDITEMSOPTIONS.fields_by_name['filters'].message_type = _FILTER
+_ENVIRONMENT.fields_by_name['state'].enum_type = _ENVIRONMENT_STATE
+_ENVIRONMENT_STATE.containing_type = _ENVIRONMENT
+_SPACEROLE.fields_by_name['content_rules'].message_type = _CONTENTRULE
+_CONTENTRULE.fields_by_name['create'].enum_type = _ITEMACCESS
+_CONTENTRULE.fields_by_name['read'].enum_type = _ITEMACCESS
+_CONTENTRULE.fields_by_name['update'].enum_type = _ITEMACCESS
+_CONTENTRULE.fields_by_name['delete'].enum_type = _ITEMACCESS
+_FILTER.fields_by_name['value'].message_type = google_dot_protobuf_dot_struct__pb2._VALUE
+DESCRIPTOR.message_types_by_name['User'] = _USER
+DESCRIPTOR.message_types_by_name['Organization'] = _ORGANIZATION
+DESCRIPTOR.message_types_by_name['OrganizationMembership'] = _ORGANIZATIONMEMBERSHIP
+DESCRIPTOR.message_types_by_name['SpaceInvitation'] = _SPACEINVITATION
+DESCRIPTOR.message_types_by_name['Space'] = _SPACE
+DESCRIPTOR.message_types_by_name['Collection'] = _COLLECTION
+DESCRIPTOR.message_types_by_name['Item'] = _ITEM
+DESCRIPTOR.message_types_by_name['FindItemsOptions'] = _FINDITEMSOPTIONS
+DESCRIPTOR.message_types_by_name['Environment'] = _ENVIRONMENT
+DESCRIPTOR.message_types_by_name['Locale'] = _LOCALE
+DESCRIPTOR.message_types_by_name['SpaceRole'] = _SPACEROLE
+DESCRIPTOR.message_types_by_name['ContentRule'] = _CONTENTRULE
+DESCRIPTOR.message_types_by_name['Filter'] = _FILTER
+DESCRIPTOR.message_types_by_name['File'] = _FILE
+DESCRIPTOR.message_types_by_name['FindOptions'] = _FINDOPTIONS
+DESCRIPTOR.enum_types_by_name['Role'] = _ROLE
+DESCRIPTOR.enum_types_by_name['ItemAccess'] = _ITEMACCESS
+_sym_db.RegisterFileDescriptor(DESCRIPTOR)
+
+User = _reflection.GeneratedProtocolMessageType('User', (_message.Message,), {
+  'DESCRIPTOR' : _USER,
+  '__module__' : 'common.common_pb2'
+  # @@protoc_insertion_point(class_scope:common.User)
+  })
+_sym_db.RegisterMessage(User)
+
+Organization = _reflection.GeneratedProtocolMessageType('Organization', (_message.Message,), {
+  'DESCRIPTOR' : _ORGANIZATION,
+  '__module__' : 'common.common_pb2'
+  # @@protoc_insertion_point(class_scope:common.Organization)
+  })
+_sym_db.RegisterMessage(Organization)
+
+OrganizationMembership = _reflection.GeneratedProtocolMessageType('OrganizationMembership', (_message.Message,), {
+  'DESCRIPTOR' : _ORGANIZATIONMEMBERSHIP,
+  '__module__' : 'common.common_pb2'
+  # @@protoc_insertion_point(class_scope:common.OrganizationMembership)
+  })
+_sym_db.RegisterMessage(OrganizationMembership)
+
+SpaceInvitation = _reflection.GeneratedProtocolMessageType('SpaceInvitation', (_message.Message,), {
+  'DESCRIPTOR' : _SPACEINVITATION,
+  '__module__' : 'common.common_pb2'
+  # @@protoc_insertion_point(class_scope:common.SpaceInvitation)
+  })
+_sym_db.RegisterMessage(SpaceInvitation)
+
+Space = _reflection.GeneratedProtocolMessageType('Space', (_message.Message,), {
+  'DESCRIPTOR' : _SPACE,
+  '__module__' : 'common.common_pb2'
+  # @@protoc_insertion_point(class_scope:common.Space)
+  })
+_sym_db.RegisterMessage(Space)
+
+Collection = _reflection.GeneratedProtocolMessageType('Collection', (_message.Message,), {
+  'DESCRIPTOR' : _COLLECTION,
+  '__module__' : 'common.common_pb2'
+  # @@protoc_insertion_point(class_scope:common.Collection)
+  })
+_sym_db.RegisterMessage(Collection)
+
+Item = _reflection.GeneratedProtocolMessageType('Item', (_message.Message,), {
+
+  'TranslationsEntry' : _reflection.GeneratedProtocolMessageType('TranslationsEntry', (_message.Message,), {
+    'DESCRIPTOR' : _ITEM_TRANSLATIONSENTRY,
+    '__module__' : 'common.common_pb2'
+    # @@protoc_insertion_point(class_scope:common.Item.TranslationsEntry)
+    })
+  ,
+  'DESCRIPTOR' : _ITEM,
+  '__module__' : 'common.common_pb2'
+  # @@protoc_insertion_point(class_scope:common.Item)
+  })
+_sym_db.RegisterMessage(Item)
+_sym_db.RegisterMessage(Item.TranslationsEntry)
+
+FindItemsOptions = _reflection.GeneratedProtocolMessageType('FindItemsOptions', (_message.Message,), {
+  'DESCRIPTOR' : _FINDITEMSOPTIONS,
+  '__module__' : 'common.common_pb2'
+  # @@protoc_insertion_point(class_scope:common.FindItemsOptions)
+  })
+_sym_db.RegisterMessage(FindItemsOptions)
+
+Environment = _reflection.GeneratedProtocolMessageType('Environment', (_message.Message,), {
+  'DESCRIPTOR' : _ENVIRONMENT,
+  '__module__' : 'common.common_pb2'
+  # @@protoc_insertion_point(class_scope:common.Environment)
+  })
+_sym_db.RegisterMessage(Environment)
+
+Locale = _reflection.GeneratedProtocolMessageType('Locale', (_message.Message,), {
+  'DESCRIPTOR' : _LOCALE,
+  '__module__' : 'common.common_pb2'
+  # @@protoc_insertion_point(class_scope:common.Locale)
+  })
+_sym_db.RegisterMessage(Locale)
+
+SpaceRole = _reflection.GeneratedProtocolMessageType('SpaceRole', (_message.Message,), {
+  'DESCRIPTOR' : _SPACEROLE,
+  '__module__' : 'common.common_pb2'
+  # @@protoc_insertion_point(class_scope:common.SpaceRole)
+  })
+_sym_db.RegisterMessage(SpaceRole)
+
+ContentRule = _reflection.GeneratedProtocolMessageType('ContentRule', (_message.Message,), {
+  'DESCRIPTOR' : _CONTENTRULE,
+  '__module__' : 'common.common_pb2'
+  # @@protoc_insertion_point(class_scope:common.ContentRule)
+  })
+_sym_db.RegisterMessage(ContentRule)
+
+Filter = _reflection.GeneratedProtocolMessageType('Filter', (_message.Message,), {
+  'DESCRIPTOR' : _FILTER,
+  '__module__' : 'common.common_pb2'
+  # @@protoc_insertion_point(class_scope:common.Filter)
+  })
+_sym_db.RegisterMessage(Filter)
+
+File = _reflection.GeneratedProtocolMessageType('File', (_message.Message,), {
+  'DESCRIPTOR' : _FILE,
+  '__module__' : 'common.common_pb2'
+  # @@protoc_insertion_point(class_scope:common.File)
+  })
+_sym_db.RegisterMessage(File)
+
+FindOptions = _reflection.GeneratedProtocolMessageType('FindOptions', (_message.Message,), {
+  'DESCRIPTOR' : _FINDOPTIONS,
+  '__module__' : 'common.common_pb2'
+  # @@protoc_insertion_point(class_scope:common.FindOptions)
+  })
+_sym_db.RegisterMessage(FindOptions)
+
+
+DESCRIPTOR._options = None
+_ITEM_TRANSLATIONSENTRY._options = None
+# @@protoc_insertion_point(module_scope)
diff --git a/perxis/common/common_pb2_grpc.py b/perxis/common/common_pb2_grpc.py
new file mode 100644
index 0000000..2daafff
--- /dev/null
+++ b/perxis/common/common_pb2_grpc.py
@@ -0,0 +1,4 @@
+# Generated by the gRPC Python protocol compiler plugin. DO NOT EDIT!
+"""Client and server classes corresponding to protobuf-defined services."""
+import grpc
+
diff --git a/perxis/contentcontrol/__init__.py b/perxis/contentcontrol/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/perxis/contentcontrol/contentcontrol_pb2.py b/perxis/contentcontrol/contentcontrol_pb2.py
new file mode 100644
index 0000000..04c6fff
--- /dev/null
+++ b/perxis/contentcontrol/contentcontrol_pb2.py
@@ -0,0 +1,547 @@
+# -*- coding: utf-8 -*-
+# Generated by the protocol buffer compiler.  DO NOT EDIT!
+# source: contentcontrol/contentcontrol.proto
+"""Generated protocol buffer code."""
+from google.protobuf import descriptor as _descriptor
+from google.protobuf import message as _message
+from google.protobuf import reflection as _reflection
+from google.protobuf import symbol_database as _symbol_database
+# @@protoc_insertion_point(imports)
+
+_sym_db = _symbol_database.Default()
+
+
+from google.protobuf import empty_pb2 as google_dot_protobuf_dot_empty__pb2
+from common import common_pb2 as common_dot_common__pb2
+
+
+DESCRIPTOR = _descriptor.FileDescriptor(
+  name='contentcontrol/contentcontrol.proto',
+  package='contentcontrol',
+  syntax='proto3',
+  serialized_options=b'Z>github.com/perxteam/perxis/proto/contentcontrol;contentcontrol',
+  create_key=_descriptor._internal_create_key,
+  serialized_pb=b'\n#contentcontrol/contentcontrol.proto\x12\x0e\x63ontentcontrol\x1a\x1bgoogle/protobuf/empty.proto\x1a\x13\x63ommon/common.proto\"\x14\n\x04Host\x12\x0c\n\x04name\x18\x01 \x01(\t\"!\n\x11ListSpacesOptions\x12\x0c\n\x04host\x18\x01 \x01(\t\"2\n\x12\x43reateSpaceRequest\x12\x1c\n\x05space\x18\x01 \x01(\x0b\x32\r.common.Space\"3\n\x13\x43reateSpaceResponse\x12\x1c\n\x05space\x18\x01 \x01(\x0b\x32\r.common.Space\" \n\x12\x44\x65leteSpaceRequest\x12\n\n\x02id\x18\x01 \x01(\t\"\x1d\n\x0fGetSpaceRequest\x12\n\n\x02id\x18\x01 \x01(\t\"0\n\x10GetSpaceResponse\x12\x1c\n\x05space\x18\x01 \x01(\x0b\x32\r.common.Space\"3\n\x12ListSpacesResponse\x12\x1d\n\x06spaces\x18\x01 \x03(\x0b\x32\r.common.Space\"D\n\x11ListSpacesRequest\x12/\n\x04opts\x18\x01 \x01(\x0b\x32!.contentcontrol.ListSpacesOptions\"5\n\x15\x43\x61nCreateSpaceRequest\x12\x1c\n\x05space\x18\x01 \x01(\x0b\x32\r.common.Space\"<\n\x16\x43\x61nCreateSpaceResponse\x12\"\n\x04host\x18\x01 \x01(\x0b\x32\x14.contentcontrol.Host2\xc2\x03\n\x0e\x43ontentControl\x12\x61\n\x0e\x43\x61nCreateSpace\x12%.contentcontrol.CanCreateSpaceRequest\x1a&.contentcontrol.CanCreateSpaceResponse\"\x00\x12X\n\x0b\x43reateSpace\x12\".contentcontrol.CreateSpaceRequest\x1a#.contentcontrol.CreateSpaceResponse\"\x00\x12K\n\x0b\x44\x65leteSpace\x12\".contentcontrol.DeleteSpaceRequest\x1a\x16.google.protobuf.Empty\"\x00\x12O\n\x08GetSpace\x12\x1f.contentcontrol.GetSpaceRequest\x1a .contentcontrol.GetSpaceResponse\"\x00\x12U\n\nListSpaces\x12!.contentcontrol.ListSpacesRequest\x1a\".contentcontrol.ListSpacesResponse\"\x00\x42@Z>github.com/perxteam/perxis/proto/contentcontrol;contentcontrolb\x06proto3'
+  ,
+  dependencies=[google_dot_protobuf_dot_empty__pb2.DESCRIPTOR,common_dot_common__pb2.DESCRIPTOR,])
+
+
+
+
+_HOST = _descriptor.Descriptor(
+  name='Host',
+  full_name='contentcontrol.Host',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='name', full_name='contentcontrol.Host.name', index=0,
+      number=1, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=105,
+  serialized_end=125,
+)
+
+
+_LISTSPACESOPTIONS = _descriptor.Descriptor(
+  name='ListSpacesOptions',
+  full_name='contentcontrol.ListSpacesOptions',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='host', full_name='contentcontrol.ListSpacesOptions.host', index=0,
+      number=1, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=127,
+  serialized_end=160,
+)
+
+
+_CREATESPACEREQUEST = _descriptor.Descriptor(
+  name='CreateSpaceRequest',
+  full_name='contentcontrol.CreateSpaceRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='space', full_name='contentcontrol.CreateSpaceRequest.space', index=0,
+      number=1, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=162,
+  serialized_end=212,
+)
+
+
+_CREATESPACERESPONSE = _descriptor.Descriptor(
+  name='CreateSpaceResponse',
+  full_name='contentcontrol.CreateSpaceResponse',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='space', full_name='contentcontrol.CreateSpaceResponse.space', index=0,
+      number=1, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=214,
+  serialized_end=265,
+)
+
+
+_DELETESPACEREQUEST = _descriptor.Descriptor(
+  name='DeleteSpaceRequest',
+  full_name='contentcontrol.DeleteSpaceRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='id', full_name='contentcontrol.DeleteSpaceRequest.id', index=0,
+      number=1, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=267,
+  serialized_end=299,
+)
+
+
+_GETSPACEREQUEST = _descriptor.Descriptor(
+  name='GetSpaceRequest',
+  full_name='contentcontrol.GetSpaceRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='id', full_name='contentcontrol.GetSpaceRequest.id', index=0,
+      number=1, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=301,
+  serialized_end=330,
+)
+
+
+_GETSPACERESPONSE = _descriptor.Descriptor(
+  name='GetSpaceResponse',
+  full_name='contentcontrol.GetSpaceResponse',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='space', full_name='contentcontrol.GetSpaceResponse.space', index=0,
+      number=1, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=332,
+  serialized_end=380,
+)
+
+
+_LISTSPACESRESPONSE = _descriptor.Descriptor(
+  name='ListSpacesResponse',
+  full_name='contentcontrol.ListSpacesResponse',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='spaces', full_name='contentcontrol.ListSpacesResponse.spaces', index=0,
+      number=1, type=11, cpp_type=10, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=382,
+  serialized_end=433,
+)
+
+
+_LISTSPACESREQUEST = _descriptor.Descriptor(
+  name='ListSpacesRequest',
+  full_name='contentcontrol.ListSpacesRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='opts', full_name='contentcontrol.ListSpacesRequest.opts', index=0,
+      number=1, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=435,
+  serialized_end=503,
+)
+
+
+_CANCREATESPACEREQUEST = _descriptor.Descriptor(
+  name='CanCreateSpaceRequest',
+  full_name='contentcontrol.CanCreateSpaceRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='space', full_name='contentcontrol.CanCreateSpaceRequest.space', index=0,
+      number=1, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=505,
+  serialized_end=558,
+)
+
+
+_CANCREATESPACERESPONSE = _descriptor.Descriptor(
+  name='CanCreateSpaceResponse',
+  full_name='contentcontrol.CanCreateSpaceResponse',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='host', full_name='contentcontrol.CanCreateSpaceResponse.host', index=0,
+      number=1, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=560,
+  serialized_end=620,
+)
+
+_CREATESPACEREQUEST.fields_by_name['space'].message_type = common_dot_common__pb2._SPACE
+_CREATESPACERESPONSE.fields_by_name['space'].message_type = common_dot_common__pb2._SPACE
+_GETSPACERESPONSE.fields_by_name['space'].message_type = common_dot_common__pb2._SPACE
+_LISTSPACESRESPONSE.fields_by_name['spaces'].message_type = common_dot_common__pb2._SPACE
+_LISTSPACESREQUEST.fields_by_name['opts'].message_type = _LISTSPACESOPTIONS
+_CANCREATESPACEREQUEST.fields_by_name['space'].message_type = common_dot_common__pb2._SPACE
+_CANCREATESPACERESPONSE.fields_by_name['host'].message_type = _HOST
+DESCRIPTOR.message_types_by_name['Host'] = _HOST
+DESCRIPTOR.message_types_by_name['ListSpacesOptions'] = _LISTSPACESOPTIONS
+DESCRIPTOR.message_types_by_name['CreateSpaceRequest'] = _CREATESPACEREQUEST
+DESCRIPTOR.message_types_by_name['CreateSpaceResponse'] = _CREATESPACERESPONSE
+DESCRIPTOR.message_types_by_name['DeleteSpaceRequest'] = _DELETESPACEREQUEST
+DESCRIPTOR.message_types_by_name['GetSpaceRequest'] = _GETSPACEREQUEST
+DESCRIPTOR.message_types_by_name['GetSpaceResponse'] = _GETSPACERESPONSE
+DESCRIPTOR.message_types_by_name['ListSpacesResponse'] = _LISTSPACESRESPONSE
+DESCRIPTOR.message_types_by_name['ListSpacesRequest'] = _LISTSPACESREQUEST
+DESCRIPTOR.message_types_by_name['CanCreateSpaceRequest'] = _CANCREATESPACEREQUEST
+DESCRIPTOR.message_types_by_name['CanCreateSpaceResponse'] = _CANCREATESPACERESPONSE
+_sym_db.RegisterFileDescriptor(DESCRIPTOR)
+
+Host = _reflection.GeneratedProtocolMessageType('Host', (_message.Message,), {
+  'DESCRIPTOR' : _HOST,
+  '__module__' : 'contentcontrol.contentcontrol_pb2'
+  # @@protoc_insertion_point(class_scope:contentcontrol.Host)
+  })
+_sym_db.RegisterMessage(Host)
+
+ListSpacesOptions = _reflection.GeneratedProtocolMessageType('ListSpacesOptions', (_message.Message,), {
+  'DESCRIPTOR' : _LISTSPACESOPTIONS,
+  '__module__' : 'contentcontrol.contentcontrol_pb2'
+  # @@protoc_insertion_point(class_scope:contentcontrol.ListSpacesOptions)
+  })
+_sym_db.RegisterMessage(ListSpacesOptions)
+
+CreateSpaceRequest = _reflection.GeneratedProtocolMessageType('CreateSpaceRequest', (_message.Message,), {
+  'DESCRIPTOR' : _CREATESPACEREQUEST,
+  '__module__' : 'contentcontrol.contentcontrol_pb2'
+  # @@protoc_insertion_point(class_scope:contentcontrol.CreateSpaceRequest)
+  })
+_sym_db.RegisterMessage(CreateSpaceRequest)
+
+CreateSpaceResponse = _reflection.GeneratedProtocolMessageType('CreateSpaceResponse', (_message.Message,), {
+  'DESCRIPTOR' : _CREATESPACERESPONSE,
+  '__module__' : 'contentcontrol.contentcontrol_pb2'
+  # @@protoc_insertion_point(class_scope:contentcontrol.CreateSpaceResponse)
+  })
+_sym_db.RegisterMessage(CreateSpaceResponse)
+
+DeleteSpaceRequest = _reflection.GeneratedProtocolMessageType('DeleteSpaceRequest', (_message.Message,), {
+  'DESCRIPTOR' : _DELETESPACEREQUEST,
+  '__module__' : 'contentcontrol.contentcontrol_pb2'
+  # @@protoc_insertion_point(class_scope:contentcontrol.DeleteSpaceRequest)
+  })
+_sym_db.RegisterMessage(DeleteSpaceRequest)
+
+GetSpaceRequest = _reflection.GeneratedProtocolMessageType('GetSpaceRequest', (_message.Message,), {
+  'DESCRIPTOR' : _GETSPACEREQUEST,
+  '__module__' : 'contentcontrol.contentcontrol_pb2'
+  # @@protoc_insertion_point(class_scope:contentcontrol.GetSpaceRequest)
+  })
+_sym_db.RegisterMessage(GetSpaceRequest)
+
+GetSpaceResponse = _reflection.GeneratedProtocolMessageType('GetSpaceResponse', (_message.Message,), {
+  'DESCRIPTOR' : _GETSPACERESPONSE,
+  '__module__' : 'contentcontrol.contentcontrol_pb2'
+  # @@protoc_insertion_point(class_scope:contentcontrol.GetSpaceResponse)
+  })
+_sym_db.RegisterMessage(GetSpaceResponse)
+
+ListSpacesResponse = _reflection.GeneratedProtocolMessageType('ListSpacesResponse', (_message.Message,), {
+  'DESCRIPTOR' : _LISTSPACESRESPONSE,
+  '__module__' : 'contentcontrol.contentcontrol_pb2'
+  # @@protoc_insertion_point(class_scope:contentcontrol.ListSpacesResponse)
+  })
+_sym_db.RegisterMessage(ListSpacesResponse)
+
+ListSpacesRequest = _reflection.GeneratedProtocolMessageType('ListSpacesRequest', (_message.Message,), {
+  'DESCRIPTOR' : _LISTSPACESREQUEST,
+  '__module__' : 'contentcontrol.contentcontrol_pb2'
+  # @@protoc_insertion_point(class_scope:contentcontrol.ListSpacesRequest)
+  })
+_sym_db.RegisterMessage(ListSpacesRequest)
+
+CanCreateSpaceRequest = _reflection.GeneratedProtocolMessageType('CanCreateSpaceRequest', (_message.Message,), {
+  'DESCRIPTOR' : _CANCREATESPACEREQUEST,
+  '__module__' : 'contentcontrol.contentcontrol_pb2'
+  # @@protoc_insertion_point(class_scope:contentcontrol.CanCreateSpaceRequest)
+  })
+_sym_db.RegisterMessage(CanCreateSpaceRequest)
+
+CanCreateSpaceResponse = _reflection.GeneratedProtocolMessageType('CanCreateSpaceResponse', (_message.Message,), {
+  'DESCRIPTOR' : _CANCREATESPACERESPONSE,
+  '__module__' : 'contentcontrol.contentcontrol_pb2'
+  # @@protoc_insertion_point(class_scope:contentcontrol.CanCreateSpaceResponse)
+  })
+_sym_db.RegisterMessage(CanCreateSpaceResponse)
+
+
+DESCRIPTOR._options = None
+
+_CONTENTCONTROL = _descriptor.ServiceDescriptor(
+  name='ContentControl',
+  full_name='contentcontrol.ContentControl',
+  file=DESCRIPTOR,
+  index=0,
+  serialized_options=None,
+  create_key=_descriptor._internal_create_key,
+  serialized_start=623,
+  serialized_end=1073,
+  methods=[
+  _descriptor.MethodDescriptor(
+    name='CanCreateSpace',
+    full_name='contentcontrol.ContentControl.CanCreateSpace',
+    index=0,
+    containing_service=None,
+    input_type=_CANCREATESPACEREQUEST,
+    output_type=_CANCREATESPACERESPONSE,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='CreateSpace',
+    full_name='contentcontrol.ContentControl.CreateSpace',
+    index=1,
+    containing_service=None,
+    input_type=_CREATESPACEREQUEST,
+    output_type=_CREATESPACERESPONSE,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='DeleteSpace',
+    full_name='contentcontrol.ContentControl.DeleteSpace',
+    index=2,
+    containing_service=None,
+    input_type=_DELETESPACEREQUEST,
+    output_type=google_dot_protobuf_dot_empty__pb2._EMPTY,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='GetSpace',
+    full_name='contentcontrol.ContentControl.GetSpace',
+    index=3,
+    containing_service=None,
+    input_type=_GETSPACEREQUEST,
+    output_type=_GETSPACERESPONSE,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='ListSpaces',
+    full_name='contentcontrol.ContentControl.ListSpaces',
+    index=4,
+    containing_service=None,
+    input_type=_LISTSPACESREQUEST,
+    output_type=_LISTSPACESRESPONSE,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+])
+_sym_db.RegisterServiceDescriptor(_CONTENTCONTROL)
+
+DESCRIPTOR.services_by_name['ContentControl'] = _CONTENTCONTROL
+
+# @@protoc_insertion_point(module_scope)
diff --git a/perxis/contentcontrol/contentcontrol_pb2_grpc.py b/perxis/contentcontrol/contentcontrol_pb2_grpc.py
new file mode 100644
index 0000000..1afb317
--- /dev/null
+++ b/perxis/contentcontrol/contentcontrol_pb2_grpc.py
@@ -0,0 +1,200 @@
+# Generated by the gRPC Python protocol compiler plugin. DO NOT EDIT!
+"""Client and server classes corresponding to protobuf-defined services."""
+import grpc
+
+from contentcontrol import contentcontrol_pb2 as contentcontrol_dot_contentcontrol__pb2
+from google.protobuf import empty_pb2 as google_dot_protobuf_dot_empty__pb2
+
+
+class ContentControlStub(object):
+    """Missing associated documentation comment in .proto file."""
+
+    def __init__(self, channel):
+        """Constructor.
+
+        Args:
+            channel: A grpc.Channel.
+        """
+        self.CanCreateSpace = channel.unary_unary(
+                '/contentcontrol.ContentControl/CanCreateSpace',
+                request_serializer=contentcontrol_dot_contentcontrol__pb2.CanCreateSpaceRequest.SerializeToString,
+                response_deserializer=contentcontrol_dot_contentcontrol__pb2.CanCreateSpaceResponse.FromString,
+                )
+        self.CreateSpace = channel.unary_unary(
+                '/contentcontrol.ContentControl/CreateSpace',
+                request_serializer=contentcontrol_dot_contentcontrol__pb2.CreateSpaceRequest.SerializeToString,
+                response_deserializer=contentcontrol_dot_contentcontrol__pb2.CreateSpaceResponse.FromString,
+                )
+        self.DeleteSpace = channel.unary_unary(
+                '/contentcontrol.ContentControl/DeleteSpace',
+                request_serializer=contentcontrol_dot_contentcontrol__pb2.DeleteSpaceRequest.SerializeToString,
+                response_deserializer=google_dot_protobuf_dot_empty__pb2.Empty.FromString,
+                )
+        self.GetSpace = channel.unary_unary(
+                '/contentcontrol.ContentControl/GetSpace',
+                request_serializer=contentcontrol_dot_contentcontrol__pb2.GetSpaceRequest.SerializeToString,
+                response_deserializer=contentcontrol_dot_contentcontrol__pb2.GetSpaceResponse.FromString,
+                )
+        self.ListSpaces = channel.unary_unary(
+                '/contentcontrol.ContentControl/ListSpaces',
+                request_serializer=contentcontrol_dot_contentcontrol__pb2.ListSpacesRequest.SerializeToString,
+                response_deserializer=contentcontrol_dot_contentcontrol__pb2.ListSpacesResponse.FromString,
+                )
+
+
+class ContentControlServicer(object):
+    """Missing associated documentation comment in .proto file."""
+
+    def CanCreateSpace(self, request, context):
+        """Space
+        """
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def CreateSpace(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def DeleteSpace(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def GetSpace(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def ListSpaces(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+
+def add_ContentControlServicer_to_server(servicer, server):
+    rpc_method_handlers = {
+            'CanCreateSpace': grpc.unary_unary_rpc_method_handler(
+                    servicer.CanCreateSpace,
+                    request_deserializer=contentcontrol_dot_contentcontrol__pb2.CanCreateSpaceRequest.FromString,
+                    response_serializer=contentcontrol_dot_contentcontrol__pb2.CanCreateSpaceResponse.SerializeToString,
+            ),
+            'CreateSpace': grpc.unary_unary_rpc_method_handler(
+                    servicer.CreateSpace,
+                    request_deserializer=contentcontrol_dot_contentcontrol__pb2.CreateSpaceRequest.FromString,
+                    response_serializer=contentcontrol_dot_contentcontrol__pb2.CreateSpaceResponse.SerializeToString,
+            ),
+            'DeleteSpace': grpc.unary_unary_rpc_method_handler(
+                    servicer.DeleteSpace,
+                    request_deserializer=contentcontrol_dot_contentcontrol__pb2.DeleteSpaceRequest.FromString,
+                    response_serializer=google_dot_protobuf_dot_empty__pb2.Empty.SerializeToString,
+            ),
+            'GetSpace': grpc.unary_unary_rpc_method_handler(
+                    servicer.GetSpace,
+                    request_deserializer=contentcontrol_dot_contentcontrol__pb2.GetSpaceRequest.FromString,
+                    response_serializer=contentcontrol_dot_contentcontrol__pb2.GetSpaceResponse.SerializeToString,
+            ),
+            'ListSpaces': grpc.unary_unary_rpc_method_handler(
+                    servicer.ListSpaces,
+                    request_deserializer=contentcontrol_dot_contentcontrol__pb2.ListSpacesRequest.FromString,
+                    response_serializer=contentcontrol_dot_contentcontrol__pb2.ListSpacesResponse.SerializeToString,
+            ),
+    }
+    generic_handler = grpc.method_handlers_generic_handler(
+            'contentcontrol.ContentControl', rpc_method_handlers)
+    server.add_generic_rpc_handlers((generic_handler,))
+
+
+ # This class is part of an EXPERIMENTAL API.
+class ContentControl(object):
+    """Missing associated documentation comment in .proto file."""
+
+    @staticmethod
+    def CanCreateSpace(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/contentcontrol.ContentControl/CanCreateSpace',
+            contentcontrol_dot_contentcontrol__pb2.CanCreateSpaceRequest.SerializeToString,
+            contentcontrol_dot_contentcontrol__pb2.CanCreateSpaceResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def CreateSpace(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/contentcontrol.ContentControl/CreateSpace',
+            contentcontrol_dot_contentcontrol__pb2.CreateSpaceRequest.SerializeToString,
+            contentcontrol_dot_contentcontrol__pb2.CreateSpaceResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def DeleteSpace(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/contentcontrol.ContentControl/DeleteSpace',
+            contentcontrol_dot_contentcontrol__pb2.DeleteSpaceRequest.SerializeToString,
+            google_dot_protobuf_dot_empty__pb2.Empty.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def GetSpace(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/contentcontrol.ContentControl/GetSpace',
+            contentcontrol_dot_contentcontrol__pb2.GetSpaceRequest.SerializeToString,
+            contentcontrol_dot_contentcontrol__pb2.GetSpaceResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def ListSpaces(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/contentcontrol.ContentControl/ListSpaces',
+            contentcontrol_dot_contentcontrol__pb2.ListSpacesRequest.SerializeToString,
+            contentcontrol_dot_contentcontrol__pb2.ListSpacesResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
diff --git a/perxis/contentdelivery/__init__.py b/perxis/contentdelivery/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/perxis/contentdelivery/contentdelivery_pb2.py b/perxis/contentdelivery/contentdelivery_pb2.py
new file mode 100644
index 0000000..76a8f6e
--- /dev/null
+++ b/perxis/contentdelivery/contentdelivery_pb2.py
@@ -0,0 +1,799 @@
+# -*- coding: utf-8 -*-
+# Generated by the protocol buffer compiler.  DO NOT EDIT!
+# source: contentdelivery/contentdelivery.proto
+"""Generated protocol buffer code."""
+from google.protobuf import descriptor as _descriptor
+from google.protobuf import message as _message
+from google.protobuf import reflection as _reflection
+from google.protobuf import symbol_database as _symbol_database
+# @@protoc_insertion_point(imports)
+
+_sym_db = _symbol_database.Default()
+
+
+from common import common_pb2 as common_dot_common__pb2
+
+
+DESCRIPTOR = _descriptor.FileDescriptor(
+  name='contentdelivery/contentdelivery.proto',
+  package='contentdelivery',
+  syntax='proto3',
+  serialized_options=b'Z@github.com/perxteam/perxis/proto/contentdelivery;contentdelivery',
+  create_key=_descriptor._internal_create_key,
+  serialized_pb=b'\n%contentdelivery/contentdelivery.proto\x12\x0f\x63ontentdelivery\x1a\x13\x63ommon/common.proto\"\x1d\n\x0fGetSpaceRequest\x12\n\n\x02id\x18\x01 \x01(\t\"0\n\x10GetSpaceResponse\x12\x1c\n\x05space\x18\x01 \x01(\x0b\x32\r.common.Space\"&\n\x12ListLocalesRequest\x12\x10\n\x08space_id\x18\x01 \x01(\t\"6\n\x13ListLocalesResponse\x12\x1f\n\x07locales\x18\x01 \x03(\x0b\x32\x0e.common.Locale\"5\n\x15GetEnvironmentRequest\x12\n\n\x02id\x18\x01 \x01(\t\x12\x10\n\x08space_id\x18\x02 \x01(\t\"B\n\x16GetEnvironmentResponse\x12(\n\x0b\x65nvironment\x18\x01 \x01(\x0b\x32\x13.common.Environment\"L\n\x14GetCollectionRequest\x12\n\n\x02id\x18\x01 \x01(\t\x12\x16\n\x0e\x65nvironment_id\x18\x02 \x01(\t\x12\x10\n\x08space_id\x18\x03 \x01(\t\"?\n\x15GetCollectionResponse\x12&\n\ncollection\x18\x01 \x01(\x0b\x32\x12.common.Collection\"B\n\x16ListCollectionsRequest\x12\x16\n\x0e\x65nvironment_id\x18\x01 \x01(\t\x12\x10\n\x08space_id\x18\x02 \x01(\t\"B\n\x17ListCollectionsResponse\x12\'\n\x0b\x63ollections\x18\x01 \x03(\x0b\x32\x12.common.Collection\"m\n\x0eGetItemRequest\x12\n\n\x02id\x18\x01 \x01(\t\x12\x15\n\rcollection_id\x18\x02 \x01(\t\x12\x16\n\x0e\x65nvironment_id\x18\x03 \x01(\t\x12\x10\n\x08space_id\x18\x04 \x01(\t\x12\x0e\n\x06locale\x18\x05 \x01(\t\"-\n\x0fGetItemResponse\x12\x1a\n\x04item\x18\x01 \x01(\x0b\x32\x0c.common.Item\"\xb4\x01\n\x10\x46indItemsRequest\x12\x10\n\x08space_id\x18\x01 \x01(\t\x12\x16\n\x0e\x65nvironment_id\x18\x02 \x01(\t\x12\x15\n\rcollection_id\x18\x03 \x01(\t\x12\x1c\n\x04\x64\x61ta\x18\x04 \x03(\x0b\x32\x0e.common.Filter\x12\x0e\n\x06locale\x18\x05 \x01(\t\x12\x10\n\x08page_num\x18\x08 \x01(\x05\x12\x11\n\tpage_size\x18\t \x01(\x05\x12\x0c\n\x04sort\x18\n \x03(\t\"?\n\x11\x46indItemsResponse\x12\x1b\n\x05items\x18\x01 \x03(\x0b\x32\x0c.common.Item\x12\r\n\x05total\x18\x02 \x01(\x05\x32\x95\x05\n\x0f\x43ontentDelivery\x12Q\n\x08GetSpace\x12 .contentdelivery.GetSpaceRequest\x1a!.contentdelivery.GetSpaceResponse\"\x00\x12Z\n\x0bListLocales\x12#.contentdelivery.ListLocalesRequest\x1a$.contentdelivery.ListLocalesResponse\"\x00\x12\x63\n\x0eGetEnvironment\x12&.contentdelivery.GetEnvironmentRequest\x1a\'.contentdelivery.GetEnvironmentResponse\"\x00\x12`\n\rGetCollection\x12%.contentdelivery.GetCollectionRequest\x1a&.contentdelivery.GetCollectionResponse\"\x00\x12\x66\n\x0fListCollections\x12\'.contentdelivery.ListCollectionsRequest\x1a(.contentdelivery.ListCollectionsResponse\"\x00\x12N\n\x07GetItem\x12\x1f.contentdelivery.GetItemRequest\x1a .contentdelivery.GetItemResponse\"\x00\x12T\n\tFindItems\x12!.contentdelivery.FindItemsRequest\x1a\".contentdelivery.FindItemsResponse\"\x00\x42\x42Z@github.com/perxteam/perxis/proto/contentdelivery;contentdeliveryb\x06proto3'
+  ,
+  dependencies=[common_dot_common__pb2.DESCRIPTOR,])
+
+
+
+
+_GETSPACEREQUEST = _descriptor.Descriptor(
+  name='GetSpaceRequest',
+  full_name='contentdelivery.GetSpaceRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='id', full_name='contentdelivery.GetSpaceRequest.id', index=0,
+      number=1, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=79,
+  serialized_end=108,
+)
+
+
+_GETSPACERESPONSE = _descriptor.Descriptor(
+  name='GetSpaceResponse',
+  full_name='contentdelivery.GetSpaceResponse',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='space', full_name='contentdelivery.GetSpaceResponse.space', index=0,
+      number=1, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=110,
+  serialized_end=158,
+)
+
+
+_LISTLOCALESREQUEST = _descriptor.Descriptor(
+  name='ListLocalesRequest',
+  full_name='contentdelivery.ListLocalesRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='space_id', full_name='contentdelivery.ListLocalesRequest.space_id', index=0,
+      number=1, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=160,
+  serialized_end=198,
+)
+
+
+_LISTLOCALESRESPONSE = _descriptor.Descriptor(
+  name='ListLocalesResponse',
+  full_name='contentdelivery.ListLocalesResponse',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='locales', full_name='contentdelivery.ListLocalesResponse.locales', index=0,
+      number=1, type=11, cpp_type=10, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=200,
+  serialized_end=254,
+)
+
+
+_GETENVIRONMENTREQUEST = _descriptor.Descriptor(
+  name='GetEnvironmentRequest',
+  full_name='contentdelivery.GetEnvironmentRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='id', full_name='contentdelivery.GetEnvironmentRequest.id', index=0,
+      number=1, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='space_id', full_name='contentdelivery.GetEnvironmentRequest.space_id', index=1,
+      number=2, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=256,
+  serialized_end=309,
+)
+
+
+_GETENVIRONMENTRESPONSE = _descriptor.Descriptor(
+  name='GetEnvironmentResponse',
+  full_name='contentdelivery.GetEnvironmentResponse',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='environment', full_name='contentdelivery.GetEnvironmentResponse.environment', index=0,
+      number=1, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=311,
+  serialized_end=377,
+)
+
+
+_GETCOLLECTIONREQUEST = _descriptor.Descriptor(
+  name='GetCollectionRequest',
+  full_name='contentdelivery.GetCollectionRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='id', full_name='contentdelivery.GetCollectionRequest.id', index=0,
+      number=1, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='environment_id', full_name='contentdelivery.GetCollectionRequest.environment_id', index=1,
+      number=2, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='space_id', full_name='contentdelivery.GetCollectionRequest.space_id', index=2,
+      number=3, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=379,
+  serialized_end=455,
+)
+
+
+_GETCOLLECTIONRESPONSE = _descriptor.Descriptor(
+  name='GetCollectionResponse',
+  full_name='contentdelivery.GetCollectionResponse',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='collection', full_name='contentdelivery.GetCollectionResponse.collection', index=0,
+      number=1, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=457,
+  serialized_end=520,
+)
+
+
+_LISTCOLLECTIONSREQUEST = _descriptor.Descriptor(
+  name='ListCollectionsRequest',
+  full_name='contentdelivery.ListCollectionsRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='environment_id', full_name='contentdelivery.ListCollectionsRequest.environment_id', index=0,
+      number=1, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='space_id', full_name='contentdelivery.ListCollectionsRequest.space_id', index=1,
+      number=2, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=522,
+  serialized_end=588,
+)
+
+
+_LISTCOLLECTIONSRESPONSE = _descriptor.Descriptor(
+  name='ListCollectionsResponse',
+  full_name='contentdelivery.ListCollectionsResponse',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='collections', full_name='contentdelivery.ListCollectionsResponse.collections', index=0,
+      number=1, type=11, cpp_type=10, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=590,
+  serialized_end=656,
+)
+
+
+_GETITEMREQUEST = _descriptor.Descriptor(
+  name='GetItemRequest',
+  full_name='contentdelivery.GetItemRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='id', full_name='contentdelivery.GetItemRequest.id', index=0,
+      number=1, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='collection_id', full_name='contentdelivery.GetItemRequest.collection_id', index=1,
+      number=2, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='environment_id', full_name='contentdelivery.GetItemRequest.environment_id', index=2,
+      number=3, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='space_id', full_name='contentdelivery.GetItemRequest.space_id', index=3,
+      number=4, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='locale', full_name='contentdelivery.GetItemRequest.locale', index=4,
+      number=5, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=658,
+  serialized_end=767,
+)
+
+
+_GETITEMRESPONSE = _descriptor.Descriptor(
+  name='GetItemResponse',
+  full_name='contentdelivery.GetItemResponse',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='item', full_name='contentdelivery.GetItemResponse.item', index=0,
+      number=1, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=769,
+  serialized_end=814,
+)
+
+
+_FINDITEMSREQUEST = _descriptor.Descriptor(
+  name='FindItemsRequest',
+  full_name='contentdelivery.FindItemsRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='space_id', full_name='contentdelivery.FindItemsRequest.space_id', index=0,
+      number=1, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='environment_id', full_name='contentdelivery.FindItemsRequest.environment_id', index=1,
+      number=2, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='collection_id', full_name='contentdelivery.FindItemsRequest.collection_id', index=2,
+      number=3, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='data', full_name='contentdelivery.FindItemsRequest.data', index=3,
+      number=4, type=11, cpp_type=10, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='locale', full_name='contentdelivery.FindItemsRequest.locale', index=4,
+      number=5, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='page_num', full_name='contentdelivery.FindItemsRequest.page_num', index=5,
+      number=8, type=5, cpp_type=1, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='page_size', full_name='contentdelivery.FindItemsRequest.page_size', index=6,
+      number=9, type=5, cpp_type=1, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='sort', full_name='contentdelivery.FindItemsRequest.sort', index=7,
+      number=10, type=9, cpp_type=9, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=817,
+  serialized_end=997,
+)
+
+
+_FINDITEMSRESPONSE = _descriptor.Descriptor(
+  name='FindItemsResponse',
+  full_name='contentdelivery.FindItemsResponse',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='items', full_name='contentdelivery.FindItemsResponse.items', index=0,
+      number=1, type=11, cpp_type=10, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='total', full_name='contentdelivery.FindItemsResponse.total', index=1,
+      number=2, type=5, cpp_type=1, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=999,
+  serialized_end=1062,
+)
+
+_GETSPACERESPONSE.fields_by_name['space'].message_type = common_dot_common__pb2._SPACE
+_LISTLOCALESRESPONSE.fields_by_name['locales'].message_type = common_dot_common__pb2._LOCALE
+_GETENVIRONMENTRESPONSE.fields_by_name['environment'].message_type = common_dot_common__pb2._ENVIRONMENT
+_GETCOLLECTIONRESPONSE.fields_by_name['collection'].message_type = common_dot_common__pb2._COLLECTION
+_LISTCOLLECTIONSRESPONSE.fields_by_name['collections'].message_type = common_dot_common__pb2._COLLECTION
+_GETITEMRESPONSE.fields_by_name['item'].message_type = common_dot_common__pb2._ITEM
+_FINDITEMSREQUEST.fields_by_name['data'].message_type = common_dot_common__pb2._FILTER
+_FINDITEMSRESPONSE.fields_by_name['items'].message_type = common_dot_common__pb2._ITEM
+DESCRIPTOR.message_types_by_name['GetSpaceRequest'] = _GETSPACEREQUEST
+DESCRIPTOR.message_types_by_name['GetSpaceResponse'] = _GETSPACERESPONSE
+DESCRIPTOR.message_types_by_name['ListLocalesRequest'] = _LISTLOCALESREQUEST
+DESCRIPTOR.message_types_by_name['ListLocalesResponse'] = _LISTLOCALESRESPONSE
+DESCRIPTOR.message_types_by_name['GetEnvironmentRequest'] = _GETENVIRONMENTREQUEST
+DESCRIPTOR.message_types_by_name['GetEnvironmentResponse'] = _GETENVIRONMENTRESPONSE
+DESCRIPTOR.message_types_by_name['GetCollectionRequest'] = _GETCOLLECTIONREQUEST
+DESCRIPTOR.message_types_by_name['GetCollectionResponse'] = _GETCOLLECTIONRESPONSE
+DESCRIPTOR.message_types_by_name['ListCollectionsRequest'] = _LISTCOLLECTIONSREQUEST
+DESCRIPTOR.message_types_by_name['ListCollectionsResponse'] = _LISTCOLLECTIONSRESPONSE
+DESCRIPTOR.message_types_by_name['GetItemRequest'] = _GETITEMREQUEST
+DESCRIPTOR.message_types_by_name['GetItemResponse'] = _GETITEMRESPONSE
+DESCRIPTOR.message_types_by_name['FindItemsRequest'] = _FINDITEMSREQUEST
+DESCRIPTOR.message_types_by_name['FindItemsResponse'] = _FINDITEMSRESPONSE
+_sym_db.RegisterFileDescriptor(DESCRIPTOR)
+
+GetSpaceRequest = _reflection.GeneratedProtocolMessageType('GetSpaceRequest', (_message.Message,), {
+  'DESCRIPTOR' : _GETSPACEREQUEST,
+  '__module__' : 'contentdelivery.contentdelivery_pb2'
+  # @@protoc_insertion_point(class_scope:contentdelivery.GetSpaceRequest)
+  })
+_sym_db.RegisterMessage(GetSpaceRequest)
+
+GetSpaceResponse = _reflection.GeneratedProtocolMessageType('GetSpaceResponse', (_message.Message,), {
+  'DESCRIPTOR' : _GETSPACERESPONSE,
+  '__module__' : 'contentdelivery.contentdelivery_pb2'
+  # @@protoc_insertion_point(class_scope:contentdelivery.GetSpaceResponse)
+  })
+_sym_db.RegisterMessage(GetSpaceResponse)
+
+ListLocalesRequest = _reflection.GeneratedProtocolMessageType('ListLocalesRequest', (_message.Message,), {
+  'DESCRIPTOR' : _LISTLOCALESREQUEST,
+  '__module__' : 'contentdelivery.contentdelivery_pb2'
+  # @@protoc_insertion_point(class_scope:contentdelivery.ListLocalesRequest)
+  })
+_sym_db.RegisterMessage(ListLocalesRequest)
+
+ListLocalesResponse = _reflection.GeneratedProtocolMessageType('ListLocalesResponse', (_message.Message,), {
+  'DESCRIPTOR' : _LISTLOCALESRESPONSE,
+  '__module__' : 'contentdelivery.contentdelivery_pb2'
+  # @@protoc_insertion_point(class_scope:contentdelivery.ListLocalesResponse)
+  })
+_sym_db.RegisterMessage(ListLocalesResponse)
+
+GetEnvironmentRequest = _reflection.GeneratedProtocolMessageType('GetEnvironmentRequest', (_message.Message,), {
+  'DESCRIPTOR' : _GETENVIRONMENTREQUEST,
+  '__module__' : 'contentdelivery.contentdelivery_pb2'
+  # @@protoc_insertion_point(class_scope:contentdelivery.GetEnvironmentRequest)
+  })
+_sym_db.RegisterMessage(GetEnvironmentRequest)
+
+GetEnvironmentResponse = _reflection.GeneratedProtocolMessageType('GetEnvironmentResponse', (_message.Message,), {
+  'DESCRIPTOR' : _GETENVIRONMENTRESPONSE,
+  '__module__' : 'contentdelivery.contentdelivery_pb2'
+  # @@protoc_insertion_point(class_scope:contentdelivery.GetEnvironmentResponse)
+  })
+_sym_db.RegisterMessage(GetEnvironmentResponse)
+
+GetCollectionRequest = _reflection.GeneratedProtocolMessageType('GetCollectionRequest', (_message.Message,), {
+  'DESCRIPTOR' : _GETCOLLECTIONREQUEST,
+  '__module__' : 'contentdelivery.contentdelivery_pb2'
+  # @@protoc_insertion_point(class_scope:contentdelivery.GetCollectionRequest)
+  })
+_sym_db.RegisterMessage(GetCollectionRequest)
+
+GetCollectionResponse = _reflection.GeneratedProtocolMessageType('GetCollectionResponse', (_message.Message,), {
+  'DESCRIPTOR' : _GETCOLLECTIONRESPONSE,
+  '__module__' : 'contentdelivery.contentdelivery_pb2'
+  # @@protoc_insertion_point(class_scope:contentdelivery.GetCollectionResponse)
+  })
+_sym_db.RegisterMessage(GetCollectionResponse)
+
+ListCollectionsRequest = _reflection.GeneratedProtocolMessageType('ListCollectionsRequest', (_message.Message,), {
+  'DESCRIPTOR' : _LISTCOLLECTIONSREQUEST,
+  '__module__' : 'contentdelivery.contentdelivery_pb2'
+  # @@protoc_insertion_point(class_scope:contentdelivery.ListCollectionsRequest)
+  })
+_sym_db.RegisterMessage(ListCollectionsRequest)
+
+ListCollectionsResponse = _reflection.GeneratedProtocolMessageType('ListCollectionsResponse', (_message.Message,), {
+  'DESCRIPTOR' : _LISTCOLLECTIONSRESPONSE,
+  '__module__' : 'contentdelivery.contentdelivery_pb2'
+  # @@protoc_insertion_point(class_scope:contentdelivery.ListCollectionsResponse)
+  })
+_sym_db.RegisterMessage(ListCollectionsResponse)
+
+GetItemRequest = _reflection.GeneratedProtocolMessageType('GetItemRequest', (_message.Message,), {
+  'DESCRIPTOR' : _GETITEMREQUEST,
+  '__module__' : 'contentdelivery.contentdelivery_pb2'
+  # @@protoc_insertion_point(class_scope:contentdelivery.GetItemRequest)
+  })
+_sym_db.RegisterMessage(GetItemRequest)
+
+GetItemResponse = _reflection.GeneratedProtocolMessageType('GetItemResponse', (_message.Message,), {
+  'DESCRIPTOR' : _GETITEMRESPONSE,
+  '__module__' : 'contentdelivery.contentdelivery_pb2'
+  # @@protoc_insertion_point(class_scope:contentdelivery.GetItemResponse)
+  })
+_sym_db.RegisterMessage(GetItemResponse)
+
+FindItemsRequest = _reflection.GeneratedProtocolMessageType('FindItemsRequest', (_message.Message,), {
+  'DESCRIPTOR' : _FINDITEMSREQUEST,
+  '__module__' : 'contentdelivery.contentdelivery_pb2'
+  # @@protoc_insertion_point(class_scope:contentdelivery.FindItemsRequest)
+  })
+_sym_db.RegisterMessage(FindItemsRequest)
+
+FindItemsResponse = _reflection.GeneratedProtocolMessageType('FindItemsResponse', (_message.Message,), {
+  'DESCRIPTOR' : _FINDITEMSRESPONSE,
+  '__module__' : 'contentdelivery.contentdelivery_pb2'
+  # @@protoc_insertion_point(class_scope:contentdelivery.FindItemsResponse)
+  })
+_sym_db.RegisterMessage(FindItemsResponse)
+
+
+DESCRIPTOR._options = None
+
+_CONTENTDELIVERY = _descriptor.ServiceDescriptor(
+  name='ContentDelivery',
+  full_name='contentdelivery.ContentDelivery',
+  file=DESCRIPTOR,
+  index=0,
+  serialized_options=None,
+  create_key=_descriptor._internal_create_key,
+  serialized_start=1065,
+  serialized_end=1726,
+  methods=[
+  _descriptor.MethodDescriptor(
+    name='GetSpace',
+    full_name='contentdelivery.ContentDelivery.GetSpace',
+    index=0,
+    containing_service=None,
+    input_type=_GETSPACEREQUEST,
+    output_type=_GETSPACERESPONSE,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='ListLocales',
+    full_name='contentdelivery.ContentDelivery.ListLocales',
+    index=1,
+    containing_service=None,
+    input_type=_LISTLOCALESREQUEST,
+    output_type=_LISTLOCALESRESPONSE,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='GetEnvironment',
+    full_name='contentdelivery.ContentDelivery.GetEnvironment',
+    index=2,
+    containing_service=None,
+    input_type=_GETENVIRONMENTREQUEST,
+    output_type=_GETENVIRONMENTRESPONSE,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='GetCollection',
+    full_name='contentdelivery.ContentDelivery.GetCollection',
+    index=3,
+    containing_service=None,
+    input_type=_GETCOLLECTIONREQUEST,
+    output_type=_GETCOLLECTIONRESPONSE,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='ListCollections',
+    full_name='contentdelivery.ContentDelivery.ListCollections',
+    index=4,
+    containing_service=None,
+    input_type=_LISTCOLLECTIONSREQUEST,
+    output_type=_LISTCOLLECTIONSRESPONSE,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='GetItem',
+    full_name='contentdelivery.ContentDelivery.GetItem',
+    index=5,
+    containing_service=None,
+    input_type=_GETITEMREQUEST,
+    output_type=_GETITEMRESPONSE,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='FindItems',
+    full_name='contentdelivery.ContentDelivery.FindItems',
+    index=6,
+    containing_service=None,
+    input_type=_FINDITEMSREQUEST,
+    output_type=_FINDITEMSRESPONSE,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+])
+_sym_db.RegisterServiceDescriptor(_CONTENTDELIVERY)
+
+DESCRIPTOR.services_by_name['ContentDelivery'] = _CONTENTDELIVERY
+
+# @@protoc_insertion_point(module_scope)
diff --git a/perxis/contentdelivery/contentdelivery_pb2_grpc.py b/perxis/contentdelivery/contentdelivery_pb2_grpc.py
new file mode 100644
index 0000000..da17b05
--- /dev/null
+++ b/perxis/contentdelivery/contentdelivery_pb2_grpc.py
@@ -0,0 +1,264 @@
+# Generated by the gRPC Python protocol compiler plugin. DO NOT EDIT!
+"""Client and server classes corresponding to protobuf-defined services."""
+import grpc
+
+from contentdelivery import contentdelivery_pb2 as contentdelivery_dot_contentdelivery__pb2
+
+
+class ContentDeliveryStub(object):
+    """Missing associated documentation comment in .proto file."""
+
+    def __init__(self, channel):
+        """Constructor.
+
+        Args:
+            channel: A grpc.Channel.
+        """
+        self.GetSpace = channel.unary_unary(
+                '/contentdelivery.ContentDelivery/GetSpace',
+                request_serializer=contentdelivery_dot_contentdelivery__pb2.GetSpaceRequest.SerializeToString,
+                response_deserializer=contentdelivery_dot_contentdelivery__pb2.GetSpaceResponse.FromString,
+                )
+        self.ListLocales = channel.unary_unary(
+                '/contentdelivery.ContentDelivery/ListLocales',
+                request_serializer=contentdelivery_dot_contentdelivery__pb2.ListLocalesRequest.SerializeToString,
+                response_deserializer=contentdelivery_dot_contentdelivery__pb2.ListLocalesResponse.FromString,
+                )
+        self.GetEnvironment = channel.unary_unary(
+                '/contentdelivery.ContentDelivery/GetEnvironment',
+                request_serializer=contentdelivery_dot_contentdelivery__pb2.GetEnvironmentRequest.SerializeToString,
+                response_deserializer=contentdelivery_dot_contentdelivery__pb2.GetEnvironmentResponse.FromString,
+                )
+        self.GetCollection = channel.unary_unary(
+                '/contentdelivery.ContentDelivery/GetCollection',
+                request_serializer=contentdelivery_dot_contentdelivery__pb2.GetCollectionRequest.SerializeToString,
+                response_deserializer=contentdelivery_dot_contentdelivery__pb2.GetCollectionResponse.FromString,
+                )
+        self.ListCollections = channel.unary_unary(
+                '/contentdelivery.ContentDelivery/ListCollections',
+                request_serializer=contentdelivery_dot_contentdelivery__pb2.ListCollectionsRequest.SerializeToString,
+                response_deserializer=contentdelivery_dot_contentdelivery__pb2.ListCollectionsResponse.FromString,
+                )
+        self.GetItem = channel.unary_unary(
+                '/contentdelivery.ContentDelivery/GetItem',
+                request_serializer=contentdelivery_dot_contentdelivery__pb2.GetItemRequest.SerializeToString,
+                response_deserializer=contentdelivery_dot_contentdelivery__pb2.GetItemResponse.FromString,
+                )
+        self.FindItems = channel.unary_unary(
+                '/contentdelivery.ContentDelivery/FindItems',
+                request_serializer=contentdelivery_dot_contentdelivery__pb2.FindItemsRequest.SerializeToString,
+                response_deserializer=contentdelivery_dot_contentdelivery__pb2.FindItemsResponse.FromString,
+                )
+
+
+class ContentDeliveryServicer(object):
+    """Missing associated documentation comment in .proto file."""
+
+    def GetSpace(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def ListLocales(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def GetEnvironment(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def GetCollection(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def ListCollections(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def GetItem(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def FindItems(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+
+def add_ContentDeliveryServicer_to_server(servicer, server):
+    rpc_method_handlers = {
+            'GetSpace': grpc.unary_unary_rpc_method_handler(
+                    servicer.GetSpace,
+                    request_deserializer=contentdelivery_dot_contentdelivery__pb2.GetSpaceRequest.FromString,
+                    response_serializer=contentdelivery_dot_contentdelivery__pb2.GetSpaceResponse.SerializeToString,
+            ),
+            'ListLocales': grpc.unary_unary_rpc_method_handler(
+                    servicer.ListLocales,
+                    request_deserializer=contentdelivery_dot_contentdelivery__pb2.ListLocalesRequest.FromString,
+                    response_serializer=contentdelivery_dot_contentdelivery__pb2.ListLocalesResponse.SerializeToString,
+            ),
+            'GetEnvironment': grpc.unary_unary_rpc_method_handler(
+                    servicer.GetEnvironment,
+                    request_deserializer=contentdelivery_dot_contentdelivery__pb2.GetEnvironmentRequest.FromString,
+                    response_serializer=contentdelivery_dot_contentdelivery__pb2.GetEnvironmentResponse.SerializeToString,
+            ),
+            'GetCollection': grpc.unary_unary_rpc_method_handler(
+                    servicer.GetCollection,
+                    request_deserializer=contentdelivery_dot_contentdelivery__pb2.GetCollectionRequest.FromString,
+                    response_serializer=contentdelivery_dot_contentdelivery__pb2.GetCollectionResponse.SerializeToString,
+            ),
+            'ListCollections': grpc.unary_unary_rpc_method_handler(
+                    servicer.ListCollections,
+                    request_deserializer=contentdelivery_dot_contentdelivery__pb2.ListCollectionsRequest.FromString,
+                    response_serializer=contentdelivery_dot_contentdelivery__pb2.ListCollectionsResponse.SerializeToString,
+            ),
+            'GetItem': grpc.unary_unary_rpc_method_handler(
+                    servicer.GetItem,
+                    request_deserializer=contentdelivery_dot_contentdelivery__pb2.GetItemRequest.FromString,
+                    response_serializer=contentdelivery_dot_contentdelivery__pb2.GetItemResponse.SerializeToString,
+            ),
+            'FindItems': grpc.unary_unary_rpc_method_handler(
+                    servicer.FindItems,
+                    request_deserializer=contentdelivery_dot_contentdelivery__pb2.FindItemsRequest.FromString,
+                    response_serializer=contentdelivery_dot_contentdelivery__pb2.FindItemsResponse.SerializeToString,
+            ),
+    }
+    generic_handler = grpc.method_handlers_generic_handler(
+            'contentdelivery.ContentDelivery', rpc_method_handlers)
+    server.add_generic_rpc_handlers((generic_handler,))
+
+
+ # This class is part of an EXPERIMENTAL API.
+class ContentDelivery(object):
+    """Missing associated documentation comment in .proto file."""
+
+    @staticmethod
+    def GetSpace(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/contentdelivery.ContentDelivery/GetSpace',
+            contentdelivery_dot_contentdelivery__pb2.GetSpaceRequest.SerializeToString,
+            contentdelivery_dot_contentdelivery__pb2.GetSpaceResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def ListLocales(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/contentdelivery.ContentDelivery/ListLocales',
+            contentdelivery_dot_contentdelivery__pb2.ListLocalesRequest.SerializeToString,
+            contentdelivery_dot_contentdelivery__pb2.ListLocalesResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def GetEnvironment(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/contentdelivery.ContentDelivery/GetEnvironment',
+            contentdelivery_dot_contentdelivery__pb2.GetEnvironmentRequest.SerializeToString,
+            contentdelivery_dot_contentdelivery__pb2.GetEnvironmentResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def GetCollection(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/contentdelivery.ContentDelivery/GetCollection',
+            contentdelivery_dot_contentdelivery__pb2.GetCollectionRequest.SerializeToString,
+            contentdelivery_dot_contentdelivery__pb2.GetCollectionResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def ListCollections(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/contentdelivery.ContentDelivery/ListCollections',
+            contentdelivery_dot_contentdelivery__pb2.ListCollectionsRequest.SerializeToString,
+            contentdelivery_dot_contentdelivery__pb2.ListCollectionsResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def GetItem(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/contentdelivery.ContentDelivery/GetItem',
+            contentdelivery_dot_contentdelivery__pb2.GetItemRequest.SerializeToString,
+            contentdelivery_dot_contentdelivery__pb2.GetItemResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def FindItems(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/contentdelivery.ContentDelivery/FindItems',
+            contentdelivery_dot_contentdelivery__pb2.FindItemsRequest.SerializeToString,
+            contentdelivery_dot_contentdelivery__pb2.FindItemsResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
diff --git a/perxis/contentmanagement/__init__.py b/perxis/contentmanagement/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/perxis/contentmanagement/contentmanagment_pb2.py b/perxis/contentmanagement/contentmanagment_pb2.py
new file mode 100644
index 0000000..482a8f5
--- /dev/null
+++ b/perxis/contentmanagement/contentmanagment_pb2.py
@@ -0,0 +1,3367 @@
+# -*- coding: utf-8 -*-
+# Generated by the protocol buffer compiler.  DO NOT EDIT!
+# source: contentmanagement/contentmanagment.proto
+"""Generated protocol buffer code."""
+from google.protobuf import descriptor as _descriptor
+from google.protobuf import message as _message
+from google.protobuf import reflection as _reflection
+from google.protobuf import symbol_database as _symbol_database
+# @@protoc_insertion_point(imports)
+
+_sym_db = _symbol_database.Default()
+
+
+from google.protobuf import empty_pb2 as google_dot_protobuf_dot_empty__pb2
+from common import common_pb2 as common_dot_common__pb2
+
+
+DESCRIPTOR = _descriptor.FileDescriptor(
+  name='contentmanagement/contentmanagment.proto',
+  package='contentmanagement',
+  syntax='proto3',
+  serialized_options=b'ZDgithub.com/perxteam/perxis/proto/contentmanagement;contentmanagement',
+  create_key=_descriptor._internal_create_key,
+  serialized_pb=b'\n(contentmanagement/contentmanagment.proto\x12\x11\x63ontentmanagement\x1a\x1bgoogle/protobuf/empty.proto\x1a\x13\x63ommon/common.proto\"A\n\x17\x43reateCollectionRequest\x12&\n\ncollection\x18\x01 \x01(\x0b\x32\x12.common.Collection\"B\n\x18\x43reateCollectionResponse\x12&\n\ncollection\x18\x01 \x01(\x0b\x32\x12.common.Collection\"L\n\x14GetCollectionRequest\x12\n\n\x02id\x18\x01 \x01(\t\x12\x16\n\x0e\x65nvironment_id\x18\x02 \x01(\t\x12\x10\n\x08space_id\x18\x03 \x01(\t\"?\n\x15GetCollectionResponse\x12&\n\ncollection\x18\x01 \x01(\x0b\x32\x12.common.Collection\"B\n\x16ListCollectionsRequest\x12\x16\n\x0e\x65nvironment_id\x18\x01 \x01(\t\x12\x10\n\x08space_id\x18\x02 \x01(\t\"B\n\x17ListCollectionsResponse\x12\'\n\x0b\x63ollections\x18\x01 \x03(\x0b\x32\x12.common.Collection\"w\n\x17UpdateCollectionRequest\x12\n\n\x02id\x18\x01 \x01(\t\x12\x16\n\x0e\x65nvironment_id\x18\x02 \x01(\t\x12\x10\n\x08space_id\x18\x03 \x01(\t\x12&\n\ncollection\x18\x04 \x01(\x0b\x32\x12.common.Collection\"\x1a\n\x18UpdateCollectionResponse\"O\n\x17\x44\x65leteCollectionRequest\x12\n\n\x02id\x18\x01 \x01(\t\x12\x16\n\x0e\x65nvironment_id\x18\x02 \x01(\t\x12\x10\n\x08space_id\x18\x03 \x01(\t\"\x1a\n\x18\x44\x65leteCollectionResponse\"/\n\x11\x43reateItemRequest\x12\x1a\n\x04item\x18\x01 \x01(\x0b\x32\x0c.common.Item\"0\n\x12\x43reateItemResponse\x12\x1a\n\x04item\x18\x01 \x01(\x0b\x32\x0c.common.Item\"]\n\x0eGetItemRequest\x12\n\n\x02id\x18\x01 \x01(\t\x12\x16\n\x0e\x65nvironment_id\x18\x02 \x01(\t\x12\x10\n\x08space_id\x18\x03 \x01(\t\x12\x15\n\rcollection_id\x18\x04 \x01(\t\"-\n\x0fGetItemResponse\x12\x1a\n\x04item\x18\x01 \x01(\x0b\x32\x0c.common.Item\"p\n\x11UpdateItemRequest\x12\x16\n\x0e\x65nvironment_id\x18\x01 \x01(\t\x12\x10\n\x08space_id\x18\x02 \x01(\t\x12\x15\n\rcollection_id\x18\x03 \x01(\t\x12\x1a\n\x04item\x18\x04 \x01(\x0b\x32\x0c.common.Item\"0\n\x12UpdateItemResponse\x12\x1a\n\x04item\x18\x01 \x01(\x0b\x32\x0c.common.Item\"`\n\x11\x44\x65leteItemRequest\x12\n\n\x02id\x18\x01 \x01(\t\x12\x16\n\x0e\x65nvironment_id\x18\x02 \x01(\t\x12\x10\n\x08space_id\x18\x03 \x01(\t\x12\x15\n\rcollection_id\x18\x04 \x01(\t\"\x14\n\x12\x44\x65leteItemResponse\"a\n\x12PublishItemRequest\x12\n\n\x02id\x18\x01 \x01(\t\x12\x16\n\x0e\x65nvironment_id\x18\x02 \x01(\t\x12\x10\n\x08space_id\x18\x03 \x01(\t\x12\x15\n\rcollection_id\x18\x04 \x01(\t\"\x15\n\x13PublishItemResponse\"c\n\x14UnpublishItemRequest\x12\n\n\x02id\x18\x01 \x01(\t\x12\x16\n\x0e\x65nvironment_id\x18\x02 \x01(\t\x12\x10\n\x08space_id\x18\x03 \x01(\t\x12\x15\n\rcollection_id\x18\x04 \x01(\t\"\x17\n\x15UnpublishItemResponse\"a\n\x12\x41rchiveItemRequest\x12\n\n\x02id\x18\x01 \x01(\t\x12\x16\n\x0e\x65nvironment_id\x18\x02 \x01(\t\x12\x10\n\x08space_id\x18\x03 \x01(\t\x12\x15\n\rcollection_id\x18\x04 \x01(\t\"\x15\n\x13\x41rchiveItemResponse\"c\n\x14UnarchiveItemRequest\x12\n\n\x02id\x18\x01 \x01(\t\x12\x16\n\x0e\x65nvironment_id\x18\x02 \x01(\t\x12\x10\n\x08space_id\x18\x03 \x01(\t\x12\x15\n\rcollection_id\x18\x04 \x01(\t\"\x17\n\x15UnarchiveItemResponse\"g\n\x18ListItemRevisionsRequest\x12\n\n\x02id\x18\x01 \x01(\t\x12\x16\n\x0e\x65nvironment_id\x18\x02 \x01(\t\x12\x10\n\x08space_id\x18\x03 \x01(\t\x12\x15\n\rcollection_id\x18\x04 \x01(\t\"8\n\x19ListItemRevisionsResponse\x12\x1b\n\x05items\x18\x01 \x03(\x0b\x32\x0c.common.Item\"z\n\x16GetItemRevisionRequest\x12\n\n\x02id\x18\x01 \x01(\t\x12\x16\n\x0e\x65nvironment_id\x18\x02 \x01(\t\x12\x10\n\x08space_id\x18\x03 \x01(\t\x12\x15\n\rcollection_id\x18\x04 \x01(\t\x12\x13\n\x0brevision_id\x18\x05 \x01(\t\"5\n\x17GetItemRevisionResponse\x12\x1a\n\x04item\x18\x01 \x01(\x0b\x32\x0c.common.Item\"\xa4\x01\n\x10\x46indItemsRequest\x12\x10\n\x08space_id\x18\x01 \x01(\t\x12\x16\n\x0e\x65nvironment_id\x18\x02 \x01(\t\x12\x15\n\rcollection_id\x18\x03 \x01(\t\x12\x1c\n\x04\x64\x61ta\x18\x04 \x03(\x0b\x32\x0e.common.Filter\x12\x10\n\x08page_num\x18\x08 \x01(\x05\x12\x11\n\tpage_size\x18\t \x01(\x05\x12\x0c\n\x04sort\x18\n \x03(\t\"?\n\x11\x46indItemsResponse\x12\x1b\n\x05items\x18\x01 \x03(\x0b\x32\x0c.common.Item\x12\r\n\x05total\x18\x02 \x01(\x05\"\xac\x01\n\x18\x46indArchivedItemsRequest\x12\x10\n\x08space_id\x18\x01 \x01(\t\x12\x16\n\x0e\x65nvironment_id\x18\x02 \x01(\t\x12\x15\n\rcollection_id\x18\x03 \x01(\t\x12\x1c\n\x04\x64\x61ta\x18\x04 \x03(\x0b\x32\x0e.common.Filter\x12\x10\n\x08page_num\x18\x08 \x01(\x05\x12\x11\n\tpage_size\x18\t \x01(\x05\x12\x0c\n\x04sort\x18\n \x03(\t\"G\n\x19\x46indArchivedItemsResponse\x12\x1b\n\x05items\x18\x01 \x03(\x0b\x32\x0c.common.Item\x12\r\n\x05total\x18\x02 \x01(\x05\"9\n\x19\x43ontentCreateSpaceRequest\x12\x1c\n\x05space\x18\x01 \x01(\x0b\x32\r.common.Space\":\n\x1a\x43ontentCreateSpaceResponse\x12\x1c\n\x05space\x18\x01 \x01(\x0b\x32\r.common.Space\"\'\n\x19\x43ontentDeleteSpaceRequest\x12\n\n\x02id\x18\x01 \x01(\t\"$\n\x16\x43ontentGetSpaceRequest\x12\n\n\x02id\x18\x01 \x01(\t\"7\n\x17\x43ontentGetSpaceResponse\x12\x1c\n\x05space\x18\x01 \x01(\x0b\x32\r.common.Space\"\x13\n\x11ListSpacesRequest\"3\n\x12ListSpacesResponse\x12\x1d\n\x06spaces\x18\x01 \x03(\x0b\x32\r.common.Space\"5\n\x13\x43reateLocaleRequest\x12\x1e\n\x06locale\x18\x01 \x01(\x0b\x32\x0e.common.Locale\"6\n\x14\x43reateLocaleResponse\x12\x1e\n\x06locale\x18\x01 \x01(\x0b\x32\x0e.common.Locale\"&\n\x12ListLocalesRequest\x12\x10\n\x08space_id\x18\x01 \x01(\t\"6\n\x13ListLocalesResponse\x12\x1f\n\x07locales\x18\x01 \x03(\x0b\x32\x0e.common.Locale\"3\n\x13\x44\x65leteLocaleRequest\x12\n\n\x02id\x18\x01 \x01(\t\x12\x10\n\x08space_id\x18\x02 \x01(\t\"\x16\n\x14\x44\x65leteLocaleResponse\"a\n\x18\x43reateEnvironmentRequest\x12\x1b\n\x13\x62\x61se_environment_id\x18\x01 \x01(\t\x12(\n\x0b\x65nvironment\x18\x02 \x01(\x0b\x32\x13.common.Environment\"E\n\x19\x43reateEnvironmentResponse\x12(\n\x0b\x65nvironment\x18\x01 \x01(\x0b\x32\x13.common.Environment\"5\n\x15GetEnvironmentRequest\x12\n\n\x02id\x18\x01 \x01(\t\x12\x10\n\x08space_id\x18\x02 \x01(\t\"B\n\x16GetEnvironmentResponse\x12(\n\x0b\x65nvironment\x18\x01 \x01(\x0b\x32\x13.common.Environment\"+\n\x17ListEnvironmentsRequest\x12\x10\n\x08space_id\x18\x01 \x01(\t\"E\n\x18ListEnvironmentsResponse\x12)\n\x0c\x65nvironments\x18\x01 \x03(\x0b\x32\x13.common.Environment\"b\n\x18UpdateEnvironmentRequest\x12\n\n\x02id\x18\x01 \x01(\t\x12\x10\n\x08space_id\x18\x02 \x01(\t\x12(\n\x0b\x65nvironment\x18\x03 \x01(\x0b\x32\x13.common.Environment\"\x1b\n\x19UpdateEnvironmentResponse\"8\n\x18\x44\x65leteEnvironmentRequest\x12\n\n\x02id\x18\x01 \x01(\t\x12\x10\n\x08space_id\x18\x02 \x01(\t\"\x1b\n\x19\x44\x65leteEnvironmentResponse\"I\n\x1aSetEnvironmentAliasRequest\x12\n\n\x02id\x18\x01 \x01(\t\x12\x10\n\x08space_id\x18\x02 \x01(\t\x12\r\n\x05\x61lias\x18\x03 \x01(\t\"\x1d\n\x1bSetEnvironmentAliasResponse\"L\n\x1dRemoveEnvironmentAliasRequest\x12\n\n\x02id\x18\x01 \x01(\t\x12\x10\n\x08space_id\x18\x02 \x01(\t\x12\r\n\x05\x61lias\x18\x03 \x01(\t\" \n\x1eRemoveEnvironmentAliasResponse\"?\n\x16\x43reateSpaceRoleRequest\x12%\n\nspace_role\x18\x01 \x01(\x0b\x32\x11.common.SpaceRole\"?\n\x16UpdateSpaceRoleRequest\x12%\n\nspace_role\x18\x01 \x01(\x0b\x32\x11.common.SpaceRole\")\n\x15ListSpaceRolesRequest\x12\x10\n\x08space_id\x18\x01 \x01(\t\"@\n\x16ListSpaceRolesResponse\x12&\n\x0bspace_roles\x18\x01 \x03(\x0b\x32\x11.common.SpaceRole\"6\n\x16\x44\x65leteSpaceRoleRequest\x12\n\n\x02id\x18\x01 \x01(\t\x12\x10\n\x08space_id\x18\x02 \x01(\t2\xa4\x17\n\x11\x43ontentManagement\x12m\n\x10\x43reateCollection\x12*.contentmanagement.CreateCollectionRequest\x1a+.contentmanagement.CreateCollectionResponse\"\x00\x12\x64\n\rGetCollection\x12\'.contentmanagement.GetCollectionRequest\x1a(.contentmanagement.GetCollectionResponse\"\x00\x12j\n\x0fListCollections\x12).contentmanagement.ListCollectionsRequest\x1a*.contentmanagement.ListCollectionsResponse\"\x00\x12X\n\x10UpdateCollection\x12*.contentmanagement.UpdateCollectionRequest\x1a\x16.google.protobuf.Empty\"\x00\x12X\n\x10\x44\x65leteCollection\x12*.contentmanagement.DeleteCollectionRequest\x1a\x16.google.protobuf.Empty\"\x00\x12[\n\nCreateItem\x12$.contentmanagement.CreateItemRequest\x1a%.contentmanagement.CreateItemResponse\"\x00\x12R\n\x07GetItem\x12!.contentmanagement.GetItemRequest\x1a\".contentmanagement.GetItemResponse\"\x00\x12[\n\nUpdateItem\x12$.contentmanagement.UpdateItemRequest\x1a%.contentmanagement.UpdateItemResponse\"\x00\x12L\n\nDeleteItem\x12$.contentmanagement.DeleteItemRequest\x1a\x16.google.protobuf.Empty\"\x00\x12N\n\x0bPublishItem\x12%.contentmanagement.PublishItemRequest\x1a\x16.google.protobuf.Empty\"\x00\x12R\n\rUnpublishItem\x12\'.contentmanagement.UnpublishItemRequest\x1a\x16.google.protobuf.Empty\"\x00\x12N\n\x0b\x41rchiveItem\x12%.contentmanagement.ArchiveItemRequest\x1a\x16.google.protobuf.Empty\"\x00\x12R\n\rUnarchiveItem\x12\'.contentmanagement.UnarchiveItemRequest\x1a\x16.google.protobuf.Empty\"\x00\x12p\n\x11ListItemRevisions\x12+.contentmanagement.ListItemRevisionsRequest\x1a,.contentmanagement.ListItemRevisionsResponse\"\x00\x12j\n\x0fGetItemRevision\x12).contentmanagement.GetItemRevisionRequest\x1a*.contentmanagement.GetItemRevisionResponse\"\x00\x12X\n\tFindItems\x12#.contentmanagement.FindItemsRequest\x1a$.contentmanagement.FindItemsResponse\"\x00\x12p\n\x11\x46indArchivedItems\x12+.contentmanagement.FindArchivedItemsRequest\x1a,.contentmanagement.FindArchivedItemsResponse\"\x00\x12\x61\n\x0c\x43reateLocale\x12&.contentmanagement.CreateLocaleRequest\x1a\'.contentmanagement.CreateLocaleResponse\"\x00\x12^\n\x0bListLocales\x12%.contentmanagement.ListLocalesRequest\x1a&.contentmanagement.ListLocalesResponse\"\x00\x12P\n\x0c\x44\x65leteLocale\x12&.contentmanagement.DeleteLocaleRequest\x1a\x16.google.protobuf.Empty\"\x00\x12p\n\x11\x43reateEnvironment\x12+.contentmanagement.CreateEnvironmentRequest\x1a,.contentmanagement.CreateEnvironmentResponse\"\x00\x12g\n\x0eGetEnvironment\x12(.contentmanagement.GetEnvironmentRequest\x1a).contentmanagement.GetEnvironmentResponse\"\x00\x12m\n\x10ListEnvironments\x12*.contentmanagement.ListEnvironmentsRequest\x1a+.contentmanagement.ListEnvironmentsResponse\"\x00\x12Z\n\x11UpdateEnvironment\x12+.contentmanagement.UpdateEnvironmentRequest\x1a\x16.google.protobuf.Empty\"\x00\x12Z\n\x11\x44\x65leteEnvironment\x12+.contentmanagement.DeleteEnvironmentRequest\x1a\x16.google.protobuf.Empty\"\x00\x12^\n\x13SetEnvironmentAlias\x12-.contentmanagement.SetEnvironmentAliasRequest\x1a\x16.google.protobuf.Empty\"\x00\x12\x64\n\x16RemoveEnvironmentAlias\x12\x30.contentmanagement.RemoveEnvironmentAliasRequest\x1a\x16.google.protobuf.Empty\"\x00\x12V\n\x0f\x43reateSpaceRole\x12).contentmanagement.CreateSpaceRoleRequest\x1a\x16.google.protobuf.Empty\"\x00\x12V\n\x0fUpdateSpaceRole\x12).contentmanagement.UpdateSpaceRoleRequest\x1a\x16.google.protobuf.Empty\"\x00\x12g\n\x0eListSpaceRoles\x12(.contentmanagement.ListSpaceRolesRequest\x1a).contentmanagement.ListSpaceRolesResponse\"\x00\x12V\n\x0f\x44\x65leteSpaceRole\x12).contentmanagement.DeleteSpaceRoleRequest\x1a\x16.google.protobuf.Empty\"\x00\x42\x46ZDgithub.com/perxteam/perxis/proto/contentmanagement;contentmanagementb\x06proto3'
+  ,
+  dependencies=[google_dot_protobuf_dot_empty__pb2.DESCRIPTOR,common_dot_common__pb2.DESCRIPTOR,])
+
+
+
+
+_CREATECOLLECTIONREQUEST = _descriptor.Descriptor(
+  name='CreateCollectionRequest',
+  full_name='contentmanagement.CreateCollectionRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='collection', full_name='contentmanagement.CreateCollectionRequest.collection', index=0,
+      number=1, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=113,
+  serialized_end=178,
+)
+
+
+_CREATECOLLECTIONRESPONSE = _descriptor.Descriptor(
+  name='CreateCollectionResponse',
+  full_name='contentmanagement.CreateCollectionResponse',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='collection', full_name='contentmanagement.CreateCollectionResponse.collection', index=0,
+      number=1, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=180,
+  serialized_end=246,
+)
+
+
+_GETCOLLECTIONREQUEST = _descriptor.Descriptor(
+  name='GetCollectionRequest',
+  full_name='contentmanagement.GetCollectionRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='id', full_name='contentmanagement.GetCollectionRequest.id', index=0,
+      number=1, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='environment_id', full_name='contentmanagement.GetCollectionRequest.environment_id', index=1,
+      number=2, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='space_id', full_name='contentmanagement.GetCollectionRequest.space_id', index=2,
+      number=3, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=248,
+  serialized_end=324,
+)
+
+
+_GETCOLLECTIONRESPONSE = _descriptor.Descriptor(
+  name='GetCollectionResponse',
+  full_name='contentmanagement.GetCollectionResponse',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='collection', full_name='contentmanagement.GetCollectionResponse.collection', index=0,
+      number=1, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=326,
+  serialized_end=389,
+)
+
+
+_LISTCOLLECTIONSREQUEST = _descriptor.Descriptor(
+  name='ListCollectionsRequest',
+  full_name='contentmanagement.ListCollectionsRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='environment_id', full_name='contentmanagement.ListCollectionsRequest.environment_id', index=0,
+      number=1, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='space_id', full_name='contentmanagement.ListCollectionsRequest.space_id', index=1,
+      number=2, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=391,
+  serialized_end=457,
+)
+
+
+_LISTCOLLECTIONSRESPONSE = _descriptor.Descriptor(
+  name='ListCollectionsResponse',
+  full_name='contentmanagement.ListCollectionsResponse',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='collections', full_name='contentmanagement.ListCollectionsResponse.collections', index=0,
+      number=1, type=11, cpp_type=10, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=459,
+  serialized_end=525,
+)
+
+
+_UPDATECOLLECTIONREQUEST = _descriptor.Descriptor(
+  name='UpdateCollectionRequest',
+  full_name='contentmanagement.UpdateCollectionRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='id', full_name='contentmanagement.UpdateCollectionRequest.id', index=0,
+      number=1, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='environment_id', full_name='contentmanagement.UpdateCollectionRequest.environment_id', index=1,
+      number=2, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='space_id', full_name='contentmanagement.UpdateCollectionRequest.space_id', index=2,
+      number=3, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='collection', full_name='contentmanagement.UpdateCollectionRequest.collection', index=3,
+      number=4, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=527,
+  serialized_end=646,
+)
+
+
+_UPDATECOLLECTIONRESPONSE = _descriptor.Descriptor(
+  name='UpdateCollectionResponse',
+  full_name='contentmanagement.UpdateCollectionResponse',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=648,
+  serialized_end=674,
+)
+
+
+_DELETECOLLECTIONREQUEST = _descriptor.Descriptor(
+  name='DeleteCollectionRequest',
+  full_name='contentmanagement.DeleteCollectionRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='id', full_name='contentmanagement.DeleteCollectionRequest.id', index=0,
+      number=1, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='environment_id', full_name='contentmanagement.DeleteCollectionRequest.environment_id', index=1,
+      number=2, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='space_id', full_name='contentmanagement.DeleteCollectionRequest.space_id', index=2,
+      number=3, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=676,
+  serialized_end=755,
+)
+
+
+_DELETECOLLECTIONRESPONSE = _descriptor.Descriptor(
+  name='DeleteCollectionResponse',
+  full_name='contentmanagement.DeleteCollectionResponse',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=757,
+  serialized_end=783,
+)
+
+
+_CREATEITEMREQUEST = _descriptor.Descriptor(
+  name='CreateItemRequest',
+  full_name='contentmanagement.CreateItemRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='item', full_name='contentmanagement.CreateItemRequest.item', index=0,
+      number=1, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=785,
+  serialized_end=832,
+)
+
+
+_CREATEITEMRESPONSE = _descriptor.Descriptor(
+  name='CreateItemResponse',
+  full_name='contentmanagement.CreateItemResponse',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='item', full_name='contentmanagement.CreateItemResponse.item', index=0,
+      number=1, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=834,
+  serialized_end=882,
+)
+
+
+_GETITEMREQUEST = _descriptor.Descriptor(
+  name='GetItemRequest',
+  full_name='contentmanagement.GetItemRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='id', full_name='contentmanagement.GetItemRequest.id', index=0,
+      number=1, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='environment_id', full_name='contentmanagement.GetItemRequest.environment_id', index=1,
+      number=2, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='space_id', full_name='contentmanagement.GetItemRequest.space_id', index=2,
+      number=3, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='collection_id', full_name='contentmanagement.GetItemRequest.collection_id', index=3,
+      number=4, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=884,
+  serialized_end=977,
+)
+
+
+_GETITEMRESPONSE = _descriptor.Descriptor(
+  name='GetItemResponse',
+  full_name='contentmanagement.GetItemResponse',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='item', full_name='contentmanagement.GetItemResponse.item', index=0,
+      number=1, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=979,
+  serialized_end=1024,
+)
+
+
+_UPDATEITEMREQUEST = _descriptor.Descriptor(
+  name='UpdateItemRequest',
+  full_name='contentmanagement.UpdateItemRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='environment_id', full_name='contentmanagement.UpdateItemRequest.environment_id', index=0,
+      number=1, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='space_id', full_name='contentmanagement.UpdateItemRequest.space_id', index=1,
+      number=2, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='collection_id', full_name='contentmanagement.UpdateItemRequest.collection_id', index=2,
+      number=3, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='item', full_name='contentmanagement.UpdateItemRequest.item', index=3,
+      number=4, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=1026,
+  serialized_end=1138,
+)
+
+
+_UPDATEITEMRESPONSE = _descriptor.Descriptor(
+  name='UpdateItemResponse',
+  full_name='contentmanagement.UpdateItemResponse',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='item', full_name='contentmanagement.UpdateItemResponse.item', index=0,
+      number=1, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=1140,
+  serialized_end=1188,
+)
+
+
+_DELETEITEMREQUEST = _descriptor.Descriptor(
+  name='DeleteItemRequest',
+  full_name='contentmanagement.DeleteItemRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='id', full_name='contentmanagement.DeleteItemRequest.id', index=0,
+      number=1, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='environment_id', full_name='contentmanagement.DeleteItemRequest.environment_id', index=1,
+      number=2, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='space_id', full_name='contentmanagement.DeleteItemRequest.space_id', index=2,
+      number=3, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='collection_id', full_name='contentmanagement.DeleteItemRequest.collection_id', index=3,
+      number=4, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=1190,
+  serialized_end=1286,
+)
+
+
+_DELETEITEMRESPONSE = _descriptor.Descriptor(
+  name='DeleteItemResponse',
+  full_name='contentmanagement.DeleteItemResponse',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=1288,
+  serialized_end=1308,
+)
+
+
+_PUBLISHITEMREQUEST = _descriptor.Descriptor(
+  name='PublishItemRequest',
+  full_name='contentmanagement.PublishItemRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='id', full_name='contentmanagement.PublishItemRequest.id', index=0,
+      number=1, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='environment_id', full_name='contentmanagement.PublishItemRequest.environment_id', index=1,
+      number=2, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='space_id', full_name='contentmanagement.PublishItemRequest.space_id', index=2,
+      number=3, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='collection_id', full_name='contentmanagement.PublishItemRequest.collection_id', index=3,
+      number=4, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=1310,
+  serialized_end=1407,
+)
+
+
+_PUBLISHITEMRESPONSE = _descriptor.Descriptor(
+  name='PublishItemResponse',
+  full_name='contentmanagement.PublishItemResponse',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=1409,
+  serialized_end=1430,
+)
+
+
+_UNPUBLISHITEMREQUEST = _descriptor.Descriptor(
+  name='UnpublishItemRequest',
+  full_name='contentmanagement.UnpublishItemRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='id', full_name='contentmanagement.UnpublishItemRequest.id', index=0,
+      number=1, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='environment_id', full_name='contentmanagement.UnpublishItemRequest.environment_id', index=1,
+      number=2, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='space_id', full_name='contentmanagement.UnpublishItemRequest.space_id', index=2,
+      number=3, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='collection_id', full_name='contentmanagement.UnpublishItemRequest.collection_id', index=3,
+      number=4, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=1432,
+  serialized_end=1531,
+)
+
+
+_UNPUBLISHITEMRESPONSE = _descriptor.Descriptor(
+  name='UnpublishItemResponse',
+  full_name='contentmanagement.UnpublishItemResponse',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=1533,
+  serialized_end=1556,
+)
+
+
+_ARCHIVEITEMREQUEST = _descriptor.Descriptor(
+  name='ArchiveItemRequest',
+  full_name='contentmanagement.ArchiveItemRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='id', full_name='contentmanagement.ArchiveItemRequest.id', index=0,
+      number=1, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='environment_id', full_name='contentmanagement.ArchiveItemRequest.environment_id', index=1,
+      number=2, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='space_id', full_name='contentmanagement.ArchiveItemRequest.space_id', index=2,
+      number=3, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='collection_id', full_name='contentmanagement.ArchiveItemRequest.collection_id', index=3,
+      number=4, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=1558,
+  serialized_end=1655,
+)
+
+
+_ARCHIVEITEMRESPONSE = _descriptor.Descriptor(
+  name='ArchiveItemResponse',
+  full_name='contentmanagement.ArchiveItemResponse',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=1657,
+  serialized_end=1678,
+)
+
+
+_UNARCHIVEITEMREQUEST = _descriptor.Descriptor(
+  name='UnarchiveItemRequest',
+  full_name='contentmanagement.UnarchiveItemRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='id', full_name='contentmanagement.UnarchiveItemRequest.id', index=0,
+      number=1, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='environment_id', full_name='contentmanagement.UnarchiveItemRequest.environment_id', index=1,
+      number=2, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='space_id', full_name='contentmanagement.UnarchiveItemRequest.space_id', index=2,
+      number=3, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='collection_id', full_name='contentmanagement.UnarchiveItemRequest.collection_id', index=3,
+      number=4, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=1680,
+  serialized_end=1779,
+)
+
+
+_UNARCHIVEITEMRESPONSE = _descriptor.Descriptor(
+  name='UnarchiveItemResponse',
+  full_name='contentmanagement.UnarchiveItemResponse',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=1781,
+  serialized_end=1804,
+)
+
+
+_LISTITEMREVISIONSREQUEST = _descriptor.Descriptor(
+  name='ListItemRevisionsRequest',
+  full_name='contentmanagement.ListItemRevisionsRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='id', full_name='contentmanagement.ListItemRevisionsRequest.id', index=0,
+      number=1, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='environment_id', full_name='contentmanagement.ListItemRevisionsRequest.environment_id', index=1,
+      number=2, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='space_id', full_name='contentmanagement.ListItemRevisionsRequest.space_id', index=2,
+      number=3, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='collection_id', full_name='contentmanagement.ListItemRevisionsRequest.collection_id', index=3,
+      number=4, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=1806,
+  serialized_end=1909,
+)
+
+
+_LISTITEMREVISIONSRESPONSE = _descriptor.Descriptor(
+  name='ListItemRevisionsResponse',
+  full_name='contentmanagement.ListItemRevisionsResponse',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='items', full_name='contentmanagement.ListItemRevisionsResponse.items', index=0,
+      number=1, type=11, cpp_type=10, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=1911,
+  serialized_end=1967,
+)
+
+
+_GETITEMREVISIONREQUEST = _descriptor.Descriptor(
+  name='GetItemRevisionRequest',
+  full_name='contentmanagement.GetItemRevisionRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='id', full_name='contentmanagement.GetItemRevisionRequest.id', index=0,
+      number=1, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='environment_id', full_name='contentmanagement.GetItemRevisionRequest.environment_id', index=1,
+      number=2, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='space_id', full_name='contentmanagement.GetItemRevisionRequest.space_id', index=2,
+      number=3, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='collection_id', full_name='contentmanagement.GetItemRevisionRequest.collection_id', index=3,
+      number=4, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='revision_id', full_name='contentmanagement.GetItemRevisionRequest.revision_id', index=4,
+      number=5, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=1969,
+  serialized_end=2091,
+)
+
+
+_GETITEMREVISIONRESPONSE = _descriptor.Descriptor(
+  name='GetItemRevisionResponse',
+  full_name='contentmanagement.GetItemRevisionResponse',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='item', full_name='contentmanagement.GetItemRevisionResponse.item', index=0,
+      number=1, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=2093,
+  serialized_end=2146,
+)
+
+
+_FINDITEMSREQUEST = _descriptor.Descriptor(
+  name='FindItemsRequest',
+  full_name='contentmanagement.FindItemsRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='space_id', full_name='contentmanagement.FindItemsRequest.space_id', index=0,
+      number=1, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='environment_id', full_name='contentmanagement.FindItemsRequest.environment_id', index=1,
+      number=2, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='collection_id', full_name='contentmanagement.FindItemsRequest.collection_id', index=2,
+      number=3, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='data', full_name='contentmanagement.FindItemsRequest.data', index=3,
+      number=4, type=11, cpp_type=10, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='page_num', full_name='contentmanagement.FindItemsRequest.page_num', index=4,
+      number=8, type=5, cpp_type=1, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='page_size', full_name='contentmanagement.FindItemsRequest.page_size', index=5,
+      number=9, type=5, cpp_type=1, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='sort', full_name='contentmanagement.FindItemsRequest.sort', index=6,
+      number=10, type=9, cpp_type=9, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=2149,
+  serialized_end=2313,
+)
+
+
+_FINDITEMSRESPONSE = _descriptor.Descriptor(
+  name='FindItemsResponse',
+  full_name='contentmanagement.FindItemsResponse',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='items', full_name='contentmanagement.FindItemsResponse.items', index=0,
+      number=1, type=11, cpp_type=10, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='total', full_name='contentmanagement.FindItemsResponse.total', index=1,
+      number=2, type=5, cpp_type=1, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=2315,
+  serialized_end=2378,
+)
+
+
+_FINDARCHIVEDITEMSREQUEST = _descriptor.Descriptor(
+  name='FindArchivedItemsRequest',
+  full_name='contentmanagement.FindArchivedItemsRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='space_id', full_name='contentmanagement.FindArchivedItemsRequest.space_id', index=0,
+      number=1, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='environment_id', full_name='contentmanagement.FindArchivedItemsRequest.environment_id', index=1,
+      number=2, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='collection_id', full_name='contentmanagement.FindArchivedItemsRequest.collection_id', index=2,
+      number=3, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='data', full_name='contentmanagement.FindArchivedItemsRequest.data', index=3,
+      number=4, type=11, cpp_type=10, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='page_num', full_name='contentmanagement.FindArchivedItemsRequest.page_num', index=4,
+      number=8, type=5, cpp_type=1, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='page_size', full_name='contentmanagement.FindArchivedItemsRequest.page_size', index=5,
+      number=9, type=5, cpp_type=1, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='sort', full_name='contentmanagement.FindArchivedItemsRequest.sort', index=6,
+      number=10, type=9, cpp_type=9, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=2381,
+  serialized_end=2553,
+)
+
+
+_FINDARCHIVEDITEMSRESPONSE = _descriptor.Descriptor(
+  name='FindArchivedItemsResponse',
+  full_name='contentmanagement.FindArchivedItemsResponse',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='items', full_name='contentmanagement.FindArchivedItemsResponse.items', index=0,
+      number=1, type=11, cpp_type=10, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='total', full_name='contentmanagement.FindArchivedItemsResponse.total', index=1,
+      number=2, type=5, cpp_type=1, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=2555,
+  serialized_end=2626,
+)
+
+
+_CONTENTCREATESPACEREQUEST = _descriptor.Descriptor(
+  name='ContentCreateSpaceRequest',
+  full_name='contentmanagement.ContentCreateSpaceRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='space', full_name='contentmanagement.ContentCreateSpaceRequest.space', index=0,
+      number=1, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=2628,
+  serialized_end=2685,
+)
+
+
+_CONTENTCREATESPACERESPONSE = _descriptor.Descriptor(
+  name='ContentCreateSpaceResponse',
+  full_name='contentmanagement.ContentCreateSpaceResponse',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='space', full_name='contentmanagement.ContentCreateSpaceResponse.space', index=0,
+      number=1, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=2687,
+  serialized_end=2745,
+)
+
+
+_CONTENTDELETESPACEREQUEST = _descriptor.Descriptor(
+  name='ContentDeleteSpaceRequest',
+  full_name='contentmanagement.ContentDeleteSpaceRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='id', full_name='contentmanagement.ContentDeleteSpaceRequest.id', index=0,
+      number=1, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=2747,
+  serialized_end=2786,
+)
+
+
+_CONTENTGETSPACEREQUEST = _descriptor.Descriptor(
+  name='ContentGetSpaceRequest',
+  full_name='contentmanagement.ContentGetSpaceRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='id', full_name='contentmanagement.ContentGetSpaceRequest.id', index=0,
+      number=1, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=2788,
+  serialized_end=2824,
+)
+
+
+_CONTENTGETSPACERESPONSE = _descriptor.Descriptor(
+  name='ContentGetSpaceResponse',
+  full_name='contentmanagement.ContentGetSpaceResponse',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='space', full_name='contentmanagement.ContentGetSpaceResponse.space', index=0,
+      number=1, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=2826,
+  serialized_end=2881,
+)
+
+
+_LISTSPACESREQUEST = _descriptor.Descriptor(
+  name='ListSpacesRequest',
+  full_name='contentmanagement.ListSpacesRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=2883,
+  serialized_end=2902,
+)
+
+
+_LISTSPACESRESPONSE = _descriptor.Descriptor(
+  name='ListSpacesResponse',
+  full_name='contentmanagement.ListSpacesResponse',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='spaces', full_name='contentmanagement.ListSpacesResponse.spaces', index=0,
+      number=1, type=11, cpp_type=10, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=2904,
+  serialized_end=2955,
+)
+
+
+_CREATELOCALEREQUEST = _descriptor.Descriptor(
+  name='CreateLocaleRequest',
+  full_name='contentmanagement.CreateLocaleRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='locale', full_name='contentmanagement.CreateLocaleRequest.locale', index=0,
+      number=1, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=2957,
+  serialized_end=3010,
+)
+
+
+_CREATELOCALERESPONSE = _descriptor.Descriptor(
+  name='CreateLocaleResponse',
+  full_name='contentmanagement.CreateLocaleResponse',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='locale', full_name='contentmanagement.CreateLocaleResponse.locale', index=0,
+      number=1, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=3012,
+  serialized_end=3066,
+)
+
+
+_LISTLOCALESREQUEST = _descriptor.Descriptor(
+  name='ListLocalesRequest',
+  full_name='contentmanagement.ListLocalesRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='space_id', full_name='contentmanagement.ListLocalesRequest.space_id', index=0,
+      number=1, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=3068,
+  serialized_end=3106,
+)
+
+
+_LISTLOCALESRESPONSE = _descriptor.Descriptor(
+  name='ListLocalesResponse',
+  full_name='contentmanagement.ListLocalesResponse',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='locales', full_name='contentmanagement.ListLocalesResponse.locales', index=0,
+      number=1, type=11, cpp_type=10, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=3108,
+  serialized_end=3162,
+)
+
+
+_DELETELOCALEREQUEST = _descriptor.Descriptor(
+  name='DeleteLocaleRequest',
+  full_name='contentmanagement.DeleteLocaleRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='id', full_name='contentmanagement.DeleteLocaleRequest.id', index=0,
+      number=1, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='space_id', full_name='contentmanagement.DeleteLocaleRequest.space_id', index=1,
+      number=2, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=3164,
+  serialized_end=3215,
+)
+
+
+_DELETELOCALERESPONSE = _descriptor.Descriptor(
+  name='DeleteLocaleResponse',
+  full_name='contentmanagement.DeleteLocaleResponse',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=3217,
+  serialized_end=3239,
+)
+
+
+_CREATEENVIRONMENTREQUEST = _descriptor.Descriptor(
+  name='CreateEnvironmentRequest',
+  full_name='contentmanagement.CreateEnvironmentRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='base_environment_id', full_name='contentmanagement.CreateEnvironmentRequest.base_environment_id', index=0,
+      number=1, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='environment', full_name='contentmanagement.CreateEnvironmentRequest.environment', index=1,
+      number=2, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=3241,
+  serialized_end=3338,
+)
+
+
+_CREATEENVIRONMENTRESPONSE = _descriptor.Descriptor(
+  name='CreateEnvironmentResponse',
+  full_name='contentmanagement.CreateEnvironmentResponse',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='environment', full_name='contentmanagement.CreateEnvironmentResponse.environment', index=0,
+      number=1, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=3340,
+  serialized_end=3409,
+)
+
+
+_GETENVIRONMENTREQUEST = _descriptor.Descriptor(
+  name='GetEnvironmentRequest',
+  full_name='contentmanagement.GetEnvironmentRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='id', full_name='contentmanagement.GetEnvironmentRequest.id', index=0,
+      number=1, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='space_id', full_name='contentmanagement.GetEnvironmentRequest.space_id', index=1,
+      number=2, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=3411,
+  serialized_end=3464,
+)
+
+
+_GETENVIRONMENTRESPONSE = _descriptor.Descriptor(
+  name='GetEnvironmentResponse',
+  full_name='contentmanagement.GetEnvironmentResponse',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='environment', full_name='contentmanagement.GetEnvironmentResponse.environment', index=0,
+      number=1, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=3466,
+  serialized_end=3532,
+)
+
+
+_LISTENVIRONMENTSREQUEST = _descriptor.Descriptor(
+  name='ListEnvironmentsRequest',
+  full_name='contentmanagement.ListEnvironmentsRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='space_id', full_name='contentmanagement.ListEnvironmentsRequest.space_id', index=0,
+      number=1, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=3534,
+  serialized_end=3577,
+)
+
+
+_LISTENVIRONMENTSRESPONSE = _descriptor.Descriptor(
+  name='ListEnvironmentsResponse',
+  full_name='contentmanagement.ListEnvironmentsResponse',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='environments', full_name='contentmanagement.ListEnvironmentsResponse.environments', index=0,
+      number=1, type=11, cpp_type=10, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=3579,
+  serialized_end=3648,
+)
+
+
+_UPDATEENVIRONMENTREQUEST = _descriptor.Descriptor(
+  name='UpdateEnvironmentRequest',
+  full_name='contentmanagement.UpdateEnvironmentRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='id', full_name='contentmanagement.UpdateEnvironmentRequest.id', index=0,
+      number=1, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='space_id', full_name='contentmanagement.UpdateEnvironmentRequest.space_id', index=1,
+      number=2, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='environment', full_name='contentmanagement.UpdateEnvironmentRequest.environment', index=2,
+      number=3, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=3650,
+  serialized_end=3748,
+)
+
+
+_UPDATEENVIRONMENTRESPONSE = _descriptor.Descriptor(
+  name='UpdateEnvironmentResponse',
+  full_name='contentmanagement.UpdateEnvironmentResponse',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=3750,
+  serialized_end=3777,
+)
+
+
+_DELETEENVIRONMENTREQUEST = _descriptor.Descriptor(
+  name='DeleteEnvironmentRequest',
+  full_name='contentmanagement.DeleteEnvironmentRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='id', full_name='contentmanagement.DeleteEnvironmentRequest.id', index=0,
+      number=1, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='space_id', full_name='contentmanagement.DeleteEnvironmentRequest.space_id', index=1,
+      number=2, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=3779,
+  serialized_end=3835,
+)
+
+
+_DELETEENVIRONMENTRESPONSE = _descriptor.Descriptor(
+  name='DeleteEnvironmentResponse',
+  full_name='contentmanagement.DeleteEnvironmentResponse',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=3837,
+  serialized_end=3864,
+)
+
+
+_SETENVIRONMENTALIASREQUEST = _descriptor.Descriptor(
+  name='SetEnvironmentAliasRequest',
+  full_name='contentmanagement.SetEnvironmentAliasRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='id', full_name='contentmanagement.SetEnvironmentAliasRequest.id', index=0,
+      number=1, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='space_id', full_name='contentmanagement.SetEnvironmentAliasRequest.space_id', index=1,
+      number=2, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='alias', full_name='contentmanagement.SetEnvironmentAliasRequest.alias', index=2,
+      number=3, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=3866,
+  serialized_end=3939,
+)
+
+
+_SETENVIRONMENTALIASRESPONSE = _descriptor.Descriptor(
+  name='SetEnvironmentAliasResponse',
+  full_name='contentmanagement.SetEnvironmentAliasResponse',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=3941,
+  serialized_end=3970,
+)
+
+
+_REMOVEENVIRONMENTALIASREQUEST = _descriptor.Descriptor(
+  name='RemoveEnvironmentAliasRequest',
+  full_name='contentmanagement.RemoveEnvironmentAliasRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='id', full_name='contentmanagement.RemoveEnvironmentAliasRequest.id', index=0,
+      number=1, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='space_id', full_name='contentmanagement.RemoveEnvironmentAliasRequest.space_id', index=1,
+      number=2, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='alias', full_name='contentmanagement.RemoveEnvironmentAliasRequest.alias', index=2,
+      number=3, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=3972,
+  serialized_end=4048,
+)
+
+
+_REMOVEENVIRONMENTALIASRESPONSE = _descriptor.Descriptor(
+  name='RemoveEnvironmentAliasResponse',
+  full_name='contentmanagement.RemoveEnvironmentAliasResponse',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=4050,
+  serialized_end=4082,
+)
+
+
+_CREATESPACEROLEREQUEST = _descriptor.Descriptor(
+  name='CreateSpaceRoleRequest',
+  full_name='contentmanagement.CreateSpaceRoleRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='space_role', full_name='contentmanagement.CreateSpaceRoleRequest.space_role', index=0,
+      number=1, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=4084,
+  serialized_end=4147,
+)
+
+
+_UPDATESPACEROLEREQUEST = _descriptor.Descriptor(
+  name='UpdateSpaceRoleRequest',
+  full_name='contentmanagement.UpdateSpaceRoleRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='space_role', full_name='contentmanagement.UpdateSpaceRoleRequest.space_role', index=0,
+      number=1, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=4149,
+  serialized_end=4212,
+)
+
+
+_LISTSPACEROLESREQUEST = _descriptor.Descriptor(
+  name='ListSpaceRolesRequest',
+  full_name='contentmanagement.ListSpaceRolesRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='space_id', full_name='contentmanagement.ListSpaceRolesRequest.space_id', index=0,
+      number=1, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=4214,
+  serialized_end=4255,
+)
+
+
+_LISTSPACEROLESRESPONSE = _descriptor.Descriptor(
+  name='ListSpaceRolesResponse',
+  full_name='contentmanagement.ListSpaceRolesResponse',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='space_roles', full_name='contentmanagement.ListSpaceRolesResponse.space_roles', index=0,
+      number=1, type=11, cpp_type=10, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=4257,
+  serialized_end=4321,
+)
+
+
+_DELETESPACEROLEREQUEST = _descriptor.Descriptor(
+  name='DeleteSpaceRoleRequest',
+  full_name='contentmanagement.DeleteSpaceRoleRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='id', full_name='contentmanagement.DeleteSpaceRoleRequest.id', index=0,
+      number=1, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='space_id', full_name='contentmanagement.DeleteSpaceRoleRequest.space_id', index=1,
+      number=2, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=4323,
+  serialized_end=4377,
+)
+
+_CREATECOLLECTIONREQUEST.fields_by_name['collection'].message_type = common_dot_common__pb2._COLLECTION
+_CREATECOLLECTIONRESPONSE.fields_by_name['collection'].message_type = common_dot_common__pb2._COLLECTION
+_GETCOLLECTIONRESPONSE.fields_by_name['collection'].message_type = common_dot_common__pb2._COLLECTION
+_LISTCOLLECTIONSRESPONSE.fields_by_name['collections'].message_type = common_dot_common__pb2._COLLECTION
+_UPDATECOLLECTIONREQUEST.fields_by_name['collection'].message_type = common_dot_common__pb2._COLLECTION
+_CREATEITEMREQUEST.fields_by_name['item'].message_type = common_dot_common__pb2._ITEM
+_CREATEITEMRESPONSE.fields_by_name['item'].message_type = common_dot_common__pb2._ITEM
+_GETITEMRESPONSE.fields_by_name['item'].message_type = common_dot_common__pb2._ITEM
+_UPDATEITEMREQUEST.fields_by_name['item'].message_type = common_dot_common__pb2._ITEM
+_UPDATEITEMRESPONSE.fields_by_name['item'].message_type = common_dot_common__pb2._ITEM
+_LISTITEMREVISIONSRESPONSE.fields_by_name['items'].message_type = common_dot_common__pb2._ITEM
+_GETITEMREVISIONRESPONSE.fields_by_name['item'].message_type = common_dot_common__pb2._ITEM
+_FINDITEMSREQUEST.fields_by_name['data'].message_type = common_dot_common__pb2._FILTER
+_FINDITEMSRESPONSE.fields_by_name['items'].message_type = common_dot_common__pb2._ITEM
+_FINDARCHIVEDITEMSREQUEST.fields_by_name['data'].message_type = common_dot_common__pb2._FILTER
+_FINDARCHIVEDITEMSRESPONSE.fields_by_name['items'].message_type = common_dot_common__pb2._ITEM
+_CONTENTCREATESPACEREQUEST.fields_by_name['space'].message_type = common_dot_common__pb2._SPACE
+_CONTENTCREATESPACERESPONSE.fields_by_name['space'].message_type = common_dot_common__pb2._SPACE
+_CONTENTGETSPACERESPONSE.fields_by_name['space'].message_type = common_dot_common__pb2._SPACE
+_LISTSPACESRESPONSE.fields_by_name['spaces'].message_type = common_dot_common__pb2._SPACE
+_CREATELOCALEREQUEST.fields_by_name['locale'].message_type = common_dot_common__pb2._LOCALE
+_CREATELOCALERESPONSE.fields_by_name['locale'].message_type = common_dot_common__pb2._LOCALE
+_LISTLOCALESRESPONSE.fields_by_name['locales'].message_type = common_dot_common__pb2._LOCALE
+_CREATEENVIRONMENTREQUEST.fields_by_name['environment'].message_type = common_dot_common__pb2._ENVIRONMENT
+_CREATEENVIRONMENTRESPONSE.fields_by_name['environment'].message_type = common_dot_common__pb2._ENVIRONMENT
+_GETENVIRONMENTRESPONSE.fields_by_name['environment'].message_type = common_dot_common__pb2._ENVIRONMENT
+_LISTENVIRONMENTSRESPONSE.fields_by_name['environments'].message_type = common_dot_common__pb2._ENVIRONMENT
+_UPDATEENVIRONMENTREQUEST.fields_by_name['environment'].message_type = common_dot_common__pb2._ENVIRONMENT
+_CREATESPACEROLEREQUEST.fields_by_name['space_role'].message_type = common_dot_common__pb2._SPACEROLE
+_UPDATESPACEROLEREQUEST.fields_by_name['space_role'].message_type = common_dot_common__pb2._SPACEROLE
+_LISTSPACEROLESRESPONSE.fields_by_name['space_roles'].message_type = common_dot_common__pb2._SPACEROLE
+DESCRIPTOR.message_types_by_name['CreateCollectionRequest'] = _CREATECOLLECTIONREQUEST
+DESCRIPTOR.message_types_by_name['CreateCollectionResponse'] = _CREATECOLLECTIONRESPONSE
+DESCRIPTOR.message_types_by_name['GetCollectionRequest'] = _GETCOLLECTIONREQUEST
+DESCRIPTOR.message_types_by_name['GetCollectionResponse'] = _GETCOLLECTIONRESPONSE
+DESCRIPTOR.message_types_by_name['ListCollectionsRequest'] = _LISTCOLLECTIONSREQUEST
+DESCRIPTOR.message_types_by_name['ListCollectionsResponse'] = _LISTCOLLECTIONSRESPONSE
+DESCRIPTOR.message_types_by_name['UpdateCollectionRequest'] = _UPDATECOLLECTIONREQUEST
+DESCRIPTOR.message_types_by_name['UpdateCollectionResponse'] = _UPDATECOLLECTIONRESPONSE
+DESCRIPTOR.message_types_by_name['DeleteCollectionRequest'] = _DELETECOLLECTIONREQUEST
+DESCRIPTOR.message_types_by_name['DeleteCollectionResponse'] = _DELETECOLLECTIONRESPONSE
+DESCRIPTOR.message_types_by_name['CreateItemRequest'] = _CREATEITEMREQUEST
+DESCRIPTOR.message_types_by_name['CreateItemResponse'] = _CREATEITEMRESPONSE
+DESCRIPTOR.message_types_by_name['GetItemRequest'] = _GETITEMREQUEST
+DESCRIPTOR.message_types_by_name['GetItemResponse'] = _GETITEMRESPONSE
+DESCRIPTOR.message_types_by_name['UpdateItemRequest'] = _UPDATEITEMREQUEST
+DESCRIPTOR.message_types_by_name['UpdateItemResponse'] = _UPDATEITEMRESPONSE
+DESCRIPTOR.message_types_by_name['DeleteItemRequest'] = _DELETEITEMREQUEST
+DESCRIPTOR.message_types_by_name['DeleteItemResponse'] = _DELETEITEMRESPONSE
+DESCRIPTOR.message_types_by_name['PublishItemRequest'] = _PUBLISHITEMREQUEST
+DESCRIPTOR.message_types_by_name['PublishItemResponse'] = _PUBLISHITEMRESPONSE
+DESCRIPTOR.message_types_by_name['UnpublishItemRequest'] = _UNPUBLISHITEMREQUEST
+DESCRIPTOR.message_types_by_name['UnpublishItemResponse'] = _UNPUBLISHITEMRESPONSE
+DESCRIPTOR.message_types_by_name['ArchiveItemRequest'] = _ARCHIVEITEMREQUEST
+DESCRIPTOR.message_types_by_name['ArchiveItemResponse'] = _ARCHIVEITEMRESPONSE
+DESCRIPTOR.message_types_by_name['UnarchiveItemRequest'] = _UNARCHIVEITEMREQUEST
+DESCRIPTOR.message_types_by_name['UnarchiveItemResponse'] = _UNARCHIVEITEMRESPONSE
+DESCRIPTOR.message_types_by_name['ListItemRevisionsRequest'] = _LISTITEMREVISIONSREQUEST
+DESCRIPTOR.message_types_by_name['ListItemRevisionsResponse'] = _LISTITEMREVISIONSRESPONSE
+DESCRIPTOR.message_types_by_name['GetItemRevisionRequest'] = _GETITEMREVISIONREQUEST
+DESCRIPTOR.message_types_by_name['GetItemRevisionResponse'] = _GETITEMREVISIONRESPONSE
+DESCRIPTOR.message_types_by_name['FindItemsRequest'] = _FINDITEMSREQUEST
+DESCRIPTOR.message_types_by_name['FindItemsResponse'] = _FINDITEMSRESPONSE
+DESCRIPTOR.message_types_by_name['FindArchivedItemsRequest'] = _FINDARCHIVEDITEMSREQUEST
+DESCRIPTOR.message_types_by_name['FindArchivedItemsResponse'] = _FINDARCHIVEDITEMSRESPONSE
+DESCRIPTOR.message_types_by_name['ContentCreateSpaceRequest'] = _CONTENTCREATESPACEREQUEST
+DESCRIPTOR.message_types_by_name['ContentCreateSpaceResponse'] = _CONTENTCREATESPACERESPONSE
+DESCRIPTOR.message_types_by_name['ContentDeleteSpaceRequest'] = _CONTENTDELETESPACEREQUEST
+DESCRIPTOR.message_types_by_name['ContentGetSpaceRequest'] = _CONTENTGETSPACEREQUEST
+DESCRIPTOR.message_types_by_name['ContentGetSpaceResponse'] = _CONTENTGETSPACERESPONSE
+DESCRIPTOR.message_types_by_name['ListSpacesRequest'] = _LISTSPACESREQUEST
+DESCRIPTOR.message_types_by_name['ListSpacesResponse'] = _LISTSPACESRESPONSE
+DESCRIPTOR.message_types_by_name['CreateLocaleRequest'] = _CREATELOCALEREQUEST
+DESCRIPTOR.message_types_by_name['CreateLocaleResponse'] = _CREATELOCALERESPONSE
+DESCRIPTOR.message_types_by_name['ListLocalesRequest'] = _LISTLOCALESREQUEST
+DESCRIPTOR.message_types_by_name['ListLocalesResponse'] = _LISTLOCALESRESPONSE
+DESCRIPTOR.message_types_by_name['DeleteLocaleRequest'] = _DELETELOCALEREQUEST
+DESCRIPTOR.message_types_by_name['DeleteLocaleResponse'] = _DELETELOCALERESPONSE
+DESCRIPTOR.message_types_by_name['CreateEnvironmentRequest'] = _CREATEENVIRONMENTREQUEST
+DESCRIPTOR.message_types_by_name['CreateEnvironmentResponse'] = _CREATEENVIRONMENTRESPONSE
+DESCRIPTOR.message_types_by_name['GetEnvironmentRequest'] = _GETENVIRONMENTREQUEST
+DESCRIPTOR.message_types_by_name['GetEnvironmentResponse'] = _GETENVIRONMENTRESPONSE
+DESCRIPTOR.message_types_by_name['ListEnvironmentsRequest'] = _LISTENVIRONMENTSREQUEST
+DESCRIPTOR.message_types_by_name['ListEnvironmentsResponse'] = _LISTENVIRONMENTSRESPONSE
+DESCRIPTOR.message_types_by_name['UpdateEnvironmentRequest'] = _UPDATEENVIRONMENTREQUEST
+DESCRIPTOR.message_types_by_name['UpdateEnvironmentResponse'] = _UPDATEENVIRONMENTRESPONSE
+DESCRIPTOR.message_types_by_name['DeleteEnvironmentRequest'] = _DELETEENVIRONMENTREQUEST
+DESCRIPTOR.message_types_by_name['DeleteEnvironmentResponse'] = _DELETEENVIRONMENTRESPONSE
+DESCRIPTOR.message_types_by_name['SetEnvironmentAliasRequest'] = _SETENVIRONMENTALIASREQUEST
+DESCRIPTOR.message_types_by_name['SetEnvironmentAliasResponse'] = _SETENVIRONMENTALIASRESPONSE
+DESCRIPTOR.message_types_by_name['RemoveEnvironmentAliasRequest'] = _REMOVEENVIRONMENTALIASREQUEST
+DESCRIPTOR.message_types_by_name['RemoveEnvironmentAliasResponse'] = _REMOVEENVIRONMENTALIASRESPONSE
+DESCRIPTOR.message_types_by_name['CreateSpaceRoleRequest'] = _CREATESPACEROLEREQUEST
+DESCRIPTOR.message_types_by_name['UpdateSpaceRoleRequest'] = _UPDATESPACEROLEREQUEST
+DESCRIPTOR.message_types_by_name['ListSpaceRolesRequest'] = _LISTSPACEROLESREQUEST
+DESCRIPTOR.message_types_by_name['ListSpaceRolesResponse'] = _LISTSPACEROLESRESPONSE
+DESCRIPTOR.message_types_by_name['DeleteSpaceRoleRequest'] = _DELETESPACEROLEREQUEST
+_sym_db.RegisterFileDescriptor(DESCRIPTOR)
+
+CreateCollectionRequest = _reflection.GeneratedProtocolMessageType('CreateCollectionRequest', (_message.Message,), {
+  'DESCRIPTOR' : _CREATECOLLECTIONREQUEST,
+  '__module__' : 'contentmanagement.contentmanagment_pb2'
+  # @@protoc_insertion_point(class_scope:contentmanagement.CreateCollectionRequest)
+  })
+_sym_db.RegisterMessage(CreateCollectionRequest)
+
+CreateCollectionResponse = _reflection.GeneratedProtocolMessageType('CreateCollectionResponse', (_message.Message,), {
+  'DESCRIPTOR' : _CREATECOLLECTIONRESPONSE,
+  '__module__' : 'contentmanagement.contentmanagment_pb2'
+  # @@protoc_insertion_point(class_scope:contentmanagement.CreateCollectionResponse)
+  })
+_sym_db.RegisterMessage(CreateCollectionResponse)
+
+GetCollectionRequest = _reflection.GeneratedProtocolMessageType('GetCollectionRequest', (_message.Message,), {
+  'DESCRIPTOR' : _GETCOLLECTIONREQUEST,
+  '__module__' : 'contentmanagement.contentmanagment_pb2'
+  # @@protoc_insertion_point(class_scope:contentmanagement.GetCollectionRequest)
+  })
+_sym_db.RegisterMessage(GetCollectionRequest)
+
+GetCollectionResponse = _reflection.GeneratedProtocolMessageType('GetCollectionResponse', (_message.Message,), {
+  'DESCRIPTOR' : _GETCOLLECTIONRESPONSE,
+  '__module__' : 'contentmanagement.contentmanagment_pb2'
+  # @@protoc_insertion_point(class_scope:contentmanagement.GetCollectionResponse)
+  })
+_sym_db.RegisterMessage(GetCollectionResponse)
+
+ListCollectionsRequest = _reflection.GeneratedProtocolMessageType('ListCollectionsRequest', (_message.Message,), {
+  'DESCRIPTOR' : _LISTCOLLECTIONSREQUEST,
+  '__module__' : 'contentmanagement.contentmanagment_pb2'
+  # @@protoc_insertion_point(class_scope:contentmanagement.ListCollectionsRequest)
+  })
+_sym_db.RegisterMessage(ListCollectionsRequest)
+
+ListCollectionsResponse = _reflection.GeneratedProtocolMessageType('ListCollectionsResponse', (_message.Message,), {
+  'DESCRIPTOR' : _LISTCOLLECTIONSRESPONSE,
+  '__module__' : 'contentmanagement.contentmanagment_pb2'
+  # @@protoc_insertion_point(class_scope:contentmanagement.ListCollectionsResponse)
+  })
+_sym_db.RegisterMessage(ListCollectionsResponse)
+
+UpdateCollectionRequest = _reflection.GeneratedProtocolMessageType('UpdateCollectionRequest', (_message.Message,), {
+  'DESCRIPTOR' : _UPDATECOLLECTIONREQUEST,
+  '__module__' : 'contentmanagement.contentmanagment_pb2'
+  # @@protoc_insertion_point(class_scope:contentmanagement.UpdateCollectionRequest)
+  })
+_sym_db.RegisterMessage(UpdateCollectionRequest)
+
+UpdateCollectionResponse = _reflection.GeneratedProtocolMessageType('UpdateCollectionResponse', (_message.Message,), {
+  'DESCRIPTOR' : _UPDATECOLLECTIONRESPONSE,
+  '__module__' : 'contentmanagement.contentmanagment_pb2'
+  # @@protoc_insertion_point(class_scope:contentmanagement.UpdateCollectionResponse)
+  })
+_sym_db.RegisterMessage(UpdateCollectionResponse)
+
+DeleteCollectionRequest = _reflection.GeneratedProtocolMessageType('DeleteCollectionRequest', (_message.Message,), {
+  'DESCRIPTOR' : _DELETECOLLECTIONREQUEST,
+  '__module__' : 'contentmanagement.contentmanagment_pb2'
+  # @@protoc_insertion_point(class_scope:contentmanagement.DeleteCollectionRequest)
+  })
+_sym_db.RegisterMessage(DeleteCollectionRequest)
+
+DeleteCollectionResponse = _reflection.GeneratedProtocolMessageType('DeleteCollectionResponse', (_message.Message,), {
+  'DESCRIPTOR' : _DELETECOLLECTIONRESPONSE,
+  '__module__' : 'contentmanagement.contentmanagment_pb2'
+  # @@protoc_insertion_point(class_scope:contentmanagement.DeleteCollectionResponse)
+  })
+_sym_db.RegisterMessage(DeleteCollectionResponse)
+
+CreateItemRequest = _reflection.GeneratedProtocolMessageType('CreateItemRequest', (_message.Message,), {
+  'DESCRIPTOR' : _CREATEITEMREQUEST,
+  '__module__' : 'contentmanagement.contentmanagment_pb2'
+  # @@protoc_insertion_point(class_scope:contentmanagement.CreateItemRequest)
+  })
+_sym_db.RegisterMessage(CreateItemRequest)
+
+CreateItemResponse = _reflection.GeneratedProtocolMessageType('CreateItemResponse', (_message.Message,), {
+  'DESCRIPTOR' : _CREATEITEMRESPONSE,
+  '__module__' : 'contentmanagement.contentmanagment_pb2'
+  # @@protoc_insertion_point(class_scope:contentmanagement.CreateItemResponse)
+  })
+_sym_db.RegisterMessage(CreateItemResponse)
+
+GetItemRequest = _reflection.GeneratedProtocolMessageType('GetItemRequest', (_message.Message,), {
+  'DESCRIPTOR' : _GETITEMREQUEST,
+  '__module__' : 'contentmanagement.contentmanagment_pb2'
+  # @@protoc_insertion_point(class_scope:contentmanagement.GetItemRequest)
+  })
+_sym_db.RegisterMessage(GetItemRequest)
+
+GetItemResponse = _reflection.GeneratedProtocolMessageType('GetItemResponse', (_message.Message,), {
+  'DESCRIPTOR' : _GETITEMRESPONSE,
+  '__module__' : 'contentmanagement.contentmanagment_pb2'
+  # @@protoc_insertion_point(class_scope:contentmanagement.GetItemResponse)
+  })
+_sym_db.RegisterMessage(GetItemResponse)
+
+UpdateItemRequest = _reflection.GeneratedProtocolMessageType('UpdateItemRequest', (_message.Message,), {
+  'DESCRIPTOR' : _UPDATEITEMREQUEST,
+  '__module__' : 'contentmanagement.contentmanagment_pb2'
+  # @@protoc_insertion_point(class_scope:contentmanagement.UpdateItemRequest)
+  })
+_sym_db.RegisterMessage(UpdateItemRequest)
+
+UpdateItemResponse = _reflection.GeneratedProtocolMessageType('UpdateItemResponse', (_message.Message,), {
+  'DESCRIPTOR' : _UPDATEITEMRESPONSE,
+  '__module__' : 'contentmanagement.contentmanagment_pb2'
+  # @@protoc_insertion_point(class_scope:contentmanagement.UpdateItemResponse)
+  })
+_sym_db.RegisterMessage(UpdateItemResponse)
+
+DeleteItemRequest = _reflection.GeneratedProtocolMessageType('DeleteItemRequest', (_message.Message,), {
+  'DESCRIPTOR' : _DELETEITEMREQUEST,
+  '__module__' : 'contentmanagement.contentmanagment_pb2'
+  # @@protoc_insertion_point(class_scope:contentmanagement.DeleteItemRequest)
+  })
+_sym_db.RegisterMessage(DeleteItemRequest)
+
+DeleteItemResponse = _reflection.GeneratedProtocolMessageType('DeleteItemResponse', (_message.Message,), {
+  'DESCRIPTOR' : _DELETEITEMRESPONSE,
+  '__module__' : 'contentmanagement.contentmanagment_pb2'
+  # @@protoc_insertion_point(class_scope:contentmanagement.DeleteItemResponse)
+  })
+_sym_db.RegisterMessage(DeleteItemResponse)
+
+PublishItemRequest = _reflection.GeneratedProtocolMessageType('PublishItemRequest', (_message.Message,), {
+  'DESCRIPTOR' : _PUBLISHITEMREQUEST,
+  '__module__' : 'contentmanagement.contentmanagment_pb2'
+  # @@protoc_insertion_point(class_scope:contentmanagement.PublishItemRequest)
+  })
+_sym_db.RegisterMessage(PublishItemRequest)
+
+PublishItemResponse = _reflection.GeneratedProtocolMessageType('PublishItemResponse', (_message.Message,), {
+  'DESCRIPTOR' : _PUBLISHITEMRESPONSE,
+  '__module__' : 'contentmanagement.contentmanagment_pb2'
+  # @@protoc_insertion_point(class_scope:contentmanagement.PublishItemResponse)
+  })
+_sym_db.RegisterMessage(PublishItemResponse)
+
+UnpublishItemRequest = _reflection.GeneratedProtocolMessageType('UnpublishItemRequest', (_message.Message,), {
+  'DESCRIPTOR' : _UNPUBLISHITEMREQUEST,
+  '__module__' : 'contentmanagement.contentmanagment_pb2'
+  # @@protoc_insertion_point(class_scope:contentmanagement.UnpublishItemRequest)
+  })
+_sym_db.RegisterMessage(UnpublishItemRequest)
+
+UnpublishItemResponse = _reflection.GeneratedProtocolMessageType('UnpublishItemResponse', (_message.Message,), {
+  'DESCRIPTOR' : _UNPUBLISHITEMRESPONSE,
+  '__module__' : 'contentmanagement.contentmanagment_pb2'
+  # @@protoc_insertion_point(class_scope:contentmanagement.UnpublishItemResponse)
+  })
+_sym_db.RegisterMessage(UnpublishItemResponse)
+
+ArchiveItemRequest = _reflection.GeneratedProtocolMessageType('ArchiveItemRequest', (_message.Message,), {
+  'DESCRIPTOR' : _ARCHIVEITEMREQUEST,
+  '__module__' : 'contentmanagement.contentmanagment_pb2'
+  # @@protoc_insertion_point(class_scope:contentmanagement.ArchiveItemRequest)
+  })
+_sym_db.RegisterMessage(ArchiveItemRequest)
+
+ArchiveItemResponse = _reflection.GeneratedProtocolMessageType('ArchiveItemResponse', (_message.Message,), {
+  'DESCRIPTOR' : _ARCHIVEITEMRESPONSE,
+  '__module__' : 'contentmanagement.contentmanagment_pb2'
+  # @@protoc_insertion_point(class_scope:contentmanagement.ArchiveItemResponse)
+  })
+_sym_db.RegisterMessage(ArchiveItemResponse)
+
+UnarchiveItemRequest = _reflection.GeneratedProtocolMessageType('UnarchiveItemRequest', (_message.Message,), {
+  'DESCRIPTOR' : _UNARCHIVEITEMREQUEST,
+  '__module__' : 'contentmanagement.contentmanagment_pb2'
+  # @@protoc_insertion_point(class_scope:contentmanagement.UnarchiveItemRequest)
+  })
+_sym_db.RegisterMessage(UnarchiveItemRequest)
+
+UnarchiveItemResponse = _reflection.GeneratedProtocolMessageType('UnarchiveItemResponse', (_message.Message,), {
+  'DESCRIPTOR' : _UNARCHIVEITEMRESPONSE,
+  '__module__' : 'contentmanagement.contentmanagment_pb2'
+  # @@protoc_insertion_point(class_scope:contentmanagement.UnarchiveItemResponse)
+  })
+_sym_db.RegisterMessage(UnarchiveItemResponse)
+
+ListItemRevisionsRequest = _reflection.GeneratedProtocolMessageType('ListItemRevisionsRequest', (_message.Message,), {
+  'DESCRIPTOR' : _LISTITEMREVISIONSREQUEST,
+  '__module__' : 'contentmanagement.contentmanagment_pb2'
+  # @@protoc_insertion_point(class_scope:contentmanagement.ListItemRevisionsRequest)
+  })
+_sym_db.RegisterMessage(ListItemRevisionsRequest)
+
+ListItemRevisionsResponse = _reflection.GeneratedProtocolMessageType('ListItemRevisionsResponse', (_message.Message,), {
+  'DESCRIPTOR' : _LISTITEMREVISIONSRESPONSE,
+  '__module__' : 'contentmanagement.contentmanagment_pb2'
+  # @@protoc_insertion_point(class_scope:contentmanagement.ListItemRevisionsResponse)
+  })
+_sym_db.RegisterMessage(ListItemRevisionsResponse)
+
+GetItemRevisionRequest = _reflection.GeneratedProtocolMessageType('GetItemRevisionRequest', (_message.Message,), {
+  'DESCRIPTOR' : _GETITEMREVISIONREQUEST,
+  '__module__' : 'contentmanagement.contentmanagment_pb2'
+  # @@protoc_insertion_point(class_scope:contentmanagement.GetItemRevisionRequest)
+  })
+_sym_db.RegisterMessage(GetItemRevisionRequest)
+
+GetItemRevisionResponse = _reflection.GeneratedProtocolMessageType('GetItemRevisionResponse', (_message.Message,), {
+  'DESCRIPTOR' : _GETITEMREVISIONRESPONSE,
+  '__module__' : 'contentmanagement.contentmanagment_pb2'
+  # @@protoc_insertion_point(class_scope:contentmanagement.GetItemRevisionResponse)
+  })
+_sym_db.RegisterMessage(GetItemRevisionResponse)
+
+FindItemsRequest = _reflection.GeneratedProtocolMessageType('FindItemsRequest', (_message.Message,), {
+  'DESCRIPTOR' : _FINDITEMSREQUEST,
+  '__module__' : 'contentmanagement.contentmanagment_pb2'
+  # @@protoc_insertion_point(class_scope:contentmanagement.FindItemsRequest)
+  })
+_sym_db.RegisterMessage(FindItemsRequest)
+
+FindItemsResponse = _reflection.GeneratedProtocolMessageType('FindItemsResponse', (_message.Message,), {
+  'DESCRIPTOR' : _FINDITEMSRESPONSE,
+  '__module__' : 'contentmanagement.contentmanagment_pb2'
+  # @@protoc_insertion_point(class_scope:contentmanagement.FindItemsResponse)
+  })
+_sym_db.RegisterMessage(FindItemsResponse)
+
+FindArchivedItemsRequest = _reflection.GeneratedProtocolMessageType('FindArchivedItemsRequest', (_message.Message,), {
+  'DESCRIPTOR' : _FINDARCHIVEDITEMSREQUEST,
+  '__module__' : 'contentmanagement.contentmanagment_pb2'
+  # @@protoc_insertion_point(class_scope:contentmanagement.FindArchivedItemsRequest)
+  })
+_sym_db.RegisterMessage(FindArchivedItemsRequest)
+
+FindArchivedItemsResponse = _reflection.GeneratedProtocolMessageType('FindArchivedItemsResponse', (_message.Message,), {
+  'DESCRIPTOR' : _FINDARCHIVEDITEMSRESPONSE,
+  '__module__' : 'contentmanagement.contentmanagment_pb2'
+  # @@protoc_insertion_point(class_scope:contentmanagement.FindArchivedItemsResponse)
+  })
+_sym_db.RegisterMessage(FindArchivedItemsResponse)
+
+ContentCreateSpaceRequest = _reflection.GeneratedProtocolMessageType('ContentCreateSpaceRequest', (_message.Message,), {
+  'DESCRIPTOR' : _CONTENTCREATESPACEREQUEST,
+  '__module__' : 'contentmanagement.contentmanagment_pb2'
+  # @@protoc_insertion_point(class_scope:contentmanagement.ContentCreateSpaceRequest)
+  })
+_sym_db.RegisterMessage(ContentCreateSpaceRequest)
+
+ContentCreateSpaceResponse = _reflection.GeneratedProtocolMessageType('ContentCreateSpaceResponse', (_message.Message,), {
+  'DESCRIPTOR' : _CONTENTCREATESPACERESPONSE,
+  '__module__' : 'contentmanagement.contentmanagment_pb2'
+  # @@protoc_insertion_point(class_scope:contentmanagement.ContentCreateSpaceResponse)
+  })
+_sym_db.RegisterMessage(ContentCreateSpaceResponse)
+
+ContentDeleteSpaceRequest = _reflection.GeneratedProtocolMessageType('ContentDeleteSpaceRequest', (_message.Message,), {
+  'DESCRIPTOR' : _CONTENTDELETESPACEREQUEST,
+  '__module__' : 'contentmanagement.contentmanagment_pb2'
+  # @@protoc_insertion_point(class_scope:contentmanagement.ContentDeleteSpaceRequest)
+  })
+_sym_db.RegisterMessage(ContentDeleteSpaceRequest)
+
+ContentGetSpaceRequest = _reflection.GeneratedProtocolMessageType('ContentGetSpaceRequest', (_message.Message,), {
+  'DESCRIPTOR' : _CONTENTGETSPACEREQUEST,
+  '__module__' : 'contentmanagement.contentmanagment_pb2'
+  # @@protoc_insertion_point(class_scope:contentmanagement.ContentGetSpaceRequest)
+  })
+_sym_db.RegisterMessage(ContentGetSpaceRequest)
+
+ContentGetSpaceResponse = _reflection.GeneratedProtocolMessageType('ContentGetSpaceResponse', (_message.Message,), {
+  'DESCRIPTOR' : _CONTENTGETSPACERESPONSE,
+  '__module__' : 'contentmanagement.contentmanagment_pb2'
+  # @@protoc_insertion_point(class_scope:contentmanagement.ContentGetSpaceResponse)
+  })
+_sym_db.RegisterMessage(ContentGetSpaceResponse)
+
+ListSpacesRequest = _reflection.GeneratedProtocolMessageType('ListSpacesRequest', (_message.Message,), {
+  'DESCRIPTOR' : _LISTSPACESREQUEST,
+  '__module__' : 'contentmanagement.contentmanagment_pb2'
+  # @@protoc_insertion_point(class_scope:contentmanagement.ListSpacesRequest)
+  })
+_sym_db.RegisterMessage(ListSpacesRequest)
+
+ListSpacesResponse = _reflection.GeneratedProtocolMessageType('ListSpacesResponse', (_message.Message,), {
+  'DESCRIPTOR' : _LISTSPACESRESPONSE,
+  '__module__' : 'contentmanagement.contentmanagment_pb2'
+  # @@protoc_insertion_point(class_scope:contentmanagement.ListSpacesResponse)
+  })
+_sym_db.RegisterMessage(ListSpacesResponse)
+
+CreateLocaleRequest = _reflection.GeneratedProtocolMessageType('CreateLocaleRequest', (_message.Message,), {
+  'DESCRIPTOR' : _CREATELOCALEREQUEST,
+  '__module__' : 'contentmanagement.contentmanagment_pb2'
+  # @@protoc_insertion_point(class_scope:contentmanagement.CreateLocaleRequest)
+  })
+_sym_db.RegisterMessage(CreateLocaleRequest)
+
+CreateLocaleResponse = _reflection.GeneratedProtocolMessageType('CreateLocaleResponse', (_message.Message,), {
+  'DESCRIPTOR' : _CREATELOCALERESPONSE,
+  '__module__' : 'contentmanagement.contentmanagment_pb2'
+  # @@protoc_insertion_point(class_scope:contentmanagement.CreateLocaleResponse)
+  })
+_sym_db.RegisterMessage(CreateLocaleResponse)
+
+ListLocalesRequest = _reflection.GeneratedProtocolMessageType('ListLocalesRequest', (_message.Message,), {
+  'DESCRIPTOR' : _LISTLOCALESREQUEST,
+  '__module__' : 'contentmanagement.contentmanagment_pb2'
+  # @@protoc_insertion_point(class_scope:contentmanagement.ListLocalesRequest)
+  })
+_sym_db.RegisterMessage(ListLocalesRequest)
+
+ListLocalesResponse = _reflection.GeneratedProtocolMessageType('ListLocalesResponse', (_message.Message,), {
+  'DESCRIPTOR' : _LISTLOCALESRESPONSE,
+  '__module__' : 'contentmanagement.contentmanagment_pb2'
+  # @@protoc_insertion_point(class_scope:contentmanagement.ListLocalesResponse)
+  })
+_sym_db.RegisterMessage(ListLocalesResponse)
+
+DeleteLocaleRequest = _reflection.GeneratedProtocolMessageType('DeleteLocaleRequest', (_message.Message,), {
+  'DESCRIPTOR' : _DELETELOCALEREQUEST,
+  '__module__' : 'contentmanagement.contentmanagment_pb2'
+  # @@protoc_insertion_point(class_scope:contentmanagement.DeleteLocaleRequest)
+  })
+_sym_db.RegisterMessage(DeleteLocaleRequest)
+
+DeleteLocaleResponse = _reflection.GeneratedProtocolMessageType('DeleteLocaleResponse', (_message.Message,), {
+  'DESCRIPTOR' : _DELETELOCALERESPONSE,
+  '__module__' : 'contentmanagement.contentmanagment_pb2'
+  # @@protoc_insertion_point(class_scope:contentmanagement.DeleteLocaleResponse)
+  })
+_sym_db.RegisterMessage(DeleteLocaleResponse)
+
+CreateEnvironmentRequest = _reflection.GeneratedProtocolMessageType('CreateEnvironmentRequest', (_message.Message,), {
+  'DESCRIPTOR' : _CREATEENVIRONMENTREQUEST,
+  '__module__' : 'contentmanagement.contentmanagment_pb2'
+  # @@protoc_insertion_point(class_scope:contentmanagement.CreateEnvironmentRequest)
+  })
+_sym_db.RegisterMessage(CreateEnvironmentRequest)
+
+CreateEnvironmentResponse = _reflection.GeneratedProtocolMessageType('CreateEnvironmentResponse', (_message.Message,), {
+  'DESCRIPTOR' : _CREATEENVIRONMENTRESPONSE,
+  '__module__' : 'contentmanagement.contentmanagment_pb2'
+  # @@protoc_insertion_point(class_scope:contentmanagement.CreateEnvironmentResponse)
+  })
+_sym_db.RegisterMessage(CreateEnvironmentResponse)
+
+GetEnvironmentRequest = _reflection.GeneratedProtocolMessageType('GetEnvironmentRequest', (_message.Message,), {
+  'DESCRIPTOR' : _GETENVIRONMENTREQUEST,
+  '__module__' : 'contentmanagement.contentmanagment_pb2'
+  # @@protoc_insertion_point(class_scope:contentmanagement.GetEnvironmentRequest)
+  })
+_sym_db.RegisterMessage(GetEnvironmentRequest)
+
+GetEnvironmentResponse = _reflection.GeneratedProtocolMessageType('GetEnvironmentResponse', (_message.Message,), {
+  'DESCRIPTOR' : _GETENVIRONMENTRESPONSE,
+  '__module__' : 'contentmanagement.contentmanagment_pb2'
+  # @@protoc_insertion_point(class_scope:contentmanagement.GetEnvironmentResponse)
+  })
+_sym_db.RegisterMessage(GetEnvironmentResponse)
+
+ListEnvironmentsRequest = _reflection.GeneratedProtocolMessageType('ListEnvironmentsRequest', (_message.Message,), {
+  'DESCRIPTOR' : _LISTENVIRONMENTSREQUEST,
+  '__module__' : 'contentmanagement.contentmanagment_pb2'
+  # @@protoc_insertion_point(class_scope:contentmanagement.ListEnvironmentsRequest)
+  })
+_sym_db.RegisterMessage(ListEnvironmentsRequest)
+
+ListEnvironmentsResponse = _reflection.GeneratedProtocolMessageType('ListEnvironmentsResponse', (_message.Message,), {
+  'DESCRIPTOR' : _LISTENVIRONMENTSRESPONSE,
+  '__module__' : 'contentmanagement.contentmanagment_pb2'
+  # @@protoc_insertion_point(class_scope:contentmanagement.ListEnvironmentsResponse)
+  })
+_sym_db.RegisterMessage(ListEnvironmentsResponse)
+
+UpdateEnvironmentRequest = _reflection.GeneratedProtocolMessageType('UpdateEnvironmentRequest', (_message.Message,), {
+  'DESCRIPTOR' : _UPDATEENVIRONMENTREQUEST,
+  '__module__' : 'contentmanagement.contentmanagment_pb2'
+  # @@protoc_insertion_point(class_scope:contentmanagement.UpdateEnvironmentRequest)
+  })
+_sym_db.RegisterMessage(UpdateEnvironmentRequest)
+
+UpdateEnvironmentResponse = _reflection.GeneratedProtocolMessageType('UpdateEnvironmentResponse', (_message.Message,), {
+  'DESCRIPTOR' : _UPDATEENVIRONMENTRESPONSE,
+  '__module__' : 'contentmanagement.contentmanagment_pb2'
+  # @@protoc_insertion_point(class_scope:contentmanagement.UpdateEnvironmentResponse)
+  })
+_sym_db.RegisterMessage(UpdateEnvironmentResponse)
+
+DeleteEnvironmentRequest = _reflection.GeneratedProtocolMessageType('DeleteEnvironmentRequest', (_message.Message,), {
+  'DESCRIPTOR' : _DELETEENVIRONMENTREQUEST,
+  '__module__' : 'contentmanagement.contentmanagment_pb2'
+  # @@protoc_insertion_point(class_scope:contentmanagement.DeleteEnvironmentRequest)
+  })
+_sym_db.RegisterMessage(DeleteEnvironmentRequest)
+
+DeleteEnvironmentResponse = _reflection.GeneratedProtocolMessageType('DeleteEnvironmentResponse', (_message.Message,), {
+  'DESCRIPTOR' : _DELETEENVIRONMENTRESPONSE,
+  '__module__' : 'contentmanagement.contentmanagment_pb2'
+  # @@protoc_insertion_point(class_scope:contentmanagement.DeleteEnvironmentResponse)
+  })
+_sym_db.RegisterMessage(DeleteEnvironmentResponse)
+
+SetEnvironmentAliasRequest = _reflection.GeneratedProtocolMessageType('SetEnvironmentAliasRequest', (_message.Message,), {
+  'DESCRIPTOR' : _SETENVIRONMENTALIASREQUEST,
+  '__module__' : 'contentmanagement.contentmanagment_pb2'
+  # @@protoc_insertion_point(class_scope:contentmanagement.SetEnvironmentAliasRequest)
+  })
+_sym_db.RegisterMessage(SetEnvironmentAliasRequest)
+
+SetEnvironmentAliasResponse = _reflection.GeneratedProtocolMessageType('SetEnvironmentAliasResponse', (_message.Message,), {
+  'DESCRIPTOR' : _SETENVIRONMENTALIASRESPONSE,
+  '__module__' : 'contentmanagement.contentmanagment_pb2'
+  # @@protoc_insertion_point(class_scope:contentmanagement.SetEnvironmentAliasResponse)
+  })
+_sym_db.RegisterMessage(SetEnvironmentAliasResponse)
+
+RemoveEnvironmentAliasRequest = _reflection.GeneratedProtocolMessageType('RemoveEnvironmentAliasRequest', (_message.Message,), {
+  'DESCRIPTOR' : _REMOVEENVIRONMENTALIASREQUEST,
+  '__module__' : 'contentmanagement.contentmanagment_pb2'
+  # @@protoc_insertion_point(class_scope:contentmanagement.RemoveEnvironmentAliasRequest)
+  })
+_sym_db.RegisterMessage(RemoveEnvironmentAliasRequest)
+
+RemoveEnvironmentAliasResponse = _reflection.GeneratedProtocolMessageType('RemoveEnvironmentAliasResponse', (_message.Message,), {
+  'DESCRIPTOR' : _REMOVEENVIRONMENTALIASRESPONSE,
+  '__module__' : 'contentmanagement.contentmanagment_pb2'
+  # @@protoc_insertion_point(class_scope:contentmanagement.RemoveEnvironmentAliasResponse)
+  })
+_sym_db.RegisterMessage(RemoveEnvironmentAliasResponse)
+
+CreateSpaceRoleRequest = _reflection.GeneratedProtocolMessageType('CreateSpaceRoleRequest', (_message.Message,), {
+  'DESCRIPTOR' : _CREATESPACEROLEREQUEST,
+  '__module__' : 'contentmanagement.contentmanagment_pb2'
+  # @@protoc_insertion_point(class_scope:contentmanagement.CreateSpaceRoleRequest)
+  })
+_sym_db.RegisterMessage(CreateSpaceRoleRequest)
+
+UpdateSpaceRoleRequest = _reflection.GeneratedProtocolMessageType('UpdateSpaceRoleRequest', (_message.Message,), {
+  'DESCRIPTOR' : _UPDATESPACEROLEREQUEST,
+  '__module__' : 'contentmanagement.contentmanagment_pb2'
+  # @@protoc_insertion_point(class_scope:contentmanagement.UpdateSpaceRoleRequest)
+  })
+_sym_db.RegisterMessage(UpdateSpaceRoleRequest)
+
+ListSpaceRolesRequest = _reflection.GeneratedProtocolMessageType('ListSpaceRolesRequest', (_message.Message,), {
+  'DESCRIPTOR' : _LISTSPACEROLESREQUEST,
+  '__module__' : 'contentmanagement.contentmanagment_pb2'
+  # @@protoc_insertion_point(class_scope:contentmanagement.ListSpaceRolesRequest)
+  })
+_sym_db.RegisterMessage(ListSpaceRolesRequest)
+
+ListSpaceRolesResponse = _reflection.GeneratedProtocolMessageType('ListSpaceRolesResponse', (_message.Message,), {
+  'DESCRIPTOR' : _LISTSPACEROLESRESPONSE,
+  '__module__' : 'contentmanagement.contentmanagment_pb2'
+  # @@protoc_insertion_point(class_scope:contentmanagement.ListSpaceRolesResponse)
+  })
+_sym_db.RegisterMessage(ListSpaceRolesResponse)
+
+DeleteSpaceRoleRequest = _reflection.GeneratedProtocolMessageType('DeleteSpaceRoleRequest', (_message.Message,), {
+  'DESCRIPTOR' : _DELETESPACEROLEREQUEST,
+  '__module__' : 'contentmanagement.contentmanagment_pb2'
+  # @@protoc_insertion_point(class_scope:contentmanagement.DeleteSpaceRoleRequest)
+  })
+_sym_db.RegisterMessage(DeleteSpaceRoleRequest)
+
+
+DESCRIPTOR._options = None
+
+_CONTENTMANAGEMENT = _descriptor.ServiceDescriptor(
+  name='ContentManagement',
+  full_name='contentmanagement.ContentManagement',
+  file=DESCRIPTOR,
+  index=0,
+  serialized_options=None,
+  create_key=_descriptor._internal_create_key,
+  serialized_start=4380,
+  serialized_end=7360,
+  methods=[
+  _descriptor.MethodDescriptor(
+    name='CreateCollection',
+    full_name='contentmanagement.ContentManagement.CreateCollection',
+    index=0,
+    containing_service=None,
+    input_type=_CREATECOLLECTIONREQUEST,
+    output_type=_CREATECOLLECTIONRESPONSE,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='GetCollection',
+    full_name='contentmanagement.ContentManagement.GetCollection',
+    index=1,
+    containing_service=None,
+    input_type=_GETCOLLECTIONREQUEST,
+    output_type=_GETCOLLECTIONRESPONSE,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='ListCollections',
+    full_name='contentmanagement.ContentManagement.ListCollections',
+    index=2,
+    containing_service=None,
+    input_type=_LISTCOLLECTIONSREQUEST,
+    output_type=_LISTCOLLECTIONSRESPONSE,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='UpdateCollection',
+    full_name='contentmanagement.ContentManagement.UpdateCollection',
+    index=3,
+    containing_service=None,
+    input_type=_UPDATECOLLECTIONREQUEST,
+    output_type=google_dot_protobuf_dot_empty__pb2._EMPTY,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='DeleteCollection',
+    full_name='contentmanagement.ContentManagement.DeleteCollection',
+    index=4,
+    containing_service=None,
+    input_type=_DELETECOLLECTIONREQUEST,
+    output_type=google_dot_protobuf_dot_empty__pb2._EMPTY,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='CreateItem',
+    full_name='contentmanagement.ContentManagement.CreateItem',
+    index=5,
+    containing_service=None,
+    input_type=_CREATEITEMREQUEST,
+    output_type=_CREATEITEMRESPONSE,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='GetItem',
+    full_name='contentmanagement.ContentManagement.GetItem',
+    index=6,
+    containing_service=None,
+    input_type=_GETITEMREQUEST,
+    output_type=_GETITEMRESPONSE,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='UpdateItem',
+    full_name='contentmanagement.ContentManagement.UpdateItem',
+    index=7,
+    containing_service=None,
+    input_type=_UPDATEITEMREQUEST,
+    output_type=_UPDATEITEMRESPONSE,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='DeleteItem',
+    full_name='contentmanagement.ContentManagement.DeleteItem',
+    index=8,
+    containing_service=None,
+    input_type=_DELETEITEMREQUEST,
+    output_type=google_dot_protobuf_dot_empty__pb2._EMPTY,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='PublishItem',
+    full_name='contentmanagement.ContentManagement.PublishItem',
+    index=9,
+    containing_service=None,
+    input_type=_PUBLISHITEMREQUEST,
+    output_type=google_dot_protobuf_dot_empty__pb2._EMPTY,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='UnpublishItem',
+    full_name='contentmanagement.ContentManagement.UnpublishItem',
+    index=10,
+    containing_service=None,
+    input_type=_UNPUBLISHITEMREQUEST,
+    output_type=google_dot_protobuf_dot_empty__pb2._EMPTY,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='ArchiveItem',
+    full_name='contentmanagement.ContentManagement.ArchiveItem',
+    index=11,
+    containing_service=None,
+    input_type=_ARCHIVEITEMREQUEST,
+    output_type=google_dot_protobuf_dot_empty__pb2._EMPTY,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='UnarchiveItem',
+    full_name='contentmanagement.ContentManagement.UnarchiveItem',
+    index=12,
+    containing_service=None,
+    input_type=_UNARCHIVEITEMREQUEST,
+    output_type=google_dot_protobuf_dot_empty__pb2._EMPTY,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='ListItemRevisions',
+    full_name='contentmanagement.ContentManagement.ListItemRevisions',
+    index=13,
+    containing_service=None,
+    input_type=_LISTITEMREVISIONSREQUEST,
+    output_type=_LISTITEMREVISIONSRESPONSE,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='GetItemRevision',
+    full_name='contentmanagement.ContentManagement.GetItemRevision',
+    index=14,
+    containing_service=None,
+    input_type=_GETITEMREVISIONREQUEST,
+    output_type=_GETITEMREVISIONRESPONSE,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='FindItems',
+    full_name='contentmanagement.ContentManagement.FindItems',
+    index=15,
+    containing_service=None,
+    input_type=_FINDITEMSREQUEST,
+    output_type=_FINDITEMSRESPONSE,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='FindArchivedItems',
+    full_name='contentmanagement.ContentManagement.FindArchivedItems',
+    index=16,
+    containing_service=None,
+    input_type=_FINDARCHIVEDITEMSREQUEST,
+    output_type=_FINDARCHIVEDITEMSRESPONSE,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='CreateLocale',
+    full_name='contentmanagement.ContentManagement.CreateLocale',
+    index=17,
+    containing_service=None,
+    input_type=_CREATELOCALEREQUEST,
+    output_type=_CREATELOCALERESPONSE,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='ListLocales',
+    full_name='contentmanagement.ContentManagement.ListLocales',
+    index=18,
+    containing_service=None,
+    input_type=_LISTLOCALESREQUEST,
+    output_type=_LISTLOCALESRESPONSE,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='DeleteLocale',
+    full_name='contentmanagement.ContentManagement.DeleteLocale',
+    index=19,
+    containing_service=None,
+    input_type=_DELETELOCALEREQUEST,
+    output_type=google_dot_protobuf_dot_empty__pb2._EMPTY,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='CreateEnvironment',
+    full_name='contentmanagement.ContentManagement.CreateEnvironment',
+    index=20,
+    containing_service=None,
+    input_type=_CREATEENVIRONMENTREQUEST,
+    output_type=_CREATEENVIRONMENTRESPONSE,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='GetEnvironment',
+    full_name='contentmanagement.ContentManagement.GetEnvironment',
+    index=21,
+    containing_service=None,
+    input_type=_GETENVIRONMENTREQUEST,
+    output_type=_GETENVIRONMENTRESPONSE,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='ListEnvironments',
+    full_name='contentmanagement.ContentManagement.ListEnvironments',
+    index=22,
+    containing_service=None,
+    input_type=_LISTENVIRONMENTSREQUEST,
+    output_type=_LISTENVIRONMENTSRESPONSE,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='UpdateEnvironment',
+    full_name='contentmanagement.ContentManagement.UpdateEnvironment',
+    index=23,
+    containing_service=None,
+    input_type=_UPDATEENVIRONMENTREQUEST,
+    output_type=google_dot_protobuf_dot_empty__pb2._EMPTY,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='DeleteEnvironment',
+    full_name='contentmanagement.ContentManagement.DeleteEnvironment',
+    index=24,
+    containing_service=None,
+    input_type=_DELETEENVIRONMENTREQUEST,
+    output_type=google_dot_protobuf_dot_empty__pb2._EMPTY,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='SetEnvironmentAlias',
+    full_name='contentmanagement.ContentManagement.SetEnvironmentAlias',
+    index=25,
+    containing_service=None,
+    input_type=_SETENVIRONMENTALIASREQUEST,
+    output_type=google_dot_protobuf_dot_empty__pb2._EMPTY,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='RemoveEnvironmentAlias',
+    full_name='contentmanagement.ContentManagement.RemoveEnvironmentAlias',
+    index=26,
+    containing_service=None,
+    input_type=_REMOVEENVIRONMENTALIASREQUEST,
+    output_type=google_dot_protobuf_dot_empty__pb2._EMPTY,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='CreateSpaceRole',
+    full_name='contentmanagement.ContentManagement.CreateSpaceRole',
+    index=27,
+    containing_service=None,
+    input_type=_CREATESPACEROLEREQUEST,
+    output_type=google_dot_protobuf_dot_empty__pb2._EMPTY,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='UpdateSpaceRole',
+    full_name='contentmanagement.ContentManagement.UpdateSpaceRole',
+    index=28,
+    containing_service=None,
+    input_type=_UPDATESPACEROLEREQUEST,
+    output_type=google_dot_protobuf_dot_empty__pb2._EMPTY,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='ListSpaceRoles',
+    full_name='contentmanagement.ContentManagement.ListSpaceRoles',
+    index=29,
+    containing_service=None,
+    input_type=_LISTSPACEROLESREQUEST,
+    output_type=_LISTSPACEROLESRESPONSE,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='DeleteSpaceRole',
+    full_name='contentmanagement.ContentManagement.DeleteSpaceRole',
+    index=30,
+    containing_service=None,
+    input_type=_DELETESPACEROLEREQUEST,
+    output_type=google_dot_protobuf_dot_empty__pb2._EMPTY,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+])
+_sym_db.RegisterServiceDescriptor(_CONTENTMANAGEMENT)
+
+DESCRIPTOR.services_by_name['ContentManagement'] = _CONTENTMANAGEMENT
+
+# @@protoc_insertion_point(module_scope)
diff --git a/perxis/contentmanagement/contentmanagment_pb2_grpc.py b/perxis/contentmanagement/contentmanagment_pb2_grpc.py
new file mode 100644
index 0000000..ce3b4f0
--- /dev/null
+++ b/perxis/contentmanagement/contentmanagment_pb2_grpc.py
@@ -0,0 +1,1062 @@
+# Generated by the gRPC Python protocol compiler plugin. DO NOT EDIT!
+"""Client and server classes corresponding to protobuf-defined services."""
+import grpc
+
+from contentmanagement import contentmanagment_pb2 as contentmanagement_dot_contentmanagment__pb2
+from google.protobuf import empty_pb2 as google_dot_protobuf_dot_empty__pb2
+
+
+class ContentManagementStub(object):
+    """Missing associated documentation comment in .proto file."""
+
+    def __init__(self, channel):
+        """Constructor.
+
+        Args:
+            channel: A grpc.Channel.
+        """
+        self.CreateCollection = channel.unary_unary(
+                '/contentmanagement.ContentManagement/CreateCollection',
+                request_serializer=contentmanagement_dot_contentmanagment__pb2.CreateCollectionRequest.SerializeToString,
+                response_deserializer=contentmanagement_dot_contentmanagment__pb2.CreateCollectionResponse.FromString,
+                )
+        self.GetCollection = channel.unary_unary(
+                '/contentmanagement.ContentManagement/GetCollection',
+                request_serializer=contentmanagement_dot_contentmanagment__pb2.GetCollectionRequest.SerializeToString,
+                response_deserializer=contentmanagement_dot_contentmanagment__pb2.GetCollectionResponse.FromString,
+                )
+        self.ListCollections = channel.unary_unary(
+                '/contentmanagement.ContentManagement/ListCollections',
+                request_serializer=contentmanagement_dot_contentmanagment__pb2.ListCollectionsRequest.SerializeToString,
+                response_deserializer=contentmanagement_dot_contentmanagment__pb2.ListCollectionsResponse.FromString,
+                )
+        self.UpdateCollection = channel.unary_unary(
+                '/contentmanagement.ContentManagement/UpdateCollection',
+                request_serializer=contentmanagement_dot_contentmanagment__pb2.UpdateCollectionRequest.SerializeToString,
+                response_deserializer=google_dot_protobuf_dot_empty__pb2.Empty.FromString,
+                )
+        self.DeleteCollection = channel.unary_unary(
+                '/contentmanagement.ContentManagement/DeleteCollection',
+                request_serializer=contentmanagement_dot_contentmanagment__pb2.DeleteCollectionRequest.SerializeToString,
+                response_deserializer=google_dot_protobuf_dot_empty__pb2.Empty.FromString,
+                )
+        self.CreateItem = channel.unary_unary(
+                '/contentmanagement.ContentManagement/CreateItem',
+                request_serializer=contentmanagement_dot_contentmanagment__pb2.CreateItemRequest.SerializeToString,
+                response_deserializer=contentmanagement_dot_contentmanagment__pb2.CreateItemResponse.FromString,
+                )
+        self.GetItem = channel.unary_unary(
+                '/contentmanagement.ContentManagement/GetItem',
+                request_serializer=contentmanagement_dot_contentmanagment__pb2.GetItemRequest.SerializeToString,
+                response_deserializer=contentmanagement_dot_contentmanagment__pb2.GetItemResponse.FromString,
+                )
+        self.UpdateItem = channel.unary_unary(
+                '/contentmanagement.ContentManagement/UpdateItem',
+                request_serializer=contentmanagement_dot_contentmanagment__pb2.UpdateItemRequest.SerializeToString,
+                response_deserializer=contentmanagement_dot_contentmanagment__pb2.UpdateItemResponse.FromString,
+                )
+        self.DeleteItem = channel.unary_unary(
+                '/contentmanagement.ContentManagement/DeleteItem',
+                request_serializer=contentmanagement_dot_contentmanagment__pb2.DeleteItemRequest.SerializeToString,
+                response_deserializer=google_dot_protobuf_dot_empty__pb2.Empty.FromString,
+                )
+        self.PublishItem = channel.unary_unary(
+                '/contentmanagement.ContentManagement/PublishItem',
+                request_serializer=contentmanagement_dot_contentmanagment__pb2.PublishItemRequest.SerializeToString,
+                response_deserializer=google_dot_protobuf_dot_empty__pb2.Empty.FromString,
+                )
+        self.UnpublishItem = channel.unary_unary(
+                '/contentmanagement.ContentManagement/UnpublishItem',
+                request_serializer=contentmanagement_dot_contentmanagment__pb2.UnpublishItemRequest.SerializeToString,
+                response_deserializer=google_dot_protobuf_dot_empty__pb2.Empty.FromString,
+                )
+        self.ArchiveItem = channel.unary_unary(
+                '/contentmanagement.ContentManagement/ArchiveItem',
+                request_serializer=contentmanagement_dot_contentmanagment__pb2.ArchiveItemRequest.SerializeToString,
+                response_deserializer=google_dot_protobuf_dot_empty__pb2.Empty.FromString,
+                )
+        self.UnarchiveItem = channel.unary_unary(
+                '/contentmanagement.ContentManagement/UnarchiveItem',
+                request_serializer=contentmanagement_dot_contentmanagment__pb2.UnarchiveItemRequest.SerializeToString,
+                response_deserializer=google_dot_protobuf_dot_empty__pb2.Empty.FromString,
+                )
+        self.ListItemRevisions = channel.unary_unary(
+                '/contentmanagement.ContentManagement/ListItemRevisions',
+                request_serializer=contentmanagement_dot_contentmanagment__pb2.ListItemRevisionsRequest.SerializeToString,
+                response_deserializer=contentmanagement_dot_contentmanagment__pb2.ListItemRevisionsResponse.FromString,
+                )
+        self.GetItemRevision = channel.unary_unary(
+                '/contentmanagement.ContentManagement/GetItemRevision',
+                request_serializer=contentmanagement_dot_contentmanagment__pb2.GetItemRevisionRequest.SerializeToString,
+                response_deserializer=contentmanagement_dot_contentmanagment__pb2.GetItemRevisionResponse.FromString,
+                )
+        self.FindItems = channel.unary_unary(
+                '/contentmanagement.ContentManagement/FindItems',
+                request_serializer=contentmanagement_dot_contentmanagment__pb2.FindItemsRequest.SerializeToString,
+                response_deserializer=contentmanagement_dot_contentmanagment__pb2.FindItemsResponse.FromString,
+                )
+        self.FindArchivedItems = channel.unary_unary(
+                '/contentmanagement.ContentManagement/FindArchivedItems',
+                request_serializer=contentmanagement_dot_contentmanagment__pb2.FindArchivedItemsRequest.SerializeToString,
+                response_deserializer=contentmanagement_dot_contentmanagment__pb2.FindArchivedItemsResponse.FromString,
+                )
+        self.CreateLocale = channel.unary_unary(
+                '/contentmanagement.ContentManagement/CreateLocale',
+                request_serializer=contentmanagement_dot_contentmanagment__pb2.CreateLocaleRequest.SerializeToString,
+                response_deserializer=contentmanagement_dot_contentmanagment__pb2.CreateLocaleResponse.FromString,
+                )
+        self.ListLocales = channel.unary_unary(
+                '/contentmanagement.ContentManagement/ListLocales',
+                request_serializer=contentmanagement_dot_contentmanagment__pb2.ListLocalesRequest.SerializeToString,
+                response_deserializer=contentmanagement_dot_contentmanagment__pb2.ListLocalesResponse.FromString,
+                )
+        self.DeleteLocale = channel.unary_unary(
+                '/contentmanagement.ContentManagement/DeleteLocale',
+                request_serializer=contentmanagement_dot_contentmanagment__pb2.DeleteLocaleRequest.SerializeToString,
+                response_deserializer=google_dot_protobuf_dot_empty__pb2.Empty.FromString,
+                )
+        self.CreateEnvironment = channel.unary_unary(
+                '/contentmanagement.ContentManagement/CreateEnvironment',
+                request_serializer=contentmanagement_dot_contentmanagment__pb2.CreateEnvironmentRequest.SerializeToString,
+                response_deserializer=contentmanagement_dot_contentmanagment__pb2.CreateEnvironmentResponse.FromString,
+                )
+        self.GetEnvironment = channel.unary_unary(
+                '/contentmanagement.ContentManagement/GetEnvironment',
+                request_serializer=contentmanagement_dot_contentmanagment__pb2.GetEnvironmentRequest.SerializeToString,
+                response_deserializer=contentmanagement_dot_contentmanagment__pb2.GetEnvironmentResponse.FromString,
+                )
+        self.ListEnvironments = channel.unary_unary(
+                '/contentmanagement.ContentManagement/ListEnvironments',
+                request_serializer=contentmanagement_dot_contentmanagment__pb2.ListEnvironmentsRequest.SerializeToString,
+                response_deserializer=contentmanagement_dot_contentmanagment__pb2.ListEnvironmentsResponse.FromString,
+                )
+        self.UpdateEnvironment = channel.unary_unary(
+                '/contentmanagement.ContentManagement/UpdateEnvironment',
+                request_serializer=contentmanagement_dot_contentmanagment__pb2.UpdateEnvironmentRequest.SerializeToString,
+                response_deserializer=google_dot_protobuf_dot_empty__pb2.Empty.FromString,
+                )
+        self.DeleteEnvironment = channel.unary_unary(
+                '/contentmanagement.ContentManagement/DeleteEnvironment',
+                request_serializer=contentmanagement_dot_contentmanagment__pb2.DeleteEnvironmentRequest.SerializeToString,
+                response_deserializer=google_dot_protobuf_dot_empty__pb2.Empty.FromString,
+                )
+        self.SetEnvironmentAlias = channel.unary_unary(
+                '/contentmanagement.ContentManagement/SetEnvironmentAlias',
+                request_serializer=contentmanagement_dot_contentmanagment__pb2.SetEnvironmentAliasRequest.SerializeToString,
+                response_deserializer=google_dot_protobuf_dot_empty__pb2.Empty.FromString,
+                )
+        self.RemoveEnvironmentAlias = channel.unary_unary(
+                '/contentmanagement.ContentManagement/RemoveEnvironmentAlias',
+                request_serializer=contentmanagement_dot_contentmanagment__pb2.RemoveEnvironmentAliasRequest.SerializeToString,
+                response_deserializer=google_dot_protobuf_dot_empty__pb2.Empty.FromString,
+                )
+        self.CreateSpaceRole = channel.unary_unary(
+                '/contentmanagement.ContentManagement/CreateSpaceRole',
+                request_serializer=contentmanagement_dot_contentmanagment__pb2.CreateSpaceRoleRequest.SerializeToString,
+                response_deserializer=google_dot_protobuf_dot_empty__pb2.Empty.FromString,
+                )
+        self.UpdateSpaceRole = channel.unary_unary(
+                '/contentmanagement.ContentManagement/UpdateSpaceRole',
+                request_serializer=contentmanagement_dot_contentmanagment__pb2.UpdateSpaceRoleRequest.SerializeToString,
+                response_deserializer=google_dot_protobuf_dot_empty__pb2.Empty.FromString,
+                )
+        self.ListSpaceRoles = channel.unary_unary(
+                '/contentmanagement.ContentManagement/ListSpaceRoles',
+                request_serializer=contentmanagement_dot_contentmanagment__pb2.ListSpaceRolesRequest.SerializeToString,
+                response_deserializer=contentmanagement_dot_contentmanagment__pb2.ListSpaceRolesResponse.FromString,
+                )
+        self.DeleteSpaceRole = channel.unary_unary(
+                '/contentmanagement.ContentManagement/DeleteSpaceRole',
+                request_serializer=contentmanagement_dot_contentmanagment__pb2.DeleteSpaceRoleRequest.SerializeToString,
+                response_deserializer=google_dot_protobuf_dot_empty__pb2.Empty.FromString,
+                )
+
+
+class ContentManagementServicer(object):
+    """Missing associated documentation comment in .proto file."""
+
+    def CreateCollection(self, request, context):
+        """Collection
+        """
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def GetCollection(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def ListCollections(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def UpdateCollection(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def DeleteCollection(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def CreateItem(self, request, context):
+        """Item
+        """
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def GetItem(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def UpdateItem(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def DeleteItem(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def PublishItem(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def UnpublishItem(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def ArchiveItem(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def UnarchiveItem(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def ListItemRevisions(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def GetItemRevision(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def FindItems(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def FindArchivedItems(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def CreateLocale(self, request, context):
+        """Locale
+        """
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def ListLocales(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def DeleteLocale(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def CreateEnvironment(self, request, context):
+        """Environment
+        """
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def GetEnvironment(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def ListEnvironments(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def UpdateEnvironment(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def DeleteEnvironment(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def SetEnvironmentAlias(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def RemoveEnvironmentAlias(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def CreateSpaceRole(self, request, context):
+        """Space Role
+        """
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def UpdateSpaceRole(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def ListSpaceRoles(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def DeleteSpaceRole(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+
+def add_ContentManagementServicer_to_server(servicer, server):
+    rpc_method_handlers = {
+            'CreateCollection': grpc.unary_unary_rpc_method_handler(
+                    servicer.CreateCollection,
+                    request_deserializer=contentmanagement_dot_contentmanagment__pb2.CreateCollectionRequest.FromString,
+                    response_serializer=contentmanagement_dot_contentmanagment__pb2.CreateCollectionResponse.SerializeToString,
+            ),
+            'GetCollection': grpc.unary_unary_rpc_method_handler(
+                    servicer.GetCollection,
+                    request_deserializer=contentmanagement_dot_contentmanagment__pb2.GetCollectionRequest.FromString,
+                    response_serializer=contentmanagement_dot_contentmanagment__pb2.GetCollectionResponse.SerializeToString,
+            ),
+            'ListCollections': grpc.unary_unary_rpc_method_handler(
+                    servicer.ListCollections,
+                    request_deserializer=contentmanagement_dot_contentmanagment__pb2.ListCollectionsRequest.FromString,
+                    response_serializer=contentmanagement_dot_contentmanagment__pb2.ListCollectionsResponse.SerializeToString,
+            ),
+            'UpdateCollection': grpc.unary_unary_rpc_method_handler(
+                    servicer.UpdateCollection,
+                    request_deserializer=contentmanagement_dot_contentmanagment__pb2.UpdateCollectionRequest.FromString,
+                    response_serializer=google_dot_protobuf_dot_empty__pb2.Empty.SerializeToString,
+            ),
+            'DeleteCollection': grpc.unary_unary_rpc_method_handler(
+                    servicer.DeleteCollection,
+                    request_deserializer=contentmanagement_dot_contentmanagment__pb2.DeleteCollectionRequest.FromString,
+                    response_serializer=google_dot_protobuf_dot_empty__pb2.Empty.SerializeToString,
+            ),
+            'CreateItem': grpc.unary_unary_rpc_method_handler(
+                    servicer.CreateItem,
+                    request_deserializer=contentmanagement_dot_contentmanagment__pb2.CreateItemRequest.FromString,
+                    response_serializer=contentmanagement_dot_contentmanagment__pb2.CreateItemResponse.SerializeToString,
+            ),
+            'GetItem': grpc.unary_unary_rpc_method_handler(
+                    servicer.GetItem,
+                    request_deserializer=contentmanagement_dot_contentmanagment__pb2.GetItemRequest.FromString,
+                    response_serializer=contentmanagement_dot_contentmanagment__pb2.GetItemResponse.SerializeToString,
+            ),
+            'UpdateItem': grpc.unary_unary_rpc_method_handler(
+                    servicer.UpdateItem,
+                    request_deserializer=contentmanagement_dot_contentmanagment__pb2.UpdateItemRequest.FromString,
+                    response_serializer=contentmanagement_dot_contentmanagment__pb2.UpdateItemResponse.SerializeToString,
+            ),
+            'DeleteItem': grpc.unary_unary_rpc_method_handler(
+                    servicer.DeleteItem,
+                    request_deserializer=contentmanagement_dot_contentmanagment__pb2.DeleteItemRequest.FromString,
+                    response_serializer=google_dot_protobuf_dot_empty__pb2.Empty.SerializeToString,
+            ),
+            'PublishItem': grpc.unary_unary_rpc_method_handler(
+                    servicer.PublishItem,
+                    request_deserializer=contentmanagement_dot_contentmanagment__pb2.PublishItemRequest.FromString,
+                    response_serializer=google_dot_protobuf_dot_empty__pb2.Empty.SerializeToString,
+            ),
+            'UnpublishItem': grpc.unary_unary_rpc_method_handler(
+                    servicer.UnpublishItem,
+                    request_deserializer=contentmanagement_dot_contentmanagment__pb2.UnpublishItemRequest.FromString,
+                    response_serializer=google_dot_protobuf_dot_empty__pb2.Empty.SerializeToString,
+            ),
+            'ArchiveItem': grpc.unary_unary_rpc_method_handler(
+                    servicer.ArchiveItem,
+                    request_deserializer=contentmanagement_dot_contentmanagment__pb2.ArchiveItemRequest.FromString,
+                    response_serializer=google_dot_protobuf_dot_empty__pb2.Empty.SerializeToString,
+            ),
+            'UnarchiveItem': grpc.unary_unary_rpc_method_handler(
+                    servicer.UnarchiveItem,
+                    request_deserializer=contentmanagement_dot_contentmanagment__pb2.UnarchiveItemRequest.FromString,
+                    response_serializer=google_dot_protobuf_dot_empty__pb2.Empty.SerializeToString,
+            ),
+            'ListItemRevisions': grpc.unary_unary_rpc_method_handler(
+                    servicer.ListItemRevisions,
+                    request_deserializer=contentmanagement_dot_contentmanagment__pb2.ListItemRevisionsRequest.FromString,
+                    response_serializer=contentmanagement_dot_contentmanagment__pb2.ListItemRevisionsResponse.SerializeToString,
+            ),
+            'GetItemRevision': grpc.unary_unary_rpc_method_handler(
+                    servicer.GetItemRevision,
+                    request_deserializer=contentmanagement_dot_contentmanagment__pb2.GetItemRevisionRequest.FromString,
+                    response_serializer=contentmanagement_dot_contentmanagment__pb2.GetItemRevisionResponse.SerializeToString,
+            ),
+            'FindItems': grpc.unary_unary_rpc_method_handler(
+                    servicer.FindItems,
+                    request_deserializer=contentmanagement_dot_contentmanagment__pb2.FindItemsRequest.FromString,
+                    response_serializer=contentmanagement_dot_contentmanagment__pb2.FindItemsResponse.SerializeToString,
+            ),
+            'FindArchivedItems': grpc.unary_unary_rpc_method_handler(
+                    servicer.FindArchivedItems,
+                    request_deserializer=contentmanagement_dot_contentmanagment__pb2.FindArchivedItemsRequest.FromString,
+                    response_serializer=contentmanagement_dot_contentmanagment__pb2.FindArchivedItemsResponse.SerializeToString,
+            ),
+            'CreateLocale': grpc.unary_unary_rpc_method_handler(
+                    servicer.CreateLocale,
+                    request_deserializer=contentmanagement_dot_contentmanagment__pb2.CreateLocaleRequest.FromString,
+                    response_serializer=contentmanagement_dot_contentmanagment__pb2.CreateLocaleResponse.SerializeToString,
+            ),
+            'ListLocales': grpc.unary_unary_rpc_method_handler(
+                    servicer.ListLocales,
+                    request_deserializer=contentmanagement_dot_contentmanagment__pb2.ListLocalesRequest.FromString,
+                    response_serializer=contentmanagement_dot_contentmanagment__pb2.ListLocalesResponse.SerializeToString,
+            ),
+            'DeleteLocale': grpc.unary_unary_rpc_method_handler(
+                    servicer.DeleteLocale,
+                    request_deserializer=contentmanagement_dot_contentmanagment__pb2.DeleteLocaleRequest.FromString,
+                    response_serializer=google_dot_protobuf_dot_empty__pb2.Empty.SerializeToString,
+            ),
+            'CreateEnvironment': grpc.unary_unary_rpc_method_handler(
+                    servicer.CreateEnvironment,
+                    request_deserializer=contentmanagement_dot_contentmanagment__pb2.CreateEnvironmentRequest.FromString,
+                    response_serializer=contentmanagement_dot_contentmanagment__pb2.CreateEnvironmentResponse.SerializeToString,
+            ),
+            'GetEnvironment': grpc.unary_unary_rpc_method_handler(
+                    servicer.GetEnvironment,
+                    request_deserializer=contentmanagement_dot_contentmanagment__pb2.GetEnvironmentRequest.FromString,
+                    response_serializer=contentmanagement_dot_contentmanagment__pb2.GetEnvironmentResponse.SerializeToString,
+            ),
+            'ListEnvironments': grpc.unary_unary_rpc_method_handler(
+                    servicer.ListEnvironments,
+                    request_deserializer=contentmanagement_dot_contentmanagment__pb2.ListEnvironmentsRequest.FromString,
+                    response_serializer=contentmanagement_dot_contentmanagment__pb2.ListEnvironmentsResponse.SerializeToString,
+            ),
+            'UpdateEnvironment': grpc.unary_unary_rpc_method_handler(
+                    servicer.UpdateEnvironment,
+                    request_deserializer=contentmanagement_dot_contentmanagment__pb2.UpdateEnvironmentRequest.FromString,
+                    response_serializer=google_dot_protobuf_dot_empty__pb2.Empty.SerializeToString,
+            ),
+            'DeleteEnvironment': grpc.unary_unary_rpc_method_handler(
+                    servicer.DeleteEnvironment,
+                    request_deserializer=contentmanagement_dot_contentmanagment__pb2.DeleteEnvironmentRequest.FromString,
+                    response_serializer=google_dot_protobuf_dot_empty__pb2.Empty.SerializeToString,
+            ),
+            'SetEnvironmentAlias': grpc.unary_unary_rpc_method_handler(
+                    servicer.SetEnvironmentAlias,
+                    request_deserializer=contentmanagement_dot_contentmanagment__pb2.SetEnvironmentAliasRequest.FromString,
+                    response_serializer=google_dot_protobuf_dot_empty__pb2.Empty.SerializeToString,
+            ),
+            'RemoveEnvironmentAlias': grpc.unary_unary_rpc_method_handler(
+                    servicer.RemoveEnvironmentAlias,
+                    request_deserializer=contentmanagement_dot_contentmanagment__pb2.RemoveEnvironmentAliasRequest.FromString,
+                    response_serializer=google_dot_protobuf_dot_empty__pb2.Empty.SerializeToString,
+            ),
+            'CreateSpaceRole': grpc.unary_unary_rpc_method_handler(
+                    servicer.CreateSpaceRole,
+                    request_deserializer=contentmanagement_dot_contentmanagment__pb2.CreateSpaceRoleRequest.FromString,
+                    response_serializer=google_dot_protobuf_dot_empty__pb2.Empty.SerializeToString,
+            ),
+            'UpdateSpaceRole': grpc.unary_unary_rpc_method_handler(
+                    servicer.UpdateSpaceRole,
+                    request_deserializer=contentmanagement_dot_contentmanagment__pb2.UpdateSpaceRoleRequest.FromString,
+                    response_serializer=google_dot_protobuf_dot_empty__pb2.Empty.SerializeToString,
+            ),
+            'ListSpaceRoles': grpc.unary_unary_rpc_method_handler(
+                    servicer.ListSpaceRoles,
+                    request_deserializer=contentmanagement_dot_contentmanagment__pb2.ListSpaceRolesRequest.FromString,
+                    response_serializer=contentmanagement_dot_contentmanagment__pb2.ListSpaceRolesResponse.SerializeToString,
+            ),
+            'DeleteSpaceRole': grpc.unary_unary_rpc_method_handler(
+                    servicer.DeleteSpaceRole,
+                    request_deserializer=contentmanagement_dot_contentmanagment__pb2.DeleteSpaceRoleRequest.FromString,
+                    response_serializer=google_dot_protobuf_dot_empty__pb2.Empty.SerializeToString,
+            ),
+    }
+    generic_handler = grpc.method_handlers_generic_handler(
+            'contentmanagement.ContentManagement', rpc_method_handlers)
+    server.add_generic_rpc_handlers((generic_handler,))
+
+
+ # This class is part of an EXPERIMENTAL API.
+class ContentManagement(object):
+    """Missing associated documentation comment in .proto file."""
+
+    @staticmethod
+    def CreateCollection(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/contentmanagement.ContentManagement/CreateCollection',
+            contentmanagement_dot_contentmanagment__pb2.CreateCollectionRequest.SerializeToString,
+            contentmanagement_dot_contentmanagment__pb2.CreateCollectionResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def GetCollection(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/contentmanagement.ContentManagement/GetCollection',
+            contentmanagement_dot_contentmanagment__pb2.GetCollectionRequest.SerializeToString,
+            contentmanagement_dot_contentmanagment__pb2.GetCollectionResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def ListCollections(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/contentmanagement.ContentManagement/ListCollections',
+            contentmanagement_dot_contentmanagment__pb2.ListCollectionsRequest.SerializeToString,
+            contentmanagement_dot_contentmanagment__pb2.ListCollectionsResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def UpdateCollection(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/contentmanagement.ContentManagement/UpdateCollection',
+            contentmanagement_dot_contentmanagment__pb2.UpdateCollectionRequest.SerializeToString,
+            google_dot_protobuf_dot_empty__pb2.Empty.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def DeleteCollection(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/contentmanagement.ContentManagement/DeleteCollection',
+            contentmanagement_dot_contentmanagment__pb2.DeleteCollectionRequest.SerializeToString,
+            google_dot_protobuf_dot_empty__pb2.Empty.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def CreateItem(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/contentmanagement.ContentManagement/CreateItem',
+            contentmanagement_dot_contentmanagment__pb2.CreateItemRequest.SerializeToString,
+            contentmanagement_dot_contentmanagment__pb2.CreateItemResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def GetItem(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/contentmanagement.ContentManagement/GetItem',
+            contentmanagement_dot_contentmanagment__pb2.GetItemRequest.SerializeToString,
+            contentmanagement_dot_contentmanagment__pb2.GetItemResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def UpdateItem(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/contentmanagement.ContentManagement/UpdateItem',
+            contentmanagement_dot_contentmanagment__pb2.UpdateItemRequest.SerializeToString,
+            contentmanagement_dot_contentmanagment__pb2.UpdateItemResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def DeleteItem(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/contentmanagement.ContentManagement/DeleteItem',
+            contentmanagement_dot_contentmanagment__pb2.DeleteItemRequest.SerializeToString,
+            google_dot_protobuf_dot_empty__pb2.Empty.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def PublishItem(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/contentmanagement.ContentManagement/PublishItem',
+            contentmanagement_dot_contentmanagment__pb2.PublishItemRequest.SerializeToString,
+            google_dot_protobuf_dot_empty__pb2.Empty.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def UnpublishItem(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/contentmanagement.ContentManagement/UnpublishItem',
+            contentmanagement_dot_contentmanagment__pb2.UnpublishItemRequest.SerializeToString,
+            google_dot_protobuf_dot_empty__pb2.Empty.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def ArchiveItem(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/contentmanagement.ContentManagement/ArchiveItem',
+            contentmanagement_dot_contentmanagment__pb2.ArchiveItemRequest.SerializeToString,
+            google_dot_protobuf_dot_empty__pb2.Empty.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def UnarchiveItem(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/contentmanagement.ContentManagement/UnarchiveItem',
+            contentmanagement_dot_contentmanagment__pb2.UnarchiveItemRequest.SerializeToString,
+            google_dot_protobuf_dot_empty__pb2.Empty.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def ListItemRevisions(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/contentmanagement.ContentManagement/ListItemRevisions',
+            contentmanagement_dot_contentmanagment__pb2.ListItemRevisionsRequest.SerializeToString,
+            contentmanagement_dot_contentmanagment__pb2.ListItemRevisionsResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def GetItemRevision(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/contentmanagement.ContentManagement/GetItemRevision',
+            contentmanagement_dot_contentmanagment__pb2.GetItemRevisionRequest.SerializeToString,
+            contentmanagement_dot_contentmanagment__pb2.GetItemRevisionResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def FindItems(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/contentmanagement.ContentManagement/FindItems',
+            contentmanagement_dot_contentmanagment__pb2.FindItemsRequest.SerializeToString,
+            contentmanagement_dot_contentmanagment__pb2.FindItemsResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def FindArchivedItems(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/contentmanagement.ContentManagement/FindArchivedItems',
+            contentmanagement_dot_contentmanagment__pb2.FindArchivedItemsRequest.SerializeToString,
+            contentmanagement_dot_contentmanagment__pb2.FindArchivedItemsResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def CreateLocale(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/contentmanagement.ContentManagement/CreateLocale',
+            contentmanagement_dot_contentmanagment__pb2.CreateLocaleRequest.SerializeToString,
+            contentmanagement_dot_contentmanagment__pb2.CreateLocaleResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def ListLocales(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/contentmanagement.ContentManagement/ListLocales',
+            contentmanagement_dot_contentmanagment__pb2.ListLocalesRequest.SerializeToString,
+            contentmanagement_dot_contentmanagment__pb2.ListLocalesResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def DeleteLocale(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/contentmanagement.ContentManagement/DeleteLocale',
+            contentmanagement_dot_contentmanagment__pb2.DeleteLocaleRequest.SerializeToString,
+            google_dot_protobuf_dot_empty__pb2.Empty.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def CreateEnvironment(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/contentmanagement.ContentManagement/CreateEnvironment',
+            contentmanagement_dot_contentmanagment__pb2.CreateEnvironmentRequest.SerializeToString,
+            contentmanagement_dot_contentmanagment__pb2.CreateEnvironmentResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def GetEnvironment(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/contentmanagement.ContentManagement/GetEnvironment',
+            contentmanagement_dot_contentmanagment__pb2.GetEnvironmentRequest.SerializeToString,
+            contentmanagement_dot_contentmanagment__pb2.GetEnvironmentResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def ListEnvironments(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/contentmanagement.ContentManagement/ListEnvironments',
+            contentmanagement_dot_contentmanagment__pb2.ListEnvironmentsRequest.SerializeToString,
+            contentmanagement_dot_contentmanagment__pb2.ListEnvironmentsResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def UpdateEnvironment(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/contentmanagement.ContentManagement/UpdateEnvironment',
+            contentmanagement_dot_contentmanagment__pb2.UpdateEnvironmentRequest.SerializeToString,
+            google_dot_protobuf_dot_empty__pb2.Empty.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def DeleteEnvironment(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/contentmanagement.ContentManagement/DeleteEnvironment',
+            contentmanagement_dot_contentmanagment__pb2.DeleteEnvironmentRequest.SerializeToString,
+            google_dot_protobuf_dot_empty__pb2.Empty.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def SetEnvironmentAlias(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/contentmanagement.ContentManagement/SetEnvironmentAlias',
+            contentmanagement_dot_contentmanagment__pb2.SetEnvironmentAliasRequest.SerializeToString,
+            google_dot_protobuf_dot_empty__pb2.Empty.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def RemoveEnvironmentAlias(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/contentmanagement.ContentManagement/RemoveEnvironmentAlias',
+            contentmanagement_dot_contentmanagment__pb2.RemoveEnvironmentAliasRequest.SerializeToString,
+            google_dot_protobuf_dot_empty__pb2.Empty.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def CreateSpaceRole(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/contentmanagement.ContentManagement/CreateSpaceRole',
+            contentmanagement_dot_contentmanagment__pb2.CreateSpaceRoleRequest.SerializeToString,
+            google_dot_protobuf_dot_empty__pb2.Empty.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def UpdateSpaceRole(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/contentmanagement.ContentManagement/UpdateSpaceRole',
+            contentmanagement_dot_contentmanagment__pb2.UpdateSpaceRoleRequest.SerializeToString,
+            google_dot_protobuf_dot_empty__pb2.Empty.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def ListSpaceRoles(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/contentmanagement.ContentManagement/ListSpaceRoles',
+            contentmanagement_dot_contentmanagment__pb2.ListSpaceRolesRequest.SerializeToString,
+            contentmanagement_dot_contentmanagment__pb2.ListSpaceRolesResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def DeleteSpaceRole(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/contentmanagement.ContentManagement/DeleteSpaceRole',
+            contentmanagement_dot_contentmanagment__pb2.DeleteSpaceRoleRequest.SerializeToString,
+            google_dot_protobuf_dot_empty__pb2.Empty.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
diff --git a/perxis/environments/__init__.py b/perxis/environments/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/perxis/environments/environments_pb2.py b/perxis/environments/environments_pb2.py
new file mode 100644
index 0000000..9992fc9
--- /dev/null
+++ b/perxis/environments/environments_pb2.py
@@ -0,0 +1,698 @@
+# -*- coding: utf-8 -*-
+# Generated by the protocol buffer compiler.  DO NOT EDIT!
+# source: environments/environments.proto
+"""Generated protocol buffer code."""
+from google.protobuf import descriptor as _descriptor
+from google.protobuf import message as _message
+from google.protobuf import reflection as _reflection
+from google.protobuf import symbol_database as _symbol_database
+# @@protoc_insertion_point(imports)
+
+_sym_db = _symbol_database.Default()
+
+
+from google.protobuf import empty_pb2 as google_dot_protobuf_dot_empty__pb2
+
+
+DESCRIPTOR = _descriptor.FileDescriptor(
+  name='environments/environments.proto',
+  package='content.environments',
+  syntax='proto3',
+  serialized_options=b'Z:github.com/perxteam/perxis/proto/environments;environments',
+  create_key=_descriptor._internal_create_key,
+  serialized_pb=b'\n\x1f\x65nvironments/environments.proto\x12\x14\x63ontent.environments\x1a\x1bgoogle/protobuf/empty.proto\"\xb3\x01\n\x0b\x45nvironment\x12\n\n\x02id\x18\x01 \x01(\t\x12\x13\n\x0b\x64\x65scription\x18\x02 \x01(\t\x12\x36\n\x05state\x18\x03 \x01(\x0e\x32\'.content.environments.Environment.State\x12\x0f\n\x07\x61liases\x18\x05 \x03(\t\":\n\x05State\x12\x0b\n\x07UNKNOWN\x10\x00\x12\r\n\tPREPARING\x10\x01\x12\t\n\x05READY\x10\x02\x12\n\n\x06\x46\x41ILED\x10\x03\"W\n\rCreateRequest\x12\x10\n\x08space_id\x18\x01 \x01(\t\x12\x0f\n\x07\x62\x61se_id\x18\x02 \x01(\t\x12\x0e\n\x06\x65nv_id\x18\x03 \x01(\t\x12\x13\n\x0b\x64\x65scription\x18\x04 \x01(\t\"@\n\x0e\x43reateResponse\x12.\n\x03\x65nv\x18\x01 \x01(\x0b\x32!.content.environments.Environment\"\x1f\n\x0bListRequest\x12\x10\n\x08space_id\x18\x01 \x01(\t\"?\n\x0cListResponse\x12/\n\x04\x65nvs\x18\x01 \x03(\x0b\x32!.content.environments.Environment\".\n\nGetRequest\x12\x10\n\x08space_id\x18\x01 \x01(\t\x12\x0e\n\x06\x65nv_id\x18\x02 \x01(\t\"=\n\x0bGetResponse\x12.\n\x03\x65nv\x18\x01 \x01(\x0b\x32!.content.environments.Environment\"F\n\rUpdateRequest\x12\x10\n\x08space_id\x18\x01 \x01(\t\x12\x0e\n\x06\x65nv_id\x18\x02 \x01(\t\x12\x13\n\x0b\x64\x65scription\x18\x03 \x01(\t\"B\n\x0fSetAliasRequest\x12\x10\n\x08space_id\x18\x01 \x01(\t\x12\x0e\n\x06\x65nv_id\x18\x02 \x01(\t\x12\r\n\x05\x61lias\x18\x03 \x01(\t\"E\n\x12RemoveAliasRequest\x12\x10\n\x08space_id\x18\x01 \x01(\t\x12\x0e\n\x06\x65nv_id\x18\x02 \x01(\t\x12\r\n\x05\x61lias\x18\x03 \x01(\t\"1\n\rDeleteRequest\x12\x10\n\x08space_id\x18\x01 \x01(\t\x12\x0e\n\x06\x65nv_id\x18\x02 \x01(\t2\xb6\x04\n\x0c\x45nvironments\x12U\n\x06\x43reate\x12#.content.environments.CreateRequest\x1a$.content.environments.CreateResponse\"\x00\x12L\n\x03Get\x12 .content.environments.GetRequest\x1a!.content.environments.GetResponse\"\x00\x12O\n\x04List\x12!.content.environments.ListRequest\x1a\".content.environments.ListResponse\"\x00\x12G\n\x06Update\x12#.content.environments.UpdateRequest\x1a\x16.google.protobuf.Empty\"\x00\x12K\n\x08SetAlias\x12%.content.environments.SetAliasRequest\x1a\x16.google.protobuf.Empty\"\x00\x12Q\n\x0bRemoveAlias\x12(.content.environments.RemoveAliasRequest\x1a\x16.google.protobuf.Empty\"\x00\x12G\n\x06\x44\x65lete\x12#.content.environments.DeleteRequest\x1a\x16.google.protobuf.Empty\"\x00\x42<Z:github.com/perxteam/perxis/proto/environments;environmentsb\x06proto3'
+  ,
+  dependencies=[google_dot_protobuf_dot_empty__pb2.DESCRIPTOR,])
+
+
+
+_ENVIRONMENT_STATE = _descriptor.EnumDescriptor(
+  name='State',
+  full_name='content.environments.Environment.State',
+  filename=None,
+  file=DESCRIPTOR,
+  create_key=_descriptor._internal_create_key,
+  values=[
+    _descriptor.EnumValueDescriptor(
+      name='UNKNOWN', index=0, number=0,
+      serialized_options=None,
+      type=None,
+      create_key=_descriptor._internal_create_key),
+    _descriptor.EnumValueDescriptor(
+      name='PREPARING', index=1, number=1,
+      serialized_options=None,
+      type=None,
+      create_key=_descriptor._internal_create_key),
+    _descriptor.EnumValueDescriptor(
+      name='READY', index=2, number=2,
+      serialized_options=None,
+      type=None,
+      create_key=_descriptor._internal_create_key),
+    _descriptor.EnumValueDescriptor(
+      name='FAILED', index=3, number=3,
+      serialized_options=None,
+      type=None,
+      create_key=_descriptor._internal_create_key),
+  ],
+  containing_type=None,
+  serialized_options=None,
+  serialized_start=208,
+  serialized_end=266,
+)
+_sym_db.RegisterEnumDescriptor(_ENVIRONMENT_STATE)
+
+
+_ENVIRONMENT = _descriptor.Descriptor(
+  name='Environment',
+  full_name='content.environments.Environment',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='id', full_name='content.environments.Environment.id', index=0,
+      number=1, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='description', full_name='content.environments.Environment.description', index=1,
+      number=2, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='state', full_name='content.environments.Environment.state', index=2,
+      number=3, type=14, cpp_type=8, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='aliases', full_name='content.environments.Environment.aliases', index=3,
+      number=5, type=9, cpp_type=9, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+    _ENVIRONMENT_STATE,
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=87,
+  serialized_end=266,
+)
+
+
+_CREATEREQUEST = _descriptor.Descriptor(
+  name='CreateRequest',
+  full_name='content.environments.CreateRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='space_id', full_name='content.environments.CreateRequest.space_id', index=0,
+      number=1, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='base_id', full_name='content.environments.CreateRequest.base_id', index=1,
+      number=2, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='env_id', full_name='content.environments.CreateRequest.env_id', index=2,
+      number=3, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='description', full_name='content.environments.CreateRequest.description', index=3,
+      number=4, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=268,
+  serialized_end=355,
+)
+
+
+_CREATERESPONSE = _descriptor.Descriptor(
+  name='CreateResponse',
+  full_name='content.environments.CreateResponse',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='env', full_name='content.environments.CreateResponse.env', index=0,
+      number=1, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=357,
+  serialized_end=421,
+)
+
+
+_LISTREQUEST = _descriptor.Descriptor(
+  name='ListRequest',
+  full_name='content.environments.ListRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='space_id', full_name='content.environments.ListRequest.space_id', index=0,
+      number=1, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=423,
+  serialized_end=454,
+)
+
+
+_LISTRESPONSE = _descriptor.Descriptor(
+  name='ListResponse',
+  full_name='content.environments.ListResponse',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='envs', full_name='content.environments.ListResponse.envs', index=0,
+      number=1, type=11, cpp_type=10, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=456,
+  serialized_end=519,
+)
+
+
+_GETREQUEST = _descriptor.Descriptor(
+  name='GetRequest',
+  full_name='content.environments.GetRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='space_id', full_name='content.environments.GetRequest.space_id', index=0,
+      number=1, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='env_id', full_name='content.environments.GetRequest.env_id', index=1,
+      number=2, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=521,
+  serialized_end=567,
+)
+
+
+_GETRESPONSE = _descriptor.Descriptor(
+  name='GetResponse',
+  full_name='content.environments.GetResponse',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='env', full_name='content.environments.GetResponse.env', index=0,
+      number=1, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=569,
+  serialized_end=630,
+)
+
+
+_UPDATEREQUEST = _descriptor.Descriptor(
+  name='UpdateRequest',
+  full_name='content.environments.UpdateRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='space_id', full_name='content.environments.UpdateRequest.space_id', index=0,
+      number=1, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='env_id', full_name='content.environments.UpdateRequest.env_id', index=1,
+      number=2, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='description', full_name='content.environments.UpdateRequest.description', index=2,
+      number=3, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=632,
+  serialized_end=702,
+)
+
+
+_SETALIASREQUEST = _descriptor.Descriptor(
+  name='SetAliasRequest',
+  full_name='content.environments.SetAliasRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='space_id', full_name='content.environments.SetAliasRequest.space_id', index=0,
+      number=1, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='env_id', full_name='content.environments.SetAliasRequest.env_id', index=1,
+      number=2, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='alias', full_name='content.environments.SetAliasRequest.alias', index=2,
+      number=3, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=704,
+  serialized_end=770,
+)
+
+
+_REMOVEALIASREQUEST = _descriptor.Descriptor(
+  name='RemoveAliasRequest',
+  full_name='content.environments.RemoveAliasRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='space_id', full_name='content.environments.RemoveAliasRequest.space_id', index=0,
+      number=1, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='env_id', full_name='content.environments.RemoveAliasRequest.env_id', index=1,
+      number=2, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='alias', full_name='content.environments.RemoveAliasRequest.alias', index=2,
+      number=3, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=772,
+  serialized_end=841,
+)
+
+
+_DELETEREQUEST = _descriptor.Descriptor(
+  name='DeleteRequest',
+  full_name='content.environments.DeleteRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='space_id', full_name='content.environments.DeleteRequest.space_id', index=0,
+      number=1, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='env_id', full_name='content.environments.DeleteRequest.env_id', index=1,
+      number=2, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=843,
+  serialized_end=892,
+)
+
+_ENVIRONMENT.fields_by_name['state'].enum_type = _ENVIRONMENT_STATE
+_ENVIRONMENT_STATE.containing_type = _ENVIRONMENT
+_CREATERESPONSE.fields_by_name['env'].message_type = _ENVIRONMENT
+_LISTRESPONSE.fields_by_name['envs'].message_type = _ENVIRONMENT
+_GETRESPONSE.fields_by_name['env'].message_type = _ENVIRONMENT
+DESCRIPTOR.message_types_by_name['Environment'] = _ENVIRONMENT
+DESCRIPTOR.message_types_by_name['CreateRequest'] = _CREATEREQUEST
+DESCRIPTOR.message_types_by_name['CreateResponse'] = _CREATERESPONSE
+DESCRIPTOR.message_types_by_name['ListRequest'] = _LISTREQUEST
+DESCRIPTOR.message_types_by_name['ListResponse'] = _LISTRESPONSE
+DESCRIPTOR.message_types_by_name['GetRequest'] = _GETREQUEST
+DESCRIPTOR.message_types_by_name['GetResponse'] = _GETRESPONSE
+DESCRIPTOR.message_types_by_name['UpdateRequest'] = _UPDATEREQUEST
+DESCRIPTOR.message_types_by_name['SetAliasRequest'] = _SETALIASREQUEST
+DESCRIPTOR.message_types_by_name['RemoveAliasRequest'] = _REMOVEALIASREQUEST
+DESCRIPTOR.message_types_by_name['DeleteRequest'] = _DELETEREQUEST
+_sym_db.RegisterFileDescriptor(DESCRIPTOR)
+
+Environment = _reflection.GeneratedProtocolMessageType('Environment', (_message.Message,), {
+  'DESCRIPTOR' : _ENVIRONMENT,
+  '__module__' : 'environments.environments_pb2'
+  # @@protoc_insertion_point(class_scope:content.environments.Environment)
+  })
+_sym_db.RegisterMessage(Environment)
+
+CreateRequest = _reflection.GeneratedProtocolMessageType('CreateRequest', (_message.Message,), {
+  'DESCRIPTOR' : _CREATEREQUEST,
+  '__module__' : 'environments.environments_pb2'
+  # @@protoc_insertion_point(class_scope:content.environments.CreateRequest)
+  })
+_sym_db.RegisterMessage(CreateRequest)
+
+CreateResponse = _reflection.GeneratedProtocolMessageType('CreateResponse', (_message.Message,), {
+  'DESCRIPTOR' : _CREATERESPONSE,
+  '__module__' : 'environments.environments_pb2'
+  # @@protoc_insertion_point(class_scope:content.environments.CreateResponse)
+  })
+_sym_db.RegisterMessage(CreateResponse)
+
+ListRequest = _reflection.GeneratedProtocolMessageType('ListRequest', (_message.Message,), {
+  'DESCRIPTOR' : _LISTREQUEST,
+  '__module__' : 'environments.environments_pb2'
+  # @@protoc_insertion_point(class_scope:content.environments.ListRequest)
+  })
+_sym_db.RegisterMessage(ListRequest)
+
+ListResponse = _reflection.GeneratedProtocolMessageType('ListResponse', (_message.Message,), {
+  'DESCRIPTOR' : _LISTRESPONSE,
+  '__module__' : 'environments.environments_pb2'
+  # @@protoc_insertion_point(class_scope:content.environments.ListResponse)
+  })
+_sym_db.RegisterMessage(ListResponse)
+
+GetRequest = _reflection.GeneratedProtocolMessageType('GetRequest', (_message.Message,), {
+  'DESCRIPTOR' : _GETREQUEST,
+  '__module__' : 'environments.environments_pb2'
+  # @@protoc_insertion_point(class_scope:content.environments.GetRequest)
+  })
+_sym_db.RegisterMessage(GetRequest)
+
+GetResponse = _reflection.GeneratedProtocolMessageType('GetResponse', (_message.Message,), {
+  'DESCRIPTOR' : _GETRESPONSE,
+  '__module__' : 'environments.environments_pb2'
+  # @@protoc_insertion_point(class_scope:content.environments.GetResponse)
+  })
+_sym_db.RegisterMessage(GetResponse)
+
+UpdateRequest = _reflection.GeneratedProtocolMessageType('UpdateRequest', (_message.Message,), {
+  'DESCRIPTOR' : _UPDATEREQUEST,
+  '__module__' : 'environments.environments_pb2'
+  # @@protoc_insertion_point(class_scope:content.environments.UpdateRequest)
+  })
+_sym_db.RegisterMessage(UpdateRequest)
+
+SetAliasRequest = _reflection.GeneratedProtocolMessageType('SetAliasRequest', (_message.Message,), {
+  'DESCRIPTOR' : _SETALIASREQUEST,
+  '__module__' : 'environments.environments_pb2'
+  # @@protoc_insertion_point(class_scope:content.environments.SetAliasRequest)
+  })
+_sym_db.RegisterMessage(SetAliasRequest)
+
+RemoveAliasRequest = _reflection.GeneratedProtocolMessageType('RemoveAliasRequest', (_message.Message,), {
+  'DESCRIPTOR' : _REMOVEALIASREQUEST,
+  '__module__' : 'environments.environments_pb2'
+  # @@protoc_insertion_point(class_scope:content.environments.RemoveAliasRequest)
+  })
+_sym_db.RegisterMessage(RemoveAliasRequest)
+
+DeleteRequest = _reflection.GeneratedProtocolMessageType('DeleteRequest', (_message.Message,), {
+  'DESCRIPTOR' : _DELETEREQUEST,
+  '__module__' : 'environments.environments_pb2'
+  # @@protoc_insertion_point(class_scope:content.environments.DeleteRequest)
+  })
+_sym_db.RegisterMessage(DeleteRequest)
+
+
+DESCRIPTOR._options = None
+
+_ENVIRONMENTS = _descriptor.ServiceDescriptor(
+  name='Environments',
+  full_name='content.environments.Environments',
+  file=DESCRIPTOR,
+  index=0,
+  serialized_options=None,
+  create_key=_descriptor._internal_create_key,
+  serialized_start=895,
+  serialized_end=1461,
+  methods=[
+  _descriptor.MethodDescriptor(
+    name='Create',
+    full_name='content.environments.Environments.Create',
+    index=0,
+    containing_service=None,
+    input_type=_CREATEREQUEST,
+    output_type=_CREATERESPONSE,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='Get',
+    full_name='content.environments.Environments.Get',
+    index=1,
+    containing_service=None,
+    input_type=_GETREQUEST,
+    output_type=_GETRESPONSE,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='List',
+    full_name='content.environments.Environments.List',
+    index=2,
+    containing_service=None,
+    input_type=_LISTREQUEST,
+    output_type=_LISTRESPONSE,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='Update',
+    full_name='content.environments.Environments.Update',
+    index=3,
+    containing_service=None,
+    input_type=_UPDATEREQUEST,
+    output_type=google_dot_protobuf_dot_empty__pb2._EMPTY,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='SetAlias',
+    full_name='content.environments.Environments.SetAlias',
+    index=4,
+    containing_service=None,
+    input_type=_SETALIASREQUEST,
+    output_type=google_dot_protobuf_dot_empty__pb2._EMPTY,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='RemoveAlias',
+    full_name='content.environments.Environments.RemoveAlias',
+    index=5,
+    containing_service=None,
+    input_type=_REMOVEALIASREQUEST,
+    output_type=google_dot_protobuf_dot_empty__pb2._EMPTY,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='Delete',
+    full_name='content.environments.Environments.Delete',
+    index=6,
+    containing_service=None,
+    input_type=_DELETEREQUEST,
+    output_type=google_dot_protobuf_dot_empty__pb2._EMPTY,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+])
+_sym_db.RegisterServiceDescriptor(_ENVIRONMENTS)
+
+DESCRIPTOR.services_by_name['Environments'] = _ENVIRONMENTS
+
+# @@protoc_insertion_point(module_scope)
diff --git a/perxis/environments/environments_pb2_grpc.py b/perxis/environments/environments_pb2_grpc.py
new file mode 100644
index 0000000..0799457
--- /dev/null
+++ b/perxis/environments/environments_pb2_grpc.py
@@ -0,0 +1,265 @@
+# Generated by the gRPC Python protocol compiler plugin. DO NOT EDIT!
+"""Client and server classes corresponding to protobuf-defined services."""
+import grpc
+
+from environments import environments_pb2 as environments_dot_environments__pb2
+from google.protobuf import empty_pb2 as google_dot_protobuf_dot_empty__pb2
+
+
+class EnvironmentsStub(object):
+    """Missing associated documentation comment in .proto file."""
+
+    def __init__(self, channel):
+        """Constructor.
+
+        Args:
+            channel: A grpc.Channel.
+        """
+        self.Create = channel.unary_unary(
+                '/content.environments.Environments/Create',
+                request_serializer=environments_dot_environments__pb2.CreateRequest.SerializeToString,
+                response_deserializer=environments_dot_environments__pb2.CreateResponse.FromString,
+                )
+        self.Get = channel.unary_unary(
+                '/content.environments.Environments/Get',
+                request_serializer=environments_dot_environments__pb2.GetRequest.SerializeToString,
+                response_deserializer=environments_dot_environments__pb2.GetResponse.FromString,
+                )
+        self.List = channel.unary_unary(
+                '/content.environments.Environments/List',
+                request_serializer=environments_dot_environments__pb2.ListRequest.SerializeToString,
+                response_deserializer=environments_dot_environments__pb2.ListResponse.FromString,
+                )
+        self.Update = channel.unary_unary(
+                '/content.environments.Environments/Update',
+                request_serializer=environments_dot_environments__pb2.UpdateRequest.SerializeToString,
+                response_deserializer=google_dot_protobuf_dot_empty__pb2.Empty.FromString,
+                )
+        self.SetAlias = channel.unary_unary(
+                '/content.environments.Environments/SetAlias',
+                request_serializer=environments_dot_environments__pb2.SetAliasRequest.SerializeToString,
+                response_deserializer=google_dot_protobuf_dot_empty__pb2.Empty.FromString,
+                )
+        self.RemoveAlias = channel.unary_unary(
+                '/content.environments.Environments/RemoveAlias',
+                request_serializer=environments_dot_environments__pb2.RemoveAliasRequest.SerializeToString,
+                response_deserializer=google_dot_protobuf_dot_empty__pb2.Empty.FromString,
+                )
+        self.Delete = channel.unary_unary(
+                '/content.environments.Environments/Delete',
+                request_serializer=environments_dot_environments__pb2.DeleteRequest.SerializeToString,
+                response_deserializer=google_dot_protobuf_dot_empty__pb2.Empty.FromString,
+                )
+
+
+class EnvironmentsServicer(object):
+    """Missing associated documentation comment in .proto file."""
+
+    def Create(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        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."""
+        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."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def Update(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def SetAlias(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def RemoveAlias(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        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."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+
+def add_EnvironmentsServicer_to_server(servicer, server):
+    rpc_method_handlers = {
+            'Create': grpc.unary_unary_rpc_method_handler(
+                    servicer.Create,
+                    request_deserializer=environments_dot_environments__pb2.CreateRequest.FromString,
+                    response_serializer=environments_dot_environments__pb2.CreateResponse.SerializeToString,
+            ),
+            'Get': grpc.unary_unary_rpc_method_handler(
+                    servicer.Get,
+                    request_deserializer=environments_dot_environments__pb2.GetRequest.FromString,
+                    response_serializer=environments_dot_environments__pb2.GetResponse.SerializeToString,
+            ),
+            'List': grpc.unary_unary_rpc_method_handler(
+                    servicer.List,
+                    request_deserializer=environments_dot_environments__pb2.ListRequest.FromString,
+                    response_serializer=environments_dot_environments__pb2.ListResponse.SerializeToString,
+            ),
+            'Update': grpc.unary_unary_rpc_method_handler(
+                    servicer.Update,
+                    request_deserializer=environments_dot_environments__pb2.UpdateRequest.FromString,
+                    response_serializer=google_dot_protobuf_dot_empty__pb2.Empty.SerializeToString,
+            ),
+            'SetAlias': grpc.unary_unary_rpc_method_handler(
+                    servicer.SetAlias,
+                    request_deserializer=environments_dot_environments__pb2.SetAliasRequest.FromString,
+                    response_serializer=google_dot_protobuf_dot_empty__pb2.Empty.SerializeToString,
+            ),
+            'RemoveAlias': grpc.unary_unary_rpc_method_handler(
+                    servicer.RemoveAlias,
+                    request_deserializer=environments_dot_environments__pb2.RemoveAliasRequest.FromString,
+                    response_serializer=google_dot_protobuf_dot_empty__pb2.Empty.SerializeToString,
+            ),
+            'Delete': grpc.unary_unary_rpc_method_handler(
+                    servicer.Delete,
+                    request_deserializer=environments_dot_environments__pb2.DeleteRequest.FromString,
+                    response_serializer=google_dot_protobuf_dot_empty__pb2.Empty.SerializeToString,
+            ),
+    }
+    generic_handler = grpc.method_handlers_generic_handler(
+            'content.environments.Environments', rpc_method_handlers)
+    server.add_generic_rpc_handlers((generic_handler,))
+
+
+ # This class is part of an EXPERIMENTAL API.
+class Environments(object):
+    """Missing associated documentation comment in .proto file."""
+
+    @staticmethod
+    def Create(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/content.environments.Environments/Create',
+            environments_dot_environments__pb2.CreateRequest.SerializeToString,
+            environments_dot_environments__pb2.CreateResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def Get(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/content.environments.Environments/Get',
+            environments_dot_environments__pb2.GetRequest.SerializeToString,
+            environments_dot_environments__pb2.GetResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def List(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/content.environments.Environments/List',
+            environments_dot_environments__pb2.ListRequest.SerializeToString,
+            environments_dot_environments__pb2.ListResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def Update(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/content.environments.Environments/Update',
+            environments_dot_environments__pb2.UpdateRequest.SerializeToString,
+            google_dot_protobuf_dot_empty__pb2.Empty.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def SetAlias(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/content.environments.Environments/SetAlias',
+            environments_dot_environments__pb2.SetAliasRequest.SerializeToString,
+            google_dot_protobuf_dot_empty__pb2.Empty.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def RemoveAlias(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/content.environments.Environments/RemoveAlias',
+            environments_dot_environments__pb2.RemoveAliasRequest.SerializeToString,
+            google_dot_protobuf_dot_empty__pb2.Empty.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def Delete(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/content.environments.Environments/Delete',
+            environments_dot_environments__pb2.DeleteRequest.SerializeToString,
+            google_dot_protobuf_dot_empty__pb2.Empty.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
diff --git a/perxis/file/__init__.py b/perxis/file/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/perxis/file/file_pb2.py b/perxis/file/file_pb2.py
new file mode 100644
index 0000000..4ff246a
--- /dev/null
+++ b/perxis/file/file_pb2.py
@@ -0,0 +1,702 @@
+# -*- coding: utf-8 -*-
+# Generated by the protocol buffer compiler.  DO NOT EDIT!
+# source: file/file.proto
+"""Generated protocol buffer code."""
+from google.protobuf import descriptor as _descriptor
+from google.protobuf import message as _message
+from google.protobuf import reflection as _reflection
+from google.protobuf import symbol_database as _symbol_database
+# @@protoc_insertion_point(imports)
+
+_sym_db = _symbol_database.Default()
+
+
+from google.protobuf import empty_pb2 as google_dot_protobuf_dot_empty__pb2
+from common import common_pb2 as common_dot_common__pb2
+
+
+DESCRIPTOR = _descriptor.FileDescriptor(
+  name='file/file.proto',
+  package='file',
+  syntax='proto3',
+  serialized_options=b'Z*github.com/perxteam/perxis/proto/file;file',
+  create_key=_descriptor._internal_create_key,
+  serialized_pb=b'\n\x0f\x66ile/file.proto\x12\x04\x66ile\x1a\x1bgoogle/protobuf/empty.proto\x1a\x13\x63ommon/common.proto\"\x81\x01\n\x06Upload\x12\x1a\n\x04\x66ile\x18\x01 \x01(\x0b\x32\x0c.common.File\x12\x11\n\tupload_id\x18\x02 \x01(\t\x12\x11\n\tpart_size\x18\x03 \x01(\x05\x12\x11\n\tpart_urls\x18\x04 \x03(\t\x12\"\n\x05parts\x18\x05 \x03(\x0b\x32\x13.file.CompletedPart\"+\n\rCompletedPart\x12\x0e\n\x06number\x18\x01 \x01(\x05\x12\n\n\x02id\x18\x02 \x01(\t\"2\n\x12StartUploadRequest\x12\x1c\n\x06upload\x18\x01 \x01(\x0b\x32\x0c.file.Upload\"3\n\x13StartUploadResponse\x12\x1c\n\x06upload\x18\x01 \x01(\x0b\x32\x0c.file.Upload\"5\n\x15\x43ompleteUploadRequest\x12\x1c\n\x06upload\x18\x01 \x01(\x0b\x32\x0c.file.Upload\"6\n\x16\x43ompleteUploadResponse\x12\x1c\n\x06upload\x18\x01 \x01(\x0b\x32\x0c.file.Upload\"2\n\x12\x41\x62ortUploadRequest\x12\x1c\n\x06upload\x18\x01 \x01(\x0b\x32\x0c.file.Upload\"\x15\n\x13\x41\x62ortUploadResponse\"1\n\x11MoveUploadRequest\x12\x1c\n\x06upload\x18\x01 \x01(\x0b\x32\x0c.file.Upload\"0\n\x12MoveUploadResponse\x12\x1a\n\x04\x66ile\x18\x01 \x01(\x0b\x32\x0c.common.File\"\x1c\n\x0eGetFileRequest\x12\n\n\x02id\x18\x01 \x01(\t\"-\n\x0fGetFileResponse\x12\x1a\n\x04\x66ile\x18\x01 \x01(\x0b\x32\x0c.common.File\"/\n\x11\x44\x65leteFileRequest\x12\x1a\n\x04\x66ile\x18\x01 \x01(\x0b\x32\x0c.common.File\"\x14\n\x12\x44\x65leteFileResponse2\xa3\x03\n\x0b\x46ileService\x12\x44\n\x0bStartUpload\x12\x18.file.StartUploadRequest\x1a\x19.file.StartUploadResponse\"\x00\x12M\n\x0e\x43ompleteUpload\x12\x1b.file.CompleteUploadRequest\x1a\x1c.file.CompleteUploadResponse\"\x00\x12\x41\n\x0b\x41\x62ortUpload\x12\x18.file.AbortUploadRequest\x1a\x16.google.protobuf.Empty\"\x00\x12\x41\n\nMoveUpload\x12\x17.file.MoveUploadRequest\x1a\x18.file.MoveUploadResponse\"\x00\x12\x38\n\x07GetFile\x12\x14.file.GetFileRequest\x1a\x15.file.GetFileResponse\"\x00\x12?\n\nDeleteFile\x12\x17.file.DeleteFileRequest\x1a\x16.google.protobuf.Empty\"\x00\x42,Z*github.com/perxteam/perxis/proto/file;fileb\x06proto3'
+  ,
+  dependencies=[google_dot_protobuf_dot_empty__pb2.DESCRIPTOR,common_dot_common__pb2.DESCRIPTOR,])
+
+
+
+
+_UPLOAD = _descriptor.Descriptor(
+  name='Upload',
+  full_name='file.Upload',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='file', full_name='file.Upload.file', index=0,
+      number=1, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='upload_id', full_name='file.Upload.upload_id', index=1,
+      number=2, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='part_size', full_name='file.Upload.part_size', index=2,
+      number=3, type=5, cpp_type=1, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='part_urls', full_name='file.Upload.part_urls', index=3,
+      number=4, type=9, cpp_type=9, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='parts', full_name='file.Upload.parts', index=4,
+      number=5, type=11, cpp_type=10, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=76,
+  serialized_end=205,
+)
+
+
+_COMPLETEDPART = _descriptor.Descriptor(
+  name='CompletedPart',
+  full_name='file.CompletedPart',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='number', full_name='file.CompletedPart.number', index=0,
+      number=1, type=5, cpp_type=1, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='id', full_name='file.CompletedPart.id', index=1,
+      number=2, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=207,
+  serialized_end=250,
+)
+
+
+_STARTUPLOADREQUEST = _descriptor.Descriptor(
+  name='StartUploadRequest',
+  full_name='file.StartUploadRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='upload', full_name='file.StartUploadRequest.upload', index=0,
+      number=1, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=252,
+  serialized_end=302,
+)
+
+
+_STARTUPLOADRESPONSE = _descriptor.Descriptor(
+  name='StartUploadResponse',
+  full_name='file.StartUploadResponse',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='upload', full_name='file.StartUploadResponse.upload', index=0,
+      number=1, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=304,
+  serialized_end=355,
+)
+
+
+_COMPLETEUPLOADREQUEST = _descriptor.Descriptor(
+  name='CompleteUploadRequest',
+  full_name='file.CompleteUploadRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='upload', full_name='file.CompleteUploadRequest.upload', index=0,
+      number=1, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=357,
+  serialized_end=410,
+)
+
+
+_COMPLETEUPLOADRESPONSE = _descriptor.Descriptor(
+  name='CompleteUploadResponse',
+  full_name='file.CompleteUploadResponse',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='upload', full_name='file.CompleteUploadResponse.upload', index=0,
+      number=1, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=412,
+  serialized_end=466,
+)
+
+
+_ABORTUPLOADREQUEST = _descriptor.Descriptor(
+  name='AbortUploadRequest',
+  full_name='file.AbortUploadRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='upload', full_name='file.AbortUploadRequest.upload', index=0,
+      number=1, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=468,
+  serialized_end=518,
+)
+
+
+_ABORTUPLOADRESPONSE = _descriptor.Descriptor(
+  name='AbortUploadResponse',
+  full_name='file.AbortUploadResponse',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=520,
+  serialized_end=541,
+)
+
+
+_MOVEUPLOADREQUEST = _descriptor.Descriptor(
+  name='MoveUploadRequest',
+  full_name='file.MoveUploadRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='upload', full_name='file.MoveUploadRequest.upload', index=0,
+      number=1, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=543,
+  serialized_end=592,
+)
+
+
+_MOVEUPLOADRESPONSE = _descriptor.Descriptor(
+  name='MoveUploadResponse',
+  full_name='file.MoveUploadResponse',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='file', full_name='file.MoveUploadResponse.file', index=0,
+      number=1, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=594,
+  serialized_end=642,
+)
+
+
+_GETFILEREQUEST = _descriptor.Descriptor(
+  name='GetFileRequest',
+  full_name='file.GetFileRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='id', full_name='file.GetFileRequest.id', index=0,
+      number=1, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=644,
+  serialized_end=672,
+)
+
+
+_GETFILERESPONSE = _descriptor.Descriptor(
+  name='GetFileResponse',
+  full_name='file.GetFileResponse',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='file', full_name='file.GetFileResponse.file', index=0,
+      number=1, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=674,
+  serialized_end=719,
+)
+
+
+_DELETEFILEREQUEST = _descriptor.Descriptor(
+  name='DeleteFileRequest',
+  full_name='file.DeleteFileRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='file', full_name='file.DeleteFileRequest.file', index=0,
+      number=1, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=721,
+  serialized_end=768,
+)
+
+
+_DELETEFILERESPONSE = _descriptor.Descriptor(
+  name='DeleteFileResponse',
+  full_name='file.DeleteFileResponse',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=770,
+  serialized_end=790,
+)
+
+_UPLOAD.fields_by_name['file'].message_type = common_dot_common__pb2._FILE
+_UPLOAD.fields_by_name['parts'].message_type = _COMPLETEDPART
+_STARTUPLOADREQUEST.fields_by_name['upload'].message_type = _UPLOAD
+_STARTUPLOADRESPONSE.fields_by_name['upload'].message_type = _UPLOAD
+_COMPLETEUPLOADREQUEST.fields_by_name['upload'].message_type = _UPLOAD
+_COMPLETEUPLOADRESPONSE.fields_by_name['upload'].message_type = _UPLOAD
+_ABORTUPLOADREQUEST.fields_by_name['upload'].message_type = _UPLOAD
+_MOVEUPLOADREQUEST.fields_by_name['upload'].message_type = _UPLOAD
+_MOVEUPLOADRESPONSE.fields_by_name['file'].message_type = common_dot_common__pb2._FILE
+_GETFILERESPONSE.fields_by_name['file'].message_type = common_dot_common__pb2._FILE
+_DELETEFILEREQUEST.fields_by_name['file'].message_type = common_dot_common__pb2._FILE
+DESCRIPTOR.message_types_by_name['Upload'] = _UPLOAD
+DESCRIPTOR.message_types_by_name['CompletedPart'] = _COMPLETEDPART
+DESCRIPTOR.message_types_by_name['StartUploadRequest'] = _STARTUPLOADREQUEST
+DESCRIPTOR.message_types_by_name['StartUploadResponse'] = _STARTUPLOADRESPONSE
+DESCRIPTOR.message_types_by_name['CompleteUploadRequest'] = _COMPLETEUPLOADREQUEST
+DESCRIPTOR.message_types_by_name['CompleteUploadResponse'] = _COMPLETEUPLOADRESPONSE
+DESCRIPTOR.message_types_by_name['AbortUploadRequest'] = _ABORTUPLOADREQUEST
+DESCRIPTOR.message_types_by_name['AbortUploadResponse'] = _ABORTUPLOADRESPONSE
+DESCRIPTOR.message_types_by_name['MoveUploadRequest'] = _MOVEUPLOADREQUEST
+DESCRIPTOR.message_types_by_name['MoveUploadResponse'] = _MOVEUPLOADRESPONSE
+DESCRIPTOR.message_types_by_name['GetFileRequest'] = _GETFILEREQUEST
+DESCRIPTOR.message_types_by_name['GetFileResponse'] = _GETFILERESPONSE
+DESCRIPTOR.message_types_by_name['DeleteFileRequest'] = _DELETEFILEREQUEST
+DESCRIPTOR.message_types_by_name['DeleteFileResponse'] = _DELETEFILERESPONSE
+_sym_db.RegisterFileDescriptor(DESCRIPTOR)
+
+Upload = _reflection.GeneratedProtocolMessageType('Upload', (_message.Message,), {
+  'DESCRIPTOR' : _UPLOAD,
+  '__module__' : 'file.file_pb2'
+  # @@protoc_insertion_point(class_scope:file.Upload)
+  })
+_sym_db.RegisterMessage(Upload)
+
+CompletedPart = _reflection.GeneratedProtocolMessageType('CompletedPart', (_message.Message,), {
+  'DESCRIPTOR' : _COMPLETEDPART,
+  '__module__' : 'file.file_pb2'
+  # @@protoc_insertion_point(class_scope:file.CompletedPart)
+  })
+_sym_db.RegisterMessage(CompletedPart)
+
+StartUploadRequest = _reflection.GeneratedProtocolMessageType('StartUploadRequest', (_message.Message,), {
+  'DESCRIPTOR' : _STARTUPLOADREQUEST,
+  '__module__' : 'file.file_pb2'
+  # @@protoc_insertion_point(class_scope:file.StartUploadRequest)
+  })
+_sym_db.RegisterMessage(StartUploadRequest)
+
+StartUploadResponse = _reflection.GeneratedProtocolMessageType('StartUploadResponse', (_message.Message,), {
+  'DESCRIPTOR' : _STARTUPLOADRESPONSE,
+  '__module__' : 'file.file_pb2'
+  # @@protoc_insertion_point(class_scope:file.StartUploadResponse)
+  })
+_sym_db.RegisterMessage(StartUploadResponse)
+
+CompleteUploadRequest = _reflection.GeneratedProtocolMessageType('CompleteUploadRequest', (_message.Message,), {
+  'DESCRIPTOR' : _COMPLETEUPLOADREQUEST,
+  '__module__' : 'file.file_pb2'
+  # @@protoc_insertion_point(class_scope:file.CompleteUploadRequest)
+  })
+_sym_db.RegisterMessage(CompleteUploadRequest)
+
+CompleteUploadResponse = _reflection.GeneratedProtocolMessageType('CompleteUploadResponse', (_message.Message,), {
+  'DESCRIPTOR' : _COMPLETEUPLOADRESPONSE,
+  '__module__' : 'file.file_pb2'
+  # @@protoc_insertion_point(class_scope:file.CompleteUploadResponse)
+  })
+_sym_db.RegisterMessage(CompleteUploadResponse)
+
+AbortUploadRequest = _reflection.GeneratedProtocolMessageType('AbortUploadRequest', (_message.Message,), {
+  'DESCRIPTOR' : _ABORTUPLOADREQUEST,
+  '__module__' : 'file.file_pb2'
+  # @@protoc_insertion_point(class_scope:file.AbortUploadRequest)
+  })
+_sym_db.RegisterMessage(AbortUploadRequest)
+
+AbortUploadResponse = _reflection.GeneratedProtocolMessageType('AbortUploadResponse', (_message.Message,), {
+  'DESCRIPTOR' : _ABORTUPLOADRESPONSE,
+  '__module__' : 'file.file_pb2'
+  # @@protoc_insertion_point(class_scope:file.AbortUploadResponse)
+  })
+_sym_db.RegisterMessage(AbortUploadResponse)
+
+MoveUploadRequest = _reflection.GeneratedProtocolMessageType('MoveUploadRequest', (_message.Message,), {
+  'DESCRIPTOR' : _MOVEUPLOADREQUEST,
+  '__module__' : 'file.file_pb2'
+  # @@protoc_insertion_point(class_scope:file.MoveUploadRequest)
+  })
+_sym_db.RegisterMessage(MoveUploadRequest)
+
+MoveUploadResponse = _reflection.GeneratedProtocolMessageType('MoveUploadResponse', (_message.Message,), {
+  'DESCRIPTOR' : _MOVEUPLOADRESPONSE,
+  '__module__' : 'file.file_pb2'
+  # @@protoc_insertion_point(class_scope:file.MoveUploadResponse)
+  })
+_sym_db.RegisterMessage(MoveUploadResponse)
+
+GetFileRequest = _reflection.GeneratedProtocolMessageType('GetFileRequest', (_message.Message,), {
+  'DESCRIPTOR' : _GETFILEREQUEST,
+  '__module__' : 'file.file_pb2'
+  # @@protoc_insertion_point(class_scope:file.GetFileRequest)
+  })
+_sym_db.RegisterMessage(GetFileRequest)
+
+GetFileResponse = _reflection.GeneratedProtocolMessageType('GetFileResponse', (_message.Message,), {
+  'DESCRIPTOR' : _GETFILERESPONSE,
+  '__module__' : 'file.file_pb2'
+  # @@protoc_insertion_point(class_scope:file.GetFileResponse)
+  })
+_sym_db.RegisterMessage(GetFileResponse)
+
+DeleteFileRequest = _reflection.GeneratedProtocolMessageType('DeleteFileRequest', (_message.Message,), {
+  'DESCRIPTOR' : _DELETEFILEREQUEST,
+  '__module__' : 'file.file_pb2'
+  # @@protoc_insertion_point(class_scope:file.DeleteFileRequest)
+  })
+_sym_db.RegisterMessage(DeleteFileRequest)
+
+DeleteFileResponse = _reflection.GeneratedProtocolMessageType('DeleteFileResponse', (_message.Message,), {
+  'DESCRIPTOR' : _DELETEFILERESPONSE,
+  '__module__' : 'file.file_pb2'
+  # @@protoc_insertion_point(class_scope:file.DeleteFileResponse)
+  })
+_sym_db.RegisterMessage(DeleteFileResponse)
+
+
+DESCRIPTOR._options = None
+
+_FILESERVICE = _descriptor.ServiceDescriptor(
+  name='FileService',
+  full_name='file.FileService',
+  file=DESCRIPTOR,
+  index=0,
+  serialized_options=None,
+  create_key=_descriptor._internal_create_key,
+  serialized_start=793,
+  serialized_end=1212,
+  methods=[
+  _descriptor.MethodDescriptor(
+    name='StartUpload',
+    full_name='file.FileService.StartUpload',
+    index=0,
+    containing_service=None,
+    input_type=_STARTUPLOADREQUEST,
+    output_type=_STARTUPLOADRESPONSE,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='CompleteUpload',
+    full_name='file.FileService.CompleteUpload',
+    index=1,
+    containing_service=None,
+    input_type=_COMPLETEUPLOADREQUEST,
+    output_type=_COMPLETEUPLOADRESPONSE,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='AbortUpload',
+    full_name='file.FileService.AbortUpload',
+    index=2,
+    containing_service=None,
+    input_type=_ABORTUPLOADREQUEST,
+    output_type=google_dot_protobuf_dot_empty__pb2._EMPTY,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='MoveUpload',
+    full_name='file.FileService.MoveUpload',
+    index=3,
+    containing_service=None,
+    input_type=_MOVEUPLOADREQUEST,
+    output_type=_MOVEUPLOADRESPONSE,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='GetFile',
+    full_name='file.FileService.GetFile',
+    index=4,
+    containing_service=None,
+    input_type=_GETFILEREQUEST,
+    output_type=_GETFILERESPONSE,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='DeleteFile',
+    full_name='file.FileService.DeleteFile',
+    index=5,
+    containing_service=None,
+    input_type=_DELETEFILEREQUEST,
+    output_type=google_dot_protobuf_dot_empty__pb2._EMPTY,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+])
+_sym_db.RegisterServiceDescriptor(_FILESERVICE)
+
+DESCRIPTOR.services_by_name['FileService'] = _FILESERVICE
+
+# @@protoc_insertion_point(module_scope)
diff --git a/perxis/file/file_pb2_grpc.py b/perxis/file/file_pb2_grpc.py
new file mode 100644
index 0000000..d8df23b
--- /dev/null
+++ b/perxis/file/file_pb2_grpc.py
@@ -0,0 +1,245 @@
+# Generated by the gRPC Python protocol compiler plugin. DO NOT EDIT!
+"""Client and server classes corresponding to protobuf-defined services."""
+import grpc
+
+from file import file_pb2 as file_dot_file__pb2
+from google.protobuf import empty_pb2 as google_dot_protobuf_dot_empty__pb2
+
+
+class FileServiceStub(object):
+    """Missing associated documentation comment in .proto file."""
+
+    def __init__(self, channel):
+        """Constructor.
+
+        Args:
+            channel: A grpc.Channel.
+        """
+        self.StartUpload = channel.unary_unary(
+                '/file.FileService/StartUpload',
+                request_serializer=file_dot_file__pb2.StartUploadRequest.SerializeToString,
+                response_deserializer=file_dot_file__pb2.StartUploadResponse.FromString,
+                )
+        self.CompleteUpload = channel.unary_unary(
+                '/file.FileService/CompleteUpload',
+                request_serializer=file_dot_file__pb2.CompleteUploadRequest.SerializeToString,
+                response_deserializer=file_dot_file__pb2.CompleteUploadResponse.FromString,
+                )
+        self.AbortUpload = channel.unary_unary(
+                '/file.FileService/AbortUpload',
+                request_serializer=file_dot_file__pb2.AbortUploadRequest.SerializeToString,
+                response_deserializer=google_dot_protobuf_dot_empty__pb2.Empty.FromString,
+                )
+        self.MoveUpload = channel.unary_unary(
+                '/file.FileService/MoveUpload',
+                request_serializer=file_dot_file__pb2.MoveUploadRequest.SerializeToString,
+                response_deserializer=file_dot_file__pb2.MoveUploadResponse.FromString,
+                )
+        self.GetFile = channel.unary_unary(
+                '/file.FileService/GetFile',
+                request_serializer=file_dot_file__pb2.GetFileRequest.SerializeToString,
+                response_deserializer=file_dot_file__pb2.GetFileResponse.FromString,
+                )
+        self.DeleteFile = channel.unary_unary(
+                '/file.FileService/DeleteFile',
+                request_serializer=file_dot_file__pb2.DeleteFileRequest.SerializeToString,
+                response_deserializer=google_dot_protobuf_dot_empty__pb2.Empty.FromString,
+                )
+
+
+class FileServiceServicer(object):
+    """Missing associated documentation comment in .proto file."""
+
+    def StartUpload(self, request, context):
+        """StartUpload - инициирует процедуру загрузки файла в файловое хранилище.
+        Используется клиентским приложением для начала загрузки файла
+        """
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def CompleteUpload(self, request, context):
+        """CompleteUpload - завершает процедуру загрузку файла
+        """
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def AbortUpload(self, request, context):
+        """AbortUpload - прерывает процедуру загрузки файла, все загруженные части файла удаляются их хранилища
+        """
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def MoveUpload(self, request, context):
+        """MoveUpload - перемещает загруженный файл из временного расположения в постоянное месторасположения.
+        После перемещение загрузки хранилище выдает новый идентификатор постоянного файла
+        """
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def GetFile(self, request, context):
+        """GetFile - получить информацию о файле (ссылку) по ID
+        """
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def DeleteFile(self, request, context):
+        """DeleteFile - удаляет файл. Если происходит удаление оригинала,
+        удаляются и все связанные структуры
+        Возможны следующие ситуации:
+        - Удаление оригинального файла. Удаляется файл и все связанные с ним файлы.
+        - Удаление связанного файла. Для удаления конкретного файла передается 'ID', 'Type' и 'Name'
+        - Удаления связанных файлов конкретного типа (например, все 'thumbnails'). Передается 'ID' и 'Type'
+        """
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+
+def add_FileServiceServicer_to_server(servicer, server):
+    rpc_method_handlers = {
+            'StartUpload': grpc.unary_unary_rpc_method_handler(
+                    servicer.StartUpload,
+                    request_deserializer=file_dot_file__pb2.StartUploadRequest.FromString,
+                    response_serializer=file_dot_file__pb2.StartUploadResponse.SerializeToString,
+            ),
+            'CompleteUpload': grpc.unary_unary_rpc_method_handler(
+                    servicer.CompleteUpload,
+                    request_deserializer=file_dot_file__pb2.CompleteUploadRequest.FromString,
+                    response_serializer=file_dot_file__pb2.CompleteUploadResponse.SerializeToString,
+            ),
+            'AbortUpload': grpc.unary_unary_rpc_method_handler(
+                    servicer.AbortUpload,
+                    request_deserializer=file_dot_file__pb2.AbortUploadRequest.FromString,
+                    response_serializer=google_dot_protobuf_dot_empty__pb2.Empty.SerializeToString,
+            ),
+            'MoveUpload': grpc.unary_unary_rpc_method_handler(
+                    servicer.MoveUpload,
+                    request_deserializer=file_dot_file__pb2.MoveUploadRequest.FromString,
+                    response_serializer=file_dot_file__pb2.MoveUploadResponse.SerializeToString,
+            ),
+            'GetFile': grpc.unary_unary_rpc_method_handler(
+                    servicer.GetFile,
+                    request_deserializer=file_dot_file__pb2.GetFileRequest.FromString,
+                    response_serializer=file_dot_file__pb2.GetFileResponse.SerializeToString,
+            ),
+            'DeleteFile': grpc.unary_unary_rpc_method_handler(
+                    servicer.DeleteFile,
+                    request_deserializer=file_dot_file__pb2.DeleteFileRequest.FromString,
+                    response_serializer=google_dot_protobuf_dot_empty__pb2.Empty.SerializeToString,
+            ),
+    }
+    generic_handler = grpc.method_handlers_generic_handler(
+            'file.FileService', rpc_method_handlers)
+    server.add_generic_rpc_handlers((generic_handler,))
+
+
+ # This class is part of an EXPERIMENTAL API.
+class FileService(object):
+    """Missing associated documentation comment in .proto file."""
+
+    @staticmethod
+    def StartUpload(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/file.FileService/StartUpload',
+            file_dot_file__pb2.StartUploadRequest.SerializeToString,
+            file_dot_file__pb2.StartUploadResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def CompleteUpload(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/file.FileService/CompleteUpload',
+            file_dot_file__pb2.CompleteUploadRequest.SerializeToString,
+            file_dot_file__pb2.CompleteUploadResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def AbortUpload(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/file.FileService/AbortUpload',
+            file_dot_file__pb2.AbortUploadRequest.SerializeToString,
+            google_dot_protobuf_dot_empty__pb2.Empty.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def MoveUpload(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/file.FileService/MoveUpload',
+            file_dot_file__pb2.MoveUploadRequest.SerializeToString,
+            file_dot_file__pb2.MoveUploadResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def GetFile(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/file.FileService/GetFile',
+            file_dot_file__pb2.GetFileRequest.SerializeToString,
+            file_dot_file__pb2.GetFileResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def DeleteFile(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/file.FileService/DeleteFile',
+            file_dot_file__pb2.DeleteFileRequest.SerializeToString,
+            google_dot_protobuf_dot_empty__pb2.Empty.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
diff --git a/perxis/invitations/__init__.py b/perxis/invitations/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/perxis/invitations/invitations_pb2.py b/perxis/invitations/invitations_pb2.py
new file mode 100644
index 0000000..f7e4e0b
--- /dev/null
+++ b/perxis/invitations/invitations_pb2.py
@@ -0,0 +1,867 @@
+# -*- coding: utf-8 -*-
+# Generated by the protocol buffer compiler.  DO NOT EDIT!
+# source: invitations/invitations.proto
+"""Generated protocol buffer code."""
+from google.protobuf import descriptor as _descriptor
+from google.protobuf import message as _message
+from google.protobuf import reflection as _reflection
+from google.protobuf import symbol_database as _symbol_database
+# @@protoc_insertion_point(imports)
+
+_sym_db = _symbol_database.Default()
+
+
+from google.protobuf import timestamp_pb2 as google_dot_protobuf_dot_timestamp__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
+
+
+DESCRIPTOR = _descriptor.FileDescriptor(
+  name='invitations/invitations.proto',
+  package='content.invitations',
+  syntax='proto3',
+  serialized_options=b'Z8github.com/perxteam/perxis/proto/invitations;invitations',
+  create_key=_descriptor._internal_create_key,
+  serialized_pb=b'\n\x1dinvitations/invitations.proto\x12\x13\x63ontent.invitations\x1a\x1fgoogle/protobuf/timestamp.proto\x1a\x1bgoogle/protobuf/empty.proto\x1a\x1egoogle/protobuf/wrappers.proto\"\xd3\x01\n\nInvitation\x12\n\n\x02id\x18\x01 \x01(\t\x12\r\n\x05\x65mail\x18\x02 \x01(\t\x12\x17\n\x0forganization_id\x18\x03 \x01(\t\x12\x10\n\x08space_id\x18\x04 \x01(\t\x12\x10\n\x08owner_id\x18\x05 \x01(\t\x12\x0c\n\x04role\x18\x06 \x01(\t\x12.\n\ncreated_at\x18\x07 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12/\n\x0bvalid_until\x18\x08 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\"n\n\x06\x46ilter\x12\n\n\x02id\x18\x01 \x03(\t\x12\r\n\x05\x65mail\x18\x02 \x03(\t\x12\x17\n\x0forganization_id\x18\x03 \x03(\t\x12\x10\n\x08space_id\x18\x04 \x03(\t\x12\x10\n\x08owner_id\x18\x05 \x03(\t\x12\x0c\n\x04role\x18\x06 \x03(\t\"@\n\x0b\x46indOptions\x12\x0c\n\x04sort\x18\x01 \x03(\t\x12\x10\n\x08page_num\x18\x02 \x01(\x05\x12\x11\n\tpage_size\x18\x03 \x01(\x05\"\x81\x01\n\rCreateRequest\x12\r\n\x05\x65mail\x18\x01 \x01(\t\x12\x10\n\x08space_id\x18\x02 \x01(\t\x12\x0c\n\x04role\x18\x03 \x01(\t\x12\x10\n\x08owner_id\x18\x04 \x01(\t\x12/\n\x0bvalid_until\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\"E\n\x0e\x43reateResponse\x12\x33\n\ninvitation\x18\x01 \x01(\x0b\x32\x1f.content.invitations.Invitation\"#\n\nGetRequest\x12\x15\n\rinvitation_id\x18\x01 \x01(\t\"B\n\x0bGetResponse\x12\x33\n\ninvitation\x18\x01 \x01(\x0b\x32\x1f.content.invitations.Invitation\"\xdb\x01\n\rUpdateRequest\x12\x15\n\rinvitation_id\x18\x01 \x01(\t\x12(\n\x04sent\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.BoolValue\x12+\n\x07pending\x18\x03 \x01(\x0b\x32\x1a.google.protobuf.BoolValue\x12+\n\x07sent_at\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12/\n\x0bvalid_until\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\"\x1a\n\x18UpdateInvitationResponse\"7\n\rAcceptRequest\x12\x15\n\rinvitation_id\x18\x01 \x01(\t\x12\x0f\n\x07user_id\x18\x02 \x01(\t\"\x1a\n\x18\x41\x63\x63\x65ptInvitationResponse\"j\n\x0b\x46indRequest\x12+\n\x06\x66ilter\x18\x01 \x01(\x0b\x32\x1b.content.invitations.Filter\x12.\n\x04opts\x18\x02 \x01(\x0b\x32 .content.invitations.FindOptions\"S\n\x0c\x46indResponse\x12\x34\n\x0binvitations\x18\x01 \x03(\x0b\x32\x1f.content.invitations.Invitation\x12\r\n\x05total\x18\x02 \x01(\x03\"&\n\rDeleteRequest\x12\x15\n\rinvitation_id\x18\x01 \x01(\t\"\x1f\n\x1d\x44\x65leteSpaceInvitationResponse2\x8d\x03\n\x0bInvitations\x12S\n\x06\x43reate\x12\".content.invitations.CreateRequest\x1a#.content.invitations.CreateResponse\"\x00\x12J\n\x03Get\x12\x1f.content.invitations.GetRequest\x1a .content.invitations.GetResponse\"\x00\x12\x46\n\x06\x41\x63\x63\x65pt\x12\".content.invitations.AcceptRequest\x1a\x16.google.protobuf.Empty\"\x00\x12M\n\x04\x46ind\x12 .content.invitations.FindRequest\x1a!.content.invitations.FindResponse\"\x00\x12\x46\n\x06\x44\x65lete\x12\".content.invitations.DeleteRequest\x1a\x16.google.protobuf.Empty\"\x00\x42:Z8github.com/perxteam/perxis/proto/invitations;invitationsb\x06proto3'
+  ,
+  dependencies=[google_dot_protobuf_dot_timestamp__pb2.DESCRIPTOR,google_dot_protobuf_dot_empty__pb2.DESCRIPTOR,google_dot_protobuf_dot_wrappers__pb2.DESCRIPTOR,])
+
+
+
+
+_INVITATION = _descriptor.Descriptor(
+  name='Invitation',
+  full_name='content.invitations.Invitation',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='id', full_name='content.invitations.Invitation.id', index=0,
+      number=1, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='email', full_name='content.invitations.Invitation.email', index=1,
+      number=2, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='organization_id', full_name='content.invitations.Invitation.organization_id', index=2,
+      number=3, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='space_id', full_name='content.invitations.Invitation.space_id', index=3,
+      number=4, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='owner_id', full_name='content.invitations.Invitation.owner_id', index=4,
+      number=5, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='role', full_name='content.invitations.Invitation.role', index=5,
+      number=6, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='created_at', full_name='content.invitations.Invitation.created_at', index=6,
+      number=7, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='valid_until', full_name='content.invitations.Invitation.valid_until', index=7,
+      number=8, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=149,
+  serialized_end=360,
+)
+
+
+_FILTER = _descriptor.Descriptor(
+  name='Filter',
+  full_name='content.invitations.Filter',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='id', full_name='content.invitations.Filter.id', index=0,
+      number=1, type=9, cpp_type=9, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='email', full_name='content.invitations.Filter.email', index=1,
+      number=2, type=9, cpp_type=9, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='organization_id', full_name='content.invitations.Filter.organization_id', index=2,
+      number=3, type=9, cpp_type=9, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='space_id', full_name='content.invitations.Filter.space_id', index=3,
+      number=4, type=9, cpp_type=9, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='owner_id', full_name='content.invitations.Filter.owner_id', index=4,
+      number=5, type=9, cpp_type=9, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='role', full_name='content.invitations.Filter.role', index=5,
+      number=6, type=9, cpp_type=9, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=362,
+  serialized_end=472,
+)
+
+
+_FINDOPTIONS = _descriptor.Descriptor(
+  name='FindOptions',
+  full_name='content.invitations.FindOptions',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='sort', full_name='content.invitations.FindOptions.sort', index=0,
+      number=1, type=9, cpp_type=9, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='page_num', full_name='content.invitations.FindOptions.page_num', index=1,
+      number=2, type=5, cpp_type=1, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='page_size', full_name='content.invitations.FindOptions.page_size', index=2,
+      number=3, type=5, cpp_type=1, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=474,
+  serialized_end=538,
+)
+
+
+_CREATEREQUEST = _descriptor.Descriptor(
+  name='CreateRequest',
+  full_name='content.invitations.CreateRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='email', full_name='content.invitations.CreateRequest.email', index=0,
+      number=1, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='space_id', full_name='content.invitations.CreateRequest.space_id', index=1,
+      number=2, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='role', full_name='content.invitations.CreateRequest.role', index=2,
+      number=3, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='owner_id', full_name='content.invitations.CreateRequest.owner_id', index=3,
+      number=4, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='valid_until', full_name='content.invitations.CreateRequest.valid_until', index=4,
+      number=5, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=541,
+  serialized_end=670,
+)
+
+
+_CREATERESPONSE = _descriptor.Descriptor(
+  name='CreateResponse',
+  full_name='content.invitations.CreateResponse',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='invitation', full_name='content.invitations.CreateResponse.invitation', index=0,
+      number=1, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=672,
+  serialized_end=741,
+)
+
+
+_GETREQUEST = _descriptor.Descriptor(
+  name='GetRequest',
+  full_name='content.invitations.GetRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='invitation_id', full_name='content.invitations.GetRequest.invitation_id', index=0,
+      number=1, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=743,
+  serialized_end=778,
+)
+
+
+_GETRESPONSE = _descriptor.Descriptor(
+  name='GetResponse',
+  full_name='content.invitations.GetResponse',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='invitation', full_name='content.invitations.GetResponse.invitation', index=0,
+      number=1, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=780,
+  serialized_end=846,
+)
+
+
+_UPDATEREQUEST = _descriptor.Descriptor(
+  name='UpdateRequest',
+  full_name='content.invitations.UpdateRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='invitation_id', full_name='content.invitations.UpdateRequest.invitation_id', index=0,
+      number=1, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='sent', full_name='content.invitations.UpdateRequest.sent', index=1,
+      number=2, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='pending', full_name='content.invitations.UpdateRequest.pending', index=2,
+      number=3, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='sent_at', full_name='content.invitations.UpdateRequest.sent_at', index=3,
+      number=4, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='valid_until', full_name='content.invitations.UpdateRequest.valid_until', index=4,
+      number=5, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=849,
+  serialized_end=1068,
+)
+
+
+_UPDATEINVITATIONRESPONSE = _descriptor.Descriptor(
+  name='UpdateInvitationResponse',
+  full_name='content.invitations.UpdateInvitationResponse',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=1070,
+  serialized_end=1096,
+)
+
+
+_ACCEPTREQUEST = _descriptor.Descriptor(
+  name='AcceptRequest',
+  full_name='content.invitations.AcceptRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='invitation_id', full_name='content.invitations.AcceptRequest.invitation_id', index=0,
+      number=1, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='user_id', full_name='content.invitations.AcceptRequest.user_id', index=1,
+      number=2, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=1098,
+  serialized_end=1153,
+)
+
+
+_ACCEPTINVITATIONRESPONSE = _descriptor.Descriptor(
+  name='AcceptInvitationResponse',
+  full_name='content.invitations.AcceptInvitationResponse',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=1155,
+  serialized_end=1181,
+)
+
+
+_FINDREQUEST = _descriptor.Descriptor(
+  name='FindRequest',
+  full_name='content.invitations.FindRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='filter', full_name='content.invitations.FindRequest.filter', index=0,
+      number=1, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='opts', full_name='content.invitations.FindRequest.opts', index=1,
+      number=2, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=1183,
+  serialized_end=1289,
+)
+
+
+_FINDRESPONSE = _descriptor.Descriptor(
+  name='FindResponse',
+  full_name='content.invitations.FindResponse',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='invitations', full_name='content.invitations.FindResponse.invitations', index=0,
+      number=1, type=11, cpp_type=10, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='total', full_name='content.invitations.FindResponse.total', index=1,
+      number=2, type=3, cpp_type=2, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=1291,
+  serialized_end=1374,
+)
+
+
+_DELETEREQUEST = _descriptor.Descriptor(
+  name='DeleteRequest',
+  full_name='content.invitations.DeleteRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='invitation_id', full_name='content.invitations.DeleteRequest.invitation_id', index=0,
+      number=1, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=1376,
+  serialized_end=1414,
+)
+
+
+_DELETESPACEINVITATIONRESPONSE = _descriptor.Descriptor(
+  name='DeleteSpaceInvitationResponse',
+  full_name='content.invitations.DeleteSpaceInvitationResponse',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=1416,
+  serialized_end=1447,
+)
+
+_INVITATION.fields_by_name['created_at'].message_type = google_dot_protobuf_dot_timestamp__pb2._TIMESTAMP
+_INVITATION.fields_by_name['valid_until'].message_type = google_dot_protobuf_dot_timestamp__pb2._TIMESTAMP
+_CREATEREQUEST.fields_by_name['valid_until'].message_type = google_dot_protobuf_dot_timestamp__pb2._TIMESTAMP
+_CREATERESPONSE.fields_by_name['invitation'].message_type = _INVITATION
+_GETRESPONSE.fields_by_name['invitation'].message_type = _INVITATION
+_UPDATEREQUEST.fields_by_name['sent'].message_type = google_dot_protobuf_dot_wrappers__pb2._BOOLVALUE
+_UPDATEREQUEST.fields_by_name['pending'].message_type = google_dot_protobuf_dot_wrappers__pb2._BOOLVALUE
+_UPDATEREQUEST.fields_by_name['sent_at'].message_type = google_dot_protobuf_dot_timestamp__pb2._TIMESTAMP
+_UPDATEREQUEST.fields_by_name['valid_until'].message_type = google_dot_protobuf_dot_timestamp__pb2._TIMESTAMP
+_FINDREQUEST.fields_by_name['filter'].message_type = _FILTER
+_FINDREQUEST.fields_by_name['opts'].message_type = _FINDOPTIONS
+_FINDRESPONSE.fields_by_name['invitations'].message_type = _INVITATION
+DESCRIPTOR.message_types_by_name['Invitation'] = _INVITATION
+DESCRIPTOR.message_types_by_name['Filter'] = _FILTER
+DESCRIPTOR.message_types_by_name['FindOptions'] = _FINDOPTIONS
+DESCRIPTOR.message_types_by_name['CreateRequest'] = _CREATEREQUEST
+DESCRIPTOR.message_types_by_name['CreateResponse'] = _CREATERESPONSE
+DESCRIPTOR.message_types_by_name['GetRequest'] = _GETREQUEST
+DESCRIPTOR.message_types_by_name['GetResponse'] = _GETRESPONSE
+DESCRIPTOR.message_types_by_name['UpdateRequest'] = _UPDATEREQUEST
+DESCRIPTOR.message_types_by_name['UpdateInvitationResponse'] = _UPDATEINVITATIONRESPONSE
+DESCRIPTOR.message_types_by_name['AcceptRequest'] = _ACCEPTREQUEST
+DESCRIPTOR.message_types_by_name['AcceptInvitationResponse'] = _ACCEPTINVITATIONRESPONSE
+DESCRIPTOR.message_types_by_name['FindRequest'] = _FINDREQUEST
+DESCRIPTOR.message_types_by_name['FindResponse'] = _FINDRESPONSE
+DESCRIPTOR.message_types_by_name['DeleteRequest'] = _DELETEREQUEST
+DESCRIPTOR.message_types_by_name['DeleteSpaceInvitationResponse'] = _DELETESPACEINVITATIONRESPONSE
+_sym_db.RegisterFileDescriptor(DESCRIPTOR)
+
+Invitation = _reflection.GeneratedProtocolMessageType('Invitation', (_message.Message,), {
+  'DESCRIPTOR' : _INVITATION,
+  '__module__' : 'invitations.invitations_pb2'
+  # @@protoc_insertion_point(class_scope:content.invitations.Invitation)
+  })
+_sym_db.RegisterMessage(Invitation)
+
+Filter = _reflection.GeneratedProtocolMessageType('Filter', (_message.Message,), {
+  'DESCRIPTOR' : _FILTER,
+  '__module__' : 'invitations.invitations_pb2'
+  # @@protoc_insertion_point(class_scope:content.invitations.Filter)
+  })
+_sym_db.RegisterMessage(Filter)
+
+FindOptions = _reflection.GeneratedProtocolMessageType('FindOptions', (_message.Message,), {
+  'DESCRIPTOR' : _FINDOPTIONS,
+  '__module__' : 'invitations.invitations_pb2'
+  # @@protoc_insertion_point(class_scope:content.invitations.FindOptions)
+  })
+_sym_db.RegisterMessage(FindOptions)
+
+CreateRequest = _reflection.GeneratedProtocolMessageType('CreateRequest', (_message.Message,), {
+  'DESCRIPTOR' : _CREATEREQUEST,
+  '__module__' : 'invitations.invitations_pb2'
+  # @@protoc_insertion_point(class_scope:content.invitations.CreateRequest)
+  })
+_sym_db.RegisterMessage(CreateRequest)
+
+CreateResponse = _reflection.GeneratedProtocolMessageType('CreateResponse', (_message.Message,), {
+  'DESCRIPTOR' : _CREATERESPONSE,
+  '__module__' : 'invitations.invitations_pb2'
+  # @@protoc_insertion_point(class_scope:content.invitations.CreateResponse)
+  })
+_sym_db.RegisterMessage(CreateResponse)
+
+GetRequest = _reflection.GeneratedProtocolMessageType('GetRequest', (_message.Message,), {
+  'DESCRIPTOR' : _GETREQUEST,
+  '__module__' : 'invitations.invitations_pb2'
+  # @@protoc_insertion_point(class_scope:content.invitations.GetRequest)
+  })
+_sym_db.RegisterMessage(GetRequest)
+
+GetResponse = _reflection.GeneratedProtocolMessageType('GetResponse', (_message.Message,), {
+  'DESCRIPTOR' : _GETRESPONSE,
+  '__module__' : 'invitations.invitations_pb2'
+  # @@protoc_insertion_point(class_scope:content.invitations.GetResponse)
+  })
+_sym_db.RegisterMessage(GetResponse)
+
+UpdateRequest = _reflection.GeneratedProtocolMessageType('UpdateRequest', (_message.Message,), {
+  'DESCRIPTOR' : _UPDATEREQUEST,
+  '__module__' : 'invitations.invitations_pb2'
+  # @@protoc_insertion_point(class_scope:content.invitations.UpdateRequest)
+  })
+_sym_db.RegisterMessage(UpdateRequest)
+
+UpdateInvitationResponse = _reflection.GeneratedProtocolMessageType('UpdateInvitationResponse', (_message.Message,), {
+  'DESCRIPTOR' : _UPDATEINVITATIONRESPONSE,
+  '__module__' : 'invitations.invitations_pb2'
+  # @@protoc_insertion_point(class_scope:content.invitations.UpdateInvitationResponse)
+  })
+_sym_db.RegisterMessage(UpdateInvitationResponse)
+
+AcceptRequest = _reflection.GeneratedProtocolMessageType('AcceptRequest', (_message.Message,), {
+  'DESCRIPTOR' : _ACCEPTREQUEST,
+  '__module__' : 'invitations.invitations_pb2'
+  # @@protoc_insertion_point(class_scope:content.invitations.AcceptRequest)
+  })
+_sym_db.RegisterMessage(AcceptRequest)
+
+AcceptInvitationResponse = _reflection.GeneratedProtocolMessageType('AcceptInvitationResponse', (_message.Message,), {
+  'DESCRIPTOR' : _ACCEPTINVITATIONRESPONSE,
+  '__module__' : 'invitations.invitations_pb2'
+  # @@protoc_insertion_point(class_scope:content.invitations.AcceptInvitationResponse)
+  })
+_sym_db.RegisterMessage(AcceptInvitationResponse)
+
+FindRequest = _reflection.GeneratedProtocolMessageType('FindRequest', (_message.Message,), {
+  'DESCRIPTOR' : _FINDREQUEST,
+  '__module__' : 'invitations.invitations_pb2'
+  # @@protoc_insertion_point(class_scope:content.invitations.FindRequest)
+  })
+_sym_db.RegisterMessage(FindRequest)
+
+FindResponse = _reflection.GeneratedProtocolMessageType('FindResponse', (_message.Message,), {
+  'DESCRIPTOR' : _FINDRESPONSE,
+  '__module__' : 'invitations.invitations_pb2'
+  # @@protoc_insertion_point(class_scope:content.invitations.FindResponse)
+  })
+_sym_db.RegisterMessage(FindResponse)
+
+DeleteRequest = _reflection.GeneratedProtocolMessageType('DeleteRequest', (_message.Message,), {
+  'DESCRIPTOR' : _DELETEREQUEST,
+  '__module__' : 'invitations.invitations_pb2'
+  # @@protoc_insertion_point(class_scope:content.invitations.DeleteRequest)
+  })
+_sym_db.RegisterMessage(DeleteRequest)
+
+DeleteSpaceInvitationResponse = _reflection.GeneratedProtocolMessageType('DeleteSpaceInvitationResponse', (_message.Message,), {
+  'DESCRIPTOR' : _DELETESPACEINVITATIONRESPONSE,
+  '__module__' : 'invitations.invitations_pb2'
+  # @@protoc_insertion_point(class_scope:content.invitations.DeleteSpaceInvitationResponse)
+  })
+_sym_db.RegisterMessage(DeleteSpaceInvitationResponse)
+
+
+DESCRIPTOR._options = None
+
+_INVITATIONS = _descriptor.ServiceDescriptor(
+  name='Invitations',
+  full_name='content.invitations.Invitations',
+  file=DESCRIPTOR,
+  index=0,
+  serialized_options=None,
+  create_key=_descriptor._internal_create_key,
+  serialized_start=1450,
+  serialized_end=1847,
+  methods=[
+  _descriptor.MethodDescriptor(
+    name='Create',
+    full_name='content.invitations.Invitations.Create',
+    index=0,
+    containing_service=None,
+    input_type=_CREATEREQUEST,
+    output_type=_CREATERESPONSE,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='Get',
+    full_name='content.invitations.Invitations.Get',
+    index=1,
+    containing_service=None,
+    input_type=_GETREQUEST,
+    output_type=_GETRESPONSE,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='Accept',
+    full_name='content.invitations.Invitations.Accept',
+    index=2,
+    containing_service=None,
+    input_type=_ACCEPTREQUEST,
+    output_type=google_dot_protobuf_dot_empty__pb2._EMPTY,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='Find',
+    full_name='content.invitations.Invitations.Find',
+    index=3,
+    containing_service=None,
+    input_type=_FINDREQUEST,
+    output_type=_FINDRESPONSE,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='Delete',
+    full_name='content.invitations.Invitations.Delete',
+    index=4,
+    containing_service=None,
+    input_type=_DELETEREQUEST,
+    output_type=google_dot_protobuf_dot_empty__pb2._EMPTY,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+])
+_sym_db.RegisterServiceDescriptor(_INVITATIONS)
+
+DESCRIPTOR.services_by_name['Invitations'] = _INVITATIONS
+
+# @@protoc_insertion_point(module_scope)
diff --git a/perxis/invitations/invitations_pb2_grpc.py b/perxis/invitations/invitations_pb2_grpc.py
new file mode 100644
index 0000000..a0a7760
--- /dev/null
+++ b/perxis/invitations/invitations_pb2_grpc.py
@@ -0,0 +1,206 @@
+# Generated by the gRPC Python protocol compiler plugin. DO NOT EDIT!
+"""Client and server classes corresponding to protobuf-defined services."""
+import grpc
+
+from google.protobuf import empty_pb2 as google_dot_protobuf_dot_empty__pb2
+from invitations import invitations_pb2 as invitations_dot_invitations__pb2
+
+
+class InvitationsStub(object):
+    """Missing associated documentation comment in .proto file."""
+
+    def __init__(self, channel):
+        """Constructor.
+
+        Args:
+            channel: A grpc.Channel.
+        """
+        self.Create = channel.unary_unary(
+                '/content.invitations.Invitations/Create',
+                request_serializer=invitations_dot_invitations__pb2.CreateRequest.SerializeToString,
+                response_deserializer=invitations_dot_invitations__pb2.CreateResponse.FromString,
+                )
+        self.Get = channel.unary_unary(
+                '/content.invitations.Invitations/Get',
+                request_serializer=invitations_dot_invitations__pb2.GetRequest.SerializeToString,
+                response_deserializer=invitations_dot_invitations__pb2.GetResponse.FromString,
+                )
+        self.Accept = channel.unary_unary(
+                '/content.invitations.Invitations/Accept',
+                request_serializer=invitations_dot_invitations__pb2.AcceptRequest.SerializeToString,
+                response_deserializer=google_dot_protobuf_dot_empty__pb2.Empty.FromString,
+                )
+        self.Find = channel.unary_unary(
+                '/content.invitations.Invitations/Find',
+                request_serializer=invitations_dot_invitations__pb2.FindRequest.SerializeToString,
+                response_deserializer=invitations_dot_invitations__pb2.FindResponse.FromString,
+                )
+        self.Delete = channel.unary_unary(
+                '/content.invitations.Invitations/Delete',
+                request_serializer=invitations_dot_invitations__pb2.DeleteRequest.SerializeToString,
+                response_deserializer=google_dot_protobuf_dot_empty__pb2.Empty.FromString,
+                )
+
+
+class InvitationsServicer(object):
+    """Missing associated documentation comment in .proto file."""
+
+    def Create(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def Get(self, request, context):
+        """Получить данные о приглашении
+        """
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def Accept(self, request, context):
+        """Обновить данные о приглашении
+        rpc Update(UpdateRequest) returns(google.protobuf.Empty) {}
+
+        Принять приглашение
+        """
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def Find(self, request, context):
+        """Получить список приглашений для пространства
+        """
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def Delete(self, request, context):
+        """Удалить приглашение
+        """
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+
+def add_InvitationsServicer_to_server(servicer, server):
+    rpc_method_handlers = {
+            'Create': grpc.unary_unary_rpc_method_handler(
+                    servicer.Create,
+                    request_deserializer=invitations_dot_invitations__pb2.CreateRequest.FromString,
+                    response_serializer=invitations_dot_invitations__pb2.CreateResponse.SerializeToString,
+            ),
+            'Get': grpc.unary_unary_rpc_method_handler(
+                    servicer.Get,
+                    request_deserializer=invitations_dot_invitations__pb2.GetRequest.FromString,
+                    response_serializer=invitations_dot_invitations__pb2.GetResponse.SerializeToString,
+            ),
+            'Accept': grpc.unary_unary_rpc_method_handler(
+                    servicer.Accept,
+                    request_deserializer=invitations_dot_invitations__pb2.AcceptRequest.FromString,
+                    response_serializer=google_dot_protobuf_dot_empty__pb2.Empty.SerializeToString,
+            ),
+            'Find': grpc.unary_unary_rpc_method_handler(
+                    servicer.Find,
+                    request_deserializer=invitations_dot_invitations__pb2.FindRequest.FromString,
+                    response_serializer=invitations_dot_invitations__pb2.FindResponse.SerializeToString,
+            ),
+            'Delete': grpc.unary_unary_rpc_method_handler(
+                    servicer.Delete,
+                    request_deserializer=invitations_dot_invitations__pb2.DeleteRequest.FromString,
+                    response_serializer=google_dot_protobuf_dot_empty__pb2.Empty.SerializeToString,
+            ),
+    }
+    generic_handler = grpc.method_handlers_generic_handler(
+            'content.invitations.Invitations', rpc_method_handlers)
+    server.add_generic_rpc_handlers((generic_handler,))
+
+
+ # This class is part of an EXPERIMENTAL API.
+class Invitations(object):
+    """Missing associated documentation comment in .proto file."""
+
+    @staticmethod
+    def Create(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/content.invitations.Invitations/Create',
+            invitations_dot_invitations__pb2.CreateRequest.SerializeToString,
+            invitations_dot_invitations__pb2.CreateResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def Get(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/content.invitations.Invitations/Get',
+            invitations_dot_invitations__pb2.GetRequest.SerializeToString,
+            invitations_dot_invitations__pb2.GetResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def Accept(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/content.invitations.Invitations/Accept',
+            invitations_dot_invitations__pb2.AcceptRequest.SerializeToString,
+            google_dot_protobuf_dot_empty__pb2.Empty.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def Find(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/content.invitations.Invitations/Find',
+            invitations_dot_invitations__pb2.FindRequest.SerializeToString,
+            invitations_dot_invitations__pb2.FindResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def Delete(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/content.invitations.Invitations/Delete',
+            invitations_dot_invitations__pb2.DeleteRequest.SerializeToString,
+            google_dot_protobuf_dot_empty__pb2.Empty.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
diff --git a/perxis/locales/__init__.py b/perxis/locales/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/perxis/locales/locales_pb2.py b/perxis/locales/locales_pb2.py
new file mode 100644
index 0000000..fe9d519
--- /dev/null
+++ b/perxis/locales/locales_pb2.py
@@ -0,0 +1,356 @@
+# -*- coding: utf-8 -*-
+# Generated by the protocol buffer compiler.  DO NOT EDIT!
+# source: locales/locales.proto
+"""Generated protocol buffer code."""
+from google.protobuf import descriptor as _descriptor
+from google.protobuf import message as _message
+from google.protobuf import reflection as _reflection
+from google.protobuf import symbol_database as _symbol_database
+# @@protoc_insertion_point(imports)
+
+_sym_db = _symbol_database.Default()
+
+
+from google.protobuf import empty_pb2 as google_dot_protobuf_dot_empty__pb2
+
+
+DESCRIPTOR = _descriptor.FileDescriptor(
+  name='locales/locales.proto',
+  package='content.locales',
+  syntax='proto3',
+  serialized_options=b'Z0github.com/perxteam/perxis/proto/locales;locales',
+  create_key=_descriptor._internal_create_key,
+  serialized_pb=b'\n\x15locales/locales.proto\x12\x0f\x63ontent.locales\x1a\x1bgoogle/protobuf/empty.proto\"4\n\x06Locale\x12\n\n\x02id\x18\x01 \x01(\t\x12\x0c\n\x04name\x18\x02 \x01(\t\x12\x10\n\x08space_id\x18\x03 \x01(\t\"B\n\rCreateRequest\x12\x11\n\tlocale_id\x18\x01 \x01(\t\x12\x0c\n\x04name\x18\x02 \x01(\t\x12\x10\n\x08space_id\x18\x03 \x01(\t\"9\n\x0e\x43reateResponse\x12\'\n\x06locale\x18\x01 \x01(\x0b\x32\x17.content.locales.Locale\"\x1f\n\x0bListRequest\x12\x10\n\x08space_id\x18\x01 \x01(\t\"8\n\x0cListResponse\x12(\n\x07locales\x18\x01 \x03(\x0b\x32\x17.content.locales.Locale\"4\n\rDeleteRequest\x12\x11\n\tlocale_id\x18\x01 \x01(\t\x12\x10\n\x08space_id\x18\x02 \x01(\t2\xe1\x01\n\x07Locales\x12K\n\x06\x43reate\x12\x1e.content.locales.CreateRequest\x1a\x1f.content.locales.CreateResponse\"\x00\x12\x45\n\x04List\x12\x1c.content.locales.ListRequest\x1a\x1d.content.locales.ListResponse\"\x00\x12\x42\n\x06\x44\x65lete\x12\x1e.content.locales.DeleteRequest\x1a\x16.google.protobuf.Empty\"\x00\x42\x32Z0github.com/perxteam/perxis/proto/locales;localesb\x06proto3'
+  ,
+  dependencies=[google_dot_protobuf_dot_empty__pb2.DESCRIPTOR,])
+
+
+
+
+_LOCALE = _descriptor.Descriptor(
+  name='Locale',
+  full_name='content.locales.Locale',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='id', full_name='content.locales.Locale.id', index=0,
+      number=1, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='name', full_name='content.locales.Locale.name', index=1,
+      number=2, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='space_id', full_name='content.locales.Locale.space_id', index=2,
+      number=3, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=71,
+  serialized_end=123,
+)
+
+
+_CREATEREQUEST = _descriptor.Descriptor(
+  name='CreateRequest',
+  full_name='content.locales.CreateRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='locale_id', full_name='content.locales.CreateRequest.locale_id', index=0,
+      number=1, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='name', full_name='content.locales.CreateRequest.name', index=1,
+      number=2, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='space_id', full_name='content.locales.CreateRequest.space_id', index=2,
+      number=3, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=125,
+  serialized_end=191,
+)
+
+
+_CREATERESPONSE = _descriptor.Descriptor(
+  name='CreateResponse',
+  full_name='content.locales.CreateResponse',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='locale', full_name='content.locales.CreateResponse.locale', index=0,
+      number=1, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=193,
+  serialized_end=250,
+)
+
+
+_LISTREQUEST = _descriptor.Descriptor(
+  name='ListRequest',
+  full_name='content.locales.ListRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='space_id', full_name='content.locales.ListRequest.space_id', index=0,
+      number=1, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=252,
+  serialized_end=283,
+)
+
+
+_LISTRESPONSE = _descriptor.Descriptor(
+  name='ListResponse',
+  full_name='content.locales.ListResponse',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='locales', full_name='content.locales.ListResponse.locales', index=0,
+      number=1, type=11, cpp_type=10, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=285,
+  serialized_end=341,
+)
+
+
+_DELETEREQUEST = _descriptor.Descriptor(
+  name='DeleteRequest',
+  full_name='content.locales.DeleteRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='locale_id', full_name='content.locales.DeleteRequest.locale_id', index=0,
+      number=1, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='space_id', full_name='content.locales.DeleteRequest.space_id', index=1,
+      number=2, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=343,
+  serialized_end=395,
+)
+
+_CREATERESPONSE.fields_by_name['locale'].message_type = _LOCALE
+_LISTRESPONSE.fields_by_name['locales'].message_type = _LOCALE
+DESCRIPTOR.message_types_by_name['Locale'] = _LOCALE
+DESCRIPTOR.message_types_by_name['CreateRequest'] = _CREATEREQUEST
+DESCRIPTOR.message_types_by_name['CreateResponse'] = _CREATERESPONSE
+DESCRIPTOR.message_types_by_name['ListRequest'] = _LISTREQUEST
+DESCRIPTOR.message_types_by_name['ListResponse'] = _LISTRESPONSE
+DESCRIPTOR.message_types_by_name['DeleteRequest'] = _DELETEREQUEST
+_sym_db.RegisterFileDescriptor(DESCRIPTOR)
+
+Locale = _reflection.GeneratedProtocolMessageType('Locale', (_message.Message,), {
+  'DESCRIPTOR' : _LOCALE,
+  '__module__' : 'locales.locales_pb2'
+  # @@protoc_insertion_point(class_scope:content.locales.Locale)
+  })
+_sym_db.RegisterMessage(Locale)
+
+CreateRequest = _reflection.GeneratedProtocolMessageType('CreateRequest', (_message.Message,), {
+  'DESCRIPTOR' : _CREATEREQUEST,
+  '__module__' : 'locales.locales_pb2'
+  # @@protoc_insertion_point(class_scope:content.locales.CreateRequest)
+  })
+_sym_db.RegisterMessage(CreateRequest)
+
+CreateResponse = _reflection.GeneratedProtocolMessageType('CreateResponse', (_message.Message,), {
+  'DESCRIPTOR' : _CREATERESPONSE,
+  '__module__' : 'locales.locales_pb2'
+  # @@protoc_insertion_point(class_scope:content.locales.CreateResponse)
+  })
+_sym_db.RegisterMessage(CreateResponse)
+
+ListRequest = _reflection.GeneratedProtocolMessageType('ListRequest', (_message.Message,), {
+  'DESCRIPTOR' : _LISTREQUEST,
+  '__module__' : 'locales.locales_pb2'
+  # @@protoc_insertion_point(class_scope:content.locales.ListRequest)
+  })
+_sym_db.RegisterMessage(ListRequest)
+
+ListResponse = _reflection.GeneratedProtocolMessageType('ListResponse', (_message.Message,), {
+  'DESCRIPTOR' : _LISTRESPONSE,
+  '__module__' : 'locales.locales_pb2'
+  # @@protoc_insertion_point(class_scope:content.locales.ListResponse)
+  })
+_sym_db.RegisterMessage(ListResponse)
+
+DeleteRequest = _reflection.GeneratedProtocolMessageType('DeleteRequest', (_message.Message,), {
+  'DESCRIPTOR' : _DELETEREQUEST,
+  '__module__' : 'locales.locales_pb2'
+  # @@protoc_insertion_point(class_scope:content.locales.DeleteRequest)
+  })
+_sym_db.RegisterMessage(DeleteRequest)
+
+
+DESCRIPTOR._options = None
+
+_LOCALES = _descriptor.ServiceDescriptor(
+  name='Locales',
+  full_name='content.locales.Locales',
+  file=DESCRIPTOR,
+  index=0,
+  serialized_options=None,
+  create_key=_descriptor._internal_create_key,
+  serialized_start=398,
+  serialized_end=623,
+  methods=[
+  _descriptor.MethodDescriptor(
+    name='Create',
+    full_name='content.locales.Locales.Create',
+    index=0,
+    containing_service=None,
+    input_type=_CREATEREQUEST,
+    output_type=_CREATERESPONSE,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='List',
+    full_name='content.locales.Locales.List',
+    index=1,
+    containing_service=None,
+    input_type=_LISTREQUEST,
+    output_type=_LISTRESPONSE,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='Delete',
+    full_name='content.locales.Locales.Delete',
+    index=2,
+    containing_service=None,
+    input_type=_DELETEREQUEST,
+    output_type=google_dot_protobuf_dot_empty__pb2._EMPTY,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+])
+_sym_db.RegisterServiceDescriptor(_LOCALES)
+
+DESCRIPTOR.services_by_name['Locales'] = _LOCALES
+
+# @@protoc_insertion_point(module_scope)
diff --git a/perxis/locales/locales_pb2_grpc.py b/perxis/locales/locales_pb2_grpc.py
new file mode 100644
index 0000000..4a75d07
--- /dev/null
+++ b/perxis/locales/locales_pb2_grpc.py
@@ -0,0 +1,133 @@
+# Generated by the gRPC Python protocol compiler plugin. DO NOT EDIT!
+"""Client and server classes corresponding to protobuf-defined services."""
+import grpc
+
+from google.protobuf import empty_pb2 as google_dot_protobuf_dot_empty__pb2
+from locales import locales_pb2 as locales_dot_locales__pb2
+
+
+class LocalesStub(object):
+    """Missing associated documentation comment in .proto file."""
+
+    def __init__(self, channel):
+        """Constructor.
+
+        Args:
+            channel: A grpc.Channel.
+        """
+        self.Create = channel.unary_unary(
+                '/content.locales.Locales/Create',
+                request_serializer=locales_dot_locales__pb2.CreateRequest.SerializeToString,
+                response_deserializer=locales_dot_locales__pb2.CreateResponse.FromString,
+                )
+        self.List = channel.unary_unary(
+                '/content.locales.Locales/List',
+                request_serializer=locales_dot_locales__pb2.ListRequest.SerializeToString,
+                response_deserializer=locales_dot_locales__pb2.ListResponse.FromString,
+                )
+        self.Delete = channel.unary_unary(
+                '/content.locales.Locales/Delete',
+                request_serializer=locales_dot_locales__pb2.DeleteRequest.SerializeToString,
+                response_deserializer=google_dot_protobuf_dot_empty__pb2.Empty.FromString,
+                )
+
+
+class LocalesServicer(object):
+    """Missing associated documentation comment in .proto file."""
+
+    def Create(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        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."""
+        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."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+
+def add_LocalesServicer_to_server(servicer, server):
+    rpc_method_handlers = {
+            'Create': grpc.unary_unary_rpc_method_handler(
+                    servicer.Create,
+                    request_deserializer=locales_dot_locales__pb2.CreateRequest.FromString,
+                    response_serializer=locales_dot_locales__pb2.CreateResponse.SerializeToString,
+            ),
+            'List': grpc.unary_unary_rpc_method_handler(
+                    servicer.List,
+                    request_deserializer=locales_dot_locales__pb2.ListRequest.FromString,
+                    response_serializer=locales_dot_locales__pb2.ListResponse.SerializeToString,
+            ),
+            'Delete': grpc.unary_unary_rpc_method_handler(
+                    servicer.Delete,
+                    request_deserializer=locales_dot_locales__pb2.DeleteRequest.FromString,
+                    response_serializer=google_dot_protobuf_dot_empty__pb2.Empty.SerializeToString,
+            ),
+    }
+    generic_handler = grpc.method_handlers_generic_handler(
+            'content.locales.Locales', rpc_method_handlers)
+    server.add_generic_rpc_handlers((generic_handler,))
+
+
+ # This class is part of an EXPERIMENTAL API.
+class Locales(object):
+    """Missing associated documentation comment in .proto file."""
+
+    @staticmethod
+    def Create(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/content.locales.Locales/Create',
+            locales_dot_locales__pb2.CreateRequest.SerializeToString,
+            locales_dot_locales__pb2.CreateResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def List(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/content.locales.Locales/List',
+            locales_dot_locales__pb2.ListRequest.SerializeToString,
+            locales_dot_locales__pb2.ListResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def Delete(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/content.locales.Locales/Delete',
+            locales_dot_locales__pb2.DeleteRequest.SerializeToString,
+            google_dot_protobuf_dot_empty__pb2.Empty.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
diff --git a/perxis/members/__init__.py b/perxis/members/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/perxis/members/members_pb2.py b/perxis/members/members_pb2.py
new file mode 100644
index 0000000..40e8a02
--- /dev/null
+++ b/perxis/members/members_pb2.py
@@ -0,0 +1,548 @@
+# -*- coding: utf-8 -*-
+# Generated by the protocol buffer compiler.  DO NOT EDIT!
+# source: members/members.proto
+"""Generated protocol buffer code."""
+from google.protobuf.internal import enum_type_wrapper
+from google.protobuf import descriptor as _descriptor
+from google.protobuf import message as _message
+from google.protobuf import reflection as _reflection
+from google.protobuf import symbol_database as _symbol_database
+# @@protoc_insertion_point(imports)
+
+_sym_db = _symbol_database.Default()
+
+
+from google.protobuf import empty_pb2 as google_dot_protobuf_dot_empty__pb2
+
+
+DESCRIPTOR = _descriptor.FileDescriptor(
+  name='members/members.proto',
+  package='account.members',
+  syntax='proto3',
+  serialized_options=b'Z0github.com/perxteam/perxis/proto/members;members',
+  create_key=_descriptor._internal_create_key,
+  serialized_pb=b'\n\x15members/members.proto\x12\x0f\x61\x63\x63ount.members\x1a\x1bgoogle/protobuf/empty.proto\"N\n\x06Member\x12\x0e\n\x06org_id\x18\x01 \x01(\t\x12\x0f\n\x07user_id\x18\x02 \x01(\t\x12#\n\x04role\x18\x03 \x01(\x0e\x32\x15.account.members.Role\"R\n\nSetRequest\x12\x0e\n\x06org_id\x18\x01 \x01(\t\x12\x0f\n\x07user_id\x18\x02 \x01(\t\x12#\n\x04role\x18\x03 \x01(\x0e\x32\x15.account.members.Role\"-\n\nGetRequest\x12\x0e\n\x06org_id\x18\x01 \x01(\t\x12\x0f\n\x07user_id\x18\x02 \x01(\t\"2\n\x0bGetResponse\x12#\n\x04role\x18\x03 \x01(\x0e\x32\x15.account.members.Role\"0\n\rRemoveRequest\x12\x0e\n\x06org_id\x18\x01 \x01(\t\x12\x0f\n\x07user_id\x18\x02 \x01(\t\"$\n\x12ListMembersRequest\x12\x0e\n\x06org_id\x18\x01 \x01(\t\"?\n\x13ListMembersResponse\x12(\n\x07members\x18\x01 \x03(\x0b\x32\x17.account.members.Member\"+\n\x18ListOrganizationsRequest\x12\x0f\n\x07user_id\x18\x01 \x01(\t\"K\n\x19ListOrganizationsResponse\x12.\n\rorganizations\x18\x01 \x03(\x0b\x32\x17.account.members.Member*8\n\x04Role\x12\x0e\n\nNOT_MEMBER\x10\x00\x12\n\n\x06MEMBER\x10\x01\x12\t\n\x05OWNER\x10\x02\x12\t\n\x05\x41\x44MIN\x10\x03\x32\x99\x03\n\x07Members\x12<\n\x03Set\x12\x1b.account.members.SetRequest\x1a\x16.google.protobuf.Empty\"\x00\x12\x42\n\x03Get\x12\x1b.account.members.GetRequest\x1a\x1c.account.members.GetResponse\"\x00\x12\x42\n\x06Remove\x12\x1e.account.members.RemoveRequest\x1a\x16.google.protobuf.Empty\"\x00\x12Z\n\x0bListMembers\x12#.account.members.ListMembersRequest\x1a$.account.members.ListMembersResponse\"\x00\x12l\n\x11ListOrganizations\x12).account.members.ListOrganizationsRequest\x1a*.account.members.ListOrganizationsResponse\"\x00\x42\x32Z0github.com/perxteam/perxis/proto/members;membersb\x06proto3'
+  ,
+  dependencies=[google_dot_protobuf_dot_empty__pb2.DESCRIPTOR,])
+
+_ROLE = _descriptor.EnumDescriptor(
+  name='Role',
+  full_name='account.members.Role',
+  filename=None,
+  file=DESCRIPTOR,
+  create_key=_descriptor._internal_create_key,
+  values=[
+    _descriptor.EnumValueDescriptor(
+      name='NOT_MEMBER', index=0, number=0,
+      serialized_options=None,
+      type=None,
+      create_key=_descriptor._internal_create_key),
+    _descriptor.EnumValueDescriptor(
+      name='MEMBER', index=1, number=1,
+      serialized_options=None,
+      type=None,
+      create_key=_descriptor._internal_create_key),
+    _descriptor.EnumValueDescriptor(
+      name='OWNER', index=2, number=2,
+      serialized_options=None,
+      type=None,
+      create_key=_descriptor._internal_create_key),
+    _descriptor.EnumValueDescriptor(
+      name='ADMIN', index=3, number=3,
+      serialized_options=None,
+      type=None,
+      create_key=_descriptor._internal_create_key),
+  ],
+  containing_type=None,
+  serialized_options=None,
+  serialized_start=609,
+  serialized_end=665,
+)
+_sym_db.RegisterEnumDescriptor(_ROLE)
+
+Role = enum_type_wrapper.EnumTypeWrapper(_ROLE)
+NOT_MEMBER = 0
+MEMBER = 1
+OWNER = 2
+ADMIN = 3
+
+
+
+_MEMBER = _descriptor.Descriptor(
+  name='Member',
+  full_name='account.members.Member',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='org_id', full_name='account.members.Member.org_id', index=0,
+      number=1, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='user_id', full_name='account.members.Member.user_id', index=1,
+      number=2, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='role', full_name='account.members.Member.role', index=2,
+      number=3, type=14, cpp_type=8, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=71,
+  serialized_end=149,
+)
+
+
+_SETREQUEST = _descriptor.Descriptor(
+  name='SetRequest',
+  full_name='account.members.SetRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='org_id', full_name='account.members.SetRequest.org_id', index=0,
+      number=1, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='user_id', full_name='account.members.SetRequest.user_id', index=1,
+      number=2, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='role', full_name='account.members.SetRequest.role', index=2,
+      number=3, type=14, cpp_type=8, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=151,
+  serialized_end=233,
+)
+
+
+_GETREQUEST = _descriptor.Descriptor(
+  name='GetRequest',
+  full_name='account.members.GetRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='org_id', full_name='account.members.GetRequest.org_id', index=0,
+      number=1, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='user_id', full_name='account.members.GetRequest.user_id', index=1,
+      number=2, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=235,
+  serialized_end=280,
+)
+
+
+_GETRESPONSE = _descriptor.Descriptor(
+  name='GetResponse',
+  full_name='account.members.GetResponse',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='role', full_name='account.members.GetResponse.role', index=0,
+      number=3, type=14, cpp_type=8, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=282,
+  serialized_end=332,
+)
+
+
+_REMOVEREQUEST = _descriptor.Descriptor(
+  name='RemoveRequest',
+  full_name='account.members.RemoveRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='org_id', full_name='account.members.RemoveRequest.org_id', index=0,
+      number=1, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='user_id', full_name='account.members.RemoveRequest.user_id', index=1,
+      number=2, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=334,
+  serialized_end=382,
+)
+
+
+_LISTMEMBERSREQUEST = _descriptor.Descriptor(
+  name='ListMembersRequest',
+  full_name='account.members.ListMembersRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='org_id', full_name='account.members.ListMembersRequest.org_id', index=0,
+      number=1, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=384,
+  serialized_end=420,
+)
+
+
+_LISTMEMBERSRESPONSE = _descriptor.Descriptor(
+  name='ListMembersResponse',
+  full_name='account.members.ListMembersResponse',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='members', full_name='account.members.ListMembersResponse.members', index=0,
+      number=1, type=11, cpp_type=10, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=422,
+  serialized_end=485,
+)
+
+
+_LISTORGANIZATIONSREQUEST = _descriptor.Descriptor(
+  name='ListOrganizationsRequest',
+  full_name='account.members.ListOrganizationsRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='user_id', full_name='account.members.ListOrganizationsRequest.user_id', index=0,
+      number=1, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=487,
+  serialized_end=530,
+)
+
+
+_LISTORGANIZATIONSRESPONSE = _descriptor.Descriptor(
+  name='ListOrganizationsResponse',
+  full_name='account.members.ListOrganizationsResponse',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='organizations', full_name='account.members.ListOrganizationsResponse.organizations', index=0,
+      number=1, type=11, cpp_type=10, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=532,
+  serialized_end=607,
+)
+
+_MEMBER.fields_by_name['role'].enum_type = _ROLE
+_SETREQUEST.fields_by_name['role'].enum_type = _ROLE
+_GETRESPONSE.fields_by_name['role'].enum_type = _ROLE
+_LISTMEMBERSRESPONSE.fields_by_name['members'].message_type = _MEMBER
+_LISTORGANIZATIONSRESPONSE.fields_by_name['organizations'].message_type = _MEMBER
+DESCRIPTOR.message_types_by_name['Member'] = _MEMBER
+DESCRIPTOR.message_types_by_name['SetRequest'] = _SETREQUEST
+DESCRIPTOR.message_types_by_name['GetRequest'] = _GETREQUEST
+DESCRIPTOR.message_types_by_name['GetResponse'] = _GETRESPONSE
+DESCRIPTOR.message_types_by_name['RemoveRequest'] = _REMOVEREQUEST
+DESCRIPTOR.message_types_by_name['ListMembersRequest'] = _LISTMEMBERSREQUEST
+DESCRIPTOR.message_types_by_name['ListMembersResponse'] = _LISTMEMBERSRESPONSE
+DESCRIPTOR.message_types_by_name['ListOrganizationsRequest'] = _LISTORGANIZATIONSREQUEST
+DESCRIPTOR.message_types_by_name['ListOrganizationsResponse'] = _LISTORGANIZATIONSRESPONSE
+DESCRIPTOR.enum_types_by_name['Role'] = _ROLE
+_sym_db.RegisterFileDescriptor(DESCRIPTOR)
+
+Member = _reflection.GeneratedProtocolMessageType('Member', (_message.Message,), {
+  'DESCRIPTOR' : _MEMBER,
+  '__module__' : 'members.members_pb2'
+  # @@protoc_insertion_point(class_scope:account.members.Member)
+  })
+_sym_db.RegisterMessage(Member)
+
+SetRequest = _reflection.GeneratedProtocolMessageType('SetRequest', (_message.Message,), {
+  'DESCRIPTOR' : _SETREQUEST,
+  '__module__' : 'members.members_pb2'
+  # @@protoc_insertion_point(class_scope:account.members.SetRequest)
+  })
+_sym_db.RegisterMessage(SetRequest)
+
+GetRequest = _reflection.GeneratedProtocolMessageType('GetRequest', (_message.Message,), {
+  'DESCRIPTOR' : _GETREQUEST,
+  '__module__' : 'members.members_pb2'
+  # @@protoc_insertion_point(class_scope:account.members.GetRequest)
+  })
+_sym_db.RegisterMessage(GetRequest)
+
+GetResponse = _reflection.GeneratedProtocolMessageType('GetResponse', (_message.Message,), {
+  'DESCRIPTOR' : _GETRESPONSE,
+  '__module__' : 'members.members_pb2'
+  # @@protoc_insertion_point(class_scope:account.members.GetResponse)
+  })
+_sym_db.RegisterMessage(GetResponse)
+
+RemoveRequest = _reflection.GeneratedProtocolMessageType('RemoveRequest', (_message.Message,), {
+  'DESCRIPTOR' : _REMOVEREQUEST,
+  '__module__' : 'members.members_pb2'
+  # @@protoc_insertion_point(class_scope:account.members.RemoveRequest)
+  })
+_sym_db.RegisterMessage(RemoveRequest)
+
+ListMembersRequest = _reflection.GeneratedProtocolMessageType('ListMembersRequest', (_message.Message,), {
+  'DESCRIPTOR' : _LISTMEMBERSREQUEST,
+  '__module__' : 'members.members_pb2'
+  # @@protoc_insertion_point(class_scope:account.members.ListMembersRequest)
+  })
+_sym_db.RegisterMessage(ListMembersRequest)
+
+ListMembersResponse = _reflection.GeneratedProtocolMessageType('ListMembersResponse', (_message.Message,), {
+  'DESCRIPTOR' : _LISTMEMBERSRESPONSE,
+  '__module__' : 'members.members_pb2'
+  # @@protoc_insertion_point(class_scope:account.members.ListMembersResponse)
+  })
+_sym_db.RegisterMessage(ListMembersResponse)
+
+ListOrganizationsRequest = _reflection.GeneratedProtocolMessageType('ListOrganizationsRequest', (_message.Message,), {
+  'DESCRIPTOR' : _LISTORGANIZATIONSREQUEST,
+  '__module__' : 'members.members_pb2'
+  # @@protoc_insertion_point(class_scope:account.members.ListOrganizationsRequest)
+  })
+_sym_db.RegisterMessage(ListOrganizationsRequest)
+
+ListOrganizationsResponse = _reflection.GeneratedProtocolMessageType('ListOrganizationsResponse', (_message.Message,), {
+  'DESCRIPTOR' : _LISTORGANIZATIONSRESPONSE,
+  '__module__' : 'members.members_pb2'
+  # @@protoc_insertion_point(class_scope:account.members.ListOrganizationsResponse)
+  })
+_sym_db.RegisterMessage(ListOrganizationsResponse)
+
+
+DESCRIPTOR._options = None
+
+_MEMBERS = _descriptor.ServiceDescriptor(
+  name='Members',
+  full_name='account.members.Members',
+  file=DESCRIPTOR,
+  index=0,
+  serialized_options=None,
+  create_key=_descriptor._internal_create_key,
+  serialized_start=668,
+  serialized_end=1077,
+  methods=[
+  _descriptor.MethodDescriptor(
+    name='Set',
+    full_name='account.members.Members.Set',
+    index=0,
+    containing_service=None,
+    input_type=_SETREQUEST,
+    output_type=google_dot_protobuf_dot_empty__pb2._EMPTY,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='Get',
+    full_name='account.members.Members.Get',
+    index=1,
+    containing_service=None,
+    input_type=_GETREQUEST,
+    output_type=_GETRESPONSE,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='Remove',
+    full_name='account.members.Members.Remove',
+    index=2,
+    containing_service=None,
+    input_type=_REMOVEREQUEST,
+    output_type=google_dot_protobuf_dot_empty__pb2._EMPTY,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='ListMembers',
+    full_name='account.members.Members.ListMembers',
+    index=3,
+    containing_service=None,
+    input_type=_LISTMEMBERSREQUEST,
+    output_type=_LISTMEMBERSRESPONSE,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='ListOrganizations',
+    full_name='account.members.Members.ListOrganizations',
+    index=4,
+    containing_service=None,
+    input_type=_LISTORGANIZATIONSREQUEST,
+    output_type=_LISTORGANIZATIONSRESPONSE,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+])
+_sym_db.RegisterServiceDescriptor(_MEMBERS)
+
+DESCRIPTOR.services_by_name['Members'] = _MEMBERS
+
+# @@protoc_insertion_point(module_scope)
diff --git a/perxis/members/members_pb2_grpc.py b/perxis/members/members_pb2_grpc.py
new file mode 100644
index 0000000..bf86ff4
--- /dev/null
+++ b/perxis/members/members_pb2_grpc.py
@@ -0,0 +1,199 @@
+# Generated by the gRPC Python protocol compiler plugin. DO NOT EDIT!
+"""Client and server classes corresponding to protobuf-defined services."""
+import grpc
+
+from google.protobuf import empty_pb2 as google_dot_protobuf_dot_empty__pb2
+from members import members_pb2 as members_dot_members__pb2
+
+
+class MembersStub(object):
+    """Missing associated documentation comment in .proto file."""
+
+    def __init__(self, channel):
+        """Constructor.
+
+        Args:
+            channel: A grpc.Channel.
+        """
+        self.Set = channel.unary_unary(
+                '/account.members.Members/Set',
+                request_serializer=members_dot_members__pb2.SetRequest.SerializeToString,
+                response_deserializer=google_dot_protobuf_dot_empty__pb2.Empty.FromString,
+                )
+        self.Get = channel.unary_unary(
+                '/account.members.Members/Get',
+                request_serializer=members_dot_members__pb2.GetRequest.SerializeToString,
+                response_deserializer=members_dot_members__pb2.GetResponse.FromString,
+                )
+        self.Remove = channel.unary_unary(
+                '/account.members.Members/Remove',
+                request_serializer=members_dot_members__pb2.RemoveRequest.SerializeToString,
+                response_deserializer=google_dot_protobuf_dot_empty__pb2.Empty.FromString,
+                )
+        self.ListMembers = channel.unary_unary(
+                '/account.members.Members/ListMembers',
+                request_serializer=members_dot_members__pb2.ListMembersRequest.SerializeToString,
+                response_deserializer=members_dot_members__pb2.ListMembersResponse.FromString,
+                )
+        self.ListOrganizations = channel.unary_unary(
+                '/account.members.Members/ListOrganizations',
+                request_serializer=members_dot_members__pb2.ListOrganizationsRequest.SerializeToString,
+                response_deserializer=members_dot_members__pb2.ListOrganizationsResponse.FromString,
+                )
+
+
+class MembersServicer(object):
+    """Missing associated documentation comment in .proto file."""
+
+    def Set(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        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."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def Remove(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def ListMembers(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def ListOrganizations(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+
+def add_MembersServicer_to_server(servicer, server):
+    rpc_method_handlers = {
+            'Set': grpc.unary_unary_rpc_method_handler(
+                    servicer.Set,
+                    request_deserializer=members_dot_members__pb2.SetRequest.FromString,
+                    response_serializer=google_dot_protobuf_dot_empty__pb2.Empty.SerializeToString,
+            ),
+            'Get': grpc.unary_unary_rpc_method_handler(
+                    servicer.Get,
+                    request_deserializer=members_dot_members__pb2.GetRequest.FromString,
+                    response_serializer=members_dot_members__pb2.GetResponse.SerializeToString,
+            ),
+            'Remove': grpc.unary_unary_rpc_method_handler(
+                    servicer.Remove,
+                    request_deserializer=members_dot_members__pb2.RemoveRequest.FromString,
+                    response_serializer=google_dot_protobuf_dot_empty__pb2.Empty.SerializeToString,
+            ),
+            'ListMembers': grpc.unary_unary_rpc_method_handler(
+                    servicer.ListMembers,
+                    request_deserializer=members_dot_members__pb2.ListMembersRequest.FromString,
+                    response_serializer=members_dot_members__pb2.ListMembersResponse.SerializeToString,
+            ),
+            'ListOrganizations': grpc.unary_unary_rpc_method_handler(
+                    servicer.ListOrganizations,
+                    request_deserializer=members_dot_members__pb2.ListOrganizationsRequest.FromString,
+                    response_serializer=members_dot_members__pb2.ListOrganizationsResponse.SerializeToString,
+            ),
+    }
+    generic_handler = grpc.method_handlers_generic_handler(
+            'account.members.Members', rpc_method_handlers)
+    server.add_generic_rpc_handlers((generic_handler,))
+
+
+ # This class is part of an EXPERIMENTAL API.
+class Members(object):
+    """Missing associated documentation comment in .proto file."""
+
+    @staticmethod
+    def Set(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/account.members.Members/Set',
+            members_dot_members__pb2.SetRequest.SerializeToString,
+            google_dot_protobuf_dot_empty__pb2.Empty.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def Get(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/account.members.Members/Get',
+            members_dot_members__pb2.GetRequest.SerializeToString,
+            members_dot_members__pb2.GetResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def Remove(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/account.members.Members/Remove',
+            members_dot_members__pb2.RemoveRequest.SerializeToString,
+            google_dot_protobuf_dot_empty__pb2.Empty.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def ListMembers(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/account.members.Members/ListMembers',
+            members_dot_members__pb2.ListMembersRequest.SerializeToString,
+            members_dot_members__pb2.ListMembersResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def ListOrganizations(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/account.members.Members/ListOrganizations',
+            members_dot_members__pb2.ListOrganizationsRequest.SerializeToString,
+            members_dot_members__pb2.ListOrganizationsResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
diff --git a/perxis/organizations/__init__.py b/perxis/organizations/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/perxis/organizations/organizations_pb2.py b/perxis/organizations/organizations_pb2.py
new file mode 100644
index 0000000..714a957
--- /dev/null
+++ b/perxis/organizations/organizations_pb2.py
@@ -0,0 +1,589 @@
+# -*- coding: utf-8 -*-
+# Generated by the protocol buffer compiler.  DO NOT EDIT!
+# source: organizations/organizations.proto
+"""Generated protocol buffer code."""
+from google.protobuf import descriptor as _descriptor
+from google.protobuf import message as _message
+from google.protobuf import reflection as _reflection
+from google.protobuf import symbol_database as _symbol_database
+# @@protoc_insertion_point(imports)
+
+_sym_db = _symbol_database.Default()
+
+
+from google.protobuf import empty_pb2 as google_dot_protobuf_dot_empty__pb2
+from common import common_pb2 as common_dot_common__pb2
+
+
+DESCRIPTOR = _descriptor.FileDescriptor(
+  name='organizations/organizations.proto',
+  package='account.organizations',
+  syntax='proto3',
+  serialized_options=b'Z<github.com/perxteam/perxis/proto/organizations;organizations',
+  create_key=_descriptor._internal_create_key,
+  serialized_pb=b'\n!organizations/organizations.proto\x12\x15\x61\x63\x63ount.organizations\x1a\x1bgoogle/protobuf/empty.proto\x1a\x13\x63ommon/common.proto\"O\n\x0cOrganization\x12\n\n\x02id\x18\x01 \x01(\t\x12\x0c\n\x04name\x18\x02 \x01(\t\x12\x13\n\x0b\x64\x65scription\x18\x03 \x01(\t\x12\x10\n\x08logo_url\x18\x05 \x01(\t\"V\n\rCreateRequest\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x13\n\x0b\x64\x65scription\x18\x02 \x01(\t\x12\x10\n\x08logo_url\x18\x03 \x01(\t\x12\x10\n\x08owner_id\x18\x04 \x01(\t\"B\n\x0e\x43reateResponse\x12\x30\n\x03org\x18\x01 \x01(\x0b\x32#.account.organizations.Organization\"\x1c\n\nGetRequest\x12\x0e\n\x06org_id\x18\x01 \x01(\t\"?\n\x0bGetResponse\x12\x30\n\x03org\x18\x01 \x01(\x0b\x32#.account.organizations.Organization\"T\n\rUpdateRequest\x12\x0e\n\x06org_id\x18\x01 \x01(\t\x12\x0c\n\x04name\x18\x02 \x01(\t\x12\x13\n\x0b\x64\x65scription\x18\x03 \x01(\t\x12\x10\n\x08logo_url\x18\x04 \x01(\t\"\x1f\n\rDeleteRequest\x12\x0e\n\x06org_id\x18\x01 \x01(\t\"$\n\x06\x46ilter\x12\x0b\n\x03ids\x18\x03 \x03(\t\x12\r\n\x05names\x18\x04 \x03(\t\"_\n\x0b\x46indRequest\x12-\n\x06\x66ilter\x18\x01 \x01(\x0b\x32\x1d.account.organizations.Filter\x12!\n\x04opts\x18\x02 \x01(\x0b\x32\x13.common.FindOptions\"P\n\x0c\x46indResponse\x12\x31\n\x04orgs\x18\x01 \x03(\x0b\x32#.account.organizations.Organization\x12\r\n\x05total\x18\x02 \x01(\x03\x32\x9f\x03\n\rOrganizations\x12W\n\x06\x43reate\x12$.account.organizations.CreateRequest\x1a%.account.organizations.CreateResponse\"\x00\x12N\n\x03Get\x12!.account.organizations.GetRequest\x1a\".account.organizations.GetResponse\"\x00\x12H\n\x06\x44\x65lete\x12$.account.organizations.DeleteRequest\x1a\x16.google.protobuf.Empty\"\x00\x12Q\n\x04\x46ind\x12\".account.organizations.FindRequest\x1a#.account.organizations.FindResponse\"\x00\x12H\n\x06Update\x12$.account.organizations.UpdateRequest\x1a\x16.google.protobuf.Empty\"\x00\x42>Z<github.com/perxteam/perxis/proto/organizations;organizationsb\x06proto3'
+  ,
+  dependencies=[google_dot_protobuf_dot_empty__pb2.DESCRIPTOR,common_dot_common__pb2.DESCRIPTOR,])
+
+
+
+
+_ORGANIZATION = _descriptor.Descriptor(
+  name='Organization',
+  full_name='account.organizations.Organization',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='id', full_name='account.organizations.Organization.id', index=0,
+      number=1, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='name', full_name='account.organizations.Organization.name', index=1,
+      number=2, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='description', full_name='account.organizations.Organization.description', index=2,
+      number=3, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='logo_url', full_name='account.organizations.Organization.logo_url', index=3,
+      number=5, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=110,
+  serialized_end=189,
+)
+
+
+_CREATEREQUEST = _descriptor.Descriptor(
+  name='CreateRequest',
+  full_name='account.organizations.CreateRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='name', full_name='account.organizations.CreateRequest.name', index=0,
+      number=1, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='description', full_name='account.organizations.CreateRequest.description', index=1,
+      number=2, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='logo_url', full_name='account.organizations.CreateRequest.logo_url', index=2,
+      number=3, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='owner_id', full_name='account.organizations.CreateRequest.owner_id', index=3,
+      number=4, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=191,
+  serialized_end=277,
+)
+
+
+_CREATERESPONSE = _descriptor.Descriptor(
+  name='CreateResponse',
+  full_name='account.organizations.CreateResponse',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='org', full_name='account.organizations.CreateResponse.org', index=0,
+      number=1, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=279,
+  serialized_end=345,
+)
+
+
+_GETREQUEST = _descriptor.Descriptor(
+  name='GetRequest',
+  full_name='account.organizations.GetRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='org_id', full_name='account.organizations.GetRequest.org_id', index=0,
+      number=1, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=347,
+  serialized_end=375,
+)
+
+
+_GETRESPONSE = _descriptor.Descriptor(
+  name='GetResponse',
+  full_name='account.organizations.GetResponse',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='org', full_name='account.organizations.GetResponse.org', index=0,
+      number=1, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=377,
+  serialized_end=440,
+)
+
+
+_UPDATEREQUEST = _descriptor.Descriptor(
+  name='UpdateRequest',
+  full_name='account.organizations.UpdateRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='org_id', full_name='account.organizations.UpdateRequest.org_id', index=0,
+      number=1, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='name', full_name='account.organizations.UpdateRequest.name', index=1,
+      number=2, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='description', full_name='account.organizations.UpdateRequest.description', index=2,
+      number=3, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='logo_url', full_name='account.organizations.UpdateRequest.logo_url', index=3,
+      number=4, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=442,
+  serialized_end=526,
+)
+
+
+_DELETEREQUEST = _descriptor.Descriptor(
+  name='DeleteRequest',
+  full_name='account.organizations.DeleteRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='org_id', full_name='account.organizations.DeleteRequest.org_id', index=0,
+      number=1, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=528,
+  serialized_end=559,
+)
+
+
+_FILTER = _descriptor.Descriptor(
+  name='Filter',
+  full_name='account.organizations.Filter',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='ids', full_name='account.organizations.Filter.ids', index=0,
+      number=3, type=9, cpp_type=9, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='names', full_name='account.organizations.Filter.names', index=1,
+      number=4, type=9, cpp_type=9, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=561,
+  serialized_end=597,
+)
+
+
+_FINDREQUEST = _descriptor.Descriptor(
+  name='FindRequest',
+  full_name='account.organizations.FindRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='filter', full_name='account.organizations.FindRequest.filter', index=0,
+      number=1, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='opts', full_name='account.organizations.FindRequest.opts', index=1,
+      number=2, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=599,
+  serialized_end=694,
+)
+
+
+_FINDRESPONSE = _descriptor.Descriptor(
+  name='FindResponse',
+  full_name='account.organizations.FindResponse',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='orgs', full_name='account.organizations.FindResponse.orgs', index=0,
+      number=1, type=11, cpp_type=10, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='total', full_name='account.organizations.FindResponse.total', index=1,
+      number=2, type=3, cpp_type=2, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=696,
+  serialized_end=776,
+)
+
+_CREATERESPONSE.fields_by_name['org'].message_type = _ORGANIZATION
+_GETRESPONSE.fields_by_name['org'].message_type = _ORGANIZATION
+_FINDREQUEST.fields_by_name['filter'].message_type = _FILTER
+_FINDREQUEST.fields_by_name['opts'].message_type = common_dot_common__pb2._FINDOPTIONS
+_FINDRESPONSE.fields_by_name['orgs'].message_type = _ORGANIZATION
+DESCRIPTOR.message_types_by_name['Organization'] = _ORGANIZATION
+DESCRIPTOR.message_types_by_name['CreateRequest'] = _CREATEREQUEST
+DESCRIPTOR.message_types_by_name['CreateResponse'] = _CREATERESPONSE
+DESCRIPTOR.message_types_by_name['GetRequest'] = _GETREQUEST
+DESCRIPTOR.message_types_by_name['GetResponse'] = _GETRESPONSE
+DESCRIPTOR.message_types_by_name['UpdateRequest'] = _UPDATEREQUEST
+DESCRIPTOR.message_types_by_name['DeleteRequest'] = _DELETEREQUEST
+DESCRIPTOR.message_types_by_name['Filter'] = _FILTER
+DESCRIPTOR.message_types_by_name['FindRequest'] = _FINDREQUEST
+DESCRIPTOR.message_types_by_name['FindResponse'] = _FINDRESPONSE
+_sym_db.RegisterFileDescriptor(DESCRIPTOR)
+
+Organization = _reflection.GeneratedProtocolMessageType('Organization', (_message.Message,), {
+  'DESCRIPTOR' : _ORGANIZATION,
+  '__module__' : 'organizations.organizations_pb2'
+  # @@protoc_insertion_point(class_scope:account.organizations.Organization)
+  })
+_sym_db.RegisterMessage(Organization)
+
+CreateRequest = _reflection.GeneratedProtocolMessageType('CreateRequest', (_message.Message,), {
+  'DESCRIPTOR' : _CREATEREQUEST,
+  '__module__' : 'organizations.organizations_pb2'
+  # @@protoc_insertion_point(class_scope:account.organizations.CreateRequest)
+  })
+_sym_db.RegisterMessage(CreateRequest)
+
+CreateResponse = _reflection.GeneratedProtocolMessageType('CreateResponse', (_message.Message,), {
+  'DESCRIPTOR' : _CREATERESPONSE,
+  '__module__' : 'organizations.organizations_pb2'
+  # @@protoc_insertion_point(class_scope:account.organizations.CreateResponse)
+  })
+_sym_db.RegisterMessage(CreateResponse)
+
+GetRequest = _reflection.GeneratedProtocolMessageType('GetRequest', (_message.Message,), {
+  'DESCRIPTOR' : _GETREQUEST,
+  '__module__' : 'organizations.organizations_pb2'
+  # @@protoc_insertion_point(class_scope:account.organizations.GetRequest)
+  })
+_sym_db.RegisterMessage(GetRequest)
+
+GetResponse = _reflection.GeneratedProtocolMessageType('GetResponse', (_message.Message,), {
+  'DESCRIPTOR' : _GETRESPONSE,
+  '__module__' : 'organizations.organizations_pb2'
+  # @@protoc_insertion_point(class_scope:account.organizations.GetResponse)
+  })
+_sym_db.RegisterMessage(GetResponse)
+
+UpdateRequest = _reflection.GeneratedProtocolMessageType('UpdateRequest', (_message.Message,), {
+  'DESCRIPTOR' : _UPDATEREQUEST,
+  '__module__' : 'organizations.organizations_pb2'
+  # @@protoc_insertion_point(class_scope:account.organizations.UpdateRequest)
+  })
+_sym_db.RegisterMessage(UpdateRequest)
+
+DeleteRequest = _reflection.GeneratedProtocolMessageType('DeleteRequest', (_message.Message,), {
+  'DESCRIPTOR' : _DELETEREQUEST,
+  '__module__' : 'organizations.organizations_pb2'
+  # @@protoc_insertion_point(class_scope:account.organizations.DeleteRequest)
+  })
+_sym_db.RegisterMessage(DeleteRequest)
+
+Filter = _reflection.GeneratedProtocolMessageType('Filter', (_message.Message,), {
+  'DESCRIPTOR' : _FILTER,
+  '__module__' : 'organizations.organizations_pb2'
+  # @@protoc_insertion_point(class_scope:account.organizations.Filter)
+  })
+_sym_db.RegisterMessage(Filter)
+
+FindRequest = _reflection.GeneratedProtocolMessageType('FindRequest', (_message.Message,), {
+  'DESCRIPTOR' : _FINDREQUEST,
+  '__module__' : 'organizations.organizations_pb2'
+  # @@protoc_insertion_point(class_scope:account.organizations.FindRequest)
+  })
+_sym_db.RegisterMessage(FindRequest)
+
+FindResponse = _reflection.GeneratedProtocolMessageType('FindResponse', (_message.Message,), {
+  'DESCRIPTOR' : _FINDRESPONSE,
+  '__module__' : 'organizations.organizations_pb2'
+  # @@protoc_insertion_point(class_scope:account.organizations.FindResponse)
+  })
+_sym_db.RegisterMessage(FindResponse)
+
+
+DESCRIPTOR._options = None
+
+_ORGANIZATIONS = _descriptor.ServiceDescriptor(
+  name='Organizations',
+  full_name='account.organizations.Organizations',
+  file=DESCRIPTOR,
+  index=0,
+  serialized_options=None,
+  create_key=_descriptor._internal_create_key,
+  serialized_start=779,
+  serialized_end=1194,
+  methods=[
+  _descriptor.MethodDescriptor(
+    name='Create',
+    full_name='account.organizations.Organizations.Create',
+    index=0,
+    containing_service=None,
+    input_type=_CREATEREQUEST,
+    output_type=_CREATERESPONSE,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='Get',
+    full_name='account.organizations.Organizations.Get',
+    index=1,
+    containing_service=None,
+    input_type=_GETREQUEST,
+    output_type=_GETRESPONSE,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='Delete',
+    full_name='account.organizations.Organizations.Delete',
+    index=2,
+    containing_service=None,
+    input_type=_DELETEREQUEST,
+    output_type=google_dot_protobuf_dot_empty__pb2._EMPTY,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='Find',
+    full_name='account.organizations.Organizations.Find',
+    index=3,
+    containing_service=None,
+    input_type=_FINDREQUEST,
+    output_type=_FINDRESPONSE,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='Update',
+    full_name='account.organizations.Organizations.Update',
+    index=4,
+    containing_service=None,
+    input_type=_UPDATEREQUEST,
+    output_type=google_dot_protobuf_dot_empty__pb2._EMPTY,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+])
+_sym_db.RegisterServiceDescriptor(_ORGANIZATIONS)
+
+DESCRIPTOR.services_by_name['Organizations'] = _ORGANIZATIONS
+
+# @@protoc_insertion_point(module_scope)
diff --git a/perxis/organizations/organizations_pb2_grpc.py b/perxis/organizations/organizations_pb2_grpc.py
new file mode 100644
index 0000000..24616c5
--- /dev/null
+++ b/perxis/organizations/organizations_pb2_grpc.py
@@ -0,0 +1,199 @@
+# Generated by the gRPC Python protocol compiler plugin. DO NOT EDIT!
+"""Client and server classes corresponding to protobuf-defined services."""
+import grpc
+
+from google.protobuf import empty_pb2 as google_dot_protobuf_dot_empty__pb2
+from organizations import organizations_pb2 as organizations_dot_organizations__pb2
+
+
+class OrganizationsStub(object):
+    """Missing associated documentation comment in .proto file."""
+
+    def __init__(self, channel):
+        """Constructor.
+
+        Args:
+            channel: A grpc.Channel.
+        """
+        self.Create = channel.unary_unary(
+                '/account.organizations.Organizations/Create',
+                request_serializer=organizations_dot_organizations__pb2.CreateRequest.SerializeToString,
+                response_deserializer=organizations_dot_organizations__pb2.CreateResponse.FromString,
+                )
+        self.Get = channel.unary_unary(
+                '/account.organizations.Organizations/Get',
+                request_serializer=organizations_dot_organizations__pb2.GetRequest.SerializeToString,
+                response_deserializer=organizations_dot_organizations__pb2.GetResponse.FromString,
+                )
+        self.Delete = channel.unary_unary(
+                '/account.organizations.Organizations/Delete',
+                request_serializer=organizations_dot_organizations__pb2.DeleteRequest.SerializeToString,
+                response_deserializer=google_dot_protobuf_dot_empty__pb2.Empty.FromString,
+                )
+        self.Find = channel.unary_unary(
+                '/account.organizations.Organizations/Find',
+                request_serializer=organizations_dot_organizations__pb2.FindRequest.SerializeToString,
+                response_deserializer=organizations_dot_organizations__pb2.FindResponse.FromString,
+                )
+        self.Update = channel.unary_unary(
+                '/account.organizations.Organizations/Update',
+                request_serializer=organizations_dot_organizations__pb2.UpdateRequest.SerializeToString,
+                response_deserializer=google_dot_protobuf_dot_empty__pb2.Empty.FromString,
+                )
+
+
+class OrganizationsServicer(object):
+    """Missing associated documentation comment in .proto file."""
+
+    def Create(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        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."""
+        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."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def Find(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def Update(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+
+def add_OrganizationsServicer_to_server(servicer, server):
+    rpc_method_handlers = {
+            'Create': grpc.unary_unary_rpc_method_handler(
+                    servicer.Create,
+                    request_deserializer=organizations_dot_organizations__pb2.CreateRequest.FromString,
+                    response_serializer=organizations_dot_organizations__pb2.CreateResponse.SerializeToString,
+            ),
+            'Get': grpc.unary_unary_rpc_method_handler(
+                    servicer.Get,
+                    request_deserializer=organizations_dot_organizations__pb2.GetRequest.FromString,
+                    response_serializer=organizations_dot_organizations__pb2.GetResponse.SerializeToString,
+            ),
+            'Delete': grpc.unary_unary_rpc_method_handler(
+                    servicer.Delete,
+                    request_deserializer=organizations_dot_organizations__pb2.DeleteRequest.FromString,
+                    response_serializer=google_dot_protobuf_dot_empty__pb2.Empty.SerializeToString,
+            ),
+            'Find': grpc.unary_unary_rpc_method_handler(
+                    servicer.Find,
+                    request_deserializer=organizations_dot_organizations__pb2.FindRequest.FromString,
+                    response_serializer=organizations_dot_organizations__pb2.FindResponse.SerializeToString,
+            ),
+            'Update': grpc.unary_unary_rpc_method_handler(
+                    servicer.Update,
+                    request_deserializer=organizations_dot_organizations__pb2.UpdateRequest.FromString,
+                    response_serializer=google_dot_protobuf_dot_empty__pb2.Empty.SerializeToString,
+            ),
+    }
+    generic_handler = grpc.method_handlers_generic_handler(
+            'account.organizations.Organizations', rpc_method_handlers)
+    server.add_generic_rpc_handlers((generic_handler,))
+
+
+ # This class is part of an EXPERIMENTAL API.
+class Organizations(object):
+    """Missing associated documentation comment in .proto file."""
+
+    @staticmethod
+    def Create(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/account.organizations.Organizations/Create',
+            organizations_dot_organizations__pb2.CreateRequest.SerializeToString,
+            organizations_dot_organizations__pb2.CreateResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def Get(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/account.organizations.Organizations/Get',
+            organizations_dot_organizations__pb2.GetRequest.SerializeToString,
+            organizations_dot_organizations__pb2.GetResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def Delete(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/account.organizations.Organizations/Delete',
+            organizations_dot_organizations__pb2.DeleteRequest.SerializeToString,
+            google_dot_protobuf_dot_empty__pb2.Empty.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def Find(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/account.organizations.Organizations/Find',
+            organizations_dot_organizations__pb2.FindRequest.SerializeToString,
+            organizations_dot_organizations__pb2.FindResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def Update(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/account.organizations.Organizations/Update',
+            organizations_dot_organizations__pb2.UpdateRequest.SerializeToString,
+            google_dot_protobuf_dot_empty__pb2.Empty.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
diff --git a/perxis/spaces/__init__.py b/perxis/spaces/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/perxis/spaces/spaces_pb2.py b/perxis/spaces/spaces_pb2.py
new file mode 100644
index 0000000..7d3f9bf
--- /dev/null
+++ b/perxis/spaces/spaces_pb2.py
@@ -0,0 +1,643 @@
+# -*- coding: utf-8 -*-
+# Generated by the protocol buffer compiler.  DO NOT EDIT!
+# source: spaces/spaces.proto
+"""Generated protocol buffer code."""
+from google.protobuf.internal import enum_type_wrapper
+from google.protobuf import descriptor as _descriptor
+from google.protobuf import message as _message
+from google.protobuf import reflection as _reflection
+from google.protobuf import symbol_database as _symbol_database
+# @@protoc_insertion_point(imports)
+
+_sym_db = _symbol_database.Default()
+
+
+from google.protobuf import empty_pb2 as google_dot_protobuf_dot_empty__pb2
+
+
+DESCRIPTOR = _descriptor.FileDescriptor(
+  name='spaces/spaces.proto',
+  package='content.spaces',
+  syntax='proto3',
+  serialized_options=b'Z.github.com/perxteam/perxis/proto/spaces;spaces',
+  create_key=_descriptor._internal_create_key,
+  serialized_pb=b'\n\x13spaces/spaces.proto\x12\x0e\x63ontent.spaces\x1a\x1bgoogle/protobuf/empty.proto\"\x9d\x01\n\x05Space\x12\n\n\x02id\x18\x01 \x01(\t\x12\x17\n\x0forganization_id\x18\x02 \x01(\t\x12\x0c\n\x04name\x18\x03 \x01(\t\x12\x13\n\x0b\x64\x65scription\x18\x04 \x01(\t\x12$\n\x05state\x18\x05 \x01(\x0e\x32\x15.content.spaces.State\x12&\n\x06\x63onfig\x18\n \x01(\x0b\x32\x16.content.spaces.Config\"\x1a\n\x06\x43onfig\x12\x10\n\x08\x66\x65\x61tures\x18\x01 \x03(\t\"j\n\rCreateRequest\x12\x0e\n\x06org_id\x18\x01 \x01(\t\x12\x0c\n\x04name\x18\x02 \x01(\t\x12\x13\n\x0b\x64\x65scription\x18\x03 \x01(\t\x12&\n\x06\x63onfig\x18\x05 \x01(\x0b\x32\x16.content.spaces.Config\"6\n\x0e\x43reateResponse\x12$\n\x05space\x18\x01 \x01(\x0b\x32\x15.content.spaces.Space\"\x1e\n\nGetRequest\x12\x10\n\x08space_id\x18\x01 \x01(\t\"3\n\x0bGetResponse\x12$\n\x05space\x18\x01 \x01(\x0b\x32\x15.content.spaces.Space\"\x1d\n\x0bListRequest\x12\x0e\n\x06org_id\x18\x01 \x01(\t\"5\n\x0cListResponse\x12%\n\x06spaces\x18\x01 \x03(\x0b\x32\x15.content.spaces.Space\"l\n\rUpdateRequest\x12\x10\n\x08space_id\x18\x01 \x01(\t\x12\x0c\n\x04name\x18\x02 \x01(\t\x12\x13\n\x0b\x64\x65scription\x18\x03 \x01(\t\x12&\n\x06\x63onfig\x18\x05 \x01(\x0b\x32\x16.content.spaces.Config\"!\n\rDeleteRequest\x12\x10\n\x08space_id\x18\x01 \x01(\t*e\n\x05State\x12\x0b\n\x07UNKNOWN\x10\x00\x12\x07\n\x03NEW\x10\x01\x12\t\n\x05READY\x10\x02\x12\r\n\tPREPARING\x10\x03\x12\x0f\n\x0bMAINTENANCE\x10\x04\x12\r\n\tMIGRATION\x10\x05\x12\x0c\n\x08\x44\x45LETING\x10\x06\x32\xe0\x02\n\x06Spaces\x12I\n\x06\x43reate\x12\x1d.content.spaces.CreateRequest\x1a\x1e.content.spaces.CreateResponse\"\x00\x12@\n\x03Get\x12\x1a.content.spaces.GetRequest\x1a\x1b.content.spaces.GetResponse\"\x00\x12\x43\n\x04List\x12\x1b.content.spaces.ListRequest\x1a\x1c.content.spaces.ListResponse\"\x00\x12\x41\n\x06Update\x12\x1d.content.spaces.UpdateRequest\x1a\x16.google.protobuf.Empty\"\x00\x12\x41\n\x06\x44\x65lete\x12\x1d.content.spaces.DeleteRequest\x1a\x16.google.protobuf.Empty\"\x00\x42\x30Z.github.com/perxteam/perxis/proto/spaces;spacesb\x06proto3'
+  ,
+  dependencies=[google_dot_protobuf_dot_empty__pb2.DESCRIPTOR,])
+
+_STATE = _descriptor.EnumDescriptor(
+  name='State',
+  full_name='content.spaces.State',
+  filename=None,
+  file=DESCRIPTOR,
+  create_key=_descriptor._internal_create_key,
+  values=[
+    _descriptor.EnumValueDescriptor(
+      name='UNKNOWN', index=0, number=0,
+      serialized_options=None,
+      type=None,
+      create_key=_descriptor._internal_create_key),
+    _descriptor.EnumValueDescriptor(
+      name='NEW', index=1, number=1,
+      serialized_options=None,
+      type=None,
+      create_key=_descriptor._internal_create_key),
+    _descriptor.EnumValueDescriptor(
+      name='READY', index=2, number=2,
+      serialized_options=None,
+      type=None,
+      create_key=_descriptor._internal_create_key),
+    _descriptor.EnumValueDescriptor(
+      name='PREPARING', index=3, number=3,
+      serialized_options=None,
+      type=None,
+      create_key=_descriptor._internal_create_key),
+    _descriptor.EnumValueDescriptor(
+      name='MAINTENANCE', index=4, number=4,
+      serialized_options=None,
+      type=None,
+      create_key=_descriptor._internal_create_key),
+    _descriptor.EnumValueDescriptor(
+      name='MIGRATION', index=5, number=5,
+      serialized_options=None,
+      type=None,
+      create_key=_descriptor._internal_create_key),
+    _descriptor.EnumValueDescriptor(
+      name='DELETING', index=6, number=6,
+      serialized_options=None,
+      type=None,
+      create_key=_descriptor._internal_create_key),
+  ],
+  containing_type=None,
+  serialized_options=None,
+  serialized_start=736,
+  serialized_end=837,
+)
+_sym_db.RegisterEnumDescriptor(_STATE)
+
+State = enum_type_wrapper.EnumTypeWrapper(_STATE)
+UNKNOWN = 0
+NEW = 1
+READY = 2
+PREPARING = 3
+MAINTENANCE = 4
+MIGRATION = 5
+DELETING = 6
+
+
+
+_SPACE = _descriptor.Descriptor(
+  name='Space',
+  full_name='content.spaces.Space',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='id', full_name='content.spaces.Space.id', index=0,
+      number=1, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='organization_id', full_name='content.spaces.Space.organization_id', index=1,
+      number=2, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='name', full_name='content.spaces.Space.name', index=2,
+      number=3, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='description', full_name='content.spaces.Space.description', index=3,
+      number=4, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='state', full_name='content.spaces.Space.state', index=4,
+      number=5, type=14, cpp_type=8, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='config', full_name='content.spaces.Space.config', index=5,
+      number=10, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=69,
+  serialized_end=226,
+)
+
+
+_CONFIG = _descriptor.Descriptor(
+  name='Config',
+  full_name='content.spaces.Config',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='features', full_name='content.spaces.Config.features', index=0,
+      number=1, type=9, cpp_type=9, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=228,
+  serialized_end=254,
+)
+
+
+_CREATEREQUEST = _descriptor.Descriptor(
+  name='CreateRequest',
+  full_name='content.spaces.CreateRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='org_id', full_name='content.spaces.CreateRequest.org_id', index=0,
+      number=1, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='name', full_name='content.spaces.CreateRequest.name', index=1,
+      number=2, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='description', full_name='content.spaces.CreateRequest.description', index=2,
+      number=3, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='config', full_name='content.spaces.CreateRequest.config', index=3,
+      number=5, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=256,
+  serialized_end=362,
+)
+
+
+_CREATERESPONSE = _descriptor.Descriptor(
+  name='CreateResponse',
+  full_name='content.spaces.CreateResponse',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='space', full_name='content.spaces.CreateResponse.space', index=0,
+      number=1, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=364,
+  serialized_end=418,
+)
+
+
+_GETREQUEST = _descriptor.Descriptor(
+  name='GetRequest',
+  full_name='content.spaces.GetRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='space_id', full_name='content.spaces.GetRequest.space_id', index=0,
+      number=1, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=420,
+  serialized_end=450,
+)
+
+
+_GETRESPONSE = _descriptor.Descriptor(
+  name='GetResponse',
+  full_name='content.spaces.GetResponse',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='space', full_name='content.spaces.GetResponse.space', index=0,
+      number=1, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=452,
+  serialized_end=503,
+)
+
+
+_LISTREQUEST = _descriptor.Descriptor(
+  name='ListRequest',
+  full_name='content.spaces.ListRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='org_id', full_name='content.spaces.ListRequest.org_id', index=0,
+      number=1, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=505,
+  serialized_end=534,
+)
+
+
+_LISTRESPONSE = _descriptor.Descriptor(
+  name='ListResponse',
+  full_name='content.spaces.ListResponse',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='spaces', full_name='content.spaces.ListResponse.spaces', index=0,
+      number=1, type=11, cpp_type=10, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=536,
+  serialized_end=589,
+)
+
+
+_UPDATEREQUEST = _descriptor.Descriptor(
+  name='UpdateRequest',
+  full_name='content.spaces.UpdateRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='space_id', full_name='content.spaces.UpdateRequest.space_id', index=0,
+      number=1, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='name', full_name='content.spaces.UpdateRequest.name', index=1,
+      number=2, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='description', full_name='content.spaces.UpdateRequest.description', index=2,
+      number=3, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='config', full_name='content.spaces.UpdateRequest.config', index=3,
+      number=5, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=591,
+  serialized_end=699,
+)
+
+
+_DELETEREQUEST = _descriptor.Descriptor(
+  name='DeleteRequest',
+  full_name='content.spaces.DeleteRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='space_id', full_name='content.spaces.DeleteRequest.space_id', index=0,
+      number=1, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=701,
+  serialized_end=734,
+)
+
+_SPACE.fields_by_name['state'].enum_type = _STATE
+_SPACE.fields_by_name['config'].message_type = _CONFIG
+_CREATEREQUEST.fields_by_name['config'].message_type = _CONFIG
+_CREATERESPONSE.fields_by_name['space'].message_type = _SPACE
+_GETRESPONSE.fields_by_name['space'].message_type = _SPACE
+_LISTRESPONSE.fields_by_name['spaces'].message_type = _SPACE
+_UPDATEREQUEST.fields_by_name['config'].message_type = _CONFIG
+DESCRIPTOR.message_types_by_name['Space'] = _SPACE
+DESCRIPTOR.message_types_by_name['Config'] = _CONFIG
+DESCRIPTOR.message_types_by_name['CreateRequest'] = _CREATEREQUEST
+DESCRIPTOR.message_types_by_name['CreateResponse'] = _CREATERESPONSE
+DESCRIPTOR.message_types_by_name['GetRequest'] = _GETREQUEST
+DESCRIPTOR.message_types_by_name['GetResponse'] = _GETRESPONSE
+DESCRIPTOR.message_types_by_name['ListRequest'] = _LISTREQUEST
+DESCRIPTOR.message_types_by_name['ListResponse'] = _LISTRESPONSE
+DESCRIPTOR.message_types_by_name['UpdateRequest'] = _UPDATEREQUEST
+DESCRIPTOR.message_types_by_name['DeleteRequest'] = _DELETEREQUEST
+DESCRIPTOR.enum_types_by_name['State'] = _STATE
+_sym_db.RegisterFileDescriptor(DESCRIPTOR)
+
+Space = _reflection.GeneratedProtocolMessageType('Space', (_message.Message,), {
+  'DESCRIPTOR' : _SPACE,
+  '__module__' : 'spaces.spaces_pb2'
+  # @@protoc_insertion_point(class_scope:content.spaces.Space)
+  })
+_sym_db.RegisterMessage(Space)
+
+Config = _reflection.GeneratedProtocolMessageType('Config', (_message.Message,), {
+  'DESCRIPTOR' : _CONFIG,
+  '__module__' : 'spaces.spaces_pb2'
+  # @@protoc_insertion_point(class_scope:content.spaces.Config)
+  })
+_sym_db.RegisterMessage(Config)
+
+CreateRequest = _reflection.GeneratedProtocolMessageType('CreateRequest', (_message.Message,), {
+  'DESCRIPTOR' : _CREATEREQUEST,
+  '__module__' : 'spaces.spaces_pb2'
+  # @@protoc_insertion_point(class_scope:content.spaces.CreateRequest)
+  })
+_sym_db.RegisterMessage(CreateRequest)
+
+CreateResponse = _reflection.GeneratedProtocolMessageType('CreateResponse', (_message.Message,), {
+  'DESCRIPTOR' : _CREATERESPONSE,
+  '__module__' : 'spaces.spaces_pb2'
+  # @@protoc_insertion_point(class_scope:content.spaces.CreateResponse)
+  })
+_sym_db.RegisterMessage(CreateResponse)
+
+GetRequest = _reflection.GeneratedProtocolMessageType('GetRequest', (_message.Message,), {
+  'DESCRIPTOR' : _GETREQUEST,
+  '__module__' : 'spaces.spaces_pb2'
+  # @@protoc_insertion_point(class_scope:content.spaces.GetRequest)
+  })
+_sym_db.RegisterMessage(GetRequest)
+
+GetResponse = _reflection.GeneratedProtocolMessageType('GetResponse', (_message.Message,), {
+  'DESCRIPTOR' : _GETRESPONSE,
+  '__module__' : 'spaces.spaces_pb2'
+  # @@protoc_insertion_point(class_scope:content.spaces.GetResponse)
+  })
+_sym_db.RegisterMessage(GetResponse)
+
+ListRequest = _reflection.GeneratedProtocolMessageType('ListRequest', (_message.Message,), {
+  'DESCRIPTOR' : _LISTREQUEST,
+  '__module__' : 'spaces.spaces_pb2'
+  # @@protoc_insertion_point(class_scope:content.spaces.ListRequest)
+  })
+_sym_db.RegisterMessage(ListRequest)
+
+ListResponse = _reflection.GeneratedProtocolMessageType('ListResponse', (_message.Message,), {
+  'DESCRIPTOR' : _LISTRESPONSE,
+  '__module__' : 'spaces.spaces_pb2'
+  # @@protoc_insertion_point(class_scope:content.spaces.ListResponse)
+  })
+_sym_db.RegisterMessage(ListResponse)
+
+UpdateRequest = _reflection.GeneratedProtocolMessageType('UpdateRequest', (_message.Message,), {
+  'DESCRIPTOR' : _UPDATEREQUEST,
+  '__module__' : 'spaces.spaces_pb2'
+  # @@protoc_insertion_point(class_scope:content.spaces.UpdateRequest)
+  })
+_sym_db.RegisterMessage(UpdateRequest)
+
+DeleteRequest = _reflection.GeneratedProtocolMessageType('DeleteRequest', (_message.Message,), {
+  'DESCRIPTOR' : _DELETEREQUEST,
+  '__module__' : 'spaces.spaces_pb2'
+  # @@protoc_insertion_point(class_scope:content.spaces.DeleteRequest)
+  })
+_sym_db.RegisterMessage(DeleteRequest)
+
+
+DESCRIPTOR._options = None
+
+_SPACES = _descriptor.ServiceDescriptor(
+  name='Spaces',
+  full_name='content.spaces.Spaces',
+  file=DESCRIPTOR,
+  index=0,
+  serialized_options=None,
+  create_key=_descriptor._internal_create_key,
+  serialized_start=840,
+  serialized_end=1192,
+  methods=[
+  _descriptor.MethodDescriptor(
+    name='Create',
+    full_name='content.spaces.Spaces.Create',
+    index=0,
+    containing_service=None,
+    input_type=_CREATEREQUEST,
+    output_type=_CREATERESPONSE,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='Get',
+    full_name='content.spaces.Spaces.Get',
+    index=1,
+    containing_service=None,
+    input_type=_GETREQUEST,
+    output_type=_GETRESPONSE,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='List',
+    full_name='content.spaces.Spaces.List',
+    index=2,
+    containing_service=None,
+    input_type=_LISTREQUEST,
+    output_type=_LISTRESPONSE,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='Update',
+    full_name='content.spaces.Spaces.Update',
+    index=3,
+    containing_service=None,
+    input_type=_UPDATEREQUEST,
+    output_type=google_dot_protobuf_dot_empty__pb2._EMPTY,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='Delete',
+    full_name='content.spaces.Spaces.Delete',
+    index=4,
+    containing_service=None,
+    input_type=_DELETEREQUEST,
+    output_type=google_dot_protobuf_dot_empty__pb2._EMPTY,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+])
+_sym_db.RegisterServiceDescriptor(_SPACES)
+
+DESCRIPTOR.services_by_name['Spaces'] = _SPACES
+
+# @@protoc_insertion_point(module_scope)
diff --git a/perxis/spaces/spaces_pb2_grpc.py b/perxis/spaces/spaces_pb2_grpc.py
new file mode 100644
index 0000000..5114fe4
--- /dev/null
+++ b/perxis/spaces/spaces_pb2_grpc.py
@@ -0,0 +1,199 @@
+# Generated by the gRPC Python protocol compiler plugin. DO NOT EDIT!
+"""Client and server classes corresponding to protobuf-defined services."""
+import grpc
+
+from google.protobuf import empty_pb2 as google_dot_protobuf_dot_empty__pb2
+from spaces import spaces_pb2 as spaces_dot_spaces__pb2
+
+
+class SpacesStub(object):
+    """Missing associated documentation comment in .proto file."""
+
+    def __init__(self, channel):
+        """Constructor.
+
+        Args:
+            channel: A grpc.Channel.
+        """
+        self.Create = channel.unary_unary(
+                '/content.spaces.Spaces/Create',
+                request_serializer=spaces_dot_spaces__pb2.CreateRequest.SerializeToString,
+                response_deserializer=spaces_dot_spaces__pb2.CreateResponse.FromString,
+                )
+        self.Get = channel.unary_unary(
+                '/content.spaces.Spaces/Get',
+                request_serializer=spaces_dot_spaces__pb2.GetRequest.SerializeToString,
+                response_deserializer=spaces_dot_spaces__pb2.GetResponse.FromString,
+                )
+        self.List = channel.unary_unary(
+                '/content.spaces.Spaces/List',
+                request_serializer=spaces_dot_spaces__pb2.ListRequest.SerializeToString,
+                response_deserializer=spaces_dot_spaces__pb2.ListResponse.FromString,
+                )
+        self.Update = channel.unary_unary(
+                '/content.spaces.Spaces/Update',
+                request_serializer=spaces_dot_spaces__pb2.UpdateRequest.SerializeToString,
+                response_deserializer=google_dot_protobuf_dot_empty__pb2.Empty.FromString,
+                )
+        self.Delete = channel.unary_unary(
+                '/content.spaces.Spaces/Delete',
+                request_serializer=spaces_dot_spaces__pb2.DeleteRequest.SerializeToString,
+                response_deserializer=google_dot_protobuf_dot_empty__pb2.Empty.FromString,
+                )
+
+
+class SpacesServicer(object):
+    """Missing associated documentation comment in .proto file."""
+
+    def Create(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        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."""
+        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."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def Update(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        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."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+
+def add_SpacesServicer_to_server(servicer, server):
+    rpc_method_handlers = {
+            'Create': grpc.unary_unary_rpc_method_handler(
+                    servicer.Create,
+                    request_deserializer=spaces_dot_spaces__pb2.CreateRequest.FromString,
+                    response_serializer=spaces_dot_spaces__pb2.CreateResponse.SerializeToString,
+            ),
+            'Get': grpc.unary_unary_rpc_method_handler(
+                    servicer.Get,
+                    request_deserializer=spaces_dot_spaces__pb2.GetRequest.FromString,
+                    response_serializer=spaces_dot_spaces__pb2.GetResponse.SerializeToString,
+            ),
+            'List': grpc.unary_unary_rpc_method_handler(
+                    servicer.List,
+                    request_deserializer=spaces_dot_spaces__pb2.ListRequest.FromString,
+                    response_serializer=spaces_dot_spaces__pb2.ListResponse.SerializeToString,
+            ),
+            'Update': grpc.unary_unary_rpc_method_handler(
+                    servicer.Update,
+                    request_deserializer=spaces_dot_spaces__pb2.UpdateRequest.FromString,
+                    response_serializer=google_dot_protobuf_dot_empty__pb2.Empty.SerializeToString,
+            ),
+            'Delete': grpc.unary_unary_rpc_method_handler(
+                    servicer.Delete,
+                    request_deserializer=spaces_dot_spaces__pb2.DeleteRequest.FromString,
+                    response_serializer=google_dot_protobuf_dot_empty__pb2.Empty.SerializeToString,
+            ),
+    }
+    generic_handler = grpc.method_handlers_generic_handler(
+            'content.spaces.Spaces', rpc_method_handlers)
+    server.add_generic_rpc_handlers((generic_handler,))
+
+
+ # This class is part of an EXPERIMENTAL API.
+class Spaces(object):
+    """Missing associated documentation comment in .proto file."""
+
+    @staticmethod
+    def Create(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/content.spaces.Spaces/Create',
+            spaces_dot_spaces__pb2.CreateRequest.SerializeToString,
+            spaces_dot_spaces__pb2.CreateResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def Get(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/content.spaces.Spaces/Get',
+            spaces_dot_spaces__pb2.GetRequest.SerializeToString,
+            spaces_dot_spaces__pb2.GetResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def List(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/content.spaces.Spaces/List',
+            spaces_dot_spaces__pb2.ListRequest.SerializeToString,
+            spaces_dot_spaces__pb2.ListResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def Update(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/content.spaces.Spaces/Update',
+            spaces_dot_spaces__pb2.UpdateRequest.SerializeToString,
+            google_dot_protobuf_dot_empty__pb2.Empty.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def Delete(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/content.spaces.Spaces/Delete',
+            spaces_dot_spaces__pb2.DeleteRequest.SerializeToString,
+            google_dot_protobuf_dot_empty__pb2.Empty.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
diff --git a/perxis/users/__init__.py b/perxis/users/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/perxis/users/users_pb2.py b/perxis/users/users_pb2.py
new file mode 100644
index 0000000..0db79a2
--- /dev/null
+++ b/perxis/users/users_pb2.py
@@ -0,0 +1,624 @@
+# -*- coding: utf-8 -*-
+# Generated by the protocol buffer compiler.  DO NOT EDIT!
+# source: users/users.proto
+"""Generated protocol buffer code."""
+from google.protobuf import descriptor as _descriptor
+from google.protobuf import message as _message
+from google.protobuf import reflection as _reflection
+from google.protobuf import symbol_database as _symbol_database
+# @@protoc_insertion_point(imports)
+
+_sym_db = _symbol_database.Default()
+
+
+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
+from common import common_pb2 as common_dot_common__pb2
+
+
+DESCRIPTOR = _descriptor.FileDescriptor(
+  name='users/users.proto',
+  package='account.users',
+  syntax='proto3',
+  serialized_options=b'Z,github.com/perxteam/perxis/proto/users;users',
+  create_key=_descriptor._internal_create_key,
+  serialized_pb=b'\n\x11users/users.proto\x12\raccount.users\x1a\x1bgoogle/protobuf/empty.proto\x1a\x1egoogle/protobuf/wrappers.proto\x1a\x13\x63ommon/common.proto\"\xcd\x01\n\x04User\x12\n\n\x02id\x18\x01 \x01(\t\x12\x0c\n\x04name\x18\x02 \x01(\t\x12\x12\n\nidentities\x18\x03 \x03(\t\x12\x14\n\x0c\x64isplay_name\x18\x04 \x01(\t\x12\r\n\x05\x65mail\x18\x05 \x01(\t\x12\x32\n\x0e\x65mail_verified\x18\x06 \x01(\x0b\x32\x1a.google.protobuf.BoolValue\x12\x12\n\navatar_url\x18\x07 \x01(\t\x12*\n\x06system\x18\n \x01(\x0b\x32\x1a.google.protobuf.BoolValue\"\xbb\x01\n\x06\x46ilter\x12\n\n\x02id\x18\x01 \x03(\t\x12\x0c\n\x04name\x18\x02 \x03(\t\x12\x12\n\nidentities\x18\x03 \x03(\t\x12\x14\n\x0c\x64isplay_name\x18\x04 \x03(\t\x12\r\n\x05\x65mail\x18\x05 \x03(\t\x12\x32\n\x0e\x65mail_verified\x18\x06 \x01(\x0b\x32\x1a.google.protobuf.BoolValue\x12*\n\x06system\x18\n \x01(\x0b\x32\x1a.google.protobuf.BoolValue\"4\n\rCreateRequest\x12#\n\x06\x63reate\x18\x01 \x01(\x0b\x32\x13.account.users.User\"3\n\x0e\x43reateResponse\x12!\n\x04user\x18\x01 \x01(\x0b\x32\x13.account.users.User\"\x1d\n\nGetRequest\x12\x0f\n\x07user_id\x18\x01 \x01(\t\"0\n\x0bGetResponse\x12!\n\x04user\x18\x01 \x01(\x0b\x32\x13.account.users.User\"Z\n\x0b\x46indRequest\x12%\n\x06\x66ilter\x18\x01 \x01(\x0b\x32\x15.account.users.Filter\x12$\n\x07options\x18\n \x01(\x0b\x32\x13.common.FindOptions\"A\n\x0c\x46indResponse\x12\"\n\x05users\x18\x01 \x03(\x0b\x32\x13.account.users.User\x12\r\n\x05total\x18\x02 \x01(\x03\"E\n\rUpdateRequest\x12\x0f\n\x07user_id\x18\x01 \x01(\t\x12#\n\x06update\x18\x02 \x01(\x0b\x32\x13.account.users.User\" \n\rDeleteRequest\x12\x0f\n\x07user_id\x18\x01 \x01(\t2\xd7\x02\n\x05Users\x12G\n\x06\x43reate\x12\x1c.account.users.CreateRequest\x1a\x1d.account.users.CreateResponse\"\x00\x12>\n\x03Get\x12\x19.account.users.GetRequest\x1a\x1a.account.users.GetResponse\"\x00\x12\x41\n\x04\x46ind\x12\x1a.account.users.FindRequest\x1a\x1b.account.users.FindResponse\"\x00\x12@\n\x06Update\x12\x1c.account.users.UpdateRequest\x1a\x16.google.protobuf.Empty\"\x00\x12@\n\x06\x44\x65lete\x12\x1c.account.users.DeleteRequest\x1a\x16.google.protobuf.Empty\"\x00\x42.Z,github.com/perxteam/perxis/proto/users;usersb\x06proto3'
+  ,
+  dependencies=[google_dot_protobuf_dot_empty__pb2.DESCRIPTOR,google_dot_protobuf_dot_wrappers__pb2.DESCRIPTOR,common_dot_common__pb2.DESCRIPTOR,])
+
+
+
+
+_USER = _descriptor.Descriptor(
+  name='User',
+  full_name='account.users.User',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='id', full_name='account.users.User.id', index=0,
+      number=1, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='name', full_name='account.users.User.name', index=1,
+      number=2, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='identities', full_name='account.users.User.identities', index=2,
+      number=3, type=9, cpp_type=9, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='display_name', full_name='account.users.User.display_name', index=3,
+      number=4, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='email', full_name='account.users.User.email', index=4,
+      number=5, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='email_verified', full_name='account.users.User.email_verified', index=5,
+      number=6, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='avatar_url', full_name='account.users.User.avatar_url', index=6,
+      number=7, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='system', full_name='account.users.User.system', index=7,
+      number=10, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=119,
+  serialized_end=324,
+)
+
+
+_FILTER = _descriptor.Descriptor(
+  name='Filter',
+  full_name='account.users.Filter',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='id', full_name='account.users.Filter.id', index=0,
+      number=1, type=9, cpp_type=9, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='name', full_name='account.users.Filter.name', index=1,
+      number=2, type=9, cpp_type=9, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='identities', full_name='account.users.Filter.identities', index=2,
+      number=3, type=9, cpp_type=9, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='display_name', full_name='account.users.Filter.display_name', index=3,
+      number=4, type=9, cpp_type=9, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='email', full_name='account.users.Filter.email', index=4,
+      number=5, type=9, cpp_type=9, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='email_verified', full_name='account.users.Filter.email_verified', index=5,
+      number=6, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='system', full_name='account.users.Filter.system', index=6,
+      number=10, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=327,
+  serialized_end=514,
+)
+
+
+_CREATEREQUEST = _descriptor.Descriptor(
+  name='CreateRequest',
+  full_name='account.users.CreateRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='create', full_name='account.users.CreateRequest.create', index=0,
+      number=1, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=516,
+  serialized_end=568,
+)
+
+
+_CREATERESPONSE = _descriptor.Descriptor(
+  name='CreateResponse',
+  full_name='account.users.CreateResponse',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='user', full_name='account.users.CreateResponse.user', index=0,
+      number=1, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=570,
+  serialized_end=621,
+)
+
+
+_GETREQUEST = _descriptor.Descriptor(
+  name='GetRequest',
+  full_name='account.users.GetRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='user_id', full_name='account.users.GetRequest.user_id', index=0,
+      number=1, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=623,
+  serialized_end=652,
+)
+
+
+_GETRESPONSE = _descriptor.Descriptor(
+  name='GetResponse',
+  full_name='account.users.GetResponse',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='user', full_name='account.users.GetResponse.user', index=0,
+      number=1, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=654,
+  serialized_end=702,
+)
+
+
+_FINDREQUEST = _descriptor.Descriptor(
+  name='FindRequest',
+  full_name='account.users.FindRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='filter', full_name='account.users.FindRequest.filter', index=0,
+      number=1, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='options', full_name='account.users.FindRequest.options', index=1,
+      number=10, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=704,
+  serialized_end=794,
+)
+
+
+_FINDRESPONSE = _descriptor.Descriptor(
+  name='FindResponse',
+  full_name='account.users.FindResponse',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='users', full_name='account.users.FindResponse.users', index=0,
+      number=1, type=11, cpp_type=10, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='total', full_name='account.users.FindResponse.total', index=1,
+      number=2, type=3, cpp_type=2, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=796,
+  serialized_end=861,
+)
+
+
+_UPDATEREQUEST = _descriptor.Descriptor(
+  name='UpdateRequest',
+  full_name='account.users.UpdateRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='user_id', full_name='account.users.UpdateRequest.user_id', index=0,
+      number=1, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='update', full_name='account.users.UpdateRequest.update', index=1,
+      number=2, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=863,
+  serialized_end=932,
+)
+
+
+_DELETEREQUEST = _descriptor.Descriptor(
+  name='DeleteRequest',
+  full_name='account.users.DeleteRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='user_id', full_name='account.users.DeleteRequest.user_id', index=0,
+      number=1, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=934,
+  serialized_end=966,
+)
+
+_USER.fields_by_name['email_verified'].message_type = google_dot_protobuf_dot_wrappers__pb2._BOOLVALUE
+_USER.fields_by_name['system'].message_type = google_dot_protobuf_dot_wrappers__pb2._BOOLVALUE
+_FILTER.fields_by_name['email_verified'].message_type = google_dot_protobuf_dot_wrappers__pb2._BOOLVALUE
+_FILTER.fields_by_name['system'].message_type = google_dot_protobuf_dot_wrappers__pb2._BOOLVALUE
+_CREATEREQUEST.fields_by_name['create'].message_type = _USER
+_CREATERESPONSE.fields_by_name['user'].message_type = _USER
+_GETRESPONSE.fields_by_name['user'].message_type = _USER
+_FINDREQUEST.fields_by_name['filter'].message_type = _FILTER
+_FINDREQUEST.fields_by_name['options'].message_type = common_dot_common__pb2._FINDOPTIONS
+_FINDRESPONSE.fields_by_name['users'].message_type = _USER
+_UPDATEREQUEST.fields_by_name['update'].message_type = _USER
+DESCRIPTOR.message_types_by_name['User'] = _USER
+DESCRIPTOR.message_types_by_name['Filter'] = _FILTER
+DESCRIPTOR.message_types_by_name['CreateRequest'] = _CREATEREQUEST
+DESCRIPTOR.message_types_by_name['CreateResponse'] = _CREATERESPONSE
+DESCRIPTOR.message_types_by_name['GetRequest'] = _GETREQUEST
+DESCRIPTOR.message_types_by_name['GetResponse'] = _GETRESPONSE
+DESCRIPTOR.message_types_by_name['FindRequest'] = _FINDREQUEST
+DESCRIPTOR.message_types_by_name['FindResponse'] = _FINDRESPONSE
+DESCRIPTOR.message_types_by_name['UpdateRequest'] = _UPDATEREQUEST
+DESCRIPTOR.message_types_by_name['DeleteRequest'] = _DELETEREQUEST
+_sym_db.RegisterFileDescriptor(DESCRIPTOR)
+
+User = _reflection.GeneratedProtocolMessageType('User', (_message.Message,), {
+  'DESCRIPTOR' : _USER,
+  '__module__' : 'users.users_pb2'
+  # @@protoc_insertion_point(class_scope:account.users.User)
+  })
+_sym_db.RegisterMessage(User)
+
+Filter = _reflection.GeneratedProtocolMessageType('Filter', (_message.Message,), {
+  'DESCRIPTOR' : _FILTER,
+  '__module__' : 'users.users_pb2'
+  # @@protoc_insertion_point(class_scope:account.users.Filter)
+  })
+_sym_db.RegisterMessage(Filter)
+
+CreateRequest = _reflection.GeneratedProtocolMessageType('CreateRequest', (_message.Message,), {
+  'DESCRIPTOR' : _CREATEREQUEST,
+  '__module__' : 'users.users_pb2'
+  # @@protoc_insertion_point(class_scope:account.users.CreateRequest)
+  })
+_sym_db.RegisterMessage(CreateRequest)
+
+CreateResponse = _reflection.GeneratedProtocolMessageType('CreateResponse', (_message.Message,), {
+  'DESCRIPTOR' : _CREATERESPONSE,
+  '__module__' : 'users.users_pb2'
+  # @@protoc_insertion_point(class_scope:account.users.CreateResponse)
+  })
+_sym_db.RegisterMessage(CreateResponse)
+
+GetRequest = _reflection.GeneratedProtocolMessageType('GetRequest', (_message.Message,), {
+  'DESCRIPTOR' : _GETREQUEST,
+  '__module__' : 'users.users_pb2'
+  # @@protoc_insertion_point(class_scope:account.users.GetRequest)
+  })
+_sym_db.RegisterMessage(GetRequest)
+
+GetResponse = _reflection.GeneratedProtocolMessageType('GetResponse', (_message.Message,), {
+  'DESCRIPTOR' : _GETRESPONSE,
+  '__module__' : 'users.users_pb2'
+  # @@protoc_insertion_point(class_scope:account.users.GetResponse)
+  })
+_sym_db.RegisterMessage(GetResponse)
+
+FindRequest = _reflection.GeneratedProtocolMessageType('FindRequest', (_message.Message,), {
+  'DESCRIPTOR' : _FINDREQUEST,
+  '__module__' : 'users.users_pb2'
+  # @@protoc_insertion_point(class_scope:account.users.FindRequest)
+  })
+_sym_db.RegisterMessage(FindRequest)
+
+FindResponse = _reflection.GeneratedProtocolMessageType('FindResponse', (_message.Message,), {
+  'DESCRIPTOR' : _FINDRESPONSE,
+  '__module__' : 'users.users_pb2'
+  # @@protoc_insertion_point(class_scope:account.users.FindResponse)
+  })
+_sym_db.RegisterMessage(FindResponse)
+
+UpdateRequest = _reflection.GeneratedProtocolMessageType('UpdateRequest', (_message.Message,), {
+  'DESCRIPTOR' : _UPDATEREQUEST,
+  '__module__' : 'users.users_pb2'
+  # @@protoc_insertion_point(class_scope:account.users.UpdateRequest)
+  })
+_sym_db.RegisterMessage(UpdateRequest)
+
+DeleteRequest = _reflection.GeneratedProtocolMessageType('DeleteRequest', (_message.Message,), {
+  'DESCRIPTOR' : _DELETEREQUEST,
+  '__module__' : 'users.users_pb2'
+  # @@protoc_insertion_point(class_scope:account.users.DeleteRequest)
+  })
+_sym_db.RegisterMessage(DeleteRequest)
+
+
+DESCRIPTOR._options = None
+
+_USERS = _descriptor.ServiceDescriptor(
+  name='Users',
+  full_name='account.users.Users',
+  file=DESCRIPTOR,
+  index=0,
+  serialized_options=None,
+  create_key=_descriptor._internal_create_key,
+  serialized_start=969,
+  serialized_end=1312,
+  methods=[
+  _descriptor.MethodDescriptor(
+    name='Create',
+    full_name='account.users.Users.Create',
+    index=0,
+    containing_service=None,
+    input_type=_CREATEREQUEST,
+    output_type=_CREATERESPONSE,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='Get',
+    full_name='account.users.Users.Get',
+    index=1,
+    containing_service=None,
+    input_type=_GETREQUEST,
+    output_type=_GETRESPONSE,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='Find',
+    full_name='account.users.Users.Find',
+    index=2,
+    containing_service=None,
+    input_type=_FINDREQUEST,
+    output_type=_FINDRESPONSE,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='Update',
+    full_name='account.users.Users.Update',
+    index=3,
+    containing_service=None,
+    input_type=_UPDATEREQUEST,
+    output_type=google_dot_protobuf_dot_empty__pb2._EMPTY,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='Delete',
+    full_name='account.users.Users.Delete',
+    index=4,
+    containing_service=None,
+    input_type=_DELETEREQUEST,
+    output_type=google_dot_protobuf_dot_empty__pb2._EMPTY,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+])
+_sym_db.RegisterServiceDescriptor(_USERS)
+
+DESCRIPTOR.services_by_name['Users'] = _USERS
+
+# @@protoc_insertion_point(module_scope)
diff --git a/perxis/users/users_pb2_grpc.py b/perxis/users/users_pb2_grpc.py
new file mode 100644
index 0000000..a2f18c5
--- /dev/null
+++ b/perxis/users/users_pb2_grpc.py
@@ -0,0 +1,207 @@
+# Generated by the gRPC Python protocol compiler plugin. DO NOT EDIT!
+"""Client and server classes corresponding to protobuf-defined services."""
+import grpc
+
+from google.protobuf import empty_pb2 as google_dot_protobuf_dot_empty__pb2
+from users import users_pb2 as users_dot_users__pb2
+
+
+class UsersStub(object):
+    """Missing associated documentation comment in .proto file."""
+
+    def __init__(self, channel):
+        """Constructor.
+
+        Args:
+            channel: A grpc.Channel.
+        """
+        self.Create = channel.unary_unary(
+                '/account.users.Users/Create',
+                request_serializer=users_dot_users__pb2.CreateRequest.SerializeToString,
+                response_deserializer=users_dot_users__pb2.CreateResponse.FromString,
+                )
+        self.Get = channel.unary_unary(
+                '/account.users.Users/Get',
+                request_serializer=users_dot_users__pb2.GetRequest.SerializeToString,
+                response_deserializer=users_dot_users__pb2.GetResponse.FromString,
+                )
+        self.Find = channel.unary_unary(
+                '/account.users.Users/Find',
+                request_serializer=users_dot_users__pb2.FindRequest.SerializeToString,
+                response_deserializer=users_dot_users__pb2.FindResponse.FromString,
+                )
+        self.Update = channel.unary_unary(
+                '/account.users.Users/Update',
+                request_serializer=users_dot_users__pb2.UpdateRequest.SerializeToString,
+                response_deserializer=google_dot_protobuf_dot_empty__pb2.Empty.FromString,
+                )
+        self.Delete = channel.unary_unary(
+                '/account.users.Users/Delete',
+                request_serializer=users_dot_users__pb2.DeleteRequest.SerializeToString,
+                response_deserializer=google_dot_protobuf_dot_empty__pb2.Empty.FromString,
+                )
+
+
+class UsersServicer(object):
+    """Missing associated documentation comment in .proto file."""
+
+    def Create(self, request, context):
+        """Создание пользователя или регистрация текущего пользователя в системе, если create.id == `current`
+        """
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def Get(self, request, context):
+        """- Получение любого пользователя по идентификатору
+        - Получение текущего (от лица которого делается запрос) пользователя по специальному идентификатору `current`
+        """
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def Find(self, request, context):
+        """Найти пользователей с фильтрацией. Фильтры доступны пользователям в зависимости от их прав
+        """
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def Update(self, request, context):
+        """- Обновление существующего пользователя по идентификатору
+        - Обновление текущего пользователя по спец. идентификатору `current`
+        """
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def Delete(self, request, context):
+        """- Удаление существующего пользователя по идентификатору
+        - Удаление текущего пользователя по спец. идентификатору `current`
+        """
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+
+def add_UsersServicer_to_server(servicer, server):
+    rpc_method_handlers = {
+            'Create': grpc.unary_unary_rpc_method_handler(
+                    servicer.Create,
+                    request_deserializer=users_dot_users__pb2.CreateRequest.FromString,
+                    response_serializer=users_dot_users__pb2.CreateResponse.SerializeToString,
+            ),
+            'Get': grpc.unary_unary_rpc_method_handler(
+                    servicer.Get,
+                    request_deserializer=users_dot_users__pb2.GetRequest.FromString,
+                    response_serializer=users_dot_users__pb2.GetResponse.SerializeToString,
+            ),
+            'Find': grpc.unary_unary_rpc_method_handler(
+                    servicer.Find,
+                    request_deserializer=users_dot_users__pb2.FindRequest.FromString,
+                    response_serializer=users_dot_users__pb2.FindResponse.SerializeToString,
+            ),
+            'Update': grpc.unary_unary_rpc_method_handler(
+                    servicer.Update,
+                    request_deserializer=users_dot_users__pb2.UpdateRequest.FromString,
+                    response_serializer=google_dot_protobuf_dot_empty__pb2.Empty.SerializeToString,
+            ),
+            'Delete': grpc.unary_unary_rpc_method_handler(
+                    servicer.Delete,
+                    request_deserializer=users_dot_users__pb2.DeleteRequest.FromString,
+                    response_serializer=google_dot_protobuf_dot_empty__pb2.Empty.SerializeToString,
+            ),
+    }
+    generic_handler = grpc.method_handlers_generic_handler(
+            'account.users.Users', rpc_method_handlers)
+    server.add_generic_rpc_handlers((generic_handler,))
+
+
+ # This class is part of an EXPERIMENTAL API.
+class Users(object):
+    """Missing associated documentation comment in .proto file."""
+
+    @staticmethod
+    def Create(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/account.users.Users/Create',
+            users_dot_users__pb2.CreateRequest.SerializeToString,
+            users_dot_users__pb2.CreateResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def Get(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/account.users.Users/Get',
+            users_dot_users__pb2.GetRequest.SerializeToString,
+            users_dot_users__pb2.GetResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def Find(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/account.users.Users/Find',
+            users_dot_users__pb2.FindRequest.SerializeToString,
+            users_dot_users__pb2.FindResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def Update(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/account.users.Users/Update',
+            users_dot_users__pb2.UpdateRequest.SerializeToString,
+            google_dot_protobuf_dot_empty__pb2.Empty.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def Delete(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/account.users.Users/Delete',
+            users_dot_users__pb2.DeleteRequest.SerializeToString,
+            google_dot_protobuf_dot_empty__pb2.Empty.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
diff --git a/proto/accountmanagement/accountmanagement.proto b/proto/accountmanagement/accountmanagement.proto
new file mode 100644
index 0000000..e5979f5
--- /dev/null
+++ b/proto/accountmanagement/accountmanagement.proto
@@ -0,0 +1,414 @@
+syntax = "proto3";
+
+import "google/protobuf/timestamp.proto";
+import "google/protobuf/empty.proto";
+import "google/protobuf/wrappers.proto";
+import "common/common.proto";
+
+option go_package = "github.com/perxteam/perxis/proto/accountmanagement;accountmanagement";
+
+package accountmanagement;
+
+// Запросы и ответы
+
+message CreateOrganizationRequest {
+  string name = 2;
+  string description = 3;
+  string logo_uri = 4;
+}
+
+message CreateOrganizationResponse {
+  common.Organization organization = 1;
+}
+
+message UpdateOrganizationRequest {
+  string organization_id = 1;
+  string name = 2;
+  string description = 3;
+  string logo_uri = 4;
+}
+
+message UpdateOrganizationResponse {
+  common.Organization organization = 1;
+}
+
+message DeleteOrganizationRequest {
+  string organization_id = 1;
+}
+
+message DeleteOrganizationResponse {}
+
+message FindOrganizationsRequest {
+  int32 page_num = 1;
+  int32 page_size = 2;
+  repeated string ids = 3;
+  repeated string names = 4;
+}
+
+message FindOrganizationsResponse {
+  repeated common.Organization organizations = 1;
+  int32 total = 2;
+}
+
+message UpdateOrganizationMembershipRequest {
+  string user_id = 1;
+  string organization_id = 2;
+  common.Role role = 3;
+}
+
+message DeleteOrganizationMembershipRequest {
+  string user_id = 1;
+  string organization_id = 2;
+}
+
+message FindOrganizationMembershipsRequest {
+  repeated string organization_ids = 1; // Id организации для поиска членства
+  repeated string user_ids = 2; // Id пользователей для поиска
+  repeated common.Role roles = 3; // Роль для поиска (если не указана, любая)
+  int32 page_num = 9;
+  int32 page_size = 10;
+}
+
+message FindOrganizationMembershipsResponse {
+  repeated common.OrganizationMembership memberships = 1;
+  int32 total = 2;
+}
+
+// Spaces
+
+message CreateSpaceRequest {
+  string name = 1;
+  string description = 2;
+  string organization_id = 3;
+}
+
+message CreateSpaceResponse {
+  common.Space space = 1;
+}
+
+message GetSpaceRequest {
+  string space_id = 1;
+}
+
+message GetSpaceResponse {
+  common.Space space = 1;
+}
+
+message ListOrganizationSpacesRequest {
+  string organization_id = 1;
+}
+
+message ListOrganizationSpacesResponse {
+  repeated common.Space spaces = 1;
+}
+
+message UpdateSpaceRequest {
+  string space_id = 1;
+  string name = 2;
+  string description = 3;
+  string api_url = 4;
+}
+
+message UpdateSpaceResponse {
+  common.Space space = 1;
+}
+
+message DeleteSpaceRequest {
+  string space_id = 1;
+}
+
+message DeleteSpaceResponse {}
+
+
+message CreateSpaceInvitationRequest {
+  string space_id = 1;
+  string space_role = 2;
+  string email = 3;
+}
+
+message CreateSpaceInvitationResponse {
+  common.SpaceInvitation invitation = 1;
+}
+
+message GetSpaceInvitationRequest {
+  string invitation_id = 1;
+}
+
+message GetSpaceInvitationResponse {
+  common.SpaceInvitation invitation = 1;
+}
+
+message UpdateSpaceInvitationRequest {
+  string invitation_id = 1;
+  google.protobuf.BoolValue sent = 2; // Флаг отправки приглашения
+  google.protobuf.BoolValue pending = 3; // Флаг принятия приглашения
+  google.protobuf.Timestamp sent_at = 4; // Время отправки приглашения
+  google.protobuf.Timestamp valid_until = 5; // Время до которого приглашение действует
+}
+
+message UpdateSpaceInvitationResponse {}
+
+message AcceptSpaceInvitationRequest {
+  string invitation_id = 1;
+}
+
+message AcceptSpaceInvitationResponse {}
+
+message FindSpaceInvitationsRequest {
+  repeated string invitation_ids = 1;
+  repeated string organization_ids = 2;
+  repeated string space_ids = 3;
+  repeated string emails = 4;
+  repeated string space_roles = 5;
+  google.protobuf.BoolValue sent = 6;
+  google.protobuf.BoolValue pending = 7;
+  int32 page_num = 9;
+  int32 page_size = 10;
+}
+
+message FindSpaceInvitationsResponse {
+  repeated common.SpaceInvitation invitations = 1;
+  int32 total = 2;
+}
+
+message DeleteSpaceInvitationRequest {
+  string invitation_id = 1;
+}
+
+message DeleteSpaceInvitationResponse {}
+
+message SetSpaceMembershipRequest {
+  string space_id = 1;
+  string user_id = 2;
+  string space_role = 3; // Роль пользователя для пространства. Сами роли обслуживаются Content Service
+}
+
+message SetSpaceMembershipResponse {}
+
+message DeleteSpaceMembershipRequest {
+  string space_id = 1;
+  string user_id = 2;
+}
+
+message DeleteSpaceMembershipResponse {}
+
+message FindSpaceMembershipsRequest {
+  repeated string organization_ids = 1; // Фильтрация по организации
+  repeated string space_ids = 2; // Фильтрация по пространству
+  repeated string user_ids = 3; // Фильтрация по пользователю
+  repeated string space_roles = 4; // Фильтрация по роли пользователя в пространстве
+  int32 page_num = 9;
+  int32 page_size = 10;
+
+}
+
+message FindSpaceMembershipsResponse {
+  message SpaceMembership {
+    string organization_id = 1;
+    string space_id = 2;
+    string user_id = 3;
+    string space_role = 4;
+  }
+  repeated SpaceMembership memberships = 1;
+  int32 total = 2;
+}
+
+
+// Пользователи
+
+message CreateUserRequest {
+  string name = 2; // Уникальное имя (идентификатор JWT)
+  string display_name = 3; // Имя пользователя для отображения
+  repeated string identities = 4;
+  string email = 5; // Email, указывается пользователем
+  bool email_verified = 6; // Флаг что email проверен
+  string avatar_uri = 7; // URI изображения пользователя
+  bool system = 10; // Системный пользователь (может получать доступ к расширенному API)
+}
+
+message CreateUserResponse {
+  common.User user = 1;
+}
+
+message GetCurrentUserRequest {}
+
+
+message GetCurrentUserResponse {
+  common.User user = 1;
+}
+
+message UpdateCurrentUserRequest {
+  string name = 2; // Уникальное имя
+  string display_name = 3; // Имя пользователя для отображения
+  string email = 4; // Email, указывается пользователем
+  string avatar_uri = 6; // URI изображения пользователя
+}
+
+message UpdateCurrentUserResponse {
+  common.User user = 1;
+}
+
+message GetUserRequest {
+  string user_id = 1;
+}
+
+message GetUserResponse {
+  common.User user = 1;
+}
+
+message FindUsersRequest {
+  repeated string ids = 1; // Уникальный идентификатор
+  repeated string identities = 2; // Authorization subjects (JWT sub claims)
+  repeated string names = 3; // Уникальное имя (идентификатор JWT)
+  repeated string display_names = 4; // Имя пользователя для отображения
+  repeated string emails = 5; // Email, указывается пользователем
+  google.protobuf.BoolValue email_verified = 6; // Флаг что email проверен
+  repeated string avatar_uri = 9; // URI изображения пользователя
+  google.protobuf.BoolValue system = 10; // Системный пользователь (может получать доступ к расширенному API)
+  int32 page_num = 11;
+  int32 page_size = 12;
+
+}
+
+message FindUsersResponse {
+  repeated common.User users = 1;
+  int32 total = 2;
+}
+
+message UpdateUserRequest {
+  string user_id = 1; // Уникальный идентификатор, присваивается системой
+  common.User update = 2; // Содержит только поля необходимые для обновления
+}
+
+message UpdateUserResponse{
+  common.User user = 1; // Результат обновления пользователя
+}
+
+message DeleteUserRequest {
+  string user_id = 1;
+}
+
+message DeleteUserResponse {}
+
+service AccountManagement  {
+  // Пользователи
+
+  // Создать пользователя
+  // System API: только системный пользователь может использовать
+  rpc CreateUser(CreateUserRequest) returns(CreateUserResponse) {}
+
+  // Получить текущего пользователя
+  rpc GetUser(GetUserRequest) returns(GetUserResponse) {}
+
+  // Получить список пользователей
+  rpc FindUsers(FindUsersRequest) returns(FindUsersResponse) {}
+
+  // Обновить текущего пользователя
+  // System API: только системный пользователь может использовать
+  rpc UpdateUser(UpdateUserRequest) returns(UpdateUserResponse) {}
+
+  // Удалить пользователя
+  rpc DeleteUser(DeleteUserRequest) returns(google.protobuf.Empty) {}
+
+  // Получить текущего пользователя
+  rpc GetCurrentUser(google.protobuf.Empty) returns(GetCurrentUserResponse) {}
+
+  // Обновить или зарегистрировать текущего пользователя
+  rpc UpdateCurrentUser(UpdateCurrentUserRequest) returns(UpdateCurrentUserResponse) {}
+
+  //
+  // Organizations (Организации)
+  //
+
+  // Создает организацию
+  rpc CreateOrganization(CreateOrganizationRequest) returns(CreateOrganizationResponse) {}
+
+  // Удалить организацию
+  rpc DeleteOrganization(DeleteOrganizationRequest) returns(google.protobuf.Empty) {}
+
+  // Поиск организаций
+  //
+  rpc FindOrganizations(FindOrganizationsRequest) returns(FindOrganizationsResponse) {}
+
+  // Обновление организации
+  //
+  rpc UpdateOrganization(UpdateOrganizationRequest) returns(UpdateOrganizationResponse) {}
+
+  //
+  // Memberships (Членство в организации)
+  //
+
+  // Обновить членство пользователя в организации
+  rpc UpdateOrganizationMembership(UpdateOrganizationMembershipRequest) returns(google.protobuf.Empty) {}
+
+  // Удалить пользователя из организации
+  rpc DeleteOrganizationMembership(DeleteOrganizationMembershipRequest) returns(google.protobuf.Empty) {}
+
+  // Получить членство пользователей в организации или команде
+  // Использование параметров
+  // - Для поиска членов организации: organization_id
+  // - Для поиска организаций где пользователь является членом: user_id
+  // - Для поиска организаций владельцем которых является пользователь: user_id, Role = OWNER
+  // - Для поиска организаций которыми пользователь может управлять: user_id, Role = [OWNER, ADMIN]
+  rpc FindOrganizationMemberships(FindOrganizationMembershipsRequest) returns(FindOrganizationMembershipsResponse) {}
+
+  //
+  // Spaces (Пространства)
+  //
+
+  // Создает пространство в организации или пользователе
+  rpc CreateSpace(CreateSpaceRequest) returns(CreateSpaceResponse) {}
+
+  // Получить информацию о пространстве
+  rpc GetSpace(GetSpaceRequest) returns(GetSpaceResponse) {}
+
+  // Получить список пространств в организации доступных
+  rpc ListOrganizationSpaces(ListOrganizationSpacesRequest) returns(ListOrganizationSpacesResponse) {}
+
+  // Обновить информацию о пространстве
+  rpc UpdateSpace(UpdateSpaceRequest) returns(UpdateSpaceResponse) {}
+
+  // Удалить пространство
+  rpc DeleteSpace(DeleteSpaceRequest) returns(google.protobuf.Empty) {}
+
+  //
+  // Членство в Spaces
+  //
+
+  // Создать приглашение для пользователя в space
+  rpc CreateSpaceInvitation(CreateSpaceInvitationRequest) returns(CreateSpaceInvitationResponse) {}
+
+  // Получить данные о приглашении
+  rpc GetSpaceInvitation(GetSpaceInvitationRequest) returns(GetSpaceInvitationResponse) {}
+
+  // Обновить данные о приглашении
+  rpc UpdateSpaceInvitation(UpdateSpaceInvitationRequest) returns(google.protobuf.Empty) {}
+
+  // Принять приглашение
+  rpc AcceptSpaceInvitation(AcceptSpaceInvitationRequest) returns(google.protobuf.Empty) {}
+
+  // Получить список приглашений для пространства
+  rpc FindSpaceInvitations(FindSpaceInvitationsRequest) returns(FindSpaceInvitationsResponse) {}
+
+  // Удалить приглашение
+  rpc DeleteSpaceInvitation(DeleteSpaceInvitationRequest) returns(google.protobuf.Empty) {}
+
+  // Обновляет участие пользователя в пространстве
+  rpc SetSpaceMembership(SetSpaceMembershipRequest) returns(google.protobuf.Empty) {}
+
+  // Удаляет участия пользователя в пространстве
+  rpc DeleteSpaceMembership(DeleteSpaceMembershipRequest) returns(google.protobuf.Empty) {}
+
+  // Поиск членства пользователей в пространствах
+  // Доступы:
+  // - System - может получать что хочет
+  // - Owner, Admin - может запрашивать что хочет в своих организациях (даже если сам не является членом пространства)
+  // - стальные - может запрашивать что хочет в пространствах в которых является членом (не только свои но и других пользователей в пространстве)
+  // Использование параметров
+  // - Для поиска членств для всех пространств организации: organization_id
+  // - Для поиска членов пространства: space_id
+  // - Для поиска пространств, где пользователь является членом: user_id
+  // - Для поиска пространств, где пользователю соответствует данная роль - user_id, space_role
+  // Сортировка по умолчанию по "organization_id", "space_id", "user_id"
+  rpc FindSpaceMemberships(FindSpaceMembershipsRequest) returns(FindSpaceMembershipsResponse) {}
+}
diff --git a/proto/collaborators/collaborators.proto b/proto/collaborators/collaborators.proto
new file mode 100644
index 0000000..5d539dc
--- /dev/null
+++ b/proto/collaborators/collaborators.proto
@@ -0,0 +1,57 @@
+syntax = "proto3";
+
+import "google/protobuf/empty.proto";
+
+option go_package = "github.com/perxteam/perxis/proto/collaborators;collaborators";
+
+package content.collaborators;
+
+message Collaborator {
+  string space_id = 1;
+  string user_id = 2;
+  string role = 3;
+}
+
+message SetRequest {
+  string space_id = 1;
+  string user_id = 2;
+  string role = 3;
+}
+
+message GetRequest {
+  string space_id = 1;
+  string user_id = 2;
+}
+
+message GetResponse {
+  string role = 3;
+}
+
+message RemoveRequest {
+  string space_id = 1;
+  string user_id = 2;
+}
+
+message ListCollaboratorsRequest {
+  string space_id = 1;
+}
+
+message ListCollaboratorsResponse {
+  repeated Collaborator collaborators = 1;
+}
+
+message ListSpacesRequest {
+  string user_id = 1;
+}
+
+message ListSpacesResponse {
+  repeated Collaborator spaces = 1;
+}
+
+service Collaborators {
+  rpc Set(SetRequest) returns(google.protobuf.Empty) {}
+  rpc Get(GetRequest) returns(GetResponse) {}
+  rpc Remove(RemoveRequest) returns(google.protobuf.Empty) {}
+  rpc ListCollaborators(ListCollaboratorsRequest) returns(ListCollaboratorsResponse) {}
+  rpc ListSpaces(ListSpacesRequest) returns(ListSpacesResponse) {}
+}
diff --git a/proto/collections/collections.proto b/proto/collections/collections.proto
new file mode 100644
index 0000000..eaa48cf
--- /dev/null
+++ b/proto/collections/collections.proto
@@ -0,0 +1,72 @@
+syntax = "proto3";
+
+import "google/protobuf/empty.proto";
+import "google/protobuf/wrappers.proto";
+
+option go_package = "github.com/perxteam/perxis/proto/collections;collections";
+
+package content.collections;
+
+message Collection {
+  string id = 1;
+  string space_id = 2;
+  string env_id = 3;
+  string name = 4;
+  bool single = 5;
+  bool system = 6;
+  string schema = 7;
+}
+
+message CreateRequest {
+  string space_id = 1;
+  string env_id = 2;
+  string collection_id = 3;
+  string name = 4;
+  bool single = 5;
+  bool system = 6;
+  string schema = 7;
+}
+message CreateResponse {
+  Collection collection = 1;
+}
+
+message GetRequest {
+  string space_id = 1;
+  string env_id = 2;
+  string collection_id = 3;
+
+}
+message GetResponse {
+  Collection collection = 1;
+}
+
+message ListRequest {
+  string space_id = 1;
+  string env_id = 2;
+}
+message ListResponse {
+  repeated Collection collections = 1;
+}
+
+message UpdateRequest {
+  string space_id = 1;
+  string env_id = 2;
+  string collection_id = 3;
+  string name = 4;
+  google.protobuf.BoolValue single = 5;
+  string schema = 6;
+}
+
+message DeleteRequest {
+  string space_id = 1;
+  string env_id = 2;
+  string collection_id = 3;
+}
+
+service Collections  {
+  rpc Create(CreateRequest) returns(CreateResponse) {}
+  rpc Get(GetRequest) returns(GetResponse) {}
+  rpc List(ListRequest) returns(ListResponse) {}
+  rpc Update(UpdateRequest) returns(google.protobuf.Empty) {}
+  rpc Delete(DeleteRequest) returns(google.protobuf.Empty) {}
+}
diff --git a/proto/common/common.proto b/proto/common/common.proto
new file mode 100644
index 0000000..9008b19
--- /dev/null
+++ b/proto/common/common.proto
@@ -0,0 +1,179 @@
+syntax = "proto3";
+
+option go_package = "github.com/perxteam/perxis/proto/common;common";
+
+package common;
+
+import "google/protobuf/timestamp.proto";
+import "google/protobuf/struct.proto";
+import "google/protobuf/wrappers.proto";
+
+// Пользователь
+message User {
+  string id = 1; // Уникальный идентификатор, присваивается системой
+  string name = 2; // Уникальное имя, login
+  repeated string identities = 3; // Authorization subjects (JWT sub claims)
+  string display_name = 4; // Имя пользователя для отображения
+  string email = 5; // Email, указывается пользователем
+  bool email_verified = 6; // Флаг что email проверен
+  string avatar_uri = 7; // URI изображения пользователя
+  google.protobuf.BoolValue system = 10; // Системный пользователь (может получать доступ к расширенному API)
+}
+
+// Организация
+message Organization {
+  string id = 1; // Идентификатор организации
+  string name = 2; // Имя организации
+  string description = 3; // Описание организации
+  string logo_uri = 5; // URI изображения логотипа
+}
+
+// Роль пользователя в организации
+enum Role {
+  NOT_MEMBER = 0; // Не является членом команды - значение по умолчанию
+  MEMBER = 1; // Входит в организацию и команды, может получать доступ к Space в соответствии с политикой доступа
+  OWNER = 2; // admin + может приглашать пользователей на роль owner
+  ADMIN = 3; // Входит в организацию, видит все Space, может задавать политики доступа, может приглашать пользователей на роли member, admin
+}
+
+message OrganizationMembership {
+  string id = 1;
+  string organization_id = 2;
+  string user_id = 3;
+  Role role = 4;
+}
+
+// Приглашение пользователя для членства в пространстве.
+// Для принятия приглашения пользователь должен быть авторизован.
+message SpaceInvitation {
+  string id = 1; // Идентификатор приглашения
+  string email = 2; // Почтовый адрес пользователя
+  string organization_id = 3; // Идентификатор организации которой принадлежит пространство
+  string space_id = 4; // Идентификатор пространства в которую приглашается пользователь
+  string created_by = 5; // Идентификатор пользователя отправивший приглашение
+  string space_role = 6; // Роль для пользователя в пространстве
+  bool sent = 7; // Флаг отправки приглашения
+  bool pending = 8; // Флаг принятия приглашения
+  google.protobuf.Timestamp created_at = 9; // Время создания приглашения
+  google.protobuf.Timestamp sent_at = 10; // Время отправки приглашения
+  google.protobuf.Timestamp valid_until = 11; // Время до которого приглашение действует
+}
+
+
+// Space
+message Space {
+  string id = 1;
+  string organization_id = 2;
+  string name = 3;
+  string description = 4;
+  string host = 5;
+  string api_url = 6;
+}
+
+// Collection
+message Collection  {
+  string id = 1;
+  string space_id = 2;
+  string environment_id = 3;
+  string name = 4;
+  string schema = 5;
+  google.protobuf.BoolValue single = 6;
+  google.protobuf.BoolValue hidden = 7;
+  google.protobuf.BoolValue system = 8;
+}
+
+// Item
+message Item {
+  string id = 1;
+  string space_id = 2;
+  string environment_id = 3;
+  string collection_id = 4;
+  string status = 5;
+  google.protobuf.Timestamp created_at = 6;
+  string created_by = 7;
+  google.protobuf.Struct data = 8;
+  map<string, google.protobuf.Struct> translations = 9;
+  string revision_id = 10;
+  google.protobuf.Timestamp published_at = 11;
+  string published_by = 12;
+  google.protobuf.Timestamp archived_at = 13;
+  string archived_by = 14;
+}
+
+message FindItemsOptions {
+  string space_id = 1;
+  string environment_id = 2;
+  string collection_id = 3;
+  repeated Filter filters = 4;
+  int32 page_num = 8;
+  int32 page_size = 9;
+  repeated string sort = 10;
+}
+
+// Environment
+message Environment {
+  string id = 1;
+  string space_id = 2;
+  string description = 3;
+  enum State {
+    UNKNOWN = 0;
+    PENDING = 1;
+    READY = 2;
+    FAILED = 3;
+  }
+  State state = 4;
+  repeated string aliases = 5;
+}
+
+// Locale
+message Locale {
+  string id = 1;
+  string name = 2;
+  string space_id = 3;
+}
+
+message SpaceRole {
+  string id = 1;
+  string name = 2;
+  string space_id = 3;
+  string description = 5;
+  repeated ContentRule content_rules = 6;
+}
+
+message ContentRule {
+  string id = 1;
+  string collection_id = 2;
+  ItemAccess create = 5;
+  ItemAccess read = 6;
+  ItemAccess update = 7;
+  ItemAccess delete = 8;
+  repeated string fields_read_blacklist = 10;
+  repeated string fields_write_blacklist = 11;
+}
+
+enum ItemAccess {
+  NONE = 0;
+  ANY = 1;
+  MINE = 2;
+  ROLE = 3;
+}
+
+message Filter {
+  string op = 1;
+  string field = 2;
+  google.protobuf.Value value = 3;
+}
+
+message File {
+  string id = 1;        // Уникальный идентификатор файла в хранилище
+  string name = 2;      // Имя файла
+  int32 size = 3;       // Размер файла
+  string mime_type = 4; // Mime-type файла
+  string url = 5;       // Адрес для загрузки файла
+}
+
+message FindOptions {
+  repeated string sort = 1;
+  int32 page_num = 2;
+  int32 page_size = 3;
+}
\ No newline at end of file
diff --git a/proto/contentcontrol/contentcontrol.proto b/proto/contentcontrol/contentcontrol.proto
new file mode 100644
index 0000000..377f32f
--- /dev/null
+++ b/proto/contentcontrol/contentcontrol.proto
@@ -0,0 +1,59 @@
+syntax = "proto3";
+
+option go_package = "github.com/perxteam/perxis/proto/contentcontrol;contentcontrol";
+
+package contentcontrol;
+
+import "google/protobuf/empty.proto";
+import "common/common.proto";
+
+message Host{
+  string name = 1;
+}
+
+message ListSpacesOptions{
+  string host = 1;
+}
+
+message CreateSpaceRequest{
+  common.Space space = 1;
+}
+message CreateSpaceResponse{
+  common.Space space = 1;
+}
+
+message DeleteSpaceRequest{
+  string id = 1;
+}
+
+message GetSpaceRequest{
+  string id = 1;
+}
+message GetSpaceResponse{
+  common.Space space = 1;
+}
+
+message ListSpacesResponse{
+  repeated common.Space spaces = 1;
+}
+
+message ListSpacesRequest{
+    ListSpacesOptions opts = 1;
+}
+
+message CanCreateSpaceRequest{
+  common.Space space = 1;
+}
+
+message CanCreateSpaceResponse{
+  Host host = 1;
+}
+
+service ContentControl {
+  // Space
+  rpc CanCreateSpace(CanCreateSpaceRequest) returns(CanCreateSpaceResponse) {}
+  rpc CreateSpace(CreateSpaceRequest) returns(CreateSpaceResponse) {}
+  rpc DeleteSpace(DeleteSpaceRequest) returns(google.protobuf.Empty) {}
+  rpc GetSpace(GetSpaceRequest) returns(GetSpaceResponse) {}
+  rpc ListSpaces(ListSpacesRequest) returns(ListSpacesResponse) {}
+}
diff --git a/proto/contentdelivery/contentdelivery.proto b/proto/contentdelivery/contentdelivery.proto
new file mode 100644
index 0000000..d8d5bb0
--- /dev/null
+++ b/proto/contentdelivery/contentdelivery.proto
@@ -0,0 +1,88 @@
+syntax = "proto3";
+
+import "common/common.proto";
+
+option go_package = "github.com/perxteam/perxis/proto/contentdelivery;contentdelivery";
+
+package contentdelivery;
+
+message GetSpaceRequest{
+  string id = 1;
+}
+
+message GetSpaceResponse{
+  common.Space space = 1;
+}
+
+message ListLocalesRequest{
+  string space_id = 1;
+}
+message ListLocalesResponse{
+  repeated common.Locale locales = 1;
+}
+
+message GetEnvironmentRequest{
+  string id = 1;
+  string space_id = 2;
+}
+
+message GetEnvironmentResponse{
+  common.Environment environment = 1;
+}
+
+message GetCollectionRequest {
+  string id = 1;
+  string environment_id = 2;
+  string space_id = 3;
+}
+
+message GetCollectionResponse {
+  common.Collection collection = 1;
+}
+
+message ListCollectionsRequest {
+  string environment_id = 1;
+  string space_id = 2;
+}
+
+message ListCollectionsResponse {
+  repeated common.Collection collections = 1;
+}
+
+message GetItemRequest {
+  string id = 1;
+  string collection_id = 2;
+  string environment_id = 3;
+  string space_id = 4;
+  string locale = 5;
+}
+
+message GetItemResponse {
+  common.Item item = 1;
+}
+
+message FindItemsRequest {
+  string space_id = 1;
+  string environment_id = 2;
+  string collection_id = 3;
+  repeated common.Filter data = 4;
+  string locale = 5;
+  int32 page_num = 8;
+  int32 page_size = 9;
+  repeated string sort = 10;
+}
+message FindItemsResponse{
+  repeated common.Item items = 1;
+  int32 total =2;
+}
+
+service ContentDelivery {
+  rpc GetSpace(GetSpaceRequest) returns(GetSpaceResponse) {}
+  rpc ListLocales(ListLocalesRequest) returns(ListLocalesResponse) {}
+  rpc GetEnvironment(GetEnvironmentRequest) returns(GetEnvironmentResponse) {}
+  rpc GetCollection(GetCollectionRequest) returns(GetCollectionResponse) {}
+  rpc ListCollections(ListCollectionsRequest) returns(ListCollectionsResponse) {}
+  rpc GetItem(GetItemRequest) returns(GetItemResponse) {}
+  rpc FindItems(FindItemsRequest) returns(FindItemsResponse) {}
+}
+
diff --git a/proto/contentmanagement/contentmanagment.proto b/proto/contentmanagement/contentmanagment.proto
new file mode 100644
index 0000000..199bb67
--- /dev/null
+++ b/proto/contentmanagement/contentmanagment.proto
@@ -0,0 +1,323 @@
+syntax = "proto3";
+
+import "google/protobuf/empty.proto";
+import "common/common.proto";
+
+option go_package = "github.com/perxteam/perxis/proto/contentmanagement;contentmanagement";
+
+package contentmanagement;
+
+// Запросы и ответы
+
+// Collection
+message CreateCollectionRequest {
+  common.Collection collection = 1;
+}
+message CreateCollectionResponse {
+  common.Collection collection = 1;
+}
+
+message GetCollectionRequest {
+  string id = 1;
+  string environment_id = 2;
+  string space_id = 3;
+}
+message GetCollectionResponse {
+  common.Collection collection = 1;
+}
+
+message ListCollectionsRequest {
+  string environment_id = 1;
+  string space_id = 2;
+}
+message ListCollectionsResponse {
+  repeated common.Collection collections = 1;
+}
+
+message UpdateCollectionRequest {
+  string id = 1;
+  string environment_id = 2;
+  string space_id = 3;
+  common.Collection collection = 4;
+}
+message UpdateCollectionResponse {}
+
+message DeleteCollectionRequest {
+  string id = 1;
+  string environment_id = 2;
+  string space_id = 3;
+}
+message DeleteCollectionResponse {}
+
+// Item
+message CreateItemRequest {
+  common.Item item = 1;
+}
+message CreateItemResponse {
+  common.Item item = 1;
+}
+
+message GetItemRequest {
+  string id = 1;
+  string environment_id = 2;
+  string space_id = 3;
+  string collection_id = 4;
+}
+message GetItemResponse {
+  common.Item item = 1;
+}
+
+message UpdateItemRequest {
+  string environment_id = 1;
+  string space_id = 2;
+  string collection_id = 3;
+  common.Item item = 4;
+}
+message UpdateItemResponse {
+  common.Item item = 1;
+}
+
+message DeleteItemRequest {
+  string id = 1;
+  string environment_id = 2;
+  string space_id = 3;
+  string collection_id = 4;
+}
+message DeleteItemResponse {}
+
+message PublishItemRequest {
+  string id = 1;
+  string environment_id = 2;
+  string space_id = 3;
+  string collection_id = 4;
+}
+message PublishItemResponse {}
+
+message UnpublishItemRequest {
+  string id = 1;
+  string environment_id = 2;
+  string space_id = 3;
+  string collection_id = 4;
+}
+message UnpublishItemResponse {}
+
+message ArchiveItemRequest {
+  string id = 1;
+  string environment_id = 2;
+  string space_id = 3;
+  string collection_id = 4;
+}
+message ArchiveItemResponse {}
+
+message UnarchiveItemRequest {
+  string id = 1;
+  string environment_id = 2;
+  string space_id = 3;
+  string collection_id = 4;
+}
+message UnarchiveItemResponse {}
+
+message ListItemRevisionsRequest {
+  string id = 1;
+  string environment_id = 2;
+  string space_id = 3;
+  string collection_id = 4;
+}
+message ListItemRevisionsResponse {
+  repeated common.Item items = 1;
+}
+
+message GetItemRevisionRequest {
+  string id = 1;
+  string environment_id = 2;
+  string space_id = 3;
+  string collection_id = 4;
+  string revision_id = 5;
+}
+message GetItemRevisionResponse {
+  common.Item item = 1;
+}
+
+message FindItemsRequest {
+  string space_id = 1;
+  string environment_id = 2;
+  string collection_id = 3;
+  repeated common.Filter data = 4;
+  int32 page_num = 8;
+  int32 page_size = 9;
+  repeated string sort = 10;
+}
+message FindItemsResponse{
+  repeated common.Item items = 1;
+  int32 total = 2;
+}
+
+message FindArchivedItemsRequest {
+  string space_id = 1;
+  string environment_id = 2;
+  string collection_id = 3;
+  repeated common.Filter data = 4;
+  int32 page_num = 8;
+  int32 page_size = 9;
+  repeated string sort = 10;
+}
+message FindArchivedItemsResponse{
+  repeated common.Item items = 1;
+  int32 total = 2;
+}
+
+// Space
+message ContentCreateSpaceRequest{
+  common.Space space = 1;
+}
+message ContentCreateSpaceResponse{
+  common.Space space = 1;
+}
+
+message ContentDeleteSpaceRequest{
+  string id = 1;
+}
+
+message ContentGetSpaceRequest{
+  string id = 1;
+}
+message ContentGetSpaceResponse{
+  common.Space space = 1;
+}
+
+message ListSpacesRequest{}
+message ListSpacesResponse{
+  repeated common.Space spaces = 1;
+}
+
+// Locale
+message CreateLocaleRequest{
+  common.Locale locale = 1;
+}
+message CreateLocaleResponse{
+  common.Locale locale = 1;
+}
+
+message ListLocalesRequest{
+  string space_id = 1;
+}
+message ListLocalesResponse{
+  repeated common.Locale locales = 1;
+}
+
+message DeleteLocaleRequest{
+  string id = 1;
+  string space_id = 2;
+}
+message DeleteLocaleResponse{}
+
+// Environment
+message CreateEnvironmentRequest{
+  string base_environment_id = 1;
+  common.Environment environment = 2;
+}
+message CreateEnvironmentResponse{
+  common.Environment environment = 1;
+}
+
+message GetEnvironmentRequest{
+  string id = 1;
+  string space_id = 2;
+}
+message GetEnvironmentResponse{
+  common.Environment environment = 1;
+}
+
+message ListEnvironmentsRequest{
+  string space_id = 1;
+}
+message ListEnvironmentsResponse{
+  repeated common.Environment environments = 1;
+}
+
+message UpdateEnvironmentRequest{
+  string id = 1;
+  string space_id = 2;
+  common.Environment environment = 3;
+}
+message UpdateEnvironmentResponse{}
+
+message DeleteEnvironmentRequest{
+  string id = 1;
+  string space_id = 2;
+}
+message DeleteEnvironmentResponse{}
+
+message SetEnvironmentAliasRequest{
+  string id = 1;
+  string space_id = 2;
+  string alias = 3;
+}
+message SetEnvironmentAliasResponse{}
+
+message RemoveEnvironmentAliasRequest{
+  string id = 1;
+  string space_id = 2;
+  string alias = 3;
+}
+message RemoveEnvironmentAliasResponse{}
+
+// Locale
+message CreateSpaceRoleRequest{
+  common.SpaceRole space_role = 1;
+}
+
+message UpdateSpaceRoleRequest{
+  common.SpaceRole space_role = 1;
+}
+
+message ListSpaceRolesRequest{
+  string space_id = 1;
+}
+message ListSpaceRolesResponse{
+  repeated common.SpaceRole space_roles = 1;
+}
+
+message DeleteSpaceRoleRequest{
+  string id = 1;
+  string space_id = 2;
+}
+
+service ContentManagement {
+  // Collection
+  rpc CreateCollection(CreateCollectionRequest) returns(CreateCollectionResponse) {}
+  rpc GetCollection(GetCollectionRequest) returns(GetCollectionResponse) {}
+  rpc ListCollections(ListCollectionsRequest) returns(ListCollectionsResponse) {}
+  rpc UpdateCollection(UpdateCollectionRequest) returns(google.protobuf.Empty) {}
+  rpc DeleteCollection(DeleteCollectionRequest) returns(google.protobuf.Empty) {}
+  // Item
+  rpc CreateItem(CreateItemRequest) returns(CreateItemResponse) {}
+  rpc GetItem(GetItemRequest) returns(GetItemResponse) {}
+  rpc UpdateItem(UpdateItemRequest) returns(UpdateItemResponse) {}
+  rpc DeleteItem(DeleteItemRequest) returns(google.protobuf.Empty) {}
+  rpc PublishItem(PublishItemRequest) returns(google.protobuf.Empty) {}
+  rpc UnpublishItem(UnpublishItemRequest) returns(google.protobuf.Empty) {}
+  rpc ArchiveItem(ArchiveItemRequest) returns(google.protobuf.Empty) {}
+  rpc UnarchiveItem(UnarchiveItemRequest) returns(google.protobuf.Empty) {}
+  rpc ListItemRevisions(ListItemRevisionsRequest) returns(ListItemRevisionsResponse) {}
+  rpc GetItemRevision(GetItemRevisionRequest) returns(GetItemRevisionResponse) {}
+  rpc FindItems(FindItemsRequest) returns(FindItemsResponse) {}
+  rpc FindArchivedItems(FindArchivedItemsRequest) returns(FindArchivedItemsResponse) {}
+  // Locale
+  rpc CreateLocale(CreateLocaleRequest) returns(CreateLocaleResponse) {}
+  rpc ListLocales(ListLocalesRequest) returns(ListLocalesResponse) {}
+  rpc DeleteLocale(DeleteLocaleRequest) returns(google.protobuf.Empty) {}
+  // Environment
+  rpc CreateEnvironment(CreateEnvironmentRequest) returns(CreateEnvironmentResponse) {}
+  rpc GetEnvironment(GetEnvironmentRequest) returns(GetEnvironmentResponse) {}
+  rpc ListEnvironments(ListEnvironmentsRequest) returns(ListEnvironmentsResponse) {}
+  rpc UpdateEnvironment(UpdateEnvironmentRequest) returns(google.protobuf.Empty) {}
+  rpc DeleteEnvironment(DeleteEnvironmentRequest) returns(google.protobuf.Empty) {}
+  rpc SetEnvironmentAlias(SetEnvironmentAliasRequest) returns(google.protobuf.Empty) {}
+  rpc RemoveEnvironmentAlias(RemoveEnvironmentAliasRequest) returns(google.protobuf.Empty) {}
+  // Space Role
+  rpc CreateSpaceRole(CreateSpaceRoleRequest) returns(google.protobuf.Empty) {}
+  rpc UpdateSpaceRole(UpdateSpaceRoleRequest) returns(google.protobuf.Empty) {}
+  rpc ListSpaceRoles(ListSpaceRolesRequest) returns(ListSpaceRolesResponse) {}
+  rpc DeleteSpaceRole(DeleteSpaceRoleRequest) returns(google.protobuf.Empty) {}
+}
diff --git a/proto/environments/environments.proto b/proto/environments/environments.proto
new file mode 100644
index 0000000..45bd93e
--- /dev/null
+++ b/proto/environments/environments.proto
@@ -0,0 +1,81 @@
+syntax = "proto3";
+
+import "google/protobuf/empty.proto";
+
+option go_package = "github.com/perxteam/perxis/proto/environments;environments";
+
+package content.environments;
+
+message Environment {
+  string id = 1;
+  string description = 2;
+  enum State {
+    UNKNOWN = 0;
+    PREPARING = 1;
+    READY = 2;
+    FAILED = 3;
+  }
+  State state = 3;
+  repeated string aliases = 5;
+}
+
+message CreateRequest {
+  string space_id = 1;
+  string base_id = 2;
+  string env_id = 3;
+  string description  = 4;
+}
+
+message CreateResponse {
+  Environment env = 1;
+}
+
+message ListRequest {
+  string space_id = 1;
+}
+
+message ListResponse {
+  repeated Environment envs = 1;
+}
+
+message GetRequest {
+  string space_id = 1;
+  string env_id = 2;
+}
+
+message GetResponse {
+  Environment env = 1;
+}
+
+message UpdateRequest {
+  string space_id = 1;
+  string env_id = 2;
+  string description  = 3;
+}
+
+message SetAliasRequest {
+  string space_id = 1;
+  string env_id = 2;
+  string alias  = 3;
+}
+
+message RemoveAliasRequest {
+  string space_id = 1;
+  string env_id = 2;
+  string alias  = 3;
+}
+
+message DeleteRequest {
+  string space_id = 1;
+  string env_id = 2;
+}
+
+service Environments {
+  rpc Create(CreateRequest) returns(CreateResponse) {}
+  rpc Get(GetRequest) returns(GetResponse) {}
+  rpc List(ListRequest) returns(ListResponse) {}
+  rpc Update(UpdateRequest) returns(google.protobuf.Empty) {}
+  rpc SetAlias(SetAliasRequest) returns(google.protobuf.Empty) {}
+  rpc RemoveAlias(RemoveAliasRequest) returns(google.protobuf.Empty) {}
+  rpc Delete(DeleteRequest) returns(google.protobuf.Empty) {}
+}
\ No newline at end of file
diff --git a/proto/file/file.proto b/proto/file/file.proto
new file mode 100644
index 0000000..3fd40d2
--- /dev/null
+++ b/proto/file/file.proto
@@ -0,0 +1,89 @@
+syntax = "proto3";
+
+import "google/protobuf/empty.proto";
+import "common/common.proto";
+
+option go_package = "github.com/perxteam/perxis/proto/file;file";
+
+package file;
+
+// Сущности
+message Upload {
+  common.File file = 1;
+  string upload_id = 2;           // Идентификатор загрузки хранилища
+  int32 part_size = 3;           // Размер блока для загрузки
+  repeated string part_urls = 4; // Адреса для загрузки пол
+  repeated CompletedPart parts = 5;  // Идентификаторы загруженных блоков (S3 ETAGs)
+}
+
+message CompletedPart {
+  int32 number = 1;
+  string id = 2;
+}
+
+// Запросы и ответы
+
+message StartUploadRequest {
+  Upload upload = 1;
+}
+message StartUploadResponse {
+  Upload upload = 1;
+}
+
+message CompleteUploadRequest {
+  Upload upload = 1;
+}
+message CompleteUploadResponse {
+  Upload upload = 1;
+}
+
+message AbortUploadRequest {
+  Upload upload = 1;
+}
+message AbortUploadResponse {}
+
+message MoveUploadRequest {
+  Upload upload = 1;
+}
+message MoveUploadResponse {
+  common.File file = 1;
+}
+
+message GetFileRequest {
+  string id = 1;
+}
+message GetFileResponse {
+  common.File file = 1;
+}
+
+message DeleteFileRequest {
+  common.File file = 1;
+}
+message DeleteFileResponse {}
+
+service FileService {
+  // StartUpload - инициирует процедуру загрузки файла в файловое хранилище.
+  // Используется клиентским приложением для начала загрузки файла
+  rpc StartUpload(StartUploadRequest) returns(StartUploadResponse) {}
+
+  // CompleteUpload - завершает процедуру загрузку файла
+  rpc CompleteUpload(CompleteUploadRequest) returns(CompleteUploadResponse) {}
+
+  // AbortUpload - прерывает процедуру загрузки файла, все загруженные части файла удаляются их хранилища
+  rpc AbortUpload(AbortUploadRequest) returns(google.protobuf.Empty) {}
+
+  // MoveUpload - перемещает загруженный файл из временного расположения в постоянное месторасположения.
+  // После перемещение загрузки хранилище выдает новый идентификатор постоянного файла
+  rpc MoveUpload(MoveUploadRequest) returns(MoveUploadResponse) {}
+
+  // GetFile - получить информацию о файле (ссылку) по ID
+  rpc GetFile(GetFileRequest) returns(GetFileResponse) {}
+
+  // DeleteFile - удаляет файл. Если происходит удаление оригинала,
+  // удаляются и все связанные структуры
+  // Возможны следующие ситуации:
+  //  - Удаление оригинального файла. Удаляется файл и все связанные с ним файлы.
+  //  - Удаление связанного файла. Для удаления конкретного файла передается 'ID', 'Type' и 'Name'
+  //  - Удаления связанных файлов конкретного типа (например, все 'thumbnails'). Передается 'ID' и 'Type'
+  rpc DeleteFile(DeleteFileRequest) returns(google.protobuf.Empty) {}
+}
diff --git a/proto/invitations/invitations.proto b/proto/invitations/invitations.proto
new file mode 100644
index 0000000..3cf89d1
--- /dev/null
+++ b/proto/invitations/invitations.proto
@@ -0,0 +1,107 @@
+syntax = "proto3";
+
+import "google/protobuf/timestamp.proto";
+import "google/protobuf/empty.proto";
+import "google/protobuf/wrappers.proto";
+
+option go_package = "github.com/perxteam/perxis/proto/invitations;invitations";
+
+package content.invitations;
+
+message Invitation {
+  string id = 1;
+  string email = 2;
+  string organization_id = 3;
+  string space_id = 4;
+  string owner_id = 5;
+  string role = 6;
+  google.protobuf.Timestamp created_at = 7;
+  google.protobuf.Timestamp valid_until = 8;
+}
+
+message Filter {
+  repeated string id = 1;
+  repeated string email = 2;
+  repeated string organization_id = 3;
+  repeated string space_id = 4;
+  repeated string owner_id = 5;
+  repeated string role = 6;
+}
+
+message FindOptions {
+  repeated string sort = 1;
+  int32 page_num = 2;
+  int32 page_size = 3;
+}
+
+message CreateRequest {
+  string email = 1;
+  string space_id = 2;
+  string role = 3;
+  string owner_id = 4;
+  google.protobuf.Timestamp valid_until = 5;
+}
+
+message CreateResponse {
+  Invitation invitation = 1;
+}
+
+message GetRequest {
+  string invitation_id = 1;
+}
+
+message GetResponse {
+  Invitation invitation = 1;
+}
+
+message UpdateRequest {
+  string invitation_id = 1;
+  google.protobuf.BoolValue sent = 2; // Флаг отправки приглашения
+  google.protobuf.BoolValue pending = 3; // Флаг принятия приглашения
+  google.protobuf.Timestamp sent_at = 4; // Время отправки приглашения
+  google.protobuf.Timestamp valid_until = 5; // Время до которого приглашение действует
+}
+
+message UpdateInvitationResponse {}
+
+message AcceptRequest {
+  string invitation_id = 1;
+  string user_id = 2;
+}
+
+message AcceptInvitationResponse {}
+
+message FindRequest {
+  Filter filter = 1;
+  FindOptions opts = 2;
+}
+
+message FindResponse {
+  repeated Invitation invitations = 1;
+  int64 total = 2;
+}
+
+message DeleteRequest {
+  string invitation_id = 1;
+}
+
+message DeleteSpaceInvitationResponse {}
+
+service Invitations  {
+  rpc Create(CreateRequest) returns(CreateResponse) {}
+
+  // Получить данные о приглашении
+  rpc Get(GetRequest) returns(GetResponse) {}
+
+  // Обновить данные о приглашении
+  // rpc Update(UpdateRequest) returns(google.protobuf.Empty) {}
+
+  // Принять приглашение
+  rpc Accept(AcceptRequest) returns(google.protobuf.Empty) {}
+
+  // Получить список приглашений для пространства
+  rpc Find(FindRequest) returns(FindResponse) {}
+
+  // Удалить приглашение
+  rpc Delete(DeleteRequest) returns(google.protobuf.Empty) {}
+}
diff --git a/proto/locales/locales.proto b/proto/locales/locales.proto
new file mode 100644
index 0000000..e9ad6c9
--- /dev/null
+++ b/proto/locales/locales.proto
@@ -0,0 +1,41 @@
+syntax = "proto3";
+
+import "google/protobuf/empty.proto";
+
+option go_package = "github.com/perxteam/perxis/proto/locales;locales";
+
+package content.locales;
+
+message Locale {
+  string id = 1;
+  string name = 2;
+  string space_id = 3;
+}
+
+message CreateRequest {
+  string locale_id = 1;
+  string name = 2;
+  string space_id  = 3;
+}
+
+message CreateResponse {
+  Locale locale = 1;
+}
+
+message ListRequest {
+  string space_id = 1;
+}
+message ListResponse {
+  repeated Locale locales = 1;
+}
+
+message DeleteRequest {
+  string locale_id = 1;
+  string space_id = 2;
+}
+
+service Locales {
+  rpc Create(CreateRequest) returns(CreateResponse) {}
+  rpc List(ListRequest) returns(ListResponse) {}
+  rpc Delete(DeleteRequest) returns(google.protobuf.Empty) {}
+}
\ No newline at end of file
diff --git a/proto/members/members.proto b/proto/members/members.proto
new file mode 100644
index 0000000..149f98e
--- /dev/null
+++ b/proto/members/members.proto
@@ -0,0 +1,65 @@
+syntax = "proto3";
+
+import "google/protobuf/empty.proto";
+
+option go_package = "github.com/perxteam/perxis/proto/members;members";
+
+package account.members;
+
+// Роль пользователя в организации
+enum Role {
+  NOT_MEMBER = 0; // Не является членом команды - значение по умолчанию
+  MEMBER = 1; // Входит в организацию и команды, может получать доступ к Space в соответствии с политикой доступа
+  OWNER = 2; // admin + может приглашать пользователей на роль owner
+  ADMIN = 3; // Входит в организацию, видит все Space, может задавать политики доступа, может приглашать пользователей на роли member, admin
+}
+
+message Member {
+  string org_id = 1;
+  string user_id = 2;
+  Role role = 3;
+}
+
+message SetRequest {
+  string org_id = 1;
+  string user_id = 2;
+  Role role = 3;
+}
+
+message GetRequest {
+  string org_id = 1;
+  string user_id = 2;
+}
+
+message GetResponse {
+  Role role = 3;
+}
+
+message RemoveRequest {
+  string org_id = 1;
+  string user_id = 2;
+}
+
+message ListMembersRequest {
+  string org_id = 1;
+}
+
+message ListMembersResponse {
+  repeated Member members = 1;
+}
+
+message ListOrganizationsRequest {
+  string user_id = 1;
+}
+
+message ListOrganizationsResponse {
+  repeated Member organizations = 1;
+}
+
+service Members {
+  rpc Set(SetRequest) returns(google.protobuf.Empty) {}
+  rpc Get(GetRequest) returns(GetResponse) {}
+  rpc Remove(RemoveRequest) returns(google.protobuf.Empty) {}
+  rpc ListMembers(ListMembersRequest) returns(ListMembersResponse) {}
+  rpc ListOrganizations(ListOrganizationsRequest) returns(ListOrganizationsResponse) {}
+}
diff --git a/proto/organizations/organizations.proto b/proto/organizations/organizations.proto
new file mode 100644
index 0000000..a08f7e6
--- /dev/null
+++ b/proto/organizations/organizations.proto
@@ -0,0 +1,73 @@
+syntax = "proto3";
+
+import "google/protobuf/empty.proto";
+import "common/common.proto";
+
+option go_package = "github.com/perxteam/perxis/proto/organizations;organizations";
+
+package account.organizations;
+
+// Организация
+message Organization {
+  string id = 1; // Идентификатор организации
+  string name = 2; // Имя организации
+  string description = 3; // Описание организации
+  string logo_url = 5; // URI изображения логотипа
+}
+
+// Запросы и ответы
+
+message CreateRequest {
+  string name = 1;
+  string description = 2;
+  string logo_url = 3;
+  string owner_id = 4;
+}
+
+message CreateResponse {
+  Organization org = 1;
+}
+
+message GetRequest {
+  string org_id = 1;
+}
+
+message GetResponse {
+  Organization org = 1;
+}
+
+
+message UpdateRequest {
+  string org_id = 1;
+  string name = 2;
+  string description = 3;
+  string logo_url = 4;
+}
+
+
+message DeleteRequest {
+  string org_id = 1;
+}
+
+message Filter {
+  repeated string ids = 3;
+  repeated string names = 4;
+}
+
+message FindRequest {
+  Filter filter = 1;
+  common.FindOptions opts = 2;
+}
+
+message FindResponse {
+  repeated Organization orgs = 1;
+  int64 total = 2;
+}
+
+service Organizations {
+  rpc Create(CreateRequest) returns(CreateResponse) {}
+  rpc Get(GetRequest) returns(GetResponse) {}
+  rpc Delete(DeleteRequest) returns(google.protobuf.Empty) {}
+  rpc Find(FindRequest) returns(FindResponse) {}
+  rpc Update(UpdateRequest) returns(google.protobuf.Empty) {}
+}
diff --git a/proto/spaces/spaces.proto b/proto/spaces/spaces.proto
new file mode 100644
index 0000000..8aeccd6
--- /dev/null
+++ b/proto/spaces/spaces.proto
@@ -0,0 +1,78 @@
+syntax = "proto3";
+
+option go_package = "github.com/perxteam/perxis/proto/spaces;spaces";
+
+package content.spaces;
+
+import "google/protobuf/empty.proto";
+
+message Space {
+  string id = 1;
+  string organization_id = 2;
+  string name = 3;
+  string description = 4;
+  State state = 5;
+  Config config = 10;
+}
+
+enum State {
+  UNKNOWN = 0;
+  NEW = 1;
+  READY = 2;
+  PREPARING = 3;
+  MAINTENANCE = 4;
+  MIGRATION = 5;
+  DELETING = 6;
+}
+
+message Config {
+  repeated string features = 1;
+}
+
+message CreateRequest {
+  string org_id = 1;
+  string name = 2;
+  string description = 3;
+  Config config = 5;
+}
+
+message CreateResponse {
+  Space space = 1;
+}
+
+message GetRequest {
+  string space_id = 1;
+}
+
+message GetResponse {
+  Space space = 1;
+}
+
+message ListRequest {
+  string org_id = 1;
+}
+
+message ListResponse {
+  repeated Space spaces = 1;
+}
+
+
+message UpdateRequest {
+  string space_id = 1;
+  string name = 2;
+  string description = 3;
+  Config config = 5;
+}
+
+
+message DeleteRequest {
+  string space_id = 1;
+}
+
+service Spaces {
+  rpc Create(CreateRequest) returns(CreateResponse) {}
+  rpc Get(GetRequest) returns(GetResponse) {}
+  rpc List(ListRequest) returns(ListResponse) {}
+  rpc Update(UpdateRequest) returns(google.protobuf.Empty) {}
+  rpc Delete(DeleteRequest) returns(google.protobuf.Empty) {}
+}
diff --git a/proto/users/users.proto b/proto/users/users.proto
new file mode 100644
index 0000000..46d164c
--- /dev/null
+++ b/proto/users/users.proto
@@ -0,0 +1,87 @@
+syntax = "proto3";
+
+import "google/protobuf/empty.proto";
+import "google/protobuf/wrappers.proto";
+import "common/common.proto";
+
+option go_package = "github.com/perxteam/perxis/proto/users;users";
+
+package account.users;
+
+message User {
+  string id = 1; // Уникальный идентификатор, присваивается системой
+  string name = 2; // Уникальное имя, login
+  repeated string identities = 3; // Authorization subjects (JWT sub claims)
+  string display_name = 4; // Имя пользователя для отображения
+  string email = 5; // Email, указывается пользователем
+  google.protobuf.BoolValue email_verified = 6; // Флаг что email проверен
+  string avatar_url = 7; // URI изображения пользователя
+  google.protobuf.BoolValue system = 10; // Системный пользователь (может получать доступ к расширенному API)
+}
+
+message Filter {
+  repeated string id = 1;
+  repeated string name = 2;
+  repeated string identities = 3;
+  repeated string display_name = 4;
+  repeated string email = 5;
+  google.protobuf.BoolValue email_verified = 6;
+  google.protobuf.BoolValue system = 10;
+}
+
+message CreateRequest {
+  User create = 1;
+}
+
+message CreateResponse {
+  User user = 1;
+}
+
+// userId = `current` для получения текущего пользователя
+message GetRequest {
+  string user_id = 1;
+}
+
+message GetResponse {
+  User user = 1;
+}
+
+message FindRequest {
+  Filter filter = 1;
+  common.FindOptions options = 10;
+}
+
+message FindResponse {
+  repeated User users = 1;
+  int64 total = 2;
+}
+
+// userId = `current` для обновления текущего пользователя
+message UpdateRequest {
+  string user_id = 1; // Уникальный идентификатор, присваивается системой
+  User update = 2; // Содержит только поля необходимые для обновления
+}
+
+message DeleteRequest {
+  string user_id = 1;
+}
+
+service Users  {
+  // Создание пользователя или регистрация текущего пользователя в системе, если create.id == `current`
+  rpc Create(CreateRequest) returns(CreateResponse) {}
+
+  //  - Получение любого пользователя по идентификатору
+  //  - Получение текущего (от лица которого делается запрос) пользователя по специальному идентификатору `current`
+  rpc Get(GetRequest) returns(GetResponse) {}
+
+  // Найти пользователей с фильтрацией. Фильтры доступны пользователям в зависимости от их прав
+  rpc Find(FindRequest) returns(FindResponse) {}
+
+  //  - Обновление существующего пользователя по идентификатору
+  //  - Обновление текущего пользователя по спец. идентификатору `current`
+  rpc Update(UpdateRequest) returns(google.protobuf.Empty) {}
+
+  //  - Удаление существующего пользователя по идентификатору
+  //  - Удаление текущего пользователя по спец. идентификатору `current`
+  rpc Delete(DeleteRequest) returns(google.protobuf.Empty) {}
+}
diff --git a/requirements.txt b/requirements.txt
new file mode 100644
index 0000000..93fddc4
--- /dev/null
+++ b/requirements.txt
@@ -0,0 +1,3 @@
+grpcio==1.36.1
+protobuf==3.15.4
+six==1.15.0
diff --git a/setup.py b/setup.py
new file mode 100644
index 0000000..bd8f67c
--- /dev/null
+++ b/setup.py
@@ -0,0 +1,40 @@
+import os
+import pathlib
+
+from setuptools import setup, find_packages
+
+here = pathlib.Path(__file__).parent.resolve()
+
+long_description = (here / 'README.md').read_text(encoding='utf-8')
+
+
+def load_requirements():
+    return open(os.path.join(os.path.dirname(__file__), 'requirements.txt')).readlines()
+
+
+setup(
+    name='perxis',
+    version='0.0.1',
+    description='Perxis python client',
+    long_description=long_description,
+    long_description_content_type='text/markdown',
+    url='https://github.com/perxteam/perxis-python/',
+    author='Eterevskiy Georgiy',
+    author_email='eterevskiy@perx.ru',
+    classifiers=[
+        'Development Status :: 3 - Alpha',
+        'Intended Audience :: Developers',
+        'Topic :: Software Development :: Build Tools',
+        'License :: OSI Approved :: MIT License',
+        'Programming Language :: Python :: 3',
+        'Programming Language :: Python :: 3.6',
+        'Programming Language :: Python :: 3.7',
+        'Programming Language :: Python :: 3.8',
+        'Programming Language :: Python :: 3.9',
+        'Programming Language :: Python :: 3 :: Only',
+    ],
+    packages=find_packages(),
+    python_requires='>=3.6, <4',
+    install_requires=load_requirements(),
+
+)
-- 
GitLab