diff --git a/userprofile/forms.py b/userprofile/forms.py
index e26ddf67bac9a06dbdec52a672c9804d4772154a..87c571c88bce56efdb5aa69dd992bd3646603ee2 100644
--- a/userprofile/forms.py
+++ b/userprofile/forms.py
@@ -4,6 +4,27 @@ from models import Trigger, Contact
 
 from django.forms.models import modelformset_factory
 
+def triggerFormFactory(postdata=None, user=None):
+    class TF(forms.ModelForm):
+        class Meta:
+            model = Trigger
+            exclude = ['user', 'triggerType']
+
+        contacts = forms.ModelMultipleChoiceField(
+                        queryset=Contact.objects.filter(user=user),
+                        required=False
+                        )
+
+        # XXX should probably override is_valid and check for
+        # truth of (atypes or labels)
+        # and set field error attributes appropriately.
+
+    if postdata is not None:
+        return TF(postdata)
+    else:
+        return TF()
+
+
 class TriggerForm(forms.ModelForm):
     class Meta:
         model = Trigger
diff --git a/userprofile/views.py b/userprofile/views.py
index 244ecb81e9de4ba52aa0b93bae03cc1a0d1b32fa..25f8c3d871e8cfd18326d770cbcd9b75f88dbdfd 100644
--- a/userprofile/views.py
+++ b/userprofile/views.py
@@ -10,7 +10,7 @@ from django.shortcuts import render_to_response
 
 from gracedb.userprofile.models import Trigger, Contact
 
-from forms import TriggerForm, ContactForm
+from forms import ContactForm, triggerFormFactory
 
 def index(request):
     triggers = Trigger.objects.filter(user=request.ligouser)
@@ -24,7 +24,7 @@ def create(request):
     explanation = ""
     message = ""
     if request.method == "POST":
-        form = TriggerForm(request.POST)
+        form = triggerFormFactory(request.POST, user=request.ligouser)
         if form.is_valid():
             # Create the Trigger
             t = Trigger(user=request.ligouser)
@@ -43,14 +43,18 @@ def create(request):
                 t.save()
                 request.session['flash_msg'] = "Created: %s" % t.userlessDisplay()
                 return HttpResponseRedirect(reverse(index))
-
         # Data was bad
-        if not contacts:
-            message += "You must specify at least one contact. "
-        if not (labels or atypes):
-            message += "You need to indicate label(s) and/or analysis type(s)."
+        try:
+            if not contacts:
+                message += "You must specify at least one contact. "
+            if not (labels or atypes):
+                message += "You need to indicate label(s) and/or analysis type(s)."
+        except NameError:
+            # form is not valid, so labels, contacts and atypes were not set.
+            # hopefully, there are error messages in the form.
+            pass
     else:
-        form = TriggerForm()
+        form = triggerFormFactory(user=request.ligouser)
     if message:
         request.session['flash_msg'] = message
     return render_to_response('profile/createNotification.html',