diff --git a/mediagoblin/routing.py b/mediagoblin/routing.py
index 1393f01..93222c5 100644
--- a/mediagoblin/routing.py
+++ b/mediagoblin/routing.py
@@ -29,6 +29,8 @@ def get_url_map():
     add_route('index', '/', 'mediagoblin.views:root_view')
     add_route('terms_of_service','/terms_of_service',
         'mediagoblin.views:terms_of_service')
+    add_route('sitemap','/sitemap.xml','mediagoblin.views:sitemap')
+    add_route('robots','/robots.txt','mediagoblin.views:robots')
     mount('/auth', auth_routes)
     mount('/mod', moderation_routes)
 
diff --git a/mediagoblin/templates/mediagoblin/robots.txt b/mediagoblin/templates/mediagoblin/robots.txt
new file mode 100644
index 0000000..be86b19
--- /dev/null
+++ b/mediagoblin/templates/mediagoblin/robots.txt
@@ -0,0 +1 @@
+Sitemap: {{ request.host_url }}sitemap.xml
diff --git a/mediagoblin/templates/mediagoblin/sitemap.xml b/mediagoblin/templates/mediagoblin/sitemap.xml
new file mode 100644
index 0000000..877856e
--- /dev/null
+++ b/mediagoblin/templates/mediagoblin/sitemap.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8"?>
+ 
+<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
+{% for page in page_list %}
+    <url>
+        <loc>{{ page.loc }}</loc>
+    </url>{% endfor %}
+</urlset>
diff --git a/mediagoblin/views.py b/mediagoblin/views.py
index 4185c1b..8449b43 100644
--- a/mediagoblin/views.py
+++ b/mediagoblin/views.py
@@ -19,6 +19,7 @@ from mediagoblin.db.models import MediaEntry
 from mediagoblin.tools.pagination import Pagination
 from mediagoblin.tools.response import render_to_response, render_404
 from mediagoblin.decorators import uses_pagination, user_not_banned
+from mediagoblin.db.models import (MediaEntry, Collection, User)
 
 
 @user_not_banned
@@ -51,3 +52,30 @@ def terms_of_service(request):
 
     return render_to_response(request,
         'mediagoblin/terms_of_service.html', {})
+
+def sitemap(request):
+    page_list = []
+    host_url = request.host_url[:-1]
+    list_of_users = User.query.all()
+    list_of_media = MediaEntry.query.filter_by(
+        state=u'processed')
+    list_of_collections = Collection.query.all()
+    
+    for item in list_of_users:
+        if item.has_privilege(u'active'):
+            page_list.append({"loc": host_url + request.urlgen("mediagoblin.user_pages.user_home",
+                                                        user=item.username)})
+            page_list.append({"loc": host_url + request.urlgen("mediagoblin.user_pages.user_gallery",
+                                                        user=item.username)})
+            page_list.append({"loc": host_url + request.urlgen("mediagoblin.user_pages.collection_list",
+                                                        user=item.username)})        
+    for item in list_of_media:
+        page_list.append({"loc": host_url + item.url_for_self(request.urlgen)})
+    for item in list_of_collections:
+        page_list.append({"loc": host_url + item.url_for_self(request.urlgen)})
+                        
+    return render_to_response(request,
+        'mediagoblin/sitemap.xml', {"page_list": page_list})
+
+def robots(request):
+    return render_to_response(request,'mediagoblin/robots.txt', {})
