diff --git a/libtaskotron/directives/bodhi_directive.py b/libtaskotron/directives/bodhi_directive.py
--- a/libtaskotron/directives/bodhi_directive.py
+++ b/libtaskotron/directives/bodhi_directive.py
@@ -27,13 +27,16 @@
   arch:
     required: true
     description: |
-      a list of architectures for which to download RPMs. In addition to
-      architectures supported by Taskotron by default, ``src`` is supported as
-      well.
+      a list of architectures for which to download RPMs.
 
       Note: ``noarch`` RPMs are always automatically downloaded even when not
-      requested, unless ``src`` is the only architecture requested.
+      requested, unless ``arch=[]`` and ``src=True``.
     type: list of str
+  src:
+    required: false
+    description: download also ``src`` RPM files
+    type: bool
+    default: False
 returns: |
   A dictionary containing following items:
 
@@ -43,6 +46,8 @@
   * :class:`.TaskotronDirectiveError`: if no update with ``bodhi_id`` has been
     found
   * :class:`.TaskotronRemoteError`: if downloading failed
+  * :class:`.TaskotronValueError`: if ``arch=[]`` and ``src=False``, therefore
+    there is nothing to download
 version_added: 0.4
 """
 
@@ -87,7 +92,7 @@
         else:
             self.koji_session = KojiClient()
 
-    def action_download(self, update, arches, workdir):
+    def action_download(self, update, arches, src, workdir):
 
         res = self.bodhi_api.query_update(update)
 
@@ -100,7 +105,7 @@
         downloaded_rpms = []
 
         for nvr in nvrs:
-            res = self.koji_session.get_nvr_rpms(nvr, workdir, arches)
+            res = self.koji_session.get_nvr_rpms(nvr, workdir, arches, src=src)
             downloaded_rpms.extend(res)
 
         return downloaded_rpms
@@ -129,12 +134,14 @@
                 arches = Arches.base + ['noarch']
             else:
                 arches = input_data['arch']
-            if 'noarch' not in arches and arches != ['src']:
+            if arches and ('noarch' not in arches):
                 arches.append('noarch')
 
+            src = input_data.get('src', False)
+
             log.info("getting rpms for update %s (%s) and downloading to %s",
                       update, arches, workdir)
 
-            output_data['downloaded_rpms'] = self.action_download(update, arches, workdir)
+            output_data['downloaded_rpms'] = self.action_download(update, arches, src, workdir)
 
         return output_data
diff --git a/testing/test_bodhi_directive.py b/testing/test_bodhi_directive.py
--- a/testing/test_bodhi_directive.py
+++ b/testing/test_bodhi_directive.py
@@ -9,7 +9,7 @@
 from dingus import Dingus
 
 from libtaskotron.directives import bodhi_directive
-from libtaskotron.exceptions import TaskotronDirectiveError
+from libtaskotron.exceptions import TaskotronDirectiveError, TaskotronValueError
 
 class TestBodhiDownloads():
 
@@ -82,10 +82,11 @@
 
     def test_action_download_source(self):
         '''Test download of source packages'''
-        self.ref_arch = ['src']
+        self.ref_arch = []
         self.ref_input = {'action': 'download',
                           'arch': self.ref_arch,
-                          'bodhi_id': self.ref_bodhi_id
+                          'bodhi_id': self.ref_bodhi_id,
+                          'src': True
                           }
 
         stub_bodhi = Dingus(query_update__returns = self.ref_update)
@@ -95,11 +96,11 @@
 
         test_bodhi.process(self.ref_input, self.ref_envdata)
 
-        getrpms_calls = stub_koji.calls()
-        req_arches = map(lambda x: x[1][2], getrpms_calls)
+        getrpm_calls = stub_koji.calls()
 
         # checks whether all get_nvr_rpms calls demanded only source pkgs
-        assert all(map(lambda x: x == ['src'], req_arches))
+        assert all(map(lambda x: x[1][2] == [], getrpm_calls))
+        assert all(map(lambda x: x[2]['src'], getrpm_calls))
 
     def test_action_download_multiple_arch(self):
         '''Test download of multiple arches packages'''
@@ -195,3 +196,19 @@
 
         with pytest.raises(TaskotronDirectiveError):
             test_bodhi.process(ref_input, self.ref_envdata)
+
+    def test_empty_arch_no_src(self):
+        self.ref_arch = []
+        self.ref_input = {'action': 'download',
+                          'arch': self.ref_arch,
+                          'bodhi_id': self.ref_bodhi_id,
+                          'src': False
+                          }
+
+        stub_bodhi = Dingus(query_update__returns=self.ref_update)
+        stub_koji = Dingus(get_nvr_rpms__returns=[self.ref_rpmfile])
+
+        test_bodhi = bodhi_directive.BodhiDirective(stub_bodhi, stub_koji)
+
+        with pytest.raises(TaskotronValueError):
+            test_bodhi.process(self.ref_input, self.ref_envdata)
\ No newline at end of file
diff --git a/testing/test_koji_directive.py b/testing/test_koji_directive.py
--- a/testing/test_koji_directive.py
+++ b/testing/test_koji_directive.py
@@ -4,8 +4,10 @@
 # See the LICENSE file for more details on Licensing
 
 from dingus import Dingus
+import pytest
 
 from libtaskotron.directives import koji_directive
+from libtaskotron.exceptions import TaskotronValueError
 
 class TestKojiDirective():
     def setup_method(self, method):
@@ -136,6 +138,16 @@
         assert 'x86_64' in requested_arches
         assert 'noarch' in requested_arches
 
+    def test_empty_arch_no_src(self):
+        ref_input = {'action': 'download', 'arch': [], 'src': False,
+                     'koji_build': self.ref_nvr}
+        ref_envdata = {'workdir': '/var/tmp/foo'}
+
+        stub_koji = Dingus()
+        test_helper = koji_directive.KojiDirective(stub_koji)
+        with pytest.raises(TaskotronValueError):
+            test_helper.process(ref_input, ref_envdata)
+
     def test__download_command_src(self):
         ref_input = {'action': 'download', 'arch': [], 'src': True,
                      'koji_build': self.ref_nvr}

