diff --git a/conf/taskotron.yaml.example b/conf/taskotron.yaml.example
--- a/conf/taskotron.yaml.example
+++ b/conf/taskotron.yaml.example
@@ -34,6 +34,12 @@
 ## [choices: local, libvirt; default: local for development, libvirt for production]
 #runtask_mode: libvirt
 
+## Supported machine architectures. This is mostly used by generic,
+## arch-independent tasks to determine which arches to test and report against.
+## You can still run an arch-specific task on any other arch using the command
+## line.
+#supported_arches: ['x86_64', 'i386', 'armhfp']
+
 
 ## ==== SCHEDULING section ====
 ## This section holds options related to the scheduling and execution system,
diff --git a/libtaskotron/config_defaults.py b/libtaskotron/config_defaults.py
--- a/libtaskotron/config_defaults.py
+++ b/libtaskotron/config_defaults.py
@@ -1,5 +1,5 @@
 # -*- coding: utf-8 -*-
-# Copyright 2009-2014, Red Hat, Inc.
+# Copyright 2009-2016, Red Hat, Inc.
 # License: GPL-2.0+ <http://spdx.org/licenses/GPL-2.0+>
 # See the LICENSE file for more details on Licensing
 
@@ -55,6 +55,7 @@
     profile = ProfileName.DEVELOPMENT                                       #:
 
     runtask_mode = RuntaskModeName.LOCAL                                    #:
+    supported_arches = ['x86_64', 'i386', 'armhfp']                         #:
 
     report_to_resultsdb = False                                             #:
 
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
@@ -1,10 +1,17 @@
 # -*- coding: utf-8 -*-
-# Copyright 2009-2014, Red Hat, Inc.
+# Copyright 2009-2016, Red Hat, Inc.
 # License: GPL-2.0+ <http://spdx.org/licenses/GPL-2.0+>
 # See the LICENSE file for more details on Licensing
 
 from __future__ import absolute_import
 
+from libtaskotron.directives import BaseDirective
+from libtaskotron.logger import log
+from libtaskotron.exceptions import TaskotronDirectiveError
+import libtaskotron.ext.fedora.bodhi_utils as bodhi
+from libtaskotron.ext.fedora.koji_utils import KojiClient
+from libtaskotron import config
+
 DOCUMENTATION = """
 module: bodhi_directive
 short_description: download updates from Bodhi
@@ -69,16 +76,9 @@
       export: rpmlint_output
 """
 
-from libtaskotron.directives import BaseDirective
-from libtaskotron.arch_utils import Arches
-from libtaskotron.logger import log
-from libtaskotron.exceptions import TaskotronDirectiveError
-import libtaskotron.ext.fedora.bodhi_utils as bodhi
-from libtaskotron.ext.fedora.koji_utils import KojiClient
-
-
 directive_class = 'BodhiDirective'
 
+
 class BodhiDirective(BaseDirective):
 
     def __init__(self, bodhi_api=None, koji_session=None):
@@ -131,7 +131,7 @@
             workdir = arg_data['workdir']
             updateid = params['update_id']
             if 'all' in params['arch']:
-                arches = Arches.base + ['noarch']
+                arches = config.get_config().supported_arches + ['noarch']
             else:
                 arches = params['arch']
             if arches and ('noarch' not in arches):
diff --git a/libtaskotron/directives/koji_directive.py b/libtaskotron/directives/koji_directive.py
--- a/libtaskotron/directives/koji_directive.py
+++ b/libtaskotron/directives/koji_directive.py
@@ -23,10 +23,10 @@
   arch:
     required: true
     description: |
-      a list of architectures for which to download RPMs for the requested
-      build/tag. If you want to download RPMs for all arches, use ``['all']``. If
-      you don't want to download any binary arch (i.e. you're only interested in
-      SRPMs, which is controlled by `src` option), use an empty list ``[]``.
+      a list of architectures for which to download RPMs for the requested build/tag. If you want
+      to download RPMs for all Taskotron-supported arches, use ``['all']``. If you don't want to
+      download any binary arch (i.e. you're only interested in SRPMs, which is controlled by `src`
+      option), use an empty list ``[]``.
 
       Note: ``noarch`` RPMs are always automatically downloaded unless ``arch=[]``,
       or you specifically exclude them using ``arch_exclude``. Also, if you specify base arches
@@ -94,8 +94,8 @@
 """
 
 EXAMPLES = """
-Rpmlint needs to download a specific build from Koji, all architectures
-including src.rpm::
+Rpmlint needs to download a specific build from Koji, all supported architectures including
+src.rpm::
 
   - name: download rpms from koji
     koji:
@@ -114,8 +114,8 @@
         arch: ${arch}
         target_dir: ${workdir}/downloaded_tag/
 
-Abicheck downloads both current build and latest stable build. It checks all binary arches, but
-doesn't need ``noarch``::
+Abicheck downloads both current build and latest stable build. It checks all supported binary
+arches, but doesn't need ``noarch``::
 
   - name: download latest stable rpms for the package
     koji:
diff --git a/libtaskotron/ext/fedora/koji_utils.py b/libtaskotron/ext/fedora/koji_utils.py
--- a/libtaskotron/ext/fedora/koji_utils.py
+++ b/libtaskotron/ext/fedora/koji_utils.py
@@ -150,8 +150,8 @@
 
         :param str nvr: build NVR
         :param arches: restrict the arches of builds to provide URLs for. By default, all
-            architectures are considered. If you want to consider just some selected arches,
-            provide their names in a list.
+            Taskotron-supported architectures are considered. If you want to consider just some
+            selected arches, provide their names in a list.
 
             .. note:: If you specify base arches (like ``i386``), all concrete binary arches for
               that base arch will be automatically added (e.g. ``i[3-6]86``), because Koji query
@@ -168,21 +168,24 @@
         '''
         log.info('Querying Koji for a list of RPMS for: %s', nvr)
 
+        arches = set(arches)
+        # populate arches if 'all' requested
+        if 'all' in arches:
+            arches.discard('all')
+            arches.update(config.get_config().supported_arches + ['noarch'])
+
         # add binary arches if base arches are specified
-        archlist = list(arches)
-        for arch in arches:
+        for arch in arches.copy():
             if arch in arch_utils.Arches.base:
-                archlist.extend(arch_utils.Arches.binary[arch])
-        arches = list(set(archlist))
+                arches.update(arch_utils.Arches.binary[arch])
 
-        # if src is enabled, we need to add it so that it is included in the
-        # Koji query
-        if src and ('src' not in arches):
-            arches.append('src')
+        if src:
+            arches.add('src')
 
         # exclude unwanted arches
-        arches = [arch for arch in arches if arch not in arch_exclude]
+        arches.difference_update(set(arch_exclude))
 
+        arches = list(arches)
         if not arches:
             log.debug('Nothing to query for, the combination of `arches`, `arch_exclude` and '
                       '`src` ended up an empty list.')
@@ -194,15 +197,10 @@
             raise exc.TaskotronRemoteError("No such build found in Koji: %s" % nvr)
 
         # list its RPM files
-        req_arches = None if 'all' in arches else arches
-        rpms = self.session.listRPMs(buildID=info['id'], arches=req_arches)
+        rpms = self.session.listRPMs(buildID=info['id'], arches=arches)
         if not debuginfo:
             rpms = [r for r in rpms if (not r['name'].endswith('-debuginfo')) and
                                        ('-debuginfo-' not in r['name'])]
-        if not src:
-            rpms = [r for r in rpms if r['arch'] != 'src']
-        # exclude arches once again, in case `arch=['all']` was used
-        rpms = [r for r in rpms if not r['arch'] in arch_exclude]
 
         if not rpms:
             log.debug('After excluding all unwanted arches and RPM files, there is no RPM file '
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
@@ -10,7 +10,7 @@
 
 from libtaskotron.directives import bodhi_directive
 from libtaskotron.exceptions import TaskotronDirectiveError
-from libtaskotron import arch_utils
+from libtaskotron import config
 
 class TestBodhiDownloads():
 
@@ -74,7 +74,7 @@
 
         test_bodhi.process(self.ref_input, self.ref_arg_data)
 
-        ref_arches = set(arch_utils.Arches.base + ['noarch'])
+        ref_arches = set(config.get_config().supported_arches + ['noarch'])
         getrpms_calls = stub_koji.calls()
         req_arches = map(lambda x: x[1][2], getrpms_calls)
 
diff --git a/testing/test_koji_utils.py b/testing/test_koji_utils.py
--- a/testing/test_koji_utils.py
+++ b/testing/test_koji_utils.py
@@ -186,28 +186,44 @@
         assert 'i686' in requested_arches
         assert 'i386' in requested_arches
 
+    def test_keep_extra_arch_with_all(self):
+        '''Arches should not be thrown away even if 'all' is specified (there might be some extra
+        obscure arches specified in addition)'''
+        self.ref_arch = ['all', 'obscure_arch']
+        stub_koji = Dingus(getBuild__returns=self.ref_build)
+        test_koji = koji_utils.KojiClient(stub_koji)
+
+        test_koji.nvr_to_urls(self.ref_nvr, arches=self.ref_arch)
+
+        listrpm_calls = stub_koji.calls('listRPMs')
+        requested_arches = listrpm_calls[0][2]['arches']
+        assert 'all' not in requested_arches
+        assert 'obscure_arch' in requested_arches
+
     def should_not_throw_exception_norpms(self):
         '''It's possible to have no RPMs (for the given arch) in a build'''
         stub_koji = Dingus(getBuild__returns = self.ref_build)
         test_koji = koji_utils.KojiClient(stub_koji)
 
         test_koji.nvr_to_urls(self.ref_nvr, arches = [self.ref_arch])
 
     def test_nvr_to_urls_src_filtering(self):
-        stub_koji = Dingus(getBuild__returns=self.ref_build,
-                           listRPMs__returns=self.ref_rpms)
+        stub_koji = Dingus(getBuild__returns=self.ref_build)
         test_koji = koji_utils.KojiClient(stub_koji)
 
         # src enabled
-        urls = test_koji.nvr_to_urls(self.ref_nvr, src=True, debuginfo=True)
-        assert len(urls) == len(self.ref_rpms)
-        assert any(['src' in url for url in urls])
+        test_koji.nvr_to_urls(self.ref_nvr, src=True, debuginfo=True)
+        listrpm_calls = stub_koji.calls('listRPMs')
+        assert len(listrpm_calls) == 1
+        requested_arches = listrpm_calls[0][2]['arches']
+        assert 'src' in requested_arches
 
         # src disabled
-        urls = test_koji.nvr_to_urls(self.ref_nvr, src=False, debuginfo=True)
-        assert len(urls) == len([rpm for rpm in self.ref_rpms
-                                 if rpm['arch'] != 'src'])
-        assert all(['src' not in url for url in urls])
+        test_koji.nvr_to_urls(self.ref_nvr, src=False, debuginfo=True)
+        listrpm_calls = stub_koji.calls('listRPMs')
+        assert len(listrpm_calls) == 2
+        requested_arches = listrpm_calls[1][2]['arches']
+        assert 'src' not in requested_arches
 
     def test_nvr_to_urls_debuginfo(self):
         stub_koji = Dingus(getBuild__returns=self.ref_build,
@@ -234,7 +250,7 @@
         listrpm_calls = stub_koji.calls('listRPMs')
         requested_arches = listrpm_calls[0][2]['arches']
         assert len(requested_arches) == 1
-        assert requested_arches[0] == 'src'
+        assert 'src' in requested_arches
 
     def should_not_query_no_arch_no_src(self):
         '''If there's no arch to query for, should not perform the query'''
@@ -245,39 +261,42 @@
         assert not stub_koji.called
 
     def test_arch_exclude(self):
-        stub_koji = Dingus(getBuild__returns=self.ref_build,
-                           listRPMs__returns=self.ref_rpms)
+        stub_koji = Dingus(getBuild__returns=self.ref_build)
         test_koji = koji_utils.KojiClient(stub_koji)
         ref_exclude = ['x86_64']
 
         # arch_exclude disabled
-        urls = test_koji.nvr_to_urls(self.ref_nvr, src=True, debuginfo=True)
-        assert len(urls) == len(self.ref_rpms)
-        assert any(['src' in url for url in urls])
+        test_koji.nvr_to_urls(self.ref_nvr, src=True, debuginfo=True)
+        listrpm_calls = stub_koji.calls('listRPMs')
+        assert len(listrpm_calls) == 1
+        requested_arches = listrpm_calls[0][2]['arches']
+        for arch in ref_exclude:
+            if arch in config.get_config().supported_arches:
+                assert arch in requested_arches
 
         # arch_exclude enabled
-        urls = test_koji.nvr_to_urls(self.ref_nvr, arch_exclude=ref_exclude, src=True,
-                                     debuginfo=True)
-        assert len(urls) == len([rpm for rpm in self.ref_rpms
-                                 if rpm['arch'] not in ref_exclude])
+        test_koji.nvr_to_urls(self.ref_nvr, arch_exclude=ref_exclude, src=True, debuginfo=True)
+        listrpm_calls = stub_koji.calls('listRPMs')
+        assert len(listrpm_calls) == 2
+        requested_arches = listrpm_calls[1][2]['arches']
         for arch in ref_exclude:
-            assert all([arch not in url for url in urls])
+            assert arch not in requested_arches
 
     def test_arch_exclude_override_explicit(self):
         '''arch_exclude should work even when the same arch is explicitly stated in arches'''
-        stub_koji = Dingus(getBuild__returns=self.ref_build,
-                           listRPMs__returns=self.ref_rpms)
+        stub_koji = Dingus(getBuild__returns=self.ref_build)
         test_koji = koji_utils.KojiClient(stub_koji)
         ref_exclude = ['x86_64']
-        ref_arch = set([rpm['arch'] for rpm in self.ref_rpms])
+        ref_arch = ref_exclude + ['i386']
 
         # arch_exclude enabled
-        urls = test_koji.nvr_to_urls(self.ref_nvr, arches=ref_arch, arch_exclude=ref_exclude,
-                                     src=True, debuginfo=True)
-        assert len(urls) == len([rpm for rpm in self.ref_rpms
-                                 if rpm['arch'] not in ref_exclude])
+        test_koji.nvr_to_urls(self.ref_nvr, arches=ref_arch, arch_exclude=ref_exclude,
+                              src=True, debuginfo=True)
+        listrpm_calls = stub_koji.calls('listRPMs')
+        assert len(listrpm_calls) == 1
+        requested_arches = listrpm_calls[0][2]['arches']
         for arch in ref_exclude:
-            assert all([arch not in url for url in urls])
+            assert arch not in requested_arches
 
     # ====================
     #    get_nvr_rpms()

