diff --git a/lib/files/mapper.php b/lib/files/mapper.php
index 179e28e5e765a8f385310df10d74e1aa2c1dd3e7..15f5f0628b5cd7ebee9072c1d234dfc2b9727c80 100644
--- a/lib/files/mapper.php
+++ b/lib/files/mapper.php
@@ -167,31 +167,40 @@ class Mapper
 		$query->execute(array($logicPath, $physicalPath, md5($logicPath), md5($physicalPath)));
 	}
 
-	private function slugifyPath($path, $index=null) {
+	public function slugifyPath($path, $index=null) {
 		$path = $this->stripRootFolder($path, $this->unchangedPhysicalRoot);
 
 		$pathElements = explode('/', $path);
 		$sluggedElements = array();
 
+		// rip off the extension ext from last element
+		$last= end($pathElements);
+		$parts = pathinfo($last);
+		$filename = $parts['filename'];
+		array_pop($pathElements);
+		array_push($pathElements, $filename);
+
 		foreach ($pathElements as $pathElement) {
 			// remove empty elements
 			if (empty($pathElement)) {
 				continue;
 			}
 
-			// TODO: remove file ext before slugify on last element
 			$sluggedElements[] = self::slugify($pathElement);
 		}
 
-		//
-		// TODO: add the index before the file extension
-		//
+		// apply index to file name
 		if ($index !== null) {
-			$last= end($sluggedElements);
-			array_pop($sluggedElements);
+			$last= array_pop($sluggedElements);
 			array_push($sluggedElements, $last.'-'.$index);
 		}
 
+		// add back the extension
+		if (isset($parts['extension'])) {
+			$last= array_pop($sluggedElements);
+			array_push($sluggedElements, $last.'.'.$parts['extension']);
+		}
+
 		$sluggedPath = $this->unchangedPhysicalRoot.implode('/', $sluggedElements);
 		return $this->stripLast($sluggedPath);
 	}
diff --git a/tests/lib/files/mapper.php b/tests/lib/files/mapper.php
new file mode 100644
index 0000000000000000000000000000000000000000..e3859bc0f2333213e041acd899ecd1069992dab2
--- /dev/null
+++ b/tests/lib/files/mapper.php
@@ -0,0 +1,52 @@
+<?php
+/**
+ * ownCloud
+ *
+ * @author Thomas Müller
+ * @copyright 2013 Thomas Müller thomas.mueller@owncloud.com
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
+ * License as published by the Free Software Foundation; either
+ * version 3 of the License, or any later version.
+ *
+ * This library 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 along with this library.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+namespace Test\Files;
+
+class Mapper extends \PHPUnit_Framework_TestCase {
+
+	/**
+	 * @var \OC\Files\Mapper
+	 */
+	private $mapper = null;
+
+	public function setUp() {
+		$this->mapper = new \OC\Files\Mapper('D:/');
+	}
+
+	public function testSlugifyPath() {
+		// with extension
+		$this->assertEquals('D:/text.txt', $this->mapper->slugifyPath('D:/text.txt'));
+		$this->assertEquals('D:/text-2.txt', $this->mapper->slugifyPath('D:/text.txt', 2));
+		$this->assertEquals('D:/a/b/text.txt', $this->mapper->slugifyPath('D:/a/b/text.txt'));
+
+		// without extension
+		$this->assertEquals('D:/text', $this->mapper->slugifyPath('D:/text'));
+		$this->assertEquals('D:/text-2', $this->mapper->slugifyPath('D:/text', 2));
+		$this->assertEquals('D:/a/b/text', $this->mapper->slugifyPath('D:/a/b/text'));
+
+		// with double dot
+		$this->assertEquals('D:/text-text.txt', $this->mapper->slugifyPath('D:/text.text.txt'));
+		$this->assertEquals('D:/text-text-2.txt', $this->mapper->slugifyPath('D:/text.text.txt', 2));
+		$this->assertEquals('D:/a/b/text-text.txt', $this->mapper->slugifyPath('D:/a/b/text.text.txt'));
+	}
+}