diff --git a/src/Plugin/migrate/process/FileImport.php b/src/Plugin/migrate/process/FileImport.php
index 5a8c645..3e1fdab 100755
--- a/src/Plugin/migrate/process/FileImport.php
+++ b/src/Plugin/migrate/process/FileImport.php
@@ -50,6 +50,9 @@ use Drupal\Core\StreamWrapper\StreamWrapperManager;
  *   until the name is unique. Defaults to FALSE.
  * - reuse: Boolean, if TRUE, reuse the current file in its existing
  *   location rather than move/copy/rename the file. Defaults to FALSE.
+ * - update_on_reuse: Boolean, if TRUE, when a file is reused in its existing
+ *   location (see 'reuse' option, above) the file on disk will be overwritten
+ *   with the latest version of the file. Defaults to FALSE.
  * - skip_on_missing_source: (optional) Boolean, if TRUE, this field will be
  *   skipped if the source file is missing (either not available locally or 404
  *   if it's a remote file). Otherwise, the row will fail with an error. Note
@@ -219,54 +222,57 @@ class FileImport extends FileCopy {
     $final_destination = '';
 
     // If we're in re-use mode, reuse the file if it exists.
-    if ($this->getOverwriteMode() == FileSystemInterface::EXISTS_ERROR && $this->isLocalUri($destination) && is_file($destination)) {
-      // Look for a file entity with the destination uri.
-      if ($files = \Drupal::entityTypeManager()->getStorage('file')->loadByProperties(['uri' => $destination])) {
-        // Grab the first file entity with a matching uri.
-        // @todo: Any logic for preference when there are multiple?
-        $file = reset($files);
-        // Set to permanent if the file in the database is set to temporary.
-        // This means that the file was probably set to be removed during
-        // garbage collection, which we don't want to happen anymore since we're
-        // using it.
-        if ($file->isTemporary()) {
-          $file->setPermanent();
-          $file->save();
-        }
+    if ($this->getOverwriteMode() == FileSystemInterface::EXISTS_ERROR &&
+      $this->isLocalUri($destination) && is_file($destination) &&
+      $files = \Drupal::entityTypeManager()
+        ->getStorage('file')
+        ->loadByProperties(['uri' => $destination])) {
+      // Grab the first file entity with a matching uri.
+      // @todo: Any logic for preference when there are multiple?
+      $file = reset($files);
+      // Set to permanent if the file in the database is set to temporary.
+      // This means that the file was probably set to be removed during
+      // garbage collection, which we don't want to happen anymore since we're
+      // using it.
+      if ($file->isTemporary()) {
+        $file->setPermanent();
+        $file->save();
+      }
 
+      if (empty($this->configuration['update_on_reuse'])) {
         return $id_only ? $file->id() : ['target_id' => $file->id()];
       }
-      else {
-        $final_destination = $destination;
-      }
     }
-    else {
-      // The parent method will take care of our download/move/copy/rename.
-      // We just need to final destination to create the file object.
-      try {
-        $final_destination = parent::transform([$source, $destination], $migrate_executable, $row, $destination_property);
+    // The parent method will take care of our download/move/copy/rename.
+    // We just need to final destination to create the file object.
+    try {
+      $final_destination = parent::transform([
+        $source,
+        $destination,
+      ], $migrate_executable, $row, $destination_property);
+    } catch (MigrateException $e) {
+      // Check if we're skipping on error
+      if ($this->configuration['skip_on_error']) {
+        $migrate_executable->saveMessage("File $source could not be imported to $destination. Operation failed with message: " . $e->getMessage());
+        throw new MigrateSkipProcessException($e->getMessage());
       }
-      catch (MigrateException $e) {
-        // Check if we're skipping on error
-        if ($this->configuration['skip_on_error']) {
-          $migrate_executable->saveMessage("File $source could not be imported to $destination. Operation failed with message: " . $e->getMessage());
-          throw new MigrateSkipProcessException($e->getMessage());
-        }
-        else {
-          // Pass the error back on again.
-          throw new MigrateException($e->getMessage());
-        }
+      else {
+        // Pass the error back on again.
+        throw new MigrateException($e->getMessage());
       }
     }
 
+
     if ($final_destination) {
-      // Create a file entity.
-      $file = File::create([
-        'uri' => $final_destination,
-        'uid' => $uid,
-        'status' => FILE_STATUS_PERMANENT,
-      ]);
-      $file->save();
+      if (empty($file)) {
+        // Create a file entity.
+        $file = File::create([
+          'uri' => $final_destination,
+          'uid' => $uid,
+          'status' => FILE_STATUS_PERMANENT,
+        ]);
+        $file->save();
+      }
       return $id_only ? $file->id() : ['target_id' => $file->id()];
     }
 
diff --git a/src/Plugin/migrate/process/ImageImport.php b/src/Plugin/migrate/process/ImageImport.php
index 223fb27..425182c 100755
--- a/src/Plugin/migrate/process/ImageImport.php
+++ b/src/Plugin/migrate/process/ImageImport.php
@@ -102,11 +102,29 @@ class ImageImport extends FileImport {
     $value = parent::transform($value, $migrate_executable, $row, $destination_property);
 
     if ($value && is_array($value)) {
+      $file = File::load($value['target_id']);
+
+      // Clear existing variants for this file; only relevant if we may
+      // have updated the file at the exact filename.
+      if ($this->configuration['update_on_reuse']) {
+        // Flush image cache.
+        if (\Drupal::moduleHandler()->moduleExists('image')) {
+          if (explode('/', $file->getMimeType())[0] == 'image') {
+            /** @var \Drupal\image\Entity\ImageStyle[] $image_styles */
+            $image_styles = \Drupal::entityTypeManager()
+              ->getStorage('image_style')
+              ->loadMultiple();
+            foreach ($image_styles as $image_style) {
+              $image_style->flush($file->getFileUri());
+            }
+          }
+        }
+      }
+
       // Add the image field specific sub fields.
       foreach (['title', 'alt', 'width', 'height'] as $key) {
         if ($property = $this->configuration[$key]) {
           if ($property == '!file') {
-            $file = File::load($value['target_id']);
             $value[$key] = $file->getFilename();
           }
           else {
