diff --git a/apps/media/ajax/api.php b/apps/media/ajax/api.php
index bf1ebd8e4d1dac497e0cf47b767d2b4ca41d23fb..60458167a9676f2ef384dc003e8bda6f46e1055a 100644
--- a/apps/media/ajax/api.php
+++ b/apps/media/ajax/api.php
@@ -53,6 +53,7 @@ if(!isset($arguments['search'])){
 	$arguments['search']='';
 }
 OC_MEDIA_COLLECTION::$uid=OC_User::getUser();
+unset($_SESSION['collection']);
 if($arguments['action']){
 	switch($arguments['action']){
 		case 'delete':
@@ -108,16 +109,18 @@ if($arguments['action']){
 			echo json_encode(OC_MEDIA_COLLECTION::getSongs($arguments['artist'],$arguments['album'],$arguments['search']));
 			break;
 		case 'get_path_info':
-			$songId=OC_MEDIA_COLLECTION::getSongByPath($arguments['path']);
-			if($songId==0){
-				unset($_SESSION['collection']);
-				$songId= OC_MEDIA_SCANNER::scanFile($arguments['path']);
-			}
-			if($songId>0){
-				$song=OC_MEDIA_COLLECTION::getSong($songId);
-				$song['artist']=OC_MEDIA_COLLECTION::getArtistName($song['song_artist']);
-				$song['album']=OC_MEDIA_COLLECTION::getAlbumName($song['song_album']);
-				echo json_encode($song);
+			if(OC_Filesystem::file_exists($arguments['path'])){
+				$songId=OC_MEDIA_COLLECTION::getSongByPath($arguments['path']);
+				if($songId==0){
+					unset($_SESSION['collection']);
+					$songId= OC_MEDIA_SCANNER::scanFile($arguments['path']);
+				}
+				if($songId>0){
+					$song=OC_MEDIA_COLLECTION::getSong($songId);
+					$song['artist']=OC_MEDIA_COLLECTION::getArtistName($song['song_artist']);
+					$song['album']=OC_MEDIA_COLLECTION::getAlbumName($song['song_album']);
+					echo json_encode($song);
+				}
 			}
 			break;
 		case 'play':
@@ -137,7 +140,30 @@ if($arguments['action']){
 			
 			OC_Filesystem::readfile($arguments['path']);
 			exit;
+		case 'find_music':
+			echo json_encode(findMusic());
+			exit;
+	}
+}
+
+function findMusic($path='/'){
+	$music=array();
+	$dh=OC_Filesystem::opendir($path);
+	if($dh){
+		while($filename=readdir($dh)){
+			if($filename[0]!='.'){
+				$file=$path.'/'.$filename;
+				if(OC_Filesystem::is_dir($file)){
+					$music=array_merge($music,findMusic($file));
+				}else{
+					if(OC_MEDIA_SCANNER::isMusic($filename)){
+						$music[]=$file;
+					}
+				}
+			}
+		}
 	}
+	return $music;
 }
 
 ?>
\ No newline at end of file
diff --git a/apps/media/index.php b/apps/media/index.php
index 43423d27de6592ffa31ba2aace5e6dbbe2941b94..a7128aaad42910cdfe4e063fd2c6a6a8a5c47aee 100644
--- a/apps/media/index.php
+++ b/apps/media/index.php
@@ -37,6 +37,7 @@ OC_Util::addScript('media','player');
 OC_Util::addScript('media','music');
 OC_Util::addScript('media','playlist');
 OC_Util::addScript('media','collection');
+OC_Util::addScript('media','scanner');
 OC_Util::addScript('media','jquery.jplayer.min');
 OC_Util::addStyle('media','player');
 OC_Util::addStyle('media','music');
diff --git a/apps/media/js/collection.js b/apps/media/js/collection.js
index 95e5293ea48305631f7ec257bd528ca45d2d75af..42d249112b12fc3ff035185d5e94f29f3a2a5a2e 100644
--- a/apps/media/js/collection.js
+++ b/apps/media/js/collection.js
@@ -32,6 +32,10 @@ Collection={
 					for(var i=0;i<Collection.loadedListeners.length;i++){
 						Collection.loadedListeners[i]();
 					}
+					if(collection.length==0){
+						$('#scan input.start').val('Scan');
+						$('#plugins a[href="#collection"]').trigger('click');
+					}
 					
 				}
 			});
@@ -159,6 +163,35 @@ Collection={
 				}
 			}
 		}
+	},
+	addSong:function(song){
+		var artist=false
+		var album=false;
+		for(var i=0;i<Collection.artists.length;i++){
+			if(Collection.artists[i].artist_id==song.song_artist){
+				artist=Collection.artists[i];
+				for(var j=0;j<artist.albums.length;j++){
+					if(artist.albums[j].album_id==song.song_album){
+						album=artist.albums[j];
+						break;
+					}
+				}
+				break;
+			}
+		}
+		if(!artist){
+			artist={artist_id:song.song_artist,artist_name:song.artist,albums:[]};
+			Collection.artists.push(artist);
+			if(!Collection.parent || Collection.parent.is(":visible")){
+				Collection.display();
+			}
+			
+		}
+		if(!album){
+			album={album_id:song.song_album,album_name:song.album,album_artist:song.song_artist,songs:[]};
+			artist.albums.push(album)
+		}
+		album.songs.push(song)
 	}
 }
 
@@ -173,4 +206,13 @@ $(document).ready(function(){
 		$(this).parent().toggleClass('active');
 		Collection.showSongs($(this).parent());
 	});
+	Collection.parent.hide();
+	$('#scan input.start').click(function(){
+		$('#scan input.start').hide();
+		$('#scan input.stop').show();
+		$('#scan input.stop').click(function(){
+			Scanner.toggle();
+		});
+		Scanner.scanCollection();
+	});
 });
diff --git a/apps/media/js/scanner.js b/apps/media/js/scanner.js
new file mode 100644
index 0000000000000000000000000000000000000000..e3867580bdbc30ef9bde9c0ee76b41a6224e38cb
--- /dev/null
+++ b/apps/media/js/scanner.js
@@ -0,0 +1,72 @@
+Scanner={
+	songsFound:0,
+	songsScanned:0,
+	startTime:null,
+	endTime:null,
+	stopScanning:false,
+	currentIndex:-1,
+	songs:[],
+	findSongs:function(ready){
+		$.getJSON(OC.linkTo('media','ajax/api.php')+'?action=find_music',function(songs){
+			Scanner.songsFound=songs.length;
+			Scanner.currentIndex=-1
+			if(ready){
+				ready(songs)
+			}
+		});
+	},
+	scanFile:function(path,ready){
+		path=encodeURIComponent(path);
+		$.getJSON(OC.linkTo('media','ajax/api.php')+'?action=get_path_info&path='+path,function(song){
+			if(ready){
+				ready(song);
+			}
+			if(song){//do this after the ready call so we dont hold up the next ajax call
+				var artistId=song.song_artist;
+				Scanner.songsScanned++;
+				$('#scan span.songCount').text(Scanner.songsScanned);
+				var progress=(Scanner.songsScanned/Scanner.songsFound)*100;
+				$('#scanprogressbar').progressbar('value',progress)
+				Collection.addSong(song);
+			}
+		});
+	},
+	scanCollection:function(ready){
+		$('#scanprogressbar').progressbar({
+			value:0,
+		});
+		Scanner.startTime=new Date().getTime()/1000;
+		Scanner.findSongs(function(songs){
+			Scanner.songs=songs;
+			Scanner.start();
+		});
+	},
+	stop:function(){
+		Scanner.stopScanning=true;
+	},
+	start:function(ready){
+		Scanner.stopScanning=false;
+		var scanSong=function(){
+			Scanner.currentIndex++;
+			if(!Scanner.stopScanning && Scanner.currentIndex<Scanner.songs.length){
+				Scanner.scanFile(Scanner.songs[Scanner.currentIndex],scanSong)
+			}else{
+				Scanner.endTime=new Date().getTime()/1000;
+				if(ready){
+					ready();
+				}
+			}
+		}
+		scanSong();
+	},
+	toggle:function(){
+		if(Scanner.stopScanning){
+			Scanner.start();
+			$('#scan input.stop').val('Pause');
+		}else{
+			Scanner.stop();
+			$('#scan input.stop').val('Resume');
+		}
+	}
+
+}
diff --git a/apps/media/lib_scanner.php b/apps/media/lib_scanner.php
index ab38d76294b094c97566614c2967f3b1430f664c..c774c3c9fdb69ff45d1205266d0cec0904424b68 100644
--- a/apps/media/lib_scanner.php
+++ b/apps/media/lib_scanner.php
@@ -88,8 +88,7 @@ class OC_MEDIA_SCANNER{
 				return; //invalid mp3 file
 			}
 		}else{
-			$mimetype=OC_Filesystem::getMimeType($path);
-			if(substr($mimetype,0,4)!=='audio'){
+			if(!self::isMusic($path)){
 				return;
 			}
 			if(!self::$getID3){
@@ -141,4 +140,14 @@ class OC_MEDIA_SCANNER{
 		$songId=OC_MEDIA_COLLECTION::addSong($title,$path,$artistId,$albumId,$length,$track,$size);
 		return (!($title=='unkown' && $artist=='unkown' && $album=='unkown'))?$songId:0;
 	}
+
+	/**
+	 * quick check if a song is a music file by checking the extention, not as good as a proper mimetype check but way faster
+	 * @param string $filename
+	 * @return bool
+	 */
+	public static function isMusic($filename){
+		$ext=substr($filename,strrpos($filename,'.')+1);
+		return $ext=='mp3' || $ext=='flac' || $ext=='m4a' || $ext=='ogg' || $ext=='oga';
+	}
 }
\ No newline at end of file
diff --git a/apps/media/templates/collection.php b/apps/media/templates/collection.php
index e2c256a6480346e95e6ad8bb12072cde288d1ec2..fe50bf5ebdf332263957451eac424a5d86879e25 100644
--- a/apps/media/templates/collection.php
+++ b/apps/media/templates/collection.php
@@ -1,3 +1,9 @@
+<div id='scan'>
+	<p><span class='songCount'>0</span> Songs scanned</p>
+	<div id="scanprogressbar"></div>
+	<input type='button' class='start' value='Recan'></input>
+	<input type='button' class='stop' style='display:none' value='Pause'></input>
+</div>
 <ul id='collection'>
 	<li class='artist'>
 		<img src="<?php echo image_path('files','loading.gif') ?>" alt='loading'/>Loading Collection...
@@ -7,4 +13,5 @@
 		<button class='add'>Add</button>
 		<button class='play'>Play</button>
 	</li>
-</ul>
\ No newline at end of file
+</ul>
+