diff --git a/src/main/java/org/olat/repository/_i18n/LocalStrings_de.properties b/src/main/java/org/olat/repository/_i18n/LocalStrings_de.properties
index 201a66dbf3310db643adbc1245c746f3b7750d7b..ced60bd9b6321436b007d8c91c475c4db3876470 100644
--- a/src/main/java/org/olat/repository/_i18n/LocalStrings_de.properties
+++ b/src/main/java/org/olat/repository/_i18n/LocalStrings_de.properties
@@ -219,6 +219,7 @@ details.delete.acknowledge=Best\u00E4tigung
 details.delete.acknowledge.error=Bitte best\u00E4tigen.
 details.delete.acknowledge.msg=Alle Dateien werden definitiv gel\u00F6scht und k\u00F6nnen nicht mehr wiederhergestellt werden.
 details.delete.alt={0} l\u00F6schen
+details.delete.soft.acknowledge.msg=Die Lernressource wird als gel\u00F6scht markiert.
 details.delete.soft.desc=Mit dieser Funktion wird die Lernressource als gel\u00F6scht markiert.
 details.delete.soft.desc.1=Die Benutzerdaten werden aus dem Kurs entfernt.
 details.delete.soft.desc.2=Nur noch der Kursbesitzer hat Zugriff auf den Kurs.
diff --git a/src/main/java/org/olat/repository/_i18n/LocalStrings_en.properties b/src/main/java/org/olat/repository/_i18n/LocalStrings_en.properties
index 35cafd4371d8638bd38325f0abc3fb51a20588f2..9cbc82dc5c55f3b53af72b1cca8cb81fe451c8fd 100644
--- a/src/main/java/org/olat/repository/_i18n/LocalStrings_en.properties
+++ b/src/main/java/org/olat/repository/_i18n/LocalStrings_en.properties
@@ -223,6 +223,7 @@ details.delete.managed=managed
 details.delete.notOrphan=still referenced
 details.delete.notOwner=not owner
 details.delete.references=Do you wish to delete the referenced learning resources too?
+details.delete.soft.acknowledge.msg=The learning resource will be marked as deleted.
 details.delete.soft.auto.desc=<strong>The course will be automatically deleted at {0}.</strong>
 details.delete.soft.desc=Using this method the learning resource will be marked as deleted.
 details.delete.soft.desc.1=The user data will be removed from the course.
diff --git a/src/main/java/org/olat/repository/_i18n/LocalStrings_fr.properties b/src/main/java/org/olat/repository/_i18n/LocalStrings_fr.properties
index 88d5f31e7de1ba9e7ca6cf9fcd7a20e653603e01..1fea6fd1aadd2e7cc3acbf88a8c5c64bb4b2b917 100644
--- a/src/main/java/org/olat/repository/_i18n/LocalStrings_fr.properties
+++ b/src/main/java/org/olat/repository/_i18n/LocalStrings_fr.properties
@@ -223,6 +223,7 @@ details.delete.managed=managed
 details.delete.notOrphan=encore r\u00E9f\u00E9renc\u00E9
 details.delete.notOwner=pas propri\u00E9taire
 details.delete.references=Voulez-vous effacer les objects didactiques r\u00E9f\u00E9renc\u00E9s par cette resource?
+details.delete.soft.acknowledge.msg=La ressource didactique sera marqu\u00E9e comme effac\u00E9e.
 details.delete.soft.auto.desc=<strong>Le cours sera automatiquement effac\u00E9 le {0}.</strong>
 details.delete.soft.desc=Avec cette fonction, la ressource didactique sera marqu\u00E9e comme effac\u00E9e.
 details.delete.soft.desc.1=Les donn\u00E9es utilisateurs du cours seront effac\u00E9es.
diff --git a/src/main/java/org/olat/repository/ui/author/ConfirmDeleteSoftlyController.java b/src/main/java/org/olat/repository/ui/author/ConfirmDeleteSoftlyController.java
index 8b685ada8189cc9091759c941470e0bc611120ef..5a521134753374c681f3f062075fbf04100cadd2 100644
--- a/src/main/java/org/olat/repository/ui/author/ConfirmDeleteSoftlyController.java
+++ b/src/main/java/org/olat/repository/ui/author/ConfirmDeleteSoftlyController.java
@@ -104,7 +104,7 @@ public class ConfirmDeleteSoftlyController extends FormBasicController {
 			}
 			uifactory.addStaticTextElement("rows", "details.delete.entries", message.toString(), layoutCont);
 
-			String[] acknowledge = new String[] { translate("details.delete.acknowledge.msg") };
+			String[] acknowledge = new String[] { translate("details.delete.soft.acknowledge.msg") };
 			acknowledgeEl = uifactory.addCheckboxesHorizontal("confirm", "details.delete.acknowledge", layoutCont, new String[]{ "" },  acknowledge);
 			
 			FormLayoutContainer buttonsCont = FormLayoutContainer.createButtonLayout("buttons", getTranslator());
diff --git a/src/main/java/org/olat/user/ChangePasswordForm.java b/src/main/java/org/olat/user/ChangePasswordForm.java
index ae5e91417a45f961d566a3080d05bb5cadfcb638..9383ce8ebdf72809ff1c1ebf41fda2d5a017e2f1 100644
--- a/src/main/java/org/olat/user/ChangePasswordForm.java
+++ b/src/main/java/org/olat/user/ChangePasswordForm.java
@@ -33,6 +33,7 @@ import org.olat.core.gui.components.form.flexible.impl.FormLayoutContainer;
 import org.olat.core.gui.control.Controller;
 import org.olat.core.gui.control.Event;
 import org.olat.core.gui.control.WindowControl;
+import org.springframework.beans.factory.annotation.Autowired;
 
 
 /**
@@ -52,6 +53,9 @@ public class ChangePasswordForm extends FormBasicController {
 	
 	private String _oldpass = "";
 	private String _newpass = "";
+	
+	@Autowired
+	private UserManager userManager;
 
 	/**
 	 * @param name
@@ -95,17 +99,23 @@ public class ChangePasswordForm extends FormBasicController {
 	
 	@Override
 	protected boolean validateFormLogic (UserRequest ureq) {
-		if (!UserManager.getInstance().syntaxCheckOlatPassword(newpass1.getValue())) {
+		boolean allOk = true;
+		newpass1.clearError();
+		newpass2.clearError();
+		
+		if (!userManager.syntaxCheckOlatPassword(newpass1.getValue())) {
 			newpass1.setErrorKey("form.checkPassword", null);
-			return false;
+			allOk &= false;
 		}
+		
 		if (!newpass1.getValue().equals(newpass2.getValue())) {
 			newpass1.setValue("");
 			newpass2.setValue("");
 			newpass2.setErrorKey("error.password.nomatch", null);
-			return false;
+			allOk &= false;
 		}
-		return true;
+		
+		return allOk & super.validateFormLogic(ureq);
 	}
 
 	@Override
diff --git a/src/test/java/org/olat/user/UserNameAndPasswordSyntaxCheckerWithRegexpTest.java b/src/test/java/org/olat/user/UserNameAndPasswordSyntaxCheckerWithRegexpTest.java
index c39d3d9230c1070af7f6d0b4c651c4c847ed2d6c..eb6ba5527b085090702c8f11fcdf04431a7477da 100644
--- a/src/test/java/org/olat/user/UserNameAndPasswordSyntaxCheckerWithRegexpTest.java
+++ b/src/test/java/org/olat/user/UserNameAndPasswordSyntaxCheckerWithRegexpTest.java
@@ -30,9 +30,11 @@ import org.junit.Test;
  */
 public class UserNameAndPasswordSyntaxCheckerWithRegexpTest {
 	
+	/**
+	 * Min. 7 characters, one uppercase, one lowercase, one number
+	 */
 	@Test
-	public void testCustom() {
-		//Min. 7 characters, one uppercase, one lowercase, one number
+	public void testCustomPasswordCheck_upperLowerCase_number() {
 		UserNameAndPasswordSyntaxCheckerWithRegexp checker = new UserNameAndPasswordSyntaxCheckerWithRegexp();
 		checker.setPasswordRegExp("(?=^.{7,}$)((?=.*\\d)|(?=.*\\W+))(?![.\\n])(?=.*[A-Z])(?=.*[a-z]).*$");
 		
@@ -41,4 +43,21 @@ public class UserNameAndPasswordSyntaxCheckerWithRegexpTest {
 		Assert.assertFalse(checker.syntaxCheckOlatPassword("Kanu#1"));//less than 7 characters
 		Assert.assertFalse(checker.syntaxCheckOlatPassword("Kanuunch"));//no number
 	}
+	
+	/**
+	 * Min. 8 characters, one uppercase, one lowercase, one number, one special character
+	 */
+	@Test
+	public void testCustomPasswordCheck_upperLowerCase_number_special() {
+		UserNameAndPasswordSyntaxCheckerWithRegexp checker = new UserNameAndPasswordSyntaxCheckerWithRegexp();
+		checker.setPasswordRegExp("(?=^.{8,}$)((?=.*\\d)|(?=.*\\W+))(?![.\\n])(?=.*[A-Z])(?=.*[a-z])(?=.*[$@$!%*#?&]).*$");
+
+		Assert.assertTrue(checker.syntaxCheckOlatPassword("Kanu#010"));
+		Assert.assertTrue(checker.syntaxCheckOlatPassword("?Ryomou#010"));
+		
+		Assert.assertFalse(checker.syntaxCheckOlatPassword("Kanuunc1"));
+		Assert.assertFalse(checker.syntaxCheckOlatPassword("Kanu#10"));//less than 8 characters
+		Assert.assertFalse(checker.syntaxCheckOlatPassword("Kanuunch"));//no number
+		Assert.assertFalse(checker.syntaxCheckOlatPassword("kanu8#10"));
+	}
 }