diff --git a/Makefile b/Makefile
index 21ed3274748c372ee028357b40c2a4faa24b0ad4..97eb43b2fe74b67270dd6b1bc1b577427c979517 100644
--- a/Makefile
+++ b/Makefile
@@ -1,5 +1,5 @@
 PROTODIR=perxis-proto/proto
-DSTDIR=.
+DSTDIR=./proto
 ALLPROTO?=$(shell find $(PROTODIR) -name '*.proto' )
 # Убираем status.proto нужен только для front
 PROTOFILES=	$(filter-out $(PROTODIR)/status/status.proto, $(ALLPROTO))
@@ -7,14 +7,14 @@ PROTOGOFILES=$(PROTOFILES:.proto=.pb.go)
 PROTOGOGRPCFILES=$(PROTOFILES:.proto=_grpc.pb.go)
 
 # Генерация grpc-клиентов для go
-proto: protoc-check protoc-gen-go-check $(PROTOGOFILES) $(PROTOGOGRPCFILES)
+proto: protoc-check protoc-gen-go-check $(PROTOGOFILES)
 	@echo "Generated all protobuf Go files"
 
-%.pb.go %_grpc.pb.go: %.proto
+%.pb.go: %.proto
 	@protoc -I=$(PROTODIR) --experimental_allow_proto3_optional --go_out=$(DSTDIR) --go-grpc_out=$(DSTDIR) --go_opt=paths=source_relative --go-grpc_opt=paths=source_relative "$<"
 
 proto-clean:
-	@rm -f $(PROTOGOFILES) -f $(PROTOGOGRPCFILES)
+	@rm -r $(DSTDIR)/*
 
 # Helpers
 #
diff --git a/clients/clients.pb.go b/proto/clients/clients.pb.go
similarity index 99%
rename from clients/clients.pb.go
rename to proto/clients/clients.pb.go
index afcef70d74306e8b68136247424994f58272a77e..b9b1cea0655d744c267d3aeeb2b816a4c6451d12 100644
--- a/clients/clients.pb.go
+++ b/proto/clients/clients.pb.go
@@ -1,7 +1,7 @@
 // Code generated by protoc-gen-go. DO NOT EDIT.
 // versions:
-// 	protoc-gen-go v1.27.1
-// 	protoc        v3.17.3
+// 	protoc-gen-go v1.29.0
+// 	protoc        v3.21.12
 // source: clients/clients.proto
 
 package clients
@@ -1005,10 +1005,11 @@ var file_clients_clients_proto_rawDesc = []byte{
 	0x74, 0x65, 0x6e, 0x74, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x45, 0x6e, 0x61,
 	0x62, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f,
 	0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70,
-	0x74, 0x79, 0x22, 0x00, 0x42, 0x2e, 0x5a, 0x2c, 0x67, 0x69, 0x74, 0x2e, 0x70, 0x65, 0x72, 0x78,
+	0x74, 0x79, 0x22, 0x00, 0x42, 0x34, 0x5a, 0x32, 0x67, 0x69, 0x74, 0x2e, 0x70, 0x65, 0x72, 0x78,
 	0x2e, 0x72, 0x75, 0x2f, 0x70, 0x65, 0x72, 0x78, 0x69, 0x73, 0x2f, 0x70, 0x65, 0x72, 0x78, 0x69,
-	0x73, 0x2d, 0x67, 0x6f, 0x2f, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x73, 0x3b, 0x63, 0x6c, 0x69,
-	0x65, 0x6e, 0x74, 0x73, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
+	0x73, 0x2d, 0x67, 0x6f, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x63, 0x6c, 0x69, 0x65, 0x6e,
+	0x74, 0x73, 0x3b, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x73, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74,
+	0x6f, 0x33,
 }
 
 var (
diff --git a/clients/clients_grpc.pb.go b/proto/clients/clients_grpc.pb.go
similarity index 89%
rename from clients/clients_grpc.pb.go
rename to proto/clients/clients_grpc.pb.go
index b98677c8720dc884567fc33bad6ea1b7b59523a0..f442fc157b74957f29c2559b616154fb7167abe4 100644
--- a/clients/clients_grpc.pb.go
+++ b/proto/clients/clients_grpc.pb.go
@@ -1,4 +1,8 @@
 // Code generated by protoc-gen-go-grpc. DO NOT EDIT.
+// versions:
+// - protoc-gen-go-grpc v1.3.0
+// - protoc             v3.21.12
+// source: clients/clients.proto
 
 package clients
 
@@ -15,6 +19,16 @@ import (
 // Requires gRPC-Go v1.32.0 or later.
 const _ = grpc.SupportPackageIsVersion7
 
+const (
+	Clients_Create_FullMethodName = "/content.clients.Clients/Create"
+	Clients_Get_FullMethodName    = "/content.clients.Clients/Get"
+	Clients_GetBy_FullMethodName  = "/content.clients.Clients/GetBy"
+	Clients_Update_FullMethodName = "/content.clients.Clients/Update"
+	Clients_List_FullMethodName   = "/content.clients.Clients/List"
+	Clients_Delete_FullMethodName = "/content.clients.Clients/Delete"
+	Clients_Enable_FullMethodName = "/content.clients.Clients/Enable"
+)
+
 // ClientsClient is the client API for Clients service.
 //
 // For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream.
@@ -45,7 +59,7 @@ func NewClientsClient(cc grpc.ClientConnInterface) ClientsClient {
 
 func (c *clientsClient) Create(ctx context.Context, in *CreateRequest, opts ...grpc.CallOption) (*CreateResponse, error) {
 	out := new(CreateResponse)
-	err := c.cc.Invoke(ctx, "/content.clients.Clients/Create", in, out, opts...)
+	err := c.cc.Invoke(ctx, Clients_Create_FullMethodName, in, out, opts...)
 	if err != nil {
 		return nil, err
 	}
@@ -54,7 +68,7 @@ func (c *clientsClient) Create(ctx context.Context, in *CreateRequest, opts ...g
 
 func (c *clientsClient) Get(ctx context.Context, in *GetRequest, opts ...grpc.CallOption) (*GetResponse, error) {
 	out := new(GetResponse)
-	err := c.cc.Invoke(ctx, "/content.clients.Clients/Get", in, out, opts...)
+	err := c.cc.Invoke(ctx, Clients_Get_FullMethodName, in, out, opts...)
 	if err != nil {
 		return nil, err
 	}
@@ -63,7 +77,7 @@ func (c *clientsClient) Get(ctx context.Context, in *GetRequest, opts ...grpc.Ca
 
 func (c *clientsClient) GetBy(ctx context.Context, in *GetByRequest, opts ...grpc.CallOption) (*GetByResponse, error) {
 	out := new(GetByResponse)
-	err := c.cc.Invoke(ctx, "/content.clients.Clients/GetBy", in, out, opts...)
+	err := c.cc.Invoke(ctx, Clients_GetBy_FullMethodName, in, out, opts...)
 	if err != nil {
 		return nil, err
 	}
@@ -72,7 +86,7 @@ func (c *clientsClient) GetBy(ctx context.Context, in *GetByRequest, opts ...grp
 
 func (c *clientsClient) Update(ctx context.Context, in *UpdateRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) {
 	out := new(emptypb.Empty)
-	err := c.cc.Invoke(ctx, "/content.clients.Clients/Update", in, out, opts...)
+	err := c.cc.Invoke(ctx, Clients_Update_FullMethodName, in, out, opts...)
 	if err != nil {
 		return nil, err
 	}
@@ -81,7 +95,7 @@ func (c *clientsClient) Update(ctx context.Context, in *UpdateRequest, opts ...g
 
 func (c *clientsClient) List(ctx context.Context, in *ListRequest, opts ...grpc.CallOption) (*ListResponse, error) {
 	out := new(ListResponse)
-	err := c.cc.Invoke(ctx, "/content.clients.Clients/List", in, out, opts...)
+	err := c.cc.Invoke(ctx, Clients_List_FullMethodName, in, out, opts...)
 	if err != nil {
 		return nil, err
 	}
@@ -90,7 +104,7 @@ func (c *clientsClient) List(ctx context.Context, in *ListRequest, opts ...grpc.
 
 func (c *clientsClient) Delete(ctx context.Context, in *DeleteRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) {
 	out := new(emptypb.Empty)
-	err := c.cc.Invoke(ctx, "/content.clients.Clients/Delete", in, out, opts...)
+	err := c.cc.Invoke(ctx, Clients_Delete_FullMethodName, in, out, opts...)
 	if err != nil {
 		return nil, err
 	}
@@ -99,7 +113,7 @@ func (c *clientsClient) Delete(ctx context.Context, in *DeleteRequest, opts ...g
 
 func (c *clientsClient) Enable(ctx context.Context, in *EnableRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) {
 	out := new(emptypb.Empty)
-	err := c.cc.Invoke(ctx, "/content.clients.Clients/Enable", in, out, opts...)
+	err := c.cc.Invoke(ctx, Clients_Enable_FullMethodName, in, out, opts...)
 	if err != nil {
 		return nil, err
 	}
@@ -175,7 +189,7 @@ func _Clients_Create_Handler(srv interface{}, ctx context.Context, dec func(inte
 	}
 	info := &grpc.UnaryServerInfo{
 		Server:     srv,
-		FullMethod: "/content.clients.Clients/Create",
+		FullMethod: Clients_Create_FullMethodName,
 	}
 	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
 		return srv.(ClientsServer).Create(ctx, req.(*CreateRequest))
@@ -193,7 +207,7 @@ func _Clients_Get_Handler(srv interface{}, ctx context.Context, dec func(interfa
 	}
 	info := &grpc.UnaryServerInfo{
 		Server:     srv,
-		FullMethod: "/content.clients.Clients/Get",
+		FullMethod: Clients_Get_FullMethodName,
 	}
 	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
 		return srv.(ClientsServer).Get(ctx, req.(*GetRequest))
@@ -211,7 +225,7 @@ func _Clients_GetBy_Handler(srv interface{}, ctx context.Context, dec func(inter
 	}
 	info := &grpc.UnaryServerInfo{
 		Server:     srv,
-		FullMethod: "/content.clients.Clients/GetBy",
+		FullMethod: Clients_GetBy_FullMethodName,
 	}
 	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
 		return srv.(ClientsServer).GetBy(ctx, req.(*GetByRequest))
@@ -229,7 +243,7 @@ func _Clients_Update_Handler(srv interface{}, ctx context.Context, dec func(inte
 	}
 	info := &grpc.UnaryServerInfo{
 		Server:     srv,
-		FullMethod: "/content.clients.Clients/Update",
+		FullMethod: Clients_Update_FullMethodName,
 	}
 	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
 		return srv.(ClientsServer).Update(ctx, req.(*UpdateRequest))
@@ -247,7 +261,7 @@ func _Clients_List_Handler(srv interface{}, ctx context.Context, dec func(interf
 	}
 	info := &grpc.UnaryServerInfo{
 		Server:     srv,
-		FullMethod: "/content.clients.Clients/List",
+		FullMethod: Clients_List_FullMethodName,
 	}
 	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
 		return srv.(ClientsServer).List(ctx, req.(*ListRequest))
@@ -265,7 +279,7 @@ func _Clients_Delete_Handler(srv interface{}, ctx context.Context, dec func(inte
 	}
 	info := &grpc.UnaryServerInfo{
 		Server:     srv,
-		FullMethod: "/content.clients.Clients/Delete",
+		FullMethod: Clients_Delete_FullMethodName,
 	}
 	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
 		return srv.(ClientsServer).Delete(ctx, req.(*DeleteRequest))
@@ -283,7 +297,7 @@ func _Clients_Enable_Handler(srv interface{}, ctx context.Context, dec func(inte
 	}
 	info := &grpc.UnaryServerInfo{
 		Server:     srv,
-		FullMethod: "/content.clients.Clients/Enable",
+		FullMethod: Clients_Enable_FullMethodName,
 	}
 	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
 		return srv.(ClientsServer).Enable(ctx, req.(*EnableRequest))
diff --git a/collaborators/collaborators.pb.go b/proto/collaborators/collaborators.pb.go
similarity index 98%
rename from collaborators/collaborators.pb.go
rename to proto/collaborators/collaborators.pb.go
index 6a151faf1d28589af7e8fc6b1d6141a1d9f021fb..0e35a00e51a759c48db1aae8e683f04083e7c672 100644
--- a/collaborators/collaborators.pb.go
+++ b/proto/collaborators/collaborators.pb.go
@@ -1,13 +1,13 @@
 // Code generated by protoc-gen-go. DO NOT EDIT.
 // versions:
-// 	protoc-gen-go v1.27.1
-// 	protoc        v3.17.3
+// 	protoc-gen-go v1.29.0
+// 	protoc        v3.21.12
 // source: collaborators/collaborators.proto
 
 package collaborators
 
 import (
-	common "git.perx.ru/perxis/perxis-go/common"
+	common "git.perx.ru/perxis/perxis-go/proto/common"
 	protoreflect "google.golang.org/protobuf/reflect/protoreflect"
 	protoimpl "google.golang.org/protobuf/runtime/protoimpl"
 	emptypb "google.golang.org/protobuf/types/known/emptypb"
@@ -501,11 +501,11 @@ var file_collaborators_collaborators_proto_rawDesc = []byte{
 	0x75, 0x65, 0x73, 0x74, 0x1a, 0x29, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x63,
 	0x6f, 0x6c, 0x6c, 0x61, 0x62, 0x6f, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x73, 0x2e, 0x4c, 0x69, 0x73,
 	0x74, 0x53, 0x70, 0x61, 0x63, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22,
-	0x00, 0x42, 0x3a, 0x5a, 0x38, 0x67, 0x69, 0x74, 0x2e, 0x70, 0x65, 0x72, 0x78, 0x2e, 0x72, 0x75,
+	0x00, 0x42, 0x40, 0x5a, 0x3e, 0x67, 0x69, 0x74, 0x2e, 0x70, 0x65, 0x72, 0x78, 0x2e, 0x72, 0x75,
 	0x2f, 0x70, 0x65, 0x72, 0x78, 0x69, 0x73, 0x2f, 0x70, 0x65, 0x72, 0x78, 0x69, 0x73, 0x2d, 0x67,
-	0x6f, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x61, 0x62, 0x6f, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x73, 0x3b,
-	0x63, 0x6f, 0x6c, 0x6c, 0x61, 0x62, 0x6f, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x73, 0x62, 0x06, 0x70,
-	0x72, 0x6f, 0x74, 0x6f, 0x33,
+	0x6f, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x61, 0x62, 0x6f, 0x72,
+	0x61, 0x74, 0x6f, 0x72, 0x73, 0x3b, 0x63, 0x6f, 0x6c, 0x6c, 0x61, 0x62, 0x6f, 0x72, 0x61, 0x74,
+	0x6f, 0x72, 0x73, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
 }
 
 var (
diff --git a/collaborators/collaborators_grpc.pb.go b/proto/collaborators/collaborators_grpc.pb.go
similarity index 87%
rename from collaborators/collaborators_grpc.pb.go
rename to proto/collaborators/collaborators_grpc.pb.go
index eb889115dc5c3626bfd8ca2ea051ab1e4a29bc17..71a9d8a059f7851368d6a4467e2962657ef648a4 100644
--- a/collaborators/collaborators_grpc.pb.go
+++ b/proto/collaborators/collaborators_grpc.pb.go
@@ -1,4 +1,8 @@
 // Code generated by protoc-gen-go-grpc. DO NOT EDIT.
+// versions:
+// - protoc-gen-go-grpc v1.3.0
+// - protoc             v3.21.12
+// source: collaborators/collaborators.proto
 
 package collaborators
 
@@ -15,6 +19,14 @@ import (
 // Requires gRPC-Go v1.32.0 or later.
 const _ = grpc.SupportPackageIsVersion7
 
+const (
+	Collaborators_Set_FullMethodName               = "/content.collaborators.Collaborators/Set"
+	Collaborators_Get_FullMethodName               = "/content.collaborators.Collaborators/Get"
+	Collaborators_Remove_FullMethodName            = "/content.collaborators.Collaborators/Remove"
+	Collaborators_ListCollaborators_FullMethodName = "/content.collaborators.Collaborators/ListCollaborators"
+	Collaborators_ListSpaces_FullMethodName        = "/content.collaborators.Collaborators/ListSpaces"
+)
+
 // CollaboratorsClient is the client API for Collaborators service.
 //
 // For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream.
@@ -36,7 +48,7 @@ func NewCollaboratorsClient(cc grpc.ClientConnInterface) CollaboratorsClient {
 
 func (c *collaboratorsClient) Set(ctx context.Context, in *SetRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) {
 	out := new(emptypb.Empty)
-	err := c.cc.Invoke(ctx, "/content.collaborators.Collaborators/Set", in, out, opts...)
+	err := c.cc.Invoke(ctx, Collaborators_Set_FullMethodName, in, out, opts...)
 	if err != nil {
 		return nil, err
 	}
@@ -45,7 +57,7 @@ func (c *collaboratorsClient) Set(ctx context.Context, in *SetRequest, opts ...g
 
 func (c *collaboratorsClient) Get(ctx context.Context, in *GetRequest, opts ...grpc.CallOption) (*GetResponse, error) {
 	out := new(GetResponse)
-	err := c.cc.Invoke(ctx, "/content.collaborators.Collaborators/Get", in, out, opts...)
+	err := c.cc.Invoke(ctx, Collaborators_Get_FullMethodName, in, out, opts...)
 	if err != nil {
 		return nil, err
 	}
@@ -54,7 +66,7 @@ func (c *collaboratorsClient) Get(ctx context.Context, in *GetRequest, opts ...g
 
 func (c *collaboratorsClient) Remove(ctx context.Context, in *RemoveRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) {
 	out := new(emptypb.Empty)
-	err := c.cc.Invoke(ctx, "/content.collaborators.Collaborators/Remove", in, out, opts...)
+	err := c.cc.Invoke(ctx, Collaborators_Remove_FullMethodName, in, out, opts...)
 	if err != nil {
 		return nil, err
 	}
@@ -63,7 +75,7 @@ func (c *collaboratorsClient) Remove(ctx context.Context, in *RemoveRequest, opt
 
 func (c *collaboratorsClient) ListCollaborators(ctx context.Context, in *ListCollaboratorsRequest, opts ...grpc.CallOption) (*ListCollaboratorsResponse, error) {
 	out := new(ListCollaboratorsResponse)
-	err := c.cc.Invoke(ctx, "/content.collaborators.Collaborators/ListCollaborators", in, out, opts...)
+	err := c.cc.Invoke(ctx, Collaborators_ListCollaborators_FullMethodName, in, out, opts...)
 	if err != nil {
 		return nil, err
 	}
@@ -72,7 +84,7 @@ func (c *collaboratorsClient) ListCollaborators(ctx context.Context, in *ListCol
 
 func (c *collaboratorsClient) ListSpaces(ctx context.Context, in *ListSpacesRequest, opts ...grpc.CallOption) (*ListSpacesResponse, error) {
 	out := new(ListSpacesResponse)
-	err := c.cc.Invoke(ctx, "/content.collaborators.Collaborators/ListSpaces", in, out, opts...)
+	err := c.cc.Invoke(ctx, Collaborators_ListSpaces_FullMethodName, in, out, opts...)
 	if err != nil {
 		return nil, err
 	}
@@ -133,7 +145,7 @@ func _Collaborators_Set_Handler(srv interface{}, ctx context.Context, dec func(i
 	}
 	info := &grpc.UnaryServerInfo{
 		Server:     srv,
-		FullMethod: "/content.collaborators.Collaborators/Set",
+		FullMethod: Collaborators_Set_FullMethodName,
 	}
 	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
 		return srv.(CollaboratorsServer).Set(ctx, req.(*SetRequest))
@@ -151,7 +163,7 @@ func _Collaborators_Get_Handler(srv interface{}, ctx context.Context, dec func(i
 	}
 	info := &grpc.UnaryServerInfo{
 		Server:     srv,
-		FullMethod: "/content.collaborators.Collaborators/Get",
+		FullMethod: Collaborators_Get_FullMethodName,
 	}
 	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
 		return srv.(CollaboratorsServer).Get(ctx, req.(*GetRequest))
@@ -169,7 +181,7 @@ func _Collaborators_Remove_Handler(srv interface{}, ctx context.Context, dec fun
 	}
 	info := &grpc.UnaryServerInfo{
 		Server:     srv,
-		FullMethod: "/content.collaborators.Collaborators/Remove",
+		FullMethod: Collaborators_Remove_FullMethodName,
 	}
 	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
 		return srv.(CollaboratorsServer).Remove(ctx, req.(*RemoveRequest))
@@ -187,7 +199,7 @@ func _Collaborators_ListCollaborators_Handler(srv interface{}, ctx context.Conte
 	}
 	info := &grpc.UnaryServerInfo{
 		Server:     srv,
-		FullMethod: "/content.collaborators.Collaborators/ListCollaborators",
+		FullMethod: Collaborators_ListCollaborators_FullMethodName,
 	}
 	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
 		return srv.(CollaboratorsServer).ListCollaborators(ctx, req.(*ListCollaboratorsRequest))
@@ -205,7 +217,7 @@ func _Collaborators_ListSpaces_Handler(srv interface{}, ctx context.Context, dec
 	}
 	info := &grpc.UnaryServerInfo{
 		Server:     srv,
-		FullMethod: "/content.collaborators.Collaborators/ListSpaces",
+		FullMethod: Collaborators_ListSpaces_FullMethodName,
 	}
 	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
 		return srv.(CollaboratorsServer).ListSpaces(ctx, req.(*ListSpacesRequest))
diff --git a/collections/collections.pb.go b/proto/collections/collections.pb.go
similarity index 99%
rename from collections/collections.pb.go
rename to proto/collections/collections.pb.go
index a62338d178d4e7ca67dd45cbccec65f202bb0293..9c70451d3ba2ea24fad8b403a27564d426b89594 100644
--- a/collections/collections.pb.go
+++ b/proto/collections/collections.pb.go
@@ -1,13 +1,13 @@
 // Code generated by protoc-gen-go. DO NOT EDIT.
 // versions:
-// 	protoc-gen-go v1.27.1
-// 	protoc        v3.17.3
+// 	protoc-gen-go v1.29.0
+// 	protoc        v3.21.12
 // source: collections/collections.proto
 
 package collections
 
 import (
-	common "git.perx.ru/perxis/perxis-go/common"
+	common "git.perx.ru/perxis/perxis-go/proto/common"
 	protoreflect "google.golang.org/protobuf/reflect/protoreflect"
 	protoimpl "google.golang.org/protobuf/runtime/protoimpl"
 	emptypb "google.golang.org/protobuf/types/known/emptypb"
@@ -1232,11 +1232,11 @@ var file_collections_collections_proto_rawDesc = []byte{
 	0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x44, 0x65, 0x6c, 0x65,
 	0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67,
 	0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74,
-	0x79, 0x22, 0x00, 0x42, 0x36, 0x5a, 0x34, 0x67, 0x69, 0x74, 0x2e, 0x70, 0x65, 0x72, 0x78, 0x2e,
+	0x79, 0x22, 0x00, 0x42, 0x3c, 0x5a, 0x3a, 0x67, 0x69, 0x74, 0x2e, 0x70, 0x65, 0x72, 0x78, 0x2e,
 	0x72, 0x75, 0x2f, 0x70, 0x65, 0x72, 0x78, 0x69, 0x73, 0x2f, 0x70, 0x65, 0x72, 0x78, 0x69, 0x73,
-	0x2d, 0x67, 0x6f, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x3b,
-	0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x62, 0x06, 0x70, 0x72, 0x6f,
-	0x74, 0x6f, 0x33,
+	0x2d, 0x67, 0x6f, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63,
+	0x74, 0x69, 0x6f, 0x6e, 0x73, 0x3b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e,
+	0x73, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
 }
 
 var (
diff --git a/collections/collections_grpc.pb.go b/proto/collections/collections_grpc.pb.go
similarity index 87%
rename from collections/collections_grpc.pb.go
rename to proto/collections/collections_grpc.pb.go
index fe43387a83c2a10913fc29898f4ef58b4ec5d5b8..824303740bd9b178f09b627052dbf464b75a3d95 100644
--- a/collections/collections_grpc.pb.go
+++ b/proto/collections/collections_grpc.pb.go
@@ -1,4 +1,8 @@
 // Code generated by protoc-gen-go-grpc. DO NOT EDIT.
+// versions:
+// - protoc-gen-go-grpc v1.3.0
+// - protoc             v3.21.12
+// source: collections/collections.proto
 
 package collections
 
@@ -15,6 +19,15 @@ import (
 // Requires gRPC-Go v1.32.0 or later.
 const _ = grpc.SupportPackageIsVersion7
 
+const (
+	Collections_Create_FullMethodName    = "/content.collections.Collections/Create"
+	Collections_Get_FullMethodName       = "/content.collections.Collections/Get"
+	Collections_List_FullMethodName      = "/content.collections.Collections/List"
+	Collections_Update_FullMethodName    = "/content.collections.Collections/Update"
+	Collections_SetSchema_FullMethodName = "/content.collections.Collections/SetSchema"
+	Collections_Delete_FullMethodName    = "/content.collections.Collections/Delete"
+)
+
 // CollectionsClient is the client API for Collections service.
 //
 // For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream.
@@ -37,7 +50,7 @@ func NewCollectionsClient(cc grpc.ClientConnInterface) CollectionsClient {
 
 func (c *collectionsClient) Create(ctx context.Context, in *CreateRequest, opts ...grpc.CallOption) (*CreateResponse, error) {
 	out := new(CreateResponse)
-	err := c.cc.Invoke(ctx, "/content.collections.Collections/Create", in, out, opts...)
+	err := c.cc.Invoke(ctx, Collections_Create_FullMethodName, in, out, opts...)
 	if err != nil {
 		return nil, err
 	}
@@ -46,7 +59,7 @@ func (c *collectionsClient) Create(ctx context.Context, in *CreateRequest, opts
 
 func (c *collectionsClient) Get(ctx context.Context, in *GetRequest, opts ...grpc.CallOption) (*GetResponse, error) {
 	out := new(GetResponse)
-	err := c.cc.Invoke(ctx, "/content.collections.Collections/Get", in, out, opts...)
+	err := c.cc.Invoke(ctx, Collections_Get_FullMethodName, in, out, opts...)
 	if err != nil {
 		return nil, err
 	}
@@ -55,7 +68,7 @@ func (c *collectionsClient) Get(ctx context.Context, in *GetRequest, opts ...grp
 
 func (c *collectionsClient) List(ctx context.Context, in *ListRequest, opts ...grpc.CallOption) (*ListResponse, error) {
 	out := new(ListResponse)
-	err := c.cc.Invoke(ctx, "/content.collections.Collections/List", in, out, opts...)
+	err := c.cc.Invoke(ctx, Collections_List_FullMethodName, in, out, opts...)
 	if err != nil {
 		return nil, err
 	}
@@ -64,7 +77,7 @@ func (c *collectionsClient) List(ctx context.Context, in *ListRequest, opts ...g
 
 func (c *collectionsClient) Update(ctx context.Context, in *UpdateRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) {
 	out := new(emptypb.Empty)
-	err := c.cc.Invoke(ctx, "/content.collections.Collections/Update", in, out, opts...)
+	err := c.cc.Invoke(ctx, Collections_Update_FullMethodName, in, out, opts...)
 	if err != nil {
 		return nil, err
 	}
@@ -73,7 +86,7 @@ func (c *collectionsClient) Update(ctx context.Context, in *UpdateRequest, opts
 
 func (c *collectionsClient) SetSchema(ctx context.Context, in *SetSchemaRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) {
 	out := new(emptypb.Empty)
-	err := c.cc.Invoke(ctx, "/content.collections.Collections/SetSchema", in, out, opts...)
+	err := c.cc.Invoke(ctx, Collections_SetSchema_FullMethodName, in, out, opts...)
 	if err != nil {
 		return nil, err
 	}
@@ -82,7 +95,7 @@ func (c *collectionsClient) SetSchema(ctx context.Context, in *SetSchemaRequest,
 
 func (c *collectionsClient) Delete(ctx context.Context, in *DeleteRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) {
 	out := new(emptypb.Empty)
-	err := c.cc.Invoke(ctx, "/content.collections.Collections/Delete", in, out, opts...)
+	err := c.cc.Invoke(ctx, Collections_Delete_FullMethodName, in, out, opts...)
 	if err != nil {
 		return nil, err
 	}
@@ -147,7 +160,7 @@ func _Collections_Create_Handler(srv interface{}, ctx context.Context, dec func(
 	}
 	info := &grpc.UnaryServerInfo{
 		Server:     srv,
-		FullMethod: "/content.collections.Collections/Create",
+		FullMethod: Collections_Create_FullMethodName,
 	}
 	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
 		return srv.(CollectionsServer).Create(ctx, req.(*CreateRequest))
@@ -165,7 +178,7 @@ func _Collections_Get_Handler(srv interface{}, ctx context.Context, dec func(int
 	}
 	info := &grpc.UnaryServerInfo{
 		Server:     srv,
-		FullMethod: "/content.collections.Collections/Get",
+		FullMethod: Collections_Get_FullMethodName,
 	}
 	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
 		return srv.(CollectionsServer).Get(ctx, req.(*GetRequest))
@@ -183,7 +196,7 @@ func _Collections_List_Handler(srv interface{}, ctx context.Context, dec func(in
 	}
 	info := &grpc.UnaryServerInfo{
 		Server:     srv,
-		FullMethod: "/content.collections.Collections/List",
+		FullMethod: Collections_List_FullMethodName,
 	}
 	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
 		return srv.(CollectionsServer).List(ctx, req.(*ListRequest))
@@ -201,7 +214,7 @@ func _Collections_Update_Handler(srv interface{}, ctx context.Context, dec func(
 	}
 	info := &grpc.UnaryServerInfo{
 		Server:     srv,
-		FullMethod: "/content.collections.Collections/Update",
+		FullMethod: Collections_Update_FullMethodName,
 	}
 	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
 		return srv.(CollectionsServer).Update(ctx, req.(*UpdateRequest))
@@ -219,7 +232,7 @@ func _Collections_SetSchema_Handler(srv interface{}, ctx context.Context, dec fu
 	}
 	info := &grpc.UnaryServerInfo{
 		Server:     srv,
-		FullMethod: "/content.collections.Collections/SetSchema",
+		FullMethod: Collections_SetSchema_FullMethodName,
 	}
 	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
 		return srv.(CollectionsServer).SetSchema(ctx, req.(*SetSchemaRequest))
@@ -237,7 +250,7 @@ func _Collections_Delete_Handler(srv interface{}, ctx context.Context, dec func(
 	}
 	info := &grpc.UnaryServerInfo{
 		Server:     srv,
-		FullMethod: "/content.collections.Collections/Delete",
+		FullMethod: Collections_Delete_FullMethodName,
 	}
 	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
 		return srv.(CollectionsServer).Delete(ctx, req.(*DeleteRequest))
diff --git a/common/common.pb.go b/proto/common/common.pb.go
similarity index 99%
rename from common/common.pb.go
rename to proto/common/common.pb.go
index 8fc9e22e15014d3fa4e2a9ff3f4bdf46fb25fb96..c0c2391032978279a1e7fa3c46d5bc1d9bb11eb6 100644
--- a/common/common.pb.go
+++ b/proto/common/common.pb.go
@@ -1,7 +1,7 @@
 // Code generated by protoc-gen-go. DO NOT EDIT.
 // versions:
-// 	protoc-gen-go v1.27.1
-// 	protoc        v3.17.3
+// 	protoc-gen-go v1.29.0
+// 	protoc        v3.21.12
 // source: common/common.proto
 
 package common
@@ -1057,10 +1057,10 @@ var file_common_common_proto_rawDesc = []byte{
 	0x57, 0x4e, 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x43, 0x52, 0x45, 0x41, 0x54, 0x45, 0x10, 0x01,
 	0x12, 0x08, 0x0a, 0x04, 0x52, 0x45, 0x41, 0x44, 0x10, 0x02, 0x12, 0x0a, 0x0a, 0x06, 0x55, 0x50,
 	0x44, 0x41, 0x54, 0x45, 0x10, 0x03, 0x12, 0x0a, 0x0a, 0x06, 0x44, 0x45, 0x4c, 0x45, 0x54, 0x45,
-	0x10, 0x04, 0x42, 0x2c, 0x5a, 0x2a, 0x67, 0x69, 0x74, 0x2e, 0x70, 0x65, 0x72, 0x78, 0x2e, 0x72,
+	0x10, 0x04, 0x42, 0x32, 0x5a, 0x30, 0x67, 0x69, 0x74, 0x2e, 0x70, 0x65, 0x72, 0x78, 0x2e, 0x72,
 	0x75, 0x2f, 0x70, 0x65, 0x72, 0x78, 0x69, 0x73, 0x2f, 0x70, 0x65, 0x72, 0x78, 0x69, 0x73, 0x2d,
-	0x67, 0x6f, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x3b, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e,
-	0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
+	0x67, 0x6f, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x3b,
+	0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
 }
 
 var (
diff --git a/delivery/delivery.pb.go b/proto/delivery/delivery.pb.go
similarity index 98%
rename from delivery/delivery.pb.go
rename to proto/delivery/delivery.pb.go
index 3001ea18f67ae4e395d16a2afa590905444bfdb6..142adddfaed2fc36900ff4e056b8df6396ec83df 100644
--- a/delivery/delivery.pb.go
+++ b/proto/delivery/delivery.pb.go
@@ -1,16 +1,16 @@
 // Code generated by protoc-gen-go. DO NOT EDIT.
 // versions:
-// 	protoc-gen-go v1.27.1
-// 	protoc        v3.17.3
+// 	protoc-gen-go v1.29.0
+// 	protoc        v3.21.12
 // source: delivery/delivery.proto
 
 package delivery
 
 import (
-	collections "git.perx.ru/perxis/perxis-go/collections"
-	environments "git.perx.ru/perxis/perxis-go/environments"
-	items "git.perx.ru/perxis/perxis-go/items"
-	locales "git.perx.ru/perxis/perxis-go/locales"
+	collections "git.perx.ru/perxis/perxis-go/proto/collections"
+	environments "git.perx.ru/perxis/perxis-go/proto/environments"
+	items "git.perx.ru/perxis/perxis-go/proto/items"
+	locales "git.perx.ru/perxis/perxis-go/proto/locales"
 	protoreflect "google.golang.org/protobuf/reflect/protoreflect"
 	protoimpl "google.golang.org/protobuf/runtime/protoimpl"
 	structpb "google.golang.org/protobuf/types/known/structpb"
@@ -1125,10 +1125,10 @@ var file_delivery_delivery_proto_rawDesc = []byte{
 	0x41, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74,
 	0x1a, 0x1b, 0x2e, 0x64, 0x65, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x79, 0x2e, 0x41, 0x67, 0x67, 0x72,
 	0x65, 0x67, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x42,
-	0x30, 0x5a, 0x2e, 0x67, 0x69, 0x74, 0x2e, 0x70, 0x65, 0x72, 0x78, 0x2e, 0x72, 0x75, 0x2f, 0x70,
+	0x36, 0x5a, 0x34, 0x67, 0x69, 0x74, 0x2e, 0x70, 0x65, 0x72, 0x78, 0x2e, 0x72, 0x75, 0x2f, 0x70,
 	0x65, 0x72, 0x78, 0x69, 0x73, 0x2f, 0x70, 0x65, 0x72, 0x78, 0x69, 0x73, 0x2d, 0x67, 0x6f, 0x2f,
-	0x64, 0x65, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x79, 0x3b, 0x64, 0x65, 0x6c, 0x69, 0x76, 0x65, 0x72,
-	0x79, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
+	0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x64, 0x65, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x79, 0x3b, 0x64,
+	0x65, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x79, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
 }
 
 var (
diff --git a/delivery/delivery_grpc.pb.go b/proto/delivery/delivery_grpc.pb.go
similarity index 87%
rename from delivery/delivery_grpc.pb.go
rename to proto/delivery/delivery_grpc.pb.go
index 2763644831527ee08d42f89f12854ef2be041193..9be07eae1c2e3938c618692fd0a7a80ba68ee432 100644
--- a/delivery/delivery_grpc.pb.go
+++ b/proto/delivery/delivery_grpc.pb.go
@@ -1,4 +1,8 @@
 // Code generated by protoc-gen-go-grpc. DO NOT EDIT.
+// versions:
+// - protoc-gen-go-grpc v1.3.0
+// - protoc             v3.21.12
+// source: delivery/delivery.proto
 
 package delivery
 
@@ -14,6 +18,17 @@ import (
 // Requires gRPC-Go v1.32.0 or later.
 const _ = grpc.SupportPackageIsVersion7
 
+const (
+	Delivery_ListLocales_FullMethodName      = "/delivery.Delivery/ListLocales"
+	Delivery_GetEnvironment_FullMethodName   = "/delivery.Delivery/GetEnvironment"
+	Delivery_ListEnvironments_FullMethodName = "/delivery.Delivery/ListEnvironments"
+	Delivery_GetCollection_FullMethodName    = "/delivery.Delivery/GetCollection"
+	Delivery_ListCollections_FullMethodName  = "/delivery.Delivery/ListCollections"
+	Delivery_GetItem_FullMethodName          = "/delivery.Delivery/GetItem"
+	Delivery_FindItems_FullMethodName        = "/delivery.Delivery/FindItems"
+	Delivery_Aggregate_FullMethodName        = "/delivery.Delivery/Aggregate"
+)
+
 // DeliveryClient is the client API for Delivery service.
 //
 // For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream.
@@ -38,7 +53,7 @@ func NewDeliveryClient(cc grpc.ClientConnInterface) DeliveryClient {
 
 func (c *deliveryClient) ListLocales(ctx context.Context, in *ListLocalesRequest, opts ...grpc.CallOption) (*ListLocalesResponse, error) {
 	out := new(ListLocalesResponse)
-	err := c.cc.Invoke(ctx, "/delivery.Delivery/ListLocales", in, out, opts...)
+	err := c.cc.Invoke(ctx, Delivery_ListLocales_FullMethodName, in, out, opts...)
 	if err != nil {
 		return nil, err
 	}
@@ -47,7 +62,7 @@ func (c *deliveryClient) ListLocales(ctx context.Context, in *ListLocalesRequest
 
 func (c *deliveryClient) GetEnvironment(ctx context.Context, in *GetEnvironmentRequest, opts ...grpc.CallOption) (*GetEnvironmentResponse, error) {
 	out := new(GetEnvironmentResponse)
-	err := c.cc.Invoke(ctx, "/delivery.Delivery/GetEnvironment", in, out, opts...)
+	err := c.cc.Invoke(ctx, Delivery_GetEnvironment_FullMethodName, in, out, opts...)
 	if err != nil {
 		return nil, err
 	}
@@ -56,7 +71,7 @@ func (c *deliveryClient) GetEnvironment(ctx context.Context, in *GetEnvironmentR
 
 func (c *deliveryClient) ListEnvironments(ctx context.Context, in *ListEnvironmentsRequest, opts ...grpc.CallOption) (*ListEnvironmentsResponse, error) {
 	out := new(ListEnvironmentsResponse)
-	err := c.cc.Invoke(ctx, "/delivery.Delivery/ListEnvironments", in, out, opts...)
+	err := c.cc.Invoke(ctx, Delivery_ListEnvironments_FullMethodName, in, out, opts...)
 	if err != nil {
 		return nil, err
 	}
@@ -65,7 +80,7 @@ func (c *deliveryClient) ListEnvironments(ctx context.Context, in *ListEnvironme
 
 func (c *deliveryClient) GetCollection(ctx context.Context, in *GetCollectionRequest, opts ...grpc.CallOption) (*GetCollectionResponse, error) {
 	out := new(GetCollectionResponse)
-	err := c.cc.Invoke(ctx, "/delivery.Delivery/GetCollection", in, out, opts...)
+	err := c.cc.Invoke(ctx, Delivery_GetCollection_FullMethodName, in, out, opts...)
 	if err != nil {
 		return nil, err
 	}
@@ -74,7 +89,7 @@ func (c *deliveryClient) GetCollection(ctx context.Context, in *GetCollectionReq
 
 func (c *deliveryClient) ListCollections(ctx context.Context, in *ListCollectionsRequest, opts ...grpc.CallOption) (*ListCollectionsResponse, error) {
 	out := new(ListCollectionsResponse)
-	err := c.cc.Invoke(ctx, "/delivery.Delivery/ListCollections", in, out, opts...)
+	err := c.cc.Invoke(ctx, Delivery_ListCollections_FullMethodName, in, out, opts...)
 	if err != nil {
 		return nil, err
 	}
@@ -83,7 +98,7 @@ func (c *deliveryClient) ListCollections(ctx context.Context, in *ListCollection
 
 func (c *deliveryClient) GetItem(ctx context.Context, in *GetItemRequest, opts ...grpc.CallOption) (*GetItemResponse, error) {
 	out := new(GetItemResponse)
-	err := c.cc.Invoke(ctx, "/delivery.Delivery/GetItem", in, out, opts...)
+	err := c.cc.Invoke(ctx, Delivery_GetItem_FullMethodName, in, out, opts...)
 	if err != nil {
 		return nil, err
 	}
@@ -92,7 +107,7 @@ func (c *deliveryClient) GetItem(ctx context.Context, in *GetItemRequest, opts .
 
 func (c *deliveryClient) FindItems(ctx context.Context, in *FindItemsRequest, opts ...grpc.CallOption) (*FindItemsResponse, error) {
 	out := new(FindItemsResponse)
-	err := c.cc.Invoke(ctx, "/delivery.Delivery/FindItems", in, out, opts...)
+	err := c.cc.Invoke(ctx, Delivery_FindItems_FullMethodName, in, out, opts...)
 	if err != nil {
 		return nil, err
 	}
@@ -101,7 +116,7 @@ func (c *deliveryClient) FindItems(ctx context.Context, in *FindItemsRequest, op
 
 func (c *deliveryClient) Aggregate(ctx context.Context, in *AggregateRequest, opts ...grpc.CallOption) (*AggregateResponse, error) {
 	out := new(AggregateResponse)
-	err := c.cc.Invoke(ctx, "/delivery.Delivery/Aggregate", in, out, opts...)
+	err := c.cc.Invoke(ctx, Delivery_Aggregate_FullMethodName, in, out, opts...)
 	if err != nil {
 		return nil, err
 	}
@@ -174,7 +189,7 @@ func _Delivery_ListLocales_Handler(srv interface{}, ctx context.Context, dec fun
 	}
 	info := &grpc.UnaryServerInfo{
 		Server:     srv,
-		FullMethod: "/delivery.Delivery/ListLocales",
+		FullMethod: Delivery_ListLocales_FullMethodName,
 	}
 	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
 		return srv.(DeliveryServer).ListLocales(ctx, req.(*ListLocalesRequest))
@@ -192,7 +207,7 @@ func _Delivery_GetEnvironment_Handler(srv interface{}, ctx context.Context, dec
 	}
 	info := &grpc.UnaryServerInfo{
 		Server:     srv,
-		FullMethod: "/delivery.Delivery/GetEnvironment",
+		FullMethod: Delivery_GetEnvironment_FullMethodName,
 	}
 	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
 		return srv.(DeliveryServer).GetEnvironment(ctx, req.(*GetEnvironmentRequest))
@@ -210,7 +225,7 @@ func _Delivery_ListEnvironments_Handler(srv interface{}, ctx context.Context, de
 	}
 	info := &grpc.UnaryServerInfo{
 		Server:     srv,
-		FullMethod: "/delivery.Delivery/ListEnvironments",
+		FullMethod: Delivery_ListEnvironments_FullMethodName,
 	}
 	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
 		return srv.(DeliveryServer).ListEnvironments(ctx, req.(*ListEnvironmentsRequest))
@@ -228,7 +243,7 @@ func _Delivery_GetCollection_Handler(srv interface{}, ctx context.Context, dec f
 	}
 	info := &grpc.UnaryServerInfo{
 		Server:     srv,
-		FullMethod: "/delivery.Delivery/GetCollection",
+		FullMethod: Delivery_GetCollection_FullMethodName,
 	}
 	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
 		return srv.(DeliveryServer).GetCollection(ctx, req.(*GetCollectionRequest))
@@ -246,7 +261,7 @@ func _Delivery_ListCollections_Handler(srv interface{}, ctx context.Context, dec
 	}
 	info := &grpc.UnaryServerInfo{
 		Server:     srv,
-		FullMethod: "/delivery.Delivery/ListCollections",
+		FullMethod: Delivery_ListCollections_FullMethodName,
 	}
 	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
 		return srv.(DeliveryServer).ListCollections(ctx, req.(*ListCollectionsRequest))
@@ -264,7 +279,7 @@ func _Delivery_GetItem_Handler(srv interface{}, ctx context.Context, dec func(in
 	}
 	info := &grpc.UnaryServerInfo{
 		Server:     srv,
-		FullMethod: "/delivery.Delivery/GetItem",
+		FullMethod: Delivery_GetItem_FullMethodName,
 	}
 	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
 		return srv.(DeliveryServer).GetItem(ctx, req.(*GetItemRequest))
@@ -282,7 +297,7 @@ func _Delivery_FindItems_Handler(srv interface{}, ctx context.Context, dec func(
 	}
 	info := &grpc.UnaryServerInfo{
 		Server:     srv,
-		FullMethod: "/delivery.Delivery/FindItems",
+		FullMethod: Delivery_FindItems_FullMethodName,
 	}
 	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
 		return srv.(DeliveryServer).FindItems(ctx, req.(*FindItemsRequest))
@@ -300,7 +315,7 @@ func _Delivery_Aggregate_Handler(srv interface{}, ctx context.Context, dec func(
 	}
 	info := &grpc.UnaryServerInfo{
 		Server:     srv,
-		FullMethod: "/delivery.Delivery/Aggregate",
+		FullMethod: Delivery_Aggregate_FullMethodName,
 	}
 	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
 		return srv.(DeliveryServer).Aggregate(ctx, req.(*AggregateRequest))
diff --git a/environments/environments.pb.go b/proto/environments/environments.pb.go
similarity index 99%
rename from environments/environments.pb.go
rename to proto/environments/environments.pb.go
index edff18007bf5093307d12633ddc8e311868f14fc..fdae1371c354aa97141b6f23598730e3656c9fd0 100644
--- a/environments/environments.pb.go
+++ b/proto/environments/environments.pb.go
@@ -1,7 +1,7 @@
 // Code generated by protoc-gen-go. DO NOT EDIT.
 // versions:
-// 	protoc-gen-go v1.27.1
-// 	protoc        v3.17.3
+// 	protoc-gen-go v1.29.0
+// 	protoc        v3.21.12
 // source: environments/environments.proto
 
 package environments
@@ -1051,11 +1051,12 @@ var file_environments_environments_proto_rawDesc = []byte{
 	0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e,
 	0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71,
 	0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72,
-	0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x42, 0x38,
-	0x5a, 0x36, 0x67, 0x69, 0x74, 0x2e, 0x70, 0x65, 0x72, 0x78, 0x2e, 0x72, 0x75, 0x2f, 0x70, 0x65,
-	0x72, 0x78, 0x69, 0x73, 0x2f, 0x70, 0x65, 0x72, 0x78, 0x69, 0x73, 0x2d, 0x67, 0x6f, 0x2f, 0x65,
-	0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x3b, 0x65, 0x6e, 0x76, 0x69,
-	0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
+	0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x42, 0x3e,
+	0x5a, 0x3c, 0x67, 0x69, 0x74, 0x2e, 0x70, 0x65, 0x72, 0x78, 0x2e, 0x72, 0x75, 0x2f, 0x70, 0x65,
+	0x72, 0x78, 0x69, 0x73, 0x2f, 0x70, 0x65, 0x72, 0x78, 0x69, 0x73, 0x2d, 0x67, 0x6f, 0x2f, 0x70,
+	0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74,
+	0x73, 0x3b, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x62, 0x06,
+	0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
 }
 
 var (
diff --git a/environments/environments_grpc.pb.go b/proto/environments/environments_grpc.pb.go
similarity index 86%
rename from environments/environments_grpc.pb.go
rename to proto/environments/environments_grpc.pb.go
index 8ab150a895248c8024f5ef897e38da5915df88ae..6679d70738a62e277e9c41c6bd237246d7b88e76 100644
--- a/environments/environments_grpc.pb.go
+++ b/proto/environments/environments_grpc.pb.go
@@ -1,4 +1,8 @@
 // Code generated by protoc-gen-go-grpc. DO NOT EDIT.
+// versions:
+// - protoc-gen-go-grpc v1.3.0
+// - protoc             v3.21.12
+// source: environments/environments.proto
 
 package environments
 
@@ -15,6 +19,17 @@ import (
 // Requires gRPC-Go v1.32.0 or later.
 const _ = grpc.SupportPackageIsVersion7
 
+const (
+	Environments_Create_FullMethodName      = "/content.environments.Environments/Create"
+	Environments_Get_FullMethodName         = "/content.environments.Environments/Get"
+	Environments_List_FullMethodName        = "/content.environments.Environments/List"
+	Environments_Update_FullMethodName      = "/content.environments.Environments/Update"
+	Environments_SetAlias_FullMethodName    = "/content.environments.Environments/SetAlias"
+	Environments_RemoveAlias_FullMethodName = "/content.environments.Environments/RemoveAlias"
+	Environments_Delete_FullMethodName      = "/content.environments.Environments/Delete"
+	Environments_Migrate_FullMethodName     = "/content.environments.Environments/Migrate"
+)
+
 // EnvironmentsClient is the client API for Environments service.
 //
 // For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream.
@@ -39,7 +54,7 @@ func NewEnvironmentsClient(cc grpc.ClientConnInterface) EnvironmentsClient {
 
 func (c *environmentsClient) Create(ctx context.Context, in *CreateRequest, opts ...grpc.CallOption) (*CreateResponse, error) {
 	out := new(CreateResponse)
-	err := c.cc.Invoke(ctx, "/content.environments.Environments/Create", in, out, opts...)
+	err := c.cc.Invoke(ctx, Environments_Create_FullMethodName, in, out, opts...)
 	if err != nil {
 		return nil, err
 	}
@@ -48,7 +63,7 @@ func (c *environmentsClient) Create(ctx context.Context, in *CreateRequest, opts
 
 func (c *environmentsClient) Get(ctx context.Context, in *GetRequest, opts ...grpc.CallOption) (*GetResponse, error) {
 	out := new(GetResponse)
-	err := c.cc.Invoke(ctx, "/content.environments.Environments/Get", in, out, opts...)
+	err := c.cc.Invoke(ctx, Environments_Get_FullMethodName, in, out, opts...)
 	if err != nil {
 		return nil, err
 	}
@@ -57,7 +72,7 @@ func (c *environmentsClient) Get(ctx context.Context, in *GetRequest, opts ...gr
 
 func (c *environmentsClient) List(ctx context.Context, in *ListRequest, opts ...grpc.CallOption) (*ListResponse, error) {
 	out := new(ListResponse)
-	err := c.cc.Invoke(ctx, "/content.environments.Environments/List", in, out, opts...)
+	err := c.cc.Invoke(ctx, Environments_List_FullMethodName, in, out, opts...)
 	if err != nil {
 		return nil, err
 	}
@@ -66,7 +81,7 @@ func (c *environmentsClient) List(ctx context.Context, in *ListRequest, opts ...
 
 func (c *environmentsClient) Update(ctx context.Context, in *UpdateRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) {
 	out := new(emptypb.Empty)
-	err := c.cc.Invoke(ctx, "/content.environments.Environments/Update", in, out, opts...)
+	err := c.cc.Invoke(ctx, Environments_Update_FullMethodName, in, out, opts...)
 	if err != nil {
 		return nil, err
 	}
@@ -75,7 +90,7 @@ func (c *environmentsClient) Update(ctx context.Context, in *UpdateRequest, opts
 
 func (c *environmentsClient) SetAlias(ctx context.Context, in *SetAliasRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) {
 	out := new(emptypb.Empty)
-	err := c.cc.Invoke(ctx, "/content.environments.Environments/SetAlias", in, out, opts...)
+	err := c.cc.Invoke(ctx, Environments_SetAlias_FullMethodName, in, out, opts...)
 	if err != nil {
 		return nil, err
 	}
@@ -84,7 +99,7 @@ func (c *environmentsClient) SetAlias(ctx context.Context, in *SetAliasRequest,
 
 func (c *environmentsClient) RemoveAlias(ctx context.Context, in *RemoveAliasRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) {
 	out := new(emptypb.Empty)
-	err := c.cc.Invoke(ctx, "/content.environments.Environments/RemoveAlias", in, out, opts...)
+	err := c.cc.Invoke(ctx, Environments_RemoveAlias_FullMethodName, in, out, opts...)
 	if err != nil {
 		return nil, err
 	}
@@ -93,7 +108,7 @@ func (c *environmentsClient) RemoveAlias(ctx context.Context, in *RemoveAliasReq
 
 func (c *environmentsClient) Delete(ctx context.Context, in *DeleteRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) {
 	out := new(emptypb.Empty)
-	err := c.cc.Invoke(ctx, "/content.environments.Environments/Delete", in, out, opts...)
+	err := c.cc.Invoke(ctx, Environments_Delete_FullMethodName, in, out, opts...)
 	if err != nil {
 		return nil, err
 	}
@@ -102,7 +117,7 @@ func (c *environmentsClient) Delete(ctx context.Context, in *DeleteRequest, opts
 
 func (c *environmentsClient) Migrate(ctx context.Context, in *MigrateRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) {
 	out := new(emptypb.Empty)
-	err := c.cc.Invoke(ctx, "/content.environments.Environments/Migrate", in, out, opts...)
+	err := c.cc.Invoke(ctx, Environments_Migrate_FullMethodName, in, out, opts...)
 	if err != nil {
 		return nil, err
 	}
@@ -175,7 +190,7 @@ func _Environments_Create_Handler(srv interface{}, ctx context.Context, dec func
 	}
 	info := &grpc.UnaryServerInfo{
 		Server:     srv,
-		FullMethod: "/content.environments.Environments/Create",
+		FullMethod: Environments_Create_FullMethodName,
 	}
 	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
 		return srv.(EnvironmentsServer).Create(ctx, req.(*CreateRequest))
@@ -193,7 +208,7 @@ func _Environments_Get_Handler(srv interface{}, ctx context.Context, dec func(in
 	}
 	info := &grpc.UnaryServerInfo{
 		Server:     srv,
-		FullMethod: "/content.environments.Environments/Get",
+		FullMethod: Environments_Get_FullMethodName,
 	}
 	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
 		return srv.(EnvironmentsServer).Get(ctx, req.(*GetRequest))
@@ -211,7 +226,7 @@ func _Environments_List_Handler(srv interface{}, ctx context.Context, dec func(i
 	}
 	info := &grpc.UnaryServerInfo{
 		Server:     srv,
-		FullMethod: "/content.environments.Environments/List",
+		FullMethod: Environments_List_FullMethodName,
 	}
 	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
 		return srv.(EnvironmentsServer).List(ctx, req.(*ListRequest))
@@ -229,7 +244,7 @@ func _Environments_Update_Handler(srv interface{}, ctx context.Context, dec func
 	}
 	info := &grpc.UnaryServerInfo{
 		Server:     srv,
-		FullMethod: "/content.environments.Environments/Update",
+		FullMethod: Environments_Update_FullMethodName,
 	}
 	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
 		return srv.(EnvironmentsServer).Update(ctx, req.(*UpdateRequest))
@@ -247,7 +262,7 @@ func _Environments_SetAlias_Handler(srv interface{}, ctx context.Context, dec fu
 	}
 	info := &grpc.UnaryServerInfo{
 		Server:     srv,
-		FullMethod: "/content.environments.Environments/SetAlias",
+		FullMethod: Environments_SetAlias_FullMethodName,
 	}
 	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
 		return srv.(EnvironmentsServer).SetAlias(ctx, req.(*SetAliasRequest))
@@ -265,7 +280,7 @@ func _Environments_RemoveAlias_Handler(srv interface{}, ctx context.Context, dec
 	}
 	info := &grpc.UnaryServerInfo{
 		Server:     srv,
-		FullMethod: "/content.environments.Environments/RemoveAlias",
+		FullMethod: Environments_RemoveAlias_FullMethodName,
 	}
 	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
 		return srv.(EnvironmentsServer).RemoveAlias(ctx, req.(*RemoveAliasRequest))
@@ -283,7 +298,7 @@ func _Environments_Delete_Handler(srv interface{}, ctx context.Context, dec func
 	}
 	info := &grpc.UnaryServerInfo{
 		Server:     srv,
-		FullMethod: "/content.environments.Environments/Delete",
+		FullMethod: Environments_Delete_FullMethodName,
 	}
 	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
 		return srv.(EnvironmentsServer).Delete(ctx, req.(*DeleteRequest))
@@ -301,7 +316,7 @@ func _Environments_Migrate_Handler(srv interface{}, ctx context.Context, dec fun
 	}
 	info := &grpc.UnaryServerInfo{
 		Server:     srv,
-		FullMethod: "/content.environments.Environments/Migrate",
+		FullMethod: Environments_Migrate_FullMethodName,
 	}
 	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
 		return srv.(EnvironmentsServer).Migrate(ctx, req.(*MigrateRequest))
diff --git a/extensions/extension.pb.go b/proto/extensions/extension.pb.go
similarity index 97%
rename from extensions/extension.pb.go
rename to proto/extensions/extension.pb.go
index 77f8048d6932721f88011352ac22e48ccb9d8289..ffeb45ce3549c26d76aea4ac2bb997fb76e4e46d 100644
--- a/extensions/extension.pb.go
+++ b/proto/extensions/extension.pb.go
@@ -10,14 +10,14 @@
 
 // Code generated by protoc-gen-go. DO NOT EDIT.
 // versions:
-// 	protoc-gen-go v1.27.1
-// 	protoc        v3.17.3
+// 	protoc-gen-go v1.29.0
+// 	protoc        v3.21.12
 // source: extensions/extension.proto
 
 package extensions
 
 import (
-	references "git.perx.ru/perxis/perxis-go/references"
+	references "git.perx.ru/perxis/perxis-go/proto/references"
 	protoreflect "google.golang.org/protobuf/reflect/protoreflect"
 	protoimpl "google.golang.org/protobuf/runtime/protoimpl"
 	reflect "reflect"
@@ -978,20 +978,20 @@ func (x *ActionResponse) GetRefs() []*references.Reference {
 	return nil
 }
 
-//*
-//Action описывает как коллекцию в системе с предуставновленными действиями, так и возможные дальнейшие действия после
-//получения ответа  (см. `ActionResponse.next`)
+// *
+// Action описывает как коллекцию в системе с предуставновленными действиями, так и возможные дальнейшие действия после
+// получения ответа  (см. `ActionResponse.next`)
 //
-//Если поле `request` присутствует, но не все требуемые поля заполнены, то значения для них берутся из текущих значений.
+// Если поле `request` присутствует, но не все требуемые поля заполнены, то значения для них берутся из текущих значений.
 //
-//Коллекция: space_actions (Пространство/Действия)
-//Действия сохраненные в коллекции не содержат поля `request`. Значение заполняется текущими значениями.
+// Коллекция: space_actions (Пространство/Действия)
+// Действия сохраненные в коллекции не содержат поля `request`. Значение заполняется текущими значениями.
 //
-//Пользовательские действия добавляются при установке расширений или при
-//настройке в системную коллекции `Пространство/Действия` (system_actions). Расширения самостоятельно контролирует создание необходимых
-//им действий в коллекции.
+// Пользовательские действия добавляются при установке расширений или при
+// настройке в системную коллекции `Пространство/Действия` (system_actions). Расширения самостоятельно контролирует создание необходимых
+// им действий в коллекции.
 //
-//Интерфейс загружает пользовательские действия и отображает их в интерфейсе соответствующим образом.
+// Интерфейс загружает пользовательские действия и отображает их в интерфейсе соответствующим образом.
 type Action struct {
 	state         protoimpl.MessageState
 	sizeCache     protoimpl.SizeCache
@@ -1027,7 +1027,6 @@ type Action struct {
 	// - :envId
 	// - :colId
 	// - :itemId
-	//
 	NavigationRoute string `protobuf:"bytes,10510,opt,name=navigation_route,json=navigationRoute,proto3" json:"navigation_route,omitempty"`
 }
 
@@ -1358,11 +1357,11 @@ var file_extensions_extension_proto_rawDesc = []byte{
 	0x19, 0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x41, 0x63, 0x74,
 	0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x65, 0x78, 0x74,
 	0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65,
-	0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x42, 0x34, 0x5a, 0x32, 0x67, 0x69, 0x74, 0x2e,
+	0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x42, 0x3a, 0x5a, 0x38, 0x67, 0x69, 0x74, 0x2e,
 	0x70, 0x65, 0x72, 0x78, 0x2e, 0x72, 0x75, 0x2f, 0x70, 0x65, 0x72, 0x78, 0x69, 0x73, 0x2f, 0x70,
-	0x65, 0x72, 0x78, 0x69, 0x73, 0x2d, 0x67, 0x6f, 0x2f, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69,
-	0x6f, 0x6e, 0x73, 0x3b, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x62, 0x06,
-	0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
+	0x65, 0x72, 0x78, 0x69, 0x73, 0x2d, 0x67, 0x6f, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x65,
+	0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x3b, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73,
+	0x69, 0x6f, 0x6e, 0x73, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
 }
 
 var (
diff --git a/extensions/extension_grpc.pb.go b/proto/extensions/extension_grpc.pb.go
similarity index 82%
rename from extensions/extension_grpc.pb.go
rename to proto/extensions/extension_grpc.pb.go
index dbf1c870c809cb3658c96464d60ee7b992a24333..2d19448ba786db2501c69cf31b34cb8c91de714b 100644
--- a/extensions/extension_grpc.pb.go
+++ b/proto/extensions/extension_grpc.pb.go
@@ -1,4 +1,18 @@
+//*
+//# Расширения (Extensions)
+//
+//Расширения представляют собой отдельные сервисы предоставляющие дополнительные возможности для пользователей. Сервис
+//может предоставлять несколько расширений одновременно.
+//
+//Для координации взаимодействия используется сервис менеджер расширений (Extension Manager). Для предоставления своих функций в систему сервис должен
+//зарегистрироваться на контроллере.
+//
+
 // Code generated by protoc-gen-go-grpc. DO NOT EDIT.
+// versions:
+// - protoc-gen-go-grpc v1.3.0
+// - protoc             v3.21.12
+// source: extensions/extension.proto
 
 package extensions
 
@@ -14,6 +28,14 @@ import (
 // Requires gRPC-Go v1.32.0 or later.
 const _ = grpc.SupportPackageIsVersion7
 
+const (
+	Extension_Install_FullMethodName   = "/extensions.Extension/Install"
+	Extension_Check_FullMethodName     = "/extensions.Extension/Check"
+	Extension_Update_FullMethodName    = "/extensions.Extension/Update"
+	Extension_Uninstall_FullMethodName = "/extensions.Extension/Uninstall"
+	Extension_Action_FullMethodName    = "/extensions.Extension/Action"
+)
+
 // ExtensionClient is the client API for Extension service.
 //
 // For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream.
@@ -41,10 +63,10 @@ type ExtensionClient interface {
 	// доступное для всех пользователей.
 	//
 	// Примеры пользовательских действий:
-	// - "Собрать сайт" - добавляется Perxis.Web для сборки сайта, доступна пользователю через меню,
-	//   параметры space_id, env_id. При вызове выполняется запрос на сервер ProcessAction.
-	// - "Посмотреть задачи" - добавляется Tasks для перехода на коллекцию задач. Отображается в меню,
-	//   параметры space_id, env_id.
+	//   - "Собрать сайт" - добавляется Perxis.Web для сборки сайта, доступна пользователю через меню,
+	//     параметры space_id, env_id. При вызове выполняется запрос на сервер ProcessAction.
+	//   - "Посмотреть задачи" - добавляется Tasks для перехода на коллекцию задач. Отображается в меню,
+	//     параметры space_id, env_id.
 	//
 	// Приложения так же могут использовать действия для вызова обработки в других приложениях при
 	// необходимости.
@@ -61,7 +83,7 @@ func NewExtensionClient(cc grpc.ClientConnInterface) ExtensionClient {
 
 func (c *extensionClient) Install(ctx context.Context, in *InstallRequest, opts ...grpc.CallOption) (*InstallResponse, error) {
 	out := new(InstallResponse)
-	err := c.cc.Invoke(ctx, "/extensions.Extension/Install", in, out, opts...)
+	err := c.cc.Invoke(ctx, Extension_Install_FullMethodName, in, out, opts...)
 	if err != nil {
 		return nil, err
 	}
@@ -70,7 +92,7 @@ func (c *extensionClient) Install(ctx context.Context, in *InstallRequest, opts
 
 func (c *extensionClient) Check(ctx context.Context, in *CheckRequest, opts ...grpc.CallOption) (*CheckResponse, error) {
 	out := new(CheckResponse)
-	err := c.cc.Invoke(ctx, "/extensions.Extension/Check", in, out, opts...)
+	err := c.cc.Invoke(ctx, Extension_Check_FullMethodName, in, out, opts...)
 	if err != nil {
 		return nil, err
 	}
@@ -79,7 +101,7 @@ func (c *extensionClient) Check(ctx context.Context, in *CheckRequest, opts ...g
 
 func (c *extensionClient) Update(ctx context.Context, in *UpdateRequest, opts ...grpc.CallOption) (*UpdateResponse, error) {
 	out := new(UpdateResponse)
-	err := c.cc.Invoke(ctx, "/extensions.Extension/Update", in, out, opts...)
+	err := c.cc.Invoke(ctx, Extension_Update_FullMethodName, in, out, opts...)
 	if err != nil {
 		return nil, err
 	}
@@ -88,7 +110,7 @@ func (c *extensionClient) Update(ctx context.Context, in *UpdateRequest, opts ..
 
 func (c *extensionClient) Uninstall(ctx context.Context, in *UninstallRequest, opts ...grpc.CallOption) (*UninstallResponse, error) {
 	out := new(UninstallResponse)
-	err := c.cc.Invoke(ctx, "/extensions.Extension/Uninstall", in, out, opts...)
+	err := c.cc.Invoke(ctx, Extension_Uninstall_FullMethodName, in, out, opts...)
 	if err != nil {
 		return nil, err
 	}
@@ -97,7 +119,7 @@ func (c *extensionClient) Uninstall(ctx context.Context, in *UninstallRequest, o
 
 func (c *extensionClient) Action(ctx context.Context, in *ActionRequest, opts ...grpc.CallOption) (*ActionResponse, error) {
 	out := new(ActionResponse)
-	err := c.cc.Invoke(ctx, "/extensions.Extension/Action", in, out, opts...)
+	err := c.cc.Invoke(ctx, Extension_Action_FullMethodName, in, out, opts...)
 	if err != nil {
 		return nil, err
 	}
@@ -131,10 +153,10 @@ type ExtensionServer interface {
 	// доступное для всех пользователей.
 	//
 	// Примеры пользовательских действий:
-	// - "Собрать сайт" - добавляется Perxis.Web для сборки сайта, доступна пользователю через меню,
-	//   параметры space_id, env_id. При вызове выполняется запрос на сервер ProcessAction.
-	// - "Посмотреть задачи" - добавляется Tasks для перехода на коллекцию задач. Отображается в меню,
-	//   параметры space_id, env_id.
+	//   - "Собрать сайт" - добавляется Perxis.Web для сборки сайта, доступна пользователю через меню,
+	//     параметры space_id, env_id. При вызове выполняется запрос на сервер ProcessAction.
+	//   - "Посмотреть задачи" - добавляется Tasks для перехода на коллекцию задач. Отображается в меню,
+	//     параметры space_id, env_id.
 	//
 	// Приложения так же могут использовать действия для вызова обработки в других приложениях при
 	// необходимости.
@@ -184,7 +206,7 @@ func _Extension_Install_Handler(srv interface{}, ctx context.Context, dec func(i
 	}
 	info := &grpc.UnaryServerInfo{
 		Server:     srv,
-		FullMethod: "/extensions.Extension/Install",
+		FullMethod: Extension_Install_FullMethodName,
 	}
 	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
 		return srv.(ExtensionServer).Install(ctx, req.(*InstallRequest))
@@ -202,7 +224,7 @@ func _Extension_Check_Handler(srv interface{}, ctx context.Context, dec func(int
 	}
 	info := &grpc.UnaryServerInfo{
 		Server:     srv,
-		FullMethod: "/extensions.Extension/Check",
+		FullMethod: Extension_Check_FullMethodName,
 	}
 	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
 		return srv.(ExtensionServer).Check(ctx, req.(*CheckRequest))
@@ -220,7 +242,7 @@ func _Extension_Update_Handler(srv interface{}, ctx context.Context, dec func(in
 	}
 	info := &grpc.UnaryServerInfo{
 		Server:     srv,
-		FullMethod: "/extensions.Extension/Update",
+		FullMethod: Extension_Update_FullMethodName,
 	}
 	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
 		return srv.(ExtensionServer).Update(ctx, req.(*UpdateRequest))
@@ -238,7 +260,7 @@ func _Extension_Uninstall_Handler(srv interface{}, ctx context.Context, dec func
 	}
 	info := &grpc.UnaryServerInfo{
 		Server:     srv,
-		FullMethod: "/extensions.Extension/Uninstall",
+		FullMethod: Extension_Uninstall_FullMethodName,
 	}
 	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
 		return srv.(ExtensionServer).Uninstall(ctx, req.(*UninstallRequest))
@@ -256,7 +278,7 @@ func _Extension_Action_Handler(srv interface{}, ctx context.Context, dec func(in
 	}
 	info := &grpc.UnaryServerInfo{
 		Server:     srv,
-		FullMethod: "/extensions.Extension/Action",
+		FullMethod: Extension_Action_FullMethodName,
 	}
 	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
 		return srv.(ExtensionServer).Action(ctx, req.(*ActionRequest))
diff --git a/extensions/manager.pb.go b/proto/extensions/manager.pb.go
similarity index 99%
rename from extensions/manager.pb.go
rename to proto/extensions/manager.pb.go
index d706aa8e7e98c6d3bb7a3c03a07634cda2c924e2..be2193d80f6b5b7c1efc10db15cbdd2be63ec6ad 100644
--- a/extensions/manager.pb.go
+++ b/proto/extensions/manager.pb.go
@@ -27,8 +27,8 @@
 
 // Code generated by protoc-gen-go. DO NOT EDIT.
 // versions:
-// 	protoc-gen-go v1.27.1
-// 	protoc        v3.17.3
+// 	protoc-gen-go v1.29.0
+// 	protoc        v3.21.12
 // source: extensions/manager.proto
 
 package extensions
@@ -707,10 +707,11 @@ var file_extensions_manager_proto_rawDesc = []byte{
 	0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x65, 0x78, 0x74, 0x65,
 	0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x45, 0x78, 0x74, 0x65, 0x6e,
 	0x73, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x42,
-	0x34, 0x5a, 0x32, 0x67, 0x69, 0x74, 0x2e, 0x70, 0x65, 0x72, 0x78, 0x2e, 0x72, 0x75, 0x2f, 0x70,
+	0x3a, 0x5a, 0x38, 0x67, 0x69, 0x74, 0x2e, 0x70, 0x65, 0x72, 0x78, 0x2e, 0x72, 0x75, 0x2f, 0x70,
 	0x65, 0x72, 0x78, 0x69, 0x73, 0x2f, 0x70, 0x65, 0x72, 0x78, 0x69, 0x73, 0x2d, 0x67, 0x6f, 0x2f,
-	0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x3b, 0x65, 0x78, 0x74, 0x65, 0x6e,
-	0x73, 0x69, 0x6f, 0x6e, 0x73, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
+	0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73,
+	0x3b, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x62, 0x06, 0x70, 0x72, 0x6f,
+	0x74, 0x6f, 0x33,
 }
 
 var (
diff --git a/extensions/manager_grpc.pb.go b/proto/extensions/manager_grpc.pb.go
similarity index 71%
rename from extensions/manager_grpc.pb.go
rename to proto/extensions/manager_grpc.pb.go
index ef90ef1f9d60f9bb0a4d3f828630960dd53dba9b..093b6165f912a2f22f9482a8f3035ce3b2bc07e9 100644
--- a/extensions/manager_grpc.pb.go
+++ b/proto/extensions/manager_grpc.pb.go
@@ -1,4 +1,35 @@
+//*
+//
+//# Менеджер расширений
+//
+//Реализует функционал по координации расширений в системе и служит единой точкой доступа для работы с расширениями:
+//- Регистрирует все расширения в едином реестре
+//- Предоставляет доступ к реестру расширений на получение доступных расширений в системе
+//- Контролирует процесс установки расширения, устанавливает все необходимые зависимости в правильном порядке
+//- Контролирует создание системной коллекции `system_extensions` (System/Extensions) и создание/удалений в ней установленных расширений
+//- Контролирует создание системной коллекции `system_actions` (System/Actions). Выполняет удаление всех действий связанных
+//с расширением при его удалении.
+//- Выполняет переадресацию запросов на действия для расширений
+//
+//Менеджер расширений для контроля установленных расширений использует системные коллекции. При обращении к сервису контента
+//используются системный уровень прав для создания необходимых коллекций и получения данных:
+//1. `system_extensions` (System Extensions) - доступна только системным пользователям
+//2. `system_actions` (System Actions) - по умолчанию доступна только системным пользователям, настройки доступа на чтение
+//выдаются пользователям вручную. В зависимости от пользователя в интерфейсе отображаются те или иные доступные действия.
+//
+//Проверка наличия коллекций и создание в случае их отсутствия выполняется в момент установки расширений. После установки
+//расширения в коллекцию `system_extensions` добавляется запись об установленном расширении. Действия добавляются в
+//коллекцию `system_actions` расширениями по собственному усмотрению при установке.
+//
+//Для обращения к расширениям используются права текущего пользователя запрашивающего операцию. Если пользователь не
+//обладает необходимыми правами для выполнения действия то операция вернет ошибку.
+//
+
 // Code generated by protoc-gen-go-grpc. DO NOT EDIT.
+// versions:
+// - protoc-gen-go-grpc v1.3.0
+// - protoc             v3.21.12
+// source: extensions/manager.proto
 
 package extensions
 
@@ -14,6 +45,12 @@ import (
 // Requires gRPC-Go v1.32.0 or later.
 const _ = grpc.SupportPackageIsVersion7
 
+const (
+	ExtensionManager_RegisterExtensions_FullMethodName   = "/extensions.ExtensionManager/RegisterExtensions"
+	ExtensionManager_UnregisterExtensions_FullMethodName = "/extensions.ExtensionManager/UnregisterExtensions"
+	ExtensionManager_ListExtensions_FullMethodName       = "/extensions.ExtensionManager/ListExtensions"
+)
+
 // ExtensionManagerClient is the client API for ExtensionManager service.
 //
 // For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream.
@@ -46,7 +83,7 @@ func NewExtensionManagerClient(cc grpc.ClientConnInterface) ExtensionManagerClie
 
 func (c *extensionManagerClient) RegisterExtensions(ctx context.Context, in *RegisterExtensionsRequest, opts ...grpc.CallOption) (*RegisterExtensionsResponse, error) {
 	out := new(RegisterExtensionsResponse)
-	err := c.cc.Invoke(ctx, "/extensions.ExtensionManager/RegisterExtensions", in, out, opts...)
+	err := c.cc.Invoke(ctx, ExtensionManager_RegisterExtensions_FullMethodName, in, out, opts...)
 	if err != nil {
 		return nil, err
 	}
@@ -55,7 +92,7 @@ func (c *extensionManagerClient) RegisterExtensions(ctx context.Context, in *Reg
 
 func (c *extensionManagerClient) UnregisterExtensions(ctx context.Context, in *UnregisterExtensionsRequest, opts ...grpc.CallOption) (*UnregisterExtensionsResponse, error) {
 	out := new(UnregisterExtensionsResponse)
-	err := c.cc.Invoke(ctx, "/extensions.ExtensionManager/UnregisterExtensions", in, out, opts...)
+	err := c.cc.Invoke(ctx, ExtensionManager_UnregisterExtensions_FullMethodName, in, out, opts...)
 	if err != nil {
 		return nil, err
 	}
@@ -64,7 +101,7 @@ func (c *extensionManagerClient) UnregisterExtensions(ctx context.Context, in *U
 
 func (c *extensionManagerClient) ListExtensions(ctx context.Context, in *ListExtensionsRequest, opts ...grpc.CallOption) (*ListExtensionsResponse, error) {
 	out := new(ListExtensionsResponse)
-	err := c.cc.Invoke(ctx, "/extensions.ExtensionManager/ListExtensions", in, out, opts...)
+	err := c.cc.Invoke(ctx, ExtensionManager_ListExtensions_FullMethodName, in, out, opts...)
 	if err != nil {
 		return nil, err
 	}
@@ -130,7 +167,7 @@ func _ExtensionManager_RegisterExtensions_Handler(srv interface{}, ctx context.C
 	}
 	info := &grpc.UnaryServerInfo{
 		Server:     srv,
-		FullMethod: "/extensions.ExtensionManager/RegisterExtensions",
+		FullMethod: ExtensionManager_RegisterExtensions_FullMethodName,
 	}
 	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
 		return srv.(ExtensionManagerServer).RegisterExtensions(ctx, req.(*RegisterExtensionsRequest))
@@ -148,7 +185,7 @@ func _ExtensionManager_UnregisterExtensions_Handler(srv interface{}, ctx context
 	}
 	info := &grpc.UnaryServerInfo{
 		Server:     srv,
-		FullMethod: "/extensions.ExtensionManager/UnregisterExtensions",
+		FullMethod: ExtensionManager_UnregisterExtensions_FullMethodName,
 	}
 	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
 		return srv.(ExtensionManagerServer).UnregisterExtensions(ctx, req.(*UnregisterExtensionsRequest))
@@ -166,7 +203,7 @@ func _ExtensionManager_ListExtensions_Handler(srv interface{}, ctx context.Conte
 	}
 	info := &grpc.UnaryServerInfo{
 		Server:     srv,
-		FullMethod: "/extensions.ExtensionManager/ListExtensions",
+		FullMethod: ExtensionManager_ListExtensions_FullMethodName,
 	}
 	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
 		return srv.(ExtensionManagerServer).ListExtensions(ctx, req.(*ListExtensionsRequest))
diff --git a/files/files.pb.go b/proto/files/files.pb.go
similarity index 99%
rename from files/files.pb.go
rename to proto/files/files.pb.go
index af16216a872a6d31113ea49628a184bafe5e16ec..aa4c401790f2198c902b0bf2ab2b04f81c37390e 100644
--- a/files/files.pb.go
+++ b/proto/files/files.pb.go
@@ -1,7 +1,7 @@
 // Code generated by protoc-gen-go. DO NOT EDIT.
 // versions:
-// 	protoc-gen-go v1.27.1
-// 	protoc        v3.17.3
+// 	protoc-gen-go v1.29.0
+// 	protoc        v3.21.12
 // source: files/files.proto
 
 package files
@@ -1040,10 +1040,11 @@ var file_files_files_proto_rawDesc = []byte{
 	0x74, 0x65, 0x46, 0x69, 0x6c, 0x65, 0x12, 0x18, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x2e, 0x44,
 	0x65, 0x6c, 0x65, 0x74, 0x65, 0x46, 0x69, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74,
 	0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62,
-	0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x42, 0x2a, 0x5a, 0x28, 0x67, 0x69,
+	0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x42, 0x30, 0x5a, 0x2e, 0x67, 0x69,
 	0x74, 0x2e, 0x70, 0x65, 0x72, 0x78, 0x2e, 0x72, 0x75, 0x2f, 0x70, 0x65, 0x72, 0x78, 0x69, 0x73,
-	0x2f, 0x70, 0x65, 0x72, 0x78, 0x69, 0x73, 0x2d, 0x67, 0x6f, 0x2f, 0x66, 0x69, 0x6c, 0x65, 0x73,
-	0x3b, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
+	0x2f, 0x70, 0x65, 0x72, 0x78, 0x69, 0x73, 0x2d, 0x67, 0x6f, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f,
+	0x2f, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x3b, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x62, 0x06, 0x70, 0x72,
+	0x6f, 0x74, 0x6f, 0x33,
 }
 
 var (
diff --git a/files/files_grpc.pb.go b/proto/files/files_grpc.pb.go
similarity index 86%
rename from files/files_grpc.pb.go
rename to proto/files/files_grpc.pb.go
index e9c3829559e14fccf2674d4651e3c73051fe1544..ee2444091e3d3fa32ee913d3ea76a3de24588c79 100644
--- a/files/files_grpc.pb.go
+++ b/proto/files/files_grpc.pb.go
@@ -1,4 +1,8 @@
 // Code generated by protoc-gen-go-grpc. DO NOT EDIT.
+// versions:
+// - protoc-gen-go-grpc v1.3.0
+// - protoc             v3.21.12
+// source: files/files.proto
 
 package files
 
@@ -15,6 +19,16 @@ import (
 // Requires gRPC-Go v1.32.0 or later.
 const _ = grpc.SupportPackageIsVersion7
 
+const (
+	Files_StartUpload_FullMethodName    = "/files.Files/StartUpload"
+	Files_CompleteUpload_FullMethodName = "/files.Files/CompleteUpload"
+	Files_AbortUpload_FullMethodName    = "/files.Files/AbortUpload"
+	Files_MoveUpload_FullMethodName     = "/files.Files/MoveUpload"
+	Files_Upload_FullMethodName         = "/files.Files/Upload"
+	Files_GetFile_FullMethodName        = "/files.Files/GetFile"
+	Files_DeleteFile_FullMethodName     = "/files.Files/DeleteFile"
+)
+
 // FilesClient is the client API for Files service.
 //
 // For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream.
@@ -42,9 +56,9 @@ type FilesClient interface {
 	// DeleteFile - удаляет файл. Если происходит удаление оригинала,
 	// удаляются и все связанные структуры
 	// Возможны следующие ситуации:
-	//  - Удаление оригинального файла. Удаляется файл и все связанные с ним файлы.
-	//  - Удаление связанного файла. Для удаления конкретного файла передается 'ID', 'Type' и 'Name'
-	//  - Удаления связанных файлов конкретного типа (например, все 'thumbnails'). Передается 'ID' и 'Type'
+	//   - Удаление оригинального файла. Удаляется файл и все связанные с ним файлы.
+	//   - Удаление связанного файла. Для удаления конкретного файла передается 'ID', 'Type' и 'Name'
+	//   - Удаления связанных файлов конкретного типа (например, все 'thumbnails'). Передается 'ID' и 'Type'
 	DeleteFile(ctx context.Context, in *DeleteFileRequest, opts ...grpc.CallOption) (*emptypb.Empty, error)
 }
 
@@ -58,7 +72,7 @@ func NewFilesClient(cc grpc.ClientConnInterface) FilesClient {
 
 func (c *filesClient) StartUpload(ctx context.Context, in *StartUploadRequest, opts ...grpc.CallOption) (*StartUploadResponse, error) {
 	out := new(StartUploadResponse)
-	err := c.cc.Invoke(ctx, "/files.Files/StartUpload", in, out, opts...)
+	err := c.cc.Invoke(ctx, Files_StartUpload_FullMethodName, in, out, opts...)
 	if err != nil {
 		return nil, err
 	}
@@ -67,7 +81,7 @@ func (c *filesClient) StartUpload(ctx context.Context, in *StartUploadRequest, o
 
 func (c *filesClient) CompleteUpload(ctx context.Context, in *CompleteUploadRequest, opts ...grpc.CallOption) (*CompleteUploadResponse, error) {
 	out := new(CompleteUploadResponse)
-	err := c.cc.Invoke(ctx, "/files.Files/CompleteUpload", in, out, opts...)
+	err := c.cc.Invoke(ctx, Files_CompleteUpload_FullMethodName, in, out, opts...)
 	if err != nil {
 		return nil, err
 	}
@@ -76,7 +90,7 @@ func (c *filesClient) CompleteUpload(ctx context.Context, in *CompleteUploadRequ
 
 func (c *filesClient) AbortUpload(ctx context.Context, in *AbortUploadRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) {
 	out := new(emptypb.Empty)
-	err := c.cc.Invoke(ctx, "/files.Files/AbortUpload", in, out, opts...)
+	err := c.cc.Invoke(ctx, Files_AbortUpload_FullMethodName, in, out, opts...)
 	if err != nil {
 		return nil, err
 	}
@@ -85,7 +99,7 @@ func (c *filesClient) AbortUpload(ctx context.Context, in *AbortUploadRequest, o
 
 func (c *filesClient) MoveUpload(ctx context.Context, in *MoveUploadRequest, opts ...grpc.CallOption) (*MoveUploadResponse, error) {
 	out := new(MoveUploadResponse)
-	err := c.cc.Invoke(ctx, "/files.Files/MoveUpload", in, out, opts...)
+	err := c.cc.Invoke(ctx, Files_MoveUpload_FullMethodName, in, out, opts...)
 	if err != nil {
 		return nil, err
 	}
@@ -94,7 +108,7 @@ func (c *filesClient) MoveUpload(ctx context.Context, in *MoveUploadRequest, opt
 
 func (c *filesClient) Upload(ctx context.Context, in *UploadRequest, opts ...grpc.CallOption) (*UploadResponse, error) {
 	out := new(UploadResponse)
-	err := c.cc.Invoke(ctx, "/files.Files/Upload", in, out, opts...)
+	err := c.cc.Invoke(ctx, Files_Upload_FullMethodName, in, out, opts...)
 	if err != nil {
 		return nil, err
 	}
@@ -103,7 +117,7 @@ func (c *filesClient) Upload(ctx context.Context, in *UploadRequest, opts ...grp
 
 func (c *filesClient) GetFile(ctx context.Context, in *GetFileRequest, opts ...grpc.CallOption) (*GetFileResponse, error) {
 	out := new(GetFileResponse)
-	err := c.cc.Invoke(ctx, "/files.Files/GetFile", in, out, opts...)
+	err := c.cc.Invoke(ctx, Files_GetFile_FullMethodName, in, out, opts...)
 	if err != nil {
 		return nil, err
 	}
@@ -112,7 +126,7 @@ func (c *filesClient) GetFile(ctx context.Context, in *GetFileRequest, opts ...g
 
 func (c *filesClient) DeleteFile(ctx context.Context, in *DeleteFileRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) {
 	out := new(emptypb.Empty)
-	err := c.cc.Invoke(ctx, "/files.Files/DeleteFile", in, out, opts...)
+	err := c.cc.Invoke(ctx, Files_DeleteFile_FullMethodName, in, out, opts...)
 	if err != nil {
 		return nil, err
 	}
@@ -146,9 +160,9 @@ type FilesServer interface {
 	// DeleteFile - удаляет файл. Если происходит удаление оригинала,
 	// удаляются и все связанные структуры
 	// Возможны следующие ситуации:
-	//  - Удаление оригинального файла. Удаляется файл и все связанные с ним файлы.
-	//  - Удаление связанного файла. Для удаления конкретного файла передается 'ID', 'Type' и 'Name'
-	//  - Удаления связанных файлов конкретного типа (например, все 'thumbnails'). Передается 'ID' и 'Type'
+	//   - Удаление оригинального файла. Удаляется файл и все связанные с ним файлы.
+	//   - Удаление связанного файла. Для удаления конкретного файла передается 'ID', 'Type' и 'Name'
+	//   - Удаления связанных файлов конкретного типа (например, все 'thumbnails'). Передается 'ID' и 'Type'
 	DeleteFile(context.Context, *DeleteFileRequest) (*emptypb.Empty, error)
 	mustEmbedUnimplementedFilesServer()
 }
@@ -201,7 +215,7 @@ func _Files_StartUpload_Handler(srv interface{}, ctx context.Context, dec func(i
 	}
 	info := &grpc.UnaryServerInfo{
 		Server:     srv,
-		FullMethod: "/files.Files/StartUpload",
+		FullMethod: Files_StartUpload_FullMethodName,
 	}
 	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
 		return srv.(FilesServer).StartUpload(ctx, req.(*StartUploadRequest))
@@ -219,7 +233,7 @@ func _Files_CompleteUpload_Handler(srv interface{}, ctx context.Context, dec fun
 	}
 	info := &grpc.UnaryServerInfo{
 		Server:     srv,
-		FullMethod: "/files.Files/CompleteUpload",
+		FullMethod: Files_CompleteUpload_FullMethodName,
 	}
 	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
 		return srv.(FilesServer).CompleteUpload(ctx, req.(*CompleteUploadRequest))
@@ -237,7 +251,7 @@ func _Files_AbortUpload_Handler(srv interface{}, ctx context.Context, dec func(i
 	}
 	info := &grpc.UnaryServerInfo{
 		Server:     srv,
-		FullMethod: "/files.Files/AbortUpload",
+		FullMethod: Files_AbortUpload_FullMethodName,
 	}
 	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
 		return srv.(FilesServer).AbortUpload(ctx, req.(*AbortUploadRequest))
@@ -255,7 +269,7 @@ func _Files_MoveUpload_Handler(srv interface{}, ctx context.Context, dec func(in
 	}
 	info := &grpc.UnaryServerInfo{
 		Server:     srv,
-		FullMethod: "/files.Files/MoveUpload",
+		FullMethod: Files_MoveUpload_FullMethodName,
 	}
 	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
 		return srv.(FilesServer).MoveUpload(ctx, req.(*MoveUploadRequest))
@@ -273,7 +287,7 @@ func _Files_Upload_Handler(srv interface{}, ctx context.Context, dec func(interf
 	}
 	info := &grpc.UnaryServerInfo{
 		Server:     srv,
-		FullMethod: "/files.Files/Upload",
+		FullMethod: Files_Upload_FullMethodName,
 	}
 	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
 		return srv.(FilesServer).Upload(ctx, req.(*UploadRequest))
@@ -291,7 +305,7 @@ func _Files_GetFile_Handler(srv interface{}, ctx context.Context, dec func(inter
 	}
 	info := &grpc.UnaryServerInfo{
 		Server:     srv,
-		FullMethod: "/files.Files/GetFile",
+		FullMethod: Files_GetFile_FullMethodName,
 	}
 	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
 		return srv.(FilesServer).GetFile(ctx, req.(*GetFileRequest))
@@ -309,7 +323,7 @@ func _Files_DeleteFile_Handler(srv interface{}, ctx context.Context, dec func(in
 	}
 	info := &grpc.UnaryServerInfo{
 		Server:     srv,
-		FullMethod: "/files.Files/DeleteFile",
+		FullMethod: Files_DeleteFile_FullMethodName,
 	}
 	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
 		return srv.(FilesServer).DeleteFile(ctx, req.(*DeleteFileRequest))
diff --git a/images/images.pb.go b/proto/images/images.pb.go
similarity index 97%
rename from images/images.pb.go
rename to proto/images/images.pb.go
index 9b031f35c9d909cf5367cada87027cb342c74bd7..0142bf158096fa9dcb535aabc323e9e405dee60f 100644
--- a/images/images.pb.go
+++ b/proto/images/images.pb.go
@@ -1,13 +1,13 @@
 // Code generated by protoc-gen-go. DO NOT EDIT.
 // versions:
-// 	protoc-gen-go v1.27.1
-// 	protoc        v3.17.3
+// 	protoc-gen-go v1.29.0
+// 	protoc        v3.21.12
 // source: images/images.proto
 
 package images
 
 import (
-	files "git.perx.ru/perxis/perxis-go/files"
+	files "git.perx.ru/perxis/perxis-go/proto/files"
 	protoreflect "google.golang.org/protobuf/reflect/protoreflect"
 	protoimpl "google.golang.org/protobuf/runtime/protoimpl"
 	reflect "reflect"
@@ -250,11 +250,11 @@ var file_images_images_proto_rawDesc = []byte{
 	0x3a, 0x0a, 0x06, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x73, 0x12, 0x30, 0x0a, 0x03, 0x47, 0x65, 0x74,
 	0x12, 0x12, 0x2e, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x73, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71,
 	0x75, 0x65, 0x73, 0x74, 0x1a, 0x13, 0x2e, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x73, 0x2e, 0x47, 0x65,
-	0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x42, 0x2c, 0x5a, 0x2a, 0x67,
+	0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x42, 0x32, 0x5a, 0x30, 0x67,
 	0x69, 0x74, 0x2e, 0x70, 0x65, 0x72, 0x78, 0x2e, 0x72, 0x75, 0x2f, 0x70, 0x65, 0x72, 0x78, 0x69,
-	0x73, 0x2f, 0x70, 0x65, 0x72, 0x78, 0x69, 0x73, 0x2d, 0x67, 0x6f, 0x2f, 0x69, 0x6d, 0x61, 0x67,
-	0x65, 0x73, 0x3b, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x73, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f,
-	0x33,
+	0x73, 0x2f, 0x70, 0x65, 0x72, 0x78, 0x69, 0x73, 0x2d, 0x67, 0x6f, 0x2f, 0x70, 0x72, 0x6f, 0x74,
+	0x6f, 0x2f, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x73, 0x3b, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x73, 0x62,
+	0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
 }
 
 var (
diff --git a/images/images_grpc.pb.go b/proto/images/images_grpc.pb.go
similarity index 85%
rename from images/images_grpc.pb.go
rename to proto/images/images_grpc.pb.go
index 974181f2e64d396d655807382ff16bed0bb99318..94d3cef36b1c51b7b0256d54a4fc26936cc9fcec 100644
--- a/images/images_grpc.pb.go
+++ b/proto/images/images_grpc.pb.go
@@ -1,4 +1,8 @@
 // Code generated by protoc-gen-go-grpc. DO NOT EDIT.
+// versions:
+// - protoc-gen-go-grpc v1.3.0
+// - protoc             v3.21.12
+// source: images/images.proto
 
 package images
 
@@ -14,6 +18,10 @@ import (
 // Requires gRPC-Go v1.32.0 or later.
 const _ = grpc.SupportPackageIsVersion7
 
+const (
+	Images_Get_FullMethodName = "/images.Images/Get"
+)
+
 // ImagesClient is the client API for Images service.
 //
 // For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream.
@@ -21,10 +29,11 @@ type ImagesClient interface {
 	// Get - к файлу, идентификатор которого передан в запросе, применяются параметры.
 	// Может быть передано несколько параметров, порядок учитывается при обработке
 	// Допустимые операции:
-	//  - crop (ширина, высота)
-	//  - fit (ширина, высота)
-	//  - resize (ширина, высота)
-	//  - format (один из форматов [ png, jpeg, jpg, gif ]
+	//   - crop (ширина, высота)
+	//   - fit (ширина, высота)
+	//   - resize (ширина, высота)
+	//   - format (один из форматов [ png, jpeg, jpg, gif ]
+	//
 	// Возвращает объект File с заполненным полем File.URL
 	Get(ctx context.Context, in *GetRequest, opts ...grpc.CallOption) (*GetResponse, error)
 }
@@ -39,7 +48,7 @@ func NewImagesClient(cc grpc.ClientConnInterface) ImagesClient {
 
 func (c *imagesClient) Get(ctx context.Context, in *GetRequest, opts ...grpc.CallOption) (*GetResponse, error) {
 	out := new(GetResponse)
-	err := c.cc.Invoke(ctx, "/images.Images/Get", in, out, opts...)
+	err := c.cc.Invoke(ctx, Images_Get_FullMethodName, in, out, opts...)
 	if err != nil {
 		return nil, err
 	}
@@ -53,10 +62,11 @@ type ImagesServer interface {
 	// Get - к файлу, идентификатор которого передан в запросе, применяются параметры.
 	// Может быть передано несколько параметров, порядок учитывается при обработке
 	// Допустимые операции:
-	//  - crop (ширина, высота)
-	//  - fit (ширина, высота)
-	//  - resize (ширина, высота)
-	//  - format (один из форматов [ png, jpeg, jpg, gif ]
+	//   - crop (ширина, высота)
+	//   - fit (ширина, высота)
+	//   - resize (ширина, высота)
+	//   - format (один из форматов [ png, jpeg, jpg, gif ]
+	//
 	// Возвращает объект File с заполненным полем File.URL
 	Get(context.Context, *GetRequest) (*GetResponse, error)
 	mustEmbedUnimplementedImagesServer()
@@ -92,7 +102,7 @@ func _Images_Get_Handler(srv interface{}, ctx context.Context, dec func(interfac
 	}
 	info := &grpc.UnaryServerInfo{
 		Server:     srv,
-		FullMethod: "/images.Images/Get",
+		FullMethod: Images_Get_FullMethodName,
 	}
 	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
 		return srv.(ImagesServer).Get(ctx, req.(*GetRequest))
diff --git a/invitations/invitations.pb.go b/proto/invitations/invitations.pb.go
similarity index 99%
rename from invitations/invitations.pb.go
rename to proto/invitations/invitations.pb.go
index 659d44ab1ec4d7709fa8bb9c2e2c64212b55cbbb..7ebe5e43aa3cd9463ba7c00c3e60fbdafc262db8 100644
--- a/invitations/invitations.pb.go
+++ b/proto/invitations/invitations.pb.go
@@ -1,7 +1,7 @@
 // Code generated by protoc-gen-go. DO NOT EDIT.
 // versions:
-// 	protoc-gen-go v1.27.1
-// 	protoc        v3.17.3
+// 	protoc-gen-go v1.29.0
+// 	protoc        v3.21.12
 // source: invitations/invitations.proto
 
 package invitations
@@ -1001,11 +1001,11 @@ var file_invitations_invitations_proto_rawDesc = []byte{
 	0x74, 0x2e, 0x69, 0x6e, 0x76, 0x69, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x44, 0x65,
 	0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f,
 	0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d,
-	0x70, 0x74, 0x79, 0x22, 0x00, 0x42, 0x36, 0x5a, 0x34, 0x67, 0x69, 0x74, 0x2e, 0x70, 0x65, 0x72,
+	0x70, 0x74, 0x79, 0x22, 0x00, 0x42, 0x3c, 0x5a, 0x3a, 0x67, 0x69, 0x74, 0x2e, 0x70, 0x65, 0x72,
 	0x78, 0x2e, 0x72, 0x75, 0x2f, 0x70, 0x65, 0x72, 0x78, 0x69, 0x73, 0x2f, 0x70, 0x65, 0x72, 0x78,
-	0x69, 0x73, 0x2d, 0x67, 0x6f, 0x2f, 0x69, 0x6e, 0x76, 0x69, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e,
-	0x73, 0x3b, 0x69, 0x6e, 0x76, 0x69, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x62, 0x06, 0x70,
-	0x72, 0x6f, 0x74, 0x6f, 0x33,
+	0x69, 0x73, 0x2d, 0x67, 0x6f, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x69, 0x6e, 0x76, 0x69,
+	0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x3b, 0x69, 0x6e, 0x76, 0x69, 0x74, 0x61, 0x74, 0x69,
+	0x6f, 0x6e, 0x73, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
 }
 
 var (
diff --git a/invitations/invitations_grpc.pb.go b/proto/invitations/invitations_grpc.pb.go
similarity index 88%
rename from invitations/invitations_grpc.pb.go
rename to proto/invitations/invitations_grpc.pb.go
index e9508c9578b6ab7c238cf81b1950e933a6241d69..cb7a47924a439fae10ca3dbc8ae37951e9b8a09b 100644
--- a/invitations/invitations_grpc.pb.go
+++ b/proto/invitations/invitations_grpc.pb.go
@@ -1,4 +1,8 @@
 // Code generated by protoc-gen-go-grpc. DO NOT EDIT.
+// versions:
+// - protoc-gen-go-grpc v1.3.0
+// - protoc             v3.21.12
+// source: invitations/invitations.proto
 
 package invitations
 
@@ -15,6 +19,14 @@ import (
 // Requires gRPC-Go v1.32.0 or later.
 const _ = grpc.SupportPackageIsVersion7
 
+const (
+	Invitations_Create_FullMethodName = "/content.invitations.Invitations/Create"
+	Invitations_Get_FullMethodName    = "/content.invitations.Invitations/Get"
+	Invitations_Accept_FullMethodName = "/content.invitations.Invitations/Accept"
+	Invitations_Find_FullMethodName   = "/content.invitations.Invitations/Find"
+	Invitations_Delete_FullMethodName = "/content.invitations.Invitations/Delete"
+)
+
 // InvitationsClient is the client API for Invitations service.
 //
 // For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream.
@@ -40,7 +52,7 @@ func NewInvitationsClient(cc grpc.ClientConnInterface) InvitationsClient {
 
 func (c *invitationsClient) Create(ctx context.Context, in *CreateRequest, opts ...grpc.CallOption) (*CreateResponse, error) {
 	out := new(CreateResponse)
-	err := c.cc.Invoke(ctx, "/content.invitations.Invitations/Create", in, out, opts...)
+	err := c.cc.Invoke(ctx, Invitations_Create_FullMethodName, in, out, opts...)
 	if err != nil {
 		return nil, err
 	}
@@ -49,7 +61,7 @@ func (c *invitationsClient) Create(ctx context.Context, in *CreateRequest, opts
 
 func (c *invitationsClient) Get(ctx context.Context, in *GetRequest, opts ...grpc.CallOption) (*GetResponse, error) {
 	out := new(GetResponse)
-	err := c.cc.Invoke(ctx, "/content.invitations.Invitations/Get", in, out, opts...)
+	err := c.cc.Invoke(ctx, Invitations_Get_FullMethodName, in, out, opts...)
 	if err != nil {
 		return nil, err
 	}
@@ -58,7 +70,7 @@ func (c *invitationsClient) Get(ctx context.Context, in *GetRequest, opts ...grp
 
 func (c *invitationsClient) Accept(ctx context.Context, in *AcceptRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) {
 	out := new(emptypb.Empty)
-	err := c.cc.Invoke(ctx, "/content.invitations.Invitations/Accept", in, out, opts...)
+	err := c.cc.Invoke(ctx, Invitations_Accept_FullMethodName, in, out, opts...)
 	if err != nil {
 		return nil, err
 	}
@@ -67,7 +79,7 @@ func (c *invitationsClient) Accept(ctx context.Context, in *AcceptRequest, opts
 
 func (c *invitationsClient) Find(ctx context.Context, in *FindRequest, opts ...grpc.CallOption) (*FindResponse, error) {
 	out := new(FindResponse)
-	err := c.cc.Invoke(ctx, "/content.invitations.Invitations/Find", in, out, opts...)
+	err := c.cc.Invoke(ctx, Invitations_Find_FullMethodName, in, out, opts...)
 	if err != nil {
 		return nil, err
 	}
@@ -76,7 +88,7 @@ func (c *invitationsClient) Find(ctx context.Context, in *FindRequest, opts ...g
 
 func (c *invitationsClient) Delete(ctx context.Context, in *DeleteRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) {
 	out := new(emptypb.Empty)
-	err := c.cc.Invoke(ctx, "/content.invitations.Invitations/Delete", in, out, opts...)
+	err := c.cc.Invoke(ctx, Invitations_Delete_FullMethodName, in, out, opts...)
 	if err != nil {
 		return nil, err
 	}
@@ -141,7 +153,7 @@ func _Invitations_Create_Handler(srv interface{}, ctx context.Context, dec func(
 	}
 	info := &grpc.UnaryServerInfo{
 		Server:     srv,
-		FullMethod: "/content.invitations.Invitations/Create",
+		FullMethod: Invitations_Create_FullMethodName,
 	}
 	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
 		return srv.(InvitationsServer).Create(ctx, req.(*CreateRequest))
@@ -159,7 +171,7 @@ func _Invitations_Get_Handler(srv interface{}, ctx context.Context, dec func(int
 	}
 	info := &grpc.UnaryServerInfo{
 		Server:     srv,
-		FullMethod: "/content.invitations.Invitations/Get",
+		FullMethod: Invitations_Get_FullMethodName,
 	}
 	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
 		return srv.(InvitationsServer).Get(ctx, req.(*GetRequest))
@@ -177,7 +189,7 @@ func _Invitations_Accept_Handler(srv interface{}, ctx context.Context, dec func(
 	}
 	info := &grpc.UnaryServerInfo{
 		Server:     srv,
-		FullMethod: "/content.invitations.Invitations/Accept",
+		FullMethod: Invitations_Accept_FullMethodName,
 	}
 	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
 		return srv.(InvitationsServer).Accept(ctx, req.(*AcceptRequest))
@@ -195,7 +207,7 @@ func _Invitations_Find_Handler(srv interface{}, ctx context.Context, dec func(in
 	}
 	info := &grpc.UnaryServerInfo{
 		Server:     srv,
-		FullMethod: "/content.invitations.Invitations/Find",
+		FullMethod: Invitations_Find_FullMethodName,
 	}
 	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
 		return srv.(InvitationsServer).Find(ctx, req.(*FindRequest))
@@ -213,7 +225,7 @@ func _Invitations_Delete_Handler(srv interface{}, ctx context.Context, dec func(
 	}
 	info := &grpc.UnaryServerInfo{
 		Server:     srv,
-		FullMethod: "/content.invitations.Invitations/Delete",
+		FullMethod: Invitations_Delete_FullMethodName,
 	}
 	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
 		return srv.(InvitationsServer).Delete(ctx, req.(*DeleteRequest))
diff --git a/items/items.pb.go b/proto/items/items.pb.go
similarity index 99%
rename from items/items.pb.go
rename to proto/items/items.pb.go
index 2f1433e16610af90795156ce66d0aeb8860df4f0..40162ab74e97b2113239872d374e03dccd97d3cd 100644
--- a/items/items.pb.go
+++ b/proto/items/items.pb.go
@@ -8,14 +8,14 @@
 
 // Code generated by protoc-gen-go. DO NOT EDIT.
 // versions:
-// 	protoc-gen-go v1.27.1
-// 	protoc        v3.17.3
+// 	protoc-gen-go v1.29.0
+// 	protoc        v3.21.12
 // source: items/items.proto
 
 package items
 
 import (
-	common "git.perx.ru/perxis/perxis-go/common"
+	common "git.perx.ru/perxis/perxis-go/proto/common"
 	protoreflect "google.golang.org/protobuf/reflect/protoreflect"
 	protoimpl "google.golang.org/protobuf/runtime/protoimpl"
 	emptypb "google.golang.org/protobuf/types/known/emptypb"
@@ -359,7 +359,7 @@ func (x *Permissions) GetHardDelete() bool {
 	return false
 }
 
-//*
+// *
 // Пользовательская запись
 type Item struct {
 	state         protoimpl.MessageState
@@ -2696,7 +2696,7 @@ func (x *AggregateRequest) GetOptions() *AggregateOptions {
 	return nil
 }
 
-//*
+// *
 // Содержит в себе набор `название:значение`. Название соответствует переданному в AggregateOptions ключу.
 type AggregateResponse struct {
 	state         protoimpl.MessageState
@@ -3123,7 +3123,7 @@ func (x *ListRevisionsResponse) GetItems() []*Item {
 	return nil
 }
 
-//*
+// *
 // Запрос на архивирование элемента
 type ArchiveRequest struct {
 	state         protoimpl.MessageState
@@ -3881,10 +3881,11 @@ var file_items_items_proto_rawDesc = []byte{
 	0x1f, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x2e,
 	0x55, 0x6e, 0x61, 0x72, 0x63, 0x68, 0x69, 0x76, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74,
 	0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62,
-	0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x42, 0x2a, 0x5a, 0x28, 0x67, 0x69,
+	0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x42, 0x30, 0x5a, 0x2e, 0x67, 0x69,
 	0x74, 0x2e, 0x70, 0x65, 0x72, 0x78, 0x2e, 0x72, 0x75, 0x2f, 0x70, 0x65, 0x72, 0x78, 0x69, 0x73,
-	0x2f, 0x70, 0x65, 0x72, 0x78, 0x69, 0x73, 0x2d, 0x67, 0x6f, 0x2f, 0x69, 0x74, 0x65, 0x6d, 0x73,
-	0x3b, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
+	0x2f, 0x70, 0x65, 0x72, 0x78, 0x69, 0x73, 0x2d, 0x67, 0x6f, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f,
+	0x2f, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x3b, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x62, 0x06, 0x70, 0x72,
+	0x6f, 0x74, 0x6f, 0x33,
 }
 
 var (
diff --git a/items/items_grpc.pb.go b/proto/items/items_grpc.pb.go
similarity index 86%
rename from items/items_grpc.pb.go
rename to proto/items/items_grpc.pb.go
index f87256b49d9dccec87f5842ea244a63a854ed790..7c7d321a9b1a57290a874dc8723679e9b6e755f2 100644
--- a/items/items_grpc.pb.go
+++ b/proto/items/items_grpc.pb.go
@@ -1,4 +1,16 @@
+//*
+// # Items
+//
+// API Сервиса работы с пользовательским записями (Items)
+//
+// Предоставляет доступ к записям пользовательских коллекций
+//
+
 // Code generated by protoc-gen-go-grpc. DO NOT EDIT.
+// versions:
+// - protoc-gen-go-grpc v1.3.0
+// - protoc             v3.21.12
+// source: items/items.proto
 
 package items
 
@@ -15,20 +27,41 @@ import (
 // Requires gRPC-Go v1.32.0 or later.
 const _ = grpc.SupportPackageIsVersion7
 
+const (
+	Items_Create_FullMethodName             = "/content.items.Items/Create"
+	Items_Introspect_FullMethodName         = "/content.items.Items/Introspect"
+	Items_Get_FullMethodName                = "/content.items.Items/Get"
+	Items_Find_FullMethodName               = "/content.items.Items/Find"
+	Items_Update_FullMethodName             = "/content.items.Items/Update"
+	Items_Delete_FullMethodName             = "/content.items.Items/Delete"
+	Items_Undelete_FullMethodName           = "/content.items.Items/Undelete"
+	Items_Publish_FullMethodName            = "/content.items.Items/Publish"
+	Items_Unpublish_FullMethodName          = "/content.items.Items/Unpublish"
+	Items_GetPublished_FullMethodName       = "/content.items.Items/GetPublished"
+	Items_FindPublished_FullMethodName      = "/content.items.Items/FindPublished"
+	Items_Aggregate_FullMethodName          = "/content.items.Items/Aggregate"
+	Items_AggregatePublished_FullMethodName = "/content.items.Items/AggregatePublished"
+	Items_GetRevision_FullMethodName        = "/content.items.Items/GetRevision"
+	Items_ListRevisions_FullMethodName      = "/content.items.Items/ListRevisions"
+	Items_Archive_FullMethodName            = "/content.items.Items/Archive"
+	Items_FindArchived_FullMethodName       = "/content.items.Items/FindArchived"
+	Items_Unarchive_FullMethodName          = "/content.items.Items/Unarchive"
+)
+
 // ItemsClient is the client API for Items service.
 //
 // For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream.
 type ItemsClient interface {
-	//*
+	// *
 	// Создать запись
 	Create(ctx context.Context, in *CreateRequest, opts ...grpc.CallOption) (*CreateResponse, error)
-	//*
+	// *
 	// Валидация данных записи
 	Introspect(ctx context.Context, in *IntrospectRequest, opts ...grpc.CallOption) (*IntrospectResponse, error)
-	//*
+	// *
 	// Получение записи по идентификатору
 	Get(ctx context.Context, in *GetRequest, opts ...grpc.CallOption) (*GetResponse, error)
-	//*
+	// *
 	// Поиск по текущим записям
 	Find(ctx context.Context, in *FindRequest, opts ...grpc.CallOption) (*FindResponse, error)
 	Update(ctx context.Context, in *UpdateRequest, opts ...grpc.CallOption) (*emptypb.Empty, error)
@@ -38,10 +71,10 @@ type ItemsClient interface {
 	Unpublish(ctx context.Context, in *UnpublishRequest, opts ...grpc.CallOption) (*emptypb.Empty, error)
 	GetPublished(ctx context.Context, in *GetPublishedRequest, opts ...grpc.CallOption) (*GetPublishedResponse, error)
 	FindPublished(ctx context.Context, in *FindPublishedRequest, opts ...grpc.CallOption) (*FindPublishedResponse, error)
-	//*
+	// *
 	// Расчет значений по существующим данным. Например, получение среднего значения поля
 	Aggregate(ctx context.Context, in *AggregateRequest, opts ...grpc.CallOption) (*AggregateResponse, error)
-	//*
+	// *
 	// Расчет значений по существующим **опубликованным** данным.
 	AggregatePublished(ctx context.Context, in *AggregatePublishedRequest, opts ...grpc.CallOption) (*AggregatePublishedResponse, error)
 	GetRevision(ctx context.Context, in *GetRevisionRequest, opts ...grpc.CallOption) (*GetRevisionResponse, error)
@@ -61,7 +94,7 @@ func NewItemsClient(cc grpc.ClientConnInterface) ItemsClient {
 
 func (c *itemsClient) Create(ctx context.Context, in *CreateRequest, opts ...grpc.CallOption) (*CreateResponse, error) {
 	out := new(CreateResponse)
-	err := c.cc.Invoke(ctx, "/content.items.Items/Create", in, out, opts...)
+	err := c.cc.Invoke(ctx, Items_Create_FullMethodName, in, out, opts...)
 	if err != nil {
 		return nil, err
 	}
@@ -70,7 +103,7 @@ func (c *itemsClient) Create(ctx context.Context, in *CreateRequest, opts ...grp
 
 func (c *itemsClient) Introspect(ctx context.Context, in *IntrospectRequest, opts ...grpc.CallOption) (*IntrospectResponse, error) {
 	out := new(IntrospectResponse)
-	err := c.cc.Invoke(ctx, "/content.items.Items/Introspect", in, out, opts...)
+	err := c.cc.Invoke(ctx, Items_Introspect_FullMethodName, in, out, opts...)
 	if err != nil {
 		return nil, err
 	}
@@ -79,7 +112,7 @@ func (c *itemsClient) Introspect(ctx context.Context, in *IntrospectRequest, opt
 
 func (c *itemsClient) Get(ctx context.Context, in *GetRequest, opts ...grpc.CallOption) (*GetResponse, error) {
 	out := new(GetResponse)
-	err := c.cc.Invoke(ctx, "/content.items.Items/Get", in, out, opts...)
+	err := c.cc.Invoke(ctx, Items_Get_FullMethodName, in, out, opts...)
 	if err != nil {
 		return nil, err
 	}
@@ -88,7 +121,7 @@ func (c *itemsClient) Get(ctx context.Context, in *GetRequest, opts ...grpc.Call
 
 func (c *itemsClient) Find(ctx context.Context, in *FindRequest, opts ...grpc.CallOption) (*FindResponse, error) {
 	out := new(FindResponse)
-	err := c.cc.Invoke(ctx, "/content.items.Items/Find", in, out, opts...)
+	err := c.cc.Invoke(ctx, Items_Find_FullMethodName, in, out, opts...)
 	if err != nil {
 		return nil, err
 	}
@@ -97,7 +130,7 @@ func (c *itemsClient) Find(ctx context.Context, in *FindRequest, opts ...grpc.Ca
 
 func (c *itemsClient) Update(ctx context.Context, in *UpdateRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) {
 	out := new(emptypb.Empty)
-	err := c.cc.Invoke(ctx, "/content.items.Items/Update", in, out, opts...)
+	err := c.cc.Invoke(ctx, Items_Update_FullMethodName, in, out, opts...)
 	if err != nil {
 		return nil, err
 	}
@@ -106,7 +139,7 @@ func (c *itemsClient) Update(ctx context.Context, in *UpdateRequest, opts ...grp
 
 func (c *itemsClient) Delete(ctx context.Context, in *DeleteRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) {
 	out := new(emptypb.Empty)
-	err := c.cc.Invoke(ctx, "/content.items.Items/Delete", in, out, opts...)
+	err := c.cc.Invoke(ctx, Items_Delete_FullMethodName, in, out, opts...)
 	if err != nil {
 		return nil, err
 	}
@@ -115,7 +148,7 @@ func (c *itemsClient) Delete(ctx context.Context, in *DeleteRequest, opts ...grp
 
 func (c *itemsClient) Undelete(ctx context.Context, in *UndeleteRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) {
 	out := new(emptypb.Empty)
-	err := c.cc.Invoke(ctx, "/content.items.Items/Undelete", in, out, opts...)
+	err := c.cc.Invoke(ctx, Items_Undelete_FullMethodName, in, out, opts...)
 	if err != nil {
 		return nil, err
 	}
@@ -124,7 +157,7 @@ func (c *itemsClient) Undelete(ctx context.Context, in *UndeleteRequest, opts ..
 
 func (c *itemsClient) Publish(ctx context.Context, in *PublishRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) {
 	out := new(emptypb.Empty)
-	err := c.cc.Invoke(ctx, "/content.items.Items/Publish", in, out, opts...)
+	err := c.cc.Invoke(ctx, Items_Publish_FullMethodName, in, out, opts...)
 	if err != nil {
 		return nil, err
 	}
@@ -133,7 +166,7 @@ func (c *itemsClient) Publish(ctx context.Context, in *PublishRequest, opts ...g
 
 func (c *itemsClient) Unpublish(ctx context.Context, in *UnpublishRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) {
 	out := new(emptypb.Empty)
-	err := c.cc.Invoke(ctx, "/content.items.Items/Unpublish", in, out, opts...)
+	err := c.cc.Invoke(ctx, Items_Unpublish_FullMethodName, in, out, opts...)
 	if err != nil {
 		return nil, err
 	}
@@ -142,7 +175,7 @@ func (c *itemsClient) Unpublish(ctx context.Context, in *UnpublishRequest, opts
 
 func (c *itemsClient) GetPublished(ctx context.Context, in *GetPublishedRequest, opts ...grpc.CallOption) (*GetPublishedResponse, error) {
 	out := new(GetPublishedResponse)
-	err := c.cc.Invoke(ctx, "/content.items.Items/GetPublished", in, out, opts...)
+	err := c.cc.Invoke(ctx, Items_GetPublished_FullMethodName, in, out, opts...)
 	if err != nil {
 		return nil, err
 	}
@@ -151,7 +184,7 @@ func (c *itemsClient) GetPublished(ctx context.Context, in *GetPublishedRequest,
 
 func (c *itemsClient) FindPublished(ctx context.Context, in *FindPublishedRequest, opts ...grpc.CallOption) (*FindPublishedResponse, error) {
 	out := new(FindPublishedResponse)
-	err := c.cc.Invoke(ctx, "/content.items.Items/FindPublished", in, out, opts...)
+	err := c.cc.Invoke(ctx, Items_FindPublished_FullMethodName, in, out, opts...)
 	if err != nil {
 		return nil, err
 	}
@@ -160,7 +193,7 @@ func (c *itemsClient) FindPublished(ctx context.Context, in *FindPublishedReques
 
 func (c *itemsClient) Aggregate(ctx context.Context, in *AggregateRequest, opts ...grpc.CallOption) (*AggregateResponse, error) {
 	out := new(AggregateResponse)
-	err := c.cc.Invoke(ctx, "/content.items.Items/Aggregate", in, out, opts...)
+	err := c.cc.Invoke(ctx, Items_Aggregate_FullMethodName, in, out, opts...)
 	if err != nil {
 		return nil, err
 	}
@@ -169,7 +202,7 @@ func (c *itemsClient) Aggregate(ctx context.Context, in *AggregateRequest, opts
 
 func (c *itemsClient) AggregatePublished(ctx context.Context, in *AggregatePublishedRequest, opts ...grpc.CallOption) (*AggregatePublishedResponse, error) {
 	out := new(AggregatePublishedResponse)
-	err := c.cc.Invoke(ctx, "/content.items.Items/AggregatePublished", in, out, opts...)
+	err := c.cc.Invoke(ctx, Items_AggregatePublished_FullMethodName, in, out, opts...)
 	if err != nil {
 		return nil, err
 	}
@@ -178,7 +211,7 @@ func (c *itemsClient) AggregatePublished(ctx context.Context, in *AggregatePubli
 
 func (c *itemsClient) GetRevision(ctx context.Context, in *GetRevisionRequest, opts ...grpc.CallOption) (*GetRevisionResponse, error) {
 	out := new(GetRevisionResponse)
-	err := c.cc.Invoke(ctx, "/content.items.Items/GetRevision", in, out, opts...)
+	err := c.cc.Invoke(ctx, Items_GetRevision_FullMethodName, in, out, opts...)
 	if err != nil {
 		return nil, err
 	}
@@ -187,7 +220,7 @@ func (c *itemsClient) GetRevision(ctx context.Context, in *GetRevisionRequest, o
 
 func (c *itemsClient) ListRevisions(ctx context.Context, in *ListRevisionsRequest, opts ...grpc.CallOption) (*ListRevisionsResponse, error) {
 	out := new(ListRevisionsResponse)
-	err := c.cc.Invoke(ctx, "/content.items.Items/ListRevisions", in, out, opts...)
+	err := c.cc.Invoke(ctx, Items_ListRevisions_FullMethodName, in, out, opts...)
 	if err != nil {
 		return nil, err
 	}
@@ -196,7 +229,7 @@ func (c *itemsClient) ListRevisions(ctx context.Context, in *ListRevisionsReques
 
 func (c *itemsClient) Archive(ctx context.Context, in *ArchiveRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) {
 	out := new(emptypb.Empty)
-	err := c.cc.Invoke(ctx, "/content.items.Items/Archive", in, out, opts...)
+	err := c.cc.Invoke(ctx, Items_Archive_FullMethodName, in, out, opts...)
 	if err != nil {
 		return nil, err
 	}
@@ -205,7 +238,7 @@ func (c *itemsClient) Archive(ctx context.Context, in *ArchiveRequest, opts ...g
 
 func (c *itemsClient) FindArchived(ctx context.Context, in *FindArchivedRequest, opts ...grpc.CallOption) (*FindArchivedResponse, error) {
 	out := new(FindArchivedResponse)
-	err := c.cc.Invoke(ctx, "/content.items.Items/FindArchived", in, out, opts...)
+	err := c.cc.Invoke(ctx, Items_FindArchived_FullMethodName, in, out, opts...)
 	if err != nil {
 		return nil, err
 	}
@@ -214,7 +247,7 @@ func (c *itemsClient) FindArchived(ctx context.Context, in *FindArchivedRequest,
 
 func (c *itemsClient) Unarchive(ctx context.Context, in *UnarchiveRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) {
 	out := new(emptypb.Empty)
-	err := c.cc.Invoke(ctx, "/content.items.Items/Unarchive", in, out, opts...)
+	err := c.cc.Invoke(ctx, Items_Unarchive_FullMethodName, in, out, opts...)
 	if err != nil {
 		return nil, err
 	}
@@ -225,16 +258,16 @@ func (c *itemsClient) Unarchive(ctx context.Context, in *UnarchiveRequest, opts
 // All implementations must embed UnimplementedItemsServer
 // for forward compatibility
 type ItemsServer interface {
-	//*
+	// *
 	// Создать запись
 	Create(context.Context, *CreateRequest) (*CreateResponse, error)
-	//*
+	// *
 	// Валидация данных записи
 	Introspect(context.Context, *IntrospectRequest) (*IntrospectResponse, error)
-	//*
+	// *
 	// Получение записи по идентификатору
 	Get(context.Context, *GetRequest) (*GetResponse, error)
-	//*
+	// *
 	// Поиск по текущим записям
 	Find(context.Context, *FindRequest) (*FindResponse, error)
 	Update(context.Context, *UpdateRequest) (*emptypb.Empty, error)
@@ -244,10 +277,10 @@ type ItemsServer interface {
 	Unpublish(context.Context, *UnpublishRequest) (*emptypb.Empty, error)
 	GetPublished(context.Context, *GetPublishedRequest) (*GetPublishedResponse, error)
 	FindPublished(context.Context, *FindPublishedRequest) (*FindPublishedResponse, error)
-	//*
+	// *
 	// Расчет значений по существующим данным. Например, получение среднего значения поля
 	Aggregate(context.Context, *AggregateRequest) (*AggregateResponse, error)
-	//*
+	// *
 	// Расчет значений по существующим **опубликованным** данным.
 	AggregatePublished(context.Context, *AggregatePublishedRequest) (*AggregatePublishedResponse, error)
 	GetRevision(context.Context, *GetRevisionRequest) (*GetRevisionResponse, error)
@@ -339,7 +372,7 @@ func _Items_Create_Handler(srv interface{}, ctx context.Context, dec func(interf
 	}
 	info := &grpc.UnaryServerInfo{
 		Server:     srv,
-		FullMethod: "/content.items.Items/Create",
+		FullMethod: Items_Create_FullMethodName,
 	}
 	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
 		return srv.(ItemsServer).Create(ctx, req.(*CreateRequest))
@@ -357,7 +390,7 @@ func _Items_Introspect_Handler(srv interface{}, ctx context.Context, dec func(in
 	}
 	info := &grpc.UnaryServerInfo{
 		Server:     srv,
-		FullMethod: "/content.items.Items/Introspect",
+		FullMethod: Items_Introspect_FullMethodName,
 	}
 	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
 		return srv.(ItemsServer).Introspect(ctx, req.(*IntrospectRequest))
@@ -375,7 +408,7 @@ func _Items_Get_Handler(srv interface{}, ctx context.Context, dec func(interface
 	}
 	info := &grpc.UnaryServerInfo{
 		Server:     srv,
-		FullMethod: "/content.items.Items/Get",
+		FullMethod: Items_Get_FullMethodName,
 	}
 	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
 		return srv.(ItemsServer).Get(ctx, req.(*GetRequest))
@@ -393,7 +426,7 @@ func _Items_Find_Handler(srv interface{}, ctx context.Context, dec func(interfac
 	}
 	info := &grpc.UnaryServerInfo{
 		Server:     srv,
-		FullMethod: "/content.items.Items/Find",
+		FullMethod: Items_Find_FullMethodName,
 	}
 	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
 		return srv.(ItemsServer).Find(ctx, req.(*FindRequest))
@@ -411,7 +444,7 @@ func _Items_Update_Handler(srv interface{}, ctx context.Context, dec func(interf
 	}
 	info := &grpc.UnaryServerInfo{
 		Server:     srv,
-		FullMethod: "/content.items.Items/Update",
+		FullMethod: Items_Update_FullMethodName,
 	}
 	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
 		return srv.(ItemsServer).Update(ctx, req.(*UpdateRequest))
@@ -429,7 +462,7 @@ func _Items_Delete_Handler(srv interface{}, ctx context.Context, dec func(interf
 	}
 	info := &grpc.UnaryServerInfo{
 		Server:     srv,
-		FullMethod: "/content.items.Items/Delete",
+		FullMethod: Items_Delete_FullMethodName,
 	}
 	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
 		return srv.(ItemsServer).Delete(ctx, req.(*DeleteRequest))
@@ -447,7 +480,7 @@ func _Items_Undelete_Handler(srv interface{}, ctx context.Context, dec func(inte
 	}
 	info := &grpc.UnaryServerInfo{
 		Server:     srv,
-		FullMethod: "/content.items.Items/Undelete",
+		FullMethod: Items_Undelete_FullMethodName,
 	}
 	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
 		return srv.(ItemsServer).Undelete(ctx, req.(*UndeleteRequest))
@@ -465,7 +498,7 @@ func _Items_Publish_Handler(srv interface{}, ctx context.Context, dec func(inter
 	}
 	info := &grpc.UnaryServerInfo{
 		Server:     srv,
-		FullMethod: "/content.items.Items/Publish",
+		FullMethod: Items_Publish_FullMethodName,
 	}
 	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
 		return srv.(ItemsServer).Publish(ctx, req.(*PublishRequest))
@@ -483,7 +516,7 @@ func _Items_Unpublish_Handler(srv interface{}, ctx context.Context, dec func(int
 	}
 	info := &grpc.UnaryServerInfo{
 		Server:     srv,
-		FullMethod: "/content.items.Items/Unpublish",
+		FullMethod: Items_Unpublish_FullMethodName,
 	}
 	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
 		return srv.(ItemsServer).Unpublish(ctx, req.(*UnpublishRequest))
@@ -501,7 +534,7 @@ func _Items_GetPublished_Handler(srv interface{}, ctx context.Context, dec func(
 	}
 	info := &grpc.UnaryServerInfo{
 		Server:     srv,
-		FullMethod: "/content.items.Items/GetPublished",
+		FullMethod: Items_GetPublished_FullMethodName,
 	}
 	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
 		return srv.(ItemsServer).GetPublished(ctx, req.(*GetPublishedRequest))
@@ -519,7 +552,7 @@ func _Items_FindPublished_Handler(srv interface{}, ctx context.Context, dec func
 	}
 	info := &grpc.UnaryServerInfo{
 		Server:     srv,
-		FullMethod: "/content.items.Items/FindPublished",
+		FullMethod: Items_FindPublished_FullMethodName,
 	}
 	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
 		return srv.(ItemsServer).FindPublished(ctx, req.(*FindPublishedRequest))
@@ -537,7 +570,7 @@ func _Items_Aggregate_Handler(srv interface{}, ctx context.Context, dec func(int
 	}
 	info := &grpc.UnaryServerInfo{
 		Server:     srv,
-		FullMethod: "/content.items.Items/Aggregate",
+		FullMethod: Items_Aggregate_FullMethodName,
 	}
 	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
 		return srv.(ItemsServer).Aggregate(ctx, req.(*AggregateRequest))
@@ -555,7 +588,7 @@ func _Items_AggregatePublished_Handler(srv interface{}, ctx context.Context, dec
 	}
 	info := &grpc.UnaryServerInfo{
 		Server:     srv,
-		FullMethod: "/content.items.Items/AggregatePublished",
+		FullMethod: Items_AggregatePublished_FullMethodName,
 	}
 	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
 		return srv.(ItemsServer).AggregatePublished(ctx, req.(*AggregatePublishedRequest))
@@ -573,7 +606,7 @@ func _Items_GetRevision_Handler(srv interface{}, ctx context.Context, dec func(i
 	}
 	info := &grpc.UnaryServerInfo{
 		Server:     srv,
-		FullMethod: "/content.items.Items/GetRevision",
+		FullMethod: Items_GetRevision_FullMethodName,
 	}
 	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
 		return srv.(ItemsServer).GetRevision(ctx, req.(*GetRevisionRequest))
@@ -591,7 +624,7 @@ func _Items_ListRevisions_Handler(srv interface{}, ctx context.Context, dec func
 	}
 	info := &grpc.UnaryServerInfo{
 		Server:     srv,
-		FullMethod: "/content.items.Items/ListRevisions",
+		FullMethod: Items_ListRevisions_FullMethodName,
 	}
 	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
 		return srv.(ItemsServer).ListRevisions(ctx, req.(*ListRevisionsRequest))
@@ -609,7 +642,7 @@ func _Items_Archive_Handler(srv interface{}, ctx context.Context, dec func(inter
 	}
 	info := &grpc.UnaryServerInfo{
 		Server:     srv,
-		FullMethod: "/content.items.Items/Archive",
+		FullMethod: Items_Archive_FullMethodName,
 	}
 	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
 		return srv.(ItemsServer).Archive(ctx, req.(*ArchiveRequest))
@@ -627,7 +660,7 @@ func _Items_FindArchived_Handler(srv interface{}, ctx context.Context, dec func(
 	}
 	info := &grpc.UnaryServerInfo{
 		Server:     srv,
-		FullMethod: "/content.items.Items/FindArchived",
+		FullMethod: Items_FindArchived_FullMethodName,
 	}
 	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
 		return srv.(ItemsServer).FindArchived(ctx, req.(*FindArchivedRequest))
@@ -645,7 +678,7 @@ func _Items_Unarchive_Handler(srv interface{}, ctx context.Context, dec func(int
 	}
 	info := &grpc.UnaryServerInfo{
 		Server:     srv,
-		FullMethod: "/content.items.Items/Unarchive",
+		FullMethod: Items_Unarchive_FullMethodName,
 	}
 	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
 		return srv.(ItemsServer).Unarchive(ctx, req.(*UnarchiveRequest))
diff --git a/locales/locales.pb.go b/proto/locales/locales.pb.go
similarity index 97%
rename from locales/locales.pb.go
rename to proto/locales/locales.pb.go
index df030d22de611a0de2791f9b64e406d8aecc6ef3..b4976bef329f5416bf10bd25f2dc2d8559b15d97 100644
--- a/locales/locales.pb.go
+++ b/proto/locales/locales.pb.go
@@ -1,7 +1,7 @@
 // Code generated by protoc-gen-go. DO NOT EDIT.
 // versions:
-// 	protoc-gen-go v1.27.1
-// 	protoc        v3.17.3
+// 	protoc-gen-go v1.29.0
+// 	protoc        v3.21.12
 // source: locales/locales.proto
 
 package locales
@@ -372,11 +372,11 @@ var file_locales_locales_proto_rawDesc = []byte{
 	0x65, 0x74, 0x65, 0x12, 0x1e, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x6c, 0x6f,
 	0x63, 0x61, 0x6c, 0x65, 0x73, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75,
 	0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f,
-	0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x42, 0x2e, 0x5a,
-	0x2c, 0x67, 0x69, 0x74, 0x2e, 0x70, 0x65, 0x72, 0x78, 0x2e, 0x72, 0x75, 0x2f, 0x70, 0x65, 0x72,
-	0x78, 0x69, 0x73, 0x2f, 0x70, 0x65, 0x72, 0x78, 0x69, 0x73, 0x2d, 0x67, 0x6f, 0x2f, 0x6c, 0x6f,
-	0x63, 0x61, 0x6c, 0x65, 0x73, 0x3b, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x65, 0x73, 0x62, 0x06, 0x70,
-	0x72, 0x6f, 0x74, 0x6f, 0x33,
+	0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x42, 0x34, 0x5a,
+	0x32, 0x67, 0x69, 0x74, 0x2e, 0x70, 0x65, 0x72, 0x78, 0x2e, 0x72, 0x75, 0x2f, 0x70, 0x65, 0x72,
+	0x78, 0x69, 0x73, 0x2f, 0x70, 0x65, 0x72, 0x78, 0x69, 0x73, 0x2d, 0x67, 0x6f, 0x2f, 0x70, 0x72,
+	0x6f, 0x74, 0x6f, 0x2f, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x65, 0x73, 0x3b, 0x6c, 0x6f, 0x63, 0x61,
+	0x6c, 0x65, 0x73, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
 }
 
 var (
diff --git a/locales/locales_grpc.pb.go b/proto/locales/locales_grpc.pb.go
similarity index 89%
rename from locales/locales_grpc.pb.go
rename to proto/locales/locales_grpc.pb.go
index e9702736fd987e1f93817e605ecf9e53a1bea6cc..6d2cc59bfb68665cb229a72830e646c7eb0aa30d 100644
--- a/locales/locales_grpc.pb.go
+++ b/proto/locales/locales_grpc.pb.go
@@ -1,4 +1,8 @@
 // Code generated by protoc-gen-go-grpc. DO NOT EDIT.
+// versions:
+// - protoc-gen-go-grpc v1.3.0
+// - protoc             v3.21.12
+// source: locales/locales.proto
 
 package locales
 
@@ -15,6 +19,12 @@ import (
 // Requires gRPC-Go v1.32.0 or later.
 const _ = grpc.SupportPackageIsVersion7
 
+const (
+	Locales_Create_FullMethodName = "/content.locales.Locales/Create"
+	Locales_List_FullMethodName   = "/content.locales.Locales/List"
+	Locales_Delete_FullMethodName = "/content.locales.Locales/Delete"
+)
+
 // LocalesClient is the client API for Locales service.
 //
 // For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream.
@@ -34,7 +44,7 @@ func NewLocalesClient(cc grpc.ClientConnInterface) LocalesClient {
 
 func (c *localesClient) Create(ctx context.Context, in *CreateRequest, opts ...grpc.CallOption) (*CreateResponse, error) {
 	out := new(CreateResponse)
-	err := c.cc.Invoke(ctx, "/content.locales.Locales/Create", in, out, opts...)
+	err := c.cc.Invoke(ctx, Locales_Create_FullMethodName, in, out, opts...)
 	if err != nil {
 		return nil, err
 	}
@@ -43,7 +53,7 @@ func (c *localesClient) Create(ctx context.Context, in *CreateRequest, opts ...g
 
 func (c *localesClient) List(ctx context.Context, in *ListRequest, opts ...grpc.CallOption) (*ListResponse, error) {
 	out := new(ListResponse)
-	err := c.cc.Invoke(ctx, "/content.locales.Locales/List", in, out, opts...)
+	err := c.cc.Invoke(ctx, Locales_List_FullMethodName, in, out, opts...)
 	if err != nil {
 		return nil, err
 	}
@@ -52,7 +62,7 @@ func (c *localesClient) List(ctx context.Context, in *ListRequest, opts ...grpc.
 
 func (c *localesClient) Delete(ctx context.Context, in *DeleteRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) {
 	out := new(emptypb.Empty)
-	err := c.cc.Invoke(ctx, "/content.locales.Locales/Delete", in, out, opts...)
+	err := c.cc.Invoke(ctx, Locales_Delete_FullMethodName, in, out, opts...)
 	if err != nil {
 		return nil, err
 	}
@@ -105,7 +115,7 @@ func _Locales_Create_Handler(srv interface{}, ctx context.Context, dec func(inte
 	}
 	info := &grpc.UnaryServerInfo{
 		Server:     srv,
-		FullMethod: "/content.locales.Locales/Create",
+		FullMethod: Locales_Create_FullMethodName,
 	}
 	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
 		return srv.(LocalesServer).Create(ctx, req.(*CreateRequest))
@@ -123,7 +133,7 @@ func _Locales_List_Handler(srv interface{}, ctx context.Context, dec func(interf
 	}
 	info := &grpc.UnaryServerInfo{
 		Server:     srv,
-		FullMethod: "/content.locales.Locales/List",
+		FullMethod: Locales_List_FullMethodName,
 	}
 	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
 		return srv.(LocalesServer).List(ctx, req.(*ListRequest))
@@ -141,7 +151,7 @@ func _Locales_Delete_Handler(srv interface{}, ctx context.Context, dec func(inte
 	}
 	info := &grpc.UnaryServerInfo{
 		Server:     srv,
-		FullMethod: "/content.locales.Locales/Delete",
+		FullMethod: Locales_Delete_FullMethodName,
 	}
 	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
 		return srv.(LocalesServer).Delete(ctx, req.(*DeleteRequest))
diff --git a/members/members.pb.go b/proto/members/members.pb.go
similarity index 98%
rename from members/members.pb.go
rename to proto/members/members.pb.go
index 7b26ddbb78759f5f2b2cb8e1d21db3cb98e452ff..f64cccf98ba400727fa1fa8e621978fb9b2133c2 100644
--- a/members/members.pb.go
+++ b/proto/members/members.pb.go
@@ -1,13 +1,13 @@
 // Code generated by protoc-gen-go. DO NOT EDIT.
 // versions:
-// 	protoc-gen-go v1.27.1
-// 	protoc        v3.17.3
+// 	protoc-gen-go v1.29.0
+// 	protoc        v3.21.12
 // source: members/members.proto
 
 package members
 
 import (
-	common "git.perx.ru/perxis/perxis-go/common"
+	common "git.perx.ru/perxis/perxis-go/proto/common"
 	protoreflect "google.golang.org/protobuf/reflect/protoreflect"
 	protoimpl "google.golang.org/protobuf/runtime/protoimpl"
 	emptypb "google.golang.org/protobuf/types/known/emptypb"
@@ -738,10 +738,11 @@ var file_members_members_proto_rawDesc = []byte{
 	0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2a, 0x2e, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74,
 	0x2e, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x2e, 0x4f, 0x6e, 0x43, 0x6f, 0x6c, 0x6c, 0x61,
 	0x62, 0x6f, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x53, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e,
-	0x73, 0x65, 0x22, 0x00, 0x42, 0x2e, 0x5a, 0x2c, 0x67, 0x69, 0x74, 0x2e, 0x70, 0x65, 0x72, 0x78,
+	0x73, 0x65, 0x22, 0x00, 0x42, 0x34, 0x5a, 0x32, 0x67, 0x69, 0x74, 0x2e, 0x70, 0x65, 0x72, 0x78,
 	0x2e, 0x72, 0x75, 0x2f, 0x70, 0x65, 0x72, 0x78, 0x69, 0x73, 0x2f, 0x70, 0x65, 0x72, 0x78, 0x69,
-	0x73, 0x2d, 0x67, 0x6f, 0x2f, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x3b, 0x6d, 0x65, 0x6d,
-	0x62, 0x65, 0x72, 0x73, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
+	0x73, 0x2d, 0x67, 0x6f, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x6d, 0x65, 0x6d, 0x62, 0x65,
+	0x72, 0x73, 0x3b, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74,
+	0x6f, 0x33,
 }
 
 var (
diff --git a/members/members_grpc.pb.go b/proto/members/members_grpc.pb.go
similarity index 89%
rename from members/members_grpc.pb.go
rename to proto/members/members_grpc.pb.go
index 605685408c72df9777bfc384e17a417601e7d630..8e8a103fd6254175c04f60df28c710ea72e3a060 100644
--- a/members/members_grpc.pb.go
+++ b/proto/members/members_grpc.pb.go
@@ -1,4 +1,8 @@
 // Code generated by protoc-gen-go-grpc. DO NOT EDIT.
+// versions:
+// - protoc-gen-go-grpc v1.3.0
+// - protoc             v3.21.12
+// source: members/members.proto
 
 package members
 
@@ -15,6 +19,14 @@ import (
 // Requires gRPC-Go v1.32.0 or later.
 const _ = grpc.SupportPackageIsVersion7
 
+const (
+	Members_Set_FullMethodName               = "/account.members.Members/Set"
+	Members_Get_FullMethodName               = "/account.members.Members/Get"
+	Members_Remove_FullMethodName            = "/account.members.Members/Remove"
+	Members_ListMembers_FullMethodName       = "/account.members.Members/ListMembers"
+	Members_ListOrganizations_FullMethodName = "/account.members.Members/ListOrganizations"
+)
+
 // MembersClient is the client API for Members service.
 //
 // For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream.
@@ -36,7 +48,7 @@ func NewMembersClient(cc grpc.ClientConnInterface) MembersClient {
 
 func (c *membersClient) Set(ctx context.Context, in *SetRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) {
 	out := new(emptypb.Empty)
-	err := c.cc.Invoke(ctx, "/account.members.Members/Set", in, out, opts...)
+	err := c.cc.Invoke(ctx, Members_Set_FullMethodName, in, out, opts...)
 	if err != nil {
 		return nil, err
 	}
@@ -45,7 +57,7 @@ func (c *membersClient) Set(ctx context.Context, in *SetRequest, opts ...grpc.Ca
 
 func (c *membersClient) Get(ctx context.Context, in *GetRequest, opts ...grpc.CallOption) (*GetResponse, error) {
 	out := new(GetResponse)
-	err := c.cc.Invoke(ctx, "/account.members.Members/Get", in, out, opts...)
+	err := c.cc.Invoke(ctx, Members_Get_FullMethodName, in, out, opts...)
 	if err != nil {
 		return nil, err
 	}
@@ -54,7 +66,7 @@ func (c *membersClient) Get(ctx context.Context, in *GetRequest, opts ...grpc.Ca
 
 func (c *membersClient) Remove(ctx context.Context, in *RemoveRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) {
 	out := new(emptypb.Empty)
-	err := c.cc.Invoke(ctx, "/account.members.Members/Remove", in, out, opts...)
+	err := c.cc.Invoke(ctx, Members_Remove_FullMethodName, in, out, opts...)
 	if err != nil {
 		return nil, err
 	}
@@ -63,7 +75,7 @@ func (c *membersClient) Remove(ctx context.Context, in *RemoveRequest, opts ...g
 
 func (c *membersClient) ListMembers(ctx context.Context, in *ListMembersRequest, opts ...grpc.CallOption) (*ListMembersResponse, error) {
 	out := new(ListMembersResponse)
-	err := c.cc.Invoke(ctx, "/account.members.Members/ListMembers", in, out, opts...)
+	err := c.cc.Invoke(ctx, Members_ListMembers_FullMethodName, in, out, opts...)
 	if err != nil {
 		return nil, err
 	}
@@ -72,7 +84,7 @@ func (c *membersClient) ListMembers(ctx context.Context, in *ListMembersRequest,
 
 func (c *membersClient) ListOrganizations(ctx context.Context, in *ListOrganizationsRequest, opts ...grpc.CallOption) (*ListOrganizationsResponse, error) {
 	out := new(ListOrganizationsResponse)
-	err := c.cc.Invoke(ctx, "/account.members.Members/ListOrganizations", in, out, opts...)
+	err := c.cc.Invoke(ctx, Members_ListOrganizations_FullMethodName, in, out, opts...)
 	if err != nil {
 		return nil, err
 	}
@@ -133,7 +145,7 @@ func _Members_Set_Handler(srv interface{}, ctx context.Context, dec func(interfa
 	}
 	info := &grpc.UnaryServerInfo{
 		Server:     srv,
-		FullMethod: "/account.members.Members/Set",
+		FullMethod: Members_Set_FullMethodName,
 	}
 	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
 		return srv.(MembersServer).Set(ctx, req.(*SetRequest))
@@ -151,7 +163,7 @@ func _Members_Get_Handler(srv interface{}, ctx context.Context, dec func(interfa
 	}
 	info := &grpc.UnaryServerInfo{
 		Server:     srv,
-		FullMethod: "/account.members.Members/Get",
+		FullMethod: Members_Get_FullMethodName,
 	}
 	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
 		return srv.(MembersServer).Get(ctx, req.(*GetRequest))
@@ -169,7 +181,7 @@ func _Members_Remove_Handler(srv interface{}, ctx context.Context, dec func(inte
 	}
 	info := &grpc.UnaryServerInfo{
 		Server:     srv,
-		FullMethod: "/account.members.Members/Remove",
+		FullMethod: Members_Remove_FullMethodName,
 	}
 	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
 		return srv.(MembersServer).Remove(ctx, req.(*RemoveRequest))
@@ -187,7 +199,7 @@ func _Members_ListMembers_Handler(srv interface{}, ctx context.Context, dec func
 	}
 	info := &grpc.UnaryServerInfo{
 		Server:     srv,
-		FullMethod: "/account.members.Members/ListMembers",
+		FullMethod: Members_ListMembers_FullMethodName,
 	}
 	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
 		return srv.(MembersServer).ListMembers(ctx, req.(*ListMembersRequest))
@@ -205,7 +217,7 @@ func _Members_ListOrganizations_Handler(srv interface{}, ctx context.Context, de
 	}
 	info := &grpc.UnaryServerInfo{
 		Server:     srv,
-		FullMethod: "/account.members.Members/ListOrganizations",
+		FullMethod: Members_ListOrganizations_FullMethodName,
 	}
 	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
 		return srv.(MembersServer).ListOrganizations(ctx, req.(*ListOrganizationsRequest))
@@ -245,6 +257,10 @@ var Members_ServiceDesc = grpc.ServiceDesc{
 	Metadata: "members/members.proto",
 }
 
+const (
+	Observer_OnCollaboratorSet_FullMethodName = "/account.members.Observer/OnCollaboratorSet"
+)
+
 // ObserverClient is the client API for Observer service.
 //
 // For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream.
@@ -262,7 +278,7 @@ func NewObserverClient(cc grpc.ClientConnInterface) ObserverClient {
 
 func (c *observerClient) OnCollaboratorSet(ctx context.Context, in *OnCollaboratorSetRequest, opts ...grpc.CallOption) (*OnCollaboratorSetResponse, error) {
 	out := new(OnCollaboratorSetResponse)
-	err := c.cc.Invoke(ctx, "/account.members.Observer/OnCollaboratorSet", in, out, opts...)
+	err := c.cc.Invoke(ctx, Observer_OnCollaboratorSet_FullMethodName, in, out, opts...)
 	if err != nil {
 		return nil, err
 	}
@@ -307,7 +323,7 @@ func _Observer_OnCollaboratorSet_Handler(srv interface{}, ctx context.Context, d
 	}
 	info := &grpc.UnaryServerInfo{
 		Server:     srv,
-		FullMethod: "/account.members.Observer/OnCollaboratorSet",
+		FullMethod: Observer_OnCollaboratorSet_FullMethodName,
 	}
 	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
 		return srv.(ObserverServer).OnCollaboratorSet(ctx, req.(*OnCollaboratorSetRequest))
diff --git a/organizations/organizations.pb.go b/proto/organizations/organizations.pb.go
similarity index 98%
rename from organizations/organizations.pb.go
rename to proto/organizations/organizations.pb.go
index 47715ac2aad8bc330b3764d6bd4b515c4ca6756e..fa19fd7b92e181a9bac136d55a0a9805cb68f3c0 100644
--- a/organizations/organizations.pb.go
+++ b/proto/organizations/organizations.pb.go
@@ -1,13 +1,13 @@
 // Code generated by protoc-gen-go. DO NOT EDIT.
 // versions:
-// 	protoc-gen-go v1.27.1
-// 	protoc        v3.17.3
+// 	protoc-gen-go v1.29.0
+// 	protoc        v3.21.12
 // source: organizations/organizations.proto
 
 package organizations
 
 import (
-	common "git.perx.ru/perxis/perxis-go/common"
+	common "git.perx.ru/perxis/perxis-go/proto/common"
 	protoreflect "google.golang.org/protobuf/reflect/protoreflect"
 	protoimpl "google.golang.org/protobuf/runtime/protoimpl"
 	emptypb "google.golang.org/protobuf/types/known/emptypb"
@@ -634,11 +634,11 @@ var file_organizations_organizations_proto_rawDesc = []byte{
 	0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65,
 	0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65,
 	0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22,
-	0x00, 0x42, 0x3a, 0x5a, 0x38, 0x67, 0x69, 0x74, 0x2e, 0x70, 0x65, 0x72, 0x78, 0x2e, 0x72, 0x75,
+	0x00, 0x42, 0x40, 0x5a, 0x3e, 0x67, 0x69, 0x74, 0x2e, 0x70, 0x65, 0x72, 0x78, 0x2e, 0x72, 0x75,
 	0x2f, 0x70, 0x65, 0x72, 0x78, 0x69, 0x73, 0x2f, 0x70, 0x65, 0x72, 0x78, 0x69, 0x73, 0x2d, 0x67,
-	0x6f, 0x2f, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x3b,
-	0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x62, 0x06, 0x70,
-	0x72, 0x6f, 0x74, 0x6f, 0x33,
+	0x6f, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61,
+	0x74, 0x69, 0x6f, 0x6e, 0x73, 0x3b, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69,
+	0x6f, 0x6e, 0x73, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
 }
 
 var (
diff --git a/organizations/organizations_grpc.pb.go b/proto/organizations/organizations_grpc.pb.go
similarity index 87%
rename from organizations/organizations_grpc.pb.go
rename to proto/organizations/organizations_grpc.pb.go
index 19d429ea3ca6573f3581f5732d9e8af4424a7d0f..5e49e478a36c39bc65d5f48b559c63f04dcbed1a 100644
--- a/organizations/organizations_grpc.pb.go
+++ b/proto/organizations/organizations_grpc.pb.go
@@ -1,4 +1,8 @@
 // Code generated by protoc-gen-go-grpc. DO NOT EDIT.
+// versions:
+// - protoc-gen-go-grpc v1.3.0
+// - protoc             v3.21.12
+// source: organizations/organizations.proto
 
 package organizations
 
@@ -15,6 +19,14 @@ import (
 // Requires gRPC-Go v1.32.0 or later.
 const _ = grpc.SupportPackageIsVersion7
 
+const (
+	Organizations_Create_FullMethodName = "/account.organizations.Organizations/Create"
+	Organizations_Get_FullMethodName    = "/account.organizations.Organizations/Get"
+	Organizations_Delete_FullMethodName = "/account.organizations.Organizations/Delete"
+	Organizations_Find_FullMethodName   = "/account.organizations.Organizations/Find"
+	Organizations_Update_FullMethodName = "/account.organizations.Organizations/Update"
+)
+
 // OrganizationsClient is the client API for Organizations service.
 //
 // For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream.
@@ -36,7 +48,7 @@ func NewOrganizationsClient(cc grpc.ClientConnInterface) OrganizationsClient {
 
 func (c *organizationsClient) Create(ctx context.Context, in *CreateRequest, opts ...grpc.CallOption) (*CreateResponse, error) {
 	out := new(CreateResponse)
-	err := c.cc.Invoke(ctx, "/account.organizations.Organizations/Create", in, out, opts...)
+	err := c.cc.Invoke(ctx, Organizations_Create_FullMethodName, in, out, opts...)
 	if err != nil {
 		return nil, err
 	}
@@ -45,7 +57,7 @@ func (c *organizationsClient) Create(ctx context.Context, in *CreateRequest, opt
 
 func (c *organizationsClient) Get(ctx context.Context, in *GetRequest, opts ...grpc.CallOption) (*GetResponse, error) {
 	out := new(GetResponse)
-	err := c.cc.Invoke(ctx, "/account.organizations.Organizations/Get", in, out, opts...)
+	err := c.cc.Invoke(ctx, Organizations_Get_FullMethodName, in, out, opts...)
 	if err != nil {
 		return nil, err
 	}
@@ -54,7 +66,7 @@ func (c *organizationsClient) Get(ctx context.Context, in *GetRequest, opts ...g
 
 func (c *organizationsClient) Delete(ctx context.Context, in *DeleteRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) {
 	out := new(emptypb.Empty)
-	err := c.cc.Invoke(ctx, "/account.organizations.Organizations/Delete", in, out, opts...)
+	err := c.cc.Invoke(ctx, Organizations_Delete_FullMethodName, in, out, opts...)
 	if err != nil {
 		return nil, err
 	}
@@ -63,7 +75,7 @@ func (c *organizationsClient) Delete(ctx context.Context, in *DeleteRequest, opt
 
 func (c *organizationsClient) Find(ctx context.Context, in *FindRequest, opts ...grpc.CallOption) (*FindResponse, error) {
 	out := new(FindResponse)
-	err := c.cc.Invoke(ctx, "/account.organizations.Organizations/Find", in, out, opts...)
+	err := c.cc.Invoke(ctx, Organizations_Find_FullMethodName, in, out, opts...)
 	if err != nil {
 		return nil, err
 	}
@@ -72,7 +84,7 @@ func (c *organizationsClient) Find(ctx context.Context, in *FindRequest, opts ..
 
 func (c *organizationsClient) Update(ctx context.Context, in *UpdateRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) {
 	out := new(emptypb.Empty)
-	err := c.cc.Invoke(ctx, "/account.organizations.Organizations/Update", in, out, opts...)
+	err := c.cc.Invoke(ctx, Organizations_Update_FullMethodName, in, out, opts...)
 	if err != nil {
 		return nil, err
 	}
@@ -133,7 +145,7 @@ func _Organizations_Create_Handler(srv interface{}, ctx context.Context, dec fun
 	}
 	info := &grpc.UnaryServerInfo{
 		Server:     srv,
-		FullMethod: "/account.organizations.Organizations/Create",
+		FullMethod: Organizations_Create_FullMethodName,
 	}
 	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
 		return srv.(OrganizationsServer).Create(ctx, req.(*CreateRequest))
@@ -151,7 +163,7 @@ func _Organizations_Get_Handler(srv interface{}, ctx context.Context, dec func(i
 	}
 	info := &grpc.UnaryServerInfo{
 		Server:     srv,
-		FullMethod: "/account.organizations.Organizations/Get",
+		FullMethod: Organizations_Get_FullMethodName,
 	}
 	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
 		return srv.(OrganizationsServer).Get(ctx, req.(*GetRequest))
@@ -169,7 +181,7 @@ func _Organizations_Delete_Handler(srv interface{}, ctx context.Context, dec fun
 	}
 	info := &grpc.UnaryServerInfo{
 		Server:     srv,
-		FullMethod: "/account.organizations.Organizations/Delete",
+		FullMethod: Organizations_Delete_FullMethodName,
 	}
 	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
 		return srv.(OrganizationsServer).Delete(ctx, req.(*DeleteRequest))
@@ -187,7 +199,7 @@ func _Organizations_Find_Handler(srv interface{}, ctx context.Context, dec func(
 	}
 	info := &grpc.UnaryServerInfo{
 		Server:     srv,
-		FullMethod: "/account.organizations.Organizations/Find",
+		FullMethod: Organizations_Find_FullMethodName,
 	}
 	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
 		return srv.(OrganizationsServer).Find(ctx, req.(*FindRequest))
@@ -205,7 +217,7 @@ func _Organizations_Update_Handler(srv interface{}, ctx context.Context, dec fun
 	}
 	info := &grpc.UnaryServerInfo{
 		Server:     srv,
-		FullMethod: "/account.organizations.Organizations/Update",
+		FullMethod: Organizations_Update_FullMethodName,
 	}
 	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
 		return srv.(OrganizationsServer).Update(ctx, req.(*UpdateRequest))
diff --git a/references/references.pb.go b/proto/references/references.pb.go
similarity index 96%
rename from references/references.pb.go
rename to proto/references/references.pb.go
index 70c83633e4228e93cc1a8afc1f0b43b1e3d91d21..02bfc59031b461f09fdd230f77476dccc12d97e2 100644
--- a/references/references.pb.go
+++ b/proto/references/references.pb.go
@@ -1,13 +1,13 @@
 // Code generated by protoc-gen-go. DO NOT EDIT.
 // versions:
-// 	protoc-gen-go v1.27.1
-// 	protoc        v3.17.3
+// 	protoc-gen-go v1.29.0
+// 	protoc        v3.21.12
 // source: references/references.proto
 
 package references
 
 import (
-	items "git.perx.ru/perxis/perxis-go/items"
+	items "git.perx.ru/perxis/perxis-go/proto/items"
 	protoreflect "google.golang.org/protobuf/reflect/protoreflect"
 	protoimpl "google.golang.org/protobuf/runtime/protoimpl"
 	reflect "reflect"
@@ -235,11 +235,12 @@ var file_references_references_proto_rawDesc = []byte{
 	0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x73,
 	0x2e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1f, 0x2e, 0x63, 0x6f,
 	0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x73,
-	0x2e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x42, 0x34,
-	0x5a, 0x32, 0x67, 0x69, 0x74, 0x2e, 0x70, 0x65, 0x72, 0x78, 0x2e, 0x72, 0x75, 0x2f, 0x70, 0x65,
-	0x72, 0x78, 0x69, 0x73, 0x2f, 0x70, 0x65, 0x72, 0x78, 0x69, 0x73, 0x2d, 0x67, 0x6f, 0x2f, 0x72,
-	0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x3b, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65,
-	0x6e, 0x63, 0x65, 0x73, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
+	0x2e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x42, 0x3a,
+	0x5a, 0x38, 0x67, 0x69, 0x74, 0x2e, 0x70, 0x65, 0x72, 0x78, 0x2e, 0x72, 0x75, 0x2f, 0x70, 0x65,
+	0x72, 0x78, 0x69, 0x73, 0x2f, 0x70, 0x65, 0x72, 0x78, 0x69, 0x73, 0x2d, 0x67, 0x6f, 0x2f, 0x70,
+	0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x3b,
+	0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74,
+	0x6f, 0x33,
 }
 
 var (
diff --git a/references/references_grpc.pb.go b/proto/references/references_grpc.pb.go
similarity index 91%
rename from references/references_grpc.pb.go
rename to proto/references/references_grpc.pb.go
index 8159a83651687e1ab87eeebfe5c1c33496ba67ef..45c5711e044327117eee150e6c35b5da4ae4eea4 100644
--- a/references/references_grpc.pb.go
+++ b/proto/references/references_grpc.pb.go
@@ -1,4 +1,8 @@
 // Code generated by protoc-gen-go-grpc. DO NOT EDIT.
+// versions:
+// - protoc-gen-go-grpc v1.3.0
+// - protoc             v3.21.12
+// source: references/references.proto
 
 package references
 
@@ -14,6 +18,10 @@ import (
 // Requires gRPC-Go v1.32.0 or later.
 const _ = grpc.SupportPackageIsVersion7
 
+const (
+	References_Get_FullMethodName = "/content.references.References/Get"
+)
+
 // ReferencesClient is the client API for References service.
 //
 // For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream.
@@ -31,7 +39,7 @@ func NewReferencesClient(cc grpc.ClientConnInterface) ReferencesClient {
 
 func (c *referencesClient) Get(ctx context.Context, in *GetRequest, opts ...grpc.CallOption) (*GetResponse, error) {
 	out := new(GetResponse)
-	err := c.cc.Invoke(ctx, "/content.references.References/Get", in, out, opts...)
+	err := c.cc.Invoke(ctx, References_Get_FullMethodName, in, out, opts...)
 	if err != nil {
 		return nil, err
 	}
@@ -76,7 +84,7 @@ func _References_Get_Handler(srv interface{}, ctx context.Context, dec func(inte
 	}
 	info := &grpc.UnaryServerInfo{
 		Server:     srv,
-		FullMethod: "/content.references.References/Get",
+		FullMethod: References_Get_FullMethodName,
 	}
 	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
 		return srv.(ReferencesServer).Get(ctx, req.(*GetRequest))
diff --git a/roles/roles.pb.go b/proto/roles/roles.pb.go
similarity index 98%
rename from roles/roles.pb.go
rename to proto/roles/roles.pb.go
index 5b1930580d29e4a1a50fb9434871920853f7db93..56a202a4fbe3cec46e1b6221bceb1050b031d373 100644
--- a/roles/roles.pb.go
+++ b/proto/roles/roles.pb.go
@@ -1,13 +1,13 @@
 // Code generated by protoc-gen-go. DO NOT EDIT.
 // versions:
-// 	protoc-gen-go v1.27.1
-// 	protoc        v3.17.3
+// 	protoc-gen-go v1.29.0
+// 	protoc        v3.21.12
 // source: roles/roles.proto
 
 package roles
 
 import (
-	common "git.perx.ru/perxis/perxis-go/common"
+	common "git.perx.ru/perxis/perxis-go/proto/common"
 	protoreflect "google.golang.org/protobuf/reflect/protoreflect"
 	protoimpl "google.golang.org/protobuf/runtime/protoimpl"
 	emptypb "google.golang.org/protobuf/types/known/emptypb"
@@ -586,10 +586,10 @@ var file_roles_roles_proto_rawDesc = []byte{
 	0x6e, 0x74, 0x2e, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52,
 	0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e,
 	0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00,
-	0x42, 0x2a, 0x5a, 0x28, 0x67, 0x69, 0x74, 0x2e, 0x70, 0x65, 0x72, 0x78, 0x2e, 0x72, 0x75, 0x2f,
+	0x42, 0x30, 0x5a, 0x2e, 0x67, 0x69, 0x74, 0x2e, 0x70, 0x65, 0x72, 0x78, 0x2e, 0x72, 0x75, 0x2f,
 	0x70, 0x65, 0x72, 0x78, 0x69, 0x73, 0x2f, 0x70, 0x65, 0x72, 0x78, 0x69, 0x73, 0x2d, 0x67, 0x6f,
-	0x2f, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x3b, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x62, 0x06, 0x70, 0x72,
-	0x6f, 0x74, 0x6f, 0x33,
+	0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x3b, 0x72, 0x6f, 0x6c,
+	0x65, 0x73, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
 }
 
 var (
diff --git a/roles/roles_grpc.pb.go b/proto/roles/roles_grpc.pb.go
similarity index 89%
rename from roles/roles_grpc.pb.go
rename to proto/roles/roles_grpc.pb.go
index 080289025a27c52c520a709860ffe3d6a036a11b..596c13fb4a72989aa5b4334908fc45c5fa97fcc6 100644
--- a/roles/roles_grpc.pb.go
+++ b/proto/roles/roles_grpc.pb.go
@@ -1,4 +1,8 @@
 // Code generated by protoc-gen-go-grpc. DO NOT EDIT.
+// versions:
+// - protoc-gen-go-grpc v1.3.0
+// - protoc             v3.21.12
+// source: roles/roles.proto
 
 package roles
 
@@ -15,6 +19,14 @@ import (
 // Requires gRPC-Go v1.32.0 or later.
 const _ = grpc.SupportPackageIsVersion7
 
+const (
+	Roles_Create_FullMethodName = "/content.roles.Roles/Create"
+	Roles_Get_FullMethodName    = "/content.roles.Roles/Get"
+	Roles_Update_FullMethodName = "/content.roles.Roles/Update"
+	Roles_List_FullMethodName   = "/content.roles.Roles/List"
+	Roles_Delete_FullMethodName = "/content.roles.Roles/Delete"
+)
+
 // RolesClient is the client API for Roles service.
 //
 // For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream.
@@ -41,7 +53,7 @@ func NewRolesClient(cc grpc.ClientConnInterface) RolesClient {
 
 func (c *rolesClient) Create(ctx context.Context, in *CreateRequest, opts ...grpc.CallOption) (*CreateResponse, error) {
 	out := new(CreateResponse)
-	err := c.cc.Invoke(ctx, "/content.roles.Roles/Create", in, out, opts...)
+	err := c.cc.Invoke(ctx, Roles_Create_FullMethodName, in, out, opts...)
 	if err != nil {
 		return nil, err
 	}
@@ -50,7 +62,7 @@ func (c *rolesClient) Create(ctx context.Context, in *CreateRequest, opts ...grp
 
 func (c *rolesClient) Get(ctx context.Context, in *GetRequest, opts ...grpc.CallOption) (*GetResponse, error) {
 	out := new(GetResponse)
-	err := c.cc.Invoke(ctx, "/content.roles.Roles/Get", in, out, opts...)
+	err := c.cc.Invoke(ctx, Roles_Get_FullMethodName, in, out, opts...)
 	if err != nil {
 		return nil, err
 	}
@@ -59,7 +71,7 @@ func (c *rolesClient) Get(ctx context.Context, in *GetRequest, opts ...grpc.Call
 
 func (c *rolesClient) Update(ctx context.Context, in *UpdateRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) {
 	out := new(emptypb.Empty)
-	err := c.cc.Invoke(ctx, "/content.roles.Roles/Update", in, out, opts...)
+	err := c.cc.Invoke(ctx, Roles_Update_FullMethodName, in, out, opts...)
 	if err != nil {
 		return nil, err
 	}
@@ -68,7 +80,7 @@ func (c *rolesClient) Update(ctx context.Context, in *UpdateRequest, opts ...grp
 
 func (c *rolesClient) List(ctx context.Context, in *ListRequest, opts ...grpc.CallOption) (*ListResponse, error) {
 	out := new(ListResponse)
-	err := c.cc.Invoke(ctx, "/content.roles.Roles/List", in, out, opts...)
+	err := c.cc.Invoke(ctx, Roles_List_FullMethodName, in, out, opts...)
 	if err != nil {
 		return nil, err
 	}
@@ -77,7 +89,7 @@ func (c *rolesClient) List(ctx context.Context, in *ListRequest, opts ...grpc.Ca
 
 func (c *rolesClient) Delete(ctx context.Context, in *DeleteRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) {
 	out := new(emptypb.Empty)
-	err := c.cc.Invoke(ctx, "/content.roles.Roles/Delete", in, out, opts...)
+	err := c.cc.Invoke(ctx, Roles_Delete_FullMethodName, in, out, opts...)
 	if err != nil {
 		return nil, err
 	}
@@ -143,7 +155,7 @@ func _Roles_Create_Handler(srv interface{}, ctx context.Context, dec func(interf
 	}
 	info := &grpc.UnaryServerInfo{
 		Server:     srv,
-		FullMethod: "/content.roles.Roles/Create",
+		FullMethod: Roles_Create_FullMethodName,
 	}
 	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
 		return srv.(RolesServer).Create(ctx, req.(*CreateRequest))
@@ -161,7 +173,7 @@ func _Roles_Get_Handler(srv interface{}, ctx context.Context, dec func(interface
 	}
 	info := &grpc.UnaryServerInfo{
 		Server:     srv,
-		FullMethod: "/content.roles.Roles/Get",
+		FullMethod: Roles_Get_FullMethodName,
 	}
 	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
 		return srv.(RolesServer).Get(ctx, req.(*GetRequest))
@@ -179,7 +191,7 @@ func _Roles_Update_Handler(srv interface{}, ctx context.Context, dec func(interf
 	}
 	info := &grpc.UnaryServerInfo{
 		Server:     srv,
-		FullMethod: "/content.roles.Roles/Update",
+		FullMethod: Roles_Update_FullMethodName,
 	}
 	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
 		return srv.(RolesServer).Update(ctx, req.(*UpdateRequest))
@@ -197,7 +209,7 @@ func _Roles_List_Handler(srv interface{}, ctx context.Context, dec func(interfac
 	}
 	info := &grpc.UnaryServerInfo{
 		Server:     srv,
-		FullMethod: "/content.roles.Roles/List",
+		FullMethod: Roles_List_FullMethodName,
 	}
 	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
 		return srv.(RolesServer).List(ctx, req.(*ListRequest))
@@ -215,7 +227,7 @@ func _Roles_Delete_Handler(srv interface{}, ctx context.Context, dec func(interf
 	}
 	info := &grpc.UnaryServerInfo{
 		Server:     srv,
-		FullMethod: "/content.roles.Roles/Delete",
+		FullMethod: Roles_Delete_FullMethodName,
 	}
 	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
 		return srv.(RolesServer).Delete(ctx, req.(*DeleteRequest))
diff --git a/spaces/spaces.pb.go b/proto/spaces/spaces.pb.go
similarity index 98%
rename from spaces/spaces.pb.go
rename to proto/spaces/spaces.pb.go
index aaf627362e0918d69e77f6c2a89130d3c02af0ef..3c3a878454c5e6a7b4f8ac4ca43cd525763432e4 100644
--- a/spaces/spaces.pb.go
+++ b/proto/spaces/spaces.pb.go
@@ -1,7 +1,7 @@
 // Code generated by protoc-gen-go. DO NOT EDIT.
 // versions:
-// 	protoc-gen-go v1.27.1
-// 	protoc        v3.17.3
+// 	protoc-gen-go v1.29.0
+// 	protoc        v3.21.12
 // source: spaces/spaces.proto
 
 package spaces
@@ -739,10 +739,11 @@ var file_spaces_spaces_proto_rawDesc = []byte{
 	0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x73, 0x70, 0x61, 0x63, 0x65, 0x73, 0x2e,
 	0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e,
 	0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e,
-	0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x42, 0x2c, 0x5a, 0x2a, 0x67, 0x69, 0x74, 0x2e, 0x70,
+	0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x42, 0x32, 0x5a, 0x30, 0x67, 0x69, 0x74, 0x2e, 0x70,
 	0x65, 0x72, 0x78, 0x2e, 0x72, 0x75, 0x2f, 0x70, 0x65, 0x72, 0x78, 0x69, 0x73, 0x2f, 0x70, 0x65,
-	0x72, 0x78, 0x69, 0x73, 0x2d, 0x67, 0x6f, 0x2f, 0x73, 0x70, 0x61, 0x63, 0x65, 0x73, 0x3b, 0x73,
-	0x70, 0x61, 0x63, 0x65, 0x73, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
+	0x72, 0x78, 0x69, 0x73, 0x2d, 0x67, 0x6f, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x73, 0x70,
+	0x61, 0x63, 0x65, 0x73, 0x3b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x73, 0x62, 0x06, 0x70, 0x72, 0x6f,
+	0x74, 0x6f, 0x33,
 }
 
 var (
diff --git a/spaces/spaces_grpc.pb.go b/proto/spaces/spaces_grpc.pb.go
similarity index 88%
rename from spaces/spaces_grpc.pb.go
rename to proto/spaces/spaces_grpc.pb.go
index f5ff38ce3572d706de126c9c82040a819a3d3ab4..6dc461f5b61f65d49483647d0b5d038d9dad1c13 100644
--- a/spaces/spaces_grpc.pb.go
+++ b/proto/spaces/spaces_grpc.pb.go
@@ -1,4 +1,8 @@
 // Code generated by protoc-gen-go-grpc. DO NOT EDIT.
+// versions:
+// - protoc-gen-go-grpc v1.3.0
+// - protoc             v3.21.12
+// source: spaces/spaces.proto
 
 package spaces
 
@@ -15,6 +19,15 @@ import (
 // Requires gRPC-Go v1.32.0 or later.
 const _ = grpc.SupportPackageIsVersion7
 
+const (
+	Spaces_Create_FullMethodName       = "/content.spaces.Spaces/Create"
+	Spaces_Get_FullMethodName          = "/content.spaces.Spaces/Get"
+	Spaces_List_FullMethodName         = "/content.spaces.Spaces/List"
+	Spaces_Update_FullMethodName       = "/content.spaces.Spaces/Update"
+	Spaces_UpdateConfig_FullMethodName = "/content.spaces.Spaces/UpdateConfig"
+	Spaces_Delete_FullMethodName       = "/content.spaces.Spaces/Delete"
+)
+
 // SpacesClient is the client API for Spaces service.
 //
 // For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream.
@@ -37,7 +50,7 @@ func NewSpacesClient(cc grpc.ClientConnInterface) SpacesClient {
 
 func (c *spacesClient) Create(ctx context.Context, in *CreateRequest, opts ...grpc.CallOption) (*CreateResponse, error) {
 	out := new(CreateResponse)
-	err := c.cc.Invoke(ctx, "/content.spaces.Spaces/Create", in, out, opts...)
+	err := c.cc.Invoke(ctx, Spaces_Create_FullMethodName, in, out, opts...)
 	if err != nil {
 		return nil, err
 	}
@@ -46,7 +59,7 @@ func (c *spacesClient) Create(ctx context.Context, in *CreateRequest, opts ...gr
 
 func (c *spacesClient) Get(ctx context.Context, in *GetRequest, opts ...grpc.CallOption) (*GetResponse, error) {
 	out := new(GetResponse)
-	err := c.cc.Invoke(ctx, "/content.spaces.Spaces/Get", in, out, opts...)
+	err := c.cc.Invoke(ctx, Spaces_Get_FullMethodName, in, out, opts...)
 	if err != nil {
 		return nil, err
 	}
@@ -55,7 +68,7 @@ func (c *spacesClient) Get(ctx context.Context, in *GetRequest, opts ...grpc.Cal
 
 func (c *spacesClient) List(ctx context.Context, in *ListRequest, opts ...grpc.CallOption) (*ListResponse, error) {
 	out := new(ListResponse)
-	err := c.cc.Invoke(ctx, "/content.spaces.Spaces/List", in, out, opts...)
+	err := c.cc.Invoke(ctx, Spaces_List_FullMethodName, in, out, opts...)
 	if err != nil {
 		return nil, err
 	}
@@ -64,7 +77,7 @@ func (c *spacesClient) List(ctx context.Context, in *ListRequest, opts ...grpc.C
 
 func (c *spacesClient) Update(ctx context.Context, in *UpdateRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) {
 	out := new(emptypb.Empty)
-	err := c.cc.Invoke(ctx, "/content.spaces.Spaces/Update", in, out, opts...)
+	err := c.cc.Invoke(ctx, Spaces_Update_FullMethodName, in, out, opts...)
 	if err != nil {
 		return nil, err
 	}
@@ -73,7 +86,7 @@ func (c *spacesClient) Update(ctx context.Context, in *UpdateRequest, opts ...gr
 
 func (c *spacesClient) UpdateConfig(ctx context.Context, in *UpdateConfigRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) {
 	out := new(emptypb.Empty)
-	err := c.cc.Invoke(ctx, "/content.spaces.Spaces/UpdateConfig", in, out, opts...)
+	err := c.cc.Invoke(ctx, Spaces_UpdateConfig_FullMethodName, in, out, opts...)
 	if err != nil {
 		return nil, err
 	}
@@ -82,7 +95,7 @@ func (c *spacesClient) UpdateConfig(ctx context.Context, in *UpdateConfigRequest
 
 func (c *spacesClient) Delete(ctx context.Context, in *DeleteRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) {
 	out := new(emptypb.Empty)
-	err := c.cc.Invoke(ctx, "/content.spaces.Spaces/Delete", in, out, opts...)
+	err := c.cc.Invoke(ctx, Spaces_Delete_FullMethodName, in, out, opts...)
 	if err != nil {
 		return nil, err
 	}
@@ -147,7 +160,7 @@ func _Spaces_Create_Handler(srv interface{}, ctx context.Context, dec func(inter
 	}
 	info := &grpc.UnaryServerInfo{
 		Server:     srv,
-		FullMethod: "/content.spaces.Spaces/Create",
+		FullMethod: Spaces_Create_FullMethodName,
 	}
 	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
 		return srv.(SpacesServer).Create(ctx, req.(*CreateRequest))
@@ -165,7 +178,7 @@ func _Spaces_Get_Handler(srv interface{}, ctx context.Context, dec func(interfac
 	}
 	info := &grpc.UnaryServerInfo{
 		Server:     srv,
-		FullMethod: "/content.spaces.Spaces/Get",
+		FullMethod: Spaces_Get_FullMethodName,
 	}
 	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
 		return srv.(SpacesServer).Get(ctx, req.(*GetRequest))
@@ -183,7 +196,7 @@ func _Spaces_List_Handler(srv interface{}, ctx context.Context, dec func(interfa
 	}
 	info := &grpc.UnaryServerInfo{
 		Server:     srv,
-		FullMethod: "/content.spaces.Spaces/List",
+		FullMethod: Spaces_List_FullMethodName,
 	}
 	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
 		return srv.(SpacesServer).List(ctx, req.(*ListRequest))
@@ -201,7 +214,7 @@ func _Spaces_Update_Handler(srv interface{}, ctx context.Context, dec func(inter
 	}
 	info := &grpc.UnaryServerInfo{
 		Server:     srv,
-		FullMethod: "/content.spaces.Spaces/Update",
+		FullMethod: Spaces_Update_FullMethodName,
 	}
 	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
 		return srv.(SpacesServer).Update(ctx, req.(*UpdateRequest))
@@ -219,7 +232,7 @@ func _Spaces_UpdateConfig_Handler(srv interface{}, ctx context.Context, dec func
 	}
 	info := &grpc.UnaryServerInfo{
 		Server:     srv,
-		FullMethod: "/content.spaces.Spaces/UpdateConfig",
+		FullMethod: Spaces_UpdateConfig_FullMethodName,
 	}
 	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
 		return srv.(SpacesServer).UpdateConfig(ctx, req.(*UpdateConfigRequest))
@@ -237,7 +250,7 @@ func _Spaces_Delete_Handler(srv interface{}, ctx context.Context, dec func(inter
 	}
 	info := &grpc.UnaryServerInfo{
 		Server:     srv,
-		FullMethod: "/content.spaces.Spaces/Delete",
+		FullMethod: Spaces_Delete_FullMethodName,
 	}
 	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
 		return srv.(SpacesServer).Delete(ctx, req.(*DeleteRequest))
diff --git a/users/users.pb.go b/proto/users/users.pb.go
similarity index 99%
rename from users/users.pb.go
rename to proto/users/users.pb.go
index 959bf1618ce3ee78b0d8ce323a1f10bb346dd57f..8ab0e5ce776aa5aade419ce8e8adc81ee8df5d18 100644
--- a/users/users.pb.go
+++ b/proto/users/users.pb.go
@@ -1,13 +1,13 @@
 // Code generated by protoc-gen-go. DO NOT EDIT.
 // versions:
-// 	protoc-gen-go v1.27.1
-// 	protoc        v3.17.3
+// 	protoc-gen-go v1.29.0
+// 	protoc        v3.21.12
 // source: users/users.proto
 
 package users
 
 import (
-	common "git.perx.ru/perxis/perxis-go/common"
+	common "git.perx.ru/perxis/perxis-go/proto/common"
 	protoreflect "google.golang.org/protobuf/reflect/protoreflect"
 	protoimpl "google.golang.org/protobuf/runtime/protoimpl"
 	emptypb "google.golang.org/protobuf/types/known/emptypb"
@@ -819,10 +819,11 @@ var file_users_users_proto_rawDesc = []byte{
 	0x65, 0x74, 0x42, 0x79, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x52, 0x65, 0x71, 0x75,
 	0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x2e, 0x75, 0x73,
 	0x65, 0x72, 0x73, 0x2e, 0x47, 0x65, 0x74, 0x42, 0x79, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74,
-	0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x42, 0x2a, 0x5a, 0x28, 0x67,
+	0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x42, 0x30, 0x5a, 0x2e, 0x67,
 	0x69, 0x74, 0x2e, 0x70, 0x65, 0x72, 0x78, 0x2e, 0x72, 0x75, 0x2f, 0x70, 0x65, 0x72, 0x78, 0x69,
-	0x73, 0x2f, 0x70, 0x65, 0x72, 0x78, 0x69, 0x73, 0x2d, 0x67, 0x6f, 0x2f, 0x75, 0x73, 0x65, 0x72,
-	0x73, 0x3b, 0x75, 0x73, 0x65, 0x72, 0x73, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
+	0x73, 0x2f, 0x70, 0x65, 0x72, 0x78, 0x69, 0x73, 0x2d, 0x67, 0x6f, 0x2f, 0x70, 0x72, 0x6f, 0x74,
+	0x6f, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x73, 0x3b, 0x75, 0x73, 0x65, 0x72, 0x73, 0x62, 0x06, 0x70,
+	0x72, 0x6f, 0x74, 0x6f, 0x33,
 }
 
 var (
diff --git a/users/users_grpc.pb.go b/proto/users/users_grpc.pb.go
similarity index 79%
rename from users/users_grpc.pb.go
rename to proto/users/users_grpc.pb.go
index 2e38c959aabb30b40987164c51f9900b8e7da1d1..8229c3b7e1b390aacdcd127a71efa166c138a494 100644
--- a/users/users_grpc.pb.go
+++ b/proto/users/users_grpc.pb.go
@@ -1,4 +1,8 @@
 // Code generated by protoc-gen-go-grpc. DO NOT EDIT.
+// versions:
+// - protoc-gen-go-grpc v1.3.0
+// - protoc             v3.21.12
+// source: users/users.proto
 
 package users
 
@@ -15,22 +19,31 @@ import (
 // Requires gRPC-Go v1.32.0 or later.
 const _ = grpc.SupportPackageIsVersion7
 
+const (
+	Users_Create_FullMethodName        = "/account.users.Users/Create"
+	Users_Get_FullMethodName           = "/account.users.Users/Get"
+	Users_Find_FullMethodName          = "/account.users.Users/Find"
+	Users_Update_FullMethodName        = "/account.users.Users/Update"
+	Users_Delete_FullMethodName        = "/account.users.Users/Delete"
+	Users_GetByIdentity_FullMethodName = "/account.users.Users/GetByIdentity"
+)
+
 // UsersClient is the client API for Users service.
 //
 // For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream.
 type UsersClient interface {
 	// Создание пользователя или регистрация текущего пользователя в системе, если create.id == `current`
 	Create(ctx context.Context, in *CreateRequest, opts ...grpc.CallOption) (*CreateResponse, error)
-	//  - Получение любого пользователя по идентификатору
-	//  - Получение текущего (от лица которого делается запрос) пользователя по специальному идентификатору `current`
+	// - Получение любого пользователя по идентификатору
+	// - Получение текущего (от лица которого делается запрос) пользователя по специальному идентификатору `current`
 	Get(ctx context.Context, in *GetRequest, opts ...grpc.CallOption) (*GetResponse, error)
 	// Найти пользователей с фильтрацией. Фильтры доступны пользователям в зависимости от их прав
 	Find(ctx context.Context, in *FindRequest, opts ...grpc.CallOption) (*FindResponse, error)
-	//  - Обновление существующего пользователя по идентификатору
-	//  - Обновление текущего пользователя по спец. идентификатору `current`
+	// - Обновление существующего пользователя по идентификатору
+	// - Обновление текущего пользователя по спец. идентификатору `current`
 	Update(ctx context.Context, in *UpdateRequest, opts ...grpc.CallOption) (*emptypb.Empty, error)
-	//  - Удаление существующего пользователя по идентификатору
-	//  - Удаление текущего пользователя по спец. идентификатору `current`
+	// - Удаление существующего пользователя по идентификатору
+	// - Удаление текущего пользователя по спец. идентификатору `current`
 	Delete(ctx context.Context, in *DeleteRequest, opts ...grpc.CallOption) (*emptypb.Empty, error)
 	// Метод для внутреннего использования. Недоступен для внешних
 	// запросов - авторизация вернет ошибку `access denied`
@@ -47,7 +60,7 @@ func NewUsersClient(cc grpc.ClientConnInterface) UsersClient {
 
 func (c *usersClient) Create(ctx context.Context, in *CreateRequest, opts ...grpc.CallOption) (*CreateResponse, error) {
 	out := new(CreateResponse)
-	err := c.cc.Invoke(ctx, "/account.users.Users/Create", in, out, opts...)
+	err := c.cc.Invoke(ctx, Users_Create_FullMethodName, in, out, opts...)
 	if err != nil {
 		return nil, err
 	}
@@ -56,7 +69,7 @@ func (c *usersClient) Create(ctx context.Context, in *CreateRequest, opts ...grp
 
 func (c *usersClient) Get(ctx context.Context, in *GetRequest, opts ...grpc.CallOption) (*GetResponse, error) {
 	out := new(GetResponse)
-	err := c.cc.Invoke(ctx, "/account.users.Users/Get", in, out, opts...)
+	err := c.cc.Invoke(ctx, Users_Get_FullMethodName, in, out, opts...)
 	if err != nil {
 		return nil, err
 	}
@@ -65,7 +78,7 @@ func (c *usersClient) Get(ctx context.Context, in *GetRequest, opts ...grpc.Call
 
 func (c *usersClient) Find(ctx context.Context, in *FindRequest, opts ...grpc.CallOption) (*FindResponse, error) {
 	out := new(FindResponse)
-	err := c.cc.Invoke(ctx, "/account.users.Users/Find", in, out, opts...)
+	err := c.cc.Invoke(ctx, Users_Find_FullMethodName, in, out, opts...)
 	if err != nil {
 		return nil, err
 	}
@@ -74,7 +87,7 @@ func (c *usersClient) Find(ctx context.Context, in *FindRequest, opts ...grpc.Ca
 
 func (c *usersClient) Update(ctx context.Context, in *UpdateRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) {
 	out := new(emptypb.Empty)
-	err := c.cc.Invoke(ctx, "/account.users.Users/Update", in, out, opts...)
+	err := c.cc.Invoke(ctx, Users_Update_FullMethodName, in, out, opts...)
 	if err != nil {
 		return nil, err
 	}
@@ -83,7 +96,7 @@ func (c *usersClient) Update(ctx context.Context, in *UpdateRequest, opts ...grp
 
 func (c *usersClient) Delete(ctx context.Context, in *DeleteRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) {
 	out := new(emptypb.Empty)
-	err := c.cc.Invoke(ctx, "/account.users.Users/Delete", in, out, opts...)
+	err := c.cc.Invoke(ctx, Users_Delete_FullMethodName, in, out, opts...)
 	if err != nil {
 		return nil, err
 	}
@@ -92,7 +105,7 @@ func (c *usersClient) Delete(ctx context.Context, in *DeleteRequest, opts ...grp
 
 func (c *usersClient) GetByIdentity(ctx context.Context, in *GetByIdentityRequest, opts ...grpc.CallOption) (*GetByIdentityResponse, error) {
 	out := new(GetByIdentityResponse)
-	err := c.cc.Invoke(ctx, "/account.users.Users/GetByIdentity", in, out, opts...)
+	err := c.cc.Invoke(ctx, Users_GetByIdentity_FullMethodName, in, out, opts...)
 	if err != nil {
 		return nil, err
 	}
@@ -105,16 +118,16 @@ func (c *usersClient) GetByIdentity(ctx context.Context, in *GetByIdentityReques
 type UsersServer interface {
 	// Создание пользователя или регистрация текущего пользователя в системе, если create.id == `current`
 	Create(context.Context, *CreateRequest) (*CreateResponse, error)
-	//  - Получение любого пользователя по идентификатору
-	//  - Получение текущего (от лица которого делается запрос) пользователя по специальному идентификатору `current`
+	// - Получение любого пользователя по идентификатору
+	// - Получение текущего (от лица которого делается запрос) пользователя по специальному идентификатору `current`
 	Get(context.Context, *GetRequest) (*GetResponse, error)
 	// Найти пользователей с фильтрацией. Фильтры доступны пользователям в зависимости от их прав
 	Find(context.Context, *FindRequest) (*FindResponse, error)
-	//  - Обновление существующего пользователя по идентификатору
-	//  - Обновление текущего пользователя по спец. идентификатору `current`
+	// - Обновление существующего пользователя по идентификатору
+	// - Обновление текущего пользователя по спец. идентификатору `current`
 	Update(context.Context, *UpdateRequest) (*emptypb.Empty, error)
-	//  - Удаление существующего пользователя по идентификатору
-	//  - Удаление текущего пользователя по спец. идентификатору `current`
+	// - Удаление существующего пользователя по идентификатору
+	// - Удаление текущего пользователя по спец. идентификатору `current`
 	Delete(context.Context, *DeleteRequest) (*emptypb.Empty, error)
 	// Метод для внутреннего использования. Недоступен для внешних
 	// запросов - авторизация вернет ошибку `access denied`
@@ -167,7 +180,7 @@ func _Users_Create_Handler(srv interface{}, ctx context.Context, dec func(interf
 	}
 	info := &grpc.UnaryServerInfo{
 		Server:     srv,
-		FullMethod: "/account.users.Users/Create",
+		FullMethod: Users_Create_FullMethodName,
 	}
 	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
 		return srv.(UsersServer).Create(ctx, req.(*CreateRequest))
@@ -185,7 +198,7 @@ func _Users_Get_Handler(srv interface{}, ctx context.Context, dec func(interface
 	}
 	info := &grpc.UnaryServerInfo{
 		Server:     srv,
-		FullMethod: "/account.users.Users/Get",
+		FullMethod: Users_Get_FullMethodName,
 	}
 	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
 		return srv.(UsersServer).Get(ctx, req.(*GetRequest))
@@ -203,7 +216,7 @@ func _Users_Find_Handler(srv interface{}, ctx context.Context, dec func(interfac
 	}
 	info := &grpc.UnaryServerInfo{
 		Server:     srv,
-		FullMethod: "/account.users.Users/Find",
+		FullMethod: Users_Find_FullMethodName,
 	}
 	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
 		return srv.(UsersServer).Find(ctx, req.(*FindRequest))
@@ -221,7 +234,7 @@ func _Users_Update_Handler(srv interface{}, ctx context.Context, dec func(interf
 	}
 	info := &grpc.UnaryServerInfo{
 		Server:     srv,
-		FullMethod: "/account.users.Users/Update",
+		FullMethod: Users_Update_FullMethodName,
 	}
 	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
 		return srv.(UsersServer).Update(ctx, req.(*UpdateRequest))
@@ -239,7 +252,7 @@ func _Users_Delete_Handler(srv interface{}, ctx context.Context, dec func(interf
 	}
 	info := &grpc.UnaryServerInfo{
 		Server:     srv,
-		FullMethod: "/account.users.Users/Delete",
+		FullMethod: Users_Delete_FullMethodName,
 	}
 	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
 		return srv.(UsersServer).Delete(ctx, req.(*DeleteRequest))
@@ -257,7 +270,7 @@ func _Users_GetByIdentity_Handler(srv interface{}, ctx context.Context, dec func
 	}
 	info := &grpc.UnaryServerInfo{
 		Server:     srv,
-		FullMethod: "/account.users.Users/GetByIdentity",
+		FullMethod: Users_GetByIdentity_FullMethodName,
 	}
 	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
 		return srv.(UsersServer).GetByIdentity(ctx, req.(*GetByIdentityRequest))
diff --git a/versions/account/versions.pb.go b/proto/versions/account/versions.pb.go
similarity index 94%
rename from versions/account/versions.pb.go
rename to proto/versions/account/versions.pb.go
index 7c60f7083755022d943720eca550cbd64d40e0e9..c9e0a8db89275bd866540cd39cd3e8444642caa3 100644
--- a/versions/account/versions.pb.go
+++ b/proto/versions/account/versions.pb.go
@@ -1,13 +1,13 @@
 // Code generated by protoc-gen-go. DO NOT EDIT.
 // versions:
-// 	protoc-gen-go v1.27.1
-// 	protoc        v3.17.3
+// 	protoc-gen-go v1.29.0
+// 	protoc        v3.21.12
 // source: versions/account/versions.proto
 
 package account
 
 import (
-	common "git.perx.ru/perxis/perxis-go/common"
+	common "git.perx.ru/perxis/perxis-go/proto/common"
 	protoreflect "google.golang.org/protobuf/reflect/protoreflect"
 	protoimpl "google.golang.org/protobuf/runtime/protoimpl"
 	emptypb "google.golang.org/protobuf/types/known/emptypb"
@@ -85,11 +85,11 @@ var file_versions_account_versions_proto_rawDesc = []byte{
 	0x6e, 0x73, 0x12, 0x35, 0x0a, 0x03, 0x47, 0x65, 0x74, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67,
 	0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74,
 	0x79, 0x1a, 0x14, 0x2e, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x2e, 0x47, 0x65, 0x74, 0x52,
-	0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x42, 0x37, 0x5a, 0x35, 0x67, 0x69, 0x74,
+	0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x42, 0x3d, 0x5a, 0x3b, 0x67, 0x69, 0x74,
 	0x2e, 0x70, 0x65, 0x72, 0x78, 0x2e, 0x72, 0x75, 0x2f, 0x70, 0x65, 0x72, 0x78, 0x69, 0x73, 0x2f,
-	0x70, 0x65, 0x72, 0x78, 0x69, 0x73, 0x2d, 0x67, 0x6f, 0x2f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f,
-	0x6e, 0x73, 0x2f, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x3b, 0x61, 0x63, 0x63, 0x6f, 0x75,
-	0x6e, 0x74, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
+	0x70, 0x65, 0x72, 0x78, 0x69, 0x73, 0x2d, 0x67, 0x6f, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f,
+	0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74,
+	0x3b, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
 }
 
 var (
diff --git a/versions/account/versions_grpc.pb.go b/proto/versions/account/versions_grpc.pb.go
similarity index 91%
rename from versions/account/versions_grpc.pb.go
rename to proto/versions/account/versions_grpc.pb.go
index dfab478bd726b5ae3689084be9afa1e853f84126..2d017713cdd8731f90283b3596d6c391dc7acd49 100644
--- a/versions/account/versions_grpc.pb.go
+++ b/proto/versions/account/versions_grpc.pb.go
@@ -1,4 +1,8 @@
 // Code generated by protoc-gen-go-grpc. DO NOT EDIT.
+// versions:
+// - protoc-gen-go-grpc v1.3.0
+// - protoc             v3.21.12
+// source: versions/account/versions.proto
 
 package account
 
@@ -15,6 +19,10 @@ import (
 // Requires gRPC-Go v1.32.0 or later.
 const _ = grpc.SupportPackageIsVersion7
 
+const (
+	Versions_Get_FullMethodName = "/account.Versions/Get"
+)
+
 // VersionsClient is the client API for Versions service.
 //
 // For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream.
@@ -32,7 +40,7 @@ func NewVersionsClient(cc grpc.ClientConnInterface) VersionsClient {
 
 func (c *versionsClient) Get(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (*GetResponse, error) {
 	out := new(GetResponse)
-	err := c.cc.Invoke(ctx, "/account.Versions/Get", in, out, opts...)
+	err := c.cc.Invoke(ctx, Versions_Get_FullMethodName, in, out, opts...)
 	if err != nil {
 		return nil, err
 	}
@@ -77,7 +85,7 @@ func _Versions_Get_Handler(srv interface{}, ctx context.Context, dec func(interf
 	}
 	info := &grpc.UnaryServerInfo{
 		Server:     srv,
-		FullMethod: "/account.Versions/Get",
+		FullMethod: Versions_Get_FullMethodName,
 	}
 	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
 		return srv.(VersionsServer).Get(ctx, req.(*emptypb.Empty))
diff --git a/versions/content/versions.pb.go b/proto/versions/content/versions.pb.go
similarity index 94%
rename from versions/content/versions.pb.go
rename to proto/versions/content/versions.pb.go
index 967cfc4b48fb361eafea1421402da7d98769be5a..ad5fdb6eb88f9898488b5875d51939edd55853b7 100644
--- a/versions/content/versions.pb.go
+++ b/proto/versions/content/versions.pb.go
@@ -1,13 +1,13 @@
 // Code generated by protoc-gen-go. DO NOT EDIT.
 // versions:
-// 	protoc-gen-go v1.27.1
-// 	protoc        v3.17.3
+// 	protoc-gen-go v1.29.0
+// 	protoc        v3.21.12
 // source: versions/content/versions.proto
 
 package content
 
 import (
-	common "git.perx.ru/perxis/perxis-go/common"
+	common "git.perx.ru/perxis/perxis-go/proto/common"
 	protoreflect "google.golang.org/protobuf/reflect/protoreflect"
 	protoimpl "google.golang.org/protobuf/runtime/protoimpl"
 	emptypb "google.golang.org/protobuf/types/known/emptypb"
@@ -85,11 +85,11 @@ var file_versions_content_versions_proto_rawDesc = []byte{
 	0x6e, 0x73, 0x12, 0x35, 0x0a, 0x03, 0x47, 0x65, 0x74, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67,
 	0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74,
 	0x79, 0x1a, 0x14, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x47, 0x65, 0x74, 0x52,
-	0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x42, 0x37, 0x5a, 0x35, 0x67, 0x69, 0x74,
+	0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x42, 0x3d, 0x5a, 0x3b, 0x67, 0x69, 0x74,
 	0x2e, 0x70, 0x65, 0x72, 0x78, 0x2e, 0x72, 0x75, 0x2f, 0x70, 0x65, 0x72, 0x78, 0x69, 0x73, 0x2f,
-	0x70, 0x65, 0x72, 0x78, 0x69, 0x73, 0x2d, 0x67, 0x6f, 0x2f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f,
-	0x6e, 0x73, 0x2f, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x3b, 0x63, 0x6f, 0x6e, 0x74, 0x65,
-	0x6e, 0x74, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
+	0x70, 0x65, 0x72, 0x78, 0x69, 0x73, 0x2d, 0x67, 0x6f, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f,
+	0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74,
+	0x3b, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
 }
 
 var (
diff --git a/versions/content/versions_grpc.pb.go b/proto/versions/content/versions_grpc.pb.go
similarity index 91%
rename from versions/content/versions_grpc.pb.go
rename to proto/versions/content/versions_grpc.pb.go
index 5a918459fbc8acbc670e8a0683e9fdb20f987c20..f106e46d75acdbf07e54757730a3e078b3159ef4 100644
--- a/versions/content/versions_grpc.pb.go
+++ b/proto/versions/content/versions_grpc.pb.go
@@ -1,4 +1,8 @@
 // Code generated by protoc-gen-go-grpc. DO NOT EDIT.
+// versions:
+// - protoc-gen-go-grpc v1.3.0
+// - protoc             v3.21.12
+// source: versions/content/versions.proto
 
 package content
 
@@ -15,6 +19,10 @@ import (
 // Requires gRPC-Go v1.32.0 or later.
 const _ = grpc.SupportPackageIsVersion7
 
+const (
+	Versions_Get_FullMethodName = "/content.Versions/Get"
+)
+
 // VersionsClient is the client API for Versions service.
 //
 // For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream.
@@ -32,7 +40,7 @@ func NewVersionsClient(cc grpc.ClientConnInterface) VersionsClient {
 
 func (c *versionsClient) Get(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (*GetResponse, error) {
 	out := new(GetResponse)
-	err := c.cc.Invoke(ctx, "/content.Versions/Get", in, out, opts...)
+	err := c.cc.Invoke(ctx, Versions_Get_FullMethodName, in, out, opts...)
 	if err != nil {
 		return nil, err
 	}
@@ -77,7 +85,7 @@ func _Versions_Get_Handler(srv interface{}, ctx context.Context, dec func(interf
 	}
 	info := &grpc.UnaryServerInfo{
 		Server:     srv,
-		FullMethod: "/content.Versions/Get",
+		FullMethod: Versions_Get_FullMethodName,
 	}
 	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
 		return srv.(VersionsServer).Get(ctx, req.(*emptypb.Empty))