diff --git a/core/css/styles.css b/core/css/styles.css
index d9722fa317465dff1c02f5aad9c663da73c5283a..a3326c0082611a2027ec376746637a73d17189e6 100644
--- a/core/css/styles.css
+++ b/core/css/styles.css
@@ -68,7 +68,7 @@ input[type="submit"].highlight{ background:#ffc100; border:1px solid #db0; text-
 #login form fieldset { background:0; border:0; margin-bottom:2em; padding:0; }
 #login form fieldset legend { font-weight:bold; }
 #login form label { position:absolute; margin:.8em .8em; font-size:1.5em; color:#666; }
-#login form label#directorylabel { display:block; margin:.95em 0 .8em -5.5em; }
+#login #dbhostlabel, #login #dbtableprefixlabel, #login #directorylabel { display:block; margin:.95em 0 .8em -7em; }
 #login form input[type="checkbox"]+label { position:relative; margin:0; font-size:1em; text-shadow:#fff 0 1px 0; }
 #login form ul.errors { background:#fed7d7; border:1px solid #f00; list-style-indent:inside; margin:0 0 4em 0; padding:1em 1em 1em 5em; }
 
diff --git a/core/templates/installation.php b/core/templates/installation.php
index ebd726b4fb9d6ceec979a011dfdc48c2564384d7..c3cd2968c859db01fea0587413264bf20a1605ba 100644
--- a/core/templates/installation.php
+++ b/core/templates/installation.php
@@ -74,8 +74,8 @@
 	<a id='showAdvanced'><strong><?php echo $l->t( 'Advanced' ); ?> ▾</strong></a>
 
 	<fieldset id='datadirField'>
-		<input type="text" name="dbhost" id="dbhost" value="<?php print OC_Helper::init_var('dbhost', 'localhost'); ?>" placeholder="<?php echo $l->t( 'Host' ); ?>" />
-		<input type="text" name="dbtableprefix" id="dbtableprefix" value="<?php print OC_Helper::init_var('dbtableprefix', 'oc_'); ?>" placeholder="<?php echo $l->t( 'Table prefix' ); ?>" />
+		<label id="dbhostlabel" for="dbhost"><?php echo $l->t( 'Database host' ); ?></label><input type="text" name="dbhost" id="dbhost" value="<?php print OC_Helper::init_var('dbhost', 'localhost'); ?>" placeholder="<?php echo $l->t( 'Database host' ); ?>" />
+		<label id="dbtableprefixlabel" for="dbtableprefix"><?php echo $l->t( 'Table prefix' ); ?></label><input type="text" name="dbtableprefix" id="dbtableprefix" value="<?php print OC_Helper::init_var('dbtableprefix', 'oc_'); ?>" placeholder="<?php echo $l->t( 'Table prefix' ); ?>" />
 
 		<label id="directorylabel" for="directory"><?php echo $l->t( 'Data folder' ); ?></label><input type="text" name="directory" id="directory" value="<?php print OC_Helper::init_var('directory', $_['directory']); ?>" placeholder="<?php echo $l->t( 'Data folder' ); ?>" />
 	</fieldset>
diff --git a/core/templates/login.php b/core/templates/login.php
index 85db3bc9a529111af07abe18834e868956851e2e..717f6bcabdaf8cb7b42ffc8e1fe3b5668e0bdc1b 100644
--- a/core/templates/login.php
+++ b/core/templates/login.php
@@ -1,17 +1,17 @@
 <form action="index.php" method="post">
 	<fieldset>
 		<?php if($_['error']): ?>
-			<?php echo $l->t( 'Login failed!' ); ?>
+			<a href="index.php?lostpassword"><?php echo $l->t('Lost your password?'); ?></a>
+		<?php endif; ?>
+		<?php if(empty($_["username"])): ?>
+			<input type="text" name="user" id="user" placeholder="Username" value="" autocomplete="off" required autofocus />
+			<input type="password" name="password" id="password" placeholder="Password" value="" required />
+			<input type="checkbox" name="remember_login" id="remember_login" /><label for="remember_login"><?php echo $l->t('remember'); ?></label>
+		<?php else: ?>
+		      <input type="text" name="user" id="user" placeholder="Username" value="<?php echo $_['username']; ?>" autocomplete="off" required >
+		      <input type="password" name="password" id="password" placeholder="Password" value="" required autofocus />
+		      <input type="checkbox" name="remember_login" id="remember_login" checked /><label for="remember_login"><?php echo $l->t('remember'); ?></label>
 		<?php endif; ?>
-		<?php if(empty($_["username"])){?>
-		<input type="text" name="user" id="user" placeholder="Username" value="" autocomplete="off" required autofocus />
-		<input type="password" name="password" id="password" placeholder="Password" value="" required />
-		<input type="checkbox" name="remember_login" id="remember_login" /><label for="remember_login"><?php echo $l->t('remember'); ?></label>
-		<?php }else{ ?>
-		<input type="text" name="user" id="user" placeholder="Username" value="<?php echo $_['username']; ?>" autocomplete="off" required >
-		<input type="password" name="password" id="password" placeholder="Password" value="" required autofocus />
-		<input type="checkbox" name="remember_login" id="remember_login" checked /><label for="remember_login"><?php echo $l->t('remember'); ?></label>
-		<?php } ?>
 		<input type="submit" id="submit" value="Log in" />
 	</fieldset>
 </form>
diff --git a/core/templates/lostpassword.php b/core/templates/lostpassword.php
new file mode 100644
index 0000000000000000000000000000000000000000..67e34164d0815543821e8acf2ec69f02901b27e2
--- /dev/null
+++ b/core/templates/lostpassword.php
@@ -0,0 +1,14 @@
+<form action="index.php?lostpassword" method="post">
+	<fieldset>
+		<?php echo $l->t('You will receive a link to reset your password via Email.'); ?>
+		<?php if ($_['requested']): ?>
+			<?php echo $l->t('Requested'); ?>
+		<?php else: ?>
+			<?php if ($_['error']): ?>
+				<?php echo $l->t('Login failed!'); ?>
+			<?php endif; ?>
+			<input type="text" name="user" id="user" placeholder="<?php echo $l->t('Username or Email'); ?>" value="" autocomplete="off" required autofocus />
+			<input type="submit" id="submit" value="<?php echo $l->t('Request reset'); ?>" />
+		<?php endif; ?>
+	</fieldset>
+</form>
\ No newline at end of file
diff --git a/core/templates/resetpassword.php b/core/templates/resetpassword.php
new file mode 100644
index 0000000000000000000000000000000000000000..47d0e69b7d3c5421e64da5af126c6f1e58fe8107
--- /dev/null
+++ b/core/templates/resetpassword.php
@@ -0,0 +1,10 @@
+<form action="<?php echo "index.php?".$_SERVER['QUERY_STRING']; ?>" method="post">
+	<fieldset>
+		<?php if($_['success']): ?>
+			<?php echo $l->t('Your password was successfully reset'); ?>
+		<?php else: ?>
+			<input type="password" name="password" id="password" placeholder="<?php echo $l->t('New password'); ?>" value="" required />
+			<input type="submit" id="submit" value="<?php echo $l->t('Reset password'); ?>" />
+		<?php endif; ?>
+	</fieldset>
+</form>
\ No newline at end of file
diff --git a/files/index.php b/files/index.php
index 059546391b6287a40682a2ca831c9160d9ad1435..3d62c3385faf60c64ea8e20dde8be3f82cd41544 100644
--- a/files/index.php
+++ b/files/index.php
@@ -47,8 +47,14 @@ $files = array();
 foreach( OC_Files::getdirectorycontent( $dir ) as $i ){
 	$i["date"] = OC_Util::formatDate($i["mtime"] );
 	if($i['type']=='file'){
-		$i['extention']=substr($i['name'],strrpos($i['name'],'.'));
-		$i['basename']=substr($i['name'],0,strrpos($i['name'],'.'));
+		$fileinfo=pathinfo($i['name']);
+		$i['basename']=$fileinfo['filename'];
+		if (!empty($fileinfo['extension'])) {
+			$i['extention']='.' . $fileinfo['extension'];
+		}
+		else {
+			$i['extention']='';
+		}
 	}
 	if($i['directory']=='/'){
 		$i['directory']='';
diff --git a/index.php b/index.php
index 4520f40107e4eb4bb6302294f1361425ce866db6..52a00465f225623c0b1fd8665dd2ccb6990e225f 100644
--- a/index.php
+++ b/index.php
@@ -60,7 +60,7 @@ elseif(OC_User::isLoggedIn()) {
 }
 
 // Someone wants to log in :
-elseif(isset($_POST["user"])) {
+elseif(isset($_POST["user"]) && isset($_POST['password'])) {
 	OC_App::loadApps();
 	if(OC_User::login($_POST["user"], $_POST["password"])) {
 		header("Location: ".$WEBROOT.'/'.OC_Appconfig::getValue("core", "defaultpage", "files/index.php"));
@@ -81,6 +81,38 @@ elseif(isset($_POST["user"])) {
 	}
 }
 
+// Someone lost their password:
+elseif(isset($_GET['lostpassword'])) {
+	OC_App::loadApps();
+	if (isset($_POST['user'])) {
+		if (OC_User::userExists($_POST['user'])) {
+			$token = sha1($_POST['user']+uniqId());
+			OC_Preferences::setValue($_POST['user'], "owncloud", "lostpassword", $token);
+			// TODO send email with link+token
+			OC_Template::printGuestPage("", "lostpassword", array("error" => false, "requested" => true));
+		} else {
+			OC_Template::printGuestPage("", "lostpassword", array("error" => true, "requested" => false));
+		}
+	} else {
+		OC_Template::printGuestPage("", "lostpassword", array("error" => false, "requested" => false));
+	}
+}
+
+// Someone wants to reset their password:
+elseif(isset($_GET['resetpassword']) && isset($_GET['token']) && isset($_GET['user']) && OC_Preferences::getValue($_GET['user'], "owncloud", "lostpassword") === $_GET['token']) {
+	OC_App::loadApps();
+	if (isset($_POST['password'])) {
+		if (OC_User::setPassword($_GET['user'], $_POST['password'])) {
+			OC_Preferences::deleteKey($_GET['user'], "owncloud", "lostpassword");
+			OC_Template::printGuestPage("", "resetpassword", array("success" => true));
+		} else {
+			OC_Template::printGuestPage("", "resetpassword", array("success" => false));
+		}
+	} else {
+		OC_Template::printGuestPage("", "resetpassword", array("success" => false));
+	}
+}
+
 // For all others cases, we display the guest page :
 else {
 	OC_App::loadApps();
diff --git a/lib/files.php b/lib/files.php
index dd74b0867058f0438449cff23ca599a83a7a57f7..f1789d9c7ace0f9012a6b9c30ba77fd76b7b6a05 100644
--- a/lib/files.php
+++ b/lib/files.php
@@ -143,7 +143,7 @@ class OC_Files {
 			header("HTTP/1.0 403 Forbidden");
 			die('403 Forbidden');
 		}
-		ob_end_clean();
+		@ob_end_clean();
 		if($zip){
 			readfile($filename);
 			unlink($filename);