diff --git a/config/install/islandora.settings.yml b/config/install/islandora.settings.yml
index 8fb25fb8..179d4213 100644
--- a/config/install/islandora.settings.yml
+++ b/config/install/islandora.settings.yml
@@ -1,4 +1,5 @@
 broker_url: 'tcp://localhost:61613'
 jwt_expiry: '+2 hour'
 gemini_url: ''
+delete_media_and_files: TRUE
 gemini_pseudo_bundles: []
diff --git a/config/schema/islandora.schema.yml b/config/schema/islandora.schema.yml
index e85d5739..86b65fd0 100644
--- a/config/schema/islandora.schema.yml
+++ b/config/schema/islandora.schema.yml
@@ -14,6 +14,9 @@ islandora.settings:
     jwt_expiry:
       type: string
       label: 'How long JWTs should last before expiring.'
+    delete_media_and_files:
+      type: boolean
+      label: 'Node Delete with Media and Files'
     upload_form_location:
       type: string
       label: 'Upload Form Location'
@@ -166,7 +169,7 @@ condition.plugin.node_had_namespace:
     pid_field:
       type: ignore
       label: 'PID field'
-      
+
 field.formatter.settings.islandora_image:
   type: field.formatter.settings.image
   label: 'Islandora image field display format settings'
diff --git a/islandora.module b/islandora.module
index dd1d66f8..a418e506 100644
--- a/islandora.module
+++ b/islandora.module
@@ -373,6 +373,7 @@ function islandora_form_alter(&$form, FormStateInterface $form_state, $form_id)
       }
     }
   }
+
   return $form;
 }
 
@@ -390,7 +391,6 @@ function islandora_object_delete_form_submit($form, &$form_state) {
     $medias = $utils->getMedia($node);
     $media_list = "";
 
-    $entity_type_manager = \Drupal::entityTypeManager();
     $entity_field_manager = \Drupal::service('entity_field.manager');
     $current_user = \Drupal::currentUser();
     $logger = \Drupal::logger('logger.channel.islandora');
@@ -398,14 +398,12 @@ function islandora_object_delete_form_submit($form, &$form_state) {
 
     $total_count = 0;
     $delete_media = [];
-    $delete_media_translations = [];
-    $delete_files = [];
+    $media_translations = [];
+    $media_files = [];
+    $entity_protected_medias = [];
     $inaccessible_entities = [];
-    $media_storage = $entity_type_manager->getStorage('media');
-    $file_storage = $entity_type_manager->getStorage('file');
 
     foreach ($medias as $id => $media) {
-      $media_list .= $id . ", ";
       $lang = $media->language()->getId();
       $selected_langcodes[$lang] = $lang;
 
@@ -425,7 +423,7 @@ function islandora_object_delete_form_submit($form, &$form_state) {
               $inaccessible_entities[] = $file;
               continue;
             }
-            $delete_files[$file->id()] = $file;
+            $media_files[$id][$file->id()] = $file;
             $total_count++;
           }
         }
@@ -436,33 +434,49 @@ function islandora_object_delete_form_submit($form, &$form_state) {
         $entity = $media->getTranslation($langcode);
         if ($entity->isDefaultTranslation()) {
           $delete_media[$id] = $entity;
-          unset($delete_media_translations[$id]);
+          unset($media_translations[$id]);
           $total_count += count($entity->getTranslationLanguages());
         }
         elseif (!isset($delete_media[$id])) {
-          $delete_media_translations[$id][] = $entity;
+          $media_translations[$id][] = $entity;
         }
       }
     }
 
     if ($delete_media) {
-      $media_storage->delete($delete_media);
       foreach ($delete_media as $media) {
-        $logger->notice('The media %label has been deleted.', [
-          '%label' => $media->label(),
-        ]);
+        try {
+          $media->delete();
+          $logger->notice('The media %label has been deleted.', [
+            '%label' => $media->label(),
+          ]);
+          $media_list .= $id . ", ";
+        }
+        catch (Exception $e) {
+          $entity_protected_medias[] = $id;
+        }
       }
     }
 
+    $delete_files = array_filter($media_files, function ($media) use ($entity_protected_medias) {
+      return !in_array($media, $entity_protected_medias);
+    }, ARRAY_FILTER_USE_KEY);
+
     if ($delete_files) {
-      $file_storage->delete($delete_files);
-      foreach ($delete_files as $file) {
-        $logger->notice('The file %label has been deleted.', [
-          '%label' => $file->label(),
-        ]);
+      foreach ($delete_files as $files_array) {
+        foreach ($files_array as $file) {
+          $file->delete();
+          $logger->notice('The file %label has been deleted.', [
+            '%label' => $file->label(),
+          ]);
+        }
       }
     }
 
+    $delete_media_translations = array_filter($media_translations, function ($media) use ($entity_protected_medias) {
+      return !in_array($media, $entity_protected_medias);
+    }, ARRAY_FILTER_USE_KEY);
+
     if ($delete_media_translations) {
       foreach ($delete_media_translations as $id => $translations) {
         $media = $medias[$id];
diff --git a/tests/src/Functional/DeleteNodeWithMediaAndFile.php b/tests/src/Functional/DeleteNodeWithMediaAndFile.php
index ff793f0d..40e469c5 100644
--- a/tests/src/Functional/DeleteNodeWithMediaAndFile.php
+++ b/tests/src/Functional/DeleteNodeWithMediaAndFile.php
@@ -19,6 +19,7 @@ class DeleteNodeWithMediaAndFile extends IslandoraFunctionalTestBase {
       'view media',
       'bypass node access',
       'access files overview',
+      'administer site configuration',
     ]);
     $this->drupalLogin($account);
 
@@ -75,6 +76,10 @@ class DeleteNodeWithMediaAndFile extends IslandoraFunctionalTestBase {
     ]);
     $media2->save();
 
+    $this->drupalGet("admin/config/islandora/core");
+    $assert_session->pageTextContains('Node Delete with Media and Files');
+    \Drupal::configFactory()->getEditable('islandora.settings')->set('delete_media_and_files', TRUE)->save();
+
     $delete = ['delete_associated_content' => TRUE];
 
     $this->drupalGet("node/1/delete");