diff --git a/interface/lib/classes/validate_password.inc.php b/interface/lib/classes/validate_password.inc.php
index 543a90eef371ffa69b2dc1ee4edc466d5f55f002..998c37c4ec40f18dca4ee1161a897c8cd5c18176 100644
--- a/interface/lib/classes/validate_password.inc.php
+++ b/interface/lib/classes/validate_password.inc.php
@@ -38,19 +38,27 @@ class validate_password {
 			return 1;
 		}
 
+		$different = 0;
+		if (preg_match('/[abcdefghijklnmopqrstuvwxyz]/', $password)) {
+			$different += 1;
+		}
+
 		if (preg_match('/[ABCDEFGHIJKLNMOPQRSTUVWXYZ]/', $password)) {
 			$points += 1;
+			$different += 1;
 		}
 
 		if (preg_match('/[0123456789]/', $password)) {
 			$points += 1;
+			$different += 1;
 		}
 
 		if (preg_match('/[`~!@#$%^&*()_+|\\=-[]}{\';:\/?.>,<" ]/', $password)) {
 			$points += 1;
+			$different += 1;
 		}
 
-		if ($points == 0) {
+		if ($points == 0 || $different < 3) {
 			if ($length >= 5 && $length <= 6) {
 				return 1;
 			} else if ($length >= 7 && $length <= 8) {
diff --git a/interface/web/js/scrigo.js.php b/interface/web/js/scrigo.js.php
index 8b502672eeec8afdaf2d3d2f0be25837d3bbdfae..4e51cd56ae2fac159cc0bd59c37a92d04f69fbac 100644
--- a/interface/web/js/scrigo.js.php
+++ b/interface/web/js/scrigo.js.php
@@ -579,6 +579,8 @@ pass_message['text'] = "<?php echo $wb['password_strength_5_txt']?>";
 pass_message['color'] = "green";
 pass_messages[5] = pass_message;
 
+var special_chars = "`~!@#$%^&*()_+|\=-[]}{';:/?.>,<\" ";
+
 function pass_check(password) {
 	var length = password.length;
 	var points = 0;
@@ -591,20 +593,29 @@ function pass_check(password) {
 		pass_result(1);
 		return;
 	}
-
+	
+	var different = 0;
+	
+	if (pass_contains(password, "abcdefghijklnmopqrstuvwxyz")) {
+		different += 1;
+	}
+	
 	if (pass_contains(password, "ABCDEFGHIJKLNMOPQRSTUVWXYZ")) {
 		points += 1;
+		different += 1;
 	}
 
 	if (pass_contains(password, "0123456789")) {
 		points += 1;
+		different += 1;
 	}
 
-	if (pass_contains(password, "`~!@#$%^&*()_+|\=-[]}{';:/?.>,<\" ")) {
+	if (pass_contains(password, special_chars)) {
 		points += 1;
+		different += 1;
 	}
 
-	if (points == 0) {
+	if (points == 0 || different < 3) {
 		if (length >= 5 && length <=6) {
 			pass_result(1);
 		} else if (length >= 7 && length <=8) {
@@ -742,27 +753,45 @@ function getInternetExplorerVersion() {
     return rv;
 }
 
-function password(minLength, special){
-	var iteration = 0;
-	var password = "";
-	var randomNumber;
+function password(minLength, special, num_special){
 	minLength = minLength || 10;
+	if(minLength < 8) minLength = 8;
 	var maxLength = minLength + 5;
 	var length = getRandomInt(minLength, maxLength);
-	if(special == undefined){
-		var special = false;
+	
+	var alphachars = "abcdefghijklmnopqrstuvwxyz";
+	var upperchars = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
+    var numchars = "1234567890";
+    var specialchars = "!@#_";
+	
+	if(num_special == undefined) num_special = 0;
+	if(special != undefined && special == true) {
+		num_special = Math.floor(Math.random() * (length / 4)) + 1;
 	}
-	while(iteration < length){
-		randomNumber = (Math.floor((Math.random() * 100)) % 94) + 33;
-		if(!special){
-			if ((randomNumber >=33) && (randomNumber <=47)) { continue; }
-			if ((randomNumber >=58) && (randomNumber <=64)) { continue; }
-			if ((randomNumber >=91) && (randomNumber <=96)) { continue; }
-			if ((randomNumber >=123) && (randomNumber <=126)) { continue; }
-		}
-		iteration++;
-		password += String.fromCharCode(randomNumber);
+	var numericlen = getRandomInt(1, 2);
+	var alphalen = length - num_special - numericlen;
+	var upperlen = Math.floor(alphalen / 2);
+	alphalen = alphalen - upperlen;
+	var password = "";
+	
+	for(i = 0; i < alphalen; i++) {
+		password += alphachars.charAt(Math.floor(Math.random() * alphachars.length));
+	}
+	
+	for(i = 0; i < upperlen; i++) {
+		password += upperchars.charAt(Math.floor(Math.random() * upperchars.length));
+	}
+	
+	for(i = 0; i < num_special; i++) {
+		password += specialchars.charAt(Math.floor(Math.random() * specialchars.length));
+	}
+	
+	for(i = 0; i < numericlen; i++) {
+		password += numchars.charAt(Math.floor(Math.random() * numchars.length));
 	}
+	
+	password = password.split('').sort(function() { return 0.5 - Math.random(); }).join('');
+	
 	return password;
 }
 
@@ -778,7 +807,7 @@ function generatePassword(passwordFieldID, repeatPasswordFieldID){
 	var newPWField = oldPWField.clone();
 	newPWField.attr('type', 'text').attr('id', 'tmp'+passwordFieldID).insertBefore(oldPWField);
 	oldPWField.remove();
-	var pword = password(<?php echo $min_password_length ?>, false);
+	var pword = password(<?php echo $min_password_length; ?>, false, 1);
 	jQuery('#'+repeatPasswordFieldID).val(pword);
 	newPWField.attr('id', passwordFieldID).val(pword).trigger('keyup');
 }