diff --git a/.idea/compiler.xml b/.idea/compiler.xml
index de5a2c1a30..83b640e02c 100644
--- a/.idea/compiler.xml
+++ b/.idea/compiler.xml
@@ -14,9 +14,6 @@
-
-
-
@@ -28,9 +25,6 @@
-
-
-
@@ -64,8 +58,6 @@
-
-
@@ -85,15 +77,15 @@
-
-
-
-
-
-
+
+
+
+
+
+
@@ -104,8 +96,6 @@
-
-
diff --git a/docs/source/changelog.rst b/docs/source/changelog.rst
index 618361a151..c676118a55 100644
--- a/docs/source/changelog.rst
+++ b/docs/source/changelog.rst
@@ -6,6 +6,9 @@ from the previous milestone release.
UNRELEASED
----------
+* About half of the code in test-utils has been moved to a new module ``node-driver``,
+ and the test scope modules are now located in a ``testing`` directory.
+
* Contract Upgrades: deprecated RPC authorisation / deauthorisation API calls in favour of equivalent flows in ContractUpgradeFlow.
Implemented contract upgrade persistence using JDBC backed persistent map.
diff --git a/settings.gradle b/settings.gradle
index 8c4324969c..e1beec48a7 100644
--- a/settings.gradle
+++ b/settings.gradle
@@ -22,7 +22,10 @@ include 'test-common'
include 'test-utils'
include 'smoke-test-utils'
include 'node-driver'
-project(':node-driver').projectDir = new File("$settingsDir/testing/node-driver")
+// Avoid making 'testing' a project, and allow build.gradle files to refer to these by their simple names:
+['test-common', 'test-utils', 'smoke-test-utils', 'node-driver'].each {
+ project(":$it").projectDir = new File("$settingsDir/testing/$it")
+}
include 'tools:explorer'
include 'tools:explorer:capsule'
include 'tools:demobench'
diff --git a/smoke-test-utils/build.gradle b/testing/smoke-test-utils/build.gradle
similarity index 100%
rename from smoke-test-utils/build.gradle
rename to testing/smoke-test-utils/build.gradle
diff --git a/smoke-test-utils/src/main/kotlin/net/corda/smoketesting/NodeConfig.kt b/testing/smoke-test-utils/src/main/kotlin/net/corda/smoketesting/NodeConfig.kt
similarity index 100%
rename from smoke-test-utils/src/main/kotlin/net/corda/smoketesting/NodeConfig.kt
rename to testing/smoke-test-utils/src/main/kotlin/net/corda/smoketesting/NodeConfig.kt
diff --git a/smoke-test-utils/src/main/kotlin/net/corda/smoketesting/NodeProcess.kt b/testing/smoke-test-utils/src/main/kotlin/net/corda/smoketesting/NodeProcess.kt
similarity index 100%
rename from smoke-test-utils/src/main/kotlin/net/corda/smoketesting/NodeProcess.kt
rename to testing/smoke-test-utils/src/main/kotlin/net/corda/smoketesting/NodeProcess.kt
diff --git a/test-common/build.gradle b/testing/test-common/build.gradle
similarity index 100%
rename from test-common/build.gradle
rename to testing/test-common/build.gradle
diff --git a/test-common/src/main/resources/log4j2-test.xml b/testing/test-common/src/main/resources/log4j2-test.xml
similarity index 100%
rename from test-common/src/main/resources/log4j2-test.xml
rename to testing/test-common/src/main/resources/log4j2-test.xml
diff --git a/test-utils/build.gradle b/testing/test-utils/build.gradle
similarity index 100%
rename from test-utils/build.gradle
rename to testing/test-utils/build.gradle
diff --git a/test-utils/src/main/kotlin/net/corda/testing/CoreTestUtils.kt b/testing/test-utils/src/main/kotlin/net/corda/testing/CoreTestUtils.kt
similarity index 100%
rename from test-utils/src/main/kotlin/net/corda/testing/CoreTestUtils.kt
rename to testing/test-utils/src/main/kotlin/net/corda/testing/CoreTestUtils.kt
diff --git a/test-utils/src/main/kotlin/net/corda/testing/Expect.kt b/testing/test-utils/src/main/kotlin/net/corda/testing/Expect.kt
similarity index 100%
rename from test-utils/src/main/kotlin/net/corda/testing/Expect.kt
rename to testing/test-utils/src/main/kotlin/net/corda/testing/Expect.kt
diff --git a/test-utils/src/main/kotlin/net/corda/testing/FlowStackSnapshot.kt b/testing/test-utils/src/main/kotlin/net/corda/testing/FlowStackSnapshot.kt
similarity index 100%
rename from test-utils/src/main/kotlin/net/corda/testing/FlowStackSnapshot.kt
rename to testing/test-utils/src/main/kotlin/net/corda/testing/FlowStackSnapshot.kt
diff --git a/test-utils/src/main/kotlin/net/corda/testing/IntegrationTestCategory.kt b/testing/test-utils/src/main/kotlin/net/corda/testing/IntegrationTestCategory.kt
similarity index 100%
rename from test-utils/src/main/kotlin/net/corda/testing/IntegrationTestCategory.kt
rename to testing/test-utils/src/main/kotlin/net/corda/testing/IntegrationTestCategory.kt
diff --git a/test-utils/src/main/kotlin/net/corda/testing/LedgerDSLInterpreter.kt b/testing/test-utils/src/main/kotlin/net/corda/testing/LedgerDSLInterpreter.kt
similarity index 100%
rename from test-utils/src/main/kotlin/net/corda/testing/LedgerDSLInterpreter.kt
rename to testing/test-utils/src/main/kotlin/net/corda/testing/LedgerDSLInterpreter.kt
diff --git a/test-utils/src/main/kotlin/net/corda/testing/LogHelper.kt b/testing/test-utils/src/main/kotlin/net/corda/testing/LogHelper.kt
similarity index 100%
rename from test-utils/src/main/kotlin/net/corda/testing/LogHelper.kt
rename to testing/test-utils/src/main/kotlin/net/corda/testing/LogHelper.kt
diff --git a/test-utils/src/main/kotlin/net/corda/testing/Measure.kt b/testing/test-utils/src/main/kotlin/net/corda/testing/Measure.kt
similarity index 100%
rename from test-utils/src/main/kotlin/net/corda/testing/Measure.kt
rename to testing/test-utils/src/main/kotlin/net/corda/testing/Measure.kt
diff --git a/test-utils/src/main/kotlin/net/corda/testing/ProjectStructure.kt b/testing/test-utils/src/main/kotlin/net/corda/testing/ProjectStructure.kt
similarity index 100%
rename from test-utils/src/main/kotlin/net/corda/testing/ProjectStructure.kt
rename to testing/test-utils/src/main/kotlin/net/corda/testing/ProjectStructure.kt
diff --git a/test-utils/src/main/kotlin/net/corda/testing/SerializationTestHelpers.kt b/testing/test-utils/src/main/kotlin/net/corda/testing/SerializationTestHelpers.kt
similarity index 100%
rename from test-utils/src/main/kotlin/net/corda/testing/SerializationTestHelpers.kt
rename to testing/test-utils/src/main/kotlin/net/corda/testing/SerializationTestHelpers.kt
diff --git a/test-utils/src/main/kotlin/net/corda/testing/TestConstants.kt b/testing/test-utils/src/main/kotlin/net/corda/testing/TestConstants.kt
similarity index 100%
rename from test-utils/src/main/kotlin/net/corda/testing/TestConstants.kt
rename to testing/test-utils/src/main/kotlin/net/corda/testing/TestConstants.kt
diff --git a/test-utils/src/main/kotlin/net/corda/testing/TestDSL.kt b/testing/test-utils/src/main/kotlin/net/corda/testing/TestDSL.kt
similarity index 100%
rename from test-utils/src/main/kotlin/net/corda/testing/TestDSL.kt
rename to testing/test-utils/src/main/kotlin/net/corda/testing/TestDSL.kt
diff --git a/test-utils/src/main/kotlin/net/corda/testing/TestDependencyInjectionBase.kt b/testing/test-utils/src/main/kotlin/net/corda/testing/TestDependencyInjectionBase.kt
similarity index 100%
rename from test-utils/src/main/kotlin/net/corda/testing/TestDependencyInjectionBase.kt
rename to testing/test-utils/src/main/kotlin/net/corda/testing/TestDependencyInjectionBase.kt
diff --git a/test-utils/src/main/kotlin/net/corda/testing/TestTimestamp.kt b/testing/test-utils/src/main/kotlin/net/corda/testing/TestTimestamp.kt
similarity index 100%
rename from test-utils/src/main/kotlin/net/corda/testing/TestTimestamp.kt
rename to testing/test-utils/src/main/kotlin/net/corda/testing/TestTimestamp.kt
diff --git a/test-utils/src/main/kotlin/net/corda/testing/TransactionDSLInterpreter.kt b/testing/test-utils/src/main/kotlin/net/corda/testing/TransactionDSLInterpreter.kt
similarity index 100%
rename from test-utils/src/main/kotlin/net/corda/testing/TransactionDSLInterpreter.kt
rename to testing/test-utils/src/main/kotlin/net/corda/testing/TransactionDSLInterpreter.kt
diff --git a/test-utils/src/main/kotlin/net/corda/testing/contracts/DummyContract.kt b/testing/test-utils/src/main/kotlin/net/corda/testing/contracts/DummyContract.kt
similarity index 100%
rename from test-utils/src/main/kotlin/net/corda/testing/contracts/DummyContract.kt
rename to testing/test-utils/src/main/kotlin/net/corda/testing/contracts/DummyContract.kt
diff --git a/test-utils/src/main/kotlin/net/corda/testing/contracts/DummyContractV2.kt b/testing/test-utils/src/main/kotlin/net/corda/testing/contracts/DummyContractV2.kt
similarity index 100%
rename from test-utils/src/main/kotlin/net/corda/testing/contracts/DummyContractV2.kt
rename to testing/test-utils/src/main/kotlin/net/corda/testing/contracts/DummyContractV2.kt
diff --git a/test-utils/src/main/kotlin/net/corda/testing/contracts/DummyDealContract.kt b/testing/test-utils/src/main/kotlin/net/corda/testing/contracts/DummyDealContract.kt
similarity index 100%
rename from test-utils/src/main/kotlin/net/corda/testing/contracts/DummyDealContract.kt
rename to testing/test-utils/src/main/kotlin/net/corda/testing/contracts/DummyDealContract.kt
diff --git a/test-utils/src/main/kotlin/net/corda/testing/contracts/DummyLinearContract.kt b/testing/test-utils/src/main/kotlin/net/corda/testing/contracts/DummyLinearContract.kt
similarity index 100%
rename from test-utils/src/main/kotlin/net/corda/testing/contracts/DummyLinearContract.kt
rename to testing/test-utils/src/main/kotlin/net/corda/testing/contracts/DummyLinearContract.kt
diff --git a/test-utils/src/main/kotlin/net/corda/testing/contracts/DummyState.kt b/testing/test-utils/src/main/kotlin/net/corda/testing/contracts/DummyState.kt
similarity index 100%
rename from test-utils/src/main/kotlin/net/corda/testing/contracts/DummyState.kt
rename to testing/test-utils/src/main/kotlin/net/corda/testing/contracts/DummyState.kt
diff --git a/test-utils/src/main/kotlin/net/corda/testing/contracts/VaultFiller.kt b/testing/test-utils/src/main/kotlin/net/corda/testing/contracts/VaultFiller.kt
similarity index 100%
rename from test-utils/src/main/kotlin/net/corda/testing/contracts/VaultFiller.kt
rename to testing/test-utils/src/main/kotlin/net/corda/testing/contracts/VaultFiller.kt
diff --git a/test-utils/src/main/kotlin/net/corda/testing/http/HttpApi.kt b/testing/test-utils/src/main/kotlin/net/corda/testing/http/HttpApi.kt
similarity index 100%
rename from test-utils/src/main/kotlin/net/corda/testing/http/HttpApi.kt
rename to testing/test-utils/src/main/kotlin/net/corda/testing/http/HttpApi.kt
diff --git a/test-utils/src/main/kotlin/net/corda/testing/http/HttpUtils.kt b/testing/test-utils/src/main/kotlin/net/corda/testing/http/HttpUtils.kt
similarity index 100%
rename from test-utils/src/main/kotlin/net/corda/testing/http/HttpUtils.kt
rename to testing/test-utils/src/main/kotlin/net/corda/testing/http/HttpUtils.kt
diff --git a/test-utils/src/main/kotlin/net/corda/testing/messaging/SimpleMQClient.kt b/testing/test-utils/src/main/kotlin/net/corda/testing/messaging/SimpleMQClient.kt
similarity index 100%
rename from test-utils/src/main/kotlin/net/corda/testing/messaging/SimpleMQClient.kt
rename to testing/test-utils/src/main/kotlin/net/corda/testing/messaging/SimpleMQClient.kt
diff --git a/test-utils/src/main/kotlin/net/corda/testing/node/MockAttachmentStorage.kt b/testing/test-utils/src/main/kotlin/net/corda/testing/node/MockAttachmentStorage.kt
similarity index 100%
rename from test-utils/src/main/kotlin/net/corda/testing/node/MockAttachmentStorage.kt
rename to testing/test-utils/src/main/kotlin/net/corda/testing/node/MockAttachmentStorage.kt
diff --git a/test-utils/src/main/kotlin/net/corda/testing/performance/Rate.kt b/testing/test-utils/src/main/kotlin/net/corda/testing/performance/Rate.kt
similarity index 100%
rename from test-utils/src/main/kotlin/net/corda/testing/performance/Rate.kt
rename to testing/test-utils/src/main/kotlin/net/corda/testing/performance/Rate.kt
diff --git a/test-utils/src/main/kotlin/net/corda/testing/schemas/DummyDealStateSchemaV1.kt b/testing/test-utils/src/main/kotlin/net/corda/testing/schemas/DummyDealStateSchemaV1.kt
similarity index 100%
rename from test-utils/src/main/kotlin/net/corda/testing/schemas/DummyDealStateSchemaV1.kt
rename to testing/test-utils/src/main/kotlin/net/corda/testing/schemas/DummyDealStateSchemaV1.kt
diff --git a/test-utils/src/main/kotlin/net/corda/testing/schemas/DummyLinearStateSchemaV1.kt b/testing/test-utils/src/main/kotlin/net/corda/testing/schemas/DummyLinearStateSchemaV1.kt
similarity index 100%
rename from test-utils/src/main/kotlin/net/corda/testing/schemas/DummyLinearStateSchemaV1.kt
rename to testing/test-utils/src/main/kotlin/net/corda/testing/schemas/DummyLinearStateSchemaV1.kt
diff --git a/test-utils/src/main/kotlin/net/corda/testing/schemas/DummyLinearStateSchemaV2.kt b/testing/test-utils/src/main/kotlin/net/corda/testing/schemas/DummyLinearStateSchemaV2.kt
similarity index 100%
rename from test-utils/src/main/kotlin/net/corda/testing/schemas/DummyLinearStateSchemaV2.kt
rename to testing/test-utils/src/main/kotlin/net/corda/testing/schemas/DummyLinearStateSchemaV2.kt
diff --git a/test-utils/src/main/resources/META-INF/services/net.corda.node.services.statemachine.FlowStackSnapshotFactory b/testing/test-utils/src/main/resources/META-INF/services/net.corda.node.services.statemachine.FlowStackSnapshotFactory
similarity index 100%
rename from test-utils/src/main/resources/META-INF/services/net.corda.node.services.statemachine.FlowStackSnapshotFactory
rename to testing/test-utils/src/main/resources/META-INF/services/net.corda.node.services.statemachine.FlowStackSnapshotFactory