diff --git a/noblogsmv/main.py b/noblogsmv/main.py
index efa76a89f56e334d6e4c35c4639c0e36c04fafd2..11e5fe4967167c2396df6ec455c577ab4b0262c2 100644
--- a/noblogsmv/main.py
+++ b/noblogsmv/main.py
@@ -27,10 +27,21 @@ def execute_gen(cmd, dry_run=False):
 def init(blog_id, value, progress):
     return 'move_data'
 
+
 def init_clean(blog_id, value, progress):
     return 'rm_data'
 
 
+def sshcmd(*args):
+    return [
+        'ssh',
+        '-o', 'BatchMode=yes',
+        '-o', 'StrictHostKeyChecking=no'
+        '-o', 'ControlMaster=auto',
+        '-o', 'ControlPath=.ssh_ctrl_%h',
+    ] + list(args)
+
+
 class MysqlNoblogs(object):
     conn = collections.namedtuple('DbData',
                                   ['host', 'port', 'user', 'password', 'db'])
@@ -55,8 +66,7 @@ class MysqlNoblogs(object):
     def find_tables(self, blog_id):
         find_tables =['mysql', self.options(self.old), self.old.db, '-NBe',
                        "'show tables like \"wp\\_%s\\_%%\"'" % blog_id]
-        cmd = ['ssh', '-o', 'BatchMode=yes', '-o', 'StrictHostKeyChecking=no',
-               'root@%s' % self.old.host, '%s' % ' '.join(find_tables)]
+        cmd = sshcmd('root@%s' % self.old.host, '%s' % ' '.join(find_tables))
         log.debug('Calling %s', ' '.join(cmd))
         raw_tables = subprocess.check_output(cmd)
         self.tables = [ t.strip() for t in raw_tables.splitlines()]
@@ -66,9 +76,9 @@ def process_move_data(blog_id, value, progress):
     progress.update('moving blog data')
     log.info('moving data for %s', blog_id)
     blog_dir = os.path.join(BLOGS_DIR, blog_id)
-    cmd = ['ssh', '-o', 'BatchMode=yes', '-o', 'StrictHostKeyChecking=no',
-           'root@%s' % value['old_host'], 'rsync', '-az',
-           '%s/' % blog_dir, 'root@%s:%s' % (value['new_host'], blog_dir)]
+    cmd = sshcmd(
+        'root@%s' % value['old_host'], 'rsync', '-az',
+        '%s/' % blog_dir, 'root@%s:%s' % (value['new_host'], blog_dir))
     log.debug('Calling %s', ' '.join(cmd))
     try:
         execute(cmd)
@@ -103,8 +113,8 @@ def process_move_db(blog_id, value, progress):
     tables = ' '.join(db.tables)
     move_db = ['mysqldump', '--opt', db.old_options, value['old_db'], tables,
                '|', 'mysql', db.new_options, value['new_db']]
-    cmd = ['ssh', '-o', 'BatchMode=yes', '-o', 'StrictHostKeyChecking=no',
-           'root@%s' % value['old_host'], '%s' % ' '.join(move_db)]
+    cmd = sshcmd(
+           'root@%s' % value['old_host'], '%s' % ' '.join(move_db))
     log.debug('Calling %s', ' '.join(cmd))
     try:
         execute(cmd)
@@ -135,8 +145,8 @@ def process_rm_db(blog_id, value, progress):
     tables = ', '.join(db.tables)
     drop_db = ['mysql', db.old_options, db.old.db, '-NBe',
                '"DROP TABLE %s"' % tables]
-    cmd = ['ssh', '-o', 'BatchMode=yes', '-o', 'StrictHostKeyChecking=no',
-           'root@%s' % value['old_host'], '%s' % ' '.join(drop_db)]
+    cmd = sshcmd(
+        'root@%s' % value['old_host'], '%s' % ' '.join(drop_db))
     try:
         execute(cmd)
     except (subprocess.CalledProcessError, OSError), e:
@@ -151,9 +161,9 @@ def process_rm_data(blog_id, value, progress):
     progress.update('removing blog data files from old location')
     log.info('Removing blog data files')
     blog_dir = os.path.join(BLOGS_DIR, blog_id)
-    cmd = ['ssh', '-o', 'BatchMode=yes', '-o', 'StrictHostKeyChecking=no',
-           'root@%s' % value['old_host'], 'rm', '-rf',
-           '%s/' % blog_dir]
+    cmd = sshcmd(
+        'root@%s' % value['old_host'], 'rm', '-rf',
+        '%s/' % blog_dir)
     log.debug('Calling %s', ' '.join(cmd))
     try:
         execute(cmd)