diff --git a/proto/common/operation.proto b/proto/common/operation.proto
new file mode 100644
index 0000000000000000000000000000000000000000..d77171ae99b45592065af7b9b2d6e016190ce65a
--- /dev/null
+++ b/proto/common/operation.proto
@@ -0,0 +1,42 @@
+syntax = "proto3";
+
+package common;
+
+import "google/protobuf/timestamp.proto";
+import "google/protobuf/any.proto";
+
+option go_package = "git.perx.ru/perxis/perxis-go/proto/common;common";
+
+
+// Операция
+message Operation {
+  // ID операции
+  string id = 1;
+
+  // Описание операции
+  string description = 2;
+
+  // Время создания операции
+  google.protobuf.Timestamp created_at = 3;
+
+  // Создатель операции
+  string created_by = 4;
+
+  // Время последнего изменения операции
+  google.protobuf.Timestamp modified_at = 6;
+
+  // Операция завершена
+  bool done = 7;
+
+  // Метаданные операции
+  google.protobuf.Any metadata = 8;
+
+  // Результат выполнения операции
+  oneof result {
+    // Результат выполнения операции в случае успеха
+    google.protobuf.Any response = 9;
+
+    // Результат выполнения операции в случае ошибки
+    string error = 10;
+  }
+}
diff --git a/proto/common/operation_service.proto b/proto/common/operation_service.proto
new file mode 100644
index 0000000000000000000000000000000000000000..60b1b8b9b537e8078f77390c2f928eb222fb0280
--- /dev/null
+++ b/proto/common/operation_service.proto
@@ -0,0 +1,24 @@
+syntax = "proto3";
+
+option go_package = "git.perx.ru/perxis/perxis-go/proto/common;common";
+
+package common;
+
+import "common/operation.proto";
+import "common/validation.proto";
+
+service OperationService {
+  // Возвращает статус операции и ее результат, если она завершена
+  rpc Get (GetOperationRequest) returns (Operation) {}
+
+  // Отменяет выполнение операции, если это поддерживается сервисом
+  rpc Cancel (CancelOperationRequest) returns (Operation) {}
+}
+
+message GetOperationRequest {
+  string operation_id = 1 [(required) = true];
+}
+
+message CancelOperationRequest {
+  string operation_id = 1 [(required) = true];
+}
diff --git a/proto/common/validation.proto b/proto/common/validation.proto
new file mode 100644
index 0000000000000000000000000000000000000000..f4f5c974339a9c9ae08f59353bb0963358d0ce62
--- /dev/null
+++ b/proto/common/validation.proto
@@ -0,0 +1,28 @@
+syntax = "proto3";
+
+package common;
+
+option go_package = "git.perx.ru/perxis/perxis-go/proto/common;common";
+
+import "google/protobuf/descriptor.proto";
+
+extend google.protobuf.OneofOptions {
+  bool exactly_one = 101400;
+}
+
+extend google.protobuf.FieldOptions {
+  bool required = 101501;
+  string pattern = 101502;
+  string value = 101503;
+  string size = 101504;
+  string length = 101505;
+  bool unique = 101506;
+  MapKeySpec map_key = 101510;
+  string bytes = 101511;
+}
+
+message MapKeySpec {
+  string value = 1;
+  string pattern = 2;
+  string length = 3;
+}
\ No newline at end of file
diff --git a/proto/extensions/extension.proto b/proto/extensions/extension.proto
index 456e90dab5b48945572d3be502bef9278c04d046..e6f694cdbc475341926d6c528fb6f6c59fa60520 100644
--- a/proto/extensions/extension.proto
+++ b/proto/extensions/extension.proto
@@ -16,131 +16,6 @@ package extensions;
 
 import "references/references.proto";
 
-// Extension - API расширения
-service Extension {
-
-  // Для установки расширения выполняется запрос к сервису с указанием расширений которые должны быть установлены. Если
-  // расширение уже установлено процесс возвращает ошибку.
-  rpc Install(InstallRequest) returns (InstallResponse) {}
-
-  // Можно запросить проверку статуса установки для расширения. При этом расширение проверяет наличие необходимых данных в
-  // пространстве или наличие новой версии расширения и сообщает об этом. Никаких действий с данными пространства не
-  // производится.
-  rpc Check(CheckRequest) returns (CheckResponse) {}
-
-  // Сервис выполняет необходимые действия с данными и миграции для соответствия нужной версии расширения.
-  // Если расширение не установлено процесс обновления возвращает ошибку.
-  rpc Update(UpdateRequest) returns (UpdateResponse) {}
-
-  // Удаление расширения из пространства.
-  rpc Uninstall(UninstallRequest) returns (UninstallResponse) {} // Удаление расширений
-
-
-  // Пользовательские Действия (Actions)
-  //
-  // Пользовательские действия позволяют расширить функционал пользовательского интерфейса путем
-  // добавления в интерфейс элементов взаимодействуя с которыми пользователь может вызывать реакцию на
-  // сервере или переход в интерфейсе.
-  //
-  // Пользовательские действия добавляются при установке расширений в системную коллекции `System/Actions`.
-  // Коллекция создается автоматически менеджером расширений. При установке так же отображается меню `Действия`
-  // доступное для всех пользователей.
-  //
-  // Примеры пользовательских действий:
-  // - "Собрать сайт" - добавляется Perxis.Web для сборки сайта, доступна пользователю через меню,
-  //   параметры space_id, env_id. При вызове выполняется запрос на сервер ProcessAction.
-  // - "Посмотреть задачи" - добавляется Tasks для перехода на коллекцию задач. Отображается в меню,
-  //   параметры space_id, env_id.
-  //
-  // Приложения так же могут использовать действия для вызова обработки в других приложениях при
-  // необходимости.
-  rpc Action(ActionRequest) returns(ActionResponse) {} // Выполнить указанное действие
-}
-
-message InstallRequest {
-  repeated string extensions = 10000; // Список расширений для установки
-  string space_id = 10010; // Пространство для установки расширений
-  string env_id = 10020; // Идентификатор окружения для установки (по умолчанию master)
-  bool force = 10100; // Игнорировать и автоматически исправлять ошибки установки
-}
-
-message ExtensionRequestResult {
-  enum State {
-    OK = 0; // Запрос завершен
-    ERROR = 1; // Возникла ошибка
-    PENDING = 2; // Запрос ожидает выполнения
-    IN_PROGRESS = 3; // Запрос выполняется
-    PARAMETERS_REQUIRED= 4; // Требуются дополнительные данные для выполнения запроса
-  }
-
-  State state = 10000;  // Состояние расширение
-  string extension = 10100; // Имя расширения
-  string msg = 10200; // Сообщение
-  string error = 10300; // Ошибка (state == ERROR)
-  bool update_available = 10400; // Доступно обновление
-}
-
-message InstallResponse {
-  repeated ExtensionRequestResult results = 10000; // Список состояний расширений после установки
-}
-
-message UninstallRequest {
-  repeated string extensions = 10000; // Список расширений для удаления
-  string space_id = 10010; // Пространство для удаления расширений
-  string env_id = 10020; // Идентификатор окружения для установки (по умолчанию master)
-  bool remove = 10100; // Удалить все коллекции и данные
-  bool force = 10200; // Удалять расширения вне зависимости от возможных ошибок, без учета зависимостей
-}
-
-message UninstallResponse {
-  repeated ExtensionRequestResult results = 10000; // Список состояний расширений после удаления
-}
-
-message UpdateRequest {
-  repeated string extensions = 10000; // Список расширений для удаления
-  string space_id = 10010; // Пространство для удаления расширений
-  string env_id = 10020; // Идентификатор окружения для установки (по умолчанию master)
-  bool force = 10100; // Выполнять обновление и автоматически исправлять ошибки
-}
-
-message UpdateResponse {
-  repeated ExtensionRequestResult results = 10000; // Список состояний расширений после удаления
-}
-
-message CheckRequest {
-  repeated string extensions = 10000; // Список расширений для удаления
-  string space_id = 10010; // Пространство для удаления расширений
-  string env_id = 10020; // Идентификатор окружения для установки (по умолчанию master)
-}
-
-message CheckResponse {
-  repeated ExtensionRequestResult results = 10000; // Список состояний расширений
-}
-
-// ActionRequest - запрос на выполнение действия к расширению (или менеджеру расширений)
-message ActionRequest {
-  string extension = 1000;
-  string action = 10100;
-  string space_id = 10500;
-  string env_id = 10510;
-  string collection_id = 10520;
-  string item_id = 10530;
-  repeated string item_ids = 10540;
-
-  // Поля к которым применимо действие. В случае если действие выполняется из списка записей, содержит перечень
-  // полей которые пользователь выбрал для отображения в интерфейсе.
-  repeated string fields = 10550;
-
-  map<string,string> metadata = 11000;
-
-  // Ссылки на записи используемые для выполнения действия (назначение ссылок зависит от действия и расширения)
-  repeated content.references.Reference refs = 11010;
-
-  // Ссылка на документ с параметрами выполнения Action.
-  // Чтобы при выполнении действия открывалась форма параметров, необходимо указать `Action.params_collection`
-  content.references.Reference params = 11020;
-}
-
 // Target - определяет как открывать результат выполнения действия в пользовательском интерфейсе
 enum Target {
   DEFAULT = 0; // По умолчанию (если нет других условий, то MODAL)
@@ -153,33 +28,6 @@ enum Target {
   NONE = 100; // Не отображать результат
 }
 
-message ActionResponse {
-  enum State {
-    DONE = 0; // Запрос завершен
-    ERROR = 1; // Возникла ошибка
-    PENDING = 2; // Запрос ожидает выполнения
-    IN_PROGRESS = 3; // Запрос выполняется
-    PARAMETERS_REQUIRED = 4; // Требуются дополнительные данные для выполнения запроса
-  }
-
-  enum Format {
-    PLAIN = 0;
-    HTML = 1;
-    MARKDOWN = 2;
-  }
-
-  State state = 10000;  // Состояние расширение
-  Target target = 10010; // Как открывать результат выполнения действия в пользовательском интерфейсе (переопределяет значение в Action)
-	Format format = 10050; // Формат полей msg  и error
-  string msg = 10100; // Сообщение о выполнении действия
-  string title = 10110; // Текст для отображения в интерфейсе
-  string image = 10140; // Изображение для отображения в интерфейсе (шапке окна)
-  string error = 10200; // Сообщение в случае ошибки (дополнительно к msg)
-  repeated Action next = 10300; // Следующие возможные действия. Интерфейс отображает как варианты дальнейших действий пользователя
-  map<string,string>metadata = 10400; // Метаданные запроса
-  repeated content.references.Reference refs = 10320; // Ссылки на записи (назначение ссылок зависит от действия и расширения)
-}
-
 
 /**
 Action описывает как коллекцию в системе с предуставновленными действиями, так и возможные дальнейшие действия после
@@ -261,7 +109,7 @@ message Action {
 
   ActionRequest request = 10400; // Параметры запроса (используется в случае `ActionResponse.next`)
 
-  // DEPRECATED: Используйте `action_url` вместо `navigation_route`
+  // DEPRECATED: Используйте `action` вместо `navigation_route`
   bool navigation_action = 10500; // Флаг указывающий что действие переносить пользователя в другую часть интерфейса, а не отправляет запрос на сервер
 
   // navigation_route - Строка шаблон для перехода в интерфейсе
@@ -275,7 +123,7 @@ message Action {
   // - :colId
   // - :itemId
   //
-  // DEPRECATED: Используйте `action_type == "NAVIGATION"`
+  // DEPRECATED: Используйте `action`
   string navigation_route = 10510;
 
   // Параметр указывающий что действие выполняется автоматически
@@ -295,4 +143,28 @@ message Action {
 
   View view = 10540; // Отображение действия в интерфейсе
   int32 order = 10550; // Порядок отображения действия в интерфейсе (Для пунктов меню)
+}
+
+// ActionRequest - запрос на выполнение действия к расширению (или менеджеру расширений)
+message ActionRequest {
+  string extension = 1000;
+  string action = 10100;
+  string space_id = 10500;
+  string env_id = 10510;
+  string collection_id = 10520;
+  string item_id = 10530;
+  repeated string item_ids = 10540;
+
+  // Поля к которым применимо действие. В случае если действие выполняется из списка записей, содержит перечень
+  // полей которые пользователь выбрал для отображения в интерфейсе.
+  repeated string fields = 10550;
+
+  map<string,string> metadata = 11000;
+
+  // Ссылки на записи используемые для выполнения действия (назначение ссылок зависит от действия и расширения)
+  repeated content.references.Reference refs = 11010;
+
+  // Ссылка на документ с параметрами выполнения Action.
+  // Чтобы при выполнении действия открывалась форма параметров, необходимо указать `Action.params_collection`
+  content.references.Reference params = 11020;
 }
\ No newline at end of file
diff --git a/proto/extensions/extension_service.proto b/proto/extensions/extension_service.proto
new file mode 100644
index 0000000000000000000000000000000000000000..a70db228f01e53bd01482d434ed719efb3220bf6
--- /dev/null
+++ b/proto/extensions/extension_service.proto
@@ -0,0 +1,108 @@
+/**
+# Расширения (Extensions)
+
+Расширения представляют собой отдельные сервисы предоставляющие дополнительные возможности для пользователей. Сервис
+может предоставлять несколько расширений одновременно.
+
+Для координации взаимодействия используется сервис менеджер расширений (Extension Manager). Для предоставления своих функций в систему сервис должен
+зарегистрироваться на контроллере.
+
+*/
+syntax = "proto3";
+
+option go_package = "git.perx.ru/perxis/perxis-go/proto/extensions;extensions";
+
+package extensions;
+
+import "references/references.proto";
+import "common/operation.proto";
+import "extensions/extension.proto";
+
+// ExtensionService - API расширения
+// Сервис должен реализовывать методы `common.OperationService` для работы операциями.
+service ExtensionService {
+
+  // Install выполняет установку указанных расширений. Если
+  // расширение уже установлены выполняет процесс переустановки. Возвращает longtime операцию
+  rpc Install(InstallRequest) returns (common.Operation) {}
+
+  // Uninstall выполняет удаление указанных расширений.
+  rpc Uninstall(UninstallRequest) returns (common.Operation) {}
+
+  // Check выполняет проверку установки для расширения. При этом расширение проверяет наличие необходимых данных в
+  // пространстве или наличие новой версии расширения и сообщает об этом. Никаких действий с данными пространства не
+  // производится.
+  rpc Check(CheckRequest) returns (common.Operation) {}
+
+  // Пользовательские Действия (Actions)
+  //
+  // Пользовательские действия позволяют расширить функционал пользовательского интерфейса путем
+  // добавления в интерфейс элементов взаимодействуя с которыми пользователь может вызывать реакцию на
+  // сервере или переход в интерфейсе.
+  //
+  // Пользовательские действия добавляются при установке расширений в системную коллекции `System/Actions`.
+  // Коллекция создается автоматически менеджером расширений. При установке так же отображается меню `Действия`
+  // доступное для всех пользователей.
+  //
+  // Примеры пользовательских действий:
+  // - "Собрать сайт" - добавляется Perxis.Web для сборки сайта, доступна пользователю через меню,
+  //   параметры space_id, env_id. При вызове выполняется запрос на сервер ProcessAction.
+  // - "Посмотреть задачи" - добавляется Tasks для перехода на коллекцию задач. Отображается в меню,
+  //   параметры space_id, env_id.
+  //
+  // Приложения так же могут использовать действия для вызова обработки в других приложениях при
+  // необходимости.
+  rpc Action(ActionRequest) returns(ActionResponse) {} // Выполнить указанное действие
+}
+
+
+// InstallRequest - запрос на установку расширений
+message InstallRequest {
+  repeated string extensions = 10000; // Список расширений для установки
+  string space_id = 10010; // Пространство для установки расширений
+  string env_id = 10020; // Идентификатор окружения для установки
+  bool force = 10100; // Устанавливать расширения вне зависимости от возможных ошибок
+}
+
+// UninstallRequest - запрос на удаление расширений
+message UninstallRequest {
+  repeated string extensions = 10000; // Список расширений для удаления
+  string space_id = 10010; // Пространство для удаления расширений
+  string env_id = 10020; // Идентификатор окружения для установки (по умолчанию master)
+  bool remove = 10100; // Удалить сделанные расширением изменения в пространстве, если возможно
+  bool force = 10200; // Удалять расширения вне зависимости от возможных ошибок, без учета зависимостей
+}
+
+// CheckRequest - запрос на проверку статуса установки расширений
+message CheckRequest {
+  repeated string extensions = 10000; // Список расширений для проверки
+  string space_id = 10010; // Пространство
+  string env_id = 10020; // Идентификатор окружения (по умолчанию master)
+}
+
+message ActionResponse {
+  enum State {
+    DONE = 0; // Запрос завершен
+    ERROR = 1; // Возникла ошибка
+    PENDING = 2; // Запрос ожидает выполнения
+    IN_PROGRESS = 3; // Запрос выполняется
+    PARAMETERS_REQUIRED = 4; // Требуются дополнительные данные для выполнения запроса
+  }
+
+  enum Format {
+    PLAIN = 0;
+    HTML = 1;
+    MARKDOWN = 2;
+  }
+
+  State state = 10000;  // Состояние расширение
+  Target target = 10010; // Как открывать результат выполнения действия в пользовательском интерфейсе (переопределяет значение в Action)
+  Format format = 10050; // Формат полей msg  и error
+  string msg = 10100; // Сообщение о выполнении действия
+  string title = 10110; // Текст для отображения в интерфейсе
+  string image = 10140; // Изображение для отображения в интерфейсе (шапке окна)
+  string error = 10200; // Сообщение в случае ошибки (дополнительно к msg)
+  repeated Action next = 10300; // Следующие возможные действия. Интерфейс отображает как варианты дальнейших действий пользователя
+  map<string,string>metadata = 10400; // Метаданные запроса
+  repeated content.references.Reference refs = 10320; // Ссылки на записи (назначение ссылок зависит от действия и расширения)
+}
diff --git a/proto/extensions/manager.proto b/proto/extensions/manager_service.proto
similarity index 75%
rename from proto/extensions/manager.proto
rename to proto/extensions/manager_service.proto
index 0def40164a520bc46acaf6440608a803944bd937..a85bde685fc633051564d36dcace24088a683e1f 100644
--- a/proto/extensions/manager.proto
+++ b/proto/extensions/manager_service.proto
@@ -32,28 +32,56 @@ option go_package = "git.perx.ru/perxis/perxis-go/proto/extensions;extensions";
 package extensions;
 
 // ExtensionManager - менеджер расширений. Должен реализовывать так же сервис Extension
-service ExtensionManager {
+service ExtensionManagerService {
   // ##  Регистрация расширений
   //
-  // Регистрация\Дерегистрация происходить через сервис менеджера расширений (Extension Manager). В процессе регистрации сервис сообщает
+  // Регистрация\Дерегистрация происходит через сервис менеджера расширений (Extension Manager). В процессе регистрации сервис сообщает
   // о поддерживаемых сервисом действиях (Actions) и версии сервиса и зависимостях:
-  // 1. Действия (Actions) - перечень действия которые обрабатываются сервисом. Включает в себя как системные действия,
-  // так и пользовательские, которые могут быть использованы в интерфейсе;
+  // ~~1. Действия (Actions) - перечень действия которые обрабатываются сервисом. Включает в себя как системные действия,
+  // так и пользовательские, которые могут быть использованы в интерфейсе;~~
   // 2. Имя сервиса/расширения - название сервиса внутри системы;
   // 3. Версия сервиса - сервис сообщает текущую версию сервиса. Контроллер сообщает пользователю о возможности обновления
   // расширения при смене версии;
   // 4. Описание версии - содержит информацию об изменениях в последних версиях расширения;
   // 5. Зависимости - перечень расширений которые необходимы сервису для функционирования. При установке сервиса
-  // все расширения от которых он зависит, будут так же установлены.
+  // все расширения, от которых он зависит, будут также установлены.
   rpc RegisterExtensions(RegisterExtensionsRequest) returns (RegisterExtensionsResponse) {}
 
   rpc UnregisterExtensions(UnregisterExtensionsRequest) returns (UnregisterExtensionsResponse) {}
 
   // Получить список зарегистрированных сервисов
   rpc ListExtensions(ListExtensionsRequest) returns (ListExtensionsResponse) {} // Получить список сервисов
+
+  // GetInstalledExtensions - получить статус расширения
+  rpc GetInstalledExtensions(GetInstalledExtensionsRequest) returns (GetInstalledExtensionsResponse) {} // Получить описание сервиса
+}
+
+// GetInstalledExtensionsRequest - запрос на получение статуса расширений в пространстве и окружении.
+// Если список расширений в запросе не передан, возвращаются все установленные расширения
+message GetInstalledExtensionsRequest {
+  repeated string extensions = 1; // Имя расширения
+  string space_id = 2; // Пространство имен расширения
+  string env_id = 3; // Идентификатор окружения
+}
+
+// GetExtensionResponse - описание расширения
+message GetInstalledExtensionsResponse {
+  message Status {
+    string extension = 10100; // Имя расширения
+    string title = 10110;
+    State state = 10120;
+    string msg = 10200; // Сообщение
+    string error = 10300; // Ошибка (state == ERROR)
+    bool not_found = 10350; // Расширение не найдено
+    bool installed = 10400; // Расширение установлено
+    bool update_available = 10500; // Доступно обновление
+    string installed_version = 10510; // Установленная версия расширения
+    string available_version = 10520; // Доступная версия расширения
+  }
+  repeated Status status = 1;
 }
 
-// ServiceDescription описание сервиса
+// ExtensionDescriptor описание расширения (возвращается сервисом при регистрации)
 message ExtensionDescriptor {
   string extension = 10000; // Имя расширения
   string title = 10010; // Название расширения
@@ -92,16 +120,17 @@ message ListExtensionsResponse {
 }
 
 // Описание коллекций
-
 // space_extensions (Пространство/Расширения)
 
+enum State {
+  UNKNOWN = 0;
+  INSTALLED = 1;
+  IN_PROGRESS = 2;
+  FAIL = 3;
+  PENDING = 4;
+}
+
 message SpaceExtensions {
-  enum State {
-    PENDING = 0;
-    INSTALLED = 1;
-    IN_PROGRESS = 2;
-    FAIL = 3;
-  }
   string extension = 10000;
   string title = 10010;
   string version = 10100;
@@ -109,4 +138,4 @@ message SpaceExtensions {
   State state = 10300;
   string status_error = 10400; // Сообщение к ошибке
   string status_msg = 10500; // Сообщение к статусу
-}
\ No newline at end of file
+}