diff --git a/src/app/indexingModel/controllers/IndexingModelController.php b/src/app/indexingModel/controllers/IndexingModelController.php
index fa639d3ce85ea077a6b7317951d15d043b3d9119..d684ec8644beda10d7c85e85bcae55b3253a8a88 100644
--- a/src/app/indexingModel/controllers/IndexingModelController.php
+++ b/src/app/indexingModel/controllers/IndexingModelController.php
@@ -24,10 +24,13 @@ use History\controllers\HistoryController;
 use IndexingModel\models\IndexingModelFieldModel;
 use IndexingModel\models\IndexingModelModel;
 use Resource\controllers\IndexingController;
+use Resource\controllers\ResController;
 use Resource\models\ResModel;
+use Resource\models\ResourceContactModel;
 use Respect\Validation\Validator;
 use Slim\Http\Request;
 use Slim\Http\Response;
+use Tag\models\ResourceTagModel;
 use User\models\UserModel;
 
 class IndexingModelController
@@ -161,7 +164,7 @@ class IndexingModelController
             }
             $master = $body['master'];
 
-            $fieldsMaster = IndexingModelFieldModel::get(['select' => ['identifier', 'mandatory', 'default_value', 'unit'], 'where' => ['model_id = ?'], 'data' => [$body['master']]]);
+            $fieldsMaster = IndexingModelFieldModel::get(['select' => ['identifier', 'mandatory', 'default_value', 'unit', 'enabled'], 'where' => ['model_id = ?'], 'data' => [$body['master']]]);
             foreach ($fieldsMaster as $key => $value) {
                 $fieldsMaster[$key]['default_value'] = json_decode($value['default_value'], true);
             }
@@ -427,13 +430,45 @@ class IndexingModelController
         }
 
         $resources = ResModel::get([
-            'select'    => [1],
-            'where'     => ['model_id = ?'],
-            'data'      => [$args['id']]
+            'select' => ['res_id'],
+            'where'  => ['model_id = ?'],
+            'data'   => [$args['id']]
         ]);
-
+        $resources = array_column($resources, 'res_id');
         if (!empty($resources)) {
-            return $response->withStatus(400)->withJson(['errors' => 'Model is used by at least one resource', 'lang' => 'modelUsedByResources']);
+            $body = $request->getParsedBody();
+
+            // No targetId provided, trying to delete without redirection
+            if (!Validator::intVal()->notEmpty()->validate($body['targetId'])) {
+                return $response->withStatus(400)->withJson(['errors' => 'Model is used by at least one resource', 'lang' => 'modelUsedByResources']);
+            }
+
+            // targetId provided, redirect model before deleting
+            $oldFieldList = IndexingModelFieldModel::get(['select' => ['identifier'], 'where' => ['model_id = ?'], 'data' => [$args['id']]]);
+            $oldFieldList = array_column($oldFieldList, 'identifier');
+
+            $newFieldList = IndexingModelFieldModel::get(['select' => ['identifier'], 'where' => ['model_id = ?'], 'data' => [$body['targetId']]]);
+            $newFieldList = array_column($newFieldList, 'identifier');
+
+            ResController::resetResourceFields(['oldFieldList' => $oldFieldList, 'newFieldList' => $newFieldList, 'modelId' => $args['id']]);
+
+            $fieldsToDelete = array_diff($oldFieldList, $newFieldList);
+
+            if (in_array('senders', $fieldsToDelete)) {
+                ResourceContactModel::delete(['where' => ['res_id in (?)',  'mode = ?'], 'data' => [$resources, 'sender']]);
+            }
+            if (in_array('recipients', $fieldsToDelete)) {
+                ResourceContactModel::delete(['where' => ['res_id in (?)',  'mode = ?'], 'data' => [$resources, 'recipient']]);
+            }
+            if (in_array('tags', $fieldsToDelete)) {
+                ResourceTagModel::delete(['where' => ['res_id in (?)'], 'data' => [$resources]]);
+            }
+
+            ResModel::update([
+                'set'   => ['model_id' => $body['targetId']],
+                'where' => ['model_id = ?'],
+                'data'  => [$args['id']]
+            ]);
         }
 
         $childrenModels = IndexingModelModel::get(['select' => ['id', 'label'], 'where' => ['"master" = ?'], 'data' => [$args['id']]]);
diff --git a/src/app/resource/controllers/ResController.php b/src/app/resource/controllers/ResController.php
index 19e17c7c681f2de528d9c210820b5e2b1e511a54..25f54627d7a11a5328491b11ad32a3a31394f91e 100755
--- a/src/app/resource/controllers/ResController.php
+++ b/src/app/resource/controllers/ResController.php
@@ -1387,4 +1387,64 @@ class ResController extends ResourceControlController
 
         return $response->withJson(['information' => $resource]);
     }
+
+    public static function resetResourceFields(array $args)
+    {
+        ValidatorModel::notEmpty($args, ['oldFieldList', 'newFieldList']);
+        ValidatorModel::arrayType($args, ['oldFieldList', 'newFieldList']);
+        ValidatorModel::intVal($args, ['resId', 'modelId']);
+
+        if (empty($args['resId']) && empty($args['modelId'])) {
+            return false;
+        }
+
+        $oldFieldList = $args['oldFieldList'];
+        $newModelFields = $args['newFieldList'];
+
+        // Set res_letterbox fields to null
+        $set = [];
+        $setToNull = [
+            'confidentiality'    => 'confidentiality',
+            'admission_date'     => 'arrivalDate',
+            'departure_date'     => 'departureDate',
+            'doc_date'           => 'documentDate',
+            'process_limit_date' => 'processLimitDate',
+            'initiator'          => 'initiator',
+            'destination'        => 'destination',
+            'priority'           => 'priority'
+        ];
+        foreach ($setToNull as $key => $field) {
+            if (in_array($field, $oldFieldList) && !in_array($field, $newModelFields)) {
+                $set[$key] = null;
+            }
+        }
+
+        $customFieldsToDelete = array_diff($oldFieldList, $newModelFields);
+        $customFieldsToDelete = array_filter($customFieldsToDelete, function ($field) {
+            return strpos($field, 'indexingCustomField_') !== false;
+        });
+        $customFieldsToDelete = array_map(function ($field) {
+            return explode('_', $field)[1];
+        }, $customFieldsToDelete);
+
+        $postSet = ['custom_fields' => 'custom_fields '];
+        foreach ($customFieldsToDelete as $item) {
+            $postSet['custom_fields'] .= " - '$item'";
+        }
+
+        if (!empty($set) || !empty($postSet)) {
+            $where = [];
+            $data = [];
+            if (!empty($args['resId'])) {
+                $where = ['res_id = ?'];
+                $data = [$args['resId']];
+            } elseif (!empty($args['modelId'])) {
+                $where = ['model_id = ?'];
+                $data = [$args['modelId']];
+            }
+            ResModel::update(['set' => $set, 'postSet' => $postSet, 'where' => $where, 'data' => $data]);
+        }
+
+        return true;
+    }
 }