diff --git a/core/modules/rest/src/Plugin/views/display/RestExport.php b/core/modules/rest/src/Plugin/views/display/RestExport.php
index 076eb1c..7f42090 100644
--- a/core/modules/rest/src/Plugin/views/display/RestExport.php
+++ b/core/modules/rest/src/Plugin/views/display/RestExport.php
@@ -8,12 +8,14 @@
 namespace Drupal\rest\Plugin\views\display;
 
 use Drupal\Component\Utility\String;
+use Drupal\Core\Render\RendererInterface;
 use Drupal\Core\State\StateInterface;
 use Drupal\Core\Routing\RouteProviderInterface;
 use Drupal\Core\ContentNegotiation;
 use Drupal\views\ViewExecutable;
 use Drupal\views\Plugin\views\display\PathPluginBase;
 use Symfony\Component\DependencyInjection\ContainerInterface;
+use Symfony\Component\HttpFoundation\JsonResponse;
 use Symfony\Component\HttpFoundation\Response;
 use Symfony\Component\Routing\RouteCollection;
 
@@ -94,10 +96,13 @@ class RestExport extends PathPluginBase {
    *   The state key value store.
    * @param \Drupal\Core\ContentNegotiation $content_negotiation
    *   The content negotiation library.
+   * @param \Drupal\Core\Render\RendererInterface $renderer
+   *   The renderer service.
    */
-  public function __construct(array $configuration, $plugin_id, $plugin_definition, RouteProviderInterface $route_provider, StateInterface $state, ContentNegotiation $content_negotiation) {
+  public function __construct(array $configuration, $plugin_id, $plugin_definition, RouteProviderInterface $route_provider, StateInterface $state, ContentNegotiation $content_negotiation, RendererInterface $renderer) {
     parent::__construct($configuration, $plugin_id, $plugin_definition, $route_provider, $state);
     $this->contentNegotiation = $content_negotiation;
+    $this->renderer = $renderer;
   }
 
   /**
@@ -110,7 +115,8 @@ public static function create(ContainerInterface $container, array $configuratio
       $plugin_definition,
       $container->get('router.route_provider'),
       $container->get('state'),
-      $container->get('content_negotiation')
+      $container->get('content_negotiation'),
+      $container->get('renderer')
     );
   }
 
@@ -271,7 +277,16 @@ public function execute() {
     parent::execute();
 
     $output = $this->view->render();
-    return new Response(drupal_render_root($output), 200, array('Content-type' => $this->getMimeType()));
+
+    // In JSONP mode?
+    $callback = $this->view->getRequest()->get('jsonp') ?: $this->view->getRequest()->get('callback');
+    if ($callback) {
+      $response = new JsonResponse($this->renderer->render($output), 200, array());
+      $response->setCallback($callback);
+      return $response;
+    }
+
+    return new Response($this->renderer->render($output), 200, array('Content-type' => $this->getMimeType()));
   }
 
   /**
diff --git a/core/modules/rest/src/RequestHandler.php b/core/modules/rest/src/RequestHandler.php
index c31600d..5c16c66 100644
--- a/core/modules/rest/src/RequestHandler.php
+++ b/core/modules/rest/src/RequestHandler.php
@@ -44,7 +44,7 @@ public function handle(RouteMatchInterface $route_match, Request $request) {
       ->get('plugin.manager.rest')
       ->getInstance(array('id' => $plugin));
 
-    // Deserialze incoming data if available.
+    // Deserialize incoming data if available.
     $serializer = $this->container->get('serializer');
     $received = $request->getContent();
     $unserialized = NULL;
