class ArithmeticRunner(base.Runner):
+    '''Run a scenario arithmetically stepping an input value
+
+  Parameters
+    interval - time to wait between each scenario invocation
+        type:    int
+        unit:    seconds
+        default: 1 sec
+    name - name of scenario option that will be increased for each invocation
+        type:    string
+        unit:    na
+        default: none
+    start - value to use in first invocation of scenario
+        type:    int
+        unit:    na
+        default: none
+    step - value added to start value in next invocation of scenario
+        type:    int
+        unit:    na
+        default: none
+    stop - value indicating end of invocation
+        type:    int
+        unit:    na
+        default: none
+    '''
 
     __execution_type__ = 'Arithmetic'
 
 
     runners = []
 
     @staticmethod
-    def _get_cls(runner_type):
+    def get_cls(runner_type):
+        '''return class of specified type'''
         for runner in utils.itersubclasses(Runner):
             if runner_type == runner.__execution_type__:
                 return runner
         raise RuntimeError("No such runner_type %s" % runner_type)
 
+    @staticmethod
+    def get_types():
+        '''return a list of known runner type (class) names'''
+        types = []
+        for runner in utils.itersubclasses(Runner):
+            types.append(runner)
+        return types
+
     @staticmethod
     def get(config):
         """Returns instance of a scenario runner for execution type.
                 args=(config["output_filename"], Runner.queue))
             Runner.dump_process.start()
 
-        return Runner._get_cls(config["type"])(config, Runner.queue)
+        return Runner.get_cls(config["type"])(config, Runner.queue)
 
     @staticmethod
     def release(runner):
 
 
 
 class DurationRunner(base.Runner):
-
+    '''Run a scenario for a certain amount of time
+
+If the scenario ends before the time has elapsed, it will be started again.
+
+  Parameters
+    duration - amount of time the scenario will be run for
+        type:    int
+        unit:    seconds
+        default: 1 sec
+    interval - time to wait between each scenario invocation
+        type:    int
+        unit:    seconds
+        default: 1 sec
+    '''
     __execution_type__ = 'Duration'
 
     def _run_benchmark(self, cls, method, scenario_args):
 
         ''' default impl for scenario teardown '''
         pass
 
+    @staticmethod
+    def get_types():
+        '''return a list of known runner type (class) names'''
+        scenarios = []
+        for scenario in utils.itersubclasses(Scenario):
+            scenarios.append(scenario)
+        return scenarios
+
+    @staticmethod
+    def get_cls(scenario_type):
+        '''return class of specified type'''
+        for scenario in utils.itersubclasses(Scenario):
+            if scenario_type == scenario.__scenario_type__:
+                return scenario
+
+        raise RuntimeError("No such scenario type %s" % scenario_type)
+
     @staticmethod
     def get(scenario_type):
         """Returns instance of a scenario runner for execution type.
 
 
 
 class Iperf(base.Scenario):
-    """Executes an iperf3 benchmark between two hosts"""
+    """Execute iperf3 between two hosts
+
+By default TCP is used but UDP can also be configured.
+For more info see http://software.es.net/iperf
+
+  Parameters
+    bytes - number of bytes to transmit
+      only valid with a non duration runner, mutually exclusive with blockcount
+        type:    int
+        unit:    bytes
+        default: 56
+    udp - use UDP rather than TCP
+        type:    bool
+        unit:    na
+        default: false
+    nodelay - set TCP no delay, disabling Nagle's Algorithm
+        type:    bool
+        unit:    na
+        default: false
+    blockcount - number of blocks (packets) to transmit,
+      only valid with a non duration runner, mutually exclusive with bytes
+        type:    int
+        unit:    bytes
+        default: -
+    """
     __scenario_type__ = "Iperf3"
 
     def __init__(self, context):
 
 
 
 class Ping(base.Scenario):
-    """Executes a ping benchmark between two hosts"""
+    """Execute ping between two hosts
+
+  Parameters
+    packetsize - number of data bytes to send
+        type:    int
+        unit:    bytes
+        default: 56
+    """
+
     __scenario_type__ = "Ping"
 
     TARGET_SCRIPT = 'ping_benchmark.bash'
 
 
 
 class Pktgen(base.Scenario):
-    """Executes a pktgen benchmark between two hosts"""
+    """Execute pktgen between two hosts
+
+  Parameters
+    TBD
+    """
     __scenario_type__ = "Pktgen"
 
     TARGET_SCRIPT = 'pktgen_benchmark.bash'
 
+##############################################################################
+# Copyright (c) 2015 Ericsson AB and others.
+#
+# All rights reserved. This program and the accompanying materials
+# are made available under the terms of the Apache License, Version 2.0
+# which accompanies this distribution, and is available at
+# http://www.apache.org/licenses/LICENSE-2.0
+##############################################################################
+
+
+def print_hbar(barlen):
+    '''print to stdout a horizontal bar'''
+    print("+"),
+    print("-" * barlen),
+    print("+")
 
 from argparse import RawDescriptionHelpFormatter
 
 from yardstick.cmd.commands import task
+from yardstick.cmd.commands import runner
+from yardstick.cmd.commands import scenario
 
 
 class YardstickCLI():
 
     # Command categories
     categories = {
-        'task': task.TaskCommands
+        'task': task.TaskCommands,
+        'runner': runner.RunnerCommands,
+        'scenario': scenario.ScenarioCommands
     }
 
     def __init__(self):
 
--- /dev/null
+##############################################################################
+# Copyright (c) 2015 Ericsson AB and others.
+#
+# All rights reserved. This program and the accompanying materials
+# are made available under the terms of the Apache License, Version 2.0
+# which accompanies this distribution, and is available at
+# http://www.apache.org/licenses/LICENSE-2.0
+##############################################################################
+
+""" Handler for yardstick command 'runner' """
+
+from yardstick.benchmark.runners.base import Runner
+from yardstick.common.utils import cliargs
+from yardstick.cmd import print_hbar
+
+
+class RunnerCommands(object):
+    '''Runner commands.
+
+       Set of commands to discover and display runner types.
+    '''
+
+    def do_list(self, args):
+        '''List existing runner types'''
+        types = Runner.get_types()
+        print_hbar(78)
+        print("| %-16s | %-60s" % ("Type", "Description"))
+        print_hbar(78)
+        for rtype in types:
+            print "| %-16s | %-60s" % (rtype.__execution_type__,
+                                       rtype.__doc__.split("\n")[0])
+        print_hbar(78)
+
+    @cliargs("type", type=str, help="runner type", nargs=1)
+    def do_show(self, args):
+        '''Show details of a specific runner type'''
+        rtype = Runner.get_cls(args.type[0])
+        print rtype.__doc__
 
--- /dev/null
+##############################################################################
+# Copyright (c) 2015 Ericsson AB and others.
+#
+# All rights reserved. This program and the accompanying materials
+# are made available under the terms of the Apache License, Version 2.0
+# which accompanies this distribution, and is available at
+# http://www.apache.org/licenses/LICENSE-2.0
+##############################################################################
+
+""" Handler for yardstick command 'scenario' """
+
+from yardstick.benchmark.scenarios.base import Scenario
+from yardstick.common.utils import cliargs
+from yardstick.cmd import print_hbar
+
+
+class ScenarioCommands(object):
+    '''Scenario commands.
+
+       Set of commands to discover and display scenario types.
+    '''
+
+    def do_list(self, args):
+        '''List existing scenario types'''
+        types = Scenario.get_types()
+        print_hbar(78)
+        print("| %-16s | %-60s" % ("Type", "Description"))
+        print_hbar(78)
+        for stype in types:
+            print("| %-16s | %-60s" % (stype.__scenario_type__,
+                                       stype.__doc__.split("\n")[0]))
+        print_hbar(78)
+
+    @cliargs("type", type=str, help="runner type", nargs=1)
+    def do_show(self, args):
+        '''Show details of a specific scenario type'''
+        stype = Scenario.get_cls(args.type[0])
+        print stype.__doc__