diff --git a/domain/src/DomainNegotiator.php b/domain/src/DomainNegotiator.php
index 3d5fe9ea..915ecef8 100644
--- a/domain/src/DomainNegotiator.php
+++ b/domain/src/DomainNegotiator.php
@@ -39,6 +39,13 @@ class DomainNegotiator implements DomainNegotiatorInterface {
    */
   protected $domain;
 
+  /**
+   * Indicates that the active domain has been looked up.
+   *
+   * @var bool
+   */
+  protected $negotiated = FALSE;
+
   /**
    * The domain storage class.
    *
@@ -60,7 +67,6 @@ class DomainNegotiator implements DomainNegotiatorInterface {
    */
   protected $requestStack;
 
-
   /**
    * The module handler.
    *
@@ -98,7 +104,7 @@ class DomainNegotiator implements DomainNegotiatorInterface {
    * {@inheritdoc}
    */
   public function setRequestDomain($httpHost, $reset = FALSE) {
-    // @TODO: Investigate caching methods.
+    // @todo Investigate caching methods.
     $this->setHttpHost($httpHost);
     // Try to load a direct match.
     if ($domain = $this->domainStorage()->loadByHostname($httpHost)) {
@@ -136,7 +142,7 @@ class DomainNegotiator implements DomainNegotiatorInterface {
    * {@inheritdoc}
    */
   public function setActiveDomain(DomainInterface $domain) {
-    // @TODO: caching
+    // @todo caching
     $this->domain = $domain;
   }
 
@@ -146,14 +152,14 @@ class DomainNegotiator implements DomainNegotiatorInterface {
   protected function negotiateActiveDomain() {
     $httpHost = $this->negotiateActiveHostname();
     $this->setRequestDomain($httpHost);
-    return $this->domain;
+    $this->negotiated = TRUE;
   }
 
   /**
    * {@inheritdoc}
    */
   public function getActiveDomain($reset = FALSE) {
-    if ($reset) {
+    if ($reset || (empty($this->domain) && !$this->negotiated)) {
       $this->negotiateActiveDomain();
     }
     return $this->domain;
@@ -163,7 +169,8 @@ class DomainNegotiator implements DomainNegotiatorInterface {
    * {@inheritdoc}
    */
   public function getActiveId() {
-    return $this->domain->id();
+    $active_domain = $this->getActiveDomain();
+    return $active_domain ? $active_domain->id() : '';
   }
 
   /**
diff --git a/domain/src/DomainNegotiatorInterface.php b/domain/src/DomainNegotiatorInterface.php
index 1a054e39..f0b0ec61 100644
--- a/domain/src/DomainNegotiatorInterface.php
+++ b/domain/src/DomainNegotiatorInterface.php
@@ -71,7 +71,9 @@ interface DomainNegotiatorInterface {
    * Gets the id of the active domain.
    *
    * @return string
-   *   The id of the active domain.
+   *   The id of the active domain, empty string if it cannot be determined.
+   *
+   * @see \Drupal\domain\DomainNegotiatorInterface::getActiveDomain()
    */
   public function getActiveId();
 
@@ -96,8 +98,9 @@ interface DomainNegotiatorInterface {
    * @param bool $reset
    *   Reset the internal cache of the active domain.
    *
-   * @return \Drupal\domain\DomainInterface
-   *   The active domain object.
+   * @return null|\Drupal\domain\DomainInterface
+   *   The active domain object, NULL if it cannot be determined, e.g. there are
+   *   no domain records yet.
    */
   public function getActiveDomain($reset = FALSE);
 
diff --git a/domain_access/domain_access.module b/domain_access/domain_access.module
index 5824a316..a031de49 100755
--- a/domain_access/domain_access.module
+++ b/domain_access/domain_access.module
@@ -345,12 +345,7 @@ function domain_access_domain_references_alter($query, $account, $context) {
 function domain_access_node_access(NodeInterface $node, $op, AccountInterface $account) {
   static $active_domain;
   if (!isset($active_domain)) {
-    // Ensure that the loader has run. In some tests, the kernel event has not.
-    $active = \Drupal::service('domain.negotiator')->getActiveDomain();
-    if (empty($active)) {
-      $active = \Drupal::service('domain.negotiator')->getActiveDomain(TRUE);
-    }
-    $active_domain = $active;
+    $active_domain = \Drupal::service('domain.negotiator')->getActiveDomain();
   }
   // Check to see that we have a valid active domain.
   // Without one, we cannot assert an opinion about access.
diff --git a/domain_source/src/HttpKernel/DomainSourcePathProcessor.php b/domain_source/src/HttpKernel/DomainSourcePathProcessor.php
index 0f752ddc..10f6eeb1 100644
--- a/domain_source/src/HttpKernel/DomainSourcePathProcessor.php
+++ b/domain_source/src/HttpKernel/DomainSourcePathProcessor.php
@@ -272,13 +272,7 @@ class DomainSourcePathProcessor implements OutboundPathProcessorInterface {
    */
   public function getActiveDomain() {
     if (!isset($this->activeDomain)) {
-      // Ensure that the loader has run.
-      // In some tests, the kernel event has not.
-      $active = $this->negotiator->getActiveDomain();
-      if (empty($active)) {
-        $active = $this->negotiator->getActiveDomain(TRUE);
-      }
-      $this->activeDomain = $active;
+      $this->activeDomain = $this->negotiator->getActiveDomain();
     }
     return $this->activeDomain;
   }
