diff --git a/apps/testing/appinfo/info.xml b/apps/testing/appinfo/info.xml
new file mode 100644
index 0000000000000000000000000000000000000000..b11ec2f88e6ed2d487b608de798bb452bc8fc8d7
--- /dev/null
+++ b/apps/testing/appinfo/info.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0"?> 
+<info>
+	<id>testing</id>
+	<name>QA Testing</name>
+	<description>This app is only for testing! It is dangerous to have it enabled in a live instance</description>
+	<licence>AGPL</licence>
+	<author>Joas Schilling</author>
+	<version>0.1.0</version>
+	<dependencies>
+		<owncloud min-version="9.0" />
+	</dependencies>
+</info>
diff --git a/apps/testing/appinfo/routes.php b/apps/testing/appinfo/routes.php
new file mode 100644
index 0000000000000000000000000000000000000000..b6f20d04ef287fa4b224c090f4760c9c69388c83
--- /dev/null
+++ b/apps/testing/appinfo/routes.php
@@ -0,0 +1,46 @@
+<?php
+/**
+ * @author Joas Schilling <nickvergessen@owncloud.com>
+ *
+ * @copyright Copyright (c) 2015, ownCloud, Inc.
+ * @license AGPL-3.0
+ *
+ * This code is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License, version 3,
+ * as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License, version 3,
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>
+ *
+ */
+
+namespace OCA\Testing\AppInfo;
+
+use OCA\Testing\Config;
+use OCP\API;
+
+$config = new Config(
+	\OC::$server->getConfig(),
+	\OC::$server->getRequest()
+);
+
+API::register(
+	'post',
+	'/apps/testing/api/v1/app/{appid}/{configkey}',
+	[$config, 'setAppValue'],
+	'testing',
+	API::ADMIN_AUTH
+);
+
+API::register(
+	'delete',
+	'/apps/testing/api/v1/app/{appid}/{configkey}',
+	[$config, 'deleteAppValue'],
+	'testing',
+	API::ADMIN_AUTH
+);
diff --git a/apps/testing/config.php b/apps/testing/config.php
new file mode 100644
index 0000000000000000000000000000000000000000..068cb28e04bc70c2344f088f8cd281badb9a28b3
--- /dev/null
+++ b/apps/testing/config.php
@@ -0,0 +1,70 @@
+<?php
+/**
+ * @author Joas Schilling <nickvergessen@owncloud.com>
+ *
+ * @copyright Copyright (c) 2015, ownCloud, Inc.
+ * @license AGPL-3.0
+ *
+ * This code is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License, version 3,
+ * as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License, version 3,
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>
+ *
+ */
+
+namespace OCA\Testing;
+
+use OCP\IConfig;
+use OCP\IRequest;
+
+class Config {
+
+	/** @var IConfig */
+	private $config;
+
+	/** @var IRequest */
+	private $request;
+
+	/**
+	 * @param IConfig $config
+	 * @param IRequest $request
+	 */
+	public function __construct(IConfig $config, IRequest $request) {
+		$this->config = $config;
+		$this->request = $request;
+	}
+
+	/**
+	 * @param array $parameters
+	 * @return \OC_OCS_Result
+	 */
+	public function setAppValue($parameters) {
+		$app = $parameters['appid'];
+		$configKey = $parameters['configkey'];
+
+		$value = $this->request->getParam('value');
+		$this->config->setAppValue($app, $configKey, $value);
+
+		return new \OC_OCS_Result();
+	}
+
+	/**
+	 * @param array $parameters
+	 * @return \OC_OCS_Result
+	 */
+	public function deleteAppValue($parameters) {
+		$app = $parameters['appid'];
+		$configKey = $parameters['configkey'];
+
+		$this->config->deleteAppValue($app, $configKey);
+
+		return new \OC_OCS_Result();
+	}
+}
diff --git a/build/integration/capabilities_features/capabilities.feature b/build/integration/capabilities_features/capabilities.feature
index 6c1e727e7b3d9f5c75252bb4a271bd91284997e9..3c1eb025ec732f8a47351cc1c7af07139d3bbc04 100644
--- a/build/integration/capabilities_features/capabilities.feature
+++ b/build/integration/capabilities_features/capabilities.feature
@@ -7,25 +7,211 @@ Feature: capabilities
 		When sending "GET" to "/cloud/capabilities"
 		Then the HTTP status code should be "200"
 		And fields of capabilities match with
-			| capability | feature | value_or_subfeature | value |
-			| core | pollinterval | 60 | |
-			| core | webdav-root | remote.php/webdav | |
-			| files_sharing | api_enabled | 1 | |
-			| files_sharing | public | enabled | 1 |
-			| files_sharing | public | upload | 1 |
-			| files_sharing | resharing | 1 | |
-			| files_sharing | federation | outgoing | 1 |
-			| files_sharing | federation | incoming | 1 |
-			| files | bigfilechunking | 1 | |
-			| files | undelete | 1 | |
-			| files | versioning | 1 | |
+			| capability | path_to_element | value |
+			| core | pollinterval | 60 |
+			| core | webdav-root | remote.php/webdav |
+			| files_sharing | api_enabled | 1 |
+			| files_sharing | public@@@enabled | 1 |
+			| files_sharing | public@@@upload | 1 |
+			| files_sharing | resharing | 1 |
+			| files_sharing | federation@@@outgoing | 1 |
+			| files_sharing | federation@@@incoming | 1 |
+			| files | bigfilechunking | 1 |
+			| files | undelete | 1 |
+			| files | versioning | 1 |
 
+	Scenario: Changing public upload
+		Given As an "admin"
+		And parameter "shareapi_allow_public_upload" of app "core" is set to "no"
+		When sending "GET" to "/cloud/capabilities"
+		Then the HTTP status code should be "200"
+		And fields of capabilities match with
+			| capability | path_to_element | value |
+			| core | pollinterval | 60 |
+			| core | webdav-root | remote.php/webdav |
+			| files_sharing | api_enabled | 1 |
+			| files_sharing | public@@@enabled | 1 |
+			| files_sharing | public@@@upload | EMPTY |
+			| files_sharing | resharing | 1 |
+			| files_sharing | federation@@@outgoing | 1 |
+			| files_sharing | federation@@@incoming | 1 |
+			| files | bigfilechunking | 1 |
+			| files | undelete | 1 |
+			| files | versioning | 1 |
 
+	Scenario: Disabling share api
+		Given As an "admin"
+		And parameter "shareapi_enabled" of app "core" is set to "no"
+		When sending "GET" to "/cloud/capabilities"
+		Then the HTTP status code should be "200"
+		And fields of capabilities match with
+			| capability | path_to_element | value |
+			| core | pollinterval | 60 |
+			| core | webdav-root | remote.php/webdav |
+			| files_sharing | api_enabled | EMPTY |
+			| files_sharing | public@@@enabled | EMPTY |
+			| files_sharing | public@@@upload | EMPTY |
+			| files_sharing | resharing | EMPTY |
+			| files_sharing | federation@@@outgoing | 1 |
+			| files_sharing | federation@@@incoming | 1 |
+			| files | bigfilechunking | 1 |
+			| files | undelete | 1 |
+			| files | versioning | 1 |
 
+	Scenario: Disabling public links
+		Given As an "admin"
+		And parameter "shareapi_allow_links" of app "core" is set to "no"
+		When sending "GET" to "/cloud/capabilities"
+		Then the HTTP status code should be "200"
+		And fields of capabilities match with
+			| capability | path_to_element | value |
+			| core | pollinterval | 60 |
+			| core | webdav-root | remote.php/webdav |
+			| files_sharing | api_enabled | 1 |
+			| files_sharing | public@@@enabled | EMPTY |
+			| files_sharing | public@@@upload | EMPTY |
+			| files_sharing | resharing | 1 |
+			| files_sharing | federation@@@outgoing | 1 |
+			| files_sharing | federation@@@incoming | 1 |
+			| files | bigfilechunking | 1 |
+			| files | undelete | 1 |
+			| files | versioning | 1 |
 
+	Scenario: Changing resharing
+		Given As an "admin"
+		And parameter "shareapi_allow_resharing" of app "core" is set to "no"
+		When sending "GET" to "/cloud/capabilities"
+		Then the HTTP status code should be "200"
+		And fields of capabilities match with
+			| capability | path_to_element | value |
+			| core | pollinterval | 60 |
+			| core | webdav-root | remote.php/webdav |
+			| files_sharing | api_enabled | 1 |
+			| files_sharing | public@@@enabled | 1 |
+			| files_sharing | public@@@upload | 1 |
+			| files_sharing | resharing | EMPTY |
+			| files_sharing | federation@@@outgoing | 1 |
+			| files_sharing | federation@@@incoming | 1 |
+			| files | bigfilechunking | 1 |
+			| files | undelete | 1 |
+			| files | versioning | 1 |
 
+	Scenario: Changing federation outgoing
+		Given As an "admin"
+		And parameter "outgoing_server2server_share_enabled" of app "files_sharing" is set to "no"
+		When sending "GET" to "/cloud/capabilities"
+		Then the HTTP status code should be "200"
+		And fields of capabilities match with
+			| capability | path_to_element | value |
+			| core | pollinterval | 60 |
+			| core | webdav-root | remote.php/webdav |
+			| files_sharing | api_enabled | 1 |
+			| files_sharing | public@@@enabled | 1 |
+			| files_sharing | public@@@upload | 1 |
+			| files_sharing | resharing | 1 |
+			| files_sharing | federation@@@outgoing | EMPTY |
+			| files_sharing | federation@@@incoming | 1 |
+			| files | bigfilechunking | 1 |
+			| files | undelete | 1 |
+			| files | versioning | 1 |
 
+	Scenario: Changing federation incoming
+		Given As an "admin"
+		And parameter "incoming_server2server_share_enabled" of app "files_sharing" is set to "no"
+		When sending "GET" to "/cloud/capabilities"
+		Then the HTTP status code should be "200"
+		And fields of capabilities match with
+			| capability | path_to_element | value |
+			| core | pollinterval | 60 |
+			| core | webdav-root | remote.php/webdav |
+			| files_sharing | api_enabled | 1 |
+			| files_sharing | public@@@enabled | 1 |
+			| files_sharing | public@@@upload | 1 |
+			| files_sharing | resharing | 1 |
+			| files_sharing | federation@@@outgoing | 1 |
+			| files_sharing | federation@@@incoming | EMPTY |
+			| files | bigfilechunking | 1 |
+			| files | undelete | 1 |
+			| files | versioning | 1 |
 
+	Scenario: Changing password enforce
+		Given As an "admin"
+		And parameter "shareapi_enforce_links_password" of app "core" is set to "yes"
+		When sending "GET" to "/cloud/capabilities"
+		Then the HTTP status code should be "200"
+		And fields of capabilities match with
+			| capability | path_to_element | value |
+			| core | pollinterval | 60 |
+			| core | webdav-root | remote.php/webdav |
+			| files_sharing | api_enabled | 1 |
+			| files_sharing | public@@@enabled | 1 |
+			| files_sharing | public@@@upload | 1 |
+			| files_sharing | public@@@password@@@enforced | 1 |
+			| files_sharing | resharing | 1 |
+			| files_sharing | federation@@@outgoing | 1 |
+			| files_sharing | federation@@@incoming | 1 |
+			| files | bigfilechunking | 1 |
+			| files | undelete | 1 |
+			| files | versioning | 1 |
 
+	Scenario: Changing public notifications
+		Given As an "admin"
+		And parameter "shareapi_allow_public_notification" of app "core" is set to "yes"
+		When sending "GET" to "/cloud/capabilities"
+		Then the HTTP status code should be "200"
+		And fields of capabilities match with
+			| capability | path_to_element | value |
+			| core | pollinterval | 60 |
+			| core | webdav-root | remote.php/webdav |
+			| files_sharing | api_enabled | 1 |
+			| files_sharing | public@@@enabled | 1 |
+			| files_sharing | public@@@upload | 1 |
+			| files_sharing | public@@@send_mail | 1 |
+			| files_sharing | resharing | 1 |
+			| files_sharing | federation@@@outgoing | 1 |
+			| files_sharing | federation@@@incoming | 1 |
+			| files | bigfilechunking | 1 |
+			| files | undelete | 1 |
+			| files | versioning | 1 |
 
+	Scenario: Changing expire date
+		Given As an "admin"
+		And parameter "shareapi_default_expire_date" of app "core" is set to "yes"
+		When sending "GET" to "/cloud/capabilities"
+		Then the HTTP status code should be "200"
+		And fields of capabilities match with
+			| capability | path_to_element | value |
+			| core | pollinterval | 60 |
+			| core | webdav-root | remote.php/webdav |
+			| files_sharing | api_enabled | 1 |
+			| files_sharing | public@@@enabled | 1 |
+			| files_sharing | public@@@upload | 1 |
+			| files_sharing | public@@@expire_date@@@enabled | 1 |
+			| files_sharing | resharing | 1 |
+			| files_sharing | federation@@@outgoing | 1 |
+			| files_sharing | federation@@@incoming | 1 |
+			| files | bigfilechunking | 1 |
+			| files | undelete | 1 |
+			| files | versioning | 1 |
 
+	Scenario: Changing expire date enforcing
+		Given As an "admin"
+		And parameter "shareapi_default_expire_date" of app "core" is set to "yes"
+		And parameter "shareapi_enforce_expire_date" of app "core" is set to "yes"
+		When sending "GET" to "/cloud/capabilities"
+		Then the HTTP status code should be "200"
+		And fields of capabilities match with
+			| capability | path_to_element | value |
+			| core | pollinterval | 60 |
+			| core | webdav-root | remote.php/webdav |
+			| files_sharing | api_enabled | 1 |
+			| files_sharing | public@@@enabled | 1 |
+			| files_sharing | public@@@upload | 1 |
+			| files_sharing | public@@@expire_date@@@enabled | 1 |
+			| files_sharing | public@@@expire_date@@@enforced | 1 |
+			| files_sharing | resharing | 1 |
+			| files_sharing | federation@@@outgoing | 1 |
+			| files_sharing | federation@@@incoming | 1 |
+			| files | bigfilechunking | 1 |
+			| files | undelete | 1 |
+			| files | versioning | 1 |
diff --git a/build/integration/features/bootstrap/CapabilitiesContext.php b/build/integration/features/bootstrap/CapabilitiesContext.php
index 1b0015dce733f7b8a2e8a8867384a1ffa435494b..d30984f0db7e3d17574559ac525b12bf09cd1104 100644
--- a/build/integration/features/bootstrap/CapabilitiesContext.php
+++ b/build/integration/features/bootstrap/CapabilitiesContext.php
@@ -2,6 +2,10 @@
 
 use Behat\Behat\Context\Context;
 use Behat\Behat\Context\SnippetAcceptingContext;
+use Behat\Behat\Hook\Scope\AfterScenarioScope;
+use Behat\Behat\Hook\Scope\BeforeScenarioScope;
+use GuzzleHttp\Client;
+use GuzzleHttp\Message\ResponseInterface;
 
 require __DIR__ . '/../../vendor/autoload.php';
 
@@ -14,34 +18,117 @@ class CapabilitiesContext implements Context, SnippetAcceptingContext {
 	use Provisioning;
 	use Sharing;
 
+	/**
+	 * @Given /^parameter "([^"]*)" of app "([^"]*)" is set to "([^"]*)"$/
+	 */
+	public function serverParameterIsSetTo($parameter, $app, $value){
+		$user = $this->currentUser;
+		$this->currentUser = 'admin';
+
+		$this->modifyServerConfig($app, $parameter, $value);
+
+		$this->currentUser = $user;
+	}
+
 	/**
 	 * @Then /^fields of capabilities match with$/
 	 * @param \Behat\Gherkin\Node\TableNode|null $formData
 	 */
-	public function checkCapabilitiesResponse($formData){
-		if ($formData instanceof \Behat\Gherkin\Node\TableNode) {
-			$fd = $formData->getHash();
-		}
-		
+	public function checkCapabilitiesResponse(\Behat\Gherkin\Node\TableNode $formData){
 		$capabilitiesXML = $this->response->xml()->data->capabilities;
-		
-		foreach ($fd as $row) {
-			if ($row['value'] === ''){
-				$answeredValue = (string)$capabilitiesXML->$row['capability']->$row['feature'];
-				PHPUnit_Framework_Assert::assertEquals(
-					$answeredValue, 
-					$row['value_or_subfeature'], 
-					"Failed field " . $row['capability'] . " " . $row['feature']
-				);
-			} else{
-				$answeredValue = (string)$capabilitiesXML->$row['capability']->$row['feature']->$row['value_or_subfeature'];
-				PHPUnit_Framework_Assert::assertEquals(	
-					$answeredValue, 
-					$row['value'], 
-					"Failed field: " . $row['capability'] . " " . $row['feature'] . " " . $row['value_or_subfeature']
-				);
+
+		foreach ($formData->getHash() as $row) {
+			$path_to_element = explode('@@@', $row['path_to_element']);
+			$answeredValue = $capabilitiesXML->$row['capability'];
+			for ($i = 0; $i < count($path_to_element); $i++){
+				$answeredValue = $answeredValue->$path_to_element[$i];
 			}
+			$answeredValue = (string)$answeredValue;
+			PHPUnit_Framework_Assert::assertEquals(
+				$row['value']==="EMPTY" ? '' : $row['value'],
+				$answeredValue,
+				"Failed field " . $row['capability'] . " " . $row['path_to_element']
+			);
+
 		}
 	}
 
+	protected function resetAppConfigs() {
+		$this->modifyServerConfig('core', 'shareapi_enabled', 'yes');
+		$this->modifyServerConfig('core', 'shareapi_allow_links', 'yes');
+		$this->modifyServerConfig('core', 'shareapi_allow_public_upload', 'yes');
+		$this->modifyServerConfig('core', 'shareapi_allow_resharing', 'yes');
+		$this->modifyServerConfig('files_sharing', 'outgoing_server2server_share_enabled', 'yes');
+		$this->modifyServerConfig('files_sharing', 'incoming_server2server_share_enabled', 'yes');
+		$this->modifyServerConfig('core', 'shareapi_enforce_links_password', 'no');
+		$this->modifyServerConfig('core', 'shareapi_allow_public_notification', 'no');
+		$this->modifyServerConfig('core', 'shareapi_default_expire_date', 'no');
+		$this->modifyServerConfig('core', 'shareapi_enforce_expire_date', 'no');
+	}
+
+	/**
+	 * @BeforeScenario
+	 *
+	 * Enable the testing app before the first scenario of the feature and
+	 * reset the configs before each scenario
+	 * @param BeforeScenarioScope $event
+	 */
+	public function prepareParameters(BeforeScenarioScope $event){
+		$user = $this->currentUser;
+		$this->currentUser = 'admin';
+
+		$scenarios = $event->getFeature()->getScenarios();
+		if ($event->getScenario() === reset($scenarios)) {
+			$this->setStatusTestingApp(true);
+		}
+
+		$this->resetAppConfigs();
+
+		$this->currentUser = $user;
+	}
+
+	/**
+	 * @AfterScenario
+	 *
+	 * Reset the values after the last scenario of the feature and disable the testing app
+	 * @param AfterScenarioScope $event
+	 */
+	public function undoChangingParameters(AfterScenarioScope $event) {
+		$scenarios = $event->getFeature()->getScenarios();
+		if ($event->getScenario() === end($scenarios)) {
+			$user = $this->currentUser;
+			$this->currentUser = 'admin';
+
+			$this->resetAppConfigs();
+
+			$this->setStatusTestingApp(false);
+			$this->currentUser = $user;
+		}
+	}
+
+	/**
+	 * @param string $app
+	 * @param string $parameter
+	 * @param string $value
+	 */
+	protected function modifyServerConfig($app, $parameter, $value) {
+		$body = new \Behat\Gherkin\Node\TableNode([['value', $value]]);
+		$this->sendingToWith('post', "/apps/testing/api/v1/app/{$app}/{$parameter}", $body);
+		$this->theHTTPStatusCodeShouldBe('200');
+		$this->theOCSStatusCodeShouldBe('100');
+	}
+
+	protected function setStatusTestingApp($enabled) {
+		$this->sendingTo(($enabled ? 'post' : 'delete'), '/cloud/apps/testing');
+		$this->theHTTPStatusCodeShouldBe('200');
+		$this->theOCSStatusCodeShouldBe('100');
+
+		$this->sendingTo('get', '/cloud/apps?filter=enabled');
+		$this->theHTTPStatusCodeShouldBe('200');
+		if ($enabled) {
+			PHPUnit_Framework_Assert::assertContains('testing', $this->response->getBody()->getContents());
+		} else {
+			PHPUnit_Framework_Assert::assertNotContains('testing', $this->response->getBody()->getContents());
+		}
+	}
 }
diff --git a/build/integration/features/provisioning-v1.feature b/build/integration/features/provisioning-v1.feature
index 2a3e8e07fc426645dab70c602dff729efde2d02d..467ac448e9425d36d7687312145a1194eedcd63f 100644
--- a/build/integration/features/provisioning-v1.feature
+++ b/build/integration/features/provisioning-v1.feature
@@ -291,8 +291,3 @@ Feature: provisioning
 		Then the OCS status code should be "100"
 		And the HTTP status code should be "200"
 		And app "files_external" is disabled
-
-	
-
-
-