diff --git a/.gitignore b/.gitignore
index 6f70c11376c37ee4ff8d9b888e9e2b48b1a75fec..a1d9ee9769a42e2659eaa1a33d30ebfb2e4dff50 100644
--- a/.gitignore
+++ b/.gitignore
@@ -55,3 +55,8 @@ node_modules/
 
 # Vim swap files
 *.swp
+
+# backbone-adapter-testsuite
+
+test/features/*.feature
+test/fixtures/*.json
\ No newline at end of file
diff --git a/features/adapter_auth.feature b/features/adapter_auth.feature
deleted file mode 100644
index c55e27199db07f4ca6145afc63ed0ddf36cad4a9..0000000000000000000000000000000000000000
--- a/features/adapter_auth.feature
+++ /dev/null
@@ -1,13 +0,0 @@
-Feature: Does the adapter authenticate?
-  When an adapter instance is created it authenticates and receives a token
-
-  Scenario: A token is granted with valid config
-    Given valid config
-    When the adapter instance is created
-    When the auth method is called
-    Then the adapter credentials are populated
-
-  Scenario: Auth fails with invalid config
-    Given invalid config
-    When the adapter instance is created
-    Then the adapter auth fails
\ No newline at end of file
diff --git a/features/adapter_broadcast.feature b/features/adapter_broadcast.feature
deleted file mode 100644
index e37344afab59cc9f6cea2ce9be74ba7bcf8ba9de..0000000000000000000000000000000000000000
--- a/features/adapter_broadcast.feature
+++ /dev/null
@@ -1,18 +0,0 @@
-Feature: Can the adapter broadcast messages?
-  The adapter publish method works as expected
-
-  Scenario: A message can be published successfully
-    Given valid config
-    When the adapter instance is created
-    When the auth method is called
-    When a mock notify API response is configured to return success
-    When the broadcast method is called
-    Then a successful response is returned with status 200
-
-  Scenario: A failed publish returns a 403
-    Given valid config
-    When the adapter instance is created
-    When the auth method is called
-    When a mock notify API response is configured to return an error
-    When the broadcast method is called
-    Then an error response is returned with status 403
\ No newline at end of file
diff --git a/features/adapter_get-authorization-header.feature b/features/adapter_get-authorization-header.feature
deleted file mode 100644
index 554acdf0378c917328ca72921843c39315a1f580..0000000000000000000000000000000000000000
--- a/features/adapter_get-authorization-header.feature
+++ /dev/null
@@ -1,21 +0,0 @@
-Feature: Can the adapter create an authorization header?
-  The adapter getAuthorizationHeader method works as expected
-
-  Scenario: getAuthorizationHeader returns a bearer token
-    Given valid config
-    When the adapter instance is created
-    When the auth method is called
-    When the getAuthorizationHeader method is called
-    Then a headers object is returned containing a bearer token authorization header
-
-  Scenario: getAuthorizationHeader implicitly calls auth if required
-    Given valid config
-    When the adapter instance is created
-    When the getAuthorizationHeader method is called
-    Then a headers object is returned containing a bearer token authorization header
-
-  Scenario: getAuthorizationHeader implicitly calls auth if required
-    Given invalid config
-    When the adapter instance is created
-    When the getAuthorizationHeader method is called
-    Then an error response is returned with status 403
\ No newline at end of file
diff --git a/features/adapter_poll.feature b/features/adapter_poll.feature
deleted file mode 100644
index 9ecc9e9553dd86c54bda7aa66d36950eed619741..0000000000000000000000000000000000000000
--- a/features/adapter_poll.feature
+++ /dev/null
@@ -1,42 +0,0 @@
-# When the queue contains x messages 
-# only mocks the API response 
-# Testing how the API behaves with a full queue are defined in the API 
-
-Feature: Can the adapter receive messages?
-  The adapter poll method works as expected
-
-  Scenario: No messages are received succecssfully if the queue is empty
-    Given valid config
-    When the adapter instance is created
-    When the auth method is called
-    When a mock receive API response is configured to return 0 messages
-    When the poll method is called
-    Then a successful response is returned with 0 messages  
-
-  Scenario: 2 messages are received succecssfully if the queue contains 2 messages
-    Given valid config
-    When the adapter instance is created
-    When the auth method is called
-    When a mock receive API response is configured to return 2 messages 
-    When the poll method is called
-    Then a successful response is returned with 2 messages
-    Then the protocol "validate" method is called 2 times
-    Then the protocol "decode" method is called 2 times
-
-  Scenario: 10 messages are received succecssfully if the queue contains 10 messages
-    Given valid config
-    When the adapter instance is created
-    When the auth method is called
-    When a mock receive API response is configured to return 10 messages 
-    When the poll method is called
-    Then a successful response is returned with 10 messages
-    Then the protocol "validate" method is called 10 times
-    Then the protocol "decode" method is called 10 times
-
-  Scenario: An invalid token returns a forbidden response 
-    Given valid config 
-    When the adapter instance is created 
-    When the auth method is called 
-    When a mock receive API response is configured to return an error
-    When the poll method is called 
-    Then an error response is returned with status 403
diff --git a/features/adapter_publish.feature b/features/adapter_publish.feature
deleted file mode 100644
index 7e7e7de1681a3220f61b829b457e7e35904ca7c4..0000000000000000000000000000000000000000
--- a/features/adapter_publish.feature
+++ /dev/null
@@ -1,18 +0,0 @@
-Feature: Can the adapter publish messages?
-  The adapter publish method works as expected
-
-  Scenario: A message can be published successfully
-    Given valid config
-    When the adapter instance is created
-    When the auth method is called
-    When a mock send API response is configured to return success
-    When the publish method is called
-    Then a successful response is returned with status 200
-
-  Scenario: A failed publish returns a 403
-    Given valid config
-    When the adapter instance is created
-    When the auth method is called
-    When a mock send API response is configured to return an error
-    When the publish method is called
-    Then an error response is returned with status 403
diff --git a/features/adapter_token-valid.feature b/features/adapter_token-valid.feature
deleted file mode 100644
index 53fe89de568f2878e113434c1d260930911bf1d7..0000000000000000000000000000000000000000
--- a/features/adapter_token-valid.feature
+++ /dev/null
@@ -1,21 +0,0 @@
-Feature: Is the token valid?
-  The adapter tokenValid method works as expected
-
-  Scenario: If adapter has not authed token is invalid
-    Given valid config
-    When the adapter instance is created
-    Then tokenValid returns false  
-
-  Scenario: If credentials.expiry is in the future token is valid
-    Given valid config
-    When the adapter instance is created
-    When the auth method is called
-    When the token expiry is in the future
-    Then tokenValid returns true  
-
-  Scenario: If credentials.expiry is in the past token is invalid
-    Given valid config
-    When the adapter instance is created
-    When the auth method is called
-    When the token expiry is in the past
-    Then tokenValid returns false 
diff --git a/features/adapter_validate.feature b/features/adapter_validate.feature
deleted file mode 100644
index c2af9f1ed21550495bc96952abc6793f436f236a..0000000000000000000000000000000000000000
--- a/features/adapter_validate.feature
+++ /dev/null
@@ -1,16 +0,0 @@
-Feature: Can the adapter validate messages?
-  The adapter validate method works as expected
-
-  Scenario: A valid message is successfully validated against the protocol schema
-    Given valid config
-    Given a valid message
-    When the adapter instance is created
-    When the validate method is called
-    Then the message is validated successfully  
-  
-  Scenario: An invalid message fails to validate against the protocol schema
-    Given valid config
-    Given an invalid message
-    When the adapter instance is created
-    When the validate method is called
-    Then the message fails to validate  
\ No newline at end of file
diff --git a/features/protocol_decode.feature b/features/protocol_decode.feature
deleted file mode 100644
index ab2a50fe616062fa715253515d6b8f5480407721..0000000000000000000000000000000000000000
--- a/features/protocol_decode.feature
+++ /dev/null
@@ -1,11 +0,0 @@
-# Decode and encode are provided as stubs which are intended to be overridden 
-# These can be used to translate the message or to invoke other functions 
-# to take action based on the type and content of messages
-
-Feature: Decode stubs passthru message unchanged
-  The protocol decode method works as expected
-
-  Scenario: Decode passes the message through unaltered
-    Given a valid message
-    When the protocol.decode method is called
-    Then the message is returned unaltered
diff --git a/features/protocol_encode.feature b/features/protocol_encode.feature
deleted file mode 100644
index 41bb57c287ba6b3981a97399c424e2257672d3b5..0000000000000000000000000000000000000000
--- a/features/protocol_encode.feature
+++ /dev/null
@@ -1,11 +0,0 @@
-# Decode and encode are provided as stubs which are intended to be overridden 
-# These can be used to translate the message or to invoke other functions 
-# to take action based on the type and content of messages
-
-Feature: Encode stubs passthru message unchanged
-  The protocol encode method works as expected
-
-  Scenario: Encode passes the message through unaltered
-    Given a valid message
-    When the protocol.encode method is called
-    Then the message is returned unaltered
\ No newline at end of file
diff --git a/features/protocol_get-type.feature b/features/protocol_get-type.feature
deleted file mode 100644
index 829ae6da8dfa6ed632a90007a0c11f3496e4449b..0000000000000000000000000000000000000000
--- a/features/protocol_get-type.feature
+++ /dev/null
@@ -1,12 +0,0 @@
-Feature: Can the protocol determine message type
-  The protocol getType method works as expected
-
-  Scenario: A valid message is successfully typed
-    Given a valid message
-    When protocol getType is called
-    Then getType returns message.payload.message_type if present
-
-  Scenario: An invalid message returns type:null
-    Given an invalid message
-    When protocol getType is called
-    Then getType returns null if message.payload.message_type is not present
diff --git a/features/protocol_validate.feature b/features/protocol_validate.feature
deleted file mode 100644
index a5293c46dc081a864a4e5ec3fd059175b65340a7..0000000000000000000000000000000000000000
--- a/features/protocol_validate.feature
+++ /dev/null
@@ -1,12 +0,0 @@
-Feature: Can the protocol validate messages?
-  The adapter validate method works as expected
-
-  Scenario: A valid message is successfully validated against the protocol schema
-    Given a valid message
-    When the protocol.validate method is called
-    Then the message is validated successfully  
-  
-  Scenario: An invalid message fails to validate against the protocol schema
-    Given an invalid message
-    When the protocol.validate method is called
-    Then the message fails to validate
\ No newline at end of file
diff --git a/features/schema_validate.feature b/features/schema_validate.feature
deleted file mode 100644
index 34f457a2543f1bf91948a4e367945e6565a985a9..0000000000000000000000000000000000000000
--- a/features/schema_validate.feature
+++ /dev/null
@@ -1,10 +0,0 @@
-# If the mock schema fixture fails to validate 
-# it can cause invalid messages to show as valid
-
-Feature: Is the mock schema valid?
-  The mock schema must validate in order for the adapter test to work
-
-  Scenario: The schema matches the OpenAPI specification
-    Given the test schema
-    When it is validated
-    Then it matches the OpenAPI specification  
\ No newline at end of file
diff --git a/test/fixtures/config-invalid.json b/test/fixtures/config-invalid.json
deleted file mode 100644
index 82625f6ebf737eb84933aa05088f3047bcebbd62..0000000000000000000000000000000000000000
--- a/test/fixtures/config-invalid.json
+++ /dev/null
@@ -1,7 +0,0 @@
-{
-  "api": "https://example.backbone.com/api",
-  "client_id": "invalid-client-id",
-  "client_name": "InvalidClientName",
-  "subscription": "dot.delimited.topic.subscription.#",
-  "secret": "TheCollaredDoveCoosInTheChimneyPot"
-}
\ No newline at end of file
diff --git a/test/fixtures/config-valid.json b/test/fixtures/config-valid.json
deleted file mode 100644
index 8b765ecfafaa8867795121d123534b56a58e8d43..0000000000000000000000000000000000000000
--- a/test/fixtures/config-valid.json
+++ /dev/null
@@ -1,7 +0,0 @@
-{
-  "api": "https://example.backbone.com/api",
-  "client_id": "unique-client-id",
-  "client_name": "UniqueClientName",
-  "subscription": "dot.delimited.topic.subscription.#",
-  "secret": "TheGeeseFlySouthInWinter"
-}
\ No newline at end of file
diff --git a/test/fixtures/message-vehicle-status-invalid.json b/test/fixtures/message-vehicle-status-invalid.json
deleted file mode 100644
index c59f56d02636abfa7d3b52a7b028126d0f25d2fc..0000000000000000000000000000000000000000
--- a/test/fixtures/message-vehicle-status-invalid.json
+++ /dev/null
@@ -1,20 +0,0 @@
-{
-  "metadata": {
-    "source": "ae",
-    "destination": "soar.po.ecosub.eco1",
-    "delivery_type": "publish",
-    "message_id": "test"
-  },
-  "payload": {
-    "messagetype": "VehicleStatus",
-    "operatorID": 1,
-    "vehicleID": 12,
-    "coordinates": {
-      "latitude": "monkeys",
-      "longitude": "janvier",
-      "depth": "twenty five metres please",
-      "projection": 4326
-    },
-    "battery_percentage": "plenty"
-  }
-}
\ No newline at end of file
diff --git a/test/fixtures/message-vehicle-status.json b/test/fixtures/message-vehicle-status.json
deleted file mode 100644
index 55cdd818781ab404ebf70d3087a7f6c83396cc3a..0000000000000000000000000000000000000000
--- a/test/fixtures/message-vehicle-status.json
+++ /dev/null
@@ -1,20 +0,0 @@
-{
-  "metadata": {
-    "source": "ae",
-    "destination": "soar.po.ecosub.eco1",
-    "delivery_type": "publish",
-    "message_id": "test"
-  },
-  "payload": {
-    "message_type": "VehicleStatus",
-    "operator_id": "po",
-    "vehicle_id": "eco1",
-    "coordinates": {
-      "latitude": 57.234,
-      "longitude": -8.432,
-      "depth": 50,
-      "projection": 4326
-    },
-    "battery_percentage": 64
-  }
-}
\ No newline at end of file
diff --git a/test/fixtures/response-denied-token.json b/test/fixtures/response-denied-token.json
deleted file mode 100644
index d5fb311657bbafe5d89d35d1a24313c0ad784feb..0000000000000000000000000000000000000000
--- a/test/fixtures/response-denied-token.json
+++ /dev/null
@@ -1,3 +0,0 @@
-{
-  "message": "Invalid client credentials"
-}
\ No newline at end of file
diff --git a/test/fixtures/response-valid-token.json b/test/fixtures/response-valid-token.json
deleted file mode 100644
index 87306ff195913ce9ba866065ede968128439d3fa..0000000000000000000000000000000000000000
--- a/test/fixtures/response-valid-token.json
+++ /dev/null
@@ -1,4 +0,0 @@
-{
-  "token": "gAAAAABjwB-vxtER44M2en6xYyt7G1WXp8QwfsiHw-ijCqNBZpQPwxxrBHzUU1fQ9lfPPo4QHj50p-yh203dV6zLLoTzuiReqGzE2InqAxOwv4gddlQWNFJKyrmg4mVVMX2VZe2cCAljmHxEo66BHgt_T24AieedMnI4VR2kw4SFiooFv5nr2W8=",
-  "expiry": "2030-12-31T23:59:59.000000"
-}
\ No newline at end of file