diff --git a/src/Plugin/Field/FieldFormatter/ViewsReferenceFieldFormatter.php b/src/Plugin/Field/FieldFormatter/ViewsReferenceFieldFormatter.php
index 63d9617..4e512ac 100644
--- a/src/Plugin/Field/FieldFormatter/ViewsReferenceFieldFormatter.php
+++ b/src/Plugin/Field/FieldFormatter/ViewsReferenceFieldFormatter.php
@@ -81,19 +81,14 @@ class ViewsReferenceFieldFormatter extends FormatterBase {
 
       $view->setDisplay($display_id);
 
-      // Let all settings plugins alter the view.
-      $viewsreference_plugin_manager = \Drupal::service('plugin.manager.viewsreference.setting');
-      $plugin_definitions = $viewsreference_plugin_manager->getDefinitions();
-      $enabled_settings = array_filter($this->getFieldSetting('enabled_settings'));
-      foreach ($enabled_settings as $enabled_setting) {
-        if (!empty($plugin_definitions[$enabled_setting])) {
-          $plugin_definition = $plugin_definitions[$enabled_setting];
-          /** @var \Drupal\viewsreference\Plugin\ViewsReferenceSettingInterface $plugin_instance */
-          $plugin_instance = $viewsreference_plugin_manager->createInstance($plugin_definition['id']);
-          $value = isset($data[$plugin_definition['id']]) ? $data[$plugin_definition['id']] : $plugin_definition['default_value'];
-          $plugin_instance->alterView($view, $value);
-        }
-      }
+      // Add properties to the view so our hook_views_pre_build() implementation
+      // can alter the view. This is pretty hacky, but we need this to fix ajax
+      // behaviour in views. The hook_views_pre_build() needs to know if the
+      // view was part of a viewsreference field or not.
+      $view->element['#viewsreference'] = [
+        'data' => $data,
+        'enabled_settings' => array_filter($this->getFieldSetting('enabled_settings')),
+      ];
 
       $view->build($display_id);
       $view->preExecute();
diff --git a/viewsreference.module b/viewsreference.module
index eb1c9cc..227e344 100644
--- a/viewsreference.module
+++ b/viewsreference.module
@@ -6,6 +6,7 @@
  */
 
 use \Drupal\Core\Routing\RouteMatchInterface;
+use \Drupal\views\ViewExecutable;
 
 /**
  * Implements hook_help().
@@ -35,3 +36,52 @@ function viewsreference_theme($existing, $type, $theme, $path) {
 function viewsreference_preprocess_viewsreference__view_title(&$variables) {
   $variables['title'] = ['#markup' => $variables['variables']['#title']];
 }
+
+/**
+ * Implements hook_module_implements_alter().
+ */
+function viewsreference_module_implements_alter(&$implementations, $hook) {
+  if ($hook === 'views_pre_render') {
+    // Move viewsreference_views_pre_render() to the end of the list.
+    $viewsreference_hook = $implementations['viewsreference'];
+    unset($implementations['viewsreference']);
+    $implementations['viewsreference'] = $viewsreference_hook;
+  }
+}
+
+/**
+ * Implements hook_views_pre_build().
+ */
+function viewsreference_views_pre_build(ViewExecutable $view) {
+  if (!isset($view->element['#viewsreference']) && empty($view->getRequest()->request->get('viewsreference'))) {
+    return;
+  }
+
+  if (!empty($view->getRequest()->request->get('viewsreference'))) {
+    $view->element['#viewsreference'] = $view->getRequest()->request->get('viewsreference');
+  }
+
+  // Let all settings plugins alter the view.
+  $viewsreference_plugin_manager = \Drupal::service('plugin.manager.viewsreference.setting');
+  $plugin_definitions = $viewsreference_plugin_manager->getDefinitions();
+  foreach ($view->element['#viewsreference']['enabled_settings'] as $enabled_setting) {
+    if (!empty($plugin_definitions[$enabled_setting])) {
+      $plugin_definition = $plugin_definitions[$enabled_setting];
+      /** @var \Drupal\viewsreference\Plugin\ViewsReferenceSettingInterface $plugin_instance */
+      $plugin_instance = $viewsreference_plugin_manager->createInstance($plugin_definition['id']);
+      $value = isset($view->element['#viewsreference']['data'][$plugin_definition['id']]) ? $view->element['#viewsreference']['data'][$plugin_definition['id']] : $plugin_definition['default_value'];
+      $plugin_instance->alterView($view, $value);
+    }
+  }
+}
+
+/**
+ * Implements hook_views_pre_render().
+ */
+function viewsreference_views_pre_render($view) {
+  // If using AJAX, forward the viewsreference data and settings in the request.
+  if (isset($view->element['#viewsreference']) && $view->ajaxEnabled() && empty($view->is_attachment) && empty($view->live_preview)) {
+    $view->element['#attached']['drupalSettings']['views']['ajaxViews']['views_dom_id:' . $view->dom_id]['viewsreference'] = $view->element['#viewsreference'];
+  }
+  return $view;
+}
