diff --git a/core/tests/Drupal/Tests/Core/StackMiddleware/ReverseProxyMiddlewareTest.php b/core/tests/Drupal/Tests/Core/StackMiddleware/ReverseProxyMiddlewareTest.php
index f92109b..2af2c85 100644
--- a/core/tests/Drupal/Tests/Core/StackMiddleware/ReverseProxyMiddlewareTest.php
+++ b/core/tests/Drupal/Tests/Core/StackMiddleware/ReverseProxyMiddlewareTest.php
@@ -40,7 +40,10 @@ public function testNoProxy() {
 
     $middleware = new ReverseProxyMiddleware($this->mockHttpKernel, $settings);
     // Mock a request object.
-    $request = $this->getMock('Symfony\Component\HttpFoundation\Request', array('setTrustedHeaderName', 'setTrustedProxies'));
+    $request = $this->getMock('Symfony\Component\HttpFoundation\Request', array(
+      'setTrustedHeaderName',
+      'setTrustedProxies'
+    ));
     // setTrustedHeaderName() should never fire.
     $request->expects($this->never())
       ->method('setTrustedHeaderName');
@@ -54,9 +57,59 @@ public function testNoProxy() {
    * @dataProvider reverseProxyEnabledProvider
    */
   public function testReverseProxyEnabled($provided_settings) {
-      // Enable reverse proxy and add test values.
-      $settings = new Settings(array('reverse_proxy' => 1) + $provided_settings);
-      $this->trustedHeadersAreSet($settings);
+    // Enable reverse proxy and add test values.
+    $settings = new Settings(array('reverse_proxy' => 1) + $provided_settings);
+    $this->trustedHeadersAreSet($settings);
+  }
+
+  /**
+   * Tests the ability of the http kernel to recognize that it is behind a
+   * crypto offloader.
+   */
+  public function testCryptoOffload() {
+    $config = array(
+      'reverse_proxy' => 1,
+      'reverse_proxy_addresses' => array('127.0.0.2'),
+    );
+    $settings = new Settings($config);
+    $request = new Request();
+    $request->server->set('REMOTE_ADDR', '127.0.0.2');
+    $request->headers->set('X_FORWARDED_PROTO', 'https');
+
+    $subscriber = new ReverseProxyMiddleware($this->mockHttpKernel, $settings);
+    $subscriber->handle($request);
+
+    $this->assertTrue($request->isSecure());
+  }
+
+  /**
+   * Tests the ability of the http kernel to recognize that it is behind a
+   * crypto offloader.
+   */
+  public function testBaseUrlAndPathRewrite() {
+    $config = array(
+      'reverse_proxy' => 1,
+      'reverse_proxy_addresses' => array('127.0.0.2'),
+      'reverse_proxy_proto_change' => 1,
+    );
+    $settings = new Settings($config);
+    $request = new Request();
+    $request->server->set('REMOTE_ADDR', '127.0.0.2');
+    $request->headers->set('X_FORWARDED_PROTO', 'https');
+
+    $_old_globals = $GLOBALS;
+
+    $GLOBALS['base_url'] = 'http://test.base.url.and.path.rewrite.test';
+    $GLOBALS['base_root'] = 'http://test.base.url.and.path.rewrite.test';
+
+    $subscriber = new ReverseProxyMiddleware($this->mockHttpKernel, $settings);
+    $subscriber->handle($request);
+
+    $this->assertTrue($request->isSecure());
+    $this->assertEquals('https://test.base.url.and.path.rewrite.test', $GLOBALS['base_url']);
+    $this->assertEquals('https://test.base.url.and.path.rewrite.test', $GLOBALS['base_root']);
+
+    $GLOBALS = $_old_globals;
   }
 
   /**
@@ -67,12 +120,14 @@ public function reverseProxyEnabledProvider() {
       array(
         array(
           'reverse_proxy_header' => 'HTTP_X_FORWARDED_FOR',
+          'reverse_proxy_proto_header' => 'HTTP_X_FORWARDED_PROTO',
           'reverse_proxy_addresses' => array(),
         ),
       ),
       array(
         array(
           'reverse_proxy_header' => 'X_FORWARDED_HOST',
+          'reverse_proxy_proto_header' => 'X_FORWARDED_PROTO',
           'reverse_proxy_addresses' => array('127.0.0.2', '127.0.0.3'),
         ),
       ),
@@ -95,6 +150,7 @@ protected function trustedHeadersAreSet(Settings $settings) {
 
     $middleware->handle($request);
     $this->assertSame($settings->get('reverse_proxy_header'), $request->getTrustedHeaderName($request::HEADER_CLIENT_IP));
+    $this->assertSame($settings->get('reverse_proxy_proto_header'), $request->getTrustedHeaderName($request::HEADER_CLIENT_PROTO));
     $this->assertSame($settings->get('reverse_proxy_addresses'), $request->getTrustedProxies());
   }
 }
diff --git a/sites/default/default.settings.php b/sites/default/default.settings.php
index d5d8704..6fcfec1 100644
--- a/sites/default/default.settings.php
+++ b/sites/default/default.settings.php
@@ -351,6 +351,18 @@
 # $settings['reverse_proxy_header'] = 'HTTP_X_CLUSTER_CLIENT_IP';
 
 /**
+ * Set this value if your proxy server sends the client protocol in a header
+ * other than X-Forwarded-Proto.
+ */
+# $conf['reverse_proxy_proto_header'] = 'HTTP_X_FORWARDED_PROTO';
+
+/**
+ * Set this value if you want Drupal to modify the scheme of the $base_url
+ * based on the value of the X-Forwarded-Proto header.
+ */
+# $settings['reverse_proxy_proto_change'] = TRUE;
+
+/**
  * Page caching:
  *
  * By default, Drupal sends a "Vary: Cookie" HTTP header for anonymous page
