diff --git a/gracedb/query.py b/gracedb/query.py
index 18fb6b73c94d20ef8c7cf1677f593298b11e3331..54528514ea0a1c1b2e064c8038e968085dcdad92 100644
--- a/gracedb/query.py
+++ b/gracedb/query.py
@@ -20,7 +20,7 @@ import models
 from django.db.models import Q
 
 from pyparsing import \
-    Word, nums, Literal, CaselessLiteral, delimitedList, Suppress, \
+    Word, nums, Literal, CaselessLiteral, delimitedList, Suppress, QuotedString, \
     Keyword, Combine, Or, Optional, OneOrMore, alphas, Regex, \
     opAssoc, operatorPrecedence, oneOf, \
     stringStart, stringEnd, ParseException
@@ -92,6 +92,11 @@ tidRange = tid + Suppress("..") + tid
 tidQ = Optional(Suppress(Keyword("tid:"))) + (tid^tidRange)
 tidQ = tidQ.setParseAction(maybeRange("tid", dbname="id"))
 
+# Submitter
+submitter = QuotedString('"').setParseAction(lambda toks: Q(submitter__name=toks[0]))
+submitterQ = Optional(Suppress(Keyword("submitter:"))) + submitter
+submitterQ = submitterQ.setParseAction(lambda toks: ("submitter", toks[0]))
+
 # Created times
 
 nltimeRange = nltime + Suppress("..") + nltime
@@ -114,7 +119,8 @@ createdQ = createdQ.setParseAction(maybeRange("created"))
 
 
 # Labels
-labelNames = ["DQV", "INJ", "LUMIN_NO", "LUMIN_GO", "SWIFT_NO", "SWIFT_GO"]
+# XXX should we not get these from the DB?
+labelNames = ["DQV", "INJ", "LUMIN_NO", "LUMIN_GO", "SWIFT_NO", "SWIFT_GO", "EM_READY"]
 label = Or([CaselessLiteral(n) for n in labelNames]).\
         setParseAction( lambda toks: Q(labels__name=toks[0]) )
 
@@ -132,7 +138,7 @@ labelQ = (Optional(Suppress(Keyword("label:"))) + labelQ_.copy())
 labelQ.setParseAction(lambda toks: ("label", toks[0]))
 
 
-q = (gidQ | hidQ | tidQ | atypeQ | groupQ | labelQ | gpsQ | createdQ).setName("query term")
+q = (gidQ | hidQ | tidQ | atypeQ | groupQ | labelQ | gpsQ | createdQ | submitterQ).setName("query term")
 
 def parseQuery(s):
     d={}
diff --git a/gracedb/views.py b/gracedb/views.py
index 2432f55dd3903dd705550c27726c24df18a59dc4..2386a5178d6e8a6331bbdb0c3d26aa111d12d914 100644
--- a/gracedb/views.py
+++ b/gracedb/views.py
@@ -10,11 +10,13 @@ from django.utils.safestring import mark_safe
 
 from django.views.generic.list_detail import object_detail, object_list
 
-from models import Event, Group, EventLog, Labelling, Label
+from models import Event, Group, EventLog, Labelling, Label, User
 from forms import CreateEventForm, EventSearchForm, SimpleSearchForm
 from alert import issueAlert, issueAlertForLabel, issueAlertForUpdate
 from translator import handle_uploaded_data
 
+import urllib
+
 import os
 
 # XXX This should be configurable / moddable or something
@@ -491,7 +493,6 @@ def search(request, format=""):
                     'form': form,
                     'formAction': reverse(search),
                     'maxCount': limit,
-                    'queryLink': reverse(search)+"?query="+escape(rawquery),
                     'rawquery' : rawquery,
                 }
                 return object_list(request, objects, extra_context=context)
@@ -545,6 +546,8 @@ def oldsearch(request):
 
             if start and end:
                 textQuery.append("gid: %s..%s" % (start, end))
+            elif start or end:
+                textQuery.append("gid: %s" % (start or end))
 
             if gpsStart != None or gpsEnd != None :
                 if gpsStart == gpsEnd:
@@ -563,7 +566,12 @@ def oldsearch(request):
                         textQuery.append("gpstime: 0..%s" % gpsEnd)
 
             if submitter:
+                try:
+                    submitter_name = User.objects.get(id=submitter)
+                except User.DoesNotExist:
+                    submitter_name = "Error looking up user"
                 objects = objects.filter(submitter=submitter)
+                textQuery.append('submitter: "%s"' % submitter_name)
             if groupname:
                 group = Group.objects.filter(name=groupname)[0]
                 objects = objects.filter(group=group)
@@ -585,16 +593,12 @@ def oldsearch(request):
             else:
                 title = "Query Results. %s events" % objects.count()
             extra_context = {'title': title }
-            if not submitter and (not (start or end) or (start and end)):
-                # ugh.  there is no submitter option in text query
-                # Also, text query needs both ends of a graceid search
-                # Sooo.... set up a simple search form...
-                textQuery = " ".join(textQuery)
-                extra_context['queryLink'] = reverse(search)+"?query="+escape(textQuery)
-                simple_form = SimpleSearchForm({'query': textQuery})
-                extra_context['form'] = simple_form
-                extra_context['maxCount'] = MAX_QUERY_RESULTS
-                extra_context['rawquery' ] = textQuery
+
+            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)
 
@@ -696,6 +700,8 @@ def flexigridResponse(request, objects):
                         #created_times['gps'],
                         created_times.get('utc',""),
 
+                        object.submitter.name,
+
                       ]
             }
         )
diff --git a/templates/gracedb/event_list.html b/templates/gracedb/event_list.html
index daacd96296aa182bf569697956b75a3a1cf69d42..69d2d467ef0b25636b5fcd325fad1ef47a36d879 100644
--- a/templates/gracedb/event_list.html
+++ b/templates/gracedb/event_list.html
@@ -45,10 +45,10 @@
             (
             {
             sortable: true,
-            url: '{% url search %}/flex?query={{rawquery}}',
+            url: '{% url search %}/flex?query={{rawquery|urlencode}}',
             datatype: 'json',
             mtype: "GET",
-            colNames : ["UID", "Labels", "Neighbors (+/-5sec)", "Group", "Type", "Event Time", "Links", "Submitted",
+            colNames : ["UID", "Labels", "Neighbors (+/-5sec)", "Group", "Type", "Event Time", "Links", "Submitted", "Submitted By",
                        ],
             colModel : [
                {name : 'id',     index: 'id', width : 50, sortable : true, align: 'left', hidden: false},
@@ -60,6 +60,7 @@
                {name : 'gpstime', index: 'gpstime', width : 90, sortable : true, align: 'right'},
                {name : 'links',   index: 'links', width : 80, sortable : false, align: 'center'},
                {name : 'created', index: 'created', width : 100, sortable : true, align: 'right'},
+               {name : 'submitter', index: 'submitter', width : 100, sortable : true, align: 'right'},
 
                 ],
             pager: '#pager1',
@@ -105,8 +106,8 @@
         <tr><td/>
             <td>
                 <a onClick="toggle_visibility('hints');">Hints on querying</a>
-                {% if queryLink %}
-                    | <a href="{{queryLink}}">Link to current query</a>
+                {% if rawquery %}
+                    | <a href="{% url search %}?query={{rawquery|urlencode}}">Link to current query</a>
                 {% endif %}
             </td>
         </tr>
diff --git a/templates/gracedb/query_help_frag.html b/templates/gracedb/query_help_frag.html
index 8ac2b8135235c5e96d58d9ab167779fdd9b7eb95..4f981d9e0d7c94fd0eb176fed7904c0984366f8f 100644
--- a/templates/gracedb/query_help_frag.html
+++ b/templates/gracedb/query_help_frag.html
@@ -50,4 +50,13 @@
    <li>DQV LUMIN_GO</li>
   </ul>
 
+ <h4>By Submitter</h4>
+  To specify events from a given submitter, indicate the name of the submitter in double quotes.
+  The <code>submitter:</code> is optional.
+  <ul>
+    <li>"CWB Analysis"
+    <li>"CWB Analysis" "Omega Analysis"
+    <li>submitter: "Joss Whedon" submitter: "Gilligan"
+  </ul>
+
 </div>