diff --git a/utils.py b/utils.py
index 8941ca5..0a38ad5 100644
--- a/utils.py
+++ b/utils.py
@@ -1,9 +1,21 @@
+import time
+import threading
+import contextlib
 import multiprocessing
 
+import paramiko
 
-def get_barrier(count):
-    val = multiprocessing.Value('i', count)
-    cond = multiprocessing.Condition()
+from log import log
+
+
+def get_barrier(count, threaded=False):
+    if threaded:
+        class val(object):
+            value = count
+        cond = threading.Condition()
+    else:
+        val = multiprocessing.Value('i', count)
+        cond = multiprocessing.Condition()
 
     def closure(timeout):
         with cond:
@@ -15,3 +27,62 @@
             return val.value == 0
 
     return closure
+
+
+def ssh_connect(host, user, key_file, retry_count=10, timeout=5):
+    ssh = paramiko.SSHClient()
+    ssh.load_host_keys('/dev/null')
+    ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
+    ssh.known_hosts = None
+
+    for i in range(retry_count):
+        try:
+            ssh.connect(host, username=user, key_filename=key_file,
+                        look_for_keys=False)
+            return ssh
+        except:
+            if i == retry_count - 1:
+                raise
+            time.sleep(timeout)
+
+
+def wait_on_barrier(barrier, latest_start_time):
+    if barrier is not None:
+        if latest_start_time is not None:
+            timeout = latest_start_time - time.time()
+        else:
+            timeout = None
+
+        if timeout is not None and timeout > 0:
+            msg = "Ready and waiting on barrier. " + \
+                  "Will wait at most {0} seconds"
+            log(msg.format(int(timeout)))
+
+            if not barrier(timeout):
+                log("Barrier timeouted")
+
+
+@contextlib.contextmanager
+def log_error(action, types=(Exception,)):
+    if not action.startswith("!"):
+        log("Starts : " + action)
+    else:
+        action = action[1:]
+
+    try:
+        yield
+    except Exception as exc:
+        if isinstance(exc, types) and not isinstance(exc, StopIteration):
+            templ = "Error during {0} stage: {1}"
+            log(templ.format(action, exc.message))
+        raise
+
+
+def run_over_ssh(conn, cmd):
+    "should be replaces by normal implementation, with select"
+
+    stdin, stdout, stderr = conn.exec_command(cmd)
+    out = stdout.read()
+    err = stderr.read()
+    code = stdout.channel.recv_exit_status()
+    return code, out, err
