diff --git a/conf/taskotron.yaml.example b/conf/taskotron.yaml.example
--- a/conf/taskotron.yaml.example
+++ b/conf/taskotron.yaml.example
@@ -52,6 +52,10 @@
 ## URL of Bodhi instance used for communication about package updates
 #bodhi_server: https://admin.fedoraproject.org/updates/
 
+## Number of maximum retries to Bodhi server if the query request
+## fails with 5xx HTTP error
+#bodhi_request_max_retries: 3
+
 ## URL of ResultsDB server API interface, which can store all test results
 #resultsdb_server: http://resultsdb.qa.fedoraproject.org/resultsdb/api/v1.0/
 
diff --git a/libtaskotron/bodhi_utils.py b/libtaskotron/bodhi_utils.py
--- a/libtaskotron/bodhi_utils.py
+++ b/libtaskotron/bodhi_utils.py
@@ -27,10 +27,10 @@
                        default BodhiClient instance is used.
         '''
 
-        taskotron_config = config.get_config()
-        username = taskotron_config.fas_username
-        password = taskotron_config.fas_password
-        bodhi_url = taskotron_config.bodhi_server
+        self.taskotron_config = config.get_config()
+        username = self.taskotron_config.fas_username
+        password = self.taskotron_config.fas_password
+        bodhi_url = self.taskotron_config.bodhi_server
 
         if not client:
             log.debug('creating bodhi client to %s' % bodhi_url)
@@ -42,7 +42,8 @@
 
 
     def query_update(self, package):
-        '''Get the last Bodhi update matching criteria.
+        '''Get the last Bodhi update matching criteria. Retry
+        ``bodhi_request_max_retries``-times when server returns HTTP 5xx response.
 
            :param str package: package NVR or package name or update title or
                                update ID
@@ -55,11 +56,23 @@
            :rtype: :class:`bunch.Bunch`
         '''
         log.debug('Searching Bodhi updates for: %s', package)
-        res = self.client.query(package=package, limit=1)
-        if res['updates']:
-            return res['updates'][0]
-        else:
-            return None
+        max_retries = self.taskotron_config.bodhi_request_max_retries
+        for retry_num in xrange(1, max_retries + 1):
+            try:
+                res = self.client.query(package=package, limit=1)
+                if res['updates']:
+                    return res['updates'][0]
+                else:
+                    return None
+            except fedora.client.ServerError as e:
+                if retry_num >= max_retries:
+                    log.critical('Maximum Bodhi server retries exceeded')
+                    raise
+                elif e.code < 500 or e.code > 599:
+                    raise
+                else:
+                    log.warning('Got HTTP %d response from bodhi, retrying \
+(%d retries remaining)...', e.code, max_retries - retry_num)
 
 
     def build2update(self, builds, strict=False):
diff --git a/libtaskotron/config_defaults.py b/libtaskotron/config_defaults.py
--- a/libtaskotron/config_defaults.py
+++ b/libtaskotron/config_defaults.py
@@ -53,6 +53,7 @@
 
     bodhi_posting_comments_span = 4320                                      #:
                                   # 3 days (3*24*60 = 4320)
+    bodhi_request_max_retries = 3                                           #:
 
     tmpdir = '/var/tmp/taskotron'                                           #:
     logdir = '/var/log/taskotron'                                           #:
diff --git a/testing/test_bodhi_utils.py b/testing/test_bodhi_utils.py
--- a/testing/test_bodhi_utils.py
+++ b/testing/test_bodhi_utils.py
@@ -8,11 +8,34 @@
 import pytest
 from dingus import Dingus
 from bunch import Bunch
+from fedora.client import ServerError
 
 from libtaskotron import bodhi_utils
 from libtaskotron import exceptions as exc
 
 
+# http://stackoverflow.com/questions/3190706/nonlocal-keyword-in-python-2-x
+def create_failing_server(response):
+    first_call = {"value": True}
+
+    def multicall(*args, **kwargs):
+        if first_call["value"]:
+            first_call["value"] = False
+            raise ServerError("nonexist", 500, "Internal Server Error")
+        else:
+            return response
+
+    return multicall
+
+
+def raise_500_server_error(*args, **kwargs):
+    raise ServerError("nonexist", 500, "Internal Server Error")
+
+
+def raise_404_not_found(*args, **kwargs):
+    raise ServerError("nonexist", 404, "Not found")
+
+
 class TestQueryUpdate():
     '''Test query_update()'''
 
@@ -52,6 +75,32 @@
 
         assert update is None
 
+    def test_query_retry(self):
+        '''Test whether query can retry if server returns HTTP 500'''
+        ref_query_answer = create_failing_server({'tg_flash': None,
+                                                  'num_items': 1,
+                                                  'title': '1 update found',
+                                                  'updates': [self.ref_update]})
+        stub_bodhi = Dingus(query = ref_query_answer)
+        bodhi = bodhi_utils.BodhiUtils(client=stub_bodhi)
+        update = bodhi.query_update(self.ref_bodhi_id)
+
+        assert update == self.ref_update
+
+    def test_query_retry_fail(self):
+        '''Test query on failing server'''
+        stub_bodhi = Dingus(query = raise_500_server_error)
+        bodhi = bodhi_utils.BodhiUtils(client=stub_bodhi)
+
+        with pytest.raises(ServerError):
+            bodhi.query_update(self.ref_bodhi_id)
+
+        stub_bodhi = Dingus(query = raise_404_not_found)
+        bodhi = bodhi_utils.BodhiUtils(client=stub_bodhi)
+
+        with pytest.raises(ServerError):
+            bodhi.query_update(self.ref_bodhi_id)
+
 
 @pytest.mark.usefixtures('setup')
 class TestBuild2Update():

