diff --git a/slapos/runner/utils.py b/slapos/runner/utils.py
index a03ff85246b889e6ba6dd4f3591456e948c61b52..a68a81dc71fb2b5a2e29531bd7b74db07632faae 100644
--- a/slapos/runner/utils.py
+++ b/slapos/runner/utils.py
@@ -278,33 +278,57 @@ def waitProcess(config, process, step):
   date = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
   slapgridResultToFile(config, step, process.returncode, date)
 
-
-def runSoftwareWithLock(config, lock=False):
+def runSlapgridWithLock(config, step, process_name, lock=False):
   """
-    Use Slapgrid to compile current Software Release and wait until
-    compilation is done
+  * process_name is the name of the process given to supervisord, which will
+    run the software or the instance
+  * step is one of ('software', 'instance')
+  * lock allows to make this function asynchronous or not
   """
-  if sup_process.isRunning(config, 'slapgrid-sr'):
+  if sup_process.isRunning(config, process_name):
     return 1
 
-  if not os.path.exists(config['software_root']):
-    os.mkdir(config['software_root'])
+  root_folder = config["%s_root" % step]
+  log_file = config["%s_log" % step]
+
+  if not os.path.exists(root_folder):
+    os.mkdir(root_folder)
+
   # XXX Hackish and unreliable
-  if os.path.exists(config['software_log']):
-    os.remove(config['software_log'])
+  if os.path.exists(log_file):
+    os.remove(log_file)
   if not updateProxy(config):
     return 1
+  if step == 'instance' and not requestInstance(config):
+    return 1
   try:
-    sup_process.runProcess(config, "slapgrid-sr")
+    sup_process.runProcess(config, process_name)
     if lock:
-      sup_process.waitForProcessEnd(config, "slapgrid-sr")
+      sup_process.waitForProcessEnd(config, process_name)
     #Saves the current compile software for re-use
-    config_SR_folder(config)
-    return sup_process.returnCode(config, "slapgrid-sr")
+    if step == 'software':
+      config_SR_folder(config)
+    return sup_process.returnCode(config, process_name)
   except xmlrpclib.Fault:
     return 1
 
 
+def runSoftwareWithLock(config, lock=False):
+  """
+    Use Slapgrid to compile current Software Release and wait until
+    compilation is done
+  """
+  return runSlapgridWithLock(config, 'software', 'slapgrid-sr', lock)
+
+
+def runInstanceWithLock(config, lock=False):
+  """
+    Use Slapgrid to deploy current Software Release and wait until
+    deployment is done.
+  """
+  return runSlapgridWithLock(config, 'instance', 'slapgrid-cp', lock)
+
+
 def config_SR_folder(config):
   """Create a symbolik link for each folder in software folder. That allows
     the user to customize software release folder"""
@@ -373,29 +397,6 @@ def isInstanceRunning(config):
   return sup_process.isRunning(config, 'slapgrid-cp')
 
 
-def runInstanceWithLock(config, lock=False):
-  """
-    Use Slapgrid to deploy current Software Release and wait until
-    deployment is done.
-  """
-  if sup_process.isRunning(config, 'slapgrid-cp'):
-    return 1
-
-  startProxy(config)
-  # XXX Hackish and unreliable
-  if os.path.exists(config['instance_log']):
-    os.remove(config['instance_log'])
-  if not (updateProxy(config) and requestInstance(config)):
-    return 1
-  try:
-    sup_process.runProcess(config, "slapgrid-cp")
-    if lock:
-      sup_process.waitForProcessEnd(config, "slapgrid-cp")
-    return sup_process.returnCode(config, "slapgrid-cp")
-  except xmlrpclib.Fault:
-    return 1
-
-
 def getProfilePath(projectDir, profile):
   """
   Return the path of the current Software Release `profile`