diff --git a/contrib/openldap/core-fd-conf.schema b/contrib/openldap/core-fd-conf.schema
index b2831c699bb00042a92a113ffb5cdff245ca5779..840d1ff2bbd02b1b2ed52ba27ebbe2b0065e3fd5 100644
--- a/contrib/openldap/core-fd-conf.schema
+++ b/contrib/openldap/core-fd-conf.schema
@@ -229,6 +229,12 @@ attributetype ( 1.3.6.1.4.1.38414.8.14.7 NAME 'fdLdapSizeLimit'
   SYNTAX 1.3.6.1.4.1.1466.115.121.1.27
   SINGLE-VALUE)
 
+attributetype ( 1.3.6.1.4.1.38414.8.14.8 NAME 'fdWildcardForeignKeys'
+  DESC 'FusionDirectory - Weither or not to enable wildcard searches for foreign keys on dn'
+  EQUALITY booleanMatch
+  SYNTAX 1.3.6.1.4.1.1466.115.121.1.7
+  SINGLE-VALUE )
+
 # Login and session
 
 attributetype ( 1.3.6.1.4.1.38414.8.15.1 NAME 'fdLoginAttribute'
@@ -548,7 +554,7 @@ objectclass ( 1.3.6.1.4.1.38414.8.2.1 NAME 'fusionDirectoryConf'
     fdHandleExpiredAccounts $ fdSaslRealm $ fdSaslExop $
     fdForcePasswordDefaultHash $
     fdListSummary $
-    fdModificationDetectionAttribute $ fdLogging $ fdLdapSizeLimit $
+    fdModificationDetectionAttribute $ fdLogging $ fdLdapSizeLimit $ fdWildcardForeignKeys $
     fdLoginAttribute $ fdForceSSL $ fdWarnSSL $ fdStoreFilterSettings $ fdSessionLifeTime $
     fdHttpAuthActivated $ fdHttpHeaderAuthActivated $ fdHttpHeaderAuthHeaderName $
     fdDisplayErrors $ fdLdapMaxQueryTime $ fdLdapStats $ fdDebugLevel $
diff --git a/include/simpleplugin/class_simplePlugin.inc b/include/simpleplugin/class_simplePlugin.inc
index 811f4fd123481a7b3ac84f7e4a9dab01423de7ac..4853b64636e31ac781fbaf8a0727d21fcf432160 100644
--- a/include/simpleplugin/class_simplePlugin.inc
+++ b/include/simpleplugin/class_simplePlugin.inc
@@ -1563,6 +1563,13 @@ class simplePlugin
         $ofield     = $ref[1];
         $filter     = $ref[2];
         $filtersub  = $ref[3];
+        if ($filtersub == '*') {
+          if ($config->get_cfg_value('wildcardForeignKeys', 'TRUE') == 'TRUE') {
+            $filtersub = $ofield.'=*';
+          } else {
+            continue;
+          }
+        }
         if ($class == 'aclAssignment') {
           /* Special case: aclAssignment foreignKey is ignored on department types as it’s handled by the aclAssignment objectType */
           $objectTypes = array('ACLASSIGNMENT');
diff --git a/plugins/admin/departments/class_country.inc b/plugins/admin/departments/class_country.inc
index 9003206e62fef947b280a03a2d36df81bdc61013..ddc06d92bf5a47ec8c1a5ff745945a404eb28b9e 100644
--- a/plugins/admin/departments/class_country.inc
+++ b/plugins/admin/departments/class_country.inc
@@ -38,7 +38,7 @@ class country extends department
         'mainAttr'    => static::$namingAttr,
       )),
       'plForeignKeys'  => array(
-        'manager' => 'user'
+        'manager' => array('user','dn','manager=%oldvalue%','*')
       ),
 
       'plProvidedAcls' => parent::generatePlProvidedAcls(static::getAttributesInfo())
diff --git a/plugins/admin/departments/class_dcObject.inc b/plugins/admin/departments/class_dcObject.inc
index 8f474083a0623b5e0abd3f5033e41abc0fec5fef..ced37a4e78eacb512f01d630d0687461a2955713 100644
--- a/plugins/admin/departments/class_dcObject.inc
+++ b/plugins/admin/departments/class_dcObject.inc
@@ -39,7 +39,7 @@ class dcObject extends department
         'mainAttr'    => static::$namingAttr,
       )),
       'plForeignKeys'  => array(
-        'manager' => 'user'
+        'manager' => array('user','dn','manager=%oldvalue%','*')
       ),
 
       'plProvidedAcls' => parent::generatePlProvidedAcls(static::getAttributesInfo())
diff --git a/plugins/admin/departments/class_department.inc b/plugins/admin/departments/class_department.inc
index 2fdec7cf8180b344ea6e0d72de91b321c0408e8a..319f1fc74ae5b760894c8d613cf9ee4669d91827 100644
--- a/plugins/admin/departments/class_department.inc
+++ b/plugins/admin/departments/class_department.inc
@@ -45,7 +45,7 @@ class department extends simplePlugin
           )
         ),
       'plForeignKeys'  => array(
-        'manager' => 'user'
+        'manager' => array('user','dn','manager=%oldvalue%','*')
       ),
 
       'plProvidedAcls' => parent::generatePlProvidedAcls(static::getAttributesInfo())
diff --git a/plugins/admin/departments/class_domain.inc b/plugins/admin/departments/class_domain.inc
index 31a594a1aae3e56c1727a73f221fd0d4a03c55a9..01994317cb0248fd90d390043212dfc6e5cea627 100644
--- a/plugins/admin/departments/class_domain.inc
+++ b/plugins/admin/departments/class_domain.inc
@@ -39,7 +39,7 @@ class domain extends department
         'mainAttr'    => static::$namingAttr,
       )),
       'plForeignKeys'  => array(
-        'manager' => 'user'
+        'manager' => array('user','dn','manager=%oldvalue%','*')
       ),
 
       'plProvidedAcls' => parent::generatePlProvidedAcls(static::getAttributesInfo())
diff --git a/plugins/admin/departments/class_locality.inc b/plugins/admin/departments/class_locality.inc
index aadf109629af7eba0d920edfd8a342f1983ea168..6f0e8125be07045d7aedb693792afcfeb8f04ac6 100644
--- a/plugins/admin/departments/class_locality.inc
+++ b/plugins/admin/departments/class_locality.inc
@@ -39,7 +39,7 @@ class locality extends department
         'mainAttr'    => static::$namingAttr,
       )),
       'plForeignKeys'  => array(
-        'manager' => 'user'
+        'manager' => array('user','dn','manager=%oldvalue%','*')
       ),
 
       'plProvidedAcls' => parent::generatePlProvidedAcls(static::getAttributesInfo())
diff --git a/plugins/admin/departments/class_organization.inc b/plugins/admin/departments/class_organization.inc
index 89b2c2d3994aa05aeb53ac81c5d3971044db09ac..d633dc3f27cad9bf087e0f0613e41ef7cbb9d8b4 100644
--- a/plugins/admin/departments/class_organization.inc
+++ b/plugins/admin/departments/class_organization.inc
@@ -39,7 +39,7 @@ class organization extends department
         'mainAttr'    => static::$namingAttr,
       )),
       'plForeignKeys'  => array(
-        'manager' => 'user'
+        'manager' => array('user','dn','manager=%oldvalue%','*')
       ),
 
       'plProvidedAcls' => parent::generatePlProvidedAcls(static::getAttributesInfo())
diff --git a/plugins/admin/groups/class_ogroup.inc b/plugins/admin/groups/class_ogroup.inc
index a5001c471a40aa2dd9d02d552097ae5c1b32226c..2dcca5042cde5da498488e028f6ee22e4f445ee0 100644
--- a/plugins/admin/groups/class_ogroup.inc
+++ b/plugins/admin/groups/class_ogroup.inc
@@ -186,17 +186,17 @@ class ogroup extends simplePlugin
       )),
       'plForeignKeys'  => array(
         'member' => array(
-          array('user'),
-          array('ogroup'),
-          array('application'),
-          array('serverGeneric'),
-          array('workstationGeneric'),
-          array('terminalGeneric'),
-          array('phoneGeneric'),
-          array('printGeneric'),
+          array('user',               'dn','member=%oldvalue%','*'),
+          array('ogroup',             'dn','member=%oldvalue%','*'),
+          array('application',        'dn','member=%oldvalue%','*'),
+          array('serverGeneric',      'dn','member=%oldvalue%','*'),
+          array('workstationGeneric', 'dn','member=%oldvalue%','*'),
+          array('terminalGeneric',    'dn','member=%oldvalue%','*'),
+          array('phoneGeneric',       'dn','member=%oldvalue%','*'),
+          array('printGeneric',       'dn','member=%oldvalue%','*'),
         ),
         'owner' => array(
-          array('user'),
+          array('user','dn','owner=%oldvalue%','*')
         )
       ),
 
diff --git a/plugins/admin/groups/class_roleGeneric.inc b/plugins/admin/groups/class_roleGeneric.inc
index d4a2939f7c5bdb3be1a5010c688bd4d46af857f7..5441206a76b5c2d19c14a989996abfec6f12bf8e 100644
--- a/plugins/admin/groups/class_roleGeneric.inc
+++ b/plugins/admin/groups/class_roleGeneric.inc
@@ -65,7 +65,7 @@ class roleGeneric extends simplePlugin
         )
       ),
       'plForeignKeys'  => array(
-        'roleOccupant' => 'user'
+        'roleOccupant' => array('user','dn','roleOccupant=%oldvalue%','*')
       ),
 
       'plProvidedAcls'  => parent::generatePlProvidedAcls(static::getAttributesInfo())
diff --git a/plugins/config/class_configInLdap.inc b/plugins/config/class_configInLdap.inc
index a8a346089bf9708c95e019b3add035dcc734a5e5..336b64ce94f99fa6b3a248f0fc1ae68975e6e035 100644
--- a/plugins/config/class_configInLdap.inc
+++ b/plugins/config/class_configInLdap.inc
@@ -142,6 +142,11 @@ class configInLdap extends simplePlugin
             'fdSnapshotBase', FALSE,
             'ou=snapshots,'.$config->current['BASE']
           ),
+          new BooleanAttribute (
+            _('Wildcard foreign keys'), _('Enables wildcard searches like member=* when moving a whole departement. This will open all existing groups and roles to make sure foreign keys are respected. Slow on big trees.'),
+            'fdWildcardForeignKeys', FALSE,
+            TRUE
+          ),
         )
       ),
       'password' => array(
diff --git a/plugins/personal/generic/class_user.inc b/plugins/personal/generic/class_user.inc
index 5d69d4f97643a045b14f9f0f9c14d404397168a2..231cf96f6b385ade56f1edd3d273df3d25edb0a5 100644
--- a/plugins/personal/generic/class_user.inc
+++ b/plugins/personal/generic/class_user.inc
@@ -290,7 +290,7 @@ class user extends simplePlugin
         'ou'          => get_ou('userRDN'),
       )),
       'plForeignKeys'  => array(
-        'manager' => array('user','dn')
+        'manager' => array('user','dn','manager=%oldvalue%','*')
       ),
 
       'plProvidedAcls' => array_merge(