diff --git a/modules/contrib/media_file_delete/config/install/media_file_delete.settings.yml b/modules/contrib/media_file_delete/config/install/media_file_delete.settings.yml
index c190247e86..ea29011754 100644
--- a/modules/contrib/media_file_delete/config/install/media_file_delete.settings.yml
+++ b/modules/contrib/media_file_delete/config/install/media_file_delete.settings.yml
@@ -1,2 +1,5 @@
 delete_file_default: false
 disable_delete_control: false
+delete_media_on_file_delete: false
+enable_file_cleanup_on_media_delete: false
+file_cleanup_on_media_delete: 'delete'
diff --git a/modules/contrib/media_file_delete/media_file_delete.module b/modules/contrib/media_file_delete/media_file_delete.module
index 378588ecd5..5bbfecf8ed 100644
--- a/modules/contrib/media_file_delete/media_file_delete.module
+++ b/modules/contrib/media_file_delete/media_file_delete.module
@@ -9,6 +9,11 @@
 use Drupal\media_file_delete\EntityHandler\MediaFileDeleteFileAccessControlHandler;
 use Drupal\media_file_delete\Form\MediaDeleteForm;
 use Drupal\media_file_delete\Form\MediaDeleteMultipleForm;
+use Drupal\file\Entity\File;
+use Drupal\Core\Entity\EntityInterface;
+use Drupal\media\Entity\MediaType;
+use Drupal\media\Entity\Media;
+use Drupal\Core\File\FileSystemInterface;

 /**
  * Implements hook_entity_type_alter().
@@ -24,3 +29,98 @@ function media_file_delete_entity_type_alter(array &$entity_types) {
     $entity_types['file']->setAccessClass(MediaFileDeleteFileAccessControlHandler::class);
   }
 }
+
+/**
+ * Implements hook_entity_predelete().
+ */
+function media_file_delete_entity_predelete(EntityInterface $entity) {
+  $config = \Drupal::config('media_file_delete.settings');
+
+  if ($entity->getEntityTypeId() === 'file' && $config->get('delete_media_on_file_delete')) {
+    $file_id = $entity->id();
+
+    // Loop through all media types to find ones that use a file field.
+    $media_types = MediaType::loadMultiple();
+    foreach ($media_types as $media_type) {
+      $source = $media_type->getSource();
+      if ($source) {
+        $source_field = $source->getSourceFieldDefinition($media_type);
+        if ($source_field) {
+          $field_name = $source_field->getName();
+
+          // Query media entities of this type that reference the file.
+          $media_ids = \Drupal::entityQuery('media')
+            ->accessCheck(FALSE)
+            ->condition('bundle', $media_type->id())
+            ->condition($field_name, $file_id)
+            ->execute();
+
+          if (!empty($media_ids)) {
+            $media_storage = \Drupal::entityTypeManager()->getStorage('media');
+            $media_entities = $media_storage->loadMultiple($media_ids);
+            foreach ($media_entities as $media) {
+              $media->delete();
+            }
+          }
+        }
+      }
+    }
+  }
+}
+
+
+/**
+ * Implements hook_entity_delete().
+ */
+function media_file_delete_entity_delete(EntityInterface $entity) {
+  if ($entity->getEntityTypeId() === 'media') {
+    $bundle = $entity->bundle();
+    $media_type = \Drupal::entityTypeManager()->getStorage('media_type')->load($bundle);
+
+    if ($media_type && $media_type->getSource()) {
+      $source_field = $media_type->getSource()->getSourceFieldDefinition($media_type);
+      if ($source_field) {
+        $field_name = $source_field->getName();
+        $file = $entity->get($field_name)->entity;
+
+        if ($file) {
+          $config = \Drupal::config('media_file_delete.settings');
+          $action = $config->get('file_cleanup_on_media_delete');
+
+          if (file_exists($file->getFileUri())) {
+            if ($action === 'delete') {
+              $file->delete();
+            }
+            elseif ($action === 'make_private') {
+              $destination = 'private://archived/' . $file->getFilename();
+              try {
+                $file_system = \Drupal::service('file_system');
+
+                $archive_dir = 'private://archived/';
+                $file_system->prepareDirectory($archive_dir, FileSystemInterface::CREATE_DIRECTORY | FileSystemInterface::MODIFY_PERMISSIONS);
+                $private_path = $file_system->realpath('private://archived/');
+                if ($private_path && is_writable($private_path)) {
+                  $file_system->move($file->getFileUri(), $destination, FileSystemInterface::EXISTS_RENAME);
+                  $file->setFileUri($destination);
+                  $file->save();
+                } else {
+                  \Drupal::logger('media_file_delete')->error('Private file system is not writable or not configured properly.');
+                  \Drupal::messenger()->addWarning(t('The file %file could not be archived to the private file system. Please check your private file system configuration.', [
+                    '%file' => $file->getFilename(),
+                  ]));
+                }
+              } catch (\Exception $e) {
+                \Drupal::logger('media_file_delete')->error('Failed to archive file: @message', ['@message' => $e->getMessage()]);
+              }
+            }
+          } else {
+            \Drupal::logger('media_file_delete')->warning('File %file does not exist on disk and could not be deleted or archived.', [
+              '%file' => $file->getFileUri(),
+            ]);
+          }
+        }
+      }
+    }
+  }
+}
+
diff --git a/modules/contrib/media_file_delete/src/Form/MediaDeleteForm.php b/modules/contrib/media_file_delete/src/Form/MediaDeleteForm.php
index 3c752e0cee..7eef6c087f 100644
--- a/modules/contrib/media_file_delete/src/Form/MediaDeleteForm.php
+++ b/modules/contrib/media_file_delete/src/Form/MediaDeleteForm.php
@@ -48,6 +48,11 @@ public function buildForm(array $form, FormStateInterface $form_state) {
     assert($media instanceof MediaInterface);
     $file = $this->getFile($media);
     $build = parent::buildForm($form, $form_state);
+
+    $config = $this->configFactory()->get('media_file_delete.settings');
+    $force_delete_enabled = $config->get('enable_file_cleanup_on_media_delete');
+    $force_delete_action = $config->get('file_cleanup_on_media_delete');
+
     if (!$file) {
       return $build;
     }
@@ -61,13 +66,36 @@ public function buildForm(array $form, FormStateInterface $form_state) {
     }
     $usages = $this->usageResolver->getFileUsages($file);
     if ($usages > 1) {
+      $message = '';
+      if ($force_delete_enabled && $force_delete_action === 'delete') {
+        $message = new PluralTranslatableMarkup(
+          $usages - 1,
+          'The file attached to this media is used in 1 other place but will still be deleted.',
+          'The file attached to this media is used in @count other places but will still be deleted.'
+        );
+      }
+      elseif ($force_delete_enabled && $force_delete_action === 'make_private') {
+        $message = new PluralTranslatableMarkup(
+          $usages - 1,
+          'The file attached to this media is used in 1 other place but will be archived to the private file system.',
+          'The file attached to this media is used in @count other places but will be archived to the private file system.'
+        );
+      }
+      else {
+        $message = new PluralTranslatableMarkup(
+          $usages - 1,
+          'The file attached to this media is used in 1 other place and will be retained.',
+          'The file attached to this media is used in @count other places and will be retained.'
+        );
+      }
       return $build + [
-        'cannot_delete' => [
-          '#markup' => new PluralTranslatableMarkup($usages - 1, 'The file attached to this media is used in 1 other place and will be retained.', 'The file attached to this media is used in @count other places and will be retained.'),
-        ],
-      ];
+          'cannot_delete' => [
+            '#markup' => $message,
+          ],
+        ];
     }

+
     $config = $this->configFactory()->get('media_file_delete.settings');

     return $build + [
diff --git a/modules/contrib/media_file_delete/src/Form/MediaDeleteSettingsForm.php b/modules/contrib/media_file_delete/src/Form/MediaDeleteSettingsForm.php
index 53235962d4..28f40aa9f9 100755
--- a/modules/contrib/media_file_delete/src/Form/MediaDeleteSettingsForm.php
+++ b/modules/contrib/media_file_delete/src/Form/MediaDeleteSettingsForm.php
@@ -41,18 +41,67 @@ protected function getEditableConfigNames(): array {
   public function buildForm(array $form, FormStateInterface $form_state): array {
     $config = $this->config(static::SETTINGS);

+    $form['media_delete_settings_heading'] = [
+      '#type' => 'markup',
+      '#markup' => '<h2>' . $this->t('Media Delete Settings') . '</h2>',
+    ];
+
     $form['delete_file_default'] = [
-      '#default_value' => $config->get('delete_file_default'),
       '#type' => 'checkbox',
       '#title' => $this->t('Delete files from file system when deleting media entities'),
       '#description' => $this->t('Users will be able to change this value when confirming deletion of media entities unless disabled by the setting below.'),
+      '#default_value' => $config->get('delete_file_default'),
+    ];
+
+    $form['force_deletion_options'] = [
+      '#type' => 'fieldset',
+      '#title' => $this->t('Force Deletion Options'),
+      '#states' => [
+        'visible' => [
+          ':input[name="delete_file_default"]' => ['checked' => TRUE],
+        ],
+      ],
+    ];
+
+    $form['force_deletion_options']['enable_file_cleanup_on_media_delete'] = [
+      '#type' => 'checkbox',
+      '#title' => $this->t('Force delete from file system irrespective of usage'),
+      '#description' => $this->t('If enabled, the file referenced by a media entity will not be retained even when there are other usage references to the file.'),
+      '#default_value' => $config->get('enable_file_cleanup_on_media_delete'),
+    ];
+
+    $form['force_deletion_options']['file_cleanup_on_media_delete'] = [
+      '#type' => 'radios',
+      '#title' => $this->t('Force delete options'),
+      '#options' => [
+        'delete' => $this->t('Delete the file permanently'),
+        'make_private' => $this->t('Archive file to private file system (requires private file system to be configured first!)'),
+      ],
+      '#default_value' => $config->get('file_cleanup_on_media_delete'),
+      '#states' => [
+        'visible' => [
+          ':input[name="enable_file_cleanup_on_media_delete"]' => ['checked' => TRUE],
+        ],
+      ],
     ];

     $form['disable_delete_control'] = [
-      '#default_value' => $config->get('disable_delete_control'),
       '#type' => 'checkbox',
       '#title' => $this->t('Disable user control of file deletion'),
       '#description' => $this->t('Prevents changing the default value provided by the previous setting.'),
+      '#default_value' => $config->get('disable_delete_control'),
+    ];
+
+    $form['file_delete_settings_heading'] = [
+      '#type' => 'markup',
+      '#markup' => '<h2>' . $this->t('File Delete Settings') . '</h2>',
+    ];
+
+    $form['delete_media_on_file_delete'] = [
+      '#type' => 'checkbox',
+      '#title' => $this->t('Delete media when deleting files'),
+      '#description' => $this->t('If enabled, any Media entity that references a File will be deleted when that File is removed from the system.'),
+      '#default_value' => $config->get('delete_media_on_file_delete'),
     ];

     return parent::buildForm($form, $form_state);
@@ -65,6 +114,9 @@ public function submitForm(array &$form, FormStateInterface $form_state): void {
     $this->configFactory->getEditable(static::SETTINGS)
       ->set('delete_file_default', $form_state->getValue('delete_file_default'))
       ->set('disable_delete_control', $form_state->getValue('disable_delete_control'))
+      ->set('delete_media_on_file_delete', $form_state->getValue('delete_media_on_file_delete'))
+      ->set('enable_file_cleanup_on_media_delete', $form_state->getValue('enable_file_cleanup_on_media_delete'))
+      ->set('file_cleanup_on_media_delete', $form_state->getValue('file_cleanup_on_media_delete'))
       ->save();

     parent::submitForm($form, $form_state);
--
2.43.0

