diff --git a/reviewboard/admin/form_widgets.py b/reviewboard/admin/form_widgets.py
index d6950a42e416719e2a344db3448df119e887d3ef..d7aa4f6afe0e02909dd5cc3fc8d9daedaf31707c 100644
--- a/reviewboard/admin/form_widgets.py
+++ b/reviewboard/admin/form_widgets.py
@@ -8,11 +8,40 @@ from django.template.loader import render_to_string
 from django.utils import six
 from django.utils.encoding import force_text
 from django.utils.safestring import mark_safe
+
+from djblets.forms.widgets import RelatedObjectWidget
 from djblets.gravatars import get_gravatar_url
 from djblets.siteconfig.models import SiteConfiguration
 
 
-class RelatedUserWidget(HiddenInput):
+class RelatedRepositoryWidget(RelatedObjectWidget):
+    def value_from_datadict(self, data, files, name):
+        """unpack the field's value from a datadict.
+
+        args:
+            data (dict):
+                the form's data.
+
+            files (dict):
+                the form's files.
+
+            name (unicode):
+                the name of the field.
+
+        returns:
+            list:
+            the list of pks of user objects.
+        """
+        value = data.get(name)
+
+        if isinstance(value, list):
+            return value
+        elif isinstance(value, six.string_types):
+            return [v for v in value.split(',') if v]
+        else:
+            return none
+
+class RelatedUserWidget(RelatedObjectWidget):
     """A form widget to allow people to select one or more User relations.
 
     It's not unheard of to have a server with thousands or tens of thousands of
@@ -25,104 +54,23 @@ class RelatedUserWidget(HiddenInput):
     in the list, as well as interactive search and filtering.
     """
 
-    # We inherit from HiddenInput in order for the superclass to render a
-    # hidden <input> element, but the siteconfig field template special cases
-    # when ``is_hidden`` is True. Setting it to False still gives us the
-    # rendering and data handling we want but renders fieldset fields
-    # correctly.
-    is_hidden = False
-
-    def __init__(self, local_site_name=None):
-        super(RelatedUserWidget, self).__init__()
-
-        self.local_site_name = local_site_name
-
-    def render(self, name, value, attrs=None):
-        """Render the widget.
-
-        Args:
-            name (unicode):
-                The name of the field.
-
-            value (list or None):
-                The current value of the field.
-
-            attrs (dict):
-                Attributes for the HTML element.
-
-        Returns:
-            django.utils.safestring.SafeText:
-            The rendered HTML.
-        """
-        if value:
-            value = [v for v in value if v]
-            input_value = ','.join(force_text(v) for v in value)
-            existing_users = (
-                User.objects
-                .filter(pk__in=value)
-                .order_by('first_name', 'last_name', 'username')
-            )
-        else:
-            input_value = None
-            existing_users = []
-
-        final_attrs = self.build_attrs(attrs, name=name)
-
-        input_html = super(RelatedUserWidget, self).render(
-            name, input_value, attrs)
-
-        # The Gravatar API in Djblets currently uses the request to determine
-        # whether or not to use https://secure.gravatar.com or
-        # http://gravatar.com. Unfortunately, it's hard enough to get a copy of
-        # the request in a form, much less in a form widget. Instead, we fake
-        # the request here and just always use the HTTPS one. This will be
-        # dramatically better in 3.0+ with the new avatar services.
-        class FakeRequest(object):
-            def is_secure(self):
-                return True
-
-        fake_request = FakeRequest()
-        siteconfig = SiteConfiguration.objects.get_current()
-        use_gravatars = siteconfig.get('integration_gravatars')
-        user_data = []
-
-        for user in existing_users:
-            data = {
-                'fullname': user.get_full_name(),
-                'id': user.pk,
-                'username': user.username,
-            }
-
-            if use_gravatars:
-                data['avatar_url'] = get_gravatar_url(fake_request, user, 40)
-
-            user_data.append(data)
-
-        extra_html = render_to_string('admin/related_user_widget.html', {
-            'input_id': final_attrs['id'],
-            'local_site_name': self.local_site_name,
-            'use_gravatars': use_gravatars,
-            'users': user_data,
-        })
-
-        return mark_safe(input_html + extra_html)
 
     def value_from_datadict(self, data, files, name):
-        """Unpack the field's value from a datadict.
+        """unpack the field's value from a datadict.
 
-        Args:
+        args:
             data (dict):
-                The form's data.
+                the form's data.
 
             files (dict):
-                The form's files.
+                the form's files.
 
             name (unicode):
-                The name of the field.
+                the name of the field.
 
-        Returns:
+        returns:
             list:
-            The list of PKs of User objects.
+            the list of pks of user objects.
         """
         value = data.get(name)
 
@@ -131,4 +79,4 @@ class RelatedUserWidget(HiddenInput):
         elif isinstance(value, six.string_types):
             return [v for v in value.split(',') if v]
         else:
-            return None
+            return none
diff --git a/reviewboard/reviews/forms.py b/reviewboard/reviews/forms.py
index 535a24e699287f5ee504af8332999ffb6f85628e..e4622b75cd572dacf151d3f35fe3233a5732eece 100644
--- a/reviewboard/reviews/forms.py
+++ b/reviewboard/reviews/forms.py
@@ -8,7 +8,8 @@ from django.contrib.auth.models import User
 from django.core.exceptions import ValidationError
 from django.utils.translation import ugettext_lazy as _
 
-from reviewboard.admin.form_widgets import RelatedUserWidget
+from reviewboard.admin.form_widgets import (RelatedRepositoryWidget,
+                                            RelatedUserWidget)
 from reviewboard.diffviewer import forms as diffviewer_forms
 from reviewboard.diffviewer.models import DiffSet
 from reviewboard.reviews.models import (DefaultReviewer, Group,
@@ -52,7 +53,7 @@ class DefaultReviewerForm(forms.ModelForm):
         help_text=_('The list of repositories to specifically match this '
                     'default reviewer for. If left empty, this will match '
                     'all repositories.'),
-        widget=FilteredSelectMultiple(_("Repositories"), False))
+        widget=RelatedRepositoryWidget())
 
     def __init__(self, *args, **kwargs):
         local_site_name = kwargs.pop('local_site_name', None)
diff --git a/reviewboard/static/rb/js/admin/views/relatedObjectSelectorView.js b/reviewboard/static/rb/js/admin/views/relatedObjectSelectorView.js
index 542d6257f820925eb190afd33a128ae711090c04..1a96759724c5803a4bb9f8832df8e4594efcd3cf 100644
--- a/reviewboard/static/rb/js/admin/views/relatedObjectSelectorView.js
+++ b/reviewboard/static/rb/js/admin/views/relatedObjectSelectorView.js
@@ -53,7 +53,7 @@ RB.RelatedObjectSelectorView = Backbone.View.extend({
             item;
 
         this.$el.html(this._template({
-            searchPlaceholderText: gettext('Search for users...')
+            searchPlaceholderText: gettext('This is a test...')
         }));
 
         this._$selected = this.$('.related-object-selected');
