diff --git a/inc/User/backend.php b/inc/User/backend.php
index e71d155cea1fbde4b6c64d0f5ca15043ba2b2bd4..9d10adefd40ac47cb77c178e2528a530e79896df 100755
--- a/inc/User/backend.php
+++ b/inc/User/backend.php
@@ -33,7 +33,7 @@ abstract class OC_USER_BACKEND {
 	 * Check if the login button is pressed and log the user in
 	 *
 	 */
-	abstract public static function loginLisener();
+	abstract public static function loginListener();
 
 	/**
 	 * Try to create a new user
@@ -55,7 +55,7 @@ abstract class OC_USER_BACKEND {
 	 * Check if the logout button is pressed and logout the user
 	 *
 	 */
-	abstract public static function logoutLisener();
+	abstract public static function logoutListener();
 
 	/**
 	 * Check if some user is logged in
diff --git a/inc/User/database.php b/inc/User/database.php
index 9a39e191f6127ec0c7ee52775d8b4f9e267895eb..bd33ba6b6e9cf85e90f607b2fa4d4acfd2f90f57 100755
--- a/inc/User/database.php
+++ b/inc/User/database.php
@@ -36,7 +36,7 @@ class OC_USER_DATABASE extends OC_USER_BACKEND {
 	 * Check if the login button is pressed and log the user in
 	 *
 	 */
-	public static function loginLisener(){
+	public static function loginListener(){
 		if ( isset($_POST['loginbutton']) AND isset($_POST['password']) AND isset($_POST['login']) ) {
 			if ( OC_USER::login($_POST['login'], $_POST['password']) ) {
 				echo 1;
@@ -111,7 +111,7 @@ class OC_USER_DATABASE extends OC_USER_BACKEND {
 	 * Check if the logout button is pressed and logout the user
 	 *
 	 */
-	public static function logoutLisener() {
+	public static function logoutListener() {
 		global $WEBROOT;
 		if ( isset($_GET['logoutbutton']) AND isset($_SESSION['username']) ) {
 			OC_LOG::event($_SESSION['username'], 2, '');
diff --git a/inc/lib_base.php b/inc/lib_base.php
index 65664ae861485df61edbda115b77c12b6eda7bd0..b8c639b2446dbf43aca673669885f01d59347274 100644
--- a/inc/lib_base.php
+++ b/inc/lib_base.php
@@ -102,8 +102,8 @@ OC_UTIL::setupFS();
 OC_UTIL::checkserver();
 
 // listen for login or logout actions
-OC_USER::logoutlisener();
-$loginresult=OC_USER::loginlisener();
+OC_USER::logoutlistener();
+$loginresult=OC_USER::loginlistener();
 
 /**
  * Class for utility functions
diff --git a/inc/lib_config.php b/inc/lib_config.php
index d5f0f2270fbd15b7836b41f5a581b5411a989231..6863146cde90fad8c78bbd622767741e511bf95e 100644
--- a/inc/lib_config.php
+++ b/inc/lib_config.php
@@ -45,7 +45,7 @@ class OC_CONFIG{
 	}
   }
 
-	public static function createUserLisener(){
+	public static function createUserListener(){
 		if(OC_USER::isLoggedIn()){
 			if(OC_USER::ingroup($_SESSION['username'],'admin')){
 				if(isset($_POST['new_username']) and isset($_POST['new_password'])){
@@ -63,7 +63,7 @@ class OC_CONFIG{
 		}
 	}
 	
-	public static function createGroupLisener(){
+	public static function createGroupListener(){
 		if(OC_USER::isLoggedIn()){
 			if(isset($_POST['creategroup']) and $_POST['creategroup']==1){
 				if(OC_USER::creategroup($_POST['groupname'])){
@@ -81,10 +81,10 @@ class OC_CONFIG{
 	
 	
 	/**
-   * lisen for configuration changes
+   * listen for configuration changes
    *
    */
-	public static function configLisener(){
+	public static function configListener(){
 		if(OC_USER::isLoggedIn()){
 			if(isset($_POST['config']) and $_POST['config']==1){
 				$error='';
@@ -139,10 +139,10 @@ class OC_CONFIG{
 	}
 	
 	/**
-	* lisen for admin configuration changes and write it to the file
+	* listen for admin configuration changes and write it to the file
 	*4bd0be1185e76
 	*/
-	public static function writeAdminLisener(){
+	public static function writeAdminListener(){
 		global $CONFIG_INSTALLED;
 		$allow=false;
 		if(!$CONFIG_INSTALLED){
diff --git a/inc/lib_filesystem.php b/inc/lib_filesystem.php
index a64d2ba599bbe52182bbab5cfb0978c0ab7b9ebc..170d296bd23d3f8789f00ea56520032421cb5ca9 100644
--- a/inc/lib_filesystem.php
+++ b/inc/lib_filesystem.php
@@ -111,7 +111,7 @@ class OC_FILESYSTEM{
 		if(substr($path,0,1)!=='/'){
 			$path='/'.$path;
 		}
-		if(strstr($path,'/../')){
+		if(strstr($path,'/../') || strrchr($path, '/') === '/..' ){
 			return false;
 		}
 		return true;//dummy untill premissions are correctly implemented, also the correcty value because for now users are locked in their seperate data dir and can read/write everything in there
@@ -125,7 +125,7 @@ class OC_FILESYSTEM{
 		if(substr($path,0,1)!=='/'){
 			$path='/'.$path;
 		}
-		if(strstr($path,'/../')){
+		if(strstr($path,'/../') || strrchr($path, '/') === '/..' ){
 			return false;
 		}
 		return true;//dummy untill premissions are correctly implemented, also the correcty value because for now users are locked in their seperate data dir and can read/write everything in there
diff --git a/inc/lib_plugin.php b/inc/lib_plugin.php
index 76f94a1156d280308e4333c5aa8b38701e146196..eb7533c44796dcff288b5e537a6063c47771de2f 100644
--- a/inc/lib_plugin.php
+++ b/inc/lib_plugin.php
@@ -59,8 +59,10 @@ class OC_PLUGIN{
 				}
 			}
 			
-			foreach($data['runtime'] as $include){
-				include($SERVERROOT.'/plugins/'.$id.'/'.$include);
+			if(isset($data['runtime'])){
+				foreach($data['runtime'] as $include){
+					include($SERVERROOT.'/plugins/'.$id.'/'.$include);
+				}
 			}
 		}
 		return false;
diff --git a/inc/lib_user.php b/inc/lib_user.php
index 8bde1d9207552f025597ac56e35752fbb7e4461b..5b48e0abf2fcbfeb176b42d5ff57de0853cbcf37 100644
--- a/inc/lib_user.php
+++ b/inc/lib_user.php
@@ -78,8 +78,8 @@ class OC_USER {
 	 * Check if the login button is pressed and log the user in
 	 *
 	 */
-	public static function loginLisener() {
-		return self::$_backend->loginLisener();
+	public static function loginListener() {
+		return self::$_backend->loginListener();
 	}
 
 	/**
@@ -106,8 +106,8 @@ class OC_USER {
 	 * Check if the logout button is pressed and logout the user
 	 *
 	 */
-	public static function logoutLisener() {
-		return self::$_backend->logoutLisener();
+	public static function logoutListener() {
+		return self::$_backend->logoutListener();
 	}
 
 	/**
diff --git a/inc/templates/header.php b/inc/templates/header.php
index 9b67f34c884769788681f82235312382c19f71ef..4593af59518c220d8d0f4eb2efc4ef24ce539d89 100644
--- a/inc/templates/header.php
+++ b/inc/templates/header.php
@@ -51,14 +51,14 @@ if(!OC_UTIL::hasSmallScreen()){
 
 
   // check if already configured. otherwise start configuration wizard
-  $error=OC_CONFIG::writeadminlisener();
-  if($e=OC_CONFIG::configlisener()){
+  $error=OC_CONFIG::writeadminlistener();
+  if($e=OC_CONFIG::configlistener()){
 	$error.=$e;
   }
-  if($e=OC_CONFIG::createuserlisener()){
+  if($e=OC_CONFIG::createuserlistener()){
 	$error.=$e;
   }
-  if($e=OC_CONFIG::creategrouplisener()){
+  if($e=OC_CONFIG::creategrouplistener()){
 	$error.=$e;
   }
   $CONFIG_ERROR=$error;
diff --git a/js/lib_files.js b/js/lib_files.js
index 8f7f903558559d15086d3174176bf508cb271be4..54af643272a2c2552864ae081e27cb488a85fbf3 100644
--- a/js/lib_files.js
+++ b/js/lib_files.js
@@ -225,6 +225,10 @@ OC_FILES.newFile=function(type,name,dir){
 	arg=new Object;
 	arg.name=name;
 	arg.dir=dir;
+	if(OC_FILES.cache.files[name]){//check if the file already exists
+		alert(((type=='dir')?'folder ':'file ')+name+' already exists.');
+		return;
+	}
 	arg.type=type;
 	OC_API.run('new',{dir:dir,name:name,type:type},OC_FILES.new_callback,arg)
 	if(!OC_FILES.cache.incomplete[dir]){
diff --git a/plugins/audioplayer/README b/plugins/audioplayer/README
new file mode 100644
index 0000000000000000000000000000000000000000..5de1324d56a04047262d0b4e7b475281548456af
--- /dev/null
+++ b/plugins/audioplayer/README
@@ -0,0 +1,9 @@
+This plugin implements a very basic HTML5 audio preview for ownCloud.
+
+Only formats supported by the browser can be played.
+Sadly, those are very limited and not coherent among browsers, see http://html5doctor.com/native-audio-in-the-browser/ for more info.
+
+Ideas to change that (TODO):
+- Flashplayer fallback
+and/or
+- on-the-fly transcoding
diff --git a/plugins/audioplayer/audioplayer.js b/plugins/audioplayer/audioplayer.js
new file mode 100644
index 0000000000000000000000000000000000000000..07e9f5e23ee22999bd5fdc1255c322fab3a72319
--- /dev/null
+++ b/plugins/audioplayer/audioplayer.js
@@ -0,0 +1,66 @@
+OC_AudioPlayer = new Object();
+
+OC_AudioPlayer.playAudio = function(dir, file, type) {
+	var path = WEBROOT + '/files/api?action=get&dir='+encodeURIComponent(dir)+'&file='+encodeURIComponent(file);
+	
+	OC_AudioPlayer.audioFrame = document.createElement('div');
+	OC_AudioPlayer.audioFrame.setAttribute('id', 'audioframe');
+	OC_AudioPlayer.audioFrame.setAttribute('class', 'center');
+	var div = document.createElement('div');
+	var inner = document.createElement('div');
+	var audio = document.createElement('audio');
+	var source = document.createElement('source');
+	
+// 	if (!(!!(audio.canPlayType) && (audio.canPlayType(type) != "no") && (audio.canPlayType(type) != ""))) {
+// 		// use a flash player fallback
+// 		// or implement some nice on-the-fly recoding here
+// 		alert("Native playing of '"+type+"' format is not supported by your browser.");
+// 		return;
+// 	}
+	audio.setAttribute('controls', 'controls');
+	audio.setAttribute('preload', 'auto');
+	audio.setAttribute('autoplay', 'autoplay');
+	audio.setAttribute('autobuffer', 'autobuffer');
+	source.setAttribute('src', path);
+	source.setAttribute('type', type);
+	
+	audio.appendChild(source);
+	inner.appendChild(audio);
+	div.appendChild(inner);
+	OC_AudioPlayer.audioFrame.appendChild(div);
+	
+	OC_AudioPlayer.audioFrame.addEvent('onclick', OC_AudioPlayer.hidePlayer);
+	inner.addEvent('onclick', function(e){e.stopPropagation();}); // don't close if clicked on player
+	
+	body = document.getElementsByTagName('body').item(0);
+	body.appendChild(OC_AudioPlayer.audioFrame);
+}
+
+OC_AudioPlayer.hidePlayer = function(){
+	var div = document.getElementById('audioframe');
+	div.parentNode.removeChild(div);
+} 
+
+// only register "play" option for file formats the browser claims to support
+OC_AudioPlayer.formats = {
+	'audio/mpeg':"mp3",
+	'audio/ogg':"ogg",
+	'application/ogg':"ogg",
+	'audio/wav':"wav",
+	'audio/wave':"wav",
+	'audio/x-wav':"wav",
+	'audio/basic':"au",
+	'audio/x-aiff':"aif"
+};
+var audio = document.createElement('audio');
+for(format in OC_AudioPlayer.formats) {
+	if (!!(audio.canPlayType) && (audio.canPlayType(format) != "no") && (audio.canPlayType(format) != "")) {
+		if(!OC_FILES.fileActions[format]) {
+			OC_FILES.fileActions[format] = new Object();
+		}
+		OC_FILES.fileActions[format].play = function() {
+			OC_AudioPlayer.playAudio(this.dir, this.file, this.mime);
+		}
+		OC_FILES.fileActions[format]['default'] = OC_FILES.fileActions[format].play;
+	}
+}
diff --git a/plugins/audioplayer/lib_audioplayer.php b/plugins/audioplayer/lib_audioplayer.php
new file mode 100644
index 0000000000000000000000000000000000000000..206f76bb561fd24146597cb893c6242dd6cf2cb8
--- /dev/null
+++ b/plugins/audioplayer/lib_audioplayer.php
@@ -0,0 +1,5 @@
+<?php
+//load the required js and css files
+OC_UTIL::addScript('plugins/audioplayer/audioplayer.js');
+OC_UTIL::addStyle('plugins/audioplayer/style.css');
+?>
diff --git a/plugins/audioplayer/plugin.xml b/plugins/audioplayer/plugin.xml
new file mode 100644
index 0000000000000000000000000000000000000000..ea58af245ec1a8f01fb74122781326dbd9af167b
--- /dev/null
+++ b/plugins/audioplayer/plugin.xml
@@ -0,0 +1,15 @@
+<?xml version="1.0"?> 
+<plugin version='1.0'>
+	<info>
+		<id>audioplayer</id>
+		<name>A simple HTML5 based audio player for ownCloud</name>
+		<version>0.1</version>
+		<licence>AGPL</licence>
+		<author>ente</author>
+		<require>1.1</require>
+	</info>
+	<runtime>
+		<include>lib_audioplayer.php</include>
+	</runtime>
+</plugin> 
+
diff --git a/plugins/audioplayer/style.css b/plugins/audioplayer/style.css
new file mode 100644
index 0000000000000000000000000000000000000000..689a04940ed11c19f81663128f643f2474060c93
--- /dev/null
+++ b/plugins/audioplayer/style.css
@@ -0,0 +1,21 @@
+#audioframe{
+	position:absolute;
+	top:0px;
+	left:0px;
+	height:100%;
+	width:100%;
+	background:rgb(20,20,20);
+	background:rgba(20,20,20,0.9);
+	text-align:center;
+	display:table;
+}
+
+#audioframe>div{
+	display:table-cell;
+	vertical-align:middle;
+}
+
+#audioframe>div>div{
+	display:inline-block;
+}
+
diff --git a/plugins/ldap/lib_ldap.php b/plugins/ldap/lib_ldap.php
index 16bd3a52869379be9b6c0594dc6b37f2b02282ad..2bb557919a215363860726f95c2641ff8c3a0618 100755
--- a/plugins/ldap/lib_ldap.php
+++ b/plugins/ldap/lib_ldap.php
@@ -35,7 +35,7 @@ class OC_USER_LDAP extends OC_USER_BACKEND {
 	 * Check if the login button is pressed and log the user in
 	 *
 	 */
-	public static function loginLisener() {
+	public static function loginListener() {
 		return('');
 	}
 
@@ -69,7 +69,7 @@ class OC_USER_LDAP extends OC_USER_BACKEND {
 	 * Check if the logout button is pressed and logout the user
 	 *
 	 */
-	public static function logoutLisener() {
+	public static function logoutListener() {
 		if ( isset($_GET['logoutbutton']) AND isset($_SESSION['username']) ) {
 			header('WWW-Authenticate: Basic realm="ownCloud"');
 			header('HTTP/1.0 401 Unauthorized');