diff --git a/apps/files_external/templates/settings.php b/apps/files_external/templates/settings.php
index 072f856dfbdeea7b4eee731f060737960e34292e..79950f30385e09ef413676d28f385597b3cda076 100644
--- a/apps/files_external/templates/settings.php
+++ b/apps/files_external/templates/settings.php
@@ -76,7 +76,7 @@
 								<?php endif; ?>
 							<?php endif; ?>
 						<?php endforeach; ?>
-						<?php if (isset($_['backends'][$mount['class']]['custom']) && !in_array('files_external/js/'.$_['backends'][$mount['class']]['custom'], \OC_Util::$scripts)): ?>
+						<?php if (isset($_['backends'][$mount['class']]['custom'])): ?>
 							<?php OCP\Util::addScript('files_external', $_['backends'][$mount['class']]['custom']); ?>
 						<?php endif; ?>
 					<?php endif; ?>
diff --git a/core/js/installation.js b/core/js/installation.js
new file mode 100644
index 0000000000000000000000000000000000000000..20ff346215f68a40278ca91912d5821ebe756883
--- /dev/null
+++ b/core/js/installation.js
@@ -0,0 +1,5 @@
+
+$(document).ready(function() {
+	$('#adminpass').showPassword().keyup();
+	$('#dbpass').showPassword().keyup();
+});
diff --git a/core/js/js.js b/core/js/js.js
index f01c0eb77c12ca129655edb04967a9292cb05deb..57ce1ab695565f8aa8533b695fbfc7b101cdc4ee 100644
--- a/core/js/js.js
+++ b/core/js/js.js
@@ -1081,35 +1081,6 @@ function initCore() {
 		}
 	});
 
-	var setShowPassword = function(input, label) {
-		input.showPassword().keyup();
-	};
-	setShowPassword($('#adminpass'), $('label[for=show]'));
-	setShowPassword($('#pass2'), $('label[for=personal-show]'));
-	setShowPassword($('#dbpass'), $('label[for=dbpassword]'));
-
-	var checkShowCredentials = function() {
-		var empty = false;
-		$('input#user, input#password').each(function() {
-			if ($(this).val() === '') {
-				empty = true;
-			}
-		});
-		if(empty) {
-			$('#submit').fadeOut();
-			$('#remember_login').hide();
-			$('#remember_login+label').fadeOut();
-		} else {
-			$('#submit').fadeIn();
-			$('#remember_login').show();
-			$('#remember_login+label').fadeIn();
-		}
-	};
-	// hide log in button etc. when form fields not filled
-	// commented out due to some browsers having issues with it
-	// checkShowCredentials();
-	// $('input#user, input#password').keyup(checkShowCredentials);
-
 	// user menu
 	$('#settings #expand').keydown(function(event) {
 		if (event.which === 13 || event.which === 32) {
diff --git a/core/templates/installation.php b/core/templates/installation.php
index 9ef63dbfe8c88bb03127652416bd5966f71cee65..0b3b0d46c5c7a764c285b2f181e04bef9fe7eabf 100644
--- a/core/templates/installation.php
+++ b/core/templates/installation.php
@@ -1,3 +1,9 @@
+<?php
+script('core', [
+	'jquery-showpassword',
+	'installation'
+]);
+?>
 <input type='hidden' id='hasMySQL' value='<?php p($_['hasMySQL']) ?>'>
 <input type='hidden' id='hasSQLite' value='<?php p($_['hasSQLite']) ?>'>
 <input type='hidden' id='hasPostgreSQL' value='<?php p($_['hasPostgreSQL']) ?>'>
diff --git a/core/templates/login.php b/core/templates/login.php
index 86a1b605df5133fd6d9362ff3359bb202036d46a..2198f063dbcc6820e3916d2fa9ec6a76e0796b92 100644
--- a/core/templates/login.php
+++ b/core/templates/login.php
@@ -1,5 +1,11 @@
 <?php /** @var $l OC_L10N */ ?>
-<?php vendor_script('jsTimezoneDetect/jstz') ?>
+<?php
+vendor_script('jsTimezoneDetect/jstz');
+script('core', [
+	'visitortimezone',
+	'lostpassword'
+]);
+?>
 
 <!--[if IE 8]><style>input[type="checkbox"]{padding:0;}</style><![endif]-->
 <form method="post" name="login">
@@ -65,8 +71,5 @@
 		</ul>
 	</fieldset>
 </form>
-<?php } ?>
+<?php }
 
-<?php
-OCP\Util::addscript('core', 'visitortimezone');
-OCP\Util::addScript('core', 'lostpassword');
diff --git a/lib/base.php b/lib/base.php
index ae87ecff3947da3e24ae94fdfab3cb9aa2725751..009732ead7bd24a3e13168be26c887383af8f5c9 100644
--- a/lib/base.php
+++ b/lib/base.php
@@ -336,7 +336,6 @@ class OC {
 
 	public static function initTemplateEngine() {
 		// Add the stuff we need always
-
 		// following logic will import all vendor libraries that are
 		// specified in core/js/core.json
 		$fileContent = file_get_contents(OC::$SERVERROOT . '/core/js/core.json');
@@ -351,7 +350,6 @@ class OC {
 			throw new \Exception('Cannot read core/js/core.json');
 		}
 
-		OC_Util::addScript("jquery-showpassword");
 		OC_Util::addScript("placeholders");
 		OC_Util::addScript("jquery-tipsy");
 		OC_Util::addScript("compatibility");
diff --git a/lib/private/util.php b/lib/private/util.php
index 6ccb9dba0870cd08e9c0f95a6af6f3bca27e24fb..b97c0684629283a324857945f9e6ab24d247b98d 100644
--- a/lib/private/util.php
+++ b/lib/private/util.php
@@ -333,9 +333,9 @@ class OC_Util {
 	/**
 	 * generates a path for JS/CSS files. If no application is provided it will create the path for core.
 	 *
-	 * @param $application application to get the files from
-	 * @param $directory directory withing this application (css, js, vendor, etc)
-	 * @param $file the file inside of the above folder
+	 * @param string $application application to get the files from
+	 * @param string $directory directory withing this application (css, js, vendor, etc)
+	 * @param string $file the file inside of the above folder
 	 * @return string the path
 	 */
 	private static function generatePath($application, $directory, $file) {
@@ -358,7 +358,10 @@ class OC_Util {
 	 * @return void
 	 */
 	public static function addScript($application, $file = null) {
-		self::$scripts[] = OC_Util::generatePath($application, 'js', $file);
+		$path = OC_Util::generatePath($application, 'js', $file);
+		if (!in_array($path, self::$scripts)) {
+			self::$scripts[] = $path;
+		}
 	}
 
 	/**
@@ -369,7 +372,10 @@ class OC_Util {
 	 * @return void
 	 */
 	public static function addVendorScript($application, $file = null) {
-		self::$scripts[] = OC_Util::generatePath($application, 'vendor', $file);
+		$path = OC_Util::generatePath($application, 'vendor', $file);
+		if (!in_array($path, self::$scripts)) {
+			self::$scripts[] = $path;
+		}
 	}
 
 	/**
@@ -384,9 +390,12 @@ class OC_Util {
 			$languageCode = $l->getLanguageCode($application);
 		}
 		if (!empty($application)) {
-			self::$scripts[] = "$application/l10n/$languageCode";
+			$path = "$application/l10n/$languageCode";
 		} else {
-			self::$scripts[] = "l10n/$languageCode";
+			$path = "l10n/$languageCode";
+		}
+		if (!in_array($path, self::$scripts)) {
+			self::$scripts[] = $path;
 		}
 	}
 
@@ -398,7 +407,10 @@ class OC_Util {
 	 * @return void
 	 */
 	public static function addStyle($application, $file = null) {
-		self::$styles[] = OC_Util::generatePath($application, 'css', $file);
+		$path = OC_Util::generatePath($application, 'css', $file);
+		if (!in_array($path, self::$styles)) {
+			self::$styles[] = $path;
+		}
 	}
 
 	/**
@@ -409,7 +421,10 @@ class OC_Util {
 	 * @return void
 	 */
 	public static function addVendorStyle($application, $file = null) {
-		self::$styles[] = OC_Util::generatePath($application, 'vendor', $file);
+		$path = OC_Util::generatePath($application, 'vendor', $file);
+		if (!in_array($path, self::$styles)) {
+			self::$styles[] = $path;
+		}
 	}
 
 	/**
@@ -1344,4 +1359,5 @@ class OC_Util {
 	public static function isPhpCharSetUtf8() {
 		return ini_get('default_charset') === 'UTF-8';
 	}
+
 }
diff --git a/settings/js/personal.js b/settings/js/personal.js
index b2efa7c37f94ba1140033d96eb7f731cba79e6b0..ac29f69037e963ce086273b7cc65b7310626fce0 100644
--- a/settings/js/personal.js
+++ b/settings/js/personal.js
@@ -157,6 +157,7 @@ function avatarResponseHandler (data) {
 }
 
 $(document).ready(function () {
+	$('#pass2').showPassword().keyup();
 	$("#passwordbutton").click(function () {
 		if ($('#pass1').val() !== '' && $('#pass2').val() !== '') {
 			// Serialize the data
diff --git a/settings/templates/personal.php b/settings/templates/personal.php
index cc04de5ec38c44fbbea419a09cb526a52a9c9b36..913c5803f6d2c61891189a9bb391f29ab37303dc 100644
--- a/settings/templates/personal.php
+++ b/settings/templates/personal.php
@@ -63,6 +63,7 @@
 
 <?php
 if($_['passwordChangeSupported']) {
+	script('jquery-showpassword');
 ?>
 <form id="passwordform" class="section">
 	<h2><?php p($l->t('Password'));?></h2>