diff --git a/django/contrib/admin/sites.py b/django/contrib/admin/sites.py
index fb9840c8ca..94872fc53d 100644
--- a/django/contrib/admin/sites.py
+++ b/django/contrib/admin/sites.py
@@ -41,6 +41,9 @@ class AdminSite(object):
     # Text to put at the top of the admin index page.
     index_title = ugettext_lazy('Site administration')
 
+    # URL for the "View site" link at the top of each admin page.
+    site_url = '/'
+
     login_form = None
     index_template = None
     app_index_template = None
@@ -272,6 +275,7 @@ class AdminSite(object):
         return {
             'site_title': self.site_title,
             'site_header': self.site_header,
+            'site_url': self.site_url,
         }
 
     def password_change(self, request):
diff --git a/django/contrib/admin/templates/admin/base.html b/django/contrib/admin/templates/admin/base.html
index d52554f633..fca6b349d2 100644
--- a/django/contrib/admin/templates/admin/base.html
+++ b/django/contrib/admin/templates/admin/base.html
@@ -31,6 +31,9 @@
                 <strong>{% firstof user.get_short_name user.get_username %}</strong>.
             {% endblock %}
             {% block userlinks %}
+                {% if site_url %}
+                    <a href="{{ site_url }}">{% trans 'View site' %}</a> /
+                {% endif %}
                 {% url 'django-admindocs-docroot' as docsroot %}
                 {% if docsroot %}
                     <a href="{{ docsroot }}">{% trans 'Documentation' %}</a> /
diff --git a/docs/ref/contrib/admin/index.txt b/docs/ref/contrib/admin/index.txt
index 01d73407f3..ca55df3ce7 100644
--- a/docs/ref/contrib/admin/index.txt
+++ b/docs/ref/contrib/admin/index.txt
@@ -2445,6 +2445,13 @@ Templates can override or extend base admin templates as described in
     The text to put at the end of each admin page's ``<title>`` (a string). By
     default, this is "Django site admin".
 
+.. attribute:: AdminSite.site_url
+
+    .. versionadded:: 1.8
+
+    The URL for the "View site" link at the top of each admin page. By default,
+    ``site_url`` is ``/``. Set it to ``None`` to remove the link.
+
 .. attribute:: AdminSite.index_title
 
     .. versionadded:: 1.7
diff --git a/docs/releases/1.8.txt b/docs/releases/1.8.txt
index 7cf14f1bef..ea5101ff72 100644
--- a/docs/releases/1.8.txt
+++ b/docs/releases/1.8.txt
@@ -50,6 +50,10 @@ Minor features
 
 * The jQuery library embedded in the admin has been upgraded to version 1.11.1.
 
+* You can now specify :attr:`AdminSite.site_url
+  <django.contrib.admin.AdminSite.site_url>` in order to display a link to the
+  front-end site.
+
 :mod:`django.contrib.auth`
 ^^^^^^^^^^^^^^^^^^^^^^^^^^
 
diff --git a/tests/admin_views/admin.py b/tests/admin_views/admin.py
index e00cc69f52..c98e2c8c83 100644
--- a/tests/admin_views/admin.py
+++ b/tests/admin_views/admin.py
@@ -832,6 +832,7 @@ class FunkyTagAdmin(admin.ModelAdmin):
 
 
 site = admin.AdminSite(name="admin")
+site.site_url = '/my-site-url/'
 site.register(Article, ArticleAdmin)
 site.register(CustomArticle, CustomArticleAdmin)
 site.register(Section, save_as=True, inlines=[ArticleInline])
diff --git a/tests/admin_views/tests.py b/tests/admin_views/tests.py
index 60ad3d2b7b..55c3532985 100644
--- a/tests/admin_views/tests.py
+++ b/tests/admin_views/tests.py
@@ -744,6 +744,15 @@ class AdminViewBasicTest(AdminViewBasicTestCase):
         color2_delete_log = LogEntry.objects.all()[0]
         self.assertEqual(color2_content_type, color2_delete_log.content_type)
 
+    def test_adminsite_display_site_url(self):
+        """
+        #13749 - Admin should display link to front-end site 'View site'
+        """
+        url = reverse('admin:index')
+        response = self.client.get(url)
+        self.assertEqual(response.context['site_url'], '/my-site-url/')
+        self.assertContains(response, '<a href="/my-site-url/">View site</a>')
+
 
 @override_settings(TEMPLATE_DIRS=ADMIN_VIEW_TEMPLATES_DIR)
 class AdminCustomTemplateTests(AdminViewBasicTestCase):