diff --git a/rbtools/api/errors.py b/rbtools/api/errors.py
index f645c3feb3c1c427a1dd66107f62cbde5f24de57..f5a4b12e219939acabcf58d20be7faf918c88edc 100644
--- a/rbtools/api/errors.py
+++ b/rbtools/api/errors.py
@@ -23,12 +23,11 @@ class AuthorizationError(APIError):
 
 class BadRequestError(APIError):
     def __str__(self):
-        lines = [
-            super(BadRequestError, self).__str__(),
-            ''
-        ]
+        lines = [super(BadRequestError, self).__str__()]
 
         if self.rsp and 'fields' in self.rsp:
+            lines.append('')
+
             for field, error in self.rsp['fields'].iteritems():
                 lines.append('    %s: %s' % (field, '; '.join(error)))
 
diff --git a/rbtools/clients/perforce.py b/rbtools/clients/perforce.py
index 3f2e516109d8d34bf6ae2d1018c1524211ba9f53..6aa9efba38535dad863b9eba6485c59d6b9c4710 100644
--- a/rbtools/clients/perforce.py
+++ b/rbtools/clients/perforce.py
@@ -726,7 +726,7 @@ class PerforceClient(SCMClient):
             dl = ['Binary files %s and %s differ\n' % (old_file, new_file)]
 
         if dl == [] or dl[0].startswith("Binary files "):
-            if dl == []:
+            if dl == [] and not is_move:
                 if ignore_unmodified:
                     return []
                 else:
diff --git a/rbtools/clients/tests.py b/rbtools/clients/tests.py
index 41a912fa23d675570e95438237843a4e8db0fe92..baa388fed30ad88cd2e1738338c9341e90a1355b 100644
--- a/rbtools/clients/tests.py
+++ b/rbtools/clients/tests.py
@@ -23,6 +23,8 @@ from rbtools.utils.testbase import RBTestBase
 
 class SCMClientTests(RBTestBase):
     def setUp(self):
+        super(SCMClientTests, self).setUp()
+
         self.options = OptionsStub()
 
 
@@ -613,13 +615,25 @@ class MercurialSubversionClientTests(MercurialTestBase):
         super(MercurialSubversionClientTests, self).setUp()
         self._hg_env = {'FOO': 'BAR'}
 
+        # Make sure hgsubversion is enabled.
+        #
+        # This will modify the .hgrc in the temp home directory created
+        # for these tests.
+        #
+        # The "hgsubversion =" tells Mercurial to check for hgsubversion
+        # in the default PYTHONPATH.
+        fp = open('%s/.hgrc' % os.environ['HOME'], 'w')
+        fp.write('[extensions]\n')
+        fp.write('hgsubversion =\n')
+        fp.close()
+
         for exe in self._required_exes:
             if not self.is_exe_in_path(exe):
                 raise SkipTest('missing svn stuff!  giving up!')
 
         if not self._has_hgsubversion():
             raise SkipTest('unable to use `hgsubversion` extension!  '
-                                'giving up!')
+                           'giving up!')
 
         if not self._tmpbase:
             self._tmpbase = self.create_tmp_dir()
@@ -648,11 +662,14 @@ class MercurialSubversionClientTests(MercurialTestBase):
 
         os.kill(self._svnserve_pid, 9)
 
-    def _svn_add_file_commit(self, filename, data, msg):
+    def _svn_add_file_commit(self, filename, data, msg, add_file=True):
         outfile = open(filename, 'w')
         outfile.write(data)
         outfile.close()
-        execute(['svn', 'add', filename])
+
+        if add_file:
+            execute(['svn', 'add', filename], ignore_errors=True)
+
         execute(['svn', 'commit', '-m', msg])
 
     def _create_svn_repo(self):
@@ -692,7 +709,8 @@ class MercurialSubversionClientTests(MercurialTestBase):
         os.chdir(os.path.join(self.svn_checkout, 'trunk'))
 
         for i, data in enumerate([FOO, FOO1, FOO2]):
-            self._svn_add_file_commit('foo.txt', data, 'foo commit %s' % i)
+            self._svn_add_file_commit('foo.txt', data, 'foo commit %s' % i,
+                                      add_file=(i == 0))
 
     def _get_testing_clone(self):
         self.clone_dir = os.path.join(self._tmpbase, 'checkout.hg')
@@ -1228,6 +1246,9 @@ class BazaarClientTests(SCMClientTests):
         if not self.is_exe_in_path("bzr"):
             raise SkipTest("bzr not found in path")
 
+        # Identify with bazaar so that the commands won't be sad.
+        execute(['bzr', 'whoami', 'Test User'])
+
         self.orig_dir = os.getcwd()
 
         self.original_branch = self.chdir_tmp()
@@ -1249,11 +1270,12 @@ class BazaarClientTests(SCMClientTests):
         """Test BazaarClient get_repository_info with original branch"""
         os.chdir(self.original_branch)
         ri = self.client.get_repository_info()
-        
+
         self.assert_(isinstance(ri, RepositoryInfo))
-        self.assertEqual(ri.path, self.original_branch)
+        self.assertEqual(os.path.realpath(ri.path),
+                         os.path.realpath(self.original_branch))
         self.assertTrue(ri.supports_parent_diffs)
-        
+
         self.assertEqual(ri.base_path, "/")
         self.assertFalse(ri.supports_changesets)
 
@@ -1261,11 +1283,12 @@ class BazaarClientTests(SCMClientTests):
         """Test BazaarClient get_repository_info with child branch"""
         os.chdir(self.child_branch)
         ri = self.client.get_repository_info()
-        
+
         self.assert_(isinstance(ri, RepositoryInfo))
-        self.assertEqual(ri.path, self.child_branch)
+        self.assertEqual(os.path.realpath(ri.path),
+                         os.path.realpath(self.child_branch))
         self.assertTrue(ri.supports_parent_diffs)
-        
+
         self.assertEqual(ri.base_path, "/")
         self.assertFalse(ri.supports_changesets)
 
diff --git a/rbtools/utils/filesystem.py b/rbtools/utils/filesystem.py
index 5ee3db1d0060db19d28e8d9a27074491849d39d9..fd433f812867d4cb527d22f37fe90b13e7b3eb7c 100644
--- a/rbtools/utils/filesystem.py
+++ b/rbtools/utils/filesystem.py
@@ -1,4 +1,5 @@
 import os
+import shutil
 import tempfile
 
 from rbtools.utils.process import die
@@ -7,6 +8,7 @@ from rbtools.utils.process import die
 CONFIG_FILE = '.reviewboardrc'
 
 tempfiles = []
+tempdirs = []
 builtin = {}
 
 
@@ -17,6 +19,9 @@ def cleanup_tempfiles():
         except:
             pass
 
+    for tmpdir in tempdirs:
+        shutil.rmtree(tmpdir, ignore_errors=True)
+
 
 def get_config_value(configs, name, default=None):
     for c in configs:
@@ -77,6 +82,17 @@ def make_tempfile(content=None):
     return tmpfile
 
 
+def make_tempdir(parent=None):
+    """Creates a temporary directory and returns the path.
+
+    The path is stored in an array for later cleanup.
+    """
+    tmpdir = tempfile.mkdtemp(dir=parent)
+    tempdirs.append(tmpdir)
+
+    return tmpdir
+
+
 def walk_parents(path):
     """
     Walks up the tree to the root directory.
diff --git a/rbtools/utils/testbase.py b/rbtools/utils/testbase.py
index 659d9693f204524ef76c1e0edd66768d73e38d12..f6710ab92fe229a19a037477f14e29fc98344d8f 100644
--- a/rbtools/utils/testbase.py
+++ b/rbtools/utils/testbase.py
@@ -2,14 +2,12 @@ import os
 import sys
 import unittest
 import uuid
-from tempfile import mkdtemp
-
 try:
     from cStringIO import StringIO
 except ImportError:
     from StringIO import StringIO
 
-from rbtools.utils.filesystem import cleanup_tempfiles
+from rbtools.utils.filesystem import cleanup_tempfiles, make_tempdir
 
 
 class RBTestBase(unittest.TestCase):
@@ -19,18 +17,20 @@ class RBTestBase(unittest.TestCase):
     run. This is because RBTools actively works with files and almost all
     tests employ file I/O operations."""
     def setUp(self):
+        self._old_cwd = os.getcwd()
         self.set_user_home_tmp()
 
     def tearDown(self):
+        os.chdir(self._old_cwd)
         cleanup_tempfiles()
 
     def create_tmp_dir(self):
-        """Creates and returnds tmp directory located in CWD."""
-        return mkdtemp(dir=os.getcwd())
+        """Creates and returns a temporary directory."""
+        return make_tempdir()
 
     def chdir_tmp(self, dir=None):
-        """Changes current directory to a temoprary directory."""
-        dirname = mkdtemp(dir=dir)
+        """Changes current directory to a temporary directory."""
+        dirname = make_tempdir(parent=dir)
         os.chdir(dirname)
         return dirname
 
@@ -75,7 +75,7 @@ class RBTestBase(unittest.TestCase):
 
     def set_user_home_tmp(self):
         """Set temporary directory as current user's home."""
-        self.set_user_home(mkdtemp())
+        self.set_user_home(make_tempdir())
 
     def catch_output(self, func):
         stdout = sys.stdout
