diff --git a/config/schema/entity_browser.schema.yml b/config/schema/entity_browser.schema.yml
index 888c32c..4cb7d80 100644
--- a/config/schema/entity_browser.schema.yml
+++ b/config/schema/entity_browser.schema.yml
@@ -103,6 +103,9 @@ entity_browser.browser.widget.upload:
     submit_text:
       type: string
       label: 'Submit button text'
+    auto_select:
+      type: boolean
+      label: 'Automatically submit selection'
     upload_location:
       type: string
       label: 'Upload location'
@@ -114,6 +117,9 @@ entity_browser.browser.widget.view:
     submit_text:
       type: string
       label: 'Submit button text'
+    auto_select:
+      type: boolean
+      label: 'Automatically submit selection'
     view:
       type: string
       label: 'View ID'
diff --git a/js/entity_browser.multi_step_display.js b/js/entity_browser.multi_step_display.js
index 2360f02..af790d3 100644
--- a/js/entity_browser.multi_step_display.js
+++ b/js/entity_browser.multi_step_display.js
@@ -7,6 +7,13 @@
   'use strict';
 
   /**
+   * Queue container for loading of entities in selection display.
+   *
+   * @type {Object}
+   */
+  var commands_queue = {};
+
+  /**
    * Registers behaviours related to selected entities.
    */
   Drupal.behaviors.entityBrowserMultiStepDisplay = {
@@ -20,9 +27,10 @@
       var $toggle = $('.entity-browser-show-selection');
 
       function setToggleText() {
-        if($entities.css('display') == 'none') {
+        if ($entities.css('display') == 'none') {
           $toggle.val(Drupal.t('Show selected'));
-        } else {
+        }
+        else {
           $toggle.val(Drupal.t('Hide selected'));
         }
       }
@@ -33,6 +41,22 @@
       });
 
       setToggleText();
+
+      $entities.once()
+        .bind('load-entities', Drupal.entityBrowserMultiStepDisplay.loadEntities);
+
+      $entities.once()
+        .bind('remove-entity', Drupal.entityBrowserMultiStepDisplay.loadEntities);
+
+      var $remove_buttons = $entities.find('.entity-browser-remove-selected-entity');
+      $remove_buttons.once().on('click', function (event) {
+        event.preventDefault();
+
+        var button_element = $(event.target);
+        var remove_entity_id = button_element.attr('data-remove-entity') + '_' + button_element.attr('data-row-id');
+
+        Drupal.entityBrowserMultiStepDisplay.removeEntity($entities, remove_entity_id);
+      });
     }
   };
 
@@ -53,4 +77,123 @@
     }
   };
 
+  Drupal.entityBrowserMultiStepDisplay.removeEntity = function (entities_list_element, entity_id) {
+    var entities_list = $(entities_list_element);
+
+    // Add proxy element that will be replaced with returned Ajax Command.
+    var element_selector = '[data-drupal-selector="edit-selected-'.concat(entity_id.replace(/_/g, '-'), '"]');
+    entities_list.find(element_selector).remove();
+
+    if (!commands_queue['remove']) {
+      commands_queue['remove'] = [];
+    }
+
+    commands_queue['remove'].push(
+      {
+        entity_id: entity_id
+      }
+    );
+
+    Drupal.entityBrowserMultiStepDisplay.loadQueuedEntities(entities_list_element, typeof entity_id !== 'undefined');
+  };
+
+  /**
+   * Handle load entity over Ajax Request in selection display.
+   *
+   * @param {object} event
+   *   Event object.
+   * @param {Array} entity_ids
+   *   Entity Id that should be loaded into selection list.
+   */
+  Drupal.entityBrowserMultiStepDisplay.loadEntities = function (event, entity_ids) {
+    if (entity_ids) {
+      Drupal.entityBrowserMultiStepDisplay.addEntityToQueue(this, entity_ids);
+    }
+
+    Drupal.entityBrowserMultiStepDisplay.loadQueuedEntities(this, typeof entity_ids !== 'undefined');
+  };
+
+  /**
+   * Queue entity for loading over Ajax.
+   *
+   * @param {object} entities_list_element
+   *   Object that represents entity list, that contains selected entities.
+   * @param {Array} entity_ids
+   *   Entity ID that should be added to selection.
+   */
+  Drupal.entityBrowserMultiStepDisplay.addEntityToQueue = function (entities_list_element, entity_ids) {
+    var entities_list = $(entities_list_element);
+    var i;
+
+    if (!commands_queue['add']) {
+      commands_queue['add'] = [];
+    }
+
+    for (i = 0; i < entity_ids.length; i++) {
+      // Add proxy element that will be replaced with returned Ajax Command.
+      var proxy_element = $('<div></div>').uniqueId();
+      entities_list.append(proxy_element);
+
+      commands_queue['add'].push(
+        {
+          entity_id: entity_ids[i],
+          proxy_id: proxy_element.attr('id')
+        }
+      );
+    }
+  };
+
+  /**
+   * Trigger loading of entities over Ajax.
+   *
+   * @param {object} entities_list_element
+   *   Object that represents entity list, that contains selected entities.
+   * @param {boolean} entity_queued
+   *   Is that loading after new element is queued.
+   */
+  Drupal.entityBrowserMultiStepDisplay.loadQueuedEntities = function (entities_list_element, entity_queued) {
+    var entities_list = $(entities_list_element);
+
+    var handler_element = entities_list.siblings('[name=ajax_action_handler]');
+    var running_ajax = Drupal.entityBrowserMultiStepDisplay.isAjaxRunning(handler_element[0], 'selection_display_action');
+    var empty_queue = $.isEmptyObject(commands_queue);
+
+    if (!running_ajax && !empty_queue) {
+      handler_element.val(JSON.stringify(commands_queue));
+
+      // Clear Queue after command is set to handler element.
+      commands_queue = {};
+
+      // Trigger event to execute event with defined command.
+      handler_element.trigger('selection_display_action');
+    }
+    else {
+      if (!entity_queued && !empty_queue) {
+        setTimeout($.proxy(Drupal.entityBrowserMultiStepDisplay.loadEntities, entities_list_element), 200);
+      }
+    }
+  };
+
+  /**
+   * Search is there current Ajax request executing for current event.
+   *
+   * @param handler_element
+   *   Element on what event is triggered.
+   * @param event_name
+   *   Event name.
+   *
+   * @returns {boolean}
+   */
+  Drupal.entityBrowserMultiStepDisplay.isAjaxRunning = function (handler_element, event_name) {
+    var ajax_list = Drupal.ajax.instances;
+
+    for (var i = 0; i < ajax_list.length; i++) {
+      if (ajax_list[i] && ajax_list[i].event === event_name && ajax_list[i].element === handler_element && ajax_list[i].ajaxing) {
+        return true;
+      }
+    }
+
+    return false;
+  }
+
 }(jQuery, Drupal));
diff --git a/modules/entity_form/src/Plugin/EntityBrowser/Widget/EntityForm.php b/modules/entity_form/src/Plugin/EntityBrowser/Widget/EntityForm.php
index 751acbc..d9a6f8d 100644
--- a/modules/entity_form/src/Plugin/EntityBrowser/Widget/EntityForm.php
+++ b/modules/entity_form/src/Plugin/EntityBrowser/Widget/EntityForm.php
@@ -21,7 +21,8 @@ use Drupal\Core\Entity\EntityDisplayRepositoryInterface;
  * @EntityBrowserWidget(
  *   id = "entity_form",
  *   label = @Translation("Entity form"),
- *   description = @Translation("Provides entity form widget.")
+ *   description = @Translation("Provides entity form widget."),
+ *   autoSelect = FALSE
  * )
  */
 class EntityForm extends WidgetBase {
diff --git a/modules/example/config/install/core.entity_form_display.node.entity_browser_test.default.yml b/modules/example/config/install/core.entity_form_display.node.entity_browser_test.default.yml
index a12307c..8d0a73e 100644
--- a/modules/example/config/install/core.entity_form_display.node.entity_browser_test.default.yml
+++ b/modules/example/config/install/core.entity_form_display.node.entity_browser_test.default.yml
@@ -5,6 +5,7 @@ dependencies:
     - field.field.node.entity_browser_test.body
     - field.field.node.entity_browser_test.field_files
     - field.field.node.entity_browser_test.field_files1
+    - field.field.node.entity_browser_test.field_files_over_ajax
     - field.field.node.entity_browser_test.field_image_browser
     - field.field.node.entity_browser_test.field_nodes
     - node.type.entity_browser_test
@@ -55,6 +56,18 @@ content:
       field_widget_edit: true
       field_widget_remove: true
     third_party_settings: {  }
+  field_files_over_ajax:
+    weight: 36
+    settings:
+      entity_browser: test_files_ajax
+      field_widget_display: label
+      field_widget_edit: true
+      field_widget_remove: true
+      selection_mode: selection_edit
+      open: false
+      field_widget_display_settings: {  }
+    third_party_settings: {  }
+    type: entity_browser_entity_reference
   field_image_browser:
     weight: 35
     settings:
diff --git a/modules/example/config/install/core.entity_view_display.node.entity_browser_test.default.yml b/modules/example/config/install/core.entity_view_display.node.entity_browser_test.default.yml
index 12bb96b..c4b8a3b 100644
--- a/modules/example/config/install/core.entity_view_display.node.entity_browser_test.default.yml
+++ b/modules/example/config/install/core.entity_view_display.node.entity_browser_test.default.yml
@@ -5,6 +5,7 @@ dependencies:
     - field.field.node.entity_browser_test.body
     - field.field.node.entity_browser_test.field_files
     - field.field.node.entity_browser_test.field_files1
+    - field.field.node.entity_browser_test.field_files_over_ajax
     - field.field.node.entity_browser_test.field_image_browser
     - field.field.node.entity_browser_test.field_nodes
     - node.type.entity_browser_test
@@ -40,6 +41,13 @@ content:
       link: true
     third_party_settings: {  }
     type: entity_reference_label
+  field_files_over_ajax:
+    weight: 106
+    label: above
+    settings:
+      link: true
+    third_party_settings: {  }
+    type: entity_reference_label
   field_image_browser:
     weight: 105
     label: above
diff --git a/modules/example/config/install/entity_browser.browser.test_files_ajax.yml b/modules/example/config/install/entity_browser.browser.test_files_ajax.yml
new file mode 100644
index 0000000..15d70b8
--- /dev/null
+++ b/modules/example/config/install/entity_browser.browser.test_files_ajax.yml
@@ -0,0 +1,45 @@
+langcode: und
+status: true
+dependencies:
+  enforced:
+    module:
+      - entity_browser_example
+  module:
+    - views
+name: test_files_ajax
+label: 'Test entity browser for files (with auto loading)'
+display: iframe
+display_configuration:
+  width: '650'
+  height: '500'
+  link_text: 'Select entities'
+  auto_open: false
+selection_display: multi_step_display
+selection_display_configuration:
+  entity_type: node
+  display: label
+  display_settings: {  }
+  select_text: 'Use selected'
+  selection_hidden: false
+widget_selector: tabs
+widget_selector_configuration: {  }
+widgets:
+  a4ad947c-9669-497c-9988-24351955a02f:
+    settings:
+      view: files_entity_browser_ajax
+      view_display: entity_browser_1
+      submit_text: 'Select entities'
+      auto_select: '1'
+    uuid: a4ad947c-9669-497c-9988-24351955a02f
+    weight: -10
+    label: 'Files listing'
+    id: view
+  735d146c-a4b2-4327-a057-d109e0905e05:
+    settings:
+      upload_location: 'public://'
+      submit_text: 'Select files'
+      auto_select: 0
+    uuid: 735d146c-a4b2-4327-a057-d109e0905e05
+    weight: -9
+    label: 'Upload files'
+    id: upload
diff --git a/modules/example/config/install/field.field.node.entity_browser_test.field_files_over_ajax.yml b/modules/example/config/install/field.field.node.entity_browser_test.field_files_over_ajax.yml
new file mode 100644
index 0000000..291ad83
--- /dev/null
+++ b/modules/example/config/install/field.field.node.entity_browser_test.field_files_over_ajax.yml
@@ -0,0 +1,24 @@
+langcode: en
+status: true
+dependencies:
+  config:
+    - field.storage.node.field_files_over_ajax
+    - node.type.entity_browser_test
+id: node.entity_browser_test.field_files_over_ajax
+field_name: field_files_over_ajax
+entity_type: node
+bundle: entity_browser_test
+label: 'Files (with auto loading)'
+description: ''
+required: false
+translatable: false
+default_value: {  }
+default_value_callback: ''
+settings:
+  handler: 'default:file'
+  handler_settings:
+    target_bundles: null
+    sort:
+      field: _none
+    auto_create: false
+field_type: entity_reference
diff --git a/modules/example/config/install/field.storage.node.field_files_over_ajax.yml b/modules/example/config/install/field.storage.node.field_files_over_ajax.yml
new file mode 100644
index 0000000..bb8a800
--- /dev/null
+++ b/modules/example/config/install/field.storage.node.field_files_over_ajax.yml
@@ -0,0 +1,19 @@
+langcode: en
+status: true
+dependencies:
+  module:
+    - file
+    - node
+id: node.field_files_over_ajax
+field_name: field_files_over_ajax
+entity_type: node
+type: entity_reference
+settings:
+  target_type: file
+module: core
+locked: false
+cardinality: -1
+translatable: true
+indexes: {  }
+persist_with_no_fields: false
+custom_storage: false
diff --git a/modules/example/config/install/views.view.files_entity_browser_ajax.yml b/modules/example/config/install/views.view.files_entity_browser_ajax.yml
new file mode 100644
index 0000000..9bf93cd
--- /dev/null
+++ b/modules/example/config/install/views.view.files_entity_browser_ajax.yml
@@ -0,0 +1,467 @@
+langcode: en
+status: true
+dependencies:
+  enforced:
+    module:
+      - entity_browser_example
+  module:
+    - entity_browser
+    - file
+    - user
+id: files_entity_browser_ajax
+label: 'Files entity browser (with auto loading)'
+module: views
+description: ''
+tag: ''
+base_table: file_managed
+base_field: fid
+core: 8.x
+display:
+  default:
+    display_plugin: default
+    id: default
+    display_title: Master
+    position: 0
+    display_options:
+      access:
+        type: perm
+        options:
+          perm: 'access content'
+      cache:
+        type: none
+        options: {  }
+      query:
+        type: views_query
+        options:
+          disable_sql_rewrite: false
+          distinct: false
+          replica: false
+          query_comment: ''
+          query_tags: {  }
+      exposed_form:
+        type: basic
+        options:
+          submit_button: Apply
+          reset_button: false
+          reset_button_label: Reset
+          exposed_sorts_label: 'Sort by'
+          expose_sort_order: true
+          sort_asc_label: Asc
+          sort_desc_label: Desc
+      pager:
+        type: full
+        options:
+          items_per_page: 10
+          offset: 0
+          id: 0
+          total_pages: null
+          expose:
+            items_per_page: false
+            items_per_page_label: 'Items per page'
+            items_per_page_options: '5, 10, 25, 50'
+            items_per_page_options_all: false
+            items_per_page_options_all_label: '- All -'
+            offset: false
+            offset_label: Offset
+          tags:
+            previous: '‹ previous'
+            next: 'next ›'
+            first: '« first'
+            last: 'last »'
+          quantity: 9
+      style:
+        type: table
+        options:
+          grouping: {  }
+          row_class: ''
+          default_row_class: true
+          override: true
+          sticky: false
+          caption: ''
+          summary: ''
+          description: ''
+          columns:
+            filename: filename
+            created: created
+            entity_browser_select: entity_browser_select
+            filesize: filesize
+            status: status
+          info:
+            filename:
+              sortable: false
+              default_sort_order: asc
+              align: ''
+              separator: ''
+              empty_column: false
+              responsive: ''
+            created:
+              sortable: false
+              default_sort_order: asc
+              align: ''
+              separator: ''
+              empty_column: false
+              responsive: ''
+            entity_browser_select:
+              align: ''
+              separator: ''
+              empty_column: false
+              responsive: ''
+            filesize:
+              sortable: false
+              default_sort_order: asc
+              align: ''
+              separator: ''
+              empty_column: false
+              responsive: ''
+            status:
+              sortable: false
+              default_sort_order: asc
+              align: ''
+              separator: ''
+              empty_column: false
+              responsive: ''
+          default: '-1'
+          empty_table: false
+      row:
+        type: fields
+        options:
+          inline: {  }
+          separator: ''
+          hide_empty: false
+          default_field_elements: true
+      fields:
+        entity_browser_select:
+          id: entity_browser_select
+          table: file_managed
+          field: entity_browser_select
+          relationship: none
+          group_type: group
+          admin_label: ''
+          label: ''
+          exclude: false
+          alter:
+            alter_text: false
+            text: "<input type=\"hidden\" value=\"bbb\">\naaa\n</input>"
+            make_link: false
+            path: ''
+            absolute: false
+            external: false
+            replace_spaces: false
+            path_case: none
+            trim_whitespace: false
+            alt: ''
+            rel: ''
+            link_class: ''
+            prefix: ''
+            suffix: ''
+            target: ''
+            nl2br: false
+            max_length: null
+            word_boundary: true
+            ellipsis: true
+            more_link: false
+            more_link_text: ''
+            more_link_path: ''
+            strip_tags: false
+            trim: false
+            preserve_tags: '<script><input>'
+            html: false
+          element_type: ''
+          element_class: ''
+          element_label_type: ''
+          element_label_class: ''
+          element_label_colon: false
+          element_wrapper_type: ''
+          element_wrapper_class: ''
+          element_default_classes: true
+          empty: ''
+          hide_empty: false
+          empty_zero: false
+          hide_alter_empty: true
+          entity_type: file
+          plugin_id: entity_browser_select
+        filename:
+          id: filename
+          table: file_managed
+          field: filename
+          entity_type: file
+          entity_field: filename
+          label: ''
+          alter:
+            alter_text: false
+            make_link: false
+            absolute: false
+            trim: false
+            word_boundary: false
+            ellipsis: false
+            strip_tags: false
+            html: false
+          hide_empty: false
+          empty_zero: false
+          link_to_file: true
+          plugin_id: file
+          relationship: none
+          group_type: group
+          admin_label: ''
+          exclude: false
+          element_type: ''
+          element_class: ''
+          element_label_type: ''
+          element_label_class: ''
+          element_label_colon: true
+          element_wrapper_type: ''
+          element_wrapper_class: ''
+          element_default_classes: true
+          empty: ''
+          hide_alter_empty: true
+        created:
+          id: created
+          table: file_managed
+          field: created
+          relationship: none
+          group_type: group
+          admin_label: ''
+          label: Created
+          exclude: false
+          alter:
+            alter_text: false
+            text: ''
+            make_link: false
+            path: ''
+            absolute: false
+            external: false
+            replace_spaces: false
+            path_case: none
+            trim_whitespace: false
+            alt: ''
+            rel: ''
+            link_class: ''
+            prefix: ''
+            suffix: ''
+            target: ''
+            nl2br: false
+            max_length: null
+            word_boundary: true
+            ellipsis: true
+            more_link: false
+            more_link_text: ''
+            more_link_path: ''
+            strip_tags: false
+            trim: false
+            preserve_tags: ''
+            html: false
+          element_type: ''
+          element_class: ''
+          element_label_type: ''
+          element_label_class: ''
+          element_label_colon: true
+          element_wrapper_type: ''
+          element_wrapper_class: ''
+          element_default_classes: true
+          empty: ''
+          hide_empty: false
+          empty_zero: false
+          hide_alter_empty: true
+          date_format: fallback
+          custom_date_format: ''
+          timezone: ''
+          entity_type: file
+          entity_field: created
+          plugin_id: date
+        filesize:
+          id: filesize
+          table: file_managed
+          field: filesize
+          relationship: none
+          group_type: group
+          admin_label: ''
+          label: 'File size'
+          exclude: false
+          alter:
+            alter_text: false
+            text: ''
+            make_link: false
+            path: ''
+            absolute: false
+            external: false
+            replace_spaces: false
+            path_case: none
+            trim_whitespace: false
+            alt: ''
+            rel: ''
+            link_class: ''
+            prefix: ''
+            suffix: ''
+            target: ''
+            nl2br: false
+            max_length: null
+            word_boundary: true
+            ellipsis: true
+            more_link: false
+            more_link_text: ''
+            more_link_path: ''
+            strip_tags: false
+            trim: false
+            preserve_tags: ''
+            html: false
+          element_type: ''
+          element_class: ''
+          element_label_type: ''
+          element_label_class: ''
+          element_label_colon: true
+          element_wrapper_type: ''
+          element_wrapper_class: ''
+          element_default_classes: true
+          empty: ''
+          hide_empty: false
+          empty_zero: false
+          hide_alter_empty: true
+          file_size_display: formatted
+          entity_type: file
+          entity_field: filesize
+          plugin_id: file_size
+        status:
+          id: status
+          table: file_managed
+          field: status
+          relationship: none
+          group_type: group
+          admin_label: ''
+          label: Status
+          exclude: false
+          alter:
+            alter_text: false
+            text: ''
+            make_link: false
+            path: ''
+            absolute: false
+            external: false
+            replace_spaces: false
+            path_case: none
+            trim_whitespace: false
+            alt: ''
+            rel: ''
+            link_class: ''
+            prefix: ''
+            suffix: ''
+            target: ''
+            nl2br: false
+            max_length: null
+            word_boundary: true
+            ellipsis: true
+            more_link: false
+            more_link_text: ''
+            more_link_path: ''
+            strip_tags: false
+            trim: false
+            preserve_tags: ''
+            html: false
+          element_type: ''
+          element_class: ''
+          element_label_type: ''
+          element_label_class: ''
+          element_label_colon: true
+          element_wrapper_type: ''
+          element_wrapper_class: ''
+          element_default_classes: true
+          empty: ''
+          hide_empty: false
+          empty_zero: false
+          hide_alter_empty: true
+          entity_type: file
+          entity_field: status
+          plugin_id: file_status
+      filters:
+        filename:
+          id: filename
+          table: file_managed
+          field: filename
+          relationship: none
+          group_type: group
+          admin_label: ''
+          operator: contains
+          value: ''
+          group: 1
+          exposed: true
+          expose:
+            operator_id: filename_op
+            label: Filename
+            description: ''
+            use_operator: false
+            operator: filename_op
+            identifier: filename
+            required: false
+            remember: false
+            multiple: false
+            remember_roles:
+              authenticated: authenticated
+              anonymous: '0'
+              administrator: '0'
+          is_grouped: false
+          group_info:
+            label: ''
+            description: ''
+            identifier: ''
+            optional: true
+            widget: select
+            multiple: false
+            remember: false
+            default_group: All
+            default_group_multiple: {  }
+            group_items: {  }
+          entity_type: file
+          entity_field: filename
+          plugin_id: string
+      sorts:
+        created:
+          id: created
+          table: file_managed
+          field: created
+          order: DESC
+          entity_type: file
+          entity_field: created
+          plugin_id: date
+          relationship: none
+          group_type: group
+          admin_label: ''
+          exposed: false
+          expose:
+            label: ''
+          granularity: second
+      header: {  }
+      footer: {  }
+      empty: {  }
+      relationships: {  }
+      arguments: {  }
+      display_extenders: {  }
+      field_langcode: '***LANGUAGE_language_content***'
+      field_langcode_add_to_query: null
+    cache_metadata:
+      contexts:
+        - 'languages:language_content'
+        - 'languages:language_interface'
+        - url
+        - url.query_args
+        - user.permissions
+      cacheable: false
+      max-age: 0
+      tags: {  }
+  entity_browser_1:
+    display_plugin: entity_browser
+    id: entity_browser_1
+    display_title: 'Entity browser'
+    position: 2
+    display_options:
+      display_extenders: {  }
+      field_langcode: '***LANGUAGE_language_content***'
+      field_langcode_add_to_query: null
+    cache_metadata:
+      contexts:
+        - 'languages:language_content'
+        - 'languages:language_interface'
+        - url
+        - url.query_args
+        - user.permissions
+      cacheable: false
+      max-age: 0
+      tags: {  }
diff --git a/modules/example/entity_browser_example.libraries.yml b/modules/example/entity_browser_example.libraries.yml
new file mode 100644
index 0000000..c9dbb1c
--- /dev/null
+++ b/modules/example/entity_browser_example.libraries.yml
@@ -0,0 +1,4 @@
+multi_step_display_ajax:
+  version: VERSION
+  js:
+    js/multistep-display-ajax.js: {}
diff --git a/modules/example/entity_browser_example.module b/modules/example/entity_browser_example.module
new file mode 100644
index 0000000..0a975c7
--- /dev/null
+++ b/modules/example/entity_browser_example.module
@@ -0,0 +1,19 @@
+<?php
+
+/**
+ * @file
+ * Hooks for showing tests for entity browser.
+ */
+
+use Drupal\views\ViewExecutable;
+
+/**
+ * Implements hook_views_pre_render().
+ *
+ * Attach event handlers for clicking on view row.
+ */
+function entity_browser_example_views_pre_render(ViewExecutable $view) {
+  if (isset($view) && ($view->storage->id() == 'files_entity_browser_ajax')) {
+    $view->element['#attached']['library'][] = 'entity_browser_example/multi_step_display_ajax';
+  }
+}
diff --git a/modules/example/js/multistep-display-ajax.js b/modules/example/js/multistep-display-ajax.js
new file mode 100644
index 0000000..653ad24
--- /dev/null
+++ b/modules/example/js/multistep-display-ajax.js
@@ -0,0 +1,38 @@
+/**
+ * @file
+ *
+ * Adds handling of click event for view in order to demonstrate Ajax actions
+ * for multistep selection display.
+ */
+
+(function ($) {
+
+  'use strict';
+
+  /**
+   * Attaches the behavior of the media entity browser view.
+   */
+  Drupal.behaviors.multiStepAjaxSelection = {
+    attach: function () {
+      jQuery('.view-id-files_entity_browser_ajax td.views-field-filename')
+        .parents('tr')
+        .once()
+        .click(function () {
+          var $row = $(this);
+          var $input = $row.find('input');
+
+          // Here is way, how to trigger loading of entity for multipstep
+          // display over ajax. On multistep display element, "load-entities"
+          // event should be triggered with value for entity that should be
+          // loaded. Value is in format: type:id - for example: file:3
+          $row.parents('form')
+            .find('.entities-list')
+            .trigger('load-entities', [[$input.val()]]);
+        });
+
+      // Hide Checkboxes -> to make example more compaling.
+      jQuery('.view-id-files_entity_browser_ajax .views-field-entity-browser-select').hide();
+    }
+  };
+
+}(jQuery, Drupal));
diff --git a/src/Annotation/EntityBrowserSelectionDisplay.php b/src/Annotation/EntityBrowserSelectionDisplay.php
index f55babb..a729234 100644
--- a/src/Annotation/EntityBrowserSelectionDisplay.php
+++ b/src/Annotation/EntityBrowserSelectionDisplay.php
@@ -50,4 +50,16 @@ class EntityBrowserSelectionDisplay extends Plugin {
    */
   public $acceptPreselection = FALSE;
 
+  /**
+   * Indicates that javascript commands can be executed for Selection display.
+   *
+   * Currently supported javascript commands are adding and removing selection
+   * from selection display. Javascript commands use Ajax requests to load
+   * relevant changes and makes user experience way better, becase form is not
+   * flashed every time.
+   *
+   * @var bool
+   */
+  public $jsCommands = FALSE;
+
 }
diff --git a/src/Annotation/EntityBrowserWidget.php b/src/Annotation/EntityBrowserWidget.php
index c192ee0..d8a512e 100644
--- a/src/Annotation/EntityBrowserWidget.php
+++ b/src/Annotation/EntityBrowserWidget.php
@@ -40,4 +40,11 @@ class EntityBrowserWidget extends Plugin {
    */
   public $description = '';
 
+  /**
+   * Indicates that widget supports auto selection of entities.
+   *
+   * @var bool
+   */
+  public $autoSelect = FALSE;
+
 }
diff --git a/src/Form/EntityBrowserForm.php b/src/Form/EntityBrowserForm.php
index 8cad31b..c590b3c 100644
--- a/src/Form/EntityBrowserForm.php
+++ b/src/Form/EntityBrowserForm.php
@@ -3,6 +3,7 @@
 namespace Drupal\entity_browser\Form;
 
 use Drupal\Component\Uuid\UuidInterface;
+use Drupal\Core\Config\ConfigException;
 use Drupal\Core\Form\FormBase;
 use Drupal\Core\Form\FormStateInterface;
 use Drupal\Core\KeyValueStore\KeyValueStoreExpirableInterface;
@@ -75,7 +76,7 @@ class EntityBrowserForm extends FormBase implements EntityBrowserFormInterface {
   /**
    * Initializes form state.
    *
-   * @param \Drupal\Core\Form\FormStateInterface
+   * @param \Drupal\Core\Form\FormStateInterface $form_state
    *   Form state object.
    */
   protected function init(FormStateInterface $form_state) {
@@ -109,6 +110,8 @@ class EntityBrowserForm extends FormBase implements EntityBrowserFormInterface {
       $this->init($form_state);
     }
 
+    $this->isFunctionalForm($form_state);
+
     $form['#attributes']['class'][] = 'entity-browser-form';
     $form['#browser_parts'] = [
       'widget_selector' => 'widget_selector',
@@ -138,6 +141,29 @@ class EntityBrowserForm extends FormBase implements EntityBrowserFormInterface {
   }
 
   /**
+   * Check if entity browser with selected configuration combination can work.
+   *
+   * @param \Drupal\Core\Form\FormStateInterface $form_state
+   *   Form status.
+   */
+  protected function isFunctionalForm(FormStateInterface $form_state) {
+    $current_widget_config = $this->entity_browser
+      ->getWidgets()
+      ->get($this->getCurrentWidget($form_state))
+      ->getConfiguration();
+
+    if ($current_widget_config['settings']['auto_select']) {
+      /** @var \Drupal\entity_browser\SelectionDisplayInterface $selectionDisplay */
+      $selectionDisplay = $this->entity_browser
+        ->getSelectionDisplay();
+
+      if (!$selectionDisplay->getPluginDefinition()['jsCommands']) {
+        throw new ConfigException('Used entity browser selection display cannot work in combination with settings defined for used selection widget.');
+      }
+    }
+  }
+
+  /**
    * {@inheritdoc}
    */
   public function validateForm(array &$form, FormStateInterface $form_state) {
diff --git a/src/Plugin/EntityBrowser/SelectionDisplay/MultiStepDisplay.php b/src/Plugin/EntityBrowser/SelectionDisplay/MultiStepDisplay.php
index 1080a21..d7b519f 100644
--- a/src/Plugin/EntityBrowser/SelectionDisplay/MultiStepDisplay.php
+++ b/src/Plugin/EntityBrowser/SelectionDisplay/MultiStepDisplay.php
@@ -2,6 +2,9 @@
 
 namespace Drupal\entity_browser\Plugin\EntityBrowser\SelectionDisplay;
 
+use Drupal\Core\Ajax\AjaxResponse;
+use Drupal\Core\Ajax\InvokeCommand;
+use Drupal\Core\Ajax\ReplaceCommand;
 use Drupal\Core\Entity\EntityTypeManagerInterface;
 use Drupal\Core\Form\FormStateInterface;
 use Drupal\entity_browser\FieldWidgetDisplayManager;
@@ -16,7 +19,8 @@ use Symfony\Component\EventDispatcher\EventDispatcherInterface;
  *   id = "multi_step_display",
  *   label = @Translation("Multi step selection display"),
  *   description = @Translation("Show current selection display and delivers selected entities."),
- *   acceptPreselection = TRUE
+ *   acceptPreselection = TRUE,
+ *   jsCommands = TRUE
  * )
  */
 class MultiStepDisplay extends SelectionDisplayBase {
@@ -80,6 +84,12 @@ class MultiStepDisplay extends SelectionDisplayBase {
    * {@inheritdoc}
    */
   public function getForm(array &$original_form, FormStateInterface $form_state) {
+
+    // Check if trigger element is dedicated to handle front-end commands.
+    if (($triggering_element = $form_state->getTriggeringElement()) && $triggering_element['#name'] === 'ajax_action_handler' && !empty($triggering_element['#value'])) {
+      $this->executeJsCommand($form_state);
+    }
+
     $selected_entities = $form_state->get(['entity_browser', 'selected_entities']);
 
     $form = [];
@@ -115,6 +125,7 @@ class MultiStepDisplay extends SelectionDisplayBase {
           '#submit' => [[get_class($this), 'removeItemSubmit']],
           '#name' => 'remove_' . $entity->id() . '_' . $id,
           '#attributes' => [
+            'class' => ['entity-browser-remove-selected-entity'],
             'data-row-id' => $id,
             'data-remove-entity' => 'items_' . $entity->id(),
           ],
@@ -126,25 +137,171 @@ class MultiStepDisplay extends SelectionDisplayBase {
         ],
       ];
     }
+
+    // Add hidden element used to make execution of front-end commands.
+    $form['ajax_action_handler'] = [
+      '#type' => 'hidden',
+      '#name' => 'ajax_action_handler',
+      '#id' => 'ajax_action_handler',
+      '#attributes' => ['id' => 'ajax_action_handler'],
+      '#ajax' => [
+        'callback' => [get_class($this), 'handleAjaxCommand'],
+        'wrapper' => 'edit-selected',
+        'event' => 'selection_display_action',
+        'progress' => [
+          'type' => 'fullscreen',
+        ],
+      ],
+    ];
+
     $form['use_selected'] = [
       '#type' => 'submit',
       '#value' => $this->t($this->configuration['select_text']),
       '#name' => 'use_selected',
-      '#access' => empty($selected_entities) ? FALSE : TRUE,
     ];
+
     $form['show_selection'] = [
       '#type' => 'button',
       '#value' => $this->t('Show selected'),
       '#attributes' => [
         'class' => ['entity-browser-show-selection'],
       ],
-      '#access' => empty($selected_entities) ? FALSE : TRUE,
     ];
 
     return $form;
   }
 
   /**
+   * Execute command generated by front-end.
+   *
+   * @param \Drupal\Core\Form\FormStateInterface $form_state
+   *   Form state object.
+   */
+  protected function executeJsCommand(FormStateInterface $form_state) {
+    $triggering_element = $form_state->getTriggeringElement();
+
+    $commands = json_decode($triggering_element['#value'], TRUE);
+
+    // Process Remove command.
+    if (isset($commands['remove'])) {
+      $entity_ids = $commands['remove'];
+
+      // Remove weight of entity being removed.
+      foreach ($entity_ids as $entity_info) {
+        $entity_id_info = explode('_', $entity_info['entity_id']);
+
+        $form_state->unsetValue([
+          'selected',
+          $entity_info['entity_id'],
+        ]);
+
+        // Remove entity itself.
+        $selected_entities = &$form_state->get(['entity_browser', 'selected_entities']);
+        unset($selected_entities[$entity_id_info[2]]);
+      }
+
+      static::saveNewOrder($form_state);
+    }
+
+    // Process Add command.
+    if (isset($commands['add'])) {
+      $entity_ids = $commands['add'];
+
+      $entities_to_add = [];
+      $added_entities = [];
+
+      // Generate list of entities grouped by type, to speed up loadMultiple.
+      foreach ($entity_ids as $entity_pair_info) {
+        $entity_info = explode(':', $entity_pair_info['entity_id']);
+
+        if (!isset($entities_to_add[$entity_info[0]])) {
+          $entities_to_add[$entity_info[0]] = [];
+        }
+
+        $entities_to_add[$entity_info[0]][] = $entity_info[1];
+      }
+
+      // Load Entities and add into $added_entities, so that we have list of
+      // entities with key - "type:id".
+      foreach ($entities_to_add as $entity_type => $entity_type_ids) {
+        $indexed_entities = $this->entityTypeManager->getStorage($entity_type)
+          ->loadMultiple($entity_type_ids);
+
+        foreach ($indexed_entities as $entity_id => $entity) {
+          $added_entities[implode(':', [
+            $entity_type,
+            $entity_id,
+          ])] = $entity;
+        }
+      }
+
+      // Array is accessed as reference, so that changes are propagated.
+      $selected_entities = &$form_state->get([
+        'entity_browser',
+        'selected_entities',
+      ]);
+
+      // Fill list of selected entities in correct order with loaded entities.
+      // In this case, order is preserved and multiple entities with same ID
+      // can be selected properly.
+      foreach ($entity_ids as $entity_pair_info) {
+        $selected_entities[] = $added_entities[$entity_pair_info['entity_id']];
+      }
+    }
+  }
+
+  /**
+   * Handler to generate Ajax response, after command is executed.
+   *
+   * @param array $form
+   *   Form.
+   * @param \Drupal\Core\Form\FormStateInterface $form_state
+   *   Form state object.
+   *
+   * @return \Drupal\Core\Ajax\AjaxResponse
+   *   Return Ajax response with commands.
+   */
+  public static function handleAjaxCommand(array $form, FormStateInterface $form_state) {
+    $ajax = new AjaxResponse();
+
+    if (($triggering_element = $form_state->getTriggeringElement()) && $triggering_element['#name'] === 'ajax_action_handler' && !empty($triggering_element['#value'])) {
+      $commands = json_decode($triggering_element['#value'], TRUE);
+
+      // Entity IDs that are affected by this command.
+      if (isset($commands['add'])) {
+        $entity_ids = $commands['add'];
+
+        $selected_entities = &$form_state->get([
+          'entity_browser',
+          'selected_entities',
+        ]);
+
+        // Get entities added by this command and generate JS commands for them.
+        $selected_entity_keys = array_keys($selected_entities);
+        $key_index = count($selected_entity_keys) - count($entity_ids);
+        foreach ($entity_ids as $entity_pair_info) {
+          $last_entity_id = $selected_entities[$selected_entity_keys[$key_index]]->id();
+
+          $html = drupal_render($form['selection_display']['selected']['items_' . $last_entity_id . '_' . $selected_entity_keys[$key_index]]);
+          $ajax->addCommand(
+            new ReplaceCommand('div[id="' . $entity_pair_info['proxy_id'] . '"]', trim($html))
+          );
+
+          $key_index++;
+        }
+      }
+
+      // Add Invoke command to trigger loading of entities that are queued
+      // during execution of current Ajax request.
+      $ajax->addCommand(
+        new InvokeCommand('.entities-list', 'trigger', ['load-entities'])
+      );
+    }
+
+    return $ajax;
+  }
+
+  /**
    * Submit callback for remove buttons.
    *
    * @param array $form
diff --git a/src/Plugin/EntityBrowser/SelectionDisplay/NoDisplay.php b/src/Plugin/EntityBrowser/SelectionDisplay/NoDisplay.php
index e266ab9..3f3f5c6 100644
--- a/src/Plugin/EntityBrowser/SelectionDisplay/NoDisplay.php
+++ b/src/Plugin/EntityBrowser/SelectionDisplay/NoDisplay.php
@@ -12,7 +12,8 @@ use Drupal\entity_browser\SelectionDisplayBase;
  *   id = "no_display",
  *   label = @Translation("No selection display"),
  *   description = @Translation("Skips current selection display and immediately delivers selected entities."),
- *   acceptPreselection = FALSE
+ *   acceptPreselection = FALSE,
+ *   jsCommands = FALSE
  * )
  */
 class NoDisplay extends SelectionDisplayBase {
diff --git a/src/Plugin/EntityBrowser/SelectionDisplay/View.php b/src/Plugin/EntityBrowser/SelectionDisplay/View.php
index 803aa3b..54135cb 100644
--- a/src/Plugin/EntityBrowser/SelectionDisplay/View.php
+++ b/src/Plugin/EntityBrowser/SelectionDisplay/View.php
@@ -14,7 +14,8 @@ use Drupal\views\Views;
  *   id = "view",
  *   label = @Translation("View selection display"),
  *   description = @Translation("Displays current selection in a View."),
- *   acceptPreselection = TRUE
+ *   acceptPreselection = TRUE,
+ *   jsCommands = FALSE
  * )
  */
 class View extends SelectionDisplayBase {
diff --git a/src/Plugin/EntityBrowser/Widget/Upload.php b/src/Plugin/EntityBrowser/Widget/Upload.php
index e65dc86..65cca56 100644
--- a/src/Plugin/EntityBrowser/Widget/Upload.php
+++ b/src/Plugin/EntityBrowser/Widget/Upload.php
@@ -19,7 +19,8 @@ use Symfony\Component\EventDispatcher\EventDispatcherInterface;
  * @EntityBrowserWidget(
  *   id = "upload",
  *   label = @Translation("Upload"),
- *   description = @Translation("Adds an upload field browser's widget.")
+ *   description = @Translation("Adds an upload field browser's widget."),
+ *   autoSelect = FALSE
  * )
  */
 class Upload extends WidgetBase {
diff --git a/src/Plugin/EntityBrowser/Widget/View.php b/src/Plugin/EntityBrowser/Widget/View.php
index 2e75b2d..b52e7a4 100644
--- a/src/Plugin/EntityBrowser/Widget/View.php
+++ b/src/Plugin/EntityBrowser/Widget/View.php
@@ -22,7 +22,8 @@ use Drupal\Core\Entity\EntityTypeManagerInterface;
  *   id = "view",
  *   label = @Translation("View"),
  *   provider = "views",
- *   description = @Translation("Uses a view to provide entity listing in a browser's widget.")
+ *   description = @Translation("Uses a view to provide entity listing in a browser's widget."),
+ *   autoSelect = TRUE
  * )
  */
 class View extends WidgetBase implements ContainerFactoryPluginInterface {
@@ -257,6 +258,7 @@ class View extends WidgetBase implements ContainerFactoryPluginInterface {
   public function submitConfigurationForm(array &$form, FormStateInterface $form_state) {
     $values = $form_state->getValues()['table'][$this->uuid()]['form'];
     $this->configuration['submit_text'] = $values['submit_text'];
+    $this->configuration['auto_select'] = $values['auto_select'];
     if (!empty($values['view'])) {
       list($view_id, $display_id) = explode('.', $values['view']);
       $this->configuration['view'] = $view_id;
diff --git a/src/WidgetBase.php b/src/WidgetBase.php
index a7c8fb7..590409e 100644
--- a/src/WidgetBase.php
+++ b/src/WidgetBase.php
@@ -109,6 +109,8 @@ abstract class WidgetBase extends PluginBase implements WidgetInterface, Contain
    * {@inheritdoc}
    */
   public function getForm(array &$original_form, FormStateInterface $form_state, array $additional_widget_parameters) {
+    $form = [];
+
     // Allow configuration overrides at runtime based on form state to enable
     // use cases where the instance of a widget may have contextual
     // configuration like field settings. "widget_context" doesn't have to be
@@ -116,34 +118,41 @@ abstract class WidgetBase extends PluginBase implements WidgetInterface, Contain
     // overwritten it can not call this method and implement its own logic.
     foreach ($this->defaultConfiguration() as $key => $value) {
       if ($form_state->has(['entity_browser', 'widget_context', $key]) && isset($this->configuration[$key])) {
-        $this->configuration[$key] = $form_state->get(['entity_browser', 'widget_context', $key]);
+        $this->configuration[$key] = $form_state->get([
+          'entity_browser',
+          'widget_context',
+          $key,
+        ]);
       }
     }
 
-    $form['actions'] = [
-      '#type' => 'actions',
-      'submit' => [
-        '#type' => 'submit',
-        '#value' => $this->configuration['submit_text'],
-        '#eb_widget_main_submit' => TRUE,
-        '#attributes' => ['class' => ['is-entity-browser-submit']],
-      ],
-    ];
+    // In case of auto submitting, widget will handle adding entities in JS.
+    $form['#attached']['drupalSettings']['entity_browser_widget']['auto_select'] = $this->configuration['auto_select'];
+    if (!$this->configuration['auto_select']) {
+      $form['actions'] = [
+        '#type' => 'actions',
+        'submit' => [
+          '#type' => 'submit',
+          '#value' => $this->configuration['submit_text'],
+          '#eb_widget_main_submit' => TRUE,
+          '#attributes' => ['class' => ['is-entity-browser-submit']],
+        ],
+      ];
+    }
 
     return $form;
   }
 
-
   /**
    * {@inheritdoc}
    */
   public function defaultConfiguration() {
     return [
       'submit_text' => $this->t('Select entities'),
+      'auto_select' => 0,
     ];
   }
 
-
   /**
    * {@inheritdoc}
    */
@@ -196,6 +205,14 @@ abstract class WidgetBase extends PluginBase implements WidgetInterface, Contain
       '#default_value' => $this->configuration['submit_text'],
     ];
 
+    // Allow "auto_select" setting when autoSelect is supported by widget.
+    $form['auto_select'] = [
+      '#type' => 'checkbox',
+      '#title' => $this->t('Automatically submit selection'),
+      '#default_value' => $this->configuration['auto_select'],
+      '#disabled' => !$this->getPluginDefinition()['autoSelect'],
+    ];
+
     return $form;
   }
 
diff --git a/tests/modules/entity_browser_test/src/Plugin/EntityBrowser/Widget/DummyWidget.php b/tests/modules/entity_browser_test/src/Plugin/EntityBrowser/Widget/DummyWidget.php
index 360369d..bd9995e 100644
--- a/tests/modules/entity_browser_test/src/Plugin/EntityBrowser/Widget/DummyWidget.php
+++ b/tests/modules/entity_browser_test/src/Plugin/EntityBrowser/Widget/DummyWidget.php
@@ -11,7 +11,8 @@ use Drupal\entity_browser\WidgetBase;
  * @EntityBrowserWidget(
  *   id = "dummy",
  *   label = @Translation("Dummy widget"),
- *   description = @Translation("Dummy widget existing for testing purposes.")
+ *   description = @Translation("Dummy widget existing for testing purposes."),
+ *   autoSelect = FALSE
  * )
  */
 class DummyWidget extends WidgetBase {
