diff --git a/.htaccess b/.htaccess
index 23c90b26d8cb8777ebbc65ff919d97a84c43170a..92825ea92d5015095675570a60a9670400002aa2 100644
--- a/.htaccess
+++ b/.htaccess
@@ -1,5 +1,5 @@
 ErrorDocument 404 //owncloud/core/templates/404.php
-php_value upload_max_filesize 2048G
-php_value post_max_size 2048G
+php_value upload_max_filesize 512M
+php_value post_max_size 512M
 SetEnv htaccessWorking true
 Options -Indexes
diff --git a/admin/templates/users.php b/admin/templates/users.php
index 8d6b1efe6e2f4b40ac3b21567164c5586b080c0b..77a4f0c0d57f2426d1a0706918690e979ac98d57 100644
--- a/admin/templates/users.php
+++ b/admin/templates/users.php
@@ -6,8 +6,8 @@ foreach($_["groups"] as $group) {
 ?>
 
 <table data-groups="<?php echo implode(', ',$allGroups);?>">
-	<tbody id="controls">
-		<tr><form id="newuser">
+	<tbody>
+		<tr id="controls"><form id="newuser">
 			<th class="name"><input id="newusername" placeholder="<?php echo $l->t('Name')?>"></input></th>
 			<th class="password"><input type="password" id="newuserpassword" placeholder="<?php echo $l->t('Password')?>"></input></th>
 			<th class="groups"><select id="newusergroups" data-placeholder="groups" title="<?php echo $l->t('Groups')?>" multiple="multiple">
diff --git a/apps/media/css/music.css b/apps/media/css/music.css
index c78ab200719ebbf92d84a06e10639540ba6f35bb..f9c3b955d6c55153a99a410d816d9ac6dbeb6110 100644
--- a/apps/media/css/music.css
+++ b/apps/media/css/music.css
@@ -12,4 +12,5 @@ li button.right.prettybutton{font-size:1em;}
 #collection li{padding-right:10px;}
 #searchresults input.play, #searchresults input.add{float:right; height:16px; width:16px;}
 #collection tr.collapsed td.album, #collection tr.collapsed td.title{color:#ddd}
-a.expander{float:right;display:block}
+a.expander{ float:right; display:block; }
+tr.active { background-color:#ccc; }
diff --git a/apps/media/css/player.css b/apps/media/css/player.css
index 6cf424a8ea14031e846788f3ad90658cfb596b86..42ef219994ce1a3e440e8a604bcc0e28c308f4b0 100644
--- a/apps/media/css/player.css
+++ b/apps/media/css/player.css
@@ -1,25 +1,25 @@
 #controls ul.jp-controls{list-style-type:none;padding:0;}
 #controls ul.jp-controls li{display:inline;}
 #controls ul.jp-controls a{position:absolute;overflow:hidden;text-indent:-9999px;}
-a.jp-play,a.jp-pause{width:40px;height:40px;z-index:1;top:0;left:48px;}
+a.jp-play,a.jp-pause{width:3.1em;height:3.1em;z-index:1;top:0;left:3.8em;}
 a.jp-play{background:url("../img/jplayer.blue.monday.png") 0 0 no-repeat;}
 a.jp-play:hover{background:url("../img/jplayer.blue.monday.png") -41px 0 no-repeat;}
 a.jp-pause{background:url("../img/jplayer.blue.monday.png") 0 -42px no-repeat;display:none;}
 a.jp-pause:hover{background:url("../img/jplayer.blue.monday.png") -41px -42px no-repeat;}
-a.jp-previous{left:20px;top:.5em;background:url("../img/jplayer.blue.monday.png") 0 -112px no-repeat;width:28px;height:28px;}
+a.jp-previous{left:20px;top:.5em;background:url("../img/jplayer.blue.monday.png") 0 -112px no-repeat;width:2.3em;height:2.3em;}
 a.jp-previous:hover{background:url("../img/jplayer.blue.monday.png") -29px -112px no-repeat;}
-a.jp-next{left:88px;top:.5em;background:url("../img/jplayer.blue.monday.png") 0 -141px no-repeat;width:28px;height:28px;}
+a.jp-next{left:88px;top:.5em;background:url("../img/jplayer.blue.monday.png") 0 -141px no-repeat;width:2.3em;height:2.3em;}
 a.jp-next:hover{background:url("../img/jplayer.blue.monday.png") -29px -141px no-repeat;}
-div.jp-progress{position:absolute;overflow:hidden;background-color:#293b51;top:1em;left:164px;width:122px;height:15px;}
+div.jp-progress{position:absolute;overflow:hidden;background-color:#293b51;top:1em;left:10em;width:15em;height:1.2em;}
 div.jp-seek-bar{background:url("../img/jplayer.blue.monday.png") 0 -202px repeat-x;width:0;height:100%;cursor:pointer;}
 div.jp-play-bar{background:url("../img/jplayer.blue.monday.png") 0 -218px repeat-x;width:0;height:100%;}
 div.jp-seeking-bg{background:url("../img/pbar-ani.gif");}
-a.jp-mute,a.jp-unmute{height:15px;width:18px;top:1em;left:296px;}
+a.jp-mute,a.jp-unmute{height:1.2em;width:1.5em;top:1em;left:26em;}
 a.jp-mute{background:url("../img/jplayer.blue.monday.png") 0 -186px no-repeat;}
 a.jp-mute:hover{background:url("../img/jplayer.blue.monday.png") -19px -170px no-repeat;}
 a.jp-unmute{background:url("../img/jplayer.blue.monday.png") 0 -170px no-repeat;display:none;}
 a.jp-unmute:hover{background:url("../img/jplayer.blue.monday.png") -19px -186px no-repeat;}
-div.jp-volume-bar{position:absolute;overflow:hidden;background:url("../img/jplayer.blue.monday.png") 0 -250px repeat-x;width:46px;height:5px;cursor:pointer;top:1.3em;left:324px;}
-div.jp-volume-bar-value{background:url("../img/jplayer.blue.monday.png") 0 -256px repeat-x;width:0;height:5px;}
-div.jp-current-time,div.jp-duration{position:absolute;font-size:.64em;font-style:oblique;top:1em;left:164px;width:122px;}
+div.jp-volume-bar{position:absolute;overflow:hidden;background:url("../img/jplayer.blue.monday.png") 0 -250px repeat-x;width:4em;height:0.4em;cursor:pointer;top:1.3em;left:28em;}
+div.jp-volume-bar-value{background:url("../img/jplayer.blue.monday.png") 0 -256px repeat-x;width:0;height:0.4em;}
+div.jp-current-time,div.jp-duration{position:absolute;font-size:.64em;font-style:oblique;top:1em;left:16.8em;width:22em;}
 div.jp-duration{text-align:right;}
diff --git a/apps/media/js/collection.js b/apps/media/js/collection.js
index e49024973fa844691407ab52b175bf1b8d8d1d7f..8ef10951b6bbf476f25eac26c74235ac8cef5003 100644
--- a/apps/media/js/collection.js
+++ b/apps/media/js/collection.js
@@ -60,14 +60,18 @@ Collection={
 							tr.find('td.title a').text(song.song_name);
 							tr.find('td.title a').click(function(event){
 								event.preventDefault();
-								PlayList.add(song);
-								PlayList.render();
+								PlayList.add(song,true);
+								PlayList.play(0);
+								Collection.parent.find('tr').removeClass('active');
+								tr.addClass('active');
 							});
 							if(artist.artist_name!=lastArtist){
 								tr.find('td.artist a').click(function(event){
 									event.preventDefault();
-									PlayList.add(artist);
-									PlayList.render();
+									PlayList.add(artist,true);
+									PlayList.play(0);
+									Collection.parent.find('tr').removeClass('active');
+									$('tr[data-artist="'+artist.artist_name+'"]').addClass('active');
 								});
 								tr.find('td.artist a').text(artist.artist_name);
 								if(artist.albums.length>1){
@@ -87,8 +91,10 @@ Collection={
 							if(album.album_name!=lastAlbum){
 								tr.find('td.album a').click(function(event){
 									event.preventDefault();
-									PlayList.add(album);
-									PlayList.render();
+									PlayList.add(album,true);
+									PlayList.play(0);
+									Collection.parent.find('tr').removeClass('active');
+									$('tr[data-album="'+album.album_name+'"]').addClass('active');
 								});
 								tr.find('td.album a').text(album.album_name);
 								if(album.songs.length>1){
@@ -149,10 +155,11 @@ Collection={
 			Collection.parent.hide();
 		}
 	},
-	registerPlay:function(){
-		var item=PlayList.items[PlayList.current];
-		var song=Collection.findSong(item.artist,item.album,item.name);
-		song.song_playcount++;
+	registerPlay:function(item){
+		if(item){
+			var song=Collection.findSong(item.artist,item.album,item.name);
+			song.song_playcount++;
+		}
 	},
 	addButtons:function(parent){
 		parent.children('button.add').click(function(){
diff --git a/apps/media/js/player.js b/apps/media/js/player.js
index 8298db56e610b2387dfdc26cdc3ea602c25d1afe..d37196a89f5e3387eca6aae6e6f6e875deaf5a79 100644
--- a/apps/media/js/player.js
+++ b/apps/media/js/player.js
@@ -5,48 +5,53 @@ var PlayList={
 	player:null,
 	volume:0.8,
 	active:false,
+	tempPlaylist:[],
+	isTemp:true,
 	next:function(){
+		var items=(PlayList.isTemp)?PlayList.tempPlaylist:PlayList.items;
 		var next=PlayList.current+1;
-		if(next>=PlayList.items.length){
+		if(next>=items.length){
 			next=0;
 		}
 		PlayList.play(next);
 		PlayList.render();
 	},
 	previous:function(){
+		var items=(PlayList.isTemp)?PlayList.tempPlaylist:PlayList.items;
 		var next=PlayList.current-1;
 		if(next<0){
-			next=PlayList.items.length-1;
+			next=items.length-1;
 		}
 		PlayList.play(next);
 		PlayList.render();
 	},
 	play:function(index,time,ready){
+		var items=(PlayList.isTemp)?PlayList.tempPlaylist:PlayList.items;
 		if(index==null){
 			index=PlayList.current;
 		}
-		if(index>-1 && index<PlayList.items.length){
+		if(index>-1 && index<items.length){
 			PlayList.current=index;
 			if(PlayList.player){
-				if(PlayList.player.data('jPlayer').options.supplied!=PlayList.items[index].type){//the the audio type changes we need to reinitialize jplayer
+				if(PlayList.player.data('jPlayer').options.supplied!=items[index].type){//the the audio type changes we need to reinitialize jplayer
 					PlayList.player.jPlayer("destroy");
-					PlayList.init(PlayList.items[index].type,function(){PlayList.play(null,time,ready)});
+					PlayList.init(items[index].type,function(){PlayList.play(null,time,ready)});
 				}else{
-					PlayList.player.jPlayer("setMedia", PlayList.items[PlayList.current]);
-					PlayList.items[index].playcount++;
+					PlayList.player.jPlayer("setMedia", items[PlayList.current]);
+					items[index].playcount++;
 					PlayList.player.jPlayer("play",time);
 					if(index>0){
 						var previous=index-1;
 					}else{
-						var previous=PlayList.items.length-1;
+						var previous=items.length-1;
 					}
-					if(index+1<PlayList.items.length){
+					if(index+1<items.length){
 						var next=index+1;
 					}else{
 						var next=0;
 					}
-					$('.jp-next').attr('title',PlayList.items[next].name);
-					$('.jp-previous').attr('title',PlayList.items[previous].name);
+					$('.jp-next').attr('title',items[next].name);
+					$('.jp-previous').attr('title',items[previous].name);
 					if (typeof Collection !== 'undefined') {
 						Collection.registerPlay();
 					}
@@ -55,7 +60,7 @@ var PlayList={
 					}
 				}
 			}else{
-				PlayList.init(PlayList.items[index].type,PlayList.play);
+				PlayList.init(items[index].type,PlayList.play);
 			}
 		}
 	},
@@ -95,28 +100,37 @@ var PlayList={
 			swfPath:OC.linkTo('media','js'),
 		});
 	},
-	add:function(song){
+	add:function(song,temp,dontReset){
+		if(!dontReset){
+			PlayList.tempPlaylist=[];//clear the temp playlist
+		}
+		PlayList.isTemp=temp;
+		PlayList.isTemp=true;
 		if(!song){
 			return;
 		}
 		if(song.substr){//we are passed a string, asume it's a url to a song
-			PlayList.addFile(song);
+			PlayList.addFile(song,temp,true);
 		}
 		if(song.albums){//a artist object was passed, add all albums inside it
 			$.each(song.albums,function(index,album){
-				PlayList.add(album);
+				PlayList.add(album,temp,true);
 			});
 		}
 		if(song.songs){//a album object was passed, add all songs inside it
 			$.each(song.songs,function(index,song){
-				PlayList.add(song);
+				PlayList.add(song,temp,true);
 			});
 		}
 		if(song.song_name){
 			var type=musicTypeFromFile(song.song_path);
 			var item={name:song.song_name,type:type,artist:song.artist_name,album:song.album_name,length:song.song_length,playcount:song.song_playcount};
 			item[type]=PlayList.urlBase+encodeURIComponent(song.song_path);
-			PlayList.items.push(item);
+			if(PlayList.isTemp){
+				PlayList.tempPlaylist.push(item);
+			}else{
+				PlayList.items.push(item);
+			}
 		}
 	},
 	addFile:function(path){
diff --git a/core/css/jquery-tipsy.css b/core/css/jquery-tipsy.css
new file mode 100644
index 0000000000000000000000000000000000000000..5075f41c9f62e5ecc4d780f56dbd4d57ae9f339d
--- /dev/null
+++ b/core/css/jquery-tipsy.css
@@ -0,0 +1,7 @@
+.tipsy { padding: 5px; font-size: 10px; opacity: 0.8; filter: alpha(opacity=80); background-repeat: no-repeat;  background-image: url(../img/jquery-tipsy.gif); }
+  .tipsy-inner { padding: 5px 8px 4px 8px; background-color: black; color: white; max-width: 200px; text-align: center; }
+  .tipsy-inner { -moz-border-radius:3px; -webkit-border-radius:3px; }
+  .tipsy-north { background-position: top center; }
+  .tipsy-south { background-position: bottom center; }
+  .tipsy-east { background-position: right center; }
+  .tipsy-west { background-position: left center; }
diff --git a/core/img/actions/pause-big.png b/core/img/actions/pause-big.png
new file mode 100644
index 0000000000000000000000000000000000000000..9bcfd0406d8165e2adc4d3cc0909d038e94faa93
Binary files /dev/null and b/core/img/actions/pause-big.png differ
diff --git a/core/img/actions/pause-big.svg b/core/img/actions/pause-big.svg
new file mode 100644
index 0000000000000000000000000000000000000000..b521057a35cef9f29c055f380f5915ab861e287f
--- /dev/null
+++ b/core/img/actions/pause-big.svg
@@ -0,0 +1,73 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="16"
+   height="16"
+   id="svg3875"
+   version="1.1"
+   inkscape:version="0.48.1 r9760"
+   sodipodi:docname="play-big.svg"
+   inkscape:export-filename="/home/jancborchardt/owncloud/core/img/actions/play-add.png"
+   inkscape:export-xdpi="90"
+   inkscape:export-ydpi="90">
+  <defs
+     id="defs3877" />
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="2.2402344"
+     inkscape:cx="110.24162"
+     inkscape:cy="54.102269"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer1"
+     showgrid="true"
+     inkscape:window-width="1280"
+     inkscape:window-height="776"
+     inkscape:window-x="0"
+     inkscape:window-y="24"
+     inkscape:window-maximized="1">
+    <inkscape:grid
+       type="xygrid"
+       id="grid3883"
+       empspacing="5"
+       visible="true"
+       enabled="true"
+       snapvisiblegridlinesonly="true" />
+  </sodipodi:namedview>
+  <metadata
+     id="metadata3880">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title></dc:title>
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(0,-1036.3622)">
+    <path
+       inkscape:connector-curvature="0"
+       style="fill:#000000;fill-opacity:1;stroke:none"
+       d="m 1,1037.3622 0,14 5,0 0,-14 z m 9,0 0,14 5,0 0,-14 z"
+       id="path3086-7"
+       sodipodi:nodetypes="cccccccccc" />
+  </g>
+</svg>
diff --git a/core/img/actions/pause.png b/core/img/actions/pause.png
new file mode 100644
index 0000000000000000000000000000000000000000..ced8c43ab3441af94470f9a97440759f175b9764
Binary files /dev/null and b/core/img/actions/pause.png differ
diff --git a/core/img/actions/pause.svg b/core/img/actions/pause.svg
new file mode 100644
index 0000000000000000000000000000000000000000..ff3c69d6c71c704ea758e3aea58329118c224a3a
--- /dev/null
+++ b/core/img/actions/pause.svg
@@ -0,0 +1,72 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="16"
+   height="16"
+   id="svg3875"
+   version="1.1"
+   inkscape:version="0.48.1 r9760"
+   sodipodi:docname="play-next.svg"
+   inkscape:export-filename="/home/jancborchardt/owncloud/core/img/actions/play-big.png"
+   inkscape:export-xdpi="90"
+   inkscape:export-ydpi="90">
+  <defs
+     id="defs3877" />
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="17.921875"
+     inkscape:cx="-5.3403178"
+     inkscape:cy="10.148736"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer1"
+     showgrid="true"
+     inkscape:window-width="1280"
+     inkscape:window-height="776"
+     inkscape:window-x="0"
+     inkscape:window-y="24"
+     inkscape:window-maximized="1">
+    <inkscape:grid
+       type="xygrid"
+       id="grid3883"
+       empspacing="5"
+       visible="true"
+       enabled="true"
+       snapvisiblegridlinesonly="true" />
+  </sodipodi:namedview>
+  <metadata
+     id="metadata3880">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title></dc:title>
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(0,-1036.3622)">
+    <path
+       style="fill:#000000;fill-opacity:1;stroke:none"
+       d="M 3 3 L 3 13 L 7 13 L 7 3 L 3 3 z M 9 3 L 9 13 L 13 13 L 13 3 L 9 3 z "
+       transform="translate(0,1036.3622)"
+       id="path3086" />
+  </g>
+</svg>
diff --git a/core/img/actions/play-big.png b/core/img/actions/play-big.png
new file mode 100644
index 0000000000000000000000000000000000000000..3ccd36129ecb340989191d6dfa4410c821b3230a
Binary files /dev/null and b/core/img/actions/play-big.png differ
diff --git a/core/img/actions/play-big.svg b/core/img/actions/play-big.svg
new file mode 100644
index 0000000000000000000000000000000000000000..2ef67415323bd115ce2d60993e160bfc4ce059bf
--- /dev/null
+++ b/core/img/actions/play-big.svg
@@ -0,0 +1,73 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="16"
+   height="16"
+   id="svg3875"
+   version="1.1"
+   inkscape:version="0.48.1 r9760"
+   sodipodi:docname="play.svg"
+   inkscape:export-filename="/home/jancborchardt/owncloud/core/img/actions/play-add.png"
+   inkscape:export-xdpi="90"
+   inkscape:export-ydpi="90">
+  <defs
+     id="defs3877" />
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="17.921875"
+     inkscape:cx="-5.3403178"
+     inkscape:cy="10.148736"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer1"
+     showgrid="true"
+     inkscape:window-width="1280"
+     inkscape:window-height="776"
+     inkscape:window-x="0"
+     inkscape:window-y="24"
+     inkscape:window-maximized="1">
+    <inkscape:grid
+       type="xygrid"
+       id="grid3883"
+       empspacing="5"
+       visible="true"
+       enabled="true"
+       snapvisiblegridlinesonly="true" />
+  </sodipodi:namedview>
+  <metadata
+     id="metadata3880">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title></dc:title>
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(0,-1036.3622)">
+    <path
+       style="fill:#000000;fill-opacity:1;stroke:none"
+       d="m 0,1036.3622 16,8 -16,8 z"
+       id="path3086"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="cccc" />
+  </g>
+</svg>
diff --git a/core/img/actions/play-next.png b/core/img/actions/play-next.png
new file mode 100644
index 0000000000000000000000000000000000000000..0c0ccc87cdc433492e972be8bd14b6b6bcd6ee32
Binary files /dev/null and b/core/img/actions/play-next.png differ
diff --git a/core/img/actions/play-next.svg b/core/img/actions/play-next.svg
new file mode 100644
index 0000000000000000000000000000000000000000..9a41e4bd9d088db119c0e0930646f167361b37b1
--- /dev/null
+++ b/core/img/actions/play-next.svg
@@ -0,0 +1,79 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="16"
+   height="16"
+   id="svg3875"
+   version="1.1"
+   inkscape:version="0.48.1 r9760"
+   sodipodi:docname="play-big.svg"
+   inkscape:export-filename="/home/jancborchardt/owncloud/core/img/actions/play-big.png"
+   inkscape:export-xdpi="90"
+   inkscape:export-ydpi="90">
+  <defs
+     id="defs3877" />
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="17.921875"
+     inkscape:cx="-5.3403178"
+     inkscape:cy="10.148736"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer1"
+     showgrid="true"
+     inkscape:window-width="1280"
+     inkscape:window-height="776"
+     inkscape:window-x="0"
+     inkscape:window-y="24"
+     inkscape:window-maximized="1">
+    <inkscape:grid
+       type="xygrid"
+       id="grid3883"
+       empspacing="5"
+       visible="true"
+       enabled="true"
+       snapvisiblegridlinesonly="true" />
+  </sodipodi:namedview>
+  <metadata
+     id="metadata3880">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title></dc:title>
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(0,-1036.3622)">
+    <path
+       style="fill:#000000;fill-opacity:1;stroke:none"
+       d="m 7,1038.3622 7,6 -7,6 z"
+       id="path3086"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="cccc" />
+    <path
+       style="fill:#000000;fill-opacity:1;stroke:none"
+       d="m 2,1038.3622 7,6 -7,6 z"
+       id="path3086-5"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="cccc" />
+  </g>
+</svg>
diff --git a/core/img/actions/play-previous.png b/core/img/actions/play-previous.png
new file mode 100644
index 0000000000000000000000000000000000000000..d98cedaa1e8904d7ec6c393810746ba24c263e40
Binary files /dev/null and b/core/img/actions/play-previous.png differ
diff --git a/core/img/actions/play-previous.svg b/core/img/actions/play-previous.svg
new file mode 100644
index 0000000000000000000000000000000000000000..31d45dedb4df5cd0792f78416366810d2f2e1938
--- /dev/null
+++ b/core/img/actions/play-previous.svg
@@ -0,0 +1,79 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="16"
+   height="16"
+   id="svg3875"
+   version="1.1"
+   inkscape:version="0.48.1 r9760"
+   sodipodi:docname="next.svg"
+   inkscape:export-filename="/home/jancborchardt/owncloud/core/img/actions/play-next.png"
+   inkscape:export-xdpi="90"
+   inkscape:export-ydpi="90">
+  <defs
+     id="defs3877" />
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="17.921875"
+     inkscape:cx="-5.3403178"
+     inkscape:cy="10.148736"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer1"
+     showgrid="true"
+     inkscape:window-width="1280"
+     inkscape:window-height="776"
+     inkscape:window-x="0"
+     inkscape:window-y="24"
+     inkscape:window-maximized="1">
+    <inkscape:grid
+       type="xygrid"
+       id="grid3883"
+       empspacing="5"
+       visible="true"
+       enabled="true"
+       snapvisiblegridlinesonly="true" />
+  </sodipodi:namedview>
+  <metadata
+     id="metadata3880">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title></dc:title>
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(0,-1036.3622)">
+    <path
+       style="fill:#000000;fill-opacity:1;stroke:none"
+       d="m 9,1038.3622 -7,6 7,6 z"
+       id="path3086"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="cccc" />
+    <path
+       style="fill:#000000;fill-opacity:1;stroke:none"
+       d="m 14,1038.3622 -7,6 7,6 z"
+       id="path3086-5"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="cccc" />
+  </g>
+</svg>
diff --git a/core/img/actions/sound-off.png b/core/img/actions/sound-off.png
new file mode 100644
index 0000000000000000000000000000000000000000..7900e500c90f1650c2299aad837114e88c9ee71d
Binary files /dev/null and b/core/img/actions/sound-off.png differ
diff --git a/core/img/actions/sound-off.svg b/core/img/actions/sound-off.svg
new file mode 100644
index 0000000000000000000000000000000000000000..053291311faa708c2ba53dc8885d4e15ef9b7238
--- /dev/null
+++ b/core/img/actions/sound-off.svg
@@ -0,0 +1,73 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="16"
+   height="16"
+   id="svg3875"
+   version="1.1"
+   inkscape:version="0.48.1 r9760"
+   sodipodi:docname="sound.svg"
+   inkscape:export-filename="/home/jancborchardt/owncloud/core/img/actions/sound.png"
+   inkscape:export-xdpi="90"
+   inkscape:export-ydpi="90">
+  <defs
+     id="defs3877" />
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="3.1681698"
+     inkscape:cx="17.017228"
+     inkscape:cy="33.367762"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer1"
+     showgrid="true"
+     inkscape:window-width="1280"
+     inkscape:window-height="776"
+     inkscape:window-x="0"
+     inkscape:window-y="24"
+     inkscape:window-maximized="1">
+    <inkscape:grid
+       type="xygrid"
+       id="grid3883"
+       empspacing="5"
+       visible="true"
+       enabled="true"
+       snapvisiblegridlinesonly="true" />
+  </sodipodi:namedview>
+  <metadata
+     id="metadata3880">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title></dc:title>
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(0,-1036.3622)">
+    <path
+       style="fill:#000000;fill-opacity:1;stroke:none"
+       d="m 1,1042.3622 0,4 3,0 3,3 1,0 0,-10 -1,0 -3,3 z"
+       id="path3086"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="ccccccccc" />
+  </g>
+</svg>
diff --git a/core/img/actions/sound.png b/core/img/actions/sound.png
new file mode 100644
index 0000000000000000000000000000000000000000..838c9cee1719b158efdc40d2688f33ac0f28da19
Binary files /dev/null and b/core/img/actions/sound.png differ
diff --git a/core/img/actions/sound.svg b/core/img/actions/sound.svg
new file mode 100644
index 0000000000000000000000000000000000000000..6feea076a4448d68ef91feef5152168091fc8d28
--- /dev/null
+++ b/core/img/actions/sound.svg
@@ -0,0 +1,78 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="16"
+   height="16"
+   id="svg3875"
+   version="1.1"
+   inkscape:version="0.48.1 r9760"
+   sodipodi:docname="sound-off.svg"
+   inkscape:export-filename="/home/jancborchardt/owncloud/core/img/actions/pause.png"
+   inkscape:export-xdpi="90"
+   inkscape:export-ydpi="90">
+  <defs
+     id="defs3877" />
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="3.1681698"
+     inkscape:cx="17.017228"
+     inkscape:cy="33.367762"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer1"
+     showgrid="true"
+     inkscape:window-width="1280"
+     inkscape:window-height="776"
+     inkscape:window-x="0"
+     inkscape:window-y="24"
+     inkscape:window-maximized="1">
+    <inkscape:grid
+       type="xygrid"
+       id="grid3883"
+       empspacing="5"
+       visible="true"
+       enabled="true"
+       snapvisiblegridlinesonly="true" />
+  </sodipodi:namedview>
+  <metadata
+     id="metadata3880">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title></dc:title>
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(0,-1036.3622)">
+    <path
+       style="fill:#000000;fill-opacity:1;stroke:none"
+       d="m 1,1042.3622 0,4 3,0 3,3 1,0 0,-10 -1,0 -3,3 z"
+       id="path3086"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="ccccccccc" />
+    <path
+       style="fill:#000000;fill-opacity:1;stroke:none"
+       d="m 13.25,1039.3622 -0.78125,0.625 c 0.965189,1.1998 1.53125,2.7153 1.53125,4.375 0,1.6597 -0.566061,3.1752 -1.53125,4.375 l 0.78125,0.625 c 1.098257,-1.3697 1.75,-3.1078 1.75,-5 0,-1.8922 -0.651743,-3.6303 -1.75,-5 z m -1.5625,1.25 -0.8125,0.6563 c 0.687912,0.8565 1.125,1.9096 1.125,3.0937 0,1.1841 -0.437088,2.2372 -1.125,3.0938 l 0.8125,0.6562 c 0.823121,-1.0271 1.3125,-2.3314 1.3125,-3.75 0,-1.4186 -0.489379,-2.7229 -1.3125,-3.75 z m -1.5625,1.25 -0.78125,0.625 c 0.411273,0.5135 0.65625,1.1659 0.65625,1.875 0,0.7091 -0.244977,1.3615 -0.65625,1.875 l 0.78125,0.625 c 0.545316,-0.6836 0.875,-1.5576 0.875,-2.5 0,-0.9424 -0.329684,-1.8164 -0.875,-2.5 z"
+       id="path3105"
+       inkscape:connector-curvature="0" />
+  </g>
+</svg>
diff --git a/core/img/jquery-tipsy.gif b/core/img/jquery-tipsy.gif
new file mode 100644
index 0000000000000000000000000000000000000000..eb7718dfc168c3c63382c36c55e0fc3ab53974c1
Binary files /dev/null and b/core/img/jquery-tipsy.gif differ
diff --git a/core/js/jquery-showpassword.js b/core/js/jquery-showpassword.js
new file mode 100644
index 0000000000000000000000000000000000000000..0f4678327a3bc64a2d4dbdb1ee2213993e6ab9e2
--- /dev/null
+++ b/core/js/jquery-showpassword.js
@@ -0,0 +1,113 @@
+/*
+*	@name							Show Password
+*	@descripton						
+*	@version						1.3
+*	@requires						Jquery 1.5
+*
+*	@author							Jan Jarfalk
+*	@author-email					jan.jarfalk@unwrongest.com
+*	@author-website					http://www.unwrongest.com
+*
+*	@special-thanks					Michel Gratton
+*
+*	@licens							MIT License - http://www.opensource.org/licenses/mit-license.php
+*/
+(function($){
+     $.fn.extend({
+         showPassword: function(c) {	
+            
+            // Setup callback object
+			var callback 	= {'fn':null,'args':{}}
+				callback.fn = c;
+			
+			// Clones passwords and turn the clones into text inputs
+			var cloneElement = function( element ) {
+				
+				var $element = $(element);
+					
+				$clone = $("<input />");
+					
+				// Name added for JQuery Validation compatibility
+				// Element name is required to avoid script warning.
+				$clone.attr({
+					'type'		:	'text',
+					'class'		:	$element.attr('class'),
+					'style'		:	$element.attr('style'),
+					'size'		:	$element.attr('size'),
+					'name'		:	$element.attr('name')+'-clone',
+					'tabindex' 	:	$element.attr('tabindex')
+				});
+					
+				return $clone;
+			
+			};
+			
+			// Transfers values between two elements
+			var update = function(a,b){
+				b.val(a.val());
+			};
+			
+			// Shows a or b depending on checkbox
+			var setState = function( checkbox, a, b ){
+			
+				if(checkbox.is(':checked')){
+					update(a,b);
+					b.show();
+					a.hide();
+				} else {
+					update(b,a);
+					b.hide();
+					a.show();
+				}
+				
+			};
+            
+            return this.each(function() {
+            	
+            	var $input					= $(this),
+            		$checkbox 				= $($input.data('typetoggle'));
+            	
+            	// Create clone
+				var $clone = cloneElement($input);
+					$clone.insertAfter($input);
+				
+				// Set callback arguments
+            	if(callback.fn){	
+            		callback.args.input		= $input;
+            		callback.args.checkbox	= $checkbox;
+					callback.args.clone 	= $clone;
+            	}
+				
+
+				
+				$checkbox.bind('click', function() {
+					setState( $checkbox, $input, $clone );
+				});
+				
+				$input.bind('keyup', function() {
+					update( $input, $clone )
+				});
+				
+				$clone.bind('keyup', function(){ 
+					update( $clone, $input );
+					
+					// Added for JQuery Validation compatibility
+					// This will trigger validation if it's ON for keyup event
+					$input.trigger('keyup');
+					
+				});
+				
+				// Added for JQuery Validation compatibility
+				// This will trigger validation if it's ON for blur event
+				$clone.bind('blur', function() { $input.trigger('focusout'); });
+				
+				setState( $checkbox, $input, $clone );
+				
+				if( callback.fn ){
+					callback.fn( callback.args );
+				}
+
+            });
+        }
+    });
+})(jQuery);
diff --git a/core/js/jquery-tipsy.js b/core/js/jquery-tipsy.js
new file mode 100644
index 0000000000000000000000000000000000000000..58d834771ff16ba1f598887e89d311a665679245
--- /dev/null
+++ b/core/js/jquery-tipsy.js
@@ -0,0 +1,108 @@
+// tipsy - Facebook-style tooltip plugin for jQuery
+//	(c) 2008-2009 Jason Frame (jason@onehackoranother.com)
+//	Released under The MIT License.
+
+(function($) {
+    $.fn.tipsy = function(options) {
+
+        options = $.extend({}, $.fn.tipsy.defaults, options);
+        
+        return this.each(function() {
+            
+            var opts = $.fn.tipsy.elementOptions(this, options);
+            
+            $(this).hover(function() {
+
+                $.data(this, 'cancel.tipsy', true);
+
+                var tip = $.data(this, 'active.tipsy');
+                if (!tip) {
+                    tip = $('<div class="tipsy"><div class="tipsy-inner"/></div>');
+                    tip.css({position: 'absolute', zIndex: 100000});
+                    $.data(this, 'active.tipsy', tip);
+                }
+
+                if ($(this).attr('title') || typeof($(this).attr('original-title')) != 'string') {
+                    $(this).attr('original-title', $(this).attr('title') || '').removeAttr('title');
+                }
+
+                var title;
+                if (typeof opts.title == 'string') {
+                    title = $(this).attr(opts.title == 'title' ? 'original-title' : opts.title);
+                } else if (typeof opts.title == 'function') {
+                    title = opts.title.call(this);
+                }
+
+                tip.find('.tipsy-inner')[opts.html ? 'html' : 'text'](title || opts.fallback);
+
+                var pos = $.extend({}, $(this).offset(), {width: this.offsetWidth, height: this.offsetHeight});
+                tip.get(0).className = 'tipsy'; // reset classname in case of dynamic gravity
+                tip.remove().css({top: 0, left: 0, visibility: 'hidden', display: 'block'}).appendTo(document.body);
+                var actualWidth = tip[0].offsetWidth, actualHeight = tip[0].offsetHeight;
+                var gravity = (typeof opts.gravity == 'function') ? opts.gravity.call(this) : opts.gravity;
+
+                switch (gravity.charAt(0)) {
+                    case 'n':
+                        tip.css({top: pos.top + pos.height, left: pos.left + pos.width / 2 - actualWidth / 2}).addClass('tipsy-north');
+                        break;
+                    case 's':
+                        tip.css({top: pos.top - actualHeight, left: pos.left + pos.width / 2 - actualWidth / 2}).addClass('tipsy-south');
+                        break;
+                    case 'e':
+                        tip.css({top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left - actualWidth}).addClass('tipsy-east');
+                        break;
+                    case 'w':
+                        tip.css({top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left + pos.width}).addClass('tipsy-west');
+                        break;
+                }
+
+                if (opts.fade) {
+                    tip.css({opacity: 0, display: 'block', visibility: 'visible'}).animate({opacity: 0.8});
+                } else {
+                    tip.css({visibility: 'visible'});
+                }
+
+            }, function() {
+                $.data(this, 'cancel.tipsy', false);
+                var self = this;
+                setTimeout(function() {
+                    if ($.data(this, 'cancel.tipsy')) return;
+                    var tip = $.data(self, 'active.tipsy');
+                    if (opts.fade) {
+                        tip.stop().fadeOut(function() { $(this).remove(); });
+                    } else {
+                        tip.remove();
+                    }
+                }, 100);
+
+            });
+            
+        });
+        
+    };
+    
+    // Overwrite this method to provide options on a per-element basis.
+    // For example, you could store the gravity in a 'tipsy-gravity' attribute:
+    // return $.extend({}, options, {gravity: $(ele).attr('tipsy-gravity') || 'n' });
+    // (remember - do not modify 'options' in place!)
+    $.fn.tipsy.elementOptions = function(ele, options) {
+        return $.metadata ? $.extend({}, options, $(ele).metadata()) : options;
+    };
+    
+    $.fn.tipsy.defaults = {
+        fade: false,
+        fallback: '',
+        gravity: 'n',
+        html: false,
+        title: 'title'
+    };
+    
+    $.fn.tipsy.autoNS = function() {
+        return $(this).offset().top > ($(document).scrollTop() + $(window).height() / 2) ? 's' : 'n';
+    };
+    
+    $.fn.tipsy.autoWE = function() {
+        return $(this).offset().left > ($(document).scrollLeft() + $(window).width() / 2) ? 'e' : 'w';
+    };
+    
+})(jQuery);
diff --git a/core/js/js.js b/core/js/js.js
index 30cf01d0b228a64c17aed5d3a09efcbcfddde30e..677cd5fbb7f7d203c0b26813a30a9eb7d6667158 100644
--- a/core/js/js.js
+++ b/core/js/js.js
@@ -283,12 +283,25 @@ $(document).ready(function(){
 	});
 
 	if($('body').attr("id")=="body-user") { $('#settings #expanddiv').hide(); }
-	$('#settings #expand').click(function() {
+	$('#settings #expand').click(function(event) {
 		$('#settings #expanddiv').slideToggle();
+		event.stopPropagation();
 	});
+	$('#settings #expanddiv').click(function(event){
+		event.stopPropagation();
+	})
 	$('#settings #expand').hover(function(){
 		$('#settings #expand+span').fadeToggle();
-	})
+	});
+	$(window).click(function(){//hide the settings menu when clicking oustide it
+		if($('body').attr("id")=="body-user"){
+			$('#settings #expanddiv').slideUp();
+		}
+	});
+	
+	$('.file_action').tipsy({gravity:'s', live:true});
+	$('.selectedActions a').tipsy({gravity:'n', live:true});
+	$('.selectedActions a.delete').tipsy({gravity: 'ne', live:true});
 });
 
 if (!Array.prototype.map){
@@ -314,118 +327,3 @@ if (!Array.prototype.map){
 	    return res;
 	};
 }
-
-
-/*
-*	@name							Show Password
-*	@descripton						
-*	@version						1.3
-*	@requires						Jquery 1.5
-*
-*	@author							Jan Jarfalk
-*	@author-email					jan.jarfalk@unwrongest.com
-*	@author-website					http://www.unwrongest.com
-*
-*	@special-thanks					Michel Gratton
-*
-*	@licens							MIT License - http://www.opensource.org/licenses/mit-license.php
-*/
-(function($){
-     $.fn.extend({
-         showPassword: function(c) {	
-            
-            // Setup callback object
-			var callback 	= {'fn':null,'args':{}}
-				callback.fn = c;
-			
-			// Clones passwords and turn the clones into text inputs
-			var cloneElement = function( element ) {
-				
-				var $element = $(element);
-					
-				$clone = $("<input />");
-					
-				// Name added for JQuery Validation compatibility
-				// Element name is required to avoid script warning.
-				$clone.attr({
-					'type'		:	'text',
-					'class'		:	$element.attr('class'),
-					'style'		:	$element.attr('style'),
-					'size'		:	$element.attr('size'),
-					'name'		:	$element.attr('name')+'-clone',
-					'tabindex' 	:	$element.attr('tabindex')
-				});
-					
-				return $clone;
-			
-			};
-			
-			// Transfers values between two elements
-			var update = function(a,b){
-				b.val(a.val());
-			};
-			
-			// Shows a or b depending on checkbox
-			var setState = function( checkbox, a, b ){
-			
-				if(checkbox.is(':checked')){
-					update(a,b);
-					b.show();
-					a.hide();
-				} else {
-					update(b,a);
-					b.hide();
-					a.show();
-				}
-				
-			};
-            
-            return this.each(function() {
-            	
-            	var $input					= $(this),
-            		$checkbox 				= $($input.data('typetoggle'));
-            	
-            	// Create clone
-				var $clone = cloneElement($input);
-					$clone.insertAfter($input);
-				
-				// Set callback arguments
-            	if(callback.fn){	
-            		callback.args.input		= $input;
-            		callback.args.checkbox	= $checkbox;
-					callback.args.clone 	= $clone;
-            	}
-				
-
-				
-				$checkbox.bind('click', function() {
-					setState( $checkbox, $input, $clone );
-				});
-				
-				$input.bind('keyup', function() {
-					update( $input, $clone )
-				});
-				
-				$clone.bind('keyup', function(){ 
-					update( $clone, $input );
-					
-					// Added for JQuery Validation compatibility
-					// This will trigger validation if it's ON for keyup event
-					$input.trigger('keyup');
-					
-				});
-				
-				// Added for JQuery Validation compatibility
-				// This will trigger validation if it's ON for blur event
-				$clone.bind('blur', function() { $input.trigger('focusout'); });
-				
-				setState( $checkbox, $input, $clone );
-				
-				if( callback.fn ){
-					callback.fn( callback.args );
-				}
-
-            });
-        }
-    });
-})(jQuery);
diff --git a/core/js/listview.js b/core/js/listview.js
new file mode 100644
index 0000000000000000000000000000000000000000..e3e5ebdab8f9635d0310838ea25303e5adb95e9f
--- /dev/null
+++ b/core/js/listview.js
@@ -0,0 +1,71 @@
+function ListView(element){
+	this.element=element;
+}
+
+ListView.generateTable=function(collumns){
+	var html='<table>';
+	html+='<thead>';
+	$.each(collumns,function(index,collumn){
+		html+='<th>'+collumn+'</th>';
+	});
+	html+='<thead>';
+	html+='</head>';
+	html+='<tbody>';
+	html+'<tr class="template">'
+	$.each(collumns,function(index,collumn){
+		html+='<th class="'+collumn.toLower()+'"</th>';
+	});
+	html+'</tr>'
+	html+='</tbody>';
+	html='</table>';
+	return $(html);
+}
+
+ListView.prototype={
+	rows:{},
+	hoverElements:{},
+	addRow:function(id,data,extraData){
+		var tr=this.element.find('tr.template').clone();
+		tr.removeClass('template');
+		$.each(data,function(name,value){
+			tr.children('td.'+name).text(value);
+			tr.attr('data-'+name,value);
+		});
+		$.each(extraData,function(name,value){
+			tr.attr('data-'+name,value);
+		});
+		this.rows[id]=data;
+		tr.data('id',id);
+		this.element.children('tbody').append(tr);
+	},
+	removeRow:function(id){
+		this.rows[id].remove();
+		delete this.rows[id];
+	},
+	hoverHandeler:function(tr){
+		$.each(this.hoverElement,function(index,collumn){
+			$.each(collumn,function(index,element){
+				var html='<a href="#" title="'+element.title+'" class="hoverElement"/>';
+				var element=$(html);
+				element.append($('<img src="'+element.icon+'"/>'));
+				element.click(element.callback);
+				tr.children('td.'+collumn).append(element)
+			});
+		});
+		if(this.deleteCallback){
+			
+		}
+	},
+	hoverHandelerOut:function(tr){
+		tr.find('*.hoverElement').remove();
+	},
+	addHoverElement:function(collumn,icon,title,callback){
+		if(!this.hoverElements[collumn]){
+			this.hoverElements[collumn]=[];
+		}
+		this.hoverElements[row].push({icon:icon,callback:callback,title:title});
+	},
+	empty:function(){
+		this.element.children('tr:not(.template)').remove();
+	}
+}
\ No newline at end of file
diff --git a/files/css/files.css b/files/css/files.css
index e878cc01d0340d12f7b2bd6c093ed053ab8366ed..9fcc24a80af1da202f90369beac33dc1be91e364 100644
--- a/files/css/files.css
+++ b/files/css/files.css
@@ -11,7 +11,7 @@
 #fileSelector, #file_upload_submit, #file_newfolder_submit { display:none; }
 .file_upload_wrapper, #file_newfolder_name { background-repeat:no-repeat; background-position:.5em .3em; padding-left:2em; }
 .file_upload_wrapper { font-weight:bold; display:-moz-inline-box; /* fallback for older firefox versions*/ display:inline-block; padding-left:0; overflow:hidden; position:relative; margin-right:1.5em;}
-.file_upload_wrapper #file_upload_button_wrapper { position:absolute; top:0; left:0; width:100%; height:100%; cursor:pointer; z-index:1000; }
+.file_upload_wrapper .file_upload_button_wrapper { position:absolute; top:0; left:0; width:100%; height:100%; cursor:pointer; z-index:1000; }
 
 #file_newfolder_name { background-image:url('../../core/img/places/folder.svg'); font-weight:bold; width:8em; }
 .file_upload_start, .file_upload_filename { font-size:1em; }
@@ -26,9 +26,13 @@
 /* FILE TABLE */
 span#emptyfolder { position:absolute; margin:10em 0 0 10em; font-size:1.5em; font-weight:bold; color:#888; text-shadow:#fff 0 1px 0; }
 table { position:relative; top:37px; width:100%; }
-tbody tr:hover, tbody tr:active, tbody tr.selected { background-color:#eee; height:1em; }
+table tr { -webkit-transition:background-color 500ms; -moz-transition:background-color 500ms; -o-transition:background-color 500ms; transition:background-color 500ms; }
+tbody tr:hover, tbody tr:active, tbody tr.selected { background-color:#f8f8f8; height:1em; }
+tbody tr.selected { background-color:#eee; }
 tbody a { color:#000; }
 span.extention, td.date { color:#999; }
+span.extention { opacity:0; -webkit-transition:opacity 500ms; -moz-transition:opacity 500ms; -o-transition:opacity 500ms; transition:opacity 500ms; }
+tr:hover span.extention { opacity:1; }
 div.crumb { float:left; display:block; background:no-repeat right 0; padding:.75em 1.5em 0 1em; height:2.9em; }
 div.crumb:first-child { padding-left:1.5em; }
 div.crumb:last-child { font-weight:bold; }
@@ -38,22 +42,23 @@ table th .name { float:left; margin-left:.5em; }
 table th.multiselect { background:#ddd; color:#000; font-weight:bold; }
 table th, table td { border-bottom:1px solid #ddd; text-align:left; font-weight:normal; }
 table td { border-bottom:1px solid #eee; font-style:normal; background-position:1em .5em; background-repeat:no-repeat; }
-table th#headerSize, table td.filesize { width:5em; padding:0 1em; text-align:right; }
+table th#headerSize, table td.filesize { width:3em; padding:0 1em; text-align:right; }
 table th#headerDate, table td.date { width:11em; padding:0 .1em 0 1em; text-align:left; }
 table td.selection, table th.selection, table td.fileaction { width:2em; text-align:center; }
 table td.filename a.name { display:block; height:1.5em; vertical-align:middle; margin-left:3em; }
 table tr[data-type="dir"] td.filename a.name {font-weight:bold; }
-table td.filename a.name input, table td.filename a.name form { width:100%; cursor:text }
+table td.filename a.name input, table td.filename a.name form { width:100%; cursor:text; }
 table td.filename a, table td.login, table td.logout, table td.download, table td.upload, table td.create, table td.delete { padding:.2em .5em .5em 0; }
 table td.filename .nametext, .modified { float:left; padding:.3em 0; }
 table td.filename .nametext { width:60%; }
 table td.filename form { float:left; font-size:.85em; }
-table thead.fixed tr{position:fixed; top:6.3em; z-index:49;  -moz-box-shadow:0 -3px 7px #000; -webkit-box-shadow:0 -3px 7px #000; box-shadow:0 -3px 7px #000;}
-table thead.fixed {height:2em}
-#fileList tr td.filename>input[type=checkbox]:first-child { display:none; float:left; margin:.7em 0 0 1em; /* bigger clickable area doesn’t work in FF width:2.8em; height:2.4em;*/ }
-#fileList tr td.filename>input[type=checkbox]:checked:first-child, #fileList tr:hover td.filename>input[type=checkbox]:first-child { display:inline; }
-#fileList tr.selected td.filename , #fileList tr:hover td.filename { background-image:none !important }
-#select_all { float:left; margin:0.2em; margin-left:0.6em; }
+table thead.fixed tr{ position:fixed; top:6.3em; z-index:49; -moz-box-shadow:0 -3px 7px #000; -webkit-box-shadow:0 -3px 7px #000; box-shadow:0 -3px 7px #000; }
+table thead.fixed { height:2em; }
+#fileList tr  td.filename>input[type=checkbox]:first-child { opacity:0; float:left; margin:.7em 0 0 1em; /* bigger clickable area doesn’t work in FF width:2.8em; height:2.4em;*/ -webkit-transition:opacity 500ms; -moz-transition:opacity 500ms; -o-transition:opacity 500ms; transition:opacity 500ms; }
+#fileList tr td.filename>input[type="checkbox"]:checked:first-child, #fileList tr:hover td.filename>input[type="checkbox"]:first-child { opacity:1; }
+#fileList tr td.filename { -webkit-transition:background-image 500ms; -moz-transition:background-image 500ms; -o-transition:background-image 500ms; transition:background-image 500ms; }
+#fileList tr.selected td.filename, #fileList tr:hover td.filename { background-image:url('') !important; }
+#select_all { float:left; margin:.2em; margin-left:.6em; }
 #uploadsize-message,#delete-confirm { display:none; }
 .selectedActions a, a.file_action { float:right; display:inline; margin:0 .5em; padding:.3em .3em 0 .3em !important; }
 .selectedActions { display:none; }
diff --git a/files/js/fileactions.js b/files/js/fileactions.js
index 744ffd8cfedc43dccbe4ba0e07365f085aeeac02..2bc79abe723f7c20eed7d3ce5d5326ef3a6cee2f 100644
--- a/files/js/fileactions.js
+++ b/files/js/fileactions.js
@@ -53,6 +53,7 @@ FileActions={
 	},
 	display:function(parent){
 		FileActions.currentFile=parent;
+		$('.file_action').remove();
 		var actions=FileActions.get(FileActions.getCurrentMimeType(),FileActions.getCurrentType());
 		var file=FileActions.getCurrentFile();
 		if($('tr[data-file="'+file+'"]').data('renaming')){
@@ -100,10 +101,14 @@ FileActions={
 			});
 			parent.parent().children().last().append(element);
 		}
+		$('.file_action').hide();
+		$('.file_action').fadeIn(200);
 		return false;
 	},
 	hide:function(){
-		$('.file_action').remove();
+		$('.file_action').fadeOut(200,function(){
+			$(this).remove();
+		});
 	},
 	getCurrentFile:function(){
 		return FileActions.currentFile.parent().attr('data-file');
@@ -128,7 +133,7 @@ FileActions.register('all','Rename',OC.imagePath('core','actions/rename'),functi
 	FileList.rename(filename);
 });
 
-FileActions.setDefault('all','Download');
+//FileActions.setDefault('all','Download');
 
 FileActions.register('dir','Open','',function(filename){
 	window.location='index.php?dir='+$('#dir').val()+'/'+filename;
diff --git a/files/js/filelist.js b/files/js/filelist.js
index 50a995bf254969e2bb73362eac8d78b29f262d13..b89bc9b57b61fb9e4d1f99d4a11ebf96352fa6d2 100644
--- a/files/js/filelist.js
+++ b/files/js/filelist.js
@@ -3,7 +3,7 @@ FileList={
 		$('#fileList').empty().html(fileListHtml);
 	},
 	addFile:function(name,size,lastModified,loading){
-		var img=(loading)?OC.imagePath('core', 'loading.gif'):OC.imagePath('core', 'filetypes/file.png');
+		var img=(loading)?OC.imagePath('core', 'loading.gif'):OC.imagePath('core', 'filetypes/file');
 		var html='<tr data-file="'+name+'" data-type="file" data-size="'+size+'">';
 		if(name.indexOf('.')!=-1){
 			var basename=name.substr(0,name.indexOf('.'));
@@ -38,7 +38,7 @@ FileList={
 	},
 	addDir:function(name,size,lastModified){
 		var html='<tr data-file="'+name+'" data-type="dir" data-size="'+size+'">';
-		html+='<td class="filename" style="background-image:url(img/folder.png)"><input type="checkbox" /><a class="name" href="index.php?dir='+$('#dir').val()+'/'+name+'">'+name+'</a></td>';
+		html+='<td class="filename" style="background-image:url('+OC.imagePath('core', 'places/folder')+')"><input type="checkbox" /><a class="name" href="index.php?dir='+$('#dir').val()+'/'+name+'">'+name+'</a></td>';
 		if(size!='Pending'){
 			simpleSize=simpleFileSize(size);
 		}else{
diff --git a/files/js/files.js b/files/js/files.js
index 950f06a31a1b57ea2c52c070a0992170a989309a..8fdbd418462142ac48d9e4ef9f8dd6a4df5d2114 100644
--- a/files/js/files.js
+++ b/files/js/files.js
@@ -13,10 +13,14 @@ $(document).ready(function() {
 	$('#plugins>ul>li:first-child').droppable(crumbDropOptions);
 	
 	// Triggers invisible file input
-	$('#file_upload_button_wrapper').bind('click', function() {
-		$('#file_upload_start').trigger('click');
+	$('.file_upload_button_wrapper').live('click', function() {
+		$(this).parent().children('.file_upload_start').trigger('click');
 		return false;
 	});
+	
+	$('#file_upload_button_wrapper').tipsy({gravity:'e'}); 
+	$('td.filesize').tipsy({gravity:'se', live:true});
+	$('td .modified').tipsy({gravity:'s', live:true});
 
 	// Sets the file-action buttons behaviour :
 	$('tr').live('mouseenter',function(event) {
@@ -419,5 +423,5 @@ function getMimeIcon(mime){
 	if(knownMimes.indexOf(mime)==-1){
 		mime='file';
 	}
-	return OC.imagePath('core','mimetypes/'+mime+'.png');
+	return OC.imagePath('core','filetypes/'+mime);
 }
diff --git a/files/templates/index.php b/files/templates/index.php
index 008051492d0a63278ed1d6ead8a0db6fb5f6ba46..f5a212add48dbf493e2e9068b3f8adf8739a8f8c 100644
--- a/files/templates/index.php
+++ b/files/templates/index.php
@@ -6,10 +6,9 @@
 			<input type="hidden" class="max_human_file_size" value="(max <?php echo $_['uploadMaxHumanFilesize']; ?>)">
 			<input type="hidden" name="dir" value="<?php echo $_['dir'] ?>" id="dir">
 			<div class="file_upload_wrapper" class="svg">
-				<input type="submit" class="file_upload_filename" value="<?php echo $l->t('Upload');
-				 if($_['uploadMaxFilesize']<(10000000000)){echo ' (max. '.$_['uploadMaxHumanFilesize'].')';}?>"/>
-				<input id="file_upload_start" class="file_upload_start" type="file" name='files[]'/>
-				<a href="#" id="file_upload_button_wrapper" onclick="return false;"></a>
+				<input type="submit" class="file_upload_filename" value="<?php echo $l->t('Upload'); ?>"/>
+				<input class="file_upload_start" class="file_upload_start" type="file" name='files[]'/>
+				<a href="#" class="file_upload_button_wrapper" onclick="return false;" title="<?php echo  'max. '.$_['uploadMaxHumanFilesize'] ?>"></a>
 			</div>
 			<iframe name="file_upload_target_1" class='file_upload_target' src=""></iframe>
 		</form>
@@ -33,8 +32,8 @@
 					<a href="" title="Share" class="share"><img class='svg' alt="Share" src="../core/img/actions/share.svg" /></a>
 				</span>
 			</th>
-			<th id='headerSize'><?php echo $l->t( 'Size MB' ); ?></th>
-			<th id='headerDate'><span id="modified"><?php echo $l->t( 'Modified' ); ?></span><span class='selectedActions'><a href="" title="Delete" class="delete"><img class='svg' alt="<?php echo $l->t('Delete')?>" src="../core/img/actions/delete.svg" /></a></span></th>
+			<th id="headerSize"><?php echo $l->t( 'Size' ); ?></th>
+			<th id="headerDate"><span id="modified"><?php echo $l->t( 'Modified' ); ?></span><span class="selectedActions"><a href="" title="Delete" class="delete"><img class="svg" alt="<?php echo $l->t('Delete')?>" src="../core/img/actions/delete.svg" /></a></span></th>
 		</tr>
 	</thead>
 	<tbody id="fileList">
diff --git a/lib/base.php b/lib/base.php
index 2e73551434787cee377a9b8ee9d5078997e85177..dc3ed4129cdde48ec0b0fa4bfca587865de01a08 100644
--- a/lib/base.php
+++ b/lib/base.php
@@ -148,12 +148,15 @@ OC_Group::setBackend( OC_Config::getValue( "groupbackend", "database" ));
 // Add the stuff we need always
 OC_Util::addScript( "jquery-1.6.2.min" );
 OC_Util::addScript( "jquery-ui-1.8.14.custom.min" );
+OC_Util::addScript( "jquery-showpassword" );
+OC_Util::addScript( "jquery-tipsy" );
 OC_Util::addScript( "js" );
 OC_Util::addScript( "multiselect" );
 OC_Util::addScript('search','result');
-OC_Util::addStyle( "jquery-ui-1.8.14.custom" );
 OC_Util::addStyle( "styles" );
 OC_Util::addStyle( "multiselect" );
+OC_Util::addStyle( "jquery-ui-1.8.14.custom" );
+OC_Util::addStyle( "jquery-tipsy" );
 
 // Load Apps
 // This includes plugins for users and filesystems as well
diff --git a/lib/config.php b/lib/config.php
index 16e9ea441d5581776ae94e63819dd90be039681d..dafb37edd332131cfaf0c1be40ed83de916fdd30 100644
--- a/lib/config.php
+++ b/lib/config.php
@@ -177,8 +177,13 @@ class OC_Config{
 		$content .= ");\n?>\n";
 
 		// Write the file
-		file_put_contents( "$SERVERROOT/config/config.php", $content );
-
+		$result=@file_put_contents( "$SERVERROOT/config/config.php", $content );
+		if(!$result) {
+			$tmpl = new OC_Template( '', 'error', 'guest' );
+			$tmpl->assign('errors',array(1=>array('error'=>"Can't write into config directory 'config'",'hint'=>"You can usually fix this by setting the owner of 'config' to the user that the web server uses (".exec('whoami').")")));
+			$tmpl->printPage();
+			exit;
+		}
 		return true;
 	}
 }
diff --git a/lib/crypt.php b/lib/crypt.php
index 83e6ac4cde0cf04adc2e195d1801a3375d61e4cb..de1f6c733875870a62c841422405a3ec12470889 100755
--- a/lib/crypt.php
+++ b/lib/crypt.php
@@ -61,7 +61,7 @@ class OC_Crypt {
 
 			// Write the file
 		        $username=OC_USER::getUser();
-			file_put_contents(OC_Config::getValue( "datadirectory").'/'.$username.'/encryption.key', $enckey );
+			@file_put_contents(OC_Config::getValue( "datadirectory").'/'.$username.'/encryption.key', $enckey );
 		}
 	}
 
diff --git a/lib/files.php b/lib/files.php
index eec1007de1f0fe96cb1790a825f4bc705d61dd12..bdcae419189facf380258e3eae026d9df5bb5327 100644
--- a/lib/files.php
+++ b/lib/files.php
@@ -121,7 +121,7 @@ class OC_Files {
 			$filename=$dir.'/'.$files;
 		}
 		if($zip or OC_Filesystem::is_readable($filename)){
-			header('Content-Disposition: attachment; filename='.basename($filename));
+			header('Content-Disposition: attachment; filename="'.basename($filename).'"');
 			header('Content-Transfer-Encoding: binary');
 			header('Expires: 0');
 			header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
diff --git a/settings/ajax/changepassword.php b/settings/ajax/changepassword.php
index 750edf176960284d8ac05a3d833252ec7961a107..b9b2417ad9a99ca8b3758c0c13e25ff6e876e558 100644
--- a/settings/ajax/changepassword.php
+++ b/settings/ajax/changepassword.php
@@ -6,33 +6,32 @@ require_once('../../lib/base.php');
 $l=new OC_L10N('settings');
 
 // We send json data
-header( "Content-Type: application/jsonrequest" );
+header("Content-Type: application/jsonrequest");
 
 // Check if we are a user
-if( !OC_User::isLoggedIn()){
-	echo json_encode( array( "status" => "error", "data" => array( "message" => $l->t( "Authentication error" ) )));
+if(!OC_User::isLoggedIn()){
+	echo json_encode(array("status" => "error", "data" => array("message" => $l->t("Authentication error"))));
 	exit();
 }
 
 // Get data
-if( !isset( $_POST["password"] ) && !isset( $_POST["oldpassword"] )){
-	echo json_encode( array( "status" => "error", "data" => array( "message" => $l->t( "You have to enter the old and the new password!" ) )));
+if(!isset($_POST["password"]) && !isset($_POST["oldpassword"])){
+	echo json_encode(array("status" => "error", "data" => array("message" => $l->t("You have to enter the old and the new password!"))));
 	exit();
 }
 
 // Check if the old password is correct
-if( !OC_User::checkPassword( $_SESSION["user_id"], $_POST["oldpassword"] )){
-	echo json_encode( array( "status" => "error", "data" => array( "message" => $l->t("Your old password is wrong!") )));
+if(!OC_User::checkPassword($_SESSION["user_id"], $_POST["oldpassword"])){
+	echo json_encode(array("status" => "error", "data" => array("message" => $l->t("Your old password is wrong!"))));
 	exit();
 }
 
 // Change password
-if( OC_User::setPassword( $_SESSION["user_id"], $_POST["password"] )){
-	echo json_encode( array( "status" => "success", "data" => array( "message" => $l->t("Password changed") )));
-	OC_Crypt::changekeypasscode( $_POST["password"]) {
-}
-else{
-	echo json_encode( array( "status" => "error", "data" => array( "message" => $l->t("Unable to change password") )));
+if(OC_User::setPassword($_SESSION["user_id"], $_POST["password"])){
+	echo json_encode(array("status" => "success", "data" => array("message" => $l->t("Password changed"))));
+	OC_Crypt::changekeypasscode($_POST["password"]);
+}else{
+	echo json_encode(array("status" => "error", "data" => array("message" => $l->t("Unable to change password"))));
 }
 
 ?>