From 770cecbcde17f86fd8a0fe7810f1b1fe7b30c651 Mon Sep 17 00:00:00 2001
From: antondmtvch <antondmtvch@gmail.com>
Date: Fri, 23 Jun 2023 11:18:32 +0300
Subject: [PATCH] add perxis files

---
 perxis/clients/clients_pb2.py                 |  869 +++++
 perxis/clients/clients_pb2_grpc.py            |  272 ++
 perxis/collaborators/collaborators_pb2.py     |  450 +++
 .../collaborators/collaborators_pb2_grpc.py   |  199 +
 perxis/collections/collections_pb2.py         | 1028 ++++++
 perxis/collections/collections_pb2_grpc.py    |  232 ++
 perxis/common/common_pb2.py                   |  871 +++++
 perxis/common/common_pb2_grpc.py              |    4 +
 perxis/delivery/delivery_pb2.py               |  994 +++++
 perxis/delivery/delivery_pb2_grpc.py          |  297 ++
 perxis/environments/environments_pb2.py       |  894 +++++
 perxis/environments/environments_pb2_grpc.py  |  298 ++
 perxis/extensions/extension_pb2.py            | 1140 ++++++
 perxis/extensions/extension_pb2_grpc.py       |  227 ++
 perxis/extensions/manager_pb2.py              |  605 +++
 perxis/extensions/manager_pb2_grpc.py         |  148 +
 perxis/files/files_pb2.py                     |  909 +++++
 perxis/files/files_pb2_grpc.py                |  285 ++
 perxis/images/images_pb2.py                   |  237 ++
 perxis/images/images_pb2_grpc.py              |   77 +
 perxis/invitations/invitations_pb2.py         |  839 +++++
 perxis/invitations/invitations_pb2_grpc.py    |  206 ++
 perxis/items/items_pb2.py                     | 3288 +++++++++++++++++
 perxis/items/items_pb2_grpc.py                |  646 ++++
 perxis/locales/locales_pb2.py                 |  343 ++
 perxis/locales/locales_pb2_grpc.py            |  133 +
 perxis/members/members_pb2.py                 |  656 ++++
 perxis/members/members_pb2_grpc.py            |  260 ++
 perxis/organizations/organizations_pb2.py     |  564 +++
 .../organizations/organizations_pb2_grpc.py   |  199 +
 perxis/references/references_pb2.py           |  217 ++
 perxis/references/references_pb2_grpc.py      |   72 +
 perxis/roles/roles_pb2.py                     |  515 +++
 perxis/roles/roles_pb2_grpc.py                |  204 +
 perxis/spaces/spaces_pb2.py                   |  927 +++++
 perxis/spaces/spaces_pb2_grpc.py              |  377 ++
 perxis/status/status_pb2.py                   |   88 +
 perxis/status/status_pb2_grpc.py              |    4 +
 perxis/users/users_pb2.py                     |  708 ++++
 perxis/users/users_pb2_grpc.py                |  242 ++
 perxis/versions/account/versions_pb2.py       |  101 +
 perxis/versions/account/versions_pb2_grpc.py  |   67 +
 perxis/versions/content/versions_pb2.py       |  101 +
 perxis/versions/content/versions_pb2_grpc.py  |   67 +
 44 files changed, 20860 insertions(+)
 create mode 100644 perxis/clients/clients_pb2.py
 create mode 100644 perxis/clients/clients_pb2_grpc.py
 create mode 100644 perxis/collaborators/collaborators_pb2.py
 create mode 100644 perxis/collaborators/collaborators_pb2_grpc.py
 create mode 100644 perxis/collections/collections_pb2.py
 create mode 100644 perxis/collections/collections_pb2_grpc.py
 create mode 100644 perxis/common/common_pb2.py
 create mode 100644 perxis/common/common_pb2_grpc.py
 create mode 100644 perxis/delivery/delivery_pb2.py
 create mode 100644 perxis/delivery/delivery_pb2_grpc.py
 create mode 100644 perxis/environments/environments_pb2.py
 create mode 100644 perxis/environments/environments_pb2_grpc.py
 create mode 100644 perxis/extensions/extension_pb2.py
 create mode 100644 perxis/extensions/extension_pb2_grpc.py
 create mode 100644 perxis/extensions/manager_pb2.py
 create mode 100644 perxis/extensions/manager_pb2_grpc.py
 create mode 100644 perxis/files/files_pb2.py
 create mode 100644 perxis/files/files_pb2_grpc.py
 create mode 100644 perxis/images/images_pb2.py
 create mode 100644 perxis/images/images_pb2_grpc.py
 create mode 100644 perxis/invitations/invitations_pb2.py
 create mode 100644 perxis/invitations/invitations_pb2_grpc.py
 create mode 100644 perxis/items/items_pb2.py
 create mode 100644 perxis/items/items_pb2_grpc.py
 create mode 100644 perxis/locales/locales_pb2.py
 create mode 100644 perxis/locales/locales_pb2_grpc.py
 create mode 100644 perxis/members/members_pb2.py
 create mode 100644 perxis/members/members_pb2_grpc.py
 create mode 100644 perxis/organizations/organizations_pb2.py
 create mode 100644 perxis/organizations/organizations_pb2_grpc.py
 create mode 100644 perxis/references/references_pb2.py
 create mode 100644 perxis/references/references_pb2_grpc.py
 create mode 100644 perxis/roles/roles_pb2.py
 create mode 100644 perxis/roles/roles_pb2_grpc.py
 create mode 100644 perxis/spaces/spaces_pb2.py
 create mode 100644 perxis/spaces/spaces_pb2_grpc.py
 create mode 100644 perxis/status/status_pb2.py
 create mode 100644 perxis/status/status_pb2_grpc.py
 create mode 100644 perxis/users/users_pb2.py
 create mode 100644 perxis/users/users_pb2_grpc.py
 create mode 100644 perxis/versions/account/versions_pb2.py
 create mode 100644 perxis/versions/account/versions_pb2_grpc.py
 create mode 100644 perxis/versions/content/versions_pb2.py
 create mode 100644 perxis/versions/content/versions_pb2_grpc.py

diff --git a/perxis/clients/clients_pb2.py b/perxis/clients/clients_pb2.py
new file mode 100644
index 0000000..c8a087c
--- /dev/null
+++ b/perxis/clients/clients_pb2.py
@@ -0,0 +1,869 @@
+# -*- coding: utf-8 -*-
+# Generated by the protocol buffer compiler.  DO NOT EDIT!
+# source: clients/clients.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='clients/clients.proto',
+  package='content.clients',
+  syntax='proto3',
+  serialized_options=b'Z2git.perx.ru/perxis/perxis-go/proto/clients;clients',
+  create_key=_descriptor._internal_create_key,
+  serialized_pb=b'\n\x15\x63lients/clients.proto\x12\x0f\x63ontent.clients\x1a\x1bgoogle/protobuf/empty.proto\"\x9d\x03\n\x06\x43lient\x12\n\n\x02id\x18\x01 \x01(\t\x12\x10\n\x08space_id\x18\x02 \x01(\t\x12\x0c\n\x04name\x18\x03 \x01(\t\x12\x13\n\x0b\x64\x65scription\x18\x06 \x01(\t\x12\x15\n\x08\x64isabled\x18\x07 \x01(\x08H\x00\x88\x01\x01\x12\x0f\n\x07role_id\x18\x08 \x01(\t\x12,\n\x05oauth\x18\n \x01(\x0b\x32\x1d.content.clients.Client.OAuth\x12(\n\x03tls\x18\x0b \x01(\x0b\x32\x1b.content.clients.Client.TLS\x12/\n\x07\x61pi_key\x18\x0c \x01(\x0b\x32\x1e.content.clients.Client.APIKey\x1aU\n\x05OAuth\x12\x11\n\tclient_id\x18\x04 \x01(\t\x12\x0f\n\x07\x61uth_id\x18\x05 \x01(\t\x12\x11\n\ttoken_url\x18\n \x01(\t\x12\x15\n\rclient_secret\x18\x0b \x01(\t\x1a%\n\x06\x41PIKey\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\x0e\n\x06rotate\x18\x02 \x01(\x08\x1a\x16\n\x03TLS\x12\x0f\n\x07subject\x18\x01 \x01(\tB\x0b\n\t_disabled\"8\n\rCreateRequest\x12\'\n\x06\x63lient\x18\x01 \x01(\x0b\x32\x17.content.clients.Client\":\n\x0e\x43reateResponse\x12(\n\x07\x63reated\x18\x01 \x01(\x0b\x32\x17.content.clients.Client\"*\n\nGetRequest\x12\x10\n\x08space_id\x18\x01 \x01(\t\x12\n\n\x02id\x18\x02 \x01(\t\"6\n\x0bGetResponse\x12\'\n\x06\x63lient\x18\x01 \x01(\x0b\x32\x17.content.clients.Client\"_\n\x0cGetByRequest\x12\x10\n\x08space_id\x18\x01 \x01(\t\x12\x17\n\x0foauth_client_id\x18\x02 \x01(\t\x12\x13\n\x0btls_subject\x18\x03 \x01(\t\x12\x0f\n\x07\x61pi_key\x18\x04 \x01(\t\"8\n\rGetByResponse\x12\'\n\x06\x63lient\x18\x01 \x01(\x0b\x32\x17.content.clients.Client\"8\n\rUpdateRequest\x12\'\n\x06\x63lient\x18\x01 \x01(\x0b\x32\x17.content.clients.Client\"\x1f\n\x0bListRequest\x12\x10\n\x08space_id\x18\x01 \x01(\t\"8\n\x0cListResponse\x12(\n\x07\x63lients\x18\x01 \x03(\x0b\x32\x17.content.clients.Client\"-\n\rDeleteRequest\x12\x10\n\x08space_id\x18\x01 \x01(\t\x12\n\n\x02id\x18\x02 \x01(\t\"=\n\rEnableRequest\x12\x10\n\x08space_id\x18\x01 \x01(\t\x12\n\n\x02id\x18\x02 \x01(\t\x12\x0e\n\x06\x65nable\x18\x03 \x01(\x08\x32\xf7\x03\n\x07\x43lients\x12K\n\x06\x43reate\x12\x1e.content.clients.CreateRequest\x1a\x1f.content.clients.CreateResponse\"\x00\x12\x42\n\x03Get\x12\x1b.content.clients.GetRequest\x1a\x1c.content.clients.GetResponse\"\x00\x12H\n\x05GetBy\x12\x1d.content.clients.GetByRequest\x1a\x1e.content.clients.GetByResponse\"\x00\x12\x42\n\x06Update\x12\x1e.content.clients.UpdateRequest\x1a\x16.google.protobuf.Empty\"\x00\x12\x45\n\x04List\x12\x1c.content.clients.ListRequest\x1a\x1d.content.clients.ListResponse\"\x00\x12\x42\n\x06\x44\x65lete\x12\x1e.content.clients.DeleteRequest\x1a\x16.google.protobuf.Empty\"\x00\x12\x42\n\x06\x45nable\x12\x1e.content.clients.EnableRequest\x1a\x16.google.protobuf.Empty\"\x00\x42\x34Z2git.perx.ru/perxis/perxis-go/proto/clients;clientsb\x06proto3'
+  ,
+  dependencies=[google_dot_protobuf_dot_empty__pb2.DESCRIPTOR,])
+
+
+
+
+_CLIENT_OAUTH = _descriptor.Descriptor(
+  name='OAuth',
+  full_name='content.clients.Client.OAuth',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='client_id', full_name='content.clients.Client.OAuth.client_id', index=0,
+      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='auth_id', full_name='content.clients.Client.OAuth.auth_id', index=1,
+      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='token_url', full_name='content.clients.Client.OAuth.token_url', index=2,
+      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='client_secret', full_name='content.clients.Client.OAuth.client_secret', index=3,
+      number=11, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=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=324,
+  serialized_end=409,
+)
+
+_CLIENT_APIKEY = _descriptor.Descriptor(
+  name='APIKey',
+  full_name='content.clients.Client.APIKey',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='key', full_name='content.clients.Client.APIKey.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='rotate', full_name='content.clients.Client.APIKey.rotate', index=1,
+      number=2, 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=411,
+  serialized_end=448,
+)
+
+_CLIENT_TLS = _descriptor.Descriptor(
+  name='TLS',
+  full_name='content.clients.Client.TLS',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='subject', full_name='content.clients.Client.TLS.subject', 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=450,
+  serialized_end=472,
+)
+
+_CLIENT = _descriptor.Descriptor(
+  name='Client',
+  full_name='content.clients.Client',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='id', full_name='content.clients.Client.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.clients.Client.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='name', full_name='content.clients.Client.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.clients.Client.description', 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),
+    _descriptor.FieldDescriptor(
+      name='disabled', full_name='content.clients.Client.disabled', index=4,
+      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='role_id', full_name='content.clients.Client.role_id', index=5,
+      number=8, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='oauth', full_name='content.clients.Client.oauth', 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),
+    _descriptor.FieldDescriptor(
+      name='tls', full_name='content.clients.Client.tls', index=7,
+      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='api_key', full_name='content.clients.Client.api_key', index=8,
+      number=12, 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=[_CLIENT_OAUTH, _CLIENT_APIKEY, _CLIENT_TLS, ],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+    _descriptor.OneofDescriptor(
+      name='_disabled', full_name='content.clients.Client._disabled',
+      index=0, containing_type=None,
+      create_key=_descriptor._internal_create_key,
+    fields=[]),
+  ],
+  serialized_start=72,
+  serialized_end=485,
+)
+
+
+_CREATEREQUEST = _descriptor.Descriptor(
+  name='CreateRequest',
+  full_name='content.clients.CreateRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='client', full_name='content.clients.CreateRequest.client', 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=487,
+  serialized_end=543,
+)
+
+
+_CREATERESPONSE = _descriptor.Descriptor(
+  name='CreateResponse',
+  full_name='content.clients.CreateResponse',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='created', full_name='content.clients.CreateResponse.created', 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=545,
+  serialized_end=603,
+)
+
+
+_GETREQUEST = _descriptor.Descriptor(
+  name='GetRequest',
+  full_name='content.clients.GetRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='space_id', full_name='content.clients.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='id', full_name='content.clients.GetRequest.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=605,
+  serialized_end=647,
+)
+
+
+_GETRESPONSE = _descriptor.Descriptor(
+  name='GetResponse',
+  full_name='content.clients.GetResponse',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='client', full_name='content.clients.GetResponse.client', 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=649,
+  serialized_end=703,
+)
+
+
+_GETBYREQUEST = _descriptor.Descriptor(
+  name='GetByRequest',
+  full_name='content.clients.GetByRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='space_id', full_name='content.clients.GetByRequest.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='oauth_client_id', full_name='content.clients.GetByRequest.oauth_client_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='tls_subject', full_name='content.clients.GetByRequest.tls_subject', 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_key', full_name='content.clients.GetByRequest.api_key', 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=705,
+  serialized_end=800,
+)
+
+
+_GETBYRESPONSE = _descriptor.Descriptor(
+  name='GetByResponse',
+  full_name='content.clients.GetByResponse',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='client', full_name='content.clients.GetByResponse.client', 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=802,
+  serialized_end=858,
+)
+
+
+_UPDATEREQUEST = _descriptor.Descriptor(
+  name='UpdateRequest',
+  full_name='content.clients.UpdateRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='client', full_name='content.clients.UpdateRequest.client', 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=860,
+  serialized_end=916,
+)
+
+
+_LISTREQUEST = _descriptor.Descriptor(
+  name='ListRequest',
+  full_name='content.clients.ListRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='space_id', full_name='content.clients.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=918,
+  serialized_end=949,
+)
+
+
+_LISTRESPONSE = _descriptor.Descriptor(
+  name='ListResponse',
+  full_name='content.clients.ListResponse',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='clients', full_name='content.clients.ListResponse.clients', 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=951,
+  serialized_end=1007,
+)
+
+
+_DELETEREQUEST = _descriptor.Descriptor(
+  name='DeleteRequest',
+  full_name='content.clients.DeleteRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='space_id', full_name='content.clients.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='id', full_name='content.clients.DeleteRequest.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=1009,
+  serialized_end=1054,
+)
+
+
+_ENABLEREQUEST = _descriptor.Descriptor(
+  name='EnableRequest',
+  full_name='content.clients.EnableRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='space_id', full_name='content.clients.EnableRequest.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='id', full_name='content.clients.EnableRequest.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='enable', full_name='content.clients.EnableRequest.enable', index=2,
+      number=3, 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=1056,
+  serialized_end=1117,
+)
+
+_CLIENT_OAUTH.containing_type = _CLIENT
+_CLIENT_APIKEY.containing_type = _CLIENT
+_CLIENT_TLS.containing_type = _CLIENT
+_CLIENT.fields_by_name['oauth'].message_type = _CLIENT_OAUTH
+_CLIENT.fields_by_name['tls'].message_type = _CLIENT_TLS
+_CLIENT.fields_by_name['api_key'].message_type = _CLIENT_APIKEY
+_CLIENT.oneofs_by_name['_disabled'].fields.append(
+  _CLIENT.fields_by_name['disabled'])
+_CLIENT.fields_by_name['disabled'].containing_oneof = _CLIENT.oneofs_by_name['_disabled']
+_CREATEREQUEST.fields_by_name['client'].message_type = _CLIENT
+_CREATERESPONSE.fields_by_name['created'].message_type = _CLIENT
+_GETRESPONSE.fields_by_name['client'].message_type = _CLIENT
+_GETBYRESPONSE.fields_by_name['client'].message_type = _CLIENT
+_UPDATEREQUEST.fields_by_name['client'].message_type = _CLIENT
+_LISTRESPONSE.fields_by_name['clients'].message_type = _CLIENT
+DESCRIPTOR.message_types_by_name['Client'] = _CLIENT
+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['GetByRequest'] = _GETBYREQUEST
+DESCRIPTOR.message_types_by_name['GetByResponse'] = _GETBYRESPONSE
+DESCRIPTOR.message_types_by_name['UpdateRequest'] = _UPDATEREQUEST
+DESCRIPTOR.message_types_by_name['ListRequest'] = _LISTREQUEST
+DESCRIPTOR.message_types_by_name['ListResponse'] = _LISTRESPONSE
+DESCRIPTOR.message_types_by_name['DeleteRequest'] = _DELETEREQUEST
+DESCRIPTOR.message_types_by_name['EnableRequest'] = _ENABLEREQUEST
+_sym_db.RegisterFileDescriptor(DESCRIPTOR)
+
+Client = _reflection.GeneratedProtocolMessageType('Client', (_message.Message,), {
+
+  'OAuth' : _reflection.GeneratedProtocolMessageType('OAuth', (_message.Message,), {
+    'DESCRIPTOR' : _CLIENT_OAUTH,
+    '__module__' : 'clients.clients_pb2'
+    # @@protoc_insertion_point(class_scope:content.clients.Client.OAuth)
+    })
+  ,
+
+  'APIKey' : _reflection.GeneratedProtocolMessageType('APIKey', (_message.Message,), {
+    'DESCRIPTOR' : _CLIENT_APIKEY,
+    '__module__' : 'clients.clients_pb2'
+    # @@protoc_insertion_point(class_scope:content.clients.Client.APIKey)
+    })
+  ,
+
+  'TLS' : _reflection.GeneratedProtocolMessageType('TLS', (_message.Message,), {
+    'DESCRIPTOR' : _CLIENT_TLS,
+    '__module__' : 'clients.clients_pb2'
+    # @@protoc_insertion_point(class_scope:content.clients.Client.TLS)
+    })
+  ,
+  'DESCRIPTOR' : _CLIENT,
+  '__module__' : 'clients.clients_pb2'
+  # @@protoc_insertion_point(class_scope:content.clients.Client)
+  })
+_sym_db.RegisterMessage(Client)
+_sym_db.RegisterMessage(Client.OAuth)
+_sym_db.RegisterMessage(Client.APIKey)
+_sym_db.RegisterMessage(Client.TLS)
+
+CreateRequest = _reflection.GeneratedProtocolMessageType('CreateRequest', (_message.Message,), {
+  'DESCRIPTOR' : _CREATEREQUEST,
+  '__module__' : 'clients.clients_pb2'
+  # @@protoc_insertion_point(class_scope:content.clients.CreateRequest)
+  })
+_sym_db.RegisterMessage(CreateRequest)
+
+CreateResponse = _reflection.GeneratedProtocolMessageType('CreateResponse', (_message.Message,), {
+  'DESCRIPTOR' : _CREATERESPONSE,
+  '__module__' : 'clients.clients_pb2'
+  # @@protoc_insertion_point(class_scope:content.clients.CreateResponse)
+  })
+_sym_db.RegisterMessage(CreateResponse)
+
+GetRequest = _reflection.GeneratedProtocolMessageType('GetRequest', (_message.Message,), {
+  'DESCRIPTOR' : _GETREQUEST,
+  '__module__' : 'clients.clients_pb2'
+  # @@protoc_insertion_point(class_scope:content.clients.GetRequest)
+  })
+_sym_db.RegisterMessage(GetRequest)
+
+GetResponse = _reflection.GeneratedProtocolMessageType('GetResponse', (_message.Message,), {
+  'DESCRIPTOR' : _GETRESPONSE,
+  '__module__' : 'clients.clients_pb2'
+  # @@protoc_insertion_point(class_scope:content.clients.GetResponse)
+  })
+_sym_db.RegisterMessage(GetResponse)
+
+GetByRequest = _reflection.GeneratedProtocolMessageType('GetByRequest', (_message.Message,), {
+  'DESCRIPTOR' : _GETBYREQUEST,
+  '__module__' : 'clients.clients_pb2'
+  # @@protoc_insertion_point(class_scope:content.clients.GetByRequest)
+  })
+_sym_db.RegisterMessage(GetByRequest)
+
+GetByResponse = _reflection.GeneratedProtocolMessageType('GetByResponse', (_message.Message,), {
+  'DESCRIPTOR' : _GETBYRESPONSE,
+  '__module__' : 'clients.clients_pb2'
+  # @@protoc_insertion_point(class_scope:content.clients.GetByResponse)
+  })
+_sym_db.RegisterMessage(GetByResponse)
+
+UpdateRequest = _reflection.GeneratedProtocolMessageType('UpdateRequest', (_message.Message,), {
+  'DESCRIPTOR' : _UPDATEREQUEST,
+  '__module__' : 'clients.clients_pb2'
+  # @@protoc_insertion_point(class_scope:content.clients.UpdateRequest)
+  })
+_sym_db.RegisterMessage(UpdateRequest)
+
+ListRequest = _reflection.GeneratedProtocolMessageType('ListRequest', (_message.Message,), {
+  'DESCRIPTOR' : _LISTREQUEST,
+  '__module__' : 'clients.clients_pb2'
+  # @@protoc_insertion_point(class_scope:content.clients.ListRequest)
+  })
+_sym_db.RegisterMessage(ListRequest)
+
+ListResponse = _reflection.GeneratedProtocolMessageType('ListResponse', (_message.Message,), {
+  'DESCRIPTOR' : _LISTRESPONSE,
+  '__module__' : 'clients.clients_pb2'
+  # @@protoc_insertion_point(class_scope:content.clients.ListResponse)
+  })
+_sym_db.RegisterMessage(ListResponse)
+
+DeleteRequest = _reflection.GeneratedProtocolMessageType('DeleteRequest', (_message.Message,), {
+  'DESCRIPTOR' : _DELETEREQUEST,
+  '__module__' : 'clients.clients_pb2'
+  # @@protoc_insertion_point(class_scope:content.clients.DeleteRequest)
+  })
+_sym_db.RegisterMessage(DeleteRequest)
+
+EnableRequest = _reflection.GeneratedProtocolMessageType('EnableRequest', (_message.Message,), {
+  'DESCRIPTOR' : _ENABLEREQUEST,
+  '__module__' : 'clients.clients_pb2'
+  # @@protoc_insertion_point(class_scope:content.clients.EnableRequest)
+  })
+_sym_db.RegisterMessage(EnableRequest)
+
+
+DESCRIPTOR._options = None
+
+_CLIENTS = _descriptor.ServiceDescriptor(
+  name='Clients',
+  full_name='content.clients.Clients',
+  file=DESCRIPTOR,
+  index=0,
+  serialized_options=None,
+  create_key=_descriptor._internal_create_key,
+  serialized_start=1120,
+  serialized_end=1623,
+  methods=[
+  _descriptor.MethodDescriptor(
+    name='Create',
+    full_name='content.clients.Clients.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.clients.Clients.Get',
+    index=1,
+    containing_service=None,
+    input_type=_GETREQUEST,
+    output_type=_GETRESPONSE,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='GetBy',
+    full_name='content.clients.Clients.GetBy',
+    index=2,
+    containing_service=None,
+    input_type=_GETBYREQUEST,
+    output_type=_GETBYRESPONSE,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='Update',
+    full_name='content.clients.Clients.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='List',
+    full_name='content.clients.Clients.List',
+    index=4,
+    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.clients.Clients.Delete',
+    index=5,
+    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='Enable',
+    full_name='content.clients.Clients.Enable',
+    index=6,
+    containing_service=None,
+    input_type=_ENABLEREQUEST,
+    output_type=google_dot_protobuf_dot_empty__pb2._EMPTY,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+])
+_sym_db.RegisterServiceDescriptor(_CLIENTS)
+
+DESCRIPTOR.services_by_name['Clients'] = _CLIENTS
+
+# @@protoc_insertion_point(module_scope)
diff --git a/perxis/clients/clients_pb2_grpc.py b/perxis/clients/clients_pb2_grpc.py
new file mode 100644
index 0000000..bba8cfb
--- /dev/null
+++ b/perxis/clients/clients_pb2_grpc.py
@@ -0,0 +1,272 @@
+# Generated by the gRPC Python protocol compiler plugin. DO NOT EDIT!
+"""Client and server classes corresponding to protobuf-defined services."""
+import grpc
+
+from perxis.clients import clients_pb2 as clients_dot_clients__pb2
+from google.protobuf import empty_pb2 as google_dot_protobuf_dot_empty__pb2
+
+
+class ClientsStub(object):
+    """Missing associated documentation comment in .proto file."""
+
+    def __init__(self, channel):
+        """Constructor.
+
+        Args:
+            channel: A grpc.Channel.
+        """
+        self.Create = channel.unary_unary(
+                '/content.clients.Clients/Create',
+                request_serializer=clients_dot_clients__pb2.CreateRequest.SerializeToString,
+                response_deserializer=clients_dot_clients__pb2.CreateResponse.FromString,
+                )
+        self.Get = channel.unary_unary(
+                '/content.clients.Clients/Get',
+                request_serializer=clients_dot_clients__pb2.GetRequest.SerializeToString,
+                response_deserializer=clients_dot_clients__pb2.GetResponse.FromString,
+                )
+        self.GetBy = channel.unary_unary(
+                '/content.clients.Clients/GetBy',
+                request_serializer=clients_dot_clients__pb2.GetByRequest.SerializeToString,
+                response_deserializer=clients_dot_clients__pb2.GetByResponse.FromString,
+                )
+        self.Update = channel.unary_unary(
+                '/content.clients.Clients/Update',
+                request_serializer=clients_dot_clients__pb2.UpdateRequest.SerializeToString,
+                response_deserializer=google_dot_protobuf_dot_empty__pb2.Empty.FromString,
+                )
+        self.List = channel.unary_unary(
+                '/content.clients.Clients/List',
+                request_serializer=clients_dot_clients__pb2.ListRequest.SerializeToString,
+                response_deserializer=clients_dot_clients__pb2.ListResponse.FromString,
+                )
+        self.Delete = channel.unary_unary(
+                '/content.clients.Clients/Delete',
+                request_serializer=clients_dot_clients__pb2.DeleteRequest.SerializeToString,
+                response_deserializer=google_dot_protobuf_dot_empty__pb2.Empty.FromString,
+                )
+        self.Enable = channel.unary_unary(
+                '/content.clients.Clients/Enable',
+                request_serializer=clients_dot_clients__pb2.EnableRequest.SerializeToString,
+                response_deserializer=google_dot_protobuf_dot_empty__pb2.Empty.FromString,
+                )
+
+
+class ClientsServicer(object):
+    """Missing associated documentation comment in .proto file."""
+
+    def Create(self, request, context):
+        """Create - создает клиента (приложение) для работы с API
+        """
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def Get(self, request, context):
+        """Get - возвращает клиента по id
+        """
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def GetBy(self, request, context):
+        """GetByClientID - возвращает клиента по clientId системы авторизации
+        """
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def Update(self, request, context):
+        """Update - обновляет параметры клиента
+        """
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def List(self, request, context):
+        """List - возвращает список клиентов созданных в пространстве
+        """
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def Delete(self, request, context):
+        """Delete - удаляет указанного клиента из пространстве
+        """
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def Enable(self, request, context):
+        """Enable - активирует/деактивирует клиента. Клиент не сможет обращаться к API платформы
+        """
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+
+def add_ClientsServicer_to_server(servicer, server):
+    rpc_method_handlers = {
+            'Create': grpc.unary_unary_rpc_method_handler(
+                    servicer.Create,
+                    request_deserializer=clients_dot_clients__pb2.CreateRequest.FromString,
+                    response_serializer=clients_dot_clients__pb2.CreateResponse.SerializeToString,
+            ),
+            'Get': grpc.unary_unary_rpc_method_handler(
+                    servicer.Get,
+                    request_deserializer=clients_dot_clients__pb2.GetRequest.FromString,
+                    response_serializer=clients_dot_clients__pb2.GetResponse.SerializeToString,
+            ),
+            'GetBy': grpc.unary_unary_rpc_method_handler(
+                    servicer.GetBy,
+                    request_deserializer=clients_dot_clients__pb2.GetByRequest.FromString,
+                    response_serializer=clients_dot_clients__pb2.GetByResponse.SerializeToString,
+            ),
+            'Update': grpc.unary_unary_rpc_method_handler(
+                    servicer.Update,
+                    request_deserializer=clients_dot_clients__pb2.UpdateRequest.FromString,
+                    response_serializer=google_dot_protobuf_dot_empty__pb2.Empty.SerializeToString,
+            ),
+            'List': grpc.unary_unary_rpc_method_handler(
+                    servicer.List,
+                    request_deserializer=clients_dot_clients__pb2.ListRequest.FromString,
+                    response_serializer=clients_dot_clients__pb2.ListResponse.SerializeToString,
+            ),
+            'Delete': grpc.unary_unary_rpc_method_handler(
+                    servicer.Delete,
+                    request_deserializer=clients_dot_clients__pb2.DeleteRequest.FromString,
+                    response_serializer=google_dot_protobuf_dot_empty__pb2.Empty.SerializeToString,
+            ),
+            'Enable': grpc.unary_unary_rpc_method_handler(
+                    servicer.Enable,
+                    request_deserializer=clients_dot_clients__pb2.EnableRequest.FromString,
+                    response_serializer=google_dot_protobuf_dot_empty__pb2.Empty.SerializeToString,
+            ),
+    }
+    generic_handler = grpc.method_handlers_generic_handler(
+            'content.clients.Clients', rpc_method_handlers)
+    server.add_generic_rpc_handlers((generic_handler,))
+
+
+ # This class is part of an EXPERIMENTAL API.
+class Clients(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.clients.Clients/Create',
+            clients_dot_clients__pb2.CreateRequest.SerializeToString,
+            clients_dot_clients__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.clients.Clients/Get',
+            clients_dot_clients__pb2.GetRequest.SerializeToString,
+            clients_dot_clients__pb2.GetResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def GetBy(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.clients.Clients/GetBy',
+            clients_dot_clients__pb2.GetByRequest.SerializeToString,
+            clients_dot_clients__pb2.GetByResponse.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.clients.Clients/Update',
+            clients_dot_clients__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 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.clients.Clients/List',
+            clients_dot_clients__pb2.ListRequest.SerializeToString,
+            clients_dot_clients__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.clients.Clients/Delete',
+            clients_dot_clients__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 Enable(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.clients.Clients/Enable',
+            clients_dot_clients__pb2.EnableRequest.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/collaborators/collaborators_pb2.py b/perxis/collaborators/collaborators_pb2.py
new file mode 100644
index 0000000..0042ee0
--- /dev/null
+++ b/perxis/collaborators/collaborators_pb2.py
@@ -0,0 +1,450 @@
+# -*- 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
+from perxis.common import common_pb2 as common_dot_common__pb2
+
+
+DESCRIPTOR = _descriptor.FileDescriptor(
+  name='collaborators/collaborators.proto',
+  package='content.collaborators',
+  syntax='proto3',
+  serialized_options=b'Z>git.perx.ru/perxis/perxis-go/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\x1a\x13\x63ommon/common.proto\"=\n\nSetRequest\x12\x10\n\x08space_id\x18\x01 \x01(\t\x12\x0f\n\x07subject\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\x07subject\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\x07subject\x18\x02 \x01(\t\",\n\x18ListCollaboratorsRequest\x12\x10\n\x08space_id\x18\x01 \x01(\t\"H\n\x19ListCollaboratorsResponse\x12+\n\rcollaborators\x18\x01 \x03(\x0b\x32\x14.common.Collaborator\"$\n\x11ListSpacesRequest\x12\x0f\n\x07subject\x18\x01 \x01(\t\":\n\x12ListSpacesResponse\x12$\n\x06spaces\x18\x01 \x03(\x0b\x32\x14.common.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>git.perx.ru/perxis/perxis-go/proto/collaborators;collaboratorsb\x06proto3'
+  ,
+  dependencies=[google_dot_protobuf_dot_empty__pb2.DESCRIPTOR,common_dot_common__pb2.DESCRIPTOR,])
+
+
+
+
+_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='subject', full_name='content.collaborators.SetRequest.subject', 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=110,
+  serialized_end=171,
+)
+
+
+_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='subject', full_name='content.collaborators.GetRequest.subject', 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=173,
+  serialized_end=220,
+)
+
+
+_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=222,
+  serialized_end=249,
+)
+
+
+_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='subject', full_name='content.collaborators.RemoveRequest.subject', 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=251,
+  serialized_end=301,
+)
+
+
+_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=303,
+  serialized_end=347,
+)
+
+
+_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=349,
+  serialized_end=421,
+)
+
+
+_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='subject', full_name='content.collaborators.ListSpacesRequest.subject', 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=459,
+)
+
+
+_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=461,
+  serialized_end=519,
+)
+
+_LISTCOLLABORATORSRESPONSE.fields_by_name['collaborators'].message_type = common_dot_common__pb2._COLLABORATOR
+_LISTSPACESRESPONSE.fields_by_name['spaces'].message_type = common_dot_common__pb2._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)
+
+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=522,
+  serialized_end=982,
+  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..8891888
--- /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 perxis.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/collections_pb2.py b/perxis/collections/collections_pb2.py
new file mode 100644
index 0000000..0132ad9
--- /dev/null
+++ b/perxis/collections/collections_pb2.py
@@ -0,0 +1,1028 @@
+# -*- 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 perxis.common import common_pb2 as common_dot_common__pb2
+from google.protobuf import timestamp_pb2 as google_dot_protobuf_dot_timestamp__pb2
+
+
+DESCRIPTOR = _descriptor.FileDescriptor(
+  name='collections/collections.proto',
+  package='content.collections',
+  syntax='proto3',
+  serialized_options=b'Z:git.perx.ru/perxis/perxis-go/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\x13\x63ommon/common.proto\x1a\x1fgoogle/protobuf/timestamp.proto\"s\n\x06\x41\x63\x63\x65ss\x12\x1f\n\x07\x61\x63tions\x18\x01 \x03(\x0e\x32\x0e.common.Action\x12\x15\n\rhidden_fields\x18\x05 \x03(\t\x12\x17\n\x0freadonly_fields\x18\x06 \x03(\t\x12\x18\n\x10writeonly_fields\x18\x07 \x03(\t\"\x8e\x05\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\x13\n\x06single\x18\x05 \x01(\x08H\x00\x88\x01\x01\x12\x13\n\x06system\x18\x06 \x01(\x08H\x01\x88\x01\x01\x12\x14\n\x07no_data\x18\x0c \x01(\x08H\x02\x88\x01\x01\x12\x0e\n\x06schema\x18\x07 \x01(\t\x12\x0e\n\x06hidden\x18\r \x01(\x08\x12\x32\n\x04view\x18\t \x01(\x0b\x32$.content.collections.Collection.View\x12=\n\nstate_info\x18\n \x01(\x0b\x32).content.collections.Collection.StateInfo\x12\x0c\n\x04tags\x18\x10 \x03(\t\x12+\n\x06\x61\x63\x63\x65ss\x18\x14 \x01(\x0b\x32\x1b.content.collections.Access\x1aO\n\x04View\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\x0e\n\x06\x66ilter\x18\x04 \x01(\t\x1a\x7f\n\tStateInfo\x12\x34\n\x05state\x18\x01 \x01(\x0e\x32%.content.collections.Collection.State\x12\x0c\n\x04info\x18\x02 \x01(\t\x12.\n\nstarted_at\x18\x03 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\"B\n\x05State\x12\x07\n\x03NEW\x10\x00\x12\r\n\tPREPARING\x10\x01\x12\t\n\x05READY\x10\x02\x12\t\n\x05\x45RROR\x10\x03\x12\x0b\n\x07\x43HANGED\x10\x04\x42\t\n\x07_singleB\t\n\x07_systemB\n\n\x08_no_data\"D\n\rCreateRequest\x12\x33\n\ncollection\x18\x01 \x01(\x0b\x32\x1f.content.collections.Collection\"B\n\x0e\x43reateResponse\x12\x30\n\x07\x63reated\x18\x01 \x01(\x0b\x32\x1f.content.collections.Collection\"-\n\nGetOptions\x12\x1f\n\x17\x64isable_schema_includes\x18\x01 \x01(\x08\"w\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\x12\x30\n\x07options\x18\x04 \x01(\x0b\x32\x1f.content.collections.GetOptions\"B\n\x0bGetResponse\x12\x33\n\ncollection\x18\x01 \x01(\x0b\x32\x1f.content.collections.Collection\"\xd5\x01\n\x0bListRequest\x12\x10\n\x08space_id\x18\x01 \x01(\t\x12\x0e\n\x06\x65nv_id\x18\x02 \x01(\t\x12\x37\n\x06\x66ilter\x18\x05 \x01(\x0b\x32\'.content.collections.ListRequest.Filter\x1ak\n\x06\x46ilter\x12\x16\n\x0e\x65xclude_system\x18\x01 \x01(\x08\x12\x17\n\x0finclude_no_data\x18\x05 \x01(\x08\x12\x16\n\x0einclude_hidden\x18\x06 \x01(\x08\x12\x0c\n\x04name\x18\x03 \x03(\t\x12\n\n\x02id\x18\x04 \x03(\t\"D\n\x0cListResponse\x12\x34\n\x0b\x63ollections\x18\x01 \x03(\x0b\x32\x1f.content.collections.Collection\"D\n\rUpdateRequest\x12\x33\n\ncollection\x18\x01 \x01(\x0b\x32\x1f.content.collections.Collection\"[\n\x10SetSchemaRequest\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\x0e\n\x06schema\x18\x04 \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\xdb\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\x12L\n\tSetSchema\x12%.content.collections.SetSchemaRequest\x1a\x16.google.protobuf.Empty\"\x00\x12\x46\n\x06\x44\x65lete\x12\".content.collections.DeleteRequest\x1a\x16.google.protobuf.Empty\"\x00\x42<Z:git.perx.ru/perxis/perxis-go/proto/collections;collectionsb\x06proto3'
+  ,
+  dependencies=[google_dot_protobuf_dot_empty__pb2.DESCRIPTOR,common_dot_common__pb2.DESCRIPTOR,google_dot_protobuf_dot_timestamp__pb2.DESCRIPTOR,])
+
+
+
+_COLLECTION_STATE = _descriptor.EnumDescriptor(
+  name='State',
+  full_name='content.collections.Collection.State',
+  filename=None,
+  file=DESCRIPTOR,
+  create_key=_descriptor._internal_create_key,
+  values=[
+    _descriptor.EnumValueDescriptor(
+      name='NEW', 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='ERROR', index=3, number=3,
+      serialized_options=None,
+      type=None,
+      create_key=_descriptor._internal_create_key),
+    _descriptor.EnumValueDescriptor(
+      name='CHANGED', index=4, number=4,
+      serialized_options=None,
+      type=None,
+      create_key=_descriptor._internal_create_key),
+  ],
+  containing_type=None,
+  serialized_options=None,
+  serialized_start=809,
+  serialized_end=875,
+)
+_sym_db.RegisterEnumDescriptor(_COLLECTION_STATE)
+
+
+_ACCESS = _descriptor.Descriptor(
+  name='Access',
+  full_name='content.collections.Access',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='actions', full_name='content.collections.Access.actions', index=0,
+      number=1, 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='hidden_fields', full_name='content.collections.Access.hidden_fields', index=1,
+      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='readonly_fields', full_name='content.collections.Access.readonly_fields', index=2,
+      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),
+    _descriptor.FieldDescriptor(
+      name='writeonly_fields', full_name='content.collections.Access.writeonly_fields', index=3,
+      number=7, 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=137,
+  serialized_end=252,
+)
+
+
+_COLLECTION_VIEW = _descriptor.Descriptor(
+  name='View',
+  full_name='content.collections.Collection.View',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='space_id', full_name='content.collections.Collection.View.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.Collection.View.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.Collection.View.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='filter', full_name='content.collections.Collection.View.filter', 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=599,
+  serialized_end=678,
+)
+
+_COLLECTION_STATEINFO = _descriptor.Descriptor(
+  name='StateInfo',
+  full_name='content.collections.Collection.StateInfo',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='state', full_name='content.collections.Collection.StateInfo.state', index=0,
+      number=1, 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='info', full_name='content.collections.Collection.StateInfo.info', 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='started_at', full_name='content.collections.Collection.StateInfo.started_at', 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=680,
+  serialized_end=807,
+)
+
+_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='no_data', full_name='content.collections.Collection.no_data', index=6,
+      number=12, 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=7,
+      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='hidden', full_name='content.collections.Collection.hidden', index=8,
+      number=13, 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='view', full_name='content.collections.Collection.view', index=9,
+      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='state_info', full_name='content.collections.Collection.state_info', index=10,
+      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='tags', full_name='content.collections.Collection.tags', index=11,
+      number=16, 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='access', full_name='content.collections.Collection.access', index=12,
+      number=20, 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=[_COLLECTION_VIEW, _COLLECTION_STATEINFO, ],
+  enum_types=[
+    _COLLECTION_STATE,
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+    _descriptor.OneofDescriptor(
+      name='_single', full_name='content.collections.Collection._single',
+      index=0, containing_type=None,
+      create_key=_descriptor._internal_create_key,
+    fields=[]),
+    _descriptor.OneofDescriptor(
+      name='_system', full_name='content.collections.Collection._system',
+      index=1, containing_type=None,
+      create_key=_descriptor._internal_create_key,
+    fields=[]),
+    _descriptor.OneofDescriptor(
+      name='_no_data', full_name='content.collections.Collection._no_data',
+      index=2, containing_type=None,
+      create_key=_descriptor._internal_create_key,
+    fields=[]),
+  ],
+  serialized_start=255,
+  serialized_end=909,
+)
+
+
+_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='collection', full_name='content.collections.CreateRequest.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=911,
+  serialized_end=979,
+)
+
+
+_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='created', full_name='content.collections.CreateResponse.created', 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=981,
+  serialized_end=1047,
+)
+
+
+_GETOPTIONS = _descriptor.Descriptor(
+  name='GetOptions',
+  full_name='content.collections.GetOptions',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='disable_schema_includes', full_name='content.collections.GetOptions.disable_schema_includes', index=0,
+      number=1, 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=1049,
+  serialized_end=1094,
+)
+
+
+_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),
+    _descriptor.FieldDescriptor(
+      name='options', full_name='content.collections.GetRequest.options', 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=1096,
+  serialized_end=1215,
+)
+
+
+_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=1217,
+  serialized_end=1283,
+)
+
+
+_LISTREQUEST_FILTER = _descriptor.Descriptor(
+  name='Filter',
+  full_name='content.collections.ListRequest.Filter',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='exclude_system', full_name='content.collections.ListRequest.Filter.exclude_system', index=0,
+      number=1, 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='include_no_data', full_name='content.collections.ListRequest.Filter.include_no_data', index=1,
+      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='include_hidden', full_name='content.collections.ListRequest.Filter.include_hidden', index=2,
+      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='name', full_name='content.collections.ListRequest.Filter.name', index=3,
+      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='id', full_name='content.collections.ListRequest.Filter.id', index=4,
+      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=1392,
+  serialized_end=1499,
+)
+
+_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),
+    _descriptor.FieldDescriptor(
+      name='filter', full_name='content.collections.ListRequest.filter', index=2,
+      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=[_LISTREQUEST_FILTER, ],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=1286,
+  serialized_end=1499,
+)
+
+
+_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=1501,
+  serialized_end=1569,
+)
+
+
+_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='collection', full_name='content.collections.UpdateRequest.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=1571,
+  serialized_end=1639,
+)
+
+
+_SETSCHEMAREQUEST = _descriptor.Descriptor(
+  name='SetSchemaRequest',
+  full_name='content.collections.SetSchemaRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='space_id', full_name='content.collections.SetSchemaRequest.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.SetSchemaRequest.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.SetSchemaRequest.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='schema', full_name='content.collections.SetSchemaRequest.schema', 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=1641,
+  serialized_end=1732,
+)
+
+
+_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=1734,
+  serialized_end=1806,
+)
+
+_ACCESS.fields_by_name['actions'].enum_type = common_dot_common__pb2._ACTION
+_COLLECTION_VIEW.containing_type = _COLLECTION
+_COLLECTION_STATEINFO.fields_by_name['state'].enum_type = _COLLECTION_STATE
+_COLLECTION_STATEINFO.fields_by_name['started_at'].message_type = google_dot_protobuf_dot_timestamp__pb2._TIMESTAMP
+_COLLECTION_STATEINFO.containing_type = _COLLECTION
+_COLLECTION.fields_by_name['view'].message_type = _COLLECTION_VIEW
+_COLLECTION.fields_by_name['state_info'].message_type = _COLLECTION_STATEINFO
+_COLLECTION.fields_by_name['access'].message_type = _ACCESS
+_COLLECTION_STATE.containing_type = _COLLECTION
+_COLLECTION.oneofs_by_name['_single'].fields.append(
+  _COLLECTION.fields_by_name['single'])
+_COLLECTION.fields_by_name['single'].containing_oneof = _COLLECTION.oneofs_by_name['_single']
+_COLLECTION.oneofs_by_name['_system'].fields.append(
+  _COLLECTION.fields_by_name['system'])
+_COLLECTION.fields_by_name['system'].containing_oneof = _COLLECTION.oneofs_by_name['_system']
+_COLLECTION.oneofs_by_name['_no_data'].fields.append(
+  _COLLECTION.fields_by_name['no_data'])
+_COLLECTION.fields_by_name['no_data'].containing_oneof = _COLLECTION.oneofs_by_name['_no_data']
+_CREATEREQUEST.fields_by_name['collection'].message_type = _COLLECTION
+_CREATERESPONSE.fields_by_name['created'].message_type = _COLLECTION
+_GETREQUEST.fields_by_name['options'].message_type = _GETOPTIONS
+_GETRESPONSE.fields_by_name['collection'].message_type = _COLLECTION
+_LISTREQUEST_FILTER.containing_type = _LISTREQUEST
+_LISTREQUEST.fields_by_name['filter'].message_type = _LISTREQUEST_FILTER
+_LISTRESPONSE.fields_by_name['collections'].message_type = _COLLECTION
+_UPDATEREQUEST.fields_by_name['collection'].message_type = _COLLECTION
+DESCRIPTOR.message_types_by_name['Access'] = _ACCESS
+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['GetOptions'] = _GETOPTIONS
+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['SetSchemaRequest'] = _SETSCHEMAREQUEST
+DESCRIPTOR.message_types_by_name['DeleteRequest'] = _DELETEREQUEST
+_sym_db.RegisterFileDescriptor(DESCRIPTOR)
+
+Access = _reflection.GeneratedProtocolMessageType('Access', (_message.Message,), {
+  'DESCRIPTOR' : _ACCESS,
+  '__module__' : 'collections.collections_pb2'
+  # @@protoc_insertion_point(class_scope:content.collections.Access)
+  })
+_sym_db.RegisterMessage(Access)
+
+Collection = _reflection.GeneratedProtocolMessageType('Collection', (_message.Message,), {
+
+  'View' : _reflection.GeneratedProtocolMessageType('View', (_message.Message,), {
+    'DESCRIPTOR' : _COLLECTION_VIEW,
+    '__module__' : 'collections.collections_pb2'
+    # @@protoc_insertion_point(class_scope:content.collections.Collection.View)
+    })
+  ,
+
+  'StateInfo' : _reflection.GeneratedProtocolMessageType('StateInfo', (_message.Message,), {
+    'DESCRIPTOR' : _COLLECTION_STATEINFO,
+    '__module__' : 'collections.collections_pb2'
+    # @@protoc_insertion_point(class_scope:content.collections.Collection.StateInfo)
+    })
+  ,
+  'DESCRIPTOR' : _COLLECTION,
+  '__module__' : 'collections.collections_pb2'
+  # @@protoc_insertion_point(class_scope:content.collections.Collection)
+  })
+_sym_db.RegisterMessage(Collection)
+_sym_db.RegisterMessage(Collection.View)
+_sym_db.RegisterMessage(Collection.StateInfo)
+
+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)
+
+GetOptions = _reflection.GeneratedProtocolMessageType('GetOptions', (_message.Message,), {
+  'DESCRIPTOR' : _GETOPTIONS,
+  '__module__' : 'collections.collections_pb2'
+  # @@protoc_insertion_point(class_scope:content.collections.GetOptions)
+  })
+_sym_db.RegisterMessage(GetOptions)
+
+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,), {
+
+  'Filter' : _reflection.GeneratedProtocolMessageType('Filter', (_message.Message,), {
+    'DESCRIPTOR' : _LISTREQUEST_FILTER,
+    '__module__' : 'collections.collections_pb2'
+    # @@protoc_insertion_point(class_scope:content.collections.ListRequest.Filter)
+    })
+  ,
+  'DESCRIPTOR' : _LISTREQUEST,
+  '__module__' : 'collections.collections_pb2'
+  # @@protoc_insertion_point(class_scope:content.collections.ListRequest)
+  })
+_sym_db.RegisterMessage(ListRequest)
+_sym_db.RegisterMessage(ListRequest.Filter)
+
+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)
+
+SetSchemaRequest = _reflection.GeneratedProtocolMessageType('SetSchemaRequest', (_message.Message,), {
+  'DESCRIPTOR' : _SETSCHEMAREQUEST,
+  '__module__' : 'collections.collections_pb2'
+  # @@protoc_insertion_point(class_scope:content.collections.SetSchemaRequest)
+  })
+_sym_db.RegisterMessage(SetSchemaRequest)
+
+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=1809,
+  serialized_end=2284,
+  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='SetSchema',
+    full_name='content.collections.Collections.SetSchema',
+    index=4,
+    containing_service=None,
+    input_type=_SETSCHEMAREQUEST,
+    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=5,
+    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..711455e
--- /dev/null
+++ b/perxis/collections/collections_pb2_grpc.py
@@ -0,0 +1,232 @@
+# Generated by the gRPC Python protocol compiler plugin. DO NOT EDIT!
+"""Client and server classes corresponding to protobuf-defined services."""
+import grpc
+
+from perxis.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.SetSchema = channel.unary_unary(
+                '/content.collections.Collections/SetSchema',
+                request_serializer=collections_dot_collections__pb2.SetSchemaRequest.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 SetSchema(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,
+            ),
+            'SetSchema': grpc.unary_unary_rpc_method_handler(
+                    servicer.SetSchema,
+                    request_deserializer=collections_dot_collections__pb2.SetSchemaRequest.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 SetSchema(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/SetSchema',
+            collections_dot_collections__pb2.SetSchemaRequest.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/common_pb2.py b/perxis/common/common_pb2.py
new file mode 100644
index 0000000..92ce4ae
--- /dev/null
+++ b/perxis/common/common_pb2.py
@@ -0,0 +1,871 @@
+# -*- 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 struct_pb2 as google_dot_protobuf_dot_struct__pb2
+
+
+DESCRIPTOR = _descriptor.FileDescriptor(
+  name='common/common.proto',
+  package='common',
+  syntax='proto3',
+  serialized_options=b'Z0git.perx.ru/perxis/perxis-go/proto/common;common',
+  create_key=_descriptor._internal_create_key,
+  serialized_pb=b'\n\x13\x63ommon/common.proto\x12\x06\x63ommon\x1a\x1cgoogle/protobuf/struct.proto\"\xa6\x05\n\x05\x45rror\x12\x12\n\nerror_code\x18\x01 \x01(\x04\x12\x10\n\x08\x65rror_id\x18\x02 \x01(\t\x12\x0e\n\x06reason\x18\x03 \x01(\t\x12\x0e\n\x06\x64omain\x18\x04 \x01(\t\x12-\n\x08metadata\x18\t \x03(\x0b\x32\x1b.common.Error.MetadataEntry\x12-\n\x0b\x62\x61\x64_request\x18\n \x01(\x0b\x32\x18.common.Error.BadRequest\x12+\n\ndebug_info\x18\x0b \x01(\x0b\x32\x17.common.Error.DebugInfo\x12 \n\x04help\x18\x64 \x01(\x0b\x32\x12.common.Error.Help\x12;\n\x12localized_messages\x18\xc8\x01 \x03(\x0b\x32\x1e.common.Error.LocalizedMessage\x1a{\n\nBadRequest\x12\x37\n\x06\x65rrors\x18\x01 \x03(\x0b\x32\'.common.Error.BadRequest.FieldViolation\x1a\x34\n\x0e\x46ieldViolation\x12\r\n\x05\x66ield\x18\x01 \x01(\t\x12\x13\n\x0b\x64\x65scription\x18\x02 \x01(\t\x1aX\n\x04Help\x12&\n\x05links\x18\x01 \x03(\x0b\x32\x17.common.Error.Help.Link\x1a(\n\x04Link\x12\x13\n\x0b\x64\x65scription\x18\x01 \x01(\t\x12\x0b\n\x03url\x18\x02 \x01(\t\x1a\x30\n\tDebugInfo\x12\x13\n\x0bstack_trace\x18\x01 \x03(\t\x12\x0e\n\x06\x64\x65tail\x18\x02 \x01(\t\x1a\x33\n\x10LocalizedMessage\x12\x0e\n\x06locale\x18\x01 \x01(\t\x12\x0f\n\x07message\x18\x02 \x01(\t\x1a/\n\rMetadataEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\"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\"h\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\x12\x0e\n\x06\x66ields\x18\x04 \x03(\t\x12\x16\n\x0e\x65xclude_fields\x18\x05 \x01(\x08\"\xd3\x01\n\x04Rule\x12\x15\n\rcollection_id\x18\x01 \x01(\t\x12\x1f\n\x07\x61\x63tions\x18\x02 \x03(\x0e\x32\x0e.common.Action\x12\x1e\n\x06\x61\x63\x63\x65ss\x18\x03 \x01(\x0e\x32\x0e.common.Access\x12\x15\n\rhidden_fields\x18\x05 \x03(\t\x12\x17\n\x0freadonly_fields\x18\x06 \x03(\t\x12\x18\n\x10writeonly_fields\x18\x07 \x03(\t\x12\x13\n\x0bread_filter\x18\x08 \x01(\t\x12\x14\n\x0cwrite_filter\x18\t \x01(\t\"?\n\x0c\x43ollaborator\x12\x10\n\x08space_id\x18\x01 \x01(\t\x12\x0f\n\x07subject\x18\x02 \x01(\t\x12\x0c\n\x04role\x18\x03 \x01(\t\"p\n\x07Version\x12\x16\n\x0eserver_version\x18\x01 \x01(\t\x12\x13\n\x0b\x61pi_version\x18\x02 \x01(\t\x12\x12\n\nbuild_time\x18\x03 \x01(\t\x12\x0e\n\x06\x63ommit\x18\x04 \x01(\t\x12\x14\n\x0c\x62uild_number\x18\x05 \x01(\x05*%\n\x06\x41\x63\x63\x65ss\x12\x07\n\x03\x41NY\x10\x00\x12\x08\n\x04MINE\x10\x01\x12\x08\n\x04ROLE\x10\x02*C\n\x06\x41\x63tion\x12\x0b\n\x07UNKNOWN\x10\x00\x12\n\n\x06\x43REATE\x10\x01\x12\x08\n\x04READ\x10\x02\x12\n\n\x06UPDATE\x10\x03\x12\n\n\x06\x44\x45LETE\x10\x04\x42\x32Z0git.perx.ru/perxis/perxis-go/proto/common;commonb\x06proto3'
+  ,
+  dependencies=[google_dot_protobuf_dot_struct__pb2.DESCRIPTOR,])
+
+_ACCESS = _descriptor.EnumDescriptor(
+  name='Access',
+  full_name='common.Access',
+  filename=None,
+  file=DESCRIPTOR,
+  create_key=_descriptor._internal_create_key,
+  values=[
+    _descriptor.EnumValueDescriptor(
+      name='ANY', index=0, number=0,
+      serialized_options=None,
+      type=None,
+      create_key=_descriptor._internal_create_key),
+    _descriptor.EnumValueDescriptor(
+      name='MINE', index=1, number=1,
+      serialized_options=None,
+      type=None,
+      create_key=_descriptor._internal_create_key),
+    _descriptor.EnumValueDescriptor(
+      name='ROLE', index=2, number=2,
+      serialized_options=None,
+      type=None,
+      create_key=_descriptor._internal_create_key),
+  ],
+  containing_type=None,
+  serialized_options=None,
+  serialized_start=1317,
+  serialized_end=1354,
+)
+_sym_db.RegisterEnumDescriptor(_ACCESS)
+
+Access = enum_type_wrapper.EnumTypeWrapper(_ACCESS)
+_ACTION = _descriptor.EnumDescriptor(
+  name='Action',
+  full_name='common.Action',
+  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='CREATE', index=1, number=1,
+      serialized_options=None,
+      type=None,
+      create_key=_descriptor._internal_create_key),
+    _descriptor.EnumValueDescriptor(
+      name='READ', index=2, number=2,
+      serialized_options=None,
+      type=None,
+      create_key=_descriptor._internal_create_key),
+    _descriptor.EnumValueDescriptor(
+      name='UPDATE', index=3, number=3,
+      serialized_options=None,
+      type=None,
+      create_key=_descriptor._internal_create_key),
+    _descriptor.EnumValueDescriptor(
+      name='DELETE', index=4, number=4,
+      serialized_options=None,
+      type=None,
+      create_key=_descriptor._internal_create_key),
+  ],
+  containing_type=None,
+  serialized_options=None,
+  serialized_start=1356,
+  serialized_end=1423,
+)
+_sym_db.RegisterEnumDescriptor(_ACTION)
+
+Action = enum_type_wrapper.EnumTypeWrapper(_ACTION)
+ANY = 0
+MINE = 1
+ROLE = 2
+UNKNOWN = 0
+CREATE = 1
+READ = 2
+UPDATE = 3
+DELETE = 4
+
+
+
+_ERROR_BADREQUEST_FIELDVIOLATION = _descriptor.Descriptor(
+  name='FieldViolation',
+  full_name='common.Error.BadRequest.FieldViolation',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='field', full_name='common.Error.BadRequest.FieldViolation.field', 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='common.Error.BadRequest.FieldViolation.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),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=446,
+  serialized_end=498,
+)
+
+_ERROR_BADREQUEST = _descriptor.Descriptor(
+  name='BadRequest',
+  full_name='common.Error.BadRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='errors', full_name='common.Error.BadRequest.errors', 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=[_ERROR_BADREQUEST_FIELDVIOLATION, ],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=375,
+  serialized_end=498,
+)
+
+_ERROR_HELP_LINK = _descriptor.Descriptor(
+  name='Link',
+  full_name='common.Error.Help.Link',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='description', full_name='common.Error.Help.Link.description', 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='url', full_name='common.Error.Help.Link.url', 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=548,
+  serialized_end=588,
+)
+
+_ERROR_HELP = _descriptor.Descriptor(
+  name='Help',
+  full_name='common.Error.Help',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='links', full_name='common.Error.Help.links', 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=[_ERROR_HELP_LINK, ],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=500,
+  serialized_end=588,
+)
+
+_ERROR_DEBUGINFO = _descriptor.Descriptor(
+  name='DebugInfo',
+  full_name='common.Error.DebugInfo',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='stack_trace', full_name='common.Error.DebugInfo.stack_trace', 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='detail', full_name='common.Error.DebugInfo.detail', 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=590,
+  serialized_end=638,
+)
+
+_ERROR_LOCALIZEDMESSAGE = _descriptor.Descriptor(
+  name='LocalizedMessage',
+  full_name='common.Error.LocalizedMessage',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='locale', full_name='common.Error.LocalizedMessage.locale', 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='message', full_name='common.Error.LocalizedMessage.message', 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=640,
+  serialized_end=691,
+)
+
+_ERROR_METADATAENTRY = _descriptor.Descriptor(
+  name='MetadataEntry',
+  full_name='common.Error.MetadataEntry',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='key', full_name='common.Error.MetadataEntry.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.Error.MetadataEntry.value', 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=b'8\001',
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=693,
+  serialized_end=740,
+)
+
+_ERROR = _descriptor.Descriptor(
+  name='Error',
+  full_name='common.Error',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='error_code', full_name='common.Error.error_code', index=0,
+      number=1, type=4, cpp_type=4, 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='error_id', full_name='common.Error.error_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='reason', full_name='common.Error.reason', 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='domain', full_name='common.Error.domain', 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='metadata', full_name='common.Error.metadata', index=4,
+      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='bad_request', full_name='common.Error.bad_request', 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),
+    _descriptor.FieldDescriptor(
+      name='debug_info', full_name='common.Error.debug_info', index=6,
+      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='help', full_name='common.Error.help', index=7,
+      number=100, 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='localized_messages', full_name='common.Error.localized_messages', index=8,
+      number=200, 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=[_ERROR_BADREQUEST, _ERROR_HELP, _ERROR_DEBUGINFO, _ERROR_LOCALIZEDMESSAGE, _ERROR_METADATAENTRY, ],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=62,
+  serialized_end=740,
+)
+
+
+_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=742,
+  serialized_end=816,
+)
+
+
+_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),
+    _descriptor.FieldDescriptor(
+      name='fields', full_name='common.FindOptions.fields', 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='exclude_fields', full_name='common.FindOptions.exclude_fields', 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),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=818,
+  serialized_end=922,
+)
+
+
+_RULE = _descriptor.Descriptor(
+  name='Rule',
+  full_name='common.Rule',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='collection_id', full_name='common.Rule.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='actions', full_name='common.Rule.actions', index=1,
+      number=2, 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='access', full_name='common.Rule.access', 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='hidden_fields', full_name='common.Rule.hidden_fields', 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),
+    _descriptor.FieldDescriptor(
+      name='readonly_fields', full_name='common.Rule.readonly_fields', index=4,
+      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),
+    _descriptor.FieldDescriptor(
+      name='writeonly_fields', full_name='common.Rule.writeonly_fields', index=5,
+      number=7, 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='read_filter', full_name='common.Rule.read_filter', index=6,
+      number=8, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='write_filter', full_name='common.Rule.write_filter', index=7,
+      number=9, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=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=925,
+  serialized_end=1136,
+)
+
+
+_COLLABORATOR = _descriptor.Descriptor(
+  name='Collaborator',
+  full_name='common.Collaborator',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='space_id', full_name='common.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='subject', full_name='common.Collaborator.subject', 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='common.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=1138,
+  serialized_end=1201,
+)
+
+
+_VERSION = _descriptor.Descriptor(
+  name='Version',
+  full_name='common.Version',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='server_version', full_name='common.Version.server_version', 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='api_version', full_name='common.Version.api_version', 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='build_time', full_name='common.Version.build_time', 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='commit', full_name='common.Version.commit', 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='build_number', full_name='common.Version.build_number', index=4,
+      number=5, 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=1203,
+  serialized_end=1315,
+)
+
+_ERROR_BADREQUEST_FIELDVIOLATION.containing_type = _ERROR_BADREQUEST
+_ERROR_BADREQUEST.fields_by_name['errors'].message_type = _ERROR_BADREQUEST_FIELDVIOLATION
+_ERROR_BADREQUEST.containing_type = _ERROR
+_ERROR_HELP_LINK.containing_type = _ERROR_HELP
+_ERROR_HELP.fields_by_name['links'].message_type = _ERROR_HELP_LINK
+_ERROR_HELP.containing_type = _ERROR
+_ERROR_DEBUGINFO.containing_type = _ERROR
+_ERROR_LOCALIZEDMESSAGE.containing_type = _ERROR
+_ERROR_METADATAENTRY.containing_type = _ERROR
+_ERROR.fields_by_name['metadata'].message_type = _ERROR_METADATAENTRY
+_ERROR.fields_by_name['bad_request'].message_type = _ERROR_BADREQUEST
+_ERROR.fields_by_name['debug_info'].message_type = _ERROR_DEBUGINFO
+_ERROR.fields_by_name['help'].message_type = _ERROR_HELP
+_ERROR.fields_by_name['localized_messages'].message_type = _ERROR_LOCALIZEDMESSAGE
+_FILTER.fields_by_name['value'].message_type = google_dot_protobuf_dot_struct__pb2._VALUE
+_RULE.fields_by_name['actions'].enum_type = _ACTION
+_RULE.fields_by_name['access'].enum_type = _ACCESS
+DESCRIPTOR.message_types_by_name['Error'] = _ERROR
+DESCRIPTOR.message_types_by_name['Filter'] = _FILTER
+DESCRIPTOR.message_types_by_name['FindOptions'] = _FINDOPTIONS
+DESCRIPTOR.message_types_by_name['Rule'] = _RULE
+DESCRIPTOR.message_types_by_name['Collaborator'] = _COLLABORATOR
+DESCRIPTOR.message_types_by_name['Version'] = _VERSION
+DESCRIPTOR.enum_types_by_name['Access'] = _ACCESS
+DESCRIPTOR.enum_types_by_name['Action'] = _ACTION
+_sym_db.RegisterFileDescriptor(DESCRIPTOR)
+
+Error = _reflection.GeneratedProtocolMessageType('Error', (_message.Message,), {
+
+  'BadRequest' : _reflection.GeneratedProtocolMessageType('BadRequest', (_message.Message,), {
+
+    'FieldViolation' : _reflection.GeneratedProtocolMessageType('FieldViolation', (_message.Message,), {
+      'DESCRIPTOR' : _ERROR_BADREQUEST_FIELDVIOLATION,
+      '__module__' : 'common.common_pb2'
+      # @@protoc_insertion_point(class_scope:common.Error.BadRequest.FieldViolation)
+      })
+    ,
+    'DESCRIPTOR' : _ERROR_BADREQUEST,
+    '__module__' : 'common.common_pb2'
+    # @@protoc_insertion_point(class_scope:common.Error.BadRequest)
+    })
+  ,
+
+  'Help' : _reflection.GeneratedProtocolMessageType('Help', (_message.Message,), {
+
+    'Link' : _reflection.GeneratedProtocolMessageType('Link', (_message.Message,), {
+      'DESCRIPTOR' : _ERROR_HELP_LINK,
+      '__module__' : 'common.common_pb2'
+      # @@protoc_insertion_point(class_scope:common.Error.Help.Link)
+      })
+    ,
+    'DESCRIPTOR' : _ERROR_HELP,
+    '__module__' : 'common.common_pb2'
+    # @@protoc_insertion_point(class_scope:common.Error.Help)
+    })
+  ,
+
+  'DebugInfo' : _reflection.GeneratedProtocolMessageType('DebugInfo', (_message.Message,), {
+    'DESCRIPTOR' : _ERROR_DEBUGINFO,
+    '__module__' : 'common.common_pb2'
+    # @@protoc_insertion_point(class_scope:common.Error.DebugInfo)
+    })
+  ,
+
+  'LocalizedMessage' : _reflection.GeneratedProtocolMessageType('LocalizedMessage', (_message.Message,), {
+    'DESCRIPTOR' : _ERROR_LOCALIZEDMESSAGE,
+    '__module__' : 'common.common_pb2'
+    # @@protoc_insertion_point(class_scope:common.Error.LocalizedMessage)
+    })
+  ,
+
+  'MetadataEntry' : _reflection.GeneratedProtocolMessageType('MetadataEntry', (_message.Message,), {
+    'DESCRIPTOR' : _ERROR_METADATAENTRY,
+    '__module__' : 'common.common_pb2'
+    # @@protoc_insertion_point(class_scope:common.Error.MetadataEntry)
+    })
+  ,
+  'DESCRIPTOR' : _ERROR,
+  '__module__' : 'common.common_pb2'
+  # @@protoc_insertion_point(class_scope:common.Error)
+  })
+_sym_db.RegisterMessage(Error)
+_sym_db.RegisterMessage(Error.BadRequest)
+_sym_db.RegisterMessage(Error.BadRequest.FieldViolation)
+_sym_db.RegisterMessage(Error.Help)
+_sym_db.RegisterMessage(Error.Help.Link)
+_sym_db.RegisterMessage(Error.DebugInfo)
+_sym_db.RegisterMessage(Error.LocalizedMessage)
+_sym_db.RegisterMessage(Error.MetadataEntry)
+
+Filter = _reflection.GeneratedProtocolMessageType('Filter', (_message.Message,), {
+  'DESCRIPTOR' : _FILTER,
+  '__module__' : 'common.common_pb2'
+  # @@protoc_insertion_point(class_scope:common.Filter)
+  })
+_sym_db.RegisterMessage(Filter)
+
+FindOptions = _reflection.GeneratedProtocolMessageType('FindOptions', (_message.Message,), {
+  'DESCRIPTOR' : _FINDOPTIONS,
+  '__module__' : 'common.common_pb2'
+  # @@protoc_insertion_point(class_scope:common.FindOptions)
+  })
+_sym_db.RegisterMessage(FindOptions)
+
+Rule = _reflection.GeneratedProtocolMessageType('Rule', (_message.Message,), {
+  'DESCRIPTOR' : _RULE,
+  '__module__' : 'common.common_pb2'
+  # @@protoc_insertion_point(class_scope:common.Rule)
+  })
+_sym_db.RegisterMessage(Rule)
+
+Collaborator = _reflection.GeneratedProtocolMessageType('Collaborator', (_message.Message,), {
+  'DESCRIPTOR' : _COLLABORATOR,
+  '__module__' : 'common.common_pb2'
+  # @@protoc_insertion_point(class_scope:common.Collaborator)
+  })
+_sym_db.RegisterMessage(Collaborator)
+
+Version = _reflection.GeneratedProtocolMessageType('Version', (_message.Message,), {
+  'DESCRIPTOR' : _VERSION,
+  '__module__' : 'common.common_pb2'
+  # @@protoc_insertion_point(class_scope:common.Version)
+  })
+_sym_db.RegisterMessage(Version)
+
+
+DESCRIPTOR._options = None
+_ERROR_METADATAENTRY._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/delivery/delivery_pb2.py b/perxis/delivery/delivery_pb2.py
new file mode 100644
index 0000000..9dbdf95
--- /dev/null
+++ b/perxis/delivery/delivery_pb2.py
@@ -0,0 +1,994 @@
+# -*- coding: utf-8 -*-
+# Generated by the protocol buffer compiler.  DO NOT EDIT!
+# source: delivery/delivery.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 perxis.locales import locales_pb2 as locales_dot_locales__pb2
+from perxis.environments import environments_pb2 as environments_dot_environments__pb2
+from perxis.collections import collections_pb2 as collections_dot_collections__pb2
+from perxis.items import items_pb2 as items_dot_items__pb2
+from google.protobuf import struct_pb2 as google_dot_protobuf_dot_struct__pb2
+
+
+DESCRIPTOR = _descriptor.FileDescriptor(
+  name='delivery/delivery.proto',
+  package='delivery',
+  syntax='proto3',
+  serialized_options=b'Z4git.perx.ru/perxis/perxis-go/proto/delivery;delivery',
+  create_key=_descriptor._internal_create_key,
+  serialized_pb=b'\n\x17\x64\x65livery/delivery.proto\x12\x08\x64\x65livery\x1a\x15locales/locales.proto\x1a\x1f\x65nvironments/environments.proto\x1a\x1d\x63ollections/collections.proto\x1a\x11items/items.proto\x1a\x1cgoogle/protobuf/struct.proto\"&\n\x12ListLocalesRequest\x12\x10\n\x08space_id\x18\x01 \x01(\t\"?\n\x13ListLocalesResponse\x12(\n\x07locales\x18\x01 \x03(\x0b\x32\x17.content.locales.Locale\"9\n\x15GetEnvironmentRequest\x12\x10\n\x08space_id\x18\x01 \x01(\t\x12\x0e\n\x06\x65nv_id\x18\x02 \x01(\t\"H\n\x16GetEnvironmentResponse\x12.\n\x03\x65nv\x18\x01 \x01(\x0b\x32!.content.environments.Environment\"+\n\x17ListEnvironmentsRequest\x12\x10\n\x08space_id\x18\x01 \x01(\t\"K\n\x18ListEnvironmentsResponse\x12/\n\x04\x65nvs\x18\x01 \x03(\x0b\x32!.content.environments.Environment\"O\n\x14GetCollectionRequest\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\"L\n\x15GetCollectionResponse\x12\x33\n\ncollection\x18\x01 \x01(\x0b\x32\x1f.content.collections.Collection\":\n\x16ListCollectionsRequest\x12\x10\n\x08space_id\x18\x01 \x01(\t\x12\x0e\n\x06\x65nv_id\x18\x02 \x01(\t\"O\n\x17ListCollectionsResponse\x12\x34\n\x0b\x63ollections\x18\x01 \x03(\x0b\x32\x1f.content.collections.Collection\"\x8f\x01\n\x0eGetItemRequest\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\x0f\n\x07item_id\x18\x05 \x01(\t\x12\x33\n\x07options\x18\x06 \x01(\x0b\x32\".content.items.GetPublishedOptions\"4\n\x0fGetItemResponse\x12!\n\x04item\x18\x01 \x01(\x0b\x32\x13.content.items.Item\"\xa8\x01\n\x10\x46indItemsRequest\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%\n\x06\x66ilter\x18\x05 \x01(\x0b\x32\x15.content.items.Filter\x12\x34\n\x07options\x18\x06 \x01(\x0b\x32#.content.items.FindPublishedOptions\"F\n\x11\x46indItemsResponse\x12\"\n\x05items\x18\x01 \x03(\x0b\x32\x13.content.items.Item\x12\r\n\x05total\x18\x02 \x01(\x05\"y\n\x10\x41ggregateOptions\x12\x36\n\x06\x66ields\x18\x01 \x03(\x0b\x32&.delivery.AggregateOptions.FieldsEntry\x1a-\n\x0b\x46ieldsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\"\x9f\x01\n\x10\x41ggregateRequest\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%\n\x06\x66ilter\x18\x04 \x01(\x0b\x32\x15.content.items.Filter\x12+\n\x07options\x18\n \x01(\x0b\x32\x1a.delivery.AggregateOptions\"<\n\x11\x41ggregateResponse\x12\'\n\x06result\x18\x01 \x01(\x0b\x32\x17.google.protobuf.Struct2\x8c\x05\n\x08\x44\x65livery\x12L\n\x0bListLocales\x12\x1c.delivery.ListLocalesRequest\x1a\x1d.delivery.ListLocalesResponse\"\x00\x12U\n\x0eGetEnvironment\x12\x1f.delivery.GetEnvironmentRequest\x1a .delivery.GetEnvironmentResponse\"\x00\x12[\n\x10ListEnvironments\x12!.delivery.ListEnvironmentsRequest\x1a\".delivery.ListEnvironmentsResponse\"\x00\x12R\n\rGetCollection\x12\x1e.delivery.GetCollectionRequest\x1a\x1f.delivery.GetCollectionResponse\"\x00\x12X\n\x0fListCollections\x12 .delivery.ListCollectionsRequest\x1a!.delivery.ListCollectionsResponse\"\x00\x12@\n\x07GetItem\x12\x18.delivery.GetItemRequest\x1a\x19.delivery.GetItemResponse\"\x00\x12\x46\n\tFindItems\x12\x1a.delivery.FindItemsRequest\x1a\x1b.delivery.FindItemsResponse\"\x00\x12\x46\n\tAggregate\x12\x1a.delivery.AggregateRequest\x1a\x1b.delivery.AggregateResponse\"\x00\x42\x36Z4git.perx.ru/perxis/perxis-go/proto/delivery;deliveryb\x06proto3'
+  ,
+  dependencies=[locales_dot_locales__pb2.DESCRIPTOR,environments_dot_environments__pb2.DESCRIPTOR,collections_dot_collections__pb2.DESCRIPTOR,items_dot_items__pb2.DESCRIPTOR,google_dot_protobuf_dot_struct__pb2.DESCRIPTOR,])
+
+
+
+
+_LISTLOCALESREQUEST = _descriptor.Descriptor(
+  name='ListLocalesRequest',
+  full_name='delivery.ListLocalesRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='space_id', full_name='delivery.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=173,
+  serialized_end=211,
+)
+
+
+_LISTLOCALESRESPONSE = _descriptor.Descriptor(
+  name='ListLocalesResponse',
+  full_name='delivery.ListLocalesResponse',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='locales', full_name='delivery.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=213,
+  serialized_end=276,
+)
+
+
+_GETENVIRONMENTREQUEST = _descriptor.Descriptor(
+  name='GetEnvironmentRequest',
+  full_name='delivery.GetEnvironmentRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='space_id', full_name='delivery.GetEnvironmentRequest.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='delivery.GetEnvironmentRequest.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=278,
+  serialized_end=335,
+)
+
+
+_GETENVIRONMENTRESPONSE = _descriptor.Descriptor(
+  name='GetEnvironmentResponse',
+  full_name='delivery.GetEnvironmentResponse',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='env', full_name='delivery.GetEnvironmentResponse.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=337,
+  serialized_end=409,
+)
+
+
+_LISTENVIRONMENTSREQUEST = _descriptor.Descriptor(
+  name='ListEnvironmentsRequest',
+  full_name='delivery.ListEnvironmentsRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='space_id', full_name='delivery.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=411,
+  serialized_end=454,
+)
+
+
+_LISTENVIRONMENTSRESPONSE = _descriptor.Descriptor(
+  name='ListEnvironmentsResponse',
+  full_name='delivery.ListEnvironmentsResponse',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='envs', full_name='delivery.ListEnvironmentsResponse.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=531,
+)
+
+
+_GETCOLLECTIONREQUEST = _descriptor.Descriptor(
+  name='GetCollectionRequest',
+  full_name='delivery.GetCollectionRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='space_id', full_name='delivery.GetCollectionRequest.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='delivery.GetCollectionRequest.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='delivery.GetCollectionRequest.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=533,
+  serialized_end=612,
+)
+
+
+_GETCOLLECTIONRESPONSE = _descriptor.Descriptor(
+  name='GetCollectionResponse',
+  full_name='delivery.GetCollectionResponse',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='collection', full_name='delivery.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=614,
+  serialized_end=690,
+)
+
+
+_LISTCOLLECTIONSREQUEST = _descriptor.Descriptor(
+  name='ListCollectionsRequest',
+  full_name='delivery.ListCollectionsRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='space_id', full_name='delivery.ListCollectionsRequest.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='delivery.ListCollectionsRequest.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=692,
+  serialized_end=750,
+)
+
+
+_LISTCOLLECTIONSRESPONSE = _descriptor.Descriptor(
+  name='ListCollectionsResponse',
+  full_name='delivery.ListCollectionsResponse',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='collections', full_name='delivery.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=752,
+  serialized_end=831,
+)
+
+
+_GETITEMREQUEST = _descriptor.Descriptor(
+  name='GetItemRequest',
+  full_name='delivery.GetItemRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='space_id', full_name='delivery.GetItemRequest.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='delivery.GetItemRequest.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='delivery.GetItemRequest.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_id', full_name='delivery.GetItemRequest.item_id', 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='options', full_name='delivery.GetItemRequest.options', index=4,
+      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),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=834,
+  serialized_end=977,
+)
+
+
+_GETITEMRESPONSE = _descriptor.Descriptor(
+  name='GetItemResponse',
+  full_name='delivery.GetItemResponse',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='item', full_name='delivery.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=1031,
+)
+
+
+_FINDITEMSREQUEST = _descriptor.Descriptor(
+  name='FindItemsRequest',
+  full_name='delivery.FindItemsRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='space_id', full_name='delivery.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='env_id', full_name='delivery.FindItemsRequest.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='delivery.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='filter', full_name='delivery.FindItemsRequest.filter', 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),
+    _descriptor.FieldDescriptor(
+      name='options', full_name='delivery.FindItemsRequest.options', index=4,
+      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),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=1034,
+  serialized_end=1202,
+)
+
+
+_FINDITEMSRESPONSE = _descriptor.Descriptor(
+  name='FindItemsResponse',
+  full_name='delivery.FindItemsResponse',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='items', full_name='delivery.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='delivery.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=1204,
+  serialized_end=1274,
+)
+
+
+_AGGREGATEOPTIONS_FIELDSENTRY = _descriptor.Descriptor(
+  name='FieldsEntry',
+  full_name='delivery.AggregateOptions.FieldsEntry',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='key', full_name='delivery.AggregateOptions.FieldsEntry.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='delivery.AggregateOptions.FieldsEntry.value', 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=b'8\001',
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=1352,
+  serialized_end=1397,
+)
+
+_AGGREGATEOPTIONS = _descriptor.Descriptor(
+  name='AggregateOptions',
+  full_name='delivery.AggregateOptions',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='fields', full_name='delivery.AggregateOptions.fields', 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=[_AGGREGATEOPTIONS_FIELDSENTRY, ],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=1276,
+  serialized_end=1397,
+)
+
+
+_AGGREGATEREQUEST = _descriptor.Descriptor(
+  name='AggregateRequest',
+  full_name='delivery.AggregateRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='space_id', full_name='delivery.AggregateRequest.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='delivery.AggregateRequest.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='delivery.AggregateRequest.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='filter', full_name='delivery.AggregateRequest.filter', 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='options', full_name='delivery.AggregateRequest.options', index=4,
+      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=1400,
+  serialized_end=1559,
+)
+
+
+_AGGREGATERESPONSE = _descriptor.Descriptor(
+  name='AggregateResponse',
+  full_name='delivery.AggregateResponse',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='result', full_name='delivery.AggregateResponse.result', 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=1561,
+  serialized_end=1621,
+)
+
+_LISTLOCALESRESPONSE.fields_by_name['locales'].message_type = locales_dot_locales__pb2._LOCALE
+_GETENVIRONMENTRESPONSE.fields_by_name['env'].message_type = environments_dot_environments__pb2._ENVIRONMENT
+_LISTENVIRONMENTSRESPONSE.fields_by_name['envs'].message_type = environments_dot_environments__pb2._ENVIRONMENT
+_GETCOLLECTIONRESPONSE.fields_by_name['collection'].message_type = collections_dot_collections__pb2._COLLECTION
+_LISTCOLLECTIONSRESPONSE.fields_by_name['collections'].message_type = collections_dot_collections__pb2._COLLECTION
+_GETITEMREQUEST.fields_by_name['options'].message_type = items_dot_items__pb2._GETPUBLISHEDOPTIONS
+_GETITEMRESPONSE.fields_by_name['item'].message_type = items_dot_items__pb2._ITEM
+_FINDITEMSREQUEST.fields_by_name['filter'].message_type = items_dot_items__pb2._FILTER
+_FINDITEMSREQUEST.fields_by_name['options'].message_type = items_dot_items__pb2._FINDPUBLISHEDOPTIONS
+_FINDITEMSRESPONSE.fields_by_name['items'].message_type = items_dot_items__pb2._ITEM
+_AGGREGATEOPTIONS_FIELDSENTRY.containing_type = _AGGREGATEOPTIONS
+_AGGREGATEOPTIONS.fields_by_name['fields'].message_type = _AGGREGATEOPTIONS_FIELDSENTRY
+_AGGREGATEREQUEST.fields_by_name['filter'].message_type = items_dot_items__pb2._FILTER
+_AGGREGATEREQUEST.fields_by_name['options'].message_type = _AGGREGATEOPTIONS
+_AGGREGATERESPONSE.fields_by_name['result'].message_type = google_dot_protobuf_dot_struct__pb2._STRUCT
+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['ListEnvironmentsRequest'] = _LISTENVIRONMENTSREQUEST
+DESCRIPTOR.message_types_by_name['ListEnvironmentsResponse'] = _LISTENVIRONMENTSRESPONSE
+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
+DESCRIPTOR.message_types_by_name['AggregateOptions'] = _AGGREGATEOPTIONS
+DESCRIPTOR.message_types_by_name['AggregateRequest'] = _AGGREGATEREQUEST
+DESCRIPTOR.message_types_by_name['AggregateResponse'] = _AGGREGATERESPONSE
+_sym_db.RegisterFileDescriptor(DESCRIPTOR)
+
+ListLocalesRequest = _reflection.GeneratedProtocolMessageType('ListLocalesRequest', (_message.Message,), {
+  'DESCRIPTOR' : _LISTLOCALESREQUEST,
+  '__module__' : 'delivery.delivery_pb2'
+  # @@protoc_insertion_point(class_scope:delivery.ListLocalesRequest)
+  })
+_sym_db.RegisterMessage(ListLocalesRequest)
+
+ListLocalesResponse = _reflection.GeneratedProtocolMessageType('ListLocalesResponse', (_message.Message,), {
+  'DESCRIPTOR' : _LISTLOCALESRESPONSE,
+  '__module__' : 'delivery.delivery_pb2'
+  # @@protoc_insertion_point(class_scope:delivery.ListLocalesResponse)
+  })
+_sym_db.RegisterMessage(ListLocalesResponse)
+
+GetEnvironmentRequest = _reflection.GeneratedProtocolMessageType('GetEnvironmentRequest', (_message.Message,), {
+  'DESCRIPTOR' : _GETENVIRONMENTREQUEST,
+  '__module__' : 'delivery.delivery_pb2'
+  # @@protoc_insertion_point(class_scope:delivery.GetEnvironmentRequest)
+  })
+_sym_db.RegisterMessage(GetEnvironmentRequest)
+
+GetEnvironmentResponse = _reflection.GeneratedProtocolMessageType('GetEnvironmentResponse', (_message.Message,), {
+  'DESCRIPTOR' : _GETENVIRONMENTRESPONSE,
+  '__module__' : 'delivery.delivery_pb2'
+  # @@protoc_insertion_point(class_scope:delivery.GetEnvironmentResponse)
+  })
+_sym_db.RegisterMessage(GetEnvironmentResponse)
+
+ListEnvironmentsRequest = _reflection.GeneratedProtocolMessageType('ListEnvironmentsRequest', (_message.Message,), {
+  'DESCRIPTOR' : _LISTENVIRONMENTSREQUEST,
+  '__module__' : 'delivery.delivery_pb2'
+  # @@protoc_insertion_point(class_scope:delivery.ListEnvironmentsRequest)
+  })
+_sym_db.RegisterMessage(ListEnvironmentsRequest)
+
+ListEnvironmentsResponse = _reflection.GeneratedProtocolMessageType('ListEnvironmentsResponse', (_message.Message,), {
+  'DESCRIPTOR' : _LISTENVIRONMENTSRESPONSE,
+  '__module__' : 'delivery.delivery_pb2'
+  # @@protoc_insertion_point(class_scope:delivery.ListEnvironmentsResponse)
+  })
+_sym_db.RegisterMessage(ListEnvironmentsResponse)
+
+GetCollectionRequest = _reflection.GeneratedProtocolMessageType('GetCollectionRequest', (_message.Message,), {
+  'DESCRIPTOR' : _GETCOLLECTIONREQUEST,
+  '__module__' : 'delivery.delivery_pb2'
+  # @@protoc_insertion_point(class_scope:delivery.GetCollectionRequest)
+  })
+_sym_db.RegisterMessage(GetCollectionRequest)
+
+GetCollectionResponse = _reflection.GeneratedProtocolMessageType('GetCollectionResponse', (_message.Message,), {
+  'DESCRIPTOR' : _GETCOLLECTIONRESPONSE,
+  '__module__' : 'delivery.delivery_pb2'
+  # @@protoc_insertion_point(class_scope:delivery.GetCollectionResponse)
+  })
+_sym_db.RegisterMessage(GetCollectionResponse)
+
+ListCollectionsRequest = _reflection.GeneratedProtocolMessageType('ListCollectionsRequest', (_message.Message,), {
+  'DESCRIPTOR' : _LISTCOLLECTIONSREQUEST,
+  '__module__' : 'delivery.delivery_pb2'
+  # @@protoc_insertion_point(class_scope:delivery.ListCollectionsRequest)
+  })
+_sym_db.RegisterMessage(ListCollectionsRequest)
+
+ListCollectionsResponse = _reflection.GeneratedProtocolMessageType('ListCollectionsResponse', (_message.Message,), {
+  'DESCRIPTOR' : _LISTCOLLECTIONSRESPONSE,
+  '__module__' : 'delivery.delivery_pb2'
+  # @@protoc_insertion_point(class_scope:delivery.ListCollectionsResponse)
+  })
+_sym_db.RegisterMessage(ListCollectionsResponse)
+
+GetItemRequest = _reflection.GeneratedProtocolMessageType('GetItemRequest', (_message.Message,), {
+  'DESCRIPTOR' : _GETITEMREQUEST,
+  '__module__' : 'delivery.delivery_pb2'
+  # @@protoc_insertion_point(class_scope:delivery.GetItemRequest)
+  })
+_sym_db.RegisterMessage(GetItemRequest)
+
+GetItemResponse = _reflection.GeneratedProtocolMessageType('GetItemResponse', (_message.Message,), {
+  'DESCRIPTOR' : _GETITEMRESPONSE,
+  '__module__' : 'delivery.delivery_pb2'
+  # @@protoc_insertion_point(class_scope:delivery.GetItemResponse)
+  })
+_sym_db.RegisterMessage(GetItemResponse)
+
+FindItemsRequest = _reflection.GeneratedProtocolMessageType('FindItemsRequest', (_message.Message,), {
+  'DESCRIPTOR' : _FINDITEMSREQUEST,
+  '__module__' : 'delivery.delivery_pb2'
+  # @@protoc_insertion_point(class_scope:delivery.FindItemsRequest)
+  })
+_sym_db.RegisterMessage(FindItemsRequest)
+
+FindItemsResponse = _reflection.GeneratedProtocolMessageType('FindItemsResponse', (_message.Message,), {
+  'DESCRIPTOR' : _FINDITEMSRESPONSE,
+  '__module__' : 'delivery.delivery_pb2'
+  # @@protoc_insertion_point(class_scope:delivery.FindItemsResponse)
+  })
+_sym_db.RegisterMessage(FindItemsResponse)
+
+AggregateOptions = _reflection.GeneratedProtocolMessageType('AggregateOptions', (_message.Message,), {
+
+  'FieldsEntry' : _reflection.GeneratedProtocolMessageType('FieldsEntry', (_message.Message,), {
+    'DESCRIPTOR' : _AGGREGATEOPTIONS_FIELDSENTRY,
+    '__module__' : 'delivery.delivery_pb2'
+    # @@protoc_insertion_point(class_scope:delivery.AggregateOptions.FieldsEntry)
+    })
+  ,
+  'DESCRIPTOR' : _AGGREGATEOPTIONS,
+  '__module__' : 'delivery.delivery_pb2'
+  # @@protoc_insertion_point(class_scope:delivery.AggregateOptions)
+  })
+_sym_db.RegisterMessage(AggregateOptions)
+_sym_db.RegisterMessage(AggregateOptions.FieldsEntry)
+
+AggregateRequest = _reflection.GeneratedProtocolMessageType('AggregateRequest', (_message.Message,), {
+  'DESCRIPTOR' : _AGGREGATEREQUEST,
+  '__module__' : 'delivery.delivery_pb2'
+  # @@protoc_insertion_point(class_scope:delivery.AggregateRequest)
+  })
+_sym_db.RegisterMessage(AggregateRequest)
+
+AggregateResponse = _reflection.GeneratedProtocolMessageType('AggregateResponse', (_message.Message,), {
+  'DESCRIPTOR' : _AGGREGATERESPONSE,
+  '__module__' : 'delivery.delivery_pb2'
+  # @@protoc_insertion_point(class_scope:delivery.AggregateResponse)
+  })
+_sym_db.RegisterMessage(AggregateResponse)
+
+
+DESCRIPTOR._options = None
+_AGGREGATEOPTIONS_FIELDSENTRY._options = None
+
+_DELIVERY = _descriptor.ServiceDescriptor(
+  name='Delivery',
+  full_name='delivery.Delivery',
+  file=DESCRIPTOR,
+  index=0,
+  serialized_options=None,
+  create_key=_descriptor._internal_create_key,
+  serialized_start=1624,
+  serialized_end=2276,
+  methods=[
+  _descriptor.MethodDescriptor(
+    name='ListLocales',
+    full_name='delivery.Delivery.ListLocales',
+    index=0,
+    containing_service=None,
+    input_type=_LISTLOCALESREQUEST,
+    output_type=_LISTLOCALESRESPONSE,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='GetEnvironment',
+    full_name='delivery.Delivery.GetEnvironment',
+    index=1,
+    containing_service=None,
+    input_type=_GETENVIRONMENTREQUEST,
+    output_type=_GETENVIRONMENTRESPONSE,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='ListEnvironments',
+    full_name='delivery.Delivery.ListEnvironments',
+    index=2,
+    containing_service=None,
+    input_type=_LISTENVIRONMENTSREQUEST,
+    output_type=_LISTENVIRONMENTSRESPONSE,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='GetCollection',
+    full_name='delivery.Delivery.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='delivery.Delivery.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='delivery.Delivery.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='delivery.Delivery.FindItems',
+    index=6,
+    containing_service=None,
+    input_type=_FINDITEMSREQUEST,
+    output_type=_FINDITEMSRESPONSE,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='Aggregate',
+    full_name='delivery.Delivery.Aggregate',
+    index=7,
+    containing_service=None,
+    input_type=_AGGREGATEREQUEST,
+    output_type=_AGGREGATERESPONSE,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+])
+_sym_db.RegisterServiceDescriptor(_DELIVERY)
+
+DESCRIPTOR.services_by_name['Delivery'] = _DELIVERY
+
+# @@protoc_insertion_point(module_scope)
diff --git a/perxis/delivery/delivery_pb2_grpc.py b/perxis/delivery/delivery_pb2_grpc.py
new file mode 100644
index 0000000..af60bf5
--- /dev/null
+++ b/perxis/delivery/delivery_pb2_grpc.py
@@ -0,0 +1,297 @@
+# Generated by the gRPC Python protocol compiler plugin. DO NOT EDIT!
+"""Client and server classes corresponding to protobuf-defined services."""
+import grpc
+
+from perxis.delivery import delivery_pb2 as delivery_dot_delivery__pb2
+
+
+class DeliveryStub(object):
+    """Missing associated documentation comment in .proto file."""
+
+    def __init__(self, channel):
+        """Constructor.
+
+        Args:
+            channel: A grpc.Channel.
+        """
+        self.ListLocales = channel.unary_unary(
+                '/delivery.Delivery/ListLocales',
+                request_serializer=delivery_dot_delivery__pb2.ListLocalesRequest.SerializeToString,
+                response_deserializer=delivery_dot_delivery__pb2.ListLocalesResponse.FromString,
+                )
+        self.GetEnvironment = channel.unary_unary(
+                '/delivery.Delivery/GetEnvironment',
+                request_serializer=delivery_dot_delivery__pb2.GetEnvironmentRequest.SerializeToString,
+                response_deserializer=delivery_dot_delivery__pb2.GetEnvironmentResponse.FromString,
+                )
+        self.ListEnvironments = channel.unary_unary(
+                '/delivery.Delivery/ListEnvironments',
+                request_serializer=delivery_dot_delivery__pb2.ListEnvironmentsRequest.SerializeToString,
+                response_deserializer=delivery_dot_delivery__pb2.ListEnvironmentsResponse.FromString,
+                )
+        self.GetCollection = channel.unary_unary(
+                '/delivery.Delivery/GetCollection',
+                request_serializer=delivery_dot_delivery__pb2.GetCollectionRequest.SerializeToString,
+                response_deserializer=delivery_dot_delivery__pb2.GetCollectionResponse.FromString,
+                )
+        self.ListCollections = channel.unary_unary(
+                '/delivery.Delivery/ListCollections',
+                request_serializer=delivery_dot_delivery__pb2.ListCollectionsRequest.SerializeToString,
+                response_deserializer=delivery_dot_delivery__pb2.ListCollectionsResponse.FromString,
+                )
+        self.GetItem = channel.unary_unary(
+                '/delivery.Delivery/GetItem',
+                request_serializer=delivery_dot_delivery__pb2.GetItemRequest.SerializeToString,
+                response_deserializer=delivery_dot_delivery__pb2.GetItemResponse.FromString,
+                )
+        self.FindItems = channel.unary_unary(
+                '/delivery.Delivery/FindItems',
+                request_serializer=delivery_dot_delivery__pb2.FindItemsRequest.SerializeToString,
+                response_deserializer=delivery_dot_delivery__pb2.FindItemsResponse.FromString,
+                )
+        self.Aggregate = channel.unary_unary(
+                '/delivery.Delivery/Aggregate',
+                request_serializer=delivery_dot_delivery__pb2.AggregateRequest.SerializeToString,
+                response_deserializer=delivery_dot_delivery__pb2.AggregateResponse.FromString,
+                )
+
+
+class DeliveryServicer(object):
+    """Missing associated documentation comment in .proto file."""
+
+    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 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 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 Aggregate(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_DeliveryServicer_to_server(servicer, server):
+    rpc_method_handlers = {
+            'ListLocales': grpc.unary_unary_rpc_method_handler(
+                    servicer.ListLocales,
+                    request_deserializer=delivery_dot_delivery__pb2.ListLocalesRequest.FromString,
+                    response_serializer=delivery_dot_delivery__pb2.ListLocalesResponse.SerializeToString,
+            ),
+            'GetEnvironment': grpc.unary_unary_rpc_method_handler(
+                    servicer.GetEnvironment,
+                    request_deserializer=delivery_dot_delivery__pb2.GetEnvironmentRequest.FromString,
+                    response_serializer=delivery_dot_delivery__pb2.GetEnvironmentResponse.SerializeToString,
+            ),
+            'ListEnvironments': grpc.unary_unary_rpc_method_handler(
+                    servicer.ListEnvironments,
+                    request_deserializer=delivery_dot_delivery__pb2.ListEnvironmentsRequest.FromString,
+                    response_serializer=delivery_dot_delivery__pb2.ListEnvironmentsResponse.SerializeToString,
+            ),
+            'GetCollection': grpc.unary_unary_rpc_method_handler(
+                    servicer.GetCollection,
+                    request_deserializer=delivery_dot_delivery__pb2.GetCollectionRequest.FromString,
+                    response_serializer=delivery_dot_delivery__pb2.GetCollectionResponse.SerializeToString,
+            ),
+            'ListCollections': grpc.unary_unary_rpc_method_handler(
+                    servicer.ListCollections,
+                    request_deserializer=delivery_dot_delivery__pb2.ListCollectionsRequest.FromString,
+                    response_serializer=delivery_dot_delivery__pb2.ListCollectionsResponse.SerializeToString,
+            ),
+            'GetItem': grpc.unary_unary_rpc_method_handler(
+                    servicer.GetItem,
+                    request_deserializer=delivery_dot_delivery__pb2.GetItemRequest.FromString,
+                    response_serializer=delivery_dot_delivery__pb2.GetItemResponse.SerializeToString,
+            ),
+            'FindItems': grpc.unary_unary_rpc_method_handler(
+                    servicer.FindItems,
+                    request_deserializer=delivery_dot_delivery__pb2.FindItemsRequest.FromString,
+                    response_serializer=delivery_dot_delivery__pb2.FindItemsResponse.SerializeToString,
+            ),
+            'Aggregate': grpc.unary_unary_rpc_method_handler(
+                    servicer.Aggregate,
+                    request_deserializer=delivery_dot_delivery__pb2.AggregateRequest.FromString,
+                    response_serializer=delivery_dot_delivery__pb2.AggregateResponse.SerializeToString,
+            ),
+    }
+    generic_handler = grpc.method_handlers_generic_handler(
+            'delivery.Delivery', rpc_method_handlers)
+    server.add_generic_rpc_handlers((generic_handler,))
+
+
+ # This class is part of an EXPERIMENTAL API.
+class Delivery(object):
+    """Missing associated documentation comment in .proto file."""
+
+    @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, '/delivery.Delivery/ListLocales',
+            delivery_dot_delivery__pb2.ListLocalesRequest.SerializeToString,
+            delivery_dot_delivery__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, '/delivery.Delivery/GetEnvironment',
+            delivery_dot_delivery__pb2.GetEnvironmentRequest.SerializeToString,
+            delivery_dot_delivery__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, '/delivery.Delivery/ListEnvironments',
+            delivery_dot_delivery__pb2.ListEnvironmentsRequest.SerializeToString,
+            delivery_dot_delivery__pb2.ListEnvironmentsResponse.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, '/delivery.Delivery/GetCollection',
+            delivery_dot_delivery__pb2.GetCollectionRequest.SerializeToString,
+            delivery_dot_delivery__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, '/delivery.Delivery/ListCollections',
+            delivery_dot_delivery__pb2.ListCollectionsRequest.SerializeToString,
+            delivery_dot_delivery__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, '/delivery.Delivery/GetItem',
+            delivery_dot_delivery__pb2.GetItemRequest.SerializeToString,
+            delivery_dot_delivery__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, '/delivery.Delivery/FindItems',
+            delivery_dot_delivery__pb2.FindItemsRequest.SerializeToString,
+            delivery_dot_delivery__pb2.FindItemsResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def Aggregate(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, '/delivery.Delivery/Aggregate',
+            delivery_dot_delivery__pb2.AggregateRequest.SerializeToString,
+            delivery_dot_delivery__pb2.AggregateResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
diff --git a/perxis/environments/environments_pb2.py b/perxis/environments/environments_pb2.py
new file mode 100644
index 0000000..13d9fb8
--- /dev/null
+++ b/perxis/environments/environments_pb2.py
@@ -0,0 +1,894 @@
+# -*- 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
+from google.protobuf import timestamp_pb2 as google_dot_protobuf_dot_timestamp__pb2
+
+
+DESCRIPTOR = _descriptor.FileDescriptor(
+  name='environments/environments.proto',
+  package='content.environments',
+  syntax='proto3',
+  serialized_options=b'Z<git.perx.ru/perxis/perxis-go/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\x1a\x1fgoogle/protobuf/timestamp.proto\"\xb4\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\x33\n\nstate_info\x18\x04 \x01(\x0b\x32\x1f.content.environments.StateInfo\x12\x0f\n\x07\x61liases\x18\x06 \x03(\t\x12,\n\x06\x63onfig\x18\n \x01(\x0b\x32\x1c.content.environments.Config\"\xc3\x01\n\tStateInfo\x12\x34\n\x05state\x18\x01 \x01(\x0e\x32%.content.environments.StateInfo.State\x12\x0c\n\x04info\x18\x02 \x01(\t\x12.\n\nstarted_at\x18\x03 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\"B\n\x05State\x12\x0b\n\x07UNKNOWN\x10\x00\x12\x07\n\x03NEW\x10\x01\x12\r\n\tPREPARING\x10\x02\x12\t\n\x05READY\x10\x03\x12\t\n\x05\x45RROR\x10\x04\"-\n\x06\x43onfig\x12\x11\n\tsource_id\x18\x01 \x01(\t\x12\x10\n\x08\x66\x65\x61tures\x18\x02 \x03(\t\"?\n\rCreateRequest\x12.\n\x03\x65nv\x18\x01 \x01(\x0b\x32!.content.environments.Environment\"D\n\x0e\x43reateResponse\x12\x32\n\x07\x63reated\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\"?\n\rUpdateRequest\x12.\n\x03\x65nv\x18\x01 \x01(\x0b\x32!.content.environments.Environment\"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(\t\"i\n\x0eMigrateRequest\x12\x10\n\x08space_id\x18\x01 \x01(\t\x12\x0e\n\x06\x65nv_id\x18\x02 \x01(\t\x12\x35\n\x07options\x18\n \x01(\x0b\x32$.content.environments.MigrateOptions\"\x1e\n\x0eMigrateOptions\x12\x0c\n\x04wait\x18\x01 \x01(\x08\x32\x81\x05\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\x12I\n\x07Migrate\x12$.content.environments.MigrateRequest\x1a\x16.google.protobuf.Empty\"\x00\x42>Z<git.perx.ru/perxis/perxis-go/proto/environments;environmentsb\x06proto3'
+  ,
+  dependencies=[google_dot_protobuf_dot_empty__pb2.DESCRIPTOR,google_dot_protobuf_dot_timestamp__pb2.DESCRIPTOR,])
+
+
+
+_STATEINFO_STATE = _descriptor.EnumDescriptor(
+  name='State',
+  full_name='content.environments.StateInfo.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='PREPARING', index=2, number=2,
+      serialized_options=None,
+      type=None,
+      create_key=_descriptor._internal_create_key),
+    _descriptor.EnumValueDescriptor(
+      name='READY', index=3, number=3,
+      serialized_options=None,
+      type=None,
+      create_key=_descriptor._internal_create_key),
+    _descriptor.EnumValueDescriptor(
+      name='ERROR', index=4, number=4,
+      serialized_options=None,
+      type=None,
+      create_key=_descriptor._internal_create_key),
+  ],
+  containing_type=None,
+  serialized_options=None,
+  serialized_start=432,
+  serialized_end=498,
+)
+_sym_db.RegisterEnumDescriptor(_STATEINFO_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='space_id', full_name='content.environments.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='content.environments.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_info', full_name='content.environments.Environment.state_info', 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='aliases', full_name='content.environments.Environment.aliases', index=4,
+      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),
+    _descriptor.FieldDescriptor(
+      name='config', full_name='content.environments.Environment.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=120,
+  serialized_end=300,
+)
+
+
+_STATEINFO = _descriptor.Descriptor(
+  name='StateInfo',
+  full_name='content.environments.StateInfo',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='state', full_name='content.environments.StateInfo.state', index=0,
+      number=1, 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='info', full_name='content.environments.StateInfo.info', 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='started_at', full_name='content.environments.StateInfo.started_at', 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=[
+    _STATEINFO_STATE,
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=303,
+  serialized_end=498,
+)
+
+
+_CONFIG = _descriptor.Descriptor(
+  name='Config',
+  full_name='content.environments.Config',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='source_id', full_name='content.environments.Config.source_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='features', full_name='content.environments.Config.features', 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),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=500,
+  serialized_end=545,
+)
+
+
+_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='env', full_name='content.environments.CreateRequest.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=547,
+  serialized_end=610,
+)
+
+
+_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='created', full_name='content.environments.CreateResponse.created', 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=612,
+  serialized_end=680,
+)
+
+
+_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=682,
+  serialized_end=713,
+)
+
+
+_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=715,
+  serialized_end=778,
+)
+
+
+_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=780,
+  serialized_end=826,
+)
+
+
+_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=828,
+  serialized_end=889,
+)
+
+
+_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='env', full_name='content.environments.UpdateRequest.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=891,
+  serialized_end=954,
+)
+
+
+_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=956,
+  serialized_end=1022,
+)
+
+
+_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=1024,
+  serialized_end=1093,
+)
+
+
+_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=1095,
+  serialized_end=1144,
+)
+
+
+_MIGRATEREQUEST = _descriptor.Descriptor(
+  name='MigrateRequest',
+  full_name='content.environments.MigrateRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='space_id', full_name='content.environments.MigrateRequest.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.MigrateRequest.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='options', full_name='content.environments.MigrateRequest.options', index=2,
+      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=1146,
+  serialized_end=1251,
+)
+
+
+_MIGRATEOPTIONS = _descriptor.Descriptor(
+  name='MigrateOptions',
+  full_name='content.environments.MigrateOptions',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='wait', full_name='content.environments.MigrateOptions.wait', index=0,
+      number=1, 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=1253,
+  serialized_end=1283,
+)
+
+_ENVIRONMENT.fields_by_name['state_info'].message_type = _STATEINFO
+_ENVIRONMENT.fields_by_name['config'].message_type = _CONFIG
+_STATEINFO.fields_by_name['state'].enum_type = _STATEINFO_STATE
+_STATEINFO.fields_by_name['started_at'].message_type = google_dot_protobuf_dot_timestamp__pb2._TIMESTAMP
+_STATEINFO_STATE.containing_type = _STATEINFO
+_CREATEREQUEST.fields_by_name['env'].message_type = _ENVIRONMENT
+_CREATERESPONSE.fields_by_name['created'].message_type = _ENVIRONMENT
+_LISTRESPONSE.fields_by_name['envs'].message_type = _ENVIRONMENT
+_GETRESPONSE.fields_by_name['env'].message_type = _ENVIRONMENT
+_UPDATEREQUEST.fields_by_name['env'].message_type = _ENVIRONMENT
+_MIGRATEREQUEST.fields_by_name['options'].message_type = _MIGRATEOPTIONS
+DESCRIPTOR.message_types_by_name['Environment'] = _ENVIRONMENT
+DESCRIPTOR.message_types_by_name['StateInfo'] = _STATEINFO
+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['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
+DESCRIPTOR.message_types_by_name['MigrateRequest'] = _MIGRATEREQUEST
+DESCRIPTOR.message_types_by_name['MigrateOptions'] = _MIGRATEOPTIONS
+_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)
+
+StateInfo = _reflection.GeneratedProtocolMessageType('StateInfo', (_message.Message,), {
+  'DESCRIPTOR' : _STATEINFO,
+  '__module__' : 'environments.environments_pb2'
+  # @@protoc_insertion_point(class_scope:content.environments.StateInfo)
+  })
+_sym_db.RegisterMessage(StateInfo)
+
+Config = _reflection.GeneratedProtocolMessageType('Config', (_message.Message,), {
+  'DESCRIPTOR' : _CONFIG,
+  '__module__' : 'environments.environments_pb2'
+  # @@protoc_insertion_point(class_scope:content.environments.Config)
+  })
+_sym_db.RegisterMessage(Config)
+
+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)
+
+MigrateRequest = _reflection.GeneratedProtocolMessageType('MigrateRequest', (_message.Message,), {
+  'DESCRIPTOR' : _MIGRATEREQUEST,
+  '__module__' : 'environments.environments_pb2'
+  # @@protoc_insertion_point(class_scope:content.environments.MigrateRequest)
+  })
+_sym_db.RegisterMessage(MigrateRequest)
+
+MigrateOptions = _reflection.GeneratedProtocolMessageType('MigrateOptions', (_message.Message,), {
+  'DESCRIPTOR' : _MIGRATEOPTIONS,
+  '__module__' : 'environments.environments_pb2'
+  # @@protoc_insertion_point(class_scope:content.environments.MigrateOptions)
+  })
+_sym_db.RegisterMessage(MigrateOptions)
+
+
+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=1286,
+  serialized_end=1927,
+  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,
+  ),
+  _descriptor.MethodDescriptor(
+    name='Migrate',
+    full_name='content.environments.Environments.Migrate',
+    index=7,
+    containing_service=None,
+    input_type=_MIGRATEREQUEST,
+    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..3add47c
--- /dev/null
+++ b/perxis/environments/environments_pb2_grpc.py
@@ -0,0 +1,298 @@
+# Generated by the gRPC Python protocol compiler plugin. DO NOT EDIT!
+"""Client and server classes corresponding to protobuf-defined services."""
+import grpc
+
+from perxis.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,
+                )
+        self.Migrate = channel.unary_unary(
+                '/content.environments.Environments/Migrate',
+                request_serializer=environments_dot_environments__pb2.MigrateRequest.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 Migrate(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,
+            ),
+            'Migrate': grpc.unary_unary_rpc_method_handler(
+                    servicer.Migrate,
+                    request_deserializer=environments_dot_environments__pb2.MigrateRequest.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)
+
+    @staticmethod
+    def Migrate(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/Migrate',
+            environments_dot_environments__pb2.MigrateRequest.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/extensions/extension_pb2.py b/perxis/extensions/extension_pb2.py
new file mode 100644
index 0000000..604124f
--- /dev/null
+++ b/perxis/extensions/extension_pb2.py
@@ -0,0 +1,1140 @@
+# -*- coding: utf-8 -*-
+# Generated by the protocol buffer compiler.  DO NOT EDIT!
+# source: extensions/extension.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 perxis.references import references_pb2 as references_dot_references__pb2
+
+
+DESCRIPTOR = _descriptor.FileDescriptor(
+  name='extensions/extension.proto',
+  package='extensions',
+  syntax='proto3',
+  serialized_options=b'Z8git.perx.ru/perxis/perxis-go/proto/extensions;extensions',
+  create_key=_descriptor._internal_create_key,
+  serialized_pb=b'\n\x1a\x65xtensions/extension.proto\x12\nextensions\x1a\x1breferences/references.proto\"Y\n\x0eInstallRequest\x12\x13\n\nextensions\x18\x90N \x03(\t\x12\x11\n\x08space_id\x18\x9aN \x01(\t\x12\x0f\n\x06\x65nv_id\x18\xa4N \x01(\t\x12\x0e\n\x05\x66orce\x18\xf4N \x01(\x08\"\xf2\x01\n\x16\x45xtensionRequestResult\x12\x38\n\x05state\x18\x90N \x01(\x0e\x32(.extensions.ExtensionRequestResult.State\x12\x12\n\textension\x18\xf4N \x01(\t\x12\x0c\n\x03msg\x18\xd8O \x01(\t\x12\x0e\n\x05\x65rror\x18\xbcP \x01(\t\x12\x19\n\x10update_available\x18\xa0Q \x01(\x08\"Q\n\x05State\x12\x06\n\x02OK\x10\x00\x12\t\n\x05\x45RROR\x10\x01\x12\x0b\n\x07PENDING\x10\x02\x12\x0f\n\x0bIN_PROGRESS\x10\x03\x12\x17\n\x13PARAMETERS_REQUIRED\x10\x04\"G\n\x0fInstallResponse\x12\x34\n\x07results\x18\x90N \x03(\x0b\x32\".extensions.ExtensionRequestResult\"l\n\x10UninstallRequest\x12\x13\n\nextensions\x18\x90N \x03(\t\x12\x11\n\x08space_id\x18\x9aN \x01(\t\x12\x0f\n\x06\x65nv_id\x18\xa4N \x01(\t\x12\x0f\n\x06remove\x18\xf4N \x01(\x08\x12\x0e\n\x05\x66orce\x18\xd8O \x01(\x08\"I\n\x11UninstallResponse\x12\x34\n\x07results\x18\x90N \x03(\x0b\x32\".extensions.ExtensionRequestResult\"X\n\rUpdateRequest\x12\x13\n\nextensions\x18\x90N \x03(\t\x12\x11\n\x08space_id\x18\x9aN \x01(\t\x12\x0f\n\x06\x65nv_id\x18\xa4N \x01(\t\x12\x0e\n\x05\x66orce\x18\xf4N \x01(\x08\"F\n\x0eUpdateResponse\x12\x34\n\x07results\x18\x90N \x03(\x0b\x32\".extensions.ExtensionRequestResult\"G\n\x0c\x43heckRequest\x12\x13\n\nextensions\x18\x90N \x03(\t\x12\x11\n\x08space_id\x18\x9aN \x01(\t\x12\x0f\n\x06\x65nv_id\x18\xa4N \x01(\t\"E\n\rCheckResponse\x12\x34\n\x07results\x18\x90N \x03(\x0b\x32\".extensions.ExtensionRequestResult\"\xf1\x02\n\rActionRequest\x12\x12\n\textension\x18\xe8\x07 \x01(\t\x12\x0f\n\x06\x61\x63tion\x18\xf4N \x01(\t\x12\x11\n\x08space_id\x18\x84R \x01(\t\x12\x0f\n\x06\x65nv_id\x18\x8eR \x01(\t\x12\x16\n\rcollection_id\x18\x98R \x01(\t\x12\x10\n\x07item_id\x18\xa2R \x01(\t\x12\x11\n\x08item_ids\x18\xacR \x03(\t\x12\x0f\n\x06\x66ields\x18\xb6R \x03(\t\x12:\n\x08metadata\x18\xf8U \x03(\x0b\x32\'.extensions.ActionRequest.MetadataEntry\x12,\n\x04refs\x18\x82V \x03(\x0b\x32\x1d.content.references.Reference\x12.\n\x06params\x18\x8cV \x01(\x0b\x32\x1d.content.references.Reference\x1a/\n\rMetadataEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\"\xf4\x02\n\x0e\x41\x63tionResponse\x12\x30\n\x05state\x18\x90N \x01(\x0e\x32 .extensions.ActionResponse.State\x12\x0c\n\x03msg\x18\xf4N \x01(\t\x12\x0e\n\x05\x65rror\x18\xd8O \x01(\t\x12!\n\x04next\x18\xbcP \x03(\x0b\x32\x12.extensions.Action\x12;\n\x08metadata\x18\xa0Q \x03(\x0b\x32(.extensions.ActionResponse.MetadataEntry\x12,\n\x04refs\x18\xd0P \x03(\x0b\x32\x1d.content.references.Reference\x1a/\n\rMetadataEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\"S\n\x05State\x12\x08\n\x04\x44ONE\x10\x00\x12\t\n\x05\x45RROR\x10\x01\x12\x0b\n\x07PENDING\x10\x02\x12\x0f\n\x0bIN_PROGRESS\x10\x03\x12\x17\n\x13PARAMETERS_REQUIRED\x10\x04\"\xf9\x03\n\x06\x41\x63tion\x12\x12\n\textension\x18\x90N \x01(\t\x12\x0f\n\x06\x61\x63tion\x18\xf4N \x01(\t\x12\r\n\x04name\x18\xd8O \x01(\t\x12\x14\n\x0b\x64\x65scription\x18\xe2O \x01(\t\x12\r\n\x04icon\x18\xecO \x01(\t\x12-\n\x05image\x18\xf6O \x01(\x0b\x32\x1d.content.references.Reference\x12\x0f\n\x06groups\x18\x80P \x03(\t\x12&\n\x04kind\x18\xbcP \x01(\x0e\x32\x17.extensions.Action.Kind\x12\x10\n\x07\x63lasses\x18\xc6P \x03(\t\x12,\n\x04refs\x18\xd0P \x03(\x0b\x32\x1d.content.references.Reference\x12\x1a\n\x11params_collection\x18\xdaP \x01(\t\x12+\n\x07request\x18\xa0Q \x01(\x0b\x32\x19.extensions.ActionRequest\x12\x1a\n\x11navigation_action\x18\x84R \x01(\x08\x12\x19\n\x10navigation_route\x18\x8eR \x01(\t\"n\n\x04Kind\x12\x0b\n\x07\x44\x45\x46\x41ULT\x10\x00\x12\t\n\x05SPACE\x10\x01\x12\x0f\n\x0b\x45NVIRONMENT\x10\x02\x12\x0e\n\nCOLLECTION\x10\x03\x12\x08\n\x04ITEM\x10\x04\x12\t\n\x05ITEMS\x10\x05\x12\x0c\n\x08REVISION\x10\x06\x12\n\n\x06\x43REATE\x10\x07\x32\xe3\x02\n\tExtension\x12\x44\n\x07Install\x12\x1a.extensions.InstallRequest\x1a\x1b.extensions.InstallResponse\"\x00\x12>\n\x05\x43heck\x12\x18.extensions.CheckRequest\x1a\x19.extensions.CheckResponse\"\x00\x12\x41\n\x06Update\x12\x19.extensions.UpdateRequest\x1a\x1a.extensions.UpdateResponse\"\x00\x12J\n\tUninstall\x12\x1c.extensions.UninstallRequest\x1a\x1d.extensions.UninstallResponse\"\x00\x12\x41\n\x06\x41\x63tion\x12\x19.extensions.ActionRequest\x1a\x1a.extensions.ActionResponse\"\x00\x42:Z8git.perx.ru/perxis/perxis-go/proto/extensions;extensionsb\x06proto3'
+  ,
+  dependencies=[references_dot_references__pb2.DESCRIPTOR,])
+
+
+
+_EXTENSIONREQUESTRESULT_STATE = _descriptor.EnumDescriptor(
+  name='State',
+  full_name='extensions.ExtensionRequestResult.State',
+  filename=None,
+  file=DESCRIPTOR,
+  create_key=_descriptor._internal_create_key,
+  values=[
+    _descriptor.EnumValueDescriptor(
+      name='OK', index=0, number=0,
+      serialized_options=None,
+      type=None,
+      create_key=_descriptor._internal_create_key),
+    _descriptor.EnumValueDescriptor(
+      name='ERROR', index=1, number=1,
+      serialized_options=None,
+      type=None,
+      create_key=_descriptor._internal_create_key),
+    _descriptor.EnumValueDescriptor(
+      name='PENDING', index=2, number=2,
+      serialized_options=None,
+      type=None,
+      create_key=_descriptor._internal_create_key),
+    _descriptor.EnumValueDescriptor(
+      name='IN_PROGRESS', index=3, number=3,
+      serialized_options=None,
+      type=None,
+      create_key=_descriptor._internal_create_key),
+    _descriptor.EnumValueDescriptor(
+      name='PARAMETERS_REQUIRED', index=4, number=4,
+      serialized_options=None,
+      type=None,
+      create_key=_descriptor._internal_create_key),
+  ],
+  containing_type=None,
+  serialized_options=None,
+  serialized_start=324,
+  serialized_end=405,
+)
+_sym_db.RegisterEnumDescriptor(_EXTENSIONREQUESTRESULT_STATE)
+
+_ACTIONRESPONSE_STATE = _descriptor.EnumDescriptor(
+  name='State',
+  full_name='extensions.ActionResponse.State',
+  filename=None,
+  file=DESCRIPTOR,
+  create_key=_descriptor._internal_create_key,
+  values=[
+    _descriptor.EnumValueDescriptor(
+      name='DONE', index=0, number=0,
+      serialized_options=None,
+      type=None,
+      create_key=_descriptor._internal_create_key),
+    _descriptor.EnumValueDescriptor(
+      name='ERROR', index=1, number=1,
+      serialized_options=None,
+      type=None,
+      create_key=_descriptor._internal_create_key),
+    _descriptor.EnumValueDescriptor(
+      name='PENDING', index=2, number=2,
+      serialized_options=None,
+      type=None,
+      create_key=_descriptor._internal_create_key),
+    _descriptor.EnumValueDescriptor(
+      name='IN_PROGRESS', index=3, number=3,
+      serialized_options=None,
+      type=None,
+      create_key=_descriptor._internal_create_key),
+    _descriptor.EnumValueDescriptor(
+      name='PARAMETERS_REQUIRED', index=4, number=4,
+      serialized_options=None,
+      type=None,
+      create_key=_descriptor._internal_create_key),
+  ],
+  containing_type=None,
+  serialized_options=None,
+  serialized_start=1633,
+  serialized_end=1716,
+)
+_sym_db.RegisterEnumDescriptor(_ACTIONRESPONSE_STATE)
+
+_ACTION_KIND = _descriptor.EnumDescriptor(
+  name='Kind',
+  full_name='extensions.Action.Kind',
+  filename=None,
+  file=DESCRIPTOR,
+  create_key=_descriptor._internal_create_key,
+  values=[
+    _descriptor.EnumValueDescriptor(
+      name='DEFAULT', index=0, number=0,
+      serialized_options=None,
+      type=None,
+      create_key=_descriptor._internal_create_key),
+    _descriptor.EnumValueDescriptor(
+      name='SPACE', index=1, number=1,
+      serialized_options=None,
+      type=None,
+      create_key=_descriptor._internal_create_key),
+    _descriptor.EnumValueDescriptor(
+      name='ENVIRONMENT', index=2, number=2,
+      serialized_options=None,
+      type=None,
+      create_key=_descriptor._internal_create_key),
+    _descriptor.EnumValueDescriptor(
+      name='COLLECTION', index=3, number=3,
+      serialized_options=None,
+      type=None,
+      create_key=_descriptor._internal_create_key),
+    _descriptor.EnumValueDescriptor(
+      name='ITEM', index=4, number=4,
+      serialized_options=None,
+      type=None,
+      create_key=_descriptor._internal_create_key),
+    _descriptor.EnumValueDescriptor(
+      name='ITEMS', index=5, number=5,
+      serialized_options=None,
+      type=None,
+      create_key=_descriptor._internal_create_key),
+    _descriptor.EnumValueDescriptor(
+      name='REVISION', index=6, number=6,
+      serialized_options=None,
+      type=None,
+      create_key=_descriptor._internal_create_key),
+    _descriptor.EnumValueDescriptor(
+      name='CREATE', index=7, number=7,
+      serialized_options=None,
+      type=None,
+      create_key=_descriptor._internal_create_key),
+  ],
+  containing_type=None,
+  serialized_options=None,
+  serialized_start=2114,
+  serialized_end=2224,
+)
+_sym_db.RegisterEnumDescriptor(_ACTION_KIND)
+
+
+_INSTALLREQUEST = _descriptor.Descriptor(
+  name='InstallRequest',
+  full_name='extensions.InstallRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='extensions', full_name='extensions.InstallRequest.extensions', index=0,
+      number=10000, 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='extensions.InstallRequest.space_id', index=1,
+      number=10010, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=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='extensions.InstallRequest.env_id', index=2,
+      number=10020, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='force', full_name='extensions.InstallRequest.force', index=3,
+      number=10100, 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=71,
+  serialized_end=160,
+)
+
+
+_EXTENSIONREQUESTRESULT = _descriptor.Descriptor(
+  name='ExtensionRequestResult',
+  full_name='extensions.ExtensionRequestResult',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='state', full_name='extensions.ExtensionRequestResult.state', index=0,
+      number=10000, 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='extension', full_name='extensions.ExtensionRequestResult.extension', index=1,
+      number=10100, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='msg', full_name='extensions.ExtensionRequestResult.msg', index=2,
+      number=10200, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='error', full_name='extensions.ExtensionRequestResult.error', index=3,
+      number=10300, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=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_available', full_name='extensions.ExtensionRequestResult.update_available', index=4,
+      number=10400, 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=[
+    _EXTENSIONREQUESTRESULT_STATE,
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=163,
+  serialized_end=405,
+)
+
+
+_INSTALLRESPONSE = _descriptor.Descriptor(
+  name='InstallResponse',
+  full_name='extensions.InstallResponse',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='results', full_name='extensions.InstallResponse.results', index=0,
+      number=10000, 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=407,
+  serialized_end=478,
+)
+
+
+_UNINSTALLREQUEST = _descriptor.Descriptor(
+  name='UninstallRequest',
+  full_name='extensions.UninstallRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='extensions', full_name='extensions.UninstallRequest.extensions', index=0,
+      number=10000, 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='extensions.UninstallRequest.space_id', index=1,
+      number=10010, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=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='extensions.UninstallRequest.env_id', index=2,
+      number=10020, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='remove', full_name='extensions.UninstallRequest.remove', index=3,
+      number=10100, 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='force', full_name='extensions.UninstallRequest.force', index=4,
+      number=10200, 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=480,
+  serialized_end=588,
+)
+
+
+_UNINSTALLRESPONSE = _descriptor.Descriptor(
+  name='UninstallResponse',
+  full_name='extensions.UninstallResponse',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='results', full_name='extensions.UninstallResponse.results', index=0,
+      number=10000, 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=663,
+)
+
+
+_UPDATEREQUEST = _descriptor.Descriptor(
+  name='UpdateRequest',
+  full_name='extensions.UpdateRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='extensions', full_name='extensions.UpdateRequest.extensions', index=0,
+      number=10000, 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='extensions.UpdateRequest.space_id', index=1,
+      number=10010, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=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='extensions.UpdateRequest.env_id', index=2,
+      number=10020, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='force', full_name='extensions.UpdateRequest.force', index=3,
+      number=10100, 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=665,
+  serialized_end=753,
+)
+
+
+_UPDATERESPONSE = _descriptor.Descriptor(
+  name='UpdateResponse',
+  full_name='extensions.UpdateResponse',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='results', full_name='extensions.UpdateResponse.results', index=0,
+      number=10000, 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=755,
+  serialized_end=825,
+)
+
+
+_CHECKREQUEST = _descriptor.Descriptor(
+  name='CheckRequest',
+  full_name='extensions.CheckRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='extensions', full_name='extensions.CheckRequest.extensions', index=0,
+      number=10000, 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='extensions.CheckRequest.space_id', index=1,
+      number=10010, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=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='extensions.CheckRequest.env_id', index=2,
+      number=10020, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=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=827,
+  serialized_end=898,
+)
+
+
+_CHECKRESPONSE = _descriptor.Descriptor(
+  name='CheckResponse',
+  full_name='extensions.CheckResponse',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='results', full_name='extensions.CheckResponse.results', index=0,
+      number=10000, 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=900,
+  serialized_end=969,
+)
+
+
+_ACTIONREQUEST_METADATAENTRY = _descriptor.Descriptor(
+  name='MetadataEntry',
+  full_name='extensions.ActionRequest.MetadataEntry',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='key', full_name='extensions.ActionRequest.MetadataEntry.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='extensions.ActionRequest.MetadataEntry.value', 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=b'8\001',
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=1294,
+  serialized_end=1341,
+)
+
+_ACTIONREQUEST = _descriptor.Descriptor(
+  name='ActionRequest',
+  full_name='extensions.ActionRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='extension', full_name='extensions.ActionRequest.extension', index=0,
+      number=1000, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='action', full_name='extensions.ActionRequest.action', index=1,
+      number=10100, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=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='extensions.ActionRequest.space_id', index=2,
+      number=10500, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=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='extensions.ActionRequest.env_id', index=3,
+      number=10510, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=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='extensions.ActionRequest.collection_id', index=4,
+      number=10520, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=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_id', full_name='extensions.ActionRequest.item_id', index=5,
+      number=10530, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=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_ids', full_name='extensions.ActionRequest.item_ids', index=6,
+      number=10540, 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', full_name='extensions.ActionRequest.fields', index=7,
+      number=10550, 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='metadata', full_name='extensions.ActionRequest.metadata', index=8,
+      number=11000, 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='refs', full_name='extensions.ActionRequest.refs', index=9,
+      number=11010, 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='params', full_name='extensions.ActionRequest.params', index=10,
+      number=11020, 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=[_ACTIONREQUEST_METADATAENTRY, ],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=972,
+  serialized_end=1341,
+)
+
+
+_ACTIONRESPONSE_METADATAENTRY = _descriptor.Descriptor(
+  name='MetadataEntry',
+  full_name='extensions.ActionResponse.MetadataEntry',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='key', full_name='extensions.ActionResponse.MetadataEntry.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='extensions.ActionResponse.MetadataEntry.value', 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=b'8\001',
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=1294,
+  serialized_end=1341,
+)
+
+_ACTIONRESPONSE = _descriptor.Descriptor(
+  name='ActionResponse',
+  full_name='extensions.ActionResponse',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='state', full_name='extensions.ActionResponse.state', index=0,
+      number=10000, 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='msg', full_name='extensions.ActionResponse.msg', index=1,
+      number=10100, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='error', full_name='extensions.ActionResponse.error', index=2,
+      number=10200, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='next', full_name='extensions.ActionResponse.next', index=3,
+      number=10300, 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='metadata', full_name='extensions.ActionResponse.metadata', index=4,
+      number=10400, 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='refs', full_name='extensions.ActionResponse.refs', index=5,
+      number=10320, 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=[_ACTIONRESPONSE_METADATAENTRY, ],
+  enum_types=[
+    _ACTIONRESPONSE_STATE,
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=1344,
+  serialized_end=1716,
+)
+
+
+_ACTION = _descriptor.Descriptor(
+  name='Action',
+  full_name='extensions.Action',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='extension', full_name='extensions.Action.extension', index=0,
+      number=10000, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='action', full_name='extensions.Action.action', index=1,
+      number=10100, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=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='extensions.Action.name', index=2,
+      number=10200, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=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='extensions.Action.description', index=3,
+      number=10210, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='icon', full_name='extensions.Action.icon', index=4,
+      number=10220, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='image', full_name='extensions.Action.image', index=5,
+      number=10230, 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='groups', full_name='extensions.Action.groups', index=6,
+      number=10240, 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='kind', full_name='extensions.Action.kind', index=7,
+      number=10300, 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='classes', full_name='extensions.Action.classes', index=8,
+      number=10310, 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='refs', full_name='extensions.Action.refs', index=9,
+      number=10320, 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='params_collection', full_name='extensions.Action.params_collection', index=10,
+      number=10330, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='request', full_name='extensions.Action.request', index=11,
+      number=10400, 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='navigation_action', full_name='extensions.Action.navigation_action', index=12,
+      number=10500, 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='navigation_route', full_name='extensions.Action.navigation_route', index=13,
+      number=10510, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=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=[
+    _ACTION_KIND,
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=1719,
+  serialized_end=2224,
+)
+
+_EXTENSIONREQUESTRESULT.fields_by_name['state'].enum_type = _EXTENSIONREQUESTRESULT_STATE
+_EXTENSIONREQUESTRESULT_STATE.containing_type = _EXTENSIONREQUESTRESULT
+_INSTALLRESPONSE.fields_by_name['results'].message_type = _EXTENSIONREQUESTRESULT
+_UNINSTALLRESPONSE.fields_by_name['results'].message_type = _EXTENSIONREQUESTRESULT
+_UPDATERESPONSE.fields_by_name['results'].message_type = _EXTENSIONREQUESTRESULT
+_CHECKRESPONSE.fields_by_name['results'].message_type = _EXTENSIONREQUESTRESULT
+_ACTIONREQUEST_METADATAENTRY.containing_type = _ACTIONREQUEST
+_ACTIONREQUEST.fields_by_name['metadata'].message_type = _ACTIONREQUEST_METADATAENTRY
+_ACTIONREQUEST.fields_by_name['refs'].message_type = references_dot_references__pb2._REFERENCE
+_ACTIONREQUEST.fields_by_name['params'].message_type = references_dot_references__pb2._REFERENCE
+_ACTIONRESPONSE_METADATAENTRY.containing_type = _ACTIONRESPONSE
+_ACTIONRESPONSE.fields_by_name['state'].enum_type = _ACTIONRESPONSE_STATE
+_ACTIONRESPONSE.fields_by_name['next'].message_type = _ACTION
+_ACTIONRESPONSE.fields_by_name['metadata'].message_type = _ACTIONRESPONSE_METADATAENTRY
+_ACTIONRESPONSE.fields_by_name['refs'].message_type = references_dot_references__pb2._REFERENCE
+_ACTIONRESPONSE_STATE.containing_type = _ACTIONRESPONSE
+_ACTION.fields_by_name['image'].message_type = references_dot_references__pb2._REFERENCE
+_ACTION.fields_by_name['kind'].enum_type = _ACTION_KIND
+_ACTION.fields_by_name['refs'].message_type = references_dot_references__pb2._REFERENCE
+_ACTION.fields_by_name['request'].message_type = _ACTIONREQUEST
+_ACTION_KIND.containing_type = _ACTION
+DESCRIPTOR.message_types_by_name['InstallRequest'] = _INSTALLREQUEST
+DESCRIPTOR.message_types_by_name['ExtensionRequestResult'] = _EXTENSIONREQUESTRESULT
+DESCRIPTOR.message_types_by_name['InstallResponse'] = _INSTALLRESPONSE
+DESCRIPTOR.message_types_by_name['UninstallRequest'] = _UNINSTALLREQUEST
+DESCRIPTOR.message_types_by_name['UninstallResponse'] = _UNINSTALLRESPONSE
+DESCRIPTOR.message_types_by_name['UpdateRequest'] = _UPDATEREQUEST
+DESCRIPTOR.message_types_by_name['UpdateResponse'] = _UPDATERESPONSE
+DESCRIPTOR.message_types_by_name['CheckRequest'] = _CHECKREQUEST
+DESCRIPTOR.message_types_by_name['CheckResponse'] = _CHECKRESPONSE
+DESCRIPTOR.message_types_by_name['ActionRequest'] = _ACTIONREQUEST
+DESCRIPTOR.message_types_by_name['ActionResponse'] = _ACTIONRESPONSE
+DESCRIPTOR.message_types_by_name['Action'] = _ACTION
+_sym_db.RegisterFileDescriptor(DESCRIPTOR)
+
+InstallRequest = _reflection.GeneratedProtocolMessageType('InstallRequest', (_message.Message,), {
+  'DESCRIPTOR' : _INSTALLREQUEST,
+  '__module__' : 'extensions.extension_pb2'
+  # @@protoc_insertion_point(class_scope:extensions.InstallRequest)
+  })
+_sym_db.RegisterMessage(InstallRequest)
+
+ExtensionRequestResult = _reflection.GeneratedProtocolMessageType('ExtensionRequestResult', (_message.Message,), {
+  'DESCRIPTOR' : _EXTENSIONREQUESTRESULT,
+  '__module__' : 'extensions.extension_pb2'
+  # @@protoc_insertion_point(class_scope:extensions.ExtensionRequestResult)
+  })
+_sym_db.RegisterMessage(ExtensionRequestResult)
+
+InstallResponse = _reflection.GeneratedProtocolMessageType('InstallResponse', (_message.Message,), {
+  'DESCRIPTOR' : _INSTALLRESPONSE,
+  '__module__' : 'extensions.extension_pb2'
+  # @@protoc_insertion_point(class_scope:extensions.InstallResponse)
+  })
+_sym_db.RegisterMessage(InstallResponse)
+
+UninstallRequest = _reflection.GeneratedProtocolMessageType('UninstallRequest', (_message.Message,), {
+  'DESCRIPTOR' : _UNINSTALLREQUEST,
+  '__module__' : 'extensions.extension_pb2'
+  # @@protoc_insertion_point(class_scope:extensions.UninstallRequest)
+  })
+_sym_db.RegisterMessage(UninstallRequest)
+
+UninstallResponse = _reflection.GeneratedProtocolMessageType('UninstallResponse', (_message.Message,), {
+  'DESCRIPTOR' : _UNINSTALLRESPONSE,
+  '__module__' : 'extensions.extension_pb2'
+  # @@protoc_insertion_point(class_scope:extensions.UninstallResponse)
+  })
+_sym_db.RegisterMessage(UninstallResponse)
+
+UpdateRequest = _reflection.GeneratedProtocolMessageType('UpdateRequest', (_message.Message,), {
+  'DESCRIPTOR' : _UPDATEREQUEST,
+  '__module__' : 'extensions.extension_pb2'
+  # @@protoc_insertion_point(class_scope:extensions.UpdateRequest)
+  })
+_sym_db.RegisterMessage(UpdateRequest)
+
+UpdateResponse = _reflection.GeneratedProtocolMessageType('UpdateResponse', (_message.Message,), {
+  'DESCRIPTOR' : _UPDATERESPONSE,
+  '__module__' : 'extensions.extension_pb2'
+  # @@protoc_insertion_point(class_scope:extensions.UpdateResponse)
+  })
+_sym_db.RegisterMessage(UpdateResponse)
+
+CheckRequest = _reflection.GeneratedProtocolMessageType('CheckRequest', (_message.Message,), {
+  'DESCRIPTOR' : _CHECKREQUEST,
+  '__module__' : 'extensions.extension_pb2'
+  # @@protoc_insertion_point(class_scope:extensions.CheckRequest)
+  })
+_sym_db.RegisterMessage(CheckRequest)
+
+CheckResponse = _reflection.GeneratedProtocolMessageType('CheckResponse', (_message.Message,), {
+  'DESCRIPTOR' : _CHECKRESPONSE,
+  '__module__' : 'extensions.extension_pb2'
+  # @@protoc_insertion_point(class_scope:extensions.CheckResponse)
+  })
+_sym_db.RegisterMessage(CheckResponse)
+
+ActionRequest = _reflection.GeneratedProtocolMessageType('ActionRequest', (_message.Message,), {
+
+  'MetadataEntry' : _reflection.GeneratedProtocolMessageType('MetadataEntry', (_message.Message,), {
+    'DESCRIPTOR' : _ACTIONREQUEST_METADATAENTRY,
+    '__module__' : 'extensions.extension_pb2'
+    # @@protoc_insertion_point(class_scope:extensions.ActionRequest.MetadataEntry)
+    })
+  ,
+  'DESCRIPTOR' : _ACTIONREQUEST,
+  '__module__' : 'extensions.extension_pb2'
+  # @@protoc_insertion_point(class_scope:extensions.ActionRequest)
+  })
+_sym_db.RegisterMessage(ActionRequest)
+_sym_db.RegisterMessage(ActionRequest.MetadataEntry)
+
+ActionResponse = _reflection.GeneratedProtocolMessageType('ActionResponse', (_message.Message,), {
+
+  'MetadataEntry' : _reflection.GeneratedProtocolMessageType('MetadataEntry', (_message.Message,), {
+    'DESCRIPTOR' : _ACTIONRESPONSE_METADATAENTRY,
+    '__module__' : 'extensions.extension_pb2'
+    # @@protoc_insertion_point(class_scope:extensions.ActionResponse.MetadataEntry)
+    })
+  ,
+  'DESCRIPTOR' : _ACTIONRESPONSE,
+  '__module__' : 'extensions.extension_pb2'
+  # @@protoc_insertion_point(class_scope:extensions.ActionResponse)
+  })
+_sym_db.RegisterMessage(ActionResponse)
+_sym_db.RegisterMessage(ActionResponse.MetadataEntry)
+
+Action = _reflection.GeneratedProtocolMessageType('Action', (_message.Message,), {
+  'DESCRIPTOR' : _ACTION,
+  '__module__' : 'extensions.extension_pb2'
+  # @@protoc_insertion_point(class_scope:extensions.Action)
+  })
+_sym_db.RegisterMessage(Action)
+
+
+DESCRIPTOR._options = None
+_ACTIONREQUEST_METADATAENTRY._options = None
+_ACTIONRESPONSE_METADATAENTRY._options = None
+
+_EXTENSION = _descriptor.ServiceDescriptor(
+  name='Extension',
+  full_name='extensions.Extension',
+  file=DESCRIPTOR,
+  index=0,
+  serialized_options=None,
+  create_key=_descriptor._internal_create_key,
+  serialized_start=2227,
+  serialized_end=2582,
+  methods=[
+  _descriptor.MethodDescriptor(
+    name='Install',
+    full_name='extensions.Extension.Install',
+    index=0,
+    containing_service=None,
+    input_type=_INSTALLREQUEST,
+    output_type=_INSTALLRESPONSE,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='Check',
+    full_name='extensions.Extension.Check',
+    index=1,
+    containing_service=None,
+    input_type=_CHECKREQUEST,
+    output_type=_CHECKRESPONSE,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='Update',
+    full_name='extensions.Extension.Update',
+    index=2,
+    containing_service=None,
+    input_type=_UPDATEREQUEST,
+    output_type=_UPDATERESPONSE,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='Uninstall',
+    full_name='extensions.Extension.Uninstall',
+    index=3,
+    containing_service=None,
+    input_type=_UNINSTALLREQUEST,
+    output_type=_UNINSTALLRESPONSE,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='Action',
+    full_name='extensions.Extension.Action',
+    index=4,
+    containing_service=None,
+    input_type=_ACTIONREQUEST,
+    output_type=_ACTIONRESPONSE,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+])
+_sym_db.RegisterServiceDescriptor(_EXTENSION)
+
+DESCRIPTOR.services_by_name['Extension'] = _EXTENSION
+
+# @@protoc_insertion_point(module_scope)
diff --git a/perxis/extensions/extension_pb2_grpc.py b/perxis/extensions/extension_pb2_grpc.py
new file mode 100644
index 0000000..6f0ad73
--- /dev/null
+++ b/perxis/extensions/extension_pb2_grpc.py
@@ -0,0 +1,227 @@
+# Generated by the gRPC Python protocol compiler plugin. DO NOT EDIT!
+"""Client and server classes corresponding to protobuf-defined services."""
+import grpc
+
+from perxis.extensions import extension_pb2 as extensions_dot_extension__pb2
+
+
+class ExtensionStub(object):
+    """Extension - API расширения
+    """
+
+    def __init__(self, channel):
+        """Constructor.
+
+        Args:
+            channel: A grpc.Channel.
+        """
+        self.Install = channel.unary_unary(
+                '/extensions.Extension/Install',
+                request_serializer=extensions_dot_extension__pb2.InstallRequest.SerializeToString,
+                response_deserializer=extensions_dot_extension__pb2.InstallResponse.FromString,
+                )
+        self.Check = channel.unary_unary(
+                '/extensions.Extension/Check',
+                request_serializer=extensions_dot_extension__pb2.CheckRequest.SerializeToString,
+                response_deserializer=extensions_dot_extension__pb2.CheckResponse.FromString,
+                )
+        self.Update = channel.unary_unary(
+                '/extensions.Extension/Update',
+                request_serializer=extensions_dot_extension__pb2.UpdateRequest.SerializeToString,
+                response_deserializer=extensions_dot_extension__pb2.UpdateResponse.FromString,
+                )
+        self.Uninstall = channel.unary_unary(
+                '/extensions.Extension/Uninstall',
+                request_serializer=extensions_dot_extension__pb2.UninstallRequest.SerializeToString,
+                response_deserializer=extensions_dot_extension__pb2.UninstallResponse.FromString,
+                )
+        self.Action = channel.unary_unary(
+                '/extensions.Extension/Action',
+                request_serializer=extensions_dot_extension__pb2.ActionRequest.SerializeToString,
+                response_deserializer=extensions_dot_extension__pb2.ActionResponse.FromString,
+                )
+
+
+class ExtensionServicer(object):
+    """Extension - API расширения
+    """
+
+    def Install(self, request, context):
+        """Для установки расширения выполняется запрос к сервису с указанием расширений которые должны быть установлены. Если
+        расширение уже установлено процесс возвращает ошибку.
+        """
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def Check(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):
+        """Сервис выполняет необходимые действия с данными и миграции для соответствия нужной версии расширения.
+        Если расширение не установлено процесс обновления возвращает ошибку.
+        """
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def Uninstall(self, request, context):
+        """Удаление расширения из пространства.
+        """
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def Action(self, request, context):
+        """Пользовательские Действия (Actions)
+
+        Пользовательские действия позволяют расширить функционал пользовательского интерфейса путем
+        добавления в интерфейс элементов взаимодействуя с которыми пользователь может вызывать реакцию на
+        сервере или переход в интерфейсе.
+
+        Пользовательские действия добавляются при установке расширений в системную коллекции `System/Actions`.
+        Коллекция создается автоматически менеджером расширений. При установке так же отображается меню `Действия`
+        доступное для всех пользователей.
+
+        Примеры пользовательских действий:
+        - "Собрать сайт" - добавляется Perxis.Web для сборки сайта, доступна пользователю через меню,
+        параметры space_id, env_id. При вызове выполняется запрос на сервер ProcessAction.
+        - "Посмотреть задачи" - добавляется Tasks для перехода на коллекцию задач. Отображается в меню,
+        параметры space_id, env_id.
+
+        Приложения так же могут использовать действия для вызова обработки в других приложениях при
+        необходимости.
+        """
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+
+def add_ExtensionServicer_to_server(servicer, server):
+    rpc_method_handlers = {
+            'Install': grpc.unary_unary_rpc_method_handler(
+                    servicer.Install,
+                    request_deserializer=extensions_dot_extension__pb2.InstallRequest.FromString,
+                    response_serializer=extensions_dot_extension__pb2.InstallResponse.SerializeToString,
+            ),
+            'Check': grpc.unary_unary_rpc_method_handler(
+                    servicer.Check,
+                    request_deserializer=extensions_dot_extension__pb2.CheckRequest.FromString,
+                    response_serializer=extensions_dot_extension__pb2.CheckResponse.SerializeToString,
+            ),
+            'Update': grpc.unary_unary_rpc_method_handler(
+                    servicer.Update,
+                    request_deserializer=extensions_dot_extension__pb2.UpdateRequest.FromString,
+                    response_serializer=extensions_dot_extension__pb2.UpdateResponse.SerializeToString,
+            ),
+            'Uninstall': grpc.unary_unary_rpc_method_handler(
+                    servicer.Uninstall,
+                    request_deserializer=extensions_dot_extension__pb2.UninstallRequest.FromString,
+                    response_serializer=extensions_dot_extension__pb2.UninstallResponse.SerializeToString,
+            ),
+            'Action': grpc.unary_unary_rpc_method_handler(
+                    servicer.Action,
+                    request_deserializer=extensions_dot_extension__pb2.ActionRequest.FromString,
+                    response_serializer=extensions_dot_extension__pb2.ActionResponse.SerializeToString,
+            ),
+    }
+    generic_handler = grpc.method_handlers_generic_handler(
+            'extensions.Extension', rpc_method_handlers)
+    server.add_generic_rpc_handlers((generic_handler,))
+
+
+ # This class is part of an EXPERIMENTAL API.
+class Extension(object):
+    """Extension - API расширения
+    """
+
+    @staticmethod
+    def Install(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, '/extensions.Extension/Install',
+            extensions_dot_extension__pb2.InstallRequest.SerializeToString,
+            extensions_dot_extension__pb2.InstallResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def Check(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, '/extensions.Extension/Check',
+            extensions_dot_extension__pb2.CheckRequest.SerializeToString,
+            extensions_dot_extension__pb2.CheckResponse.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, '/extensions.Extension/Update',
+            extensions_dot_extension__pb2.UpdateRequest.SerializeToString,
+            extensions_dot_extension__pb2.UpdateResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def Uninstall(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, '/extensions.Extension/Uninstall',
+            extensions_dot_extension__pb2.UninstallRequest.SerializeToString,
+            extensions_dot_extension__pb2.UninstallResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def Action(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, '/extensions.Extension/Action',
+            extensions_dot_extension__pb2.ActionRequest.SerializeToString,
+            extensions_dot_extension__pb2.ActionResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
diff --git a/perxis/extensions/manager_pb2.py b/perxis/extensions/manager_pb2.py
new file mode 100644
index 0000000..1664d52
--- /dev/null
+++ b/perxis/extensions/manager_pb2.py
@@ -0,0 +1,605 @@
+# -*- coding: utf-8 -*-
+# Generated by the protocol buffer compiler.  DO NOT EDIT!
+# source: extensions/manager.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()
+
+
+
+
+DESCRIPTOR = _descriptor.FileDescriptor(
+  name='extensions/manager.proto',
+  package='extensions',
+  syntax='proto3',
+  serialized_options=b'Z8git.perx.ru/perxis/perxis-go/proto/extensions;extensions',
+  create_key=_descriptor._internal_create_key,
+  serialized_pb=b'\n\x18\x65xtensions/manager.proto\x12\nextensions\"\x8d\x02\n\x13\x45xtensionDescriptor\x12\x12\n\textension\x18\x90N \x01(\t\x12\x0e\n\x05title\x18\x9aN \x01(\t\x12\x14\n\x0b\x64\x65scription\x18\xa4N \x01(\t\x12\x10\n\x07version\x18\xf4N \x01(\t\x12\x1c\n\x13version_description\x18\xfeN \x01(\t\x12\r\n\x04\x64\x65ps\x18\xd8O \x03(\t\x12\x0b\n\x03url\x18\x05 \x01(\t\x12?\n\x08metadata\x18\x06 \x03(\x0b\x32-.extensions.ExtensionDescriptor.MetadataEntry\x1a/\n\rMetadataEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\"P\n\x19RegisterExtensionsRequest\x12\x33\n\nextensions\x18\x01 \x03(\x0b\x32\x1f.extensions.ExtensionDescriptor\"\x1c\n\x1aRegisterExtensionsResponse\"R\n\x1bUnregisterExtensionsRequest\x12\x33\n\nextensions\x18\x01 \x03(\x0b\x32\x1f.extensions.ExtensionDescriptor\"\x1e\n\x1cUnregisterExtensionsResponse\")\n\x14ListExtensionsFilter\x12\x11\n\textension\x18\x01 \x03(\t\"I\n\x15ListExtensionsRequest\x12\x30\n\x06\x66ilter\x18\x01 \x01(\x0b\x32 .extensions.ListExtensionsFilter\"M\n\x16ListExtensionsResponse\x12\x33\n\nextensions\x18\x01 \x03(\x0b\x32\x1f.extensions.ExtensionDescriptor\"\xf5\x01\n\x0fSpaceExtensions\x12\x12\n\textension\x18\x90N \x01(\t\x12\x0e\n\x05title\x18\x9aN \x01(\t\x12\x10\n\x07version\x18\xf4N \x01(\t\x12\r\n\x04\x64\x65ps\x18\xd8O \x03(\t\x12\x31\n\x05state\x18\xbcP \x01(\x0e\x32!.extensions.SpaceExtensions.State\x12\x15\n\x0cstatus_error\x18\xa0Q \x01(\t\x12\x13\n\nstatus_msg\x18\x84R \x01(\t\">\n\x05State\x12\x0b\n\x07PENDING\x10\x00\x12\r\n\tINSTALLED\x10\x01\x12\x0f\n\x0bIN_PROGRESS\x10\x02\x12\x08\n\x04\x46\x41IL\x10\x03\x32\xc1\x02\n\x10\x45xtensionManager\x12\x65\n\x12RegisterExtensions\x12%.extensions.RegisterExtensionsRequest\x1a&.extensions.RegisterExtensionsResponse\"\x00\x12k\n\x14UnregisterExtensions\x12\'.extensions.UnregisterExtensionsRequest\x1a(.extensions.UnregisterExtensionsResponse\"\x00\x12Y\n\x0eListExtensions\x12!.extensions.ListExtensionsRequest\x1a\".extensions.ListExtensionsResponse\"\x00\x42:Z8git.perx.ru/perxis/perxis-go/proto/extensions;extensionsb\x06proto3'
+)
+
+
+
+_SPACEEXTENSIONS_STATE = _descriptor.EnumDescriptor(
+  name='State',
+  full_name='extensions.SpaceExtensions.State',
+  filename=None,
+  file=DESCRIPTOR,
+  create_key=_descriptor._internal_create_key,
+  values=[
+    _descriptor.EnumValueDescriptor(
+      name='PENDING', index=0, number=0,
+      serialized_options=None,
+      type=None,
+      create_key=_descriptor._internal_create_key),
+    _descriptor.EnumValueDescriptor(
+      name='INSTALLED', index=1, number=1,
+      serialized_options=None,
+      type=None,
+      create_key=_descriptor._internal_create_key),
+    _descriptor.EnumValueDescriptor(
+      name='IN_PROGRESS', index=2, number=2,
+      serialized_options=None,
+      type=None,
+      create_key=_descriptor._internal_create_key),
+    _descriptor.EnumValueDescriptor(
+      name='FAIL', index=3, number=3,
+      serialized_options=None,
+      type=None,
+      create_key=_descriptor._internal_create_key),
+  ],
+  containing_type=None,
+  serialized_options=None,
+  serialized_start=921,
+  serialized_end=983,
+)
+_sym_db.RegisterEnumDescriptor(_SPACEEXTENSIONS_STATE)
+
+
+_EXTENSIONDESCRIPTOR_METADATAENTRY = _descriptor.Descriptor(
+  name='MetadataEntry',
+  full_name='extensions.ExtensionDescriptor.MetadataEntry',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='key', full_name='extensions.ExtensionDescriptor.MetadataEntry.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='extensions.ExtensionDescriptor.MetadataEntry.value', 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=b'8\001',
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=263,
+  serialized_end=310,
+)
+
+_EXTENSIONDESCRIPTOR = _descriptor.Descriptor(
+  name='ExtensionDescriptor',
+  full_name='extensions.ExtensionDescriptor',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='extension', full_name='extensions.ExtensionDescriptor.extension', index=0,
+      number=10000, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='title', full_name='extensions.ExtensionDescriptor.title', index=1,
+      number=10010, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=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='extensions.ExtensionDescriptor.description', index=2,
+      number=10020, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='version', full_name='extensions.ExtensionDescriptor.version', index=3,
+      number=10100, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='version_description', full_name='extensions.ExtensionDescriptor.version_description', index=4,
+      number=10110, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='deps', full_name='extensions.ExtensionDescriptor.deps', index=5,
+      number=10200, 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='url', full_name='extensions.ExtensionDescriptor.url', index=6,
+      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='metadata', full_name='extensions.ExtensionDescriptor.metadata', index=7,
+      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=[_EXTENSIONDESCRIPTOR_METADATAENTRY, ],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=41,
+  serialized_end=310,
+)
+
+
+_REGISTEREXTENSIONSREQUEST = _descriptor.Descriptor(
+  name='RegisterExtensionsRequest',
+  full_name='extensions.RegisterExtensionsRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='extensions', full_name='extensions.RegisterExtensionsRequest.extensions', 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=312,
+  serialized_end=392,
+)
+
+
+_REGISTEREXTENSIONSRESPONSE = _descriptor.Descriptor(
+  name='RegisterExtensionsResponse',
+  full_name='extensions.RegisterExtensionsResponse',
+  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=394,
+  serialized_end=422,
+)
+
+
+_UNREGISTEREXTENSIONSREQUEST = _descriptor.Descriptor(
+  name='UnregisterExtensionsRequest',
+  full_name='extensions.UnregisterExtensionsRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='extensions', full_name='extensions.UnregisterExtensionsRequest.extensions', 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=424,
+  serialized_end=506,
+)
+
+
+_UNREGISTEREXTENSIONSRESPONSE = _descriptor.Descriptor(
+  name='UnregisterExtensionsResponse',
+  full_name='extensions.UnregisterExtensionsResponse',
+  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=508,
+  serialized_end=538,
+)
+
+
+_LISTEXTENSIONSFILTER = _descriptor.Descriptor(
+  name='ListExtensionsFilter',
+  full_name='extensions.ListExtensionsFilter',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='extension', full_name='extensions.ListExtensionsFilter.extension', 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=540,
+  serialized_end=581,
+)
+
+
+_LISTEXTENSIONSREQUEST = _descriptor.Descriptor(
+  name='ListExtensionsRequest',
+  full_name='extensions.ListExtensionsRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='filter', full_name='extensions.ListExtensionsRequest.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),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=583,
+  serialized_end=656,
+)
+
+
+_LISTEXTENSIONSRESPONSE = _descriptor.Descriptor(
+  name='ListExtensionsResponse',
+  full_name='extensions.ListExtensionsResponse',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='extensions', full_name='extensions.ListExtensionsResponse.extensions', 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=658,
+  serialized_end=735,
+)
+
+
+_SPACEEXTENSIONS = _descriptor.Descriptor(
+  name='SpaceExtensions',
+  full_name='extensions.SpaceExtensions',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='extension', full_name='extensions.SpaceExtensions.extension', index=0,
+      number=10000, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='title', full_name='extensions.SpaceExtensions.title', index=1,
+      number=10010, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='version', full_name='extensions.SpaceExtensions.version', index=2,
+      number=10100, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='deps', full_name='extensions.SpaceExtensions.deps', index=3,
+      number=10200, 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='state', full_name='extensions.SpaceExtensions.state', index=4,
+      number=10300, 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='status_error', full_name='extensions.SpaceExtensions.status_error', index=5,
+      number=10400, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=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_msg', full_name='extensions.SpaceExtensions.status_msg', index=6,
+      number=10500, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=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=[
+    _SPACEEXTENSIONS_STATE,
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=738,
+  serialized_end=983,
+)
+
+_EXTENSIONDESCRIPTOR_METADATAENTRY.containing_type = _EXTENSIONDESCRIPTOR
+_EXTENSIONDESCRIPTOR.fields_by_name['metadata'].message_type = _EXTENSIONDESCRIPTOR_METADATAENTRY
+_REGISTEREXTENSIONSREQUEST.fields_by_name['extensions'].message_type = _EXTENSIONDESCRIPTOR
+_UNREGISTEREXTENSIONSREQUEST.fields_by_name['extensions'].message_type = _EXTENSIONDESCRIPTOR
+_LISTEXTENSIONSREQUEST.fields_by_name['filter'].message_type = _LISTEXTENSIONSFILTER
+_LISTEXTENSIONSRESPONSE.fields_by_name['extensions'].message_type = _EXTENSIONDESCRIPTOR
+_SPACEEXTENSIONS.fields_by_name['state'].enum_type = _SPACEEXTENSIONS_STATE
+_SPACEEXTENSIONS_STATE.containing_type = _SPACEEXTENSIONS
+DESCRIPTOR.message_types_by_name['ExtensionDescriptor'] = _EXTENSIONDESCRIPTOR
+DESCRIPTOR.message_types_by_name['RegisterExtensionsRequest'] = _REGISTEREXTENSIONSREQUEST
+DESCRIPTOR.message_types_by_name['RegisterExtensionsResponse'] = _REGISTEREXTENSIONSRESPONSE
+DESCRIPTOR.message_types_by_name['UnregisterExtensionsRequest'] = _UNREGISTEREXTENSIONSREQUEST
+DESCRIPTOR.message_types_by_name['UnregisterExtensionsResponse'] = _UNREGISTEREXTENSIONSRESPONSE
+DESCRIPTOR.message_types_by_name['ListExtensionsFilter'] = _LISTEXTENSIONSFILTER
+DESCRIPTOR.message_types_by_name['ListExtensionsRequest'] = _LISTEXTENSIONSREQUEST
+DESCRIPTOR.message_types_by_name['ListExtensionsResponse'] = _LISTEXTENSIONSRESPONSE
+DESCRIPTOR.message_types_by_name['SpaceExtensions'] = _SPACEEXTENSIONS
+_sym_db.RegisterFileDescriptor(DESCRIPTOR)
+
+ExtensionDescriptor = _reflection.GeneratedProtocolMessageType('ExtensionDescriptor', (_message.Message,), {
+
+  'MetadataEntry' : _reflection.GeneratedProtocolMessageType('MetadataEntry', (_message.Message,), {
+    'DESCRIPTOR' : _EXTENSIONDESCRIPTOR_METADATAENTRY,
+    '__module__' : 'extensions.manager_pb2'
+    # @@protoc_insertion_point(class_scope:extensions.ExtensionDescriptor.MetadataEntry)
+    })
+  ,
+  'DESCRIPTOR' : _EXTENSIONDESCRIPTOR,
+  '__module__' : 'extensions.manager_pb2'
+  # @@protoc_insertion_point(class_scope:extensions.ExtensionDescriptor)
+  })
+_sym_db.RegisterMessage(ExtensionDescriptor)
+_sym_db.RegisterMessage(ExtensionDescriptor.MetadataEntry)
+
+RegisterExtensionsRequest = _reflection.GeneratedProtocolMessageType('RegisterExtensionsRequest', (_message.Message,), {
+  'DESCRIPTOR' : _REGISTEREXTENSIONSREQUEST,
+  '__module__' : 'extensions.manager_pb2'
+  # @@protoc_insertion_point(class_scope:extensions.RegisterExtensionsRequest)
+  })
+_sym_db.RegisterMessage(RegisterExtensionsRequest)
+
+RegisterExtensionsResponse = _reflection.GeneratedProtocolMessageType('RegisterExtensionsResponse', (_message.Message,), {
+  'DESCRIPTOR' : _REGISTEREXTENSIONSRESPONSE,
+  '__module__' : 'extensions.manager_pb2'
+  # @@protoc_insertion_point(class_scope:extensions.RegisterExtensionsResponse)
+  })
+_sym_db.RegisterMessage(RegisterExtensionsResponse)
+
+UnregisterExtensionsRequest = _reflection.GeneratedProtocolMessageType('UnregisterExtensionsRequest', (_message.Message,), {
+  'DESCRIPTOR' : _UNREGISTEREXTENSIONSREQUEST,
+  '__module__' : 'extensions.manager_pb2'
+  # @@protoc_insertion_point(class_scope:extensions.UnregisterExtensionsRequest)
+  })
+_sym_db.RegisterMessage(UnregisterExtensionsRequest)
+
+UnregisterExtensionsResponse = _reflection.GeneratedProtocolMessageType('UnregisterExtensionsResponse', (_message.Message,), {
+  'DESCRIPTOR' : _UNREGISTEREXTENSIONSRESPONSE,
+  '__module__' : 'extensions.manager_pb2'
+  # @@protoc_insertion_point(class_scope:extensions.UnregisterExtensionsResponse)
+  })
+_sym_db.RegisterMessage(UnregisterExtensionsResponse)
+
+ListExtensionsFilter = _reflection.GeneratedProtocolMessageType('ListExtensionsFilter', (_message.Message,), {
+  'DESCRIPTOR' : _LISTEXTENSIONSFILTER,
+  '__module__' : 'extensions.manager_pb2'
+  # @@protoc_insertion_point(class_scope:extensions.ListExtensionsFilter)
+  })
+_sym_db.RegisterMessage(ListExtensionsFilter)
+
+ListExtensionsRequest = _reflection.GeneratedProtocolMessageType('ListExtensionsRequest', (_message.Message,), {
+  'DESCRIPTOR' : _LISTEXTENSIONSREQUEST,
+  '__module__' : 'extensions.manager_pb2'
+  # @@protoc_insertion_point(class_scope:extensions.ListExtensionsRequest)
+  })
+_sym_db.RegisterMessage(ListExtensionsRequest)
+
+ListExtensionsResponse = _reflection.GeneratedProtocolMessageType('ListExtensionsResponse', (_message.Message,), {
+  'DESCRIPTOR' : _LISTEXTENSIONSRESPONSE,
+  '__module__' : 'extensions.manager_pb2'
+  # @@protoc_insertion_point(class_scope:extensions.ListExtensionsResponse)
+  })
+_sym_db.RegisterMessage(ListExtensionsResponse)
+
+SpaceExtensions = _reflection.GeneratedProtocolMessageType('SpaceExtensions', (_message.Message,), {
+  'DESCRIPTOR' : _SPACEEXTENSIONS,
+  '__module__' : 'extensions.manager_pb2'
+  # @@protoc_insertion_point(class_scope:extensions.SpaceExtensions)
+  })
+_sym_db.RegisterMessage(SpaceExtensions)
+
+
+DESCRIPTOR._options = None
+_EXTENSIONDESCRIPTOR_METADATAENTRY._options = None
+
+_EXTENSIONMANAGER = _descriptor.ServiceDescriptor(
+  name='ExtensionManager',
+  full_name='extensions.ExtensionManager',
+  file=DESCRIPTOR,
+  index=0,
+  serialized_options=None,
+  create_key=_descriptor._internal_create_key,
+  serialized_start=986,
+  serialized_end=1307,
+  methods=[
+  _descriptor.MethodDescriptor(
+    name='RegisterExtensions',
+    full_name='extensions.ExtensionManager.RegisterExtensions',
+    index=0,
+    containing_service=None,
+    input_type=_REGISTEREXTENSIONSREQUEST,
+    output_type=_REGISTEREXTENSIONSRESPONSE,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='UnregisterExtensions',
+    full_name='extensions.ExtensionManager.UnregisterExtensions',
+    index=1,
+    containing_service=None,
+    input_type=_UNREGISTEREXTENSIONSREQUEST,
+    output_type=_UNREGISTEREXTENSIONSRESPONSE,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='ListExtensions',
+    full_name='extensions.ExtensionManager.ListExtensions',
+    index=2,
+    containing_service=None,
+    input_type=_LISTEXTENSIONSREQUEST,
+    output_type=_LISTEXTENSIONSRESPONSE,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+])
+_sym_db.RegisterServiceDescriptor(_EXTENSIONMANAGER)
+
+DESCRIPTOR.services_by_name['ExtensionManager'] = _EXTENSIONMANAGER
+
+# @@protoc_insertion_point(module_scope)
diff --git a/perxis/extensions/manager_pb2_grpc.py b/perxis/extensions/manager_pb2_grpc.py
new file mode 100644
index 0000000..e72aff2
--- /dev/null
+++ b/perxis/extensions/manager_pb2_grpc.py
@@ -0,0 +1,148 @@
+# Generated by the gRPC Python protocol compiler plugin. DO NOT EDIT!
+"""Client and server classes corresponding to protobuf-defined services."""
+import grpc
+
+from perxis.extensions import manager_pb2 as extensions_dot_manager__pb2
+
+
+class ExtensionManagerStub(object):
+    """ExtensionManager - менеджер расширений. Должен реализовывать так же сервис Extension
+    """
+
+    def __init__(self, channel):
+        """Constructor.
+
+        Args:
+            channel: A grpc.Channel.
+        """
+        self.RegisterExtensions = channel.unary_unary(
+                '/extensions.ExtensionManager/RegisterExtensions',
+                request_serializer=extensions_dot_manager__pb2.RegisterExtensionsRequest.SerializeToString,
+                response_deserializer=extensions_dot_manager__pb2.RegisterExtensionsResponse.FromString,
+                )
+        self.UnregisterExtensions = channel.unary_unary(
+                '/extensions.ExtensionManager/UnregisterExtensions',
+                request_serializer=extensions_dot_manager__pb2.UnregisterExtensionsRequest.SerializeToString,
+                response_deserializer=extensions_dot_manager__pb2.UnregisterExtensionsResponse.FromString,
+                )
+        self.ListExtensions = channel.unary_unary(
+                '/extensions.ExtensionManager/ListExtensions',
+                request_serializer=extensions_dot_manager__pb2.ListExtensionsRequest.SerializeToString,
+                response_deserializer=extensions_dot_manager__pb2.ListExtensionsResponse.FromString,
+                )
+
+
+class ExtensionManagerServicer(object):
+    """ExtensionManager - менеджер расширений. Должен реализовывать так же сервис Extension
+    """
+
+    def RegisterExtensions(self, request, context):
+        """##  Регистрация расширений
+
+        Регистрация\Дерегистрация происходить через сервис менеджера расширений (Extension Manager). В процессе регистрации сервис сообщает
+        о поддерживаемых сервисом действиях (Actions) и версии сервиса и зависимостях:
+        1. Действия (Actions) - перечень действия которые обрабатываются сервисом. Включает в себя как системные действия,
+        так и пользовательские, которые могут быть использованы в интерфейсе;
+        2. Имя сервиса/расширения - название сервиса внутри системы;
+        3. Версия сервиса - сервис сообщает текущую версию сервиса. Контроллер сообщает пользователю о возможности обновления
+        расширения при смене версии;
+        4. Описание версии - содержит информацию об изменениях в последних версиях расширения;
+        5. Зависимости - перечень расширений которые необходимы сервису для функционирования. При установке сервиса
+        все расширения от которых он зависит, будут так же установлены.
+        """
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def UnregisterExtensions(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 ListExtensions(self, request, context):
+        """Получить список зарегистрированных сервисов
+        """
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+
+def add_ExtensionManagerServicer_to_server(servicer, server):
+    rpc_method_handlers = {
+            'RegisterExtensions': grpc.unary_unary_rpc_method_handler(
+                    servicer.RegisterExtensions,
+                    request_deserializer=extensions_dot_manager__pb2.RegisterExtensionsRequest.FromString,
+                    response_serializer=extensions_dot_manager__pb2.RegisterExtensionsResponse.SerializeToString,
+            ),
+            'UnregisterExtensions': grpc.unary_unary_rpc_method_handler(
+                    servicer.UnregisterExtensions,
+                    request_deserializer=extensions_dot_manager__pb2.UnregisterExtensionsRequest.FromString,
+                    response_serializer=extensions_dot_manager__pb2.UnregisterExtensionsResponse.SerializeToString,
+            ),
+            'ListExtensions': grpc.unary_unary_rpc_method_handler(
+                    servicer.ListExtensions,
+                    request_deserializer=extensions_dot_manager__pb2.ListExtensionsRequest.FromString,
+                    response_serializer=extensions_dot_manager__pb2.ListExtensionsResponse.SerializeToString,
+            ),
+    }
+    generic_handler = grpc.method_handlers_generic_handler(
+            'extensions.ExtensionManager', rpc_method_handlers)
+    server.add_generic_rpc_handlers((generic_handler,))
+
+
+ # This class is part of an EXPERIMENTAL API.
+class ExtensionManager(object):
+    """ExtensionManager - менеджер расширений. Должен реализовывать так же сервис Extension
+    """
+
+    @staticmethod
+    def RegisterExtensions(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, '/extensions.ExtensionManager/RegisterExtensions',
+            extensions_dot_manager__pb2.RegisterExtensionsRequest.SerializeToString,
+            extensions_dot_manager__pb2.RegisterExtensionsResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def UnregisterExtensions(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, '/extensions.ExtensionManager/UnregisterExtensions',
+            extensions_dot_manager__pb2.UnregisterExtensionsRequest.SerializeToString,
+            extensions_dot_manager__pb2.UnregisterExtensionsResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def ListExtensions(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, '/extensions.ExtensionManager/ListExtensions',
+            extensions_dot_manager__pb2.ListExtensionsRequest.SerializeToString,
+            extensions_dot_manager__pb2.ListExtensionsResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
diff --git a/perxis/files/files_pb2.py b/perxis/files/files_pb2.py
new file mode 100644
index 0000000..2d3cb9e
--- /dev/null
+++ b/perxis/files/files_pb2.py
@@ -0,0 +1,909 @@
+# -*- coding: utf-8 -*-
+# Generated by the protocol buffer compiler.  DO NOT EDIT!
+# source: files/files.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='files/files.proto',
+  package='files',
+  syntax='proto3',
+  serialized_options=b'Z.git.perx.ru/perxis/perxis-go/proto/files;files',
+  create_key=_descriptor._internal_create_key,
+  serialized_pb=b'\n\x11\x66iles/files.proto\x12\x05\x66iles\x1a\x1bgoogle/protobuf/empty.proto\"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\"\x8a\x01\n\x0fMultipartUpload\x12\x19\n\x04\x66ile\x18\x01 \x01(\x0b\x32\x0b.files.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\x14.files.CompletedPart\"7\n\x06Upload\x12\x19\n\x04\x66ile\x18\x01 \x01(\x0b\x32\x0b.files.File\x12\x12\n\nupload_url\x18\x02 \x01(\t\"+\n\rCompletedPart\x12\x0e\n\x06number\x18\x01 \x01(\x05\x12\n\n\x02id\x18\x02 \x01(\t\"<\n\x12StartUploadRequest\x12&\n\x06upload\x18\x01 \x01(\x0b\x32\x16.files.MultipartUpload\"=\n\x13StartUploadResponse\x12&\n\x06upload\x18\x01 \x01(\x0b\x32\x16.files.MultipartUpload\"?\n\x15\x43ompleteUploadRequest\x12&\n\x06upload\x18\x01 \x01(\x0b\x32\x16.files.MultipartUpload\"@\n\x16\x43ompleteUploadResponse\x12&\n\x06upload\x18\x01 \x01(\x0b\x32\x16.files.MultipartUpload\"<\n\x12\x41\x62ortUploadRequest\x12&\n\x06upload\x18\x01 \x01(\x0b\x32\x16.files.MultipartUpload\"\x15\n\x13\x41\x62ortUploadResponse\";\n\x11MoveUploadRequest\x12&\n\x06upload\x18\x01 \x01(\x0b\x32\x16.files.MultipartUpload\"/\n\x12MoveUploadResponse\x12\x19\n\x04\x66ile\x18\x01 \x01(\x0b\x32\x0b.files.File\"*\n\rUploadRequest\x12\x19\n\x04\x66ile\x18\x01 \x01(\x0b\x32\x0b.files.File\"/\n\x0eUploadResponse\x12\x1d\n\x06upload\x18\x01 \x01(\x0b\x32\r.files.Upload\"\x1c\n\x0eGetFileRequest\x12\n\n\x02id\x18\x01 \x01(\t\",\n\x0fGetFileResponse\x12\x19\n\x04\x66ile\x18\x01 \x01(\x0b\x32\x0b.files.File\".\n\x11\x44\x65leteFileRequest\x12\x19\n\x04\x66ile\x18\x01 \x01(\x0b\x32\x0b.files.File\"\x14\n\x12\x44\x65leteFileResponse2\xe0\x03\n\x05\x46iles\x12\x46\n\x0bStartUpload\x12\x19.files.StartUploadRequest\x1a\x1a.files.StartUploadResponse\"\x00\x12O\n\x0e\x43ompleteUpload\x12\x1c.files.CompleteUploadRequest\x1a\x1d.files.CompleteUploadResponse\"\x00\x12\x42\n\x0b\x41\x62ortUpload\x12\x19.files.AbortUploadRequest\x1a\x16.google.protobuf.Empty\"\x00\x12\x43\n\nMoveUpload\x12\x18.files.MoveUploadRequest\x1a\x19.files.MoveUploadResponse\"\x00\x12\x37\n\x06Upload\x12\x14.files.UploadRequest\x1a\x15.files.UploadResponse\"\x00\x12:\n\x07GetFile\x12\x15.files.GetFileRequest\x1a\x16.files.GetFileResponse\"\x00\x12@\n\nDeleteFile\x12\x18.files.DeleteFileRequest\x1a\x16.google.protobuf.Empty\"\x00\x42\x30Z.git.perx.ru/perxis/perxis-go/proto/files;filesb\x06proto3'
+  ,
+  dependencies=[google_dot_protobuf_dot_empty__pb2.DESCRIPTOR,])
+
+
+
+
+_FILE = _descriptor.Descriptor(
+  name='File',
+  full_name='files.File',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='id', full_name='files.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='files.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='files.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='files.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='files.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=57,
+  serialized_end=135,
+)
+
+
+_MULTIPARTUPLOAD = _descriptor.Descriptor(
+  name='MultipartUpload',
+  full_name='files.MultipartUpload',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='file', full_name='files.MultipartUpload.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='files.MultipartUpload.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='files.MultipartUpload.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='files.MultipartUpload.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='files.MultipartUpload.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=138,
+  serialized_end=276,
+)
+
+
+_UPLOAD = _descriptor.Descriptor(
+  name='Upload',
+  full_name='files.Upload',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='file', full_name='files.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_url', full_name='files.Upload.upload_url', 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=278,
+  serialized_end=333,
+)
+
+
+_COMPLETEDPART = _descriptor.Descriptor(
+  name='CompletedPart',
+  full_name='files.CompletedPart',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='number', full_name='files.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='files.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=335,
+  serialized_end=378,
+)
+
+
+_STARTUPLOADREQUEST = _descriptor.Descriptor(
+  name='StartUploadRequest',
+  full_name='files.StartUploadRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='upload', full_name='files.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=380,
+  serialized_end=440,
+)
+
+
+_STARTUPLOADRESPONSE = _descriptor.Descriptor(
+  name='StartUploadResponse',
+  full_name='files.StartUploadResponse',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='upload', full_name='files.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=442,
+  serialized_end=503,
+)
+
+
+_COMPLETEUPLOADREQUEST = _descriptor.Descriptor(
+  name='CompleteUploadRequest',
+  full_name='files.CompleteUploadRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='upload', full_name='files.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=505,
+  serialized_end=568,
+)
+
+
+_COMPLETEUPLOADRESPONSE = _descriptor.Descriptor(
+  name='CompleteUploadResponse',
+  full_name='files.CompleteUploadResponse',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='upload', full_name='files.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=570,
+  serialized_end=634,
+)
+
+
+_ABORTUPLOADREQUEST = _descriptor.Descriptor(
+  name='AbortUploadRequest',
+  full_name='files.AbortUploadRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='upload', full_name='files.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=636,
+  serialized_end=696,
+)
+
+
+_ABORTUPLOADRESPONSE = _descriptor.Descriptor(
+  name='AbortUploadResponse',
+  full_name='files.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=698,
+  serialized_end=719,
+)
+
+
+_MOVEUPLOADREQUEST = _descriptor.Descriptor(
+  name='MoveUploadRequest',
+  full_name='files.MoveUploadRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='upload', full_name='files.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=721,
+  serialized_end=780,
+)
+
+
+_MOVEUPLOADRESPONSE = _descriptor.Descriptor(
+  name='MoveUploadResponse',
+  full_name='files.MoveUploadResponse',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='file', full_name='files.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=782,
+  serialized_end=829,
+)
+
+
+_UPLOADREQUEST = _descriptor.Descriptor(
+  name='UploadRequest',
+  full_name='files.UploadRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='file', full_name='files.UploadRequest.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=831,
+  serialized_end=873,
+)
+
+
+_UPLOADRESPONSE = _descriptor.Descriptor(
+  name='UploadResponse',
+  full_name='files.UploadResponse',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='upload', full_name='files.UploadResponse.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=875,
+  serialized_end=922,
+)
+
+
+_GETFILEREQUEST = _descriptor.Descriptor(
+  name='GetFileRequest',
+  full_name='files.GetFileRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='id', full_name='files.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=924,
+  serialized_end=952,
+)
+
+
+_GETFILERESPONSE = _descriptor.Descriptor(
+  name='GetFileResponse',
+  full_name='files.GetFileResponse',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='file', full_name='files.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=954,
+  serialized_end=998,
+)
+
+
+_DELETEFILEREQUEST = _descriptor.Descriptor(
+  name='DeleteFileRequest',
+  full_name='files.DeleteFileRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='file', full_name='files.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=1000,
+  serialized_end=1046,
+)
+
+
+_DELETEFILERESPONSE = _descriptor.Descriptor(
+  name='DeleteFileResponse',
+  full_name='files.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=1048,
+  serialized_end=1068,
+)
+
+_MULTIPARTUPLOAD.fields_by_name['file'].message_type = _FILE
+_MULTIPARTUPLOAD.fields_by_name['parts'].message_type = _COMPLETEDPART
+_UPLOAD.fields_by_name['file'].message_type = _FILE
+_STARTUPLOADREQUEST.fields_by_name['upload'].message_type = _MULTIPARTUPLOAD
+_STARTUPLOADRESPONSE.fields_by_name['upload'].message_type = _MULTIPARTUPLOAD
+_COMPLETEUPLOADREQUEST.fields_by_name['upload'].message_type = _MULTIPARTUPLOAD
+_COMPLETEUPLOADRESPONSE.fields_by_name['upload'].message_type = _MULTIPARTUPLOAD
+_ABORTUPLOADREQUEST.fields_by_name['upload'].message_type = _MULTIPARTUPLOAD
+_MOVEUPLOADREQUEST.fields_by_name['upload'].message_type = _MULTIPARTUPLOAD
+_MOVEUPLOADRESPONSE.fields_by_name['file'].message_type = _FILE
+_UPLOADREQUEST.fields_by_name['file'].message_type = _FILE
+_UPLOADRESPONSE.fields_by_name['upload'].message_type = _UPLOAD
+_GETFILERESPONSE.fields_by_name['file'].message_type = _FILE
+_DELETEFILEREQUEST.fields_by_name['file'].message_type = _FILE
+DESCRIPTOR.message_types_by_name['File'] = _FILE
+DESCRIPTOR.message_types_by_name['MultipartUpload'] = _MULTIPARTUPLOAD
+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['UploadRequest'] = _UPLOADREQUEST
+DESCRIPTOR.message_types_by_name['UploadResponse'] = _UPLOADRESPONSE
+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)
+
+File = _reflection.GeneratedProtocolMessageType('File', (_message.Message,), {
+  'DESCRIPTOR' : _FILE,
+  '__module__' : 'files.files_pb2'
+  # @@protoc_insertion_point(class_scope:files.File)
+  })
+_sym_db.RegisterMessage(File)
+
+MultipartUpload = _reflection.GeneratedProtocolMessageType('MultipartUpload', (_message.Message,), {
+  'DESCRIPTOR' : _MULTIPARTUPLOAD,
+  '__module__' : 'files.files_pb2'
+  # @@protoc_insertion_point(class_scope:files.MultipartUpload)
+  })
+_sym_db.RegisterMessage(MultipartUpload)
+
+Upload = _reflection.GeneratedProtocolMessageType('Upload', (_message.Message,), {
+  'DESCRIPTOR' : _UPLOAD,
+  '__module__' : 'files.files_pb2'
+  # @@protoc_insertion_point(class_scope:files.Upload)
+  })
+_sym_db.RegisterMessage(Upload)
+
+CompletedPart = _reflection.GeneratedProtocolMessageType('CompletedPart', (_message.Message,), {
+  'DESCRIPTOR' : _COMPLETEDPART,
+  '__module__' : 'files.files_pb2'
+  # @@protoc_insertion_point(class_scope:files.CompletedPart)
+  })
+_sym_db.RegisterMessage(CompletedPart)
+
+StartUploadRequest = _reflection.GeneratedProtocolMessageType('StartUploadRequest', (_message.Message,), {
+  'DESCRIPTOR' : _STARTUPLOADREQUEST,
+  '__module__' : 'files.files_pb2'
+  # @@protoc_insertion_point(class_scope:files.StartUploadRequest)
+  })
+_sym_db.RegisterMessage(StartUploadRequest)
+
+StartUploadResponse = _reflection.GeneratedProtocolMessageType('StartUploadResponse', (_message.Message,), {
+  'DESCRIPTOR' : _STARTUPLOADRESPONSE,
+  '__module__' : 'files.files_pb2'
+  # @@protoc_insertion_point(class_scope:files.StartUploadResponse)
+  })
+_sym_db.RegisterMessage(StartUploadResponse)
+
+CompleteUploadRequest = _reflection.GeneratedProtocolMessageType('CompleteUploadRequest', (_message.Message,), {
+  'DESCRIPTOR' : _COMPLETEUPLOADREQUEST,
+  '__module__' : 'files.files_pb2'
+  # @@protoc_insertion_point(class_scope:files.CompleteUploadRequest)
+  })
+_sym_db.RegisterMessage(CompleteUploadRequest)
+
+CompleteUploadResponse = _reflection.GeneratedProtocolMessageType('CompleteUploadResponse', (_message.Message,), {
+  'DESCRIPTOR' : _COMPLETEUPLOADRESPONSE,
+  '__module__' : 'files.files_pb2'
+  # @@protoc_insertion_point(class_scope:files.CompleteUploadResponse)
+  })
+_sym_db.RegisterMessage(CompleteUploadResponse)
+
+AbortUploadRequest = _reflection.GeneratedProtocolMessageType('AbortUploadRequest', (_message.Message,), {
+  'DESCRIPTOR' : _ABORTUPLOADREQUEST,
+  '__module__' : 'files.files_pb2'
+  # @@protoc_insertion_point(class_scope:files.AbortUploadRequest)
+  })
+_sym_db.RegisterMessage(AbortUploadRequest)
+
+AbortUploadResponse = _reflection.GeneratedProtocolMessageType('AbortUploadResponse', (_message.Message,), {
+  'DESCRIPTOR' : _ABORTUPLOADRESPONSE,
+  '__module__' : 'files.files_pb2'
+  # @@protoc_insertion_point(class_scope:files.AbortUploadResponse)
+  })
+_sym_db.RegisterMessage(AbortUploadResponse)
+
+MoveUploadRequest = _reflection.GeneratedProtocolMessageType('MoveUploadRequest', (_message.Message,), {
+  'DESCRIPTOR' : _MOVEUPLOADREQUEST,
+  '__module__' : 'files.files_pb2'
+  # @@protoc_insertion_point(class_scope:files.MoveUploadRequest)
+  })
+_sym_db.RegisterMessage(MoveUploadRequest)
+
+MoveUploadResponse = _reflection.GeneratedProtocolMessageType('MoveUploadResponse', (_message.Message,), {
+  'DESCRIPTOR' : _MOVEUPLOADRESPONSE,
+  '__module__' : 'files.files_pb2'
+  # @@protoc_insertion_point(class_scope:files.MoveUploadResponse)
+  })
+_sym_db.RegisterMessage(MoveUploadResponse)
+
+UploadRequest = _reflection.GeneratedProtocolMessageType('UploadRequest', (_message.Message,), {
+  'DESCRIPTOR' : _UPLOADREQUEST,
+  '__module__' : 'files.files_pb2'
+  # @@protoc_insertion_point(class_scope:files.UploadRequest)
+  })
+_sym_db.RegisterMessage(UploadRequest)
+
+UploadResponse = _reflection.GeneratedProtocolMessageType('UploadResponse', (_message.Message,), {
+  'DESCRIPTOR' : _UPLOADRESPONSE,
+  '__module__' : 'files.files_pb2'
+  # @@protoc_insertion_point(class_scope:files.UploadResponse)
+  })
+_sym_db.RegisterMessage(UploadResponse)
+
+GetFileRequest = _reflection.GeneratedProtocolMessageType('GetFileRequest', (_message.Message,), {
+  'DESCRIPTOR' : _GETFILEREQUEST,
+  '__module__' : 'files.files_pb2'
+  # @@protoc_insertion_point(class_scope:files.GetFileRequest)
+  })
+_sym_db.RegisterMessage(GetFileRequest)
+
+GetFileResponse = _reflection.GeneratedProtocolMessageType('GetFileResponse', (_message.Message,), {
+  'DESCRIPTOR' : _GETFILERESPONSE,
+  '__module__' : 'files.files_pb2'
+  # @@protoc_insertion_point(class_scope:files.GetFileResponse)
+  })
+_sym_db.RegisterMessage(GetFileResponse)
+
+DeleteFileRequest = _reflection.GeneratedProtocolMessageType('DeleteFileRequest', (_message.Message,), {
+  'DESCRIPTOR' : _DELETEFILEREQUEST,
+  '__module__' : 'files.files_pb2'
+  # @@protoc_insertion_point(class_scope:files.DeleteFileRequest)
+  })
+_sym_db.RegisterMessage(DeleteFileRequest)
+
+DeleteFileResponse = _reflection.GeneratedProtocolMessageType('DeleteFileResponse', (_message.Message,), {
+  'DESCRIPTOR' : _DELETEFILERESPONSE,
+  '__module__' : 'files.files_pb2'
+  # @@protoc_insertion_point(class_scope:files.DeleteFileResponse)
+  })
+_sym_db.RegisterMessage(DeleteFileResponse)
+
+
+DESCRIPTOR._options = None
+
+_FILES = _descriptor.ServiceDescriptor(
+  name='Files',
+  full_name='files.Files',
+  file=DESCRIPTOR,
+  index=0,
+  serialized_options=None,
+  create_key=_descriptor._internal_create_key,
+  serialized_start=1071,
+  serialized_end=1551,
+  methods=[
+  _descriptor.MethodDescriptor(
+    name='StartUpload',
+    full_name='files.Files.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='files.Files.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='files.Files.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='files.Files.MoveUpload',
+    index=3,
+    containing_service=None,
+    input_type=_MOVEUPLOADREQUEST,
+    output_type=_MOVEUPLOADRESPONSE,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='Upload',
+    full_name='files.Files.Upload',
+    index=4,
+    containing_service=None,
+    input_type=_UPLOADREQUEST,
+    output_type=_UPLOADRESPONSE,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='GetFile',
+    full_name='files.Files.GetFile',
+    index=5,
+    containing_service=None,
+    input_type=_GETFILEREQUEST,
+    output_type=_GETFILERESPONSE,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='DeleteFile',
+    full_name='files.Files.DeleteFile',
+    index=6,
+    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(_FILES)
+
+DESCRIPTOR.services_by_name['Files'] = _FILES
+
+# @@protoc_insertion_point(module_scope)
diff --git a/perxis/files/files_pb2_grpc.py b/perxis/files/files_pb2_grpc.py
new file mode 100644
index 0000000..846ccc3
--- /dev/null
+++ b/perxis/files/files_pb2_grpc.py
@@ -0,0 +1,285 @@
+# Generated by the gRPC Python protocol compiler plugin. DO NOT EDIT!
+"""Client and server classes corresponding to protobuf-defined services."""
+import grpc
+
+from perxis.files import files_pb2 as files_dot_files__pb2
+from google.protobuf import empty_pb2 as google_dot_protobuf_dot_empty__pb2
+
+
+class FilesStub(object):
+    """Missing associated documentation comment in .proto file."""
+
+    def __init__(self, channel):
+        """Constructor.
+
+        Args:
+            channel: A grpc.Channel.
+        """
+        self.StartUpload = channel.unary_unary(
+                '/files.Files/StartUpload',
+                request_serializer=files_dot_files__pb2.StartUploadRequest.SerializeToString,
+                response_deserializer=files_dot_files__pb2.StartUploadResponse.FromString,
+                )
+        self.CompleteUpload = channel.unary_unary(
+                '/files.Files/CompleteUpload',
+                request_serializer=files_dot_files__pb2.CompleteUploadRequest.SerializeToString,
+                response_deserializer=files_dot_files__pb2.CompleteUploadResponse.FromString,
+                )
+        self.AbortUpload = channel.unary_unary(
+                '/files.Files/AbortUpload',
+                request_serializer=files_dot_files__pb2.AbortUploadRequest.SerializeToString,
+                response_deserializer=google_dot_protobuf_dot_empty__pb2.Empty.FromString,
+                )
+        self.MoveUpload = channel.unary_unary(
+                '/files.Files/MoveUpload',
+                request_serializer=files_dot_files__pb2.MoveUploadRequest.SerializeToString,
+                response_deserializer=files_dot_files__pb2.MoveUploadResponse.FromString,
+                )
+        self.Upload = channel.unary_unary(
+                '/files.Files/Upload',
+                request_serializer=files_dot_files__pb2.UploadRequest.SerializeToString,
+                response_deserializer=files_dot_files__pb2.UploadResponse.FromString,
+                )
+        self.GetFile = channel.unary_unary(
+                '/files.Files/GetFile',
+                request_serializer=files_dot_files__pb2.GetFileRequest.SerializeToString,
+                response_deserializer=files_dot_files__pb2.GetFileResponse.FromString,
+                )
+        self.DeleteFile = channel.unary_unary(
+                '/files.Files/DeleteFile',
+                request_serializer=files_dot_files__pb2.DeleteFileRequest.SerializeToString,
+                response_deserializer=google_dot_protobuf_dot_empty__pb2.Empty.FromString,
+                )
+
+
+class FilesServicer(object):
+    """Missing associated documentation comment in .proto file."""
+
+    def StartUpload(self, request, context):
+        """StartUpload - инициирует процедуру загрузки файла в файловое хранилище.
+        Используется клиентским приложением для начала загрузки файла
+        Требуемые параметры: объект `MultipartUpload` с вложенным объектом `File`, в котором
+        обязательные поля  Name и Size.
+        Возвращает объект с заполненными полями ID, PartSize, PartURLs, MimeType, Size, UploadID.
+        """
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def CompleteUpload(self, request, context):
+        """CompleteUpload - завершает процедуру загрузку файла
+        Предполагается, что в объекте, полученном из `StartUpload`, клиент должен заполнить поле
+        Parts (идентификаторами загруженных блоков (S3 ETAGs)) и передать его в `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 Upload(self, request, context):
+        """Upload - инициация загрузки файла в хранилище. Возвращает объект, содержащий подписанный URL.
+        Завершение загрузки файла осуществляется выполнением POST-запроса
+        """
+        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_FilesServicer_to_server(servicer, server):
+    rpc_method_handlers = {
+            'StartUpload': grpc.unary_unary_rpc_method_handler(
+                    servicer.StartUpload,
+                    request_deserializer=files_dot_files__pb2.StartUploadRequest.FromString,
+                    response_serializer=files_dot_files__pb2.StartUploadResponse.SerializeToString,
+            ),
+            'CompleteUpload': grpc.unary_unary_rpc_method_handler(
+                    servicer.CompleteUpload,
+                    request_deserializer=files_dot_files__pb2.CompleteUploadRequest.FromString,
+                    response_serializer=files_dot_files__pb2.CompleteUploadResponse.SerializeToString,
+            ),
+            'AbortUpload': grpc.unary_unary_rpc_method_handler(
+                    servicer.AbortUpload,
+                    request_deserializer=files_dot_files__pb2.AbortUploadRequest.FromString,
+                    response_serializer=google_dot_protobuf_dot_empty__pb2.Empty.SerializeToString,
+            ),
+            'MoveUpload': grpc.unary_unary_rpc_method_handler(
+                    servicer.MoveUpload,
+                    request_deserializer=files_dot_files__pb2.MoveUploadRequest.FromString,
+                    response_serializer=files_dot_files__pb2.MoveUploadResponse.SerializeToString,
+            ),
+            'Upload': grpc.unary_unary_rpc_method_handler(
+                    servicer.Upload,
+                    request_deserializer=files_dot_files__pb2.UploadRequest.FromString,
+                    response_serializer=files_dot_files__pb2.UploadResponse.SerializeToString,
+            ),
+            'GetFile': grpc.unary_unary_rpc_method_handler(
+                    servicer.GetFile,
+                    request_deserializer=files_dot_files__pb2.GetFileRequest.FromString,
+                    response_serializer=files_dot_files__pb2.GetFileResponse.SerializeToString,
+            ),
+            'DeleteFile': grpc.unary_unary_rpc_method_handler(
+                    servicer.DeleteFile,
+                    request_deserializer=files_dot_files__pb2.DeleteFileRequest.FromString,
+                    response_serializer=google_dot_protobuf_dot_empty__pb2.Empty.SerializeToString,
+            ),
+    }
+    generic_handler = grpc.method_handlers_generic_handler(
+            'files.Files', rpc_method_handlers)
+    server.add_generic_rpc_handlers((generic_handler,))
+
+
+ # This class is part of an EXPERIMENTAL API.
+class Files(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, '/files.Files/StartUpload',
+            files_dot_files__pb2.StartUploadRequest.SerializeToString,
+            files_dot_files__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, '/files.Files/CompleteUpload',
+            files_dot_files__pb2.CompleteUploadRequest.SerializeToString,
+            files_dot_files__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, '/files.Files/AbortUpload',
+            files_dot_files__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, '/files.Files/MoveUpload',
+            files_dot_files__pb2.MoveUploadRequest.SerializeToString,
+            files_dot_files__pb2.MoveUploadResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def Upload(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, '/files.Files/Upload',
+            files_dot_files__pb2.UploadRequest.SerializeToString,
+            files_dot_files__pb2.UploadResponse.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, '/files.Files/GetFile',
+            files_dot_files__pb2.GetFileRequest.SerializeToString,
+            files_dot_files__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, '/files.Files/DeleteFile',
+            files_dot_files__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/images/images_pb2.py b/perxis/images/images_pb2.py
new file mode 100644
index 0000000..e9675c1
--- /dev/null
+++ b/perxis/images/images_pb2.py
@@ -0,0 +1,237 @@
+# -*- coding: utf-8 -*-
+# Generated by the protocol buffer compiler.  DO NOT EDIT!
+# source: images/images.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 perxis.files import files_pb2 as files_dot_files__pb2
+
+
+DESCRIPTOR = _descriptor.FileDescriptor(
+  name='images/images.proto',
+  package='images',
+  syntax='proto3',
+  serialized_options=b'Z0git.perx.ru/perxis/perxis-go/proto/images;images',
+  create_key=_descriptor._internal_create_key,
+  serialized_pb=b'\n\x13images/images.proto\x12\x06images\x1a\x11\x66iles/files.proto\"\"\n\x05Param\x12\n\n\x02op\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x03(\t\"\x83\x01\n\nGetRequest\x12\x1b\n\x06source\x18\x01 \x01(\x0b\x32\x0b.files.File\x12+\n\x04opts\x18\x02 \x01(\x0b\x32\x1d.images.GetRequest.GetOptions\x1a+\n\nGetOptions\x12\x1d\n\x06params\x18\x01 \x03(\x0b\x32\r.images.Param\"*\n\x0bGetResponse\x12\x1b\n\x06result\x18\x01 \x01(\x0b\x32\x0b.files.File2:\n\x06Images\x12\x30\n\x03Get\x12\x12.images.GetRequest\x1a\x13.images.GetResponse\"\x00\x42\x32Z0git.perx.ru/perxis/perxis-go/proto/images;imagesb\x06proto3'
+  ,
+  dependencies=[files_dot_files__pb2.DESCRIPTOR,])
+
+
+
+
+_PARAM = _descriptor.Descriptor(
+  name='Param',
+  full_name='images.Param',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='op', full_name='images.Param.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='value', full_name='images.Param.value', 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),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=50,
+  serialized_end=84,
+)
+
+
+_GETREQUEST_GETOPTIONS = _descriptor.Descriptor(
+  name='GetOptions',
+  full_name='images.GetRequest.GetOptions',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='params', full_name='images.GetRequest.GetOptions.params', 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=175,
+  serialized_end=218,
+)
+
+_GETREQUEST = _descriptor.Descriptor(
+  name='GetRequest',
+  full_name='images.GetRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='source', full_name='images.GetRequest.source', 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='images.GetRequest.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=[_GETREQUEST_GETOPTIONS, ],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=87,
+  serialized_end=218,
+)
+
+
+_GETRESPONSE = _descriptor.Descriptor(
+  name='GetResponse',
+  full_name='images.GetResponse',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='result', full_name='images.GetResponse.result', 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=220,
+  serialized_end=262,
+)
+
+_GETREQUEST_GETOPTIONS.fields_by_name['params'].message_type = _PARAM
+_GETREQUEST_GETOPTIONS.containing_type = _GETREQUEST
+_GETREQUEST.fields_by_name['source'].message_type = files_dot_files__pb2._FILE
+_GETREQUEST.fields_by_name['opts'].message_type = _GETREQUEST_GETOPTIONS
+_GETRESPONSE.fields_by_name['result'].message_type = files_dot_files__pb2._FILE
+DESCRIPTOR.message_types_by_name['Param'] = _PARAM
+DESCRIPTOR.message_types_by_name['GetRequest'] = _GETREQUEST
+DESCRIPTOR.message_types_by_name['GetResponse'] = _GETRESPONSE
+_sym_db.RegisterFileDescriptor(DESCRIPTOR)
+
+Param = _reflection.GeneratedProtocolMessageType('Param', (_message.Message,), {
+  'DESCRIPTOR' : _PARAM,
+  '__module__' : 'images.images_pb2'
+  # @@protoc_insertion_point(class_scope:images.Param)
+  })
+_sym_db.RegisterMessage(Param)
+
+GetRequest = _reflection.GeneratedProtocolMessageType('GetRequest', (_message.Message,), {
+
+  'GetOptions' : _reflection.GeneratedProtocolMessageType('GetOptions', (_message.Message,), {
+    'DESCRIPTOR' : _GETREQUEST_GETOPTIONS,
+    '__module__' : 'images.images_pb2'
+    # @@protoc_insertion_point(class_scope:images.GetRequest.GetOptions)
+    })
+  ,
+  'DESCRIPTOR' : _GETREQUEST,
+  '__module__' : 'images.images_pb2'
+  # @@protoc_insertion_point(class_scope:images.GetRequest)
+  })
+_sym_db.RegisterMessage(GetRequest)
+_sym_db.RegisterMessage(GetRequest.GetOptions)
+
+GetResponse = _reflection.GeneratedProtocolMessageType('GetResponse', (_message.Message,), {
+  'DESCRIPTOR' : _GETRESPONSE,
+  '__module__' : 'images.images_pb2'
+  # @@protoc_insertion_point(class_scope:images.GetResponse)
+  })
+_sym_db.RegisterMessage(GetResponse)
+
+
+DESCRIPTOR._options = None
+
+_IMAGES = _descriptor.ServiceDescriptor(
+  name='Images',
+  full_name='images.Images',
+  file=DESCRIPTOR,
+  index=0,
+  serialized_options=None,
+  create_key=_descriptor._internal_create_key,
+  serialized_start=264,
+  serialized_end=322,
+  methods=[
+  _descriptor.MethodDescriptor(
+    name='Get',
+    full_name='images.Images.Get',
+    index=0,
+    containing_service=None,
+    input_type=_GETREQUEST,
+    output_type=_GETRESPONSE,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+])
+_sym_db.RegisterServiceDescriptor(_IMAGES)
+
+DESCRIPTOR.services_by_name['Images'] = _IMAGES
+
+# @@protoc_insertion_point(module_scope)
diff --git a/perxis/images/images_pb2_grpc.py b/perxis/images/images_pb2_grpc.py
new file mode 100644
index 0000000..180da4a
--- /dev/null
+++ b/perxis/images/images_pb2_grpc.py
@@ -0,0 +1,77 @@
+# Generated by the gRPC Python protocol compiler plugin. DO NOT EDIT!
+"""Client and server classes corresponding to protobuf-defined services."""
+import grpc
+
+from perxis.images import images_pb2 as images_dot_images__pb2
+
+
+class ImagesStub(object):
+    """ImageService - сервис для обработки изображений
+    """
+
+    def __init__(self, channel):
+        """Constructor.
+
+        Args:
+            channel: A grpc.Channel.
+        """
+        self.Get = channel.unary_unary(
+                '/images.Images/Get',
+                request_serializer=images_dot_images__pb2.GetRequest.SerializeToString,
+                response_deserializer=images_dot_images__pb2.GetResponse.FromString,
+                )
+
+
+class ImagesServicer(object):
+    """ImageService - сервис для обработки изображений
+    """
+
+    def Get(self, request, context):
+        """Get - к файлу, идентификатор которого передан в запросе, применяются параметры.
+        Может быть передано несколько параметров, порядок учитывается при обработке
+        Допустимые операции:
+        - crop (ширина, высота)
+        - fit (ширина, высота)
+        - resize (ширина, высота)
+        - format (один из форматов [ png, jpeg, jpg, gif ]
+        Возвращает объект File с заполненным полем File.URL
+        """
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+
+def add_ImagesServicer_to_server(servicer, server):
+    rpc_method_handlers = {
+            'Get': grpc.unary_unary_rpc_method_handler(
+                    servicer.Get,
+                    request_deserializer=images_dot_images__pb2.GetRequest.FromString,
+                    response_serializer=images_dot_images__pb2.GetResponse.SerializeToString,
+            ),
+    }
+    generic_handler = grpc.method_handlers_generic_handler(
+            'images.Images', rpc_method_handlers)
+    server.add_generic_rpc_handlers((generic_handler,))
+
+
+ # This class is part of an EXPERIMENTAL API.
+class Images(object):
+    """ImageService - сервис для обработки изображений
+    """
+
+    @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, '/images.Images/Get',
+            images_dot_images__pb2.GetRequest.SerializeToString,
+            images_dot_images__pb2.GetResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
diff --git a/perxis/invitations/invitations_pb2.py b/perxis/invitations/invitations_pb2.py
new file mode 100644
index 0000000..c62cf0e
--- /dev/null
+++ b/perxis/invitations/invitations_pb2.py
@@ -0,0 +1,839 @@
+# -*- 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'Z:git.perx.ru/perxis/perxis-go/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\"\xca\x01\n\nInvitation\x12\n\n\x02id\x18\x01 \x01(\t\x12\r\n\x05\x65mail\x18\x02 \x01(\t\x12\x0e\n\x06org_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\"e\n\x06\x46ilter\x12\n\n\x02id\x18\x01 \x03(\t\x12\r\n\x05\x65mail\x18\x02 \x03(\t\x12\x0e\n\x06org_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\"D\n\rCreateRequest\x12\x33\n\ninvitation\x18\x01 \x01(\x0b\x32\x1f.content.invitations.Invitation\"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<Z:git.perx.ru/perxis/perxis-go/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='org_id', full_name='content.invitations.Invitation.org_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=351,
+)
+
+
+_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='org_id', full_name='content.invitations.Filter.org_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=353,
+  serialized_end=454,
+)
+
+
+_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=456,
+  serialized_end=520,
+)
+
+
+_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='invitation', full_name='content.invitations.CreateRequest.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=522,
+  serialized_end=590,
+)
+
+
+_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=592,
+  serialized_end=661,
+)
+
+
+_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=663,
+  serialized_end=698,
+)
+
+
+_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=700,
+  serialized_end=766,
+)
+
+
+_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=769,
+  serialized_end=988,
+)
+
+
+_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=990,
+  serialized_end=1016,
+)
+
+
+_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=1018,
+  serialized_end=1073,
+)
+
+
+_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=1075,
+  serialized_end=1101,
+)
+
+
+_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=1103,
+  serialized_end=1209,
+)
+
+
+_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=1211,
+  serialized_end=1294,
+)
+
+
+_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=1296,
+  serialized_end=1334,
+)
+
+
+_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=1336,
+  serialized_end=1367,
+)
+
+_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['invitation'].message_type = _INVITATION
+_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=1370,
+  serialized_end=1767,
+  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..4b85a08
--- /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 perxis.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/items/items_pb2.py b/perxis/items/items_pb2.py
new file mode 100644
index 0000000..c04ab85
--- /dev/null
+++ b/perxis/items/items_pb2.py
@@ -0,0 +1,3288 @@
+# -*- coding: utf-8 -*-
+# Generated by the protocol buffer compiler.  DO NOT EDIT!
+# source: items/items.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 perxis.common import common_pb2 as common_dot_common__pb2
+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
+
+
+DESCRIPTOR = _descriptor.FileDescriptor(
+  name='items/items.proto',
+  package='content.items',
+  syntax='proto3',
+  serialized_options=b'Z.git.perx.ru/perxis/perxis-go/proto/items;items',
+  create_key=_descriptor._internal_create_key,
+  serialized_pb=b'\n\x11items/items.proto\x12\rcontent.items\x1a\x1bgoogle/protobuf/empty.proto\x1a\x13\x63ommon/common.proto\x1a\x1fgoogle/protobuf/timestamp.proto\x1a\x1cgoogle/protobuf/struct.proto\"\'\n\x05\x45rror\x12\x0f\n\x07message\x18\x01 \x01(\t\x12\r\n\x05\x66ield\x18\x02 \x01(\t\"3\n\x0b\x44\x65\x63odeError\x12$\n\x06\x65rrors\x18\x02 \x03(\x0b\x32\x14.content.items.Error\"7\n\x0fValidationError\x12$\n\x06\x65rrors\x18\x02 \x03(\x0b\x32\x14.content.items.Error\"9\n\x11ModificationError\x12$\n\x06\x65rrors\x18\x02 \x03(\x0b\x32\x14.content.items.Error\"g\n\x0bPermissions\x12\x0c\n\x04\x65\x64it\x18\x01 \x01(\x08\x12\x0f\n\x07\x61rchive\x18\x02 \x01(\x08\x12\x0f\n\x07publish\x18\x03 \x01(\x08\x12\x13\n\x0bsoft_delete\x18\x04 \x01(\x08\x12\x13\n\x0bhard_delete\x18\x05 \x01(\x08\"\xaa\x05\n\x04Item\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\x15\n\rcollection_id\x18\x04 \x01(\t\x12(\n\x05state\x18\x05 \x01(\x0e\x32\x19.content.items.Item.State\x12\x32\n\x0e\x63reated_rev_at\x18\x06 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x12\n\ncreated_by\x18\x07 \x01(\t\x12.\n\ncreated_at\x18\x08 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x12\n\nupdated_by\x18\t \x01(\t\x12.\n\nupdated_at\x18\n \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12%\n\x04\x64\x61ta\x18\x0b \x01(\x0b\x32\x17.google.protobuf.Struct\x12;\n\x0ctranslations\x18\x0c \x03(\x0b\x32%.content.items.Item.TranslationsEntry\x12\x13\n\x0brevision_id\x18\r \x01(\t\x12\x0e\n\x06locale\x18\x12 \x01(\t\x12\x0f\n\x07\x64\x65leted\x18\x13 \x01(\x08\x12\x0e\n\x06hidden\x18\x14 \x01(\x08\x12\x10\n\x08template\x18\x15 \x01(\x08\x12/\n\x0bpermissions\x18\x16 \x01(\x0b\x32\x1a.content.items.Permissions\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\"<\n\x05State\x12\t\n\x05\x44RAFT\x10\x00\x12\r\n\tPUBLISHED\x10\x01\x12\x0b\n\x07\x43HANGED\x10\x02\x12\x0c\n\x08\x41RCHIVED\x10\x03\"W\n\x0b\x45ventCreate\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\x0f\n\x07item_id\x18\x04 \x01(\t\"W\n\x0b\x45ventUpdate\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\x0f\n\x07item_id\x18\x04 \x01(\t\"X\n\x0c\x45ventPublish\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\x0f\n\x07item_id\x18\x04 \x01(\t\"Z\n\x0e\x45ventUnpublish\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\x0f\n\x07item_id\x18\x04 \x01(\t\"W\n\x0b\x45ventDelete\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\x0f\n\x07item_id\x18\x04 \x01(\t\"=\n\x06\x46ilter\x12\n\n\x02id\x18\x01 \x03(\t\x12\x1c\n\x04\x64\x61ta\x18\x02 \x03(\x0b\x32\x0e.common.Filter\x12\t\n\x01q\x18\x03 \x03(\t\"%\n\rCreateOptions\x12\x14\n\x0cupdate_attrs\x18\x01 \x01(\x08\"x\n\x0b\x46indOptions\x12$\n\x07options\x18\x02 \x01(\x0b\x32\x13.common.FindOptions\x12\x0f\n\x07\x64\x65leted\x18\x03 \x01(\x08\x12\x0f\n\x07regular\x18\x04 \x01(\x08\x12\x0e\n\x06hidden\x18\x05 \x01(\x08\x12\x11\n\ttemplates\x18\x06 \x01(\x08\"%\n\rUpdateOptions\x12\x14\n\x0cupdate_attrs\x18\x01 \x01(\x08\"(\n\x13GetPublishedOptions\x12\x11\n\tlocale_id\x18\x01 \x01(\t\"4\n\rDeleteOptions\x12\x14\n\x0cupdate_attrs\x18\x01 \x01(\x08\x12\r\n\x05\x65rase\x18\x02 \x01(\x08\"\'\n\x0fUndeleteOptions\x12\x14\n\x0cupdate_attrs\x18\x01 \x01(\x08\"&\n\x0ePublishOptions\x12\x14\n\x0cupdate_attrs\x18\x01 \x01(\x08\"(\n\x10UnpublishOptions\x12\x14\n\x0cupdate_attrs\x18\x01 \x01(\x08\"\x83\x01\n\x14\x46indPublishedOptions\x12$\n\x07options\x18\x02 \x01(\x0b\x32\x13.common.FindOptions\x12\x11\n\tlocale_id\x18\x03 \x01(\t\x12\x0f\n\x07regular\x18\x04 \x01(\x08\x12\x0e\n\x06hidden\x18\x05 \x01(\x08\x12\x11\n\ttemplates\x18\x06 \x01(\x08\";\n\x13\x46indArchivedOptions\x12$\n\x07options\x18\x02 \x01(\x0b\x32\x13.common.FindOptions\"<\n\x14ListRevisionsOptions\x12$\n\x07options\x18\x02 \x01(\x0b\x32\x13.common.FindOptions\"~\n\x10\x41ggregateOptions\x12;\n\x06\x66ields\x18\x01 \x03(\x0b\x32+.content.items.AggregateOptions.FieldsEntry\x1a-\n\x0b\x46ieldsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\"\x90\x01\n\x19\x41ggregatePublishedOptions\x12\x44\n\x06\x66ields\x18\x01 \x03(\x0b\x32\x34.content.items.AggregatePublishedOptions.FieldsEntry\x1a-\n\x0b\x46ieldsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\"a\n\rCreateRequest\x12!\n\x04item\x18\x01 \x01(\x0b\x32\x13.content.items.Item\x12-\n\x07options\x18\x02 \x01(\x0b\x32\x1c.content.items.CreateOptions\"6\n\x0e\x43reateResponse\x12$\n\x07\x63reated\x18\x01 \x01(\x0b\x32\x13.content.items.Item\"6\n\x11IntrospectRequest\x12!\n\x04item\x18\x01 \x01(\x0b\x32\x13.content.items.Item\"\x8b\x01\n\x12IntrospectResponse\x12!\n\x04item\x18\x01 \x01(\x0b\x32\x13.content.items.Item\x12\x0e\n\x06schema\x18\x02 \x01(\t\x12\x42\n\x11validation_errors\x18\x03 \x03(\x0b\x32\'.common.Error.BadRequest.FieldViolation\"V\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\x12\x0f\n\x07item_id\x18\x04 \x01(\t\"0\n\x0bGetResponse\x12!\n\x04item\x18\x01 \x01(\x0b\x32\x13.content.items.Item\"\x9a\x01\n\x0b\x46indRequest\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%\n\x06\x66ilter\x18\x04 \x01(\x0b\x32\x15.content.items.Filter\x12+\n\x07options\x18\x05 \x01(\x0b\x32\x1a.content.items.FindOptions\"A\n\x0c\x46indResponse\x12\"\n\x05items\x18\x01 \x03(\x0b\x32\x13.content.items.Item\x12\r\n\x05total\x18\x02 \x01(\x05\"a\n\rUpdateRequest\x12!\n\x04item\x18\x01 \x01(\x0b\x32\x13.content.items.Item\x12-\n\x07options\x18\x02 \x01(\x0b\x32\x1c.content.items.UpdateOptions\"a\n\rDeleteRequest\x12!\n\x04item\x18\x01 \x01(\x0b\x32\x13.content.items.Item\x12-\n\x07options\x18\x02 \x01(\x0b\x32\x1c.content.items.DeleteOptions\"e\n\x0fUndeleteRequest\x12!\n\x04item\x18\x01 \x01(\x0b\x32\x13.content.items.Item\x12/\n\x07options\x18\x02 \x01(\x0b\x32\x1e.content.items.UndeleteOptions\"c\n\x0ePublishRequest\x12!\n\x04item\x18\x01 \x01(\x0b\x32\x13.content.items.Item\x12.\n\x07options\x18\x02 \x01(\x0b\x32\x1d.content.items.PublishOptions\"g\n\x10UnpublishRequest\x12!\n\x04item\x18\x01 \x01(\x0b\x32\x13.content.items.Item\x12\x30\n\x07options\x18\x02 \x01(\x0b\x32\x1f.content.items.UnpublishOptions\"\x94\x01\n\x13GetPublishedRequest\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\x0f\n\x07item_id\x18\x05 \x01(\t\x12\x33\n\x07options\x18\n \x01(\x0b\x32\".content.items.GetPublishedOptions\"9\n\x14GetPublishedResponse\x12!\n\x04item\x18\x01 \x01(\x0b\x32\x13.content.items.Item\"\xac\x01\n\x14\x46indPublishedRequest\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%\n\x06\x66ilter\x18\x04 \x01(\x0b\x32\x15.content.items.Filter\x12\x34\n\x07options\x18\n \x01(\x0b\x32#.content.items.FindPublishedOptions\"J\n\x15\x46indPublishedResponse\x12\"\n\x05items\x18\x01 \x03(\x0b\x32\x13.content.items.Item\x12\r\n\x05total\x18\x02 \x01(\x05\"\xa4\x01\n\x10\x41ggregateRequest\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%\n\x06\x66ilter\x18\x04 \x01(\x0b\x32\x15.content.items.Filter\x12\x30\n\x07options\x18\n \x01(\x0b\x32\x1f.content.items.AggregateOptions\"<\n\x11\x41ggregateResponse\x12\'\n\x06result\x18\x01 \x01(\x0b\x32\x17.google.protobuf.Struct\"\xb6\x01\n\x19\x41ggregatePublishedRequest\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%\n\x06\x66ilter\x18\x04 \x01(\x0b\x32\x15.content.items.Filter\x12\x39\n\x07options\x18\n \x01(\x0b\x32(.content.items.AggregatePublishedOptions\"E\n\x1a\x41ggregatePublishedResponse\x12\'\n\x06result\x18\x01 \x01(\x0b\x32\x17.google.protobuf.Struct\"s\n\x12GetRevisionRequest\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\x0f\n\x07item_id\x18\x04 \x01(\t\x12\x13\n\x0brevision_id\x18\x05 \x01(\t\"8\n\x13GetRevisionResponse\x12!\n\x04item\x18\x01 \x01(\x0b\x32\x13.content.items.Item\"\x96\x01\n\x14ListRevisionsRequest\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\x0f\n\x07item_id\x18\x04 \x01(\t\x12\x34\n\x07options\x18\n \x01(\x0b\x32#.content.items.ListRevisionsOptions\";\n\x15ListRevisionsResponse\x12\"\n\x05items\x18\x01 \x03(\x0b\x32\x13.content.items.Item\"3\n\x0e\x41rchiveRequest\x12!\n\x04item\x18\x01 \x01(\x0b\x32\x13.content.items.Item\"5\n\x10UnarchiveRequest\x12!\n\x04item\x18\x01 \x01(\x0b\x32\x13.content.items.Item\"\xaa\x01\n\x13\x46indArchivedRequest\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%\n\x06\x66ilter\x18\x04 \x01(\x0b\x32\x15.content.items.Filter\x12\x33\n\x07options\x18\x06 \x01(\x0b\x32\".content.items.FindArchivedOptions\"I\n\x14\x46indArchivedResponse\x12\"\n\x05items\x18\x01 \x03(\x0b\x32\x13.content.items.Item\x12\r\n\x05total\x18\x02 \x01(\x05\x32\x93\x0b\n\x05Items\x12G\n\x06\x43reate\x12\x1c.content.items.CreateRequest\x1a\x1d.content.items.CreateResponse\"\x00\x12S\n\nIntrospect\x12 .content.items.IntrospectRequest\x1a!.content.items.IntrospectResponse\"\x00\x12>\n\x03Get\x12\x19.content.items.GetRequest\x1a\x1a.content.items.GetResponse\"\x00\x12\x41\n\x04\x46ind\x12\x1a.content.items.FindRequest\x1a\x1b.content.items.FindResponse\"\x00\x12@\n\x06Update\x12\x1c.content.items.UpdateRequest\x1a\x16.google.protobuf.Empty\"\x00\x12@\n\x06\x44\x65lete\x12\x1c.content.items.DeleteRequest\x1a\x16.google.protobuf.Empty\"\x00\x12\x44\n\x08Undelete\x12\x1e.content.items.UndeleteRequest\x1a\x16.google.protobuf.Empty\"\x00\x12\x42\n\x07Publish\x12\x1d.content.items.PublishRequest\x1a\x16.google.protobuf.Empty\"\x00\x12\x46\n\tUnpublish\x12\x1f.content.items.UnpublishRequest\x1a\x16.google.protobuf.Empty\"\x00\x12Y\n\x0cGetPublished\x12\".content.items.GetPublishedRequest\x1a#.content.items.GetPublishedResponse\"\x00\x12\\\n\rFindPublished\x12#.content.items.FindPublishedRequest\x1a$.content.items.FindPublishedResponse\"\x00\x12P\n\tAggregate\x12\x1f.content.items.AggregateRequest\x1a .content.items.AggregateResponse\"\x00\x12k\n\x12\x41ggregatePublished\x12(.content.items.AggregatePublishedRequest\x1a).content.items.AggregatePublishedResponse\"\x00\x12V\n\x0bGetRevision\x12!.content.items.GetRevisionRequest\x1a\".content.items.GetRevisionResponse\"\x00\x12\\\n\rListRevisions\x12#.content.items.ListRevisionsRequest\x1a$.content.items.ListRevisionsResponse\"\x00\x12\x42\n\x07\x41rchive\x12\x1d.content.items.ArchiveRequest\x1a\x16.google.protobuf.Empty\"\x00\x12Y\n\x0c\x46indArchived\x12\".content.items.FindArchivedRequest\x1a#.content.items.FindArchivedResponse\"\x00\x12\x46\n\tUnarchive\x12\x1f.content.items.UnarchiveRequest\x1a\x16.google.protobuf.Empty\"\x00\x42\x30Z.git.perx.ru/perxis/perxis-go/proto/items;itemsb\x06proto3'
+  ,
+  dependencies=[google_dot_protobuf_dot_empty__pb2.DESCRIPTOR,common_dot_common__pb2.DESCRIPTOR,google_dot_protobuf_dot_timestamp__pb2.DESCRIPTOR,google_dot_protobuf_dot_struct__pb2.DESCRIPTOR,])
+
+
+
+_ITEM_STATE = _descriptor.EnumDescriptor(
+  name='State',
+  full_name='content.items.Item.State',
+  filename=None,
+  file=DESCRIPTOR,
+  create_key=_descriptor._internal_create_key,
+  values=[
+    _descriptor.EnumValueDescriptor(
+      name='DRAFT', index=0, number=0,
+      serialized_options=None,
+      type=None,
+      create_key=_descriptor._internal_create_key),
+    _descriptor.EnumValueDescriptor(
+      name='PUBLISHED', index=1, number=1,
+      serialized_options=None,
+      type=None,
+      create_key=_descriptor._internal_create_key),
+    _descriptor.EnumValueDescriptor(
+      name='CHANGED', index=2, number=2,
+      serialized_options=None,
+      type=None,
+      create_key=_descriptor._internal_create_key),
+    _descriptor.EnumValueDescriptor(
+      name='ARCHIVED', index=3, number=3,
+      serialized_options=None,
+      type=None,
+      create_key=_descriptor._internal_create_key),
+  ],
+  containing_type=None,
+  serialized_options=None,
+  serialized_start=1087,
+  serialized_end=1147,
+)
+_sym_db.RegisterEnumDescriptor(_ITEM_STATE)
+
+
+_ERROR = _descriptor.Descriptor(
+  name='Error',
+  full_name='content.items.Error',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='message', full_name='content.items.Error.message', 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='content.items.Error.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),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=149,
+  serialized_end=188,
+)
+
+
+_DECODEERROR = _descriptor.Descriptor(
+  name='DecodeError',
+  full_name='content.items.DecodeError',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='errors', full_name='content.items.DecodeError.errors', index=0,
+      number=2, 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=190,
+  serialized_end=241,
+)
+
+
+_VALIDATIONERROR = _descriptor.Descriptor(
+  name='ValidationError',
+  full_name='content.items.ValidationError',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='errors', full_name='content.items.ValidationError.errors', index=0,
+      number=2, 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=243,
+  serialized_end=298,
+)
+
+
+_MODIFICATIONERROR = _descriptor.Descriptor(
+  name='ModificationError',
+  full_name='content.items.ModificationError',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='errors', full_name='content.items.ModificationError.errors', index=0,
+      number=2, 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=300,
+  serialized_end=357,
+)
+
+
+_PERMISSIONS = _descriptor.Descriptor(
+  name='Permissions',
+  full_name='content.items.Permissions',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='edit', full_name='content.items.Permissions.edit', index=0,
+      number=1, 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='archive', full_name='content.items.Permissions.archive', index=1,
+      number=2, 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='publish', full_name='content.items.Permissions.publish', index=2,
+      number=3, 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='soft_delete', full_name='content.items.Permissions.soft_delete', index=3,
+      number=4, 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='hard_delete', full_name='content.items.Permissions.hard_delete', 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),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=359,
+  serialized_end=462,
+)
+
+
+_ITEM_TRANSLATIONSENTRY = _descriptor.Descriptor(
+  name='TranslationsEntry',
+  full_name='content.items.Item.TranslationsEntry',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='key', full_name='content.items.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='content.items.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=1009,
+  serialized_end=1085,
+)
+
+_ITEM = _descriptor.Descriptor(
+  name='Item',
+  full_name='content.items.Item',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='id', full_name='content.items.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='content.items.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='env_id', full_name='content.items.Item.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='collection_id', full_name='content.items.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='state', full_name='content.items.Item.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='created_rev_at', full_name='content.items.Item.created_rev_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='content.items.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='created_at', full_name='content.items.Item.created_at', 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='updated_by', full_name='content.items.Item.updated_by', index=8,
+      number=9, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='updated_at', full_name='content.items.Item.updated_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='data', full_name='content.items.Item.data', 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='translations', full_name='content.items.Item.translations', index=11,
+      number=12, 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='content.items.Item.revision_id', index=12,
+      number=13, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=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='content.items.Item.locale', index=13,
+      number=18, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='deleted', full_name='content.items.Item.deleted', index=14,
+      number=19, 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='hidden', full_name='content.items.Item.hidden', index=15,
+      number=20, 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='template', full_name='content.items.Item.template', index=16,
+      number=21, 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='permissions', full_name='content.items.Item.permissions', index=17,
+      number=22, 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=[_ITEM_TRANSLATIONSENTRY, ],
+  enum_types=[
+    _ITEM_STATE,
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=465,
+  serialized_end=1147,
+)
+
+
+_EVENTCREATE = _descriptor.Descriptor(
+  name='EventCreate',
+  full_name='content.items.EventCreate',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='space_id', full_name='content.items.EventCreate.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.items.EventCreate.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.items.EventCreate.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_id', full_name='content.items.EventCreate.item_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=1149,
+  serialized_end=1236,
+)
+
+
+_EVENTUPDATE = _descriptor.Descriptor(
+  name='EventUpdate',
+  full_name='content.items.EventUpdate',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='space_id', full_name='content.items.EventUpdate.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.items.EventUpdate.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.items.EventUpdate.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_id', full_name='content.items.EventUpdate.item_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=1238,
+  serialized_end=1325,
+)
+
+
+_EVENTPUBLISH = _descriptor.Descriptor(
+  name='EventPublish',
+  full_name='content.items.EventPublish',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='space_id', full_name='content.items.EventPublish.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.items.EventPublish.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.items.EventPublish.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_id', full_name='content.items.EventPublish.item_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=1327,
+  serialized_end=1415,
+)
+
+
+_EVENTUNPUBLISH = _descriptor.Descriptor(
+  name='EventUnpublish',
+  full_name='content.items.EventUnpublish',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='space_id', full_name='content.items.EventUnpublish.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.items.EventUnpublish.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.items.EventUnpublish.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_id', full_name='content.items.EventUnpublish.item_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=1417,
+  serialized_end=1507,
+)
+
+
+_EVENTDELETE = _descriptor.Descriptor(
+  name='EventDelete',
+  full_name='content.items.EventDelete',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='space_id', full_name='content.items.EventDelete.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.items.EventDelete.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.items.EventDelete.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_id', full_name='content.items.EventDelete.item_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=1509,
+  serialized_end=1596,
+)
+
+
+_FILTER = _descriptor.Descriptor(
+  name='Filter',
+  full_name='content.items.Filter',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='id', full_name='content.items.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='data', full_name='content.items.Filter.data', index=1,
+      number=2, 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='q', full_name='content.items.Filter.q', 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),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=1598,
+  serialized_end=1659,
+)
+
+
+_CREATEOPTIONS = _descriptor.Descriptor(
+  name='CreateOptions',
+  full_name='content.items.CreateOptions',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='update_attrs', full_name='content.items.CreateOptions.update_attrs', index=0,
+      number=1, 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=1661,
+  serialized_end=1698,
+)
+
+
+_FINDOPTIONS = _descriptor.Descriptor(
+  name='FindOptions',
+  full_name='content.items.FindOptions',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='options', full_name='content.items.FindOptions.options', index=0,
+      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='deleted', full_name='content.items.FindOptions.deleted', index=1,
+      number=3, 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='regular', full_name='content.items.FindOptions.regular', index=2,
+      number=4, 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='hidden', full_name='content.items.FindOptions.hidden', index=3,
+      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='templates', full_name='content.items.FindOptions.templates', 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),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=1700,
+  serialized_end=1820,
+)
+
+
+_UPDATEOPTIONS = _descriptor.Descriptor(
+  name='UpdateOptions',
+  full_name='content.items.UpdateOptions',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='update_attrs', full_name='content.items.UpdateOptions.update_attrs', index=0,
+      number=1, 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=1822,
+  serialized_end=1859,
+)
+
+
+_GETPUBLISHEDOPTIONS = _descriptor.Descriptor(
+  name='GetPublishedOptions',
+  full_name='content.items.GetPublishedOptions',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='locale_id', full_name='content.items.GetPublishedOptions.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),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=1861,
+  serialized_end=1901,
+)
+
+
+_DELETEOPTIONS = _descriptor.Descriptor(
+  name='DeleteOptions',
+  full_name='content.items.DeleteOptions',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='update_attrs', full_name='content.items.DeleteOptions.update_attrs', index=0,
+      number=1, 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='erase', full_name='content.items.DeleteOptions.erase', index=1,
+      number=2, 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=1903,
+  serialized_end=1955,
+)
+
+
+_UNDELETEOPTIONS = _descriptor.Descriptor(
+  name='UndeleteOptions',
+  full_name='content.items.UndeleteOptions',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='update_attrs', full_name='content.items.UndeleteOptions.update_attrs', index=0,
+      number=1, 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=1957,
+  serialized_end=1996,
+)
+
+
+_PUBLISHOPTIONS = _descriptor.Descriptor(
+  name='PublishOptions',
+  full_name='content.items.PublishOptions',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='update_attrs', full_name='content.items.PublishOptions.update_attrs', index=0,
+      number=1, 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=1998,
+  serialized_end=2036,
+)
+
+
+_UNPUBLISHOPTIONS = _descriptor.Descriptor(
+  name='UnpublishOptions',
+  full_name='content.items.UnpublishOptions',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='update_attrs', full_name='content.items.UnpublishOptions.update_attrs', index=0,
+      number=1, 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=2038,
+  serialized_end=2078,
+)
+
+
+_FINDPUBLISHEDOPTIONS = _descriptor.Descriptor(
+  name='FindPublishedOptions',
+  full_name='content.items.FindPublishedOptions',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='options', full_name='content.items.FindPublishedOptions.options', index=0,
+      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='locale_id', full_name='content.items.FindPublishedOptions.locale_id', 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='regular', full_name='content.items.FindPublishedOptions.regular', index=2,
+      number=4, 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='hidden', full_name='content.items.FindPublishedOptions.hidden', index=3,
+      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='templates', full_name='content.items.FindPublishedOptions.templates', 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),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=2081,
+  serialized_end=2212,
+)
+
+
+_FINDARCHIVEDOPTIONS = _descriptor.Descriptor(
+  name='FindArchivedOptions',
+  full_name='content.items.FindArchivedOptions',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='options', full_name='content.items.FindArchivedOptions.options', index=0,
+      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=2214,
+  serialized_end=2273,
+)
+
+
+_LISTREVISIONSOPTIONS = _descriptor.Descriptor(
+  name='ListRevisionsOptions',
+  full_name='content.items.ListRevisionsOptions',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='options', full_name='content.items.ListRevisionsOptions.options', index=0,
+      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=2275,
+  serialized_end=2335,
+)
+
+
+_AGGREGATEOPTIONS_FIELDSENTRY = _descriptor.Descriptor(
+  name='FieldsEntry',
+  full_name='content.items.AggregateOptions.FieldsEntry',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='key', full_name='content.items.AggregateOptions.FieldsEntry.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='content.items.AggregateOptions.FieldsEntry.value', 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=b'8\001',
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=2418,
+  serialized_end=2463,
+)
+
+_AGGREGATEOPTIONS = _descriptor.Descriptor(
+  name='AggregateOptions',
+  full_name='content.items.AggregateOptions',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='fields', full_name='content.items.AggregateOptions.fields', 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=[_AGGREGATEOPTIONS_FIELDSENTRY, ],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=2337,
+  serialized_end=2463,
+)
+
+
+_AGGREGATEPUBLISHEDOPTIONS_FIELDSENTRY = _descriptor.Descriptor(
+  name='FieldsEntry',
+  full_name='content.items.AggregatePublishedOptions.FieldsEntry',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='key', full_name='content.items.AggregatePublishedOptions.FieldsEntry.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='content.items.AggregatePublishedOptions.FieldsEntry.value', 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=b'8\001',
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=2418,
+  serialized_end=2463,
+)
+
+_AGGREGATEPUBLISHEDOPTIONS = _descriptor.Descriptor(
+  name='AggregatePublishedOptions',
+  full_name='content.items.AggregatePublishedOptions',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='fields', full_name='content.items.AggregatePublishedOptions.fields', 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=[_AGGREGATEPUBLISHEDOPTIONS_FIELDSENTRY, ],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=2466,
+  serialized_end=2610,
+)
+
+
+_CREATEREQUEST = _descriptor.Descriptor(
+  name='CreateRequest',
+  full_name='content.items.CreateRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='item', full_name='content.items.CreateRequest.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),
+    _descriptor.FieldDescriptor(
+      name='options', full_name='content.items.CreateRequest.options', 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=2612,
+  serialized_end=2709,
+)
+
+
+_CREATERESPONSE = _descriptor.Descriptor(
+  name='CreateResponse',
+  full_name='content.items.CreateResponse',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='created', full_name='content.items.CreateResponse.created', 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=2711,
+  serialized_end=2765,
+)
+
+
+_INTROSPECTREQUEST = _descriptor.Descriptor(
+  name='IntrospectRequest',
+  full_name='content.items.IntrospectRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='item', full_name='content.items.IntrospectRequest.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=2767,
+  serialized_end=2821,
+)
+
+
+_INTROSPECTRESPONSE = _descriptor.Descriptor(
+  name='IntrospectResponse',
+  full_name='content.items.IntrospectResponse',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='item', full_name='content.items.IntrospectResponse.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),
+    _descriptor.FieldDescriptor(
+      name='schema', full_name='content.items.IntrospectResponse.schema', 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='validation_errors', full_name='content.items.IntrospectResponse.validation_errors', index=2,
+      number=3, 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=2824,
+  serialized_end=2963,
+)
+
+
+_GETREQUEST = _descriptor.Descriptor(
+  name='GetRequest',
+  full_name='content.items.GetRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='space_id', full_name='content.items.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.items.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.items.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),
+    _descriptor.FieldDescriptor(
+      name='item_id', full_name='content.items.GetRequest.item_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=2965,
+  serialized_end=3051,
+)
+
+
+_GETRESPONSE = _descriptor.Descriptor(
+  name='GetResponse',
+  full_name='content.items.GetResponse',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='item', full_name='content.items.GetResponse.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=3053,
+  serialized_end=3101,
+)
+
+
+_FINDREQUEST = _descriptor.Descriptor(
+  name='FindRequest',
+  full_name='content.items.FindRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='space_id', full_name='content.items.FindRequest.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.items.FindRequest.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.items.FindRequest.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='filter', full_name='content.items.FindRequest.filter', 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='options', full_name='content.items.FindRequest.options', 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=3104,
+  serialized_end=3258,
+)
+
+
+_FINDRESPONSE = _descriptor.Descriptor(
+  name='FindResponse',
+  full_name='content.items.FindResponse',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='items', full_name='content.items.FindResponse.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='content.items.FindResponse.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=3260,
+  serialized_end=3325,
+)
+
+
+_UPDATEREQUEST = _descriptor.Descriptor(
+  name='UpdateRequest',
+  full_name='content.items.UpdateRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='item', full_name='content.items.UpdateRequest.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),
+    _descriptor.FieldDescriptor(
+      name='options', full_name='content.items.UpdateRequest.options', 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=3327,
+  serialized_end=3424,
+)
+
+
+_DELETEREQUEST = _descriptor.Descriptor(
+  name='DeleteRequest',
+  full_name='content.items.DeleteRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='item', full_name='content.items.DeleteRequest.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),
+    _descriptor.FieldDescriptor(
+      name='options', full_name='content.items.DeleteRequest.options', 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=3426,
+  serialized_end=3523,
+)
+
+
+_UNDELETEREQUEST = _descriptor.Descriptor(
+  name='UndeleteRequest',
+  full_name='content.items.UndeleteRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='item', full_name='content.items.UndeleteRequest.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),
+    _descriptor.FieldDescriptor(
+      name='options', full_name='content.items.UndeleteRequest.options', 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=3525,
+  serialized_end=3626,
+)
+
+
+_PUBLISHREQUEST = _descriptor.Descriptor(
+  name='PublishRequest',
+  full_name='content.items.PublishRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='item', full_name='content.items.PublishRequest.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),
+    _descriptor.FieldDescriptor(
+      name='options', full_name='content.items.PublishRequest.options', 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=3628,
+  serialized_end=3727,
+)
+
+
+_UNPUBLISHREQUEST = _descriptor.Descriptor(
+  name='UnpublishRequest',
+  full_name='content.items.UnpublishRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='item', full_name='content.items.UnpublishRequest.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),
+    _descriptor.FieldDescriptor(
+      name='options', full_name='content.items.UnpublishRequest.options', 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=3729,
+  serialized_end=3832,
+)
+
+
+_GETPUBLISHEDREQUEST = _descriptor.Descriptor(
+  name='GetPublishedRequest',
+  full_name='content.items.GetPublishedRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='space_id', full_name='content.items.GetPublishedRequest.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.items.GetPublishedRequest.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.items.GetPublishedRequest.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_id', full_name='content.items.GetPublishedRequest.item_id', 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='options', full_name='content.items.GetPublishedRequest.options', index=4,
+      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=3835,
+  serialized_end=3983,
+)
+
+
+_GETPUBLISHEDRESPONSE = _descriptor.Descriptor(
+  name='GetPublishedResponse',
+  full_name='content.items.GetPublishedResponse',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='item', full_name='content.items.GetPublishedResponse.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=3985,
+  serialized_end=4042,
+)
+
+
+_FINDPUBLISHEDREQUEST = _descriptor.Descriptor(
+  name='FindPublishedRequest',
+  full_name='content.items.FindPublishedRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='space_id', full_name='content.items.FindPublishedRequest.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.items.FindPublishedRequest.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.items.FindPublishedRequest.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='filter', full_name='content.items.FindPublishedRequest.filter', 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='options', full_name='content.items.FindPublishedRequest.options', index=4,
+      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=4045,
+  serialized_end=4217,
+)
+
+
+_FINDPUBLISHEDRESPONSE = _descriptor.Descriptor(
+  name='FindPublishedResponse',
+  full_name='content.items.FindPublishedResponse',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='items', full_name='content.items.FindPublishedResponse.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='content.items.FindPublishedResponse.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=4219,
+  serialized_end=4293,
+)
+
+
+_AGGREGATEREQUEST = _descriptor.Descriptor(
+  name='AggregateRequest',
+  full_name='content.items.AggregateRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='space_id', full_name='content.items.AggregateRequest.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.items.AggregateRequest.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.items.AggregateRequest.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='filter', full_name='content.items.AggregateRequest.filter', 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='options', full_name='content.items.AggregateRequest.options', index=4,
+      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=4296,
+  serialized_end=4460,
+)
+
+
+_AGGREGATERESPONSE = _descriptor.Descriptor(
+  name='AggregateResponse',
+  full_name='content.items.AggregateResponse',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='result', full_name='content.items.AggregateResponse.result', 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=4462,
+  serialized_end=4522,
+)
+
+
+_AGGREGATEPUBLISHEDREQUEST = _descriptor.Descriptor(
+  name='AggregatePublishedRequest',
+  full_name='content.items.AggregatePublishedRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='space_id', full_name='content.items.AggregatePublishedRequest.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.items.AggregatePublishedRequest.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.items.AggregatePublishedRequest.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='filter', full_name='content.items.AggregatePublishedRequest.filter', 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='options', full_name='content.items.AggregatePublishedRequest.options', index=4,
+      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=4525,
+  serialized_end=4707,
+)
+
+
+_AGGREGATEPUBLISHEDRESPONSE = _descriptor.Descriptor(
+  name='AggregatePublishedResponse',
+  full_name='content.items.AggregatePublishedResponse',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='result', full_name='content.items.AggregatePublishedResponse.result', 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=4709,
+  serialized_end=4778,
+)
+
+
+_GETREVISIONREQUEST = _descriptor.Descriptor(
+  name='GetRevisionRequest',
+  full_name='content.items.GetRevisionRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='space_id', full_name='content.items.GetRevisionRequest.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.items.GetRevisionRequest.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.items.GetRevisionRequest.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_id', full_name='content.items.GetRevisionRequest.item_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='content.items.GetRevisionRequest.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=4780,
+  serialized_end=4895,
+)
+
+
+_GETREVISIONRESPONSE = _descriptor.Descriptor(
+  name='GetRevisionResponse',
+  full_name='content.items.GetRevisionResponse',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='item', full_name='content.items.GetRevisionResponse.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=4897,
+  serialized_end=4953,
+)
+
+
+_LISTREVISIONSREQUEST = _descriptor.Descriptor(
+  name='ListRevisionsRequest',
+  full_name='content.items.ListRevisionsRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='space_id', full_name='content.items.ListRevisionsRequest.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.items.ListRevisionsRequest.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.items.ListRevisionsRequest.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_id', full_name='content.items.ListRevisionsRequest.item_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='options', full_name='content.items.ListRevisionsRequest.options', index=4,
+      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=4956,
+  serialized_end=5106,
+)
+
+
+_LISTREVISIONSRESPONSE = _descriptor.Descriptor(
+  name='ListRevisionsResponse',
+  full_name='content.items.ListRevisionsResponse',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='items', full_name='content.items.ListRevisionsResponse.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=5108,
+  serialized_end=5167,
+)
+
+
+_ARCHIVEREQUEST = _descriptor.Descriptor(
+  name='ArchiveRequest',
+  full_name='content.items.ArchiveRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='item', full_name='content.items.ArchiveRequest.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=5169,
+  serialized_end=5220,
+)
+
+
+_UNARCHIVEREQUEST = _descriptor.Descriptor(
+  name='UnarchiveRequest',
+  full_name='content.items.UnarchiveRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='item', full_name='content.items.UnarchiveRequest.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=5222,
+  serialized_end=5275,
+)
+
+
+_FINDARCHIVEDREQUEST = _descriptor.Descriptor(
+  name='FindArchivedRequest',
+  full_name='content.items.FindArchivedRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='space_id', full_name='content.items.FindArchivedRequest.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.items.FindArchivedRequest.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.items.FindArchivedRequest.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='filter', full_name='content.items.FindArchivedRequest.filter', 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='options', full_name='content.items.FindArchivedRequest.options', index=4,
+      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),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=5278,
+  serialized_end=5448,
+)
+
+
+_FINDARCHIVEDRESPONSE = _descriptor.Descriptor(
+  name='FindArchivedResponse',
+  full_name='content.items.FindArchivedResponse',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='items', full_name='content.items.FindArchivedResponse.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='content.items.FindArchivedResponse.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=5450,
+  serialized_end=5523,
+)
+
+_DECODEERROR.fields_by_name['errors'].message_type = _ERROR
+_VALIDATIONERROR.fields_by_name['errors'].message_type = _ERROR
+_MODIFICATIONERROR.fields_by_name['errors'].message_type = _ERROR
+_ITEM_TRANSLATIONSENTRY.fields_by_name['value'].message_type = google_dot_protobuf_dot_struct__pb2._STRUCT
+_ITEM_TRANSLATIONSENTRY.containing_type = _ITEM
+_ITEM.fields_by_name['state'].enum_type = _ITEM_STATE
+_ITEM.fields_by_name['created_rev_at'].message_type = google_dot_protobuf_dot_timestamp__pb2._TIMESTAMP
+_ITEM.fields_by_name['created_at'].message_type = google_dot_protobuf_dot_timestamp__pb2._TIMESTAMP
+_ITEM.fields_by_name['updated_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['permissions'].message_type = _PERMISSIONS
+_ITEM_STATE.containing_type = _ITEM
+_FILTER.fields_by_name['data'].message_type = common_dot_common__pb2._FILTER
+_FINDOPTIONS.fields_by_name['options'].message_type = common_dot_common__pb2._FINDOPTIONS
+_FINDPUBLISHEDOPTIONS.fields_by_name['options'].message_type = common_dot_common__pb2._FINDOPTIONS
+_FINDARCHIVEDOPTIONS.fields_by_name['options'].message_type = common_dot_common__pb2._FINDOPTIONS
+_LISTREVISIONSOPTIONS.fields_by_name['options'].message_type = common_dot_common__pb2._FINDOPTIONS
+_AGGREGATEOPTIONS_FIELDSENTRY.containing_type = _AGGREGATEOPTIONS
+_AGGREGATEOPTIONS.fields_by_name['fields'].message_type = _AGGREGATEOPTIONS_FIELDSENTRY
+_AGGREGATEPUBLISHEDOPTIONS_FIELDSENTRY.containing_type = _AGGREGATEPUBLISHEDOPTIONS
+_AGGREGATEPUBLISHEDOPTIONS.fields_by_name['fields'].message_type = _AGGREGATEPUBLISHEDOPTIONS_FIELDSENTRY
+_CREATEREQUEST.fields_by_name['item'].message_type = _ITEM
+_CREATEREQUEST.fields_by_name['options'].message_type = _CREATEOPTIONS
+_CREATERESPONSE.fields_by_name['created'].message_type = _ITEM
+_INTROSPECTREQUEST.fields_by_name['item'].message_type = _ITEM
+_INTROSPECTRESPONSE.fields_by_name['item'].message_type = _ITEM
+_INTROSPECTRESPONSE.fields_by_name['validation_errors'].message_type = common_dot_common__pb2._ERROR_BADREQUEST_FIELDVIOLATION
+_GETRESPONSE.fields_by_name['item'].message_type = _ITEM
+_FINDREQUEST.fields_by_name['filter'].message_type = _FILTER
+_FINDREQUEST.fields_by_name['options'].message_type = _FINDOPTIONS
+_FINDRESPONSE.fields_by_name['items'].message_type = _ITEM
+_UPDATEREQUEST.fields_by_name['item'].message_type = _ITEM
+_UPDATEREQUEST.fields_by_name['options'].message_type = _UPDATEOPTIONS
+_DELETEREQUEST.fields_by_name['item'].message_type = _ITEM
+_DELETEREQUEST.fields_by_name['options'].message_type = _DELETEOPTIONS
+_UNDELETEREQUEST.fields_by_name['item'].message_type = _ITEM
+_UNDELETEREQUEST.fields_by_name['options'].message_type = _UNDELETEOPTIONS
+_PUBLISHREQUEST.fields_by_name['item'].message_type = _ITEM
+_PUBLISHREQUEST.fields_by_name['options'].message_type = _PUBLISHOPTIONS
+_UNPUBLISHREQUEST.fields_by_name['item'].message_type = _ITEM
+_UNPUBLISHREQUEST.fields_by_name['options'].message_type = _UNPUBLISHOPTIONS
+_GETPUBLISHEDREQUEST.fields_by_name['options'].message_type = _GETPUBLISHEDOPTIONS
+_GETPUBLISHEDRESPONSE.fields_by_name['item'].message_type = _ITEM
+_FINDPUBLISHEDREQUEST.fields_by_name['filter'].message_type = _FILTER
+_FINDPUBLISHEDREQUEST.fields_by_name['options'].message_type = _FINDPUBLISHEDOPTIONS
+_FINDPUBLISHEDRESPONSE.fields_by_name['items'].message_type = _ITEM
+_AGGREGATEREQUEST.fields_by_name['filter'].message_type = _FILTER
+_AGGREGATEREQUEST.fields_by_name['options'].message_type = _AGGREGATEOPTIONS
+_AGGREGATERESPONSE.fields_by_name['result'].message_type = google_dot_protobuf_dot_struct__pb2._STRUCT
+_AGGREGATEPUBLISHEDREQUEST.fields_by_name['filter'].message_type = _FILTER
+_AGGREGATEPUBLISHEDREQUEST.fields_by_name['options'].message_type = _AGGREGATEPUBLISHEDOPTIONS
+_AGGREGATEPUBLISHEDRESPONSE.fields_by_name['result'].message_type = google_dot_protobuf_dot_struct__pb2._STRUCT
+_GETREVISIONRESPONSE.fields_by_name['item'].message_type = _ITEM
+_LISTREVISIONSREQUEST.fields_by_name['options'].message_type = _LISTREVISIONSOPTIONS
+_LISTREVISIONSRESPONSE.fields_by_name['items'].message_type = _ITEM
+_ARCHIVEREQUEST.fields_by_name['item'].message_type = _ITEM
+_UNARCHIVEREQUEST.fields_by_name['item'].message_type = _ITEM
+_FINDARCHIVEDREQUEST.fields_by_name['filter'].message_type = _FILTER
+_FINDARCHIVEDREQUEST.fields_by_name['options'].message_type = _FINDARCHIVEDOPTIONS
+_FINDARCHIVEDRESPONSE.fields_by_name['items'].message_type = _ITEM
+DESCRIPTOR.message_types_by_name['Error'] = _ERROR
+DESCRIPTOR.message_types_by_name['DecodeError'] = _DECODEERROR
+DESCRIPTOR.message_types_by_name['ValidationError'] = _VALIDATIONERROR
+DESCRIPTOR.message_types_by_name['ModificationError'] = _MODIFICATIONERROR
+DESCRIPTOR.message_types_by_name['Permissions'] = _PERMISSIONS
+DESCRIPTOR.message_types_by_name['Item'] = _ITEM
+DESCRIPTOR.message_types_by_name['EventCreate'] = _EVENTCREATE
+DESCRIPTOR.message_types_by_name['EventUpdate'] = _EVENTUPDATE
+DESCRIPTOR.message_types_by_name['EventPublish'] = _EVENTPUBLISH
+DESCRIPTOR.message_types_by_name['EventUnpublish'] = _EVENTUNPUBLISH
+DESCRIPTOR.message_types_by_name['EventDelete'] = _EVENTDELETE
+DESCRIPTOR.message_types_by_name['Filter'] = _FILTER
+DESCRIPTOR.message_types_by_name['CreateOptions'] = _CREATEOPTIONS
+DESCRIPTOR.message_types_by_name['FindOptions'] = _FINDOPTIONS
+DESCRIPTOR.message_types_by_name['UpdateOptions'] = _UPDATEOPTIONS
+DESCRIPTOR.message_types_by_name['GetPublishedOptions'] = _GETPUBLISHEDOPTIONS
+DESCRIPTOR.message_types_by_name['DeleteOptions'] = _DELETEOPTIONS
+DESCRIPTOR.message_types_by_name['UndeleteOptions'] = _UNDELETEOPTIONS
+DESCRIPTOR.message_types_by_name['PublishOptions'] = _PUBLISHOPTIONS
+DESCRIPTOR.message_types_by_name['UnpublishOptions'] = _UNPUBLISHOPTIONS
+DESCRIPTOR.message_types_by_name['FindPublishedOptions'] = _FINDPUBLISHEDOPTIONS
+DESCRIPTOR.message_types_by_name['FindArchivedOptions'] = _FINDARCHIVEDOPTIONS
+DESCRIPTOR.message_types_by_name['ListRevisionsOptions'] = _LISTREVISIONSOPTIONS
+DESCRIPTOR.message_types_by_name['AggregateOptions'] = _AGGREGATEOPTIONS
+DESCRIPTOR.message_types_by_name['AggregatePublishedOptions'] = _AGGREGATEPUBLISHEDOPTIONS
+DESCRIPTOR.message_types_by_name['CreateRequest'] = _CREATEREQUEST
+DESCRIPTOR.message_types_by_name['CreateResponse'] = _CREATERESPONSE
+DESCRIPTOR.message_types_by_name['IntrospectRequest'] = _INTROSPECTREQUEST
+DESCRIPTOR.message_types_by_name['IntrospectResponse'] = _INTROSPECTRESPONSE
+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
+DESCRIPTOR.message_types_by_name['UndeleteRequest'] = _UNDELETEREQUEST
+DESCRIPTOR.message_types_by_name['PublishRequest'] = _PUBLISHREQUEST
+DESCRIPTOR.message_types_by_name['UnpublishRequest'] = _UNPUBLISHREQUEST
+DESCRIPTOR.message_types_by_name['GetPublishedRequest'] = _GETPUBLISHEDREQUEST
+DESCRIPTOR.message_types_by_name['GetPublishedResponse'] = _GETPUBLISHEDRESPONSE
+DESCRIPTOR.message_types_by_name['FindPublishedRequest'] = _FINDPUBLISHEDREQUEST
+DESCRIPTOR.message_types_by_name['FindPublishedResponse'] = _FINDPUBLISHEDRESPONSE
+DESCRIPTOR.message_types_by_name['AggregateRequest'] = _AGGREGATEREQUEST
+DESCRIPTOR.message_types_by_name['AggregateResponse'] = _AGGREGATERESPONSE
+DESCRIPTOR.message_types_by_name['AggregatePublishedRequest'] = _AGGREGATEPUBLISHEDREQUEST
+DESCRIPTOR.message_types_by_name['AggregatePublishedResponse'] = _AGGREGATEPUBLISHEDRESPONSE
+DESCRIPTOR.message_types_by_name['GetRevisionRequest'] = _GETREVISIONREQUEST
+DESCRIPTOR.message_types_by_name['GetRevisionResponse'] = _GETREVISIONRESPONSE
+DESCRIPTOR.message_types_by_name['ListRevisionsRequest'] = _LISTREVISIONSREQUEST
+DESCRIPTOR.message_types_by_name['ListRevisionsResponse'] = _LISTREVISIONSRESPONSE
+DESCRIPTOR.message_types_by_name['ArchiveRequest'] = _ARCHIVEREQUEST
+DESCRIPTOR.message_types_by_name['UnarchiveRequest'] = _UNARCHIVEREQUEST
+DESCRIPTOR.message_types_by_name['FindArchivedRequest'] = _FINDARCHIVEDREQUEST
+DESCRIPTOR.message_types_by_name['FindArchivedResponse'] = _FINDARCHIVEDRESPONSE
+_sym_db.RegisterFileDescriptor(DESCRIPTOR)
+
+Error = _reflection.GeneratedProtocolMessageType('Error', (_message.Message,), {
+  'DESCRIPTOR' : _ERROR,
+  '__module__' : 'items.items_pb2'
+  # @@protoc_insertion_point(class_scope:content.items.Error)
+  })
+_sym_db.RegisterMessage(Error)
+
+DecodeError = _reflection.GeneratedProtocolMessageType('DecodeError', (_message.Message,), {
+  'DESCRIPTOR' : _DECODEERROR,
+  '__module__' : 'items.items_pb2'
+  # @@protoc_insertion_point(class_scope:content.items.DecodeError)
+  })
+_sym_db.RegisterMessage(DecodeError)
+
+ValidationError = _reflection.GeneratedProtocolMessageType('ValidationError', (_message.Message,), {
+  'DESCRIPTOR' : _VALIDATIONERROR,
+  '__module__' : 'items.items_pb2'
+  # @@protoc_insertion_point(class_scope:content.items.ValidationError)
+  })
+_sym_db.RegisterMessage(ValidationError)
+
+ModificationError = _reflection.GeneratedProtocolMessageType('ModificationError', (_message.Message,), {
+  'DESCRIPTOR' : _MODIFICATIONERROR,
+  '__module__' : 'items.items_pb2'
+  # @@protoc_insertion_point(class_scope:content.items.ModificationError)
+  })
+_sym_db.RegisterMessage(ModificationError)
+
+Permissions = _reflection.GeneratedProtocolMessageType('Permissions', (_message.Message,), {
+  'DESCRIPTOR' : _PERMISSIONS,
+  '__module__' : 'items.items_pb2'
+  # @@protoc_insertion_point(class_scope:content.items.Permissions)
+  })
+_sym_db.RegisterMessage(Permissions)
+
+Item = _reflection.GeneratedProtocolMessageType('Item', (_message.Message,), {
+
+  'TranslationsEntry' : _reflection.GeneratedProtocolMessageType('TranslationsEntry', (_message.Message,), {
+    'DESCRIPTOR' : _ITEM_TRANSLATIONSENTRY,
+    '__module__' : 'items.items_pb2'
+    # @@protoc_insertion_point(class_scope:content.items.Item.TranslationsEntry)
+    })
+  ,
+  'DESCRIPTOR' : _ITEM,
+  '__module__' : 'items.items_pb2'
+  # @@protoc_insertion_point(class_scope:content.items.Item)
+  })
+_sym_db.RegisterMessage(Item)
+_sym_db.RegisterMessage(Item.TranslationsEntry)
+
+EventCreate = _reflection.GeneratedProtocolMessageType('EventCreate', (_message.Message,), {
+  'DESCRIPTOR' : _EVENTCREATE,
+  '__module__' : 'items.items_pb2'
+  # @@protoc_insertion_point(class_scope:content.items.EventCreate)
+  })
+_sym_db.RegisterMessage(EventCreate)
+
+EventUpdate = _reflection.GeneratedProtocolMessageType('EventUpdate', (_message.Message,), {
+  'DESCRIPTOR' : _EVENTUPDATE,
+  '__module__' : 'items.items_pb2'
+  # @@protoc_insertion_point(class_scope:content.items.EventUpdate)
+  })
+_sym_db.RegisterMessage(EventUpdate)
+
+EventPublish = _reflection.GeneratedProtocolMessageType('EventPublish', (_message.Message,), {
+  'DESCRIPTOR' : _EVENTPUBLISH,
+  '__module__' : 'items.items_pb2'
+  # @@protoc_insertion_point(class_scope:content.items.EventPublish)
+  })
+_sym_db.RegisterMessage(EventPublish)
+
+EventUnpublish = _reflection.GeneratedProtocolMessageType('EventUnpublish', (_message.Message,), {
+  'DESCRIPTOR' : _EVENTUNPUBLISH,
+  '__module__' : 'items.items_pb2'
+  # @@protoc_insertion_point(class_scope:content.items.EventUnpublish)
+  })
+_sym_db.RegisterMessage(EventUnpublish)
+
+EventDelete = _reflection.GeneratedProtocolMessageType('EventDelete', (_message.Message,), {
+  'DESCRIPTOR' : _EVENTDELETE,
+  '__module__' : 'items.items_pb2'
+  # @@protoc_insertion_point(class_scope:content.items.EventDelete)
+  })
+_sym_db.RegisterMessage(EventDelete)
+
+Filter = _reflection.GeneratedProtocolMessageType('Filter', (_message.Message,), {
+  'DESCRIPTOR' : _FILTER,
+  '__module__' : 'items.items_pb2'
+  # @@protoc_insertion_point(class_scope:content.items.Filter)
+  })
+_sym_db.RegisterMessage(Filter)
+
+CreateOptions = _reflection.GeneratedProtocolMessageType('CreateOptions', (_message.Message,), {
+  'DESCRIPTOR' : _CREATEOPTIONS,
+  '__module__' : 'items.items_pb2'
+  # @@protoc_insertion_point(class_scope:content.items.CreateOptions)
+  })
+_sym_db.RegisterMessage(CreateOptions)
+
+FindOptions = _reflection.GeneratedProtocolMessageType('FindOptions', (_message.Message,), {
+  'DESCRIPTOR' : _FINDOPTIONS,
+  '__module__' : 'items.items_pb2'
+  # @@protoc_insertion_point(class_scope:content.items.FindOptions)
+  })
+_sym_db.RegisterMessage(FindOptions)
+
+UpdateOptions = _reflection.GeneratedProtocolMessageType('UpdateOptions', (_message.Message,), {
+  'DESCRIPTOR' : _UPDATEOPTIONS,
+  '__module__' : 'items.items_pb2'
+  # @@protoc_insertion_point(class_scope:content.items.UpdateOptions)
+  })
+_sym_db.RegisterMessage(UpdateOptions)
+
+GetPublishedOptions = _reflection.GeneratedProtocolMessageType('GetPublishedOptions', (_message.Message,), {
+  'DESCRIPTOR' : _GETPUBLISHEDOPTIONS,
+  '__module__' : 'items.items_pb2'
+  # @@protoc_insertion_point(class_scope:content.items.GetPublishedOptions)
+  })
+_sym_db.RegisterMessage(GetPublishedOptions)
+
+DeleteOptions = _reflection.GeneratedProtocolMessageType('DeleteOptions', (_message.Message,), {
+  'DESCRIPTOR' : _DELETEOPTIONS,
+  '__module__' : 'items.items_pb2'
+  # @@protoc_insertion_point(class_scope:content.items.DeleteOptions)
+  })
+_sym_db.RegisterMessage(DeleteOptions)
+
+UndeleteOptions = _reflection.GeneratedProtocolMessageType('UndeleteOptions', (_message.Message,), {
+  'DESCRIPTOR' : _UNDELETEOPTIONS,
+  '__module__' : 'items.items_pb2'
+  # @@protoc_insertion_point(class_scope:content.items.UndeleteOptions)
+  })
+_sym_db.RegisterMessage(UndeleteOptions)
+
+PublishOptions = _reflection.GeneratedProtocolMessageType('PublishOptions', (_message.Message,), {
+  'DESCRIPTOR' : _PUBLISHOPTIONS,
+  '__module__' : 'items.items_pb2'
+  # @@protoc_insertion_point(class_scope:content.items.PublishOptions)
+  })
+_sym_db.RegisterMessage(PublishOptions)
+
+UnpublishOptions = _reflection.GeneratedProtocolMessageType('UnpublishOptions', (_message.Message,), {
+  'DESCRIPTOR' : _UNPUBLISHOPTIONS,
+  '__module__' : 'items.items_pb2'
+  # @@protoc_insertion_point(class_scope:content.items.UnpublishOptions)
+  })
+_sym_db.RegisterMessage(UnpublishOptions)
+
+FindPublishedOptions = _reflection.GeneratedProtocolMessageType('FindPublishedOptions', (_message.Message,), {
+  'DESCRIPTOR' : _FINDPUBLISHEDOPTIONS,
+  '__module__' : 'items.items_pb2'
+  # @@protoc_insertion_point(class_scope:content.items.FindPublishedOptions)
+  })
+_sym_db.RegisterMessage(FindPublishedOptions)
+
+FindArchivedOptions = _reflection.GeneratedProtocolMessageType('FindArchivedOptions', (_message.Message,), {
+  'DESCRIPTOR' : _FINDARCHIVEDOPTIONS,
+  '__module__' : 'items.items_pb2'
+  # @@protoc_insertion_point(class_scope:content.items.FindArchivedOptions)
+  })
+_sym_db.RegisterMessage(FindArchivedOptions)
+
+ListRevisionsOptions = _reflection.GeneratedProtocolMessageType('ListRevisionsOptions', (_message.Message,), {
+  'DESCRIPTOR' : _LISTREVISIONSOPTIONS,
+  '__module__' : 'items.items_pb2'
+  # @@protoc_insertion_point(class_scope:content.items.ListRevisionsOptions)
+  })
+_sym_db.RegisterMessage(ListRevisionsOptions)
+
+AggregateOptions = _reflection.GeneratedProtocolMessageType('AggregateOptions', (_message.Message,), {
+
+  'FieldsEntry' : _reflection.GeneratedProtocolMessageType('FieldsEntry', (_message.Message,), {
+    'DESCRIPTOR' : _AGGREGATEOPTIONS_FIELDSENTRY,
+    '__module__' : 'items.items_pb2'
+    # @@protoc_insertion_point(class_scope:content.items.AggregateOptions.FieldsEntry)
+    })
+  ,
+  'DESCRIPTOR' : _AGGREGATEOPTIONS,
+  '__module__' : 'items.items_pb2'
+  # @@protoc_insertion_point(class_scope:content.items.AggregateOptions)
+  })
+_sym_db.RegisterMessage(AggregateOptions)
+_sym_db.RegisterMessage(AggregateOptions.FieldsEntry)
+
+AggregatePublishedOptions = _reflection.GeneratedProtocolMessageType('AggregatePublishedOptions', (_message.Message,), {
+
+  'FieldsEntry' : _reflection.GeneratedProtocolMessageType('FieldsEntry', (_message.Message,), {
+    'DESCRIPTOR' : _AGGREGATEPUBLISHEDOPTIONS_FIELDSENTRY,
+    '__module__' : 'items.items_pb2'
+    # @@protoc_insertion_point(class_scope:content.items.AggregatePublishedOptions.FieldsEntry)
+    })
+  ,
+  'DESCRIPTOR' : _AGGREGATEPUBLISHEDOPTIONS,
+  '__module__' : 'items.items_pb2'
+  # @@protoc_insertion_point(class_scope:content.items.AggregatePublishedOptions)
+  })
+_sym_db.RegisterMessage(AggregatePublishedOptions)
+_sym_db.RegisterMessage(AggregatePublishedOptions.FieldsEntry)
+
+CreateRequest = _reflection.GeneratedProtocolMessageType('CreateRequest', (_message.Message,), {
+  'DESCRIPTOR' : _CREATEREQUEST,
+  '__module__' : 'items.items_pb2'
+  # @@protoc_insertion_point(class_scope:content.items.CreateRequest)
+  })
+_sym_db.RegisterMessage(CreateRequest)
+
+CreateResponse = _reflection.GeneratedProtocolMessageType('CreateResponse', (_message.Message,), {
+  'DESCRIPTOR' : _CREATERESPONSE,
+  '__module__' : 'items.items_pb2'
+  # @@protoc_insertion_point(class_scope:content.items.CreateResponse)
+  })
+_sym_db.RegisterMessage(CreateResponse)
+
+IntrospectRequest = _reflection.GeneratedProtocolMessageType('IntrospectRequest', (_message.Message,), {
+  'DESCRIPTOR' : _INTROSPECTREQUEST,
+  '__module__' : 'items.items_pb2'
+  # @@protoc_insertion_point(class_scope:content.items.IntrospectRequest)
+  })
+_sym_db.RegisterMessage(IntrospectRequest)
+
+IntrospectResponse = _reflection.GeneratedProtocolMessageType('IntrospectResponse', (_message.Message,), {
+  'DESCRIPTOR' : _INTROSPECTRESPONSE,
+  '__module__' : 'items.items_pb2'
+  # @@protoc_insertion_point(class_scope:content.items.IntrospectResponse)
+  })
+_sym_db.RegisterMessage(IntrospectResponse)
+
+GetRequest = _reflection.GeneratedProtocolMessageType('GetRequest', (_message.Message,), {
+  'DESCRIPTOR' : _GETREQUEST,
+  '__module__' : 'items.items_pb2'
+  # @@protoc_insertion_point(class_scope:content.items.GetRequest)
+  })
+_sym_db.RegisterMessage(GetRequest)
+
+GetResponse = _reflection.GeneratedProtocolMessageType('GetResponse', (_message.Message,), {
+  'DESCRIPTOR' : _GETRESPONSE,
+  '__module__' : 'items.items_pb2'
+  # @@protoc_insertion_point(class_scope:content.items.GetResponse)
+  })
+_sym_db.RegisterMessage(GetResponse)
+
+FindRequest = _reflection.GeneratedProtocolMessageType('FindRequest', (_message.Message,), {
+  'DESCRIPTOR' : _FINDREQUEST,
+  '__module__' : 'items.items_pb2'
+  # @@protoc_insertion_point(class_scope:content.items.FindRequest)
+  })
+_sym_db.RegisterMessage(FindRequest)
+
+FindResponse = _reflection.GeneratedProtocolMessageType('FindResponse', (_message.Message,), {
+  'DESCRIPTOR' : _FINDRESPONSE,
+  '__module__' : 'items.items_pb2'
+  # @@protoc_insertion_point(class_scope:content.items.FindResponse)
+  })
+_sym_db.RegisterMessage(FindResponse)
+
+UpdateRequest = _reflection.GeneratedProtocolMessageType('UpdateRequest', (_message.Message,), {
+  'DESCRIPTOR' : _UPDATEREQUEST,
+  '__module__' : 'items.items_pb2'
+  # @@protoc_insertion_point(class_scope:content.items.UpdateRequest)
+  })
+_sym_db.RegisterMessage(UpdateRequest)
+
+DeleteRequest = _reflection.GeneratedProtocolMessageType('DeleteRequest', (_message.Message,), {
+  'DESCRIPTOR' : _DELETEREQUEST,
+  '__module__' : 'items.items_pb2'
+  # @@protoc_insertion_point(class_scope:content.items.DeleteRequest)
+  })
+_sym_db.RegisterMessage(DeleteRequest)
+
+UndeleteRequest = _reflection.GeneratedProtocolMessageType('UndeleteRequest', (_message.Message,), {
+  'DESCRIPTOR' : _UNDELETEREQUEST,
+  '__module__' : 'items.items_pb2'
+  # @@protoc_insertion_point(class_scope:content.items.UndeleteRequest)
+  })
+_sym_db.RegisterMessage(UndeleteRequest)
+
+PublishRequest = _reflection.GeneratedProtocolMessageType('PublishRequest', (_message.Message,), {
+  'DESCRIPTOR' : _PUBLISHREQUEST,
+  '__module__' : 'items.items_pb2'
+  # @@protoc_insertion_point(class_scope:content.items.PublishRequest)
+  })
+_sym_db.RegisterMessage(PublishRequest)
+
+UnpublishRequest = _reflection.GeneratedProtocolMessageType('UnpublishRequest', (_message.Message,), {
+  'DESCRIPTOR' : _UNPUBLISHREQUEST,
+  '__module__' : 'items.items_pb2'
+  # @@protoc_insertion_point(class_scope:content.items.UnpublishRequest)
+  })
+_sym_db.RegisterMessage(UnpublishRequest)
+
+GetPublishedRequest = _reflection.GeneratedProtocolMessageType('GetPublishedRequest', (_message.Message,), {
+  'DESCRIPTOR' : _GETPUBLISHEDREQUEST,
+  '__module__' : 'items.items_pb2'
+  # @@protoc_insertion_point(class_scope:content.items.GetPublishedRequest)
+  })
+_sym_db.RegisterMessage(GetPublishedRequest)
+
+GetPublishedResponse = _reflection.GeneratedProtocolMessageType('GetPublishedResponse', (_message.Message,), {
+  'DESCRIPTOR' : _GETPUBLISHEDRESPONSE,
+  '__module__' : 'items.items_pb2'
+  # @@protoc_insertion_point(class_scope:content.items.GetPublishedResponse)
+  })
+_sym_db.RegisterMessage(GetPublishedResponse)
+
+FindPublishedRequest = _reflection.GeneratedProtocolMessageType('FindPublishedRequest', (_message.Message,), {
+  'DESCRIPTOR' : _FINDPUBLISHEDREQUEST,
+  '__module__' : 'items.items_pb2'
+  # @@protoc_insertion_point(class_scope:content.items.FindPublishedRequest)
+  })
+_sym_db.RegisterMessage(FindPublishedRequest)
+
+FindPublishedResponse = _reflection.GeneratedProtocolMessageType('FindPublishedResponse', (_message.Message,), {
+  'DESCRIPTOR' : _FINDPUBLISHEDRESPONSE,
+  '__module__' : 'items.items_pb2'
+  # @@protoc_insertion_point(class_scope:content.items.FindPublishedResponse)
+  })
+_sym_db.RegisterMessage(FindPublishedResponse)
+
+AggregateRequest = _reflection.GeneratedProtocolMessageType('AggregateRequest', (_message.Message,), {
+  'DESCRIPTOR' : _AGGREGATEREQUEST,
+  '__module__' : 'items.items_pb2'
+  # @@protoc_insertion_point(class_scope:content.items.AggregateRequest)
+  })
+_sym_db.RegisterMessage(AggregateRequest)
+
+AggregateResponse = _reflection.GeneratedProtocolMessageType('AggregateResponse', (_message.Message,), {
+  'DESCRIPTOR' : _AGGREGATERESPONSE,
+  '__module__' : 'items.items_pb2'
+  # @@protoc_insertion_point(class_scope:content.items.AggregateResponse)
+  })
+_sym_db.RegisterMessage(AggregateResponse)
+
+AggregatePublishedRequest = _reflection.GeneratedProtocolMessageType('AggregatePublishedRequest', (_message.Message,), {
+  'DESCRIPTOR' : _AGGREGATEPUBLISHEDREQUEST,
+  '__module__' : 'items.items_pb2'
+  # @@protoc_insertion_point(class_scope:content.items.AggregatePublishedRequest)
+  })
+_sym_db.RegisterMessage(AggregatePublishedRequest)
+
+AggregatePublishedResponse = _reflection.GeneratedProtocolMessageType('AggregatePublishedResponse', (_message.Message,), {
+  'DESCRIPTOR' : _AGGREGATEPUBLISHEDRESPONSE,
+  '__module__' : 'items.items_pb2'
+  # @@protoc_insertion_point(class_scope:content.items.AggregatePublishedResponse)
+  })
+_sym_db.RegisterMessage(AggregatePublishedResponse)
+
+GetRevisionRequest = _reflection.GeneratedProtocolMessageType('GetRevisionRequest', (_message.Message,), {
+  'DESCRIPTOR' : _GETREVISIONREQUEST,
+  '__module__' : 'items.items_pb2'
+  # @@protoc_insertion_point(class_scope:content.items.GetRevisionRequest)
+  })
+_sym_db.RegisterMessage(GetRevisionRequest)
+
+GetRevisionResponse = _reflection.GeneratedProtocolMessageType('GetRevisionResponse', (_message.Message,), {
+  'DESCRIPTOR' : _GETREVISIONRESPONSE,
+  '__module__' : 'items.items_pb2'
+  # @@protoc_insertion_point(class_scope:content.items.GetRevisionResponse)
+  })
+_sym_db.RegisterMessage(GetRevisionResponse)
+
+ListRevisionsRequest = _reflection.GeneratedProtocolMessageType('ListRevisionsRequest', (_message.Message,), {
+  'DESCRIPTOR' : _LISTREVISIONSREQUEST,
+  '__module__' : 'items.items_pb2'
+  # @@protoc_insertion_point(class_scope:content.items.ListRevisionsRequest)
+  })
+_sym_db.RegisterMessage(ListRevisionsRequest)
+
+ListRevisionsResponse = _reflection.GeneratedProtocolMessageType('ListRevisionsResponse', (_message.Message,), {
+  'DESCRIPTOR' : _LISTREVISIONSRESPONSE,
+  '__module__' : 'items.items_pb2'
+  # @@protoc_insertion_point(class_scope:content.items.ListRevisionsResponse)
+  })
+_sym_db.RegisterMessage(ListRevisionsResponse)
+
+ArchiveRequest = _reflection.GeneratedProtocolMessageType('ArchiveRequest', (_message.Message,), {
+  'DESCRIPTOR' : _ARCHIVEREQUEST,
+  '__module__' : 'items.items_pb2'
+  # @@protoc_insertion_point(class_scope:content.items.ArchiveRequest)
+  })
+_sym_db.RegisterMessage(ArchiveRequest)
+
+UnarchiveRequest = _reflection.GeneratedProtocolMessageType('UnarchiveRequest', (_message.Message,), {
+  'DESCRIPTOR' : _UNARCHIVEREQUEST,
+  '__module__' : 'items.items_pb2'
+  # @@protoc_insertion_point(class_scope:content.items.UnarchiveRequest)
+  })
+_sym_db.RegisterMessage(UnarchiveRequest)
+
+FindArchivedRequest = _reflection.GeneratedProtocolMessageType('FindArchivedRequest', (_message.Message,), {
+  'DESCRIPTOR' : _FINDARCHIVEDREQUEST,
+  '__module__' : 'items.items_pb2'
+  # @@protoc_insertion_point(class_scope:content.items.FindArchivedRequest)
+  })
+_sym_db.RegisterMessage(FindArchivedRequest)
+
+FindArchivedResponse = _reflection.GeneratedProtocolMessageType('FindArchivedResponse', (_message.Message,), {
+  'DESCRIPTOR' : _FINDARCHIVEDRESPONSE,
+  '__module__' : 'items.items_pb2'
+  # @@protoc_insertion_point(class_scope:content.items.FindArchivedResponse)
+  })
+_sym_db.RegisterMessage(FindArchivedResponse)
+
+
+DESCRIPTOR._options = None
+_ITEM_TRANSLATIONSENTRY._options = None
+_AGGREGATEOPTIONS_FIELDSENTRY._options = None
+_AGGREGATEPUBLISHEDOPTIONS_FIELDSENTRY._options = None
+
+_ITEMS = _descriptor.ServiceDescriptor(
+  name='Items',
+  full_name='content.items.Items',
+  file=DESCRIPTOR,
+  index=0,
+  serialized_options=None,
+  create_key=_descriptor._internal_create_key,
+  serialized_start=5526,
+  serialized_end=6953,
+  methods=[
+  _descriptor.MethodDescriptor(
+    name='Create',
+    full_name='content.items.Items.Create',
+    index=0,
+    containing_service=None,
+    input_type=_CREATEREQUEST,
+    output_type=_CREATERESPONSE,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='Introspect',
+    full_name='content.items.Items.Introspect',
+    index=1,
+    containing_service=None,
+    input_type=_INTROSPECTREQUEST,
+    output_type=_INTROSPECTRESPONSE,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='Get',
+    full_name='content.items.Items.Get',
+    index=2,
+    containing_service=None,
+    input_type=_GETREQUEST,
+    output_type=_GETRESPONSE,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='Find',
+    full_name='content.items.Items.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='content.items.Items.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,
+  ),
+  _descriptor.MethodDescriptor(
+    name='Delete',
+    full_name='content.items.Items.Delete',
+    index=5,
+    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='Undelete',
+    full_name='content.items.Items.Undelete',
+    index=6,
+    containing_service=None,
+    input_type=_UNDELETEREQUEST,
+    output_type=google_dot_protobuf_dot_empty__pb2._EMPTY,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='Publish',
+    full_name='content.items.Items.Publish',
+    index=7,
+    containing_service=None,
+    input_type=_PUBLISHREQUEST,
+    output_type=google_dot_protobuf_dot_empty__pb2._EMPTY,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='Unpublish',
+    full_name='content.items.Items.Unpublish',
+    index=8,
+    containing_service=None,
+    input_type=_UNPUBLISHREQUEST,
+    output_type=google_dot_protobuf_dot_empty__pb2._EMPTY,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='GetPublished',
+    full_name='content.items.Items.GetPublished',
+    index=9,
+    containing_service=None,
+    input_type=_GETPUBLISHEDREQUEST,
+    output_type=_GETPUBLISHEDRESPONSE,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='FindPublished',
+    full_name='content.items.Items.FindPublished',
+    index=10,
+    containing_service=None,
+    input_type=_FINDPUBLISHEDREQUEST,
+    output_type=_FINDPUBLISHEDRESPONSE,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='Aggregate',
+    full_name='content.items.Items.Aggregate',
+    index=11,
+    containing_service=None,
+    input_type=_AGGREGATEREQUEST,
+    output_type=_AGGREGATERESPONSE,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='AggregatePublished',
+    full_name='content.items.Items.AggregatePublished',
+    index=12,
+    containing_service=None,
+    input_type=_AGGREGATEPUBLISHEDREQUEST,
+    output_type=_AGGREGATEPUBLISHEDRESPONSE,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='GetRevision',
+    full_name='content.items.Items.GetRevision',
+    index=13,
+    containing_service=None,
+    input_type=_GETREVISIONREQUEST,
+    output_type=_GETREVISIONRESPONSE,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='ListRevisions',
+    full_name='content.items.Items.ListRevisions',
+    index=14,
+    containing_service=None,
+    input_type=_LISTREVISIONSREQUEST,
+    output_type=_LISTREVISIONSRESPONSE,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='Archive',
+    full_name='content.items.Items.Archive',
+    index=15,
+    containing_service=None,
+    input_type=_ARCHIVEREQUEST,
+    output_type=google_dot_protobuf_dot_empty__pb2._EMPTY,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='FindArchived',
+    full_name='content.items.Items.FindArchived',
+    index=16,
+    containing_service=None,
+    input_type=_FINDARCHIVEDREQUEST,
+    output_type=_FINDARCHIVEDRESPONSE,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='Unarchive',
+    full_name='content.items.Items.Unarchive',
+    index=17,
+    containing_service=None,
+    input_type=_UNARCHIVEREQUEST,
+    output_type=google_dot_protobuf_dot_empty__pb2._EMPTY,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+])
+_sym_db.RegisterServiceDescriptor(_ITEMS)
+
+DESCRIPTOR.services_by_name['Items'] = _ITEMS
+
+# @@protoc_insertion_point(module_scope)
diff --git a/perxis/items/items_pb2_grpc.py b/perxis/items/items_pb2_grpc.py
new file mode 100644
index 0000000..394574a
--- /dev/null
+++ b/perxis/items/items_pb2_grpc.py
@@ -0,0 +1,646 @@
+# 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 perxis.items import items_pb2 as items_dot_items__pb2
+
+
+class ItemsStub(object):
+    """*
+    Сервис API элементов
+    """
+
+    def __init__(self, channel):
+        """Constructor.
+
+        Args:
+            channel: A grpc.Channel.
+        """
+        self.Create = channel.unary_unary(
+                '/content.items.Items/Create',
+                request_serializer=items_dot_items__pb2.CreateRequest.SerializeToString,
+                response_deserializer=items_dot_items__pb2.CreateResponse.FromString,
+                )
+        self.Introspect = channel.unary_unary(
+                '/content.items.Items/Introspect',
+                request_serializer=items_dot_items__pb2.IntrospectRequest.SerializeToString,
+                response_deserializer=items_dot_items__pb2.IntrospectResponse.FromString,
+                )
+        self.Get = channel.unary_unary(
+                '/content.items.Items/Get',
+                request_serializer=items_dot_items__pb2.GetRequest.SerializeToString,
+                response_deserializer=items_dot_items__pb2.GetResponse.FromString,
+                )
+        self.Find = channel.unary_unary(
+                '/content.items.Items/Find',
+                request_serializer=items_dot_items__pb2.FindRequest.SerializeToString,
+                response_deserializer=items_dot_items__pb2.FindResponse.FromString,
+                )
+        self.Update = channel.unary_unary(
+                '/content.items.Items/Update',
+                request_serializer=items_dot_items__pb2.UpdateRequest.SerializeToString,
+                response_deserializer=google_dot_protobuf_dot_empty__pb2.Empty.FromString,
+                )
+        self.Delete = channel.unary_unary(
+                '/content.items.Items/Delete',
+                request_serializer=items_dot_items__pb2.DeleteRequest.SerializeToString,
+                response_deserializer=google_dot_protobuf_dot_empty__pb2.Empty.FromString,
+                )
+        self.Undelete = channel.unary_unary(
+                '/content.items.Items/Undelete',
+                request_serializer=items_dot_items__pb2.UndeleteRequest.SerializeToString,
+                response_deserializer=google_dot_protobuf_dot_empty__pb2.Empty.FromString,
+                )
+        self.Publish = channel.unary_unary(
+                '/content.items.Items/Publish',
+                request_serializer=items_dot_items__pb2.PublishRequest.SerializeToString,
+                response_deserializer=google_dot_protobuf_dot_empty__pb2.Empty.FromString,
+                )
+        self.Unpublish = channel.unary_unary(
+                '/content.items.Items/Unpublish',
+                request_serializer=items_dot_items__pb2.UnpublishRequest.SerializeToString,
+                response_deserializer=google_dot_protobuf_dot_empty__pb2.Empty.FromString,
+                )
+        self.GetPublished = channel.unary_unary(
+                '/content.items.Items/GetPublished',
+                request_serializer=items_dot_items__pb2.GetPublishedRequest.SerializeToString,
+                response_deserializer=items_dot_items__pb2.GetPublishedResponse.FromString,
+                )
+        self.FindPublished = channel.unary_unary(
+                '/content.items.Items/FindPublished',
+                request_serializer=items_dot_items__pb2.FindPublishedRequest.SerializeToString,
+                response_deserializer=items_dot_items__pb2.FindPublishedResponse.FromString,
+                )
+        self.Aggregate = channel.unary_unary(
+                '/content.items.Items/Aggregate',
+                request_serializer=items_dot_items__pb2.AggregateRequest.SerializeToString,
+                response_deserializer=items_dot_items__pb2.AggregateResponse.FromString,
+                )
+        self.AggregatePublished = channel.unary_unary(
+                '/content.items.Items/AggregatePublished',
+                request_serializer=items_dot_items__pb2.AggregatePublishedRequest.SerializeToString,
+                response_deserializer=items_dot_items__pb2.AggregatePublishedResponse.FromString,
+                )
+        self.GetRevision = channel.unary_unary(
+                '/content.items.Items/GetRevision',
+                request_serializer=items_dot_items__pb2.GetRevisionRequest.SerializeToString,
+                response_deserializer=items_dot_items__pb2.GetRevisionResponse.FromString,
+                )
+        self.ListRevisions = channel.unary_unary(
+                '/content.items.Items/ListRevisions',
+                request_serializer=items_dot_items__pb2.ListRevisionsRequest.SerializeToString,
+                response_deserializer=items_dot_items__pb2.ListRevisionsResponse.FromString,
+                )
+        self.Archive = channel.unary_unary(
+                '/content.items.Items/Archive',
+                request_serializer=items_dot_items__pb2.ArchiveRequest.SerializeToString,
+                response_deserializer=google_dot_protobuf_dot_empty__pb2.Empty.FromString,
+                )
+        self.FindArchived = channel.unary_unary(
+                '/content.items.Items/FindArchived',
+                request_serializer=items_dot_items__pb2.FindArchivedRequest.SerializeToString,
+                response_deserializer=items_dot_items__pb2.FindArchivedResponse.FromString,
+                )
+        self.Unarchive = channel.unary_unary(
+                '/content.items.Items/Unarchive',
+                request_serializer=items_dot_items__pb2.UnarchiveRequest.SerializeToString,
+                response_deserializer=google_dot_protobuf_dot_empty__pb2.Empty.FromString,
+                )
+
+
+class ItemsServicer(object):
+    """*
+    Сервис API элементов
+    """
+
+    def Create(self, request, context):
+        """*
+        Создать запись
+        """
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def Introspect(self, request, context):
+        """*
+        Валидация данных записи
+        """
+        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 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):
+        """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 Undelete(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 Publish(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 Unpublish(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 GetPublished(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 FindPublished(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 Aggregate(self, request, context):
+        """*
+        Расчет значений по существующим данным. Например, получение среднего значения поля
+        """
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def AggregatePublished(self, request, context):
+        """*
+        Расчет значений по существующим **опубликованным** данным.
+        """
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def GetRevision(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 ListRevisions(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 Archive(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 FindArchived(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 Unarchive(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_ItemsServicer_to_server(servicer, server):
+    rpc_method_handlers = {
+            'Create': grpc.unary_unary_rpc_method_handler(
+                    servicer.Create,
+                    request_deserializer=items_dot_items__pb2.CreateRequest.FromString,
+                    response_serializer=items_dot_items__pb2.CreateResponse.SerializeToString,
+            ),
+            'Introspect': grpc.unary_unary_rpc_method_handler(
+                    servicer.Introspect,
+                    request_deserializer=items_dot_items__pb2.IntrospectRequest.FromString,
+                    response_serializer=items_dot_items__pb2.IntrospectResponse.SerializeToString,
+            ),
+            'Get': grpc.unary_unary_rpc_method_handler(
+                    servicer.Get,
+                    request_deserializer=items_dot_items__pb2.GetRequest.FromString,
+                    response_serializer=items_dot_items__pb2.GetResponse.SerializeToString,
+            ),
+            'Find': grpc.unary_unary_rpc_method_handler(
+                    servicer.Find,
+                    request_deserializer=items_dot_items__pb2.FindRequest.FromString,
+                    response_serializer=items_dot_items__pb2.FindResponse.SerializeToString,
+            ),
+            'Update': grpc.unary_unary_rpc_method_handler(
+                    servicer.Update,
+                    request_deserializer=items_dot_items__pb2.UpdateRequest.FromString,
+                    response_serializer=google_dot_protobuf_dot_empty__pb2.Empty.SerializeToString,
+            ),
+            'Delete': grpc.unary_unary_rpc_method_handler(
+                    servicer.Delete,
+                    request_deserializer=items_dot_items__pb2.DeleteRequest.FromString,
+                    response_serializer=google_dot_protobuf_dot_empty__pb2.Empty.SerializeToString,
+            ),
+            'Undelete': grpc.unary_unary_rpc_method_handler(
+                    servicer.Undelete,
+                    request_deserializer=items_dot_items__pb2.UndeleteRequest.FromString,
+                    response_serializer=google_dot_protobuf_dot_empty__pb2.Empty.SerializeToString,
+            ),
+            'Publish': grpc.unary_unary_rpc_method_handler(
+                    servicer.Publish,
+                    request_deserializer=items_dot_items__pb2.PublishRequest.FromString,
+                    response_serializer=google_dot_protobuf_dot_empty__pb2.Empty.SerializeToString,
+            ),
+            'Unpublish': grpc.unary_unary_rpc_method_handler(
+                    servicer.Unpublish,
+                    request_deserializer=items_dot_items__pb2.UnpublishRequest.FromString,
+                    response_serializer=google_dot_protobuf_dot_empty__pb2.Empty.SerializeToString,
+            ),
+            'GetPublished': grpc.unary_unary_rpc_method_handler(
+                    servicer.GetPublished,
+                    request_deserializer=items_dot_items__pb2.GetPublishedRequest.FromString,
+                    response_serializer=items_dot_items__pb2.GetPublishedResponse.SerializeToString,
+            ),
+            'FindPublished': grpc.unary_unary_rpc_method_handler(
+                    servicer.FindPublished,
+                    request_deserializer=items_dot_items__pb2.FindPublishedRequest.FromString,
+                    response_serializer=items_dot_items__pb2.FindPublishedResponse.SerializeToString,
+            ),
+            'Aggregate': grpc.unary_unary_rpc_method_handler(
+                    servicer.Aggregate,
+                    request_deserializer=items_dot_items__pb2.AggregateRequest.FromString,
+                    response_serializer=items_dot_items__pb2.AggregateResponse.SerializeToString,
+            ),
+            'AggregatePublished': grpc.unary_unary_rpc_method_handler(
+                    servicer.AggregatePublished,
+                    request_deserializer=items_dot_items__pb2.AggregatePublishedRequest.FromString,
+                    response_serializer=items_dot_items__pb2.AggregatePublishedResponse.SerializeToString,
+            ),
+            'GetRevision': grpc.unary_unary_rpc_method_handler(
+                    servicer.GetRevision,
+                    request_deserializer=items_dot_items__pb2.GetRevisionRequest.FromString,
+                    response_serializer=items_dot_items__pb2.GetRevisionResponse.SerializeToString,
+            ),
+            'ListRevisions': grpc.unary_unary_rpc_method_handler(
+                    servicer.ListRevisions,
+                    request_deserializer=items_dot_items__pb2.ListRevisionsRequest.FromString,
+                    response_serializer=items_dot_items__pb2.ListRevisionsResponse.SerializeToString,
+            ),
+            'Archive': grpc.unary_unary_rpc_method_handler(
+                    servicer.Archive,
+                    request_deserializer=items_dot_items__pb2.ArchiveRequest.FromString,
+                    response_serializer=google_dot_protobuf_dot_empty__pb2.Empty.SerializeToString,
+            ),
+            'FindArchived': grpc.unary_unary_rpc_method_handler(
+                    servicer.FindArchived,
+                    request_deserializer=items_dot_items__pb2.FindArchivedRequest.FromString,
+                    response_serializer=items_dot_items__pb2.FindArchivedResponse.SerializeToString,
+            ),
+            'Unarchive': grpc.unary_unary_rpc_method_handler(
+                    servicer.Unarchive,
+                    request_deserializer=items_dot_items__pb2.UnarchiveRequest.FromString,
+                    response_serializer=google_dot_protobuf_dot_empty__pb2.Empty.SerializeToString,
+            ),
+    }
+    generic_handler = grpc.method_handlers_generic_handler(
+            'content.items.Items', rpc_method_handlers)
+    server.add_generic_rpc_handlers((generic_handler,))
+
+
+ # This class is part of an EXPERIMENTAL API.
+class Items(object):
+    """*
+    Сервис API элементов
+    """
+
+    @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.items.Items/Create',
+            items_dot_items__pb2.CreateRequest.SerializeToString,
+            items_dot_items__pb2.CreateResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def Introspect(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.items.Items/Introspect',
+            items_dot_items__pb2.IntrospectRequest.SerializeToString,
+            items_dot_items__pb2.IntrospectResponse.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.items.Items/Get',
+            items_dot_items__pb2.GetRequest.SerializeToString,
+            items_dot_items__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, '/content.items.Items/Find',
+            items_dot_items__pb2.FindRequest.SerializeToString,
+            items_dot_items__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, '/content.items.Items/Update',
+            items_dot_items__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.items.Items/Delete',
+            items_dot_items__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 Undelete(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.items.Items/Undelete',
+            items_dot_items__pb2.UndeleteRequest.SerializeToString,
+            google_dot_protobuf_dot_empty__pb2.Empty.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def Publish(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.items.Items/Publish',
+            items_dot_items__pb2.PublishRequest.SerializeToString,
+            google_dot_protobuf_dot_empty__pb2.Empty.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def Unpublish(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.items.Items/Unpublish',
+            items_dot_items__pb2.UnpublishRequest.SerializeToString,
+            google_dot_protobuf_dot_empty__pb2.Empty.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def GetPublished(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.items.Items/GetPublished',
+            items_dot_items__pb2.GetPublishedRequest.SerializeToString,
+            items_dot_items__pb2.GetPublishedResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def FindPublished(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.items.Items/FindPublished',
+            items_dot_items__pb2.FindPublishedRequest.SerializeToString,
+            items_dot_items__pb2.FindPublishedResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def Aggregate(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.items.Items/Aggregate',
+            items_dot_items__pb2.AggregateRequest.SerializeToString,
+            items_dot_items__pb2.AggregateResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def AggregatePublished(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.items.Items/AggregatePublished',
+            items_dot_items__pb2.AggregatePublishedRequest.SerializeToString,
+            items_dot_items__pb2.AggregatePublishedResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def GetRevision(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.items.Items/GetRevision',
+            items_dot_items__pb2.GetRevisionRequest.SerializeToString,
+            items_dot_items__pb2.GetRevisionResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def ListRevisions(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.items.Items/ListRevisions',
+            items_dot_items__pb2.ListRevisionsRequest.SerializeToString,
+            items_dot_items__pb2.ListRevisionsResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def Archive(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.items.Items/Archive',
+            items_dot_items__pb2.ArchiveRequest.SerializeToString,
+            google_dot_protobuf_dot_empty__pb2.Empty.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def FindArchived(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.items.Items/FindArchived',
+            items_dot_items__pb2.FindArchivedRequest.SerializeToString,
+            items_dot_items__pb2.FindArchivedResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def Unarchive(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.items.Items/Unarchive',
+            items_dot_items__pb2.UnarchiveRequest.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/locales_pb2.py b/perxis/locales/locales_pb2.py
new file mode 100644
index 0000000..2e856c1
--- /dev/null
+++ b/perxis/locales/locales_pb2.py
@@ -0,0 +1,343 @@
+# -*- 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'Z2git.perx.ru/perxis/perxis-go/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\x10\n\x08space_id\x18\x02 \x01(\t\x12\x0c\n\x04name\x18\x03 \x01(\t\"8\n\rCreateRequest\x12\'\n\x06locale\x18\x01 \x01(\x0b\x32\x17.content.locales.Locale\"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\x10\n\x08space_id\x18\x01 \x01(\t\x12\x11\n\tlocale_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\x34Z2git.perx.ru/perxis/perxis-go/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='space_id', full_name='content.locales.Locale.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='name', full_name='content.locales.Locale.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),
+  ],
+  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', full_name='content.locales.CreateRequest.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=125,
+  serialized_end=181,
+)
+
+
+_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=183,
+  serialized_end=240,
+)
+
+
+_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=242,
+  serialized_end=273,
+)
+
+
+_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=275,
+  serialized_end=331,
+)
+
+
+_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='space_id', full_name='content.locales.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='locale_id', full_name='content.locales.DeleteRequest.locale_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=333,
+  serialized_end=385,
+)
+
+_CREATEREQUEST.fields_by_name['locale'].message_type = _LOCALE
+_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=388,
+  serialized_end=613,
+  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..a7d003d
--- /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 perxis.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/members_pb2.py b/perxis/members/members_pb2.py
new file mode 100644
index 0000000..46545d5
--- /dev/null
+++ b/perxis/members/members_pb2.py
@@ -0,0 +1,656 @@
+# -*- 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
+from perxis.common import common_pb2 as common_dot_common__pb2
+
+
+DESCRIPTOR = _descriptor.FileDescriptor(
+  name='members/members.proto',
+  package='account.members',
+  syntax='proto3',
+  serialized_options=b'Z2git.perx.ru/perxis/perxis-go/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\x1a\x13\x63ommon/common.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\"F\n\x18OnCollaboratorSetRequest\x12*\n\x0c\x63ollaborator\x18\x01 \x01(\x0b\x32\x14.common.Collaborator\"4\n\x19OnCollaboratorSetResponse\x12\x17\n\x0f\x64\x65layed_task_id\x18\x01 \x01(\t*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\x32x\n\x08Observer\x12l\n\x11OnCollaboratorSet\x12).account.members.OnCollaboratorSetRequest\x1a*.account.members.OnCollaboratorSetResponse\"\x00\x42\x34Z2git.perx.ru/perxis/perxis-go/proto/members;membersb\x06proto3'
+  ,
+  dependencies=[google_dot_protobuf_dot_empty__pb2.DESCRIPTOR,common_dot_common__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=756,
+  serialized_end=812,
+)
+_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=92,
+  serialized_end=170,
+)
+
+
+_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=172,
+  serialized_end=254,
+)
+
+
+_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=256,
+  serialized_end=301,
+)
+
+
+_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=303,
+  serialized_end=353,
+)
+
+
+_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=355,
+  serialized_end=403,
+)
+
+
+_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=405,
+  serialized_end=441,
+)
+
+
+_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=443,
+  serialized_end=506,
+)
+
+
+_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=508,
+  serialized_end=551,
+)
+
+
+_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=553,
+  serialized_end=628,
+)
+
+
+_ONCOLLABORATORSETREQUEST = _descriptor.Descriptor(
+  name='OnCollaboratorSetRequest',
+  full_name='account.members.OnCollaboratorSetRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='collaborator', full_name='account.members.OnCollaboratorSetRequest.collaborator', 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=630,
+  serialized_end=700,
+)
+
+
+_ONCOLLABORATORSETRESPONSE = _descriptor.Descriptor(
+  name='OnCollaboratorSetResponse',
+  full_name='account.members.OnCollaboratorSetResponse',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='delayed_task_id', full_name='account.members.OnCollaboratorSetResponse.delayed_task_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=702,
+  serialized_end=754,
+)
+
+_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
+_ONCOLLABORATORSETREQUEST.fields_by_name['collaborator'].message_type = common_dot_common__pb2._COLLABORATOR
+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.message_types_by_name['OnCollaboratorSetRequest'] = _ONCOLLABORATORSETREQUEST
+DESCRIPTOR.message_types_by_name['OnCollaboratorSetResponse'] = _ONCOLLABORATORSETRESPONSE
+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)
+
+OnCollaboratorSetRequest = _reflection.GeneratedProtocolMessageType('OnCollaboratorSetRequest', (_message.Message,), {
+  'DESCRIPTOR' : _ONCOLLABORATORSETREQUEST,
+  '__module__' : 'members.members_pb2'
+  # @@protoc_insertion_point(class_scope:account.members.OnCollaboratorSetRequest)
+  })
+_sym_db.RegisterMessage(OnCollaboratorSetRequest)
+
+OnCollaboratorSetResponse = _reflection.GeneratedProtocolMessageType('OnCollaboratorSetResponse', (_message.Message,), {
+  'DESCRIPTOR' : _ONCOLLABORATORSETRESPONSE,
+  '__module__' : 'members.members_pb2'
+  # @@protoc_insertion_point(class_scope:account.members.OnCollaboratorSetResponse)
+  })
+_sym_db.RegisterMessage(OnCollaboratorSetResponse)
+
+
+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=815,
+  serialized_end=1224,
+  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
+
+
+_OBSERVER = _descriptor.ServiceDescriptor(
+  name='Observer',
+  full_name='account.members.Observer',
+  file=DESCRIPTOR,
+  index=1,
+  serialized_options=None,
+  create_key=_descriptor._internal_create_key,
+  serialized_start=1226,
+  serialized_end=1346,
+  methods=[
+  _descriptor.MethodDescriptor(
+    name='OnCollaboratorSet',
+    full_name='account.members.Observer.OnCollaboratorSet',
+    index=0,
+    containing_service=None,
+    input_type=_ONCOLLABORATORSETREQUEST,
+    output_type=_ONCOLLABORATORSETRESPONSE,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+])
+_sym_db.RegisterServiceDescriptor(_OBSERVER)
+
+DESCRIPTOR.services_by_name['Observer'] = _OBSERVER
+
+# @@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..2230497
--- /dev/null
+++ b/perxis/members/members_pb2_grpc.py
@@ -0,0 +1,260 @@
+# 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 perxis.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)
+
+
+class ObserverStub(object):
+    """Missing associated documentation comment in .proto file."""
+
+    def __init__(self, channel):
+        """Constructor.
+
+        Args:
+            channel: A grpc.Channel.
+        """
+        self.OnCollaboratorSet = channel.unary_unary(
+                '/account.members.Observer/OnCollaboratorSet',
+                request_serializer=members_dot_members__pb2.OnCollaboratorSetRequest.SerializeToString,
+                response_deserializer=members_dot_members__pb2.OnCollaboratorSetResponse.FromString,
+                )
+
+
+class ObserverServicer(object):
+    """Missing associated documentation comment in .proto file."""
+
+    def OnCollaboratorSet(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_ObserverServicer_to_server(servicer, server):
+    rpc_method_handlers = {
+            'OnCollaboratorSet': grpc.unary_unary_rpc_method_handler(
+                    servicer.OnCollaboratorSet,
+                    request_deserializer=members_dot_members__pb2.OnCollaboratorSetRequest.FromString,
+                    response_serializer=members_dot_members__pb2.OnCollaboratorSetResponse.SerializeToString,
+            ),
+    }
+    generic_handler = grpc.method_handlers_generic_handler(
+            'account.members.Observer', rpc_method_handlers)
+    server.add_generic_rpc_handlers((generic_handler,))
+
+
+ # This class is part of an EXPERIMENTAL API.
+class Observer(object):
+    """Missing associated documentation comment in .proto file."""
+
+    @staticmethod
+    def OnCollaboratorSet(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.Observer/OnCollaboratorSet',
+            members_dot_members__pb2.OnCollaboratorSetRequest.SerializeToString,
+            members_dot_members__pb2.OnCollaboratorSetResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
diff --git a/perxis/organizations/organizations_pb2.py b/perxis/organizations/organizations_pb2.py
new file mode 100644
index 0000000..8216807
--- /dev/null
+++ b/perxis/organizations/organizations_pb2.py
@@ -0,0 +1,564 @@
+# -*- 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 perxis.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>git.perx.ru/perxis/perxis-go/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\"s\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\x12\x15\n\x08owner_id\x18\x06 \x01(\tH\x00\x88\x01\x01\x42\x0b\n\t_owner_id\"A\n\rCreateRequest\x12\x30\n\x03org\x18\x01 \x01(\x0b\x32#.account.organizations.Organization\"F\n\x0e\x43reateResponse\x12\x34\n\x07\x63reated\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\"A\n\rUpdateRequest\x12\x30\n\x03org\x18\x01 \x01(\x0b\x32#.account.organizations.Organization\"\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>git.perx.ru/perxis/perxis-go/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),
+    _descriptor.FieldDescriptor(
+      name='owner_id', full_name='account.organizations.Organization.owner_id', index=4,
+      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=[
+    _descriptor.OneofDescriptor(
+      name='_owner_id', full_name='account.organizations.Organization._owner_id',
+      index=0, containing_type=None,
+      create_key=_descriptor._internal_create_key,
+    fields=[]),
+  ],
+  serialized_start=110,
+  serialized_end=225,
+)
+
+
+_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='org', full_name='account.organizations.CreateRequest.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=227,
+  serialized_end=292,
+)
+
+
+_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='created', full_name='account.organizations.CreateResponse.created', 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=294,
+  serialized_end=364,
+)
+
+
+_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=366,
+  serialized_end=394,
+)
+
+
+_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=396,
+  serialized_end=459,
+)
+
+
+_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', full_name='account.organizations.UpdateRequest.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=461,
+  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,
+)
+
+_ORGANIZATION.oneofs_by_name['_owner_id'].fields.append(
+  _ORGANIZATION.fields_by_name['owner_id'])
+_ORGANIZATION.fields_by_name['owner_id'].containing_oneof = _ORGANIZATION.oneofs_by_name['_owner_id']
+_CREATEREQUEST.fields_by_name['org'].message_type = _ORGANIZATION
+_CREATERESPONSE.fields_by_name['created'].message_type = _ORGANIZATION
+_GETRESPONSE.fields_by_name['org'].message_type = _ORGANIZATION
+_UPDATEREQUEST.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..5c24cfb
--- /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 perxis.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/references/references_pb2.py b/perxis/references/references_pb2.py
new file mode 100644
index 0000000..a4e7640
--- /dev/null
+++ b/perxis/references/references_pb2.py
@@ -0,0 +1,217 @@
+# -*- coding: utf-8 -*-
+# Generated by the protocol buffer compiler.  DO NOT EDIT!
+# source: references/references.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 perxis.items import items_pb2 as items_dot_items__pb2
+
+
+DESCRIPTOR = _descriptor.FileDescriptor(
+  name='references/references.proto',
+  package='content.references',
+  syntax='proto3',
+  serialized_options=b'Z8git.perx.ru/perxis/perxis-go/proto/references;references',
+  create_key=_descriptor._internal_create_key,
+  serialized_pb=b'\n\x1breferences/references.proto\x12\x12\x63ontent.references\x1a\x11items/items.proto\"@\n\tReference\x12\n\n\x02id\x18\x01 \x01(\t\x12\x15\n\rcollection_id\x18\x02 \x01(\t\x12\x10\n\x08\x64isabled\x18\x03 \x01(\x08\"a\n\nGetRequest\x12\x10\n\x08space_id\x18\x01 \x01(\t\x12\x0e\n\x06\x65nv_id\x18\x02 \x01(\t\x12\x31\n\nreferences\x18\x03 \x03(\x0b\x32\x1d.content.references.Reference\"b\n\x0bGetResponse\x12\"\n\x05items\x18\x01 \x03(\x0b\x32\x13.content.items.Item\x12/\n\x08notfound\x18\x02 \x03(\x0b\x32\x1d.content.references.Reference2V\n\nReferences\x12H\n\x03Get\x12\x1e.content.references.GetRequest\x1a\x1f.content.references.GetResponse\"\x00\x42:Z8git.perx.ru/perxis/perxis-go/proto/references;referencesb\x06proto3'
+  ,
+  dependencies=[items_dot_items__pb2.DESCRIPTOR,])
+
+
+
+
+_REFERENCE = _descriptor.Descriptor(
+  name='Reference',
+  full_name='content.references.Reference',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='id', full_name='content.references.Reference.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='content.references.Reference.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='disabled', full_name='content.references.Reference.disabled', index=2,
+      number=3, 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=70,
+  serialized_end=134,
+)
+
+
+_GETREQUEST = _descriptor.Descriptor(
+  name='GetRequest',
+  full_name='content.references.GetRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='space_id', full_name='content.references.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.references.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='references', full_name='content.references.GetRequest.references', index=2,
+      number=3, 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=136,
+  serialized_end=233,
+)
+
+
+_GETRESPONSE = _descriptor.Descriptor(
+  name='GetResponse',
+  full_name='content.references.GetResponse',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='items', full_name='content.references.GetResponse.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='notfound', full_name='content.references.GetResponse.notfound', index=1,
+      number=2, 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=235,
+  serialized_end=333,
+)
+
+_GETREQUEST.fields_by_name['references'].message_type = _REFERENCE
+_GETRESPONSE.fields_by_name['items'].message_type = items_dot_items__pb2._ITEM
+_GETRESPONSE.fields_by_name['notfound'].message_type = _REFERENCE
+DESCRIPTOR.message_types_by_name['Reference'] = _REFERENCE
+DESCRIPTOR.message_types_by_name['GetRequest'] = _GETREQUEST
+DESCRIPTOR.message_types_by_name['GetResponse'] = _GETRESPONSE
+_sym_db.RegisterFileDescriptor(DESCRIPTOR)
+
+Reference = _reflection.GeneratedProtocolMessageType('Reference', (_message.Message,), {
+  'DESCRIPTOR' : _REFERENCE,
+  '__module__' : 'references.references_pb2'
+  # @@protoc_insertion_point(class_scope:content.references.Reference)
+  })
+_sym_db.RegisterMessage(Reference)
+
+GetRequest = _reflection.GeneratedProtocolMessageType('GetRequest', (_message.Message,), {
+  'DESCRIPTOR' : _GETREQUEST,
+  '__module__' : 'references.references_pb2'
+  # @@protoc_insertion_point(class_scope:content.references.GetRequest)
+  })
+_sym_db.RegisterMessage(GetRequest)
+
+GetResponse = _reflection.GeneratedProtocolMessageType('GetResponse', (_message.Message,), {
+  'DESCRIPTOR' : _GETRESPONSE,
+  '__module__' : 'references.references_pb2'
+  # @@protoc_insertion_point(class_scope:content.references.GetResponse)
+  })
+_sym_db.RegisterMessage(GetResponse)
+
+
+DESCRIPTOR._options = None
+
+_REFERENCES = _descriptor.ServiceDescriptor(
+  name='References',
+  full_name='content.references.References',
+  file=DESCRIPTOR,
+  index=0,
+  serialized_options=None,
+  create_key=_descriptor._internal_create_key,
+  serialized_start=335,
+  serialized_end=421,
+  methods=[
+  _descriptor.MethodDescriptor(
+    name='Get',
+    full_name='content.references.References.Get',
+    index=0,
+    containing_service=None,
+    input_type=_GETREQUEST,
+    output_type=_GETRESPONSE,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+])
+_sym_db.RegisterServiceDescriptor(_REFERENCES)
+
+DESCRIPTOR.services_by_name['References'] = _REFERENCES
+
+# @@protoc_insertion_point(module_scope)
diff --git a/perxis/references/references_pb2_grpc.py b/perxis/references/references_pb2_grpc.py
new file mode 100644
index 0000000..5087a6d
--- /dev/null
+++ b/perxis/references/references_pb2_grpc.py
@@ -0,0 +1,72 @@
+# Generated by the gRPC Python protocol compiler plugin. DO NOT EDIT!
+"""Client and server classes corresponding to protobuf-defined services."""
+import grpc
+
+from perxis.references import references_pb2 as references_dot_references__pb2
+
+
+class ReferencesStub(object):
+    """References принимает список ссылок на записи и возвращает два списка:
+    список найденных записей и не найденных ссылок
+    """
+
+    def __init__(self, channel):
+        """Constructor.
+
+        Args:
+            channel: A grpc.Channel.
+        """
+        self.Get = channel.unary_unary(
+                '/content.references.References/Get',
+                request_serializer=references_dot_references__pb2.GetRequest.SerializeToString,
+                response_deserializer=references_dot_references__pb2.GetResponse.FromString,
+                )
+
+
+class ReferencesServicer(object):
+    """References принимает список ссылок на записи и возвращает два списка:
+    список найденных записей и не найденных ссылок
+    """
+
+    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 add_ReferencesServicer_to_server(servicer, server):
+    rpc_method_handlers = {
+            'Get': grpc.unary_unary_rpc_method_handler(
+                    servicer.Get,
+                    request_deserializer=references_dot_references__pb2.GetRequest.FromString,
+                    response_serializer=references_dot_references__pb2.GetResponse.SerializeToString,
+            ),
+    }
+    generic_handler = grpc.method_handlers_generic_handler(
+            'content.references.References', rpc_method_handlers)
+    server.add_generic_rpc_handlers((generic_handler,))
+
+
+ # This class is part of an EXPERIMENTAL API.
+class References(object):
+    """References принимает список ссылок на записи и возвращает два списка:
+    список найденных записей и не найденных ссылок
+    """
+
+    @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.references.References/Get',
+            references_dot_references__pb2.GetRequest.SerializeToString,
+            references_dot_references__pb2.GetResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
diff --git a/perxis/roles/roles_pb2.py b/perxis/roles/roles_pb2.py
new file mode 100644
index 0000000..3461459
--- /dev/null
+++ b/perxis/roles/roles_pb2.py
@@ -0,0 +1,515 @@
+# -*- coding: utf-8 -*-
+# Generated by the protocol buffer compiler.  DO NOT EDIT!
+# source: roles/roles.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 perxis.common import common_pb2 as common_dot_common__pb2
+
+
+DESCRIPTOR = _descriptor.FileDescriptor(
+  name='roles/roles.proto',
+  package='content.roles',
+  syntax='proto3',
+  serialized_options=b'Z.git.perx.ru/perxis/perxis-go/proto/roles;roles',
+  create_key=_descriptor._internal_create_key,
+  serialized_pb=b'\n\x11roles/roles.proto\x12\rcontent.roles\x1a\x1bgoogle/protobuf/empty.proto\x1a\x13\x63ommon/common.proto\"\x86\x01\n\x04Role\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\x1b\n\x05rules\x18\x04 \x03(\x0b\x32\x0c.common.Rule\x12\x14\n\x0c\x65nvironments\x18\x05 \x03(\t\x12\x18\n\x10\x61llow_management\x18\n \x01(\x08\"2\n\rCreateRequest\x12!\n\x04role\x18\x01 \x01(\x0b\x32\x13.content.roles.Role\"6\n\x0e\x43reateResponse\x12$\n\x07\x63reated\x18\x01 \x01(\x0b\x32\x13.content.roles.Role\"/\n\nGetRequest\x12\x10\n\x08space_id\x18\x01 \x01(\t\x12\x0f\n\x07role_id\x18\x02 \x01(\t\"0\n\x0bGetResponse\x12!\n\x04role\x18\x01 \x01(\x0b\x32\x13.content.roles.Role\"2\n\rUpdateRequest\x12!\n\x04role\x18\x01 \x01(\x0b\x32\x13.content.roles.Role\"\x1f\n\x0bListRequest\x12\x10\n\x08space_id\x18\x01 \x01(\t\"2\n\x0cListResponse\x12\"\n\x05roles\x18\x01 \x03(\x0b\x32\x13.content.roles.Role\"2\n\rDeleteRequest\x12\x10\n\x08space_id\x18\x01 \x01(\t\x12\x0f\n\x07role_id\x18\x02 \x01(\t2\xd7\x02\n\x05Roles\x12G\n\x06\x43reate\x12\x1c.content.roles.CreateRequest\x1a\x1d.content.roles.CreateResponse\"\x00\x12>\n\x03Get\x12\x19.content.roles.GetRequest\x1a\x1a.content.roles.GetResponse\"\x00\x12@\n\x06Update\x12\x1c.content.roles.UpdateRequest\x1a\x16.google.protobuf.Empty\"\x00\x12\x41\n\x04List\x12\x1a.content.roles.ListRequest\x1a\x1b.content.roles.ListResponse\"\x00\x12@\n\x06\x44\x65lete\x12\x1c.content.roles.DeleteRequest\x1a\x16.google.protobuf.Empty\"\x00\x42\x30Z.git.perx.ru/perxis/perxis-go/proto/roles;rolesb\x06proto3'
+  ,
+  dependencies=[google_dot_protobuf_dot_empty__pb2.DESCRIPTOR,common_dot_common__pb2.DESCRIPTOR,])
+
+
+
+
+_ROLE = _descriptor.Descriptor(
+  name='Role',
+  full_name='content.roles.Role',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='id', full_name='content.roles.Role.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.roles.Role.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='content.roles.Role.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='rules', full_name='content.roles.Role.rules', 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='environments', full_name='content.roles.Role.environments', 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='allow_management', full_name='content.roles.Role.allow_management', index=5,
+      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=87,
+  serialized_end=221,
+)
+
+
+_CREATEREQUEST = _descriptor.Descriptor(
+  name='CreateRequest',
+  full_name='content.roles.CreateRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='role', full_name='content.roles.CreateRequest.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=223,
+  serialized_end=273,
+)
+
+
+_CREATERESPONSE = _descriptor.Descriptor(
+  name='CreateResponse',
+  full_name='content.roles.CreateResponse',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='created', full_name='content.roles.CreateResponse.created', 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=275,
+  serialized_end=329,
+)
+
+
+_GETREQUEST = _descriptor.Descriptor(
+  name='GetRequest',
+  full_name='content.roles.GetRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='space_id', full_name='content.roles.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='role_id', full_name='content.roles.GetRequest.role_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=331,
+  serialized_end=378,
+)
+
+
+_GETRESPONSE = _descriptor.Descriptor(
+  name='GetResponse',
+  full_name='content.roles.GetResponse',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='role', full_name='content.roles.GetResponse.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=380,
+  serialized_end=428,
+)
+
+
+_UPDATEREQUEST = _descriptor.Descriptor(
+  name='UpdateRequest',
+  full_name='content.roles.UpdateRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='role', full_name='content.roles.UpdateRequest.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=430,
+  serialized_end=480,
+)
+
+
+_LISTREQUEST = _descriptor.Descriptor(
+  name='ListRequest',
+  full_name='content.roles.ListRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='space_id', full_name='content.roles.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=482,
+  serialized_end=513,
+)
+
+
+_LISTRESPONSE = _descriptor.Descriptor(
+  name='ListResponse',
+  full_name='content.roles.ListResponse',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='roles', full_name='content.roles.ListResponse.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=515,
+  serialized_end=565,
+)
+
+
+_DELETEREQUEST = _descriptor.Descriptor(
+  name='DeleteRequest',
+  full_name='content.roles.DeleteRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='space_id', full_name='content.roles.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='role_id', full_name='content.roles.DeleteRequest.role_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=567,
+  serialized_end=617,
+)
+
+_ROLE.fields_by_name['rules'].message_type = common_dot_common__pb2._RULE
+_CREATEREQUEST.fields_by_name['role'].message_type = _ROLE
+_CREATERESPONSE.fields_by_name['created'].message_type = _ROLE
+_GETRESPONSE.fields_by_name['role'].message_type = _ROLE
+_UPDATEREQUEST.fields_by_name['role'].message_type = _ROLE
+_LISTRESPONSE.fields_by_name['roles'].message_type = _ROLE
+DESCRIPTOR.message_types_by_name['Role'] = _ROLE
+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['ListRequest'] = _LISTREQUEST
+DESCRIPTOR.message_types_by_name['ListResponse'] = _LISTRESPONSE
+DESCRIPTOR.message_types_by_name['DeleteRequest'] = _DELETEREQUEST
+_sym_db.RegisterFileDescriptor(DESCRIPTOR)
+
+Role = _reflection.GeneratedProtocolMessageType('Role', (_message.Message,), {
+  'DESCRIPTOR' : _ROLE,
+  '__module__' : 'roles.roles_pb2'
+  # @@protoc_insertion_point(class_scope:content.roles.Role)
+  })
+_sym_db.RegisterMessage(Role)
+
+CreateRequest = _reflection.GeneratedProtocolMessageType('CreateRequest', (_message.Message,), {
+  'DESCRIPTOR' : _CREATEREQUEST,
+  '__module__' : 'roles.roles_pb2'
+  # @@protoc_insertion_point(class_scope:content.roles.CreateRequest)
+  })
+_sym_db.RegisterMessage(CreateRequest)
+
+CreateResponse = _reflection.GeneratedProtocolMessageType('CreateResponse', (_message.Message,), {
+  'DESCRIPTOR' : _CREATERESPONSE,
+  '__module__' : 'roles.roles_pb2'
+  # @@protoc_insertion_point(class_scope:content.roles.CreateResponse)
+  })
+_sym_db.RegisterMessage(CreateResponse)
+
+GetRequest = _reflection.GeneratedProtocolMessageType('GetRequest', (_message.Message,), {
+  'DESCRIPTOR' : _GETREQUEST,
+  '__module__' : 'roles.roles_pb2'
+  # @@protoc_insertion_point(class_scope:content.roles.GetRequest)
+  })
+_sym_db.RegisterMessage(GetRequest)
+
+GetResponse = _reflection.GeneratedProtocolMessageType('GetResponse', (_message.Message,), {
+  'DESCRIPTOR' : _GETRESPONSE,
+  '__module__' : 'roles.roles_pb2'
+  # @@protoc_insertion_point(class_scope:content.roles.GetResponse)
+  })
+_sym_db.RegisterMessage(GetResponse)
+
+UpdateRequest = _reflection.GeneratedProtocolMessageType('UpdateRequest', (_message.Message,), {
+  'DESCRIPTOR' : _UPDATEREQUEST,
+  '__module__' : 'roles.roles_pb2'
+  # @@protoc_insertion_point(class_scope:content.roles.UpdateRequest)
+  })
+_sym_db.RegisterMessage(UpdateRequest)
+
+ListRequest = _reflection.GeneratedProtocolMessageType('ListRequest', (_message.Message,), {
+  'DESCRIPTOR' : _LISTREQUEST,
+  '__module__' : 'roles.roles_pb2'
+  # @@protoc_insertion_point(class_scope:content.roles.ListRequest)
+  })
+_sym_db.RegisterMessage(ListRequest)
+
+ListResponse = _reflection.GeneratedProtocolMessageType('ListResponse', (_message.Message,), {
+  'DESCRIPTOR' : _LISTRESPONSE,
+  '__module__' : 'roles.roles_pb2'
+  # @@protoc_insertion_point(class_scope:content.roles.ListResponse)
+  })
+_sym_db.RegisterMessage(ListResponse)
+
+DeleteRequest = _reflection.GeneratedProtocolMessageType('DeleteRequest', (_message.Message,), {
+  'DESCRIPTOR' : _DELETEREQUEST,
+  '__module__' : 'roles.roles_pb2'
+  # @@protoc_insertion_point(class_scope:content.roles.DeleteRequest)
+  })
+_sym_db.RegisterMessage(DeleteRequest)
+
+
+DESCRIPTOR._options = None
+
+_ROLES = _descriptor.ServiceDescriptor(
+  name='Roles',
+  full_name='content.roles.Roles',
+  file=DESCRIPTOR,
+  index=0,
+  serialized_options=None,
+  create_key=_descriptor._internal_create_key,
+  serialized_start=620,
+  serialized_end=963,
+  methods=[
+  _descriptor.MethodDescriptor(
+    name='Create',
+    full_name='content.roles.Roles.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.roles.Roles.Get',
+    index=1,
+    containing_service=None,
+    input_type=_GETREQUEST,
+    output_type=_GETRESPONSE,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='Update',
+    full_name='content.roles.Roles.Update',
+    index=2,
+    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='List',
+    full_name='content.roles.Roles.List',
+    index=3,
+    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.roles.Roles.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(_ROLES)
+
+DESCRIPTOR.services_by_name['Roles'] = _ROLES
+
+# @@protoc_insertion_point(module_scope)
diff --git a/perxis/roles/roles_pb2_grpc.py b/perxis/roles/roles_pb2_grpc.py
new file mode 100644
index 0000000..3fecb53
--- /dev/null
+++ b/perxis/roles/roles_pb2_grpc.py
@@ -0,0 +1,204 @@
+# 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 perxis.roles import roles_pb2 as roles_dot_roles__pb2
+
+
+class RolesStub(object):
+    """Missing associated documentation comment in .proto file."""
+
+    def __init__(self, channel):
+        """Constructor.
+
+        Args:
+            channel: A grpc.Channel.
+        """
+        self.Create = channel.unary_unary(
+                '/content.roles.Roles/Create',
+                request_serializer=roles_dot_roles__pb2.CreateRequest.SerializeToString,
+                response_deserializer=roles_dot_roles__pb2.CreateResponse.FromString,
+                )
+        self.Get = channel.unary_unary(
+                '/content.roles.Roles/Get',
+                request_serializer=roles_dot_roles__pb2.GetRequest.SerializeToString,
+                response_deserializer=roles_dot_roles__pb2.GetResponse.FromString,
+                )
+        self.Update = channel.unary_unary(
+                '/content.roles.Roles/Update',
+                request_serializer=roles_dot_roles__pb2.UpdateRequest.SerializeToString,
+                response_deserializer=google_dot_protobuf_dot_empty__pb2.Empty.FromString,
+                )
+        self.List = channel.unary_unary(
+                '/content.roles.Roles/List',
+                request_serializer=roles_dot_roles__pb2.ListRequest.SerializeToString,
+                response_deserializer=roles_dot_roles__pb2.ListResponse.FromString,
+                )
+        self.Delete = channel.unary_unary(
+                '/content.roles.Roles/Delete',
+                request_serializer=roles_dot_roles__pb2.DeleteRequest.SerializeToString,
+                response_deserializer=google_dot_protobuf_dot_empty__pb2.Empty.FromString,
+                )
+
+
+class RolesServicer(object):
+    """Missing associated documentation comment in .proto file."""
+
+    def Create(self, request, context):
+        """Create - создает роль в рамках пространства
+        """
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def Get(self, request, context):
+        """Get - возвращает роль по id
+        """
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def Update(self, request, context):
+        """Update - обновляет параметры роли
+        """
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def List(self, request, context):
+        """List - возвращает список ролей, созданных в пространстве
+        """
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def Delete(self, request, context):
+        """Delete - удаляет указанную роль из пространстве
+        """
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+
+def add_RolesServicer_to_server(servicer, server):
+    rpc_method_handlers = {
+            'Create': grpc.unary_unary_rpc_method_handler(
+                    servicer.Create,
+                    request_deserializer=roles_dot_roles__pb2.CreateRequest.FromString,
+                    response_serializer=roles_dot_roles__pb2.CreateResponse.SerializeToString,
+            ),
+            'Get': grpc.unary_unary_rpc_method_handler(
+                    servicer.Get,
+                    request_deserializer=roles_dot_roles__pb2.GetRequest.FromString,
+                    response_serializer=roles_dot_roles__pb2.GetResponse.SerializeToString,
+            ),
+            'Update': grpc.unary_unary_rpc_method_handler(
+                    servicer.Update,
+                    request_deserializer=roles_dot_roles__pb2.UpdateRequest.FromString,
+                    response_serializer=google_dot_protobuf_dot_empty__pb2.Empty.SerializeToString,
+            ),
+            'List': grpc.unary_unary_rpc_method_handler(
+                    servicer.List,
+                    request_deserializer=roles_dot_roles__pb2.ListRequest.FromString,
+                    response_serializer=roles_dot_roles__pb2.ListResponse.SerializeToString,
+            ),
+            'Delete': grpc.unary_unary_rpc_method_handler(
+                    servicer.Delete,
+                    request_deserializer=roles_dot_roles__pb2.DeleteRequest.FromString,
+                    response_serializer=google_dot_protobuf_dot_empty__pb2.Empty.SerializeToString,
+            ),
+    }
+    generic_handler = grpc.method_handlers_generic_handler(
+            'content.roles.Roles', rpc_method_handlers)
+    server.add_generic_rpc_handlers((generic_handler,))
+
+
+ # This class is part of an EXPERIMENTAL API.
+class Roles(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.roles.Roles/Create',
+            roles_dot_roles__pb2.CreateRequest.SerializeToString,
+            roles_dot_roles__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.roles.Roles/Get',
+            roles_dot_roles__pb2.GetRequest.SerializeToString,
+            roles_dot_roles__pb2.GetResponse.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.roles.Roles/Update',
+            roles_dot_roles__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 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.roles.Roles/List',
+            roles_dot_roles__pb2.ListRequest.SerializeToString,
+            roles_dot_roles__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.roles.Roles/Delete',
+            roles_dot_roles__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/spaces/spaces_pb2.py b/perxis/spaces/spaces_pb2.py
new file mode 100644
index 0000000..e565bcc
--- /dev/null
+++ b/perxis/spaces/spaces_pb2.py
@@ -0,0 +1,927 @@
+# -*- 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'Z0git.perx.ru/perxis/perxis-go/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\"\xad\x01\n\x05Space\x12\n\n\x02id\x18\x01 \x01(\t\x12\x0e\n\x06org_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\x17\n\x0ftransfer_to_org\x18\x06 \x01(\t\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\"5\n\rCreateRequest\x12$\n\x05space\x18\x01 \x01(\x0b\x32\x15.content.spaces.Space\"8\n\x0e\x43reateResponse\x12&\n\x07\x63reated\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\"5\n\rUpdateRequest\x12$\n\x05space\x18\x01 \x01(\x0b\x32\x15.content.spaces.Space\"O\n\x13UpdateConfigRequest\x12\x10\n\x08space_id\x18\x01 \x01(\t\x12&\n\x06\x63onfig\x18\x02 \x01(\x0b\x32\x16.content.spaces.Config\"!\n\rDeleteRequest\x12\x10\n\x08space_id\x18\x01 \x01(\t\"<\n\x0fTransferRequest\x12\x10\n\x08space_id\x18\x01 \x01(\t\x12\x17\n\x0ftransfer_to_org\x18\x02 \x01(\t\"(\n\x14\x41\x62ortTransferRequest\x12\x10\n\x08space_id\x18\x01 \x01(\t\"&\n\x14ListTransfersRequest\x12\x0e\n\x06org_id\x18\x01 \x01(\t\">\n\x15ListTransfersResponse\x12%\n\x06spaces\x18\x01 \x03(\x0b\x32\x15.content.spaces.Space\"/\n\x0bMoveRequest\x12\x10\n\x08space_id\x18\x01 \x01(\t\x12\x0e\n\x06org_id\x18\x02 \x01(\t*p\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\x12\t\n\x05\x45RROR\x10\x07\x32\xe6\x05\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\x12M\n\x0cUpdateConfig\x12#.content.spaces.UpdateConfigRequest\x1a\x16.google.protobuf.Empty\"\x00\x12\x41\n\x06\x44\x65lete\x12\x1d.content.spaces.DeleteRequest\x1a\x16.google.protobuf.Empty\"\x00\x12\x45\n\x08Transfer\x12\x1f.content.spaces.TransferRequest\x1a\x16.google.protobuf.Empty\"\x00\x12O\n\rAbortTransfer\x12$.content.spaces.AbortTransferRequest\x1a\x16.google.protobuf.Empty\"\x00\x12^\n\rListTransfers\x12$.content.spaces.ListTransfersRequest\x1a%.content.spaces.ListTransfersResponse\"\x00\x12=\n\x04Move\x12\x1b.content.spaces.MoveRequest\x1a\x16.google.protobuf.Empty\"\x00\x42\x32Z0git.perx.ru/perxis/perxis-go/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),
+    _descriptor.EnumValueDescriptor(
+      name='ERROR', index=7, number=7,
+      serialized_options=None,
+      type=None,
+      create_key=_descriptor._internal_create_key),
+  ],
+  containing_type=None,
+  serialized_options=None,
+  serialized_start=984,
+  serialized_end=1096,
+)
+_sym_db.RegisterEnumDescriptor(_STATE)
+
+State = enum_type_wrapper.EnumTypeWrapper(_STATE)
+UNKNOWN = 0
+NEW = 1
+READY = 2
+PREPARING = 3
+MAINTENANCE = 4
+MIGRATION = 5
+DELETING = 6
+ERROR = 7
+
+
+
+_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='org_id', full_name='content.spaces.Space.org_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='transfer_to_org', full_name='content.spaces.Space.transfer_to_org', 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='config', full_name='content.spaces.Space.config', 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=69,
+  serialized_end=242,
+)
+
+
+_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=244,
+  serialized_end=270,
+)
+
+
+_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='space', full_name='content.spaces.CreateRequest.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=272,
+  serialized_end=325,
+)
+
+
+_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='created', full_name='content.spaces.CreateResponse.created', 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=327,
+  serialized_end=383,
+)
+
+
+_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=385,
+  serialized_end=415,
+)
+
+
+_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=417,
+  serialized_end=468,
+)
+
+
+_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=470,
+  serialized_end=499,
+)
+
+
+_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=501,
+  serialized_end=554,
+)
+
+
+_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', full_name='content.spaces.UpdateRequest.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=556,
+  serialized_end=609,
+)
+
+
+_UPDATECONFIGREQUEST = _descriptor.Descriptor(
+  name='UpdateConfigRequest',
+  full_name='content.spaces.UpdateConfigRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='space_id', full_name='content.spaces.UpdateConfigRequest.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='config', full_name='content.spaces.UpdateConfigRequest.config', 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=611,
+  serialized_end=690,
+)
+
+
+_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=692,
+  serialized_end=725,
+)
+
+
+_TRANSFERREQUEST = _descriptor.Descriptor(
+  name='TransferRequest',
+  full_name='content.spaces.TransferRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='space_id', full_name='content.spaces.TransferRequest.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='transfer_to_org', full_name='content.spaces.TransferRequest.transfer_to_org', 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=727,
+  serialized_end=787,
+)
+
+
+_ABORTTRANSFERREQUEST = _descriptor.Descriptor(
+  name='AbortTransferRequest',
+  full_name='content.spaces.AbortTransferRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='space_id', full_name='content.spaces.AbortTransferRequest.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=789,
+  serialized_end=829,
+)
+
+
+_LISTTRANSFERSREQUEST = _descriptor.Descriptor(
+  name='ListTransfersRequest',
+  full_name='content.spaces.ListTransfersRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='org_id', full_name='content.spaces.ListTransfersRequest.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=831,
+  serialized_end=869,
+)
+
+
+_LISTTRANSFERSRESPONSE = _descriptor.Descriptor(
+  name='ListTransfersResponse',
+  full_name='content.spaces.ListTransfersResponse',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='spaces', full_name='content.spaces.ListTransfersResponse.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=871,
+  serialized_end=933,
+)
+
+
+_MOVEREQUEST = _descriptor.Descriptor(
+  name='MoveRequest',
+  full_name='content.spaces.MoveRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='space_id', full_name='content.spaces.MoveRequest.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='org_id', full_name='content.spaces.MoveRequest.org_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=935,
+  serialized_end=982,
+)
+
+_SPACE.fields_by_name['state'].enum_type = _STATE
+_SPACE.fields_by_name['config'].message_type = _CONFIG
+_CREATEREQUEST.fields_by_name['space'].message_type = _SPACE
+_CREATERESPONSE.fields_by_name['created'].message_type = _SPACE
+_GETRESPONSE.fields_by_name['space'].message_type = _SPACE
+_LISTRESPONSE.fields_by_name['spaces'].message_type = _SPACE
+_UPDATEREQUEST.fields_by_name['space'].message_type = _SPACE
+_UPDATECONFIGREQUEST.fields_by_name['config'].message_type = _CONFIG
+_LISTTRANSFERSRESPONSE.fields_by_name['spaces'].message_type = _SPACE
+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['UpdateConfigRequest'] = _UPDATECONFIGREQUEST
+DESCRIPTOR.message_types_by_name['DeleteRequest'] = _DELETEREQUEST
+DESCRIPTOR.message_types_by_name['TransferRequest'] = _TRANSFERREQUEST
+DESCRIPTOR.message_types_by_name['AbortTransferRequest'] = _ABORTTRANSFERREQUEST
+DESCRIPTOR.message_types_by_name['ListTransfersRequest'] = _LISTTRANSFERSREQUEST
+DESCRIPTOR.message_types_by_name['ListTransfersResponse'] = _LISTTRANSFERSRESPONSE
+DESCRIPTOR.message_types_by_name['MoveRequest'] = _MOVEREQUEST
+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)
+
+UpdateConfigRequest = _reflection.GeneratedProtocolMessageType('UpdateConfigRequest', (_message.Message,), {
+  'DESCRIPTOR' : _UPDATECONFIGREQUEST,
+  '__module__' : 'spaces.spaces_pb2'
+  # @@protoc_insertion_point(class_scope:content.spaces.UpdateConfigRequest)
+  })
+_sym_db.RegisterMessage(UpdateConfigRequest)
+
+DeleteRequest = _reflection.GeneratedProtocolMessageType('DeleteRequest', (_message.Message,), {
+  'DESCRIPTOR' : _DELETEREQUEST,
+  '__module__' : 'spaces.spaces_pb2'
+  # @@protoc_insertion_point(class_scope:content.spaces.DeleteRequest)
+  })
+_sym_db.RegisterMessage(DeleteRequest)
+
+TransferRequest = _reflection.GeneratedProtocolMessageType('TransferRequest', (_message.Message,), {
+  'DESCRIPTOR' : _TRANSFERREQUEST,
+  '__module__' : 'spaces.spaces_pb2'
+  # @@protoc_insertion_point(class_scope:content.spaces.TransferRequest)
+  })
+_sym_db.RegisterMessage(TransferRequest)
+
+AbortTransferRequest = _reflection.GeneratedProtocolMessageType('AbortTransferRequest', (_message.Message,), {
+  'DESCRIPTOR' : _ABORTTRANSFERREQUEST,
+  '__module__' : 'spaces.spaces_pb2'
+  # @@protoc_insertion_point(class_scope:content.spaces.AbortTransferRequest)
+  })
+_sym_db.RegisterMessage(AbortTransferRequest)
+
+ListTransfersRequest = _reflection.GeneratedProtocolMessageType('ListTransfersRequest', (_message.Message,), {
+  'DESCRIPTOR' : _LISTTRANSFERSREQUEST,
+  '__module__' : 'spaces.spaces_pb2'
+  # @@protoc_insertion_point(class_scope:content.spaces.ListTransfersRequest)
+  })
+_sym_db.RegisterMessage(ListTransfersRequest)
+
+ListTransfersResponse = _reflection.GeneratedProtocolMessageType('ListTransfersResponse', (_message.Message,), {
+  'DESCRIPTOR' : _LISTTRANSFERSRESPONSE,
+  '__module__' : 'spaces.spaces_pb2'
+  # @@protoc_insertion_point(class_scope:content.spaces.ListTransfersResponse)
+  })
+_sym_db.RegisterMessage(ListTransfersResponse)
+
+MoveRequest = _reflection.GeneratedProtocolMessageType('MoveRequest', (_message.Message,), {
+  'DESCRIPTOR' : _MOVEREQUEST,
+  '__module__' : 'spaces.spaces_pb2'
+  # @@protoc_insertion_point(class_scope:content.spaces.MoveRequest)
+  })
+_sym_db.RegisterMessage(MoveRequest)
+
+
+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=1099,
+  serialized_end=1841,
+  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='UpdateConfig',
+    full_name='content.spaces.Spaces.UpdateConfig',
+    index=4,
+    containing_service=None,
+    input_type=_UPDATECONFIGREQUEST,
+    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=5,
+    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='Transfer',
+    full_name='content.spaces.Spaces.Transfer',
+    index=6,
+    containing_service=None,
+    input_type=_TRANSFERREQUEST,
+    output_type=google_dot_protobuf_dot_empty__pb2._EMPTY,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='AbortTransfer',
+    full_name='content.spaces.Spaces.AbortTransfer',
+    index=7,
+    containing_service=None,
+    input_type=_ABORTTRANSFERREQUEST,
+    output_type=google_dot_protobuf_dot_empty__pb2._EMPTY,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='ListTransfers',
+    full_name='content.spaces.Spaces.ListTransfers',
+    index=8,
+    containing_service=None,
+    input_type=_LISTTRANSFERSREQUEST,
+    output_type=_LISTTRANSFERSRESPONSE,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='Move',
+    full_name='content.spaces.Spaces.Move',
+    index=9,
+    containing_service=None,
+    input_type=_MOVEREQUEST,
+    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..25c111f
--- /dev/null
+++ b/perxis/spaces/spaces_pb2_grpc.py
@@ -0,0 +1,377 @@
+# 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 perxis.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.UpdateConfig = channel.unary_unary(
+                '/content.spaces.Spaces/UpdateConfig',
+                request_serializer=spaces_dot_spaces__pb2.UpdateConfigRequest.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,
+                )
+        self.Transfer = channel.unary_unary(
+                '/content.spaces.Spaces/Transfer',
+                request_serializer=spaces_dot_spaces__pb2.TransferRequest.SerializeToString,
+                response_deserializer=google_dot_protobuf_dot_empty__pb2.Empty.FromString,
+                )
+        self.AbortTransfer = channel.unary_unary(
+                '/content.spaces.Spaces/AbortTransfer',
+                request_serializer=spaces_dot_spaces__pb2.AbortTransferRequest.SerializeToString,
+                response_deserializer=google_dot_protobuf_dot_empty__pb2.Empty.FromString,
+                )
+        self.ListTransfers = channel.unary_unary(
+                '/content.spaces.Spaces/ListTransfers',
+                request_serializer=spaces_dot_spaces__pb2.ListTransfersRequest.SerializeToString,
+                response_deserializer=spaces_dot_spaces__pb2.ListTransfersResponse.FromString,
+                )
+        self.Move = channel.unary_unary(
+                '/content.spaces.Spaces/Move',
+                request_serializer=spaces_dot_spaces__pb2.MoveRequest.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 UpdateConfig(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 Transfer(self, request, context):
+        """Transfer устанавливает для пространства значение поля RequestedMoveTo. После этого пространство
+        будет отображаться в списке входящих запросов на перемещение в организации `orgID` (запрос ListIncoming)
+        С пространством можно продолжать работу в текущей организации, пока запрос на перемещение не будет
+        принят в целевой организации
+        Перенос может быть инициирован только владельцем организации, которой принадлежит пространство
+        """
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def AbortTransfer(self, request, context):
+        """AbortTransfer - отменить перемещение пространства в другую организацию. Может быть вызван как
+        владельцем пространства-инициатора, там и владельцем принимающего пространства
+        """
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def ListTransfers(self, request, context):
+        """ListTransfers возвращает список пространств, перемещение которых было запрошено в текущую организацию
+        """
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def Move(self, request, context):
+        """Move - перенести пространство в организацию, установленную в Space.TransferToOrg. Пространство переносится со
+        всеми входящими в него данными: ролями, участниками, контентом, пр. и более не будет доступно в
+        исходной организации.
+        В случае, если запрос осуществляется с системным уровнем доступа и передан параметр `org_id`, то перенос будет
+        осуществлен вне зависимости от того, был он инициирован через метод `Transfer` или нет
+        """
+        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,
+            ),
+            'UpdateConfig': grpc.unary_unary_rpc_method_handler(
+                    servicer.UpdateConfig,
+                    request_deserializer=spaces_dot_spaces__pb2.UpdateConfigRequest.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,
+            ),
+            'Transfer': grpc.unary_unary_rpc_method_handler(
+                    servicer.Transfer,
+                    request_deserializer=spaces_dot_spaces__pb2.TransferRequest.FromString,
+                    response_serializer=google_dot_protobuf_dot_empty__pb2.Empty.SerializeToString,
+            ),
+            'AbortTransfer': grpc.unary_unary_rpc_method_handler(
+                    servicer.AbortTransfer,
+                    request_deserializer=spaces_dot_spaces__pb2.AbortTransferRequest.FromString,
+                    response_serializer=google_dot_protobuf_dot_empty__pb2.Empty.SerializeToString,
+            ),
+            'ListTransfers': grpc.unary_unary_rpc_method_handler(
+                    servicer.ListTransfers,
+                    request_deserializer=spaces_dot_spaces__pb2.ListTransfersRequest.FromString,
+                    response_serializer=spaces_dot_spaces__pb2.ListTransfersResponse.SerializeToString,
+            ),
+            'Move': grpc.unary_unary_rpc_method_handler(
+                    servicer.Move,
+                    request_deserializer=spaces_dot_spaces__pb2.MoveRequest.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 UpdateConfig(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/UpdateConfig',
+            spaces_dot_spaces__pb2.UpdateConfigRequest.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)
+
+    @staticmethod
+    def Transfer(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/Transfer',
+            spaces_dot_spaces__pb2.TransferRequest.SerializeToString,
+            google_dot_protobuf_dot_empty__pb2.Empty.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def AbortTransfer(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/AbortTransfer',
+            spaces_dot_spaces__pb2.AbortTransferRequest.SerializeToString,
+            google_dot_protobuf_dot_empty__pb2.Empty.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def ListTransfers(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/ListTransfers',
+            spaces_dot_spaces__pb2.ListTransfersRequest.SerializeToString,
+            spaces_dot_spaces__pb2.ListTransfersResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def Move(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/Move',
+            spaces_dot_spaces__pb2.MoveRequest.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/status/status_pb2.py b/perxis/status/status_pb2.py
new file mode 100644
index 0000000..0b2feb5
--- /dev/null
+++ b/perxis/status/status_pb2.py
@@ -0,0 +1,88 @@
+# -*- coding: utf-8 -*-
+# Generated by the protocol buffer compiler.  DO NOT EDIT!
+# source: status/status.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 any_pb2 as google_dot_protobuf_dot_any__pb2
+
+
+DESCRIPTOR = _descriptor.FileDescriptor(
+  name='status/status.proto',
+  package='google.rpc',
+  syntax='proto3',
+  serialized_options=b'\n\016com.google.rpcB\013StatusProtoP\001',
+  create_key=_descriptor._internal_create_key,
+  serialized_pb=b'\n\x13status/status.proto\x12\ngoogle.rpc\x1a\x19google/protobuf/any.proto\"N\n\x06Status\x12\x0c\n\x04\x63ode\x18\x01 \x01(\x05\x12\x0f\n\x07message\x18\x02 \x01(\t\x12%\n\x07\x64\x65tails\x18\x03 \x03(\x0b\x32\x14.google.protobuf.AnyB\x1f\n\x0e\x63om.google.rpcB\x0bStatusProtoP\x01\x62\x06proto3'
+  ,
+  dependencies=[google_dot_protobuf_dot_any__pb2.DESCRIPTOR,])
+
+
+
+
+_STATUS = _descriptor.Descriptor(
+  name='Status',
+  full_name='google.rpc.Status',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='code', full_name='google.rpc.Status.code', 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='message', full_name='google.rpc.Status.message', 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='details', full_name='google.rpc.Status.details', index=2,
+      number=3, 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=62,
+  serialized_end=140,
+)
+
+_STATUS.fields_by_name['details'].message_type = google_dot_protobuf_dot_any__pb2._ANY
+DESCRIPTOR.message_types_by_name['Status'] = _STATUS
+_sym_db.RegisterFileDescriptor(DESCRIPTOR)
+
+Status = _reflection.GeneratedProtocolMessageType('Status', (_message.Message,), {
+  'DESCRIPTOR' : _STATUS,
+  '__module__' : 'status.status_pb2'
+  # @@protoc_insertion_point(class_scope:google.rpc.Status)
+  })
+_sym_db.RegisterMessage(Status)
+
+
+DESCRIPTOR._options = None
+# @@protoc_insertion_point(module_scope)
diff --git a/perxis/status/status_pb2_grpc.py b/perxis/status/status_pb2_grpc.py
new file mode 100644
index 0000000..2daafff
--- /dev/null
+++ b/perxis/status/status_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/users/users_pb2.py b/perxis/users/users_pb2.py
new file mode 100644
index 0000000..feedf64
--- /dev/null
+++ b/perxis/users/users_pb2.py
@@ -0,0 +1,708 @@
+# -*- 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 perxis.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.git.perx.ru/perxis/perxis-go/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\"4\n\rUpdateRequest\x12#\n\x06update\x18\x02 \x01(\x0b\x32\x13.account.users.User\" \n\rDeleteRequest\x12\x0f\n\x07user_id\x18\x01 \x01(\t\"(\n\x14GetByIdentityRequest\x12\x10\n\x08identity\x18\x01 \x01(\t\":\n\x15GetByIdentityResponse\x12!\n\x04user\x18\x01 \x01(\x0b\x32\x13.account.users.User2\xb5\x03\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\x12\\\n\rGetByIdentity\x12#.account.users.GetByIdentityRequest\x1a$.account.users.GetByIdentityResponse\"\x00\x42\x30Z.git.perx.ru/perxis/perxis-go/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='update', full_name='account.users.UpdateRequest.update', index=0,
+      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=915,
+)
+
+
+_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=917,
+  serialized_end=949,
+)
+
+
+_GETBYIDENTITYREQUEST = _descriptor.Descriptor(
+  name='GetByIdentityRequest',
+  full_name='account.users.GetByIdentityRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='identity', full_name='account.users.GetByIdentityRequest.identity', 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=951,
+  serialized_end=991,
+)
+
+
+_GETBYIDENTITYRESPONSE = _descriptor.Descriptor(
+  name='GetByIdentityResponse',
+  full_name='account.users.GetByIdentityResponse',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='user', full_name='account.users.GetByIdentityResponse.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=993,
+  serialized_end=1051,
+)
+
+_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
+_GETBYIDENTITYRESPONSE.fields_by_name['user'].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
+DESCRIPTOR.message_types_by_name['GetByIdentityRequest'] = _GETBYIDENTITYREQUEST
+DESCRIPTOR.message_types_by_name['GetByIdentityResponse'] = _GETBYIDENTITYRESPONSE
+_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)
+
+GetByIdentityRequest = _reflection.GeneratedProtocolMessageType('GetByIdentityRequest', (_message.Message,), {
+  'DESCRIPTOR' : _GETBYIDENTITYREQUEST,
+  '__module__' : 'users.users_pb2'
+  # @@protoc_insertion_point(class_scope:account.users.GetByIdentityRequest)
+  })
+_sym_db.RegisterMessage(GetByIdentityRequest)
+
+GetByIdentityResponse = _reflection.GeneratedProtocolMessageType('GetByIdentityResponse', (_message.Message,), {
+  'DESCRIPTOR' : _GETBYIDENTITYRESPONSE,
+  '__module__' : 'users.users_pb2'
+  # @@protoc_insertion_point(class_scope:account.users.GetByIdentityResponse)
+  })
+_sym_db.RegisterMessage(GetByIdentityResponse)
+
+
+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=1054,
+  serialized_end=1491,
+  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,
+  ),
+  _descriptor.MethodDescriptor(
+    name='GetByIdentity',
+    full_name='account.users.Users.GetByIdentity',
+    index=5,
+    containing_service=None,
+    input_type=_GETBYIDENTITYREQUEST,
+    output_type=_GETBYIDENTITYRESPONSE,
+    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..92b2fd1
--- /dev/null
+++ b/perxis/users/users_pb2_grpc.py
@@ -0,0 +1,242 @@
+# 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 perxis.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,
+                )
+        self.GetByIdentity = channel.unary_unary(
+                '/account.users.Users/GetByIdentity',
+                request_serializer=users_dot_users__pb2.GetByIdentityRequest.SerializeToString,
+                response_deserializer=users_dot_users__pb2.GetByIdentityResponse.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 GetByIdentity(self, request, context):
+        """Метод для внутреннего использования. Недоступен для внешних
+        запросов - авторизация вернет ошибку `access denied`
+        """
+        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,
+            ),
+            'GetByIdentity': grpc.unary_unary_rpc_method_handler(
+                    servicer.GetByIdentity,
+                    request_deserializer=users_dot_users__pb2.GetByIdentityRequest.FromString,
+                    response_serializer=users_dot_users__pb2.GetByIdentityResponse.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)
+
+    @staticmethod
+    def GetByIdentity(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/GetByIdentity',
+            users_dot_users__pb2.GetByIdentityRequest.SerializeToString,
+            users_dot_users__pb2.GetByIdentityResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
diff --git a/perxis/versions/account/versions_pb2.py b/perxis/versions/account/versions_pb2.py
new file mode 100644
index 0000000..1dac342
--- /dev/null
+++ b/perxis/versions/account/versions_pb2.py
@@ -0,0 +1,101 @@
+# -*- coding: utf-8 -*-
+# Generated by the protocol buffer compiler.  DO NOT EDIT!
+# source: versions/account/versions.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 perxis.common import common_pb2 as common_dot_common__pb2
+
+
+DESCRIPTOR = _descriptor.FileDescriptor(
+  name='versions/account/versions.proto',
+  package='account',
+  syntax='proto3',
+  serialized_options=b'Z;git.perx.ru/perxis/perxis-go/proto/versions/account;account',
+  create_key=_descriptor._internal_create_key,
+  serialized_pb=b'\n\x1fversions/account/versions.proto\x12\x07\x61\x63\x63ount\x1a\x1bgoogle/protobuf/empty.proto\x1a\x13\x63ommon/common.proto\"/\n\x0bGetResponse\x12 \n\x07version\x18\x01 \x01(\x0b\x32\x0f.common.Version2A\n\x08Versions\x12\x35\n\x03Get\x12\x16.google.protobuf.Empty\x1a\x14.account.GetResponse\"\x00\x42=Z;git.perx.ru/perxis/perxis-go/proto/versions/account;accountb\x06proto3'
+  ,
+  dependencies=[google_dot_protobuf_dot_empty__pb2.DESCRIPTOR,common_dot_common__pb2.DESCRIPTOR,])
+
+
+
+
+_GETRESPONSE = _descriptor.Descriptor(
+  name='GetResponse',
+  full_name='account.GetResponse',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='version', full_name='account.GetResponse.version', 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=94,
+  serialized_end=141,
+)
+
+_GETRESPONSE.fields_by_name['version'].message_type = common_dot_common__pb2._VERSION
+DESCRIPTOR.message_types_by_name['GetResponse'] = _GETRESPONSE
+_sym_db.RegisterFileDescriptor(DESCRIPTOR)
+
+GetResponse = _reflection.GeneratedProtocolMessageType('GetResponse', (_message.Message,), {
+  'DESCRIPTOR' : _GETRESPONSE,
+  '__module__' : 'versions.account.versions_pb2'
+  # @@protoc_insertion_point(class_scope:account.GetResponse)
+  })
+_sym_db.RegisterMessage(GetResponse)
+
+
+DESCRIPTOR._options = None
+
+_VERSIONS = _descriptor.ServiceDescriptor(
+  name='Versions',
+  full_name='account.Versions',
+  file=DESCRIPTOR,
+  index=0,
+  serialized_options=None,
+  create_key=_descriptor._internal_create_key,
+  serialized_start=143,
+  serialized_end=208,
+  methods=[
+  _descriptor.MethodDescriptor(
+    name='Get',
+    full_name='account.Versions.Get',
+    index=0,
+    containing_service=None,
+    input_type=google_dot_protobuf_dot_empty__pb2._EMPTY,
+    output_type=_GETRESPONSE,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+])
+_sym_db.RegisterServiceDescriptor(_VERSIONS)
+
+DESCRIPTOR.services_by_name['Versions'] = _VERSIONS
+
+# @@protoc_insertion_point(module_scope)
diff --git a/perxis/versions/account/versions_pb2_grpc.py b/perxis/versions/account/versions_pb2_grpc.py
new file mode 100644
index 0000000..106754f
--- /dev/null
+++ b/perxis/versions/account/versions_pb2_grpc.py
@@ -0,0 +1,67 @@
+# 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 perxis.versions.account import versions_pb2 as versions_dot_account_dot_versions__pb2
+
+
+class VersionsStub(object):
+    """Missing associated documentation comment in .proto file."""
+
+    def __init__(self, channel):
+        """Constructor.
+
+        Args:
+            channel: A grpc.Channel.
+        """
+        self.Get = channel.unary_unary(
+                '/account.Versions/Get',
+                request_serializer=google_dot_protobuf_dot_empty__pb2.Empty.SerializeToString,
+                response_deserializer=versions_dot_account_dot_versions__pb2.GetResponse.FromString,
+                )
+
+
+class VersionsServicer(object):
+    """Missing associated documentation comment in .proto file."""
+
+    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 add_VersionsServicer_to_server(servicer, server):
+    rpc_method_handlers = {
+            'Get': grpc.unary_unary_rpc_method_handler(
+                    servicer.Get,
+                    request_deserializer=google_dot_protobuf_dot_empty__pb2.Empty.FromString,
+                    response_serializer=versions_dot_account_dot_versions__pb2.GetResponse.SerializeToString,
+            ),
+    }
+    generic_handler = grpc.method_handlers_generic_handler(
+            'account.Versions', rpc_method_handlers)
+    server.add_generic_rpc_handlers((generic_handler,))
+
+
+ # This class is part of an EXPERIMENTAL API.
+class Versions(object):
+    """Missing associated documentation comment in .proto file."""
+
+    @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.Versions/Get',
+            google_dot_protobuf_dot_empty__pb2.Empty.SerializeToString,
+            versions_dot_account_dot_versions__pb2.GetResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
diff --git a/perxis/versions/content/versions_pb2.py b/perxis/versions/content/versions_pb2.py
new file mode 100644
index 0000000..d106ee4
--- /dev/null
+++ b/perxis/versions/content/versions_pb2.py
@@ -0,0 +1,101 @@
+# -*- coding: utf-8 -*-
+# Generated by the protocol buffer compiler.  DO NOT EDIT!
+# source: versions/content/versions.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 perxis.common import common_pb2 as common_dot_common__pb2
+
+
+DESCRIPTOR = _descriptor.FileDescriptor(
+  name='versions/content/versions.proto',
+  package='content',
+  syntax='proto3',
+  serialized_options=b'Z;git.perx.ru/perxis/perxis-go/proto/versions/content;content',
+  create_key=_descriptor._internal_create_key,
+  serialized_pb=b'\n\x1fversions/content/versions.proto\x12\x07\x63ontent\x1a\x1bgoogle/protobuf/empty.proto\x1a\x13\x63ommon/common.proto\"/\n\x0bGetResponse\x12 \n\x07version\x18\x01 \x01(\x0b\x32\x0f.common.Version2A\n\x08Versions\x12\x35\n\x03Get\x12\x16.google.protobuf.Empty\x1a\x14.content.GetResponse\"\x00\x42=Z;git.perx.ru/perxis/perxis-go/proto/versions/content;contentb\x06proto3'
+  ,
+  dependencies=[google_dot_protobuf_dot_empty__pb2.DESCRIPTOR,common_dot_common__pb2.DESCRIPTOR,])
+
+
+
+
+_GETRESPONSE = _descriptor.Descriptor(
+  name='GetResponse',
+  full_name='content.GetResponse',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='version', full_name='content.GetResponse.version', 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=94,
+  serialized_end=141,
+)
+
+_GETRESPONSE.fields_by_name['version'].message_type = common_dot_common__pb2._VERSION
+DESCRIPTOR.message_types_by_name['GetResponse'] = _GETRESPONSE
+_sym_db.RegisterFileDescriptor(DESCRIPTOR)
+
+GetResponse = _reflection.GeneratedProtocolMessageType('GetResponse', (_message.Message,), {
+  'DESCRIPTOR' : _GETRESPONSE,
+  '__module__' : 'versions.content.versions_pb2'
+  # @@protoc_insertion_point(class_scope:content.GetResponse)
+  })
+_sym_db.RegisterMessage(GetResponse)
+
+
+DESCRIPTOR._options = None
+
+_VERSIONS = _descriptor.ServiceDescriptor(
+  name='Versions',
+  full_name='content.Versions',
+  file=DESCRIPTOR,
+  index=0,
+  serialized_options=None,
+  create_key=_descriptor._internal_create_key,
+  serialized_start=143,
+  serialized_end=208,
+  methods=[
+  _descriptor.MethodDescriptor(
+    name='Get',
+    full_name='content.Versions.Get',
+    index=0,
+    containing_service=None,
+    input_type=google_dot_protobuf_dot_empty__pb2._EMPTY,
+    output_type=_GETRESPONSE,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+])
+_sym_db.RegisterServiceDescriptor(_VERSIONS)
+
+DESCRIPTOR.services_by_name['Versions'] = _VERSIONS
+
+# @@protoc_insertion_point(module_scope)
diff --git a/perxis/versions/content/versions_pb2_grpc.py b/perxis/versions/content/versions_pb2_grpc.py
new file mode 100644
index 0000000..ed585d8
--- /dev/null
+++ b/perxis/versions/content/versions_pb2_grpc.py
@@ -0,0 +1,67 @@
+# 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 perxis.versions.content import versions_pb2 as versions_dot_content_dot_versions__pb2
+
+
+class VersionsStub(object):
+    """Missing associated documentation comment in .proto file."""
+
+    def __init__(self, channel):
+        """Constructor.
+
+        Args:
+            channel: A grpc.Channel.
+        """
+        self.Get = channel.unary_unary(
+                '/content.Versions/Get',
+                request_serializer=google_dot_protobuf_dot_empty__pb2.Empty.SerializeToString,
+                response_deserializer=versions_dot_content_dot_versions__pb2.GetResponse.FromString,
+                )
+
+
+class VersionsServicer(object):
+    """Missing associated documentation comment in .proto file."""
+
+    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 add_VersionsServicer_to_server(servicer, server):
+    rpc_method_handlers = {
+            'Get': grpc.unary_unary_rpc_method_handler(
+                    servicer.Get,
+                    request_deserializer=google_dot_protobuf_dot_empty__pb2.Empty.FromString,
+                    response_serializer=versions_dot_content_dot_versions__pb2.GetResponse.SerializeToString,
+            ),
+    }
+    generic_handler = grpc.method_handlers_generic_handler(
+            'content.Versions', rpc_method_handlers)
+    server.add_generic_rpc_handlers((generic_handler,))
+
+
+ # This class is part of an EXPERIMENTAL API.
+class Versions(object):
+    """Missing associated documentation comment in .proto file."""
+
+    @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.Versions/Get',
+            google_dot_protobuf_dot_empty__pb2.Empty.SerializeToString,
+            versions_dot_content_dot_versions__pb2.GetResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
-- 
GitLab