diff --git a/include/class_pluglist.inc b/include/class_pluglist.inc
index 817f4df78411f533a2fd5efd2ed7e8eeebb1c51e..a3a45571a4fbf94449d2d89184cc66994c932f45 100644
--- a/include/class_pluglist.inc
+++ b/include/class_pluglist.inc
@@ -150,6 +150,9 @@ class pluglist {
         if (!isset($infos['plTitle']) && isset($infos['plShortName'])) {
           $infos['plTitle'] = $infos['plShortName'];
         }
+        if (isset($infos['plFilter'])) {
+          $infos['plFilterObject'] = ldapFilter::parse($infos['plFilter']);
+        }
         $infos['plForeignRefs']         = array();
         $infos['INDEX']                 = $index;
         $this->info[$cname]             = $infos;
diff --git a/include/management/class_FilterElement.inc b/include/management/class_FilterElement.inc
index b46dc3536875f42e0f0ff9406fb3d200144c21e2..4ca56378e7be001d39158b25cdee4e221985935b 100644
--- a/include/management/class_FilterElement.inc
+++ b/include/management/class_FilterElement.inc
@@ -67,12 +67,11 @@ class TabFilterElement extends FilterElement
           continue;
         }
         if (class_available($class)) {
-          $tab    = new $class('new');
-          $filter = $tab->getLdapFilter();
-          if (!empty($filter)) {
+          $classInfos = pluglist::pluginInfos($class);
+          if (isset($classInfos['plFilterObject'])) {
             $this->tabs[$class] = array(
-              'filter'  => ldapFilter::parse($filter),
-              'infos'   => pluglist::pluginInfos($class),
+              'filter'  => $classInfos['plFilterObject'],
+              'infos'   => $classInfos,
               'checked' => FALSE,
             );
           }
diff --git a/include/management/class_managementListing.inc b/include/management/class_managementListing.inc
index a646cb016e2e61b25cb095bb7b444e841c74a760..6c94d6f49cbd34e72b75459ef0d90e6499750a27 100644
--- a/include/management/class_managementListing.inc
+++ b/include/management/class_managementListing.inc
@@ -93,11 +93,7 @@ class managementListing
 
     $this->columns = array();
     foreach ($columnInfos as $columnInfo) {
-      $this->columns[] = Column::build($columnInfo[0], $columnInfo[1]);
-    }
-
-    foreach ($this->columns as $column) {
-      $column->setParent($this);
+      $this->columns[] = Column::build($this, $columnInfo[0], $columnInfo[1]);
     }
 
     $this->columns[1]->setTemplateAttribute('cn');
diff --git a/include/management/columns/class_Column.inc b/include/management/columns/class_Column.inc
index abae2ea88ecf9226cc1d42467344c75e11c6a630..0111b3bacc0ea6fa1d7538920746401d7bb9233a 100644
--- a/include/management/columns/class_Column.inc
+++ b/include/management/columns/class_Column.inc
@@ -38,7 +38,7 @@ class Column
    * \param string $type a column class
    * \param array $data an associative array with attribute and label
    * */
-  static function build($type, array $data)
+  static function build(managementListing $parent, $type, array $data)
   {
     $attribute  = NULL;
     $label      = NULL;
@@ -49,11 +49,12 @@ class Column
       $label = $data['label'];
     }
 
-    return new $type($attribute, $label);
+    return new $type($parent, $attribute, $label);
   }
 
-  function __construct($attribute = NULL, $label = NULL)
+  function __construct(managementListing $parent, $attribute = NULL, $label = NULL)
   {
+    $this->parent     = $parent;
     $this->attribute  = $attribute;
     $this->label      = $label;
   }
@@ -63,11 +64,6 @@ class Column
     $this->templateAttribute = $attribute;
   }
 
-  function setParent(managementListing $parent)
-  {
-    $this->parent = $parent;
-  }
-
   function isSortable()
   {
     return TRUE;
diff --git a/include/management/columns/class_PropertiesColumn.inc b/include/management/columns/class_PropertiesColumn.inc
index c4cc5393d1f88222619db63039b1ffda7ee93f95..502b701e5a136c7b59a1c6c991a1774745ea0888 100644
--- a/include/management/columns/class_PropertiesColumn.inc
+++ b/include/management/columns/class_PropertiesColumn.inc
@@ -23,37 +23,49 @@
  */
 class PropertiesColumn extends Column
 {
-  function isSortable()
-  {
-    return FALSE;
-  }
+  protected $tabs;
 
-  function fillNeededAttributes(array &$attrs)
-  {
-    $attrs['objectClass'] = '*';
-  }
-
-  function renderCell(ListingEntry $entry)
+  function __construct(managementListing $parent, $attribute = NULL, $label = NULL)
   {
     global $config;
 
-    $infos = objects::infos($entry->getTemplatedType());
+    parent::__construct($parent, $attribute, $label);
 
-    static $tabs = array();
+    $this->tabs = array();
 
-    if (empty($tabs[$entry->type])) {
-      $tabs[$entry->type] = array();
+    foreach ($this->parent->parent->objectTypes as $type) {
+      $infos = objects::infos($type);
+      $this->tabs[$type] = array();
       foreach ($config->data['TABS'][$infos['tabGroup']] as $plug) {
         if ($plug['CLASS'] == $infos['mainTab']) {
           continue;
         }
         if (class_available($plug['CLASS'])) {
-          $name = $plug['CLASS'];
-
-          $tabs[$entry->type][$name] = new $name('new');
+          $this->tabs[$type][] = $plug['CLASS'];
         }
       }
     }
+  }
+
+  function isSortable()
+  {
+    return FALSE;
+  }
+
+  function fillNeededAttributes(array &$attrs)
+  {
+    foreach ($this->tabs as $type => $tabs) {
+      foreach ($tabs as $class) {
+        $class::fillAccountAttrsNeeded($attrs);
+      }
+    }
+  }
+
+  function renderCell(ListingEntry $entry)
+  {
+    global $config;
+
+    $infos = objects::infos($entry->getTemplatedType());
 
     /* Main tab is always there */
     $pInfos = pluglist::pluginInfos($infos['mainTab']);
@@ -66,8 +78,9 @@ class PropertiesColumn extends Column
       } else {
         $attrs = $entry;
       }
-      foreach ($tabs[$entry->type] as $class => $tab) {
-        if ($tab->is_this_account($attrs)) {
+      foreach ($this->tabs[$entry->type] as $class) {
+        $status = $class::isAccount($attrs);
+        if ($status !== FALSE) {
           $pInfos = pluglist::pluginInfos($class);
           if (isset($pInfos['plSmallIcon'])) {
             $result .= '<input type="image" src="'.htmlentities($pInfos['plSmallIcon'], ENT_COMPAT, 'UTF-8').'" '.
diff --git a/include/simpleplugin/class_simplePlugin.inc b/include/simpleplugin/class_simplePlugin.inc
index 2b8b43a1c7a46c98a4dccbc4be1b68f02cfff700..3c0db9253e51c44eff13a90f4e530f820e5f1f0f 100644
--- a/include/simpleplugin/class_simplePlugin.inc
+++ b/include/simpleplugin/class_simplePlugin.inc
@@ -318,26 +318,24 @@ class simplePlugin
 
   function is_this_account($attrs)
   {
-    $found = TRUE;
-    foreach ($this->objectclasses as $obj) {
-      if (preg_match('/^top$/i', $obj)) {
-        continue;
-      }
-      if (!isset($attrs['objectClass']) || !in_array_ics ($obj, $attrs['objectClass'])) {
-        $found = FALSE;
-        break;
+    $result = static::isAccount($attrs);
+    if ($result === NULL) {
+      if (!empty($this->objectclasses)) {
+        trigger_error('Deprecated fallback was used for '.get_called_class().'::is_this_account');
+      }
+      $found = TRUE;
+      foreach ($this->objectclasses as $obj) {
+        if (preg_match('/^top$/i', $obj)) {
+          continue;
+        }
+        if (!isset($attrs['objectClass']) || !in_array_ics ($obj, $attrs['objectClass'])) {
+          $found = FALSE;
+          break;
+        }
       }
+      return $found;
     }
-    return $found;
-  }
-
-  function getLdapFilter()
-  {
-    if (!empty($this->objectclasses)) {
-      return '(&(objectClass='.implode(')(objectClass=', $this->objectclasses).'))';
-    } else {
-      return FALSE;
-    }
+    return $result;
   }
 
   function setTemplate ($bool)
@@ -408,11 +406,8 @@ class simplePlugin
    */
   function getObjectClassFilter ()
   {
-    if (!empty($this->objectclasses)) {
-      return '(&(objectClass='.implode(')(objectClass=', $this->objectclasses).'))';
-    } else {
-      return '';
-    }
+    trigger_error('Deprecated');
+    return static::getLdapFilter();
   }
 
   /*! \brief This function allows to use the syntax $plugin->attributeName to get attributes values
@@ -1958,6 +1953,46 @@ class simplePlugin
     return (isset($this->dialog) && $this->dialog);
   }
 
+  static function fillAccountAttrsNeeded(&$needed)
+  {
+    $infos = pluglist::pluginInfos(get_called_class());
+    if (isset($infos['plFilterObject'])) {
+      $attrs = $infos['plFilterObject']->listUsedAttributes();
+      foreach ($attrs as $attr) {
+        if (!isset($needed[$attr])) {
+          $needed[$attr] = '*';
+        }
+      }
+    }
+  }
+
+  static function isAccount($attrs)
+  {
+    $infos = pluglist::pluginInfos(get_called_class());
+    if (isset($infos['plFilterObject'])) {
+      return $infos['plFilterObject']($attrs);
+    }
+    return NULL;
+  }
+
+  static function getLdapFilter()
+  {
+    $infos = pluglist::pluginInfos(get_called_class());
+    if (isset($infos['plFilter'])) {
+      return $infos['plFilter'];
+    }
+    return NULL;
+  }
+
+  static function getLdapFilterObject()
+  {
+    $infos = pluglist::pluginInfos(get_called_class());
+    if (isset($infos['plFilterObject'])) {
+      return $infos['plFilterObject'];
+    }
+    return NULL;
+  }
+
   /*!
    * \brief Return plugin informations for acl handling
    *
diff --git a/plugins/admin/groups/class_groupManagement.inc b/plugins/admin/groups/class_groupManagement.inc
index 39498a09a607e85a0d95792542919a918e9d567a..2a71c227fd15420bddc53795a9d234088db90595 100644
--- a/plugins/admin/groups/class_groupManagement.inc
+++ b/plugins/admin/groups/class_groupManagement.inc
@@ -2,7 +2,7 @@
 /*
   This code is part of FusionDirectory (http://www.fusiondirectory.org/)
   Copyright (C) 2003  Cajus Pollmeier
-  Copyright (C) 2011-2016  FusionDirectory
+  Copyright (C) 2011-2018  FusionDirectory
 
   This program is free software; you can redistribute it and/or modify
   it under the terms of the GNU General Public License as published by
@@ -19,15 +19,19 @@
   Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA.
 */
 
-class groupManagement extends simpleManagement
+class groupManagement extends management
 {
-  protected $objectTypes  = array('ogroup', 'role', 'group');
-
-  protected $autoFilter = FALSE;
-
   public static $skipTemplates = FALSE;
 
-  protected $siActive = FALSE;
+  public static $columns = array(
+    array('ObjectTypeColumn', array()),
+    array('LinkColumn',       array('attribute' => 'cn',          'label' => 'Name')),
+    array('LinkColumn',       array('attribute' => 'description', 'label' => 'Description')),
+    array('PropertiesColumn', array('label' => 'Properties')),
+    array('ActionsColumn',    array('label' => 'Actions')),
+  );
+
+  //~ protected $siActive = FALSE;
 
   static function plInfo()
   {
@@ -46,8 +50,8 @@ class groupManagement extends simpleManagement
 
   function __construct()
   {
-    $this->filterXMLPath  = get_template_path('group-filter.xml', TRUE, dirname(__FILE__));
-    $this->listXMLPath    = get_template_path('group-list.xml', TRUE, dirname(__FILE__));
+    //~ $this->filterXMLPath  = get_template_path('group-filter.xml', TRUE, dirname(__FILE__));
+    //~ $this->listXMLPath    = get_template_path('group-list.xml', TRUE, dirname(__FILE__));
 
     // Check if we are able to communicate with Argonaut server
     if (class_available('supportDaemon') && class_available('argonautAction')) {
@@ -57,7 +61,7 @@ class groupManagement extends simpleManagement
 
     parent::__construct();
 
-    $this->headpage->registerElementFilter('filterProperties', 'groupManagement::filterProperties');
+    //~ $this->headpage->registerElementFilter('filterProperties', 'groupManagement::filterProperties');
   }
 
   function configureFilter ()
@@ -231,7 +235,7 @@ class groupManagement extends simpleManagement
 
   /*! \brief  Detects actions/events send by the ui
    *           and the corresponding targets.
-   */
+   *//*
   function detectPostActions()
   {
     $action = parent::detectPostActions();
@@ -243,60 +247,6 @@ class groupManagement extends simpleManagement
     return $action;
   }
 
-  static function filterProperties($row, $dn, $objectType, $attrs, $gosaGroupObjects = NULL)
-  {
-    global $config;
-    static $grouptabs = array();
-
-    // Load information if needed
-    $result = '&nbsp;';
-    if (!empty($attrs)) {
-      if (strtolower($objectType) == 'ogroup') {
-        if (empty($gosaGroupObjects)) {
-          return $result;
-        } else {
-          return static::filterGroupObjects($row, $gosaGroupObjects);
-        }
-      }
-      if (strtolower($objectType) == 'role') {
-        return '<input class="center" type="image" src="geticon.php?context=types&amp;icon=role&amp;size=16" '.
-                 'alt="'._('Role').'" title="'._('Edit role properties').'" '.
-                 'name="listing_edit_'.$row.'" style="padding:1px"/>';
-      }
-      if (empty($grouptabs)) {
-        foreach ($config->data['TABS']['GROUPTABS'] as $plug) {
-          if ($plug['CLASS'] == 'posixGroup') {
-            continue;
-          }
-          if (class_available($plug['CLASS'])) {
-            $name = $plug['CLASS'];
-
-            $grouptabs[$name] = new $name($dn);
-          }
-        }
-      }
-      $result = '<input class="center" type="image" src="geticon.php?context=types&amp;icon=user-group&amp;size=16" '.
-                       'alt="'._('Posix').'" title="'._('Edit posix properties').'" '.
-                       'name="listing_edit_tab_group_'.$row.'" style="padding:1px"/>';
-      foreach ($grouptabs as $class => $grouptab) {
-        if ($grouptab->is_this_account($attrs)) {
-          $infos = pluglist::pluginInfos($class);
-          if (isset($infos['plSmallIcon'])) {
-            $result .= '<input class="center" type="image" src="'.htmlentities($infos['plSmallIcon'], ENT_COMPAT, 'UTF-8').'" '.
-                       'alt="'.$infos['plTitle'].'" title="'.$infos['plTitle'].'" '.
-                       'name="listing_edit_tab_'.$class.'_'.$row.'" style="padding:1px"/>';
-          } else {
-            @DEBUG (DEBUG_TRACE, __LINE__, __FUNCTION__, __FILE__, $infos['plShortName']." ($class)", 'No icon for');
-          }
-        } else {
-          $result .= '<img src="images/empty.png" alt=" " class="center optional '.$class.'" style="padding:1px"/>';
-        }
-      }
-    }
-
-    return $result;
-  }
-
   static function filterGroupObjects($row, $gosaGroupObjects)
   {
     $types  = preg_replace('/[^a-z]/i', '', $gosaGroupObjects[0]);
@@ -359,6 +309,6 @@ class groupManagement extends simpleManagement
     $this->headpage->update();
     $display = $this->headpage->render();
     return $this->getHeader().$display;
-  }
+  }*/
 }
 ?>
diff --git a/plugins/admin/groups/class_ogroup.inc b/plugins/admin/groups/class_ogroup.inc
index 2dcca5042cde5da498488e028f6ee22e4f445ee0..c34532deebad107c91306544e243cac9211af023 100644
--- a/plugins/admin/groups/class_ogroup.inc
+++ b/plugins/admin/groups/class_ogroup.inc
@@ -174,7 +174,7 @@ class ogroup extends simplePlugin
     return array(
       'plShortName'   => _('Object group'),
       'plDescription' => _('Object group information'),
-      'plSelfModify'  => FALSE,
+      'plFilter'      => '(objectClass=groupOfNames)',
       'plPriority'    => 1,
       'plObjectType'  => array('ogroup' => array(
         'name'        => _('Group'),
@@ -299,21 +299,6 @@ class ogroup extends simplePlugin
     $this->savedTypedMembers = $this->attributesAccess['member']->getTypedValues();
   }
 
-  /*! \brief This function returns an LDAP filter for this plugin object classes
-   */
-  function getObjectClassFilter ()
-  {
-    return '(objectClass=groupOfNames)';
-  }
-
-  function is_this_account($attrs)
-  {
-    $this->objectclasses  = array('groupOfNames');
-    $found = parent::is_this_account($attrs);
-    $this->objectclasses  = array('groupOfNames', 'gosaGroupOfNames');
-    return $found;
-  }
-
   function prepare_save()
   {
     $this->reload();
diff --git a/plugins/admin/groups/main.inc b/plugins/admin/groups/main.inc
index eba2e1f99a8ae60d96fa401f2fc3433f0256f6ff..e1be2670ba49540ed935cd5d076428f888179279 100644
--- a/plugins/admin/groups/main.inc
+++ b/plugins/admin/groups/main.inc
@@ -1,7 +1,7 @@
 <?php
 /*
   This code is part of FusionDirectory (http://www.fusiondirectory.org/)
-  Copyright (C) 2013-2016  FusionDirectory
+  Copyright (C) 2013-2018  FusionDirectory
 
   This program is free software; you can redistribute it and/or modify
   it under the terms of the GNU General Public License as published by
@@ -18,5 +18,5 @@
   Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA.
 */
 
-simpleManagement::mainInc('groupManagement');
+management::mainInc('groupManagement');
 ?>
diff --git a/plugins/personal/generic/class_user.inc b/plugins/personal/generic/class_user.inc
index 2e4c64cba3c1415fded7b7cbe84eb63540b30af3..30d80ddc1fd8cbf229c2927119b337c1a1fcd4aa 100644
--- a/plugins/personal/generic/class_user.inc
+++ b/plugins/personal/generic/class_user.inc
@@ -277,6 +277,7 @@ 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,
@@ -491,12 +492,6 @@ class user extends simplePlugin
     $this->was_locked = $this->attributesAccess['userPassword']->isLocked();
   }
 
-  function is_this_account($attrs)
-  {
-    /* Only inetOrgPerson is needed, it has the two others as SUP classes */
-    return (isset($attrs['objectClass']) && in_array_ics('inetOrgPerson', $attrs['objectClass']));
-  }
-
   function resetCopyInfos()
   {
     parent::resetCopyInfos();