diff --git a/.gitignore b/.gitignore
index 2af83af539628e56987e15ef9d3bcaac1d40815b..c1b5e24029c97d63d9c5ee2521fbb848dd5c8800 100644
--- a/.gitignore
+++ b/.gitignore
@@ -3,3 +3,5 @@
 *.pyc
 django-*.wsgi
 static-collected
+static/admin/
+static/rest_framework/
diff --git a/gracedb/api.py b/gracedb/api.py
index f14228c0ba7853df638d022b4d71075c4738d2b1..df040313e0ade7f69db18d40683c604f042d54ac 100644
--- a/gracedb/api.py
+++ b/gracedb/api.py
@@ -1517,6 +1517,8 @@ class Files(APIView):
         except Exception, e:
             # XXX This needs some thought.
             response = Response(str(e), status=status.HTTP_400_BAD_REQUEST)
+            # XXX Uhm, we don't to try creating a log message for this, right?
+            return response
 
         # Create a log entry to document the file upload. 
         logentry = EventLog(event=event,
diff --git a/gracedb/forms.py b/gracedb/forms.py
index f89210aef13365a7f9899caccd06aa10a97d4122..5549884197135a3aac02349a55c27381cfde2484 100644
--- a/gracedb/forms.py
+++ b/gracedb/forms.py
@@ -22,11 +22,7 @@ class GraceQueryField(forms.CharField):
         from django.db.models import Q
         queryString = forms.CharField.clean(self, queryString)
         try:
-            if self.select_subclasses:
-                return Event.objects.filter(parseQuery(queryString)).select_subclasses()
-            else:
-                return Event.objects.filter(parseQuery(queryString)).distinct()
-
+            return Event.objects.filter(parseQuery(queryString)).distinct()
         except ParseException, e:
             err = "Error: " + escape(e.pstr[:e.loc]) + errorMarker + escape(e.pstr[e.loc:])
             raise forms.ValidationError(mark_safe(err))
@@ -38,20 +34,9 @@ class GraceQueryField(forms.CharField):
             # What could this be and how can we handle it better? XXX
             raise forms.ValidationError(str(e)+str(type(e)))
 
-    def __init__(self, *args, **kwargs):
-        self.select_subclasses = False
-        if 'select_subclasses' in kwargs.keys():
-            self.select_subclasses = kwargs.pop('select_subclasses')
-        super(GraceQueryField, self).__init__(*args, **kwargs)
-
 class SimpleSearchForm(forms.Form):
     query = GraceQueryField(required=False, widget=forms.TextInput(attrs={'size':60})) 
 
-# XXX There must be a better way of doing this.
-class SimpleSearchFormWithSubclasses(forms.Form):
-    query = GraceQueryField(required=False, widget=forms.TextInput(attrs={'size':60}),
-            select_subclasses=True) 
-
 class CreateEventForm(forms.Form):
     groupChoices = [("","")]+[(g.name, g.name) for g in Group.objects.all()]
     typeChoices= [("","")]+list(Event.ANALYSIS_TYPE_CHOICES)
diff --git a/gracedb/models.py b/gracedb/models.py
index 9999fcf6a2eedf1acbe1b70930cf960b652e0dfe..7133cff9f6d2390c72dd8df1453bb4eb6f80f76c 100644
--- a/gracedb/models.py
+++ b/gracedb/models.py
@@ -112,10 +112,11 @@ class Event(models.Model):
 
     def weburl(self):
         # XXX Not good.  But then, it never was.
-        return "https://losc-gracedb.ligo.org/gracedb/events/%s" % self.graceid()
-        return "https://gracedb.ligo.org/gracedb-files/%s" % self.graceid()
-        return "https://ldas-jobs.phys.uwm.edu/gracedb/data/%s" % self.graceid()
+        #return "https://ldas-jobs.phys.uwm.edu/gracedb/data/%s" % self.graceid()
+        #return "https://gracedb.ligo.org/gracedb-files/%s" % self.graceid()
+        return reverse('file_list', args=[self.graceid()])
 
+    # XXX This should be considered deprecated. (Branson, July 22, 2014.)
     def clusterurl(self):
         #return "pcdev1.phys.uwm.edu:/archive/gracedb/data/%s" % self.graceid()
         return "file://pcdev1.phys.uwm.edu/archive/gracedb/data/%s" % self.graceid()
diff --git a/gracedb/reports.py b/gracedb/reports.py
index d4eaefe24b735a3f4d9641b3981dfc8e2e4bace6..3e97111cd761e284e293adfff5c9162d2160f882 100644
--- a/gracedb/reports.py
+++ b/gracedb/reports.py
@@ -13,7 +13,7 @@ import os, json
 from django.core.urlresolvers import reverse
 
 from models import CoincInspiralEvent ,SingleInspiral
-from forms import SimpleSearchFormWithSubclasses
+from forms import SimpleSearchForm
 from query import parseQuery
 
 
@@ -129,6 +129,7 @@ def to_png_image(out = sys.stdout):
     return base64.b64encode(f.getvalue())
 
 def gstlalcbc_report(request, format=""):
+
     if not request.user or not request.user.is_authenticated():
         return HttpResponseForbidden("Forbidden")
 
@@ -142,22 +143,25 @@ def gstlalcbc_report(request, format=""):
             t_low = posixToGpsTime(time.mktime(t_low.timetuple()))
             query = 'CBC LowMass %d .. %d' % (t_low, t_high)
             rawquery = query
-            form = SimpleSearchFormWithSubclasses({'query': query})
+            form = SimpleSearchForm({'query': query})
         else:
-            form = SimpleSearchFormWithSubclasses(request.GET)
+            form = SimpleSearchForm(request.GET)
             rawquery = request.GET['query']
     else:
-        form = SimpleSearchFormWithSubclasses(request.POST)
+        form = SimpleSearchForm(request.POST)
         rawquery = request.POST['query']
     if form.is_valid():
         objects = form.cleaned_data['query']
+        object_list = list(objects)
 
-        # Check for foreign objects.
-        for obj in objects:
-            if not isinstance(obj, CoincInspiralEvent):
+        # Try upcasting to CoincInspiralEvents
+        for i in range(len(object_list)):
+            try:
+                object_list[i] = CoincInspiralEvent.objects.get(id=object_list[i].id)
+            except:
                 errormsg = 'Your query returned items that are not CoincInspiral Events. '
                 errormsg += 'Please try again.'
-                form = SimpleSearchFormWithSubclasses()
+                form = SimpleSearchForm()
                 return render_to_response('gracedb/gstlalcbc_report.html', 
                         { 'form':form, 'message':errormsg}, 
                         context_instance=RequestContext(request))
@@ -175,7 +179,7 @@ def gstlalcbc_report(request, format=""):
         if not gpsrange:
             # Bounce back to the user with an error message
             errormsg = 'Your query does not have a gpstime range. Please try again.'
-            form = SimpleSearchFormWithSubclasses()
+            form = SimpleSearchForm()
             return render_to_response('gracedb/gstlalcbc_report.html', 
                     { 'form':form, 'message':errormsg}, 
                     context_instance=RequestContext(request))
@@ -196,7 +200,8 @@ def gstlalcbc_report(request, format=""):
                     { 'form':form, 'message':errormsg}, 
                     context_instance=RequestContext(request))
 
-        clustered_events = cluster(objects)
+        #clustered_events = cluster(objects)
+        clustered_events = cluster(object_list)
         clustered_events = sorted(clustered_events, None, key=lambda x: x.far)
 
         # Make IFAR plot.
@@ -212,7 +217,8 @@ def gstlalcbc_report(request, format=""):
 
         plot.figure(figsize=(6,5))
         plot.loglog(ifars[::-1], N[::-1])
-        plot.fill_between(expected_ifars[::-1], down[::-1], up[::-1], alpha=0.1)
+        #XXX This call to fill_between was causing the entire thread to hang.
+        #plot.fill_between(expected_ifars[::-1], down[::-1], up[::-1], alpha=0.1)
         plot.loglog(expected_ifars[::-1], eN[::-1])
         plot.ylim([0.9, len(ifars)])
         plot.xlabel('IFAR (s)')
diff --git a/gracedb/urls.py b/gracedb/urls.py
index 62a4daadddcae14d57ecdef84894d75ba5ad44c1..b1c174b0b50ea277f1bdfa10d5d0b6291483f360 100644
--- a/gracedb/urls.py
+++ b/gracedb/urls.py
@@ -1,5 +1,7 @@
 
-from django.conf.urls.defaults import *
+# Changed for Django 1.6
+#from django.conf.urls.defaults import *
+from django.conf.urls import patterns, url, include
 
 #import django.views.generic.list_detail
 
@@ -14,7 +16,7 @@ urlpatterns = patterns('gracedb.views',
     url (r'^skyalert/(?P<graceid>[GEHT]\d+)', 'skyalert', name="skyalert"),
     url (r'^neighbors/(?P<graceid>[GEHT]\d+)/\(?(?P<delta1>[-+]?\d+)(,(?P<delta2>[-+]?\d+)\)?)?', 'neighbors', name="neighbors"),
     url (r'^(?P<graceid>[GEHT]\d+)$', 'view', name="view2"),
-    url (r'^skymapViewer/(?P<graceid>[GEHT]\d+)$', 'skymap_view', name="skymap_view"),
+    url (r'^(?P<graceid>[GEHT]\d+)/files/$', 'file_list', name="file_list"),
     url (r'^(?P<graceid>[GEHT]\d+)/files/(?P<filename>.*)$', download, name="file"),
     url (r'^(?P<graceid>[GEHT]\d+)/log/(?P<num>([\d]*|preview))$', 'logentry', name="logentry"),
     url (r'^(?P<graceid>[GEHT]\d+)/log/(?P<num>\d+)/tag/(?P<tagname>\w+)$', 'taglogentry', name="taglogentry"),
diff --git a/gracedb/urls_rest.py b/gracedb/urls_rest.py
index 53cd4ea07ea0c8a09abec80aec05b051ab2d344b..1f40a6ead51b55eb88cb8fa523195bade01dc88d 100644
--- a/gracedb/urls_rest.py
+++ b/gracedb/urls_rest.py
@@ -1,5 +1,7 @@
 
-from django.conf.urls.defaults import patterns, url
+# Changed for Django 1.6
+from django.conf.urls import patterns, url
+#from django.conf.urls.defaults import patterns, url
 
 # rest_framework
 from gracedb.api import GracedbRoot
diff --git a/gracedb/views.py b/gracedb/views.py
index c556b8e35e480c67e27cbc00355ac8ef3f11faa6..2131e92dfd584e52a8180de7dded467027dcfc5f 100644
--- a/gracedb/views.py
+++ b/gracedb/views.py
@@ -9,7 +9,9 @@ from django.contrib.sites.models import Site
 from django.utils.html import strip_tags, escape, urlize
 from django.utils.safestring import mark_safe
 
-from django.views.generic.list_detail import object_detail, object_list
+# Upgrade to Django 1.5: No more function-based generic views.
+#from django.views.generic.list_detail import object_list
+from django.views.generic.list import ListView
 from django.contrib.auth.decorators import login_required
 
 from models import Event, Group, EventLog, Labelling, Label, Tag
@@ -18,7 +20,6 @@ from models import MultiBurstEvent
 from models import GrbEvent
 from models import SingleInspiral
 from forms import CreateEventForm, EventSearchForm, SimpleSearchForm
-from forms import SimpleSearchFormWithSubclasses
 from alert import issueAlert, issueAlertForLabel, issueAlertForUpdate
 from translator import handle_uploaded_data
 from query import parseQuery
@@ -261,8 +262,12 @@ def _createEventFromForm(request, form):
             temp_data_loc = handle_uploaded_data(event, uploadDestination)
             try:
                 # Send an alert.
+                # XXX This reverse will give the web-interface URL, not the REST URL.
+                # This could be a problem if anybody ever tries to use it.
+                # NOTE: The clusterurl method should be considered deprecated.
                 issueAlert(event,
-                           os.path.join(event.clusterurl(), "private", f.name),
+                           #os.path.join(event.clusterurl(), "private", f.name),
+                           request.build_absolute_uri(reverse("file", args=[event.graceid(),f.name])),
                            temp_data_loc)
             except Exception, e:
                 warnings += ["Problem issuing an alert (%s)" % e]
@@ -784,14 +789,36 @@ def search(request, format=""):
                     title = "Query Results. %s event" % objects.count()
                 else:
                     title = "Query Results. %s events" % objects.count()
-                context = {
-                    'title': title,
-                    'form': form,
-                    'formAction': reverse(search),
-                    'maxCount': limit,
-                    'rawquery' : rawquery,
-                }
-                return object_list(request, objects, extra_context=context)
+                # XXX This seems like a hacky misuse of generic views.
+                # In Django 1.3 and earlier, things were simpler:
+                #
+                # return object_list(request, objects, extra_context=context)
+                # 
+                # But with for compatibility, with Django 1.6, this becomes:
+                class EventListView(ListView):
+                    queryset = objects
+                    template_name = "gracedb/event_list.html"
+
+                    def dispatch(self, request, *args, **kwargs):
+                        # NOTE: We have to hack around the handler selector, because
+                        # the actual request might have been a POST.
+                        handler = getattr(self, 'get', self.http_method_not_allowed)
+                        return handler(request, *args, **kwargs)
+
+                    # This is how to get the extra context in, according to the django docs.
+                    def get_context_data(self, **kwargs):
+                        context = super(EventListView, self).get_context_data(**kwargs)
+                        # Insert the extra context.
+                        context.update({
+                            'title'      : title,
+                            'form'       : form,
+                            'formAction' : reverse(search),
+                            'maxCount'   : limit,
+                            'rawquery'   : rawquery,
+                        })
+                        return context
+
+                return EventListView.as_view()(request)
 
     return render_to_response('gracedb/query.html',
             { 'form' : form,
@@ -889,15 +916,39 @@ def oldsearch(request):
                 title = "Query Results. %s event" % objects.count()
             else:
                 title = "Query Results. %s events" % objects.count()
-            extra_context = {'title': title }
 
             textQuery = " ".join(textQuery)
             simple_form = SimpleSearchForm({'query': textQuery})
-            extra_context['form'] = simple_form
-            extra_context['maxCount'] = MAX_QUERY_RESULTS
-            extra_context['rawquery' ] = textQuery
 
-            return object_list(request, objects, extra_context=extra_context)
+            # XXX This seems like a hacky misuse of generic views.
+            # In Django 1.3 and earlier, things were simpler:
+            #
+            # return object_list(request, objects, extra_context=context)
+            # 
+            # But with for compatibility, with Django 1.6, this becomes:
+            class EventListView(ListView):
+                queryset = objects
+                template_name = "gracedb/event_list.html"
+
+                def dispatch(self, request, *args, **kwargs):
+                    # NOTE: We have to hack around the handler selector, because
+                    # the actual request might have been a POST.
+                    handler = getattr(self, 'get', self.http_method_not_allowed)
+                    return handler(request, *args, **kwargs)
+
+                # This is how to get the extra context in, according to the django docs.
+                def get_context_data(self, **kwargs):
+                    context = super(EventListView, self).get_context_data(**kwargs)
+                    # Insert the extra context.
+                    context.update({
+                        'title'      : title,
+                        'form'       : simple_form,
+                        'maxCount'   : MAX_QUERY_RESULTS,
+                        'rawquery'   : textQuery,
+                    })
+                    return context
+
+            return EventListView.as_view()(request)
 
 
     return render_to_response('gracedb/query.html',
@@ -1234,43 +1285,27 @@ def performance(request):
             'gracedb/performance.html',
             context,
             context_instance=RequestContext(request))
- 
-def skymap_view(request, graceid):
-    filename=request.GET.get('filename','skymap.json')
-    file_version=request.GET.get('version', None)
-    viewer=request.GET.get('viewer','aladin')
 
-    context = {}
+# A view for the list of files associated with an event.
+# We're deliberately leaving out the /general directory.
+# The idea is to get rid of that horrible /gracedb-files/ url.
+def file_list(request, graceid):
     try:
         event = Event.getByGraceid(graceid)
     except Event.DoesNotExist:
-        raise Http404
+        return HttpResponseNotFound("Event not found")
 
-    if viewer not in ['aladin','wwt',]:
-        return HttpResponseBadRequest("Unsupported viewer. Choices are 'aladin' or 'wwt'.")
-
-    # Now look for the JSON skymap contours file.
-    if file_version:
-        filename += ',%s' % file_version
-    filepath = os.path.join(event.datadir(), filename)
-
-    content = None
-    if not os.path.exists(filepath):
-        response = HttpResponseNotFound("File and/or version does not exist")
-    elif not os.access(filepath, os.R_OK):
-        response = HttpResponseNotFound("File not readable")
-    elif os.path.isfile(filepath):
-        f = open(filepath, "r")
-        content = f.read()
-        # XXX Removing the newlines is necessary for some reason.
-        content = content.replace('\n','')
-        f.close()
-
-    context['content'] = content
-    context['graceid'] = graceid
-    # I wonder if there is a nicer way to get it into the context
-    context['SKYMAP_VIEWER_MEDIA_URL'] = settings.SKYMAP_VIEWER_MEDIA_URL;
-    return render_to_response(
-            'gracedb/%s_skymap_viewer.html' % viewer, context,
-            context_instance=RequestContext(request))
+    f = []
+    for dirname, dirnames, filenames in os.walk(event.datadir()):
+        f.extend(filenames)
+        break
 
+    context = {}
+    context['file_list'] = f
+    context['title'] = 'Files for %s' % graceid 
+    context['graceid'] = graceid 
+        
+    return render_to_response(
+        'gracedb/event_filelist.html',
+        context,
+        context_instance=RequestContext(request)) 
diff --git a/ligoauth/management/commands/refresh_users_from_ldap.py b/ligoauth/management/commands/refresh_users_from_ldap.py
index 5a115eee078107b63a5edcdc245818890030ba7d..a24d611b8f30e9b12c671fe0cb23251f525c0f55 100644
--- a/ligoauth/management/commands/refresh_users_from_ldap.py
+++ b/ligoauth/management/commands/refresh_users_from_ldap.py
@@ -39,7 +39,15 @@ class Command(NoArgsCommand):
                         principal = ldap_result['krbPrincipalName'][0]
 
                         # Update/Create LigoLdapUser entry
-                        user, created = LigoLdapUser.objects.get_or_create(ldap_dn=ldap_dn)
+                        # This is breaking. XXX Do we need to pass in default values for the underlying User object?
+                        defaults = {
+                            'first_name' : first_name,
+                            'last_name'  : last_name,
+                            'email'      : email,
+                            'username'   : principal,
+                            'is_active'  : is_active
+                        }
+                        user, created = LigoLdapUser.objects.get_or_create(ldap_dn=ldap_dn, defaults=defaults)
 
                         changed = created \
                                 or (user.first_name != first_name) \
@@ -61,6 +69,7 @@ class Command(NoArgsCommand):
                                 user.save()
                             except Exception, e:
                                 print "Failed to save user '%s'.  (%s)" % (ldap_dn, first_name+" "+last_name)
+				print "Reason: %s" % str(e)
 
                         # update X509 certs for user
                         current_dns = set([ cert.subject for cert in user.x509cert_set.all() ])
diff --git a/manage.py b/manage.py
index 52e24d629323162944fb66354a392cef26bb850e..2ee79bd2076d9cbb5c417fe998b8b188f8e4ae2b 100755
--- a/manage.py
+++ b/manage.py
@@ -1,14 +1,11 @@
 #!/usr/bin/env python
-from django.core.management import execute_manager
-import os
-
-try:
-    import settings # Assumed to be in the same directory.
-except ImportError:
-    import sys
-    sys.stderr.write("Error: Can't find the file 'settings.py' in the directory containing %r. It appears you've customized things.\nYou'll have to run django-admin.py, passing it your settings module.\n(If the file settings.py does indeed exist, it's causing an ImportError somehow.)\n" % __file__)
-    sys.exit(1)
+import os, sys
 
 if __name__ == "__main__":
     os.environ.setdefault("DJANGO_SETTINGS_MODULE", "settings")
-    execute_manager(settings)
+
+    from django.core.management import execute_from_command_line
+
+    execute_from_command_line(sys.argv)
+
+
diff --git a/settings/fan.py b/settings/fan.py
new file mode 100644
index 0000000000000000000000000000000000000000..e885cb80c18e609d20ff465fd6fd50fa9459f019
--- /dev/null
+++ b/settings/fan.py
@@ -0,0 +1,125 @@
+# XXX I know import * is ugly, but I want the stuff from logSettings to be
+# in this namespace.
+
+CONFIG_NAME = "fzhang"
+
+DEBUG = True
+TEMPLATE_DEBUG = DEBUG
+
+DATABASES = {
+    'default' : {
+        'NAME'     : 'gracedb',
+        'ENGINE'   : 'django.db.backends.mysql',
+        'USER'     : 'fzhang',
+        'PASSWORD' : 'zhangfan',
+    }
+}
+
+MEDIA_URL = "/gracedb-static/"
+
+GRACEDB_DATA_DIR = "/home/fzhang/gracedb/fake_data"
+
+LOG_ROOT = "/home/fzhang/gracedb/logs"
+
+ALERT_EMAIL_FROM = "Dev Alert <root@moe.phys.uwm.edu>"
+ALERT_EMAIL_TO = [
+    "Branson Stephens <branson@gravity.phys.uwm.edu>",
+    ]
+ALERT_EMAIL_BCC = ["branson@gravity.phys.uwm.edu"]
+
+ALERT_TEST_EMAIL_FROM = "Dev Test Alert <root@moe.phys.uwm.edu>"
+ALERT_TEST_EMAIL_TO = [
+    "Branson Stephens <branson@gravity.phys.uwm.edu>",
+    ]
+
+# Don't sent out non-test XMPP alerts on dev box!
+XMPP_ALERT_CHANNELS = [
+                        'test_omega',
+                        'test_mbtaonline',
+                        'test_cwb',
+                        'test_lowmass',
+                      ]
+ 
+# Latency histograms.  Where they go and max latency to bin.
+LATENCY_REPORT_DEST_DIR = "/home/fzhang/gracedb/data/latency"
+LATENCY_REPORT_WEB_PAGE_FILE_PATH = LATENCY_REPORT_DEST_DIR + "/latency.inc"
+
+# Uptime reporting
+UPTIME_REPORT_DIR = "/home/fzhang/gracedb/data/uptime"
+
+
+SITE_ID = 4
+
+TEMPLATE_DIRS = (
+    # Put strings here, like "/home/html/django_templates" or "C:/www/django/templates".
+    # Always use forward slashes, even on Windows.
+    # Don't forget to use absolute paths, not relative paths.
+    "/home/fzhang/gracedb/gracedb/templates",
+)
+
+MIDDLEWARE_CLASSES = [
+    'middleware.accept.AcceptMiddleware',
+    'middleware.cli.CliExceptionMiddleware',
+    'django.middleware.common.CommonMiddleware',
+    'django.contrib.sessions.middleware.SessionMiddleware',
+    'django.contrib.messages.middleware.MessageMiddleware',
+#    'django.contrib.auth.middleware.AuthenticationMiddleware',
+#    'ligodjangoauth.LigoShibbolethMiddleware',
+    'ligoauth.middleware.auth.LigoAuthMiddleware',
+#    'maintenancemode.middleware.MaintenanceModeMiddleware',
+#    'debug_toolbar.middleware.DebugToolbarMiddleware',
+]
+
+INSTALLED_APPS = (
+    'django.contrib.auth',
+    'django.contrib.admin',
+    'django.contrib.contenttypes',
+    'django.contrib.sessions',
+    'django.contrib.sites',
+    'django.contrib.staticfiles',
+    'gracedb',
+    'userprofile',
+    'ligoauth',
+    'rest_framework',
+    'south',
+#    'debug_toolbar',
+)
+
+INTERNAL_IPS = (
+    '129.89.61.55',
+)
+
+LOGGING = {
+    'version': 1,
+    'disable_existing_loggers' : True,
+    'formatters': {
+        'simple': {
+            'format': '%(asctime)s: %(message)s',
+            'datefmt': '%Y-%m-%dT%H:%M:%S',
+        },
+    },
+    'handlers': {
+        'null': {
+            'level':'DEBUG',
+            'class':'django.utils.log.NullHandler',
+        },
+        'performance_file': {
+            'class': 'logging.FileHandler',
+            'formatter': 'simple',
+            'filename': '%s/gracedb_performance.log' % LOG_ROOT,
+        },
+    },
+    'loggers': {
+        'django': {
+            'handlers': ['null'],
+            'propagate': True,
+            'level': 'INFO',
+        },
+        'middleware': {
+            'handlers': ['performance_file'],
+            'propagate': True,
+            'level': 'INFO',
+        },
+   },
+}
+
diff --git a/settingsdir/branson.py b/settingsdir/branson.py
index 10230554f6cbe1cddfe029fd36d475c61ae18423..dd1889e86c14af521be7217f33e0a03e2d47e480 100644
--- a/settingsdir/branson.py
+++ b/settingsdir/branson.py
@@ -1,7 +1,3 @@
-# XXX I know import * is ugly, but I want the stuff from logSettings to be
-# in this namespace.
-from logSettings import *
-
 CONFIG_NAME = "Branson"
 
 DEBUG = True
@@ -16,7 +12,9 @@ DATABASES = {
     }
 }
 
-MEDIA_URL = "/branson-static/"
+#MEDIA_URL = "/branson-static/"
+STATIC_URL = "/branson-static/"
+STATIC_ROOT = "/home/branson/gracedbdev/static/"
 
 GRACEDB_DATA_DIR = "/home/branson/fake_data"
 
@@ -66,7 +64,7 @@ MIDDLEWARE_CLASSES = [
 #    'ligodjangoauth.LigoShibbolethMiddleware',
     'ligoauth.middleware.auth.LigoAuthMiddleware',
     'maintenancemode.middleware.MaintenanceModeMiddleware',
-    'debug_toolbar.middleware.DebugToolbarMiddleware',
+#    'debug_toolbar.middleware.DebugToolbarMiddleware',
 ]
 
 INSTALLED_APPS = (
@@ -81,9 +79,150 @@ INSTALLED_APPS = (
     'ligoauth',
     'rest_framework',
     'south',
-    'debug_toolbar',
+#    'debug_toolbar',
 )
 
-INTERNAL_IPS = (
-    '129.89.61.55',
-)
+#INTERNAL_IPS = (
+#    '129.89.61.55',
+#)
+
+
+# Settings for Logging.
+import logging
+
+LOG_ROOT = '/home/branson/logs'
+LOG_FILE_SIZE = 1024*1024 # 1 MB
+LOG_FILE_BAK_CT = 3
+LOG_FORMAT = 'verbose'
+LOG_LEVEL = 'DEBUG'
+
+# Filter objects to separate out each level of alert.
+# Otherwise the log files for each level would contain the
+# output for each higher level.
+class debugOnlyFilter(logging.Filter):
+    def filter(self,record):
+        if record.levelname=='DEBUG':
+            return 1
+        return 0
+class infoOnlyFilter(logging.Filter):
+    def filter(self,record):
+        if record.levelname=='INFO':
+            return 1
+        return 0
+class debugPlusInfo(logging.Filter):
+    def filter(self,record):
+        if record.levelname=='INFO' or record.levelname=='DEBUG':
+            return 1
+        return 0
+class warningOnlyFilter(logging.Filter):
+    def filter(self,record):
+        if record.levelname=='WARNING':
+            return 1
+        return 0
+class errorOnlyFilter(logging.Filter):
+    def filter(self,record):
+        if record.levelname=='ERROR':
+            return 1
+        return 0
+
+# Note that mode for log files is 'a' (append) by default
+# The 'level' specifier on the handle is optional, and we
+# don't need it since we're using custom filters.
+LOGGING = {
+    'version': 1,
+    'disable_existing_loggers' : True,
+    'formatters': {
+        'simple': {
+            'format': '%(levelname)s %(message)s',
+        },
+        'verbose': {
+            'format': '%(asctime)s: %(name)s: %(message)s',
+            'datefmt': '%Y-%m-%d %H:%M:%S',
+        },
+    },
+#    'filters': {
+#        'debugOnly': {
+#            '()': 'settings.logSettings.debugOnlyFilter',
+#        },
+#        'infoOnly': {
+#            '()': 'settings.logSettings.infoOnlyFilter',
+#        },
+#        'debugPlusInfo': {
+#            '()': 'settings.logSettings.debugPlusInfo',
+#        },
+#        'warningOnly': {
+#            '()': 'settings.logSettings.warningOnlyFilter',
+#        },
+#        'errorOnly': {
+#            '()': 'settings.logSettings.errorOnlyFilter',
+#        },
+#    },
+    'handlers': {
+        'null': {
+            'level':'DEBUG',
+            'class':'django.utils.log.NullHandler',
+        },
+        'debug_file': {
+            'class': 'logging.handlers.RotatingFileHandler',
+            'formatter': LOG_FORMAT,
+#           Commented out so that the debug file will have *everything*  
+#           That should make it somewhat easier to read through.                        
+#            'filters': ['debugPlusInfo'],
+            'filename': '%s/gracedb_debug.log' % LOG_ROOT,
+            'maxBytes': LOG_FILE_SIZE,
+            'backupCount': LOG_FILE_BAK_CT,
+        },
+#        'info_file': {
+#            'class': 'logging.handlers.RotatingFileHandler',
+#            'formatter': LOG_FORMAT,
+#            'filters': ['infoOnly'],
+#            'filename': '%s/gracedb_info.log' % LOG_ROOT,
+#            'maxBytes': LOG_FILE_SIZE,
+#            'backupCount': LOG_FILE_BAK_CT,
+#        },
+#        'warning_file': {
+#            'class': 'logging.handlers.RotatingFileHandler',
+#            'formatter': LOG_FORMAT,
+#            'filters': ['warningOnly'],
+#            'filename': '%s/gracedb_warning.log' % LOG_ROOT,
+#            'maxBytes': LOG_FILE_SIZE,
+#            'backupCount': LOG_FILE_BAK_CT,
+#        },  
+#        'error_file': {
+#            'class': 'logging.handlers.RotatingFileHandler',
+#            'formatter': LOG_FORMAT,
+#            'filters': ['errorOnly'],
+#            'filename': '%s/gracedb_error.log' % LOG_ROOT,
+#            'maxBytes': LOG_FILE_SIZE,
+#            'backupCount': LOG_FILE_BAK_CT,
+#        },  
+       'performance_file': {
+            'class': 'logging.FileHandler',
+            'formatter': 'simple',
+            'filename': '%s/gracedb_performance.log' % LOG_ROOT,
+        },
+    },
+    'loggers': {
+        'django': {
+            'handlers': ['null'],
+            'propagate': True,
+            'level': 'INFO',
+        },
+        'gracedb': {
+#            'handlers': ['debug_file', 'info_file', 'warning_file', 'error_file'],
+            'handlers': ['debug_file'],
+            'propagate': True,
+            'level': LOG_LEVEL,
+        },
+        'middleware': {
+            'handlers': ['performance_file'],
+            'propagate': True,
+            'level': 'INFO',
+        }, 
+#        'userprofile': {
+#            'handlers': ['debug_file', 'info_file', 'warning_file', 'error_file'],
+#            'propagate': True,
+#            'level': LOG_LEVEL,
+#        },
+   },
+}
diff --git a/settingsdir/default.py b/settingsdir/default.py
index 3ecc5db1041c59825d848580c61236ff2cbe7991..6986f058214ec12eb333a8af9998315c3905fc13 100644
--- a/settingsdir/default.py
+++ b/settingsdir/default.py
@@ -1,5 +1,6 @@
 
 # Suitable for production
+ALLOWED_HOSTS = ['*']
 
 DEBUG = False
 TEMPLATE_DEBUG = DEBUG
@@ -136,12 +137,12 @@ USE_I18N = False
 
 # Absolute path to the directory that holds media.
 # Example: "/home/media/media.lawrence.com/"
-MEDIA_ROOT = ''
+#MEDIA_ROOT = ''
 
 # URL that handles the media served from MEDIA_ROOT. Make sure to use a
 # trailing slash if there is a path component (optional in other cases).
 # Examples: "http://media.lawrence.com", "http://example.com/media/"
-MEDIA_URL = '/gracedb-static/'
+#MEDIA_URL = '/gracedb-static/'
 
 # URL prefix for admin media -- CSS, JavaScript and images. Make sure to use a
 # trailing slash.
@@ -156,7 +157,9 @@ TEMPLATE_LOADERS = (
     #'django.template.loaders.filesystem.load_template_source',
     # replaced by...
     'django.template.loaders.filesystem.Loader',
-    'django.template.loaders.app_directories.load_template_source',
+    # Upgrade to 1.4
+    #'django.template.loaders.app_directories.load_template_source',
+    'django.template.loaders.app_directories.Loader',
 #     'django.template.loaders.eggs.load_template_source',
 )
 
@@ -232,6 +235,7 @@ REST_FRAMEWORK = {
 
 
 STATIC_URL = "/gracedb-static/"
+STATIC_ROOT = "/home/gracedb/graceproj/static/"
 
 STATICFILES_FINDERS = (
     'django.contrib.staticfiles.finders.FileSystemFinder',
diff --git a/templates/admin/base_site.html b/templates/admin/base_site.html
index 76e911a6721002ef1b8fb7547da575c2365c773d..c9894d6f2b7704cd0bf9b69250582ad8b406d9d9 100644
--- a/templates/admin/base_site.html
+++ b/templates/admin/base_site.html
@@ -2,7 +2,7 @@
 {% load i18n %}
 
 {% block extrastyle %}
-    <link rel="stylesheet" href="{{MEDIA_URL}}css/admin-nav.css" />
+    <link rel="stylesheet" href="{{STATIC_URL}}css/admin-nav.css" />
 {% endblock %}
 
 
@@ -14,12 +14,12 @@
 
 {% block nav-global %}
 <ul id="nav">
-    <li id="nav-home"><a href="{% url home %}">Home</a></li>
-    <li id="nav-search"><a href="{% url search %}">Search</a></li>
-    <li id="nav-create"><a href="{% url create %}">Create</a></li>
-    <li id="nav-reports"><a href="{% url reports %}">Reports</a></li>
-    <li id="nav-feeds"><a href="{% url feeds %}">RSS</a></li>
-    <li id="nav-userprofile"><a href="{% url userprofile-home %}">Options</a></li>
+    <li id="nav-home"><a href="{% url "home" %}">Home</a></li>
+    <li id="nav-search"><a href="{% url "search" %}">Search</a></li>
+    <li id="nav-create"><a href="{% url "create" %}">Create</a></li>
+    <li id="nav-reports"><a href="{% url "reports" %}">Reports</a></li>
+    <li id="nav-feeds"><a href="{% url "feeds" %}">RSS</a></li>
+    <li id="nav-userprofile"><a href="{% url "userprofile-home" %}">Options</a></li>
     {% if user %}<li id="nav-user">Authenticated as:
                  {{ user.first_name }} {{ user.last_name }}</li>{% endif %}
 <ul>
diff --git a/templates/base.html b/templates/base.html
index 82a670103387515a93e6938d6e4474aa23885384..046c2273d1c7154473fc13d7360efe3d82d32427 100644
--- a/templates/base.html
+++ b/templates/base.html
@@ -2,7 +2,7 @@
     "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
 <head>
-    <link rel="stylesheet" href="{{MEDIA_URL}}css/style.css" />
+    <link rel="stylesheet" href="{{STATIC_URL}}css/style.css" />
     <title>GraceDb | {% block title %}{% endblock %}</title>
 <!-- START TESTING -->
 <script type="text/javascript">
@@ -30,13 +30,13 @@ function changeTime(obj, label) {
 
 {% block nav %}
 <ul id="nav">
-    <li id="nav-home"><a href="{% url home %}">Home</a></li>
-    <li id="nav-search"><a href="{% url search %}">Search</a></li>
-    <li id="nav-create"><a href="{% url create %}">Create</a></li>
-    <li id="nav-reports"><a href="{% url reports %}">Reports</a></li>
-    <li id="nav-feeds"><a href="{% url feeds %}">RSS</a></li>
-    <li id="nav-latest"><a href="{% url latest %}">Latest</a></li>
-    <li id="nav-userprofile"><a href="{% url userprofile-home %}">Options</a></li>
+    <li id="nav-home"><a href="{% url "home" %}">Home</a></li>
+    <li id="nav-search"><a href="{% url "search" %}">Search</a></li>
+    <li id="nav-create"><a href="{% url "create" %}">Create</a></li>
+    <li id="nav-reports"><a href="{% url "reports" %}">Reports</a></li>
+    <li id="nav-feeds"><a href="{% url "feeds" %}">RSS</a></li>
+    <li id="nav-latest"><a href="{% url "latest" %}">Latest</a></li>
+    <li id="nav-userprofile"><a href="{% url "userprofile-home" %}">Options</a></li>
     {% if user %}<li id="nav-user">Authenticated as: {{ user.first_name }} {{user.last_name }}</li>{% endif %}
 </ul>
 <center>
@@ -68,28 +68,28 @@ function changeTime(obj, label) {
  <table align="center" width="90%%">
   <tr>
    <td align="center">
-    <img width="52" height="36" src="{{MEDIA_URL}}images/ligo-blue.gif">
+    <img width="52" height="36" src="{{STATIC_URL}}images/ligo-blue.gif">
     <!-- 673px 487px -->
    </td>
 
    <td align="center">
-    <img width="164" height="30" src="{{MEDIA_URL}}images/Virgo_logo50.png">
+    <img width="164" height="30" src="{{STATIC_URL}}images/Virgo_logo50.png">
     <!-- 4,829px 884px -->
    </td>
 
    <td align="center">
     {% if user and user.username == "chad.hanna@LIGO.ORG" %}
-        <img width="194" height="37" src="{{MEDIA_URL}}images/PI_Logo-anim.gif">
+        <img width="194" height="37" src="{{STATIC_URL}}images/PI_Logo-anim.gif">
     {% else %}{% if user and user.username == "kipp.cannon@LIGO.ORG" %}
-        <img width="194" height="37" src="{{MEDIA_URL}}images/CITA_logo-anim.gif">
+        <img width="194" height="37" src="{{STATIC_URL}}images/CITA_logo-anim.gif">
     {% else %}
-        <img width="107" height="37" src="{{MEDIA_URL}}images/anim2.gif">
+        <img width="107" height="37" src="{{STATIC_URL}}images/anim2.gif">
     {% endif %}{% endif %}
     <!-- 287px 101px -->
    </td>
 
    <td align="center">
-    <img width="87" height="37" src="{{MEDIA_URL}}images/LSC_logo50.png">
+    <img width="87" height="37" src="{{STATIC_URL}}images/LSC_logo50.png">
     <!-- 6,261px 2,652px -->
    </td>
   </tr>
diff --git a/templates/gracedb/event_detail.html b/templates/gracedb/event_detail.html
index fe76f287466b5496c53dd1299f528b21cf32cb6b..b52280f61d4f5637b85f4136e5542307779c4d8b 100644
--- a/templates/gracedb/event_detail.html
+++ b/templates/gracedb/event_detail.html
@@ -13,8 +13,8 @@
       src="https://c328740.ssl.cf1.rackcdn.com/mathjax/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML">
     </script>
     <script src="http{% if request.is_secure %}s{% endif %}://ajax.googleapis.com/ajax/libs/dojo/1.8.1/dojo/dojo.js" type="text/javascript"></script>
-    <script src="{{MEDIA_URL}}js/labeltips.js" type="text/javascript"></script>
-    <link rel="stylesheet" href="{{MEDIA_URL}}css/labeltips.css">
+    <script src="{{STATIC_URL}}js/labeltips.js" type="text/javascript"></script>
+    <link rel="stylesheet" href="{{STATIC_URL}}css/labeltips.css">
     <style>
         .emptyIcon{
             background-image: none;
@@ -57,13 +57,13 @@
                     dc += '         <td> \n';
                     dc += '             <table class="figures"> \n';
                     dc += '                 <tr class="figrow"> \n';
-                    dc += '                     <td>  <a href="{{ log.fileurl|urlencode }}" dojoType="dojox.image.LightboxNano"><img height="180" src="{{ log.fileurl|urlencode }}"></a> \n';
+                    dc += '                     <td>  <a href="{{ log.fileurl }}" dojoType="dojox.image.LightboxNano"><img height="180" src="{{ log.fileurl }}"></a> \n';
                     dc += '                     </td> \n';
                     dc += '                 </tr> \n';
                     dc += '                 <tr> \n';
                     dc += '                     <td> {{log.comment|sanitize|escapejs}} \n';
                     {% if log.fileurl %} 
-                    dc += '                         <a href="{{log.fileurl|urlencode}}">{{log.filename}}.</a> \n';
+                    dc += '                         <a href="{{log.fileurl}}">{{log.filename}}.</a> \n';
                     {% endif %} 
                     dc += '                         Submitted by {{log.issuer}} on {{log.created}} \n';
                     dc += '                     </td> \n';
@@ -96,7 +96,7 @@
                     dc += '         <td>{{log.issuer.first_name}} {{log.issuer.last_name}}</td> \n';
                     dc += '         <td>{{log.comment|sanitize|escapejs}} \n';
                                {% if log.fileurl %}
-                    dc += '             <a href="{{log.fileurl|urlencode}}">{{log.filename}}</a> \n';
+                    dc += '             <a href="{{log.fileurl}}">{{log.filename}}</a> \n';
                                {% endif %}
                     dc += '         </td> \n';
                     dc += '    </tr> \n';
@@ -160,12 +160,12 @@
 
             ret += '        {{log.comment|sanitize|escapejs}} \n';
     {% if log.fileurl %}
-            ret += '            <a href="{{log.fileurl|urlencode}}">{{log.filename}}</a> \n';
+            ret += '            <a href="{{log.fileurl}}">{{log.filename}}</a> \n';
     {% endif %}
             ret += '        </td> \n';
             ret += '        <td> \n';
     {% if log.hasImage %}
-            ret += '            <a href="{{ log.fileurl|urlencode }}" dojoType="dojox.image.LightboxNano"><img height="60" src="{{ log.fileurl|urlencode }}"></a> \n';
+            ret += '            <a href="{{ log.fileurl }}" dojoType="dojox.image.LightboxNano"><img height="60" src="{{ log.fileurl }}"></a> \n';
     {% endif %}
             ret += '        </td> \n';
             ret += '    </tr> \n';
@@ -228,7 +228,7 @@
             //--------------------------------------------------------------------------------------------------------------------
             function getTagDelCallback(tag) {
                 return function() {
-                    var tagUrl = "{% url taglogentry object.graceid "000" "temp" %}" 
+                    var tagUrl = "{% url "taglogentry" object.graceid "000" "temp" %}" 
                     tagUrl = tagUrl.replace("000",tag.n); 
                     tagUrl = tagUrl.replace("temp",tag.name); 
                     var tagResultDialog = new Dialog({ style: "width: 300px" }); 
@@ -314,7 +314,7 @@
                         formData = addTagForm.getValues();
                         var tagName = formData.existingTagSelect;
                         var tagDispName = formData.tagDispName;
-                        var tagUrl = "{% url taglogentry object.graceid "000" "temp" %}"
+                        var tagUrl = "{% url "taglogentry" object.graceid "000" "temp" %}"
                         tagUrl = tagUrl.replace("000",log.n);
                         tagUrl = tagUrl.replace("temp",tagName);
 
@@ -436,7 +436,7 @@
             }, button_element);
 
             var savebutton = new Save({
-                    url: "{% url logentry object.graceid "" %}",
+                    url: "{% url "logentry" object.graceid "" %}",
                     onSuccess: function (resp, ioargs) {
                         //this.inherited(resp, ioargs);
                         this.button.set("disabled", false);
@@ -547,7 +547,7 @@
 <table class="event">
     {% if skyalert_authorized  %}
         <tr><td colspan="4">
-           <a href="{% url skyalert object.graceid %}"><button type="button">Submit to Skyalert</button></a>
+           <a href="{% url "skyalert" object.graceid %}"><button type="button">Submit to Skyalert</button></a>
         </td></tr>
     {% endif %}
 
@@ -612,7 +612,7 @@
                     alert("Bad neighborhood specified.")
                     return;
                 }
-                var neighborUrlPattern = "{% url neighbors object.graceid "000" %}"
+                var neighborUrlPattern = "{% url "neighbors" object.graceid "000" %}"
                 var neighbor_div = dom.byId("neighbors");
                 neighborUrl = neighborUrlPattern.replace("000", delta);
                 request(neighborUrl).then(
@@ -884,11 +884,9 @@
     <div id="new_log_entry_form">
     <noscript>
         <h3>Create a new log entry</h3>
-        <form id="newlog" action="{% url logentry object.graceid "" %}" method="POST">
-            <p>
-              <textarea id="newlogtext" name="comment" style="width:300px;display:block"></textarea>
-              <input type="submit" value="Submit"/>
-            </p>
+        <form id="newlog" action="{% url "logentry" object.graceid "" %}" method="POST">
+            <textarea id="newlogtext" name="comment" style="width:300px;display:block"></textarea>
+            <input type="submit" value="Submit"/>
         </form>
     </noscript>
   </div>
diff --git a/templates/gracedb/event_detail_GRB.html b/templates/gracedb/event_detail_GRB.html
index b4ef4a118b45943cc0ff57c72bb7c71c38fc0ef8..7796130f579a305e084365091693d2c0eb901380 100644
--- a/templates/gracedb/event_detail_GRB.html
+++ b/templates/gracedb/event_detail_GRB.html
@@ -7,7 +7,7 @@
 <table class="event">
     {% if skyalert_authorized  %}
         <tr><td colspan="4">
-           <a href="{% url skyalert object.graceid %}"><button type="button">Submit to Skyalert</button></a>
+           <a href="{% url "skyalert" object.graceid %}"><button type="button">Submit to Skyalert</button></a>
         </td></tr>
     {% endif %}
 
diff --git a/templates/gracedb/event_filelist.html b/templates/gracedb/event_filelist.html
new file mode 100644
index 0000000000000000000000000000000000000000..1f413294a77f60a7284c907017b44aa70fe39b20
--- /dev/null
+++ b/templates/gracedb/event_filelist.html
@@ -0,0 +1,15 @@
+{% extends "base.html" %}
+{% block title %}{{ title }}{% endblock %}
+{% block heading %}{{ title }}{% endblock %}
+{% block pageid %}event files{% endblock %}
+
+{% block content %}
+<p>{{ message }}</p>
+
+<ul>
+{% for filename in file_list %}
+<li><a href="{% url "file" graceid filename %}">{{ filename }}</a></li>
+{% endfor %}
+</ul>
+
+{% endblock %}
diff --git a/templates/gracedb/event_list.html b/templates/gracedb/event_list.html
index 5d654f273b56742d5ec14e6ec1012e8ddbfc49ee..56f789b9c83d0706d6b8bc17aaf2637a622e5d9e 100644
--- a/templates/gracedb/event_list.html
+++ b/templates/gracedb/event_list.html
@@ -8,27 +8,27 @@
 {% block jscript %}
 
 <link rel="stylesheet" type="text/css" media="screen"
-      href="{{MEDIA_URL}}css/jqgrid/theme/jquery-ui.css"/>
+      href="{{STATIC_URL}}css/jqgrid/theme/jquery-ui.css"/>
 
 <link rel="stylesheet" type="text/css" media="screen"
-      href="{{MEDIA_URL}}css/jqgrid/theme/ui.all.css"/>
+      href="{{STATIC_URL}}css/jqgrid/theme/ui.all.css"/>
 
 <!--
 <link rel="stylesheet" type="text/css" media="screen"
-      href="{{MEDIA_URL}}css/jqgrid/ui-lightness/jquery-ui-1.7.2.custom.css"/>
+      href="{{STATIC_URL}}css/jqgrid/ui-lightness/jquery-ui-1.7.2.custom.css"/>
 -->
 
 <link rel="stylesheet" type="text/css" media="screen"
-      href="{{MEDIA_URL}}css/jqgrid/ui.jqgrid.css"/>
+      href="{{STATIC_URL}}css/jqgrid/ui.jqgrid.css"/>
 
-<script src="{{MEDIA_URL}}js/jquery-1.3.2.min.js" type="text/javascript"></script>
-<script src="{{MEDIA_URL}}js/grid.locale-en.js" type="text/javascript"></script>
-<script src="{{MEDIA_URL}}js/jquery.jqGrid.min.js" type="text/javascript"></script>
-<script src="{{MEDIA_URL}}js/jquery-ui-1.7.2.custom.min.js" type="text/javascript"></script>
+<script src="{{STATIC_URL}}js/jquery-1.3.2.min.js" type="text/javascript"></script>
+<script src="{{STATIC_URL}}js/grid.locale-en.js" type="text/javascript"></script>
+<script src="{{STATIC_URL}}js/jquery.jqGrid.min.js" type="text/javascript"></script>
+<script src="{{STATIC_URL}}js/jquery-ui-1.7.2.custom.min.js" type="text/javascript"></script>
 
 
-<script src="{{MEDIA_URL}}js/labeltips.js" type="text/javascript"></script>
-<link rel="stylesheet" href="{{MEDIA_URL}}css/labeltips.css">
+<script src="{{STATIC_URL}}js/labeltips.js" type="text/javascript"></script>
+<link rel="stylesheet" href="{{STATIC_URL}}css/labeltips.css">
 
     <script type="text/javascript">
     <!--
@@ -48,7 +48,7 @@
             (
             {
             sortable: true,
-            url: '{% url search %}flex?query={{rawquery|urlencode}}',
+            url: '{% url "search" %}flex?query={{rawquery|urlencode}}',
             datatype: 'json',
             mtype: "GET",
             colNames : ["UID", "Labels", "Neighbors (+/-5sec)", "Group", "Type", "Event Time", "Instruments", "FAR (Hz)", "Links", "Submitted", "Submitted By",
@@ -112,8 +112,8 @@
             <td>
                 <a onClick="toggle_visibility('hints');">Hints on querying</a>
                 {% if rawquery %}
-                    | <a href="{% url search %}?query={{rawquery|urlencode}}">Link to current query</a>
-                    | <a href="{% url search %}?query={{rawquery|urlencode}}&ligolw">Download LIGOLW File</a>
+                    | <a href="{% url "search" %}?query={{rawquery|urlencode}}">Link to current query</a>
+                    | <a href="{% url "search" %}?query={{rawquery|urlencode}}&ligolw">Download LIGOLW File</a>
                 {% endif %}
             </td>
         </tr>
@@ -144,7 +144,7 @@
     <tbody>
 {% for obj in object_list %}
     <tr class={% cycle 'odd' 'even' %}>
-        <td><a href="{% url view obj.graceid %}">{{ obj.graceid }}</a></td>
+        <td><a href="{% url "view" obj.graceid %}">{{ obj.graceid }}</a></td>
         <td>
              {% for labelling in obj.labelling_set.all %}
                 <span onmouseover="tooltip.show(tooltiptext('{{labelling.label.name}}', '{{labelling.creator.name}}', '{{labelling.created|utc}}'));" onmouseout="tooltip.hide();"  style="color: {{labelling.label.defaultColor}}">{{ labelling.label.name }}</span>
diff --git a/templates/gracedb/gstlalcbc_report.html b/templates/gracedb/gstlalcbc_report.html
index 709199cfe3fd30642e3d7a34d702e0f790f80c5f..3429de9ce0b3b20dc8403647e7ee5ce687b0d3b8 100644
--- a/templates/gracedb/gstlalcbc_report.html
+++ b/templates/gracedb/gstlalcbc_report.html
@@ -96,7 +96,7 @@ onload="document.search_form.query.focus();"
                 {% endif %}
             {% endfor %}
             <td>{{ forloop.counter }} </td>
-            <td><a href="{% url view obj.graceid %}">{{ obj.graceid }}</a></td>
+            <td><a href="{% url "view" obj.graceid %}">{{ obj.graceid }}</a></td>
             <td> {{ obj|end_time }} </td>
             <td> {{ obj.far|scientific }} </td>
             <td> {{ obj.instruments }} </td>
diff --git a/templates/gracedb/histogram.html b/templates/gracedb/histogram.html
index c3c52c61c9ee1ea5a5ecb7b9c7a3dc1b7b98d83b..f06505319750cd1262eeca7e215e04c590501cb3 100644
--- a/templates/gracedb/histogram.html
+++ b/templates/gracedb/histogram.html
@@ -82,7 +82,7 @@ function toggle(id) {
 {% block content %}
 <br/>
 
-<a href="{% url gstlalcbc_report %}"><h3>Dynamic CBC Report</h3></a>
+<a href="{% url "gstlalcbc_report" %}"><h3>Dynamic CBC Report</h3></a>
 <br/>
 <br/>
 
@@ -140,6 +140,6 @@ function toggle(id) {
 <br/>
 <br/>
 
-<a href="{% url performance %}"><h3>GraceDB 3-day performance summary</h3></a>
+<a href="{% url "performance" %}"><h3>GraceDB 3-day performance summary</h3></a>
 
 {% endblock %}
diff --git a/templates/gracedb/index.html b/templates/gracedb/index.html
index bd87b3857210a26f54419a5059619f943781f013..3003a53599cfedbb5ae39a4e8a8f12f86c4ba3fd 100644
--- a/templates/gracedb/index.html
+++ b/templates/gracedb/index.html
@@ -26,7 +26,7 @@ You can read about using the service on the
 <div class="text">
 To receive email alerts when GraCEDb events are created, sign up
 on the <a target="_blank" href="http://listserv.ligo.org/cgi-bin/mailman/listinfo/gracedb">gracedb mailing list</a> or set up your own alert under the
-<a href="{% url userprofile-home %}">Options</a> menu item.
+<a href="{% url "userprofile-home" %}">Options</a> menu item.
 </div>
 
 {% endblock %}
diff --git a/templates/gracedb/latest.html b/templates/gracedb/latest.html
index 11aad2ac4196b62bed9a51a122039ab58d20f5bb..12a78557117c6fe259bd97b10032f66e2d3e00f3 100644
--- a/templates/gracedb/latest.html
+++ b/templates/gracedb/latest.html
@@ -11,7 +11,7 @@
 {% block jscript %}
 
 {% if not error %}
-    <meta http-equiv="refresh" content="300;url={% url latest %}/?query={{rawquery|urlencode}}">
+    <meta http-equiv="refresh" content="300;url={% url "latest" %}/?query={{rawquery|urlencode}}">
 {% endif %}
 
     {# http/https depending on this pages' protocol #}
@@ -98,7 +98,7 @@
 <table class="event">
     {% if skyalert_authorized  %}
         <tr><td colspan="4">
-           <a href="{% url skyalert object.graceid %}"><button type="button">Submit to Skyalert</button></a>
+           <a href="{% url "skyalert" object.graceid %}"><button type="button">Submit to Skyalert</button></a>
         </td></tr>
     {% endif %}
 
@@ -123,7 +123,7 @@
 
 {% for object in objects %}
     <tr class={% cycle 'odd' 'even' %}>
-        <td><a href="{% url view object.graceid %}">{{ object.graceid }}</a></td>
+        <td><a href="{% url "view" object.graceid %}">{{ object.graceid }}</a></td>
         <td>
              {% for labelling in object.labelling_set.all %}
                 <span title="{{labelling.creator.name}}  {{labelling.created|utc}}" style="color: {{labelling.label.defaultColor}}">{{ labelling.label.name }}</span>
diff --git a/templates/gracedb/latest_public.html b/templates/gracedb/latest_public.html
index 59184781d007f2014cdf33decdd50c69f1d37455..833eef2d0dc3f0b499ec4a5e1127185795a9175a 100644
--- a/templates/gracedb/latest_public.html
+++ b/templates/gracedb/latest_public.html
@@ -11,7 +11,7 @@
 {% block jscript %}
 
 {% if not error %}
-    <meta http-equiv="refresh" content="300;url={% url latest %}/?query={{rawquery|urlencode}}">
+    <meta http-equiv="refresh" content="300;url={% url "latest" %}/?query={{rawquery|urlencode}}">
 {% endif %}
 
     {# http/https depending on this pages' protocol #}
diff --git a/templates/gracedb/neighbors_frag.html b/templates/gracedb/neighbors_frag.html
index 40b12aec3c20b1078db704bd17c9828371605b78..4698c7821da7b3c731c4149e114d5e2f8cea5f15 100644
--- a/templates/gracedb/neighbors_frag.html
+++ b/templates/gracedb/neighbors_frag.html
@@ -30,7 +30,7 @@
     </tr>
     {% for delta, object in nearby %}
     <tr class={% cycle 'odd' 'even' %}>
-        <td><a href="{% url view object.graceid %}">{{ object.graceid }}</a></td>
+        <td><a href="{% url "view" object.graceid %}">{{ object.graceid }}</a></td>
         <td>
              {% for labelling in object.labelling_set.all %}
                 <span onmouseover="tooltip.show(tooltiptext('{{labelling.label.name}}', '{{labelling.creator.name}}', '{{labelling.created|utc}}'));" onmouseout="tooltip.hide();"  style="color: {{labelling.label.defaultColor}}">{{ labelling.label.name }}</span>
diff --git a/templates/profile/notifications.html b/templates/profile/notifications.html
index ea4105918b918c6b2b5549c9ba768ffeab1174e9..100bb45ce0c6c57fe39f1572f10082df7491963f 100644
--- a/templates/profile/notifications.html
+++ b/templates/profile/notifications.html
@@ -9,26 +9,26 @@
 {% for trigger in triggers %}
    <ul>
      <li> 
-        <!-- <a href="{% url userprofile-edit trigger.id  %}">Edit</a> -->
-        <a href="{% url userprofile-delete trigger.id %}">Delete</a>
+        <!-- <a href="{% url "userprofile-edit" trigger.id  %}">Edit</a> -->
+        <a href="{% url "userprofile-delete" trigger.id %}">Delete</a>
         {{ trigger.userlessDisplay }}
      </li>
    </ul>
 {% endfor %}
 
-<a href="{% url userprofile-create %}">Create New Notification</a>
+<a href="{% url "userprofile-create" %}">Create New Notification</a>
 
 <h2>Contacts</h2>
 {% for contact in contacts %}
     <ul>
         <li>
-            <!-- <a href="{% url userprofile-edit-contact contact.id %}">Edit</a> -->
-            <a href="{% url userprofile-delete-contact contact.id %}">Delete</a>
+            <!-- <a href="{% url "userprofile-edit-contact" contact.id %}">Edit</a> -->
+            <a href="{% url "userprofile-delete-contact" contact.id %}">Delete</a>
             {{ contact.desc }} / {{ contact.email }}
         </li>
     </ul>
 {% endfor %}
 
-<a href="{% url userprofile-create-contact %}">Create New Contact</a>
+<a href="{% url "userprofile-create-contact" %}">Create New Contact</a>
 
 {% endblock %}
diff --git a/templates/rest_framework/api.html b/templates/rest_framework/api.html
index e89675deafff261fd4fcb2150a80479b213e8f1e..66e196a072961428fdf3864b4c96d1172afb498b 100644
--- a/templates/rest_framework/api.html
+++ b/templates/rest_framework/api.html
@@ -17,7 +17,7 @@ GraceDB &mdash; REST API
 
     {% block breadcrumbs %}
     <ul class="breadcrumb">
-    	    <li><a href="{% url home %}">Home</a></li><span class="divider">&rsaquo;</span>
+    	    <li><a href="{% url "home" %}">Home</a></li><span class="divider">&rsaquo;</span>
         {% for breadcrumb_name, breadcrumb_url in breadcrumblist %}
             <li>
                 <a href="{{ breadcrumb_url }}" {% if forloop.last %}class="active"{% endif %}>{{ breadcrumb_name }}</a> {% if not forloop.last %}<span class="divider">&rsaquo;</span>{% endif %}
diff --git a/urls.py b/urls.py
index 01f0eed25c6d2f404139a4c798c99badb0298b88..4cedf1c7de89423c8e298d8337ba6a2cbdc11607 100644
--- a/urls.py
+++ b/urls.py
@@ -1,5 +1,7 @@
 
-from django.conf.urls.defaults import *
+# Changed for Django 1.6 upgrade
+#from django.conf.urls.defaults import *
+from django.conf.urls import patterns, url, include
 from django.conf import settings
 
 # Uncomment the next two lines to enable the admin:
diff --git a/userprofile/urls.py b/userprofile/urls.py
index e531245f3ca2cebb1a177dfa79f7d0dd2e3f20ff..48f9287789324fe0022a0adba0f60296011745c2 100644
--- a/userprofile/urls.py
+++ b/userprofile/urls.py
@@ -1,5 +1,7 @@
 
-from django.conf.urls.defaults import *
+# Changed for Django 1.6
+#from django.conf.urls.defaults import *
+from django.conf.urls import patterns, url, include
 
 
 urlpatterns = patterns('userprofile.views',
diff --git a/branson.wsgi b/wsgi/branson.wsgi
similarity index 100%
rename from branson.wsgi
rename to wsgi/branson.wsgi
diff --git a/django.wsgi b/wsgi/django.wsgi
similarity index 100%
rename from django.wsgi
rename to wsgi/django.wsgi
diff --git a/wsgi/fzhang.wsgi b/wsgi/fzhang.wsgi
new file mode 100644
index 0000000000000000000000000000000000000000..a5214a847537c6631ad27d066b3b8a897acd5458
--- /dev/null
+++ b/wsgi/fzhang.wsgi
@@ -0,0 +1,25 @@
+import os
+import sys
+
+os.environ['DJANGO_SETTINGS_MODULE'] = 'settings'
+
+# Sandbox libs here, if required.
+#
+#Path to the gracedb source code
+sys.path.insert(1,'/home/fzhang/gracedb/gracedb')
+sys.path.insert(1,'/home/fzhang/djangoenv/lib/python2.7/site-packages')
+
+# Scott's Shib app uses loggers.
+import logging
+logging.basicConfig()
+
+os.environ['MPLCONFIGDIR']='/home/fzhang/gracedb'
+
+#logging.basicConfig(level=logging.DEBUG,
+#                    format='%(asctime)s %(levelname)s %(message)s',
+#                    filename='/tmp/myapp.log',
+#                    filemode='w')
+
+import django.core.handlers.wsgi
+application = django.core.handlers.wsgi.WSGIHandler()
+