diff --git a/apps/files/js/filelist.js b/apps/files/js/filelist.js
index f20d942927135a3f023545e2ffcb43ad28930bbb..5cab0707bdab40d639d0136c89086f03ef62fc53 100644
--- a/apps/files/js/filelist.js
+++ b/apps/files/js/filelist.js
@@ -569,8 +569,18 @@ var FileList={
 						FileList.updateEmptyContent();
 						Files.updateStorageStatistics();
 					} else {
+						if (result.status === 'error' && result.data.message) {
+							OC.Notification.show(result.data.message);
+						}
+						else {
+							OC.Notification.show(t('files', 'Error deleting file.'));
+						}
+						// hide notification after 10 sec
+						setTimeout(function() {
+							OC.Notification.hide();
+						}, 10000);
 						$.each(files,function(index,file) {
-							var deleteAction = $('tr[data-file="'+files[i]+'"]').children("td.date").children(".action.delete");
+							var deleteAction = $('tr[data-file="' + file + '"] .action.delete');
 							deleteAction.removeClass('progress-icon').addClass('delete-icon');
 						});
 					}
diff --git a/apps/files_external/lib/smb.php b/apps/files_external/lib/smb.php
index ecd4dae04849a19dccd316bb0f11d0e1f9411b78..5bff597fdca0607a9aeff09c9eae4f9575d39ed7 100644
--- a/apps/files_external/lib/smb.php
+++ b/apps/files_external/lib/smb.php
@@ -47,8 +47,13 @@ class SMB extends \OC\Files\Storage\StreamWrapper{
 
 	public function constructUrl($path) {
 		if (substr($path, -1)=='/') {
-			$path=substr($path, 0, -1);
+			$path = substr($path, 0, -1);
 		}
+		if (substr($path, 0, 1)=='/') {
+			$path = substr($path, 1);
+		}
+		// remove trailing dots which some versions of samba don't seem to like
+		$path = rtrim($path, '.');
 		$path = urlencode($path);
 		$user = urlencode($this->user);
 		$pass = urlencode($this->password);
@@ -76,6 +81,18 @@ class SMB extends \OC\Files\Storage\StreamWrapper{
 		}
 	}
 
+	/**
+	 * Unlinks file
+	 * @param string @path
+	 */
+	public function unlink($path) {
+		unlink($this->constructUrl($path));
+		clearstatcache();
+		// smb4php still returns false even on success so
+		// check here whether file was really deleted
+		return !file_exists($path);
+	}
+
 	/**
 	 * check if a file or folder has been updated since $time
 	 * @param string $path
diff --git a/apps/files_external/tests/smbfunctions.php b/apps/files_external/tests/smbfunctions.php
new file mode 100644
index 0000000000000000000000000000000000000000..749906d01364e37b734b728ce6ce792fc8e86568
--- /dev/null
+++ b/apps/files_external/tests/smbfunctions.php
@@ -0,0 +1,41 @@
+<?php
+/**
+ * Copyright (c) 2013 Vincent Petry <pvince81@owncloud.com>
+ * This file is licensed under the Affero General Public License version 3 or
+ * later.
+ * See the COPYING-README file.
+ */
+
+namespace Test\Files\Storage;
+
+class SMBFunctions extends \PHPUnit_Framework_TestCase {
+
+	public function setUp() {
+		$id = uniqid();
+		// dummy config
+		$this->config = array(
+			'run'=>false,
+			'user'=>'test',
+			'password'=>'testpassword',
+			'host'=>'smbhost',
+			'share'=>'/sharename',
+			'root'=>'/rootdir/',
+		);
+
+		$this->instance = new \OC\Files\Storage\SMB($this->config);
+	}
+
+	public function tearDown() {
+	}
+
+	public function testGetId() {
+		$this->assertEquals('smb::test@smbhost//sharename//rootdir/', $this->instance->getId());
+	}
+
+	public function testConstructUrl() {
+		$this->assertEquals("smb://test:testpassword@smbhost/sharename/rootdir/abc", $this->instance->constructUrl('/abc'));
+		$this->assertEquals("smb://test:testpassword@smbhost/sharename/rootdir/abc", $this->instance->constructUrl('/abc/'));
+		$this->assertEquals("smb://test:testpassword@smbhost/sharename/rootdir/abc%2F", $this->instance->constructUrl('/abc/.'));
+		$this->assertEquals("smb://test:testpassword@smbhost/sharename/rootdir/abc%2Fdef", $this->instance->constructUrl('/abc/def'));
+	}
+}
diff --git a/tests/lib/files/storage/storage.php b/tests/lib/files/storage/storage.php
index f72a5276db51180863dd60603b3f403f8d2411b2..6c433e95475c7c8ecdd21af266569bccfd409560 100644
--- a/tests/lib/files/storage/storage.php
+++ b/tests/lib/files/storage/storage.php
@@ -182,8 +182,9 @@ abstract class Storage extends \PHPUnit_Framework_TestCase {
 		$this->assertTrue($this->instance->hasUpdated('/lorem.txt', $ctimeStart - 5));
 		$this->assertTrue($this->instance->hasUpdated('/', $ctimeStart - 5));
 
-		$this->assertTrue(($ctimeStart - 5) <= $mTime);
-		$this->assertTrue($mTime <= ($ctimeEnd + 1));
+		// check that ($ctimeStart - 5) <= $mTime <= ($ctimeEnd + 1)
+		$this->assertGreaterThanOrEqual(($ctimeStart - 5), $mTime);
+		$this->assertLessThanOrEqual(($ctimeEnd + 1), $mTime);
 		$this->assertEquals(filesize($textFile), $this->instance->filesize('/lorem.txt'));
 
 		$stat = $this->instance->stat('/lorem.txt');
@@ -202,6 +203,17 @@ abstract class Storage extends \PHPUnit_Framework_TestCase {
 		$this->assertTrue($this->instance->hasUpdated('/', $mtimeStart - 5));
 	}
 
+	public function testUnlink() {
+		$textFile = \OC::$SERVERROOT . '/tests/data/lorem.txt';
+		$this->instance->file_put_contents('/lorem.txt', file_get_contents($textFile));
+
+		$this->assertTrue($this->instance->file_exists('/lorem.txt'));
+
+		$this->assertTrue($this->instance->unlink('/lorem.txt'));
+
+		$this->assertFalse($this->instance->file_exists('/lorem.txt'));
+	}
+
 	public function testFOpen() {
 		$textFile = \OC::$SERVERROOT . '/tests/data/lorem.txt';