diff --git a/.drone.yml b/.drone.yml
index 5d4ab2ca963076857872d8247ea585fc3368473e..c7c3764459ca4047a5a6ce91e535d4147ad2fff5 100644
--- a/.drone.yml
+++ b/.drone.yml
@@ -387,6 +387,15 @@ pipeline:
     when:
       matrix:
         TESTS: integration-sharees-features
+  integration-sharees-v2-features:
+    image: nextcloudci/integration-php7.0:integration-php7.0-3
+    commands:
+      - ./occ maintenance:install --admin-pass=admin
+      - cd build/integration
+      - ./run.sh sharees_features/sharees_provisioningapiv2.feature
+    when:
+      matrix:
+        TESTS: integration-sharees-v2-features
   integration-setup-features:
     image: nextcloudci/integration-php7.0:integration-php7.0-3
     commands:
@@ -487,6 +496,7 @@ matrix:
     - TESTS: integration-provisioning-v2
     - TESTS: integration-webdav-related
     - TESTS: integration-sharees-features
+    - TESTS: integration-sharees-v2-features
     - TESTS: integration-setup-features
     - TESTS: integration-filesdrop-features
     - TESTS: integration-transfer-ownership-features
diff --git a/apps/provisioning_api/lib/Controller/GroupsController.php b/apps/provisioning_api/lib/Controller/GroupsController.php
index c772076c3d176d758a0eda08d9262338039a7eba..2d329bf974be5c7dc00fbb6006669efe4f6b06fc 100644
--- a/apps/provisioning_api/lib/Controller/GroupsController.php
+++ b/apps/provisioning_api/lib/Controller/GroupsController.php
@@ -164,7 +164,7 @@ class GroupsController extends OCSController {
 			throw new OCSException('', 102);
 		}
 
-		return new DataResponse(null, 100);
+		return new DataResponse();
 	}
 
 	/**
diff --git a/build/integration/features/bootstrap/AppConfiguration.php b/build/integration/features/bootstrap/AppConfiguration.php
index 2f84dce3f1b2afb35ca7b8824af6076c6d8a1f9c..39fee5e361ae39a718ff3c0b163d7f0fd1b8d4fc 100644
--- a/build/integration/features/bootstrap/AppConfiguration.php
+++ b/build/integration/features/bootstrap/AppConfiguration.php
@@ -62,13 +62,17 @@ trait AppConfiguration {
 		$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');
+		if ($this->apiVersion === 1) {
+			$this->theOCSStatusCodeShouldBe('100');
+		}
 	}
 
 	protected function setStatusTestingApp($enabled) {
 		$this->sendingTo(($enabled ? 'post' : 'delete'), '/cloud/apps/testing');
 		$this->theHTTPStatusCodeShouldBe('200');
-		$this->theOCSStatusCodeShouldBe('100');
+		if ($this->apiVersion === 1) {
+			$this->theOCSStatusCodeShouldBe('100');
+		}
 
 		$this->sendingTo('get', '/cloud/apps?filter=enabled');
 		$this->theHTTPStatusCodeShouldBe('200');
diff --git a/build/integration/features/bootstrap/BasicStructure.php b/build/integration/features/bootstrap/BasicStructure.php
index 8961efc6f31b68d5d76e6e5a45088174e1601406..ec23916d614e42e38cc32c60a34079fccd74027d 100644
--- a/build/integration/features/bootstrap/BasicStructure.php
+++ b/build/integration/features/bootstrap/BasicStructure.php
@@ -83,11 +83,11 @@ trait BasicStructure {
 	}
 
 	/**
-	 * @Given /^using api version "([^"]*)"$/
+	 * @Given /^using api version "(\d+)"$/
 	 * @param string $version
 	 */
 	public function usingApiVersion($version) {
-		$this->apiVersion = $version;
+		$this->apiVersion = (int) $version;
 	}
 
 	/**
diff --git a/build/integration/features/bootstrap/Provisioning.php b/build/integration/features/bootstrap/Provisioning.php
index 0055ff15de03fa443b23fb1d6e976e441ec8736b..2e17508120cdb26453e1bdeef88335d37ffd4748 100644
--- a/build/integration/features/bootstrap/Provisioning.php
+++ b/build/integration/features/bootstrap/Provisioning.php
@@ -331,6 +331,12 @@ trait Provisioning {
 		];
 
 		$this->response = $client->send($client->createRequest("DELETE", $fullUrl, $options));
+
+		if ($this->currentServer === 'LOCAL'){
+			unset($this->createdGroups[$group]);
+		} elseif ($this->currentServer === 'REMOTE') {
+			unset($this->createdRemoteGroups[$group]);
+		}
 	}
 
 	/**
@@ -748,7 +754,7 @@ trait Provisioning {
 		}
 		$this->usingServer('REMOTE');
 		foreach($this->createdRemoteGroups as $remoteGroup) {
-			$this->deleteUser($remoteGroup);
+			$this->deleteGroup($remoteGroup);
 		}
 		$this->usingServer($previousServer);
 	}
diff --git a/build/integration/features/favorites.feature b/build/integration/features/favorites.feature
index 9722948dac23083d20f2408edbad135396d819df..3f90b7b42b77ea7daef37881a95485c6c9807b33 100644
--- a/build/integration/features/favorites.feature
+++ b/build/integration/features/favorites.feature
@@ -133,4 +133,3 @@ Feature: favorite
         Then user "user0" in folder "/subfolder" should have favorited the following elements
             | /subfolder/textfile0.txt |
             | /subfolder/textfile2.txt |
-
diff --git a/build/integration/run.sh b/build/integration/run.sh
index f423c3e6fb7ad751adfbf426de63e80a220fbe12..282a43033955251a613f0a045f749883550ddabb 100755
--- a/build/integration/run.sh
+++ b/build/integration/run.sh
@@ -58,7 +58,7 @@ RESULT=$?
 kill $PHPPID
 kill $PHPPID_FED
 
-if [ "$INSTALLED" -eq "true" ]; then
+if [ "$INSTALLED" == "true" ]; then
 
     $OCC files_external:delete -y $ID_STORAGE
 
diff --git a/build/integration/sharees_features/sharees_provisioningapiv2.feature b/build/integration/sharees_features/sharees_provisioningapiv2.feature
new file mode 100644
index 0000000000000000000000000000000000000000..37ab896ee2887d6feeea2cb92d59fe6bdcee1ec5
--- /dev/null
+++ b/build/integration/sharees_features/sharees_provisioningapiv2.feature
@@ -0,0 +1,240 @@
+Feature: sharees_provisioningapiv2
+  Background:
+    Given using api version "2"
+    And user "test" exists
+    And user "Sharee1" exists
+    And group "ShareeGroup" exists
+    And user "test" belongs to group "ShareeGroup"
+
+  Scenario: Search without exact match
+    Given As an "test"
+    When getting sharees for
+      | search | Sharee |
+      | itemType | file |
+    Then the OCS status code should be "200"
+    And the HTTP status code should be "200"
+    And "exact users" sharees returned is empty
+    And "users" sharees returned are
+      | Sharee1 | 0 | Sharee1 |
+    And "exact groups" sharees returned is empty
+    And "groups" sharees returned are
+      | ShareeGroup | 1 | ShareeGroup |
+    And "exact remotes" sharees returned is empty
+    And "remotes" sharees returned is empty
+
+  Scenario: Search without exact match not-exact casing
+    Given As an "test"
+    When getting sharees for
+      | search | sharee |
+      | itemType | file |
+    Then the OCS status code should be "200"
+    And the HTTP status code should be "200"
+    And "exact users" sharees returned is empty
+    And "users" sharees returned are
+      | Sharee1 | 0 | Sharee1 |
+    And "exact groups" sharees returned is empty
+    And "groups" sharees returned are
+      | ShareeGroup | 1 | ShareeGroup |
+    And "exact remotes" sharees returned is empty
+    And "remotes" sharees returned is empty
+
+  Scenario: Search only with group members - denied
+    Given As an "test"
+    And parameter "shareapi_only_share_with_group_members" of app "core" is set to "yes"
+    When getting sharees for
+      | search | sharee |
+      | itemType | file |
+    Then the OCS status code should be "200"
+    And the HTTP status code should be "200"
+    And "exact users" sharees returned is empty
+    And "users" sharees returned is empty
+    And "exact groups" sharees returned is empty
+    And "groups" sharees returned are
+      | ShareeGroup | 1 | ShareeGroup |
+    And "exact remotes" sharees returned is empty
+    And "remotes" sharees returned is empty
+
+  Scenario: Search only with group members - allowed
+    Given As an "test"
+    And parameter "shareapi_only_share_with_group_members" of app "core" is set to "yes"
+    And user "Sharee1" belongs to group "ShareeGroup"
+    When getting sharees for
+      | search | sharee |
+      | itemType | file |
+    Then the OCS status code should be "200"
+    And the HTTP status code should be "200"
+    And "exact users" sharees returned is empty
+    And "users" sharees returned are
+      | Sharee1 | 0 | Sharee1 |
+    And "exact groups" sharees returned is empty
+    And "groups" sharees returned are
+      | ShareeGroup | 1 | ShareeGroup |
+    And "exact remotes" sharees returned is empty
+    And "remotes" sharees returned is empty
+
+  Scenario: Search only with group members - no group as non-member
+    Given As an "Sharee1"
+    And parameter "shareapi_only_share_with_group_members" of app "core" is set to "yes"
+    When getting sharees for
+      | search | sharee |
+      | itemType | file |
+    Then the OCS status code should be "200"
+    And the HTTP status code should be "200"
+    And "exact users" sharees returned is empty
+    And "users" sharees returned is empty
+    And "exact groups" sharees returned is empty
+    And "groups" sharees returned is empty
+    And "exact remotes" sharees returned is empty
+    And "remotes" sharees returned is empty
+
+  Scenario: Search without exact match no iteration allowed
+    Given As an "test"
+    And parameter "shareapi_allow_share_dialog_user_enumeration" of app "core" is set to "no"
+    When getting sharees for
+      | search | Sharee |
+      | itemType | file |
+    Then the OCS status code should be "200"
+    And the HTTP status code should be "200"
+    And "exact users" sharees returned is empty
+    And "users" sharees returned is empty
+    And "exact groups" sharees returned is empty
+    And "groups" sharees returned is empty
+    And "exact remotes" sharees returned is empty
+    And "remotes" sharees returned is empty
+
+  Scenario: Search with exact match no iteration allowed
+    Given As an "test"
+    And parameter "shareapi_allow_share_dialog_user_enumeration" of app "core" is set to "no"
+    When getting sharees for
+      | search | Sharee1 |
+      | itemType | file |
+    Then the OCS status code should be "200"
+    And the HTTP status code should be "200"
+    And "exact users" sharees returned are
+      | Sharee1 | 0 | Sharee1 |
+    And "users" sharees returned is empty
+    And "exact groups" sharees returned is empty
+    And "groups" sharees returned is empty
+    And "exact remotes" sharees returned is empty
+    And "remotes" sharees returned is empty
+
+  Scenario: Search with exact match group no iteration allowed
+    Given As an "test"
+    And parameter "shareapi_allow_share_dialog_user_enumeration" of app "core" is set to "no"
+    When getting sharees for
+      | search | ShareeGroup |
+      | itemType | file |
+    Then the OCS status code should be "200"
+    And the HTTP status code should be "200"
+    And "exact users" sharees returned is empty
+    And "users" sharees returned is empty
+    And "exact groups" sharees returned are
+      | ShareeGroup | 1 | ShareeGroup |
+    And "groups" sharees returned is empty
+    And "exact remotes" sharees returned is empty
+    And "remotes" sharees returned is empty
+
+  Scenario: Search with exact match
+    Given As an "test"
+    When getting sharees for
+      | search | Sharee1 |
+      | itemType | file |
+    Then the OCS status code should be "200"
+    And the HTTP status code should be "200"
+    Then "exact users" sharees returned are
+      | Sharee1 | 0 | Sharee1 |
+    Then "users" sharees returned is empty
+    Then "exact groups" sharees returned is empty
+    Then "groups" sharees returned is empty
+    Then "exact remotes" sharees returned is empty
+    Then "remotes" sharees returned is empty
+
+  Scenario: Search with exact match not-exact casing
+    Given As an "test"
+    When getting sharees for
+      | search | sharee1 |
+      | itemType | file |
+    Then the OCS status code should be "200"
+    And the HTTP status code should be "200"
+    Then "exact users" sharees returned are
+      | Sharee1 | 0 | Sharee1 |
+    Then "users" sharees returned is empty
+    Then "exact groups" sharees returned is empty
+    Then "groups" sharees returned is empty
+    Then "exact remotes" sharees returned is empty
+    Then "remotes" sharees returned is empty
+
+  Scenario: Search with exact match not-exact casing group
+    Given As an "test"
+    When getting sharees for
+      | search | shareegroup |
+      | itemType | file |
+    Then the OCS status code should be "200"
+    And the HTTP status code should be "200"
+    Then "exact users" sharees returned is empty
+    Then "users" sharees returned is empty
+    Then "exact groups" sharees returned are
+      | ShareeGroup | 1 | ShareeGroup |
+    Then "groups" sharees returned is empty
+    Then "exact remotes" sharees returned is empty
+    Then "remotes" sharees returned is empty
+
+  Scenario: Search with "self"
+    Given As an "Sharee1"
+    When getting sharees for
+      | search | Sharee1 |
+      | itemType | file |
+    Then the OCS status code should be "200"
+    And the HTTP status code should be "200"
+    Then "exact users" sharees returned are
+      | Sharee1 | 0 | Sharee1 |
+    Then "users" sharees returned is empty
+    Then "exact groups" sharees returned is empty
+    Then "groups" sharees returned is empty
+    Then "exact remotes" sharees returned is empty
+    Then "remotes" sharees returned is empty
+
+  Scenario: Remote sharee for files
+    Given As an "test"
+    When getting sharees for
+      | search | test@localhost |
+      | itemType | file |
+    Then the OCS status code should be "200"
+    And the HTTP status code should be "200"
+    Then "exact users" sharees returned is empty
+    Then "users" sharees returned is empty
+    Then "exact groups" sharees returned is empty
+    Then "groups" sharees returned is empty
+    Then "exact remotes" sharees returned are
+      | test@localhost | 6 | test@localhost |
+    Then "remotes" sharees returned is empty
+
+  Scenario: Remote sharee for calendars not allowed
+    Given As an "test"
+    When getting sharees for
+      | search | test@localhost |
+      | itemType | calendar |
+    Then the OCS status code should be "200"
+    And the HTTP status code should be "200"
+    Then "exact users" sharees returned is empty
+    Then "users" sharees returned is empty
+    Then "exact groups" sharees returned is empty
+    Then "groups" sharees returned is empty
+    Then "exact remotes" sharees returned is empty
+    Then "remotes" sharees returned is empty
+
+  Scenario: Group sharees not returned when group sharing is disabled
+    Given As an "test"
+    And parameter "shareapi_allow_group_sharing" of app "core" is set to "no"
+    When getting sharees for
+      | search | sharee |
+      | itemType | file |
+    Then the OCS status code should be "200"
+    And the HTTP status code should be "200"
+    And "exact users" sharees returned is empty
+    And "users" sharees returned are
+      | Sharee1 | 0 | Sharee1 |
+    And "exact groups" sharees returned is empty
+    And "groups" sharees returned is empty
+    And "exact remotes" sharees returned is empty
+    And "remotes" sharees returned is empty