diff --git a/pulsar/scripts/chown_working_directory.py b/pulsar/scripts/chown_working_directory.py
index 0e9b7abcf3ccce3777a12127dfd2d3fe1f62abed..8b01ddf245769ce068d3890becf670dc7d2d49f8 100644
--- a/pulsar/scripts/chown_working_directory.py
+++ b/pulsar/scripts/chown_working_directory.py
@@ -29,7 +29,7 @@ def main(argv=None):
     else:
         job_directory = abspath(args.job_directory)
         assert job_directory
-    command = "chown -R '%s' '%s'" % (user, job_directory)
+    command = "chown -Rh '%s' '%s'" % (user, job_directory)
     system(command)
 
 
diff --git a/test/test_utils.py b/test/test_utils.py
index 08863b2c2db9830d2d92f7a2be3339d51bb91ff8..33cf0b1593ae5a558705743722d663bb61178ba2 100644
--- a/test/test_utils.py
+++ b/test/test_utils.py
@@ -6,7 +6,7 @@ import sys
 import threading
 
 from contextlib import contextmanager
-from stat import S_IXOTH
+from stat import S_IXGRP, S_IXOTH
 from os import pardir, stat, chmod, access, X_OK, pathsep, environ
 from os import makedirs, listdir
 from os.path import join, dirname, isfile, split
@@ -60,12 +60,13 @@ integration_test = timed(INTEGRATION_MAXIMUM_TEST_TIME)
 
 TEST_DIR = dirname(__file__)
 ROOT_DIR = join(TEST_DIR, pardir)
+TEST_TEMPDIR_PREFIX='tmp_pulsar_'
 
 
 class TempDirectoryTestCase(TestCase):
 
     def setUp(self):
-        self.temp_directory = mkdtemp()
+        self.temp_directory = temp_directory_persist(prefix=TEST_TEMPDIR_PREFIX)
 
     def tearDown(self):
         rmtree(self.temp_directory)
@@ -84,7 +85,7 @@ def get_test_tool():
 class TestManager(object):
 
     def setup_temp_directory(self):
-        self.temp_directory = mkdtemp()
+        self.temp_directory = temp_directory_persist(prefix='test_manager_')
         self.__job_directory = JobDirectory(self.temp_directory, '1')
 
     def cleanup_temp_directory(self):
@@ -96,19 +97,23 @@ class TestManager(object):
 
 @contextmanager
 def test_job_directory():
-    with temp_directory() as directory:
+    with temp_directory(prefix='job_') as directory:
         yield JobDirectory(directory, '1')
 
 
 @contextmanager
-def temp_directory():
-    directory = mkdtemp()
+def temp_directory(prefix=''):
+    directory = temp_directory_persist(prefix=prefix)
     try:
         yield directory
     finally:
         rmtree(directory)
 
 
+def temp_directory_persist(prefix=''):
+    return mkdtemp(prefix=TEST_TEMPDIR_PREFIX + prefix)
+
+
 @contextmanager
 def test_manager():
     manager = TestManager()
@@ -202,7 +207,7 @@ class BaseManagerTestCase(TestCase):
 def minimal_app_for_managers():
     """ Minimimal app description for consumption by managers.
     """
-    staging_directory = mkdtemp()
+    staging_directory = temp_directory_persist(prefix='minimal_app_')
     rmtree(staging_directory)
     authorizer = TestAuthorizer()
     return Bunch(staging_directory=staging_directory,
@@ -251,7 +256,7 @@ def test_pulsar_server(global_conf={}, app_conf={}, test_conf={}):
 class RestartablePulsarAppProvider(object):
 
     def __init__(self, global_conf={}, app_conf={}, test_conf={}, web=True):
-        self.staging_directory = mkdtemp()
+        self.staging_directory = temp_directory_persist(prefix='staging_')
         self.global_conf = global_conf
         self.app_conf = app_conf
         self.test_conf = test_conf
@@ -295,12 +300,12 @@ def test_pulsar_app(
 ):
     clean_staging_directory = False
     if staging_directory is None:
-        staging_directory = mkdtemp()
+        staging_directory = temp_directory_persist(prefix='staging_')
         clean_staging_directory = True
     # Make staging directory world executable for run as user tests.
     mode = stat(staging_directory).st_mode
-    chmod(staging_directory, mode | S_IXOTH)
-    cache_directory = mkdtemp()
+    chmod(staging_directory, mode | S_IXGRP | S_IXOTH)
+    cache_directory = temp_directory_persist(prefix='cache_')
     app_conf["staging_directory"] = staging_directory
     app_conf["file_cache_dir"] = cache_directory
     app_conf["ensure_cleanup"] = True