diff --git a/benchmarks/basic_commands.py b/benchmarks/basic_commands.py
index 3a8d88483eaf31f3d0d559648c4eb42590fef33f_YmVuY2htYXJrcy9iYXNpY19jb21tYW5kcy5weQ==..73baad28aae0422ab4fd8acb6926550a38c109ab_YmVuY2htYXJrcy9iYXNpY19jb21tYW5kcy5weQ== 100644
--- a/benchmarks/basic_commands.py
+++ b/benchmarks/basic_commands.py
@@ -137,47 +137,7 @@
         self._execute("bundle", "--base", ":(-%d)" % (n+1), "/tmp/bundle.bundle")
 
 
-class ExchangeTrackSuite(BaseTrackTestSuite):
-    param_names = BaseTrackTestSuite.param_names + ['revset']
-    # params = BaseTrackTestSuite.params + [['default~10', None]]
-    params = BaseTrackTestSuite.params + [[None]]
-
-    def setup(self, repo_name, revset, *args, **kwargs):
-        super(ExchangeTrackSuite, self).setup(repo_name, *args, **kwargs)
-
-        self.revset = revset
-
-        self.tempdir = tempfile.mkdtemp(dir=os.environ.get('ASVTEMPDIR'))
-        self.cachedir = os.path.join(REPOS_DIR, '.cache')
-
-        from base64 import b64encode
-
-
-        if revset is None:
-            self.cache_name = "%s.tar" % repo_name
-            self.cache_path = os.path.join(self.cachedir, self.cache_name)
-
-            if not os.path.isfile(self.cache_path):
-                tar_cmd = "tar cf %s -C  %s ." % (self.cache_path, self.repo_path)
-                self._single_execute(shlex.split(tar_cmd))
-        else:
-            safe_range = b64encode(revset)
-            self.cache_name = "%s-%s.tar" % (repo_name, safe_range)
-            self.cache_path = os.path.join(self.cachedir, self.cache_name)
-
-            if not os.path.isfile(self.cache_path):
-                # First clone it
-                clone_path = os.path.join(self.cachedir, "%s-%s-clone" % (repo_name, safe_range))
-
-                rev = self._identify_id(revset)
-
-                cmd = [self.hgpath, '--cwd', self.repo_path,
-                       'clone', '--noupdate', '.', clone_path,
-                       '-r', rev]
-                self._single_execute(cmd)
-
-                tar_cmd = "tar cf %s -C  %s ." % (self.cache_path, clone_path)
-                self._single_execute(shlex.split(tar_cmd))
-
-                shutil.rmtree(clone_path)
+class ExchangeTimeSuite(BaseTimeTestSuite):
+    param_names = BaseTimeTestSuite.param_names + ['revset']
+    params = BaseTrackTestSuite.params + [[None, 'default']]
 
@@ -183,23 +143,13 @@
 
-    def teardown(self, *args, **kwargs):
-        try:
-            shutil.rmtree(self.tempdir)
-        except Exception:
-            pass
-
-    def _identify_id(self, revset):
-        rev = subprocess.check_output([
-            self.hgpath, '--cwd', self.repo_path, 'identify', '-i', "-r", revset], env=self.environ)
-        return rev.strip()
-
-    @contextlib.contextmanager
-    def clone_from_cache(self):
-        try:
-            import time
-            clone_path = os.path.join(self.tempdir, 'clone-%s' % time.time())
-
-            os.mkdir(clone_path)
-
-            cmd = "tar xf %s -C %s" % (self.cache_path, clone_path)
-            clone_time = self._single_execute(shlex.split(cmd))
+    def setup(self, repo_name, revset):
+        self.timer = timeit.default_timer
+        self.sample_time = 10
+        super(ExchangeTimeSuite, self).setup(repo_name, revset)
+        self.clone_path = os.path.join(REPOS_DIR, '.cache', repo_name)
+        if revset is not None:
+            self.rev = subprocess.check_output([
+                self.hgpath, '--cwd', self.repo_path, 'identify', '-i', "-r", revset
+            ], env=self.environ).strip()
+        else:
+            self.rev = None
 
@@ -205,12 +155,7 @@
 
-            yield clone_path
-
-        finally:
-            shutil.rmtree(clone_path)
-
-    def track_incoming(self, *args, **kwargs):
-        with self.clone_from_cache() as clone_path:
-            cmd = [self.hgpath, '--cwd', clone_path, 'incoming', self.repo_path]
-            if self.revset:
-                cmd.extend(['-r', 'default'])
+    def time_incoming(self, repo_name, revset):
+        cmd = [self.hgpath, '--cwd', self.clone_path, 'incoming', self.repo_path]
+        if self.rev:
+            cmd.extend(['-r', self.rev])
+        self._single_execute(cmd)
 
@@ -216,16 +161,9 @@
 
-            # Ignore the return code
-            return self._timeit(self._single_execute, (cmd, False))
-
-    def track_outgoing(self, *args, **kwargs):
-        with self.clone_from_cache() as clone_path:
-            cmd = [self.hgpath, '--cwd', self.repo_path, 'outgoing',
-                   clone_path]
-            if self.revset:
-                cmd.extend(['-r', 'default'])
-
-            # Ignore the return code
-            return self._timeit(self._single_execute, (cmd, False))
+    def time_outgoing(self, repo_name, revset):
+        cmd = [self.hgpath, '--cwd', self.repo_path, 'outgoing', self.clone_path]
+        if self.rev:
+            cmd.extend(['-r', self.rev])
+        self._single_execute(cmd)
 
     # def track_push(self, *args, **kwargs):
     #     def clone_and_push():
diff --git a/prepare_repos.py b/prepare_repos.py
index 3a8d88483eaf31f3d0d559648c4eb42590fef33f_cHJlcGFyZV9yZXBvcy5weQ==..73baad28aae0422ab4fd8acb6926550a38c109ab_cHJlcGFyZV9yZXBvcy5weQ== 100644
--- a/prepare_repos.py
+++ b/prepare_repos.py
@@ -1,3 +1,4 @@
 """ Ensure that all repository are cloned and at their tip
 """
+import errno
 import hglib
@@ -3,4 +4,6 @@
 import hglib
+import os
+import subprocess
 from os.path import isdir, join
 import yaml
 
@@ -11,8 +14,14 @@
 
 
 def clone_repositories(config, repos_dir):
+    cachedir = join(repos_dir, '.cache')
+    try:
+        os.makedirs(cachedir)
+    except OSError as exc:
+        if exc.errno != errno.EEXIST:
+            raise
     for repo_name, repo in config['repos'].items():
         clonedir = join(repos_dir, repo_name)
         if not isdir(clonedir):
             print("Cloning %s (%s) into %s" % (repo_name, repo['url'], clonedir))
             hglib.clone(repo['url'], clonedir)
@@ -14,8 +23,17 @@
     for repo_name, repo in config['repos'].items():
         clonedir = join(repos_dir, repo_name)
         if not isdir(clonedir):
             print("Cloning %s (%s) into %s" % (repo_name, repo['url'], clonedir))
             hglib.clone(repo['url'], clonedir)
+        partialdir = join(cachedir, repo_name)
+        if not isdir(partialdir):
+            print("Cloning partial %s (%s) into %s (for exchange benchmarks)" % (
+                repo_name, clonedir, partialdir))
+            subprocess.check_call(['hg', 'clone', '--noupdate', clonedir,
+                                   partialdir])
+            subprocess.check_call(['hg', '--cwd', partialdir, 'strip', '-r',
+                                   'last(all(), 10)'])
+            subprocess.check_call(['hg', '--cwd', partialdir, 'debugupdatecache'])
 
 
 config = read_configuration("config.yaml")