Index: tools/gdb/utils-gdb.py
===================================================================
--- tools/gdb/utils-gdb.py	(revision 1cfdee94f316eb368ff361b58a931a686ee54aba)
+++ tools/gdb/utils-gdb.py	(revision bb75b4eb5d1b016e0bedea943435055a867301fe)
@@ -74,10 +74,6 @@
     return str_addr[:ending_addr_index].strip()
 
-def print_usage(msg):
-    """
-    Print out usage message
-    @msg: str
-    """
-    print('Usage: ' + msg)
+def print_usage(obj):
+    print(obj.__doc__)
 
 def parse(args):
@@ -150,27 +146,23 @@
 
 class Clusters(gdb.Command):
-    """Print out the list of available clusters"""
-    usage_msg = 'clusters'
-    str_format = ''
+    """Cforall: Display currently known clusters
+Usage:
+    info clusters                 : print out all the clusters
+"""
 
     def __init__(self):
-        super(Clusters, self).__init__('clusters', gdb.COMMAND_USER)
+        super(Clusters, self).__init__('info clusters', gdb.COMMAND_USER)
 
     def print_cluster(self, cluster_name, cluster_address):
         print('{:>20}  {:>20}'.format(cluster_name, cluster_address))
 
+    #entry point from gdb
     def invoke(self, arg, from_tty):
-        """
-        Iterate through a circular linked list of clusters and print out its
-        name along with address associated to each cluster
-        @arg: str
-        @from_tty: bool
-        """
         if not is_cforall():
             return
 
-        argv = parse(arg)
-        if len(argv) != 0:
-            print_usage('clusters')
+        if arg:
+            print("info clusters does not take arguments")
+            print_usage(self)
             return
 
@@ -192,23 +184,21 @@
 ############
 class Processors(gdb.Command):
-    """Display a list of all info about all available processors on a particular cluster"""
-    usage_msg = """
-    processors                 : print out all the processors in the Main Cluster
-    processors <cluster_name>  : print out all processors in a given cluster"""
+    """Cforall: Display currently known processors
+Usage:
+    info processors                 : print out all the processors in the Main Cluster
+    info processors <cluster_name>  : print out all processors in a given cluster
+"""
 
     def __init__(self):
-        super(Processors, self).__init__('processors', gdb.COMMAND_USER)
+        super(Processors, self).__init__('info processors', gdb.COMMAND_USER)
 
     def print_processor(self, name, status, pending, address):
-        print('{:>20}  {:>20}  {:>13}  {:>20}'.format(name, status, pending, address))
-
-    def iterate_procs(self, root):
+        print('{:>20}  {:>11}  {:>13}  {:>20}'.format(name, status, pending, address))
+
+    def iterate_procs(self, root, active):
         if root == 0x0:
-            print('{:>20}'.format("None"))
             return
 
         cfa_t = get_cfa_types()
-
-        self.print_processor('Name', 'Termination Status', 'Yield Pending', 'Address')
         curr = root
 
@@ -217,6 +207,9 @@
             should_stop = processor['_X12do_terminateVb_1']
             stop_count  = processor['_X10terminatedS9semaphore_1']['_X5counti_1']
-            status_str  = 'Running' if not should_stop else 'Last Thread' if stop_count >= 0 else 'Terminating'
-            status      = '{}({},{})'.format(status_str, should_stop, stop_count)
+            if not should_stop:
+                status = 'Active' if active else 'Idle'
+            else:
+                status_str  = 'Last Thread' if stop_count >= 0 else 'Terminating'
+                status      = '{}({},{})'.format(status_str, should_stop, stop_count)
 
             self.print_processor(processor['_X4namePKc_1'].string(),
@@ -229,30 +222,17 @@
                 break
 
-        print()
-
+    #entry point from gdb
     def invoke(self, arg, from_tty):
-        """
-        Iterate through a circular linked list of tasks and print out all
-        info about each processor in that cluster
-        @arg: str
-        @from_tty: bool
-        """
         if not is_cforall():
             return
 
+        cluster = lookup_cluster(arg if arg else None)
+
+        if not cluster:
+            print("No Cluster matching arguments found")
+            return
+
         cfa_t = get_cfa_types()
-
-        argv = parse(arg)
-        if len(argv) > 1:
-            print_usage(self.usage_msg)
-            return
-
-        cluster = lookup_cluster(argv[0] if len(argv) > 0 else None)
-
-        if cluster == 0x0 or cluster == None:
-            print("No Cluster matching arguments found")
-            return
-
-        print('Cluster {}({})'.format(cluster['_X4namePKc_1'].string(), cluster.cast(cfa_t.cluster_ptr)))
+        print('Cluster: "{}"({})'.format(cluster['_X4namePKc_1'].string(), cluster.cast(cfa_t.cluster_ptr)))
 
         active_root = cluster.cast(cfa_t.cluster_ptr) \
@@ -266,12 +246,74 @@
                 .cast(cfa_t.processor_ptr)
 
-        print("Active Processors")
-        self.iterate_procs(active_root)
-
-        print("\nIdle Processors")
-        self.iterate_procs(idle_root)
+        if idle_root != 0x0 or active_root != 0x0:
+            self.print_processor('Name', 'Status', 'Pending Yield', 'Address')
+            self.iterate_procs(active_root, True)
+            self.iterate_procs(idle_root, False)
+        else:
+            print("No processors on cluster")
+
+        print()
 
 ############
 class Threads(gdb.Command):
+    def __init__(self):
+        # The first parameter of the line below is the name of the command. You
+        # can call it 'uc++ task'
+        super(Threads, self).__init__('info cfathreads', gdb.COMMAND_USER)
+
+    def print_usage(self):
+        print_usage("""
+    cfathread                            : print userCluster tasks, application tasks only
+    cfathread all                        : print all clusters, all tasks
+    cfathread <clusterName>              : print cluster tasks, application tasks only
+    """)
+
+    def invoke(self, arg, from_tty):
+        """
+        @arg: str
+        @from_tty: bool
+        """
+        if not is_cforall():
+            return
+
+        argv = parse(arg)
+        print(argv)
+        if len(argv) == 0:
+            cluster = lookup_cluster()
+            if not cluster:
+                print("Could not find Main Cluster")
+                return
+
+            # only tasks and main
+            self.print_threads_by_cluster(cluster, False)
+
+        elif len(argv) == 1:
+            if argv[0] == 'help':
+                self.print_usage()
+            # print tasks
+            elif argv[0] == 'all':
+                self.print_all_threads() # all tasks, all clusters
+            else:
+                """
+                Print out all the tasks available in the specified cluster
+                @cluster_name: str
+                """
+                print("cfathread by name")
+                cluster = lookup_cluster(argv[0])
+                if not cluster:
+                    return
+
+                # all tasks, specified cluster
+                self.print_threads_by_cluster(cluster, True)
+
+        elif len(argv) == 2:
+            # push task
+            self.pushtask_by_id(argv[0], argv[1]) # by id, specified cluster
+        else:
+            print('Invalid arguments')
+            self.print_usage()
+
+############
+class Thread(gdb.Command):
     def __init__(self):
         # The first parameter of the line below is the name of the command. You
