diff --git a/app/controllers/admission/rule.php b/app/controllers/admission/rule.php
index bc5a88a96ec49aa18db51bc1081a2ab5334a8a90..205e1a02d706b69fd65415a1f9ca6ebe9e341334 100644
--- a/app/controllers/admission/rule.php
+++ b/app/controllers/admission/rule.php
@@ -116,12 +116,12 @@ class Admission_RuleController extends AuthenticatedController
      * configure a rule of the given type.
      *
      * @param String $ruleType Class name of the rule to check.
+     * @param String $ruleId   ID of the rule to save, or empty if this is a new rule.
      */
-    public function validate_action($ruleType)
+    public function validate_action($ruleType, $ruleId = '')
     {
         $rules = AdmissionRule::getAvailableAdmissionRules();
-        $rule = new $ruleType();
+        $rule = new $ruleType($ruleId);
         $this->errors = $rule->validate(Request::getInstance());
     }
-
 }
diff --git a/app/views/admission/rule/configure.php b/app/views/admission/rule/configure.php
index 17914dab90fc174a9178d3f30f81e3b8c7f4f0d1..028b45508dd04d0e2ff2e7f6423ae5b09d13ab25 100644
--- a/app/views/admission/rule/configure.php
+++ b/app/views/admission/rule/configure.php
@@ -4,7 +4,13 @@ use Studip\Button, Studip\LinkButton;
 <div id="errormessage"></div>
 <form action="<?= $controller->url_for('admission/rule/save', get_class($rule), $rule->getId()) ?>"
       id="ruleform" class="default"
-      onsubmit="return STUDIP.Admission.checkAndSaveRule('<?= $rule->getId() ?>', 'errormessage', '<?= $controller->url_for('admission/rule/validate', get_class($rule)) ?>', 'rules', '<?= $controller->url_for('admission/rule/save', get_class($rule), $rule->getId()) ?>')">
+      onsubmit="return STUDIP.Admission.checkAndSaveRule(
+          '<?= $rule->getId() ?>',
+              'errormessage',
+              '<?= $controller->url_for('admission/rule/validate', get_class($rule), $rule->getId()) ?>',
+              'rules',
+              '<?= $controller->url_for('admission/rule/save', get_class($rule), $rule->getId()) ?>'
+          )">
     <?= $ruleTemplate ?>
     <footer data-dialog-button>
         <input type="hidden" id="action" name="action" value="">
diff --git a/lib/admissionrules/passwordadmission/PasswordAdmission.class.php b/lib/admissionrules/passwordadmission/PasswordAdmission.class.php
index c0aa97070a75716db31b8e45a7d0eaa3a082829d..6a99066faf9c981fc843de61b6435ef7a863cae1 100644
--- a/lib/admissionrules/passwordadmission/PasswordAdmission.class.php
+++ b/lib/admissionrules/passwordadmission/PasswordAdmission.class.php
@@ -19,20 +19,20 @@ require_once 'vendor/phpass/PasswordHash.php';
 
 class PasswordAdmission extends AdmissionRule
 {
-
     // --- ATTRIBUTES ---
     /*
      * Password hasher (phpass library)
      */
-    var $hasher = null;
+    public $hasher = null;
 
     /*
      * Crypted password.
      */
-    var $password = '';
+    public $password = '';
 
     // --- OPERATIONS ---
 
+    public $new = false;
     /**
      * Standard constructor.
      *
@@ -48,6 +48,7 @@ class PasswordAdmission extends AdmissionRule
             $this->load();
         } else {
             $this->id = $this->generateId('passwordadmissions');
+            $this->new = true;
         }
     }
 
@@ -173,7 +174,9 @@ class PasswordAdmission extends AdmissionRule
      */
     public function setAllData($data) {
         parent::setAllData($data);
-        $this->setPassword($data['password1']);
+        if ($this->new || $data['password1'] !== '') {
+            $this->setPassword($data['password1']);
+        }
         return $this;
     }
 
@@ -227,10 +230,10 @@ class PasswordAdmission extends AdmissionRule
     public function validate($data)
     {
         $errors = parent::validate($data);
-        if (!$data['password1']) {
+        if ($data['password1'] === '' && $this->new) {
             $errors[] = _('Das Passwort darf nicht leer sein.');
         }
-        if ($data['password1'] != $data['password2']) {
+        if ($data['password1'] !== $data['password2']) {
             $errors[] = _('Das Passwort stimmt nicht mit der Wiederholung überein.');
         }
         return $errors;
diff --git a/lib/admissionrules/passwordadmission/templates/configure.php b/lib/admissionrules/passwordadmission/templates/configure.php
index e9ccac1618f95b6f53b05ce2ebaf830733c6c04c..4642dec280566acfc86fa70e4d7a9a68b83e75c2 100644
--- a/lib/admissionrules/passwordadmission/templates/configure.php
+++ b/lib/admissionrules/passwordadmission/templates/configure.php
@@ -5,10 +5,11 @@
 </label>
 <label>
     <?= _('Zugangspasswort') ?>:
-    <input type="password" name="password1" size="25" max="40" value="<?= htmlReady($rule->getPassword()) ?>" required>
+    <input type="password" name="password1" size="25" max="40"
+       value="<?= htmlReady(Request::get('password1')) ?>" <?= $rule->new ? 'required' : ''?>>
 </label>
-<br/>
 <label>
     <?= _('Passwort wiederholen') ?>:
-    <input type="password" name="password2" size="25" max="40" value="<?= htmlReady($rule->getPassword()) ?>" required>
+    <input type="password" name="password2" size="25" max="40"
+           value="<?= htmlReady(Request::get('password2')) ?>" <?= $rule->new ? 'required' : ''?>>
 </label>