diff --git a/build-requirements.txt b/build-requirements.txt
index 398026531b19a4bbc5924dee96f64dc66c6ca062..086628457a5b3bf64af39afa9f3375a5a0fd528e 100644
--- a/build-requirements.txt
+++ b/build-requirements.txt
@@ -1,46 +1,46 @@
 appdirs==1.4.4
-backports.entry-points-selectable==1.1.1
-bleach==4.1.0
-build==0.7.0
-certifi==2021.10.8
-chardet==4.0.0
+backports.entry-points-selectable==1.2.0
+bleach==5.0.1
+build==0.9.0
+certifi==2022.9.24
+chardet==5.0.0
 charset-normalizer==2.0.12
-check-manifest==0.47
-colorama==0.4.4
-distlib==0.3.4
-docutils==0.18.1
-filelock==3.6.0
-flake8==4.0.1
-grpcio==1.43.0
+check-manifest==0.48
+colorama==0.4.6
+distlib==0.3.6
+docutils==0.19
+filelock==3.8.0
+flake8==5.0.4
+grpcio==1.50.0
 grpcio-tools==1.43.0
-idna==3.3
-importlib-metadata==4.11.2
-keyring==23.5.0
-lazy==1.4
-mccabe==0.6.1
+idna==3.4
+importlib-metadata==5.0.0
+keyring==23.11.0
+lazy==1.5
+mccabe==0.7.0
 packaging==21.3
-pep517==0.12.0
-pkginfo==1.8.2
-platformdirs==2.5.1
+pep517==0.13.0
+pkginfo==1.8.3
+platformdirs==2.5.4
 pluggy==1.0.0
 protobuf==3.19.4
 py==1.11.0
-pycodestyle==2.8.0
-pyflakes==2.4.0
-Pygments==2.11.2
-pyparsing==3.0.7
-readme-renderer==34.0
-requests==2.27.1
-requests-toolbelt==0.9.1
+pycodestyle==2.9.1
+pyflakes==2.5.0
+Pygments==2.13.0
+pyparsing==3.0.9
+readme-renderer==37.3
+requests==2.28.1
+requests-toolbelt==0.10.1
 rfc3986==2.0.0
 six==1.16.0
 toml==0.10.2
 tomli==2.0.1
-tox==3.24.5
-tqdm==4.63.0
-twine==3.8.0
-typing_extensions==4.1.1
-urllib3==1.26.8
-virtualenv==20.13.2
+tox==3.27.1
+tqdm==4.64.1
+twine==4.0.1
+typing_extensions==4.4.0
+urllib3==1.26.12
+virtualenv==20.16.7
 webencodings==0.5.1
-zipp==3.7.0
+zipp==3.10.0
diff --git a/examples/collections_auth_client.py b/examples/collections_auth_client.py
index 0c9022b9b7f27842e5849ddaf9dacfb895a1e518..5d4dedbf7f40ec3d2842c0edeeb3194d75e696fb 100644
--- a/examples/collections_auth_client.py
+++ b/examples/collections_auth_client.py
@@ -3,24 +3,16 @@ import logging
 import grpc
 from oauthlib.oauth2 import BackendApplicationClient
 
-from perxis.auth import OAuth2Plugin
+from perxis.auth import APIKeyPlugin
 from perxis.collections import collections_pb2, collections_pb2_grpc
 
 
 def main():
-    client_id = 'YGPQSAUPgco4iTQxNejtXDjFVwPmYT3n'
-    client_secret = '_d6F-VlQGmcsU25AXIoCU4EU3v56-28P6jwUHkutg_hSPseConphyLs3F-Buuq1h'
-    token_url = 'https://adwz.auth0.com/oauth/token'
-    audience = 'some'
-
-    oauth2_plugin = OAuth2Plugin(
-        client=BackendApplicationClient(client_id=client_id),
-        client_secret=client_secret,
-        token_url=token_url,
-        audience=audience
+    auth_plugin = APIKeyPlugin(
+        token="0Xp7bYBqYmIUqwZcNRMtRCtDBaheFdAc"
     )
 
-    call_credentials = grpc.metadata_call_credentials(oauth2_plugin, name='auth')
+    call_credentials = grpc.metadata_call_credentials(auth_plugin, name='auth')
     channel_credentials = grpc.ssl_channel_credentials()
     composite_credentials = grpc.composite_channel_credentials(
             channel_credentials, call_credentials
diff --git a/examples/collections_client.py b/examples/collections_client.py
index e38586d7b1f3b4a838c77d9ef5f2742d44176bcd..5d470de82de11d940d95c43f298fb750a10d013e 100644
--- a/examples/collections_client.py
+++ b/examples/collections_client.py
@@ -3,10 +3,10 @@ import logging
 
 import grpc
 
+from perxis.auth import APIKeyPlugin
 from perxis.collections import collections_pb2, collections_pb2_grpc
 
 
-ACCESS_TOKEN = 'Bearer eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCIsImtpZCI6Ik5UWXhSVE5FTnprek5qSkVPRFkyTmpORk9VVXhRVEUzUmpWRVFqY3pRVE5CTjBJeE1ETTNOUSJ9.eyJodHRwczovL2hvb3AucGVyeC5ydS9pZGVudGl0eSI6eyJncm91cHMiOltdfSwibmlja25hbWUiOiJnb3NoaWstZSIsIm5hbWUiOiJHZW9yZ2l5IEV0ZXJldnNraXkiLCJwaWN0dXJlIjoiaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91Lzc2NjAzMzE_dj00IiwidXBkYXRlZF9hdCI6IjIwMjEtMDYtMTFUMTI6MDU6MDkuMjQ3WiIsImlzcyI6Imh0dHBzOi8vYWR3ei5hdXRoMC5jb20vIiwic3ViIjoiZ2l0aHVifDc2NjAzMzEiLCJhdWQiOiJ6d3JaaGZrd0owNlQ3MlE4ZXhOZHRFS0NxTzBja0ZpWCIsImlhdCI6MTYyMzQxMzEwOSwiZXhwIjoxNjIzNDQ5MTA5LCJhdXRoX3RpbWUiOjE2MjM0MTMxMDksImF0X2hhc2giOiIwVTNrRmJTTXpnWllWSVlKTHpMUWNBIiwibm9uY2UiOiJxTGxKZmVMSUtBOUtoMVRoWXE3UkxLSkxCMjF-X29TZCJ9.Z3BYpwyAUQYt5gyGyQSD14Lj5zwegYqfyaA-tsgVrHYdyYzb8VCG8Tb_CbZ6zjpRGpcOSuDCgPo6b8METTUoHTBgWyPgaYXLWeoecE4FjRrFgonL0Yltg0BAMG8hACxTkLsg3q3s1pA0FdUzNesDPRWgoyTQehh7ODwFCV9FLpV3aV1RYwqj3I_qMsfATCoDsn2_msozB2asge9PsH8cblQj5ZdT2JEFTU0ZLI-MFNu6aubpHd3WIgMXmfgmDASrsARx-W59enwZSls01Y3WRLfoQVZ8YqjdnOIXeolfkpr32DSuzcgOP_oxylXSa_grMlCbRBOZd1Z84teYteNU0g'
 SPACE_ID = 'c2qcp9cuaccmpj8lmom0'
 ENV_ID = "master"
 
@@ -14,27 +14,18 @@ ENV_ID = "master"
 def create(stub, space_id, env_id, coll_id, name):
     return stub.Create.with_call(
         collections_pb2.CreateRequest(collection=collections_pb2.Collection(space_id=space_id, env_id=env_id, id=coll_id, name=name)),
-        metadata=(
-            ('authorization', f'{ACCESS_TOKEN}'),
-        )
     )
 
 
 def get(stub, space_id, env_id, coll_id):
     return stub.Get.with_call(
         collections_pb2.GetRequest(space_id=space_id, env_id=env_id, collection_id=coll_id),
-        metadata=(
-            ('authorization', f'{ACCESS_TOKEN}'),
-        )
     )
 
 
 def list(stub, space_id, env_id):
     return stub.List.with_call(
         collections_pb2.ListRequest(space_id=space_id, env_id=env_id),
-        metadata=(
-            ('authorization', f'{ACCESS_TOKEN}'),
-        )
     )
 
 
@@ -42,23 +33,27 @@ def update(stub, space_id, env_id, coll_id, name):
     return stub.Update.with_call(
         collections_pb2.UpdateRequest(
             collection=collections_pb2.Collection(space_id=space_id, env_id=env_id, id=coll_id, name=name)),
-        metadata=(
-            ('authorization', f'{ACCESS_TOKEN}'),
-        )
     )
 
 
 def delete(stub, space_id, env_id, coll_id):
     return stub.Delete.with_call(
         collections_pb2.DeleteRequest(space_id=space_id, env_id=env_id, collection_id=coll_id),
-        metadata=(
-            ('authorization', f'{ACCESS_TOKEN}'),
-        )
     )
 
 
 def main() -> None:
-    with grpc.insecure_channel('envoy.perxis.pt.perx.ru:80') as channel:
+    auth_plugin = APIKeyPlugin(
+        token="0Xp7bYBqYmIUqwZcNRMtRCtDBaheFdAc"
+    )
+
+    call_credentials = grpc.metadata_call_credentials(auth_plugin, name='auth')
+    channel_credentials = grpc.ssl_channel_credentials()
+    composite_credentials = grpc.composite_channel_credentials(
+        channel_credentials, call_credentials
+    )
+
+    with grpc.secure_channel('envoy.perxis.pt.perx.ru:443', composite_credentials) as channel:
         stub = collections_pb2_grpc.CollectionsStub(channel)
         print('---------- CREATE ----------')
         response, state = create(stub, SPACE_ID, ENV_ID, 'test_coll_id', 'test collection name')
diff --git a/examples/environments.py b/examples/environments.py
index 2879b0074c1d1e9a5d434ac96134b4bc2f735e21..d0097d258e0a6fe18a4635bfbd5c93d6c6690b56 100644
--- a/examples/environments.py
+++ b/examples/environments.py
@@ -3,9 +3,9 @@ import logging
 
 import grpc
 
+from perxis.auth import APIKeyPlugin
 from perxis.environments import environments_pb2, environments_pb2_grpc
 
-ACCESS_TOKEN = 'Bearer eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCIsImtpZCI6Ik5UWXhSVE5FTnprek5qSkVPRFkyTmpORk9VVXhRVEUzUmpWRVFqY3pRVE5CTjBJeE1ETTNOUSJ9.eyJodHRwczovL2hvb3AucGVyeC5ydS9pZGVudGl0eSI6eyJncm91cHMiOltdfSwibmlja25hbWUiOiJnb3NoaWstZSIsIm5hbWUiOiJHZW9yZ2l5IEV0ZXJldnNraXkiLCJwaWN0dXJlIjoiaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91Lzc2NjAzMzE_dj00IiwidXBkYXRlZF9hdCI6IjIwMjEtMDYtMTFUMTI6MDU6MDkuMjQ3WiIsImlzcyI6Imh0dHBzOi8vYWR3ei5hdXRoMC5jb20vIiwic3ViIjoiZ2l0aHVifDc2NjAzMzEiLCJhdWQiOiJ6d3JaaGZrd0owNlQ3MlE4ZXhOZHRFS0NxTzBja0ZpWCIsImlhdCI6MTYyMzQxMzEwOSwiZXhwIjoxNjIzNDQ5MTA5LCJhdXRoX3RpbWUiOjE2MjM0MTMxMDksImF0X2hhc2giOiIwVTNrRmJTTXpnWllWSVlKTHpMUWNBIiwibm9uY2UiOiJxTGxKZmVMSUtBOUtoMVRoWXE3UkxLSkxCMjF-X29TZCJ9.Z3BYpwyAUQYt5gyGyQSD14Lj5zwegYqfyaA-tsgVrHYdyYzb8VCG8Tb_CbZ6zjpRGpcOSuDCgPo6b8METTUoHTBgWyPgaYXLWeoecE4FjRrFgonL0Yltg0BAMG8hACxTkLsg3q3s1pA0FdUzNesDPRWgoyTQehh7ODwFCV9FLpV3aV1RYwqj3I_qMsfATCoDsn2_msozB2asge9PsH8cblQj5ZdT2JEFTU0ZLI-MFNu6aubpHd3WIgMXmfgmDASrsARx-W59enwZSls01Y3WRLfoQVZ8YqjdnOIXeolfkpr32DSuzcgOP_oxylXSa_grMlCbRBOZd1Z84teYteNU0g'
 SPACE_ID = 'c2qcp9cuaccmpj8lmom0'
 
 
@@ -15,27 +15,18 @@ def create(stub, space_id, description):
             space_id=space_id,
             description=description
         )),
-        metadata=(
-            ('authorization', f'{ACCESS_TOKEN}'),
-        )
     )
 
 
 def get(stub, space_id, env_id):
     return stub.Get.with_call(
         environments_pb2.GetRequest(space_id=space_id, env_id=env_id),
-        metadata=(
-            ('authorization', f'{ACCESS_TOKEN}'),
-        )
     )
 
 
 def list(stub, space_id) -> tuple:
     return stub.List.with_call(
         environments_pb2.ListRequest(space_id=space_id),
-        metadata=(
-            ('authorization', f'{ACCESS_TOKEN}'),
-        )
     )
 
 
@@ -46,9 +37,6 @@ def update(stub, space_id, env_id, description):
             id=env_id,
             description=description
         )),
-        metadata=(
-            ('authorization', f'{ACCESS_TOKEN}'),
-        )
     )
 
 
@@ -59,9 +47,6 @@ def set_alias(stub, space_id, env_id, alias):
             env_id=env_id,
             alias=alias
         ),
-        metadata=(
-            ('authorization', f'{ACCESS_TOKEN}'),
-        )
     )
 
 
@@ -72,23 +57,27 @@ def remove_alias(stub, space_id, env_id, alias):
             env_id=env_id,
             alias=alias
         ),
-        metadata=(
-            ('authorization', f'{ACCESS_TOKEN}'),
-        )
     )
 
 
 def delete(stub, space_id, env_id) -> tuple:
     return stub.Delete.with_call(
         environments_pb2.DeleteRequest(space_id=space_id, env_id=env_id),
-        metadata=(
-            ('authorization', f'{ACCESS_TOKEN}'),
-        )
     )
 
 
 def main() -> None:
-    with grpc.insecure_channel('envoy.perxis.pt.perx.ru:80') as channel:
+    auth_plugin = APIKeyPlugin(
+        token="0Xp7bYBqYmIUqwZcNRMtRCtDBaheFdAc"
+    )
+
+    call_credentials = grpc.metadata_call_credentials(auth_plugin, name='auth')
+    channel_credentials = grpc.ssl_channel_credentials()
+    composite_credentials = grpc.composite_channel_credentials(
+        channel_credentials, call_credentials
+    )
+
+    with grpc.secure_channel('envoy.perxis.pt.perx.ru:443', composite_credentials) as channel:
         stub = environments_pb2_grpc.EnvironmentsStub(channel)
         print('---------- CREATE ----------')
         response, state = create(stub, SPACE_ID, 'test description')
diff --git a/examples/items.py b/examples/items.py
index 1a04d4e1e857017e840f772408b130e8d5183481..5fe42df804f51010f2dba7628e52c5329608d8bb 100644
--- a/examples/items.py
+++ b/examples/items.py
@@ -3,11 +3,11 @@ import logging
 
 import grpc
 
+from perxis.auth import APIKeyPlugin
 from perxis.items import items_pb2, items_pb2_grpc
 from google.protobuf.struct_pb2 import Struct
 
 
-ACCESS_TOKEN = 'Bearer eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCIsImtpZCI6Ik5UWXhSVE5FTnprek5qSkVPRFkyTmpORk9VVXhRVEUzUmpWRVFqY3pRVE5CTjBJeE1ETTNOUSJ9.eyJodHRwczovL2hvb3AucGVyeC5ydS9pZGVudGl0eSI6eyJncm91cHMiOltdfSwibmlja25hbWUiOiJnb3NoaWstZSIsIm5hbWUiOiJHZW9yZ2l5IEV0ZXJldnNraXkiLCJwaWN0dXJlIjoiaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91Lzc2NjAzMzE_dj00IiwidXBkYXRlZF9hdCI6IjIwMjEtMDYtMTFUMTI6MDU6MDkuMjQ3WiIsImlzcyI6Imh0dHBzOi8vYWR3ei5hdXRoMC5jb20vIiwic3ViIjoiZ2l0aHVifDc2NjAzMzEiLCJhdWQiOiJ6d3JaaGZrd0owNlQ3MlE4ZXhOZHRFS0NxTzBja0ZpWCIsImlhdCI6MTYyMzQxMzEwOSwiZXhwIjoxNjIzNDQ5MTA5LCJhdXRoX3RpbWUiOjE2MjM0MTMxMDksImF0X2hhc2giOiIwVTNrRmJTTXpnWllWSVlKTHpMUWNBIiwibm9uY2UiOiJxTGxKZmVMSUtBOUtoMVRoWXE3UkxLSkxCMjF-X29TZCJ9.Z3BYpwyAUQYt5gyGyQSD14Lj5zwegYqfyaA-tsgVrHYdyYzb8VCG8Tb_CbZ6zjpRGpcOSuDCgPo6b8METTUoHTBgWyPgaYXLWeoecE4FjRrFgonL0Yltg0BAMG8hACxTkLsg3q3s1pA0FdUzNesDPRWgoyTQehh7ODwFCV9FLpV3aV1RYwqj3I_qMsfATCoDsn2_msozB2asge9PsH8cblQj5ZdT2JEFTU0ZLI-MFNu6aubpHd3WIgMXmfgmDASrsARx-W59enwZSls01Y3WRLfoQVZ8YqjdnOIXeolfkpr32DSuzcgOP_oxylXSa_grMlCbRBOZd1Z84teYteNU0g'
 SPACE_ID = 'c2qcp9cuaccmpj8lmom0'
 ENV_ID = 'master'
 COLL_ID = 'test_eterevskiy'
@@ -18,9 +18,6 @@ def create(stub, space_id, env_id, coll_id, data):
         items_pb2.CreateRequest(item=items_pb2.Item(
                space_id=space_id, env_id=env_id, collection_id=coll_id, data=data
         )),
-        metadata=(
-            ('authorization', f'{ACCESS_TOKEN}'),
-        )
     )
 
 
@@ -29,18 +26,12 @@ def get(stub, space_id, env_id, coll_id, item_id):
         items_pb2.GetRequest(
             space_id=space_id, env_id=env_id, collection_id=coll_id, item_id=item_id
         ),
-        metadata=(
-            ('authorization', f'{ACCESS_TOKEN}'),
-        )
     )
 
 
 def find(stub, space_id, env_id, coll_id, filter=None):
     return stub.Find.with_call(
         items_pb2.FindRequest(space_id=space_id, env_id=env_id, collection_id=coll_id, filter=filter),
-        metadata=(
-            ('authorization', f'{ACCESS_TOKEN}'),
-        )
     )
 
 
@@ -49,14 +40,21 @@ def update(stub, space_id, env_id, coll_id, item_id, data):
         items_pb2.UpdateRequest(
             item=items_pb2.Item(space_id=space_id, env_id=env_id, collection_id=coll_id, id=item_id, data=data)
         ),
-        metadata=(
-            ('authorization', f'{ACCESS_TOKEN}'),
-        )
     )
 
 
 def main() -> None:
-    with grpc.insecure_channel('envoy.perxis.pt.perx.ru:80') as channel:
+    auth_plugin = APIKeyPlugin(
+        token="0Xp7bYBqYmIUqwZcNRMtRCtDBaheFdAc"
+    )
+
+    call_credentials = grpc.metadata_call_credentials(auth_plugin, name='auth')
+    channel_credentials = grpc.ssl_channel_credentials()
+    composite_credentials = grpc.composite_channel_credentials(
+        channel_credentials, call_credentials
+    )
+
+    with grpc.secure_channel('envoy.perxis.pt.perx.ru:443', composite_credentials) as channel:
         stub = items_pb2_grpc.ItemsStub(channel)
         print('---------- CREATE ----------')
         data = Struct()
diff --git a/examples/spaces.py b/examples/spaces.py
index 667de051c9963f236fcc641b2d6579d8679a46f5..9661e8ff6cea5da9402ac25f286e6e8b9c5e92d4 100644
--- a/examples/spaces.py
+++ b/examples/spaces.py
@@ -3,22 +3,30 @@ import logging
 
 import grpc
 
+from perxis.auth import APIKeyPlugin
 from perxis.spaces import spaces_pb2, spaces_pb2_grpc
 
-ACCESS_TOKEN = 'Bearer eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCIsImtpZCI6Ik5UWXhSVE5FTnprek5qSkVPRFkyTmpORk9VVXhRVEUzUmpWRVFqY3pRVE5CTjBJeE1ETTNOUSJ9.eyJodHRwczovL2hvb3AucGVyeC5ydS9pZGVudGl0eSI6eyJncm91cHMiOltdfSwibmlja25hbWUiOiJnb3NoaWstZSIsIm5hbWUiOiJHZW9yZ2l5IEV0ZXJldnNraXkiLCJwaWN0dXJlIjoiaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91Lzc2NjAzMzE_dj00IiwidXBkYXRlZF9hdCI6IjIwMjEtMDYtMTFUMTI6MDU6MDkuMjQ3WiIsImlzcyI6Imh0dHBzOi8vYWR3ei5hdXRoMC5jb20vIiwic3ViIjoiZ2l0aHVifDc2NjAzMzEiLCJhdWQiOiJ6d3JaaGZrd0owNlQ3MlE4ZXhOZHRFS0NxTzBja0ZpWCIsImlhdCI6MTYyMzQxMzEwOSwiZXhwIjoxNjIzNDQ5MTA5LCJhdXRoX3RpbWUiOjE2MjM0MTMxMDksImF0X2hhc2giOiIwVTNrRmJTTXpnWllWSVlKTHpMUWNBIiwibm9uY2UiOiJxTGxKZmVMSUtBOUtoMVRoWXE3UkxLSkxCMjF-X29TZCJ9.Z3BYpwyAUQYt5gyGyQSD14Lj5zwegYqfyaA-tsgVrHYdyYzb8VCG8Tb_CbZ6zjpRGpcOSuDCgPo6b8METTUoHTBgWyPgaYXLWeoecE4FjRrFgonL0Yltg0BAMG8hACxTkLsg3q3s1pA0FdUzNesDPRWgoyTQehh7ODwFCV9FLpV3aV1RYwqj3I_qMsfATCoDsn2_msozB2asge9PsH8cblQj5ZdT2JEFTU0ZLI-MFNu6aubpHd3WIgMXmfgmDASrsARx-W59enwZSls01Y3WRLfoQVZ8YqjdnOIXeolfkpr32DSuzcgOP_oxylXSa_grMlCbRBOZd1Z84teYteNU0g'
 SPACE_ID = 'c2qcp9cuaccmpj8lmom0'
 
 
 def get(stub, space_id):
     return stub.Get.with_call(
         spaces_pb2.GetRequest(space_id=space_id),
-        metadata=(
-            ('authorization', f'{ACCESS_TOKEN}'),
-        ))
+    )
 
 
 def main() -> None:
-    with grpc.insecure_channel('envoy.perxis.pt.perx.ru:80') as channel:
+    auth_plugin = APIKeyPlugin(
+        token="0Xp7bYBqYmIUqwZcNRMtRCtDBaheFdAc"
+    )
+
+    call_credentials = grpc.metadata_call_credentials(auth_plugin, name='auth')
+    channel_credentials = grpc.ssl_channel_credentials()
+    composite_credentials = grpc.composite_channel_credentials(
+        channel_credentials, call_credentials
+    )
+
+    with grpc.secure_channel('envoy.perxis.pt.perx.ru:443', composite_credentials) as channel:
         stub = spaces_pb2_grpc.SpacesStub(channel)
         print('---------- GET ----------')
         response, state = get(stub, SPACE_ID)
diff --git a/perxis/common/common_pb2.py b/perxis/common/common_pb2.py
index b86ceeba41d1511ad8b255aea19d3f931b44db7d..6d2c588ebb95ad0e5179fd2d72650c2e971b9141 100644
--- a/perxis/common/common_pb2.py
+++ b/perxis/common/common_pb2.py
@@ -21,7 +21,7 @@ DESCRIPTOR = _descriptor.FileDescriptor(
   syntax='proto3',
   serialized_options=b'Z-git.perx.ru/perxis/perxis/proto/common;common',
   create_key=_descriptor._internal_create_key,
-  serialized_pb=b'\n\x1aperxis/common/common.proto\x12\x06\x63ommon\x1a\x1cgoogle/protobuf/struct.proto\"\xa6\x05\n\x05\x45rror\x12\x12\n\nerror_code\x18\x01 \x01(\x04\x12\x10\n\x08\x65rror_id\x18\x02 \x01(\t\x12\x0e\n\x06reason\x18\x03 \x01(\t\x12\x0e\n\x06\x64omain\x18\x04 \x01(\t\x12-\n\x08metadata\x18\t \x03(\x0b\x32\x1b.common.Error.MetadataEntry\x12-\n\x0b\x62\x61\x64_request\x18\n \x01(\x0b\x32\x18.common.Error.BadRequest\x12+\n\ndebug_info\x18\x0b \x01(\x0b\x32\x17.common.Error.DebugInfo\x12 \n\x04help\x18\x64 \x01(\x0b\x32\x12.common.Error.Help\x12;\n\x12localized_messages\x18\xc8\x01 \x03(\x0b\x32\x1e.common.Error.LocalizedMessage\x1a{\n\nBadRequest\x12\x37\n\x06\x65rrors\x18\x01 \x03(\x0b\x32\'.common.Error.BadRequest.FieldViolation\x1a\x34\n\x0e\x46ieldViolation\x12\r\n\x05\x66ield\x18\x01 \x01(\t\x12\x13\n\x0b\x64\x65scription\x18\x02 \x01(\t\x1aX\n\x04Help\x12&\n\x05links\x18\x01 \x03(\x0b\x32\x17.common.Error.Help.Link\x1a(\n\x04Link\x12\x13\n\x0b\x64\x65scription\x18\x01 \x01(\t\x12\x0b\n\x03url\x18\x02 \x01(\t\x1a\x30\n\tDebugInfo\x12\x13\n\x0bstack_trace\x18\x01 \x03(\t\x12\x0e\n\x06\x64\x65tail\x18\x02 \x01(\t\x1a\x33\n\x10LocalizedMessage\x12\x0e\n\x06locale\x18\x01 \x01(\t\x12\x0f\n\x07message\x18\x02 \x01(\t\x1a/\n\rMetadataEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\"J\n\x06\x46ilter\x12\n\n\x02op\x18\x01 \x01(\t\x12\r\n\x05\x66ield\x18\x02 \x01(\t\x12%\n\x05value\x18\x03 \x01(\x0b\x32\x16.google.protobuf.Value\"@\n\x0b\x46indOptions\x12\x0c\n\x04sort\x18\x01 \x03(\t\x12\x10\n\x08page_num\x18\x02 \x01(\x05\x12\x11\n\tpage_size\x18\x03 \x01(\x05\"\xd3\x01\n\x04Rule\x12\x15\n\rcollection_id\x18\x01 \x01(\t\x12\x1f\n\x07\x61\x63tions\x18\x02 \x03(\x0e\x32\x0e.common.Action\x12\x1e\n\x06\x61\x63\x63\x65ss\x18\x03 \x01(\x0e\x32\x0e.common.Access\x12\x15\n\rhidden_fields\x18\x05 \x03(\t\x12\x17\n\x0freadonly_fields\x18\x06 \x03(\t\x12\x18\n\x10writeonly_fields\x18\x07 \x03(\t\x12\x13\n\x0bread_filter\x18\x08 \x01(\t\x12\x14\n\x0cwrite_filter\x18\t \x01(\t\"?\n\x0c\x43ollaborator\x12\x10\n\x08space_id\x18\x01 \x01(\t\x12\x0f\n\x07subject\x18\x02 \x01(\t\x12\x0c\n\x04role\x18\x03 \x01(\t\"p\n\x07Version\x12\x16\n\x0eserver_version\x18\x01 \x01(\t\x12\x13\n\x0b\x61pi_version\x18\x02 \x01(\t\x12\x12\n\nbuild_time\x18\x03 \x01(\t\x12\x0e\n\x06\x63ommit\x18\x04 \x01(\t\x12\x14\n\x0c\x62uild_number\x18\x05 \x01(\x05*%\n\x06\x41\x63\x63\x65ss\x12\x07\n\x03\x41NY\x10\x00\x12\x08\n\x04MINE\x10\x01\x12\x08\n\x04ROLE\x10\x02*C\n\x06\x41\x63tion\x12\x0b\n\x07UNKNOWN\x10\x00\x12\n\n\x06\x43REATE\x10\x01\x12\x08\n\x04READ\x10\x02\x12\n\n\x06UPDATE\x10\x03\x12\n\n\x06\x44\x45LETE\x10\x04\x42/Z-git.perx.ru/perxis/perxis/proto/common;commonb\x06proto3'
+  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\"h\n\x0b\x46indOptions\x12\x0c\n\x04sort\x18\x01 \x03(\t\x12\x10\n\x08page_num\x18\x02 \x01(\x05\x12\x11\n\tpage_size\x18\x03 \x01(\x05\x12\x0e\n\x06\x66ields\x18\x04 \x03(\t\x12\x16\n\x0e\x65xclude_fields\x18\x05 \x01(\x08\"\xd3\x01\n\x04Rule\x12\x15\n\rcollection_id\x18\x01 \x01(\t\x12\x1f\n\x07\x61\x63tions\x18\x02 \x03(\x0e\x32\x0e.common.Action\x12\x1e\n\x06\x61\x63\x63\x65ss\x18\x03 \x01(\x0e\x32\x0e.common.Access\x12\x15\n\rhidden_fields\x18\x05 \x03(\t\x12\x17\n\x0freadonly_fields\x18\x06 \x03(\t\x12\x18\n\x10writeonly_fields\x18\x07 \x03(\t\x12\x13\n\x0bread_filter\x18\x08 \x01(\t\x12\x14\n\x0cwrite_filter\x18\t \x01(\t\"?\n\x0c\x43ollaborator\x12\x10\n\x08space_id\x18\x01 \x01(\t\x12\x0f\n\x07subject\x18\x02 \x01(\t\x12\x0c\n\x04role\x18\x03 \x01(\t\"p\n\x07Version\x12\x16\n\x0eserver_version\x18\x01 \x01(\t\x12\x13\n\x0b\x61pi_version\x18\x02 \x01(\t\x12\x12\n\nbuild_time\x18\x03 \x01(\t\x12\x0e\n\x06\x63ommit\x18\x04 \x01(\t\x12\x14\n\x0c\x62uild_number\x18\x05 \x01(\x05*%\n\x06\x41\x63\x63\x65ss\x12\x07\n\x03\x41NY\x10\x00\x12\x08\n\x04MINE\x10\x01\x12\x08\n\x04ROLE\x10\x02*C\n\x06\x41\x63tion\x12\x0b\n\x07UNKNOWN\x10\x00\x12\n\n\x06\x43REATE\x10\x01\x12\x08\n\x04READ\x10\x02\x12\n\n\x06UPDATE\x10\x03\x12\n\n\x06\x44\x45LETE\x10\x04\x42/Z-git.perx.ru/perxis/perxis/proto/common;commonb\x06proto3'
   ,
   dependencies=[google_dot_protobuf_dot_struct__pb2.DESCRIPTOR,])
 
@@ -50,8 +50,8 @@ _ACCESS = _descriptor.EnumDescriptor(
   ],
   containing_type=None,
   serialized_options=None,
-  serialized_start=1284,
-  serialized_end=1321,
+  serialized_start=1324,
+  serialized_end=1361,
 )
 _sym_db.RegisterEnumDescriptor(_ACCESS)
 
@@ -91,8 +91,8 @@ _ACTION = _descriptor.EnumDescriptor(
   ],
   containing_type=None,
   serialized_options=None,
-  serialized_start=1323,
-  serialized_end=1390,
+  serialized_start=1363,
+  serialized_end=1430,
 )
 _sym_db.RegisterEnumDescriptor(_ACTION)
 
@@ -523,6 +523,20 @@ _FINDOPTIONS = _descriptor.Descriptor(
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
       serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='fields', full_name='common.FindOptions.fields', index=3,
+      number=4, type=9, cpp_type=9, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='exclude_fields', full_name='common.FindOptions.exclude_fields', index=4,
+      number=5, type=8, cpp_type=7, label=1,
+      has_default_value=False, default_value=False,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
   ],
   extensions=[
   ],
@@ -536,7 +550,7 @@ _FINDOPTIONS = _descriptor.Descriptor(
   oneofs=[
   ],
   serialized_start=825,
-  serialized_end=889,
+  serialized_end=929,
 )
 
 
@@ -616,8 +630,8 @@ _RULE = _descriptor.Descriptor(
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=892,
-  serialized_end=1103,
+  serialized_start=932,
+  serialized_end=1143,
 )
 
 
@@ -662,8 +676,8 @@ _COLLABORATOR = _descriptor.Descriptor(
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=1105,
-  serialized_end=1168,
+  serialized_start=1145,
+  serialized_end=1208,
 )
 
 
@@ -722,8 +736,8 @@ _VERSION = _descriptor.Descriptor(
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=1170,
-  serialized_end=1282,
+  serialized_start=1210,
+  serialized_end=1322,
 )
 
 _ERROR_BADREQUEST_FIELDVIOLATION.containing_type = _ERROR_BADREQUEST
diff --git a/perxis/extensions/extension_pb2.py b/perxis/extensions/extension_pb2.py
index afcb18977ec0ae118feedb351f3e41df6e15b090..efde8f4f45dcb13a834fc921cbd8761020127c4d 100644
--- a/perxis/extensions/extension_pb2.py
+++ b/perxis/extensions/extension_pb2.py
@@ -11,6 +11,7 @@ from google.protobuf import symbol_database as _symbol_database
 _sym_db = _symbol_database.Default()
 
 
+from perxis.references import references_pb2 as perxis_dot_references_dot_references__pb2
 
 
 DESCRIPTOR = _descriptor.FileDescriptor(
@@ -19,8 +20,9 @@ DESCRIPTOR = _descriptor.FileDescriptor(
   syntax='proto3',
   serialized_options=b'Z5git.perx.ru/perxis/perxis/proto/extensions;extensions',
   create_key=_descriptor._internal_create_key,
-  serialized_pb=b'\n!perxis/extensions/extension.proto\x12\nextensions\"Y\n\x0eInstallRequest\x12\x13\n\nextensions\x18\x90N \x03(\t\x12\x11\n\x08space_id\x18\x9aN \x01(\t\x12\x0f\n\x06\x65nv_id\x18\xa4N \x01(\t\x12\x0e\n\x05\x66orce\x18\xf4N \x01(\x08\"\xd9\x01\n\x16\x45xtensionRequestResult\x12\x38\n\x05state\x18\x90N \x01(\x0e\x32(.extensions.ExtensionRequestResult.State\x12\x12\n\textension\x18\xf4N \x01(\t\x12\x0c\n\x03msg\x18\xd8O \x01(\t\x12\x0e\n\x05\x65rror\x18\xbcP \x01(\t\x12\x19\n\x10update_available\x18\xa0Q \x01(\x08\"8\n\x05State\x12\x06\n\x02OK\x10\x00\x12\t\n\x05\x45RROR\x10\x01\x12\x0b\n\x07PENDING\x10\x02\x12\x0f\n\x0bIN_PROGRESS\x10\x03\"G\n\x0fInstallResponse\x12\x34\n\x07results\x18\x90N \x03(\x0b\x32\".extensions.ExtensionRequestResult\"l\n\x10UninstallRequest\x12\x13\n\nextensions\x18\x90N \x03(\t\x12\x11\n\x08space_id\x18\x9aN \x01(\t\x12\x0f\n\x06\x65nv_id\x18\xa4N \x01(\t\x12\x0f\n\x06remove\x18\xf4N \x01(\x08\x12\x0e\n\x05\x66orce\x18\xd8O \x01(\x08\"I\n\x11UninstallResponse\x12\x34\n\x07results\x18\x90N \x03(\x0b\x32\".extensions.ExtensionRequestResult\"X\n\rUpdateRequest\x12\x13\n\nextensions\x18\x90N \x03(\t\x12\x11\n\x08space_id\x18\x9aN \x01(\t\x12\x0f\n\x06\x65nv_id\x18\xa4N \x01(\t\x12\x0e\n\x05\x66orce\x18\xf4N \x01(\x08\"F\n\x0eUpdateResponse\x12\x34\n\x07results\x18\x90N \x03(\x0b\x32\".extensions.ExtensionRequestResult\"G\n\x0c\x43heckRequest\x12\x13\n\nextensions\x18\x90N \x03(\t\x12\x11\n\x08space_id\x18\x9aN \x01(\t\x12\x0f\n\x06\x65nv_id\x18\xa4N \x01(\t\"E\n\rCheckResponse\x12\x34\n\x07results\x18\x90N \x03(\x0b\x32\".extensions.ExtensionRequestResult\"\x82\x02\n\rActionRequest\x12\x12\n\textension\x18\xe8\x07 \x01(\t\x12\x0f\n\x06\x61\x63tion\x18\xf4N \x01(\t\x12\x11\n\x08space_id\x18\x84R \x01(\t\x12\x0f\n\x06\x65nv_id\x18\x8eR \x01(\t\x12\x16\n\rcollection_id\x18\x98R \x01(\t\x12\x10\n\x07item_id\x18\xa2R \x01(\t\x12\x11\n\x08item_ids\x18\xacR \x03(\t\x12:\n\x08metadata\x18\xf8U \x03(\x0b\x32\'.extensions.ActionRequest.MetadataEntry\x1a/\n\rMetadataEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\"\xad\x02\n\x0e\x41\x63tionResponse\x12\x30\n\x05state\x18\x90N \x01(\x0e\x32 .extensions.ActionResponse.State\x12\x0c\n\x03msg\x18\xf4N \x01(\t\x12\x0e\n\x05\x65rror\x18\xd8O \x01(\t\x12!\n\x04next\x18\xbcP \x03(\x0b\x32\x12.extensions.Action\x12;\n\x08metadata\x18\xa0Q \x03(\x0b\x32(.extensions.ActionResponse.MetadataEntry\x1a/\n\rMetadataEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\":\n\x05State\x12\x08\n\x04\x44ONE\x10\x00\x12\t\n\x05\x45RROR\x10\x01\x12\x0b\n\x07PENDING\x10\x02\x12\x0f\n\x0bIN_PROGRESS\x10\x03\"\xc2\x02\n\x06\x41\x63tion\x12\x12\n\textension\x18\x90N \x01(\t\x12\x0f\n\x06\x61\x63tion\x18\xf4N \x01(\t\x12\r\n\x04name\x18\xd8O \x01(\t\x12\x14\n\x0b\x64\x65scription\x18\xe2O \x01(\t\x12&\n\x04kind\x18\xbcP \x01(\x0e\x32\x17.extensions.Action.Kind\x12+\n\x07request\x18\xa0Q \x01(\x0b\x32\x19.extensions.ActionRequest\x12\x1a\n\x11navigation_action\x18\x84R \x01(\x08\x12\x19\n\x10navigation_route\x18\x8eR \x01(\t\"b\n\x04Kind\x12\x0b\n\x07\x44\x45\x46\x41ULT\x10\x00\x12\t\n\x05SPACE\x10\x01\x12\x0f\n\x0b\x45NVIRONMENT\x10\x02\x12\x0e\n\nCOLLECTION\x10\x03\x12\x08\n\x04ITEM\x10\x04\x12\t\n\x05ITEMS\x10\x05\x12\x0c\n\x08REVISION\x10\x06\x32\xe3\x02\n\tExtension\x12\x44\n\x07Install\x12\x1a.extensions.InstallRequest\x1a\x1b.extensions.InstallResponse\"\x00\x12>\n\x05\x43heck\x12\x18.extensions.CheckRequest\x1a\x19.extensions.CheckResponse\"\x00\x12\x41\n\x06Update\x12\x19.extensions.UpdateRequest\x1a\x1a.extensions.UpdateResponse\"\x00\x12J\n\tUninstall\x12\x1c.extensions.UninstallRequest\x1a\x1d.extensions.UninstallResponse\"\x00\x12\x41\n\x06\x41\x63tion\x12\x19.extensions.ActionRequest\x1a\x1a.extensions.ActionResponse\"\x00\x42\x37Z5git.perx.ru/perxis/perxis/proto/extensions;extensionsb\x06proto3'
-)
+  serialized_pb=b'\n!perxis/extensions/extension.proto\x12\nextensions\x1a\"perxis/references/references.proto\"Y\n\x0eInstallRequest\x12\x13\n\nextensions\x18\x90N \x03(\t\x12\x11\n\x08space_id\x18\x9aN \x01(\t\x12\x0f\n\x06\x65nv_id\x18\xa4N \x01(\t\x12\x0e\n\x05\x66orce\x18\xf4N \x01(\x08\"\xd9\x01\n\x16\x45xtensionRequestResult\x12\x38\n\x05state\x18\x90N \x01(\x0e\x32(.extensions.ExtensionRequestResult.State\x12\x12\n\textension\x18\xf4N \x01(\t\x12\x0c\n\x03msg\x18\xd8O \x01(\t\x12\x0e\n\x05\x65rror\x18\xbcP \x01(\t\x12\x19\n\x10update_available\x18\xa0Q \x01(\x08\"8\n\x05State\x12\x06\n\x02OK\x10\x00\x12\t\n\x05\x45RROR\x10\x01\x12\x0b\n\x07PENDING\x10\x02\x12\x0f\n\x0bIN_PROGRESS\x10\x03\"G\n\x0fInstallResponse\x12\x34\n\x07results\x18\x90N \x03(\x0b\x32\".extensions.ExtensionRequestResult\"l\n\x10UninstallRequest\x12\x13\n\nextensions\x18\x90N \x03(\t\x12\x11\n\x08space_id\x18\x9aN \x01(\t\x12\x0f\n\x06\x65nv_id\x18\xa4N \x01(\t\x12\x0f\n\x06remove\x18\xf4N \x01(\x08\x12\x0e\n\x05\x66orce\x18\xd8O \x01(\x08\"I\n\x11UninstallResponse\x12\x34\n\x07results\x18\x90N \x03(\x0b\x32\".extensions.ExtensionRequestResult\"X\n\rUpdateRequest\x12\x13\n\nextensions\x18\x90N \x03(\t\x12\x11\n\x08space_id\x18\x9aN \x01(\t\x12\x0f\n\x06\x65nv_id\x18\xa4N \x01(\t\x12\x0e\n\x05\x66orce\x18\xf4N \x01(\x08\"F\n\x0eUpdateResponse\x12\x34\n\x07results\x18\x90N \x03(\x0b\x32\".extensions.ExtensionRequestResult\"G\n\x0c\x43heckRequest\x12\x13\n\nextensions\x18\x90N \x03(\t\x12\x11\n\x08space_id\x18\x9aN \x01(\t\x12\x0f\n\x06\x65nv_id\x18\xa4N \x01(\t\"E\n\rCheckResponse\x12\x34\n\x07results\x18\x90N \x03(\x0b\x32\".extensions.ExtensionRequestResult\"\xf1\x02\n\rActionRequest\x12\x12\n\textension\x18\xe8\x07 \x01(\t\x12\x0f\n\x06\x61\x63tion\x18\xf4N \x01(\t\x12\x11\n\x08space_id\x18\x84R \x01(\t\x12\x0f\n\x06\x65nv_id\x18\x8eR \x01(\t\x12\x16\n\rcollection_id\x18\x98R \x01(\t\x12\x10\n\x07item_id\x18\xa2R \x01(\t\x12\x11\n\x08item_ids\x18\xacR \x03(\t\x12\x0f\n\x06\x66ields\x18\xb6R \x03(\t\x12:\n\x08metadata\x18\xf8U \x03(\x0b\x32\'.extensions.ActionRequest.MetadataEntry\x12,\n\x04refs\x18\x82V \x03(\x0b\x32\x1d.content.references.Reference\x12.\n\x06params\x18\x8cV \x01(\x0b\x32\x1d.content.references.Reference\x1a/\n\rMetadataEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\"\xdb\x02\n\x0e\x41\x63tionResponse\x12\x30\n\x05state\x18\x90N \x01(\x0e\x32 .extensions.ActionResponse.State\x12\x0c\n\x03msg\x18\xf4N \x01(\t\x12\x0e\n\x05\x65rror\x18\xd8O \x01(\t\x12!\n\x04next\x18\xbcP \x03(\x0b\x32\x12.extensions.Action\x12;\n\x08metadata\x18\xa0Q \x03(\x0b\x32(.extensions.ActionResponse.MetadataEntry\x12,\n\x04refs\x18\xd0P \x03(\x0b\x32\x1d.content.references.Reference\x1a/\n\rMetadataEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\":\n\x05State\x12\x08\n\x04\x44ONE\x10\x00\x12\t\n\x05\x45RROR\x10\x01\x12\x0b\n\x07PENDING\x10\x02\x12\x0f\n\x0bIN_PROGRESS\x10\x03\"\xf9\x03\n\x06\x41\x63tion\x12\x12\n\textension\x18\x90N \x01(\t\x12\x0f\n\x06\x61\x63tion\x18\xf4N \x01(\t\x12\r\n\x04name\x18\xd8O \x01(\t\x12\x14\n\x0b\x64\x65scription\x18\xe2O \x01(\t\x12\r\n\x04icon\x18\xecO \x01(\t\x12-\n\x05image\x18\xf6O \x01(\x0b\x32\x1d.content.references.Reference\x12\x0f\n\x06groups\x18\x80P \x03(\t\x12&\n\x04kind\x18\xbcP \x01(\x0e\x32\x17.extensions.Action.Kind\x12\x10\n\x07\x63lasses\x18\xc6P \x03(\t\x12,\n\x04refs\x18\xd0P \x03(\x0b\x32\x1d.content.references.Reference\x12\x1a\n\x11params_collection\x18\xdaP \x01(\t\x12+\n\x07request\x18\xa0Q \x01(\x0b\x32\x19.extensions.ActionRequest\x12\x1a\n\x11navigation_action\x18\x84R \x01(\x08\x12\x19\n\x10navigation_route\x18\x8eR \x01(\t\"n\n\x04Kind\x12\x0b\n\x07\x44\x45\x46\x41ULT\x10\x00\x12\t\n\x05SPACE\x10\x01\x12\x0f\n\x0b\x45NVIRONMENT\x10\x02\x12\x0e\n\nCOLLECTION\x10\x03\x12\x08\n\x04ITEM\x10\x04\x12\t\n\x05ITEMS\x10\x05\x12\x0c\n\x08REVISION\x10\x06\x12\n\n\x06\x43REATE\x10\x07\x32\xe3\x02\n\tExtension\x12\x44\n\x07Install\x12\x1a.extensions.InstallRequest\x1a\x1b.extensions.InstallResponse\"\x00\x12>\n\x05\x43heck\x12\x18.extensions.CheckRequest\x1a\x19.extensions.CheckResponse\"\x00\x12\x41\n\x06Update\x12\x19.extensions.UpdateRequest\x1a\x1a.extensions.UpdateResponse\"\x00\x12J\n\tUninstall\x12\x1c.extensions.UninstallRequest\x1a\x1d.extensions.UninstallResponse\"\x00\x12\x41\n\x06\x41\x63tion\x12\x19.extensions.ActionRequest\x1a\x1a.extensions.ActionResponse\"\x00\x42\x37Z5git.perx.ru/perxis/perxis/proto/extensions;extensionsb\x06proto3'
+  ,
+  dependencies=[perxis_dot_references_dot_references__pb2.DESCRIPTOR,])
 
 
 
@@ -54,8 +56,8 @@ _EXTENSIONREQUESTRESULT_STATE = _descriptor.EnumDescriptor(
   ],
   containing_type=None,
   serialized_options=None,
-  serialized_start=302,
-  serialized_end=358,
+  serialized_start=338,
+  serialized_end=394,
 )
 _sym_db.RegisterEnumDescriptor(_EXTENSIONREQUESTRESULT_STATE)
 
@@ -89,8 +91,8 @@ _ACTIONRESPONSE_STATE = _descriptor.EnumDescriptor(
   ],
   containing_type=None,
   serialized_options=None,
-  serialized_start=1429,
-  serialized_end=1487,
+  serialized_start=1622,
+  serialized_end=1680,
 )
 _sym_db.RegisterEnumDescriptor(_ACTIONRESPONSE_STATE)
 
@@ -136,11 +138,16 @@ _ACTION_KIND = _descriptor.EnumDescriptor(
       serialized_options=None,
       type=None,
       create_key=_descriptor._internal_create_key),
+    _descriptor.EnumValueDescriptor(
+      name='CREATE', index=7, number=7,
+      serialized_options=None,
+      type=None,
+      create_key=_descriptor._internal_create_key),
   ],
   containing_type=None,
   serialized_options=None,
-  serialized_start=1714,
-  serialized_end=1812,
+  serialized_start=2078,
+  serialized_end=2188,
 )
 _sym_db.RegisterEnumDescriptor(_ACTION_KIND)
 
@@ -193,8 +200,8 @@ _INSTALLREQUEST = _descriptor.Descriptor(
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=49,
-  serialized_end=138,
+  serialized_start=85,
+  serialized_end=174,
 )
 
 
@@ -254,8 +261,8 @@ _EXTENSIONREQUESTRESULT = _descriptor.Descriptor(
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=141,
-  serialized_end=358,
+  serialized_start=177,
+  serialized_end=394,
 )
 
 
@@ -286,8 +293,8 @@ _INSTALLRESPONSE = _descriptor.Descriptor(
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=360,
-  serialized_end=431,
+  serialized_start=396,
+  serialized_end=467,
 )
 
 
@@ -346,8 +353,8 @@ _UNINSTALLREQUEST = _descriptor.Descriptor(
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=433,
-  serialized_end=541,
+  serialized_start=469,
+  serialized_end=577,
 )
 
 
@@ -378,8 +385,8 @@ _UNINSTALLRESPONSE = _descriptor.Descriptor(
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=543,
-  serialized_end=616,
+  serialized_start=579,
+  serialized_end=652,
 )
 
 
@@ -431,8 +438,8 @@ _UPDATEREQUEST = _descriptor.Descriptor(
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=618,
-  serialized_end=706,
+  serialized_start=654,
+  serialized_end=742,
 )
 
 
@@ -463,8 +470,8 @@ _UPDATERESPONSE = _descriptor.Descriptor(
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=708,
-  serialized_end=778,
+  serialized_start=744,
+  serialized_end=814,
 )
 
 
@@ -509,8 +516,8 @@ _CHECKREQUEST = _descriptor.Descriptor(
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=780,
-  serialized_end=851,
+  serialized_start=816,
+  serialized_end=887,
 )
 
 
@@ -541,8 +548,8 @@ _CHECKRESPONSE = _descriptor.Descriptor(
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=853,
-  serialized_end=922,
+  serialized_start=889,
+  serialized_end=958,
 )
 
 
@@ -580,8 +587,8 @@ _ACTIONREQUEST_METADATAENTRY = _descriptor.Descriptor(
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=1136,
-  serialized_end=1183,
+  serialized_start=1283,
+  serialized_end=1330,
 )
 
 _ACTIONREQUEST = _descriptor.Descriptor(
@@ -642,12 +649,33 @@ _ACTIONREQUEST = _descriptor.Descriptor(
       is_extension=False, extension_scope=None,
       serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
-      name='metadata', full_name='extensions.ActionRequest.metadata', index=7,
+      name='fields', full_name='extensions.ActionRequest.fields', index=7,
+      number=10550, type=9, cpp_type=9, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='metadata', full_name='extensions.ActionRequest.metadata', index=8,
       number=11000, type=11, cpp_type=10, label=3,
       has_default_value=False, default_value=[],
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
       serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='refs', full_name='extensions.ActionRequest.refs', index=9,
+      number=11010, type=11, cpp_type=10, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='params', full_name='extensions.ActionRequest.params', index=10,
+      number=11020, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
   ],
   extensions=[
   ],
@@ -660,8 +688,8 @@ _ACTIONREQUEST = _descriptor.Descriptor(
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=925,
-  serialized_end=1183,
+  serialized_start=961,
+  serialized_end=1330,
 )
 
 
@@ -699,8 +727,8 @@ _ACTIONRESPONSE_METADATAENTRY = _descriptor.Descriptor(
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=1136,
-  serialized_end=1183,
+  serialized_start=1283,
+  serialized_end=1330,
 )
 
 _ACTIONRESPONSE = _descriptor.Descriptor(
@@ -746,6 +774,13 @@ _ACTIONRESPONSE = _descriptor.Descriptor(
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
       serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='refs', full_name='extensions.ActionResponse.refs', index=5,
+      number=10320, type=11, cpp_type=10, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
   ],
   extensions=[
   ],
@@ -759,8 +794,8 @@ _ACTIONRESPONSE = _descriptor.Descriptor(
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=1186,
-  serialized_end=1487,
+  serialized_start=1333,
+  serialized_end=1680,
 )
 
 
@@ -801,28 +836,70 @@ _ACTION = _descriptor.Descriptor(
       is_extension=False, extension_scope=None,
       serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
-      name='kind', full_name='extensions.Action.kind', index=4,
+      name='icon', full_name='extensions.Action.icon', index=4,
+      number=10220, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='image', full_name='extensions.Action.image', index=5,
+      number=10230, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='groups', full_name='extensions.Action.groups', index=6,
+      number=10240, type=9, cpp_type=9, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='kind', full_name='extensions.Action.kind', index=7,
       number=10300, type=14, cpp_type=8, label=1,
       has_default_value=False, default_value=0,
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
       serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
-      name='request', full_name='extensions.Action.request', index=5,
+      name='classes', full_name='extensions.Action.classes', index=8,
+      number=10310, type=9, cpp_type=9, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='refs', full_name='extensions.Action.refs', index=9,
+      number=10320, type=11, cpp_type=10, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='params_collection', full_name='extensions.Action.params_collection', index=10,
+      number=10330, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='request', full_name='extensions.Action.request', index=11,
       number=10400, type=11, cpp_type=10, label=1,
       has_default_value=False, default_value=None,
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
       serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
-      name='navigation_action', full_name='extensions.Action.navigation_action', index=6,
+      name='navigation_action', full_name='extensions.Action.navigation_action', index=12,
       number=10500, type=8, cpp_type=7, label=1,
       has_default_value=False, default_value=False,
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
       serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
-      name='navigation_route', full_name='extensions.Action.navigation_route', index=7,
+      name='navigation_route', full_name='extensions.Action.navigation_route', index=13,
       number=10510, type=9, cpp_type=9, label=1,
       has_default_value=False, default_value=b"".decode('utf-8'),
       message_type=None, enum_type=None, containing_type=None,
@@ -841,8 +918,8 @@ _ACTION = _descriptor.Descriptor(
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=1490,
-  serialized_end=1812,
+  serialized_start=1683,
+  serialized_end=2188,
 )
 
 _EXTENSIONREQUESTRESULT.fields_by_name['state'].enum_type = _EXTENSIONREQUESTRESULT_STATE
@@ -853,12 +930,17 @@ _UPDATERESPONSE.fields_by_name['results'].message_type = _EXTENSIONREQUESTRESULT
 _CHECKRESPONSE.fields_by_name['results'].message_type = _EXTENSIONREQUESTRESULT
 _ACTIONREQUEST_METADATAENTRY.containing_type = _ACTIONREQUEST
 _ACTIONREQUEST.fields_by_name['metadata'].message_type = _ACTIONREQUEST_METADATAENTRY
+_ACTIONREQUEST.fields_by_name['refs'].message_type = perxis_dot_references_dot_references__pb2._REFERENCE
+_ACTIONREQUEST.fields_by_name['params'].message_type = perxis_dot_references_dot_references__pb2._REFERENCE
 _ACTIONRESPONSE_METADATAENTRY.containing_type = _ACTIONRESPONSE
 _ACTIONRESPONSE.fields_by_name['state'].enum_type = _ACTIONRESPONSE_STATE
 _ACTIONRESPONSE.fields_by_name['next'].message_type = _ACTION
 _ACTIONRESPONSE.fields_by_name['metadata'].message_type = _ACTIONRESPONSE_METADATAENTRY
+_ACTIONRESPONSE.fields_by_name['refs'].message_type = perxis_dot_references_dot_references__pb2._REFERENCE
 _ACTIONRESPONSE_STATE.containing_type = _ACTIONRESPONSE
+_ACTION.fields_by_name['image'].message_type = perxis_dot_references_dot_references__pb2._REFERENCE
 _ACTION.fields_by_name['kind'].enum_type = _ACTION_KIND
+_ACTION.fields_by_name['refs'].message_type = perxis_dot_references_dot_references__pb2._REFERENCE
 _ACTION.fields_by_name['request'].message_type = _ACTIONREQUEST
 _ACTION_KIND.containing_type = _ACTION
 DESCRIPTOR.message_types_by_name['InstallRequest'] = _INSTALLREQUEST
@@ -987,8 +1069,8 @@ _EXTENSION = _descriptor.ServiceDescriptor(
   index=0,
   serialized_options=None,
   create_key=_descriptor._internal_create_key,
-  serialized_start=1815,
-  serialized_end=2170,
+  serialized_start=2191,
+  serialized_end=2546,
   methods=[
   _descriptor.MethodDescriptor(
     name='Install',
diff --git a/perxis/extensions/manager_pb2.py b/perxis/extensions/manager_pb2.py
index bdd635c443eb92144ef58d0bbd898410aa126d25..25610b3f4c6f140cc335b00c1ecff1652aded684 100644
--- a/perxis/extensions/manager_pb2.py
+++ b/perxis/extensions/manager_pb2.py
@@ -19,7 +19,7 @@ DESCRIPTOR = _descriptor.FileDescriptor(
   syntax='proto3',
   serialized_options=b'Z5git.perx.ru/perxis/perxis/proto/extensions;extensions',
   create_key=_descriptor._internal_create_key,
-  serialized_pb=b'\n\x1fperxis/extensions/manager.proto\x12\nextensions\"\x8d\x02\n\x13\x45xtensionDescriptor\x12\x12\n\textension\x18\x90N \x01(\t\x12\x0e\n\x05title\x18\x9aN \x01(\t\x12\x14\n\x0b\x64\x65scription\x18\xa4N \x01(\t\x12\x10\n\x07version\x18\xf4N \x01(\t\x12\x1c\n\x13version_description\x18\xfeN \x01(\t\x12\r\n\x04\x64\x65ps\x18\xd8O \x03(\t\x12\x0b\n\x03url\x18\x05 \x01(\t\x12?\n\x08metadata\x18\x06 \x03(\x0b\x32-.extensions.ExtensionDescriptor.MetadataEntry\x1a/\n\rMetadataEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\"P\n\x19RegisterExtensionsRequest\x12\x33\n\nextensions\x18\x01 \x03(\x0b\x32\x1f.extensions.ExtensionDescriptor\"\x1c\n\x1aRegisterExtensionsResponse\")\n\x14ListExtensionsFilter\x12\x11\n\textension\x18\x01 \x03(\t\"I\n\x15ListExtensionsRequest\x12\x30\n\x06\x66ilter\x18\x01 \x01(\x0b\x32 .extensions.ListExtensionsFilter\"M\n\x16ListExtensionsResponse\x12\x33\n\nextensions\x18\x01 \x03(\x0b\x32\x1f.extensions.ExtensionDescriptor\"\xf5\x01\n\x0fSpaceExtensions\x12\x12\n\textension\x18\x90N \x01(\t\x12\x0e\n\x05title\x18\x9aN \x01(\t\x12\x10\n\x07version\x18\xf4N \x01(\t\x12\r\n\x04\x64\x65ps\x18\xd8O \x03(\t\x12\x31\n\x05state\x18\xbcP \x01(\x0e\x32!.extensions.SpaceExtensions.State\x12\x15\n\x0cstatus_error\x18\xa0Q \x01(\t\x12\x13\n\nstatus_msg\x18\x84R \x01(\t\">\n\x05State\x12\x0b\n\x07PENDING\x10\x00\x12\r\n\tINSTALLED\x10\x01\x12\x0f\n\x0bIN_PROGRESS\x10\x02\x12\x08\n\x04\x46\x41IL\x10\x03\x32\xd4\x01\n\x10\x45xtensionManager\x12\x65\n\x12RegisterExtensions\x12%.extensions.RegisterExtensionsRequest\x1a&.extensions.RegisterExtensionsResponse\"\x00\x12Y\n\x0eListExtensions\x12!.extensions.ListExtensionsRequest\x1a\".extensions.ListExtensionsResponse\"\x00\x42\x37Z5git.perx.ru/perxis/perxis/proto/extensions;extensionsb\x06proto3'
+  serialized_pb=b'\n\x1fperxis/extensions/manager.proto\x12\nextensions\"\x8d\x02\n\x13\x45xtensionDescriptor\x12\x12\n\textension\x18\x90N \x01(\t\x12\x0e\n\x05title\x18\x9aN \x01(\t\x12\x14\n\x0b\x64\x65scription\x18\xa4N \x01(\t\x12\x10\n\x07version\x18\xf4N \x01(\t\x12\x1c\n\x13version_description\x18\xfeN \x01(\t\x12\r\n\x04\x64\x65ps\x18\xd8O \x03(\t\x12\x0b\n\x03url\x18\x05 \x01(\t\x12?\n\x08metadata\x18\x06 \x03(\x0b\x32-.extensions.ExtensionDescriptor.MetadataEntry\x1a/\n\rMetadataEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\"P\n\x19RegisterExtensionsRequest\x12\x33\n\nextensions\x18\x01 \x03(\x0b\x32\x1f.extensions.ExtensionDescriptor\"\x1c\n\x1aRegisterExtensionsResponse\"R\n\x1bUnregisterExtensionsRequest\x12\x33\n\nextensions\x18\x01 \x03(\x0b\x32\x1f.extensions.ExtensionDescriptor\"\x1e\n\x1cUnregisterExtensionsResponse\")\n\x14ListExtensionsFilter\x12\x11\n\textension\x18\x01 \x03(\t\"I\n\x15ListExtensionsRequest\x12\x30\n\x06\x66ilter\x18\x01 \x01(\x0b\x32 .extensions.ListExtensionsFilter\"M\n\x16ListExtensionsResponse\x12\x33\n\nextensions\x18\x01 \x03(\x0b\x32\x1f.extensions.ExtensionDescriptor\"\xf5\x01\n\x0fSpaceExtensions\x12\x12\n\textension\x18\x90N \x01(\t\x12\x0e\n\x05title\x18\x9aN \x01(\t\x12\x10\n\x07version\x18\xf4N \x01(\t\x12\r\n\x04\x64\x65ps\x18\xd8O \x03(\t\x12\x31\n\x05state\x18\xbcP \x01(\x0e\x32!.extensions.SpaceExtensions.State\x12\x15\n\x0cstatus_error\x18\xa0Q \x01(\t\x12\x13\n\nstatus_msg\x18\x84R \x01(\t\">\n\x05State\x12\x0b\n\x07PENDING\x10\x00\x12\r\n\tINSTALLED\x10\x01\x12\x0f\n\x0bIN_PROGRESS\x10\x02\x12\x08\n\x04\x46\x41IL\x10\x03\x32\xc1\x02\n\x10\x45xtensionManager\x12\x65\n\x12RegisterExtensions\x12%.extensions.RegisterExtensionsRequest\x1a&.extensions.RegisterExtensionsResponse\"\x00\x12k\n\x14UnregisterExtensions\x12\'.extensions.UnregisterExtensionsRequest\x1a(.extensions.UnregisterExtensionsResponse\"\x00\x12Y\n\x0eListExtensions\x12!.extensions.ListExtensionsRequest\x1a\".extensions.ListExtensionsResponse\"\x00\x42\x37Z5git.perx.ru/perxis/perxis/proto/extensions;extensionsb\x06proto3'
 )
 
 
@@ -54,8 +54,8 @@ _SPACEEXTENSIONS_STATE = _descriptor.EnumDescriptor(
   ],
   containing_type=None,
   serialized_options=None,
-  serialized_start=812,
-  serialized_end=874,
+  serialized_start=928,
+  serialized_end=990,
 )
 _sym_db.RegisterEnumDescriptor(_SPACEEXTENSIONS_STATE)
 
@@ -236,6 +236,63 @@ _REGISTEREXTENSIONSRESPONSE = _descriptor.Descriptor(
 )
 
 
+_UNREGISTEREXTENSIONSREQUEST = _descriptor.Descriptor(
+  name='UnregisterExtensionsRequest',
+  full_name='extensions.UnregisterExtensionsRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='extensions', full_name='extensions.UnregisterExtensionsRequest.extensions', index=0,
+      number=1, type=11, cpp_type=10, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=431,
+  serialized_end=513,
+)
+
+
+_UNREGISTEREXTENSIONSRESPONSE = _descriptor.Descriptor(
+  name='UnregisterExtensionsResponse',
+  full_name='extensions.UnregisterExtensionsResponse',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=515,
+  serialized_end=545,
+)
+
+
 _LISTEXTENSIONSFILTER = _descriptor.Descriptor(
   name='ListExtensionsFilter',
   full_name='extensions.ListExtensionsFilter',
@@ -263,8 +320,8 @@ _LISTEXTENSIONSFILTER = _descriptor.Descriptor(
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=431,
-  serialized_end=472,
+  serialized_start=547,
+  serialized_end=588,
 )
 
 
@@ -295,8 +352,8 @@ _LISTEXTENSIONSREQUEST = _descriptor.Descriptor(
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=474,
-  serialized_end=547,
+  serialized_start=590,
+  serialized_end=663,
 )
 
 
@@ -327,8 +384,8 @@ _LISTEXTENSIONSRESPONSE = _descriptor.Descriptor(
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=549,
-  serialized_end=626,
+  serialized_start=665,
+  serialized_end=742,
 )
 
 
@@ -402,13 +459,14 @@ _SPACEEXTENSIONS = _descriptor.Descriptor(
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=629,
-  serialized_end=874,
+  serialized_start=745,
+  serialized_end=990,
 )
 
 _EXTENSIONDESCRIPTOR_METADATAENTRY.containing_type = _EXTENSIONDESCRIPTOR
 _EXTENSIONDESCRIPTOR.fields_by_name['metadata'].message_type = _EXTENSIONDESCRIPTOR_METADATAENTRY
 _REGISTEREXTENSIONSREQUEST.fields_by_name['extensions'].message_type = _EXTENSIONDESCRIPTOR
+_UNREGISTEREXTENSIONSREQUEST.fields_by_name['extensions'].message_type = _EXTENSIONDESCRIPTOR
 _LISTEXTENSIONSREQUEST.fields_by_name['filter'].message_type = _LISTEXTENSIONSFILTER
 _LISTEXTENSIONSRESPONSE.fields_by_name['extensions'].message_type = _EXTENSIONDESCRIPTOR
 _SPACEEXTENSIONS.fields_by_name['state'].enum_type = _SPACEEXTENSIONS_STATE
@@ -416,6 +474,8 @@ _SPACEEXTENSIONS_STATE.containing_type = _SPACEEXTENSIONS
 DESCRIPTOR.message_types_by_name['ExtensionDescriptor'] = _EXTENSIONDESCRIPTOR
 DESCRIPTOR.message_types_by_name['RegisterExtensionsRequest'] = _REGISTEREXTENSIONSREQUEST
 DESCRIPTOR.message_types_by_name['RegisterExtensionsResponse'] = _REGISTEREXTENSIONSRESPONSE
+DESCRIPTOR.message_types_by_name['UnregisterExtensionsRequest'] = _UNREGISTEREXTENSIONSREQUEST
+DESCRIPTOR.message_types_by_name['UnregisterExtensionsResponse'] = _UNREGISTEREXTENSIONSRESPONSE
 DESCRIPTOR.message_types_by_name['ListExtensionsFilter'] = _LISTEXTENSIONSFILTER
 DESCRIPTOR.message_types_by_name['ListExtensionsRequest'] = _LISTEXTENSIONSREQUEST
 DESCRIPTOR.message_types_by_name['ListExtensionsResponse'] = _LISTEXTENSIONSRESPONSE
@@ -451,6 +511,20 @@ RegisterExtensionsResponse = _reflection.GeneratedProtocolMessageType('RegisterE
   })
 _sym_db.RegisterMessage(RegisterExtensionsResponse)
 
+UnregisterExtensionsRequest = _reflection.GeneratedProtocolMessageType('UnregisterExtensionsRequest', (_message.Message,), {
+  'DESCRIPTOR' : _UNREGISTEREXTENSIONSREQUEST,
+  '__module__' : 'perxis.extensions.manager_pb2'
+  # @@protoc_insertion_point(class_scope:extensions.UnregisterExtensionsRequest)
+  })
+_sym_db.RegisterMessage(UnregisterExtensionsRequest)
+
+UnregisterExtensionsResponse = _reflection.GeneratedProtocolMessageType('UnregisterExtensionsResponse', (_message.Message,), {
+  'DESCRIPTOR' : _UNREGISTEREXTENSIONSRESPONSE,
+  '__module__' : 'perxis.extensions.manager_pb2'
+  # @@protoc_insertion_point(class_scope:extensions.UnregisterExtensionsResponse)
+  })
+_sym_db.RegisterMessage(UnregisterExtensionsResponse)
+
 ListExtensionsFilter = _reflection.GeneratedProtocolMessageType('ListExtensionsFilter', (_message.Message,), {
   'DESCRIPTOR' : _LISTEXTENSIONSFILTER,
   '__module__' : 'perxis.extensions.manager_pb2'
@@ -490,8 +564,8 @@ _EXTENSIONMANAGER = _descriptor.ServiceDescriptor(
   index=0,
   serialized_options=None,
   create_key=_descriptor._internal_create_key,
-  serialized_start=877,
-  serialized_end=1089,
+  serialized_start=993,
+  serialized_end=1314,
   methods=[
   _descriptor.MethodDescriptor(
     name='RegisterExtensions',
@@ -503,10 +577,20 @@ _EXTENSIONMANAGER = _descriptor.ServiceDescriptor(
     serialized_options=None,
     create_key=_descriptor._internal_create_key,
   ),
+  _descriptor.MethodDescriptor(
+    name='UnregisterExtensions',
+    full_name='extensions.ExtensionManager.UnregisterExtensions',
+    index=1,
+    containing_service=None,
+    input_type=_UNREGISTEREXTENSIONSREQUEST,
+    output_type=_UNREGISTEREXTENSIONSRESPONSE,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
   _descriptor.MethodDescriptor(
     name='ListExtensions',
     full_name='extensions.ExtensionManager.ListExtensions',
-    index=1,
+    index=2,
     containing_service=None,
     input_type=_LISTEXTENSIONSREQUEST,
     output_type=_LISTEXTENSIONSRESPONSE,
diff --git a/perxis/extensions/manager_pb2_grpc.py b/perxis/extensions/manager_pb2_grpc.py
index 4712a929b330f14ded89af8e8fc0eeaed727a6ca..c32e1e2a6a73a6bc570d5fc58adfa57fab04ac72 100644
--- a/perxis/extensions/manager_pb2_grpc.py
+++ b/perxis/extensions/manager_pb2_grpc.py
@@ -20,6 +20,11 @@ class ExtensionManagerStub(object):
                 request_serializer=perxis_dot_extensions_dot_manager__pb2.RegisterExtensionsRequest.SerializeToString,
                 response_deserializer=perxis_dot_extensions_dot_manager__pb2.RegisterExtensionsResponse.FromString,
                 )
+        self.UnregisterExtensions = channel.unary_unary(
+                '/extensions.ExtensionManager/UnregisterExtensions',
+                request_serializer=perxis_dot_extensions_dot_manager__pb2.UnregisterExtensionsRequest.SerializeToString,
+                response_deserializer=perxis_dot_extensions_dot_manager__pb2.UnregisterExtensionsResponse.FromString,
+                )
         self.ListExtensions = channel.unary_unary(
                 '/extensions.ExtensionManager/ListExtensions',
                 request_serializer=perxis_dot_extensions_dot_manager__pb2.ListExtensionsRequest.SerializeToString,
@@ -34,7 +39,7 @@ class ExtensionManagerServicer(object):
     def RegisterExtensions(self, request, context):
         """##  Регистрация расширений
 
-        Регистрация происходить через сервис менеджера расширений (Extension Manager). В процессе регистрации сервис сообщает
+        Регистрация\Дерегистрация происходить через сервис менеджера расширений (Extension Manager). В процессе регистрации сервис сообщает
         о поддерживаемых сервисом действиях (Actions) и версии сервиса и зависимостях:
         1. Действия (Actions) - перечень действия которые обрабатываются сервисом. Включает в себя как системные действия,
         так и пользовательские, которые могут быть использованы в интерфейсе;
@@ -49,6 +54,12 @@ class ExtensionManagerServicer(object):
         context.set_details('Method not implemented!')
         raise NotImplementedError('Method not implemented!')
 
+    def UnregisterExtensions(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
     def ListExtensions(self, request, context):
         """Получить список зарегистрированных сервисов
         """
@@ -64,6 +75,11 @@ def add_ExtensionManagerServicer_to_server(servicer, server):
                     request_deserializer=perxis_dot_extensions_dot_manager__pb2.RegisterExtensionsRequest.FromString,
                     response_serializer=perxis_dot_extensions_dot_manager__pb2.RegisterExtensionsResponse.SerializeToString,
             ),
+            'UnregisterExtensions': grpc.unary_unary_rpc_method_handler(
+                    servicer.UnregisterExtensions,
+                    request_deserializer=perxis_dot_extensions_dot_manager__pb2.UnregisterExtensionsRequest.FromString,
+                    response_serializer=perxis_dot_extensions_dot_manager__pb2.UnregisterExtensionsResponse.SerializeToString,
+            ),
             'ListExtensions': grpc.unary_unary_rpc_method_handler(
                     servicer.ListExtensions,
                     request_deserializer=perxis_dot_extensions_dot_manager__pb2.ListExtensionsRequest.FromString,
@@ -97,6 +113,23 @@ class ExtensionManager(object):
             options, channel_credentials,
             insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
 
+    @staticmethod
+    def UnregisterExtensions(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/extensions.ExtensionManager/UnregisterExtensions',
+            perxis_dot_extensions_dot_manager__pb2.UnregisterExtensionsRequest.SerializeToString,
+            perxis_dot_extensions_dot_manager__pb2.UnregisterExtensionsResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
     @staticmethod
     def ListExtensions(request,
             target,
diff --git a/perxis/items/items_pb2.py b/perxis/items/items_pb2.py
index 76d11a606111987e4b9164b9dba707a2cb47c6a3..6c44b774aa6f5ebec03d0fe4470bb0555e7408fc 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+git.perx.ru/perxis/perxis/proto/items;items',
   create_key=_descriptor._internal_create_key,
-  serialized_pb=b'\n\x18perxis/items/items.proto\x12\rcontent.items\x1a\x1bgoogle/protobuf/empty.proto\x1a\x1aperxis/common/common.proto\x1a\x1fgoogle/protobuf/timestamp.proto\x1a\x1cgoogle/protobuf/struct.proto\"\'\n\x05\x45rror\x12\x0f\n\x07message\x18\x01 \x01(\t\x12\r\n\x05\x66ield\x18\x02 \x01(\t\"3\n\x0b\x44\x65\x63odeError\x12$\n\x06\x65rrors\x18\x02 \x03(\x0b\x32\x14.content.items.Error\"7\n\x0fValidationError\x12$\n\x06\x65rrors\x18\x02 \x03(\x0b\x32\x14.content.items.Error\"9\n\x11ModificationError\x12$\n\x06\x65rrors\x18\x02 \x03(\x0b\x32\x14.content.items.Error\"\xd4\x05\n\x04Item\x12\n\n\x02id\x18\x01 \x01(\t\x12\x10\n\x08space_id\x18\x02 \x01(\t\x12\x0e\n\x06\x65nv_id\x18\x03 \x01(\t\x12\x15\n\rcollection_id\x18\x04 \x01(\t\x12(\n\x05state\x18\x05 \x01(\x0e\x32\x19.content.items.Item.State\x12\x32\n\x0e\x63reated_rev_at\x18\x06 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x12\n\ncreated_by\x18\x07 \x01(\t\x12.\n\ncreated_at\x18\x08 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x12\n\nupdated_by\x18\t \x01(\t\x12.\n\nupdated_at\x18\n \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12%\n\x04\x64\x61ta\x18\x0b \x01(\x0b\x32\x17.google.protobuf.Struct\x12;\n\x0ctranslations\x18\x0c \x03(\x0b\x32%.content.items.Item.TranslationsEntry\x12\x13\n\x0brevision_id\x18\r \x01(\t\x12\x30\n\x0cpublished_at\x18\x0e \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x14\n\x0cpublished_by\x18\x0f \x01(\t\x12/\n\x0b\x61rchived_at\x18\x10 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x13\n\x0b\x61rchived_by\x18\x11 \x01(\t\x12\x0e\n\x06locale\x18\x12 \x01(\t\x1aL\n\x11TranslationsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12&\n\x05value\x18\x02 \x01(\x0b\x32\x17.google.protobuf.Struct:\x02\x38\x01\"<\n\x05State\x12\t\n\x05\x44RAFT\x10\x00\x12\r\n\tPUBLISHED\x10\x01\x12\x0b\n\x07\x43HANGED\x10\x02\x12\x0c\n\x08\x41RCHIVED\x10\x03\"=\n\x06\x46ilter\x12\n\n\x02id\x18\x01 \x03(\t\x12\x1c\n\x04\x64\x61ta\x18\x02 \x03(\x0b\x32\x0e.common.Filter\x12\t\n\x01q\x18\x03 \x03(\t\"3\n\x0b\x46indOptions\x12$\n\x07options\x18\x02 \x01(\x0b\x32\x13.common.FindOptions\"(\n\x13GetPublishedOptions\x12\x11\n\tlocale_id\x18\x01 \x01(\t\"O\n\x14\x46indPublishedOptions\x12$\n\x07options\x18\x02 \x01(\x0b\x32\x13.common.FindOptions\x12\x11\n\tlocale_id\x18\x03 \x01(\t\";\n\x13\x46indArchivedOptions\x12$\n\x07options\x18\x02 \x01(\x0b\x32\x13.common.FindOptions\"2\n\rCreateRequest\x12!\n\x04item\x18\x01 \x01(\x0b\x32\x13.content.items.Item\"6\n\x0e\x43reateResponse\x12$\n\x07\x63reated\x18\x01 \x01(\x0b\x32\x13.content.items.Item\"6\n\x11IntrospectRequest\x12!\n\x04item\x18\x01 \x01(\x0b\x32\x13.content.items.Item\"\x8b\x01\n\x12IntrospectResponse\x12!\n\x04item\x18\x01 \x01(\x0b\x32\x13.content.items.Item\x12\x0e\n\x06schema\x18\x02 \x01(\t\x12\x42\n\x11validation_errors\x18\x03 \x03(\x0b\x32\'.common.Error.BadRequest.FieldViolation\"V\n\nGetRequest\x12\x10\n\x08space_id\x18\x01 \x01(\t\x12\x0e\n\x06\x65nv_id\x18\x02 \x01(\t\x12\x15\n\rcollection_id\x18\x03 \x01(\t\x12\x0f\n\x07item_id\x18\x04 \x01(\t\"0\n\x0bGetResponse\x12!\n\x04item\x18\x01 \x01(\x0b\x32\x13.content.items.Item\"\x9a\x01\n\x0b\x46indRequest\x12\x10\n\x08space_id\x18\x01 \x01(\t\x12\x0e\n\x06\x65nv_id\x18\x02 \x01(\t\x12\x15\n\rcollection_id\x18\x03 \x01(\t\x12%\n\x06\x66ilter\x18\x04 \x01(\x0b\x32\x15.content.items.Filter\x12+\n\x07options\x18\x05 \x01(\x0b\x32\x1a.content.items.FindOptions\"A\n\x0c\x46indResponse\x12\"\n\x05items\x18\x01 \x03(\x0b\x32\x13.content.items.Item\x12\r\n\x05total\x18\x02 \x01(\x05\"2\n\rUpdateRequest\x12!\n\x04item\x18\x01 \x01(\x0b\x32\x13.content.items.Item\"Y\n\rDeleteRequest\x12\x10\n\x08space_id\x18\x01 \x01(\t\x12\x0e\n\x06\x65nv_id\x18\x02 \x01(\t\x12\x15\n\rcollection_id\x18\x03 \x01(\t\x12\x0f\n\x07item_id\x18\x04 \x01(\t\"3\n\x0ePublishRequest\x12!\n\x04item\x18\x01 \x01(\x0b\x32\x13.content.items.Item\"5\n\x10UnpublishRequest\x12!\n\x04item\x18\x01 \x01(\x0b\x32\x13.content.items.Item\"\x94\x01\n\x13GetPublishedRequest\x12\x10\n\x08space_id\x18\x01 \x01(\t\x12\x0e\n\x06\x65nv_id\x18\x02 \x01(\t\x12\x15\n\rcollection_id\x18\x03 \x01(\t\x12\x0f\n\x07item_id\x18\x05 \x01(\t\x12\x33\n\x07options\x18\n \x01(\x0b\x32\".content.items.GetPublishedOptions\"9\n\x14GetPublishedResponse\x12!\n\x04item\x18\x01 \x01(\x0b\x32\x13.content.items.Item\"\xac\x01\n\x14\x46indPublishedRequest\x12\x10\n\x08space_id\x18\x01 \x01(\t\x12\x0e\n\x06\x65nv_id\x18\x02 \x01(\t\x12\x15\n\rcollection_id\x18\x03 \x01(\t\x12%\n\x06\x66ilter\x18\x04 \x01(\x0b\x32\x15.content.items.Filter\x12\x34\n\x07options\x18\n \x01(\x0b\x32#.content.items.FindPublishedOptions\"J\n\x15\x46indPublishedResponse\x12\"\n\x05items\x18\x01 \x03(\x0b\x32\x13.content.items.Item\x12\r\n\x05total\x18\x02 \x01(\x05\"s\n\x12GetRevisionRequest\x12\x10\n\x08space_id\x18\x01 \x01(\t\x12\x0e\n\x06\x65nv_id\x18\x02 \x01(\t\x12\x15\n\rcollection_id\x18\x03 \x01(\t\x12\x0f\n\x07item_id\x18\x04 \x01(\t\x12\x13\n\x0brevision_id\x18\x05 \x01(\t\"8\n\x13GetRevisionResponse\x12!\n\x04item\x18\x01 \x01(\x0b\x32\x13.content.items.Item\"`\n\x14ListRevisionsRequest\x12\x10\n\x08space_id\x18\x01 \x01(\t\x12\x0e\n\x06\x65nv_id\x18\x02 \x01(\t\x12\x15\n\rcollection_id\x18\x03 \x01(\t\x12\x0f\n\x07item_id\x18\x04 \x01(\t\";\n\x15ListRevisionsResponse\x12\"\n\x05items\x18\x01 \x03(\x0b\x32\x13.content.items.Item\"3\n\x0e\x41rchiveRequest\x12!\n\x04item\x18\x01 \x01(\x0b\x32\x13.content.items.Item\"5\n\x10UnarchiveRequest\x12!\n\x04item\x18\x01 \x01(\x0b\x32\x13.content.items.Item\"\xaa\x01\n\x13\x46indArchivedRequest\x12\x10\n\x08space_id\x18\x01 \x01(\t\x12\x0e\n\x06\x65nv_id\x18\x02 \x01(\t\x12\x15\n\rcollection_id\x18\x03 \x01(\t\x12%\n\x06\x66ilter\x18\x04 \x01(\x0b\x32\x15.content.items.Filter\x12\x33\n\x07options\x18\x06 \x01(\x0b\x32\".content.items.FindArchivedOptions\"I\n\x14\x46indArchivedResponse\x12\"\n\x05items\x18\x01 \x03(\x0b\x32\x13.content.items.Item\x12\r\n\x05total\x18\x02 \x01(\x05\x32\x8e\t\n\x05Items\x12G\n\x06\x43reate\x12\x1c.content.items.CreateRequest\x1a\x1d.content.items.CreateResponse\"\x00\x12S\n\nIntrospect\x12 .content.items.IntrospectRequest\x1a!.content.items.IntrospectResponse\"\x00\x12>\n\x03Get\x12\x19.content.items.GetRequest\x1a\x1a.content.items.GetResponse\"\x00\x12\x41\n\x04\x46ind\x12\x1a.content.items.FindRequest\x1a\x1b.content.items.FindResponse\"\x00\x12@\n\x06Update\x12\x1c.content.items.UpdateRequest\x1a\x16.google.protobuf.Empty\"\x00\x12@\n\x06\x44\x65lete\x12\x1c.content.items.DeleteRequest\x1a\x16.google.protobuf.Empty\"\x00\x12\x42\n\x07Publish\x12\x1d.content.items.PublishRequest\x1a\x16.google.protobuf.Empty\"\x00\x12\x46\n\tUnpublish\x12\x1f.content.items.UnpublishRequest\x1a\x16.google.protobuf.Empty\"\x00\x12Y\n\x0cGetPublished\x12\".content.items.GetPublishedRequest\x1a#.content.items.GetPublishedResponse\"\x00\x12\\\n\rFindPublished\x12#.content.items.FindPublishedRequest\x1a$.content.items.FindPublishedResponse\"\x00\x12V\n\x0bGetRevision\x12!.content.items.GetRevisionRequest\x1a\".content.items.GetRevisionResponse\"\x00\x12\\\n\rListRevisions\x12#.content.items.ListRevisionsRequest\x1a$.content.items.ListRevisionsResponse\"\x00\x12\x42\n\x07\x41rchive\x12\x1d.content.items.ArchiveRequest\x1a\x16.google.protobuf.Empty\"\x00\x12Y\n\x0c\x46indArchived\x12\".content.items.FindArchivedRequest\x1a#.content.items.FindArchivedResponse\"\x00\x12\x46\n\tUnarchive\x12\x1f.content.items.UnarchiveRequest\x1a\x16.google.protobuf.Empty\"\x00\x42-Z+git.perx.ru/perxis/perxis/proto/items;itemsb\x06proto3'
+  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\"g\n\x0bPermissions\x12\x0c\n\x04\x65\x64it\x18\x01 \x01(\x08\x12\x0f\n\x07\x61rchive\x18\x02 \x01(\x08\x12\x0f\n\x07publish\x18\x03 \x01(\x08\x12\x13\n\x0bsoft_delete\x18\x04 \x01(\x08\x12\x13\n\x0bhard_delete\x18\x05 \x01(\x08\"\xb8\x06\n\x04Item\x12\n\n\x02id\x18\x01 \x01(\t\x12\x10\n\x08space_id\x18\x02 \x01(\t\x12\x0e\n\x06\x65nv_id\x18\x03 \x01(\t\x12\x15\n\rcollection_id\x18\x04 \x01(\t\x12(\n\x05state\x18\x05 \x01(\x0e\x32\x19.content.items.Item.State\x12\x32\n\x0e\x63reated_rev_at\x18\x06 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x12\n\ncreated_by\x18\x07 \x01(\t\x12.\n\ncreated_at\x18\x08 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x12\n\nupdated_by\x18\t \x01(\t\x12.\n\nupdated_at\x18\n \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12%\n\x04\x64\x61ta\x18\x0b \x01(\x0b\x32\x17.google.protobuf.Struct\x12;\n\x0ctranslations\x18\x0c \x03(\x0b\x32%.content.items.Item.TranslationsEntry\x12\x13\n\x0brevision_id\x18\r \x01(\t\x12\x30\n\x0cpublished_at\x18\x0e \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x14\n\x0cpublished_by\x18\x0f \x01(\t\x12/\n\x0b\x61rchived_at\x18\x10 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x13\n\x0b\x61rchived_by\x18\x11 \x01(\t\x12\x0e\n\x06locale\x18\x12 \x01(\t\x12\x0f\n\x07\x64\x65leted\x18\x13 \x01(\x08\x12\x0e\n\x06hidden\x18\x14 \x01(\x08\x12\x10\n\x08template\x18\x15 \x01(\x08\x12/\n\x0bpermissions\x18\x16 \x01(\x0b\x32\x1a.content.items.Permissions\x1aL\n\x11TranslationsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12&\n\x05value\x18\x02 \x01(\x0b\x32\x17.google.protobuf.Struct:\x02\x38\x01\"<\n\x05State\x12\t\n\x05\x44RAFT\x10\x00\x12\r\n\tPUBLISHED\x10\x01\x12\x0b\n\x07\x43HANGED\x10\x02\x12\x0c\n\x08\x41RCHIVED\x10\x03\"=\n\x06\x46ilter\x12\n\n\x02id\x18\x01 \x03(\t\x12\x1c\n\x04\x64\x61ta\x18\x02 \x03(\x0b\x32\x0e.common.Filter\x12\t\n\x01q\x18\x03 \x03(\t\"%\n\rCreateOptions\x12\x14\n\x0cupdate_attrs\x18\x01 \x01(\x08\"x\n\x0b\x46indOptions\x12$\n\x07options\x18\x02 \x01(\x0b\x32\x13.common.FindOptions\x12\x0f\n\x07\x64\x65leted\x18\x03 \x01(\x08\x12\x0f\n\x07regular\x18\x04 \x01(\x08\x12\x0e\n\x06hidden\x18\x05 \x01(\x08\x12\x11\n\ttemplates\x18\x06 \x01(\x08\"%\n\rUpdateOptions\x12\x14\n\x0cupdate_attrs\x18\x01 \x01(\x08\"(\n\x13GetPublishedOptions\x12\x11\n\tlocale_id\x18\x01 \x01(\t\"\x1e\n\rDeleteOptions\x12\r\n\x05\x65rase\x18\x01 \x01(\x08\"&\n\x0ePublishOptions\x12\x14\n\x0cupdate_attrs\x18\x01 \x01(\x08\"\x83\x01\n\x14\x46indPublishedOptions\x12$\n\x07options\x18\x02 \x01(\x0b\x32\x13.common.FindOptions\x12\x11\n\tlocale_id\x18\x03 \x01(\t\x12\x0f\n\x07regular\x18\x04 \x01(\x08\x12\x0e\n\x06hidden\x18\x05 \x01(\x08\x12\x11\n\ttemplates\x18\x06 \x01(\x08\";\n\x13\x46indArchivedOptions\x12$\n\x07options\x18\x02 \x01(\x0b\x32\x13.common.FindOptions\"<\n\x14ListRevisionsOptions\x12$\n\x07options\x18\x02 \x01(\x0b\x32\x13.common.FindOptions\"a\n\rCreateRequest\x12!\n\x04item\x18\x01 \x01(\x0b\x32\x13.content.items.Item\x12-\n\x07options\x18\x02 \x01(\x0b\x32\x1c.content.items.CreateOptions\"6\n\x0e\x43reateResponse\x12$\n\x07\x63reated\x18\x01 \x01(\x0b\x32\x13.content.items.Item\"6\n\x11IntrospectRequest\x12!\n\x04item\x18\x01 \x01(\x0b\x32\x13.content.items.Item\"\x8b\x01\n\x12IntrospectResponse\x12!\n\x04item\x18\x01 \x01(\x0b\x32\x13.content.items.Item\x12\x0e\n\x06schema\x18\x02 \x01(\t\x12\x42\n\x11validation_errors\x18\x03 \x03(\x0b\x32\'.common.Error.BadRequest.FieldViolation\"V\n\nGetRequest\x12\x10\n\x08space_id\x18\x01 \x01(\t\x12\x0e\n\x06\x65nv_id\x18\x02 \x01(\t\x12\x15\n\rcollection_id\x18\x03 \x01(\t\x12\x0f\n\x07item_id\x18\x04 \x01(\t\"0\n\x0bGetResponse\x12!\n\x04item\x18\x01 \x01(\x0b\x32\x13.content.items.Item\"\x9a\x01\n\x0b\x46indRequest\x12\x10\n\x08space_id\x18\x01 \x01(\t\x12\x0e\n\x06\x65nv_id\x18\x02 \x01(\t\x12\x15\n\rcollection_id\x18\x03 \x01(\t\x12%\n\x06\x66ilter\x18\x04 \x01(\x0b\x32\x15.content.items.Filter\x12+\n\x07options\x18\x05 \x01(\x0b\x32\x1a.content.items.FindOptions\"A\n\x0c\x46indResponse\x12\"\n\x05items\x18\x01 \x03(\x0b\x32\x13.content.items.Item\x12\r\n\x05total\x18\x02 \x01(\x05\"a\n\rUpdateRequest\x12!\n\x04item\x18\x01 \x01(\x0b\x32\x13.content.items.Item\x12-\n\x07options\x18\x02 \x01(\x0b\x32\x1c.content.items.UpdateOptions\"\x88\x01\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\x12-\n\x07options\x18\x05 \x01(\x0b\x32\x1c.content.items.DeleteOptions\"[\n\x0fUndeleteRequest\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\"c\n\x0ePublishRequest\x12!\n\x04item\x18\x01 \x01(\x0b\x32\x13.content.items.Item\x12.\n\x07options\x18\x02 \x01(\x0b\x32\x1d.content.items.PublishOptions\"5\n\x10UnpublishRequest\x12!\n\x04item\x18\x01 \x01(\x0b\x32\x13.content.items.Item\"\x94\x01\n\x13GetPublishedRequest\x12\x10\n\x08space_id\x18\x01 \x01(\t\x12\x0e\n\x06\x65nv_id\x18\x02 \x01(\t\x12\x15\n\rcollection_id\x18\x03 \x01(\t\x12\x0f\n\x07item_id\x18\x05 \x01(\t\x12\x33\n\x07options\x18\n \x01(\x0b\x32\".content.items.GetPublishedOptions\"9\n\x14GetPublishedResponse\x12!\n\x04item\x18\x01 \x01(\x0b\x32\x13.content.items.Item\"\xac\x01\n\x14\x46indPublishedRequest\x12\x10\n\x08space_id\x18\x01 \x01(\t\x12\x0e\n\x06\x65nv_id\x18\x02 \x01(\t\x12\x15\n\rcollection_id\x18\x03 \x01(\t\x12%\n\x06\x66ilter\x18\x04 \x01(\x0b\x32\x15.content.items.Filter\x12\x34\n\x07options\x18\n \x01(\x0b\x32#.content.items.FindPublishedOptions\"J\n\x15\x46indPublishedResponse\x12\"\n\x05items\x18\x01 \x03(\x0b\x32\x13.content.items.Item\x12\r\n\x05total\x18\x02 \x01(\x05\"s\n\x12GetRevisionRequest\x12\x10\n\x08space_id\x18\x01 \x01(\t\x12\x0e\n\x06\x65nv_id\x18\x02 \x01(\t\x12\x15\n\rcollection_id\x18\x03 \x01(\t\x12\x0f\n\x07item_id\x18\x04 \x01(\t\x12\x13\n\x0brevision_id\x18\x05 \x01(\t\"8\n\x13GetRevisionResponse\x12!\n\x04item\x18\x01 \x01(\x0b\x32\x13.content.items.Item\"\x96\x01\n\x14ListRevisionsRequest\x12\x10\n\x08space_id\x18\x01 \x01(\t\x12\x0e\n\x06\x65nv_id\x18\x02 \x01(\t\x12\x15\n\rcollection_id\x18\x03 \x01(\t\x12\x0f\n\x07item_id\x18\x04 \x01(\t\x12\x34\n\x07options\x18\n \x01(\x0b\x32#.content.items.ListRevisionsOptions\";\n\x15ListRevisionsResponse\x12\"\n\x05items\x18\x01 \x03(\x0b\x32\x13.content.items.Item\"3\n\x0e\x41rchiveRequest\x12!\n\x04item\x18\x01 \x01(\x0b\x32\x13.content.items.Item\"5\n\x10UnarchiveRequest\x12!\n\x04item\x18\x01 \x01(\x0b\x32\x13.content.items.Item\"\xaa\x01\n\x13\x46indArchivedRequest\x12\x10\n\x08space_id\x18\x01 \x01(\t\x12\x0e\n\x06\x65nv_id\x18\x02 \x01(\t\x12\x15\n\rcollection_id\x18\x03 \x01(\t\x12%\n\x06\x66ilter\x18\x04 \x01(\x0b\x32\x15.content.items.Filter\x12\x33\n\x07options\x18\x06 \x01(\x0b\x32\".content.items.FindArchivedOptions\"I\n\x14\x46indArchivedResponse\x12\"\n\x05items\x18\x01 \x03(\x0b\x32\x13.content.items.Item\x12\r\n\x05total\x18\x02 \x01(\x05\x32\xd4\t\n\x05Items\x12G\n\x06\x43reate\x12\x1c.content.items.CreateRequest\x1a\x1d.content.items.CreateResponse\"\x00\x12S\n\nIntrospect\x12 .content.items.IntrospectRequest\x1a!.content.items.IntrospectResponse\"\x00\x12>\n\x03Get\x12\x19.content.items.GetRequest\x1a\x1a.content.items.GetResponse\"\x00\x12\x41\n\x04\x46ind\x12\x1a.content.items.FindRequest\x1a\x1b.content.items.FindResponse\"\x00\x12@\n\x06Update\x12\x1c.content.items.UpdateRequest\x1a\x16.google.protobuf.Empty\"\x00\x12@\n\x06\x44\x65lete\x12\x1c.content.items.DeleteRequest\x1a\x16.google.protobuf.Empty\"\x00\x12\x44\n\x08Undelete\x12\x1e.content.items.UndeleteRequest\x1a\x16.google.protobuf.Empty\"\x00\x12\x42\n\x07Publish\x12\x1d.content.items.PublishRequest\x1a\x16.google.protobuf.Empty\"\x00\x12\x46\n\tUnpublish\x12\x1f.content.items.UnpublishRequest\x1a\x16.google.protobuf.Empty\"\x00\x12Y\n\x0cGetPublished\x12\".content.items.GetPublishedRequest\x1a#.content.items.GetPublishedResponse\"\x00\x12\\\n\rFindPublished\x12#.content.items.FindPublishedRequest\x1a$.content.items.FindPublishedResponse\"\x00\x12V\n\x0bGetRevision\x12!.content.items.GetRevisionRequest\x1a\".content.items.GetRevisionResponse\"\x00\x12\\\n\rListRevisions\x12#.content.items.ListRevisionsRequest\x1a$.content.items.ListRevisionsResponse\"\x00\x12\x42\n\x07\x41rchive\x12\x1d.content.items.ArchiveRequest\x1a\x16.google.protobuf.Empty\"\x00\x12Y\n\x0c\x46indArchived\x12\".content.items.FindArchivedRequest\x1a#.content.items.FindArchivedResponse\"\x00\x12\x46\n\tUnarchive\x12\x1f.content.items.UnarchiveRequest\x1a\x16.google.protobuf.Empty\"\x00\x42-Z+git.perx.ru/perxis/perxis/proto/items;itemsb\x06proto3'
   ,
   dependencies=[google_dot_protobuf_dot_empty__pb2.DESCRIPTOR,perxis_dot_common_dot_common__pb2.DESCRIPTOR,google_dot_protobuf_dot_timestamp__pb2.DESCRIPTOR,google_dot_protobuf_dot_struct__pb2.DESCRIPTOR,])
 
@@ -59,8 +59,8 @@ _ITEM_STATE = _descriptor.EnumDescriptor(
   ],
   containing_type=None,
   serialized_options=None,
-  serialized_start=1038,
-  serialized_end=1098,
+  serialized_start=1243,
+  serialized_end=1303,
 )
 _sym_db.RegisterEnumDescriptor(_ITEM_STATE)
 
@@ -200,6 +200,66 @@ _MODIFICATIONERROR = _descriptor.Descriptor(
 )
 
 
+_PERMISSIONS = _descriptor.Descriptor(
+  name='Permissions',
+  full_name='content.items.Permissions',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='edit', full_name='content.items.Permissions.edit', index=0,
+      number=1, type=8, cpp_type=7, label=1,
+      has_default_value=False, default_value=False,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='archive', full_name='content.items.Permissions.archive', index=1,
+      number=2, type=8, cpp_type=7, label=1,
+      has_default_value=False, default_value=False,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='publish', full_name='content.items.Permissions.publish', index=2,
+      number=3, type=8, cpp_type=7, label=1,
+      has_default_value=False, default_value=False,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='soft_delete', full_name='content.items.Permissions.soft_delete', index=3,
+      number=4, type=8, cpp_type=7, label=1,
+      has_default_value=False, default_value=False,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='hard_delete', full_name='content.items.Permissions.hard_delete', index=4,
+      number=5, type=8, cpp_type=7, label=1,
+      has_default_value=False, default_value=False,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=373,
+  serialized_end=476,
+)
+
+
 _ITEM_TRANSLATIONSENTRY = _descriptor.Descriptor(
   name='TranslationsEntry',
   full_name='content.items.Item.TranslationsEntry',
@@ -234,8 +294,8 @@ _ITEM_TRANSLATIONSENTRY = _descriptor.Descriptor(
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=960,
-  serialized_end=1036,
+  serialized_start=1165,
+  serialized_end=1241,
 )
 
 _ITEM = _descriptor.Descriptor(
@@ -372,6 +432,34 @@ _ITEM = _descriptor.Descriptor(
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
       serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='deleted', full_name='content.items.Item.deleted', index=18,
+      number=19, type=8, cpp_type=7, label=1,
+      has_default_value=False, default_value=False,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='hidden', full_name='content.items.Item.hidden', index=19,
+      number=20, type=8, cpp_type=7, label=1,
+      has_default_value=False, default_value=False,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='template', full_name='content.items.Item.template', index=20,
+      number=21, type=8, cpp_type=7, label=1,
+      has_default_value=False, default_value=False,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='permissions', full_name='content.items.Item.permissions', index=21,
+      number=22, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
   ],
   extensions=[
   ],
@@ -385,8 +473,8 @@ _ITEM = _descriptor.Descriptor(
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=374,
-  serialized_end=1098,
+  serialized_start=479,
+  serialized_end=1303,
 )
 
 
@@ -431,8 +519,40 @@ _FILTER = _descriptor.Descriptor(
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=1100,
-  serialized_end=1161,
+  serialized_start=1305,
+  serialized_end=1366,
+)
+
+
+_CREATEOPTIONS = _descriptor.Descriptor(
+  name='CreateOptions',
+  full_name='content.items.CreateOptions',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='update_attrs', full_name='content.items.CreateOptions.update_attrs', index=0,
+      number=1, type=8, cpp_type=7, label=1,
+      has_default_value=False, default_value=False,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=1368,
+  serialized_end=1405,
 )
 
 
@@ -451,6 +571,34 @@ _FINDOPTIONS = _descriptor.Descriptor(
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
       serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='deleted', full_name='content.items.FindOptions.deleted', index=1,
+      number=3, type=8, cpp_type=7, label=1,
+      has_default_value=False, default_value=False,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='regular', full_name='content.items.FindOptions.regular', index=2,
+      number=4, type=8, cpp_type=7, label=1,
+      has_default_value=False, default_value=False,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='hidden', full_name='content.items.FindOptions.hidden', index=3,
+      number=5, type=8, cpp_type=7, label=1,
+      has_default_value=False, default_value=False,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='templates', full_name='content.items.FindOptions.templates', index=4,
+      number=6, type=8, cpp_type=7, label=1,
+      has_default_value=False, default_value=False,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
   ],
   extensions=[
   ],
@@ -463,8 +611,40 @@ _FINDOPTIONS = _descriptor.Descriptor(
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=1163,
-  serialized_end=1214,
+  serialized_start=1407,
+  serialized_end=1527,
+)
+
+
+_UPDATEOPTIONS = _descriptor.Descriptor(
+  name='UpdateOptions',
+  full_name='content.items.UpdateOptions',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='update_attrs', full_name='content.items.UpdateOptions.update_attrs', index=0,
+      number=1, type=8, cpp_type=7, label=1,
+      has_default_value=False, default_value=False,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=1529,
+  serialized_end=1566,
 )
 
 
@@ -495,8 +675,72 @@ _GETPUBLISHEDOPTIONS = _descriptor.Descriptor(
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=1216,
-  serialized_end=1256,
+  serialized_start=1568,
+  serialized_end=1608,
+)
+
+
+_DELETEOPTIONS = _descriptor.Descriptor(
+  name='DeleteOptions',
+  full_name='content.items.DeleteOptions',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='erase', full_name='content.items.DeleteOptions.erase', index=0,
+      number=1, type=8, cpp_type=7, label=1,
+      has_default_value=False, default_value=False,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=1610,
+  serialized_end=1640,
+)
+
+
+_PUBLISHOPTIONS = _descriptor.Descriptor(
+  name='PublishOptions',
+  full_name='content.items.PublishOptions',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='update_attrs', full_name='content.items.PublishOptions.update_attrs', index=0,
+      number=1, type=8, cpp_type=7, label=1,
+      has_default_value=False, default_value=False,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=1642,
+  serialized_end=1680,
 )
 
 
@@ -522,6 +766,27 @@ _FINDPUBLISHEDOPTIONS = _descriptor.Descriptor(
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
       serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='regular', full_name='content.items.FindPublishedOptions.regular', index=2,
+      number=4, type=8, cpp_type=7, label=1,
+      has_default_value=False, default_value=False,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='hidden', full_name='content.items.FindPublishedOptions.hidden', index=3,
+      number=5, type=8, cpp_type=7, label=1,
+      has_default_value=False, default_value=False,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='templates', full_name='content.items.FindPublishedOptions.templates', index=4,
+      number=6, type=8, cpp_type=7, label=1,
+      has_default_value=False, default_value=False,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
   ],
   extensions=[
   ],
@@ -534,8 +799,8 @@ _FINDPUBLISHEDOPTIONS = _descriptor.Descriptor(
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=1258,
-  serialized_end=1337,
+  serialized_start=1683,
+  serialized_end=1814,
 )
 
 
@@ -566,8 +831,40 @@ _FINDARCHIVEDOPTIONS = _descriptor.Descriptor(
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=1339,
-  serialized_end=1398,
+  serialized_start=1816,
+  serialized_end=1875,
+)
+
+
+_LISTREVISIONSOPTIONS = _descriptor.Descriptor(
+  name='ListRevisionsOptions',
+  full_name='content.items.ListRevisionsOptions',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='options', full_name='content.items.ListRevisionsOptions.options', index=0,
+      number=2, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=1877,
+  serialized_end=1937,
 )
 
 
@@ -586,6 +883,13 @@ _CREATEREQUEST = _descriptor.Descriptor(
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
       serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='options', full_name='content.items.CreateRequest.options', index=1,
+      number=2, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
   ],
   extensions=[
   ],
@@ -598,8 +902,8 @@ _CREATEREQUEST = _descriptor.Descriptor(
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=1400,
-  serialized_end=1450,
+  serialized_start=1939,
+  serialized_end=2036,
 )
 
 
@@ -630,8 +934,8 @@ _CREATERESPONSE = _descriptor.Descriptor(
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=1452,
-  serialized_end=1506,
+  serialized_start=2038,
+  serialized_end=2092,
 )
 
 
@@ -662,8 +966,8 @@ _INTROSPECTREQUEST = _descriptor.Descriptor(
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=1508,
-  serialized_end=1562,
+  serialized_start=2094,
+  serialized_end=2148,
 )
 
 
@@ -708,8 +1012,8 @@ _INTROSPECTRESPONSE = _descriptor.Descriptor(
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=1565,
-  serialized_end=1704,
+  serialized_start=2151,
+  serialized_end=2290,
 )
 
 
@@ -761,8 +1065,8 @@ _GETREQUEST = _descriptor.Descriptor(
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=1706,
-  serialized_end=1792,
+  serialized_start=2292,
+  serialized_end=2378,
 )
 
 
@@ -793,8 +1097,8 @@ _GETRESPONSE = _descriptor.Descriptor(
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=1794,
-  serialized_end=1842,
+  serialized_start=2380,
+  serialized_end=2428,
 )
 
 
@@ -853,8 +1157,8 @@ _FINDREQUEST = _descriptor.Descriptor(
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=1845,
-  serialized_end=1999,
+  serialized_start=2431,
+  serialized_end=2585,
 )
 
 
@@ -892,8 +1196,8 @@ _FINDRESPONSE = _descriptor.Descriptor(
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=2001,
-  serialized_end=2066,
+  serialized_start=2587,
+  serialized_end=2652,
 )
 
 
@@ -912,6 +1216,13 @@ _UPDATEREQUEST = _descriptor.Descriptor(
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
       serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='options', full_name='content.items.UpdateRequest.options', index=1,
+      number=2, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
   ],
   extensions=[
   ],
@@ -924,8 +1235,8 @@ _UPDATEREQUEST = _descriptor.Descriptor(
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=2068,
-  serialized_end=2118,
+  serialized_start=2654,
+  serialized_end=2751,
 )
 
 
@@ -965,6 +1276,13 @@ _DELETEREQUEST = _descriptor.Descriptor(
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
       serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='options', full_name='content.items.DeleteRequest.options', index=4,
+      number=5, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
   ],
   extensions=[
   ],
@@ -977,8 +1295,61 @@ _DELETEREQUEST = _descriptor.Descriptor(
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=2120,
-  serialized_end=2209,
+  serialized_start=2754,
+  serialized_end=2890,
+)
+
+
+_UNDELETEREQUEST = _descriptor.Descriptor(
+  name='UndeleteRequest',
+  full_name='content.items.UndeleteRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='space_id', full_name='content.items.UndeleteRequest.space_id', index=0,
+      number=1, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='env_id', full_name='content.items.UndeleteRequest.env_id', index=1,
+      number=2, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='collection_id', full_name='content.items.UndeleteRequest.collection_id', index=2,
+      number=3, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='item_id', full_name='content.items.UndeleteRequest.item_id', index=3,
+      number=4, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=2892,
+  serialized_end=2983,
 )
 
 
@@ -997,6 +1368,13 @@ _PUBLISHREQUEST = _descriptor.Descriptor(
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
       serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='options', full_name='content.items.PublishRequest.options', index=1,
+      number=2, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
   ],
   extensions=[
   ],
@@ -1009,8 +1387,8 @@ _PUBLISHREQUEST = _descriptor.Descriptor(
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=2211,
-  serialized_end=2262,
+  serialized_start=2985,
+  serialized_end=3084,
 )
 
 
@@ -1041,8 +1419,8 @@ _UNPUBLISHREQUEST = _descriptor.Descriptor(
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=2264,
-  serialized_end=2317,
+  serialized_start=3086,
+  serialized_end=3139,
 )
 
 
@@ -1101,8 +1479,8 @@ _GETPUBLISHEDREQUEST = _descriptor.Descriptor(
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=2320,
-  serialized_end=2468,
+  serialized_start=3142,
+  serialized_end=3290,
 )
 
 
@@ -1133,8 +1511,8 @@ _GETPUBLISHEDRESPONSE = _descriptor.Descriptor(
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=2470,
-  serialized_end=2527,
+  serialized_start=3292,
+  serialized_end=3349,
 )
 
 
@@ -1193,8 +1571,8 @@ _FINDPUBLISHEDREQUEST = _descriptor.Descriptor(
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=2530,
-  serialized_end=2702,
+  serialized_start=3352,
+  serialized_end=3524,
 )
 
 
@@ -1232,8 +1610,8 @@ _FINDPUBLISHEDRESPONSE = _descriptor.Descriptor(
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=2704,
-  serialized_end=2778,
+  serialized_start=3526,
+  serialized_end=3600,
 )
 
 
@@ -1292,8 +1670,8 @@ _GETREVISIONREQUEST = _descriptor.Descriptor(
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=2780,
-  serialized_end=2895,
+  serialized_start=3602,
+  serialized_end=3717,
 )
 
 
@@ -1324,8 +1702,8 @@ _GETREVISIONRESPONSE = _descriptor.Descriptor(
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=2897,
-  serialized_end=2953,
+  serialized_start=3719,
+  serialized_end=3775,
 )
 
 
@@ -1365,6 +1743,13 @@ _LISTREVISIONSREQUEST = _descriptor.Descriptor(
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
       serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='options', full_name='content.items.ListRevisionsRequest.options', index=4,
+      number=10, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
   ],
   extensions=[
   ],
@@ -1377,8 +1762,8 @@ _LISTREVISIONSREQUEST = _descriptor.Descriptor(
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=2955,
-  serialized_end=3051,
+  serialized_start=3778,
+  serialized_end=3928,
 )
 
 
@@ -1409,8 +1794,8 @@ _LISTREVISIONSRESPONSE = _descriptor.Descriptor(
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=3053,
-  serialized_end=3112,
+  serialized_start=3930,
+  serialized_end=3989,
 )
 
 
@@ -1441,8 +1826,8 @@ _ARCHIVEREQUEST = _descriptor.Descriptor(
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=3114,
-  serialized_end=3165,
+  serialized_start=3991,
+  serialized_end=4042,
 )
 
 
@@ -1473,8 +1858,8 @@ _UNARCHIVEREQUEST = _descriptor.Descriptor(
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=3167,
-  serialized_end=3220,
+  serialized_start=4044,
+  serialized_end=4097,
 )
 
 
@@ -1533,8 +1918,8 @@ _FINDARCHIVEDREQUEST = _descriptor.Descriptor(
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=3223,
-  serialized_end=3393,
+  serialized_start=4100,
+  serialized_end=4270,
 )
 
 
@@ -1572,8 +1957,8 @@ _FINDARCHIVEDRESPONSE = _descriptor.Descriptor(
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=3395,
-  serialized_end=3468,
+  serialized_start=4272,
+  serialized_end=4345,
 )
 
 _DECODEERROR.fields_by_name['errors'].message_type = _ERROR
@@ -1589,12 +1974,15 @@ _ITEM.fields_by_name['data'].message_type = google_dot_protobuf_dot_struct__pb2.
 _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
+_ITEM.fields_by_name['permissions'].message_type = _PERMISSIONS
 _ITEM_STATE.containing_type = _ITEM
 _FILTER.fields_by_name['data'].message_type = perxis_dot_common_dot_common__pb2._FILTER
 _FINDOPTIONS.fields_by_name['options'].message_type = perxis_dot_common_dot_common__pb2._FINDOPTIONS
 _FINDPUBLISHEDOPTIONS.fields_by_name['options'].message_type = perxis_dot_common_dot_common__pb2._FINDOPTIONS
 _FINDARCHIVEDOPTIONS.fields_by_name['options'].message_type = perxis_dot_common_dot_common__pb2._FINDOPTIONS
+_LISTREVISIONSOPTIONS.fields_by_name['options'].message_type = perxis_dot_common_dot_common__pb2._FINDOPTIONS
 _CREATEREQUEST.fields_by_name['item'].message_type = _ITEM
+_CREATEREQUEST.fields_by_name['options'].message_type = _CREATEOPTIONS
 _CREATERESPONSE.fields_by_name['created'].message_type = _ITEM
 _INTROSPECTREQUEST.fields_by_name['item'].message_type = _ITEM
 _INTROSPECTRESPONSE.fields_by_name['item'].message_type = _ITEM
@@ -1604,7 +1992,10 @@ _FINDREQUEST.fields_by_name['filter'].message_type = _FILTER
 _FINDREQUEST.fields_by_name['options'].message_type = _FINDOPTIONS
 _FINDRESPONSE.fields_by_name['items'].message_type = _ITEM
 _UPDATEREQUEST.fields_by_name['item'].message_type = _ITEM
+_UPDATEREQUEST.fields_by_name['options'].message_type = _UPDATEOPTIONS
+_DELETEREQUEST.fields_by_name['options'].message_type = _DELETEOPTIONS
 _PUBLISHREQUEST.fields_by_name['item'].message_type = _ITEM
+_PUBLISHREQUEST.fields_by_name['options'].message_type = _PUBLISHOPTIONS
 _UNPUBLISHREQUEST.fields_by_name['item'].message_type = _ITEM
 _GETPUBLISHEDREQUEST.fields_by_name['options'].message_type = _GETPUBLISHEDOPTIONS
 _GETPUBLISHEDRESPONSE.fields_by_name['item'].message_type = _ITEM
@@ -1612,6 +2003,7 @@ _FINDPUBLISHEDREQUEST.fields_by_name['filter'].message_type = _FILTER
 _FINDPUBLISHEDREQUEST.fields_by_name['options'].message_type = _FINDPUBLISHEDOPTIONS
 _FINDPUBLISHEDRESPONSE.fields_by_name['items'].message_type = _ITEM
 _GETREVISIONRESPONSE.fields_by_name['item'].message_type = _ITEM
+_LISTREVISIONSREQUEST.fields_by_name['options'].message_type = _LISTREVISIONSOPTIONS
 _LISTREVISIONSRESPONSE.fields_by_name['items'].message_type = _ITEM
 _ARCHIVEREQUEST.fields_by_name['item'].message_type = _ITEM
 _UNARCHIVEREQUEST.fields_by_name['item'].message_type = _ITEM
@@ -1622,12 +2014,18 @@ DESCRIPTOR.message_types_by_name['Error'] = _ERROR
 DESCRIPTOR.message_types_by_name['DecodeError'] = _DECODEERROR
 DESCRIPTOR.message_types_by_name['ValidationError'] = _VALIDATIONERROR
 DESCRIPTOR.message_types_by_name['ModificationError'] = _MODIFICATIONERROR
+DESCRIPTOR.message_types_by_name['Permissions'] = _PERMISSIONS
 DESCRIPTOR.message_types_by_name['Item'] = _ITEM
 DESCRIPTOR.message_types_by_name['Filter'] = _FILTER
+DESCRIPTOR.message_types_by_name['CreateOptions'] = _CREATEOPTIONS
 DESCRIPTOR.message_types_by_name['FindOptions'] = _FINDOPTIONS
+DESCRIPTOR.message_types_by_name['UpdateOptions'] = _UPDATEOPTIONS
 DESCRIPTOR.message_types_by_name['GetPublishedOptions'] = _GETPUBLISHEDOPTIONS
+DESCRIPTOR.message_types_by_name['DeleteOptions'] = _DELETEOPTIONS
+DESCRIPTOR.message_types_by_name['PublishOptions'] = _PUBLISHOPTIONS
 DESCRIPTOR.message_types_by_name['FindPublishedOptions'] = _FINDPUBLISHEDOPTIONS
 DESCRIPTOR.message_types_by_name['FindArchivedOptions'] = _FINDARCHIVEDOPTIONS
+DESCRIPTOR.message_types_by_name['ListRevisionsOptions'] = _LISTREVISIONSOPTIONS
 DESCRIPTOR.message_types_by_name['CreateRequest'] = _CREATEREQUEST
 DESCRIPTOR.message_types_by_name['CreateResponse'] = _CREATERESPONSE
 DESCRIPTOR.message_types_by_name['IntrospectRequest'] = _INTROSPECTREQUEST
@@ -1638,6 +2036,7 @@ DESCRIPTOR.message_types_by_name['FindRequest'] = _FINDREQUEST
 DESCRIPTOR.message_types_by_name['FindResponse'] = _FINDRESPONSE
 DESCRIPTOR.message_types_by_name['UpdateRequest'] = _UPDATEREQUEST
 DESCRIPTOR.message_types_by_name['DeleteRequest'] = _DELETEREQUEST
+DESCRIPTOR.message_types_by_name['UndeleteRequest'] = _UNDELETEREQUEST
 DESCRIPTOR.message_types_by_name['PublishRequest'] = _PUBLISHREQUEST
 DESCRIPTOR.message_types_by_name['UnpublishRequest'] = _UNPUBLISHREQUEST
 DESCRIPTOR.message_types_by_name['GetPublishedRequest'] = _GETPUBLISHEDREQUEST
@@ -1682,6 +2081,13 @@ ModificationError = _reflection.GeneratedProtocolMessageType('ModificationError'
   })
 _sym_db.RegisterMessage(ModificationError)
 
+Permissions = _reflection.GeneratedProtocolMessageType('Permissions', (_message.Message,), {
+  'DESCRIPTOR' : _PERMISSIONS,
+  '__module__' : 'perxis.items.items_pb2'
+  # @@protoc_insertion_point(class_scope:content.items.Permissions)
+  })
+_sym_db.RegisterMessage(Permissions)
+
 Item = _reflection.GeneratedProtocolMessageType('Item', (_message.Message,), {
 
   'TranslationsEntry' : _reflection.GeneratedProtocolMessageType('TranslationsEntry', (_message.Message,), {
@@ -1704,6 +2110,13 @@ Filter = _reflection.GeneratedProtocolMessageType('Filter', (_message.Message,),
   })
 _sym_db.RegisterMessage(Filter)
 
+CreateOptions = _reflection.GeneratedProtocolMessageType('CreateOptions', (_message.Message,), {
+  'DESCRIPTOR' : _CREATEOPTIONS,
+  '__module__' : 'perxis.items.items_pb2'
+  # @@protoc_insertion_point(class_scope:content.items.CreateOptions)
+  })
+_sym_db.RegisterMessage(CreateOptions)
+
 FindOptions = _reflection.GeneratedProtocolMessageType('FindOptions', (_message.Message,), {
   'DESCRIPTOR' : _FINDOPTIONS,
   '__module__' : 'perxis.items.items_pb2'
@@ -1711,6 +2124,13 @@ FindOptions = _reflection.GeneratedProtocolMessageType('FindOptions', (_message.
   })
 _sym_db.RegisterMessage(FindOptions)
 
+UpdateOptions = _reflection.GeneratedProtocolMessageType('UpdateOptions', (_message.Message,), {
+  'DESCRIPTOR' : _UPDATEOPTIONS,
+  '__module__' : 'perxis.items.items_pb2'
+  # @@protoc_insertion_point(class_scope:content.items.UpdateOptions)
+  })
+_sym_db.RegisterMessage(UpdateOptions)
+
 GetPublishedOptions = _reflection.GeneratedProtocolMessageType('GetPublishedOptions', (_message.Message,), {
   'DESCRIPTOR' : _GETPUBLISHEDOPTIONS,
   '__module__' : 'perxis.items.items_pb2'
@@ -1718,6 +2138,20 @@ GetPublishedOptions = _reflection.GeneratedProtocolMessageType('GetPublishedOpti
   })
 _sym_db.RegisterMessage(GetPublishedOptions)
 
+DeleteOptions = _reflection.GeneratedProtocolMessageType('DeleteOptions', (_message.Message,), {
+  'DESCRIPTOR' : _DELETEOPTIONS,
+  '__module__' : 'perxis.items.items_pb2'
+  # @@protoc_insertion_point(class_scope:content.items.DeleteOptions)
+  })
+_sym_db.RegisterMessage(DeleteOptions)
+
+PublishOptions = _reflection.GeneratedProtocolMessageType('PublishOptions', (_message.Message,), {
+  'DESCRIPTOR' : _PUBLISHOPTIONS,
+  '__module__' : 'perxis.items.items_pb2'
+  # @@protoc_insertion_point(class_scope:content.items.PublishOptions)
+  })
+_sym_db.RegisterMessage(PublishOptions)
+
 FindPublishedOptions = _reflection.GeneratedProtocolMessageType('FindPublishedOptions', (_message.Message,), {
   'DESCRIPTOR' : _FINDPUBLISHEDOPTIONS,
   '__module__' : 'perxis.items.items_pb2'
@@ -1732,6 +2166,13 @@ FindArchivedOptions = _reflection.GeneratedProtocolMessageType('FindArchivedOpti
   })
 _sym_db.RegisterMessage(FindArchivedOptions)
 
+ListRevisionsOptions = _reflection.GeneratedProtocolMessageType('ListRevisionsOptions', (_message.Message,), {
+  'DESCRIPTOR' : _LISTREVISIONSOPTIONS,
+  '__module__' : 'perxis.items.items_pb2'
+  # @@protoc_insertion_point(class_scope:content.items.ListRevisionsOptions)
+  })
+_sym_db.RegisterMessage(ListRevisionsOptions)
+
 CreateRequest = _reflection.GeneratedProtocolMessageType('CreateRequest', (_message.Message,), {
   'DESCRIPTOR' : _CREATEREQUEST,
   '__module__' : 'perxis.items.items_pb2'
@@ -1802,6 +2243,13 @@ DeleteRequest = _reflection.GeneratedProtocolMessageType('DeleteRequest', (_mess
   })
 _sym_db.RegisterMessage(DeleteRequest)
 
+UndeleteRequest = _reflection.GeneratedProtocolMessageType('UndeleteRequest', (_message.Message,), {
+  'DESCRIPTOR' : _UNDELETEREQUEST,
+  '__module__' : 'perxis.items.items_pb2'
+  # @@protoc_insertion_point(class_scope:content.items.UndeleteRequest)
+  })
+_sym_db.RegisterMessage(UndeleteRequest)
+
 PublishRequest = _reflection.GeneratedProtocolMessageType('PublishRequest', (_message.Message,), {
   'DESCRIPTOR' : _PUBLISHREQUEST,
   '__module__' : 'perxis.items.items_pb2'
@@ -1911,8 +2359,8 @@ _ITEMS = _descriptor.ServiceDescriptor(
   index=0,
   serialized_options=None,
   create_key=_descriptor._internal_create_key,
-  serialized_start=3471,
-  serialized_end=4637,
+  serialized_start=4348,
+  serialized_end=5584,
   methods=[
   _descriptor.MethodDescriptor(
     name='Create',
@@ -1974,10 +2422,20 @@ _ITEMS = _descriptor.ServiceDescriptor(
     serialized_options=None,
     create_key=_descriptor._internal_create_key,
   ),
+  _descriptor.MethodDescriptor(
+    name='Undelete',
+    full_name='content.items.Items.Undelete',
+    index=6,
+    containing_service=None,
+    input_type=_UNDELETEREQUEST,
+    output_type=google_dot_protobuf_dot_empty__pb2._EMPTY,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
   _descriptor.MethodDescriptor(
     name='Publish',
     full_name='content.items.Items.Publish',
-    index=6,
+    index=7,
     containing_service=None,
     input_type=_PUBLISHREQUEST,
     output_type=google_dot_protobuf_dot_empty__pb2._EMPTY,
@@ -1987,7 +2445,7 @@ _ITEMS = _descriptor.ServiceDescriptor(
   _descriptor.MethodDescriptor(
     name='Unpublish',
     full_name='content.items.Items.Unpublish',
-    index=7,
+    index=8,
     containing_service=None,
     input_type=_UNPUBLISHREQUEST,
     output_type=google_dot_protobuf_dot_empty__pb2._EMPTY,
@@ -1997,7 +2455,7 @@ _ITEMS = _descriptor.ServiceDescriptor(
   _descriptor.MethodDescriptor(
     name='GetPublished',
     full_name='content.items.Items.GetPublished',
-    index=8,
+    index=9,
     containing_service=None,
     input_type=_GETPUBLISHEDREQUEST,
     output_type=_GETPUBLISHEDRESPONSE,
@@ -2007,7 +2465,7 @@ _ITEMS = _descriptor.ServiceDescriptor(
   _descriptor.MethodDescriptor(
     name='FindPublished',
     full_name='content.items.Items.FindPublished',
-    index=9,
+    index=10,
     containing_service=None,
     input_type=_FINDPUBLISHEDREQUEST,
     output_type=_FINDPUBLISHEDRESPONSE,
@@ -2017,7 +2475,7 @@ _ITEMS = _descriptor.ServiceDescriptor(
   _descriptor.MethodDescriptor(
     name='GetRevision',
     full_name='content.items.Items.GetRevision',
-    index=10,
+    index=11,
     containing_service=None,
     input_type=_GETREVISIONREQUEST,
     output_type=_GETREVISIONRESPONSE,
@@ -2027,7 +2485,7 @@ _ITEMS = _descriptor.ServiceDescriptor(
   _descriptor.MethodDescriptor(
     name='ListRevisions',
     full_name='content.items.Items.ListRevisions',
-    index=11,
+    index=12,
     containing_service=None,
     input_type=_LISTREVISIONSREQUEST,
     output_type=_LISTREVISIONSRESPONSE,
@@ -2037,7 +2495,7 @@ _ITEMS = _descriptor.ServiceDescriptor(
   _descriptor.MethodDescriptor(
     name='Archive',
     full_name='content.items.Items.Archive',
-    index=12,
+    index=13,
     containing_service=None,
     input_type=_ARCHIVEREQUEST,
     output_type=google_dot_protobuf_dot_empty__pb2._EMPTY,
@@ -2047,7 +2505,7 @@ _ITEMS = _descriptor.ServiceDescriptor(
   _descriptor.MethodDescriptor(
     name='FindArchived',
     full_name='content.items.Items.FindArchived',
-    index=13,
+    index=14,
     containing_service=None,
     input_type=_FINDARCHIVEDREQUEST,
     output_type=_FINDARCHIVEDRESPONSE,
@@ -2057,7 +2515,7 @@ _ITEMS = _descriptor.ServiceDescriptor(
   _descriptor.MethodDescriptor(
     name='Unarchive',
     full_name='content.items.Items.Unarchive',
-    index=14,
+    index=15,
     containing_service=None,
     input_type=_UNARCHIVEREQUEST,
     output_type=google_dot_protobuf_dot_empty__pb2._EMPTY,
diff --git a/perxis/items/items_pb2_grpc.py b/perxis/items/items_pb2_grpc.py
index c850cca1189618ab05482e41d2e516a6bd5f9af9..d3a11217e23eab0edd88bebaa871948681f76b3b 100644
--- a/perxis/items/items_pb2_grpc.py
+++ b/perxis/items/items_pb2_grpc.py
@@ -47,6 +47,11 @@ class ItemsStub(object):
                 request_serializer=perxis_dot_items_dot_items__pb2.DeleteRequest.SerializeToString,
                 response_deserializer=google_dot_protobuf_dot_empty__pb2.Empty.FromString,
                 )
+        self.Undelete = channel.unary_unary(
+                '/content.items.Items/Undelete',
+                request_serializer=perxis_dot_items_dot_items__pb2.UndeleteRequest.SerializeToString,
+                response_deserializer=google_dot_protobuf_dot_empty__pb2.Empty.FromString,
+                )
         self.Publish = channel.unary_unary(
                 '/content.items.Items/Publish',
                 request_serializer=perxis_dot_items_dot_items__pb2.PublishRequest.SerializeToString,
@@ -143,6 +148,12 @@ class ItemsServicer(object):
         context.set_details('Method not implemented!')
         raise NotImplementedError('Method not implemented!')
 
+    def Undelete(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
     def Publish(self, request, context):
         """Missing associated documentation comment in .proto file."""
         context.set_code(grpc.StatusCode.UNIMPLEMENTED)
@@ -230,6 +241,11 @@ def add_ItemsServicer_to_server(servicer, server):
                     request_deserializer=perxis_dot_items_dot_items__pb2.DeleteRequest.FromString,
                     response_serializer=google_dot_protobuf_dot_empty__pb2.Empty.SerializeToString,
             ),
+            'Undelete': grpc.unary_unary_rpc_method_handler(
+                    servicer.Undelete,
+                    request_deserializer=perxis_dot_items_dot_items__pb2.UndeleteRequest.FromString,
+                    response_serializer=google_dot_protobuf_dot_empty__pb2.Empty.SerializeToString,
+            ),
             'Publish': grpc.unary_unary_rpc_method_handler(
                     servicer.Publish,
                     request_deserializer=perxis_dot_items_dot_items__pb2.PublishRequest.FromString,
@@ -389,6 +405,23 @@ class Items(object):
             options, channel_credentials,
             insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
 
+    @staticmethod
+    def Undelete(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/content.items.Items/Undelete',
+            perxis_dot_items_dot_items__pb2.UndeleteRequest.SerializeToString,
+            google_dot_protobuf_dot_empty__pb2.Empty.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
     @staticmethod
     def Publish(request,
             target,
diff --git a/proto/perxis/common/common.proto b/proto/perxis/common/common.proto
index e3986b6ace6b600fad521400db55facdb4b16d94..0c179c28f63b07c19d7af19b1fe988d0017c8af0 100644
--- a/proto/perxis/common/common.proto
+++ b/proto/perxis/common/common.proto
@@ -54,6 +54,8 @@ message FindOptions {
   repeated string sort = 1;
   int32 page_num = 2;
   int32 page_size = 3;
+  repeated string fields = 4;
+  bool exclude_fields = 5;
 }
 
 
diff --git a/proto/perxis/environments/environments.proto b/proto/perxis/environments/environments.proto
index 20ab85c2ed862bbba9f72c2cd8cc78d0370f3b39..40077f26099124795044b00c830d5a0f73243d16 100644
--- a/proto/perxis/environments/environments.proto
+++ b/proto/perxis/environments/environments.proto
@@ -82,4 +82,4 @@ service Environments {
   rpc SetAlias(SetAliasRequest) returns(google.protobuf.Empty) {}
   rpc RemoveAlias(RemoveAliasRequest) returns(google.protobuf.Empty) {}
   rpc Delete(DeleteRequest) returns(google.protobuf.Empty) {}
-}
\ No newline at end of file
+}
diff --git a/proto/perxis/extensions/extension.proto b/proto/perxis/extensions/extension.proto
index 5c2a3290dbf53715d761a0732a0d8645821eb7e3..eeea2937a03e06601d05f7dad476ec3af03078df 100644
--- a/proto/perxis/extensions/extension.proto
+++ b/proto/perxis/extensions/extension.proto
@@ -14,6 +14,8 @@ option go_package = "git.perx.ru/perxis/perxis/proto/extensions;extensions";
 
 package extensions;
 
+import "perxis/references/references.proto";
+
 // Extension - API расширения
 service Extension {
 
@@ -114,6 +116,7 @@ message CheckResponse {
   repeated ExtensionRequestResult results = 10000; // Список состояний расширений
 }
 
+// ActionRequest - запрос на выполнение действия к расширению (или менеджеру расширений)
 message ActionRequest {
   string extension = 1000;
   string action = 10100;
@@ -122,7 +125,19 @@ message ActionRequest {
   string collection_id = 10520;
   string item_id = 10530;
   repeated string item_ids = 10540;
+
+  // Поля к которым применимо действие. В случае если действие выполняется из списка записей, содержит перечень
+  // полей которые пользователь выбрал для отображения в интерфейсе.
+  repeated string fields = 10550;
+
   map<string,string> metadata = 11000;
+
+  // Ссылки на записи используемые для выполнения действия (назначение ссылок зависит от действия и расширения)
+  repeated content.references.Reference refs = 11010;
+
+  // Ссылка на документ с параметрами выполнения Action.
+  // Чтобы при выполнении действия открывалась форма параметров, необходимо указать `Action.params_collection`
+  content.references.Reference params = 11020;
 }
 
 message ActionResponse {
@@ -138,7 +153,7 @@ message ActionResponse {
   string error = 10200; // Сообщение в случае ошибки
   repeated Action next = 10300; // Следующие возможные действия. Интерфейс отображает как варианты дальнейших действий пользователя
   map<string,string>metadata = 10400; // Метаданные запроса
-  //  string status_id = 10500; // ID для проверки статуса выполняющихся запросов;
+  repeated content.references.Reference refs = 10320; // Ссылки на записи (назначение ссылок зависит от действия и расширения)
 }
 
 
@@ -164,17 +179,33 @@ message Action {
     DEFAULT = 0; // Действие не отображается в интерфейсе и могут используется для выполнения дополнительных запросов (см. `ActionResponse.next`) или напрямую из сторонних приложений.
     SPACE = 1; // Действие связано с пространством (требуется передача space_id). Отображается в меню "Действия".
     ENVIRONMENT = 2; // Действие связано с окружением (требуется передача space_id, env_id). Отображается в меню "Действия".
-    COLLECTION = 3; // Действие связано с коллекцией (требуется передача space_id, env_id, collection_id). Отображается на экране списка записей (TODO: внешний вид отображения)
-    ITEM = 4; // Действие связано с записью (требуется передача space_id, env_id, collection_id, item_id). Отображается на экране редактирования записи. (TODO: внешний вид отображения)
-    ITEMS = 5; // Действие связано с несколькими записями (требуется передача space_id, env_id, collection_id, item_ids). Отображается на экране списка записей, (TODO: внешний вид отображения)
+    COLLECTION = 3; // Действие связано с коллекцией (требуется передача space_id, env_id, collection_id). Отображается на экране списка записей.
+    ITEM = 4; // Действие связано с записью (требуется передача space_id, env_id, collection_id, item_id). Отображается на экране редактирования записи.
+    ITEMS = 5; // Действие связано с несколькими записями (требуется передача space_id, env_id, collection_id, item_ids). Отображается на экране списка записей.
     REVISION = 6; // Действие связано с ревизией записи (требуется передача space_id, env_id, collection_id, item_id, rev_id). На данный момент не используется.
+    CREATE = 7; // Действие создание записи (требуется передача space_id, env_id, collection_id).
   }
 
   string extension = 10000; // Расширение
   string action = 10100; // Идентификатор действия
-  string name = 10200; // Название действия для отображения в интерфейсе (пункт меню, кнопка)
+  string name = 10200; // Название действия для отображения в интерфейсе (пункт меню, кнопка).
   string description = 10210; // Описание действия для отображения в интерфейсе
+  string icon = 10220; // Название иконки для отображения действия в интерфейсе
+  content.references.Reference image = 10230; // Изображение для отображения в действия в интерфейсе
+  repeated string groups = 10240; // Группы отображения действия в интерфейсе
   Kind kind = 10300; // Указывает на что направлено действие
+  repeated string classes = 10310; // Классы данных к которым применимо действие (название коллекций или специальных групп в рамках которых данное действие применимо)
+  // Для `CREATE` действуют следующие правила:
+  // - Для создание записей в коллекции применимы действия которые содержат в classes название коллекции
+  // - Для создания записей в виджетах которые допускают создание записей (Block/BlockList) применимы действия которые содержат:
+  //   - в classes хотя бы одно значение из classes виджета
+  //   - если у виджета не указан classes, тогда названия коллекций которые могут быть использованы для создания элементов в поле (allowed_collections)
+  repeated content.references.Reference refs = 10320; // Ссылки на записи используемые для выполнения действия (назначение ссылок зависит от действия и расширения)
+
+  // Коллекция для сохранения параметрами действия. Если параметр указан, то при выполнении действия будет открываться
+  // форма создания записи в указанной коллекции
+  string params_collection = 10330;
+
   ActionRequest request = 10400; // Параметры запроса (используется в случае `ActionResponse.next`)
   bool navigation_action = 10500; // Флаг указывающий что действие переносить пользователя в другую часть интерфейса, а не отправляет запрос на сервер
 
@@ -190,4 +221,4 @@ message Action {
   // - :itemId
   //
   string navigation_route = 10510;
-}
\ No newline at end of file
+}
diff --git a/proto/perxis/extensions/manager.proto b/proto/perxis/extensions/manager.proto
index e1a260f18fb2e916891f11ace86f36a36d609fe1..df4e52939166759aa244f65082f0c5473cc3dc67 100644
--- a/proto/perxis/extensions/manager.proto
+++ b/proto/perxis/extensions/manager.proto
@@ -35,7 +35,7 @@ package extensions;
 service ExtensionManager {
   // ##  Регистрация расширений
   //
-  // Регистрация происходить через сервис менеджера расширений (Extension Manager). В процессе регистрации сервис сообщает
+  // Регистрация\Дерегистрация происходить через сервис менеджера расширений (Extension Manager). В процессе регистрации сервис сообщает
   // о поддерживаемых сервисом действиях (Actions) и версии сервиса и зависимостях:
   // 1. Действия (Actions) - перечень действия которые обрабатываются сервисом. Включает в себя как системные действия,
   // так и пользовательские, которые могут быть использованы в интерфейсе;
@@ -47,6 +47,8 @@ service ExtensionManager {
   // все расширения от которых он зависит, будут так же установлены.
   rpc RegisterExtensions(RegisterExtensionsRequest) returns (RegisterExtensionsResponse) {}
 
+  rpc UnregisterExtensions(UnregisterExtensionsRequest) returns (UnregisterExtensionsResponse) {}
+
   // Получить список зарегистрированных сервисов
   rpc ListExtensions(ListExtensionsRequest) returns (ListExtensionsResponse) {} // Получить список сервисов
 }
@@ -70,6 +72,12 @@ message RegisterExtensionsRequest {
 
 message RegisterExtensionsResponse {}
 
+message UnregisterExtensionsRequest {
+  repeated ExtensionDescriptor extensions = 1;
+}
+
+message UnregisterExtensionsResponse {}
+
 message ListExtensionsFilter {
   repeated string extension = 1; // Список имен сервисов для получения результатов. Список может содержать регулярные выражения.
 //  repeated string action = 2; // Список действий обрабатываемых сервисами. Список может содержать регулярные выражения.
@@ -101,4 +109,4 @@ message SpaceExtensions {
   State state = 10300;
   string status_error = 10400; // Сообщение к ошибке
   string status_msg = 10500; // Сообщение к статусу
-}
\ No newline at end of file
+}
diff --git a/proto/perxis/items/items.proto b/proto/perxis/items/items.proto
index 8773d9f9fdc3bffe4e3aaa0bc36a707be1d0b959..78aaae2ffe0ecab3b8e96c9da679c76d63fa2a36 100644
--- a/proto/perxis/items/items.proto
+++ b/proto/perxis/items/items.proto
@@ -35,6 +35,14 @@ message ModificationError {
   repeated Error errors = 2;
 }
 
+message Permissions {
+  bool edit = 1;
+  bool archive = 2;
+  bool publish = 3;
+  bool soft_delete = 4;
+  bool hard_delete = 5;
+}
+
 /**
  * Пользовательская запись
  */
@@ -63,6 +71,10 @@ message Item {
   google.protobuf.Timestamp archived_at = 16;
   string archived_by = 17;
   string locale = 18;
+  bool deleted = 19;
+  bool hidden = 20;
+  bool template = 21;
+  Permissions permissions = 22;
 }
 
 message Filter {
@@ -71,25 +83,53 @@ message Filter {
   repeated string q = 3; // Список выражений для фильтрации
 }
 
+message CreateOptions {
+  bool update_attrs = 1;
+}
+
 message FindOptions {
   common.FindOptions options = 2;
+  bool deleted = 3;
+  bool regular = 4;
+  bool hidden = 5;
+  bool templates = 6;
+}
+
+message UpdateOptions {
+  bool update_attrs = 1;
 }
 
 message GetPublishedOptions {
   string locale_id = 1;
 }
 
+message DeleteOptions {
+  bool erase = 1;
+}
+
+message PublishOptions {
+  bool update_attrs = 1;
+}
+
 message FindPublishedOptions {
   common.FindOptions options = 2;
   string locale_id = 3;
+  bool regular = 4;
+  bool hidden = 5;
+  bool templates = 6;
 }
 
 message FindArchivedOptions {
   common.FindOptions options = 2;
 }
 
+message ListRevisionsOptions {
+  common.FindOptions options = 2;
+}
+
 message CreateRequest {
   Item item = 1;
+  CreateOptions options = 2;
 }
 message CreateResponse {
   Item created = 1;
@@ -128,6 +168,7 @@ message FindResponse{
 
 message UpdateRequest {
   Item item = 1;
+  UpdateOptions options = 2;
 }
 
 message DeleteRequest {
@@ -135,10 +176,19 @@ message DeleteRequest {
   string env_id = 2;
   string collection_id = 3;
   string item_id = 4;
+  DeleteOptions options = 5;
+}
+
+message UndeleteRequest {
+  string space_id = 1;
+  string env_id = 2;
+  string collection_id = 3;
+  string item_id = 4;
 }
 
 message PublishRequest {
   Item item = 1;
+  PublishOptions options = 2;
 }
 
 message UnpublishRequest {
@@ -184,6 +234,7 @@ message ListRevisionsRequest {
   string env_id = 2;
   string collection_id = 3;
   string item_id = 4;
+  ListRevisionsOptions options = 10;
 }
 message ListRevisionsResponse {
   repeated Item items = 1;
@@ -237,6 +288,7 @@ service Items {
   rpc Find(FindRequest) returns(FindResponse) {}
   rpc Update(UpdateRequest) returns(google.protobuf.Empty) {}
   rpc Delete(DeleteRequest) returns(google.protobuf.Empty) {}
+  rpc Undelete(UndeleteRequest) returns(google.protobuf.Empty) {}
 
   rpc Publish(PublishRequest) returns(google.protobuf.Empty) {}
   rpc Unpublish(UnpublishRequest) returns(google.protobuf.Empty) {}
diff --git a/proto/perxis/locales/locales.proto b/proto/perxis/locales/locales.proto
index 72fdb8ac5083d99701cc74a15acbc60bcbc86eb9..9d95ab2accd7b3bbdabb6355b7e9a2531042d6eb 100644
--- a/proto/perxis/locales/locales.proto
+++ b/proto/perxis/locales/locales.proto
@@ -36,4 +36,4 @@ service Locales {
   rpc Create(CreateRequest) returns(CreateResponse) {}
   rpc List(ListRequest) returns(ListResponse) {}
   rpc Delete(DeleteRequest) returns(google.protobuf.Empty) {}
-}
\ No newline at end of file
+}
diff --git a/proto/perxis/roles/roles.proto b/proto/perxis/roles/roles.proto
index 46593bf53def1412711b18b7fd4fb6b239e91e1a..2afd57c431e02a8cba89ae5421f5af892e5bbc83 100644
--- a/proto/perxis/roles/roles.proto
+++ b/proto/perxis/roles/roles.proto
@@ -85,4 +85,4 @@ service Roles  {
   // Delete - удаляет указанную роль из пространстве
   rpc Delete(DeleteRequest) returns(google.protobuf.Empty) {}
 
-}
\ No newline at end of file
+}
diff --git a/proto/perxis/versions/account/versions.proto b/proto/perxis/versions/account/versions.proto
index d428b0626ab1a67ab21bb5e3911659d3ce3aa794..1c27f8f3dfdf52a6052cfd4bc73ff5b5ff333a84 100644
--- a/proto/perxis/versions/account/versions.proto
+++ b/proto/perxis/versions/account/versions.proto
@@ -13,4 +13,4 @@ message GetResponse {
 
 service Versions {
   rpc Get(google.protobuf.Empty) returns(GetResponse) {}
-}
\ No newline at end of file
+}
diff --git a/proto/perxis/versions/content/versions.proto b/proto/perxis/versions/content/versions.proto
index cfc33830f2c14714ae20a33362908f85d8b499e2..582bd7ac04158e04b1c15209bafac9dfe1129382 100644
--- a/proto/perxis/versions/content/versions.proto
+++ b/proto/perxis/versions/content/versions.proto
@@ -13,4 +13,4 @@ message GetResponse {
 
 service Versions {
   rpc Get(google.protobuf.Empty) returns(GetResponse) {}
-}
\ No newline at end of file
+}
diff --git a/requirements.txt b/requirements.txt
index bc3cc95a61e18aae442e66c1beec4f7733196eb8..04f0ac14bb782d8f94e969b7529073e734ab6a21 100644
--- a/requirements.txt
+++ b/requirements.txt
@@ -1,12 +1,12 @@
-certifi==2021.10.8
-chardet==4.0.0
+certifi==2022.9.24
+chardet==5.0.0
 charset-normalizer==2.0.12
-grpcio==1.43.0
-idna==3.3
-oauthlib==3.2.0
+grpcio==1.50.0
+idna==3.4
+oauthlib==3.2.2
 protobuf==3.19.4
-PyJWT==2.3.0
-requests==2.27.1
+PyJWT==2.6.0
+requests==2.28.1
 requests-oauthlib==1.3.1
 six==1.16.0
-urllib3==1.26.8
+urllib3==1.26.12