diff --git a/perxis/clients/clients_pb2.py b/perxis/clients/clients_pb2.py
index feeee17fdbb010a9ec0da7d11672893e338b8787..620bfe5a1c104d22363bec532e3941de289db9e6 100644
--- a/perxis/clients/clients_pb2.py
+++ b/perxis/clients/clients_pb2.py
@@ -12,111 +12,217 @@ _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 perxis_dot_common_dot_common__pb2
 
 
 DESCRIPTOR = _descriptor.FileDescriptor(
   name='perxis/clients/clients.proto',
   package='content.clients',
   syntax='proto3',
-  serialized_options=b'Z0github.com/perxteam/perxis/proto/clients;clients',
+  serialized_options=b'Z/git.perx.ru/perxis/perxis/proto/clients;clients',
   create_key=_descriptor._internal_create_key,
-  serialized_pb=b'\n\x1cperxis/clients/clients.proto\x12\x0f\x63ontent.clients\x1a\x1bgoogle/protobuf/empty.proto\x1a\x1aperxis/common/common.proto\"\xee\x01\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\x11\n\tclient_id\x18\x04 \x01(\t\x12\x0f\n\x07\x61uth_id\x18\x05 \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\x14\n\x0c\x65nvironments\x18\x08 \x03(\t\x12\x1b\n\x05rules\x18\t \x03(\x0b\x32\x0c.common.Rule\x12\x11\n\ttoken_url\x18\n \x01(\t\x12\x15\n\rclient_secret\x18\x0b \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\"L\n\x14GetByClientIDRequest\x12\x10\n\x08space_id\x18\x01 \x01(\t\x12\x11\n\tclient_id\x18\x02 \x01(\t\x12\x0f\n\x07\x61uth_id\x18\x03 \x01(\t\"@\n\x15GetByClientIDResponse\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\x8f\x04\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\x12`\n\rGetByClientID\x12%.content.clients.GetByClientIDRequest\x1a&.content.clients.GetByClientIDResponse\"\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\x32Z0github.com/perxteam/perxis/proto/clients;clientsb\x06proto3'
+  serialized_pb=b'\n\x1cperxis/clients/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\x31Z/git.perx.ru/perxis/perxis/proto/clients;clientsb\x06proto3'
   ,
-  dependencies=[google_dot_protobuf_dot_empty__pb2.DESCRIPTOR,perxis_dot_common_dot_common__pb2.DESCRIPTOR,])
+  dependencies=[google_dot_protobuf_dot_empty__pb2.DESCRIPTOR,])
 
 
 
 
-_CLIENT = _descriptor.Descriptor(
-  name='Client',
-  full_name='content.clients.Client',
+_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='id', full_name='content.clients.Client.id', index=0,
+      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=331,
+  serialized_end=416,
+)
+
+_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='space_id', full_name='content.clients.Client.space_id', index=1,
-      number=2, type=9, cpp_type=9, label=1,
+      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=418,
+  serialized_end=455,
+)
+
+_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=457,
+  serialized_end=479,
+)
+
+_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='name', full_name='content.clients.Client.name', index=2,
-      number=3, type=9, cpp_type=9, label=1,
+      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='client_id', full_name='content.clients.Client.client_id', index=3,
-      number=4, type=9, cpp_type=9, label=1,
+      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='auth_id', full_name='content.clients.Client.auth_id', index=4,
-      number=5, type=9, cpp_type=9, label=1,
+      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=5,
+      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=6,
+      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='environments', full_name='content.clients.Client.environments', index=7,
-      number=8, type=9, cpp_type=9, label=3,
-      has_default_value=False, default_value=[],
+      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='rules', full_name='content.clients.Client.rules', index=8,
-      number=9, type=11, cpp_type=10, label=3,
-      has_default_value=False, default_value=[],
+      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='token_url', full_name='content.clients.Client.token_url', index=9,
-      number=10, type=9, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"".decode('utf-8'),
+      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='client_secret', full_name='content.clients.Client.client_secret', index=10,
-      number=11, type=9, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"".decode('utf-8'),
+      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=[],
+  nested_types=[_CLIENT_OAUTH, _CLIENT_APIKEY, _CLIENT_TLS, ],
   enum_types=[
   ],
   serialized_options=None,
@@ -130,8 +236,8 @@ _CLIENT = _descriptor.Descriptor(
       create_key=_descriptor._internal_create_key,
     fields=[]),
   ],
-  serialized_start=107,
-  serialized_end=345,
+  serialized_start=79,
+  serialized_end=492,
 )
 
 
@@ -162,8 +268,8 @@ _CREATEREQUEST = _descriptor.Descriptor(
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=347,
-  serialized_end=403,
+  serialized_start=494,
+  serialized_end=550,
 )
 
 
@@ -194,8 +300,8 @@ _CREATERESPONSE = _descriptor.Descriptor(
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=405,
-  serialized_end=463,
+  serialized_start=552,
+  serialized_end=610,
 )
 
 
@@ -233,8 +339,8 @@ _GETREQUEST = _descriptor.Descriptor(
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=465,
-  serialized_end=507,
+  serialized_start=612,
+  serialized_end=654,
 )
 
 
@@ -265,40 +371,47 @@ _GETRESPONSE = _descriptor.Descriptor(
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=509,
-  serialized_end=563,
+  serialized_start=656,
+  serialized_end=710,
 )
 
 
-_GETBYCLIENTIDREQUEST = _descriptor.Descriptor(
-  name='GetByClientIDRequest',
-  full_name='content.clients.GetByClientIDRequest',
+_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.GetByClientIDRequest.space_id', index=0,
+      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='client_id', full_name='content.clients.GetByClientIDRequest.client_id', index=1,
+      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='auth_id', full_name='content.clients.GetByClientIDRequest.auth_id', index=2,
+      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=[
   ],
@@ -311,21 +424,21 @@ _GETBYCLIENTIDREQUEST = _descriptor.Descriptor(
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=565,
-  serialized_end=641,
+  serialized_start=712,
+  serialized_end=807,
 )
 
 
-_GETBYCLIENTIDRESPONSE = _descriptor.Descriptor(
-  name='GetByClientIDResponse',
-  full_name='content.clients.GetByClientIDResponse',
+_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.GetByClientIDResponse.client', index=0,
+      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,
@@ -343,8 +456,8 @@ _GETBYCLIENTIDRESPONSE = _descriptor.Descriptor(
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=643,
-  serialized_end=707,
+  serialized_start=809,
+  serialized_end=865,
 )
 
 
@@ -375,8 +488,8 @@ _UPDATEREQUEST = _descriptor.Descriptor(
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=709,
-  serialized_end=765,
+  serialized_start=867,
+  serialized_end=923,
 )
 
 
@@ -407,8 +520,8 @@ _LISTREQUEST = _descriptor.Descriptor(
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=767,
-  serialized_end=798,
+  serialized_start=925,
+  serialized_end=956,
 )
 
 
@@ -439,8 +552,8 @@ _LISTRESPONSE = _descriptor.Descriptor(
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=800,
-  serialized_end=856,
+  serialized_start=958,
+  serialized_end=1014,
 )
 
 
@@ -478,8 +591,8 @@ _DELETEREQUEST = _descriptor.Descriptor(
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=858,
-  serialized_end=903,
+  serialized_start=1016,
+  serialized_end=1061,
 )
 
 
@@ -524,18 +637,23 @@ _ENABLEREQUEST = _descriptor.Descriptor(
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=905,
-  serialized_end=966,
+  serialized_start=1063,
+  serialized_end=1124,
 )
 
-_CLIENT.fields_by_name['rules'].message_type = perxis_dot_common_dot_common__pb2._RULE
+_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
-_GETBYCLIENTIDRESPONSE.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
@@ -543,8 +661,8 @@ 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['GetByClientIDRequest'] = _GETBYCLIENTIDREQUEST
-DESCRIPTOR.message_types_by_name['GetByClientIDResponse'] = _GETBYCLIENTIDRESPONSE
+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
@@ -553,11 +671,35 @@ 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__' : 'perxis.clients.clients_pb2'
+    # @@protoc_insertion_point(class_scope:content.clients.Client.OAuth)
+    })
+  ,
+
+  'APIKey' : _reflection.GeneratedProtocolMessageType('APIKey', (_message.Message,), {
+    'DESCRIPTOR' : _CLIENT_APIKEY,
+    '__module__' : 'perxis.clients.clients_pb2'
+    # @@protoc_insertion_point(class_scope:content.clients.Client.APIKey)
+    })
+  ,
+
+  'TLS' : _reflection.GeneratedProtocolMessageType('TLS', (_message.Message,), {
+    'DESCRIPTOR' : _CLIENT_TLS,
+    '__module__' : 'perxis.clients.clients_pb2'
+    # @@protoc_insertion_point(class_scope:content.clients.Client.TLS)
+    })
+  ,
   'DESCRIPTOR' : _CLIENT,
   '__module__' : 'perxis.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,
@@ -587,19 +729,19 @@ GetResponse = _reflection.GeneratedProtocolMessageType('GetResponse', (_message.
   })
 _sym_db.RegisterMessage(GetResponse)
 
-GetByClientIDRequest = _reflection.GeneratedProtocolMessageType('GetByClientIDRequest', (_message.Message,), {
-  'DESCRIPTOR' : _GETBYCLIENTIDREQUEST,
+GetByRequest = _reflection.GeneratedProtocolMessageType('GetByRequest', (_message.Message,), {
+  'DESCRIPTOR' : _GETBYREQUEST,
   '__module__' : 'perxis.clients.clients_pb2'
-  # @@protoc_insertion_point(class_scope:content.clients.GetByClientIDRequest)
+  # @@protoc_insertion_point(class_scope:content.clients.GetByRequest)
   })
-_sym_db.RegisterMessage(GetByClientIDRequest)
+_sym_db.RegisterMessage(GetByRequest)
 
-GetByClientIDResponse = _reflection.GeneratedProtocolMessageType('GetByClientIDResponse', (_message.Message,), {
-  'DESCRIPTOR' : _GETBYCLIENTIDRESPONSE,
+GetByResponse = _reflection.GeneratedProtocolMessageType('GetByResponse', (_message.Message,), {
+  'DESCRIPTOR' : _GETBYRESPONSE,
   '__module__' : 'perxis.clients.clients_pb2'
-  # @@protoc_insertion_point(class_scope:content.clients.GetByClientIDResponse)
+  # @@protoc_insertion_point(class_scope:content.clients.GetByResponse)
   })
-_sym_db.RegisterMessage(GetByClientIDResponse)
+_sym_db.RegisterMessage(GetByResponse)
 
 UpdateRequest = _reflection.GeneratedProtocolMessageType('UpdateRequest', (_message.Message,), {
   'DESCRIPTOR' : _UPDATEREQUEST,
@@ -646,8 +788,8 @@ _CLIENTS = _descriptor.ServiceDescriptor(
   index=0,
   serialized_options=None,
   create_key=_descriptor._internal_create_key,
-  serialized_start=969,
-  serialized_end=1496,
+  serialized_start=1127,
+  serialized_end=1630,
   methods=[
   _descriptor.MethodDescriptor(
     name='Create',
@@ -670,12 +812,12 @@ _CLIENTS = _descriptor.ServiceDescriptor(
     create_key=_descriptor._internal_create_key,
   ),
   _descriptor.MethodDescriptor(
-    name='GetByClientID',
-    full_name='content.clients.Clients.GetByClientID',
+    name='GetBy',
+    full_name='content.clients.Clients.GetBy',
     index=2,
     containing_service=None,
-    input_type=_GETBYCLIENTIDREQUEST,
-    output_type=_GETBYCLIENTIDRESPONSE,
+    input_type=_GETBYREQUEST,
+    output_type=_GETBYRESPONSE,
     serialized_options=None,
     create_key=_descriptor._internal_create_key,
   ),
diff --git a/perxis/clients/clients_pb2_grpc.py b/perxis/clients/clients_pb2_grpc.py
index 2352efa0834b3a39952388ee9ee2d6fa1e09dd4c..58db00c51946a117757009ec3780652c9e1bcc37 100644
--- a/perxis/clients/clients_pb2_grpc.py
+++ b/perxis/clients/clients_pb2_grpc.py
@@ -25,10 +25,10 @@ class ClientsStub(object):
                 request_serializer=perxis_dot_clients_dot_clients__pb2.GetRequest.SerializeToString,
                 response_deserializer=perxis_dot_clients_dot_clients__pb2.GetResponse.FromString,
                 )
-        self.GetByClientID = channel.unary_unary(
-                '/content.clients.Clients/GetByClientID',
-                request_serializer=perxis_dot_clients_dot_clients__pb2.GetByClientIDRequest.SerializeToString,
-                response_deserializer=perxis_dot_clients_dot_clients__pb2.GetByClientIDResponse.FromString,
+        self.GetBy = channel.unary_unary(
+                '/content.clients.Clients/GetBy',
+                request_serializer=perxis_dot_clients_dot_clients__pb2.GetByRequest.SerializeToString,
+                response_deserializer=perxis_dot_clients_dot_clients__pb2.GetByResponse.FromString,
                 )
         self.Update = channel.unary_unary(
                 '/content.clients.Clients/Update',
@@ -69,7 +69,7 @@ class ClientsServicer(object):
         context.set_details('Method not implemented!')
         raise NotImplementedError('Method not implemented!')
 
-    def GetByClientID(self, request, context):
+    def GetBy(self, request, context):
         """GetByClientID - возвращает клиента по clientId системы авторизации
         """
         context.set_code(grpc.StatusCode.UNIMPLEMENTED)
@@ -117,10 +117,10 @@ def add_ClientsServicer_to_server(servicer, server):
                     request_deserializer=perxis_dot_clients_dot_clients__pb2.GetRequest.FromString,
                     response_serializer=perxis_dot_clients_dot_clients__pb2.GetResponse.SerializeToString,
             ),
-            'GetByClientID': grpc.unary_unary_rpc_method_handler(
-                    servicer.GetByClientID,
-                    request_deserializer=perxis_dot_clients_dot_clients__pb2.GetByClientIDRequest.FromString,
-                    response_serializer=perxis_dot_clients_dot_clients__pb2.GetByClientIDResponse.SerializeToString,
+            'GetBy': grpc.unary_unary_rpc_method_handler(
+                    servicer.GetBy,
+                    request_deserializer=perxis_dot_clients_dot_clients__pb2.GetByRequest.FromString,
+                    response_serializer=perxis_dot_clients_dot_clients__pb2.GetByResponse.SerializeToString,
             ),
             'Update': grpc.unary_unary_rpc_method_handler(
                     servicer.Update,
@@ -187,7 +187,7 @@ class Clients(object):
             insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
 
     @staticmethod
-    def GetByClientID(request,
+    def GetBy(request,
             target,
             options=(),
             channel_credentials=None,
@@ -197,9 +197,9 @@ class Clients(object):
             wait_for_ready=None,
             timeout=None,
             metadata=None):
-        return grpc.experimental.unary_unary(request, target, '/content.clients.Clients/GetByClientID',
-            perxis_dot_clients_dot_clients__pb2.GetByClientIDRequest.SerializeToString,
-            perxis_dot_clients_dot_clients__pb2.GetByClientIDResponse.FromString,
+        return grpc.experimental.unary_unary(request, target, '/content.clients.Clients/GetBy',
+            perxis_dot_clients_dot_clients__pb2.GetByRequest.SerializeToString,
+            perxis_dot_clients_dot_clients__pb2.GetByResponse.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
index e7e5e9e4c02da4a88a2bbdfe4f0759dd3d48fa9b..d59d84135d9ed9fcf0f295aeb28bf352dc8bdab2 100644
--- a/perxis/collaborators/collaborators_pb2.py
+++ b/perxis/collaborators/collaborators_pb2.py
@@ -19,9 +19,9 @@ DESCRIPTOR = _descriptor.FileDescriptor(
   name='perxis/collaborators/collaborators.proto',
   package='content.collaborators',
   syntax='proto3',
-  serialized_options=b'Z<github.com/perxteam/perxis/proto/collaborators;collaborators',
+  serialized_options=b'Z;git.perx.ru/perxis/perxis/proto/collaborators;collaborators',
   create_key=_descriptor._internal_create_key,
-  serialized_pb=b'\n(perxis/collaborators/collaborators.proto\x12\x15\x63ontent.collaborators\x1a\x1bgoogle/protobuf/empty.proto\x1a\x1aperxis/common/common.proto\"=\n\nSetRequest\x12\x10\n\x08space_id\x18\x01 \x01(\t\x12\x0f\n\x07user_id\x18\x02 \x01(\t\x12\x0c\n\x04role\x18\x03 \x01(\t\"/\n\nGetRequest\x12\x10\n\x08space_id\x18\x01 \x01(\t\x12\x0f\n\x07user_id\x18\x02 \x01(\t\"\x1b\n\x0bGetResponse\x12\x0c\n\x04role\x18\x03 \x01(\t\"2\n\rRemoveRequest\x12\x10\n\x08space_id\x18\x01 \x01(\t\x12\x0f\n\x07user_id\x18\x02 \x01(\t\",\n\x18ListCollaboratorsRequest\x12\x10\n\x08space_id\x18\x01 \x01(\t\"H\n\x19ListCollaboratorsResponse\x12+\n\rcollaborators\x18\x01 \x03(\x0b\x32\x14.common.Collaborator\"$\n\x11ListSpacesRequest\x12\x0f\n\x07user_id\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<github.com/perxteam/perxis/proto/collaborators;collaboratorsb\x06proto3'
+  serialized_pb=b'\n(perxis/collaborators/collaborators.proto\x12\x15\x63ontent.collaborators\x1a\x1bgoogle/protobuf/empty.proto\x1a\x1aperxis/common/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/proto/collaborators;collaboratorsb\x06proto3'
   ,
   dependencies=[google_dot_protobuf_dot_empty__pb2.DESCRIPTOR,perxis_dot_common_dot_common__pb2.DESCRIPTOR,])
 
@@ -44,7 +44,7 @@ _SETREQUEST = _descriptor.Descriptor(
       is_extension=False, extension_scope=None,
       serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
-      name='user_id', full_name='content.collaborators.SetRequest.user_id', index=1,
+      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,
@@ -90,7 +90,7 @@ _GETREQUEST = _descriptor.Descriptor(
       is_extension=False, extension_scope=None,
       serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
-      name='user_id', full_name='content.collaborators.GetRequest.user_id', index=1,
+      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,
@@ -161,7 +161,7 @@ _REMOVEREQUEST = _descriptor.Descriptor(
       is_extension=False, extension_scope=None,
       serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
-      name='user_id', full_name='content.collaborators.RemoveRequest.user_id', index=1,
+      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,
@@ -257,7 +257,7 @@ _LISTSPACESREQUEST = _descriptor.Descriptor(
   create_key=_descriptor._internal_create_key,
   fields=[
     _descriptor.FieldDescriptor(
-      name='user_id', full_name='content.collaborators.ListSpacesRequest.user_id', index=0,
+      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,
diff --git a/perxis/collections/collections_pb2.py b/perxis/collections/collections_pb2.py
index 8ac694cba79cd000db3f6ba8f8718f3f683c4cee..e208603186095f1af2b031f73cf26efc5a603bfe 100644
--- a/perxis/collections/collections_pb2.py
+++ b/perxis/collections/collections_pb2.py
@@ -20,9 +20,9 @@ DESCRIPTOR = _descriptor.FileDescriptor(
   name='perxis/collections/collections.proto',
   package='content.collections',
   syntax='proto3',
-  serialized_options=b'Z8github.com/perxteam/perxis/proto/collections;collections',
+  serialized_options=b'Z7git.perx.ru/perxis/perxis/proto/collections;collections',
   create_key=_descriptor._internal_create_key,
-  serialized_pb=b'\n$perxis/collections/collections.proto\x12\x13\x63ontent.collections\x1a\x1bgoogle/protobuf/empty.proto\x1a\x1aperxis/common/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\"\xdf\x04\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\x0e\n\x06schema\x18\x07 \x01(\t\x12\x0f\n\x07\x66\x65\x61ture\x18\x08 \x01(\t\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+\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_system\"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\"E\n\nGetRequest\x12\x10\n\x08space_id\x18\x01 \x01(\t\x12\x0e\n\x06\x65nv_id\x18\x02 \x01(\t\x12\x15\n\rcollection_id\x18\x03 \x01(\t\"B\n\x0bGetResponse\x12\x33\n\ncollection\x18\x01 \x01(\x0b\x32\x1f.content.collections.Collection\"/\n\x0bListRequest\x12\x10\n\x08space_id\x18\x01 \x01(\t\x12\x0e\n\x06\x65nv_id\x18\x02 \x01(\t\"D\n\x0cListResponse\x12\x34\n\x0b\x63ollections\x18\x01 \x03(\x0b\x32\x1f.content.collections.Collection\"D\n\rUpdateRequest\x12\x33\n\ncollection\x18\x01 \x01(\x0b\x32\x1f.content.collections.Collection\"H\n\rDeleteRequest\x12\x10\n\x08space_id\x18\x01 \x01(\t\x12\x0e\n\x06\x65nv_id\x18\x02 \x01(\t\x12\x15\n\rcollection_id\x18\x03 \x01(\t2\x8d\x03\n\x0b\x43ollections\x12S\n\x06\x43reate\x12\".content.collections.CreateRequest\x1a#.content.collections.CreateResponse\"\x00\x12J\n\x03Get\x12\x1f.content.collections.GetRequest\x1a .content.collections.GetResponse\"\x00\x12M\n\x04List\x12 .content.collections.ListRequest\x1a!.content.collections.ListResponse\"\x00\x12\x46\n\x06Update\x12\".content.collections.UpdateRequest\x1a\x16.google.protobuf.Empty\"\x00\x12\x46\n\x06\x44\x65lete\x12\".content.collections.DeleteRequest\x1a\x16.google.protobuf.Empty\"\x00\x42:Z8github.com/perxteam/perxis/proto/collections;collectionsb\x06proto3'
+  serialized_pb=b'\n$perxis/collections/collections.proto\x12\x13\x63ontent.collections\x1a\x1bgoogle/protobuf/empty.proto\x1a\x1aperxis/common/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\"\x80\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+\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\x39Z7git.perx.ru/perxis/perxis/proto/collections;collectionsb\x06proto3'
   ,
   dependencies=[google_dot_protobuf_dot_empty__pb2.DESCRIPTOR,perxis_dot_common_dot_common__pb2.DESCRIPTOR,google_dot_protobuf_dot_timestamp__pb2.DESCRIPTOR,])
 
@@ -63,8 +63,8 @@ _COLLECTION_STATE = _descriptor.EnumDescriptor(
   ],
   containing_type=None,
   serialized_options=None,
-  serialized_start=788,
-  serialized_end=854,
+  serialized_start=809,
+  serialized_end=875,
 )
 _sym_db.RegisterEnumDescriptor(_COLLECTION_STATE)
 
@@ -170,8 +170,8 @@ _COLLECTION_VIEW = _descriptor.Descriptor(
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=578,
-  serialized_end=657,
+  serialized_start=599,
+  serialized_end=678,
 )
 
 _COLLECTION_STATEINFO = _descriptor.Descriptor(
@@ -215,8 +215,8 @@ _COLLECTION_STATEINFO = _descriptor.Descriptor(
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=659,
-  serialized_end=786,
+  serialized_start=680,
+  serialized_end=807,
 )
 
 _COLLECTION = _descriptor.Descriptor(
@@ -270,35 +270,42 @@ _COLLECTION = _descriptor.Descriptor(
       is_extension=False, extension_scope=None,
       serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
-      name='schema', full_name='content.collections.Collection.schema', index=6,
+      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='feature', full_name='content.collections.Collection.feature', index=7,
-      number=8, type=9, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"".decode('utf-8'),
+      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=8,
+      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=9,
+      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='access', full_name='content.collections.Collection.access', index=10,
+      name='access', full_name='content.collections.Collection.access', index=11,
       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,
@@ -326,9 +333,14 @@ _COLLECTION = _descriptor.Descriptor(
       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=269,
-  serialized_end=876,
+  serialized_end=909,
 )
 
 
@@ -359,8 +371,8 @@ _CREATEREQUEST = _descriptor.Descriptor(
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=878,
-  serialized_end=946,
+  serialized_start=911,
+  serialized_end=979,
 )
 
 
@@ -391,8 +403,40 @@ _CREATERESPONSE = _descriptor.Descriptor(
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=948,
-  serialized_end=1014,
+  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,
 )
 
 
@@ -425,6 +469,13 @@ _GETREQUEST = _descriptor.Descriptor(
       message_type=None, enum_type=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=[
   ],
@@ -437,8 +488,8 @@ _GETREQUEST = _descriptor.Descriptor(
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=1016,
-  serialized_end=1085,
+  serialized_start=1096,
+  serialized_end=1215,
 )
 
 
@@ -469,11 +520,70 @@ _GETRESPONSE = _descriptor.Descriptor(
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=1087,
-  serialized_end=1153,
+  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',
@@ -496,10 +606,17 @@ _LISTREQUEST = _descriptor.Descriptor(
       message_type=None, enum_type=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=[],
+  nested_types=[_LISTREQUEST_FILTER, ],
   enum_types=[
   ],
   serialized_options=None,
@@ -508,8 +625,8 @@ _LISTREQUEST = _descriptor.Descriptor(
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=1155,
-  serialized_end=1202,
+  serialized_start=1286,
+  serialized_end=1499,
 )
 
 
@@ -540,8 +657,8 @@ _LISTRESPONSE = _descriptor.Descriptor(
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=1204,
-  serialized_end=1272,
+  serialized_start=1501,
+  serialized_end=1569,
 )
 
 
@@ -572,8 +689,61 @@ _UPDATEREQUEST = _descriptor.Descriptor(
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=1274,
-  serialized_end=1342,
+  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,
 )
 
 
@@ -618,8 +788,8 @@ _DELETEREQUEST = _descriptor.Descriptor(
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=1344,
-  serialized_end=1416,
+  serialized_start=1734,
+  serialized_end=1806,
 )
 
 _ACCESS.fields_by_name['actions'].enum_type = perxis_dot_common_dot_common__pb2._ACTION
@@ -637,20 +807,28 @@ _COLLECTION.fields_by_name['single'].containing_oneof = _COLLECTION.oneofs_by_na
 _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)
 
@@ -698,6 +876,13 @@ CreateResponse = _reflection.GeneratedProtocolMessageType('CreateResponse', (_me
   })
 _sym_db.RegisterMessage(CreateResponse)
 
+GetOptions = _reflection.GeneratedProtocolMessageType('GetOptions', (_message.Message,), {
+  'DESCRIPTOR' : _GETOPTIONS,
+  '__module__' : 'perxis.collections.collections_pb2'
+  # @@protoc_insertion_point(class_scope:content.collections.GetOptions)
+  })
+_sym_db.RegisterMessage(GetOptions)
+
 GetRequest = _reflection.GeneratedProtocolMessageType('GetRequest', (_message.Message,), {
   'DESCRIPTOR' : _GETREQUEST,
   '__module__' : 'perxis.collections.collections_pb2'
@@ -713,11 +898,19 @@ GetResponse = _reflection.GeneratedProtocolMessageType('GetResponse', (_message.
 _sym_db.RegisterMessage(GetResponse)
 
 ListRequest = _reflection.GeneratedProtocolMessageType('ListRequest', (_message.Message,), {
+
+  'Filter' : _reflection.GeneratedProtocolMessageType('Filter', (_message.Message,), {
+    'DESCRIPTOR' : _LISTREQUEST_FILTER,
+    '__module__' : 'perxis.collections.collections_pb2'
+    # @@protoc_insertion_point(class_scope:content.collections.ListRequest.Filter)
+    })
+  ,
   'DESCRIPTOR' : _LISTREQUEST,
   '__module__' : 'perxis.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,
@@ -733,6 +926,13 @@ UpdateRequest = _reflection.GeneratedProtocolMessageType('UpdateRequest', (_mess
   })
 _sym_db.RegisterMessage(UpdateRequest)
 
+SetSchemaRequest = _reflection.GeneratedProtocolMessageType('SetSchemaRequest', (_message.Message,), {
+  'DESCRIPTOR' : _SETSCHEMAREQUEST,
+  '__module__' : 'perxis.collections.collections_pb2'
+  # @@protoc_insertion_point(class_scope:content.collections.SetSchemaRequest)
+  })
+_sym_db.RegisterMessage(SetSchemaRequest)
+
 DeleteRequest = _reflection.GeneratedProtocolMessageType('DeleteRequest', (_message.Message,), {
   'DESCRIPTOR' : _DELETEREQUEST,
   '__module__' : 'perxis.collections.collections_pb2'
@@ -750,8 +950,8 @@ _COLLECTIONS = _descriptor.ServiceDescriptor(
   index=0,
   serialized_options=None,
   create_key=_descriptor._internal_create_key,
-  serialized_start=1419,
-  serialized_end=1816,
+  serialized_start=1809,
+  serialized_end=2284,
   methods=[
   _descriptor.MethodDescriptor(
     name='Create',
@@ -793,10 +993,20 @@ _COLLECTIONS = _descriptor.ServiceDescriptor(
     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=4,
+    index=5,
     containing_service=None,
     input_type=_DELETEREQUEST,
     output_type=google_dot_protobuf_dot_empty__pb2._EMPTY,
diff --git a/perxis/collections/collections_pb2_grpc.py b/perxis/collections/collections_pb2_grpc.py
index 7278cf3440ac797fdc3a149f4c8b56ca3ef22784..e208135eb57979bfd5c590a179ba7ee60e3c2638 100644
--- a/perxis/collections/collections_pb2_grpc.py
+++ b/perxis/collections/collections_pb2_grpc.py
@@ -35,6 +35,11 @@ class CollectionsStub(object):
                 request_serializer=perxis_dot_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=perxis_dot_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=perxis_dot_collections_dot_collections__pb2.DeleteRequest.SerializeToString,
@@ -69,6 +74,12 @@ class CollectionsServicer(object):
         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)
@@ -98,6 +109,11 @@ def add_CollectionsServicer_to_server(servicer, server):
                     request_deserializer=perxis_dot_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=perxis_dot_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=perxis_dot_collections_dot_collections__pb2.DeleteRequest.FromString,
@@ -181,6 +197,23 @@ class Collections(object):
             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',
+            perxis_dot_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,
diff --git a/perxis/common/common_pb2.py b/perxis/common/common_pb2.py
index fc7c2fec57f356a19d3f8e68f574c54c35e7a96d..b86ceeba41d1511ad8b255aea19d3f931b44db7d 100644
--- a/perxis/common/common_pb2.py
+++ b/perxis/common/common_pb2.py
@@ -19,9 +19,9 @@ DESCRIPTOR = _descriptor.FileDescriptor(
   name='perxis/common/common.proto',
   package='common',
   syntax='proto3',
-  serialized_options=b'Z.github.com/perxteam/perxis/proto/common;common',
+  serialized_options=b'Z-git.perx.ru/perxis/perxis/proto/common;common',
   create_key=_descriptor._internal_create_key,
-  serialized_pb=b'\n\x1aperxis/common/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\"@\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\"\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\x07user_id\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\x30Z.github.com/perxteam/perxis/proto/common;commonb\x06proto3'
+  serialized_pb=b'\n\x1aperxis/common/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\"@\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\"\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/Z-git.perx.ru/perxis/perxis/proto/common;commonb\x06proto3'
   ,
   dependencies=[google_dot_protobuf_dot_struct__pb2.DESCRIPTOR,])
 
@@ -637,7 +637,7 @@ _COLLABORATOR = _descriptor.Descriptor(
       is_extension=False, extension_scope=None,
       serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
-      name='user_id', full_name='common.Collaborator.user_id', index=1,
+      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,
diff --git a/perxis/delivery/delivery_pb2.py b/perxis/delivery/delivery_pb2.py
index dec91206217ff4430d3de1ffb520ca14c116dc98..9d5a5fd79886e57d283016fcd8ac48cbc0dad6bd 100644
--- a/perxis/delivery/delivery_pb2.py
+++ b/perxis/delivery/delivery_pb2.py
@@ -21,9 +21,9 @@ DESCRIPTOR = _descriptor.FileDescriptor(
   name='perxis/delivery/delivery.proto',
   package='delivery',
   syntax='proto3',
-  serialized_options=b'Z2github.com/perxteam/perxis/proto/delivery;delivery',
+  serialized_options=b'Z1git.perx.ru/perxis/perxis/proto/delivery;delivery',
   create_key=_descriptor._internal_create_key,
-  serialized_pb=b'\n\x1eperxis/delivery/delivery.proto\x12\x08\x64\x65livery\x1a\x1cperxis/locales/locales.proto\x1a&perxis/environments/environments.proto\x1a$perxis/collections/collections.proto\x1a\x18perxis/items/items.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\x32\xc4\x04\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\x42\x34Z2github.com/perxteam/perxis/proto/delivery;deliveryb\x06proto3'
+  serialized_pb=b'\n\x1eperxis/delivery/delivery.proto\x12\x08\x64\x65livery\x1a\x1cperxis/locales/locales.proto\x1a&perxis/environments/environments.proto\x1a$perxis/collections/collections.proto\x1a\x18perxis/items/items.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\x32\xc4\x04\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\x42\x33Z1git.perx.ru/perxis/perxis/proto/delivery;deliveryb\x06proto3'
   ,
   dependencies=[perxis_dot_locales_dot_locales__pb2.DESCRIPTOR,perxis_dot_environments_dot_environments__pb2.DESCRIPTOR,perxis_dot_collections_dot_collections__pb2.DESCRIPTOR,perxis_dot_items_dot_items__pb2.DESCRIPTOR,])
 
diff --git a/perxis/environments/environments_pb2.py b/perxis/environments/environments_pb2.py
index 5eebe8d85a14a1c212824e55bb93e0921bf7a24a..414b9174842da15d6a92eec6aab3d8fa6ce35ec7 100644
--- a/perxis/environments/environments_pb2.py
+++ b/perxis/environments/environments_pb2.py
@@ -18,9 +18,9 @@ DESCRIPTOR = _descriptor.FileDescriptor(
   name='perxis/environments/environments.proto',
   package='content.environments',
   syntax='proto3',
-  serialized_options=b'Z:github.com/perxteam/perxis/proto/environments;environments',
+  serialized_options=b'Z9git.perx.ru/perxis/perxis/proto/environments;environments',
   create_key=_descriptor._internal_create_key,
-  serialized_pb=b'\n&perxis/environments/environments.proto\x12\x14\x63ontent.environments\x1a\x1bgoogle/protobuf/empty.proto\"\x8f\x02\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\x36\n\x05state\x18\x04 \x01(\x0e\x32\'.content.environments.Environment.State\x12\x12\n\nstate_info\x18\x05 \x01(\t\x12\x0f\n\x07\x61liases\x18\x06 \x03(\t\x12,\n\x06\x63onfig\x18\n \x01(\x0b\x32\x1c.content.environments.Config\"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(\t2\xb6\x04\n\x0c\x45nvironments\x12U\n\x06\x43reate\x12#.content.environments.CreateRequest\x1a$.content.environments.CreateResponse\"\x00\x12L\n\x03Get\x12 .content.environments.GetRequest\x1a!.content.environments.GetResponse\"\x00\x12O\n\x04List\x12!.content.environments.ListRequest\x1a\".content.environments.ListResponse\"\x00\x12G\n\x06Update\x12#.content.environments.UpdateRequest\x1a\x16.google.protobuf.Empty\"\x00\x12K\n\x08SetAlias\x12%.content.environments.SetAliasRequest\x1a\x16.google.protobuf.Empty\"\x00\x12Q\n\x0bRemoveAlias\x12(.content.environments.RemoveAliasRequest\x1a\x16.google.protobuf.Empty\"\x00\x12G\n\x06\x44\x65lete\x12#.content.environments.DeleteRequest\x1a\x16.google.protobuf.Empty\"\x00\x42<Z:github.com/perxteam/perxis/proto/environments;environmentsb\x06proto3'
+  serialized_pb=b'\n&perxis/environments/environments.proto\x12\x14\x63ontent.environments\x1a\x1bgoogle/protobuf/empty.proto\"\x8f\x02\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\x36\n\x05state\x18\x04 \x01(\x0e\x32\'.content.environments.Environment.State\x12\x12\n\nstate_info\x18\x05 \x01(\t\x12\x0f\n\x07\x61liases\x18\x06 \x03(\t\x12,\n\x06\x63onfig\x18\n \x01(\x0b\x32\x1c.content.environments.Config\"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(\t2\xb6\x04\n\x0c\x45nvironments\x12U\n\x06\x43reate\x12#.content.environments.CreateRequest\x1a$.content.environments.CreateResponse\"\x00\x12L\n\x03Get\x12 .content.environments.GetRequest\x1a!.content.environments.GetResponse\"\x00\x12O\n\x04List\x12!.content.environments.ListRequest\x1a\".content.environments.ListResponse\"\x00\x12G\n\x06Update\x12#.content.environments.UpdateRequest\x1a\x16.google.protobuf.Empty\"\x00\x12K\n\x08SetAlias\x12%.content.environments.SetAliasRequest\x1a\x16.google.protobuf.Empty\"\x00\x12Q\n\x0bRemoveAlias\x12(.content.environments.RemoveAliasRequest\x1a\x16.google.protobuf.Empty\"\x00\x12G\n\x06\x44\x65lete\x12#.content.environments.DeleteRequest\x1a\x16.google.protobuf.Empty\"\x00\x42;Z9git.perx.ru/perxis/perxis/proto/environments;environmentsb\x06proto3'
   ,
   dependencies=[google_dot_protobuf_dot_empty__pb2.DESCRIPTOR,])
 
diff --git a/perxis/extensions/extension_pb2.py b/perxis/extensions/extension_pb2.py
new file mode 100644
index 0000000000000000000000000000000000000000..afcb18977ec0ae118feedb351f3e41df6e15b090
--- /dev/null
+++ b/perxis/extensions/extension_pb2.py
@@ -0,0 +1,1048 @@
+# -*- coding: utf-8 -*-
+# Generated by the protocol buffer compiler.  DO NOT EDIT!
+# source: perxis/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()
+
+
+
+
+DESCRIPTOR = _descriptor.FileDescriptor(
+  name='perxis/extensions/extension.proto',
+  package='extensions',
+  syntax='proto3',
+  serialized_options=b'Z5git.perx.ru/perxis/perxis/proto/extensions;extensions',
+  create_key=_descriptor._internal_create_key,
+  serialized_pb=b'\n!perxis/extensions/extension.proto\x12\nextensions\"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\"\xd9\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\"8\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\"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\"\x82\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:\n\x08metadata\x18\xf8U \x03(\x0b\x32\'.extensions.ActionRequest.MetadataEntry\x1a/\n\rMetadataEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\"\xad\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\x1a/\n\rMetadataEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\":\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\"\xc2\x02\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&\n\x04kind\x18\xbcP \x01(\x0e\x32\x17.extensions.Action.Kind\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\"b\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\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\x37Z5git.perx.ru/perxis/perxis/proto/extensions;extensionsb\x06proto3'
+)
+
+
+
+_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),
+  ],
+  containing_type=None,
+  serialized_options=None,
+  serialized_start=302,
+  serialized_end=358,
+)
+_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),
+  ],
+  containing_type=None,
+  serialized_options=None,
+  serialized_start=1429,
+  serialized_end=1487,
+)
+_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),
+  ],
+  containing_type=None,
+  serialized_options=None,
+  serialized_start=1714,
+  serialized_end=1812,
+)
+_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=49,
+  serialized_end=138,
+)
+
+
+_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=141,
+  serialized_end=358,
+)
+
+
+_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=360,
+  serialized_end=431,
+)
+
+
+_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=433,
+  serialized_end=541,
+)
+
+
+_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=543,
+  serialized_end=616,
+)
+
+
+_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=618,
+  serialized_end=706,
+)
+
+
+_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=708,
+  serialized_end=778,
+)
+
+
+_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=780,
+  serialized_end=851,
+)
+
+
+_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=853,
+  serialized_end=922,
+)
+
+
+_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=1136,
+  serialized_end=1183,
+)
+
+_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='metadata', full_name='extensions.ActionRequest.metadata', index=7,
+      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),
+  ],
+  extensions=[
+  ],
+  nested_types=[_ACTIONREQUEST_METADATAENTRY, ],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=925,
+  serialized_end=1183,
+)
+
+
+_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=1136,
+  serialized_end=1183,
+)
+
+_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),
+  ],
+  extensions=[
+  ],
+  nested_types=[_ACTIONRESPONSE_METADATAENTRY, ],
+  enum_types=[
+    _ACTIONRESPONSE_STATE,
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=1186,
+  serialized_end=1487,
+)
+
+
+_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='kind', full_name='extensions.Action.kind', 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='request', full_name='extensions.Action.request', index=5,
+      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=6,
+      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=7,
+      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=1490,
+  serialized_end=1812,
+)
+
+_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
+_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_STATE.containing_type = _ACTIONRESPONSE
+_ACTION.fields_by_name['kind'].enum_type = _ACTION_KIND
+_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__' : 'perxis.extensions.extension_pb2'
+  # @@protoc_insertion_point(class_scope:extensions.InstallRequest)
+  })
+_sym_db.RegisterMessage(InstallRequest)
+
+ExtensionRequestResult = _reflection.GeneratedProtocolMessageType('ExtensionRequestResult', (_message.Message,), {
+  'DESCRIPTOR' : _EXTENSIONREQUESTRESULT,
+  '__module__' : 'perxis.extensions.extension_pb2'
+  # @@protoc_insertion_point(class_scope:extensions.ExtensionRequestResult)
+  })
+_sym_db.RegisterMessage(ExtensionRequestResult)
+
+InstallResponse = _reflection.GeneratedProtocolMessageType('InstallResponse', (_message.Message,), {
+  'DESCRIPTOR' : _INSTALLRESPONSE,
+  '__module__' : 'perxis.extensions.extension_pb2'
+  # @@protoc_insertion_point(class_scope:extensions.InstallResponse)
+  })
+_sym_db.RegisterMessage(InstallResponse)
+
+UninstallRequest = _reflection.GeneratedProtocolMessageType('UninstallRequest', (_message.Message,), {
+  'DESCRIPTOR' : _UNINSTALLREQUEST,
+  '__module__' : 'perxis.extensions.extension_pb2'
+  # @@protoc_insertion_point(class_scope:extensions.UninstallRequest)
+  })
+_sym_db.RegisterMessage(UninstallRequest)
+
+UninstallResponse = _reflection.GeneratedProtocolMessageType('UninstallResponse', (_message.Message,), {
+  'DESCRIPTOR' : _UNINSTALLRESPONSE,
+  '__module__' : 'perxis.extensions.extension_pb2'
+  # @@protoc_insertion_point(class_scope:extensions.UninstallResponse)
+  })
+_sym_db.RegisterMessage(UninstallResponse)
+
+UpdateRequest = _reflection.GeneratedProtocolMessageType('UpdateRequest', (_message.Message,), {
+  'DESCRIPTOR' : _UPDATEREQUEST,
+  '__module__' : 'perxis.extensions.extension_pb2'
+  # @@protoc_insertion_point(class_scope:extensions.UpdateRequest)
+  })
+_sym_db.RegisterMessage(UpdateRequest)
+
+UpdateResponse = _reflection.GeneratedProtocolMessageType('UpdateResponse', (_message.Message,), {
+  'DESCRIPTOR' : _UPDATERESPONSE,
+  '__module__' : 'perxis.extensions.extension_pb2'
+  # @@protoc_insertion_point(class_scope:extensions.UpdateResponse)
+  })
+_sym_db.RegisterMessage(UpdateResponse)
+
+CheckRequest = _reflection.GeneratedProtocolMessageType('CheckRequest', (_message.Message,), {
+  'DESCRIPTOR' : _CHECKREQUEST,
+  '__module__' : 'perxis.extensions.extension_pb2'
+  # @@protoc_insertion_point(class_scope:extensions.CheckRequest)
+  })
+_sym_db.RegisterMessage(CheckRequest)
+
+CheckResponse = _reflection.GeneratedProtocolMessageType('CheckResponse', (_message.Message,), {
+  'DESCRIPTOR' : _CHECKRESPONSE,
+  '__module__' : 'perxis.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__' : 'perxis.extensions.extension_pb2'
+    # @@protoc_insertion_point(class_scope:extensions.ActionRequest.MetadataEntry)
+    })
+  ,
+  'DESCRIPTOR' : _ACTIONREQUEST,
+  '__module__' : 'perxis.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__' : 'perxis.extensions.extension_pb2'
+    # @@protoc_insertion_point(class_scope:extensions.ActionResponse.MetadataEntry)
+    })
+  ,
+  'DESCRIPTOR' : _ACTIONRESPONSE,
+  '__module__' : 'perxis.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__' : 'perxis.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=1815,
+  serialized_end=2170,
+  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 0000000000000000000000000000000000000000..e85bcb6cae928ddc729e04752c016b2431169dc4
--- /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 perxis_dot_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=perxis_dot_extensions_dot_extension__pb2.InstallRequest.SerializeToString,
+                response_deserializer=perxis_dot_extensions_dot_extension__pb2.InstallResponse.FromString,
+                )
+        self.Check = channel.unary_unary(
+                '/extensions.Extension/Check',
+                request_serializer=perxis_dot_extensions_dot_extension__pb2.CheckRequest.SerializeToString,
+                response_deserializer=perxis_dot_extensions_dot_extension__pb2.CheckResponse.FromString,
+                )
+        self.Update = channel.unary_unary(
+                '/extensions.Extension/Update',
+                request_serializer=perxis_dot_extensions_dot_extension__pb2.UpdateRequest.SerializeToString,
+                response_deserializer=perxis_dot_extensions_dot_extension__pb2.UpdateResponse.FromString,
+                )
+        self.Uninstall = channel.unary_unary(
+                '/extensions.Extension/Uninstall',
+                request_serializer=perxis_dot_extensions_dot_extension__pb2.UninstallRequest.SerializeToString,
+                response_deserializer=perxis_dot_extensions_dot_extension__pb2.UninstallResponse.FromString,
+                )
+        self.Action = channel.unary_unary(
+                '/extensions.Extension/Action',
+                request_serializer=perxis_dot_extensions_dot_extension__pb2.ActionRequest.SerializeToString,
+                response_deserializer=perxis_dot_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=perxis_dot_extensions_dot_extension__pb2.InstallRequest.FromString,
+                    response_serializer=perxis_dot_extensions_dot_extension__pb2.InstallResponse.SerializeToString,
+            ),
+            'Check': grpc.unary_unary_rpc_method_handler(
+                    servicer.Check,
+                    request_deserializer=perxis_dot_extensions_dot_extension__pb2.CheckRequest.FromString,
+                    response_serializer=perxis_dot_extensions_dot_extension__pb2.CheckResponse.SerializeToString,
+            ),
+            'Update': grpc.unary_unary_rpc_method_handler(
+                    servicer.Update,
+                    request_deserializer=perxis_dot_extensions_dot_extension__pb2.UpdateRequest.FromString,
+                    response_serializer=perxis_dot_extensions_dot_extension__pb2.UpdateResponse.SerializeToString,
+            ),
+            'Uninstall': grpc.unary_unary_rpc_method_handler(
+                    servicer.Uninstall,
+                    request_deserializer=perxis_dot_extensions_dot_extension__pb2.UninstallRequest.FromString,
+                    response_serializer=perxis_dot_extensions_dot_extension__pb2.UninstallResponse.SerializeToString,
+            ),
+            'Action': grpc.unary_unary_rpc_method_handler(
+                    servicer.Action,
+                    request_deserializer=perxis_dot_extensions_dot_extension__pb2.ActionRequest.FromString,
+                    response_serializer=perxis_dot_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',
+            perxis_dot_extensions_dot_extension__pb2.InstallRequest.SerializeToString,
+            perxis_dot_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',
+            perxis_dot_extensions_dot_extension__pb2.CheckRequest.SerializeToString,
+            perxis_dot_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',
+            perxis_dot_extensions_dot_extension__pb2.UpdateRequest.SerializeToString,
+            perxis_dot_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',
+            perxis_dot_extensions_dot_extension__pb2.UninstallRequest.SerializeToString,
+            perxis_dot_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',
+            perxis_dot_extensions_dot_extension__pb2.ActionRequest.SerializeToString,
+            perxis_dot_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 0000000000000000000000000000000000000000..bdd635c443eb92144ef58d0bbd898410aa126d25
--- /dev/null
+++ b/perxis/extensions/manager_pb2.py
@@ -0,0 +1,521 @@
+# -*- coding: utf-8 -*-
+# Generated by the protocol buffer compiler.  DO NOT EDIT!
+# source: perxis/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='perxis/extensions/manager.proto',
+  package='extensions',
+  syntax='proto3',
+  serialized_options=b'Z5git.perx.ru/perxis/perxis/proto/extensions;extensions',
+  create_key=_descriptor._internal_create_key,
+  serialized_pb=b'\n\x1fperxis/extensions/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\")\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\xd4\x01\n\x10\x45xtensionManager\x12\x65\n\x12RegisterExtensions\x12%.extensions.RegisterExtensionsRequest\x1a&.extensions.RegisterExtensionsResponse\"\x00\x12Y\n\x0eListExtensions\x12!.extensions.ListExtensionsRequest\x1a\".extensions.ListExtensionsResponse\"\x00\x42\x37Z5git.perx.ru/perxis/perxis/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=812,
+  serialized_end=874,
+)
+_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=270,
+  serialized_end=317,
+)
+
+_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=48,
+  serialized_end=317,
+)
+
+
+_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=319,
+  serialized_end=399,
+)
+
+
+_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=401,
+  serialized_end=429,
+)
+
+
+_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=431,
+  serialized_end=472,
+)
+
+
+_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=474,
+  serialized_end=547,
+)
+
+
+_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=549,
+  serialized_end=626,
+)
+
+
+_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=629,
+  serialized_end=874,
+)
+
+_EXTENSIONDESCRIPTOR_METADATAENTRY.containing_type = _EXTENSIONDESCRIPTOR
+_EXTENSIONDESCRIPTOR.fields_by_name['metadata'].message_type = _EXTENSIONDESCRIPTOR_METADATAENTRY
+_REGISTEREXTENSIONSREQUEST.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['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__' : 'perxis.extensions.manager_pb2'
+    # @@protoc_insertion_point(class_scope:extensions.ExtensionDescriptor.MetadataEntry)
+    })
+  ,
+  'DESCRIPTOR' : _EXTENSIONDESCRIPTOR,
+  '__module__' : 'perxis.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__' : 'perxis.extensions.manager_pb2'
+  # @@protoc_insertion_point(class_scope:extensions.RegisterExtensionsRequest)
+  })
+_sym_db.RegisterMessage(RegisterExtensionsRequest)
+
+RegisterExtensionsResponse = _reflection.GeneratedProtocolMessageType('RegisterExtensionsResponse', (_message.Message,), {
+  'DESCRIPTOR' : _REGISTEREXTENSIONSRESPONSE,
+  '__module__' : 'perxis.extensions.manager_pb2'
+  # @@protoc_insertion_point(class_scope:extensions.RegisterExtensionsResponse)
+  })
+_sym_db.RegisterMessage(RegisterExtensionsResponse)
+
+ListExtensionsFilter = _reflection.GeneratedProtocolMessageType('ListExtensionsFilter', (_message.Message,), {
+  'DESCRIPTOR' : _LISTEXTENSIONSFILTER,
+  '__module__' : 'perxis.extensions.manager_pb2'
+  # @@protoc_insertion_point(class_scope:extensions.ListExtensionsFilter)
+  })
+_sym_db.RegisterMessage(ListExtensionsFilter)
+
+ListExtensionsRequest = _reflection.GeneratedProtocolMessageType('ListExtensionsRequest', (_message.Message,), {
+  'DESCRIPTOR' : _LISTEXTENSIONSREQUEST,
+  '__module__' : 'perxis.extensions.manager_pb2'
+  # @@protoc_insertion_point(class_scope:extensions.ListExtensionsRequest)
+  })
+_sym_db.RegisterMessage(ListExtensionsRequest)
+
+ListExtensionsResponse = _reflection.GeneratedProtocolMessageType('ListExtensionsResponse', (_message.Message,), {
+  'DESCRIPTOR' : _LISTEXTENSIONSRESPONSE,
+  '__module__' : 'perxis.extensions.manager_pb2'
+  # @@protoc_insertion_point(class_scope:extensions.ListExtensionsResponse)
+  })
+_sym_db.RegisterMessage(ListExtensionsResponse)
+
+SpaceExtensions = _reflection.GeneratedProtocolMessageType('SpaceExtensions', (_message.Message,), {
+  'DESCRIPTOR' : _SPACEEXTENSIONS,
+  '__module__' : 'perxis.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=877,
+  serialized_end=1089,
+  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='ListExtensions',
+    full_name='extensions.ExtensionManager.ListExtensions',
+    index=1,
+    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 0000000000000000000000000000000000000000..4712a929b330f14ded89af8e8fc0eeaed727a6ca
--- /dev/null
+++ b/perxis/extensions/manager_pb2_grpc.py
@@ -0,0 +1,115 @@
+# 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 perxis_dot_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=perxis_dot_extensions_dot_manager__pb2.RegisterExtensionsRequest.SerializeToString,
+                response_deserializer=perxis_dot_extensions_dot_manager__pb2.RegisterExtensionsResponse.FromString,
+                )
+        self.ListExtensions = channel.unary_unary(
+                '/extensions.ExtensionManager/ListExtensions',
+                request_serializer=perxis_dot_extensions_dot_manager__pb2.ListExtensionsRequest.SerializeToString,
+                response_deserializer=perxis_dot_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 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=perxis_dot_extensions_dot_manager__pb2.RegisterExtensionsRequest.FromString,
+                    response_serializer=perxis_dot_extensions_dot_manager__pb2.RegisterExtensionsResponse.SerializeToString,
+            ),
+            'ListExtensions': grpc.unary_unary_rpc_method_handler(
+                    servicer.ListExtensions,
+                    request_deserializer=perxis_dot_extensions_dot_manager__pb2.ListExtensionsRequest.FromString,
+                    response_serializer=perxis_dot_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',
+            perxis_dot_extensions_dot_manager__pb2.RegisterExtensionsRequest.SerializeToString,
+            perxis_dot_extensions_dot_manager__pb2.RegisterExtensionsResponse.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',
+            perxis_dot_extensions_dot_manager__pb2.ListExtensionsRequest.SerializeToString,
+            perxis_dot_extensions_dot_manager__pb2.ListExtensionsResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
diff --git a/perxis/features/features_pb2.py b/perxis/features/features_pb2.py
deleted file mode 100644
index 21b8fefd3996ef0d413165c9592cf72700e1716c..0000000000000000000000000000000000000000
--- a/perxis/features/features_pb2.py
+++ /dev/null
@@ -1,185 +0,0 @@
-# -*- coding: utf-8 -*-
-# Generated by the protocol buffer compiler.  DO NOT EDIT!
-# source: perxis/features/features.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='perxis/features/features.proto',
-  package='content.features',
-  syntax='proto3',
-  serialized_options=b'Z2github.com/perxteam/perxis/proto/features;features',
-  create_key=_descriptor._internal_create_key,
-  serialized_pb=b'\n\x1eperxis/features/features.proto\x12\x10\x63ontent.features\"J\n\x12\x46\x65\x61tureDescription\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x10\n\x08revision\x18\x02 \x01(\t\x12\x14\n\x0c\x64\x65pendencies\x18\x03 \x03(\t\"\r\n\x0bListRequest\"J\n\x0cListResponse\x12:\n\x0c\x64\x65scriptions\x18\x01 \x03(\x0b\x32$.content.features.FeatureDescription2S\n\x08\x46\x65\x61tures\x12G\n\x04List\x12\x1d.content.features.ListRequest\x1a\x1e.content.features.ListResponse\"\x00\x42\x34Z2github.com/perxteam/perxis/proto/features;featuresb\x06proto3'
-)
-
-
-
-
-_FEATUREDESCRIPTION = _descriptor.Descriptor(
-  name='FeatureDescription',
-  full_name='content.features.FeatureDescription',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  create_key=_descriptor._internal_create_key,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='name', full_name='content.features.FeatureDescription.name', index=0,
-      number=1, type=9, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"".decode('utf-8'),
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='revision', full_name='content.features.FeatureDescription.revision', 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='dependencies', full_name='content.features.FeatureDescription.dependencies', 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=52,
-  serialized_end=126,
-)
-
-
-_LISTREQUEST = _descriptor.Descriptor(
-  name='ListRequest',
-  full_name='content.features.ListRequest',
-  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=128,
-  serialized_end=141,
-)
-
-
-_LISTRESPONSE = _descriptor.Descriptor(
-  name='ListResponse',
-  full_name='content.features.ListResponse',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  create_key=_descriptor._internal_create_key,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='descriptions', full_name='content.features.ListResponse.descriptions', 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=143,
-  serialized_end=217,
-)
-
-_LISTRESPONSE.fields_by_name['descriptions'].message_type = _FEATUREDESCRIPTION
-DESCRIPTOR.message_types_by_name['FeatureDescription'] = _FEATUREDESCRIPTION
-DESCRIPTOR.message_types_by_name['ListRequest'] = _LISTREQUEST
-DESCRIPTOR.message_types_by_name['ListResponse'] = _LISTRESPONSE
-_sym_db.RegisterFileDescriptor(DESCRIPTOR)
-
-FeatureDescription = _reflection.GeneratedProtocolMessageType('FeatureDescription', (_message.Message,), {
-  'DESCRIPTOR' : _FEATUREDESCRIPTION,
-  '__module__' : 'perxis.features.features_pb2'
-  # @@protoc_insertion_point(class_scope:content.features.FeatureDescription)
-  })
-_sym_db.RegisterMessage(FeatureDescription)
-
-ListRequest = _reflection.GeneratedProtocolMessageType('ListRequest', (_message.Message,), {
-  'DESCRIPTOR' : _LISTREQUEST,
-  '__module__' : 'perxis.features.features_pb2'
-  # @@protoc_insertion_point(class_scope:content.features.ListRequest)
-  })
-_sym_db.RegisterMessage(ListRequest)
-
-ListResponse = _reflection.GeneratedProtocolMessageType('ListResponse', (_message.Message,), {
-  'DESCRIPTOR' : _LISTRESPONSE,
-  '__module__' : 'perxis.features.features_pb2'
-  # @@protoc_insertion_point(class_scope:content.features.ListResponse)
-  })
-_sym_db.RegisterMessage(ListResponse)
-
-
-DESCRIPTOR._options = None
-
-_FEATURES = _descriptor.ServiceDescriptor(
-  name='Features',
-  full_name='content.features.Features',
-  file=DESCRIPTOR,
-  index=0,
-  serialized_options=None,
-  create_key=_descriptor._internal_create_key,
-  serialized_start=219,
-  serialized_end=302,
-  methods=[
-  _descriptor.MethodDescriptor(
-    name='List',
-    full_name='content.features.Features.List',
-    index=0,
-    containing_service=None,
-    input_type=_LISTREQUEST,
-    output_type=_LISTRESPONSE,
-    serialized_options=None,
-    create_key=_descriptor._internal_create_key,
-  ),
-])
-_sym_db.RegisterServiceDescriptor(_FEATURES)
-
-DESCRIPTOR.services_by_name['Features'] = _FEATURES
-
-# @@protoc_insertion_point(module_scope)
diff --git a/perxis/features/features_pb2_grpc.py b/perxis/features/features_pb2_grpc.py
deleted file mode 100644
index cceb7509bbb4c10f318355ae5649b5ac667884c3..0000000000000000000000000000000000000000
--- a/perxis/features/features_pb2_grpc.py
+++ /dev/null
@@ -1,67 +0,0 @@
-# Generated by the gRPC Python protocol compiler plugin. DO NOT EDIT!
-"""Client and server classes corresponding to protobuf-defined services."""
-import grpc
-
-from perxis.features import features_pb2 as perxis_dot_features_dot_features__pb2
-
-
-class FeaturesStub(object):
-    """Missing associated documentation comment in .proto file."""
-
-    def __init__(self, channel):
-        """Constructor.
-
-        Args:
-            channel: A grpc.Channel.
-        """
-        self.List = channel.unary_unary(
-                '/content.features.Features/List',
-                request_serializer=perxis_dot_features_dot_features__pb2.ListRequest.SerializeToString,
-                response_deserializer=perxis_dot_features_dot_features__pb2.ListResponse.FromString,
-                )
-
-
-class FeaturesServicer(object):
-    """Missing associated documentation comment in .proto file."""
-
-    def List(self, request, context):
-        """List получить все возможности зарегистрированные в системе
-        """
-        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
-        context.set_details('Method not implemented!')
-        raise NotImplementedError('Method not implemented!')
-
-
-def add_FeaturesServicer_to_server(servicer, server):
-    rpc_method_handlers = {
-            'List': grpc.unary_unary_rpc_method_handler(
-                    servicer.List,
-                    request_deserializer=perxis_dot_features_dot_features__pb2.ListRequest.FromString,
-                    response_serializer=perxis_dot_features_dot_features__pb2.ListResponse.SerializeToString,
-            ),
-    }
-    generic_handler = grpc.method_handlers_generic_handler(
-            'content.features.Features', rpc_method_handlers)
-    server.add_generic_rpc_handlers((generic_handler,))
-
-
- # This class is part of an EXPERIMENTAL API.
-class Features(object):
-    """Missing associated documentation comment in .proto file."""
-
-    @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.features.Features/List',
-            perxis_dot_features_dot_features__pb2.ListRequest.SerializeToString,
-            perxis_dot_features_dot_features__pb2.ListResponse.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
index c78258bbc1d09c6dcaecb89fb3e3a4c2d4e0d26d..12e0534e67a20915c90c067270450f640d610fe7 100644
--- a/perxis/files/files_pb2.py
+++ b/perxis/files/files_pb2.py
@@ -18,9 +18,9 @@ DESCRIPTOR = _descriptor.FileDescriptor(
   name='perxis/files/files.proto',
   package='files',
   syntax='proto3',
-  serialized_options=b'Z,github.com/perxteam/perxis/proto/files;files',
+  serialized_options=b'Z+git.perx.ru/perxis/perxis/proto/files;files',
   create_key=_descriptor._internal_create_key,
-  serialized_pb=b'\n\x18perxis/files/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.Z,github.com/perxteam/perxis/proto/files;filesb\x06proto3'
+  serialized_pb=b'\n\x18perxis/files/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-Z+git.perx.ru/perxis/perxis/proto/files;filesb\x06proto3'
   ,
   dependencies=[google_dot_protobuf_dot_empty__pb2.DESCRIPTOR,])
 
diff --git a/perxis/files/files_pb2_grpc.py b/perxis/files/files_pb2_grpc.py
index 1f2b109bd8f136b101e71fdf569db83e2a4fd642..5cd54578939420d5166c3db359b19c26beb2449f 100644
--- a/perxis/files/files_pb2_grpc.py
+++ b/perxis/files/files_pb2_grpc.py
@@ -58,6 +58,9 @@ class FilesServicer(object):
     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!')
@@ -65,6 +68,8 @@ class FilesServicer(object):
 
     def CompleteUpload(self, request, context):
         """CompleteUpload - завершает процедуру загрузку файла
+        Предполагается, что в объекте, полученном из `StartUpload`, клиент должен заполнить поле
+        Parts (идентификаторами загруженных блоков (S3 ETAGs)) и передать его в `CompleteUpload`
         """
         context.set_code(grpc.StatusCode.UNIMPLEMENTED)
         context.set_details('Method not implemented!')
diff --git a/perxis/images/images_pb2.py b/perxis/images/images_pb2.py
index 032522c1314558bb61b3859003ddee94664bbf10..818e36580f7af9a2a0db784b10fcac36025f0b0f 100644
--- a/perxis/images/images_pb2.py
+++ b/perxis/images/images_pb2.py
@@ -18,9 +18,9 @@ DESCRIPTOR = _descriptor.FileDescriptor(
   name='perxis/images/images.proto',
   package='images',
   syntax='proto3',
-  serialized_options=b'Z.github.com/perxteam/perxis/proto/images;images',
+  serialized_options=b'Z-git.perx.ru/perxis/perxis/proto/images;images',
   create_key=_descriptor._internal_create_key,
-  serialized_pb=b'\n\x1aperxis/images/images.proto\x12\x06images\x1a\x18perxis/files/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\x30Z.github.com/perxteam/perxis/proto/images;imagesb\x06proto3'
+  serialized_pb=b'\n\x1aperxis/images/images.proto\x12\x06images\x1a\x18perxis/files/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/Z-git.perx.ru/perxis/perxis/proto/images;imagesb\x06proto3'
   ,
   dependencies=[perxis_dot_files_dot_files__pb2.DESCRIPTOR,])
 
diff --git a/perxis/invitations/invitations_pb2.py b/perxis/invitations/invitations_pb2.py
index dde31a1b7bf77d31416b1e37add4c0823339116c..edde048bb102b18d453df3d59d1bf3fef2547c1e 100644
--- a/perxis/invitations/invitations_pb2.py
+++ b/perxis/invitations/invitations_pb2.py
@@ -20,9 +20,9 @@ DESCRIPTOR = _descriptor.FileDescriptor(
   name='perxis/invitations/invitations.proto',
   package='content.invitations',
   syntax='proto3',
-  serialized_options=b'Z8github.com/perxteam/perxis/proto/invitations;invitations',
+  serialized_options=b'Z7git.perx.ru/perxis/perxis/proto/invitations;invitations',
   create_key=_descriptor._internal_create_key,
-  serialized_pb=b'\n$perxis/invitations/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:Z8github.com/perxteam/perxis/proto/invitations;invitationsb\x06proto3'
+  serialized_pb=b'\n$perxis/invitations/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\x39Z7git.perx.ru/perxis/perxis/proto/invitations;invitationsb\x06proto3'
   ,
   dependencies=[google_dot_protobuf_dot_timestamp__pb2.DESCRIPTOR,google_dot_protobuf_dot_empty__pb2.DESCRIPTOR,google_dot_protobuf_dot_wrappers__pb2.DESCRIPTOR,])
 
diff --git a/perxis/items/items_pb2.py b/perxis/items/items_pb2.py
index 59ec728cc96c602b775e29f02de8348206f59ba4..76d11a606111987e4b9164b9dba707a2cb47c6a3 100644
--- a/perxis/items/items_pb2.py
+++ b/perxis/items/items_pb2.py
@@ -21,9 +21,9 @@ DESCRIPTOR = _descriptor.FileDescriptor(
   name='perxis/items/items.proto',
   package='content.items',
   syntax='proto3',
-  serialized_options=b'Z,github.com/perxteam/perxis/proto/items;items',
+  serialized_options=b'Z+git.perx.ru/perxis/perxis/proto/items;items',
   create_key=_descriptor._internal_create_key,
-  serialized_pb=b'\n\x18perxis/items/items.proto\x12\rcontent.items\x1a\x1bgoogle/protobuf/empty.proto\x1a\x1aperxis/common/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\"\xd4\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\x30\n\x0cpublished_at\x18\x0e \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x14\n\x0cpublished_by\x18\x0f \x01(\t\x12/\n\x0b\x61rchived_at\x18\x10 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x13\n\x0b\x61rchived_by\x18\x11 \x01(\t\x12\x0e\n\x06locale\x18\x12 \x01(\t\x1aL\n\x11TranslationsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12&\n\x05value\x18\x02 \x01(\x0b\x32\x17.google.protobuf.Struct:\x02\x38\x01\"<\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\"=\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\"3\n\x0b\x46indOptions\x12$\n\x07options\x18\x02 \x01(\x0b\x32\x13.common.FindOptions\"(\n\x13GetPublishedOptions\x12\x11\n\tlocale_id\x18\x01 \x01(\t\"O\n\x14\x46indPublishedOptions\x12$\n\x07options\x18\x02 \x01(\x0b\x32\x13.common.FindOptions\x12\x11\n\tlocale_id\x18\x03 \x01(\t\";\n\x13\x46indArchivedOptions\x12$\n\x07options\x18\x02 \x01(\x0b\x32\x13.common.FindOptions\"2\n\rCreateRequest\x12!\n\x04item\x18\x01 \x01(\x0b\x32\x13.content.items.Item\"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\"2\n\rUpdateRequest\x12!\n\x04item\x18\x01 \x01(\x0b\x32\x13.content.items.Item\"Y\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(\t\x12\x0f\n\x07item_id\x18\x04 \x01(\t\"3\n\x0ePublishRequest\x12!\n\x04item\x18\x01 \x01(\x0b\x32\x13.content.items.Item\"\\\n\x10UnpublishRequest\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\"\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\"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\"`\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\";\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\"\\\n\x10UnarchiveRequest\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\"\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\x8e\t\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\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\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.Z,github.com/perxteam/perxis/proto/items;itemsb\x06proto3'
+  serialized_pb=b'\n\x18perxis/items/items.proto\x12\rcontent.items\x1a\x1bgoogle/protobuf/empty.proto\x1a\x1aperxis/common/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\"\xd4\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\x30\n\x0cpublished_at\x18\x0e \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x14\n\x0cpublished_by\x18\x0f \x01(\t\x12/\n\x0b\x61rchived_at\x18\x10 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x13\n\x0b\x61rchived_by\x18\x11 \x01(\t\x12\x0e\n\x06locale\x18\x12 \x01(\t\x1aL\n\x11TranslationsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12&\n\x05value\x18\x02 \x01(\x0b\x32\x17.google.protobuf.Struct:\x02\x38\x01\"<\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\"=\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\"3\n\x0b\x46indOptions\x12$\n\x07options\x18\x02 \x01(\x0b\x32\x13.common.FindOptions\"(\n\x13GetPublishedOptions\x12\x11\n\tlocale_id\x18\x01 \x01(\t\"O\n\x14\x46indPublishedOptions\x12$\n\x07options\x18\x02 \x01(\x0b\x32\x13.common.FindOptions\x12\x11\n\tlocale_id\x18\x03 \x01(\t\";\n\x13\x46indArchivedOptions\x12$\n\x07options\x18\x02 \x01(\x0b\x32\x13.common.FindOptions\"2\n\rCreateRequest\x12!\n\x04item\x18\x01 \x01(\x0b\x32\x13.content.items.Item\"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\"2\n\rUpdateRequest\x12!\n\x04item\x18\x01 \x01(\x0b\x32\x13.content.items.Item\"Y\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(\t\x12\x0f\n\x07item_id\x18\x04 \x01(\t\"3\n\x0ePublishRequest\x12!\n\x04item\x18\x01 \x01(\x0b\x32\x13.content.items.Item\"5\n\x10UnpublishRequest\x12!\n\x04item\x18\x01 \x01(\x0b\x32\x13.content.items.Item\"\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\"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\"`\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\";\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\x8e\t\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\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\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-Z+git.perx.ru/perxis/perxis/proto/items;itemsb\x06proto3'
   ,
   dependencies=[google_dot_protobuf_dot_empty__pb2.DESCRIPTOR,perxis_dot_common_dot_common__pb2.DESCRIPTOR,google_dot_protobuf_dot_timestamp__pb2.DESCRIPTOR,google_dot_protobuf_dot_struct__pb2.DESCRIPTOR,])
 
@@ -1023,30 +1023,9 @@ _UNPUBLISHREQUEST = _descriptor.Descriptor(
   create_key=_descriptor._internal_create_key,
   fields=[
     _descriptor.FieldDescriptor(
-      name='space_id', full_name='content.items.UnpublishRequest.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.UnpublishRequest.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.UnpublishRequest.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.UnpublishRequest.item_id', index=3,
-      number=4, type=9, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"".decode('utf-8'),
+      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),
@@ -1063,7 +1042,7 @@ _UNPUBLISHREQUEST = _descriptor.Descriptor(
   oneofs=[
   ],
   serialized_start=2264,
-  serialized_end=2356,
+  serialized_end=2317,
 )
 
 
@@ -1122,8 +1101,8 @@ _GETPUBLISHEDREQUEST = _descriptor.Descriptor(
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=2359,
-  serialized_end=2507,
+  serialized_start=2320,
+  serialized_end=2468,
 )
 
 
@@ -1154,8 +1133,8 @@ _GETPUBLISHEDRESPONSE = _descriptor.Descriptor(
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=2509,
-  serialized_end=2566,
+  serialized_start=2470,
+  serialized_end=2527,
 )
 
 
@@ -1214,8 +1193,8 @@ _FINDPUBLISHEDREQUEST = _descriptor.Descriptor(
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=2569,
-  serialized_end=2741,
+  serialized_start=2530,
+  serialized_end=2702,
 )
 
 
@@ -1253,8 +1232,8 @@ _FINDPUBLISHEDRESPONSE = _descriptor.Descriptor(
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=2743,
-  serialized_end=2817,
+  serialized_start=2704,
+  serialized_end=2778,
 )
 
 
@@ -1313,8 +1292,8 @@ _GETREVISIONREQUEST = _descriptor.Descriptor(
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=2819,
-  serialized_end=2934,
+  serialized_start=2780,
+  serialized_end=2895,
 )
 
 
@@ -1345,8 +1324,8 @@ _GETREVISIONRESPONSE = _descriptor.Descriptor(
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=2936,
-  serialized_end=2992,
+  serialized_start=2897,
+  serialized_end=2953,
 )
 
 
@@ -1398,8 +1377,8 @@ _LISTREVISIONSREQUEST = _descriptor.Descriptor(
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=2994,
-  serialized_end=3090,
+  serialized_start=2955,
+  serialized_end=3051,
 )
 
 
@@ -1430,8 +1409,8 @@ _LISTREVISIONSRESPONSE = _descriptor.Descriptor(
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=3092,
-  serialized_end=3151,
+  serialized_start=3053,
+  serialized_end=3112,
 )
 
 
@@ -1462,8 +1441,8 @@ _ARCHIVEREQUEST = _descriptor.Descriptor(
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=3153,
-  serialized_end=3204,
+  serialized_start=3114,
+  serialized_end=3165,
 )
 
 
@@ -1476,30 +1455,9 @@ _UNARCHIVEREQUEST = _descriptor.Descriptor(
   create_key=_descriptor._internal_create_key,
   fields=[
     _descriptor.FieldDescriptor(
-      name='space_id', full_name='content.items.UnarchiveRequest.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.UnarchiveRequest.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.UnarchiveRequest.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.UnarchiveRequest.item_id', index=3,
-      number=4, type=9, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"".decode('utf-8'),
+      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),
@@ -1515,8 +1473,8 @@ _UNARCHIVEREQUEST = _descriptor.Descriptor(
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=3206,
-  serialized_end=3298,
+  serialized_start=3167,
+  serialized_end=3220,
 )
 
 
@@ -1575,8 +1533,8 @@ _FINDARCHIVEDREQUEST = _descriptor.Descriptor(
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=3301,
-  serialized_end=3471,
+  serialized_start=3223,
+  serialized_end=3393,
 )
 
 
@@ -1614,8 +1572,8 @@ _FINDARCHIVEDRESPONSE = _descriptor.Descriptor(
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=3473,
-  serialized_end=3546,
+  serialized_start=3395,
+  serialized_end=3468,
 )
 
 _DECODEERROR.fields_by_name['errors'].message_type = _ERROR
@@ -1647,6 +1605,7 @@ _FINDREQUEST.fields_by_name['options'].message_type = _FINDOPTIONS
 _FINDRESPONSE.fields_by_name['items'].message_type = _ITEM
 _UPDATEREQUEST.fields_by_name['item'].message_type = _ITEM
 _PUBLISHREQUEST.fields_by_name['item'].message_type = _ITEM
+_UNPUBLISHREQUEST.fields_by_name['item'].message_type = _ITEM
 _GETPUBLISHEDREQUEST.fields_by_name['options'].message_type = _GETPUBLISHEDOPTIONS
 _GETPUBLISHEDRESPONSE.fields_by_name['item'].message_type = _ITEM
 _FINDPUBLISHEDREQUEST.fields_by_name['filter'].message_type = _FILTER
@@ -1655,6 +1614,7 @@ _FINDPUBLISHEDRESPONSE.fields_by_name['items'].message_type = _ITEM
 _GETREVISIONRESPONSE.fields_by_name['item'].message_type = _ITEM
 _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
@@ -1951,8 +1911,8 @@ _ITEMS = _descriptor.ServiceDescriptor(
   index=0,
   serialized_options=None,
   create_key=_descriptor._internal_create_key,
-  serialized_start=3549,
-  serialized_end=4715,
+  serialized_start=3471,
+  serialized_end=4637,
   methods=[
   _descriptor.MethodDescriptor(
     name='Create',
diff --git a/perxis/locales/locales_pb2.py b/perxis/locales/locales_pb2.py
index df3bca981d3ce408af1cf147fccf6f026966d189..6d2795e17b856982e917d83ec192d7e9a59bb8c1 100644
--- a/perxis/locales/locales_pb2.py
+++ b/perxis/locales/locales_pb2.py
@@ -18,9 +18,9 @@ DESCRIPTOR = _descriptor.FileDescriptor(
   name='perxis/locales/locales.proto',
   package='content.locales',
   syntax='proto3',
-  serialized_options=b'Z0github.com/perxteam/perxis/proto/locales;locales',
+  serialized_options=b'Z/git.perx.ru/perxis/perxis/proto/locales;locales',
   create_key=_descriptor._internal_create_key,
-  serialized_pb=b'\n\x1cperxis/locales/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\x32Z0github.com/perxteam/perxis/proto/locales;localesb\x06proto3'
+  serialized_pb=b'\n\x1cperxis/locales/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\x31Z/git.perx.ru/perxis/perxis/proto/locales;localesb\x06proto3'
   ,
   dependencies=[google_dot_protobuf_dot_empty__pb2.DESCRIPTOR,])
 
diff --git a/perxis/members/members_pb2.py b/perxis/members/members_pb2.py
index 1da6b281c2709a348c0a71fdd7ce0957060095b6..4c4ce1b7b68772f278a59e46ce2eec511afcd995 100644
--- a/perxis/members/members_pb2.py
+++ b/perxis/members/members_pb2.py
@@ -20,9 +20,9 @@ DESCRIPTOR = _descriptor.FileDescriptor(
   name='perxis/members/members.proto',
   package='account.members',
   syntax='proto3',
-  serialized_options=b'Z0github.com/perxteam/perxis/proto/members;members',
+  serialized_options=b'Z/git.perx.ru/perxis/perxis/proto/members;members',
   create_key=_descriptor._internal_create_key,
-  serialized_pb=b'\n\x1cperxis/members/members.proto\x12\x0f\x61\x63\x63ount.members\x1a\x1bgoogle/protobuf/empty.proto\x1a\x1aperxis/common/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*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\x32\x64\n\x08Observer\x12X\n\x11OnCollaboratorSet\x12).account.members.OnCollaboratorSetRequest\x1a\x16.google.protobuf.Empty\"\x00\x42\x32Z0github.com/perxteam/perxis/proto/members;membersb\x06proto3'
+  serialized_pb=b'\n\x1cperxis/members/members.proto\x12\x0f\x61\x63\x63ount.members\x1a\x1bgoogle/protobuf/empty.proto\x1a\x1aperxis/common/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\x31Z/git.perx.ru/perxis/perxis/proto/members;membersb\x06proto3'
   ,
   dependencies=[google_dot_protobuf_dot_empty__pb2.DESCRIPTOR,perxis_dot_common_dot_common__pb2.DESCRIPTOR,])
 
@@ -56,8 +56,8 @@ _ROLE = _descriptor.EnumDescriptor(
   ],
   containing_type=None,
   serialized_options=None,
-  serialized_start=716,
-  serialized_end=772,
+  serialized_start=770,
+  serialized_end=826,
 )
 _sym_db.RegisterEnumDescriptor(_ROLE)
 
@@ -430,6 +430,38 @@ _ONCOLLABORATORSETREQUEST = _descriptor.Descriptor(
   serialized_end=714,
 )
 
+
+_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=716,
+  serialized_end=768,
+)
+
 _MEMBER.fields_by_name['role'].enum_type = _ROLE
 _SETREQUEST.fields_by_name['role'].enum_type = _ROLE
 _GETRESPONSE.fields_by_name['role'].enum_type = _ROLE
@@ -446,6 +478,7 @@ 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)
 
@@ -519,6 +552,13 @@ OnCollaboratorSetRequest = _reflection.GeneratedProtocolMessageType('OnCollabora
   })
 _sym_db.RegisterMessage(OnCollaboratorSetRequest)
 
+OnCollaboratorSetResponse = _reflection.GeneratedProtocolMessageType('OnCollaboratorSetResponse', (_message.Message,), {
+  'DESCRIPTOR' : _ONCOLLABORATORSETRESPONSE,
+  '__module__' : 'perxis.members.members_pb2'
+  # @@protoc_insertion_point(class_scope:account.members.OnCollaboratorSetResponse)
+  })
+_sym_db.RegisterMessage(OnCollaboratorSetResponse)
+
 
 DESCRIPTOR._options = None
 
@@ -529,8 +569,8 @@ _MEMBERS = _descriptor.ServiceDescriptor(
   index=0,
   serialized_options=None,
   create_key=_descriptor._internal_create_key,
-  serialized_start=775,
-  serialized_end=1184,
+  serialized_start=829,
+  serialized_end=1238,
   methods=[
   _descriptor.MethodDescriptor(
     name='Set',
@@ -595,8 +635,8 @@ _OBSERVER = _descriptor.ServiceDescriptor(
   index=1,
   serialized_options=None,
   create_key=_descriptor._internal_create_key,
-  serialized_start=1186,
-  serialized_end=1286,
+  serialized_start=1240,
+  serialized_end=1360,
   methods=[
   _descriptor.MethodDescriptor(
     name='OnCollaboratorSet',
@@ -604,7 +644,7 @@ _OBSERVER = _descriptor.ServiceDescriptor(
     index=0,
     containing_service=None,
     input_type=_ONCOLLABORATORSETREQUEST,
-    output_type=google_dot_protobuf_dot_empty__pb2._EMPTY,
+    output_type=_ONCOLLABORATORSETRESPONSE,
     serialized_options=None,
     create_key=_descriptor._internal_create_key,
   ),
diff --git a/perxis/members/members_pb2_grpc.py b/perxis/members/members_pb2_grpc.py
index 9faf20c661cb6645bf4d02baf706f21b6a88cb03..5731286aded8468e853e768ae2c4a74ea9c77c44 100644
--- a/perxis/members/members_pb2_grpc.py
+++ b/perxis/members/members_pb2_grpc.py
@@ -211,7 +211,7 @@ class ObserverStub(object):
         self.OnCollaboratorSet = channel.unary_unary(
                 '/account.members.Observer/OnCollaboratorSet',
                 request_serializer=perxis_dot_members_dot_members__pb2.OnCollaboratorSetRequest.SerializeToString,
-                response_deserializer=google_dot_protobuf_dot_empty__pb2.Empty.FromString,
+                response_deserializer=perxis_dot_members_dot_members__pb2.OnCollaboratorSetResponse.FromString,
                 )
 
 
@@ -230,7 +230,7 @@ def add_ObserverServicer_to_server(servicer, server):
             'OnCollaboratorSet': grpc.unary_unary_rpc_method_handler(
                     servicer.OnCollaboratorSet,
                     request_deserializer=perxis_dot_members_dot_members__pb2.OnCollaboratorSetRequest.FromString,
-                    response_serializer=google_dot_protobuf_dot_empty__pb2.Empty.SerializeToString,
+                    response_serializer=perxis_dot_members_dot_members__pb2.OnCollaboratorSetResponse.SerializeToString,
             ),
     }
     generic_handler = grpc.method_handlers_generic_handler(
@@ -255,6 +255,6 @@ class Observer(object):
             metadata=None):
         return grpc.experimental.unary_unary(request, target, '/account.members.Observer/OnCollaboratorSet',
             perxis_dot_members_dot_members__pb2.OnCollaboratorSetRequest.SerializeToString,
-            google_dot_protobuf_dot_empty__pb2.Empty.FromString,
+            perxis_dot_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
index afe8d97a9a082205625abd006853b2bee5024290..be7ae90cb350cb3fe64afc520ef73d43549d41af 100644
--- a/perxis/organizations/organizations_pb2.py
+++ b/perxis/organizations/organizations_pb2.py
@@ -19,9 +19,9 @@ DESCRIPTOR = _descriptor.FileDescriptor(
   name='perxis/organizations/organizations.proto',
   package='account.organizations',
   syntax='proto3',
-  serialized_options=b'Z<github.com/perxteam/perxis/proto/organizations;organizations',
+  serialized_options=b'Z;git.perx.ru/perxis/perxis/proto/organizations;organizations',
   create_key=_descriptor._internal_create_key,
-  serialized_pb=b'\n(perxis/organizations/organizations.proto\x12\x15\x61\x63\x63ount.organizations\x1a\x1bgoogle/protobuf/empty.proto\x1a\x1aperxis/common/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<github.com/perxteam/perxis/proto/organizations;organizationsb\x06proto3'
+  serialized_pb=b'\n(perxis/organizations/organizations.proto\x12\x15\x61\x63\x63ount.organizations\x1a\x1bgoogle/protobuf/empty.proto\x1a\x1aperxis/common/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/proto/organizations;organizationsb\x06proto3'
   ,
   dependencies=[google_dot_protobuf_dot_empty__pb2.DESCRIPTOR,perxis_dot_common_dot_common__pb2.DESCRIPTOR,])
 
diff --git a/perxis/references/references_pb2.py b/perxis/references/references_pb2.py
index 12edbacd40a0a8d389f5a19d7879d051b70c5b9a..0500fd21f63bcfdc52f3f4c3a641d27a20ad88c7 100644
--- a/perxis/references/references_pb2.py
+++ b/perxis/references/references_pb2.py
@@ -18,9 +18,9 @@ DESCRIPTOR = _descriptor.FileDescriptor(
   name='perxis/references/references.proto',
   package='content.references',
   syntax='proto3',
-  serialized_options=b'Z6github.com/perxteam/perxis/proto/references;references',
+  serialized_options=b'Z5git.perx.ru/perxis/perxis/proto/references;references',
   create_key=_descriptor._internal_create_key,
-  serialized_pb=b'\n\"perxis/references/references.proto\x12\x12\x63ontent.references\x1a\x18perxis/items/items.proto\".\n\tReference\x12\n\n\x02id\x18\x01 \x01(\t\x12\x15\n\rcollection_id\x18\x02 \x01(\t\"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\x38Z6github.com/perxteam/perxis/proto/references;referencesb\x06proto3'
+  serialized_pb=b'\n\"perxis/references/references.proto\x12\x12\x63ontent.references\x1a\x18perxis/items/items.proto\".\n\tReference\x12\n\n\x02id\x18\x01 \x01(\t\x12\x15\n\rcollection_id\x18\x02 \x01(\t\"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\x37Z5git.perx.ru/perxis/perxis/proto/references;referencesb\x06proto3'
   ,
   dependencies=[perxis_dot_items_dot_items__pb2.DESCRIPTOR,])
 
diff --git a/perxis/roles/roles_pb2.py b/perxis/roles/roles_pb2.py
index 6ae6ad6c498d179dfb2dc83804f337144f5c27c8..e3f50302fe094f9cb370bb24d092a1555c8fc99b 100644
--- a/perxis/roles/roles_pb2.py
+++ b/perxis/roles/roles_pb2.py
@@ -19,9 +19,9 @@ DESCRIPTOR = _descriptor.FileDescriptor(
   name='perxis/roles/roles.proto',
   package='content.roles',
   syntax='proto3',
-  serialized_options=b'Z,github.com/perxteam/perxis/proto/roles;roles',
+  serialized_options=b'Z+git.perx.ru/perxis/perxis/proto/roles;roles',
   create_key=_descriptor._internal_create_key,
-  serialized_pb=b'\n\x18perxis/roles/roles.proto\x12\rcontent.roles\x1a\x1bgoogle/protobuf/empty.proto\x1a\x1aperxis/common/common.proto\"l\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\"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.Z,github.com/perxteam/perxis/proto/roles;rolesb\x06proto3'
+  serialized_pb=b'\n\x18perxis/roles/roles.proto\x12\rcontent.roles\x1a\x1bgoogle/protobuf/empty.proto\x1a\x1aperxis/common/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-Z+git.perx.ru/perxis/perxis/proto/roles;rolesb\x06proto3'
   ,
   dependencies=[google_dot_protobuf_dot_empty__pb2.DESCRIPTOR,perxis_dot_common_dot_common__pb2.DESCRIPTOR,])
 
@@ -71,6 +71,13 @@ _ROLE = _descriptor.Descriptor(
       message_type=None, enum_type=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=[
   ],
@@ -83,8 +90,8 @@ _ROLE = _descriptor.Descriptor(
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=100,
-  serialized_end=208,
+  serialized_start=101,
+  serialized_end=235,
 )
 
 
@@ -115,8 +122,8 @@ _CREATEREQUEST = _descriptor.Descriptor(
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=210,
-  serialized_end=260,
+  serialized_start=237,
+  serialized_end=287,
 )
 
 
@@ -147,8 +154,8 @@ _CREATERESPONSE = _descriptor.Descriptor(
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=262,
-  serialized_end=316,
+  serialized_start=289,
+  serialized_end=343,
 )
 
 
@@ -186,8 +193,8 @@ _GETREQUEST = _descriptor.Descriptor(
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=318,
-  serialized_end=365,
+  serialized_start=345,
+  serialized_end=392,
 )
 
 
@@ -218,8 +225,8 @@ _GETRESPONSE = _descriptor.Descriptor(
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=367,
-  serialized_end=415,
+  serialized_start=394,
+  serialized_end=442,
 )
 
 
@@ -250,8 +257,8 @@ _UPDATEREQUEST = _descriptor.Descriptor(
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=417,
-  serialized_end=467,
+  serialized_start=444,
+  serialized_end=494,
 )
 
 
@@ -282,8 +289,8 @@ _LISTREQUEST = _descriptor.Descriptor(
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=469,
-  serialized_end=500,
+  serialized_start=496,
+  serialized_end=527,
 )
 
 
@@ -314,8 +321,8 @@ _LISTRESPONSE = _descriptor.Descriptor(
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=502,
-  serialized_end=552,
+  serialized_start=529,
+  serialized_end=579,
 )
 
 
@@ -353,8 +360,8 @@ _DELETEREQUEST = _descriptor.Descriptor(
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=554,
-  serialized_end=604,
+  serialized_start=581,
+  serialized_end=631,
 )
 
 _ROLE.fields_by_name['rules'].message_type = perxis_dot_common_dot_common__pb2._RULE
@@ -447,8 +454,8 @@ _ROLES = _descriptor.ServiceDescriptor(
   index=0,
   serialized_options=None,
   create_key=_descriptor._internal_create_key,
-  serialized_start=607,
-  serialized_end=950,
+  serialized_start=634,
+  serialized_end=977,
   methods=[
   _descriptor.MethodDescriptor(
     name='Create',
diff --git a/perxis/spaces/spaces_pb2.py b/perxis/spaces/spaces_pb2.py
index f37cade453b48a9bfb06e72f7c99a41729b1cc88..5dd91ec414dd293faccd6a374848b35ac2f7e6d0 100644
--- a/perxis/spaces/spaces_pb2.py
+++ b/perxis/spaces/spaces_pb2.py
@@ -19,9 +19,9 @@ DESCRIPTOR = _descriptor.FileDescriptor(
   name='perxis/spaces/spaces.proto',
   package='content.spaces',
   syntax='proto3',
-  serialized_options=b'Z.github.com/perxteam/perxis/proto/spaces;spaces',
+  serialized_options=b'Z-git.perx.ru/perxis/perxis/proto/spaces;spaces',
   create_key=_descriptor._internal_create_key,
-  serialized_pb=b'\n\x1aperxis/spaces/spaces.proto\x12\x0e\x63ontent.spaces\x1a\x1bgoogle/protobuf/empty.proto\"\x94\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&\n\x06\x63onfig\x18\n \x01(\x0b\x32\x16.content.spaces.Config\"Q\n\x06\x43onfig\x12\x10\n\x08\x66\x65\x61tures\x18\x01 \x03(\t\x12\x17\n\x0f\x61llow_anonymous\x18\x02 \x01(\x08\x12\x1c\n\x14\x61llow_any_authorized\x18\x03 \x01(\x08\"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*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\xaf\x03\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\x42\x30Z.github.com/perxteam/perxis/proto/spaces;spacesb\x06proto3'
+  serialized_pb=b'\n\x1aperxis/spaces/spaces.proto\x12\x0e\x63ontent.spaces\x1a\x1bgoogle/protobuf/empty.proto\"\x94\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&\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*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\xaf\x03\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\x42/Z-git.perx.ru/perxis/perxis/proto/spaces;spacesb\x06proto3'
   ,
   dependencies=[google_dot_protobuf_dot_empty__pb2.DESCRIPTOR,])
 
@@ -75,8 +75,8 @@ _STATE = _descriptor.EnumDescriptor(
   ],
   containing_type=None,
   serialized_options=None,
-  serialized_start=764,
-  serialized_end=876,
+  serialized_start=709,
+  serialized_end=821,
 )
 _sym_db.RegisterEnumDescriptor(_STATE)
 
@@ -174,20 +174,6 @@ _CONFIG = _descriptor.Descriptor(
       message_type=None, enum_type=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_anonymous', full_name='content.spaces.Config.allow_anonymous', 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='allow_any_authorized', full_name='content.spaces.Config.allow_any_authorized', 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=[
   ],
@@ -201,7 +187,7 @@ _CONFIG = _descriptor.Descriptor(
   oneofs=[
   ],
   serialized_start=226,
-  serialized_end=307,
+  serialized_end=252,
 )
 
 
@@ -232,8 +218,8 @@ _CREATEREQUEST = _descriptor.Descriptor(
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=309,
-  serialized_end=362,
+  serialized_start=254,
+  serialized_end=307,
 )
 
 
@@ -264,8 +250,8 @@ _CREATERESPONSE = _descriptor.Descriptor(
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=364,
-  serialized_end=420,
+  serialized_start=309,
+  serialized_end=365,
 )
 
 
@@ -296,8 +282,8 @@ _GETREQUEST = _descriptor.Descriptor(
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=422,
-  serialized_end=452,
+  serialized_start=367,
+  serialized_end=397,
 )
 
 
@@ -328,8 +314,8 @@ _GETRESPONSE = _descriptor.Descriptor(
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=454,
-  serialized_end=505,
+  serialized_start=399,
+  serialized_end=450,
 )
 
 
@@ -360,8 +346,8 @@ _LISTREQUEST = _descriptor.Descriptor(
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=507,
-  serialized_end=536,
+  serialized_start=452,
+  serialized_end=481,
 )
 
 
@@ -392,8 +378,8 @@ _LISTRESPONSE = _descriptor.Descriptor(
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=538,
-  serialized_end=591,
+  serialized_start=483,
+  serialized_end=536,
 )
 
 
@@ -424,8 +410,8 @@ _UPDATEREQUEST = _descriptor.Descriptor(
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=593,
-  serialized_end=646,
+  serialized_start=538,
+  serialized_end=591,
 )
 
 
@@ -463,8 +449,8 @@ _UPDATECONFIGREQUEST = _descriptor.Descriptor(
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=648,
-  serialized_end=727,
+  serialized_start=593,
+  serialized_end=672,
 )
 
 
@@ -495,8 +481,8 @@ _DELETEREQUEST = _descriptor.Descriptor(
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=729,
-  serialized_end=762,
+  serialized_start=674,
+  serialized_end=707,
 )
 
 _SPACE.fields_by_name['state'].enum_type = _STATE
@@ -608,8 +594,8 @@ _SPACES = _descriptor.ServiceDescriptor(
   index=0,
   serialized_options=None,
   create_key=_descriptor._internal_create_key,
-  serialized_start=879,
-  serialized_end=1310,
+  serialized_start=824,
+  serialized_end=1255,
   methods=[
   _descriptor.MethodDescriptor(
     name='Create',
diff --git a/perxis/users/users_pb2.py b/perxis/users/users_pb2.py
index 5e7542c2520f0cc72ae2b20428b9b3a2a7ade050..d17f3db56ad707d5a229824f597c651f242003ca 100644
--- a/perxis/users/users_pb2.py
+++ b/perxis/users/users_pb2.py
@@ -20,9 +20,9 @@ DESCRIPTOR = _descriptor.FileDescriptor(
   name='perxis/users/users.proto',
   package='account.users',
   syntax='proto3',
-  serialized_options=b'Z,github.com/perxteam/perxis/proto/users;users',
+  serialized_options=b'Z+git.perx.ru/perxis/perxis/proto/users;users',
   create_key=_descriptor._internal_create_key,
-  serialized_pb=b'\n\x18perxis/users/users.proto\x12\raccount.users\x1a\x1bgoogle/protobuf/empty.proto\x1a\x1egoogle/protobuf/wrappers.proto\x1a\x1aperxis/common/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.Z,github.com/perxteam/perxis/proto/users;usersb\x06proto3'
+  serialized_pb=b'\n\x18perxis/users/users.proto\x12\raccount.users\x1a\x1bgoogle/protobuf/empty.proto\x1a\x1egoogle/protobuf/wrappers.proto\x1a\x1aperxis/common/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-Z+git.perx.ru/perxis/perxis/proto/users;usersb\x06proto3'
   ,
   dependencies=[google_dot_protobuf_dot_empty__pb2.DESCRIPTOR,google_dot_protobuf_dot_wrappers__pb2.DESCRIPTOR,perxis_dot_common_dot_common__pb2.DESCRIPTOR,])
 
diff --git a/perxis/versions/account/versions_pb2.py b/perxis/versions/account/versions_pb2.py
index aba17a1a4d45d6ba619779219e45ad68c6ad0926..6d2237f40ccca62724b25213056e021de7ee49c4 100644
--- a/perxis/versions/account/versions_pb2.py
+++ b/perxis/versions/account/versions_pb2.py
@@ -19,9 +19,9 @@ DESCRIPTOR = _descriptor.FileDescriptor(
   name='perxis/versions/account/versions.proto',
   package='account',
   syntax='proto3',
-  serialized_options=b'Z9github.com/perxteam/perxis/proto/versions/account;account',
+  serialized_options=b'Z8git.perx.ru/perxis/perxis/proto/versions/account;account',
   create_key=_descriptor._internal_create_key,
-  serialized_pb=b'\n&perxis/versions/account/versions.proto\x12\x07\x61\x63\x63ount\x1a\x1bgoogle/protobuf/empty.proto\x1a\x1aperxis/common/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;Z9github.com/perxteam/perxis/proto/versions/account;accountb\x06proto3'
+  serialized_pb=b'\n&perxis/versions/account/versions.proto\x12\x07\x61\x63\x63ount\x1a\x1bgoogle/protobuf/empty.proto\x1a\x1aperxis/common/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:Z8git.perx.ru/perxis/perxis/proto/versions/account;accountb\x06proto3'
   ,
   dependencies=[google_dot_protobuf_dot_empty__pb2.DESCRIPTOR,perxis_dot_common_dot_common__pb2.DESCRIPTOR,])
 
diff --git a/perxis/versions/content/versions_pb2.py b/perxis/versions/content/versions_pb2.py
index 4e0b9e3fc03ac40444d49703c4afe74a4817539e..f697c0798e7c3ba947994e66df8fc332875067db 100644
--- a/perxis/versions/content/versions_pb2.py
+++ b/perxis/versions/content/versions_pb2.py
@@ -19,9 +19,9 @@ DESCRIPTOR = _descriptor.FileDescriptor(
   name='perxis/versions/content/versions.proto',
   package='content',
   syntax='proto3',
-  serialized_options=b'Z9github.com/perxteam/perxis/proto/versions/content;content',
+  serialized_options=b'Z8git.perx.ru/perxis/perxis/proto/versions/content;content',
   create_key=_descriptor._internal_create_key,
-  serialized_pb=b'\n&perxis/versions/content/versions.proto\x12\x07\x63ontent\x1a\x1bgoogle/protobuf/empty.proto\x1a\x1aperxis/common/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;Z9github.com/perxteam/perxis/proto/versions/content;contentb\x06proto3'
+  serialized_pb=b'\n&perxis/versions/content/versions.proto\x12\x07\x63ontent\x1a\x1bgoogle/protobuf/empty.proto\x1a\x1aperxis/common/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:Z8git.perx.ru/perxis/perxis/proto/versions/content;contentb\x06proto3'
   ,
   dependencies=[google_dot_protobuf_dot_empty__pb2.DESCRIPTOR,perxis_dot_common_dot_common__pb2.DESCRIPTOR,])
 
diff --git a/proto/perxis/clients/clients.proto b/proto/perxis/clients/clients.proto
index 1b1fd4c56e3cc1f24a4e4dd289ca67295487d233..6a9cd6e10d88bd539e69c266a204ad4c2010bd1b 100644
--- a/proto/perxis/clients/clients.proto
+++ b/proto/perxis/clients/clients.proto
@@ -1,13 +1,26 @@
 syntax = "proto3";
 
 import "google/protobuf/empty.proto";
-import "perxis/common/common.proto";
 
-option go_package = "github.com/perxteam/perxis/proto/clients;clients";
+option go_package = "git.perx.ru/perxis/perxis/proto/clients;clients";
 
 package content.clients;
 
 message Client {
+  message OAuth {
+      string client_id = 4;       // Идентификатор клиента выданные IdP сервером, используется для идентификации клиента
+      string auth_id = 5;    // Сервис который используется для авторизации клиента
+      string token_url = 10;      // URL для получения/обновления access token клиента (опционально)
+      string client_secret = 11;    // Секретный Ключ клиента, используется для идентификации клиента (опционально)
+  }
+  message APIKey {
+    string key = 1;
+    bool rotate = 2;
+  }
+  message TLS {
+    string subject = 1;
+  }
+
   // Внутренний идентификатор клиента внутри системы
   string id = 1;
 
@@ -17,29 +30,23 @@ message Client {
   // Имя приложения (обязательное поле)
   string name = 3;
 
-  // Идентификатор клиента выданные IdP сервером, используется для идентификации клиента
-  string client_id = 4;
-
-  // Сервис который используется для авторизации клиента
-  string auth_id = 5;
-
   // Описание клиента, назначение
   string description = 6;
 
   // Приложение отключено и не может авторизоваться
   optional bool disabled = 7;
 
-  // Приложение имеет доступ к указанным окружениям пространства (ID или Alias)
-  repeated string environments = 8;
-
-  // Список правил доступа к коллекциям
-  repeated common.Rule rules = 9;
+//  // Приложение имеет доступ к указанным окружениям пространства (ID или Alias)
+//  repeated string environments = 8;
+//
+//  // Список правил доступа к коллекциям
+//  repeated common.Rule rules = 9;
 
-  // URL для получения/обновления access token клиента (опционально)
-  string token_url = 10;
+  string role_id = 8;
 
-  // Секретный Ключ клиента, используется для идентификации клиента (опционально)
-  string client_secret = 11;
+  OAuth oauth = 10;
+  TLS tls = 11;
+  APIKey api_key = 12;
 }
 
 message CreateRequest {
@@ -59,13 +66,14 @@ message GetResponse {
   Client client = 1;
 }
 
-message GetByClientIDRequest {
+message GetByRequest {
   string space_id = 1;
-  string client_id = 2;
-  string auth_id = 3;
+  string oauth_client_id = 2;
+  string tls_subject= 3;
+  string api_key = 4;
 }
 
-message GetByClientIDResponse {
+message GetByResponse {
   Client client = 1;
 }
 
@@ -101,7 +109,7 @@ service Clients  {
   rpc Get(GetRequest) returns(GetResponse) {}
 
   // GetByClientID - возвращает клиента по clientId системы авторизации
-  rpc GetByClientID(GetByClientIDRequest) returns(GetByClientIDResponse) {}
+  rpc GetBy(GetByRequest) returns(GetByResponse) {}
 
   // Update - обновляет параметры клиента
   rpc Update(UpdateRequest) returns(google.protobuf.Empty) {}
diff --git a/proto/perxis/collaborators/collaborators.proto b/proto/perxis/collaborators/collaborators.proto
index 7834ed2b6e43f755516be0390f3a7a3eb5aaea2a..256cc6d44451761d22b8425b5b8ae1f1b1259964 100644
--- a/proto/perxis/collaborators/collaborators.proto
+++ b/proto/perxis/collaborators/collaborators.proto
@@ -3,19 +3,19 @@ syntax = "proto3";
 import "google/protobuf/empty.proto";
 import "perxis/common/common.proto";
 
-option go_package = "github.com/perxteam/perxis/proto/collaborators;collaborators";
+option go_package = "git.perx.ru/perxis/perxis/proto/collaborators;collaborators";
 
 package content.collaborators;
 
 message SetRequest {
   string space_id = 1;
-  string user_id = 2;
+  string subject = 2;
   string role = 3;
 }
 
 message GetRequest {
   string space_id = 1;
-  string user_id = 2;
+  string subject = 2;
 }
 
 message GetResponse {
@@ -24,7 +24,7 @@ message GetResponse {
 
 message RemoveRequest {
   string space_id = 1;
-  string user_id = 2;
+  string subject = 2;
 }
 
 message ListCollaboratorsRequest {
@@ -36,7 +36,7 @@ message ListCollaboratorsResponse {
 }
 
 message ListSpacesRequest {
-  string user_id = 1;
+  string subject = 1;
 }
 
 message ListSpacesResponse {
diff --git a/proto/perxis/collections/collections.proto b/proto/perxis/collections/collections.proto
index 41ebe99aeeda8a168c3ae9c4a72b70acf4ba75ec..e943d811c14cf47004bfc1d6c1c79223509cc287 100644
--- a/proto/perxis/collections/collections.proto
+++ b/proto/perxis/collections/collections.proto
@@ -4,7 +4,7 @@ import "google/protobuf/empty.proto";
 import "perxis/common/common.proto";
 import "google/protobuf/timestamp.proto";
 
-option go_package = "github.com/perxteam/perxis/proto/collections;collections";
+option go_package = "git.perx.ru/perxis/perxis/proto/collections;collections";
 
 package content.collections;
 
@@ -22,8 +22,10 @@ message Collection {
   string name = 4;
   optional bool single = 5;
   optional bool system = 6;
+  optional bool no_data = 12;
   string schema = 7;
-  string feature = 8;
+//  string feature = 8;
+  bool hidden = 13;
 
   message View {
     string space_id = 1;
@@ -57,19 +59,34 @@ message CreateResponse {
   Collection created = 1;
 }
 
+message GetOptions {
+  bool disable_schema_includes = 1;
+}
+
 message GetRequest {
   string space_id = 1;
   string env_id = 2;
   string collection_id = 3;
-
+  GetOptions options = 4;
 }
+
 message GetResponse {
   Collection collection = 1;
 }
 
 message ListRequest {
+  message Filter {
+    bool exclude_system = 1;
+   // bool exclude_no_data = 2;
+    bool include_no_data = 5;
+    bool include_hidden = 6;
+    repeated string name = 3;
+    repeated string id = 4;
+  }
+
   string space_id = 1;
   string env_id = 2;
+  Filter filter = 5;
 }
 message ListResponse {
   repeated Collection collections = 1;
@@ -79,6 +96,13 @@ message UpdateRequest {
   Collection collection = 1;
 }
 
+message SetSchemaRequest {
+  string space_id = 1;
+  string env_id = 2;
+  string collection_id = 3;
+  string schema = 4;
+}
+
 message DeleteRequest {
   string space_id = 1;
   string env_id = 2;
@@ -90,5 +114,6 @@ service Collections  {
   rpc Get(GetRequest) returns(GetResponse) {}
   rpc List(ListRequest) returns(ListResponse) {}
   rpc Update(UpdateRequest) returns(google.protobuf.Empty) {}
+  rpc SetSchema(SetSchemaRequest) returns(google.protobuf.Empty) {}
   rpc Delete(DeleteRequest) returns(google.protobuf.Empty) {}
 }
diff --git a/proto/perxis/common/common.proto b/proto/perxis/common/common.proto
index 51b9a5506e5e0c6beb21adff4c1cdf65b00a9f87..e3986b6ace6b600fad521400db55facdb4b16d94 100644
--- a/proto/perxis/common/common.proto
+++ b/proto/perxis/common/common.proto
@@ -1,6 +1,6 @@
 syntax = "proto3";
 
-option go_package = "github.com/perxteam/perxis/proto/common;common";
+option go_package = "git.perx.ru/perxis/perxis/proto/common;common";
 
 package common;
 
@@ -84,7 +84,7 @@ message Rule {
 
 message Collaborator {
   string space_id = 1;
-  string user_id = 2;
+  string subject = 2;
   string role = 3;
 }
 
diff --git a/proto/perxis/delivery/delivery.proto b/proto/perxis/delivery/delivery.proto
index b833155fc91f579e8118dbca27fd6c5468395066..cc87830ee9c5c052c3d1907adbc5845d49fd76b0 100644
--- a/proto/perxis/delivery/delivery.proto
+++ b/proto/perxis/delivery/delivery.proto
@@ -5,7 +5,7 @@ import "perxis/environments/environments.proto";
 import "perxis/collections/collections.proto";
 import "perxis/items/items.proto";
 
-option go_package = "github.com/perxteam/perxis/proto/delivery;delivery";
+option go_package = "git.perx.ru/perxis/perxis/proto/delivery;delivery";
 
 package delivery;
 
diff --git a/proto/perxis/environments/environments.proto b/proto/perxis/environments/environments.proto
index 18b4593d182af866df9f56ad8dbdf135335c79e5..20ab85c2ed862bbba9f72c2cd8cc78d0370f3b39 100644
--- a/proto/perxis/environments/environments.proto
+++ b/proto/perxis/environments/environments.proto
@@ -2,7 +2,7 @@ syntax = "proto3";
 
 import "google/protobuf/empty.proto";
 
-option go_package = "github.com/perxteam/perxis/proto/environments;environments";
+option go_package = "git.perx.ru/perxis/perxis/proto/environments;environments";
 
 package content.environments;
 
diff --git a/proto/perxis/extensions/extension.proto b/proto/perxis/extensions/extension.proto
new file mode 100644
index 0000000000000000000000000000000000000000..5c2a3290dbf53715d761a0732a0d8645821eb7e3
--- /dev/null
+++ b/proto/perxis/extensions/extension.proto
@@ -0,0 +1,193 @@
+/**
+# Расширения (Extensions)
+
+Расширения представляют собой отдельные сервисы предоставляющие дополнительные возможности для пользователей. Сервис
+может предоставлять несколько расширений одновременно.
+
+Для координации взаимодействия используется сервис менеджер расширений (Extension Manager). Для предоставления своих функций в систему сервис должен
+зарегистрироваться на контроллере.
+
+*/
+syntax = "proto3";
+
+option go_package = "git.perx.ru/perxis/perxis/proto/extensions;extensions";
+
+package extensions;
+
+// Extension - API расширения
+service Extension {
+
+  // Для установки расширения выполняется запрос к сервису с указанием расширений которые должны быть установлены. Если
+  // расширение уже установлено процесс возвращает ошибку.
+  rpc Install(InstallRequest) returns (InstallResponse) {}
+
+  // Можно запросить проверку статуса установки для расширения. При этом расширение проверяет наличие необходимых данных в
+  // пространстве или наличие новой версии расширения и сообщает об этом. Никаких действий с данными пространства не
+  // производится.
+  rpc Check(CheckRequest) returns (CheckResponse) {}
+
+  // Сервис выполняет необходимые действия с данными и миграции для соответствия нужной версии расширения.
+  // Если расширение не установлено процесс обновления возвращает ошибку.
+  rpc Update(UpdateRequest) returns (UpdateResponse) {}
+
+  // Удаление расширения из пространства.
+  rpc Uninstall(UninstallRequest) returns (UninstallResponse) {} // Удаление расширений
+
+
+  // Пользовательские Действия (Actions)
+  //
+  // Пользовательские действия позволяют расширить функционал пользовательского интерфейса путем
+  // добавления в интерфейс элементов взаимодействуя с которыми пользователь может вызывать реакцию на
+  // сервере или переход в интерфейсе.
+  //
+  // Пользовательские действия добавляются при установке расширений в системную коллекции `System/Actions`.
+  // Коллекция создается автоматически менеджером расширений. При установке так же отображается меню `Действия`
+  // доступное для всех пользователей.
+  //
+  // Примеры пользовательских действий:
+  // - "Собрать сайт" - добавляется Perxis.Web для сборки сайта, доступна пользователю через меню,
+  //   параметры space_id, env_id. При вызове выполняется запрос на сервер ProcessAction.
+  // - "Посмотреть задачи" - добавляется Tasks для перехода на коллекцию задач. Отображается в меню,
+  //   параметры space_id, env_id.
+  //
+  // Приложения так же могут использовать действия для вызова обработки в других приложениях при
+  // необходимости.
+  rpc Action(ActionRequest) returns(ActionResponse) {} // Выполнить указанное действие
+}
+
+message InstallRequest {
+  repeated string extensions = 10000; // Список расширений для установки
+  string space_id = 10010; // Пространство для установки расширений
+  string env_id = 10020; // Идентификатор окружения для установки (по умолчанию master)
+  bool force = 10100; // Игнорировать и автоматически исправлять ошибки установки
+}
+
+message ExtensionRequestResult {
+  enum State {
+    OK = 0; // Запрос завершен
+    ERROR = 1; // Возникла ошибка
+    PENDING = 2; // Запрос ожидает выполнения
+    IN_PROGRESS = 3; // Запрос выполняется
+  }
+
+  State state = 10000;  // Состояние расширение
+  string extension = 10100; // Имя расширения
+  string msg = 10200; // Сообщение
+  string error = 10300; // Ошибка (state == ERROR)
+  bool update_available = 10400; // Доступно обновление
+}
+
+message InstallResponse {
+  repeated ExtensionRequestResult results = 10000; // Список состояний расширений после установки
+}
+
+message UninstallRequest {
+  repeated string extensions = 10000; // Список расширений для удаления
+  string space_id = 10010; // Пространство для удаления расширений
+  string env_id = 10020; // Идентификатор окружения для установки (по умолчанию master)
+  bool remove = 10100; // Удалить все коллекции и данные
+  bool force = 10200; // Удалять расширения вне зависимости от возможных ошибок, без учета зависимостей
+}
+
+message UninstallResponse {
+  repeated ExtensionRequestResult results = 10000; // Список состояний расширений после удаления
+}
+
+message UpdateRequest {
+  repeated string extensions = 10000; // Список расширений для удаления
+  string space_id = 10010; // Пространство для удаления расширений
+  string env_id = 10020; // Идентификатор окружения для установки (по умолчанию master)
+  bool force = 10100; // Выполнять обновление и автоматически исправлять ошибки
+}
+
+message UpdateResponse {
+  repeated ExtensionRequestResult results = 10000; // Список состояний расширений после удаления
+}
+
+message CheckRequest {
+  repeated string extensions = 10000; // Список расширений для удаления
+  string space_id = 10010; // Пространство для удаления расширений
+  string env_id = 10020; // Идентификатор окружения для установки (по умолчанию master)
+}
+
+message CheckResponse {
+  repeated ExtensionRequestResult results = 10000; // Список состояний расширений
+}
+
+message ActionRequest {
+  string extension = 1000;
+  string action = 10100;
+  string space_id = 10500;
+  string env_id = 10510;
+  string collection_id = 10520;
+  string item_id = 10530;
+  repeated string item_ids = 10540;
+  map<string,string> metadata = 11000;
+}
+
+message ActionResponse {
+  enum State {
+    DONE = 0; // Запрос завершен
+    ERROR = 1; // Возникла ошибка
+    PENDING = 2; // Запрос ожидает выполнения
+    IN_PROGRESS = 3; // Запрос выполняется
+  }
+
+  State state = 10000;  // Состояние расширение
+  string msg = 10100; // Сообщение о выполнении действия
+  string error = 10200; // Сообщение в случае ошибки
+  repeated Action next = 10300; // Следующие возможные действия. Интерфейс отображает как варианты дальнейших действий пользователя
+  map<string,string>metadata = 10400; // Метаданные запроса
+  //  string status_id = 10500; // ID для проверки статуса выполняющихся запросов;
+}
+
+
+/**
+Action описывает как коллекцию в системе с предуставновленными действиями, так и возможные дальнейшие действия после
+получения ответа  (см. `ActionResponse.next`)
+
+Если поле `request` присутствует, но не все требуемые поля заполнены, то значения для них берутся из текущих значений.
+
+Коллекция: space_actions (Пространство/Действия)
+Действия сохраненные в коллекции не содержат поля `request`. Значение заполняется текущими значениями.
+
+Пользовательские действия добавляются при установке расширений или при
+настройке в системную коллекции `Пространство/Действия` (system_actions). Расширения самостоятельно контролирует создание необходимых
+им действий в коллекции.
+
+Интерфейс загружает пользовательские действия и отображает их в интерфейсе соответствующим образом.
+*/
+message Action {
+  // Kind описывает c какой сущность системы связано действие и что требуется передать в качестве параметров
+  // Интерфейс загружает пользовательские действия и отображает их в интерфейсе в зависимости от ActionType.
+  enum Kind {
+    DEFAULT = 0; // Действие не отображается в интерфейсе и могут используется для выполнения дополнительных запросов (см. `ActionResponse.next`) или напрямую из сторонних приложений.
+    SPACE = 1; // Действие связано с пространством (требуется передача space_id). Отображается в меню "Действия".
+    ENVIRONMENT = 2; // Действие связано с окружением (требуется передача space_id, env_id). Отображается в меню "Действия".
+    COLLECTION = 3; // Действие связано с коллекцией (требуется передача space_id, env_id, collection_id). Отображается на экране списка записей (TODO: внешний вид отображения)
+    ITEM = 4; // Действие связано с записью (требуется передача space_id, env_id, collection_id, item_id). Отображается на экране редактирования записи. (TODO: внешний вид отображения)
+    ITEMS = 5; // Действие связано с несколькими записями (требуется передача space_id, env_id, collection_id, item_ids). Отображается на экране списка записей, (TODO: внешний вид отображения)
+    REVISION = 6; // Действие связано с ревизией записи (требуется передача space_id, env_id, collection_id, item_id, rev_id). На данный момент не используется.
+  }
+
+  string extension = 10000; // Расширение
+  string action = 10100; // Идентификатор действия
+  string name = 10200; // Название действия для отображения в интерфейсе (пункт меню, кнопка)
+  string description = 10210; // Описание действия для отображения в интерфейсе
+  Kind kind = 10300; // Указывает на что направлено действие
+  ActionRequest request = 10400; // Параметры запроса (используется в случае `ActionResponse.next`)
+  bool navigation_action = 10500; // Флаг указывающий что действие переносить пользователя в другую часть интерфейса, а не отправляет запрос на сервер
+
+  // navigation_route - Строка шаблон для перехода в интерфейсе
+  // При указании полного адреса (http(s)://xyz), URL открывается в новом окне браузера
+  // Относительный адрес в пользовательском интерфейсе переносит пользователя в соответствующий раздел без перезагрузки приложения
+  //
+  // Переменные `:var` заменяются на текуще значение в пользовательском интерфейсе (Пример: `/spaces/:spaceId/envs/:envId/cols/:colId`)
+  // Перечень переменных для подстановки:
+  // - :spaceId
+  // - :envId
+  // - :colId
+  // - :itemId
+  //
+  string navigation_route = 10510;
+}
\ No newline at end of file
diff --git a/proto/perxis/extensions/manager.proto b/proto/perxis/extensions/manager.proto
new file mode 100644
index 0000000000000000000000000000000000000000..e1a260f18fb2e916891f11ace86f36a36d609fe1
--- /dev/null
+++ b/proto/perxis/extensions/manager.proto
@@ -0,0 +1,104 @@
+/**
+
+# Менеджер расширений
+
+Реализует функционал по координации расширений в системе и служит единой точкой доступа для работы с расширениями:
+- Регистрирует все расширения в едином реестре
+- Предоставляет доступ к реестру расширений на получение доступных расширений в системе
+- Контролирует процесс установки расширения, устанавливает все необходимые зависимости в правильном порядке
+- Контролирует создание системной коллекции `system_extensions` (System/Extensions) и создание/удалений в ней установленных расширений
+- Контролирует создание системной коллекции `system_actions` (System/Actions). Выполняет удаление всех действий связанных
+  с расширением при его удалении.
+- Выполняет переадресацию запросов на действия для расширений
+
+Менеджер расширений для контроля установленных расширений использует системные коллекции. При обращении к сервису контента
+используются системный уровень прав для создания необходимых коллекций и получения данных:
+1. `system_extensions` (System Extensions) - доступна только системным пользователям
+2. `system_actions` (System Actions) - по умолчанию доступна только системным пользователям, настройки доступа на чтение
+ выдаются пользователям вручную. В зависимости от пользователя в интерфейсе отображаются те или иные доступные действия.
+
+Проверка наличия коллекций и создание в случае их отсутствия выполняется в момент установки расширений. После установки
+расширения в коллекцию `system_extensions` добавляется запись об установленном расширении. Действия добавляются в
+коллекцию `system_actions` расширениями по собственному усмотрению при установке.
+
+Для обращения к расширениям используются права текущего пользователя запрашивающего операцию. Если пользователь не
+обладает необходимыми правами для выполнения действия то операция вернет ошибку.
+
+*/
+syntax = "proto3";
+
+option go_package = "git.perx.ru/perxis/perxis/proto/extensions;extensions";
+
+package extensions;
+
+// ExtensionManager - менеджер расширений. Должен реализовывать так же сервис Extension
+service ExtensionManager {
+  // ##  Регистрация расширений
+  //
+  // Регистрация происходить через сервис менеджера расширений (Extension Manager). В процессе регистрации сервис сообщает
+  // о поддерживаемых сервисом действиях (Actions) и версии сервиса и зависимостях:
+  // 1. Действия (Actions) - перечень действия которые обрабатываются сервисом. Включает в себя как системные действия,
+  // так и пользовательские, которые могут быть использованы в интерфейсе;
+  // 2. Имя сервиса/расширения - название сервиса внутри системы;
+  // 3. Версия сервиса - сервис сообщает текущую версию сервиса. Контроллер сообщает пользователю о возможности обновления
+  // расширения при смене версии;
+  // 4. Описание версии - содержит информацию об изменениях в последних версиях расширения;
+  // 5. Зависимости - перечень расширений которые необходимы сервису для функционирования. При установке сервиса
+  // все расширения от которых он зависит, будут так же установлены.
+  rpc RegisterExtensions(RegisterExtensionsRequest) returns (RegisterExtensionsResponse) {}
+
+  // Получить список зарегистрированных сервисов
+  rpc ListExtensions(ListExtensionsRequest) returns (ListExtensionsResponse) {} // Получить список сервисов
+}
+
+// ServiceDescription описание сервиса
+message ExtensionDescriptor {
+  string extension = 10000; // Имя расширения
+  string title = 10010; // Название расширения
+  string description = 10020; // Описание расширения
+  string version = 10100; // Версия расширения
+  string version_description = 10110; // Описание версии
+  repeated string deps = 10200; // Зависимости от других расширений
+  string url = 5; // Адрес для внутри сети, коммуникация между сервисами
+  map<string,string> metadata = 6; // Метаданные сервиса, смотрите документацию по сервису
+//  repeated string actions = 10; // Список обрабатываемых действий. Можно указывать регулярное выражения для фильтрации действий.
+}
+
+message RegisterExtensionsRequest {
+  repeated ExtensionDescriptor extensions = 1;
+}
+
+message RegisterExtensionsResponse {}
+
+message ListExtensionsFilter {
+  repeated string extension = 1; // Список имен сервисов для получения результатов. Список может содержать регулярные выражения.
+//  repeated string action = 2; // Список действий обрабатываемых сервисами. Список может содержать регулярные выражения.
+}
+
+message ListExtensionsRequest {
+  ListExtensionsFilter filter = 1;
+}
+
+message ListExtensionsResponse {
+  repeated ExtensionDescriptor extensions = 1;
+}
+
+// Описание коллекций
+
+// space_extensions (Пространство/Расширения)
+
+message SpaceExtensions {
+  enum State {
+    PENDING = 0;
+    INSTALLED = 1;
+    IN_PROGRESS = 2;
+    FAIL = 3;
+  }
+  string extension = 10000;
+  string title = 10010;
+  string version = 10100;
+  repeated string deps = 10200;
+  State state = 10300;
+  string status_error = 10400; // Сообщение к ошибке
+  string status_msg = 10500; // Сообщение к статусу
+}
\ No newline at end of file
diff --git a/proto/perxis/features/features.proto b/proto/perxis/features/features.proto
deleted file mode 100644
index ae26fc9b587788158ba8529a7eb5500aeb23a6d3..0000000000000000000000000000000000000000
--- a/proto/perxis/features/features.proto
+++ /dev/null
@@ -1,23 +0,0 @@
-syntax = "proto3";
-
-option go_package = "github.com/perxteam/perxis/proto/features;features";
-
-package content.features;
-
-// Сущности
-
-message FeatureDescription {
-  string name = 1;
-  string revision = 2;
-  repeated string dependencies = 3;
-}
-
-message ListRequest{}
-message ListResponse{
-    repeated FeatureDescription descriptions = 1;
-}
-
-service Features {
-  // List получить все возможности зарегистрированные в системе
-  rpc List(ListRequest) returns(ListResponse) {}
-}
\ No newline at end of file
diff --git a/proto/perxis/files/files.proto b/proto/perxis/files/files.proto
index 81ae4980b02413c22468bdc6b5c0f3836c127d39..d8a0c544ac965459fb1b3e63ca4120dc05aaae48 100644
--- a/proto/perxis/files/files.proto
+++ b/proto/perxis/files/files.proto
@@ -2,7 +2,7 @@ syntax = "proto3";
 
 import "google/protobuf/empty.proto";
 
-option go_package = "github.com/perxteam/perxis/proto/files;files";
+option go_package = "git.perx.ru/perxis/perxis/proto/files;files";
 
 package files;
 
@@ -84,9 +84,14 @@ message DeleteFileResponse {}
 service Files {
   // StartUpload - инициирует процедуру загрузки файла в файловое хранилище.
   // Используется клиентским приложением для начала загрузки файла
+  // Требуемые параметры: объект `MultipartUpload` с вложенным объектом `File`, в котором
+  // обязательные поля  Name и Size.
+  // Возвращает объект с заполненными полями ID, PartSize, PartURLs, MimeType, Size, UploadID.
   rpc StartUpload(StartUploadRequest) returns(StartUploadResponse) {}
 
   // CompleteUpload - завершает процедуру загрузку файла
+  // Предполагается, что в объекте, полученном из `StartUpload`, клиент должен заполнить поле
+  // Parts (идентификаторами загруженных блоков (S3 ETAGs)) и передать его в `CompleteUpload`
   rpc CompleteUpload(CompleteUploadRequest) returns(CompleteUploadResponse) {}
 
   // AbortUpload - прерывает процедуру загрузки файла, все загруженные части файла удаляются их хранилища
diff --git a/proto/perxis/images/images.proto b/proto/perxis/images/images.proto
index 72771e9eefc6d324804ca5248034da574eb3eec9..9be39fc05dab34be0a619178058b34bf419a03b8 100644
--- a/proto/perxis/images/images.proto
+++ b/proto/perxis/images/images.proto
@@ -2,7 +2,7 @@ syntax = "proto3";
 
 import "perxis/files/files.proto";
 
-option go_package = "github.com/perxteam/perxis/proto/images;images";
+option go_package = "git.perx.ru/perxis/perxis/proto/images;images";
 
 package images;
 
diff --git a/proto/perxis/invitations/invitations.proto b/proto/perxis/invitations/invitations.proto
index 14e6131bb55942b066092e053bf2baa1f3ba1337..5f239c0e93d3c626bf62c7b0a9c66b7a547642e6 100644
--- a/proto/perxis/invitations/invitations.proto
+++ b/proto/perxis/invitations/invitations.proto
@@ -4,7 +4,7 @@ import "google/protobuf/timestamp.proto";
 import "google/protobuf/empty.proto";
 import "google/protobuf/wrappers.proto";
 
-option go_package = "github.com/perxteam/perxis/proto/invitations;invitations";
+option go_package = "git.perx.ru/perxis/perxis/proto/invitations;invitations";
 
 package content.invitations;
 
diff --git a/proto/perxis/items/items.proto b/proto/perxis/items/items.proto
index e1848d0ed5a526e7d12739b8e443432ba81a651c..8773d9f9fdc3bffe4e3aaa0bc36a707be1d0b959 100644
--- a/proto/perxis/items/items.proto
+++ b/proto/perxis/items/items.proto
@@ -13,7 +13,7 @@ import "perxis/common/common.proto";
 import "google/protobuf/timestamp.proto";
 import "google/protobuf/struct.proto";
 
-option go_package = "github.com/perxteam/perxis/proto/items;items";
+option go_package = "git.perx.ru/perxis/perxis/proto/items;items";
 
 package content.items;
 
@@ -142,10 +142,7 @@ message PublishRequest {
 }
 
 message UnpublishRequest {
-  string space_id = 1;
-  string env_id = 2;
-  string collection_id = 3;
-  string item_id = 4;
+  Item item = 1;
 }
 
 message GetPublishedRequest {
@@ -200,10 +197,7 @@ message ArchiveRequest {
 }
 
 message UnarchiveRequest {
-  string space_id = 1;
-  string env_id = 2;
-  string collection_id = 3;
-  string item_id = 4;
+  Item item = 1;
 }
 
 message FindArchivedRequest {
diff --git a/proto/perxis/locales/locales.proto b/proto/perxis/locales/locales.proto
index a381d684cf3c4cc321b946078c4903f01be00c48..72fdb8ac5083d99701cc74a15acbc60bcbc86eb9 100644
--- a/proto/perxis/locales/locales.proto
+++ b/proto/perxis/locales/locales.proto
@@ -2,7 +2,7 @@ syntax = "proto3";
 
 import "google/protobuf/empty.proto";
 
-option go_package = "github.com/perxteam/perxis/proto/locales;locales";
+option go_package = "git.perx.ru/perxis/perxis/proto/locales;locales";
 
 package content.locales;
 
diff --git a/proto/perxis/members/members.proto b/proto/perxis/members/members.proto
index 800f984f4721fa0642f9874712a491bb1f14465e..236314ac4b94c38e91a1e19fc73ea0003cab1f61 100644
--- a/proto/perxis/members/members.proto
+++ b/proto/perxis/members/members.proto
@@ -3,7 +3,7 @@ syntax = "proto3";
 import "google/protobuf/empty.proto";
 import "perxis/common/common.proto";
 
-option go_package = "github.com/perxteam/perxis/proto/members;members";
+option go_package = "git.perx.ru/perxis/perxis/proto/members;members";
 
 package account.members;
 
@@ -71,6 +71,10 @@ message OnCollaboratorSetRequest {
   common.Collaborator collaborator = 1;
 }
 
+message OnCollaboratorSetResponse {
+  string delayed_task_id = 1;
+}
+
 service Observer {
-  rpc OnCollaboratorSet(OnCollaboratorSetRequest) returns(google.protobuf.Empty) {}
+  rpc OnCollaboratorSet(OnCollaboratorSetRequest) returns(OnCollaboratorSetResponse) {}
 }
diff --git a/proto/perxis/organizations/organizations.proto b/proto/perxis/organizations/organizations.proto
index 8567c1dc18e983e34d94b80f00fc74cf80aa0c72..3bb48cc4363c6e9839d0ca44e5a2eade2f7c0f99 100644
--- a/proto/perxis/organizations/organizations.proto
+++ b/proto/perxis/organizations/organizations.proto
@@ -3,7 +3,7 @@ syntax = "proto3";
 import "google/protobuf/empty.proto";
 import "perxis/common/common.proto";
 
-option go_package = "github.com/perxteam/perxis/proto/organizations;organizations";
+option go_package = "git.perx.ru/perxis/perxis/proto/organizations;organizations";
 
 package account.organizations;
 
diff --git a/proto/perxis/references/references.proto b/proto/perxis/references/references.proto
index 1141ee8fbb5ef352b4ad42035d52fdea42e2de13..b23a4e724fee88b2be220537886f4af37ee808aa 100644
--- a/proto/perxis/references/references.proto
+++ b/proto/perxis/references/references.proto
@@ -2,7 +2,7 @@ syntax = "proto3";
 
 import "perxis/items/items.proto";
 
-option go_package = "github.com/perxteam/perxis/proto/references;references";
+option go_package = "git.perx.ru/perxis/perxis/proto/references;references";
 
 package content.references;
 
diff --git a/proto/perxis/roles/roles.proto b/proto/perxis/roles/roles.proto
index c1dae47f61cfb6f1351560f181c2579dc22da452..46593bf53def1412711b18b7fd4fb6b239e91e1a 100644
--- a/proto/perxis/roles/roles.proto
+++ b/proto/perxis/roles/roles.proto
@@ -3,7 +3,7 @@ syntax = "proto3";
 import "google/protobuf/empty.proto";
 import "perxis/common/common.proto";
 
-option go_package = "github.com/perxteam/perxis/proto/roles;roles";
+option go_package = "git.perx.ru/perxis/perxis/proto/roles;roles";
 
 package content.roles;
 
@@ -22,6 +22,16 @@ message Role {
 
   // Список доступных окружений (ID или Alias)
   repeated string environments = 5;
+
+  // Разрешить доступ API управления:
+  // - Управление коллекциями
+  // - Управление приложениями
+  // - Управление ролями
+  // - Управление окружениями
+  // - Управление приглашениями
+  // - Управление locales
+  // - Управление участниками
+  bool allow_management = 10;
 }
 
 message CreateRequest {
diff --git a/proto/perxis/spaces/spaces.proto b/proto/perxis/spaces/spaces.proto
index f68b5dfd8960364f486bd3194d9693aed55b1aee..d9958b792b3f5860e6487fe4b8f4f4efd3087f39 100644
--- a/proto/perxis/spaces/spaces.proto
+++ b/proto/perxis/spaces/spaces.proto
@@ -1,6 +1,6 @@
 syntax = "proto3";
 
-option go_package = "github.com/perxteam/perxis/proto/spaces;spaces";
+option go_package = "git.perx.ru/perxis/perxis/proto/spaces;spaces";
 
 package content.spaces;
 
@@ -28,8 +28,6 @@ enum State {
 
 message Config {
   repeated string features = 1;
-  bool allow_anonymous = 2;  // Разрешить доступ к пространству для неавторизованных пользователей
-  bool allow_any_authorized = 3;     // Разрешить доступ к пространству для любых авторизованных пользователей
 }
 
 message CreateRequest {
diff --git a/proto/perxis/users/users.proto b/proto/perxis/users/users.proto
index ba577b287845602befb894ae07bb762c862e3d15..28f6372b3e9d2b0ddf2a10886afe123c84ced676 100644
--- a/proto/perxis/users/users.proto
+++ b/proto/perxis/users/users.proto
@@ -4,7 +4,7 @@ import "google/protobuf/empty.proto";
 import "google/protobuf/wrappers.proto";
 import "perxis/common/common.proto";
 
-option go_package = "github.com/perxteam/perxis/proto/users;users";
+option go_package = "git.perx.ru/perxis/perxis/proto/users;users";
 
 package account.users;
 
diff --git a/proto/perxis/versions/account/versions.proto b/proto/perxis/versions/account/versions.proto
index 2357d4340ee103bedba6a1f2a1424c218db05a24..d428b0626ab1a67ab21bb5e3911659d3ce3aa794 100644
--- a/proto/perxis/versions/account/versions.proto
+++ b/proto/perxis/versions/account/versions.proto
@@ -3,7 +3,7 @@ syntax = "proto3";
 import "google/protobuf/empty.proto";
 import "perxis/common/common.proto";
 
-option go_package = "github.com/perxteam/perxis/proto/versions/account;account";
+option go_package = "git.perx.ru/perxis/perxis/proto/versions/account;account";
 
 package account;
 
diff --git a/proto/perxis/versions/content/versions.proto b/proto/perxis/versions/content/versions.proto
index 18a1195681c98b2ce145b38b7adb698df8415de3..cfc33830f2c14714ae20a33362908f85d8b499e2 100644
--- a/proto/perxis/versions/content/versions.proto
+++ b/proto/perxis/versions/content/versions.proto
@@ -3,7 +3,7 @@ syntax = "proto3";
 import "google/protobuf/empty.proto";
 import "perxis/common/common.proto";
 
-option go_package = "github.com/perxteam/perxis/proto/versions/content;content";
+option go_package = "git.perx.ru/perxis/perxis/proto/versions/content;content";
 
 package content;
 
diff --git a/setup.py b/setup.py
index fae7534429ff593b8ba915e643c7db9debf73cb4..1ee034d87944e5a4576af31eb012c6c266bcdd1b 100644
--- a/setup.py
+++ b/setup.py
@@ -14,11 +14,11 @@ def load_requirements():
 
 setup(
     name='perxis',
-    version='0.0.8',
+    version='0.0.9',
     description='Perxis python client',
     long_description=long_description,
     long_description_content_type='text/markdown',
-    url='https://github.com/perxteam/perxis-python/',
+    url='https://git.perx.ru/perxis/perxis-python/',
     author='Eterevskiy Georgiy',
     author_email='eterevskiy@perx.ru',
     classifiers=[