diff --git a/django/contrib/auth/tests/test_views.py b/django/contrib/auth/tests/test_views.py
index d2910886a9..d37afa3eee 100644
--- a/django/contrib/auth/tests/test_views.py
+++ b/django/contrib/auth/tests/test_views.py
@@ -3,8 +3,8 @@ import itertools
 import os
 import re
 
+from django.apps import apps
 from django.conf import global_settings, settings
-from django.contrib.sites.models import Site
 from django.contrib.sites.requests import RequestSite
 from django.contrib.admin.models import LogEntry
 from django.contrib.auth.models import User
@@ -446,7 +446,8 @@ class LoginTest(AuthViewsTestCase):
     def test_current_site_in_context_after_login(self):
         response = self.client.get(reverse('login'))
         self.assertEqual(response.status_code, 200)
-        if Site._meta.installed:
+        if apps.is_installed('django.contrib.sites'):
+            Site = apps.get_model('sites.Site')
             site = Site.objects.get_current()
             self.assertEqual(response.context['site'], site)
             self.assertEqual(response.context['site_name'], site.name)
diff --git a/django/contrib/contenttypes/views.py b/django/contrib/contenttypes/views.py
index 22df1444a1..430ed800da 100644
--- a/django/contrib/contenttypes/views.py
+++ b/django/contrib/contenttypes/views.py
@@ -1,9 +1,9 @@
 from __future__ import unicode_literals
 
 from django import http
+from django.apps import apps
 from django.contrib.contenttypes.models import ContentType
-from django.contrib.sites.models import Site
-from django.contrib.sites.shortcuts import get_current_site
+from django.contrib.sites.requests import RequestSite
 from django.core.exceptions import ObjectDoesNotExist
 from django.utils.translation import ugettext as _
 
@@ -41,7 +41,9 @@ def shortcut(request, content_type_id, object_id):
     # relation to the Site object
     object_domain = None
 
-    if Site._meta.installed:
+    if apps.is_installed('django.contrib.sites'):
+        Site = apps.get_model('sites.Site')
+
         opts = obj._meta
 
         # First, look for an many-to-many relationship to Site.
@@ -67,12 +69,16 @@ def shortcut(request, content_type_id, object_id):
                     if object_domain is not None:
                         break
 
-    # Fall back to the current site (if possible).
-    if object_domain is None:
-        try:
-            object_domain = get_current_site(request).domain
-        except Site.DoesNotExist:
-            pass
+        # Fall back to the current site (if possible).
+        if object_domain is None:
+            try:
+                object_domain = Site.objects.get_current().domain
+            except Site.DoesNotExist:
+                pass
+
+    else:
+        # Fall back to the current request's site.
+        object_domain = RequestSite(request).domain
 
     # If all that malarkey found an object domain, use it. Otherwise, fall back
     # to whatever get_absolute_url() returned.
diff --git a/django/contrib/sitemaps/__init__.py b/django/contrib/sitemaps/__init__.py
index ee3d22090d..86bb71b402 100644
--- a/django/contrib/sitemaps/__init__.py
+++ b/django/contrib/sitemaps/__init__.py
@@ -1,9 +1,10 @@
-from django.contrib.sites.models import Site
+from django.apps import apps as django_apps
 from django.core import urlresolvers, paginator
 from django.core.exceptions import ImproperlyConfigured
 from django.utils.six.moves.urllib.parse import urlencode
 from django.utils.six.moves.urllib.request import urlopen
 
+
 PING_URL = "http://www.google.com/webmasters/tools/ping"
 
 
@@ -32,6 +33,9 @@ def ping_google(sitemap_url=None, ping_url=PING_URL):
     if sitemap_url is None:
         raise SitemapNotFound("You didn't provide a sitemap_url, and the sitemap URL couldn't be auto-detected.")
 
+    if not django_apps.is_installed('django.contrib.sites'):
+        raise ImproperlyConfigured("ping_google requires django.contrib.sites, which isn't installed.")
+    Site = django_apps.get_model('sites.Site')
     current_site = Site.objects.get_current()
     url = "http://%s%s" % (current_site.domain, sitemap_url)
     params = urlencode({'sitemap': url})
@@ -75,7 +79,8 @@ class Sitemap(object):
 
         # Determine domain
         if site is None:
-            if Site._meta.installed:
+            if django_apps.is_installed('django.contrib.sites'):
+                Site = django_apps.get_model('sites.Site')
                 try:
                     site = Site.objects.get_current()
                 except Site.DoesNotExist:
@@ -111,6 +116,9 @@ class Sitemap(object):
 
 class FlatPageSitemap(Sitemap):
     def items(self):
+        if not django_apps.is_installed('django.contrib.sites'):
+            raise ImproperlyConfigured("ping_google requires django.contrib.sites, which isn't installed.")
+        Site = django_apps.get_model('sites.Site')
         current_site = Site.objects.get_current()
         return current_site.flatpage_set.filter(registration_required=False)
 
diff --git a/django/contrib/sitemaps/tests/base.py b/django/contrib/sitemaps/tests/base.py
index ecddcc737b..cc92c023ce 100644
--- a/django/contrib/sitemaps/tests/base.py
+++ b/django/contrib/sitemaps/tests/base.py
@@ -1,11 +1,10 @@
-from django.contrib.sites.models import Site
+from django.apps import apps
 from django.core.cache import cache
 from django.db import models
 from django.test import TestCase
 
 
 class TestModel(models.Model):
-    "A test model for "
     name = models.CharField(max_length=100)
 
     class Meta:
@@ -20,7 +19,8 @@ class TestModel(models.Model):
 
 class SitemapTestsBase(TestCase):
     protocol = 'http'
-    domain = 'example.com' if Site._meta.installed else 'testserver'
+    sites_installed = apps.is_installed('django.contrib.sites')
+    domain = 'example.com' if sites_installed else 'testserver'
     urls = 'django.contrib.sitemaps.tests.urls.http'
 
     def setUp(self):