diff --git a/plugins/personal/roles/class_userRoles.inc b/plugins/personal/roles/class_userRoles.inc
index 215edd74870a07d6077d454d88fdf60618b5ae09..95be4ba933063e18c98faf218c05598e5c5632cd 100644
--- a/plugins/personal/roles/class_userRoles.inc
+++ b/plugins/personal/roles/class_userRoles.inc
@@ -174,15 +174,21 @@ class userRoles extends simplePlugin
     } elseif (($this->dn != '') && ($this->dn != 'new')) {
       /* Remove all groups */
       foreach ($this->savedGroupsMembership as $ogroupdn) {
-        $g = objects::open($ogroupdn, 'ogroup');
-        $g->getBaseObject()->attributesAccess['member']->searchAndRemove($this->dn);
-        $g->save();
+        try {
+          $g = objects::open($ogroupdn, 'ogroup');
+          $g->getBaseObject()->attributesAccess['member']->searchAndRemove($this->dn);
+          $g->save();
+        } catch (NonExistingLdapNodeException $e) {
+        }
       }
       /* Remove all roles */
       foreach ($this->savedRolesMembership as $roledn) {
-        $r = objects::open($roledn, 'role');
-        $r->getBaseObject()->attributesAccess['roleOccupant']->searchAndRemove($this->dn);
-        $r->save();
+        try {
+          $r = objects::open($roledn, 'role');
+          $r->getBaseObject()->attributesAccess['roleOccupant']->searchAndRemove($this->dn);
+          $r->save();
+        } catch (NonExistingLdapNodeException $e) {
+        }
       }
     }
     return array();
@@ -248,17 +254,21 @@ class userRoles extends simplePlugin
       $groupsMembership = $this->attributesAccess['groupsMembership']->getValue();
       foreach ($groupsMembership as $ogroupdn) {
         if (!in_array($ogroupdn, $this->savedGroupsMembership)) {
-          $g = objects::open($ogroupdn, 'ogroup');
-          if (!in_array($ogroupdn, $this->templateGroups) && !$g->getBaseObject()->attrIsWriteable('member')) {
-            $errors[] = msgPool::permModify($ogroupdn, 'member');
-            continue;
-          }
-          $g->getBaseObject()->attributesAccess['member']->addValue($this->dn, $fake_attrs);
-          $msg = $g->save();
-          if (empty($msg)) {
-            $this->savedGroupsMembership[] = $ogroupdn;
-          } else {
-            $errors = array_merge($errors, $msg);
+          try {
+            $g = objects::open($ogroupdn, 'ogroup');
+            if (!in_array($ogroupdn, $this->templateGroups) && !$g->getBaseObject()->attrIsWriteable('member')) {
+              $errors[] = msgPool::permModify($ogroupdn, 'member');
+              continue;
+            }
+            $g->getBaseObject()->attributesAccess['member']->addValue($this->dn, $fake_attrs);
+            $msg = $g->save();
+            if (empty($msg)) {
+              $this->savedGroupsMembership[] = $ogroupdn;
+            } else {
+              $errors = array_merge($errors, $msg);
+            }
+          } catch (NonExistingLdapNodeException $e) {
+            $errors[] = $e->getMessage();
           }
         }
       }
@@ -266,17 +276,21 @@ class userRoles extends simplePlugin
       /* Remove groups not listed in groupsMembership */
       foreach ($this->savedGroupsMembership as $key => $ogroupdn) {
         if (!in_array($ogroupdn, $groupsMembership)) {
-          $g = objects::open($ogroupdn, 'ogroup');
-          if (!$g->getBaseObject()->attrIsWriteable('member')) {
-            $errors[] = msgPool::permModify($ogroupdn, 'member');
-            continue;
-          }
-          $g->getBaseObject()->attributesAccess['member']->searchAndRemove($this->dn);
-          $msg = $g->save();
-          if (empty($msg)) {
-            unset($this->savedGroupsMembership[$key]);
-          } else {
-            $errors = array_merge($errors, $msg);
+          try {
+            $g = objects::open($ogroupdn, 'ogroup');
+            if (!$g->getBaseObject()->attrIsWriteable('member')) {
+              $errors[] = msgPool::permModify($ogroupdn, 'member');
+              continue;
+            }
+            $g->getBaseObject()->attributesAccess['member']->searchAndRemove($this->dn);
+            $msg = $g->save();
+            if (empty($msg)) {
+              unset($this->savedGroupsMembership[$key]);
+            } else {
+              $errors = array_merge($errors, $msg);
+            }
+          } catch (NonExistingLdapNodeException $e) {
+            $errors[] = $e->getMessage();
           }
         }
       }
@@ -285,17 +299,21 @@ class userRoles extends simplePlugin
       $rolesMembership = $this->attributesAccess['rolesMembership']->getValue();
       foreach ($rolesMembership as $roledn) {
         if (!in_array($roledn, $this->savedRolesMembership)) {
-          $r = objects::open($roledn, 'role');
-          if (!in_array($roledn, $this->templateRoles) && !$r->getBaseObject()->attrIsWriteable('roleOccupant')) {
-            $errors[] = msgPool::permModify($roledn, 'roleOccupant');
-            continue;
-          }
-          $r->getBaseObject()->attributesAccess['roleOccupant']->addValue($this->dn, $fake_attrs);
-          $msg = $r->save();
-          if (empty($msg)) {
-            $this->savedRolesMembership[] = $roledn;
-          } else {
-            $errors = array_merge($errors, $msg);
+          try {
+            $r = objects::open($roledn, 'role');
+            if (!in_array($roledn, $this->templateRoles) && !$r->getBaseObject()->attrIsWriteable('roleOccupant')) {
+              $errors[] = msgPool::permModify($roledn, 'roleOccupant');
+              continue;
+            }
+            $r->getBaseObject()->attributesAccess['roleOccupant']->addValue($this->dn, $fake_attrs);
+            $msg = $r->save();
+            if (empty($msg)) {
+              $this->savedRolesMembership[] = $roledn;
+            } else {
+              $errors = array_merge($errors, $msg);
+            }
+          } catch (NonExistingLdapNodeException $e) {
+            $errors[] = $e->getMessage();
           }
         }
       }
@@ -303,17 +321,21 @@ class userRoles extends simplePlugin
       /* Remove roles not listed in rolesMembership */
       foreach ($this->savedRolesMembership as $key => $roledn) {
         if (!in_array($roledn, $rolesMembership)) {
-          $r = objects::open($roledn, 'role');
-          if (!$r->getBaseObject()->attrIsWriteable('roleOccupant')) {
-            $errors[] = msgPool::permModify($roledn, 'roleOccupant');
-            continue;
-          }
-          $r->getBaseObject()->attributesAccess['roleOccupant']->searchAndRemove($this->dn);
-          $msg = $r->save();
-          if (empty($msg)) {
-            unset($this->savedRolesMembership[$key]);
-          } else {
-            $errors = array_merge($errors, $msg);
+          try {
+            $r = objects::open($roledn, 'role');
+            if (!$r->getBaseObject()->attrIsWriteable('roleOccupant')) {
+              $errors[] = msgPool::permModify($roledn, 'roleOccupant');
+              continue;
+            }
+            $r->getBaseObject()->attributesAccess['roleOccupant']->searchAndRemove($this->dn);
+            $msg = $r->save();
+            if (empty($msg)) {
+              unset($this->savedRolesMembership[$key]);
+            } else {
+              $errors = array_merge($errors, $msg);
+            }
+          } catch (NonExistingLdapNodeException $e) {
+            $errors[] = $e->getMessage();
           }
         }
       }