diff --git a/lib/private/share20/defaultshareprovider.php b/lib/private/share20/defaultshareprovider.php
index 41de81cf346ad7f3341b445897ac0b4c92e1331f..79bc809b9b2c8b07eda559814f1fcf9ad1124718 100644
--- a/lib/private/share20/defaultshareprovider.php
+++ b/lib/private/share20/defaultshareprovider.php
@@ -112,8 +112,32 @@ class DefaultShareProvider implements IShareProvider {
 	public function delete(IShare $share) {
 		$this->deleteChildren($share);
 
-		$qb = $this->dbConn->getQueryBuilder();
+		// Fetch share to make sure it exists
+		$share = $this->getShareById($share->getId());
+
+		$shareType = $share->getShareType();
+		$sharedWith = '';
+		if ($shareType === \OCP\Share::SHARE_TYPE_USER) {
+			$sharedWith = $share->getSharedWith()->getUID();
+		} else if ($shareType === \OCP\Share::SHARE_TYPE_GROUP) {
+			$sharedWith = $share->getSharedWith()->getGID();
+		}
+
+		$hookParams = [
+			'id'         => $share->getId(),
+			'itemType'   => $share->getPath() instanceof \OCP\Files\File ? 'file' : 'folder',
+			'itemSource' => $share->getPath()->getId(),
+			'shareType'  => $shareType,
+			'shareWith'  => $sharedWith,
+			'itemparent' => $share->getParent(),
+			'uidOwner'   => $share->getSharedBy()->getUID(),
+			'fileSource' => $share->getPath()->getId(),
+			'fileTarget' => $share->getTarget()
+		];
 
+		\OC_Hook::emit('OCP\Share', 'pre_unshare', $hookParams);
+
+		$qb = $this->dbConn->getQueryBuilder();
 		$qb->delete('share')
 			->where($qb->expr()->eq('id', $qb->createParameter('id')))
 			->setParameter(':id', $share->getId());
@@ -123,6 +147,8 @@ class DefaultShareProvider implements IShareProvider {
 		} catch (\Exception $e) {
 			throw new BackendError();
 		}
+
+		\OC_Hook::emit('OCP\Share', 'post_unshare', $hookParams);
 	}
 
 	/**
@@ -208,7 +234,8 @@ class DefaultShareProvider implements IShareProvider {
 		$share = new Share();
 		$share->setId((int)$data['id'])
 			->setShareType((int)$data['share_type'])
-			->setPermissions((int)$data['permissions']);
+			->setPermissions((int)$data['permissions'])
+			->setTarget($data['file_target']);
 
 		if ($share->getShareType() === \OCP\Share::SHARE_TYPE_USER) {
 			$share->setSharedWith($this->userManager->get($data['share_with']));
diff --git a/lib/private/share20/ishare.php b/lib/private/share20/ishare.php
index 7c5cce9b21e3adc8b32edac268fbbfba1506291a..fa7c1ea614c605ab1cef24c5a094ab6f9b1b1bf7 100644
--- a/lib/private/share20/ishare.php
+++ b/lib/private/share20/ishare.php
@@ -146,4 +146,11 @@ interface IShare {
 	 * @return int
 	 */
 	public function getParent();
+
+	/**
+	 * Get the target of this share
+	 *
+	 * @return string
+	 */
+	public function getTarget();
 }
diff --git a/lib/private/share20/share.php b/lib/private/share20/share.php
index 380526fd2819a869e1f12f8acc78a8bf514d2f4e..989edd3c079ef4edd4e3ef8088dbcbe2cb80b707 100644
--- a/lib/private/share20/share.php
+++ b/lib/private/share20/share.php
@@ -59,6 +59,9 @@ class Share implements IShare {
 	/** @var int */
 	private $parent;
 
+	/** @var string */
+	private $target;
+
 	/**
 	 * Set the id of the share
 	 *
@@ -292,4 +295,24 @@ class Share implements IShare {
 	public function getParent() {
 		return $this->parent;
 	}
+
+	/**
+	 * Set the target of this share
+	 *
+	 * @param string target
+	 * @return Share The modified object
+	 */
+	public function setTarget($target) {
+		$this->target = $target;
+		return $this;
+	}
+
+	/**
+	 * Get the target of this share
+	 *
+	 * @return string
+	 */
+	public function getTarget() {
+		return $this->target;
+	}
 }
diff --git a/tests/lib/share20/defaultshareprovidertest.php b/tests/lib/share20/defaultshareprovidertest.php
index bf8306bf26cf9d9d843eb0b8ee42f1141396ce7e..c7ce36b6e6b1410b51c90513792e0f468bdf0805 100644
--- a/tests/lib/share20/defaultshareprovidertest.php
+++ b/tests/lib/share20/defaultshareprovidertest.php
@@ -77,11 +77,12 @@ class DefaultShareProviderTest extends \Test\TestCase {
 		$qb->insert('share')
 			->values([
 				'id' => $qb->expr()->literal(1),
-				'share_type' => $qb->expr()->literal(\OCP\Share::SHARE_TYPE_USER),
-				'share_with' => $qb->expr()->literal('sharedWith'),
-				'uid_owner' => $qb->expr()->literal('sharedBy'),
+				'share_type'  => $qb->expr()->literal(\OCP\Share::SHARE_TYPE_USER),
+				'share_with'  => $qb->expr()->literal('sharedWith'),
+				'uid_owner'   => $qb->expr()->literal('sharedBy'),
 				'file_source' => $qb->expr()->literal(42),
 				'permissions' => $qb->expr()->literal(13),
+				'file_target' => $qb->expr()->literal('myTarget'),
 			]);
 		$qb->execute();
 
@@ -123,6 +124,7 @@ class DefaultShareProviderTest extends \Test\TestCase {
 		$this->assertEquals(13, $share->getPermissions());
 		$this->assertEquals(null, $share->getToken());
 		$this->assertEquals(null, $share->getExpirationDate());
+		$this->assertEquals('myTarget', $share->getTarget());
 	}
 
 	public function testGetShareByIdGroupShare() {
@@ -136,6 +138,7 @@ class DefaultShareProviderTest extends \Test\TestCase {
 				'uid_owner' => $qb->expr()->literal('sharedBy'),
 				'file_source' => $qb->expr()->literal(42),
 				'permissions' => $qb->expr()->literal(13),
+				'file_target' => $qb->expr()->literal('myTarget'),
 			]);
 		$qb->execute();
 
@@ -181,6 +184,7 @@ class DefaultShareProviderTest extends \Test\TestCase {
 		$this->assertEquals(13, $share->getPermissions());
 		$this->assertEquals(null, $share->getToken());
 		$this->assertEquals(null, $share->getExpirationDate());
+		$this->assertEquals('myTarget', $share->getTarget());
 	}
 
 	public function testGetShareByIdLinkShare() {
@@ -196,6 +200,7 @@ class DefaultShareProviderTest extends \Test\TestCase {
 				'permissions' => $qb->expr()->literal(13),
 				'token' => $qb->expr()->literal('token'),
 				'expiration' => $qb->expr()->literal('2000-01-02 00:00:00'),
+				'file_target' => $qb->expr()->literal('myTarget'),
 			]);
 		$qb->execute();
 
@@ -235,6 +240,7 @@ class DefaultShareProviderTest extends \Test\TestCase {
 		$this->assertEquals(13, $share->getPermissions());
 		$this->assertEquals('token', $share->getToken());
 		$this->assertEquals(\DateTime::createFromFormat('Y-m-d H:i:s', '2000-01-02 00:00:00'), $share->getExpirationDate());
+		$this->assertEquals('myTarget', $share->getTarget());
 	}
 
 	public function testGetShareByIdRemoteShare() {
@@ -248,6 +254,7 @@ class DefaultShareProviderTest extends \Test\TestCase {
 				'uid_owner' => $qb->expr()->literal('sharedBy'),
 				'file_source' => $qb->expr()->literal(42),
 				'permissions' => $qb->expr()->literal(13),
+				'file_target' => $qb->expr()->literal('myTarget'),
 			]);
 		$qb->execute();
 
@@ -287,11 +294,11 @@ class DefaultShareProviderTest extends \Test\TestCase {
 		$this->assertEquals(13, $share->getPermissions());
 		$this->assertEquals(null, $share->getToken());
 		$this->assertEquals(null, $share->getExpirationDate());
+		$this->assertEquals('myTarget', $share->getTarget());
 	}
 
 	public function testDeleteSingleShare() {
 		$qb = $this->dbConn->getQueryBuilder();
-
 		$qb->insert('share')
 			->values([
 				'id' => $qb->expr()->literal(1),
@@ -303,102 +310,89 @@ class DefaultShareProviderTest extends \Test\TestCase {
 			]);
 		$qb->execute();
 
-		$storage = $this->getMock('OC\Files\Storage\Storage');
-		$storage
-			->expects($this->once())
-			->method('getOwner')
-			->willReturn('shareOwner');
-		$path = $this->getMock('OCP\Files\Node');
+		$path = $this->getMock('OCP\Files\File');
 		$path
-			->expects($this->once())
-			->method('getStorage')
-			->wilLReturn($storage);
-		$this->userFolder
-			->expects($this->once())
-			->method('getById')
-			->with(42)
-			->willReturn([$path]);
+			->expects($this->exactly(2))
+			->method('getId')
+			->willReturn(42);
 
 		$sharedWith = $this->getMock('OCP\IUser');
+		$sharedWith
+			->expects($this->once())
+			->method('getUID')
+			->willReturn('sharedWith');
 		$sharedBy = $this->getMock('OCP\IUser');
-		$shareOwner = $this->getMock('OCP\IUser');
-		$this->userManager
-			->method('get')
-			->will($this->returnValueMap([
-				['sharedWith', $sharedWith],
-				['sharedBy', $sharedBy],
-				['shareOwner', $shareOwner],
-			]));
-
-		$share = $this->provider->getShareById(1);
-		$this->provider->delete($share);
-
-		$qb = $this->dbConn->getQueryBuilder();
-		$qb->select('*')
-			->from('share');
-
-		$cursor = $qb->execute();
-		$result = $cursor->fetchAll();
-		$cursor->closeCursor();
-
-		$this->assertEmpty($result);
-	}
-
-	public function testDeleteSingleShareKeepOther() {
-		$qb = $this->dbConn->getQueryBuilder();
-		$qb->insert('share')
-			->values([
-				'id' => $qb->expr()->literal(1),
-				'share_type' => $qb->expr()->literal(\OCP\Share::SHARE_TYPE_USER),
-				'share_with' => $qb->expr()->literal('sharedWith'),
-				'uid_owner' => $qb->expr()->literal('sharedBy'),
-				'file_source' => $qb->expr()->literal(42),
-				'permissions' => $qb->expr()->literal(13),
-			]);
-		$qb->execute();
-
-		$qb = $this->dbConn->getQueryBuilder();
-		$qb->insert('share')
-			->values([
-				'id' => $qb->expr()->literal(2),
-				'share_type' => $qb->expr()->literal(\OCP\Share::SHARE_TYPE_USER),
-				'share_with' => $qb->expr()->literal('sharedWith'),
-				'uid_owner' => $qb->expr()->literal('sharedBy'),
-				'file_source' => $qb->expr()->literal(42),
-				'permissions' => $qb->expr()->literal(13),
-			]);
-		$qb->execute();
-
+		$sharedBy
+			->expects($this->once())
+			->method('getUID')
+			->willReturn('sharedBy');
 
-		$storage = $this->getMock('OC\Files\Storage\Storage');
-		$storage
+		$share = $this->getMock('OC\Share20\IShare');
+		$share
+			->method('getId')
+			->willReturn(1);
+		$share
 			->expects($this->once())
-			->method('getOwner')
-			->willReturn('shareOwner');
-		$path = $this->getMock('OCP\Files\Node');
-		$path
+			->method('getShareType')
+			->willReturn(\OCP\Share::SHARE_TYPE_USER);
+		$share
+			->expects($this->exactly(3))
+			->method('getPath')
+			->willReturn($path);
+		$share
 			->expects($this->once())
-			->method('getStorage')
-			->wilLReturn($storage);
-		$this->userFolder
+			->method('getSharedWith')
+			->willReturn($sharedWith);
+		$share
 			->expects($this->once())
-			->method('getById')
-			->with(42)
-			->willReturn([$path]);
+			->method('getSharedBy')
+			->willReturn($sharedBy);
+		$share
+			->expects($this->once())
+			->method('getTarget')
+			->willReturn('myTarget');
 
-		$sharedWith = $this->getMock('OCP\IUser');
-		$sharedBy = $this->getMock('OCP\IUser');
-		$shareOwner = $this->getMock('OCP\IUser');
-		$this->userManager
-			->method('get')
-			->will($this->returnValueMap([
-				['sharedWith', $sharedWith],
-				['sharedBy', $sharedBy],
-				['shareOwner', $shareOwner],
-			]));
+		$provider = $this->getMockBuilder('OC\Share20\DefaultShareProvider')
+            ->setConstructorArgs([  
+                    $this->dbConn,
+                    $this->userManager,
+                    $this->groupManager,
+                    $this->userFolder,
+                ]        
+            )            
+            ->setMethods(['deleteChildren', 'getShareById'])
+            ->getMock();
+		$provider
+			->expects($this->once())
+			->method('deleteChildren');
+		$provider
+			->expects($this->once())
+			->method('getShareById')
+			->willReturn($share);
+
+		$hookListner = $this->getMockBuilder('Dummy')->setMethods(['listen'])->getMock();
+		\OCP\Util::connectHook('OCP\Share', 'pre_unshare', $hookListner, 'listen');
+		\OCP\Util::connectHook('OCP\Share', 'post_unshare', $hookListner, 'listen');
+
+		$hookListnerExpects = [
+			'id' => 1,
+			'itemType' => 'file',
+			'itemSource' => 42,
+			'shareType' => \OCP\Share::SHARE_TYPE_USER,
+			'shareWith' => 'sharedWith',
+			'itemparent' => null,
+			'uidOwner' => 'sharedBy',
+			'fileSource' => 42,
+			'fileTarget' => 'myTarget',
+		];
+
+		$hookListner
+			->expects($this->exactly(2))
+			->method('listen')
+			->with($hookListnerExpects);
 
-		$share = $this->provider->getShareById(1);
-		$this->provider->delete($share);
+
+		$provider->delete($share);
 
 		$qb = $this->dbConn->getQueryBuilder();
 		$qb->select('*')
@@ -408,7 +402,7 @@ class DefaultShareProviderTest extends \Test\TestCase {
 		$result = $cursor->fetchAll();
 		$cursor->closeCursor();
 
-		$this->assertCount(1, $result);
+		$this->assertEmpty($result);
 	}
 
 	public function testDeleteNestedShares() {
@@ -429,8 +423,8 @@ class DefaultShareProviderTest extends \Test\TestCase {
 			->values([
 				'id' => $qb->expr()->literal(2),
 				'share_type' => $qb->expr()->literal(\OCP\Share::SHARE_TYPE_USER),
-				'share_with' => $qb->expr()->literal('sharedWith2'),
-				'uid_owner' => $qb->expr()->literal('sharedBy2'),
+				'share_with' => $qb->expr()->literal('sharedWith'),
+				'uid_owner' => $qb->expr()->literal('sharedBy'),
 				'file_source' => $qb->expr()->literal(42),
 				'permissions' => $qb->expr()->literal(13),
 				'parent' => $qb->expr()->literal(1),
@@ -442,8 +436,8 @@ class DefaultShareProviderTest extends \Test\TestCase {
 			->values([
 				'id' => $qb->expr()->literal(3),
 				'share_type' => $qb->expr()->literal(\OCP\Share::SHARE_TYPE_USER),
-				'share_with' => $qb->expr()->literal('sharedWith2'),
-				'uid_owner' => $qb->expr()->literal('sharedBy2'),
+				'share_with' => $qb->expr()->literal('sharedWith'),
+				'uid_owner' => $qb->expr()->literal('sharedBy'),
 				'file_source' => $qb->expr()->literal(42),
 				'permissions' => $qb->expr()->literal(13),
 				'parent' => $qb->expr()->literal(2),
@@ -453,22 +447,25 @@ class DefaultShareProviderTest extends \Test\TestCase {
 
 		$storage = $this->getMock('OC\Files\Storage\Storage');
 		$storage
-			->expects($this->exactly(3))
 			->method('getOwner')
 			->willReturn('shareOwner');
 		$path = $this->getMock('OCP\Files\Node');
 		$path
-			->expects($this->exactly(3))
 			->method('getStorage')
 			->wilLReturn($storage);
 		$this->userFolder
-			->expects($this->exactly(3))
 			->method('getById')
 			->with(42)
 			->willReturn([$path]);
 
 		$sharedWith = $this->getMock('OCP\IUser');
+		$sharedWith
+			->method('getUID')
+			->willReturn('sharedWith');
 		$sharedBy = $this->getMock('OCP\IUser');
+		$sharedBy
+			->method('getUID')
+			->willReturn('sharedBy');
 		$shareOwner = $this->getMock('OCP\IUser');
 		$this->userManager
 			->method('get')
@@ -497,6 +494,33 @@ class DefaultShareProviderTest extends \Test\TestCase {
 	 */
 	public function testDeleteFails() {
 		$share = $this->getMock('OC\Share20\IShare');
+		$share
+			->method('getId')
+			->willReturn(42);
+		$share
+			->expects($this->once())
+			->method('getShareType')
+			->willReturn(\OCP\Share::SHARE_TYPE_LINK);
+
+		$path = $this->getMock('OCP\Files\Folder');
+		$path
+			->expects($this->exactly(2))
+			->method('getId')
+			->willReturn(100);
+		$share
+			->expects($this->exactly(3))
+			->method('getPath')
+			->willReturn($path);
+
+		$sharedBy = $this->getMock('OCP\IUser');
+		$sharedBy
+			->expects($this->once())
+			->method('getUID');
+		$share
+			->expects($this->once())
+			->method('getSharedBy')
+			->willReturn($sharedBy);
+
 		$expr = $this->getMock('OCP\DB\QueryBuilder\IExpressionBuilder');
 		$qb = $this->getMock('OCP\DB\QueryBuilder\IQueryBuilder');
 		$qb->expects($this->once())
@@ -529,15 +553,18 @@ class DefaultShareProviderTest extends \Test\TestCase {
                     $this->userFolder,
                 ]        
             )            
-            ->setMethods(['deleteChildren'])
+            ->setMethods(['deleteChildren', 'getShareById'])
             ->getMock();
 		$provider
 			->expects($this->once())
 			->method('deleteChildren')
 			->with($share);
+		$provider
+			->expects($this->once())
+			->method('getShareById')
+			->with(42)
+			->willReturn($share);
 		
-
 		$provider->delete($share);
 	}
-
 }