diff --git a/changes/changelog.d/942.enhancement b/changes/changelog.d/942.enhancement
new file mode 100644
index 0000000000000000000000000000000000000000..66a1bfff3ff99b1b6c25fab20f6a7cefece74ba5
--- /dev/null
+++ b/changes/changelog.d/942.enhancement
@@ -0,0 +1 @@
+Added a retry option for failed uploads (#942)
diff --git a/front/src/components/library/FileUpload.vue b/front/src/components/library/FileUpload.vue
index d88efd5ab0b92acf3f0ba17fec90d8cbbdc1b605..9e86600b37496fb9cfe28c6ff0f300ad8eedf599 100644
--- a/front/src/components/library/FileUpload.vue
+++ b/front/src/components/library/FileUpload.vue
@@ -91,9 +91,20 @@
         <table class="ui unstackable table">
           <thead>
             <tr>
-              <th><translate translate-context="Content/Library/Table.Label">Filename</translate></th>
+              <th class="ten wide"><translate translate-context="Content/Library/Table.Label">Filename</translate></th>
               <th><translate translate-context="Content/*/*/Noun">Size</translate></th>
               <th><translate translate-context="*/*/*">Status</translate></th>
+              <th><translate translate-context="*/*/*">Actions</translate></th>
+            </tr>
+            <tr v-if="retryableFiles.length > 1">
+              <th class="ten wide"></th>
+              <th></th>
+              <th></th>
+              <th>
+                <button class="ui right floated small basic button" @click.prevent="retry(retryableFiles)">
+                  <translate translate-context="Content/Library/Table">Retry failed uploads</translate>
+                </button>
+              </th>
             </tr>
           </thead>
           <tbody>
@@ -113,9 +124,20 @@
                   <translate translate-context="Content/Library/Table" key="2">Uploading…</translate>
                   ({{ parseInt(file.progress) }}%)
                 </span>
-                <template v-else>
-                  <span class="ui label"><translate translate-context="Content/Library/*/Short" key="3">Pending</translate></span>
-                  <button class="ui tiny basic red icon button" @click.prevent="$refs.upload.remove(file)"><i class="delete icon"></i></button>
+                <span v-else class="ui label"><translate translate-context="Content/Library/*/Short" key="3">Pending</translate></span>
+              </td>
+              <td>
+                <template v-if="file.error">
+                  <button
+                    class="ui tiny basic icon right floated button"
+                    :title="labels.retry"
+                    @click.prevent="retry([file])"
+                    v-if="retryableFiles.indexOf(file) > -1">
+                    <i class="redo icon"></i>
+                  </button>
+                </template>
+                <template v-else-if="!file.success">
+                  <button class="ui tiny basic red icon right floated button" @click.prevent="$refs.upload.remove(file)"><i class="delete icon"></i></button>
                 </template>
               </td>
             </tr>
@@ -251,6 +273,13 @@ export default {
         self.uploads.objects[event.upload.uuid] = event.upload;
         self.needsRefresh = true
       });
+    },
+    retry (files) {
+      files.forEach((file) => {
+        this.$refs.upload.update(file, {error: '', progress: '0.00'})
+      })
+      this.$refs.upload.active = true;
+
     }
   },
   computed: {
@@ -274,6 +303,7 @@ export default {
           server,
           network,
           timeout,
+          retry: this.$pgettext('*/*/*/Verb', "Retry"),
           extension: this.$gettextInterpolate(extension, {
             extensions: this.supportedExtensions.join(", ")
           })
@@ -295,6 +325,11 @@ export default {
         return f.error;
       }).length;
     },
+    retryableFiles () {
+      return this.files.filter(f => {
+        return f.error;
+      });
+    },
     processableFiles() {
       return (
         this.uploads.pending +
@@ -342,7 +377,9 @@ export default {
     uploadedSize () {
       let uploaded = 0
       this.files.forEach((f) => {
-        uploaded += f.size * (f.progress / 100)
+        if (!f.error) {
+          uploaded += f.size * (f.progress / 100)
+        }
       })
       return uploaded
     }