diff --git a/_modules/barbicanv1/common.py b/_modules/barbicanv1/common.py
index 83fd6ff..f6a46ff 100644
--- a/_modules/barbicanv1/common.py
+++ b/_modules/barbicanv1/common.py
@@ -1,6 +1,9 @@
+import functools
 import logging
 import os_client_config
+import time
 from uuid import UUID
+
 try:
     from urllib.parse import urlsplit
 except ImportError:
@@ -70,8 +73,11 @@
 
 def send(method):
     def wrap(func):
+        @functools.wraps(func)
         def wrapped_f(*args, **kwargs):
             cloud_name = kwargs.pop('cloud_name')
+            connect_retries =  30
+            connect_retry_delay = 1
             if not cloud_name:
                 e = NoCredentials()
                 log.error('%s' % e)
@@ -83,12 +89,27 @@
                 if k.startswith('__'):
                     kwargs.pop(k)
             url, request_kwargs = func(*args, **kwargs)
-            response = getattr(adapter, method)(url, **request_kwargs)
-            if not response.content:
+            response = None
+            for i in range(connect_retries):
+                try:
+                  response = getattr(adapter, method)(
+                      url, connect_retries=connect_retries,
+                      **request_kwargs)
+                except Exception as e:
+                    if not hasattr(e, 'http_status') or (e.http_status >= 500
+                        or e.http_status == 0):
+                        msg = ("Got retriable exception when contacting "
+                               "Barbican API. Sleeping for %ss. Attepmpts "
+                               "%s of %s")
+                        log.error(msg % (connect_retry_delay, i, connect_retries))
+                        time.sleep(connect_retry_delay)
+                        continue
+                break
+            if not response or not response.content:
                 return {}
             try:
                 resp = response.json()
-            except:
+            except ValueError:
                 resp = response.content
             return resp
         return wrapped_f
@@ -119,9 +140,15 @@
             if _check_uuid(ref):
                 uuid = ref
             else:
+                retries = 30
+                while retries:
                 # Then we have name not uuid
-                resp = resource_list(
-                    name=ref, cloud_name=cloud_name)[resp_key]
+                    resp = resource_list(
+                        name=ref, cloud_name=cloud_name).get(resp_key)
+                    if resp is not None:
+                        break
+                    retries -= 1
+                    time.sleep(1)
                 if len(resp) == 0:
                     raise ResourceNotFound(resp_key, ref)
                 elif len(resp) > 1:
