diff --git a/reviewboard/datagrids/columns.py b/reviewboard/datagrids/columns.py
index 5fd2b394fbe2d4177ba2a5a45178d0749b86f0f8..af2cbff88b1d97c33bff836015cf11bab8399176 100644
--- a/reviewboard/datagrids/columns.py
+++ b/reviewboard/datagrids/columns.py
@@ -237,6 +237,19 @@ class FullNameColumn(Column):
 
         return ''
 
+    def get_sort_field(self, state):
+        """Retrieve the fields that compose a user's fullname.
+
+        Args:
+            state (djblets.datagrid.grids.StatefulColumn):
+                The column state.
+
+        Returns:
+            tuple:
+            Tuple (unicode) containing elements that compose a user's fullname.
+        """
+        return ('first_name', 'last_name')
+
 
 class BugsColumn(Column):
     """Shows the list of bugs specified on a review request.
diff --git a/reviewboard/datagrids/grids.py b/reviewboard/datagrids/grids.py
index 5ecda3204dd16916bfc1135cd5ddfdf7d845e9af..2070cf28f926902b5581911d1a4dbadd67774433 100644
--- a/reviewboard/datagrids/grids.py
+++ b/reviewboard/datagrids/grids.py
@@ -410,7 +410,10 @@ class UsersDataGrid(AlphanumericDataGrid):
     """A datagrid showing a list of users registered on Review Board."""
 
     username = UsernameColumn(label=_('Username'))
-    fullname = FullNameColumn(label=_('Full Name'), link=True, expand=True)
+    fullname = FullNameColumn(label=_('Full Name'),
+                              sortable=True,
+                              link=True,
+                              expand=True)
     pending_count = PendingCountColumn(_('Open Review Requests'),
                                        field_name='directed_review_requests',
                                        shrink=True)
diff --git a/reviewboard/datagrids/tests.py b/reviewboard/datagrids/tests.py
index 677fb857d3f67cc0d58401f47ad3173668daaf09..8cb128a7f9deb4383f98c980356c528d7ef66dfa 100644
--- a/reviewboard/datagrids/tests.py
+++ b/reviewboard/datagrids/tests.py
@@ -1034,6 +1034,56 @@ class FullNameColumnTests(BaseColumnTestCase):
             self.column.render_data(self.stateful_column, user),
             '')
 
+    def test_fullname_sort_descending(self):
+        """Testing FullNameColumn descending sort"""
+
+        self.grid.default_columns = ['fullname']
+
+        User.objects.filter(username='admin').update(first_name='TestB',
+                                                     last_name='User')
+        User.objects.filter(username='doc').update(first_name='TestA',
+                                                   last_name='User')
+        User.objects.filter(username='dopey').update(first_name='TestC',
+                                                     last_name='UserE')
+        User.objects.filter(username='grumpy').update(first_name='TestC',
+                                                      last_name='UserD')
+        admin = User.objects.get(username='admin')
+        doc = User.objects.get(username='doc')
+        dopey = User.objects.get(username='dopey')
+        grumpy = User.objects.get(username='grumpy')
+
+        response = self.client.get('/users/?sort=fullname')
+        rows = response.context['datagrid'].rows
+        users = [row['object'] for row in rows if row['object']]
+        users_to_match = [doc, admin, grumpy, dopey]
+
+        self.assertEqual(users, users_to_match)
+
+    def test_fullname_sort_ascending(self):
+        """Testing FullNameColumn ascending sort"""
+
+        self.grid.default_columns = ['fullname']
+
+        User.objects.filter(username='admin').update(first_name='TestB',
+                                                     last_name='User')
+        User.objects.filter(username='doc').update(first_name='TestA',
+                                                   last_name='User')
+        User.objects.filter(username='dopey').update(first_name='TestC',
+                                                     last_name='UserE')
+        User.objects.filter(username='grumpy').update(first_name='TestC',
+                                                      last_name='UserD')
+        admin = User.objects.get(username='admin')
+        doc = User.objects.get(username='doc')
+        dopey = User.objects.get(username='dopey')
+        grumpy = User.objects.get(username='grumpy')
+
+        response = self.client.get('/users/?sort=-fullname')
+        rows = response.context['datagrid'].rows
+        users = [row['object'] for row in rows if row['object']]
+        users_to_match = [dopey, grumpy, admin, doc]
+
+        self.assertEqual(users, users_to_match)
+
 
 class SummaryColumnTests(BaseColumnTestCase):
     """Testing reviewboard.datagrids.columns.SummaryColumn."""
