diff --git a/django/contrib/comments/admin.py b/django/contrib/comments/admin.py
index c2f8e56..861db4a 100644
--- a/django/contrib/comments/admin.py
+++ b/django/contrib/comments/admin.py
@@ -2,6 +2,7 @@ from django.contrib import admin
 from django.contrib.comments.models import Comment
 from django.utils.translation import ugettext_lazy as _
 from django.contrib.comments import get_model
+from django.contrib.comments.views.moderation import base_flag, base_approve, base_delete
 
 class CommentsAdmin(admin.ModelAdmin):
     fieldsets = (
@@ -22,6 +23,45 @@ class CommentsAdmin(admin.ModelAdmin):
     ordering = ('-submit_date',)
     raw_id_fields = ('user',)
     search_fields = ('comment', 'user__username', 'user_name', 'user_email', 'user_url', 'ip_address')
+    actions = ["flag_comments", "approve_comments", "remove_comments"]
+
+    def get_actions(self, request):
+        actions = super(CommentsAdmin, self).get_actions(request)
+        # Only superusers should be able to delete the comments from
+        # the DB.
+        if not request.user.is_superuser:
+            actions.pop('delete_selected')
+        if not request.user.has_perm('comments.can_moderate'):
+            actions.pop('approve_comments')
+            actions.pop('remove_comments')
+        return actions
+
+    def flag_comments(self, request, queryset):
+        for comment in queryset:
+            base_flag(request, comment)
+        self.message_user(request, "%s flagged." %self._get_message_bit(queryset.count()))
+    flag_comments.short_description = "Flag selected comments"
+
+    def approve_comments(self, request, queryset):
+        for comment in queryset:
+            base_approve(request, comment)
+        self.message_user(request, "%s approved." %self._get_message_bit(queryset.count()))
+    approve_comments.short_description = "Approve selected comments"
+
+    def remove_comments(self, request, queryset):
+        for comment in queryset:
+            base_delete(request, comment)
+        self.message_user(request, "%s removed." %self._get_message_bit(queryset.count()))
+    remove_comments.short_description = "Remove selected comments"
+
+    def _get_message_bit(self, rows_updated): 
+        message_bit = ''
+        if rows_updated == 1: 
+            message_bit += '1 comment was ' 
+        else:
+            message_bit += '%s comments were ' %rows_updated 
+        message_bit += 'successfully'
+        return message_bit
 
 # Only register the default admin if the model is the built-in comment model
 # (this won't be true if there's a custom comment app).
diff --git a/django/contrib/comments/templates/comments/moderation_queue.html b/django/contrib/comments/templates/comments/moderation_queue.html
deleted file mode 100644
index 73012b3..0000000
--- a/django/contrib/comments/templates/comments/moderation_queue.html
+++ /dev/null
@@ -1,75 +0,0 @@
-{% extends "admin/change_list.html" %}
-{% load adminmedia i18n %}
-
-{% block title %}{% trans "Comment moderation queue" %}{% endblock %}
-
-{% block extrahead %}
-  {{ block.super }}
-  <style type="text/css" media="screen">
-    p#nocomments { font-size: 200%; text-align: center; border: 1px #ccc dashed; padding: 4em; }
-    td.actions { width: 11em; }
-    td.actions form { display: inline; }
-    td.actions form input.submit { width: 5em; padding: 2px 4px; margin-right: 4px;}
-    td.actions form input.approve { background: green; color: white; }
-    td.actions form input.remove { background: red; color: white; }
-  </style>
-{% endblock %}
-
-{% block branding %}
-<h1 id="site-name">{% trans "Comment moderation queue" %}</h1>
-{% endblock %}
-
-{% block breadcrumbs %}{% endblock %}
-
-{% block content %}
-{% if empty %}
-<p id="nocomments">{% trans "No comments to moderate" %}.</p>
-{% else %}
-<div id="content-main">
-  <div class="module" id="changelist">
-    <table cellspacing="0">
-      <thead>
-        <tr>
-          <th>{% trans "Action" %}</th>
-          <th>{% trans "Name" %}</th>
-          <th>{% trans "Comment" %}</th>
-          <th>{% trans "Email" %}</th>
-          <th>{% trans "URL" %}</th>
-          <th>{% trans "Authenticated?" %}</th>
-          <th>{% trans "IP Address" %}</th>
-          <th class="sorted desc">{% trans "Date posted" %}</th>
-        </tr>
-    </thead>
-    <tbody>
-      {% for comment in comments %}
-        <tr class="{% cycle 'row1' 'row2' %}">
-          <td class="actions">
-            <form action="{% url comments-approve comment.pk %}" method="post">
-              <input type="hidden" name="next" value="{% url comments-moderation-queue %}" />
-              <input class="approve submit" type="submit" name="submit" value="{% trans "Approve" %}" />
-            </form>
-            <form action="{% url comments-delete comment.pk %}" method="post">
-              <input type="hidden" name="next" value="{% url comments-moderation-queue %}" />
-              <input class="remove submit" type="submit" name="submit" value="{% trans "Remove" %}" />
-            </form>
-          </td>
-          <td>{{ comment.name }}</td>
-          <td>{{ comment.comment|truncatewords:"50" }}</td>
-          <td>{{ comment.email }}</td>
-          <td>{{ comment.url }}</td>
-          <td>
-            <img
-              src="{% admin_media_prefix %}img/admin/icon-{% if comment.user %}yes{% else %}no{% endif %}.gif"
-              alt="{% if comment.user %}{% trans "yes" %}{% else %}{% trans "no" %}{% endif %}"
-            />
-          </td>
-          <td>{{ comment.ip_address }}</td>
-          <td>{{ comment.submit_date|date:"F j, P" }}</td>
-        </tr>
-      {% endfor %}
-    </tbody>
-    </table>
-  </div>
-</div>
-{% endif %}
-{% endblock %}
diff --git a/django/contrib/comments/urls.py b/django/contrib/comments/urls.py
index 5caef9c..2bfefa3 100644
--- a/django/contrib/comments/urls.py
+++ b/django/contrib/comments/urls.py
@@ -7,7 +7,6 @@ urlpatterns = patterns('django.contrib.comments.views',
     url(r'^flagged/$',       'moderation.flag_done',        name='comments-flag-done'),
     url(r'^delete/(\d+)/$',  'moderation.delete',           name='comments-delete'),
     url(r'^deleted/$',       'moderation.delete_done',      name='comments-delete-done'),
-    url(r'^moderate/$',      'moderation.moderation_queue', name='comments-moderation-queue'),
     url(r'^approve/(\d+)/$', 'moderation.approve',          name='comments-approve'),
     url(r'^approved/$',      'moderation.approve_done',     name='comments-approve-done'),
 )
diff --git a/django/contrib/comments/views/moderation.py b/django/contrib/comments/views/moderation.py
index 3334b09..965ee34 100644
--- a/django/contrib/comments/views/moderation.py
+++ b/django/contrib/comments/views/moderation.py
@@ -8,6 +8,20 @@ from django.http import Http404
 from django.contrib import comments
 from django.contrib.comments import signals
 
+def base_flag(request, comment):
+    flag, created = comments.models.CommentFlag.objects.get_or_create(
+        comment = comment,
+        user    = request.user,
+        flag    = comments.models.CommentFlag.SUGGEST_REMOVAL
+        )
+    signals.comment_was_flagged.send(
+        sender  = comment.__class__,
+        comment = comment,
+        flag    = flag,
+        created = created,
+        request = request,
+        )
+
 #@login_required
 def flag(request, comment_id, next=None):
     """
@@ -22,18 +36,7 @@ def flag(request, comment_id, next=None):
 
     # Flag on POST
     if request.method == 'POST':
-        flag, created = comments.models.CommentFlag.objects.get_or_create(
-            comment = comment,
-            user    = request.user,
-            flag    = comments.models.CommentFlag.SUGGEST_REMOVAL
-        )
-        signals.comment_was_flagged.send(
-            sender  = comment.__class__,
-            comment = comment,
-            flag    = flag,
-            created = created,
-            request = request,
-        )
+        base_flag(request, comment)
         return next_redirect(request.POST.copy(), next, flag_done, c=comment.pk)
 
     # Render a form on GET
@@ -44,6 +47,22 @@ def flag(request, comment_id, next=None):
         )
 flag = login_required(flag)
 
+def base_delete(request, comment):
+    flag, created = comments.models.CommentFlag.objects.get_or_create(
+        comment = comment,
+        user    = request.user,
+        flag    = comments.models.CommentFlag.MODERATOR_DELETION
+        )
+    comment.is_removed = True
+    comment.save()
+    signals.comment_was_flagged.send(
+        sender  = comment.__class__,
+        comment = comment,
+        flag    = flag,
+        created = created,
+        request = request,
+        )
+
 #@permission_required("comments.delete_comment")
 def delete(request, comment_id, next=None):
     """
@@ -60,20 +79,7 @@ def delete(request, comment_id, next=None):
     # Delete on POST
     if request.method == 'POST':
         # Flag the comment as deleted instead of actually deleting it.
-        flag, created = comments.models.CommentFlag.objects.get_or_create(
-            comment = comment,
-            user    = request.user,
-            flag    = comments.models.CommentFlag.MODERATOR_DELETION
-        )
-        comment.is_removed = True
-        comment.save()
-        signals.comment_was_flagged.send(
-            sender  = comment.__class__,
-            comment = comment,
-            flag    = flag,
-            created = created,
-            request = request,
-        )
+        base_delete(request, comment)
         return next_redirect(request.POST.copy(), next, delete_done, c=comment.pk)
 
     # Render a form on GET
@@ -84,6 +90,25 @@ def delete(request, comment_id, next=None):
         )
 delete = permission_required("comments.can_moderate")(delete)
 
+def base_approve(request, comment):
+    flag, created = comments.models.CommentFlag.objects.get_or_create(
+        comment = comment,
+        user    = request.user,
+        flag    = comments.models.CommentFlag.MODERATOR_APPROVAL,
+        )
+
+    comment.is_removed = False
+    comment.is_public = True
+    comment.save()
+
+    signals.comment_was_flagged.send(
+        sender  = comment.__class__,
+        comment = comment,
+        flag    = flag,
+        created = created,
+        request = request,
+        )
+    
 #@permission_required("comments.can_moderate")
 def approve(request, comment_id, next=None):
     """
@@ -100,23 +125,7 @@ def approve(request, comment_id, next=None):
     # Delete on POST
     if request.method == 'POST':
         # Flag the comment as approved.
-        flag, created = comments.models.CommentFlag.objects.get_or_create(
-            comment = comment,
-            user    = request.user,
-            flag    = comments.models.CommentFlag.MODERATOR_APPROVAL,
-        )
-
-        comment.is_removed = False
-        comment.is_public = True
-        comment.save()
-
-        signals.comment_was_flagged.send(
-            sender  = comment.__class__,
-            comment = comment,
-            flag    = flag,
-            created = created,
-            request = request,
-        )
+        base_approve(request, comment)
         return next_redirect(request.POST.copy(), next, approve_done, c=comment.pk)
 
     # Render a form on GET
@@ -128,68 +137,6 @@ def approve(request, comment_id, next=None):
 
 approve = permission_required("comments.can_moderate")(approve)
 
-
-#@permission_required("comments.can_moderate")
-def moderation_queue(request):
-    """
-    Displays a list of unapproved comments to be approved.
-
-    Templates: `comments/moderation_queue.html`
-    Context:
-        comments
-            Comments to be approved (paginated).
-        empty
-            Is the comment list empty?
-        is_paginated
-            Is there more than one page?
-        results_per_page
-            Number of comments per page
-        has_next
-            Is there a next page?
-        has_previous
-            Is there a previous page?
-        page
-            The current page number
-        next
-            The next page number
-        pages
-            Number of pages
-        hits
-            Total number of comments
-        page_range
-            Range of page numbers
-
-    """
-    qs = comments.get_model().objects.filter(is_public=False, is_removed=False)
-    paginator = Paginator(qs, 100)
-
-    try:
-        page = int(request.GET.get("page", 1))
-    except ValueError:
-        raise Http404
-
-    try:
-        comments_per_page = paginator.page(page)
-    except InvalidPage:
-        raise Http404
-
-    return render_to_response("comments/moderation_queue.html", {
-        'comments' : comments_per_page.object_list,
-        'empty' : page == 1 and paginator.count == 0,
-        'is_paginated': paginator.num_pages > 1,
-        'results_per_page': 100,
-        'has_next': comments_per_page.has_next(),
-        'has_previous': comments_per_page.has_previous(),
-        'page': page,
-        'next': page + 1,
-        'previous': page - 1,
-        'pages': paginator.num_pages,
-        'hits' : paginator.count,
-        'page_range' : paginator.page_range
-    }, context_instance=template.RequestContext(request))
-
-moderation_queue = permission_required("comments.can_moderate")(moderation_queue)
-
 flag_done = confirmation_view(
     template = "comments/flagged.html",
     doc = 'Displays a "comment was flagged" success page.'
diff --git a/tests/regressiontests/comment_tests/tests/moderation_view_tests.py b/tests/regressiontests/comment_tests/tests/moderation_view_tests.py
index b9eadd7..047317b 100644
--- a/tests/regressiontests/comment_tests/tests/moderation_view_tests.py
+++ b/tests/regressiontests/comment_tests/tests/moderation_view_tests.py
@@ -159,31 +159,29 @@ class ApproveViewTests(CommentTestCase):
         response = self.client.get("/approved/", data={"c":pk})
         self.assertTemplateUsed(response, "comments/approved.html")
 
+def staff_status_for_user(username):
+    u = User.objects.get(username=username)
+    u.is_staff = True
+    comment_perms = Permission.objects.filter(codename__contains="comment")
+    for comment_perm in comment_perms:
+        if comment_perm.codename in ["add_comment", "change_comment", "delete_comment"]:
+            u.user_permissions.add(comment_perm)
+    u.save()
 
-class ModerationQueueTests(CommentTestCase):
+class AdminActionsTests(CommentTestCase):
+    urls = "regressiontests.comment_tests.urls_admin" 
 
-    def testModerationQueuePermissions(self):
-        """Only moderators can view the moderation queue"""
+    def testActionsNonModerator(self):
+        comments = self.createSomeComments()
+        staff_status_for_user("normaluser")
         self.client.login(username="normaluser", password="normaluser")
-        response = self.client.get("/moderate/")
-        self.assertEqual(response["Location"], "http://testserver/accounts/login/?next=/moderate/")
-
-        makeModerator("normaluser")
-        response = self.client.get("/moderate/")
-        self.assertEqual(response.status_code, 200)
+        response = self.client.get("/admin/comments/comment/")
+        self.assertEquals("approve_comments" in response.content, False)
 
-    def testModerationQueueContents(self):
-        """Moderation queue should display non-public, non-removed comments."""
-        c1, c2, c3, c4 = self.createSomeComments()
+    def testActionsModerator(self):
+        comments = self.createSomeComments()
+        staff_status_for_user("normaluser")
         makeModerator("normaluser")
         self.client.login(username="normaluser", password="normaluser")
-
-        c1.is_public = c2.is_public = False
-        c1.save(); c2.save()
-        response = self.client.get("/moderate/")
-        self.assertEqual(list(response.context[0]["comments"]), [c1, c2])
-
-        c2.is_removed = True
-        c2.save()
-        response = self.client.get("/moderate/")
-        self.assertEqual(list(response.context[0]["comments"]), [c1])
+        response = self.client.get("/admin/comments/comment/")
+        self.assertEquals("approve_comments" in response.content, True)
diff --git a/tests/regressiontests/comment_tests/urls_admin.py b/tests/regressiontests/comment_tests/urls_admin.py
new file mode 100644
index 0000000..9e43d34
--- /dev/null
+++ b/tests/regressiontests/comment_tests/urls_admin.py
@@ -0,0 +1,8 @@
+from django.conf.urls.defaults import *
+from django.contrib import admin
+
+admin.autodiscover()
+
+urlpatterns = patterns('',
+    (r'^admin/', include(admin.site.urls)),
+)
