diff --git a/rbtools/commands/list_repos.py b/rbtools/commands/list_repos.py
new file mode 100644
index 0000000000000000000000000000000000000000..b43349dbb249cb0f1fdf8d63d9a666f175e40645
--- /dev/null
+++ b/rbtools/commands/list_repos.py
@@ -0,0 +1,62 @@
+from __future__ import print_function, unicode_literals
+
+from rbtools.commands import Command, CommandError
+from six.moves import input
+
+
+def pretty_print_table(rows, display_header=True):
+    nb_cols = len(rows[0])
+    nb_rows = len(rows)
+
+    # Compute max item length for each column.
+    col_len = []
+    for i in range(nb_cols):
+        col_len.append(len(max([x[i] for x in rows],
+                               key=lambda x: len(str(x)))))
+
+    # Setup data_format depending on each column length and pipe delimiter key.
+    pattern = ' | '.join(['%%-%ds' % length for length in col_len])
+
+    if display_header:
+        # Setup separator_line to split header and data.
+        separator_line = "-+-".join(['-' * n for n in col_len])
+        print(pattern % tuple(rows[0]))
+        print(separator_line)
+
+    for i in range(1, nb_rows):
+        print(pattern % tuple(rows[i]))
+
+
+class ListRepos(Command):
+    """List repositories on reviewboard server."""
+    name = "list-repos"
+    author = 'The Review Board Project'
+    description = 'Print a list of configured repositories.'
+    option_list = [
+        Command.server_options
+    ]
+
+    def main(self, *args):
+        REPOSITORY_FIELDS = ['tool', 'name', 'path']
+        if len(args) != 0:
+            raise CommandError("This command does not support arguments!")
+
+        server = self.options.server
+        if not server:
+            server = input('Enter the Review Board server URL: ')
+
+        api_client, api_root = self.get_api(server)
+        repositories = api_root.get_repositories(
+            only_fields=','.join(REPOSITORY_FIELDS),
+            only_links='')
+
+        print("Repositories on %s:" % server)
+        # Set a table containing one row per repository, the first one is a
+        # header.
+        repository_table = []
+        repository_table.append(REPOSITORY_FIELDS)
+        for repo in repositories.all_items:
+            repo_line = [repo[x] for x in REPOSITORY_FIELDS]
+            repository_table.append(repo_line)
+
+        pretty_print_table(repository_table)
diff --git a/setup.py b/setup.py
index edf0e153ac3110945530e8002e1866e887b84c1d..5390015cba89dcfa5b084145b71c00326b79dab7 100755
--- a/setup.py
+++ b/setup.py
@@ -80,6 +80,7 @@ rb_commands = [
     'close = rbtools.commands.close:Close',
     'diff = rbtools.commands.diff:Diff',
     'land = rbtools.commands.land:Land',
+    'list-repos = rbtools.commands.list_repos:ListRepos',
     'list-repo-types = rbtools.commands.list_repo_types:ListRepoTypes',
     'login = rbtools.commands.login:Login',
     'logout = rbtools.commands.logout:Logout',
