diff --git a/include/class_config.inc b/include/class_config.inc
index ee7cb0fb488ef65239edc048b42f71b3f00a4022..b3275934277555051a60c2f7e1620e8c7b6afa11 100644
--- a/include/class_config.inc
+++ b/include/class_config.inc
@@ -829,6 +829,8 @@ class config
               if (!preg_match('/^\(.*\)$/', $value['filter'])) {
                 $value['filter'] = '('.$value['filter'].')';
               }
+            } elseif (isset($plInfo['plFilter'])) {
+              $value['filter'] = $plInfo['plFilter'];
             } else {
               $value['filter'] = NULL;
             }
diff --git a/include/class_pluglist.inc b/include/class_pluglist.inc
index 8b83ec7ce0e7ece2fad4659a03ec20369723a145..9bda4a6581f659204097734c5fc448df709e1937 100644
--- a/include/class_pluglist.inc
+++ b/include/class_pluglist.inc
@@ -150,6 +150,13 @@ class pluglist {
         if (!isset($infos['plTitle']) && isset($infos['plShortName'])) {
           $infos['plTitle'] = $infos['plShortName'];
         }
+        if (!empty($infos['plObjectClass']) && !isset($infos['plFilter'])) {
+          if (count($infos['plObjectClass']) == 1) {
+            $infos['plFilter'] = '(objectClass='.$infos['plObjectClass'][0].')';
+          } else {
+            $infos['plFilter'] = '(&(objectClass='.implode(')(objectClass=', $infos['plObjectClass']).'))';
+          }
+        }
         if (isset($infos['plFilter'])) {
           $infos['plFilterObject'] = ldapFilter::parse($infos['plFilter']);
         }
diff --git a/include/simpleplugin/class_simplePlugin.inc b/include/simpleplugin/class_simplePlugin.inc
index f6b31f7bb2ff771cd9cda574f7bdc59bc9ca9856..fd710936f70f3a3d2f2aa46eb4addc1c66057ff5 100644
--- a/include/simpleplugin/class_simplePlugin.inc
+++ b/include/simpleplugin/class_simplePlugin.inc
@@ -153,6 +153,12 @@ class simplePlugin
     $this->parent   = $parent;
     $this->mainTab  = $mainTab;
 
+    $plInfo = pluglist::pluginInfos(get_class($this));
+
+    if (isset($plInfo['plObjectClass'])) {
+      $this->objectclasses = $plInfo['plObjectClass'];
+    }
+
     if ($attributesInfo === NULL) {
       $attributesInfo = $this->getAttributesInfo();
     }
@@ -188,11 +194,10 @@ class simplePlugin
 
     /* Ensure that we've a valid acl_category set */
     if (empty($this->acl_category)) {
-      $tmp = pluglist::pluginInfos(get_class($this));
-      if (isset($tmp['plCategory'])) {
-        $c = key($tmp['plCategory']);
+      if (isset($plInfo['plCategory'])) {
+        $c = key($plInfo['plCategory']);
         if (is_numeric($c)) {
-          $c = $tmp['plCategory'][0];
+          $c = $plInfo['plCategory'][0];
         }
         $this->acl_category = $c.'/';
       }
diff --git a/plugins/admin/acl/class_aclAssignment.inc b/plugins/admin/acl/class_aclAssignment.inc
index d4284f2542e04dfcdae2c4e0bce17103b8d59203..bf2f043a7bcd69179c3c84ecc8e33e921d7a06a2 100644
--- a/plugins/admin/acl/class_aclAssignment.inc
+++ b/plugins/admin/acl/class_aclAssignment.inc
@@ -260,8 +260,6 @@ class ACLsAssignmentAttribute extends DialogOrderedArrayAttribute
 
 class aclAssignment extends simplePlugin
 {
-  var $objectclasses  = array('gosaAcl');
-
   static function plInfo()
   {
     global $config;
@@ -269,7 +267,6 @@ class aclAssignment extends simplePlugin
       'aclAssignment' => array(
         'aclCategory' => 'acl',
         'name'        => _('ACL assignment'),
-        'filter'      => 'objectClass=gosaAcl',
         'ou'          => '',
         'icon'        => 'geticon.php?context=categories&icon=acl&size=16',
         'tabClass'    => 'simpleTabs_noSpecial',
@@ -284,6 +281,7 @@ class aclAssignment extends simplePlugin
     return array(
       'plShortName'   => _('ACL Assignment'),
       'plDescription' => _('Access control roles assignment'),
+      'plObjectClass' => array('gosaAcl'),
       'plObjectType'  => $oc,
       'plForeignKeys'  => array(
         'gosaAclEntry' => array(
diff --git a/plugins/admin/aclrole/class_aclRole.inc b/plugins/admin/aclrole/class_aclRole.inc
index 714d5d02c4fcd16ab2689e631586bc9f55827708..d1c738d262de1812f74a049e6cdcf35bd1d95295 100644
--- a/plugins/admin/aclrole/class_aclRole.inc
+++ b/plugins/admin/aclrole/class_aclRole.inc
@@ -69,17 +69,15 @@ class ACLsAttribute extends DialogOrderedArrayAttribute
 
 class aclRole extends simplePlugin
 {
-  var $objectclasses  = array('top','gosaRole');
-
   static function plInfo()
   {
     return array(
       'plShortName'   => _('Role'),
       'plDescription' => _('Access control roles'),
+      'plObjectClass' => array('gosaRole'),
       'plObjectType'  => array('aclRole' => array(
         'aclCategory' => 'acl',
         'name'        => _('ACL role'),
-        'filter'      => 'objectClass=gosaRole',
         'ou'          => get_ou('aclRoleRDN'),
         'icon'        => 'geticon.php?context=categories&icon=acl&size=16',
       )),
diff --git a/plugins/admin/departments/class_country.inc b/plugins/admin/departments/class_country.inc
index ddc06d92bf5a47ec8c1a5ff745945a404eb28b9e..d38ef6702c3d25d67f000e52a901df905d0415c6 100644
--- a/plugins/admin/departments/class_country.inc
+++ b/plugins/admin/departments/class_country.inc
@@ -20,18 +20,19 @@
 
 class country extends department
 {
-  static $namingAttr  = "c";
-  var $structuralOC   = array("country");
+  static protected $namingAttr  = 'c';
+  protected $structuralOC       = array('country');
 
   static function plInfo()
   {
     return array(
       'plShortName'   => _('Country'),
       'plDescription' => _('Country'),
+      'plObjectClass' => array('gosaDepartment'),
+      'plFilter'      => '(&(objectClass=country)(objectClass=gosaDepartment))',
       'plObjectType'  => array('country' => array(
         'aclCategory' => 'department',
         'name'        => _('Country'),
-        'filter'      => '(&(objectClass=country)(objectClass=gosaDepartment))',
         'ou'          => '',
         'icon'        => 'geticon.php?context=types&icon=country&size=16',
         'tabClass'    => 'deptabs',
diff --git a/plugins/admin/departments/class_dcObject.inc b/plugins/admin/departments/class_dcObject.inc
index ced37a4e78eacb512f01d630d0687461a2955713..66cb59723a461fe518ac472991861154a32d46a4 100644
--- a/plugins/admin/departments/class_dcObject.inc
+++ b/plugins/admin/departments/class_dcObject.inc
@@ -20,19 +20,18 @@
 
 class dcObject extends department
 {
-  static $namingAttr  = "dc";
-  var $objectclasses  = array("top", "dcObject", "gosaDepartment");
-  var $structuralOC   = array("locality");
+  static protected $namingAttr  = 'dc';
+  protected $structuralOC       = array('locality');
 
   static function plInfo()
   {
     return array(
       'plShortName'   => _('Domain Component'),
       'plDescription' => _('Domain Component'),
+      'plObjectClass' => array('dcObject', 'gosaDepartment'),
       'plObjectType'  => array('dcObject' => array(
         'aclCategory' => 'department',
         'name'        => _('Domain Component'),
-        'filter'      => '(&(objectClass=dcObject)(objectClass=gosaDepartment))',
         'ou'          => '',
         'icon'        => 'geticon.php?context=types&icon=dc&size=16',
         'tabClass'    => 'deptabs',
diff --git a/plugins/admin/departments/class_department.inc b/plugins/admin/departments/class_department.inc
index ddf29b1774cb88aa20d5e94f2ab35ac7d05f96e2..3bd3c287ede8d960f70d2035c0428281ba9a2ddb 100644
--- a/plugins/admin/departments/class_department.inc
+++ b/plugins/admin/departments/class_department.inc
@@ -21,23 +21,22 @@
 
 class department extends simplePlugin
 {
-  static $namingAttr = 'ou';
-
-  /* Do not append the structural object classes here, they are added dynamically in the constructor */
-  var $objectclasses  = array("top", "gosaDepartment");
-  var $structuralOC   = array("organizationalUnit");
+  static protected $namingAttr  = 'ou';
+  protected $structuralOC       = array('organizationalUnit');
 
   static function plInfo()
   {
     return array(
       'plShortName'   => _('Department'),
       'plDescription' => _('Departments'),
+      /* Do not append the structural object classes here, they are added dynamically in the constructor */
+      'plObjectClass' => array('gosaDepartment'),
+      'plFilter'      => '(&(objectClass=organizationalUnit)(objectClass=gosaDepartment))',
       'plCategory'    => array('department' => array('objectClass' => 'gosaDepartment', 'description' => _('Departments'))),
       'plObjectType'  =>
         array(
           'department' => array(
             'name'      => _('Department'),
-            'filter'    => '(&(objectClass=organizationalUnit)(objectClass=gosaDepartment))',
             'ou'        => '',
             'icon'      => 'geticon.php?context=places&icon=folder&size=16',
             'tabClass'  => 'deptabs',
diff --git a/plugins/admin/departments/class_domain.inc b/plugins/admin/departments/class_domain.inc
index 01994317cb0248fd90d390043212dfc6e5cea627..7a01aa2eac93fd3831dcd5c2289100dc457121b6 100644
--- a/plugins/admin/departments/class_domain.inc
+++ b/plugins/admin/departments/class_domain.inc
@@ -20,19 +20,18 @@
 
 class domain extends department
 {
-  static $namingAttr  = "dc";
-  var $objectclasses  = array("top", "domain", "gosaDepartment");
-  var $structuralOC   = array("domain");
+  static protected $namingAttr  = 'dc';
+  protected $structuralOC       = array('domain');
 
   static function plInfo()
   {
     return array(
       'plShortName'   => _('Domain'),
       'plDescription' => _('Domain'),
+      'plObjectClass' => array('domain', 'gosaDepartment'),
       'plObjectType'  => array('domain' => array(
         'aclCategory' => 'department',
         'name'        => _('Domain'),
-        'filter'      => '(&(objectClass=domain)(objectClass=gosaDepartment))',
         'ou'          => '',
         'icon'        => 'geticon.php?context=types&icon=domain&size=16',
         'tabClass'    => 'deptabs',
diff --git a/plugins/admin/departments/class_locality.inc b/plugins/admin/departments/class_locality.inc
index 6f0e8125be07045d7aedb693792afcfeb8f04ac6..99483b64c3b48243f6c67bc099b12501008600b1 100644
--- a/plugins/admin/departments/class_locality.inc
+++ b/plugins/admin/departments/class_locality.inc
@@ -20,19 +20,19 @@
 
 class locality extends department
 {
-  static $namingAttr  = "l";
-  var $objectclasses  = array("top", "gosaDepartment");
-  var $structuralOC   = array("locality");
+  static protected $namingAttr  = 'l';
+  protected $structuralOC       = array('locality');
 
   static function plInfo()
   {
     return array(
       'plShortName'   => _('Locality'),
       'plDescription' => _('Locality'),
+      'plObjectClass' => array('gosaDepartment'),
+      'plFilter'      => '(&(!(objectClass=dcObject))(objectClass=locality)(objectClass=gosaDepartment))',
       'plObjectType'  => array('locality' => array(
         'aclCategory' => 'department',
         'name'        => _('Locality'),
-        'filter'      => '(&(!(objectClass=dcObject))(objectClass=locality)(objectClass=gosaDepartment))',
         'ou'          => '',
         'icon'        => 'geticon.php?context=types&icon=locality&size=16',
         'tabClass'    => 'deptabs',
diff --git a/plugins/admin/departments/class_organization.inc b/plugins/admin/departments/class_organization.inc
index d633dc3f27cad9bf087e0f0613e41ef7cbb9d8b4..ff0dac558b1a49d258818a5a87b12ef04f9d2c48 100644
--- a/plugins/admin/departments/class_organization.inc
+++ b/plugins/admin/departments/class_organization.inc
@@ -20,19 +20,19 @@
 
 class organization extends department
 {
-  static $namingAttr  = "o";
-  var $objectclasses  = array("top", "gosaDepartment");
-  var $structuralOC   = array("organization");
+  static protected $namingAttr  = 'o';
+  protected $structuralOC       = array('organization');
 
   static function plInfo()
   {
     return array(
       'plShortName'   => _('Organization'),
       'plDescription' => _('Organization'),
+      'plObjectClass' => array('gosaDepartment'),
+      'plFilter'      => '(&(objectClass=organization)(objectClass=gosaDepartment))',
       'plObjectType'  => array('organization' => array(
         'aclCategory' => 'department',
         'name'        => _('Organization'),
-        'filter'      => '(&(objectClass=organization)(objectClass=gosaDepartment))',
         'ou'          => '',
         'icon'        => 'geticon.php?context=types&icon=organization&size=16',
         'tabClass'    => 'deptabs',
diff --git a/plugins/admin/groups/class_ogroup.inc b/plugins/admin/groups/class_ogroup.inc
index c34532deebad107c91306544e243cac9211af023..ed476f1c07e2e86fcbc6d11bc7342809ed47199b 100644
--- a/plugins/admin/groups/class_ogroup.inc
+++ b/plugins/admin/groups/class_ogroup.inc
@@ -151,8 +151,6 @@ class ObjectSelectDialog extends GenericSelectDialog
 
 class ogroup extends simplePlugin
 {
-  var $objectclasses  = array('groupOfNames', 'gosaGroupOfNames');
-
   var $used_workstations = array();
 
   protected $savedTypedMembers;
@@ -176,11 +174,12 @@ class ogroup extends simplePlugin
       'plDescription' => _('Object group information'),
       'plFilter'      => '(objectClass=groupOfNames)',
       'plPriority'    => 1,
+      'plObjectClass' => array('groupOfNames', 'gosaGroupOfNames'),
+      'plFilter'      => '(objectClass=groupOfNames)',
       'plObjectType'  => array('ogroup' => array(
         'name'        => _('Group'),
         'description' => _('Group'),
         'ou'          => get_ou('ogroupRDN'),
-        'filter'      => 'objectClass=groupOfNames',
         'icon'        => 'geticon.php?context=types&icon=resource-group&size=16',
         'tabClass'    => 'ogrouptabs',
       )),
diff --git a/plugins/admin/groups/class_roleGeneric.inc b/plugins/admin/groups/class_roleGeneric.inc
index 9569ee633aeab43ad590951d6758d218c10d8082..7d16dcb54a11f571d8aa0f17685ceed668567853 100644
--- a/plugins/admin/groups/class_roleGeneric.inc
+++ b/plugins/admin/groups/class_roleGeneric.inc
@@ -47,20 +47,18 @@ class RoleMembersAttribute extends UsersAttribute
 
 class roleGeneric extends simplePlugin
 {
-  var $objectclasses = array('organizationalRole');
-
   static function plInfo()
   {
     return array(
       'plShortName'   => _('Role'),
       'plDescription' => _('Role information'),
+      'plObjectClass' => array('organizationalRole'),
       'plFilter'      => '(&(objectClass=organizationalRole)(!(objectClass=simpleSecurityObject)))',
       'plObjectType'  => array('role' =>
         array(
           'name'        => _('Role'),
           'description' => _('Organizational role'),
           'ou'          => get_ou('roleRDN'),
-          'filter'      => '(&(objectClass=organizationalRole)(!(objectClass=simpleSecurityObject)))',
           'icon'        => 'geticon.php?context=types&icon=role&size=16',
           'mainAttr'    => 'cn',
         )
diff --git a/plugins/config/class_configInLdap.inc b/plugins/config/class_configInLdap.inc
index bdc2e66249cddf5b9e5c7ad3bd794a9ebba5468f..77d44516dfaf8057254838d2e86e8dd8fcc35c70 100644
--- a/plugins/config/class_configInLdap.inc
+++ b/plugins/config/class_configInLdap.inc
@@ -21,7 +21,7 @@
 /* Debug level is an OR combination of several values */
 class DebugLevelAttribute extends SetAttribute
 {
-  protected function loadAttrValue ($attrs)
+  protected function loadAttrValue (array $attrs)
   {
     if (isset($attrs[$this->getLdapName()])) {
       $value = $attrs[$this->getLdapName()][0];
@@ -48,8 +48,6 @@ class DebugLevelAttribute extends SetAttribute
 
 class configInLdap extends simplePlugin
 {
-  var $objectclasses  = array("fusionDirectoryConf");
-
   static function plInfo()
   {
     return array(
@@ -57,6 +55,7 @@ class configInLdap extends simplePlugin
       'plTitle'         => _('FusionDirectory configuration'),
       'plDescription'   => _('Configuration screen of FusionDirectory'),
       'plIcon'          => 'geticon.php?context=categories&icon=settings&size=48',
+      'plObjectClass'   => array('fusionDirectoryConf'),
       'plObjectType'    => array(
         'configuration' => array(
           'name'      => _('FusionDirectory configuration'),
diff --git a/plugins/config/class_dashBoardConfig.inc b/plugins/config/class_dashBoardConfig.inc
index 7fbc9dce87dc4ac4d8d14a9ae0da278745e58f53..f506098ffe9ddbbb371ea5a58bc370c9ff3bb71e 100644
--- a/plugins/config/class_dashBoardConfig.inc
+++ b/plugins/config/class_dashBoardConfig.inc
@@ -20,14 +20,13 @@
 
 class dashboardConfig extends simplePlugin
 {
-  var $objectclasses  = array('fdDashboardPluginConf');
-
   static function plInfo()
   {
     return array(
       'plShortName'     => _('Dashboard configuration'),
       'plDescription'   => _('FusionDirectory dashboard plugin configuration'),
       'plCategory'      => array('configuration'),
+      'plObjectClass'   => array('fdDashboardPluginConf'),
       'plObjectType'    => array('smallConfig'),
 
       'plProvidedAcls'  => parent::generatePlProvidedAcls(static::getAttributesInfo())
diff --git a/plugins/config/class_mainPluginsConfig.inc b/plugins/config/class_mainPluginsConfig.inc
index 47a46468dcdd72c3a0f95ec23cd0017dedc7fe34..dd6e4fef39a890c523f840eedf307510cd1d8e5b 100644
--- a/plugins/config/class_mainPluginsConfig.inc
+++ b/plugins/config/class_mainPluginsConfig.inc
@@ -20,17 +20,16 @@
 
 class mainPluginsConfig extends simplePlugin
 {
-  var $objectclasses  = array("fusionDirectoryPluginsConf");
-
   static function plInfo()
   {
     return array(
-      "plShortName"     => _("Plugins configuration"),
-      "plDescription"   => _("FusionDirectory plugins configuration"),
-      "plCategory"      => array("configuration"),
-      "plObjectType"    => array("smallConfig"),
+      'plShortName'     => _('Plugins configuration'),
+      'plDescription'   => _('FusionDirectory plugins configuration'),
+      'plCategory'      => array('configuration'),
+      'plObjectClass'   => array('fusionDirectoryPluginsConf'),
+      'plObjectType'    => array('smallConfig'),
 
-      "plProvidedAcls"  => parent::generatePlProvidedAcls(static::getAttributesInfo())
+      'plProvidedAcls'  => parent::generatePlProvidedAcls(static::getAttributesInfo())
     );
   }
 
diff --git a/plugins/config/class_pluginsConfigInLdap.inc b/plugins/config/class_pluginsConfigInLdap.inc
index eef1a50d6591f437ba265b0e23e237c1888e0c2c..941fae92f69ec4e5c7610d6500f5e366501e6f8d 100644
--- a/plugins/config/class_pluginsConfigInLdap.inc
+++ b/plugins/config/class_pluginsConfigInLdap.inc
@@ -26,12 +26,12 @@ class pluginsConfigInLdap extends multiPlugin
   static function plInfo()
   {
     return array(
-      "plShortName"   => _("Plugins"),
-      "plDescription" => _("Configuration for plugins"),
-      "plPriority"    => 20,
-      "plObjectType"  => array("configuration"),
+      'plShortName'   => _('Plugins'),
+      'plDescription' => _('Configuration for plugins'),
+      'plPriority'    => 20,
+      'plObjectType'  => array('configuration'),
 
-      "plProvidedAcls"  => array()
+      'plProvidedAcls'  => array()
     );
   }
 }
diff --git a/plugins/config/class_recoveryConfig.inc b/plugins/config/class_recoveryConfig.inc
index 6f0ed62212d21588911352ff5cced5fa2b1edc31..905cec0c65d183924638faaea4fc1f5a8f691518 100644
--- a/plugins/config/class_recoveryConfig.inc
+++ b/plugins/config/class_recoveryConfig.inc
@@ -20,13 +20,12 @@
 
 class recoveryConfig extends simplePlugin
 {
-  var $objectclasses  = array('fdPasswordRecoveryConf');
-
   static function plInfo()
   {
     return array(
       'plShortName'     => _('Password recovery'),
       'plDescription'   => _('Settings for the password recovery feature'),
+      'plObjectClass'   => array('fdPasswordRecoveryConf'),
       'plObjectType'    => array('configuration'),
 
       'plProvidedAcls'  => parent::generatePlProvidedAcls(static::getAttributesInfo())
diff --git a/plugins/personal/generic/class_user.inc b/plugins/personal/generic/class_user.inc
index 575196e5ec42e03cc9d85971c060b0ce1019e0f6..4e4ec17045c2a0cfe0edbc7b71f698ab11471409 100644
--- a/plugins/personal/generic/class_user.inc
+++ b/plugins/personal/generic/class_user.inc
@@ -84,7 +84,7 @@ class UserPasswordAttribute extends CompositeAttribute
   }
 
   /* We need to handle method select disabling manually */
-  function renderAttribute(&$attributes, $readOnly)
+  function renderAttribute(array &$attributes, $readOnly)
   {
     global $config;
     if ($this->visible) {
@@ -110,7 +110,7 @@ class UserPasswordAttribute extends CompositeAttribute
 
   /*! \brief Loads this attribute value from the attrs array
    */
-  protected function loadAttrValue ($attrs)
+  protected function loadAttrValue (array $attrs)
   {
     if (isset($attrs[$this->getLdapName()])) {
       $this->setValue($this->inputValue($attrs[$this->getLdapName()][0]));
@@ -186,7 +186,7 @@ class UserPasswordAttribute extends CompositeAttribute
     return array($pw_storage, $password, $password, $value, $locked);
   }
 
-  function writeValues($values)
+  function writeValues(array $values)
   {
     if ($this->needPassword[$values[0]] && ($values[1] == '')) {
       if ($this->plugin->is_template) {
@@ -268,8 +268,6 @@ class PostalAddressAttribute extends TextAreaAttribute
 
 class user extends simplePlugin
 {
-  var $objectclasses  = array('inetOrgPerson','organizationalPerson','person');
-
   private $was_locked;
 
   static function plInfo()
@@ -277,14 +275,14 @@ class user extends simplePlugin
     return array(
       'plShortName'   => _('User'),
       'plDescription' => _('User account information'),
-      'plFilter'      => '(objectClass=inetOrgPerson)',
       'plIcon'        => 'geticon.php?context=applications&icon=user-info&size=48',
       'plSmallIcon'   => 'geticon.php?context=applications&icon=user-info&size=16',
       'plSelfModify'  => TRUE,
+      'plObjectClass' => array('inetOrgPerson','organizationalPerson','person'),
+      'plFilter'      => '(objectClass=inetOrgPerson)',
       'plObjectType'  => array('user' => array(
         'name'        => _('User'),
         'description' => _('User account'),
-        'filter'      => '(objectClass=inetOrgPerson)',
         'mainAttr'    => 'uid',
         'nameAttr'    => 'cn',
         'icon'        => 'geticon.php?context=types&icon=user&size=16',