diff --git a/contrib/openldap/core-fd-conf.schema b/contrib/openldap/core-fd-conf.schema
index 6e9ac07ee6c7fee68079d1dafa4d4ded7befe54b..6084f58c8fd1db8ded41d4388f71683ea1ee1ec5 100644
--- a/contrib/openldap/core-fd-conf.schema
+++ b/contrib/openldap/core-fd-conf.schema
@@ -166,6 +166,12 @@ attributetype ( 1.3.6.1.4.1.38414.8.12.18 NAME 'fdCnPattern'
   SYNTAX 1.3.6.1.4.1.1466.115.121.1.26
   SINGLE-VALUE)
 
+attributetype ( 1.3.6.1.4.1.38414.8.12.19 NAME 'fdRestrictRoleMembers'
+  DESC 'FusionDirectory - Restrict role members to users from the same LDAP branch'
+  EQUALITY booleanMatch
+  SYNTAX 1.3.6.1.4.1.1466.115.121.1.7
+  SINGLE-VALUE )
+
 # Password
 
 attributetype ( 1.3.6.1.4.1.38414.8.13.1 NAME 'fdPasswordDefaultHash'
@@ -568,7 +574,7 @@ objectclass ( 1.3.6.1.4.1.38414.8.2.1 NAME 'fusionDirectoryConf'
     fdStrictNamingRules $ fdMinId $ fdUidNumberBase $
     fdGidNumberBase $ fdUserRDN $ fdGroupRDN $ fdIdAllocationMethod $
     fdGidNumberPoolMin $ fdUidNumberPoolMin $ fdGidNumberPoolMax $ fdUidNumberPoolMax $
-    fdAclRoleRDN $ fdCnPattern $
+    fdAclRoleRDN $ fdCnPattern $ fdRestrictRoleMembers $
     fdPasswordDefaultHash $ fdPasswordMinLength $ fdPasswordMinDiffer $
     fdPasswordHook $ fdHandleExpiredAccounts $ fdSaslRealm $ fdSaslExop $
     fdForcePasswordDefaultHash $
diff --git a/include/select/class_filterLDAPBlacklist.inc b/include/select/class_filterLDAPBlacklist.inc
index e93695ed5d390a6d4bbb22e8717ac98773193339..dd755483baa93a4f10579665f9228157d8a7ce14 100644
--- a/include/select/class_filterLDAPBlacklist.inc
+++ b/include/select/class_filterLDAPBlacklist.inc
@@ -22,30 +22,51 @@
 
 class filterLDAPBlacklist {
 
-  static function query($parent,$base, $scope, $filter, $attributes, $category, $objectStorage= "")
+  static function query($parent, $base, $scope, $filter, $attributes, $category, $objectStorage = "")
   {
-    $result = filterLDAP::query($parent,$base, $scope, $filter, $attributes, $category, $objectStorage);
-    return(filterLDAPBlacklist::filterByBlacklist($result));
+    $result = filterLDAP::query($parent, $base, $scope, $filter, $attributes, $category, $objectStorage);
+    return filterLDAPBlacklist::filterByBlacklist($result);
   }
 
   static function filterByBlacklist($entries)
   {
-    if(session::is_set('filterBlacklist')){
+    if (session::is_set('filterWhitelist')) {
+      $wlist = session::get('filterWhitelist');
+      if (!empty($wlist)) {
+        foreach ($entries as $id => $entry) {
+          $dn1 = $entry['dn'];
+          $dn2 = $wlist['dn'];
+          if (in_array($entry['dn'], $wlist['dn'])) {
+            continue;
+          }
+          foreach ($wlist['branches'] as $branch) {
+            if (preg_match('/'.preg_quote($branch, '/').'$/', $entry['dn'])) {
+              continue 2;
+            }
+          }
+          unset($entries[$id]);
+        }
+      }
+    }
+    if (session::is_set('filterBlacklist')) {
       $blist = session::get('filterBlacklist');
-      foreach($blist as $attr_name => $attr_values){
-        foreach($attr_values as $match){
-          foreach($entries as $id => $entry){
-            if(isset($entry[$attr_name])){
+      foreach ($blist as $attr_name => $attr_values) {
+        foreach ($attr_values as $match) {
+          foreach ($entries as $id => $entry) {
+            if (isset($entry[$attr_name])) {
               $test = $entry[$attr_name];
-              if(!is_array($test)) $test = array($test);
-              if(in_array($match, $test)) unset($entries[$id]);
+              if (!is_array($test)) {
+                $test = array($test);
+              }
+              if (in_array($match, $test)) {
+                unset($entries[$id]);
+              }
             }
           }
         }
       }
     }
-    return(array_values($entries));
+    return array_values($entries);
   }
 }
-
 ?>
diff --git a/include/simpleplugin/class_dialogAttributes.inc b/include/simpleplugin/class_dialogAttributes.inc
index c000331f484deb8ca74a7d6c45378d5e118eef65..c6bacf197e086e83c80a837a52312f69c9332592 100644
--- a/include/simpleplugin/class_dialogAttributes.inc
+++ b/include/simpleplugin/class_dialogAttributes.inc
@@ -66,6 +66,7 @@ class GenericSelectDialog extends GenericDialog
   function dialog_execute ()
   {
     session::set('filterBlacklist', $this->attribute->getFilterBlackList());
+    session::set('filterWhitelist', $this->attribute->getFilterWhiteList());
     return parent::dialog_execute();
   }
 
@@ -189,6 +190,11 @@ class DialogAttribute extends SetAttribute
     trigger_error("abstract method");
   }
 
+  function getFilterWhiteList ()
+  {
+    return array();
+  }
+
   function loadPostValue ()
   {
     parent::loadPostValue();
diff --git a/plugins/admin/groups/class_roleGeneric.inc b/plugins/admin/groups/class_roleGeneric.inc
index fa712c4f5f4b7f2b9e8a4d38cb6f5191d889611a..4db9a2fd458eceaa3fcd110a763d63cac7c2d025 100644
--- a/plugins/admin/groups/class_roleGeneric.inc
+++ b/plugins/admin/groups/class_roleGeneric.inc
@@ -18,6 +18,29 @@
   Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA.
 */
 
+class RoleMembersAttribute extends UsersAttribute
+{
+  protected $whitelistDns = NULL;
+
+  function getFilterWhiteList()
+  {
+    global $config;
+    if ($config->get_cfg_value('RestrictRoleMembers') == 'TRUE') {
+      if ($this->whitelistDns === NULL) {
+        /* Computes a list of members of all groups within our branch */
+        $groups = objects::ls('ogroup', array('member' => '*'), $this->plugin->base);
+        $this->whitelistDns = call_user_func_array('array_merge_recursive', $groups)['member'];
+      }
+      return array(
+        'branches'  => array($this->plugin->base),
+        'dn'        => $this->whitelistDns,
+      );
+    } else {
+      return array();
+    }
+  }
+}
+
 class roleGeneric extends simplePlugin
 {
   var $mainTab = TRUE;
@@ -74,7 +97,7 @@ class roleGeneric extends simplePlugin
             _('Fax number'), _('Fax number'),
             'facsimileTelephoneNumber'
           ),
-          new UsersAttribute(
+          new RoleMembersAttribute (
             _('Users'), _('Add users for the role'),
             'roleOccupant', FALSE
           )
diff --git a/plugins/config/class_configInLdap.inc b/plugins/config/class_configInLdap.inc
index c1c931b8ba19ba9115b60ba69acf8cf08c7afe09..2dffa34fbbadeb5c587d93253a15b69fd0feaf18 100644
--- a/plugins/config/class_configInLdap.inc
+++ b/plugins/config/class_configInLdap.inc
@@ -363,6 +363,10 @@ class configInLdap extends simplePlugin
             'fdGidNumberPoolMax', FALSE,
             0, FALSE, 40000
           ),
+          new BooleanAttribute (
+            _('Restrict role members'), _('When enabled only users from the same branch or members of groups from the same branch can be added to a role.'),
+            'fdRestrictRoleMembers'
+          ),
         )
       ),
       'debug' => array(