diff --git a/build/integration/features/bootstrap/FeatureContext.php b/build/integration/features/bootstrap/FeatureContext.php
index 70e73b66a71f0c47496324f90012303fa7f2b7cc..df4b853eddee8137bd6ace2ac188732a5fe850a6 100644
--- a/build/integration/features/bootstrap/FeatureContext.php
+++ b/build/integration/features/bootstrap/FeatureContext.php
@@ -23,6 +23,9 @@ class FeatureContext extends BehatContext {
 	/** @var int */
 	private $apiVersion = 1;
 
+	/** @var SimpleXMLElement */
+	private $lastShareData = null;
+
 	/**
 	 * Initializes context.
 	 * Every scenario gets it's own context object.
@@ -197,16 +200,27 @@ class FeatureContext extends BehatContext {
 	/**
 	 * @Given /^user "([^"]*)" exists$/
 	 */
-	public function userExists($user) {
+	public function assureUserExists($user) {
+		try {
+			$this->userExists($user);			
+		} catch (\GuzzleHttp\Exception\ClientException $ex) {
+			$previous_user = $this->currentUser;
+			$this->currentUser = "admin";
+			$this->creatingTheUser($user);
+			$this->currentUser = $previous_user;
+		}
+		$this->userExists($user);
+		PHPUnit_Framework_Assert::assertEquals(200, $this->response->getStatusCode());
+
+	}
+
+	public function userExists($user){
 		$fullUrl = $this->baseUrl . "v2.php/cloud/users/$user";
 		$client = new Client();
 		$options = [];
-		if ($this->currentUser === 'admin') {
-			$options['auth'] = $this->adminUser;
-		}
+		$options['auth'] = $this->adminUser;
 
 		$this->response = $client->get($fullUrl, $options);
-		PHPUnit_Framework_Assert::assertEquals(200, $this->response->getStatusCode());
 	}
 
 	/**
@@ -284,14 +298,23 @@ class FeatureContext extends BehatContext {
 		PHPUnit_Framework_Assert::assertEquals(200, $this->response->getStatusCode());
 	}
 
-
 	/**
 	 * @Given /^user "([^"]*)" does not exist$/
 	 */
 	public function userDoesNotExist($user) {
 		try {
 			$this->userExists($user);
-			PHPUnit_Framework_Assert::fail('The user "' . $user . '" exists');
+		} catch (\GuzzleHttp\Exception\ClientException $ex) {
+			$this->response = $ex->getResponse();
+			PHPUnit_Framework_Assert::assertEquals(404, $ex->getResponse()->getStatusCode());
+			return;
+		}
+		$previous_user = $this->currentUser;
+		$this->currentUser = "admin";
+		$this->deletingTheUser($user);
+		$this->currentUser = $previous_user;
+		try {
+			$this->userExists($user);
 		} catch (\GuzzleHttp\Exception\ClientException $ex) {
 			$this->response = $ex->getResponse();
 			PHPUnit_Framework_Assert::assertEquals(404, $ex->getResponse()->getStatusCode());
@@ -332,56 +355,140 @@ class FeatureContext extends BehatContext {
 		PHPUnit_Framework_Assert::assertEquals(200, $this->response->getStatusCode());
 	}
 
-	/**
-	 * @When /^creating the user "([^"]*)r"$/
-	 */
+	public function createUser($user) {
+		$this->creatingTheUser($user);
+		$this->userExists($user);
+	}
+
+	public function deleteUser($user) {
+		$this->deletingTheUser($user);
+		$this->userDoesNotExist($user);
+	}
+
+	public function createGroup($group) {
+		$this->creatingTheGroup($group);
+		$this->groupExists($group);
+	}
+
+	public function deleteGroup($group) {
+		$this->deletingTheGroup($group);
+		$this->groupDoesNotExist($group);
+	}
+
 	public function creatingTheUser($user) {
-		$fullUrl = $this->baseUrl . "v{$this->apiVersion}.php/cloud/users/$user";
+		$fullUrl = $this->baseUrl . "v{$this->apiVersion}.php/cloud/users";
 		$client = new Client();
 		$options = [];
 		if ($this->currentUser === 'admin') {
 			$options['auth'] = $this->adminUser;
 		}
 
-		$this->response = $client->post($fullUrl, [
-			'form_params' => [
-				'userid' => $user,
-				'password' => '123456'
-			]
-		]);
+		$options['body'] = [
+							'userid' => $user,
+							'password' => '123456'
+							];
+
+		$this->response = $client->send($client->createRequest("POST", $fullUrl, $options));
 
 	}
 
 	/**
-	 * @When /^creating the group "([^"]*)r"$/
+	 * @When /^creating the group "([^"]*)"$/
 	 */
 	public function creatingTheGroup($group) {
-		$fullUrl = $this->baseUrl . "v{$this->apiVersion}.php/cloud/groups/addgroup";
+		$fullUrl = $this->baseUrl . "v{$this->apiVersion}.php/cloud/groups";
 		$client = new Client();
 		$options = [];
 		if ($this->currentUser === 'admin') {
 			$options['auth'] = $this->adminUser;
 		}
 
-		$this->response = $client->post($fullUrl, [
-			'form_params' => [
-				'groupid' => $user
-			]
-		]);
+		$options['body'] = [
+							'groupid' => $group,
+							];
+
+		$this->response = $client->send($client->createRequest("POST", $fullUrl, $options));
 	}
 
 	/**
-	 * @Given /^group "([^"]*)" exists$/
+	 * @When /^Deleting the user "([^"]*)"$/
 	 */
-	public function groupExists($group) {
-		$fullUrl = $this->baseUrl . "v2.php/cloud/groups/$group";
+	public function deletingTheUser($user) {
+		$fullUrl = $this->baseUrl . "v{$this->apiVersion}.php/cloud/users/$user";
 		$client = new Client();
 		$options = [];
 		if ($this->currentUser === 'admin') {
 			$options['auth'] = $this->adminUser;
 		}
 
+		$this->response = $client->send($client->createRequest("DELETE", $fullUrl, $options));
+	}
+
+	/**
+	 * @When /^Deleting the group "([^"]*)"$/
+	 */
+	public function deletingTheGroup($group) {
+		$fullUrl = $this->baseUrl . "v{$this->apiVersion}.php/cloud/groups/$group";
+		$client = new Client();
+		$options = [];
+		if ($this->currentUser === 'admin') {
+			$options['auth'] = $this->adminUser;
+		}
+
+		$this->response = $client->send($client->createRequest("DELETE", $fullUrl, $options));
+	}
+
+	/**
+	 * @Given /^Add user "([^"]*)" to the group "([^"]*)"$/
+	 */
+	public function addUserToGroup($user, $group) {
+		$this->userExists($user);
+		$this->groupExists($group);
+		$this->addingUserToGroup($user, $group);
+
+	}
+
+	/**
+	 * @When /^User "([^"]*)" is added to the group "([^"]*)"$/
+	 */
+	public function addingUserToGroup($user, $group) {
+		$fullUrl = $this->baseUrl . "v{$this->apiVersion}.php/cloud/users/$user/groups";
+		$client = new Client();
+		$options = [];
+		if ($this->currentUser === 'admin') {
+			$options['auth'] = $this->adminUser;
+		}
+
+		$options['body'] = [
+							'groupid' => $group,
+							];
+
+		$this->response = $client->send($client->createRequest("POST", $fullUrl, $options));
+	}
+
+
+	public function groupExists($group) {
+		$fullUrl = $this->baseUrl . "v2.php/cloud/groups/$group";
+		$client = new Client();
+		$options = [];
+		$options['auth'] = $this->adminUser;
+
 		$this->response = $client->get($fullUrl, $options);
+	}
+
+	/**
+	 * @Given /^group "([^"]*)" exists$/
+	 */
+	public function assureGroupExists($group) {
+		try {
+			$this->groupExists($group);			
+		} catch (\GuzzleHttp\Exception\ClientException $ex) {
+			$previous_user = $this->currentUser;
+			$this->currentUser = "admin";
+			$this->creatingTheGroup($group);
+			$this->currentUser = $previous_user;
+		}
+		$this->groupExists($group);
 		PHPUnit_Framework_Assert::assertEquals(200, $this->response->getStatusCode());
 	}
 
@@ -391,7 +498,17 @@ class FeatureContext extends BehatContext {
 	public function groupDoesNotExist($group) {
 		try {
 			$this->groupExists($group);
-			PHPUnit_Framework_Assert::fail('The group "' . $group . '" exists');
+		} catch (\GuzzleHttp\Exception\ClientException $ex) {
+			$this->response = $ex->getResponse();
+			PHPUnit_Framework_Assert::assertEquals(404, $ex->getResponse()->getStatusCode());
+			return;
+		}
+		$previous_user = $this->currentUser;
+		$this->currentUser = "admin";
+		$this->deletingTheGroup($group);
+		$this->currentUser = $previous_user;
+		try {
+			$this->groupExists($group);
 		} catch (\GuzzleHttp\Exception\ClientException $ex) {
 			$this->response = $ex->getResponse();
 			PHPUnit_Framework_Assert::assertEquals(404, $ex->getResponse()->getStatusCode());
@@ -422,4 +539,69 @@ class FeatureContext extends BehatContext {
 			$this->response = $ex->getResponse();
 		}
 	}
+
+	/**
+	 * @When /^creating a public share with$/
+	 * @param \Behat\Gherkin\Node\TableNode|null $formData
+	 */
+	public function createPublicShare($body) {
+		$this->sendingToWith("POST", "/apps/files_sharing/api/v1/shares", $body);
+		$this->lastShareData = $this->response->xml();
+	}
+
+	/**
+	 * @Then /^Public shared file "([^"]*)" can be downloaded$/
+	 */
+	public function checkPublicSharedFile($filename) {
+		$client = new Client();
+		$options = [];
+		$url = $this->lastShareData->data[0]->url;
+		$fullUrl = $url . "/download";
+		$options['save_to'] = "./$filename";
+		$this->response = $client->get($fullUrl, $options);
+		$finfo = new finfo;
+		$fileinfo = $finfo->file("./$filename", FILEINFO_MIME_TYPE);
+		PHPUnit_Framework_Assert::assertEquals($fileinfo, "text/plain");
+		if (file_exists("./$filename")) {
+        	unlink("./$filename");
+        }
+	}
+
+	/**
+	 * @Then /^Public shared file "([^"]*)" with password "([^"]*)" can be downloaded$/
+	 */
+	public function checkPublicSharedFileWithPassword($filename, $password) {
+		$client = new Client();
+		$options = [];
+		$token = $this->lastShareData->data[0]->token;
+		$fullUrl = substr($this->baseUrl, 0, -4) . "public.php/webdav";
+		$options['auth'] = [$token, $password];
+		$options['save_to'] = "./$filename";
+		$this->response = $client->get($fullUrl, $options);
+		$finfo = new finfo;
+		$fileinfo = $finfo->file("./$filename", FILEINFO_MIME_TYPE);
+		PHPUnit_Framework_Assert::assertEquals($fileinfo, "text/plain");
+		if (file_exists("./$filename")) {
+        	unlink("./$filename");
+        }
+	}
+
+	/**
+	 * @When /^Adding expiration date to last share$/
+	 */
+	public function addingExpirationDate() {
+		$share_id = $this->lastShareData->data[0]->id;
+		$fullUrl = $this->baseUrl . "v{$this->apiVersion}.php/apps/files_sharing/api/v{$this->apiVersion}/shares/$share_id";
+		$client = new Client();
+		$options = [];
+		if ($this->currentUser === 'admin') {
+			$options['auth'] = $this->adminUser;
+		} else {
+			$options['auth'] = [$this->currentUser, $this->regularUser];
+		}
+		$date = date('Y-m-d', strtotime("+3 days"));
+		$options['body'] = ['expireDate' => $date];
+		$this->response = $client->send($client->createRequest("PUT", $fullUrl, $options));
+		PHPUnit_Framework_Assert::assertEquals(200, $this->response->getStatusCode());
+	}
 }
diff --git a/build/integration/features/sharing-v1.feature b/build/integration/features/sharing-v1.feature
new file mode 100644
index 0000000000000000000000000000000000000000..ed5ac8930a6dafe3c50f39e4fd403533506510dc
--- /dev/null
+++ b/build/integration/features/sharing-v1.feature
@@ -0,0 +1,68 @@
+Feature: sharing
+  Background:
+    Given using api version "1"
+
+  Scenario: Creating a new share with user
+    Given user "user0" exists
+    And user "user1" exists
+    And As an "user0"
+    When sending "POST" to "/apps/files_sharing/api/v1/shares" with
+      | path | welcome.txt |
+      | shareWith | user1 |
+      | shareType | 0 |
+    Then the OCS status code should be "100"
+    And the HTTP status code should be "200"
+    And user "user0" does not exist
+    And user "user1" does not exist
+
+  Scenario: Creating a share with a group
+    Given user "user0" exists
+    And user "user1" exists
+    And group "sharing-group" exists
+    And As an "user0"
+    When sending "POST" to "/apps/files_sharing/api/v1/shares" with
+      | path | welcome.txt |
+      | shareWith | sharing-group |
+      | shareType | 1 |
+    Then the OCS status code should be "100"
+    And the HTTP status code should be "200"
+    And user "user0" does not exist
+    And user "user1" does not exist
+    And group "sharing-group" does not exist
+
+  Scenario: Creating a new public share
+    Given user "user0" exists
+    And As an "user0"
+    When creating a public share with
+      | path | welcome.txt |
+      | shareType | 3 |
+    Then the OCS status code should be "100"
+    And the HTTP status code should be "200"
+    And Public shared file "welcome.txt" can be downloaded
+    And user "user0" does not exist
+
+  Scenario: Creating a new public share with password
+    Given user "user0" exists
+    And As an "user0"
+    When creating a public share with
+      | path | welcome.txt |
+      | shareType | 3 |
+      | password | publicpw |
+    Then the OCS status code should be "100"
+    And the HTTP status code should be "200"
+    And Public shared file "welcome.txt" with password "publicpw" can be downloaded
+    And user "user0" does not exist
+
+  Scenario: Creating a new public share with password and adding an expiration date
+    Given user "user0" exists
+    And As an "user0"
+    When creating a public share with
+      | path | welcome.txt |
+      | shareType | 3 |
+      | password | publicpw |
+    And Adding expiration date to last share
+    Then the OCS status code should be "100"
+    And the HTTP status code should be "200"
+    And Public shared file "welcome.txt" with password "publicpw" can be downloaded
+    And user "user0" does not exist
+