diff --git a/core/modules/file/file.js b/core/modules/file/file.js
index 8ed377e..f07274d 100644
--- a/core/modules/file/file.js
+++ b/core/modules/file/file.js
@@ -88,11 +88,13 @@
   Drupal.behaviors.fileButtons = {
     attach: function (context) {
       var $context = $(context);
+      // @TODO Check if our event handlers are called before asynchronous file upload is started.
       $context.find('.js-form-submit').on('mousedown', Drupal.file.disableFields);
       $context.find('.js-form-managed-file .js-form-submit').on('mousedown', Drupal.file.progressBar);
     },
     detach: function (context) {
       var $context = $(context);
+      // @TODO Check if our event handlers are called before asynchronous file upload is started.
       $context.find('.js-form-submit').off('mousedown', Drupal.file.disableFields);
       $context.find('.js-form-managed-file .js-form-submit').off('mousedown', Drupal.file.progressBar);
     }
@@ -170,9 +172,24 @@
      *   The event triggered. For example `change.autoFileUpload`.
      */
     triggerUploadButton: function (event) {
-      $(event.target).closest('.js-form-managed-file').find('.js-form-submit').trigger('mousedown');
-    },
-
+      var ev = event;
+      var $submit = $(event.target).closest('.js-form-managed-file').find('.js-form-submit');
+      // Passing submit button in ev.data.
+      ev.data = $submit;
+      // Prevent file uploads when using buttons not intended to upload (before any asynchronous event happens).
+      Drupal.file.disableFields(ev);
+      // Calling progressBar handler immediately (before any asynchronous event happens).
+      Drupal.file.progressBar(ev);
+      // Triggering mousedown on submit button may start an asynchronous upload thread
+      // before our event handlers are triggered.
+      $submit.trigger('mousedown');
+    },    
+    
+    /**
+     * Set to true in order to prevent calling disableFields() while it's already called.
+     */
+    preventDisableFieldsCall : false,
+    
     /**
      * Prevent file uploads when using buttons not intended to upload.
      *
@@ -182,7 +199,18 @@
      *   The event triggered, most likely a `mousedown` event.
      */
     disableFields: function (event) {
-      var $clickedButton = $(this).findOnce('ajax');
+      if (Drupal.file.preventDisableFieldsCall === true) {
+        return;
+      }
+      Drupal.file.preventDisableFieldsCall = true;
+      
+      if (typeof event.data !== 'undefined' && event.data !== null) {
+         // The triggering button is event.data.
+        var $clickedButton = event.data.findOnce('ajax');
+      } else {
+         // The triggering button is $(this).
+        var $clickedButton = $(this).findOnce('ajax');
+      }
 
       // Only disable upload fields for Ajax buttons.
       if (!$clickedButton.length) {
@@ -208,9 +236,15 @@
       $fieldsToTemporarilyDisable.prop('disabled', true);
       setTimeout(function () {
         $fieldsToTemporarilyDisable.prop('disabled', false);
+        Drupal.file.preventDisableFieldsCall = false;
       }, 1000);
     },
 
+    /**
+     * Set to true in order to prevent calling progressBar() while it's already called.
+     */
+    preventProgressBarCall : false,
+    
     /**
      * Add progress bar support if possible.
      *
@@ -220,7 +254,19 @@
      *   The event triggered, most likely a `mousedown` event.
      */
     progressBar: function (event) {
-      var $clickedButton = $(this);
+      if (Drupal.file.preventProgressBarCall === true) {
+        return;
+      }
+      Drupal.file.preventProgressBarCall = true;
+      
+      if (typeof event.data !== 'undefined' && event.data !== null) {
+         // The triggering button is event.data.
+        var $clickedButton = event.data;
+      } else {
+         // The triggering button is $(this).
+        var $clickedButton = $(this);
+      }
+      
       var $progressId = $clickedButton.closest('div.js-form-managed-file').find('input.file-progress');
       if ($progressId.length) {
         var originalName = $progressId.attr('name');
@@ -236,6 +282,7 @@
       // Show the progress bar if the upload takes longer than half a second.
       setTimeout(function () {
         $clickedButton.closest('div.js-form-managed-file').find('div.ajax-progress-bar').slideDown();
+        Drupal.file.preventProgressBarCall = true;
       }, 500);
     },
 
