diff --git a/core/core.services.yml b/core/core.services.yml
index 6049d3b..9313c17 100644
--- a/core/core.services.yml
+++ b/core/core.services.yml
@@ -338,6 +338,9 @@ services:
     class: Drupal\Core\Database\Connection
     factory: Drupal\Core\Database\Database::getConnection
     arguments: [default]
+  datetime.time:
+    class: Drupal\Component\Datetime\Time
+    arguments: ['@request_stack']
   file_system:
     class: Drupal\Core\File\FileSystem
     arguments: ['@stream_wrapper_manager', '@settings', '@logger.channel.file']
@@ -1468,6 +1471,7 @@ services:
     class: Drupal\Core\Session\MetadataBag
     arguments: ['@settings']
   asset.css.collection_renderer:
+  asset.css.collection_renderer:
     class: Drupal\Core\Asset\CssCollectionRenderer
     arguments: [ '@state' ]
   asset.css.collection_optimizer:
diff --git a/core/includes/bootstrap.inc b/core/includes/bootstrap.inc
index 2294d47..0c1115c 100644
--- a/core/includes/bootstrap.inc
+++ b/core/includes/bootstrap.inc
@@ -82,6 +82,9 @@
  *
  * @see http://php.net/manual/reserved.variables.server.php
  * @see http://php.net/manual/function.time.php
+ *
+ * @deprecated in Drupal 8.0.0, will be removed before Drupal 9.0.0.
+ *   Use \Drupal::time()->getRequestTime();
  */
 define('REQUEST_TIME', (int) $_SERVER['REQUEST_TIME']);
 
diff --git a/core/lib/Drupal.php b/core/lib/Drupal.php
index 5d1588d..b8a2682 100644
--- a/core/lib/Drupal.php
+++ b/core/lib/Drupal.php
@@ -721,4 +721,14 @@ public static function entityDefinitionUpdateManager() {
     return static::getContainer()->get('entity.definition_update_manager');
   }
 
+  /**
+   * Returns the entity definition update manager.
+   *
+   * @return \Drupal\Component\Datetime\TimeInterface
+   *   The time service.
+   */
+  public static function time() {
+    return static::getContainer()->get('datetime.time');
+  }
+
 }
diff --git a/core/lib/Drupal/Component/Datetime/Time.php b/core/lib/Drupal/Component/Datetime/Time.php
new file mode 100644
index 0000000..969843c
--- /dev/null
+++ b/core/lib/Drupal/Component/Datetime/Time.php
@@ -0,0 +1,54 @@
+<?php
+
+namespace Drupal\Component\Datetime;
+
+use Symfony\Component\HttpFoundation\RequestStack;
+
+class Time implements TimeInterface {
+
+  /**
+   * The request stack.
+   *
+   * @var \Symfony\Component\HttpFoundation\RequestStack
+   */
+  protected $requestStack;
+
+  /**
+   * Constructs a Time object.
+   *
+   * @param \Symfony\Component\HttpFoundation\RequestStack $request_stack
+   *   The request stack.
+   */
+  public function __construct(RequestStack $request_stack) {
+    $this->requestStack = $request_stack;
+  }
+
+  /**
+   * @inheritdoc
+   */
+  public function getRequestTime() {
+    return $this->requestStack->getCurrentRequest()->server->get('REQUEST_TIME');
+  }
+
+  /**
+   * @inheritdoc
+   */
+  public function getRequestMicroTime() {
+    return $this->requestStack->getCurrentRequest()->server->get('REQUEST_TIME_FLOAT');
+  }
+
+  /**
+   * @inheritdoc
+   */
+  public function getCurrentTime() {
+    return time();
+  }
+
+  /**
+   * @inheritdoc
+   */
+  public function getCurrentMicroTime() {
+    return microtime(TRUE);
+  }
+
+}
\ No newline at end of file
diff --git a/core/lib/Drupal/Component/Datetime/TimeInterface.php b/core/lib/Drupal/Component/Datetime/TimeInterface.php
new file mode 100644
index 0000000..18a4b7b
--- /dev/null
+++ b/core/lib/Drupal/Component/Datetime/TimeInterface.php
@@ -0,0 +1,39 @@
+<?php
+
+namespace Drupal\Component\Datetime;
+
+interface TimeInterface {
+
+  /**
+   * Returns the timestamp for the current request.
+   *
+   * @return int
+   *   A Unix timestamp.
+   */
+  public function getRequestTime();
+
+  /**
+   * Returns the timestamp for the current request with microsecond precision.
+   *
+   * @return float
+   *  A Unix timestamp with a factional portion.
+   */
+  public function getRequestMicroTime();
+
+  /**
+   * Returns the current system time as an integer.
+   *
+   * @return int
+   *   A Unix timestamp.
+   */
+  public function getCurrentTime();
+
+  /**
+   * Returns the current system time with microsecond precision.
+   *
+   * @return float
+   *   A Unix timestamp with a factional portion.
+   */
+  public function getCurrentMicroTime();
+
+}
diff --git a/core/tests/Drupal/Tests/Component/Datetime/TimeTest.php b/core/tests/Drupal/Tests/Component/Datetime/TimeTest.php
new file mode 100644
index 0000000..c856e4f
--- /dev/null
+++ b/core/tests/Drupal/Tests/Component/Datetime/TimeTest.php
@@ -0,0 +1,126 @@
+<?php
+
+/**
+ * Set up our shadow namespace so we can mock global system calls.
+ */
+namespace Drupal\Component\Datetime {
+
+  /**
+   * Shadowed time() system call that lives in our namespace.
+   *
+   * @returns int
+   */
+  function time() {
+    return 12345678;
+  }
+
+  /**
+   * Shadowed microtime system call that lives in our namespace.
+   *
+   * @returns float
+   */
+  function microtime() {
+    return 1234567.89;
+  }
+
+}
+
+/**
+ * Set up the real namespace for the test.
+ */
+namespace Drupal\Tests\Component\Datetime {
+
+  use Drupal\Component\Datetime\Time;
+  use Drupal\Tests\UnitTestCase;
+  use Symfony\Component\HttpFoundation\Request;
+
+  /**
+   * @coversDefaultClass \Drupal\Component\Datetime\Time
+   * @group Datetime
+   */
+  class TimeTest extends UnitTestCase {
+
+    /**
+     * The mocked request stack.
+     *
+     * @var \Symfony\Component\HttpFoundation\RequestStack|\PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $requestStack;
+
+    /**
+     * The mocked time class.
+     *
+     * @var \Drupal\Component\Datetime\Time
+     */
+    protected $time;
+
+    protected function setUp() {
+      parent::setUp();
+
+      $this->requestStack = $this->getMock('Symfony\Component\HttpFoundation\RequestStack');
+
+      $this->time = new Time($this->requestStack);
+    }
+
+
+    /**
+     * Tests the getRequestTime method.
+     *
+     * @covers ::getRequestTime
+     */
+    public function testGetRequestTime() {
+      $expected = 12345678;
+
+      $request = Request::createFromGlobals();
+      $request->server->set('REQUEST_TIME', $expected);
+
+      // Mocks a the request stack getting the current request.
+      $this->requestStack->expects($this->any())
+                         ->method('getCurrentRequest')
+                         ->willReturn($request);
+
+      $this->assertEquals($expected, $this->time->getRequestTime());
+    }
+
+    /**
+     * Tests the getRequestMicroTime method.
+     *
+     * @covers ::getRequestMicroTime
+     */
+    public function testGetRequestMicroTime() {
+      $expected = 1234567.89;
+
+      $request = Request::createFromGlobals();
+      $request->server->set('REQUEST_TIME_FLOAT', $expected);
+
+      // Mocks a the request stack getting the current request.
+      $this->requestStack->expects($this->any())
+                         ->method('getCurrentRequest')
+                         ->willReturn($request);
+
+      $this->assertEquals($expected, $this->time->getRequestMicroTime());
+    }
+
+    /**
+     * Tests the getCurrentTime method.
+     *
+     * @covers ::getCurrentTime
+     */
+    public function testGetCurrentTime() {
+      $expected = 12345678;
+      $this->assertEquals($expected, $this->time->getCurrentTime());
+    }
+
+    /**
+     * Tests the getCurrentMicroTime method.
+     *
+     * @covers ::getCurrentMicroTime
+     */
+    public function testGetCurrentMicroTime() {
+      $expected = 1234567.89;
+      $this->assertEquals($expected, $this->time->getCurrentMicroTime());
+    }
+
+  }
+
+}
\ No newline at end of file
