Index: libtaskotron/directives/bodhi_directive.py
===================================================================
--- libtaskotron/directives/bodhi_directive.py
+++ libtaskotron/directives/bodhi_directive.py
@@ -25,7 +25,7 @@
       Downloads rpms of builds from update specified by its name or id
       format: "bodhi:
                  action: download
-                 bodhi-id: <name or id of update>
+                 bodhi_id: <name or id of update>
                  arch=<desired arch>"
     """
     def __init__(self, bodhi_api=None, koji_session=None):
@@ -73,7 +73,7 @@
             if 'bodhi_id' not in input_data or 'arch' not in input_data:
                 detected_args = ', '.join(input_data.keys())
                 raise TaskotronDirectiveError("The bodhi directive 'download'"
-                   " requires both 'bodhi-id' and"
+                   " requires both 'bodhi_id' and"
                    " 'arch' arguments. Detected arguments: %s" % detected_args)
 
             workdir = env_data['workdir']
Index: libtaskotron/runner.py
===================================================================
--- libtaskotron/runner.py
+++ libtaskotron/runner.py
@@ -139,22 +139,38 @@
                         If omitted, defaults to noarch. If every architechtures are wanted
                         use all.
                         """)
-    parser.add_argument("-e", "--envr", help="envr to be used as input")
-    parser.add_argument("-t", "--tag", help="koji tag to be used as input")
-    parser.add_argument("-b", "--bodhi-id",
-                        help="""
-                        Identification of bodhi update. Update id and name could be used.
-                        """)
+    parser.add_argument("-i", "--item", help="item to be used as input")
+    parser.add_argument("-t", "--type",
+                        choices=["bodhi_id", "koji_build", "koji_tag"],
+                        help="Type of input object")
     return parser
 
 
+def process_args(args):
+    """ Transforms (item, item_type) pairs from input args into specific data
+    types that can be used by tasks.
+
+    :param args: dictionary of raw arguments
+    :type args: dict
+    :returns: dict of args with appended specific data
+    """
+
+    if args['type'] == 'koji_build':
+        args['envr'] = args['item']
+    if args['type'] == 'bodhi_id':
+        args['bodhi_id'] = args['item']
+    if args['type'] == 'koji_tag':
+        args['tag'] = args['item']
+    return args
+
+
 def main():
     parser = get_argparser()
     args = parser.parse_args()
 
     logger.init(level=logging.DEBUG)
 
-    arg_data = vars(args)
+    arg_data = process_args(vars(args))
     arg_data['taskfile'] = args.task[0]
 
     task_data = taskyaml.parse_yaml_from_file(arg_data['taskfile'])
Index: testing/test_runner.py
===================================================================
--- testing/test_runner.py
+++ testing/test_runner.py
@@ -1,88 +1,96 @@
 import pytest
 import os
 import sys
+import copy
 
 from libtaskotron import runner
 from libtaskotron.exceptions import TaskotronYamlError
 
 
 class TestRunnerInputVerify():
     def test_yamlrunner_valid_input(self):
-        ref_cmd = '-e foo-1.2-3.fc99 -a x86_64 footask.yml'
+        ref_cmd = '-i foo-1.2-3.fc99 -t koji_build -a x86_64 footask.yml'
         ref_argdata = {'input': {'args': 'envr,arch'}}
 
         test_parser = runner.get_argparser()
-        test_args = vars(test_parser.parse_args(ref_cmd.split()))
+        test_input_args = vars(test_parser.parse_args(ref_cmd.split()))
+        test_args = runner.process_args(test_input_args)
 
         test_runner = runner.Runner(ref_argdata, test_args)
 
         test_runner._validate_input()
 
     def test_yamlrunner_missing_input(self):
-        ref_cmd = '-e foo-1.2-3.fc99 footask.yml'
+        ref_cmd = '-i foo-1.2-3.fc99 -t koji_build footask.yml'
         ref_inputspec = {}
 
         test_parser = runner.get_argparser()
-        test_args = vars(test_parser.parse_args(ref_cmd.split()))
+        test_input_args = vars(test_parser.parse_args(ref_cmd.split()))
+        test_args = runner.process_args(test_input_args)
 
         test_runner = runner.Runner(ref_inputspec, test_args)
 
         test_runner._validate_input()
 
     def test_yamlrunner_fails_empty_input(self):
-        ref_cmd = '-e foo-1.2-3.fc99 footask.yml'
+        ref_cmd = '-i foo-1.2-3.fc99 -t koji_build footask.yml'
         ref_inputspec = {'input': None}
 
         test_parser = runner.get_argparser()
-        test_args = vars(test_parser.parse_args(ref_cmd.split()))
+        test_input_args = vars(test_parser.parse_args(ref_cmd.split()))
+        test_args = runner.process_args(test_input_args)
 
         test_runner = runner.Runner(ref_inputspec, test_args)
 
         with pytest.raises(TaskotronYamlError):
             test_runner._validate_input()
 
     def test_yamlrunner_fails_empty_arg(self):
-        ref_cmd = '-e foo-1.2-3.fc99 footask.yml'
+        ref_cmd = '-i foo-1.2-3.fc99 -t koji_build footask.yml'
         ref_inputspec = {'input': {'args': None}}
 
         test_parser = runner.get_argparser()
-        test_args = vars(test_parser.parse_args(ref_cmd.split()))
+        test_input_args = vars(test_parser.parse_args(ref_cmd.split()))
+        test_args = runner.process_args(test_input_args)
 
         test_runner = runner.Runner(ref_inputspec, test_args)
 
         with pytest.raises(TaskotronYamlError):
             test_runner._validate_input()
 
     def test_yamlrunner_fails_missing_arg(self):
-        ref_cmd = '-e foo-1.2-3.fc99 footask.yml'
+        ref_cmd = '-i foo-1.2-3.fc99 -t koji_build footask.yml'
         ref_inputspec = {'input': 'other_item'}
 
         test_parser = runner.get_argparser()
-        test_args = vars(test_parser.parse_args(ref_cmd.split()))
+        test_input_args = vars(test_parser.parse_args(ref_cmd.split()))
+        test_args = runner.process_args(test_input_args)
 
         test_runner = runner.Runner(ref_inputspec, test_args)
 
         with pytest.raises(TaskotronYamlError):
             test_runner._validate_input()
 
     def test_yamlrunner_fails_undefined_arg(self):
-        ref_cmd = '-e foo-1.2-3.fc99 footask.yml'
+        ref_cmd = '-i foo-1.2-3.fc99 -t koji_build footask.yml'
         ref_inputspec = {'input': {'args': 'nonexistent_input_arg'}}
 
         test_parser = runner.get_argparser()
-        test_args = vars(test_parser.parse_args(ref_cmd.split()))
+        test_input_args = vars(test_parser.parse_args(ref_cmd.split()))
+        test_args = runner.process_args(test_input_args)
 
         test_runner = runner.Runner(ref_inputspec, test_args)
 
         with pytest.raises(TaskotronYamlError):
             test_runner._validate_input()
 
     def test_yamlrunner_fails_input_is_string(self):
-        ref_cmd = '-e foo-1.2-3.fc99 footask.yml'
+        ref_cmd = '-i foo-1.2-3.fc99 -t koji_build footask.yml'
         ref_inputspec = {'input': {'args'}}
 
         test_parser = runner.get_argparser()
-        test_args = vars(test_parser.parse_args(ref_cmd.split()))
+        test_input_args = vars(test_parser.parse_args(ref_cmd.split()))
+        test_args = runner.process_args(test_input_args)
 
         test_runner = runner.Runner(ref_inputspec, test_args)
 
@@ -302,4 +310,43 @@
 
         assert test_rendered_action['dummy']['msg'] == ref_message
 
+class TestRunnerProcessArgs():
 
+    def test_process_args_koji_build(self):
+        ref_input = { 'arch': 'x86_64',
+                      'item': 'foo-1.2-3.fc99',
+                      'type': 'koji_build',
+                      'task': 'sometask.yml'}
+
+        ref_args = copy.deepcopy(ref_input)
+        ref_args['envr'] = 'foo-1.2-3.fc99'
+
+        test_args = runner.process_args(ref_input)
+
+        assert test_args == ref_args
+
+    def test_process_args_bodhi_id(self):
+        ref_input = { 'arch': 'x86_64',
+                      'item': 'foo-1.2-3.fc99',
+                      'type': 'bodhi_id',
+                      'task': 'sometask.yml'}
+
+        ref_args = copy.deepcopy(ref_input)
+        ref_args['bodhi_id'] = 'foo-1.2-3.fc99'
+
+        test_args = runner.process_args(ref_input)
+
+        assert test_args == ref_args
+
+    def test_process_args_koji_tag(self):
+        ref_input = { 'arch': 'x86_64',
+                      'item': 'dist-fc99-updates',
+                      'type': 'koji_tag',
+                      'task': 'sometask.yml'}
+
+        ref_args = copy.deepcopy(ref_input)
+        ref_args['tag'] = 'dist-fc99-updates'
+
+        test_args = runner.process_args(ref_input)
+
+        assert test_args == ref_args
\ No newline at end of file
