diff --git a/src/app/basket/controllers/BasketController.php b/src/app/basket/controllers/BasketController.php
index 6fb297459c18f6b0486f898cc1220d6a378d37d4..06976ea57b67d6b84274ce31f75460a7e8db5a05 100755
--- a/src/app/basket/controllers/BasketController.php
+++ b/src/app/basket/controllers/BasketController.php
@@ -494,8 +494,9 @@ class BasketController
         $data['list_display'] = json_encode($data['list_display']);
         if ($data['list_event'] == 'processDocument') {
             $listEventData = [
-                'canUpdate'     => !empty($data['list_event_data']['canUpdate']),
-                'defaultTab'    => $data['list_event_data']['defaultTab'] ?? 'dashboard'
+                'canUpdate'         => !empty($data['list_event_data']['canUpdate']),
+                'canUpdateModel'    => !empty($data['list_event_data']['canUpdateModel']),
+                'defaultTab'        => $data['list_event_data']['defaultTab'] ?? 'dashboard'
             ];
         }
 
diff --git a/src/app/group/controllers/PrivilegeController.php b/src/app/group/controllers/PrivilegeController.php
index 73caa642b926de379806a8481fc5ee65130bc89f..03057730d69ce62342ba8d31964c521d9aac4c63 100644
--- a/src/app/group/controllers/PrivilegeController.php
+++ b/src/app/group/controllers/PrivilegeController.php
@@ -299,6 +299,10 @@ class PrivilegeController
                 $where[] = "list_event_data->>'canUpdate' = ?";
                 $data[] = 'true';
             }
+            if (!empty($args['canUpdateModel'])) {
+                $where[] = "list_event_data->>'canUpdateModel' = ?";
+                $data[] = 'true';
+            }
             $baskets = GroupBasketModel::get(['select' => ['basket_id'], 'where' => $where, 'data' => $data]);
             $baskets = array_column($baskets, 'basket_id');
             if (!empty($baskets)) {
@@ -322,6 +326,10 @@ class PrivilegeController
                 $where[] = "list_event_data->>'canUpdate' = ?";
                 $data[] = 'true';
             }
+            if (!empty($args['canUpdateModel'])) {
+                $where[] = "list_event_data->>'canUpdateModel' = ?";
+                $data[] = 'true';
+            }
             $hasSB = GroupBasketModel::get(['select' => [1], 'where' => $where, 'data' => $data]);
             if (!empty($hasSB)) {
                 $basketOwner = UserModel::getById(['id' => $basket['owner_user_id'], 'select' => ['user_id']]);
diff --git a/src/app/resource/controllers/ResourceControlController.php b/src/app/resource/controllers/ResourceControlController.php
index fee22e77f3ba9c21353272160d1539999daf42b2..4ac16788699620c1df6a8756e0bff2b79f4b2c07 100644
--- a/src/app/resource/controllers/ResourceControlController.php
+++ b/src/app/resource/controllers/ResourceControlController.php
@@ -21,6 +21,7 @@ use CustomField\models\CustomFieldModel;
 use Doctype\models\DoctypeModel;
 use Entity\models\EntityModel;
 use Folder\controllers\FolderController;
+use Group\controllers\PrivilegeController;
 use IndexingModel\models\IndexingModelFieldModel;
 use IndexingModel\models\IndexingModelModel;
 use Priority\models\PriorityModel;
@@ -133,6 +134,20 @@ class ResourceControlController
             return ['errors' => 'Resource can not be modified because of status'];
         }
 
+        if (!empty($body['modelId'])) {
+            if (!PrivilegeController::isResourceInProcess(['userId' => $GLOBALS['id'], 'resId' => $args['resId'], 'canUpdate' => true, 'canUpdateModel' => true])) {
+                return ['errors' => 'Model can not be modified'];
+            }
+            $indexingModel = IndexingModelModel::getById(['id' => $body['modelId'], 'select' => ['master', 'enabled']]);
+            if (empty($indexingModel)) {
+                return ['errors' => 'Body modelId does not exist'];
+            } elseif (!$indexingModel['enabled']) {
+                return ['errors' => 'Body modelId is disabled'];
+            } elseif (!empty($indexingModel['master'])) {
+                return ['errors' => 'Body modelId is not public'];
+            }
+        }
+
         if ($args['onlyDocument'] && empty($body['encodedFile'])) {
             return ['errors' => 'Body encodedFile is not set or empty'];
         } elseif (!empty($body['encodedFile'])) {
@@ -165,7 +180,9 @@ class ResourceControlController
             return ['errors' => $control['errors']];
         }
 
-        $body['modelId'] = $resource['model_id'];
+        if (empty($body['modelId'])) {
+            $body['modelId'] = $resource['model_id'];
+        }
         $control = ResourceControlController::controlIndexingModelFields(['body' => $body, 'isUpdating' => true]);
         if (!empty($control['errors'])) {
             return ['errors' => $control['errors']];
diff --git a/src/app/resource/controllers/StoreController.php b/src/app/resource/controllers/StoreController.php
index 5682d6bc61270a181ce99ba555c5e3016722e3a6..8a308f9fe488dc38c383560247b3fdb1f6937f5f 100755
--- a/src/app/resource/controllers/StoreController.php
+++ b/src/app/resource/controllers/StoreController.php
@@ -229,6 +229,9 @@ class StoreController
 
         $resource = ResModel::getById(['resId' => $args['resId'], 'select' => ['version', 'alt_identifier', 'external_id', 'category_id', 'type_id', 'destination']]);
 
+        if (!empty($args['modelId'])) {
+            $preparedData['model_id'] = $args['modelId'];
+        }
         if (empty($resource['alt_identifier'])) {
             $chrono = ChronoModel::getChrono(['id' => $resource['category_id'], 'entityId' => $resource['destination'], 'typeId' => $resource['type_id'], 'resId' => $args['resId']]);
             $preparedData['alt_identifier'] = $chrono;