diff --git a/snf-astakos-app/astakos/im/management/commands/project-list.py b/snf-astakos-app/astakos/im/management/commands/project-list.py
index 1f2a87c45e53a5545fc34f1815036bd4c91a9b38..aa3e9817a4e4c3d63568985d3099fc140246504d 100644
--- a/snf-astakos-app/astakos/im/management/commands/project-list.py
+++ b/snf-astakos-app/astakos/im/management/commands/project-list.py
@@ -33,15 +33,13 @@
 
 from optparse import make_option
 
-from snf_django.management.commands import SynnefoCommand, CommandError
+from snf_django.management.commands import ListCommand
 
 from astakos.im.models import Project, ProjectApplication
-from django.db.models import Q
-from snf_django.management import utils
-from ._common import is_uuid, is_email
+from ._common import is_uuid
 
 
-class Command(SynnefoCommand):
+class Command(ListCommand):
     help = """List projects and project status.
 
     Project status can be one of:
@@ -66,7 +64,10 @@ class Command(SynnefoCommand):
 
       Deleted              an uninitialized, deleted project"""
 
-    option_list = SynnefoCommand.option_list + (
+    object_class = Project
+    select_related = ["last_application", "owner"]
+
+    option_list = ListCommand.option_list + (
         make_option('--new',
                     action='store_true',
                     dest='new',
@@ -88,69 +89,58 @@ class Command(SynnefoCommand):
                     dest='deleted',
                     default=False,
                     help="Also so cancelled/terminated projects"),
-        make_option('--name',
-                    dest='name',
-                    help='Filter projects by name'),
-        make_option('--owner',
-                    dest='owner',
-                    help='Filter projects by owner\'s email or uuid'),
     )
 
-    def handle(self, *args, **options):
+    def get_owner(project):
+        return project.owner.email if project.owner else None
 
-        flt = Q()
-        owner = options['owner']
-        if owner:
-            flt &= filter_by_owner(owner)
+    def get_status(project):
+        return project.state_display()
 
-        name = options['name']
-        if name:
-            flt &= Q(realname=name)
+    def get_pending_app(project):
+        app = project.last_application
+        return app.id if app and app.state == app.PENDING else ""
+
+    FIELDS = {
+        "id": ("uuid", "Project ID"),
+        "name": ("realname", "Project Name"),
+        "owner": (get_owner, "Project Owner"),
+        "status": (get_status, "Project Status"),
+        "pending_app": (get_pending_app,
+                        "An application pending for the project"),
+    }
+
+    fields = ["id", "name", "owner", "status", "pending_app"]
+
+    def handle_args(self, *args, **options):
+        try:
+            name_filter = self.filters.pop("name")
+            self.filters["realname"] = name_filter
+        except KeyError:
+            pass
+
+        try:
+            owner_filter = self.filters.pop("owner")
+            if owner_filter is not None:
+                if is_uuid(owner_filter):
+                    self.filters["owner__uuid"] = owner_filter
+                else:
+                    self.filters["owner__email"] = owner_filter
+        except KeyError:
+            pass
 
         if not options['deleted']:
-            flt &= ~Q(state__in=Project.SKIP_STATES)
-
-        pending = Q(last_application__isnull=False,
-                    last_application__state=ProjectApplication.PENDING)
+            self.excludes["state__in"] = Project.SKIP_STATES
 
-        if options['pending']:
-            flt &= pending
+        if options["pending"]:
+            self.filter_pending()
         else:
             if options['new']:
-                flt &= pending & Q(state=Project.UNINITIALIZED)
+                self.filter_pending()
+                self.filters["state"] = Project.UNINITIALIZED
             if options['modified']:
-                flt &= pending & Q(state__in=Project.INITIALIZED_STATES)
-
-        projects = Project.objects.\
-            select_related("last_application", "owner").filter(flt)
-
-        labels = ('ProjID', 'Name', 'Owner', 'Status', 'Pending AppID')
+                self.filter_pending()
+                self.filters["state__in"] = Project.INITIALIZED_STATES
 
-        info = project_info(projects)
-        utils.pprint_table(self.stdout, info, labels,
-                           options["output_format"])
-
-
-def filter_by_owner(s):
-    if is_email(s):
-        return Q(owner__email=s)
-    if is_uuid(s):
-        return Q(owner__uuid=s)
-    raise CommandError("Expecting either email or uuid.")
-
-
-def project_info(projects):
-    l = []
-    for project in projects:
-        status = project.state_display()
-        app = project.last_application
-        pending_appid = app.id if app and app.state == app.PENDING else ""
-
-        t = (project.uuid,
-             project.realname,
-             project.owner.email if project.owner else None,
-             status,
-             pending_appid,
-             )
-        l.append(t)
-    return l
+    def filter_pending(self):
+        self.filters["last_application__state"] = ProjectApplication.PENDING