diff --git a/cekit/builders/osbs.py b/cekit/builders/osbs.py
index 674c81b..7c4e950 100644
--- a/cekit/builders/osbs.py
+++ b/cekit/builders/osbs.py
@@ -11,6 +11,7 @@ from cekit.config import Config
 from cekit.builder import Builder
 from cekit.descriptor.resource import _PlainResource
 from cekit.errors import CekitError
+from cekit.tools import Chdir
 
 logger = logging.getLogger('cekit')
 config = Config()
@@ -336,16 +337,3 @@ class DistGit(object):
             logger.info("Changes are not pushed, exiting")
             sys.exit(0)
 
-
-class Chdir(object):
-    """ Context manager for changing the current working directory """
-
-    def __init__(self, newPath):
-        self.newPath = os.path.expanduser(newPath)
-
-    def __enter__(self):
-        self.savedPath = os.getcwd()
-        os.chdir(self.newPath)
-
-    def __exit__(self, etype, value, traceback):
-        os.chdir(self.savedPath)
diff --git a/cekit/tools.py b/cekit/tools.py
index 3542e73..cfceefe 100644
--- a/cekit/tools.py
+++ b/cekit/tools.py
@@ -83,3 +83,16 @@ def get_brew_url(md5):
                      ex.output)
         raise ex
     return url
+
+class Chdir(object):
+    """ Context manager for changing the current working directory """
+
+    def __init__(self, newPath):
+        self.newPath = os.path.expanduser(newPath)
+
+    def __enter__(self):
+        self.savedPath = os.getcwd()
+        os.chdir(self.newPath)
+
+    def __exit__(self, etype, value, traceback):
+        os.chdir(self.savedPath)
\ No newline at end of file

diff --git a/cekit/test/runner.py b/cekit/test/runner.py
index 4acc63d..5aa41ed 100644
--- a/cekit/test/runner.py
+++ b/cekit/test/runner.py
@@ -3,7 +3,7 @@ import getpass
 import logging
 import subprocess
 
-
+from cekit.tools import Chdir
 from cekit.errors import CekitError
 
 logger = logging.getLogger('cekit')
@@ -58,6 +58,8 @@ class TestRunner(object):
 
         try:
             from behave.__main__ import main as behave_main
-            behave_main(args)
+
+            with Chdir(os.path.join(self.target, 'test')):
+                behave_main(args)
         except:
             raise CekitError("Test execution failed, please consult output above")
diff --git a/tests/test_addhelp.py b/tests/test_addhelp.py
index 59e133f..eb3a1f6 100644
--- a/tests/test_addhelp.py
+++ b/tests/test_addhelp.py
@@ -9,7 +9,7 @@ import sys
 import shutil
 import yaml
 import pytest
-from cekit.builders.osbs import Chdir
+from cekit.tools import Chdir
 from cekit.cli import Cekit
 
 image_descriptor = {
diff --git a/tests/test_expose_services.py b/tests/test_expose_services.py
index 2873d16..f4c51fa 100644
--- a/tests/test_expose_services.py
+++ b/tests/test_expose_services.py
@@ -9,7 +9,7 @@ import socket
 import sys
 import yaml
 
-from cekit.builders.osbs import Chdir
+from cekit.tools import Chdir
 from cekit.cli import Cekit
 
 image_descriptor = {
diff --git a/tests/test_validate.py b/tests/test_validate.py
index 34528db..a83a44a 100644
--- a/tests/test_validate.py
+++ b/tests/test_validate.py
@@ -5,7 +5,7 @@ import sys
 import yaml
 import pytest
 
-from cekit.builders.osbs import Chdir
+from cekit.tools import Chdir
 from cekit.errors import CekitError
 from cekit.cli import Cekit
 

Test results are no longer output to target directory
results and output directories are now collocated with the image.yaml file, where they used to be in target/test
tests/test_addhelp.py::test_addhelp_mutex_cmdline tests/test_addhelp.py::test_config_override_help_template tests/test_addhelp.py::test_no_override_help_template tests/test_addhelp.py::test_image_override_help_template tests/test_addhelp.py::test_image_override_config_help_template tests/test_addhelp.py::test_confNone_cmdlineNone tests/test_addhelp.py::test_confFalse_cmdlineNone tests/test_addhelp.py::test_confTrue_cmdlineNone tests/test_addhelp.py::test_confNone_cmdlineTrue tests/test_addhelp.py::test_confFalse_cmdlineTrue tests/test_addhelp.py::test_confTrue_cmdlineTrue tests/test_addhelp.py::test_confNone_cmdlineFalse tests/test_addhelp.py::test_confFalse_cmdlineFalse tests/test_addhelp.py::test_confTrue_cmdlineFalse tests/test_expose_services.py::test_expose_services_label_not_generated_wo_redhat tests/test_expose_services.py::test_expose_services_label_generated tests/test_expose_services.py::test_expose_services_label_no_ports_not_generated tests/test_expose_services.py::test_expose_services_label_not_generated_without_expose tests/test_expose_services.py::test_expose_services_label_not_overridden tests/test_expose_services.py::test_expose_services_generated_default_protocol_tcp tests/test_expose_services.py::test_expose_services_generated_specify_protocol tests/test_expose_services.py::test_expose_services_not_generated_no_service tests/test_expose_services.py::test_expose_services_service_included tests/test_validate.py::test_image_generate_with_multiple_overrides tests/test_validate.py::test_module_override tests/test_validate.py::test_local_module_injection tests/test_validate.py::test_local_module_not_injected tests/test_validate.py::test_run_override_user tests/test_validate.py::test_run_override_artifact tests/test_validate.py::test_run_path_artifact_brew tests/test_validate.py::test_run_path_artifact_target tests/test_validate.py::test_execution_order tests/test_validate.py::test_override_modules_child tests/test_validate.py::test_override_modules_flat tests/test_validate.py::test_execution_order_flat