diff --git a/build/integration/.gitignore b/build/integration/.gitignore
new file mode 100644
index 0000000000000000000000000000000000000000..18b981bf7ed87b284739e6a4c011883436674339
--- /dev/null
+++ b/build/integration/.gitignore
@@ -0,0 +1,3 @@
+vendor
+output
+composer.lock
diff --git a/build/integration/features/bootstrap/FeatureContext.php b/build/integration/features/bootstrap/FeatureContext.php
new file mode 100644
index 0000000000000000000000000000000000000000..e1185debbc5675315757885a7d8ad8cbe2d2bc31
--- /dev/null
+++ b/build/integration/features/bootstrap/FeatureContext.php
@@ -0,0 +1,91 @@
+<?php
+
+use Behat\Behat\Context\BehatContext;
+use GuzzleHttp\Client;
+use GuzzleHttp\Message\ResponseInterface;
+
+//
+// Require 3rd-party libraries here:
+//
+//   require_once 'PHPUnit/Autoload.php';
+//   require_once 'PHPUnit/Framework/Assert/Functions.php';
+//
+
+/**
+ * Features context.
+ */
+class FeatureContext extends BehatContext {
+
+    /** @var string */
+    private $baseUrl = '';
+
+    /** @var ResponseInterface */
+    private $response = null;
+
+	/** @var string */
+	private $currentUser = '';
+
+	/** @var int */
+	private $apiVersion = 1;
+
+    /**
+     * Initializes context.
+     * Every scenario gets it's own context object.
+     *
+     * @param array $parameters context parameters (set them up through behat.yml)
+     */
+    public function __construct(array $parameters) {
+
+        // Initialize your context here
+		$this->baseUrl = $parameters['baseUrl'];
+		$this->adminUser = $parameters['admin'];
+    }
+
+    /**
+     * @When /^sending "([^"]*)" to "([^"]*)"$/
+     */
+    public function sendingTo($verb, $url) {
+        $fullUrl = $this->baseUrl . "v{$this->apiVersion}.php" . $url;
+        $client = new Client();
+        // TODO: get admin user from config
+        $options = [];
+		if ($this->currentUser === 'admin') {
+			$options['auth'] = $this->adminUser;
+		}
+
+		try {
+			$this->response = $client->send($client->createRequest($verb, $fullUrl, $options));
+		} catch (\GuzzleHttp\Exception\ClientException $ex) {
+			$this->response = $ex->getResponse();
+		}
+    }
+
+    /**
+     * @Then /^the status code should be "([^"]*)"$/
+     */
+    public function theStatusCodeShouldBe($statusCode) {
+        PHPUnit_Framework_Assert::assertEquals($statusCode, $this->response->getStatusCode());
+    }
+
+    /**
+     * @Given /^As an "([^"]*)"$/
+     */
+    public function asAn($user) {
+		$this->currentUser = $user;
+    }
+
+	/**
+	 * @Given /^using api version "([^"]*)"$/
+	 */
+	public function usingApiVersion($version) {
+		$this->apiVersion = $version;
+	}
+
+	/**
+	 * @Given /^user "([^"]*)" exists$/
+	 */
+	public function userExists($user) {
+		throw new \Behat\Behat\Exception\PendingException();
+	}
+
+}