diff --git a/perxis/common/common_pb2.py b/perxis/common/common_pb2.py
index a3cc66597e94a0a7b1f52243c1f776248585c3f1..50b568f080a6b1c2a1acbcfe472e250e506c91d5 100644
--- a/perxis/common/common_pb2.py
+++ b/perxis/common/common_pb2.py
@@ -12,9 +12,7 @@ from google.protobuf import symbol_database as _symbol_database
 _sym_db = _symbol_database.Default()
 
 
-from google.protobuf import timestamp_pb2 as google_dot_protobuf_dot_timestamp__pb2
 from google.protobuf import struct_pb2 as google_dot_protobuf_dot_struct__pb2
-from google.protobuf import wrappers_pb2 as google_dot_protobuf_dot_wrappers__pb2
 
 
 DESCRIPTOR = _descriptor.FileDescriptor(
@@ -23,67 +21,10 @@ DESCRIPTOR = _descriptor.FileDescriptor(
   syntax='proto3',
   serialized_options=b'Z.github.com/perxteam/perxis/proto/common;common',
   create_key=_descriptor._internal_create_key,
-  serialized_pb=b'\n\x1aperxis/common/common.proto\x12\x06\x63ommon\x1a\x1fgoogle/protobuf/timestamp.proto\x1a\x1cgoogle/protobuf/struct.proto\x1a\x1egoogle/protobuf/wrappers.proto\"\xb1\x01\n\x04User\x12\n\n\x02id\x18\x01 \x01(\t\x12\x0c\n\x04name\x18\x02 \x01(\t\x12\x12\n\nidentities\x18\x03 \x03(\t\x12\x14\n\x0c\x64isplay_name\x18\x04 \x01(\t\x12\r\n\x05\x65mail\x18\x05 \x01(\t\x12\x16\n\x0e\x65mail_verified\x18\x06 \x01(\x08\x12\x12\n\navatar_uri\x18\x07 \x01(\t\x12*\n\x06system\x18\n \x01(\x0b\x32\x1a.google.protobuf.BoolValue\"O\n\x0cOrganization\x12\n\n\x02id\x18\x01 \x01(\t\x12\x0c\n\x04name\x18\x02 \x01(\t\x12\x13\n\x0b\x64\x65scription\x18\x03 \x01(\t\x12\x10\n\x08logo_uri\x18\x05 \x01(\t\"j\n\x16OrganizationMembership\x12\n\n\x02id\x18\x01 \x01(\t\x12\x17\n\x0forganization_id\x18\x02 \x01(\t\x12\x0f\n\x07user_id\x18\x03 \x01(\t\x12\x1a\n\x04role\x18\x04 \x01(\x0e\x32\x0c.common.Role\"\xac\x02\n\x0fSpaceInvitation\x12\n\n\x02id\x18\x01 \x01(\t\x12\r\n\x05\x65mail\x18\x02 \x01(\t\x12\x17\n\x0forganization_id\x18\x03 \x01(\t\x12\x10\n\x08space_id\x18\x04 \x01(\t\x12\x12\n\ncreated_by\x18\x05 \x01(\t\x12\x12\n\nspace_role\x18\x06 \x01(\t\x12\x0c\n\x04sent\x18\x07 \x01(\x08\x12\x0f\n\x07pending\x18\x08 \x01(\x08\x12.\n\ncreated_at\x18\t \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12+\n\x07sent_at\x18\n \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12/\n\x0bvalid_until\x18\x0b \x01(\x0b\x32\x1a.google.protobuf.Timestamp\"n\n\x05Space\x12\n\n\x02id\x18\x01 \x01(\t\x12\x17\n\x0forganization_id\x18\x02 \x01(\t\x12\x0c\n\x04name\x18\x03 \x01(\t\x12\x13\n\x0b\x64\x65scription\x18\x04 \x01(\t\x12\x0c\n\x04host\x18\x05 \x01(\t\x12\x0f\n\x07\x61pi_url\x18\x06 \x01(\t\"\xe4\x01\n\nCollection\x12\n\n\x02id\x18\x01 \x01(\t\x12\x10\n\x08space_id\x18\x02 \x01(\t\x12\x16\n\x0e\x65nvironment_id\x18\x03 \x01(\t\x12\x0c\n\x04name\x18\x04 \x01(\t\x12\x0e\n\x06schema\x18\x05 \x01(\t\x12*\n\x06single\x18\x06 \x01(\x0b\x32\x1a.google.protobuf.BoolValue\x12*\n\x06hidden\x18\x07 \x01(\x0b\x32\x1a.google.protobuf.BoolValue\x12*\n\x06system\x18\x08 \x01(\x0b\x32\x1a.google.protobuf.BoolValue\"\xf5\x03\n\x04Item\x12\n\n\x02id\x18\x01 \x01(\t\x12\x10\n\x08space_id\x18\x02 \x01(\t\x12\x16\n\x0e\x65nvironment_id\x18\x03 \x01(\t\x12\x15\n\rcollection_id\x18\x04 \x01(\t\x12\x0e\n\x06status\x18\x05 \x01(\t\x12.\n\ncreated_at\x18\x06 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x12\n\ncreated_by\x18\x07 \x01(\t\x12%\n\x04\x64\x61ta\x18\x08 \x01(\x0b\x32\x17.google.protobuf.Struct\x12\x34\n\x0ctranslations\x18\t \x03(\x0b\x32\x1e.common.Item.TranslationsEntry\x12\x13\n\x0brevision_id\x18\n \x01(\t\x12\x30\n\x0cpublished_at\x18\x0b \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x14\n\x0cpublished_by\x18\x0c \x01(\t\x12/\n\x0b\x61rchived_at\x18\r \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x13\n\x0b\x61rchived_by\x18\x0e \x01(\t\x1aL\n\x11TranslationsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12&\n\x05value\x18\x02 \x01(\x0b\x32\x17.google.protobuf.Struct:\x02\x38\x01\"\xa7\x01\n\x10\x46indItemsOptions\x12\x10\n\x08space_id\x18\x01 \x01(\t\x12\x16\n\x0e\x65nvironment_id\x18\x02 \x01(\t\x12\x15\n\rcollection_id\x18\x03 \x01(\t\x12\x1f\n\x07\x66ilters\x18\x04 \x03(\x0b\x32\x0e.common.Filter\x12\x10\n\x08page_num\x18\x08 \x01(\x05\x12\x11\n\tpage_size\x18\t \x01(\x05\x12\x0c\n\x04sort\x18\n \x03(\t\"\xb5\x01\n\x0b\x45nvironment\x12\n\n\x02id\x18\x01 \x01(\t\x12\x10\n\x08space_id\x18\x02 \x01(\t\x12\x13\n\x0b\x64\x65scription\x18\x03 \x01(\t\x12(\n\x05state\x18\x04 \x01(\x0e\x32\x19.common.Environment.State\x12\x0f\n\x07\x61liases\x18\x05 \x03(\t\"8\n\x05State\x12\x0b\n\x07UNKNOWN\x10\x00\x12\x0b\n\x07PENDING\x10\x01\x12\t\n\x05READY\x10\x02\x12\n\n\x06\x46\x41ILED\x10\x03\"4\n\x06Locale\x12\n\n\x02id\x18\x01 \x01(\t\x12\x0c\n\x04name\x18\x02 \x01(\t\x12\x10\n\x08space_id\x18\x03 \x01(\t\"x\n\tSpaceRole\x12\n\n\x02id\x18\x01 \x01(\t\x12\x0c\n\x04name\x18\x02 \x01(\t\x12\x10\n\x08space_id\x18\x03 \x01(\t\x12\x13\n\x0b\x64\x65scription\x18\x05 \x01(\t\x12*\n\rcontent_rules\x18\x06 \x03(\x0b\x32\x13.common.ContentRule\"\xfd\x01\n\x0b\x43ontentRule\x12\n\n\x02id\x18\x01 \x01(\t\x12\x15\n\rcollection_id\x18\x02 \x01(\t\x12\"\n\x06\x63reate\x18\x05 \x01(\x0e\x32\x12.common.ItemAccess\x12 \n\x04read\x18\x06 \x01(\x0e\x32\x12.common.ItemAccess\x12\"\n\x06update\x18\x07 \x01(\x0e\x32\x12.common.ItemAccess\x12\"\n\x06\x64\x65lete\x18\x08 \x01(\x0e\x32\x12.common.ItemAccess\x12\x1d\n\x15\x66ields_read_blacklist\x18\n \x03(\t\x12\x1e\n\x16\x66ields_write_blacklist\x18\x0b \x03(\t\"J\n\x06\x46ilter\x12\n\n\x02op\x18\x01 \x01(\t\x12\r\n\x05\x66ield\x18\x02 \x01(\t\x12%\n\x05value\x18\x03 \x01(\x0b\x32\x16.google.protobuf.Value\"N\n\x04\x46ile\x12\n\n\x02id\x18\x01 \x01(\t\x12\x0c\n\x04name\x18\x02 \x01(\t\x12\x0c\n\x04size\x18\x03 \x01(\x05\x12\x11\n\tmime_type\x18\x04 \x01(\t\x12\x0b\n\x03url\x18\x05 \x01(\t\"@\n\x0b\x46indOptions\x12\x0c\n\x04sort\x18\x01 \x03(\t\x12\x10\n\x08page_num\x18\x02 \x01(\x05\x12\x11\n\tpage_size\x18\x03 \x01(\x05\"\x86\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\x0e\n\x06\x66ields\x18\x06 \x03(\t\x12\x16\n\x0e\x66ields_allowed\x18\x07 \x01(\x08\"?\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*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*\x16\n\nItemAccess\x12\x08\n\x04NONE\x10\x00*%\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\"\xa8\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\"?\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'
   ,
-  dependencies=[google_dot_protobuf_dot_timestamp__pb2.DESCRIPTOR,google_dot_protobuf_dot_struct__pb2.DESCRIPTOR,google_dot_protobuf_dot_wrappers__pb2.DESCRIPTOR,])
+  dependencies=[google_dot_protobuf_dot_struct__pb2.DESCRIPTOR,])
 
-_ROLE = _descriptor.EnumDescriptor(
-  name='Role',
-  full_name='common.Role',
-  filename=None,
-  file=DESCRIPTOR,
-  create_key=_descriptor._internal_create_key,
-  values=[
-    _descriptor.EnumValueDescriptor(
-      name='NOT_MEMBER', index=0, number=0,
-      serialized_options=None,
-      type=None,
-      create_key=_descriptor._internal_create_key),
-    _descriptor.EnumValueDescriptor(
-      name='MEMBER', index=1, number=1,
-      serialized_options=None,
-      type=None,
-      create_key=_descriptor._internal_create_key),
-    _descriptor.EnumValueDescriptor(
-      name='OWNER', index=2, number=2,
-      serialized_options=None,
-      type=None,
-      create_key=_descriptor._internal_create_key),
-    _descriptor.EnumValueDescriptor(
-      name='ADMIN', index=3, number=3,
-      serialized_options=None,
-      type=None,
-      create_key=_descriptor._internal_create_key),
-  ],
-  containing_type=None,
-  serialized_options=None,
-  serialized_start=2976,
-  serialized_end=3032,
-)
-_sym_db.RegisterEnumDescriptor(_ROLE)
-
-Role = enum_type_wrapper.EnumTypeWrapper(_ROLE)
-_ITEMACCESS = _descriptor.EnumDescriptor(
-  name='ItemAccess',
-  full_name='common.ItemAccess',
-  filename=None,
-  file=DESCRIPTOR,
-  create_key=_descriptor._internal_create_key,
-  values=[
-    _descriptor.EnumValueDescriptor(
-      name='NONE', index=0, number=0,
-      serialized_options=None,
-      type=None,
-      create_key=_descriptor._internal_create_key),
-  ],
-  containing_type=None,
-  serialized_options=None,
-  serialized_start=3034,
-  serialized_end=3056,
-)
-_sym_db.RegisterEnumDescriptor(_ITEMACCESS)
-
-ItemAccess = enum_type_wrapper.EnumTypeWrapper(_ITEMACCESS)
 _ACCESS = _descriptor.EnumDescriptor(
   name='Access',
   full_name='common.Access',
@@ -109,8 +50,8 @@ _ACCESS = _descriptor.EnumDescriptor(
   ],
   containing_type=None,
   serialized_options=None,
-  serialized_start=3058,
-  serialized_end=3095,
+  serialized_start=1241,
+  serialized_end=1278,
 )
 _sym_db.RegisterEnumDescriptor(_ACCESS)
 
@@ -150,17 +91,12 @@ _ACTION = _descriptor.EnumDescriptor(
   ],
   containing_type=None,
   serialized_options=None,
-  serialized_start=3097,
-  serialized_end=3164,
+  serialized_start=1280,
+  serialized_end=1347,
 )
 _sym_db.RegisterEnumDescriptor(_ACTION)
 
 Action = enum_type_wrapper.EnumTypeWrapper(_ACTION)
-NOT_MEMBER = 0
-MEMBER = 1
-OWNER = 2
-ADMIN = 3
-NONE = 0
 ANY = 0
 MINE = 1
 ROLE = 2
@@ -168,630 +104,67 @@ UNKNOWN = 0
 CREATE = 1
 READ = 2
 UPDATE = 3
-DELETE = 4
-
-
-_ENVIRONMENT_STATE = _descriptor.EnumDescriptor(
-  name='State',
-  full_name='common.Environment.State',
-  filename=None,
-  file=DESCRIPTOR,
-  create_key=_descriptor._internal_create_key,
-  values=[
-    _descriptor.EnumValueDescriptor(
-      name='UNKNOWN', index=0, number=0,
-      serialized_options=None,
-      type=None,
-      create_key=_descriptor._internal_create_key),
-    _descriptor.EnumValueDescriptor(
-      name='PENDING', index=1, number=1,
-      serialized_options=None,
-      type=None,
-      create_key=_descriptor._internal_create_key),
-    _descriptor.EnumValueDescriptor(
-      name='READY', index=2, number=2,
-      serialized_options=None,
-      type=None,
-      create_key=_descriptor._internal_create_key),
-    _descriptor.EnumValueDescriptor(
-      name='FAILED', index=3, number=3,
-      serialized_options=None,
-      type=None,
-      create_key=_descriptor._internal_create_key),
-  ],
-  containing_type=None,
-  serialized_options=None,
-  serialized_start=1948,
-  serialized_end=2004,
-)
-_sym_db.RegisterEnumDescriptor(_ENVIRONMENT_STATE)
-
-
-_USER = _descriptor.Descriptor(
-  name='User',
-  full_name='common.User',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  create_key=_descriptor._internal_create_key,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='id', full_name='common.User.id', index=0,
-      number=1, type=9, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"".decode('utf-8'),
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='name', full_name='common.User.name', index=1,
-      number=2, type=9, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"".decode('utf-8'),
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='identities', full_name='common.User.identities', index=2,
-      number=3, type=9, cpp_type=9, label=3,
-      has_default_value=False, default_value=[],
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='display_name', full_name='common.User.display_name', index=3,
-      number=4, type=9, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"".decode('utf-8'),
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='email', full_name='common.User.email', index=4,
-      number=5, type=9, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"".decode('utf-8'),
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='email_verified', full_name='common.User.email_verified', index=5,
-      number=6, type=8, cpp_type=7, label=1,
-      has_default_value=False, default_value=False,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='avatar_uri', full_name='common.User.avatar_uri', index=6,
-      number=7, type=9, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"".decode('utf-8'),
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='system', full_name='common.User.system', index=7,
-      number=10, type=11, cpp_type=10, label=1,
-      has_default_value=False, default_value=None,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  serialized_options=None,
-  is_extendable=False,
-  syntax='proto3',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=134,
-  serialized_end=311,
-)
-
-
-_ORGANIZATION = _descriptor.Descriptor(
-  name='Organization',
-  full_name='common.Organization',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  create_key=_descriptor._internal_create_key,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='id', full_name='common.Organization.id', index=0,
-      number=1, type=9, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"".decode('utf-8'),
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='name', full_name='common.Organization.name', index=1,
-      number=2, type=9, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"".decode('utf-8'),
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='description', full_name='common.Organization.description', index=2,
-      number=3, type=9, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"".decode('utf-8'),
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='logo_uri', full_name='common.Organization.logo_uri', index=3,
-      number=5, type=9, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"".decode('utf-8'),
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  serialized_options=None,
-  is_extendable=False,
-  syntax='proto3',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=313,
-  serialized_end=392,
-)
-
-
-_ORGANIZATIONMEMBERSHIP = _descriptor.Descriptor(
-  name='OrganizationMembership',
-  full_name='common.OrganizationMembership',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  create_key=_descriptor._internal_create_key,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='id', full_name='common.OrganizationMembership.id', index=0,
-      number=1, type=9, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"".decode('utf-8'),
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='organization_id', full_name='common.OrganizationMembership.organization_id', index=1,
-      number=2, type=9, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"".decode('utf-8'),
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='user_id', full_name='common.OrganizationMembership.user_id', index=2,
-      number=3, type=9, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"".decode('utf-8'),
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='role', full_name='common.OrganizationMembership.role', index=3,
-      number=4, type=14, cpp_type=8, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  serialized_options=None,
-  is_extendable=False,
-  syntax='proto3',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=394,
-  serialized_end=500,
-)
-
-
-_SPACEINVITATION = _descriptor.Descriptor(
-  name='SpaceInvitation',
-  full_name='common.SpaceInvitation',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  create_key=_descriptor._internal_create_key,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='id', full_name='common.SpaceInvitation.id', index=0,
-      number=1, type=9, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"".decode('utf-8'),
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='email', full_name='common.SpaceInvitation.email', index=1,
-      number=2, type=9, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"".decode('utf-8'),
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='organization_id', full_name='common.SpaceInvitation.organization_id', index=2,
-      number=3, type=9, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"".decode('utf-8'),
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='space_id', full_name='common.SpaceInvitation.space_id', index=3,
-      number=4, type=9, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"".decode('utf-8'),
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='created_by', full_name='common.SpaceInvitation.created_by', index=4,
-      number=5, type=9, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"".decode('utf-8'),
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='space_role', full_name='common.SpaceInvitation.space_role', index=5,
-      number=6, type=9, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"".decode('utf-8'),
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='sent', full_name='common.SpaceInvitation.sent', index=6,
-      number=7, type=8, cpp_type=7, label=1,
-      has_default_value=False, default_value=False,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='pending', full_name='common.SpaceInvitation.pending', index=7,
-      number=8, type=8, cpp_type=7, label=1,
-      has_default_value=False, default_value=False,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='created_at', full_name='common.SpaceInvitation.created_at', index=8,
-      number=9, type=11, cpp_type=10, label=1,
-      has_default_value=False, default_value=None,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='sent_at', full_name='common.SpaceInvitation.sent_at', index=9,
-      number=10, type=11, cpp_type=10, label=1,
-      has_default_value=False, default_value=None,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='valid_until', full_name='common.SpaceInvitation.valid_until', index=10,
-      number=11, type=11, cpp_type=10, label=1,
-      has_default_value=False, default_value=None,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  serialized_options=None,
-  is_extendable=False,
-  syntax='proto3',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=503,
-  serialized_end=803,
-)
-
-
-_SPACE = _descriptor.Descriptor(
-  name='Space',
-  full_name='common.Space',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  create_key=_descriptor._internal_create_key,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='id', full_name='common.Space.id', index=0,
-      number=1, type=9, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"".decode('utf-8'),
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='organization_id', full_name='common.Space.organization_id', index=1,
-      number=2, type=9, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"".decode('utf-8'),
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='name', full_name='common.Space.name', index=2,
-      number=3, type=9, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"".decode('utf-8'),
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='description', full_name='common.Space.description', index=3,
-      number=4, type=9, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"".decode('utf-8'),
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='host', full_name='common.Space.host', index=4,
-      number=5, type=9, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"".decode('utf-8'),
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='api_url', full_name='common.Space.api_url', index=5,
-      number=6, type=9, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"".decode('utf-8'),
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  serialized_options=None,
-  is_extendable=False,
-  syntax='proto3',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=805,
-  serialized_end=915,
-)
-
-
-_COLLECTION = _descriptor.Descriptor(
-  name='Collection',
-  full_name='common.Collection',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  create_key=_descriptor._internal_create_key,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='id', full_name='common.Collection.id', index=0,
-      number=1, type=9, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"".decode('utf-8'),
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='space_id', full_name='common.Collection.space_id', index=1,
-      number=2, type=9, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"".decode('utf-8'),
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='environment_id', full_name='common.Collection.environment_id', index=2,
-      number=3, type=9, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"".decode('utf-8'),
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='name', full_name='common.Collection.name', index=3,
-      number=4, type=9, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"".decode('utf-8'),
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='schema', full_name='common.Collection.schema', index=4,
-      number=5, type=9, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"".decode('utf-8'),
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='single', full_name='common.Collection.single', index=5,
-      number=6, type=11, cpp_type=10, label=1,
-      has_default_value=False, default_value=None,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='hidden', full_name='common.Collection.hidden', index=6,
-      number=7, type=11, cpp_type=10, label=1,
-      has_default_value=False, default_value=None,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='system', full_name='common.Collection.system', index=7,
-      number=8, type=11, cpp_type=10, label=1,
-      has_default_value=False, default_value=None,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  serialized_options=None,
-  is_extendable=False,
-  syntax='proto3',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=918,
-  serialized_end=1146,
-)
-
-
-_ITEM_TRANSLATIONSENTRY = _descriptor.Descriptor(
-  name='TranslationsEntry',
-  full_name='common.Item.TranslationsEntry',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  create_key=_descriptor._internal_create_key,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='key', full_name='common.Item.TranslationsEntry.key', index=0,
-      number=1, type=9, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"".decode('utf-8'),
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='value', full_name='common.Item.TranslationsEntry.value', index=1,
-      number=2, type=11, cpp_type=10, label=1,
-      has_default_value=False, default_value=None,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  serialized_options=b'8\001',
-  is_extendable=False,
-  syntax='proto3',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=1574,
-  serialized_end=1650,
-)
-
-_ITEM = _descriptor.Descriptor(
-  name='Item',
-  full_name='common.Item',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  create_key=_descriptor._internal_create_key,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='id', full_name='common.Item.id', index=0,
-      number=1, type=9, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"".decode('utf-8'),
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='space_id', full_name='common.Item.space_id', index=1,
-      number=2, type=9, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"".decode('utf-8'),
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='environment_id', full_name='common.Item.environment_id', index=2,
-      number=3, type=9, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"".decode('utf-8'),
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='collection_id', full_name='common.Item.collection_id', index=3,
-      number=4, type=9, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"".decode('utf-8'),
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='status', full_name='common.Item.status', index=4,
-      number=5, type=9, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"".decode('utf-8'),
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='created_at', full_name='common.Item.created_at', index=5,
-      number=6, type=11, cpp_type=10, label=1,
-      has_default_value=False, default_value=None,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='created_by', full_name='common.Item.created_by', index=6,
-      number=7, type=9, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"".decode('utf-8'),
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='data', full_name='common.Item.data', index=7,
-      number=8, type=11, cpp_type=10, label=1,
-      has_default_value=False, default_value=None,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='translations', full_name='common.Item.translations', index=8,
-      number=9, type=11, cpp_type=10, label=3,
-      has_default_value=False, default_value=[],
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+DELETE = 4
+
+
+
+_ERROR_BADREQUEST_FIELDVIOLATION = _descriptor.Descriptor(
+  name='FieldViolation',
+  full_name='common.Error.BadRequest.FieldViolation',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
     _descriptor.FieldDescriptor(
-      name='revision_id', full_name='common.Item.revision_id', index=9,
-      number=10, type=9, cpp_type=9, label=1,
+      name='field', full_name='common.Error.BadRequest.FieldViolation.field', index=0,
+      number=1, type=9, cpp_type=9, label=1,
       has_default_value=False, default_value=b"".decode('utf-8'),
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
       serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
-      name='published_at', full_name='common.Item.published_at', index=10,
-      number=11, type=11, cpp_type=10, label=1,
-      has_default_value=False, default_value=None,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='published_by', full_name='common.Item.published_by', index=11,
-      number=12, type=9, cpp_type=9, label=1,
+      name='description', full_name='common.Error.BadRequest.FieldViolation.description', index=1,
+      number=2, type=9, cpp_type=9, label=1,
       has_default_value=False, default_value=b"".decode('utf-8'),
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
       serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=453,
+  serialized_end=505,
+)
+
+_ERROR_BADREQUEST = _descriptor.Descriptor(
+  name='BadRequest',
+  full_name='common.Error.BadRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
     _descriptor.FieldDescriptor(
-      name='archived_at', full_name='common.Item.archived_at', index=12,
-      number=13, type=11, cpp_type=10, label=1,
-      has_default_value=False, default_value=None,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='archived_by', full_name='common.Item.archived_by', index=13,
-      number=14, type=9, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"".decode('utf-8'),
+      name='errors', full_name='common.Error.BadRequest.errors', index=0,
+      number=1, type=11, cpp_type=10, label=3,
+      has_default_value=False, default_value=[],
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
       serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
   ],
   extensions=[
   ],
-  nested_types=[_ITEM_TRANSLATIONSENTRY, ],
+  nested_types=[_ERROR_BADREQUEST_FIELDVIOLATION, ],
   enum_types=[
   ],
   serialized_options=None,
@@ -800,64 +173,59 @@ _ITEM = _descriptor.Descriptor(
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=1149,
-  serialized_end=1650,
+  serialized_start=382,
+  serialized_end=505,
 )
 
-
-_FINDITEMSOPTIONS = _descriptor.Descriptor(
-  name='FindItemsOptions',
-  full_name='common.FindItemsOptions',
+_ERROR_HELP_LINK = _descriptor.Descriptor(
+  name='Link',
+  full_name='common.Error.Help.Link',
   filename=None,
   file=DESCRIPTOR,
   containing_type=None,
   create_key=_descriptor._internal_create_key,
   fields=[
     _descriptor.FieldDescriptor(
-      name='space_id', full_name='common.FindItemsOptions.space_id', index=0,
+      name='description', full_name='common.Error.Help.Link.description', index=0,
       number=1, type=9, cpp_type=9, label=1,
       has_default_value=False, default_value=b"".decode('utf-8'),
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
       serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
-      name='environment_id', full_name='common.FindItemsOptions.environment_id', index=1,
+      name='url', full_name='common.Error.Help.Link.url', index=1,
       number=2, type=9, cpp_type=9, label=1,
       has_default_value=False, default_value=b"".decode('utf-8'),
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
       serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=555,
+  serialized_end=595,
+)
+
+_ERROR_HELP = _descriptor.Descriptor(
+  name='Help',
+  full_name='common.Error.Help',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
     _descriptor.FieldDescriptor(
-      name='collection_id', full_name='common.FindItemsOptions.collection_id', index=2,
-      number=3, type=9, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"".decode('utf-8'),
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='filters', full_name='common.FindItemsOptions.filters', index=3,
-      number=4, type=11, cpp_type=10, label=3,
-      has_default_value=False, default_value=[],
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='page_num', full_name='common.FindItemsOptions.page_num', index=4,
-      number=8, type=5, cpp_type=1, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='page_size', full_name='common.FindItemsOptions.page_size', index=5,
-      number=9, type=5, cpp_type=1, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='sort', full_name='common.FindItemsOptions.sort', index=6,
-      number=10, type=9, cpp_type=9, label=3,
+      name='links', full_name='common.Error.Help.links', index=0,
+      number=1, type=11, cpp_type=10, label=3,
       has_default_value=False, default_value=[],
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
@@ -865,7 +233,7 @@ _FINDITEMSOPTIONS = _descriptor.Descriptor(
   ],
   extensions=[
   ],
-  nested_types=[],
+  nested_types=[_ERROR_HELP_LINK, ],
   enum_types=[
   ],
   serialized_options=None,
@@ -874,60 +242,37 @@ _FINDITEMSOPTIONS = _descriptor.Descriptor(
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=1653,
-  serialized_end=1820,
+  serialized_start=507,
+  serialized_end=595,
 )
 
-
-_ENVIRONMENT = _descriptor.Descriptor(
-  name='Environment',
-  full_name='common.Environment',
+_ERROR_DEBUGINFO = _descriptor.Descriptor(
+  name='DebugInfo',
+  full_name='common.Error.DebugInfo',
   filename=None,
   file=DESCRIPTOR,
   containing_type=None,
   create_key=_descriptor._internal_create_key,
   fields=[
     _descriptor.FieldDescriptor(
-      name='id', full_name='common.Environment.id', index=0,
-      number=1, type=9, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"".decode('utf-8'),
+      name='stack_trace', full_name='common.Error.DebugInfo.stack_trace', index=0,
+      number=1, type=9, cpp_type=9, label=3,
+      has_default_value=False, default_value=[],
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
       serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
-      name='space_id', full_name='common.Environment.space_id', index=1,
+      name='detail', full_name='common.Error.DebugInfo.detail', index=1,
       number=2, type=9, cpp_type=9, label=1,
       has_default_value=False, default_value=b"".decode('utf-8'),
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
       serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='description', full_name='common.Environment.description', index=2,
-      number=3, type=9, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"".decode('utf-8'),
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='state', full_name='common.Environment.state', index=3,
-      number=4, type=14, cpp_type=8, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='aliases', full_name='common.Environment.aliases', index=4,
-      number=5, type=9, cpp_type=9, label=3,
-      has_default_value=False, default_value=[],
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
   ],
   extensions=[
   ],
   nested_types=[],
   enum_types=[
-    _ENVIRONMENT_STATE,
   ],
   serialized_options=None,
   is_extendable=False,
@@ -935,40 +280,32 @@ _ENVIRONMENT = _descriptor.Descriptor(
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=1823,
-  serialized_end=2004,
+  serialized_start=597,
+  serialized_end=645,
 )
 
-
-_LOCALE = _descriptor.Descriptor(
-  name='Locale',
-  full_name='common.Locale',
+_ERROR_LOCALIZEDMESSAGE = _descriptor.Descriptor(
+  name='LocalizedMessage',
+  full_name='common.Error.LocalizedMessage',
   filename=None,
   file=DESCRIPTOR,
   containing_type=None,
   create_key=_descriptor._internal_create_key,
   fields=[
     _descriptor.FieldDescriptor(
-      name='id', full_name='common.Locale.id', index=0,
+      name='locale', full_name='common.Error.LocalizedMessage.locale', index=0,
       number=1, type=9, cpp_type=9, label=1,
       has_default_value=False, default_value=b"".decode('utf-8'),
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
       serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
-      name='name', full_name='common.Locale.name', index=1,
+      name='message', full_name='common.Error.LocalizedMessage.message', index=1,
       number=2, type=9, cpp_type=9, label=1,
       has_default_value=False, default_value=b"".decode('utf-8'),
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
       serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='space_id', full_name='common.Locale.space_id', index=2,
-      number=3, type=9, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"".decode('utf-8'),
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
   ],
   extensions=[
   ],
@@ -981,131 +318,115 @@ _LOCALE = _descriptor.Descriptor(
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=2006,
-  serialized_end=2058,
+  serialized_start=647,
+  serialized_end=698,
 )
 
-
-_SPACEROLE = _descriptor.Descriptor(
-  name='SpaceRole',
-  full_name='common.SpaceRole',
+_ERROR_METADATAENTRY = _descriptor.Descriptor(
+  name='MetadataEntry',
+  full_name='common.Error.MetadataEntry',
   filename=None,
   file=DESCRIPTOR,
   containing_type=None,
   create_key=_descriptor._internal_create_key,
   fields=[
     _descriptor.FieldDescriptor(
-      name='id', full_name='common.SpaceRole.id', index=0,
+      name='key', full_name='common.Error.MetadataEntry.key', index=0,
       number=1, type=9, cpp_type=9, label=1,
       has_default_value=False, default_value=b"".decode('utf-8'),
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
       serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
-      name='name', full_name='common.SpaceRole.name', index=1,
+      name='value', full_name='common.Error.MetadataEntry.value', index=1,
       number=2, type=9, cpp_type=9, label=1,
       has_default_value=False, default_value=b"".decode('utf-8'),
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
       serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='space_id', full_name='common.SpaceRole.space_id', index=2,
-      number=3, type=9, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"".decode('utf-8'),
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='description', full_name='common.SpaceRole.description', index=3,
-      number=5, type=9, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"".decode('utf-8'),
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='content_rules', full_name='common.SpaceRole.content_rules', index=4,
-      number=6, type=11, cpp_type=10, label=3,
-      has_default_value=False, default_value=[],
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
   ],
   extensions=[
   ],
   nested_types=[],
   enum_types=[
   ],
-  serialized_options=None,
+  serialized_options=b'8\001',
   is_extendable=False,
   syntax='proto3',
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=2060,
-  serialized_end=2180,
+  serialized_start=700,
+  serialized_end=747,
 )
 
-
-_CONTENTRULE = _descriptor.Descriptor(
-  name='ContentRule',
-  full_name='common.ContentRule',
+_ERROR = _descriptor.Descriptor(
+  name='Error',
+  full_name='common.Error',
   filename=None,
   file=DESCRIPTOR,
   containing_type=None,
   create_key=_descriptor._internal_create_key,
   fields=[
     _descriptor.FieldDescriptor(
-      name='id', full_name='common.ContentRule.id', index=0,
-      number=1, type=9, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"".decode('utf-8'),
+      name='error_code', full_name='common.Error.error_code', index=0,
+      number=1, type=4, cpp_type=4, label=1,
+      has_default_value=False, default_value=0,
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
       serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
-      name='collection_id', full_name='common.ContentRule.collection_id', index=1,
+      name='error_id', full_name='common.Error.error_id', index=1,
       number=2, type=9, cpp_type=9, label=1,
       has_default_value=False, default_value=b"".decode('utf-8'),
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
       serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
-      name='create', full_name='common.ContentRule.create', index=2,
-      number=5, type=14, cpp_type=8, label=1,
-      has_default_value=False, default_value=0,
+      name='reason', full_name='common.Error.reason', index=2,
+      number=3, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
       serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
-      name='read', full_name='common.ContentRule.read', index=3,
-      number=6, type=14, cpp_type=8, label=1,
-      has_default_value=False, default_value=0,
+      name='domain', full_name='common.Error.domain', index=3,
+      number=4, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
       serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
-      name='update', full_name='common.ContentRule.update', index=4,
-      number=7, type=14, cpp_type=8, label=1,
-      has_default_value=False, default_value=0,
+      name='metadata', full_name='common.Error.metadata', index=4,
+      number=9, type=11, cpp_type=10, label=3,
+      has_default_value=False, default_value=[],
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
       serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
-      name='delete', full_name='common.ContentRule.delete', index=5,
-      number=8, type=14, cpp_type=8, label=1,
-      has_default_value=False, default_value=0,
+      name='bad_request', full_name='common.Error.bad_request', index=5,
+      number=10, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
       serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
-      name='fields_read_blacklist', full_name='common.ContentRule.fields_read_blacklist', index=6,
-      number=10, type=9, cpp_type=9, label=3,
-      has_default_value=False, default_value=[],
+      name='debug_info', full_name='common.Error.debug_info', index=6,
+      number=11, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
       serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
-      name='fields_write_blacklist', full_name='common.ContentRule.fields_write_blacklist', index=7,
-      number=11, type=9, cpp_type=9, label=3,
+      name='help', full_name='common.Error.help', index=7,
+      number=100, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='localized_messages', full_name='common.Error.localized_messages', index=8,
+      number=200, type=11, cpp_type=10, label=3,
       has_default_value=False, default_value=[],
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
@@ -1113,7 +434,7 @@ _CONTENTRULE = _descriptor.Descriptor(
   ],
   extensions=[
   ],
-  nested_types=[],
+  nested_types=[_ERROR_BADREQUEST, _ERROR_HELP, _ERROR_DEBUGINFO, _ERROR_LOCALIZEDMESSAGE, _ERROR_METADATAENTRY, ],
   enum_types=[
   ],
   serialized_options=None,
@@ -1122,8 +443,8 @@ _CONTENTRULE = _descriptor.Descriptor(
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=2183,
-  serialized_end=2436,
+  serialized_start=69,
+  serialized_end=747,
 )
 
 
@@ -1168,68 +489,8 @@ _FILTER = _descriptor.Descriptor(
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=2438,
-  serialized_end=2512,
-)
-
-
-_FILE = _descriptor.Descriptor(
-  name='File',
-  full_name='common.File',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  create_key=_descriptor._internal_create_key,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='id', full_name='common.File.id', index=0,
-      number=1, type=9, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"".decode('utf-8'),
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='name', full_name='common.File.name', index=1,
-      number=2, type=9, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"".decode('utf-8'),
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='size', full_name='common.File.size', index=2,
-      number=3, type=5, cpp_type=1, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='mime_type', full_name='common.File.mime_type', index=3,
-      number=4, type=9, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"".decode('utf-8'),
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='url', full_name='common.File.url', index=4,
-      number=5, type=9, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"".decode('utf-8'),
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  serialized_options=None,
-  is_extendable=False,
-  syntax='proto3',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=2514,
-  serialized_end=2592,
+  serialized_start=749,
+  serialized_end=823,
 )
 
 
@@ -1274,8 +535,8 @@ _FINDOPTIONS = _descriptor.Descriptor(
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=2594,
-  serialized_end=2658,
+  serialized_start=825,
+  serialized_end=889,
 )
 
 
@@ -1309,16 +570,23 @@ _RULE = _descriptor.Descriptor(
       is_extension=False, extension_scope=None,
       serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
-      name='fields', full_name='common.Rule.fields', index=3,
+      name='hidden_fields', full_name='common.Rule.hidden_fields', index=3,
+      number=5, type=9, cpp_type=9, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='readonly_fields', full_name='common.Rule.readonly_fields', index=4,
       number=6, type=9, cpp_type=9, label=3,
       has_default_value=False, default_value=[],
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
       serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
-      name='fields_allowed', full_name='common.Rule.fields_allowed', index=4,
-      number=7, type=8, cpp_type=7, label=1,
-      has_default_value=False, default_value=False,
+      name='writeonly_fields', full_name='common.Rule.writeonly_fields', index=5,
+      number=7, type=9, cpp_type=9, label=3,
+      has_default_value=False, default_value=[],
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
       serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
@@ -1334,8 +602,8 @@ _RULE = _descriptor.Descriptor(
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=2661,
-  serialized_end=2795,
+  serialized_start=892,
+  serialized_end=1060,
 )
 
 
@@ -1380,8 +648,8 @@ _COLLABORATOR = _descriptor.Descriptor(
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=2797,
-  serialized_end=2860,
+  serialized_start=1062,
+  serialized_end=1125,
 )
 
 
@@ -1440,151 +708,99 @@ _VERSION = _descriptor.Descriptor(
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=2862,
-  serialized_end=2974,
+  serialized_start=1127,
+  serialized_end=1239,
 )
 
-_USER.fields_by_name['system'].message_type = google_dot_protobuf_dot_wrappers__pb2._BOOLVALUE
-_ORGANIZATIONMEMBERSHIP.fields_by_name['role'].enum_type = _ROLE
-_SPACEINVITATION.fields_by_name['created_at'].message_type = google_dot_protobuf_dot_timestamp__pb2._TIMESTAMP
-_SPACEINVITATION.fields_by_name['sent_at'].message_type = google_dot_protobuf_dot_timestamp__pb2._TIMESTAMP
-_SPACEINVITATION.fields_by_name['valid_until'].message_type = google_dot_protobuf_dot_timestamp__pb2._TIMESTAMP
-_COLLECTION.fields_by_name['single'].message_type = google_dot_protobuf_dot_wrappers__pb2._BOOLVALUE
-_COLLECTION.fields_by_name['hidden'].message_type = google_dot_protobuf_dot_wrappers__pb2._BOOLVALUE
-_COLLECTION.fields_by_name['system'].message_type = google_dot_protobuf_dot_wrappers__pb2._BOOLVALUE
-_ITEM_TRANSLATIONSENTRY.fields_by_name['value'].message_type = google_dot_protobuf_dot_struct__pb2._STRUCT
-_ITEM_TRANSLATIONSENTRY.containing_type = _ITEM
-_ITEM.fields_by_name['created_at'].message_type = google_dot_protobuf_dot_timestamp__pb2._TIMESTAMP
-_ITEM.fields_by_name['data'].message_type = google_dot_protobuf_dot_struct__pb2._STRUCT
-_ITEM.fields_by_name['translations'].message_type = _ITEM_TRANSLATIONSENTRY
-_ITEM.fields_by_name['published_at'].message_type = google_dot_protobuf_dot_timestamp__pb2._TIMESTAMP
-_ITEM.fields_by_name['archived_at'].message_type = google_dot_protobuf_dot_timestamp__pb2._TIMESTAMP
-_FINDITEMSOPTIONS.fields_by_name['filters'].message_type = _FILTER
-_ENVIRONMENT.fields_by_name['state'].enum_type = _ENVIRONMENT_STATE
-_ENVIRONMENT_STATE.containing_type = _ENVIRONMENT
-_SPACEROLE.fields_by_name['content_rules'].message_type = _CONTENTRULE
-_CONTENTRULE.fields_by_name['create'].enum_type = _ITEMACCESS
-_CONTENTRULE.fields_by_name['read'].enum_type = _ITEMACCESS
-_CONTENTRULE.fields_by_name['update'].enum_type = _ITEMACCESS
-_CONTENTRULE.fields_by_name['delete'].enum_type = _ITEMACCESS
+_ERROR_BADREQUEST_FIELDVIOLATION.containing_type = _ERROR_BADREQUEST
+_ERROR_BADREQUEST.fields_by_name['errors'].message_type = _ERROR_BADREQUEST_FIELDVIOLATION
+_ERROR_BADREQUEST.containing_type = _ERROR
+_ERROR_HELP_LINK.containing_type = _ERROR_HELP
+_ERROR_HELP.fields_by_name['links'].message_type = _ERROR_HELP_LINK
+_ERROR_HELP.containing_type = _ERROR
+_ERROR_DEBUGINFO.containing_type = _ERROR
+_ERROR_LOCALIZEDMESSAGE.containing_type = _ERROR
+_ERROR_METADATAENTRY.containing_type = _ERROR
+_ERROR.fields_by_name['metadata'].message_type = _ERROR_METADATAENTRY
+_ERROR.fields_by_name['bad_request'].message_type = _ERROR_BADREQUEST
+_ERROR.fields_by_name['debug_info'].message_type = _ERROR_DEBUGINFO
+_ERROR.fields_by_name['help'].message_type = _ERROR_HELP
+_ERROR.fields_by_name['localized_messages'].message_type = _ERROR_LOCALIZEDMESSAGE
 _FILTER.fields_by_name['value'].message_type = google_dot_protobuf_dot_struct__pb2._VALUE
 _RULE.fields_by_name['actions'].enum_type = _ACTION
 _RULE.fields_by_name['access'].enum_type = _ACCESS
-DESCRIPTOR.message_types_by_name['User'] = _USER
-DESCRIPTOR.message_types_by_name['Organization'] = _ORGANIZATION
-DESCRIPTOR.message_types_by_name['OrganizationMembership'] = _ORGANIZATIONMEMBERSHIP
-DESCRIPTOR.message_types_by_name['SpaceInvitation'] = _SPACEINVITATION
-DESCRIPTOR.message_types_by_name['Space'] = _SPACE
-DESCRIPTOR.message_types_by_name['Collection'] = _COLLECTION
-DESCRIPTOR.message_types_by_name['Item'] = _ITEM
-DESCRIPTOR.message_types_by_name['FindItemsOptions'] = _FINDITEMSOPTIONS
-DESCRIPTOR.message_types_by_name['Environment'] = _ENVIRONMENT
-DESCRIPTOR.message_types_by_name['Locale'] = _LOCALE
-DESCRIPTOR.message_types_by_name['SpaceRole'] = _SPACEROLE
-DESCRIPTOR.message_types_by_name['ContentRule'] = _CONTENTRULE
+DESCRIPTOR.message_types_by_name['Error'] = _ERROR
 DESCRIPTOR.message_types_by_name['Filter'] = _FILTER
-DESCRIPTOR.message_types_by_name['File'] = _FILE
 DESCRIPTOR.message_types_by_name['FindOptions'] = _FINDOPTIONS
 DESCRIPTOR.message_types_by_name['Rule'] = _RULE
 DESCRIPTOR.message_types_by_name['Collaborator'] = _COLLABORATOR
 DESCRIPTOR.message_types_by_name['Version'] = _VERSION
-DESCRIPTOR.enum_types_by_name['Role'] = _ROLE
-DESCRIPTOR.enum_types_by_name['ItemAccess'] = _ITEMACCESS
 DESCRIPTOR.enum_types_by_name['Access'] = _ACCESS
 DESCRIPTOR.enum_types_by_name['Action'] = _ACTION
 _sym_db.RegisterFileDescriptor(DESCRIPTOR)
 
-User = _reflection.GeneratedProtocolMessageType('User', (_message.Message,), {
-  'DESCRIPTOR' : _USER,
-  '__module__' : 'perxis.common.common_pb2'
-  # @@protoc_insertion_point(class_scope:common.User)
-  })
-_sym_db.RegisterMessage(User)
-
-Organization = _reflection.GeneratedProtocolMessageType('Organization', (_message.Message,), {
-  'DESCRIPTOR' : _ORGANIZATION,
-  '__module__' : 'perxis.common.common_pb2'
-  # @@protoc_insertion_point(class_scope:common.Organization)
-  })
-_sym_db.RegisterMessage(Organization)
-
-OrganizationMembership = _reflection.GeneratedProtocolMessageType('OrganizationMembership', (_message.Message,), {
-  'DESCRIPTOR' : _ORGANIZATIONMEMBERSHIP,
-  '__module__' : 'perxis.common.common_pb2'
-  # @@protoc_insertion_point(class_scope:common.OrganizationMembership)
-  })
-_sym_db.RegisterMessage(OrganizationMembership)
-
-SpaceInvitation = _reflection.GeneratedProtocolMessageType('SpaceInvitation', (_message.Message,), {
-  'DESCRIPTOR' : _SPACEINVITATION,
-  '__module__' : 'perxis.common.common_pb2'
-  # @@protoc_insertion_point(class_scope:common.SpaceInvitation)
-  })
-_sym_db.RegisterMessage(SpaceInvitation)
-
-Space = _reflection.GeneratedProtocolMessageType('Space', (_message.Message,), {
-  'DESCRIPTOR' : _SPACE,
-  '__module__' : 'perxis.common.common_pb2'
-  # @@protoc_insertion_point(class_scope:common.Space)
-  })
-_sym_db.RegisterMessage(Space)
-
-Collection = _reflection.GeneratedProtocolMessageType('Collection', (_message.Message,), {
-  'DESCRIPTOR' : _COLLECTION,
-  '__module__' : 'perxis.common.common_pb2'
-  # @@protoc_insertion_point(class_scope:common.Collection)
-  })
-_sym_db.RegisterMessage(Collection)
+Error = _reflection.GeneratedProtocolMessageType('Error', (_message.Message,), {
 
-Item = _reflection.GeneratedProtocolMessageType('Item', (_message.Message,), {
+  'BadRequest' : _reflection.GeneratedProtocolMessageType('BadRequest', (_message.Message,), {
 
-  'TranslationsEntry' : _reflection.GeneratedProtocolMessageType('TranslationsEntry', (_message.Message,), {
-    'DESCRIPTOR' : _ITEM_TRANSLATIONSENTRY,
+    'FieldViolation' : _reflection.GeneratedProtocolMessageType('FieldViolation', (_message.Message,), {
+      'DESCRIPTOR' : _ERROR_BADREQUEST_FIELDVIOLATION,
+      '__module__' : 'perxis.common.common_pb2'
+      # @@protoc_insertion_point(class_scope:common.Error.BadRequest.FieldViolation)
+      })
+    ,
+    'DESCRIPTOR' : _ERROR_BADREQUEST,
     '__module__' : 'perxis.common.common_pb2'
-    # @@protoc_insertion_point(class_scope:common.Item.TranslationsEntry)
+    # @@protoc_insertion_point(class_scope:common.Error.BadRequest)
     })
   ,
-  'DESCRIPTOR' : _ITEM,
-  '__module__' : 'perxis.common.common_pb2'
-  # @@protoc_insertion_point(class_scope:common.Item)
-  })
-_sym_db.RegisterMessage(Item)
-_sym_db.RegisterMessage(Item.TranslationsEntry)
 
-FindItemsOptions = _reflection.GeneratedProtocolMessageType('FindItemsOptions', (_message.Message,), {
-  'DESCRIPTOR' : _FINDITEMSOPTIONS,
-  '__module__' : 'perxis.common.common_pb2'
-  # @@protoc_insertion_point(class_scope:common.FindItemsOptions)
-  })
-_sym_db.RegisterMessage(FindItemsOptions)
+  'Help' : _reflection.GeneratedProtocolMessageType('Help', (_message.Message,), {
 
-Environment = _reflection.GeneratedProtocolMessageType('Environment', (_message.Message,), {
-  'DESCRIPTOR' : _ENVIRONMENT,
-  '__module__' : 'perxis.common.common_pb2'
-  # @@protoc_insertion_point(class_scope:common.Environment)
-  })
-_sym_db.RegisterMessage(Environment)
+    'Link' : _reflection.GeneratedProtocolMessageType('Link', (_message.Message,), {
+      'DESCRIPTOR' : _ERROR_HELP_LINK,
+      '__module__' : 'perxis.common.common_pb2'
+      # @@protoc_insertion_point(class_scope:common.Error.Help.Link)
+      })
+    ,
+    'DESCRIPTOR' : _ERROR_HELP,
+    '__module__' : 'perxis.common.common_pb2'
+    # @@protoc_insertion_point(class_scope:common.Error.Help)
+    })
+  ,
 
-Locale = _reflection.GeneratedProtocolMessageType('Locale', (_message.Message,), {
-  'DESCRIPTOR' : _LOCALE,
-  '__module__' : 'perxis.common.common_pb2'
-  # @@protoc_insertion_point(class_scope:common.Locale)
-  })
-_sym_db.RegisterMessage(Locale)
+  'DebugInfo' : _reflection.GeneratedProtocolMessageType('DebugInfo', (_message.Message,), {
+    'DESCRIPTOR' : _ERROR_DEBUGINFO,
+    '__module__' : 'perxis.common.common_pb2'
+    # @@protoc_insertion_point(class_scope:common.Error.DebugInfo)
+    })
+  ,
 
-SpaceRole = _reflection.GeneratedProtocolMessageType('SpaceRole', (_message.Message,), {
-  'DESCRIPTOR' : _SPACEROLE,
-  '__module__' : 'perxis.common.common_pb2'
-  # @@protoc_insertion_point(class_scope:common.SpaceRole)
-  })
-_sym_db.RegisterMessage(SpaceRole)
+  'LocalizedMessage' : _reflection.GeneratedProtocolMessageType('LocalizedMessage', (_message.Message,), {
+    'DESCRIPTOR' : _ERROR_LOCALIZEDMESSAGE,
+    '__module__' : 'perxis.common.common_pb2'
+    # @@protoc_insertion_point(class_scope:common.Error.LocalizedMessage)
+    })
+  ,
 
-ContentRule = _reflection.GeneratedProtocolMessageType('ContentRule', (_message.Message,), {
-  'DESCRIPTOR' : _CONTENTRULE,
+  'MetadataEntry' : _reflection.GeneratedProtocolMessageType('MetadataEntry', (_message.Message,), {
+    'DESCRIPTOR' : _ERROR_METADATAENTRY,
+    '__module__' : 'perxis.common.common_pb2'
+    # @@protoc_insertion_point(class_scope:common.Error.MetadataEntry)
+    })
+  ,
+  'DESCRIPTOR' : _ERROR,
   '__module__' : 'perxis.common.common_pb2'
-  # @@protoc_insertion_point(class_scope:common.ContentRule)
+  # @@protoc_insertion_point(class_scope:common.Error)
   })
-_sym_db.RegisterMessage(ContentRule)
+_sym_db.RegisterMessage(Error)
+_sym_db.RegisterMessage(Error.BadRequest)
+_sym_db.RegisterMessage(Error.BadRequest.FieldViolation)
+_sym_db.RegisterMessage(Error.Help)
+_sym_db.RegisterMessage(Error.Help.Link)
+_sym_db.RegisterMessage(Error.DebugInfo)
+_sym_db.RegisterMessage(Error.LocalizedMessage)
+_sym_db.RegisterMessage(Error.MetadataEntry)
 
 Filter = _reflection.GeneratedProtocolMessageType('Filter', (_message.Message,), {
   'DESCRIPTOR' : _FILTER,
@@ -1593,13 +809,6 @@ Filter = _reflection.GeneratedProtocolMessageType('Filter', (_message.Message,),
   })
 _sym_db.RegisterMessage(Filter)
 
-File = _reflection.GeneratedProtocolMessageType('File', (_message.Message,), {
-  'DESCRIPTOR' : _FILE,
-  '__module__' : 'perxis.common.common_pb2'
-  # @@protoc_insertion_point(class_scope:common.File)
-  })
-_sym_db.RegisterMessage(File)
-
 FindOptions = _reflection.GeneratedProtocolMessageType('FindOptions', (_message.Message,), {
   'DESCRIPTOR' : _FINDOPTIONS,
   '__module__' : 'perxis.common.common_pb2'
@@ -1630,5 +839,5 @@ _sym_db.RegisterMessage(Version)
 
 
 DESCRIPTOR._options = None
-_ITEM_TRANSLATIONSENTRY._options = None
+_ERROR_METADATAENTRY._options = None
 # @@protoc_insertion_point(module_scope)
diff --git a/perxis/file/file_pb2.py b/perxis/file/file_pb2.py
index 56544bad6b1e05d4a5adf00bbc0ce5a0172963b5..3d480847139d1fb373690aeb26d0ced55a7a9c82 100644
--- a/perxis/file/file_pb2.py
+++ b/perxis/file/file_pb2.py
@@ -12,7 +12,6 @@ _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(
@@ -21,51 +20,111 @@ DESCRIPTOR = _descriptor.FileDescriptor(
   syntax='proto3',
   serialized_options=b'Z*github.com/perxteam/perxis/proto/file;file',
   create_key=_descriptor._internal_create_key,
-  serialized_pb=b'\n\x16perxis/file/file.proto\x12\x04\x66ile\x1a\x1bgoogle/protobuf/empty.proto\x1a\x1aperxis/common/common.proto\"\x81\x01\n\x06Upload\x12\x1a\n\x04\x66ile\x18\x01 \x01(\x0b\x32\x0c.common.File\x12\x11\n\tupload_id\x18\x02 \x01(\t\x12\x11\n\tpart_size\x18\x03 \x01(\x05\x12\x11\n\tpart_urls\x18\x04 \x03(\t\x12\"\n\x05parts\x18\x05 \x03(\x0b\x32\x13.file.CompletedPart\"+\n\rCompletedPart\x12\x0e\n\x06number\x18\x01 \x01(\x05\x12\n\n\x02id\x18\x02 \x01(\t\"2\n\x12StartUploadRequest\x12\x1c\n\x06upload\x18\x01 \x01(\x0b\x32\x0c.file.Upload\"3\n\x13StartUploadResponse\x12\x1c\n\x06upload\x18\x01 \x01(\x0b\x32\x0c.file.Upload\"5\n\x15\x43ompleteUploadRequest\x12\x1c\n\x06upload\x18\x01 \x01(\x0b\x32\x0c.file.Upload\"6\n\x16\x43ompleteUploadResponse\x12\x1c\n\x06upload\x18\x01 \x01(\x0b\x32\x0c.file.Upload\"2\n\x12\x41\x62ortUploadRequest\x12\x1c\n\x06upload\x18\x01 \x01(\x0b\x32\x0c.file.Upload\"\x15\n\x13\x41\x62ortUploadResponse\"1\n\x11MoveUploadRequest\x12\x1c\n\x06upload\x18\x01 \x01(\x0b\x32\x0c.file.Upload\"0\n\x12MoveUploadResponse\x12\x1a\n\x04\x66ile\x18\x01 \x01(\x0b\x32\x0c.common.File\"\x1c\n\x0eGetFileRequest\x12\n\n\x02id\x18\x01 \x01(\t\"-\n\x0fGetFileResponse\x12\x1a\n\x04\x66ile\x18\x01 \x01(\x0b\x32\x0c.common.File\"/\n\x11\x44\x65leteFileRequest\x12\x1a\n\x04\x66ile\x18\x01 \x01(\x0b\x32\x0c.common.File\"\x14\n\x12\x44\x65leteFileResponse2\xa3\x03\n\x0b\x46ileService\x12\x44\n\x0bStartUpload\x12\x18.file.StartUploadRequest\x1a\x19.file.StartUploadResponse\"\x00\x12M\n\x0e\x43ompleteUpload\x12\x1b.file.CompleteUploadRequest\x1a\x1c.file.CompleteUploadResponse\"\x00\x12\x41\n\x0b\x41\x62ortUpload\x12\x18.file.AbortUploadRequest\x1a\x16.google.protobuf.Empty\"\x00\x12\x41\n\nMoveUpload\x12\x17.file.MoveUploadRequest\x1a\x18.file.MoveUploadResponse\"\x00\x12\x38\n\x07GetFile\x12\x14.file.GetFileRequest\x1a\x15.file.GetFileResponse\"\x00\x12?\n\nDeleteFile\x12\x17.file.DeleteFileRequest\x1a\x16.google.protobuf.Empty\"\x00\x42,Z*github.com/perxteam/perxis/proto/file;fileb\x06proto3'
+  serialized_pb=b'\n\x16perxis/file/file.proto\x12\x04\x66ile\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\"\x88\x01\n\x0fMultipartUpload\x12\x18\n\x04\x66ile\x18\x01 \x01(\x0b\x32\n.file.File\x12\x11\n\tupload_id\x18\x02 \x01(\t\x12\x11\n\tpart_size\x18\x03 \x01(\x05\x12\x11\n\tpart_urls\x18\x04 \x03(\t\x12\"\n\x05parts\x18\x05 \x03(\x0b\x32\x13.file.CompletedPart\"6\n\x06Upload\x12\x18\n\x04\x66ile\x18\x01 \x01(\x0b\x32\n.file.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\x15.file.MultipartUpload\"<\n\x13StartUploadResponse\x12%\n\x06upload\x18\x01 \x01(\x0b\x32\x15.file.MultipartUpload\">\n\x15\x43ompleteUploadRequest\x12%\n\x06upload\x18\x01 \x01(\x0b\x32\x15.file.MultipartUpload\"?\n\x16\x43ompleteUploadResponse\x12%\n\x06upload\x18\x01 \x01(\x0b\x32\x15.file.MultipartUpload\";\n\x12\x41\x62ortUploadRequest\x12%\n\x06upload\x18\x01 \x01(\x0b\x32\x15.file.MultipartUpload\"\x15\n\x13\x41\x62ortUploadResponse\":\n\x11MoveUploadRequest\x12%\n\x06upload\x18\x01 \x01(\x0b\x32\x15.file.MultipartUpload\".\n\x12MoveUploadResponse\x12\x18\n\x04\x66ile\x18\x01 \x01(\x0b\x32\n.file.File\")\n\rUploadRequest\x12\x18\n\x04\x66ile\x18\x01 \x01(\x0b\x32\n.file.File\".\n\x0eUploadResponse\x12\x1c\n\x06upload\x18\x01 \x01(\x0b\x32\x0c.file.Upload\"\x1c\n\x0eGetFileRequest\x12\n\n\x02id\x18\x01 \x01(\t\"+\n\x0fGetFileResponse\x12\x18\n\x04\x66ile\x18\x01 \x01(\x0b\x32\n.file.File\"-\n\x11\x44\x65leteFileRequest\x12\x18\n\x04\x66ile\x18\x01 \x01(\x0b\x32\n.file.File\"\x14\n\x12\x44\x65leteFileResponse2\xda\x03\n\x0b\x46ileService\x12\x44\n\x0bStartUpload\x12\x18.file.StartUploadRequest\x1a\x19.file.StartUploadResponse\"\x00\x12M\n\x0e\x43ompleteUpload\x12\x1b.file.CompleteUploadRequest\x1a\x1c.file.CompleteUploadResponse\"\x00\x12\x41\n\x0b\x41\x62ortUpload\x12\x18.file.AbortUploadRequest\x1a\x16.google.protobuf.Empty\"\x00\x12\x41\n\nMoveUpload\x12\x17.file.MoveUploadRequest\x1a\x18.file.MoveUploadResponse\"\x00\x12\x35\n\x06Upload\x12\x13.file.UploadRequest\x1a\x14.file.UploadResponse\"\x00\x12\x38\n\x07GetFile\x12\x14.file.GetFileRequest\x1a\x15.file.GetFileResponse\"\x00\x12?\n\nDeleteFile\x12\x17.file.DeleteFileRequest\x1a\x16.google.protobuf.Empty\"\x00\x42,Z*github.com/perxteam/perxis/proto/file;fileb\x06proto3'
   ,
-  dependencies=[google_dot_protobuf_dot_empty__pb2.DESCRIPTOR,perxis_dot_common_dot_common__pb2.DESCRIPTOR,])
+  dependencies=[google_dot_protobuf_dot_empty__pb2.DESCRIPTOR,])
 
 
 
 
-_UPLOAD = _descriptor.Descriptor(
-  name='Upload',
-  full_name='file.Upload',
+_FILE = _descriptor.Descriptor(
+  name='File',
+  full_name='file.File',
   filename=None,
   file=DESCRIPTOR,
   containing_type=None,
   create_key=_descriptor._internal_create_key,
   fields=[
     _descriptor.FieldDescriptor(
-      name='file', full_name='file.Upload.file', index=0,
+      name='id', full_name='file.File.id', index=0,
+      number=1, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='name', full_name='file.File.name', index=1,
+      number=2, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='size', full_name='file.File.size', index=2,
+      number=3, type=5, cpp_type=1, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='mime_type', full_name='file.File.mime_type', index=3,
+      number=4, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='url', full_name='file.File.url', index=4,
+      number=5, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=61,
+  serialized_end=139,
+)
+
+
+_MULTIPARTUPLOAD = _descriptor.Descriptor(
+  name='MultipartUpload',
+  full_name='file.MultipartUpload',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='file', full_name='file.MultipartUpload.file', index=0,
       number=1, type=11, cpp_type=10, label=1,
       has_default_value=False, default_value=None,
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
       serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
-      name='upload_id', full_name='file.Upload.upload_id', index=1,
+      name='upload_id', full_name='file.MultipartUpload.upload_id', index=1,
       number=2, type=9, cpp_type=9, label=1,
       has_default_value=False, default_value=b"".decode('utf-8'),
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
       serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
-      name='part_size', full_name='file.Upload.part_size', index=2,
+      name='part_size', full_name='file.MultipartUpload.part_size', index=2,
       number=3, type=5, cpp_type=1, label=1,
       has_default_value=False, default_value=0,
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
       serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
-      name='part_urls', full_name='file.Upload.part_urls', index=3,
+      name='part_urls', full_name='file.MultipartUpload.part_urls', index=3,
       number=4, type=9, cpp_type=9, label=3,
       has_default_value=False, default_value=[],
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
       serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
-      name='parts', full_name='file.Upload.parts', index=4,
+      name='parts', full_name='file.MultipartUpload.parts', index=4,
       number=5, type=11, cpp_type=10, label=3,
       has_default_value=False, default_value=[],
       message_type=None, enum_type=None, containing_type=None,
@@ -83,8 +142,47 @@ _UPLOAD = _descriptor.Descriptor(
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=90,
-  serialized_end=219,
+  serialized_start=142,
+  serialized_end=278,
+)
+
+
+_UPLOAD = _descriptor.Descriptor(
+  name='Upload',
+  full_name='file.Upload',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='file', full_name='file.Upload.file', index=0,
+      number=1, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='upload_url', full_name='file.Upload.upload_url', index=1,
+      number=2, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=280,
+  serialized_end=334,
 )
 
 
@@ -122,8 +220,8 @@ _COMPLETEDPART = _descriptor.Descriptor(
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=221,
-  serialized_end=264,
+  serialized_start=336,
+  serialized_end=379,
 )
 
 
@@ -154,8 +252,8 @@ _STARTUPLOADREQUEST = _descriptor.Descriptor(
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=266,
-  serialized_end=316,
+  serialized_start=381,
+  serialized_end=440,
 )
 
 
@@ -186,8 +284,8 @@ _STARTUPLOADRESPONSE = _descriptor.Descriptor(
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=318,
-  serialized_end=369,
+  serialized_start=442,
+  serialized_end=502,
 )
 
 
@@ -218,8 +316,8 @@ _COMPLETEUPLOADREQUEST = _descriptor.Descriptor(
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=371,
-  serialized_end=424,
+  serialized_start=504,
+  serialized_end=566,
 )
 
 
@@ -250,8 +348,8 @@ _COMPLETEUPLOADRESPONSE = _descriptor.Descriptor(
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=426,
-  serialized_end=480,
+  serialized_start=568,
+  serialized_end=631,
 )
 
 
@@ -282,8 +380,8 @@ _ABORTUPLOADREQUEST = _descriptor.Descriptor(
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=482,
-  serialized_end=532,
+  serialized_start=633,
+  serialized_end=692,
 )
 
 
@@ -307,8 +405,8 @@ _ABORTUPLOADRESPONSE = _descriptor.Descriptor(
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=534,
-  serialized_end=555,
+  serialized_start=694,
+  serialized_end=715,
 )
 
 
@@ -339,8 +437,8 @@ _MOVEUPLOADREQUEST = _descriptor.Descriptor(
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=557,
-  serialized_end=606,
+  serialized_start=717,
+  serialized_end=775,
 )
 
 
@@ -371,8 +469,72 @@ _MOVEUPLOADRESPONSE = _descriptor.Descriptor(
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=608,
-  serialized_end=656,
+  serialized_start=777,
+  serialized_end=823,
+)
+
+
+_UPLOADREQUEST = _descriptor.Descriptor(
+  name='UploadRequest',
+  full_name='file.UploadRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='file', full_name='file.UploadRequest.file', index=0,
+      number=1, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=825,
+  serialized_end=866,
+)
+
+
+_UPLOADRESPONSE = _descriptor.Descriptor(
+  name='UploadResponse',
+  full_name='file.UploadResponse',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='upload', full_name='file.UploadResponse.upload', index=0,
+      number=1, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=868,
+  serialized_end=914,
 )
 
 
@@ -403,8 +565,8 @@ _GETFILEREQUEST = _descriptor.Descriptor(
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=658,
-  serialized_end=686,
+  serialized_start=916,
+  serialized_end=944,
 )
 
 
@@ -435,8 +597,8 @@ _GETFILERESPONSE = _descriptor.Descriptor(
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=688,
-  serialized_end=733,
+  serialized_start=946,
+  serialized_end=989,
 )
 
 
@@ -467,8 +629,8 @@ _DELETEFILEREQUEST = _descriptor.Descriptor(
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=735,
-  serialized_end=782,
+  serialized_start=991,
+  serialized_end=1036,
 )
 
 
@@ -492,21 +654,26 @@ _DELETEFILERESPONSE = _descriptor.Descriptor(
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=784,
-  serialized_end=804,
+  serialized_start=1038,
+  serialized_end=1058,
 )
 
-_UPLOAD.fields_by_name['file'].message_type = perxis_dot_common_dot_common__pb2._FILE
-_UPLOAD.fields_by_name['parts'].message_type = _COMPLETEDPART
-_STARTUPLOADREQUEST.fields_by_name['upload'].message_type = _UPLOAD
-_STARTUPLOADRESPONSE.fields_by_name['upload'].message_type = _UPLOAD
-_COMPLETEUPLOADREQUEST.fields_by_name['upload'].message_type = _UPLOAD
-_COMPLETEUPLOADRESPONSE.fields_by_name['upload'].message_type = _UPLOAD
-_ABORTUPLOADREQUEST.fields_by_name['upload'].message_type = _UPLOAD
-_MOVEUPLOADREQUEST.fields_by_name['upload'].message_type = _UPLOAD
-_MOVEUPLOADRESPONSE.fields_by_name['file'].message_type = perxis_dot_common_dot_common__pb2._FILE
-_GETFILERESPONSE.fields_by_name['file'].message_type = perxis_dot_common_dot_common__pb2._FILE
-_DELETEFILEREQUEST.fields_by_name['file'].message_type = perxis_dot_common_dot_common__pb2._FILE
+_MULTIPARTUPLOAD.fields_by_name['file'].message_type = _FILE
+_MULTIPARTUPLOAD.fields_by_name['parts'].message_type = _COMPLETEDPART
+_UPLOAD.fields_by_name['file'].message_type = _FILE
+_STARTUPLOADREQUEST.fields_by_name['upload'].message_type = _MULTIPARTUPLOAD
+_STARTUPLOADRESPONSE.fields_by_name['upload'].message_type = _MULTIPARTUPLOAD
+_COMPLETEUPLOADREQUEST.fields_by_name['upload'].message_type = _MULTIPARTUPLOAD
+_COMPLETEUPLOADRESPONSE.fields_by_name['upload'].message_type = _MULTIPARTUPLOAD
+_ABORTUPLOADREQUEST.fields_by_name['upload'].message_type = _MULTIPARTUPLOAD
+_MOVEUPLOADREQUEST.fields_by_name['upload'].message_type = _MULTIPARTUPLOAD
+_MOVEUPLOADRESPONSE.fields_by_name['file'].message_type = _FILE
+_UPLOADREQUEST.fields_by_name['file'].message_type = _FILE
+_UPLOADRESPONSE.fields_by_name['upload'].message_type = _UPLOAD
+_GETFILERESPONSE.fields_by_name['file'].message_type = _FILE
+_DELETEFILEREQUEST.fields_by_name['file'].message_type = _FILE
+DESCRIPTOR.message_types_by_name['File'] = _FILE
+DESCRIPTOR.message_types_by_name['MultipartUpload'] = _MULTIPARTUPLOAD
 DESCRIPTOR.message_types_by_name['Upload'] = _UPLOAD
 DESCRIPTOR.message_types_by_name['CompletedPart'] = _COMPLETEDPART
 DESCRIPTOR.message_types_by_name['StartUploadRequest'] = _STARTUPLOADREQUEST
@@ -517,12 +684,28 @@ DESCRIPTOR.message_types_by_name['AbortUploadRequest'] = _ABORTUPLOADREQUEST
 DESCRIPTOR.message_types_by_name['AbortUploadResponse'] = _ABORTUPLOADRESPONSE
 DESCRIPTOR.message_types_by_name['MoveUploadRequest'] = _MOVEUPLOADREQUEST
 DESCRIPTOR.message_types_by_name['MoveUploadResponse'] = _MOVEUPLOADRESPONSE
+DESCRIPTOR.message_types_by_name['UploadRequest'] = _UPLOADREQUEST
+DESCRIPTOR.message_types_by_name['UploadResponse'] = _UPLOADRESPONSE
 DESCRIPTOR.message_types_by_name['GetFileRequest'] = _GETFILEREQUEST
 DESCRIPTOR.message_types_by_name['GetFileResponse'] = _GETFILERESPONSE
 DESCRIPTOR.message_types_by_name['DeleteFileRequest'] = _DELETEFILEREQUEST
 DESCRIPTOR.message_types_by_name['DeleteFileResponse'] = _DELETEFILERESPONSE
 _sym_db.RegisterFileDescriptor(DESCRIPTOR)
 
+File = _reflection.GeneratedProtocolMessageType('File', (_message.Message,), {
+  'DESCRIPTOR' : _FILE,
+  '__module__' : 'perxis.file.file_pb2'
+  # @@protoc_insertion_point(class_scope:file.File)
+  })
+_sym_db.RegisterMessage(File)
+
+MultipartUpload = _reflection.GeneratedProtocolMessageType('MultipartUpload', (_message.Message,), {
+  'DESCRIPTOR' : _MULTIPARTUPLOAD,
+  '__module__' : 'perxis.file.file_pb2'
+  # @@protoc_insertion_point(class_scope:file.MultipartUpload)
+  })
+_sym_db.RegisterMessage(MultipartUpload)
+
 Upload = _reflection.GeneratedProtocolMessageType('Upload', (_message.Message,), {
   'DESCRIPTOR' : _UPLOAD,
   '__module__' : 'perxis.file.file_pb2'
@@ -593,6 +776,20 @@ MoveUploadResponse = _reflection.GeneratedProtocolMessageType('MoveUploadRespons
   })
 _sym_db.RegisterMessage(MoveUploadResponse)
 
+UploadRequest = _reflection.GeneratedProtocolMessageType('UploadRequest', (_message.Message,), {
+  'DESCRIPTOR' : _UPLOADREQUEST,
+  '__module__' : 'perxis.file.file_pb2'
+  # @@protoc_insertion_point(class_scope:file.UploadRequest)
+  })
+_sym_db.RegisterMessage(UploadRequest)
+
+UploadResponse = _reflection.GeneratedProtocolMessageType('UploadResponse', (_message.Message,), {
+  'DESCRIPTOR' : _UPLOADRESPONSE,
+  '__module__' : 'perxis.file.file_pb2'
+  # @@protoc_insertion_point(class_scope:file.UploadResponse)
+  })
+_sym_db.RegisterMessage(UploadResponse)
+
 GetFileRequest = _reflection.GeneratedProtocolMessageType('GetFileRequest', (_message.Message,), {
   'DESCRIPTOR' : _GETFILEREQUEST,
   '__module__' : 'perxis.file.file_pb2'
@@ -631,8 +828,8 @@ _FILESERVICE = _descriptor.ServiceDescriptor(
   index=0,
   serialized_options=None,
   create_key=_descriptor._internal_create_key,
-  serialized_start=807,
-  serialized_end=1226,
+  serialized_start=1061,
+  serialized_end=1535,
   methods=[
   _descriptor.MethodDescriptor(
     name='StartUpload',
@@ -674,10 +871,20 @@ _FILESERVICE = _descriptor.ServiceDescriptor(
     serialized_options=None,
     create_key=_descriptor._internal_create_key,
   ),
+  _descriptor.MethodDescriptor(
+    name='Upload',
+    full_name='file.FileService.Upload',
+    index=4,
+    containing_service=None,
+    input_type=_UPLOADREQUEST,
+    output_type=_UPLOADRESPONSE,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
   _descriptor.MethodDescriptor(
     name='GetFile',
     full_name='file.FileService.GetFile',
-    index=4,
+    index=5,
     containing_service=None,
     input_type=_GETFILEREQUEST,
     output_type=_GETFILERESPONSE,
@@ -687,7 +894,7 @@ _FILESERVICE = _descriptor.ServiceDescriptor(
   _descriptor.MethodDescriptor(
     name='DeleteFile',
     full_name='file.FileService.DeleteFile',
-    index=5,
+    index=6,
     containing_service=None,
     input_type=_DELETEFILEREQUEST,
     output_type=google_dot_protobuf_dot_empty__pb2._EMPTY,
diff --git a/perxis/file/file_pb2_grpc.py b/perxis/file/file_pb2_grpc.py
index 333d12b53f31021ae9603b4d298147dbbb097944..4798fd96d7e4125de1f8194fd6fb38eadca7492d 100644
--- a/perxis/file/file_pb2_grpc.py
+++ b/perxis/file/file_pb2_grpc.py
@@ -35,6 +35,11 @@ class FileServiceStub(object):
                 request_serializer=perxis_dot_file_dot_file__pb2.MoveUploadRequest.SerializeToString,
                 response_deserializer=perxis_dot_file_dot_file__pb2.MoveUploadResponse.FromString,
                 )
+        self.Upload = channel.unary_unary(
+                '/file.FileService/Upload',
+                request_serializer=perxis_dot_file_dot_file__pb2.UploadRequest.SerializeToString,
+                response_deserializer=perxis_dot_file_dot_file__pb2.UploadResponse.FromString,
+                )
         self.GetFile = channel.unary_unary(
                 '/file.FileService/GetFile',
                 request_serializer=perxis_dot_file_dot_file__pb2.GetFileRequest.SerializeToString,
@@ -80,6 +85,14 @@ class FileServiceServicer(object):
         context.set_details('Method not implemented!')
         raise NotImplementedError('Method not implemented!')
 
+    def Upload(self, request, context):
+        """Upload - инициация загрузки файла в хранилище. Возвращает объект, содержащий подписанный URL.
+        Завершение загрузки файла осуществляется выполнением POST-запроса
+        """
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
     def GetFile(self, request, context):
         """GetFile - получить информацию о файле (ссылку) по ID
         """
@@ -122,6 +135,11 @@ def add_FileServiceServicer_to_server(servicer, server):
                     request_deserializer=perxis_dot_file_dot_file__pb2.MoveUploadRequest.FromString,
                     response_serializer=perxis_dot_file_dot_file__pb2.MoveUploadResponse.SerializeToString,
             ),
+            'Upload': grpc.unary_unary_rpc_method_handler(
+                    servicer.Upload,
+                    request_deserializer=perxis_dot_file_dot_file__pb2.UploadRequest.FromString,
+                    response_serializer=perxis_dot_file_dot_file__pb2.UploadResponse.SerializeToString,
+            ),
             'GetFile': grpc.unary_unary_rpc_method_handler(
                     servicer.GetFile,
                     request_deserializer=perxis_dot_file_dot_file__pb2.GetFileRequest.FromString,
@@ -210,6 +228,23 @@ class FileService(object):
             options, channel_credentials,
             insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
 
+    @staticmethod
+    def Upload(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/file.FileService/Upload',
+            perxis_dot_file_dot_file__pb2.UploadRequest.SerializeToString,
+            perxis_dot_file_dot_file__pb2.UploadResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
     @staticmethod
     def GetFile(request,
             target,
diff --git a/perxis/image/image_pb2.py b/perxis/image/image_pb2.py
new file mode 100644
index 0000000000000000000000000000000000000000..9a79e731f51464b1d170ac2e1c0f5e32cf2aef4e
--- /dev/null
+++ b/perxis/image/image_pb2.py
@@ -0,0 +1,237 @@
+# -*- coding: utf-8 -*-
+# Generated by the protocol buffer compiler.  DO NOT EDIT!
+# source: perxis/image/image.proto
+"""Generated protocol buffer code."""
+from google.protobuf import descriptor as _descriptor
+from google.protobuf import message as _message
+from google.protobuf import reflection as _reflection
+from google.protobuf import symbol_database as _symbol_database
+# @@protoc_insertion_point(imports)
+
+_sym_db = _symbol_database.Default()
+
+
+from perxis.file import file_pb2 as perxis_dot_file_dot_file__pb2
+
+
+DESCRIPTOR = _descriptor.FileDescriptor(
+  name='perxis/image/image.proto',
+  package='image',
+  syntax='proto3',
+  serialized_options=b'Z,github.com/perxteam/perxis/proto/image;image',
+  create_key=_descriptor._internal_create_key,
+  serialized_pb=b'\n\x18perxis/image/image.proto\x12\x05image\x1a\x16perxis/file/file.proto\"\"\n\x05Param\x12\n\n\x02op\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x03(\t\"\x80\x01\n\nGetRequest\x12\x1a\n\x06source\x18\x01 \x01(\x0b\x32\n.file.File\x12*\n\x04opts\x18\x02 \x01(\x0b\x32\x1c.image.GetRequest.GetOptions\x1a*\n\nGetOptions\x12\x1c\n\x06params\x18\x01 \x03(\x0b\x32\x0c.image.Param\")\n\x0bGetResponse\x12\x1a\n\x06result\x18\x01 \x01(\x0b\x32\n.file.File2>\n\x0cImageService\x12.\n\x03Get\x12\x11.image.GetRequest\x1a\x12.image.GetResponse\"\x00\x42.Z,github.com/perxteam/perxis/proto/image;imageb\x06proto3'
+  ,
+  dependencies=[perxis_dot_file_dot_file__pb2.DESCRIPTOR,])
+
+
+
+
+_PARAM = _descriptor.Descriptor(
+  name='Param',
+  full_name='image.Param',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='op', full_name='image.Param.op', index=0,
+      number=1, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='value', full_name='image.Param.value', index=1,
+      number=2, type=9, cpp_type=9, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=59,
+  serialized_end=93,
+)
+
+
+_GETREQUEST_GETOPTIONS = _descriptor.Descriptor(
+  name='GetOptions',
+  full_name='image.GetRequest.GetOptions',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='params', full_name='image.GetRequest.GetOptions.params', index=0,
+      number=1, type=11, cpp_type=10, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=182,
+  serialized_end=224,
+)
+
+_GETREQUEST = _descriptor.Descriptor(
+  name='GetRequest',
+  full_name='image.GetRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='source', full_name='image.GetRequest.source', index=0,
+      number=1, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='opts', full_name='image.GetRequest.opts', index=1,
+      number=2, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[_GETREQUEST_GETOPTIONS, ],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=96,
+  serialized_end=224,
+)
+
+
+_GETRESPONSE = _descriptor.Descriptor(
+  name='GetResponse',
+  full_name='image.GetResponse',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='result', full_name='image.GetResponse.result', index=0,
+      number=1, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=226,
+  serialized_end=267,
+)
+
+_GETREQUEST_GETOPTIONS.fields_by_name['params'].message_type = _PARAM
+_GETREQUEST_GETOPTIONS.containing_type = _GETREQUEST
+_GETREQUEST.fields_by_name['source'].message_type = perxis_dot_file_dot_file__pb2._FILE
+_GETREQUEST.fields_by_name['opts'].message_type = _GETREQUEST_GETOPTIONS
+_GETRESPONSE.fields_by_name['result'].message_type = perxis_dot_file_dot_file__pb2._FILE
+DESCRIPTOR.message_types_by_name['Param'] = _PARAM
+DESCRIPTOR.message_types_by_name['GetRequest'] = _GETREQUEST
+DESCRIPTOR.message_types_by_name['GetResponse'] = _GETRESPONSE
+_sym_db.RegisterFileDescriptor(DESCRIPTOR)
+
+Param = _reflection.GeneratedProtocolMessageType('Param', (_message.Message,), {
+  'DESCRIPTOR' : _PARAM,
+  '__module__' : 'perxis.image.image_pb2'
+  # @@protoc_insertion_point(class_scope:image.Param)
+  })
+_sym_db.RegisterMessage(Param)
+
+GetRequest = _reflection.GeneratedProtocolMessageType('GetRequest', (_message.Message,), {
+
+  'GetOptions' : _reflection.GeneratedProtocolMessageType('GetOptions', (_message.Message,), {
+    'DESCRIPTOR' : _GETREQUEST_GETOPTIONS,
+    '__module__' : 'perxis.image.image_pb2'
+    # @@protoc_insertion_point(class_scope:image.GetRequest.GetOptions)
+    })
+  ,
+  'DESCRIPTOR' : _GETREQUEST,
+  '__module__' : 'perxis.image.image_pb2'
+  # @@protoc_insertion_point(class_scope:image.GetRequest)
+  })
+_sym_db.RegisterMessage(GetRequest)
+_sym_db.RegisterMessage(GetRequest.GetOptions)
+
+GetResponse = _reflection.GeneratedProtocolMessageType('GetResponse', (_message.Message,), {
+  'DESCRIPTOR' : _GETRESPONSE,
+  '__module__' : 'perxis.image.image_pb2'
+  # @@protoc_insertion_point(class_scope:image.GetResponse)
+  })
+_sym_db.RegisterMessage(GetResponse)
+
+
+DESCRIPTOR._options = None
+
+_IMAGESERVICE = _descriptor.ServiceDescriptor(
+  name='ImageService',
+  full_name='image.ImageService',
+  file=DESCRIPTOR,
+  index=0,
+  serialized_options=None,
+  create_key=_descriptor._internal_create_key,
+  serialized_start=269,
+  serialized_end=331,
+  methods=[
+  _descriptor.MethodDescriptor(
+    name='Get',
+    full_name='image.ImageService.Get',
+    index=0,
+    containing_service=None,
+    input_type=_GETREQUEST,
+    output_type=_GETRESPONSE,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+])
+_sym_db.RegisterServiceDescriptor(_IMAGESERVICE)
+
+DESCRIPTOR.services_by_name['ImageService'] = _IMAGESERVICE
+
+# @@protoc_insertion_point(module_scope)
diff --git a/perxis/image/image_pb2_grpc.py b/perxis/image/image_pb2_grpc.py
new file mode 100644
index 0000000000000000000000000000000000000000..d5a7e66725d80077cc620bbc3f810cccc0defef3
--- /dev/null
+++ b/perxis/image/image_pb2_grpc.py
@@ -0,0 +1,77 @@
+# Generated by the gRPC Python protocol compiler plugin. DO NOT EDIT!
+"""Client and server classes corresponding to protobuf-defined services."""
+import grpc
+
+from perxis.image import image_pb2 as perxis_dot_image_dot_image__pb2
+
+
+class ImageServiceStub(object):
+    """ImageService - сервис для обработки изображений
+    """
+
+    def __init__(self, channel):
+        """Constructor.
+
+        Args:
+            channel: A grpc.Channel.
+        """
+        self.Get = channel.unary_unary(
+                '/image.ImageService/Get',
+                request_serializer=perxis_dot_image_dot_image__pb2.GetRequest.SerializeToString,
+                response_deserializer=perxis_dot_image_dot_image__pb2.GetResponse.FromString,
+                )
+
+
+class ImageServiceServicer(object):
+    """ImageService - сервис для обработки изображений
+    """
+
+    def Get(self, request, context):
+        """Get - к файлу, идентификатор которого передан в запросе, применяются параметры.
+        Может быть передано несколько параметров, порядок учитывается при обработке
+        Допустимые операции:
+        - crop (ширина, высота)
+        - fit (ширина, высота)
+        - resize (ширина, высота)
+        - format (один из форматов [ png, jpeg, jpg, gif ]
+        Возвращает объект File с заполненным полем File.URL
+        """
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+
+def add_ImageServiceServicer_to_server(servicer, server):
+    rpc_method_handlers = {
+            'Get': grpc.unary_unary_rpc_method_handler(
+                    servicer.Get,
+                    request_deserializer=perxis_dot_image_dot_image__pb2.GetRequest.FromString,
+                    response_serializer=perxis_dot_image_dot_image__pb2.GetResponse.SerializeToString,
+            ),
+    }
+    generic_handler = grpc.method_handlers_generic_handler(
+            'image.ImageService', rpc_method_handlers)
+    server.add_generic_rpc_handlers((generic_handler,))
+
+
+ # This class is part of an EXPERIMENTAL API.
+class ImageService(object):
+    """ImageService - сервис для обработки изображений
+    """
+
+    @staticmethod
+    def Get(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/image.ImageService/Get',
+            perxis_dot_image_dot_image__pb2.GetRequest.SerializeToString,
+            perxis_dot_image_dot_image__pb2.GetResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
diff --git a/perxis/items/items_pb2.py b/perxis/items/items_pb2.py
index a44076d460c677cfd7096dd2eb40ccfaf58535bb..0b51318112a146db8c5b640e3a7409c9d7166d61 100644
--- a/perxis/items/items_pb2.py
+++ b/perxis/items/items_pb2.py
@@ -23,7 +23,7 @@ DESCRIPTOR = _descriptor.FileDescriptor(
   syntax='proto3',
   serialized_options=b'Z,github.com/perxteam/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\"\xb1\x04\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.\n\ncreated_at\x18\x06 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x12\n\ncreated_by\x18\x07 \x01(\t\x12%\n\x04\x64\x61ta\x18\x08 \x01(\x0b\x32\x17.google.protobuf.Struct\x12;\n\x0ctranslations\x18\t \x03(\x0b\x32%.content.items.Item.TranslationsEntry\x12\x13\n\x0brevision_id\x18\n \x01(\t\x12\x30\n\x0cpublished_at\x18\x0b \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x14\n\x0cpublished_by\x18\x0c \x01(\t\x12/\n\x0b\x61rchived_at\x18\r \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x13\n\x0b\x61rchived_by\x18\x0e \x01(\t\x1aL\n\x11TranslationsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12&\n\x05value\x18\x02 \x01(\x0b\x32\x17.google.protobuf.Struct:\x02\x38\x01\"!\n\x05State\x12\t\n\x05\x44RAFT\x10\x00\x12\r\n\tPUBLISHED\x10\x01\"2\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\"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\"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\"\x93\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\x13.common.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\"r\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\x11\n\tlocale_id\x18\x04 \x01(\t\x12\x0f\n\x07item_id\x18\x05 \x01(\t\"9\n\x14GetPublishedResponse\x12!\n\x04item\x18\x01 \x01(\x0b\x32\x13.content.items.Item\"\xaf\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\x11\n\tlocale_id\x18\x04 \x01(\t\x12%\n\x06\x66ilter\x18\x05 \x01(\x0b\x32\x15.content.items.Filter\x12$\n\x07options\x18\x06 \x01(\x0b\x32\x13.common.FindOptions\"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\"\x9b\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\x05 \x01(\x0b\x32\x15.content.items.Filter\x12$\n\x07options\x18\x06 \x01(\x0b\x32\x13.common.FindOptions\"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\xb9\x08\n\x05Items\x12G\n\x06\x43reate\x12\x1c.content.items.CreateRequest\x1a\x1d.content.items.CreateResponse\"\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\"\xcc\x04\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.\n\ncreated_at\x18\x06 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x12\n\ncreated_by\x18\x07 \x01(\t\x12%\n\x04\x64\x61ta\x18\x08 \x01(\x0b\x32\x17.google.protobuf.Struct\x12;\n\x0ctranslations\x18\t \x03(\x0b\x32%.content.items.Item.TranslationsEntry\x12\x13\n\x0brevision_id\x18\n \x01(\t\x12\x30\n\x0cpublished_at\x18\x0b \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x14\n\x0cpublished_by\x18\x0c \x01(\t\x12/\n\x0b\x61rchived_at\x18\r \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x13\n\x0b\x61rchived_by\x18\x0e \x01(\t\x1aL\n\x11TranslationsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12&\n\x05value\x18\x02 \x01(\x0b\x32\x17.google.protobuf.Struct:\x02\x38\x01\"<\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\"2\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\"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\"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\"\x93\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\x13.common.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\"r\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\x11\n\tlocale_id\x18\x04 \x01(\t\x12\x0f\n\x07item_id\x18\x05 \x01(\t\"9\n\x14GetPublishedResponse\x12!\n\x04item\x18\x01 \x01(\x0b\x32\x13.content.items.Item\"\xaf\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\x11\n\tlocale_id\x18\x04 \x01(\t\x12%\n\x06\x66ilter\x18\x05 \x01(\x0b\x32\x15.content.items.Filter\x12$\n\x07options\x18\x06 \x01(\x0b\x32\x13.common.FindOptions\"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\"\x9b\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\x05 \x01(\x0b\x32\x15.content.items.Filter\x12$\n\x07options\x18\x06 \x01(\x0b\x32\x13.common.FindOptions\"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\xb9\x08\n\x05Items\x12G\n\x06\x43reate\x12\x1c.content.items.CreateRequest\x1a\x1d.content.items.CreateResponse\"\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'
   ,
   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,])
 
@@ -46,11 +46,21 @@ _ITEM_STATE = _descriptor.EnumDescriptor(
       serialized_options=None,
       type=None,
       create_key=_descriptor._internal_create_key),
+    _descriptor.EnumValueDescriptor(
+      name='CHANGED', index=2, number=2,
+      serialized_options=None,
+      type=None,
+      create_key=_descriptor._internal_create_key),
+    _descriptor.EnumValueDescriptor(
+      name='ARCHIVED', index=3, number=3,
+      serialized_options=None,
+      type=None,
+      create_key=_descriptor._internal_create_key),
   ],
   containing_type=None,
   serialized_options=None,
   serialized_start=902,
-  serialized_end=935,
+  serialized_end=962,
 )
 _sym_db.RegisterEnumDescriptor(_ITEM_STATE)
 
@@ -348,7 +358,7 @@ _ITEM = _descriptor.Descriptor(
   oneofs=[
   ],
   serialized_start=374,
-  serialized_end=935,
+  serialized_end=962,
 )
 
 
@@ -386,8 +396,8 @@ _FILTER = _descriptor.Descriptor(
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=937,
-  serialized_end=987,
+  serialized_start=964,
+  serialized_end=1014,
 )
 
 
@@ -418,8 +428,8 @@ _CREATEREQUEST = _descriptor.Descriptor(
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=989,
-  serialized_end=1039,
+  serialized_start=1016,
+  serialized_end=1066,
 )
 
 
@@ -450,8 +460,8 @@ _CREATERESPONSE = _descriptor.Descriptor(
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=1041,
-  serialized_end=1095,
+  serialized_start=1068,
+  serialized_end=1122,
 )
 
 
@@ -503,8 +513,8 @@ _GETREQUEST = _descriptor.Descriptor(
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=1097,
-  serialized_end=1183,
+  serialized_start=1124,
+  serialized_end=1210,
 )
 
 
@@ -535,8 +545,8 @@ _GETRESPONSE = _descriptor.Descriptor(
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=1185,
-  serialized_end=1233,
+  serialized_start=1212,
+  serialized_end=1260,
 )
 
 
@@ -595,8 +605,8 @@ _FINDREQUEST = _descriptor.Descriptor(
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=1236,
-  serialized_end=1383,
+  serialized_start=1263,
+  serialized_end=1410,
 )
 
 
@@ -634,8 +644,8 @@ _FINDRESPONSE = _descriptor.Descriptor(
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=1385,
-  serialized_end=1450,
+  serialized_start=1412,
+  serialized_end=1477,
 )
 
 
@@ -666,8 +676,8 @@ _UPDATEREQUEST = _descriptor.Descriptor(
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=1452,
-  serialized_end=1502,
+  serialized_start=1479,
+  serialized_end=1529,
 )
 
 
@@ -719,8 +729,8 @@ _DELETEREQUEST = _descriptor.Descriptor(
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=1504,
-  serialized_end=1593,
+  serialized_start=1531,
+  serialized_end=1620,
 )
 
 
@@ -751,8 +761,8 @@ _PUBLISHREQUEST = _descriptor.Descriptor(
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=1595,
-  serialized_end=1646,
+  serialized_start=1622,
+  serialized_end=1673,
 )
 
 
@@ -804,8 +814,8 @@ _UNPUBLISHREQUEST = _descriptor.Descriptor(
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=1648,
-  serialized_end=1740,
+  serialized_start=1675,
+  serialized_end=1767,
 )
 
 
@@ -864,8 +874,8 @@ _GETPUBLISHEDREQUEST = _descriptor.Descriptor(
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=1742,
-  serialized_end=1856,
+  serialized_start=1769,
+  serialized_end=1883,
 )
 
 
@@ -896,8 +906,8 @@ _GETPUBLISHEDRESPONSE = _descriptor.Descriptor(
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=1858,
-  serialized_end=1915,
+  serialized_start=1885,
+  serialized_end=1942,
 )
 
 
@@ -963,8 +973,8 @@ _FINDPUBLISHEDREQUEST = _descriptor.Descriptor(
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=1918,
-  serialized_end=2093,
+  serialized_start=1945,
+  serialized_end=2120,
 )
 
 
@@ -1002,8 +1012,8 @@ _FINDPUBLISHEDRESPONSE = _descriptor.Descriptor(
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=2095,
-  serialized_end=2169,
+  serialized_start=2122,
+  serialized_end=2196,
 )
 
 
@@ -1062,8 +1072,8 @@ _GETREVISIONREQUEST = _descriptor.Descriptor(
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=2171,
-  serialized_end=2286,
+  serialized_start=2198,
+  serialized_end=2313,
 )
 
 
@@ -1094,8 +1104,8 @@ _GETREVISIONRESPONSE = _descriptor.Descriptor(
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=2288,
-  serialized_end=2344,
+  serialized_start=2315,
+  serialized_end=2371,
 )
 
 
@@ -1147,8 +1157,8 @@ _LISTREVISIONSREQUEST = _descriptor.Descriptor(
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=2346,
-  serialized_end=2442,
+  serialized_start=2373,
+  serialized_end=2469,
 )
 
 
@@ -1179,8 +1189,8 @@ _LISTREVISIONSRESPONSE = _descriptor.Descriptor(
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=2444,
-  serialized_end=2503,
+  serialized_start=2471,
+  serialized_end=2530,
 )
 
 
@@ -1211,8 +1221,8 @@ _ARCHIVEREQUEST = _descriptor.Descriptor(
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=2505,
-  serialized_end=2556,
+  serialized_start=2532,
+  serialized_end=2583,
 )
 
 
@@ -1264,8 +1274,8 @@ _UNARCHIVEREQUEST = _descriptor.Descriptor(
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=2558,
-  serialized_end=2650,
+  serialized_start=2585,
+  serialized_end=2677,
 )
 
 
@@ -1324,8 +1334,8 @@ _FINDARCHIVEDREQUEST = _descriptor.Descriptor(
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=2653,
-  serialized_end=2808,
+  serialized_start=2680,
+  serialized_end=2835,
 )
 
 
@@ -1363,8 +1373,8 @@ _FINDARCHIVEDRESPONSE = _descriptor.Descriptor(
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=2810,
-  serialized_end=2883,
+  serialized_start=2837,
+  serialized_end=2910,
 )
 
 _DECODEERROR.fields_by_name['errors'].message_type = _ERROR
@@ -1643,8 +1653,8 @@ _ITEMS = _descriptor.ServiceDescriptor(
   index=0,
   serialized_options=None,
   create_key=_descriptor._internal_create_key,
-  serialized_start=2886,
-  serialized_end=3967,
+  serialized_start=2913,
+  serialized_end=3994,
   methods=[
   _descriptor.MethodDescriptor(
     name='Create',
diff --git a/perxis/roles/roles_pb2.py b/perxis/roles/roles_pb2.py
index 4b931c2ffc81adeee9899225f6a38e5ccf0f90d3..011d293a02647687f7706ae72211822306e32bee 100644
--- a/perxis/roles/roles_pb2.py
+++ b/perxis/roles/roles_pb2.py
@@ -21,7 +21,7 @@ DESCRIPTOR = _descriptor.FileDescriptor(
   syntax='proto3',
   serialized_options=b'Z,github.com/perxteam/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\"d\n\x04Role\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\x04 \x01(\t\x12\x1b\n\x05rules\x18\x05 \x03(\x0b\x32\x0c.common.Rule\"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\"V\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\"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'
   ,
   dependencies=[google_dot_protobuf_dot_empty__pb2.DESCRIPTOR,perxis_dot_common_dot_common__pb2.DESCRIPTOR,])
 
@@ -51,22 +51,15 @@ _ROLE = _descriptor.Descriptor(
       is_extension=False, extension_scope=None,
       serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
-      name='name', full_name='content.roles.Role.name', index=2,
+      name='description', full_name='content.roles.Role.description', index=2,
       number=3, type=9, cpp_type=9, label=1,
       has_default_value=False, default_value=b"".decode('utf-8'),
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
       serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
-      name='description', full_name='content.roles.Role.description', index=3,
-      number=4, type=9, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"".decode('utf-8'),
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='rules', full_name='content.roles.Role.rules', index=4,
-      number=5, type=11, cpp_type=10, label=3,
+      name='rules', full_name='content.roles.Role.rules', index=3,
+      number=4, type=11, cpp_type=10, label=3,
       has_default_value=False, default_value=[],
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
@@ -84,7 +77,7 @@ _ROLE = _descriptor.Descriptor(
   oneofs=[
   ],
   serialized_start=100,
-  serialized_end=200,
+  serialized_end=186,
 )
 
 
@@ -115,8 +108,8 @@ _CREATEREQUEST = _descriptor.Descriptor(
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=202,
-  serialized_end=252,
+  serialized_start=188,
+  serialized_end=238,
 )
 
 
@@ -147,8 +140,8 @@ _CREATERESPONSE = _descriptor.Descriptor(
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=254,
-  serialized_end=308,
+  serialized_start=240,
+  serialized_end=294,
 )
 
 
@@ -186,8 +179,8 @@ _GETREQUEST = _descriptor.Descriptor(
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=310,
-  serialized_end=357,
+  serialized_start=296,
+  serialized_end=343,
 )
 
 
@@ -218,8 +211,8 @@ _GETRESPONSE = _descriptor.Descriptor(
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=359,
-  serialized_end=407,
+  serialized_start=345,
+  serialized_end=393,
 )
 
 
@@ -250,8 +243,8 @@ _UPDATEREQUEST = _descriptor.Descriptor(
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=409,
-  serialized_end=459,
+  serialized_start=395,
+  serialized_end=445,
 )
 
 
@@ -282,8 +275,8 @@ _LISTREQUEST = _descriptor.Descriptor(
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=461,
-  serialized_end=492,
+  serialized_start=447,
+  serialized_end=478,
 )
 
 
@@ -314,8 +307,8 @@ _LISTRESPONSE = _descriptor.Descriptor(
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=494,
-  serialized_end=544,
+  serialized_start=480,
+  serialized_end=530,
 )
 
 
@@ -353,8 +346,8 @@ _DELETEREQUEST = _descriptor.Descriptor(
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=546,
-  serialized_end=596,
+  serialized_start=532,
+  serialized_end=582,
 )
 
 _ROLE.fields_by_name['rules'].message_type = perxis_dot_common_dot_common__pb2._RULE
@@ -447,8 +440,8 @@ _ROLES = _descriptor.ServiceDescriptor(
   index=0,
   serialized_options=None,
   create_key=_descriptor._internal_create_key,
-  serialized_start=599,
-  serialized_end=942,
+  serialized_start=585,
+  serialized_end=928,
   methods=[
   _descriptor.MethodDescriptor(
     name='Create',
diff --git a/proto/perxis/common/common.proto b/proto/perxis/common/common.proto
index 181c57b343a42bcbc5fece655a7979eb76506be9..0744d5892b1a53600e7256c082ef72fbe77a4233 100644
--- a/proto/perxis/common/common.proto
+++ b/proto/perxis/common/common.proto
@@ -4,158 +4,44 @@ option go_package = "github.com/perxteam/perxis/proto/common;common";
 
 package common;
 
-import "google/protobuf/timestamp.proto";
 import "google/protobuf/struct.proto";
-import "google/protobuf/wrappers.proto";
-
-// Пользователь
-message User {
-  string id = 1; // Уникальный идентификатор, присваивается системой
-  string name = 2; // Уникальное имя, login
-  repeated string identities = 3; // Authorization subjects (JWT sub claims)
-  string display_name = 4; // Имя пользователя для отображения
-  string email = 5; // Email, указывается пользователем
-  bool email_verified = 6; // Флаг что email проверен
-  string avatar_uri = 7; // URI изображения пользователя
-  google.protobuf.BoolValue system = 10; // Системный пользователь (может получать доступ к расширенному API)
-}
-
-// Организация
-message Organization {
-  string id = 1; // Идентификатор организации
-  string name = 2; // Имя организации
-  string description = 3; // Описание организации
-  string logo_uri = 5; // URI изображения логотипа
-}
-
-// Роль пользователя в организации
-enum Role {
-  NOT_MEMBER = 0; // Не является членом команды - значение по умолчанию
-  MEMBER = 1; // Входит в организацию и команды, может получать доступ к Space в соответствии с политикой доступа
-  OWNER = 2; // admin + может приглашать пользователей на роль owner
-  ADMIN = 3; // Входит в организацию, видит все Space, может задавать политики доступа, может приглашать пользователей на роли member, admin
-}
-
-message OrganizationMembership {
-  string id = 1;
-  string organization_id = 2;
-  string user_id = 3;
-  Role role = 4;
-}
-
-// Приглашение пользователя для членства в пространстве.
-// Для принятия приглашения пользователь должен быть авторизован.
-message SpaceInvitation {
-  string id = 1; // Идентификатор приглашения
-  string email = 2; // Почтовый адрес пользователя
-  string organization_id = 3; // Идентификатор организации которой принадлежит пространство
-  string space_id = 4; // Идентификатор пространства в которую приглашается пользователь
-  string created_by = 5; // Идентификатор пользователя отправивший приглашение
-  string space_role = 6; // Роль для пользователя в пространстве
-  bool sent = 7; // Флаг отправки приглашения
-  bool pending = 8; // Флаг принятия приглашения
-  google.protobuf.Timestamp created_at = 9; // Время создания приглашения
-  google.protobuf.Timestamp sent_at = 10; // Время отправки приглашения
-  google.protobuf.Timestamp valid_until = 11; // Время до которого приглашение действует
-}
-
-
-// Space
-message Space {
-  string id = 1;
-  string organization_id = 2;
-  string name = 3;
-  string description = 4;
-  string host = 5;
-  string api_url = 6;
-}
-
-// Collection
-message Collection  {
-  string id = 1;
-  string space_id = 2;
-  string environment_id = 3;
-  string name = 4;
-  string schema = 5;
-  google.protobuf.BoolValue single = 6;
-  google.protobuf.BoolValue hidden = 7;
-  google.protobuf.BoolValue system = 8;
-}
 
-// Item
-message Item {
-  string id = 1;
-  string space_id = 2;
-  string environment_id = 3;
-  string collection_id = 4;
-  string status = 5;
-  google.protobuf.Timestamp created_at = 6;
-  string created_by = 7;
-  google.protobuf.Struct data = 8;
-  map<string, google.protobuf.Struct> translations = 9;
-  string revision_id = 10;
-  google.protobuf.Timestamp published_at = 11;
-  string published_by = 12;
-  google.protobuf.Timestamp archived_at = 13;
-  string archived_by = 14;
-}
-
-message FindItemsOptions {
-  string space_id = 1;
-  string environment_id = 2;
-  string collection_id = 3;
-  repeated Filter filters = 4;
-  int32 page_num = 8;
-  int32 page_size = 9;
-  repeated string sort = 10;
-}
-
-// Environment
-message Environment {
-  string id = 1;
-  string space_id = 2;
-  string description = 3;
-  enum State {
-    UNKNOWN = 0;
-    PENDING = 1;
-    READY = 2;
-    FAILED = 3;
+message Error {
+  message BadRequest {
+    message FieldViolation {
+      string field = 1;
+      string description = 2;
+    }
+    repeated FieldViolation errors = 1;
   }
-  State state = 4;
-  repeated string aliases = 5;
-}
 
-// Locale
-message Locale {
-  string id = 1;
-  string name = 2;
-  string space_id = 3;
-}
+  message Help {
+    message Link {
+      string description =1;
+      string url = 2;
+    }
+    repeated Link links = 1;
+  }
 
-message SpaceRole {
-  string id = 1;
-  string name = 2;
-  string space_id = 3;
-  string description = 5;
-  repeated ContentRule content_rules = 6;
-}
+  message DebugInfo {
+    repeated string stack_trace = 1;
+    string detail = 2;
+  }
 
-message ContentRule {
-  string id = 1;
-  string collection_id = 2;
-  ItemAccess create = 5;
-  ItemAccess read = 6;
-  ItemAccess update = 7;
-  ItemAccess delete = 8;
-  repeated string fields_read_blacklist = 10;
-  repeated string fields_write_blacklist = 11;
-}
+  message LocalizedMessage {
+    string locale = 1;
+    string message = 2;
+  }
 
-enum ItemAccess {
-  NONE = 0;
-//  ANY = 1;
-//  MINE = 2;
-//  ROLE = 3;
+  uint64 error_code = 1; // Код ошибки
+  string error_id = 2; // ID конкретного инцидента, ID уникальна для каждого случая.
+  string reason = 3; // ???
+  string domain = 4; // Сервис,Пакет к которому относится ошибка
+  map<string,string> metadata = 9; // Мета-информация
+  BadRequest bad_request = 10; // Ошибка запроса
+  DebugInfo debug_info = 11; // Отладочная информация
+  Help help = 100; // Пользовательская информации и инструкции
+  repeated LocalizedMessage localized_messages = 200; // Перевод сообщения об ошибке
 }
 
 message Filter {
@@ -164,14 +50,6 @@ message Filter {
   google.protobuf.Value value = 3;
 }
 
-message File {
-  string id = 1;        // Уникальный идентификатор файла в хранилище
-  string name = 2;      // Имя файла
-  int32 size = 3;       // Размер файла
-  string mime_type = 4; // Mime-type файла
-  string url = 5;       // Адрес для загрузки файла
-}
-
 message FindOptions {
   repeated string sort = 1;
   int32 page_num = 2;
@@ -197,8 +75,9 @@ message Rule {
   string collection_id = 1;
   repeated Action actions = 2;
   Access access = 3;
-  repeated string fields = 6;
-  bool fields_allowed = 7;
+  repeated string hidden_fields = 5;
+  repeated string readonly_fields = 6;
+  repeated string writeonly_fields = 7;
 }
 
 message Collaborator {
diff --git a/proto/perxis/file/file.proto b/proto/perxis/file/file.proto
index 6df938f1e4b609c8bba56778f792bfed3ed787fe..98efa87abbbce362cc39ac9f4a9346036e34bba2 100644
--- a/proto/perxis/file/file.proto
+++ b/proto/perxis/file/file.proto
@@ -1,21 +1,34 @@
 syntax = "proto3";
 
 import "google/protobuf/empty.proto";
-import "perxis/common/common.proto";
 
 option go_package = "github.com/perxteam/perxis/proto/file;file";
 
 package file;
 
 // Сущности
-message Upload {
-  common.File file = 1;
+
+message File {
+  string id = 1;        // Уникальный идентификатор файла в хранилище
+  string name = 2;      // Имя файла
+  int32 size = 3;       // Размер файла
+  string mime_type = 4; // Mime-type файла
+  string url = 5;       // Адрес для загрузки файла
+}
+
+message MultipartUpload {
+  File file = 1;
   string upload_id = 2;           // Идентификатор загрузки хранилища
   int32 part_size = 3;           // Размер блока для загрузки
   repeated string part_urls = 4; // Адреса для загрузки пол
   repeated CompletedPart parts = 5;  // Идентификаторы загруженных блоков (S3 ETAGs)
 }
 
+message Upload {
+  File file = 1;
+  string upload_url = 2;   // URL для загрузки файлов
+}
+
 message CompletedPart {
   int32 number = 1;
   string id = 2;
@@ -24,40 +37,47 @@ message CompletedPart {
 // Запросы и ответы
 
 message StartUploadRequest {
-  Upload upload = 1;
+  MultipartUpload upload = 1;
 }
 message StartUploadResponse {
-  Upload upload = 1;
+  MultipartUpload upload = 1;
 }
 
 message CompleteUploadRequest {
-  Upload upload = 1;
+  MultipartUpload upload = 1;
 }
 message CompleteUploadResponse {
-  Upload upload = 1;
+  MultipartUpload upload = 1;
 }
 
 message AbortUploadRequest {
-  Upload upload = 1;
+  MultipartUpload upload = 1;
 }
 message AbortUploadResponse {}
 
 message MoveUploadRequest {
-  Upload upload = 1;
+  MultipartUpload upload = 1;
 }
 message MoveUploadResponse {
-  common.File file = 1;
+  File file = 1;
+}
+
+message UploadRequest {
+  File file = 1;
+}
+message UploadResponse {
+  Upload upload = 1;
 }
 
 message GetFileRequest {
   string id = 1;
 }
 message GetFileResponse {
-  common.File file = 1;
+  File file = 1;
 }
 
 message DeleteFileRequest {
-  common.File file = 1;
+  File file = 1;
 }
 message DeleteFileResponse {}
 
@@ -76,6 +96,10 @@ service FileService {
   // После перемещение загрузки хранилище выдает новый идентификатор постоянного файла
   rpc MoveUpload(MoveUploadRequest) returns(MoveUploadResponse) {}
 
+  // Upload - инициация загрузки файла в хранилище. Возвращает объект, содержащий подписанный URL.
+  // Завершение загрузки файла осуществляется выполнением POST-запроса
+  rpc Upload(UploadRequest) returns(UploadResponse) {}
+
   // GetFile - получить информацию о файле (ссылку) по ID
   rpc GetFile(GetFileRequest) returns(GetFileResponse) {}
 
diff --git a/proto/perxis/image/image.proto b/proto/perxis/image/image.proto
new file mode 100644
index 0000000000000000000000000000000000000000..13d22d6ed9306c4123befbf1fe76742f951999fb
--- /dev/null
+++ b/proto/perxis/image/image.proto
@@ -0,0 +1,40 @@
+syntax = "proto3";
+
+import "perxis/file/file.proto";
+
+option go_package = "github.com/perxteam/perxis/proto/image;image";
+
+package image;
+
+message Param {
+  string op = 1;
+  repeated string value = 2;
+}
+
+message GetRequest {
+
+  message GetOptions {
+    repeated Param params = 1;
+  }
+
+  file.File source = 1;
+  GetOptions opts = 2;
+}
+
+message GetResponse {
+  file.File result = 1;
+}
+
+// ImageService - сервис для обработки изображений
+service ImageService {
+
+  // Get - к файлу, идентификатор которого передан в запросе, применяются параметры.
+  // Может быть передано несколько параметров, порядок учитывается при обработке
+  // Допустимые операции:
+  //  - crop (ширина, высота)
+  //  - fit (ширина, высота)
+  //  - resize (ширина, высота)
+  //  - format (один из форматов [ png, jpeg, jpg, gif ]
+  // Возвращает объект File с заполненным полем File.URL
+  rpc Get(GetRequest) returns(GetResponse) {}
+}
diff --git a/proto/perxis/items/items.proto b/proto/perxis/items/items.proto
index c62174125702e8b344169a3faae4c07f1fce8523..88f188c7c7e65f853a9fd070dd1e0866f6915e09 100644
--- a/proto/perxis/items/items.proto
+++ b/proto/perxis/items/items.proto
@@ -31,6 +31,8 @@ message Item {
   enum State {
     DRAFT = 0;
     PUBLISHED = 1;
+    CHANGED = 2;
+    ARCHIVED = 3;
   }
   string id = 1;
   string space_id = 2;
diff --git a/proto/perxis/roles/roles.proto b/proto/perxis/roles/roles.proto
index 7993c6749a53c340f1f7322399dbfd9f1ea6a790..28c454761c8cd8077396cecc063dda75a70bfcee 100644
--- a/proto/perxis/roles/roles.proto
+++ b/proto/perxis/roles/roles.proto
@@ -10,9 +10,8 @@ package content.roles;
 message Role {
   string id = 1;
   string space_id = 2;
-  string name = 3;
-  string description = 4;
-  repeated common.Rule rules = 5;
+  string description = 3;
+  repeated common.Rule rules = 4;
 }
 
 message CreateRequest {