diff --git a/js/responsive-preview.js b/js/responsive-preview.js
index ced8ed7..9dcc14a 100644
--- a/js/responsive-preview.js
+++ b/js/responsive-preview.js
@@ -366,6 +366,9 @@
           handler = selectDevice.bind(null, this);
           this.$el.on('click.responsivepreview', '.responsive-preview-device', handler);
 
+          handler = openPreview.bind(null, this);
+          this.$el.on('open-preview', '.responsive-preview-device', handler);
+
           this.listenTo(this.model, 'change:activeDevice', this.render);
           this.listenTo(this.model, 'change:isActive', this.render);
           this.listenTo(this.tabModel, 'change:isDeviceListOpen', this.render);
@@ -470,6 +473,9 @@
           handler = selectDevice.bind(null, this);
           this.$el.on('click.responsivepreview', '.responsive-preview-device', handler);
 
+          handler = openPreview.bind(null, this);
+          this.$el.on('open-preview', '.responsive-preview-device', handler);
+
           this.listenTo(this.model, 'change:activeDevice', this.render);
 
           // Curry the 'this' object in order to pass it as an argument to the
@@ -994,7 +1000,8 @@
   }
 
   /**
-   * Updates the model to reflect the properties of the chosen device.
+   * Wrapper for openPreview that takes in account if responsive preview is
+   * triggered on edit form. Available only for node entity type.
    *
    * @param Backbone.View view
    *   The View curried to this handler. This function is used in multiple Views,
@@ -1004,6 +1011,33 @@
    * @param jQuery.Event event
    */
   function selectDevice(view, event) {
+    var config = drupalSettings.responsive_preview;
+
+    if (config && config.ajax_responsive_preview && view.model.get('isActive') === false) {
+      var $previewTriggerElement = $(config.ajax_responsive_preview);
+      var deviceId = $(event.target).data('responsive-preview-name');
+
+      if ($previewTriggerElement.length) {
+        $previewTriggerElement.val(deviceId);
+        $previewTriggerElement.trigger('show-responsive-preview');
+      }
+    }
+    else {
+      return openPreview(view, event);
+    }
+  }
+
+  /**
+   * Updates the model to reflect the properties of the chosen device.
+   *
+   * @param Backbone.View view
+   *   The View curried to this handler. This function is used in multiple Views,
+   *   so we bind it as an argument to the handler function in order to avoid
+   *   having to reference it through a 'this' object which will trigger 'Possible
+   *   strict violation' warning messages in JSHint.
+   * @param jQuery.Event event
+   */
+  function openPreview(view, event) {
     var $link = $(event.target);
     var name = $link.data('responsive-preview-name');
     // If the clicked link is already active, then shut down the preview.
diff --git a/responsive_preview.module b/responsive_preview.module
index ab08f76..b41ccb2 100644
--- a/responsive_preview.module
+++ b/responsive_preview.module
@@ -5,7 +5,9 @@
  * Provides a component that previews the a page in various device dimensions.
  */
 
+use Drupal\Core\Form\FormStateInterface;
 use Drupal\Core\Routing\RouteMatchInterface;
+use Drupal\responsive_preview\ResponsivePreviewHandler;
 
 /**
  * Implements hook_help().
@@ -40,6 +42,12 @@ function responsive_preview_toolbar() {
   $url = $responsivePreviewService->getUrl();
   $preview_access = \Drupal::currentUser()->hasPermission('access responsive preview');
 
+  // If ajax responsive preview handling is available then url is not relevant.
+  // And base url can be used in that case.
+  if (empty($url) && ResponsivePreviewHandler::isAvailableAjaxPreview()) {
+    $url = '/';
+  }
+
   if ($preview_access && $url) {
     $items['responsive_preview'] += [
       '#type' => 'toolbar_item',
@@ -100,3 +108,12 @@ function responsive_preview_theme() {
 function responsive_preview_preprocess_item_list__responsive_preview(array &$variables) {
   template_preprocess_item_list($variables);
 }
+
+/**
+ * Implements hook_form_alter().
+ */
+function responsive_preview_form_alter(&$form, FormStateInterface $form_state, $form_id) {
+  // Add alter of form for responsive preview triggering element. So that
+  // responsive preview of non saved node entity is can be executed.
+  ResponsivePreviewHandler::handleFormAlter($form, $form_state, $form_id);
+}
diff --git a/src/ResponsivePreviewHandler.php b/src/ResponsivePreviewHandler.php
new file mode 100644
index 0000000..3aef0a6
--- /dev/null
+++ b/src/ResponsivePreviewHandler.php
@@ -0,0 +1,136 @@
+<?php
+
+namespace Drupal\responsive_preview;
+
+use Drupal\Core\Ajax\AjaxResponse;
+use Drupal\Core\Ajax\InvokeCommand;
+use Drupal\Core\Ajax\SettingsCommand;
+use Drupal\Core\Form\FormStateInterface;
+use Drupal\node\NodeForm;
+use Drupal\node\NodeInterface;
+
+/**
+ * Class ResponsivePreviewHandler.
+ *
+ * @package Drupal\responsive_preview
+ */
+class ResponsivePreviewHandler {
+
+  /**
+   * Determine if responsive preview should be available on page.
+   *
+   * @return bool
+   *   TRUE if page is node add page.
+   */
+  public static function isAvailableAjaxPreview() {
+    // If we are on an edit-form, try to resolve the canonical url.
+    $routeMatch = \Drupal::service('current_route_match');
+    if ($routeMatch->getRouteName() === 'node.add') {
+      return TRUE;
+    }
+
+    return FALSE;
+  }
+
+  /**
+   * Handling of form alter, for responsive preview.
+   *
+   * Request to this method is piped from module related hook_form_alter().
+   *
+   * @param array $form
+   *   Form array.
+   * @param \Drupal\Core\Form\FormStateInterface $form_state
+   *   Form state object.
+   * @param string $form_id
+   *   Form ID.
+   */
+  public static function handleFormAlter(array &$form, FormStateInterface $form_state, $form_id) {
+    if (!$form_state->getFormObject() instanceof NodeForm) {
+      return;
+    }
+
+    /** @var \Drupal\Core\Entity\Entity $entity */
+    $node = $form_state->getFormObject()->getEntity();
+
+    if ($node instanceof NodeInterface) {
+      $preview_mode = $node->type->entity->getPreviewMode();
+
+      $form['ajax_responsive_preview'] = [
+        '#type' => 'hidden',
+        '#name' => 'ajax_responsive_preview',
+        '#id' => 'ajax_responsive_preview',
+        '#attributes' => ['id' => 'ajax_responsive_preview'],
+        '#access' => $preview_mode != DRUPAL_DISABLED && ($node->access('create') || $node->access('update')),
+        '#submit' => ['::submitForm', '::preview'],
+        '#executes_submit_callback' => TRUE,
+        '#ajax' => [
+          'callback' => [
+            __CLASS__,
+            'handleAjaxDevicePreview',
+          ],
+          'event' => 'show-responsive-preview',
+          'progress' => [
+            'type' => 'fullscreen',
+          ],
+        ],
+        '#attached' => [
+          'drupalSettings' => [
+            'responsive_preview' => [
+              'ajax_responsive_preview' => '#ajax_responsive_preview',
+            ],
+          ],
+        ],
+      ];
+    }
+
+  }
+
+  /**
+   * Handles response for AJAX request.
+   *
+   * @param array $form
+   *   From array object.
+   * @param \Drupal\Core\Form\FormStateInterface $form_state
+   *   Form state.
+   *
+   * @return \Drupal\Core\Ajax\AjaxResponse|array
+   *   Returns AJAX response object.
+   */
+  public static function handleAjaxDevicePreview(array $form, FormStateInterface $form_state) {
+    // If there are some errors during submitting of form they should be
+    // displayed, that's why we are returning status message here and generated
+    // errors will be displayed properly in front-end.
+    if (count($form_state->getErrors()) > 0) {
+      return [
+        '#type' => 'status_messages',
+      ];
+    }
+
+    // If there are no errors and everything is fine, then result for opening
+    // responsive preview will be generated.
+    $ajax = new AjaxResponse();
+
+    if (($triggering_element = $form_state->getTriggeringElement()) && $triggering_element['#name'] === 'ajax_responsive_preview') {
+      $form_state->disableRedirect(FALSE);
+      $redirectUrl = $form_state->getRedirect();
+      $form_state->disableRedirect();
+
+      $ajax->addCommand(
+        new SettingsCommand([
+          'responsive_preview' => [
+            'url' => substr($redirectUrl->toString(), 1),
+          ],
+        ], TRUE), TRUE
+      );
+
+      $deviceId = $form_state->getValue($triggering_element['#name']);
+
+      $ajax->addCommand(
+        new InvokeCommand("[data-responsive-preview-name='{$deviceId}']", 'trigger', ['open-preview'])
+      );
+    }
+
+    return $ajax;
+  }
+
+}
