Code

Backport from trunk
[gosa.git] / gosa-plugins / systems / admin / systems / class_systemManagement.inc
index 7bd00a727f58505bacf48d41e0884efdaea3f6bb..39835f2275e1d0819fc96b759934d2b43b9d3444 100644 (file)
  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  */
 
-class systems extends plugin
+
+#
+# NewDevices 
+# -> Edit
+#     |- SelectDeviceType()        (Allows to select target SystemType and OGroup)
+# -> Save
+#     |-> systemTypeChosen()       (Queue entry to be activated) 
+#     |-> handleActivationQueue()  (Now acticvate queued objects)
+#       |-> Ogroup selected   
+#       | |-> Try to adapt values from ogroup and save directly.
+#       |
+#       |-> NO Ogroup selected
+#       |  |-> Open dialogs of the target system type and allow modifcations.
+#       |
+#       |->activate_new_device()   (Finally activate the device - FAIsate=..)
+#
+#
+# NewArpDevices (NewUnknwonDevices )
+# -> Edit
+#     |-> editEntry - ArpNewDeviceTabs
+# -> Save       
+#     |-> NO gotoIntegeration 
+#     | |-> Save DHCP and DNS entries, then remove the source entry from ldap.
+#     |
+#     |-> gotoIntegration selected (Handle object like a NewDevice now)
+#     |-> systemTypeChosen()       (Queue entry to be activated)
+#     |-> handleActivationQueue()  (Now acticvate queued objects)
+#       |-> Ogroup selected
+#       | |-> Try to adapt values from ogroup and save directly.
+#       |
+#       |-> NO Ogroup selected
+#       |  |-> Open dialogs of the target system type and allow modifcations.
+#       |
+#       |->activate_new_device()   (Finally activate the device - FAIsate=..)
+#
+class systemManagement extends management
 {
-  /* Definitions */
-  var $plHeadline     = "Systems";
-  var $plDescription  = "This does something";
-  var $plIcon         = "plugins/systems/images/plugin.png";
-  var $departments    = array();
-
-  /* Dialog attributes */
-  var $systab   = NULL;
-  var $terminals= array();
-  var $ui       = NULL;
-  var $DivListSystem;
-  var $start_pasting_copied_objects = FALSE;
-  var $CopyPasteHandler   = NULL;
-
-  /* Arp hanlding activated */
-  var $arp_handling_active = FALSE;
-  var $last_action = "";
-
-  var $dns = array();
-
-  var $system_activation_object = ""; // The object to activate (NewDevice)
-  var $fai_activated  = FALSE;
-  var $si_active      = FALSE;
-
-  var $acl_module = array("incoming","terminal","workstation","server","printer","phone","winworkstation","component");
-
-  var $opsi = NULL;
-
-  function systems (&$config, $ui)
-  {
-    /* Save configuration for internal use */
-    $this->config= $config;
-    $this->ui= $ui;
-
-    /* Add FAIstate to attributes if FAI is activated */
-    $tmp = $this->config->search("faiManagement", "CLASS",array('menu','tabs'));
-    if(!empty($tmp)){
-      $this->fai_activated = TRUE;
-    }
+    var $plHeadline     = "Systems";
+    var $plDescription  = "Manage systems, their services and prepare them for use with GOsa";
+    var $plIcon  = "plugins/systems/images/plugin.png";
+
+    // Tab definition 
+    protected $tabClass = "";
+    protected $tabType = "";
+    protected $aclCategory = "";
+    protected $aclPlugin   = "";
+    protected $objectName   = "system";
+    protected $objectInfo = array();
+    protected $opsi = NULL;
+    protected $activationQueue  = array();
+
+    function __construct($config,$ui)
+    {
+        $this->config = $config;
+        $this->ui = $ui;
+
+        // Set storage points 
+        $tD = $this->getObjectDefinitions(); 
+        $sP = array();
+        foreach($tD as $entry){
+            if(!empty($entry['ou']))
+                $sP[] = $entry['ou'];
+        }
 
-    /* Copy & Paste enabled ?*/
-    if ($this->config->get_cfg_value("copyPaste") == "true"){
-      $this->CopyPasteHandler = new CopyPasteHandler($this->config);
-    }
+        $this->storagePoints = array_unique($sP);
 
-    /* Check whether the arp handling active or not */
-    if($this->config->search("ArpNewDevice","CLASS",array('tabs')) != ""){
-      $this->arp_handling_active = TRUE;
-    }
-
-    /* Check if we are able to communicate with the GOsa supprot daemon 
-     */
-    if(class_available("gosaSupportDaemon")){
-      $o = new gosaSupportDaemon();
-      $this->si_active = $o->connect() && class_available("DaemonEvent");
-    }
+        // Build filter
+        if (session::global_is_set(get_class($this)."_filter")){
+            $filter= session::global_get(get_class($this)."_filter");
+        } else {
+            $filter = new filter(get_template_path("system-filter.xml", true));
+            $filter->setObjectStorage($this->storagePoints);
+        }
+        $this->setFilter($filter);
+
+        // Build headpage
+        $headpage = new listing(get_template_path("system-list.xml", true));
+        $headpage->registerElementFilter("systemRelease", "systemManagement::systemRelease");
+        $headpage->registerElementFilter("filterSystemDescription", "systemManagement::filterSystemDescription");
+        $headpage->registerElementFilter("filterLink", "systemManagement::filterLink");
+        $headpage->setFilter($filter);
+        $filter->setConverter('systemManagement::incomingFilterConverter');
+
+        // Register Daemon Events
+        if(class_available("DaemonEvent") && class_available("gosaSupportDaemon")){
+            $events = DaemonEvent::get_event_types(SYSTEM_EVENT | HIDDEN_EVENT);
+            foreach($events['TRIGGERED'] as $name => $data){
+                $this->registerAction("T_".$name,"handleEvent");
+                $this->registerAction("S_".$name,"handleEvent");
+            }
+            $this->registerAction("activateMultiple","activateMultiple");
+        }
+        $this->registerAction("saveEvent","saveEventDialog");
+        $this->registerAction("createISO","createISO");
+        $this->registerAction("initiateISOcreation","initiateISOcreation");
+        $this->registerAction("performIsoCreation","performIsoCreation");
+        $this->registerAction("systemTypeChosen","systemTypeChosen");
+        $this->registerAction("handleActivationQueue","handleActivationQueue");
+
+        $this->registerAction("new_device",           "newEntry");
+        $this->registerAction("new_goServer",         "newEntry");
+        $this->registerAction("new_gotoWorkstation",  "newEntry");
+        $this->registerAction("new_gotoTerminal",     "newEntry");
+        $this->registerAction("new_gotoPrinter",      "newEntry");
+        $this->registerAction("new_goFonHardware",    "newEntry");
+        $this->registerAction("new_ieee802Device",    "newEntry");
+        $this->registerAction("new_FAKE_OC_OpsiHost", "newEntry");
+
+        $this->registerAction("setPassword", "setPassword");
+        $this->registerAction("passwordChangeConfirmed", "passwordChangeConfirmed");
+
+        // Add copy&paste and snapshot handler.
+        if ($this->config->boolValueIsTrue("core", "copyPaste")){
+            $this->cpHandler = new CopyPasteHandler($this->config);
+        }
+        if($this->config->get_cfg_value("core","enableSnapshots") == "true"){
+            $this->snapHandler = new SnapshotHandler($this->config);
+        }
 
-    /* Check if we are able to communicate with the GOsa supprot daemon 
-     */
-    if(class_available("opsi")){
-      $this->opsi = new opsi($this->config);
-    }
+        // Check if we are able to communicate with the GOsa supprot daemon
+        if(class_available("gosaSupportDaemon")){
+            $o = new gosaSupportDaemon();
+            $this->si_active = $o->connect() && class_available("DaemonEvent");
+        }
 
-    /* Creat dialog object */
-    $this->DivListSystem = new divListSystem($this->config,$this);
-  }
-
-
-  function execute()
-  {
-    /* Call parent execute */
-    plugin::execute();
-
-    session::set('LOCK_VARS_TO_USE',array("/^system_edit_/i","/^system_del_/","/^act/","/^id/","/^item_selected/","/^remove_multiple_systems/","/^menu_action/"));
-
-    /********************
-      Check for functional posts, edit|delete|add|... system devices 
-     ********************/
-    $s_action     = "";                       // Contains the action to proceed
-    $s_entry      = "";                       // The value for s_action
-    $base_back    = "";                       // The Link for Backbutton
-    $smarty       = get_smarty();
-
-    /* Test Posts */
-    foreach($_POST as $key => $val){
-      // Post for delete
-      if(preg_match("/system_del.*/",$key)){
-        $s_action = "del";
-        $s_entry  = preg_replace("/system_del_/i","",$key);
-        // Post for edit
-      }elseif(preg_match("/system_edit_.*/",$key)){
-        $s_action="edit";
-        $s_entry  = preg_replace("/system_edit_/i","",$key);
-        // Post for new
-      }elseif(preg_match("/system_new.*/",$key)){
-        $s_action="new";
-      }elseif(preg_match("/system_tplnew.*/i",$key)){
-        $s_action="new_tpl";
-      }elseif(preg_match("/system_setpwd_.*/i",$key)){
-        $s_action="change_pw";
-        $s_entry  = preg_replace("/system_setpwd_/i","",$key);
-      }elseif(preg_match("/gen_cd_.*/i",$key)){
-        $s_action="gen_cd";
-        $s_entry  = preg_replace("/gen_cd_/i","",$key);
-      }elseif(preg_match("/^copy_.*/",$key)){
-        $s_action="copy";
-        $s_entry  = preg_replace("/^copy_/i","",$key);
-      }elseif(preg_match("/^cut_.*/",$key)){
-        $s_action="cut";
-        $s_entry  = preg_replace("/^cut_/i","",$key);
-      }
-    }
-   
-    /* remove image tags from posted entry  (posts looks like this 'name_x')*/
-    $s_entry  = preg_replace("/_.$/","",$s_entry);
-
-    /* Edit was requested by pressing the name(link) of an item */
-    if((isset($_GET['act']))&&($_GET['act']=="edit_entry")){
-      $s_action ="edit";
-      $s_entry  = $_GET['id'];
-    }
-    /* Create options */
-    if(isset($_POST['menu_action']) && preg_match("/^newsystem_/",$_POST['menu_action'])){
-      $s_action = "newsystem";
-      $s_entry  = preg_replace("/^newsystem_/","",$_POST['menu_action']);
+        // Check if we are able to communicate with the GOsa supprot daemon
+        if(class_available("opsi")){
+            $this->opsi = new opsi($this->config);
+        }
+        parent::__construct($config, $ui, "systems", $headpage);
     }
 
-    /* handle C&P from layers menu */
-    if(isset($_POST['menu_action']) && preg_match("/^multiple_copy_systems/",$_POST['menu_action'])){
-      $s_action = "copy_multiple";
-    }
-    if(isset($_POST['menu_action']) && preg_match("/^multiple_cut_systems/",$_POST['menu_action'])){
-      $s_action = "cut_multiple";
-    }
-    if(isset($_POST['menu_action']) && preg_match("/^editPaste/",$_POST['menu_action'])){
-      $s_action = "editPaste";
-    }
 
-    /* Handle daemon events */
-    if(isset($_POST['menu_action']) && preg_match("/^trigger_event_/",$_POST['menu_action'])){
-      $s_action = $_POST['menu_action'];
-    }
-    
-    /* Handle daemon events */
-    if(isset($_POST['menu_action']) && preg_match("/^schedule_event_/",$_POST['menu_action'])){
-      $s_action = $_POST['menu_action'];
+    /*! \brief  Act on password change requests.
+     */
+    function setPassword($action,$target)
+    {
+        if(count($target) == 1){
+            $tDefs= $this->getObjectDefinitions();
+            $headpage = $this->getHeadpage();
+            $dn = array_pop($target);
+            $type = $headpage->getType($dn);
+            $entry = $headpage->getEntry($dn);
+            $ui       = get_userinfo();
+            $smarty = get_smarty();
+            if(in_array_strict("FAKE_OC_PWD_changeAble", $entry['objectClass'])){
+                $acl = $tDefs[$type]['aclCategory'].'/'.$tDefs[$type]['aclClass'];
+                $tabacl   = $ui->get_permissions($dn,$acl,"userPassword");
+                if(preg_match("/w/",$tabacl)){
+                    $this->dn= $dn;
+                    set_object_info($this->dn);
+                    return ($smarty->fetch(get_template_path('password.tpl', TRUE)));
+                }else{
+                    msg_dialog::display(_("Permission error"), _("You have no permission to change this password!"), ERROR_DIALOG);
+                }
+            }
+        }
     }
 
-    /* handle remove from layers menu */
-    if(isset($_POST['menu_action']) && preg_match("/^remove_multiple/",$_POST['menu_action'])){
-      $s_action = "del_multiple";
-    }
-    
-    /* Handle instant actions from layers menu */
-    foreach (array("halt", "reboot", "reinstall", "update", "wake") as $act){
-           if(isset($_POST['menu_action']) && preg_match("/^${act}_multiple/",$_POST['menu_action'])){
-             $s_action = "${act}_multiple";
-           }
-    }
 
-    /* Activate multiple machines */
-    if(isset($_POST['menu_action']) && preg_match("/^activate_multiple/",$_POST['menu_action'])){
-      $s_action = "activate_multiple";
+    function getAclCategories()
+    {
+        $ret = array();
+        $tDefs= $this->getObjectDefinitions();
+        foreach($tDefs as $type => $data){
+            $ret[] = $data['aclCategory'];
+        }
+        return(array_unique($ret));
     }
 
-    /* Check for exeeded sizelimit */
-    if (($message= check_sizelimit()) != ""){
-      return($message);
-    }
 
-    /* Try to get informations about what kind of system to create */
-    if ($s_action=="new") {
-      return ($smarty->fetch(get_template_path('chooser.tpl', TRUE)));
-    }
-
-    /* Incoming handling  
-     * If someone made a systemtype and ogroup selection 
-     * Display the new requested entry type ... servtab  in case of server and so on.
+    /*! \brief  This method is used to queue and process copy&paste actions.
+     *          Allows to copy, cut and paste mutliple entries at once.
+     *  @param  String  'action'  The name of the action which was the used as trigger.
+     *  @param  Array   'target'  A list of object dns, which should be affected by this method.
+     *  @param  Array   'all'     A combination of both 'action' and 'target'.
      */
-    if(isset($_POST['SystemTypeChoosen'])){
-      $s_action = "SelectedSystemType";
-    }
+    function copyPasteHandler($action="",$target=array(),$all=array(),
+            $altTabClass ="", $altTabType = "", $altAclCategory="",$altAclPlugin="")
+    {
+        // Return without any actions while copy&paste handler is disabled.
+        if(!is_object($this->cpHandler))  return("");
 
-    /********************
-      Copy & Paste Handling  ...
-     ********************/
+        // Save user input
+        $this->cpHandler->save_object();
 
-    /* Display the copy & paste dialog, if it is currently open */
-    $ret = $this->copyPasteHandling_from_queue($s_action,$s_entry);
-    if($ret){
-      return($ret);
-    }
-  
-
-    /********************
-      Create FAI CD ...   
-     ********************/
-    if ($s_action=="gen_cd"){
-      $this->dn= $this->terminals[$s_entry]['dn'];
-      set_object_info($this->dn);
-      return ($smarty->fetch(get_template_path('goto/gencd.tpl', TRUE)));
-    }
+        // Add entries to queue
+        if($action == "copy" || $action == "cut"){
 
+            $tDefs= $this->getObjectDefinitions();
+            $headpage = $this->getHeadpage();
+            $ui       = get_userinfo();
+            $this->cpHandler->cleanup_queue();
+            foreach($target as $dn){
 
-    /* Start CD-Creation */
-    if ((isset($_POST["cd_create"])) && !empty($this->dn)){
-      $smarty->assign("src", "?plug=".$_GET['plug']."&PerformIsoCreation");
-      return ($smarty->fetch(get_template_path('goto/gencd_frame.tpl', TRUE)));
-    }
+                $type = $headpage->getType($dn);
+                $entry = $headpage->getEntry($dn);
 
+                $aclCategory = $tDefs[$type]['aclCategory'];
+                $aclPlugin = $tDefs[$type]['aclClass'];
+                $tabClass = $tDefs[$type]['tabClass'];
+                $tabType = $tDefs[$type]['tabDesc'];
 
-    if ($this->dn != "" && isset($_GET['PerformIsoCreation'])){
-
-      $return_button   = "<form method='get' action='main.php' target='_parent'>
-        <input type='submit' value='"._("Back")."'>
-        <input type='hidden' name='plug' value='".$_GET['plug']."'/>
-        </form>";
-
-      $dsc             = array(0 => array("pipe", "r"), 1 => array("pipe", "w"), 2 => array("pipe", "w"));
-
-      /* Get and check command */
-      $command= $this->config->search("workgeneric", "SYSTEMISOHOOK",array('tabs'));
-      
-      if (check_command($command)){
-        @DEBUG (DEBUG_SHELL, __LINE__, __FUNCTION__, __FILE__, $command, "Execute");
-
-        /* Print out html introduction */
-        echo '  <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2//EN">
-          <html>
-          <head>
-          <title></title>
-          <style type="text/css">@import url("themes/default/style.css");</style>
-          <script language="javascript" src="include/focus.js" type="text/javascript"></script>
-          </head>
-          <body style="background: none; margin:4px;" id="body" >
-          <pre>';
-
-        /* Open process handle and check if it is a valid process */
-        $process= proc_open($command." '".$this->dn."'", $dsc, $pipes);
-        if (is_resource($process)) {
-          fclose($pipes[0]);
-
-          /* Print out returned lines && write JS to scroll down each line */
-          while (!feof($pipes[1])){
-            $cur_dat = fgets($pipes[1], 1024);
-            echo $cur_dat;
-            echo '<script language="javascript" type="text/javascript">scrollDown2();</script>' ;
-            flush();
-          }
+                if($action == "copy" && $this->ui->is_copyable($dn,$aclCategory,$aclPlugin)){
+                    $this->cpHandler->add_to_queue($dn,"copy",$tabClass,$tabType,$aclCategory,$this);
+                    @DEBUG (DEBUG_TRACE, __LINE__, __FUNCTION__, __FILE__,$dn,"Entry copied!");
+                }
+                if($action == "cut" && $this->ui->is_cutable($dn,$aclCategory,$aclPlugin)){
+                    $this->cpHandler->add_to_queue($dn,"cut",$tabClass,$tabType,$aclCategory,$this);
+                    @DEBUG (DEBUG_TRACE, __LINE__, __FUNCTION__, __FILE__,$dn,"Entry cutted!");
+                }
+            }
         }
 
-        /* Get error string && close streams */
-        $buffer= stream_get_contents($pipes[2]);
-
-        fclose($pipes[1]);
-        fclose($pipes[2]);
-        echo "</pre>";
-
-        /* Check return code */
-        $ret= proc_close($process);
-        if ($ret != 0){
-          echo "<h1 style='color:red'>"._("Creating the image failed. Please see the report below.")."</h1>";
-          echo "<pre style='color:red'>$buffer</pre>";
+        // Initiate pasting
+        if($action == "paste"){
+            $this->cpPastingStarted = TRUE;
         }
 
+        // Display any c&p dialogs, eg. object modifications required before pasting.
+        if($this->cpPastingStarted && $this->cpHandler->entries_queued()){
+            $headpage = $this->getHeadpage();
+            $this->cpHandler->SetVar("base",$headpage->getBase());
+            $data = $this->cpHandler->execute();
+            if(!empty($data)){
+                return($data);
+            }
+        }
 
-
-        echo $return_button."<br>";
-
-      } else {
-        $tmp= "<h1 style='color:red'>".sprintf(_("Command '%s', specified for ISO creation doesn't seem to exist."), $command)."</h1>";
-        echo $tmp;
-      }
-
-      /* Scroll down completly */
-      echo '<script language="javascript" type="text/javascript">scrollDown2();</script>' ;
-      echo '</body></html>';
-      flush();
-      exit;
+        // Automatically disable pasting process since there is no entry left to paste.
+        if(!$this->cpHandler->entries_queued()){
+            $this->cpPastingStarted = FALSE;
+        }
+        return("");
     }
 
 
-    /********************
-      New Device handling  (Ogroup/System select dialog.)
-     ********************/
-
-    /*  All objects that have to be activated are listed in 
-          $this->system_activation_object[] = "dn";
-      
-        If there is an object group selected we simply adopt all
-         settings from these group and then directly save the entry again.
-        If no object group was selected, then we keep the "edit" dialog of 
-         the target system opened to allow to edit the objects attributes.
+    /*! \brief  Password change confirmed, now try to change the systems pwd.
      */
-  
-    if($s_action == "SelectedSystemType"){
-
-      /* Possible destination system types 
-       */
-      $tabs = $this->get_tab_defs();
-
-      /* Remember dialog selection.
-       */
-      $selected_group = $_POST['ObjectGroup'];
-      $selected_system = $_POST['SystemType'];
-
-      $this->systab = NULL;
-
-      /* Check if system type exists. It should! */
-      if(isset($tabs[$selected_system])){
-
-        /* Get tab informations */
-        $class    = $tabs[$selected_system]["CLASS"];
-        $tabname  = $tabs[$selected_system]["TABNAME"];
-        $tabclass = $tabs[$selected_system]["TABCLASS"];
-        $acl_cat  = $tabs[$selected_system]["ACLC"];
-
-
-        if(!class_available($tabclass)){
-          msg_dialog::display(_("Error"), msgPool::class_not_found($tabclass), ERROR_DIALOG);
+    function passwordChangeConfirmed()
+    {
+        $tDefs= $this->getObjectDefinitions();
+        $headpage = $this->getHeadpage();
+        $type = $headpage->getType($this->dn);
+        $entry = $headpage->getEntry($this->dn);
+        $ui       = get_userinfo();
+        $smarty = get_smarty();
+
+        if(!in_array_strict('FAKE_OC_PWD_changeAble', $entry['objectClass'])){
+            trigger_error("Tried to change pwd, for invalid object!");
+        }elseif (get_post('new_password') != get_post('repeated_password')){
+            msg_dialog::display(_("Error"), 
+                    _("The passwords you've entered as 'New password' and 'Repeated password' do not   match!"), ERROR_DIALOG);
+            return($smarty->fetch(get_template_path('password.tpl', TRUE)));
         }else{
+            $acl = $tDefs[$type]['aclCategory'].'/'.$tDefs[$type]['aclClass'];
+            $tabacl   = $ui->get_permissions($this->dn,$acl,"userPassword");
 
-          /* Go through all objects that should be activated 
-              Contains alls object dns that have to be activated ("New Devices" not unknown)
-            */
-          foreach($this->system_activation_object as $key => $dn){
-
-            /* Remove entry from list, to avoid page-reload problems */
-            unset($this->system_activation_object[$key]);
-
-            /* Load permissions for selected 'dn' and check if
-               we're allowed to create this 'dn' */
-            $this->dn = $dn;
-            $ui       = get_userinfo();
-            $tabacl   = $ui->get_permissions($this->dn,$acl_cat."/".$tabname);
-
-            /* We are allowed to create the requested system type */
-            if(preg_match("/c/",$tabacl)){
-              $this->systab= new $tabclass($this->config, $this->config->data['TABS'][$class], $this->dn,$selected_system);
-              $this->systab->set_acl_base($this->DivListSystem->selectedBase);
-              $this->systab->by_object[$tabname]->base = $this->DivListSystem->selectedBase;
-              $this->systab->base = $this->DivListSystem->selectedBase;
-
-              /* This will be used when the object is saved, to set FAIstate to 'install'
-                  and to preset maybe other attributes.
-               */
-              $this->systab->was_activated = TRUE;
-
-              /* Assign some default values for opsi hosts 
-               */
-              if($this->systab instanceOf opsi_tabs){
+            // Check acls
+            if(!preg_match("/w/",$tabacl)){
+                msg_dialog::display(_("Permission error"), _("You have no permission to change this password!"), ERROR_DIALOG);
+            }else{
                 $ldap = $this->config->get_ldap_link();
-                $ldap->cat($dn);
-                $source_attrs = $ldap->fetch();
-                foreach(array("macAddress" => "mac" ,"cn" => "hostId","description" => "description") as $src => $attr){
-                  if(isset($source_attrs[$src][0])){
-                    $this->systab->by_object['opsiGeneric']->$attr = $source_attrs[$src][0];
-                  }
-                }
-              }
-
-              if($selected_group != "none"){
-
-                /*******
-                 * Set gotoMode to active if there was an ogroup selected. 
-                 */
-                $found = false;
-                foreach(array("workgeneric"=>"active","servgeneric"=>"active","termgeneric"=>"active") as $tab => $value){
-                  if(isset($this->systab->by_object[$tab]->gotoMode)) {
-                    $found = true;
-                    $this->systab->by_object[$tab]->gotoMode = $value;
-                  }
+                $ldap->cd($this->dn);
+                $ldap->cat($this->dn);
+                $old_attrs = $ldap->fetch();
+
+                $attrs= array();
+                if ($_POST['new_password'] == ""){
+
+                    /* Remove password attribute
+                     */
+                    if(in_array_strict("simpleSecurityObject",$old_attrs['objectClass'])){
+                        $attrs['objectClass'] = array();
+                        for($i = 0 ; $i < $old_attrs['objectClass']['count'] ; $i ++){
+                            if(!preg_match("/simpleSecurityObject/i",$old_attrs['objectClass'][$i])){
+                                $attrs['objectClass'][] = $old_attrs['objectClass'][$i];
+                            }
+                        }
+                    }
+                    $attrs['userPassword']= array();
+                } else {
+
+                    /* Add/modify password attribute
+                     */
+                    if(!in_array_strict("simpleSecurityObject",$old_attrs['objectClass'])){
+                        $attrs['objectClass'] = array();
+                        for($i = 0 ; $i < $old_attrs['objectClass']['count'] ; $i ++){
+                            $attrs['objectClass'][] = $old_attrs['objectClass'][$i];
+                        }
+                        $attrs['objectClass'][] = "simpleSecurityObject";
+                    }
+
+                    if(class_available("passwordMethodCrypt")){
+                        $pwd_m = new passwordMethodCrypt($this->config);
+                        $pwd_m->set_hash("crypt/md5");
+                        $attrs['userPassword'] = $pwd_m->generate_hash(get_post('new_password'));
+                    }else{
+                        msg_dialog::display(_("Password method"),_("Password method crypt is missing. Cannot set system password."));
+                        $attrs = array();
+                    }
                 }
-                if(!$found){
-                  msg_dialog::display(_("Internal error"), _("Cannot set mode to 'active'!"), ERROR_DIALOG);
-                }
-
-                /*******
-                 * Update object group membership
-                 */
-                $og = new ogroup($this->config,$selected_group);
-                if($og){
-                  $og->AddDelMembership($this->systab->dn);
-                  $og->save();
-                }
-
-                /*******
-                 * Set default system specific attributes 
-                 */
-                foreach (array("workservice", "termservice") as $cls){
-                  if (isset($this->systab->by_object[$cls])){
-                    $this->systab->by_object[$cls]->gotoXMouseport= "";
-                    $this->systab->by_object[$cls]->gotoXMouseType= "";
-                    $this->systab->by_object[$cls]->gotoXResolution= "";
-                    $this->systab->by_object[$cls]->gotoXColordepth= "";
-                  }
+                $ldap->modify($attrs);
+                if (!$ldap->success()){
+                    msg_dialog::display(_("LDAP error"), msgPool::ldaperror($ldap->get_error(), $this->dn, LDAP_MOD, $type));
+                }else{
+                    if(class_available($tDefs[$type]['plugClass'])){
+                        $plug = $tDefs[$type]['plugClass'];
+                        $p = new $plug($this->config,$this->dn);
+                        $p->handle_post_events("modify");
+                    }
                 }
-
-                // Enable activation
-                foreach (array("servgeneric", "workgeneric", "termgeneric") as $cls){
-                  if (isset($this->systab->by_object[$cls])){
-                    $this->systab->by_object[$cls]->auto_activate= TRUE;
-                  }
-                }
-
-                // Enable sending of LDAP events
-                if (isset($this->systab->by_object["workstartup"])){
-                  $this->systab->by_object["workstartup"]->gotoLdap_inherit= TRUE;
-                }
-              }
-
-              /* Don't save directly if there is no objectGroup selected.
-                 The user will then be able to configure the missing attributes 
-                 on his own.
-               */
-              if($selected_group != "none"){
-                $this->systab->save();
-    
-                /* Post handling for activated new devices 
-                 */
-                $this->activate_new_device($this->systab->dn);
-                $this->systab = NULL;
-
-                if(!isset($ldap)){
-                  $ldap = $this->config->get_ldap_link();
-                }
-                $ldap->cd ($this->dn);
-                $ldap->cat($this->dn, array('dn'));
-                if(count($ldap->fetch())){
-                  $ldap->cd($this->dn);
-                  $ldap->rmDir($this->dn);
-                }
-              }
-            }else{
-              msg_dialog::display(_("Error"), msgPool::permCreate(), ERROR_DIALOG);
+                new log("security","systems/".get_class($this),$this->dn,array_keys($attrs),$ldap->get_error());
             }
-          }
+            set_object_info();
         }
-      }
     }
 
 
-    if (isset($_POST['create_system'])||$s_action=="newsystem") {
-    
-      $this->last_action = "";
-  
-      /* If the current entry is an incoming object 
-       * $sw = System type as posted in new incoming handling dialog 
-       */ 
-      if(isset($_POST['system'])){
-        $sw = $_POST['system'];
-      }else{
-        $sw = $s_entry;
-      }
-      $this->dn= "new";
-
-      $tabs = $this->get_tab_defs();
-  
-      if(isset($tabs[$sw])){
-        $class    = $tabs[$sw]["CLASS"];
-        $tabname  = $tabs[$sw]["TABNAME"];
-        $tabclass = $tabs[$sw]["TABCLASS"];
-        $acl_cat  = $tabs[$sw]["ACLC"];
-
-        /* Load permissions for selected 'dn' and check if
-           we're allowed to remove this 'dn' */
-        $ui       = get_userinfo();
-        $tabacl   = $ui->get_permissions($this->DivListSystem->selectedBase,$acl_cat."/".$tabname);
-        if(preg_match("/c/",$tabacl)){
-
-          if(!class_available($tabclass)){
-            msg_dialog::display(_("Error"), msgPool::class_not_found($tabclass), ERROR_DIALOG);
-          }else{
-            $this->systab= new $tabclass($this->config, $this->config->data['TABS'][$class], $this->dn,$sw);
-            $this->systab->set_acl_base($this->DivListSystem->selectedBase);
-            $this->systab->by_object[$tabname]->base = $this->DivListSystem->selectedBase;
-            $this->systab->base = $this->DivListSystem->selectedBase;
-          }
-        }else{
-          msg_dialog::display(_("Error"), msgPool::permCreate(), ERROR_DIALOG);
-        }
-      }
-    }
+    /*! \brief  The method gets called when somebody clicked the CD icon 
+     *           in the system listing. 
+     *          A confirmation will be shown to acknowledge the creation.
+     */
+    function createISO($action,$target)
+    {
+        if(count($target) == 1){
+            $smarty = get_smarty();
+            $this->dn= array_pop($target);
+            set_object_info($this->dn);
+            return ($smarty->fetch(get_template_path('goto/gencd.tpl', TRUE)));
 
-    /********************
-      System activation
-     ********************/
-
-    /* User wants to edit data? */
-    if (($s_action == "activate_multiple") && (!isset($this->systab->config))){
-      $this->system_activation_object = array();
-      foreach($this->list_get_selected_items() as $id) {
-        $obj = $this->terminals[$id];
-        $type= $this->get_system_type($obj);
-        if($type == "NewDevice"){
-          $this->system_activation_object[] = $obj['dn'];
         }
-      }
-      if(count($this->system_activation_object)){
-        $this->systab = new SelectDeviceType($this->config,$this->system_activation_object) ;
-      }
     }
 
 
-    /********************
-      Edit system ...   
-     ********************/
-
-    /* User wants to edit data? */
-    if (($s_action == "edit") && (!isset($this->systab->config))){
-      $this->last_action = "";
-      $this->dn= $this->terminals[$s_entry]['dn'];
-
-      /* Check locking, save current plugin in 'back_plugin', so
-         the dialog knows where to return. */
-      if (($user= get_lock($this->dn)) != ""){
-        return(gen_locked_message ($user, $this->dn,TRUE));
-      }
-
-      /* Find out more about the object type */
-      $attrs = $this->terminals[$s_entry];
-      $type= $this->get_system_type($attrs);
-     
-      /* Lock the current entry, so everyone will get the
-         above dialog */
-      $tabs = $this->get_tab_defs();
-
-      if($type == "ArpNewDevice"){
-        if(!class_available("ArpNewDeviceTabs")){
-          msg_dialog::display(_("Error"), msgPool::class_not_found("ArpNewDevice"), ERROR_DIALOG);
-        }else{
-          add_lock ($this->dn, $this->ui->dn);
-          $this->systab = new ArpNewDeviceTabs($this->config,$this->config->data['TABS']['ARPNEWDEVICETABS'],$this->dn);
-        }
-      }elseif($type == "NewDevice"){
-        if(!class_available("SelectDeviceType")){
-          msg_dialog::display(_("Error"), msgPool::class_not_found("SelectDeviceType"), ERROR_DIALOG);
-        }else{
-          add_lock ($this->dn, $this->ui->dn);
-          $this->system_activation_object= array($this->dn);
-          $this->systab = new SelectDeviceType($this->config,$this->dn) ;
-
-          // see condition  -$s_action == "SelectedSystemType"-  for further handling
-        }
-      }elseif(isset($tabs[$type])){
-
-        $class    = $tabs[$type]["CLASS"];
-        $acl_cat  = $tabs[$type]["ACLC"];
-        $tabclass = $tabs[$type]["TABCLASS"];
-
-        if(!class_available($tabclass)){
-          msg_dialog::display(_("Error"), msgPool::class_not_found($tabclass), ERROR_DIALOG);
-        }else{
-          add_lock ($this->dn, $this->ui->dn);
-          $this->systab= new $tabclass($this->config, $this->config->data['TABS'][$class], $this->dn,$acl_cat);
-          $this->systab->set_acl_base($this->dn);
-          set_object_info($this->dn);
-        }
-      }else{ 
-        msg_dialog::display(_("Error"), _("Editing this type of object is not supported yet!"), ERROR_DIALOG);
-        $this->remove_lock();
-      }
+    /*! \brief  Once the user has confirmed the ISO creation in 'createISO',
+     *           this method gets called. 
+     *          An iFrame is shown which then used 'performIsoCreation' as contents. 
+     */
+    function initiateISOcreation()
+    {
+        $smarty = get_smarty();
+        $smarty->assign("src", "?plug=".$_GET['plug']."&amp;PerformIsoCreation");
+        return ($smarty->fetch(get_template_path('goto/gencd_frame.tpl', TRUE)));  
     }
 
 
-    /********************
-      Change password ...   
-     ********************/
-
-    /* Set terminals root password */
-    if ($s_action=="change_pw"){
-      $tabs = $this->get_tab_defs();
-
-      $dn   = $this->terminals[$s_entry]['dn'];
-      $type = $this->get_system_type($this->terminals[$s_entry]);
-
-      $class    = $tabs[$type]["CLASS"];
-      $acl      = $tabs[$type]["ACL"];
-      $tabclass = $tabs[$type]["TABCLASS"];
-      $ui       = get_userinfo();
-      $tabacl   = $ui->get_permissions($dn,$acl,"userPassword");
-      if(preg_match("/w/",$tabacl)){
-        $this->dn= $this->terminals[$s_entry]['dn'];
-        set_object_info($this->dn);
-        return ($smarty->fetch(get_template_path('password.tpl', TRUE)));
-      }else{
-        msg_dialog::display(_("Permission error"), _("You have no permission to change this password!"), ERROR_DIALOG);
-      }
-    }
+    /*! \brief  ISO creation confirmed and iFrame is visible, now create the ISO 
+     *           and display the status to fill the iFrame.
+     */
+    function performIsoCreation()
+    {
+        $return_button   = "<form method='get' action='main.php' target='_parent'>
+            <input type='submit' value='"._("Back")."'>
+            <input type='hidden' name='plug' value='".$_GET['plug']."'/>
+            </form>";
+
+        $dsc   = array(0 => array("pipe", "r"), 1 => array("pipe", "w"), 2 => array("pipe", "w"));
+
+        /* Get and check command */
+        $command= $this->config->get_cfg_value("workgeneric", "systemIsoHook");
+        if (check_command($command)){
+            @DEBUG (DEBUG_SHELL, __LINE__, __FUNCTION__, __FILE__, $command, "Execute");
+
+            /* Print out html introduction */
+            echo '  <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2//EN">
+                <html>
+                <head>
+                <title></title>
+                <style type="text/css">@import url("themes/default/style.css");</style>
+                <script language="javascript" src="include/focus.js" type="text/javascript"></script>
+                </head>
+                <body style="background: none; margin:4px;" id="body" >
+                <pre>';
+
+            /* Open process handle and check if it is a valid process */
+            $process= proc_open($command." '".$this->dn."'", $dsc, $pipes);
+            if (is_resource($process)) {
+                fclose($pipes[0]);
+
+                /* Print out returned lines && write JS to scroll down each line */
+                while (!feof($pipes[1])){
+                    $cur_dat = fgets($pipes[1], 1024);
+                    echo $cur_dat;
+                    echo '<script language="javascript" type="text/javascript">scrollDown2();</script>' ;
+                    flush();
+                }
+            }
 
+            /* Get error string && close streams */
+            $buffer= stream_get_contents($pipes[2]);
 
-    /********************
-      Password change finish, but check if entered data is ok 
-     ********************/
+            fclose($pipes[1]);
+            fclose($pipes[2]);
+            echo "</pre>";
 
-    /* Correctly specified? */
-    if (isset($_POST['password_finish'])){
-      if ($_POST['new_password'] != $_POST['repeated_password']){
-        msg_dialog::display(_("Error"), _("The passwords you've entered as 'New password' and 'Repeated password' do not match!"), ERROR_DIALOG);
-        return($smarty->fetch(get_template_path('password.tpl', TRUE)));
-      }
-    }
+            /* Check return code */
+            $ret= proc_close($process);
+            if ($ret != 0){
+                echo "<h1 style='color:red'>"._("Creating the image failed. Please see the report below.")."</h1>";
+                echo "<pre style='color:red'>$buffer</pre>";
+            }
+            echo $return_button."<br>";
+        } else {
+            $tmp= "<h1 style='color:red'>".sprintf(_("Command '%s', specified for ISO creation doesn't seem to exist."), $command)."</h1>";
+            echo $tmp;
+            echo $return_button."<br>";
+        }
 
-    /********************
-      Password change finish
-     ********************/
+        /* Scroll down completly */
+        echo '<script language="javascript" type="text/javascript">scrollDown2();</script>' ;
+        echo '</body></html>';
+        flush();
+        exit;
+    }
 
-    /* Change terminal password */
-    if (isset($_POST['password_finish']) && 
-        $_POST['new_password'] == $_POST['repeated_password']){
 
-      /* Check if user is allowed to set password */
-      $tabs = $this->get_tab_defs();
+    /*! \brief    Handle GOsa-si events
+     *            All schedules and triggered events are handled here.
+     */
+    function handleEvent($action="",$target=array(),$all=array())
+    {
+        // Detect whether this event is scheduled or triggered.
+        $triggered = TRUE;
+        if(preg_match("/^S_/",$action)){
+            $triggered = FALSE;
+        }
 
-      $type = "";
-      foreach($this->terminals as $terminal){
-        if($terminal['dn'] == $this->dn){
-          $type  = $this->get_system_type($terminal);
-          break;
+        // Detect triggere or scheduled actions 
+        $headpage = $this->getHeadpage();
+        $event = preg_replace("/^[TS]_/","",$action); 
+        if(preg_match("/^[TS]_/", $action)){
+
+            // Send special reinstall action for opsi hosts
+            if($event == "DaemonEvent_reinstall" && $this->si_active && $this->opsi){
+                foreach($target as $key => $dn){
+                    $type = $headpage->getType($dn);
+
+                    // Send Reinstall event for opsi hosts
+                    if($type == "FAKE_OC_OpsiHost"){
+                        $obj = $headpage->getEntry($dn);
+                        $this->opsi->job_opsi_install_client($obj['cn'][0],$obj['macAddress'][0]);
+                        unset($target[$key]);
+                    }
+                }
+            }
         } 
-      }
-
-      /* Type detected */
-      $allow_for = array("terminal","workstation","server","component");
-      if(!empty($type) && in_array($type,$allow_for)){
-
-        /* Get infos */
-        $plug     = $tabs[$type]["TABNAME"];
-        $acl      = $tabs[$type]["ACL"];
-        $tabclass = $tabs[$type]["TABCLASS"];
-   
-        /* Get acls */
-        $ui       = get_userinfo();
-        $tabacl   = $ui->get_permissions($this->dn,$acl,"userPassword");
 
-        /* Check acls */
-        if(preg_match("/w/",$tabacl)){
-          $ldap = $this->config->get_ldap_link();
-          $ldap->cd($this->dn);
-          $ldap->cat($this->dn);
-          $old_attrs = $ldap->fetch();
-
-          $attrs= array();
-          if ($_POST['new_password'] == ""){
-
-            /* Remove password attribute 
-             */
-            if(in_array("simpleSecurityObject",$old_attrs['objectClass'])){
-              $attrs['objectClass'] = array();
-              for($i = 0 ; $i < $old_attrs['objectClass']['count'] ; $i ++){
-                if(!preg_match("/simpleSecurityObject/i",$old_attrs['objectClass'][$i])){
-                  $attrs['objectClass'][] = $old_attrs['objectClass'][$i];
+        // Now send remaining FAI/GOsa-si events here.
+        if(count($target) && $this->si_active){
+            $mac= array();
+
+            // Collect target mac addresses
+            $ldap = $this->config->get_ldap_link();
+            $tD = $this->getObjectDefinitions();
+            $events = DaemonEvent::get_event_types(SYSTEM_EVENT);
+            $o_queue = new gosaSupportDaemon();
+            foreach($target as $dn){
+                $type = $headpage->getType($dn);
+                if($tD[$type]['sendEvents']){
+                    $obj = $headpage->getEntry($dn);
+                    if(isset($obj['macAddress'][0])){
+                        $mac[] = $obj['macAddress'][0];
+                    }
                 }
-              }
             }
-            $attrs['userPassword']= array();
-          } else {
 
-            /* Add/modify password attribute 
+            /* Skip installation or update trigerred events,
+             *  if this entry is currently processing.
              */
-            if(!in_array("simpleSecurityObject",$old_attrs['objectClass'])){
-              $attrs['objectClass'] = array();
-              for($i = 0 ; $i < $old_attrs['objectClass']['count'] ; $i ++){
-                $attrs['objectClass'][] = $old_attrs['objectClass'][$i];
-              }
-              $attrs['objectClass'][] = "simpleSecurityObject";
+            if($triggered && in_array_strict($event,array("DaemonEvent_reinstall","DaemonEvent_update"))){
+                foreach($mac as $key => $mac_address){
+                    foreach($o_queue->get_entries_by_mac(array($mac_address)) as $entry){
+                        $entry['STATUS'] = strtoupper($entry['STATUS']);
+                        if($entry['STATUS'] == "PROCESSING" &&
+                                isset($events['QUEUED'][$entry['HEADERTAG']]) &&
+                                in_array_strict($events['QUEUED'][$entry['HEADERTAG']],array("DaemonEvent_reinstall","DaemonEvent_update"))){
+                            unset($mac[$key]);
+
+                            new log("security","systems/".get_class($this),"",array(),"Skip adding 'DaemonEvent::".$type."' for mac '".$mac_address."', there is already a job in progress.");
+                            break;
+                        }
+                    }
+                }
             }
 
-            if(class_available("passwordMethodCrypt")){
-              $pwd_m = new passwordMethodCrypt($this->config);
-              $pwd_m->set_hash("crypt/md5");
-              $attrs['userPassword'] = $pwd_m->generate_hash($_POST['new_password']);
-            }else{
-              msg_dialog::display(_("Password method"),_("Password method crypt is missing. Cannot set system password."));
-              $attrs = array();
-            }
-          }
-          $ldap->modify($attrs);
-          if (!$ldap->success()){
-            msg_dialog::display(_("LDAP error"), msgPool::ldaperror($ldap->get_error(), $this->dn, LDAP_MOD, $type));
-          }else{
-            if(class_available($plug)){ 
-              $p = new $plug($this->config,$this->dn);
-              $p->handle_post_events("modify");
+            // Prepare event to be added
+            if(count($mac) && isset($events['BY_CLASS'][$event]) && $this->si_active){
+                $event = $events['BY_CLASS'][$event];
+                $this->dialogObject = new $event['CLASS_NAME']($this->config);
+                $this->dialogObject->add_targets($mac);
+
+                if($triggered){
+                    $this->dialogObject->set_type(TRIGGERED_EVENT);
+                    $o_queue->append($this->dialogObject);
+                    if($o_queue->is_error()){
+                        msg_dialog::display(_("Service infrastructure"),msgPool::siError($o_queue->get_error()),ERROR_DIALOG);
+                    }else{
+                        $this->closeDialogs();
+                    }
+                }else{
+                    $this->dialogObject->set_type(SCHEDULED_EVENT);
+                }
             }
-          }
-  
-          new log("security","systems/".get_class($this),$this->dn,array_keys($attrs),$ldap->get_error());
-        }else{
-          msg_dialog::display(_("Permission error"), _("You have no permission to change this password!"), ERROR_DIALOG);
         }
-      }else{
-        msg_dialog::display(_("Error"), _("Cannot determine object to change password!"), ERROR_DIALOG);
-      }
-      set_object_info();
     }
 
 
-    /********************
-      Delete system cancel
-     ********************/
-
-    /* Delete terminal canceled? */
-    if (isset($_POST['delete_cancel']) || isset($_POST['password_cancel'])){
-      $this->remove_lock();
-      set_object_info();
+    /*! \brief  Close all dialogs and reset the activationQueue.
+     */ 
+    function cancelEdit()
+    {
+        management::cancelEdit();
+        $this->activationQueue = array();
     }
 
 
-    /********************
-      Action(s) for MULTIPLE
-     ********************/
-
-    /********************
-      SCHEDULE action in GOsa Daemon
-     ********************/
-
-    if(preg_match("/^schedule_event_/",$s_action) || preg_match("/^trigger_event_/",$s_action)){
-      $this->dns = array();
-      $ids = $this->list_get_selected_items();
-
-      /* Handle opsi actions */
-      if($s_action == "trigger_event_DaemonEvent_reinstall"){
-        foreach($ids as $key => $id){
-          if($this->terminals[$id]['type'] == "O"){
-            $obj = $this->terminals[$id];
-            $this->opsi->job_opsi_install_client($obj['cn'][0],$obj['macAddress'][0]);
-            unset($ids[$key]);
-          }
-        }
-      }
-
-      if(count($ids) && class_available("DaemonEvent")){
-        $mac= array();
-
-        /* Collect target mac addresses */
-        $ldap = $this->config->get_ldap_link();
-        foreach($ids as $id){
-          $type = $this->get_system_type($this->terminals[$id]);
-          if(!in_array($type,array("terminal","server","workstation","opsi_client","winstation "))) continue;
-          if(isset($this->terminals[$id]['macAddress'][0])){
-            $mac[] = $this->terminals[$id]['macAddress'][0];
-          }else{
-            $ldap->cat ($this->terminals[$id]['dn'], array("macAddress"));
-            $attrs= $ldap->fetch();
-            if (isset($attrs['macAddress'][0])){
-              $mac[]= $attrs['macAddress'][0];
-            }
-          }
-        }
-        $events = DaemonEvent::get_event_types(SYSTEM_EVENT);
-        $type = preg_replace("/^[a-z]*_event_/","",$s_action);
+    /*! \brief  Save event dialogs. 
+     *          And append the new GOsa-si event.
+     */ 
+    function saveEventDialog()
+    {
         $o_queue = new gosaSupportDaemon();
-
-        /* Skip installation or update trigerred events, 
-         *  if this entry is currently processing.
-         */
-        if(preg_match("/trigger_event/",$s_action) && in_array($type,array("DaemonEvent_reinstall","DaemonEvent_update"))){
-          foreach($mac as $key => $mac_address){
-            foreach($o_queue->get_entries_by_mac(array($mac_address)) as $entry){
-
-              $entry['STATUS'] = strtoupper($entry['STATUS']);
-              if($entry['STATUS'] == "PROCESSING" && 
-                  isset($events['QUEUED'][$entry['HEADERTAG']]) && 
-                  in_array($events['QUEUED'][$entry['HEADERTAG']],array("DaemonEvent_reinstall","DaemonEvent_update"))){
-                unset($mac[$key]);
-
-                new log("security","systems/".get_class($this),"",array(),"Skip adding 'DaemonEvent::".$type."' for mac '".$mac_address."', there is already a job in progress.");
-                break;
-              }
-            }
-          }
-        }        
-
-        /* Prepare event to be added 
-         */
-        if(count($mac) && isset($events['BY_CLASS'][$type])){
-          $event = $events['BY_CLASS'][$type];
-          $this->systab = new $event['CLASS_NAME']($this->config);
-          $this->systab->add_targets($mac);
-          if(preg_match("/trigger_event/",$s_action)){
-            $this->systab->set_type(TRIGGERED_EVENT);
-          }else{
-            $this->systab->set_type(SCHEDULED_EVENT);
-          }
-        }
-      }
-    }
-
-    /* Insert scheduled events into queue */
-    if(class_available("DaemonEvent") && $this->systab instanceof DaemonEvent){
-      $this->systab->save_object();
-
-      /* Save event 
-       */
-      if(isset($_POST['save_event_dialog']) || $this->systab->get_type() == TRIGGERED_EVENT){
-        $o_queue = new gosaSupportDaemon();
-        $o_queue->append($this->systab);
+        $o_queue->append($this->dialogObject);
         if($o_queue->is_error()){
-          msg_dialog::display(_("Service infrastructure"),msgPool::siError($o_queue->get_error()),ERROR_DIALOG);
+            msg_dialog::display(_("Service infrastructure"),msgPool::siError($o_queue->get_error()),ERROR_DIALOG);
         }else{
-          $this->systab = FALSE;
+            $this->closeDialogs();
         }
-      }
-      if(isset($_POST['abort_event_dialog'])){
-        $this->systab = FALSE;
-      }
     }
 
 
-    /********************
-      Delete MULTIPLE entries requested, display confirm dialog
-     ********************/
+    /*! \brief    Update filter part for INCOMING.
+     *            Allows us to search for "systemIncomingRDN".
+     */
+    static function incomingFilterConverter($filter)
+    {
+        $rdn = preg_replace("/^[^=]*=/", "", get_ou("ArpNewDevice", "systemIncomingRDN"));
+        $rdn = preg_replace("/,.*$/","",$rdn);
+        return(preg_replace("/%systemIncomingRDN/", $rdn,$filter));
+    }
 
-    if ($s_action=="del_multiple" || $s_action == "del"){
-      $this->dns = array();
 
-      if($s_action == "del_multiple"){
-        $ids = $this->list_get_selected_items();
-      }else{
-        $ids = array($s_entry);
-      }
+    /*! \brief    Queue selected objects to be removed. 
+     *            Checks ACLs, Locks and ask for confirmation.
+     */
+    protected function removeEntryRequested($action="",$target=array(),$all=array())
+    {
+        // Close dialogs and remove locks for currently handled dns
+        $this->cancelEdit();
 
-      $ui = get_userinfo();
-      $tabs = $this->get_tab_defs();
+        $disallowed = array();
+        $this->dns = array();
 
-      if(count($ids)){
+        @DEBUG (DEBUG_TRACE, __LINE__, __FUNCTION__, __FILE__,$target,"Entry removel requested!");
 
-        $disallowed = array();
-        foreach($ids as $id){
-
-          /* Get 'dn' from posted termlinst */
-          $attrs  = $this->terminals[$id];
-          $type   = $this->get_system_type($attrs);
-          $dn     = $attrs['dn'];
-          $acl = $this->ui->get_permissions($dn, $tabs[$type]['ACL']);
-          if(preg_match("/d/",$acl)){
-            $this->dns[$id] = $dn;
-          }else{
-            $disallowed[] = $dn;
-          }
+        // Check permissons for each target
+        $tInfo = $this->getObjectDefinitions();
+        $headpage = $this->getHeadpage();
+        foreach($target as $dn){
+            $type = $headpage->getType($dn);
+            if(!isset($tInfo[$type])){
+                trigger_error("Unknown object type received '".$type."' please update systemManagement::getObjectDefinitions()!");
+            }else{
+                $info = $tInfo[$type];
+                $acl = $this->ui->get_permissions($dn, $info['aclCategory']."/".$info['aclClass']);
+                if(preg_match("/d/",$acl)){
+                    $this->dns[] = $dn;
+                }else{
+                    $disallowed[] = $dn;
+                }
+            }
         }
-
         if(count($disallowed)){
-          msg_dialog::display(_("Permission"),msgPool::permDelete($disallowed),INFO_DIALOG);
+            msg_dialog::display(_("Permission"),msgPool::permDelete($disallowed),INFO_DIALOG);
         }
 
+        // We've at least one entry to delete.
         if(count($this->dns)){
 
-          if ($user= get_multiple_locks($this->dns)){
-            return(gen_locked_message($user,$this->dns));
-          }
+            // check locks
+            if ($user= get_multiple_locks($this->dns)){
+                return(gen_locked_message($user,$this->dns));
+            }
+
+            // Add locks
+            $dns_names = array();
+            $types = array();
+            $h = $this->getHeadpage();
+
+            // Build list of object -labels
+            foreach($h->objectTypes as $type){
+                $map[$type['objectClass']]= $type['label'];
+            }
 
-          $dns_names = array();
-          foreach($this->dns as $dn){
-            add_lock ($dn, $this->ui->dn);
-            $dns_names[] = LDAP::fix($dn);
-          }
+            foreach($this->dns as $dn){
+                $tmp = $h->getType($dn);
+                if(isset($map[$tmp])){
+                    $dns_names[] = '('._($map[$tmp]).')&nbsp;-&nbsp;'.LDAP::fix($dn);
+                }else{
+                    $dns_names[] =LDAP::fix($dn);
+                }
+            }
+            add_lock ($this->dns, $this->ui->dn);
 
-          /* Lock the current entry, so nobody will edit it during deletion */
-          $smarty->assign("warning", msgPool::deleteInfo($dns_names));
-          $smarty->assign("multiple", true);
-          return($smarty->fetch(get_template_path('remove.tpl', TRUE)));
+            // Display confirmation dialog.
+            $smarty = get_smarty();
+            $smarty->assign("info", msgPool::deleteInfo($dns_names));
+            return($smarty->fetch(get_template_path('removeEntries.tpl')));
         }
-      }
     }
 
 
-    /********************
-      Delete MULTIPLE entries confirmed
-     ********************/
-
-    /* Confirmation for deletion has been passed. Users should be deleted. */
-    if (isset($_POST['delete_multiple_system_confirm'])){
-
-      $ui = get_userinfo();
-      $tabs = $this->get_tab_defs();
-
-      /* Remove user by user and check acls before removeing them */
-      foreach($this->dns as $key => $dn){
-
-        /* Get 'dn' from posted termlinst */
-        $attrs    = $this->terminals[$key];
-        $type= $this->get_system_type($attrs);
-
-        /* get object type */
-        $tabtype  = "termtabs";
-        $tabobj   = "TERMTABS";
-        $tabacl   = "";
-        if(isset($tabs[$type])){
-          $tabtype = $tabs[$type]['TABCLASS'];
-          $tabobj  = $tabs[$type]['CLASS'];
-          $tabacl  = $ui->get_permissions($dn,$tabs[$type]['ACL']);
-
-          /* Load permissions for selected 'dn' and check if
-             we're allowed to remove this 'dn' */
-          if(preg_match("/d/",$tabacl)){ 
-
-            /* Delete request is permitted, perform LDAP action */
-            if(in_array($type,array("ArpNewDevice","NewDevice")) && class_available("termgeneric")){
-              $this->systab= new termgeneric($this->config, $dn);
-              $this->systab->set_acl_base($dn);
-              $this->systab->remove_from_parent();
-            }elseif($tabtype=="phonetabs"){
-              $this->systab= new $tabtype($this->config, $this->config->data['TABS'][$tabobj], $dn,$type);
-              $this->systab->set_acl_base($dn);
-              $this->systab->by_object['phoneGeneric']->remove_from_parent ();
+    /*! \brief  Object removal was confirmed, now remove the requested entries.
+     *
+     *  @param  String  'action'  The name of the action which was the used as trigger.
+     *  @param  Array   'target'  A list of object dns, which should be affected by this method.
+     *  @param  Array   'all'     A combination of both 'action' and 'target'.
+     */
+    function removeEntryConfirmed($action="",$target=array(),$all=array(),
+            $altTabClass="",$altTabType="",$altAclCategory="", $aclPlugin="")
+    {
+        @DEBUG (DEBUG_TRACE, __LINE__, __FUNCTION__, __FILE__,$target,"Entry removel confirmed!");
+
+        // Check permissons for each target
+        $tInfo = $this->getObjectDefinitions();
+        $headpage = $this->getHeadpage();
+        $disallowed = array();
+        foreach($this->dns as $key => $dn){
+            $type = $headpage->getType($dn);
+            if(!isset($tInfo[$type])){
+                trigger_error("Unknown object type received '".$type."' please update systemManagement::getObjectDefinitions()!");
             }else{
-              $this->systab= new $tabtype($this->config,$this->config->data['TABS'][$tabobj], $dn,$type);
-              $this->systab->set_acl_base($dn);
-              $this->systab->delete();
+
+                $info = $tInfo[$type];
+                $acl = $this->ui->get_permissions($dn, $info['aclCategory']."/".$info['aclClass']);
+                if(preg_match("/d/",$acl)){
+
+                    // Delete the object
+                    $this->dn = $dn;
+                    if($info['tabClass'] == "phonetabs"){
+                        $this->tabObject= new $tabtype($this->config, $this->config->data['TABS'][$tabobj], $dn,$type);
+                        $this->tabObject->set_acl_base($dn);
+                        $this->tabObject->by_object['phoneGeneric']->remove_from_parent ();
+                    }else{
+                        $this->tabObject= new $info['tabClass']($this->config,$this->config->data['TABS'][$info['tabDesc']], 
+                                $this->dn, $info['aclCategory'], true, true);
+                        $this->tabObject->set_acl_base($this->dn);
+                        $this->tabObject->parent = &$this;
+                        $this->tabObject->delete ();
+                    }
+
+                    // Remove the lock for the current object.
+                    del_lock($this->dn);
+
+                }else{
+                    $disallowed[] = $dn;
+                    new log("security","system/".get_class($this),$dn,array(),"Tried to trick deletion.");
+                }
             }
-            unset ($this->systab);
-            $this->systab= NULL;
-
-          } else {
-            /* Normally this shouldn't be reached, send some extra
-               logs to notify the administrator */
-            msg_dialog::display(_("Permission error"), msgPool::permDelete(), ERROR_DIALOG);
-            new log("security","systems/".get_class($this),$dn,array(),"Tried to trick deletion.");
-          }
+        }
+        if(count($disallowed)){
+            msg_dialog::display(_("Permission"),msgPool::permDelete($disallowed),INFO_DIALOG);
         }
 
-        /* Remove lock file after successfull deletion */
+        // Cleanup
         $this->remove_lock();
-        $this->dns = array();
-      }
+        $this->closeDialogs();
     }
 
-    /********************
-      Delete MULTIPLE entries Canceled
-     ********************/
-
-    /* Remove lock */
-   if(isset($_POST['delete_multiple_system_cancel'])){
-
-     /* Remove lock file after successfull deletion */
-     $this->remove_lock();
-     $this->dns = array();
-   }
 
-
-    /********************
-      Edit system type finished, check if everything went ok
-     ********************/
-    /* Finish user edit is triggered by the tabulator dialog, so
-       the user wants to save edited data. Check and save at this
-       point. */
-
-    /* Dirty workaround - MSG_DIALOG - OK
-      If a message dialog is shown and we press 'OK'
-       then try to save again.
+    /*! \brief  Edit the selected system type.
+     *          NewDevice and ArpNewDevice are handled here separately 
      */
-    foreach($_POST as $name => $value){
-      if(preg_match("/^MSG_OK/",$name)){
-        $_POST[$this->last_action] = TRUE;
-      }
-    }
-
-    if ((isset($_POST['edit_finish']) || isset($_POST['edit_apply'])) && (isset($this->systab->config))){
-
-      /* If the save routine gets interrupted by a confirm dialog, 
-          store last action so we can trigger it again after 'Ok' was pressed.
-         (This is the case if a system gets modified while it is installing - GOsa si)
-       */
-      $this->last_action = ""; 
-      if(isset($_POST['edit_finish'])){
-        $this->last_action = "edit_finish"; 
-      }elseif(isset($_POST['edit_apply'])){
-        $this->last_action = "edit_apply";
-      }
-
-      /* Check tabs, will feed message array */
-      $message = $this->systab->check();
-
-      /* Save, or display error message? */
-      if (count($message) == 0){
-        $this->systab->save();
-
-        /* Post handling for activated systems 
-            target opsi -> Remove source.
-            target gosa -> Activate system.
-         */
-        if($this->systab instanceOf opsi_tabs && $this->systab->was_activated){
-          $ldap = $this->config->get_ldap_link();
-          $ldap->cd($this->config->current['BASE']);
-          $ldap->rmdir ($this->systab->dn);
-          @DEBUG(DEBUG_LDAP,__LINE__, __FUNCTION__, __FILE__,"Source removed: ".$this->systab->dn,"Opsi host activated.");
-
-          $hostId =  $this->systab->by_object['opsiGeneric']->hostId;
-          $mac    =  $this->systab->by_object['opsiGeneric']->mac;
-          $this->opsi->job_opsi_activate_client($hostId,$mac);
-
-        }elseif(isset($this->systab->was_activated) && $this->systab->was_activated){
-          $this->activate_new_device($this->systab->dn);
+    function editEntry($action="",$target=array(),$all=array(), $altTabClass ="", $altTabType = "", $altAclCategory="")
+    {
+        if(count($target) == 1){
+            $tInfo = $this->getObjectDefinitions();
+            $headpage = $this->getHeadpage();
+            $dn = $target[0];
+            $type =$headpage->getType($dn);
+            $tData = $tInfo[$type];
+
+            if($type == "FAKE_OC_ArpNewDevice"){
+                if(!class_available("ArpNewDeviceTabs")){
+                    msg_dialog::display(_("Error"), msgPool::class_not_found("ArpNewDevice"), ERROR_DIALOG);
+                }else{
+                    return(management::editEntry($action,$target,$all,"ArpNewDeviceTabs","ARPNEWDEVICETABS","incoming"));
+                }
+            }elseif($type == "FAKE_OC_NewDevice"){
+                if(!class_available("SelectDeviceType")){
+                    msg_dialog::display(_("Error"), msgPool::class_not_found("SelectDeviceType"), ERROR_DIALOG);
+                }else{
+                    $this->activationQueue[$dn] = array();
+                    $this->dialogObject = new SelectDeviceType($this->config,$dn);
+                    $this->dialogObject->set_acl_category("incoming");
+                    $this->skipFooter = TRUE;
+                    $this->displayApplyBtn = FALSE;
+                    // see condition  -$s_action == "::systemTypeChosen"-  for further handling
+                }
+            }else{
+                return(management::editEntry($action,$target,$all,$tData['tabClass'],$tData['tabDesc'],$tData['aclCategory']));
+            }
         }
+    }
 
-        /* Terminal has been saved successfully, remove lock from LDAP. */
-        if (!isset($_POST['edit_apply'])){
-          if ($this->dn != "new"){
-            $this->remove_lock();
-          }
 
-          unset ($this->systab);
-          $this->systab= NULL;
-          set_object_info();
+    /*! \brief  Edit the selected system type.
+     *
+     *  @param  String  'action'  The name of the action which was the used as trigger.
+     *  @param  Array   'target'  A list of object dns, which should be affected by this method.
+     *  @param  Array   'all'     A combination of both 'action' and 'target'.
+     */
+    function newEntry($action="",$target=array(),$all=array(), $altTabClass ="", $altTabType = "", $altAclCategory="")
+    {
+        $tInfo = $this->getObjectDefinitions();
+        $info = preg_replace("/^new_/","",$action);
+        if(!isset($tInfo[$info])){
+            trigger_error("Unknown action type '".$action."' cant create a new system!");
         }else{
-      
-          /* Reinitialize tab */
-          if($this->systab instanceof tabs){
-            $this->systab->re_init();
-          }
+            return(management::newEntry($action,$target,$all, 
+                        $tInfo[$info]['tabClass'],
+                        $tInfo[$info]['tabDesc'],
+                        $tInfo[$info]['aclCategory']));
         }
-      } else {
-        /* Ok. There seem to be errors regarding to the tab data,
-           show message and continue as usual. */
-        msg_dialog::displayChecks($message);
-      }
     }
 
 
-    /********************
-      Edit system was canceled 
-     ********************/
-    /* Cancel dialogs */
-    if (isset($_POST['edit_cancel']) || isset($_POST['password_cancel']) || isset($_POST['SystemTypeAborted'])){
-      if (isset($this->systab)){
-        $this->remove_lock();
-        unset ($this->systab);
-      }
-      $this->systab= NULL;
-      set_object_info();
-    }
-
-    /********************
-      Display edit dialog, or some other
-     ********************/
-
-    /* Show tab dialog if object is present */
-    if (isset($this->systab->config)){
-
-      if($this->systab instanceOf plugin && !($this->systab instanceOf tabs)){
-        $this->systab->save_object();
-      }
-
-      $display= $this->systab->execute();
-
-      /* Don't show buttons if tab dialog requests this */
-
-      $dialog     = FALSE;
-      $hide_apply = $this->dn == "new";
-      $hide_apply = ($this->dn == "new") || (preg_match("/".preg_quote(get_ou("systemIncomingRDN"), '/')."/",$this->dn));
-      if(is_object($this->systab) && !isset($this->systab->by_object)){
-        $dialog = TRUE;
-        $hide_apply = TRUE;
-      }elseif(isset($this->systab->by_object[$this->systab->current]->dialog)){
-        $dia = $this->systab->by_object[$this->systab->current]->dialog;
-        if($dia === TRUE || is_object($dia)){
-          $dialog = TRUE;
-        }  
-      }
-      if(isset($this->systab->current) && isset($this->systab->by_object[$this->systab->current]->netConfigDNS) && 
-        $this->systab->by_object[$this->systab->current]->netConfigDNS->dialog){
-        $dialog = TRUE;
-      }
-
-      if(($this->systab instanceOf tabs || $this->systab instanceOf plugin) && $this->systab->read_only == TRUE){
-        $display.= "<p style=\"text-align:right\">
-          <input type=submit name=\"edit_cancel\" value=\"".msgPool::cancelButton()."\">
-          </p>";
-      }elseif (!$dialog){
-        $display.= "<p style=\"text-align:right\">\n";
-        $display.= "<input type=\"submit\" name=\"edit_finish\" style=\"width:80px\" value=\"".msgPool::okButton()."\">\n";
-        $display.= "&nbsp;\n";
-        if (!$hide_apply){
-          $display.= "<input type=submit name=\"edit_apply\" value=\"".msgPool::applyButton()."\">\n";
-          $display.= "&nbsp;\n";
+    /*! \brief  Activates all selcted 'NewDevices' at once.
+     *          Enqueues the selected Devices in the activation queue.
+     */
+    function activateMultiple($action,$target)
+    {
+        $headpage = $this->getHeadpage();
+        foreach($target as $dn) {
+            if($headpage->getType($dn) == "FAKE_OC_NewDevice"){
+                $this->activationQueue[$dn] = array();
+            }
+        }
+        if(count($this->activationQueue)){
+            $this->dialogObject = new SelectDeviceType($this->config, array_keys($this->activationQueue));
+            $this->skipFooter = TRUE;
         }
-        $display.= "<input type=\"submit\" name=\"edit_cancel\" value=\"".msgPool::cancelButton()."\">\n";
-        $display.= "</p>";
-      }
-      return ($display);
     }
 
-    /* Check if there is a snapshot dialog open */
-    $base = $this->DivListSystem->selectedBase;
-    if($str = $this->showSnapshotDialog($base,$this->get_used_snapshot_bases(),$this)){
-      return($str);
-    }
 
-    /* Display dialog with system list */
-    $this->DivListSystem->parent = $this;
-    $this->DivListSystem->execute();
+    /*! \brief  The system selection dialog was closed. 
+     *          We will now queue the given entry to be activated.
+     */ 
+    function systemTypeChosen()
+    {
+        // Detect the systems target type 
+        $tInfo = $this->getObjectDefinitions();
+        $selected_group = "none";
+        if(isset($_POST['ObjectGroup'])){
+            $selected_group = get_post('ObjectGroup');
+        }
+        $selected_system = get_post('SystemType');
+        $tmp = array();
+        foreach($this->activationQueue as $dn => $data){
+            $tmp[$dn]['OG'] = $selected_group;
+            $tmp[$dn]['SS'] = $selected_system;
+        }
+        $this->closeDialogs();
+        $this->activationQueue = $tmp;
+        return($this->handleActivationQueue());
+    }
 
-    /* Add departments if subsearch is disabled */
-    if(!$this->DivListSystem->SubSearch){
 
-      /* Add FAIstate to attributes if FAI is activated */
-      if($this->fai_activated){
-        $this->DivListSystem->AddDepartments($this->DivListSystem->selectedBase,4,1);
-      }else{
-        $this->DivListSystem->AddDepartments($this->DivListSystem->selectedBase,3,1);
-      }
-    }
-    $this->reload();
-    $this->DivListSystem->setEntries($this->terminals);
-    return($this->DivListSystem->Draw());
-  }
-
-
-  /* Return departments, that will be included within snapshot detection */
-  function get_used_snapshot_bases()
-  {
-    $tmp = array();
-
-    /* Check acls, if we are not allowed to create and write each plugin tab, skip this object */
-
-    $tabs = array(
-        "terminal"        => get_ou('terminalRDN'),
-        "workstation"     => get_ou('workstationRDN'),
-        "incoming"        => get_ou('systemIncomingRDN'),
-        "server"          => get_ou('serverRDN'),
-        "printer"         => get_ou('printerRDN'),
-        "phone"           => get_ou('phoneRDN'),
-        "winworkstation"  => get_winstations_ou(),
-        "component"       => get_ou('componentRDN')
-        ); 
-
-    foreach($tabs as $acl_cat => $dn){
-
-      $acl_all = $this->ui->has_complete_category_acls($dn.$this->DivListSystem->selectedBase,$acl_cat);
-      if(preg_match("/(c.*w|w.*c)/",$acl_all)){
-        $tmp[] = $dn.$this->DivListSystem->selectedBase;
-      }
-    }
-    return($tmp); 
-  }
+    /*! \brief  Activate queued goto systems.
+     */
+    function handleActivationQueue()
+    {
+        @DEBUG (DEBUG_TRACE, __LINE__, __FUNCTION__, __FILE__,
+                'Entries left: '.count($this->activationQueue), "<b>Handling system activation queue!</b>");
 
+        if(!count($this->activationQueue)) return("");
 
-  function remove_from_parent()
-  {
-    /* Optionally execute a command after we're done */
-    $this->postremove();
-  }
+        $ldap     = $this->config->get_ldap_link();
+        $pInfo    = $this->getObjectDefinitions(); 
+        $ui       = get_userinfo();
+        $headpage = $this->getHeadpage();
+        $ldap->cd($this->config->current['BASE']);
+
+        // Walk through systems to activate
+        while(count($this->activationQueue)){
+
+            // Get next entry 
+            reset($this->activationQueue);
+            $dn = key($this->activationQueue);
+            $data= $this->activationQueue[$dn];
+
+            // Validate the given system type.
+            if(!isset($data['SS'])) continue;
+            $sysType = $data['SS'];
+            if(!isset($pInfo[$sysType])){
+                trigger_error('Unknown type \''.$sysType.'\'!');
+                continue;
+            }
+            $type = $pInfo[$sysType];
 
+            @DEBUG (DEBUG_TRACE, __LINE__, __FUNCTION__, __FILE__,
+                    $dn, "<b>Try to activate:</b>");
 
-  /* Save data to object */
-  function save_object()
-  {
-    $this->DivListSystem->save_object();
-    if(is_object($this->CopyPasteHandler)){
-      $this->CopyPasteHandler->save_object();
-    }
-  }
-
-
-  /* Check values */
-  function check()
-  {
-  }
-
-
-  /* Save to LDAP */
-  function save()
-  {
-  }
-
-  function adapt_from_template($dn, $skip= array())
-  {
-  }
-
-  function password_change_needed()
-  {
-  }
-
-  function reload()
-  {
-    /* some var init */
-    $ui = get_userinfo();
-    $res              = array();
-    $this->terminals  = array();
-    $userregex        = "";
-    $opsi_clients     = array();
-
-    /* Set base for all searches */
-    $base=  $this->DivListSystem->selectedBase;
-
-    /* Prepare samba class name */
-    $samba  ="";
-    if ($this->DivListSystem->ShowWinWorkstations){
-      if ($this->config->get_cfg_value("sambaversion") == "3"){
-        $samba= "sambaSamAccount";
-      } else {
-        $samba= "sambaAccount";
-      }
-    }
+            // Get target type definition 
+            $plugClass    = $type["plugClass"];
+            $tabClass     = $type["tabClass"];
+            $aclCategory  = $type["aclCategory"];
+            $tabDesc      = $type["tabDesc"];
 
-    /* This array represents the combination between checkboxes and search filters */
-    $objs = array( 
-        "ShowServers"        => array("TAB" => "servtabs",      "CLASS" => "goServer"        ,"TREE" => get_ou('serverRDN')),
-        "ShowTerminals"      => array("TAB" => "termtabs",      "CLASS" => "gotoTerminal"    ,"TREE" => get_ou('terminalRDN')),
-        "ShowPrinters"       => array("TAB" => "printtabs",     "CLASS" => "gotoPrinter"     ,"TREE" => get_ou('printerRDN')),
-        "ShowDevices"        => array("TAB" => "componenttabs", "CLASS" => "ieee802Device"   ,"TREE" => get_ou('componentRDN')),
-        "ShowPhones"         => array("TAB" => "phonetabs",     "CLASS" => "goFonHardware"   ,"TREE" => get_ou('phoneRDN')),
-        "ShowWorkstations"   => array("TAB" => "worktabs",      "CLASS" => "gotoWorkstation" ,"TREE" => get_ou('workstationRDN')),
-        "ShowWinWorkstations"=> array("TAB" => "wintabs",       "CLASS" => $samba            ,"TREE" => get_winstations_ou() ));
-
-    /* Include the 'Display Systems of user' attribute */ 
-    if ((!empty($this->DivListSystem->UserRegex)) && ($this->DivListSystem->UserRegex!= "*")){
-      $userregex = "(gotoLastUser=".$this->DivListSystem->UserRegex.")";
-    }
+            if(!class_available($tabClass)){
+                msg_dialog::display(_("Error"), msgPool::class_not_found($tabclass), ERROR_DIALOG);
+                unset($this->activationQueue[$dn]);
+                continue;
+            }else{
 
-    /* Attributes to fetch */
-    $sys_attrs        = array("cn", "description", "macAddress", "objectClass", "sambaDomainName","gotoMode","FAIclass");
-    $sys_categories   = array("terminal", "workstation", "server", "phone" ,"printer","incoming","winworkstation","component");
-
-    /* Add FAIstate to attributes if FAI is activated */
-    $tmp = $this->config->search("faiManagement", "CLASS",array('menu','tabs'));
-    if(!empty($tmp)){
-      $sys_attrs[] = "FAIstate";
-    }    
-
-    /* Walk through all possible search combinations, and search for some objects if the checkbox is enabled  */
-    foreach($objs as $checkBox => $oc){
-
-      if($this->DivListSystem->$checkBox && class_available($oc['TAB'])){
-        if($this->DivListSystem->SubSearch){
-          if($oc['CLASS'] != ""){
-            $filter = "(&".$userregex."(objectClass=".$oc['CLASS'].")(cn=".$this->DivListSystem->Regex."))";
-            $new_res = get_sub_list($filter, $sys_categories ,$oc['TREE'], $base,$sys_attrs, GL_SUBSEARCH | GL_SIZELIMIT);
-            $res = array_merge($res,$new_res);
-          }
-        }else{
-          /* User filter? */
-          if($oc['CLASS'] != ""){
-            $filter = "(&".$userregex."(objectClass=".$oc['CLASS'].")(cn=".$this->DivListSystem->Regex."))";
-            $res = array_merge($res,get_list($filter,$sys_categories,$oc['TREE'].$base, $sys_attrs,  GL_SIZELIMIT));
-          }
+                @DEBUG (DEBUG_TRACE, __LINE__, __FUNCTION__, __FILE__,
+                        $sysType, "<b>System type:</b>");
+
+                // Load permissions for selected 'dn' and check if we're allowed to create this 'dn' 
+                $this->dn = $dn;
+                $acls   = $ui->get_permissions($this->dn,$aclCategory."/".$plugClass);
+
+                // Check permissions
+                if(!preg_match("/c/",$acls)){
+                    unset($this->activationQueue[$dn]);
+                    msg_dialog::display(_("Error"), msgPool::permCreate(), ERROR_DIALOG);
+
+                    @DEBUG (DEBUG_TRACE, __LINE__, __FUNCTION__, __FILE__,
+                            $acls, "<b>Insufficient permissions!</b>");
+                    continue;
+                }else{
+
+                    // Open object an preset some values like the objects base 
+                    del_lock($dn);
+                    management::editEntry('editEntry',array($dn),array(),$tabClass,$tabDesc, $aclCategory);
+                    $this->displayApplyBtn = FALSE;
+                    $this->tabObject->set_acl_base($headpage->getBase());
+
+                    @DEBUG (DEBUG_TRACE, __LINE__, __FUNCTION__, __FILE__,
+                            $data['OG'], "<b>Selected ogroup:</b>");
+
+                    if($data['OG'] != "none"){
+                        $this->tabObject->base = preg_replace("/^[^,]+,".preg_quote(get_ou("group", "ogroupRDN"), '/')."/i", "", $data['OG']);
+                        $this->tabObject->by_object[$plugClass]->baseSelector->setBase($this->tabObject->base);
+                    } else {
+                        $this->tabObject->by_object[$plugClass]->baseSelector->setBase($headpage->getBase());
+                        $this->tabObject->base = $headpage->getBase();
+                    }
+
+                    // Assign some default values for opsi hosts
+                    if($this->tabObject instanceOf opsi_tabs){
+                        $ldap = $this->config->get_ldap_link();
+                        $ldap->cat($dn);
+                        $source_attrs = $ldap->fetch();
+                        foreach(array("macAddress" => "mac" ,"cn" => "hostId","description" => "description") as $src => $attr){
+                            if(isset($source_attrs[$src][0])){
+                                $this->tabObject->by_object['opsiGeneric']->$attr = $source_attrs[$src][0];
+                            }
+                        }
+                        @DEBUG (DEBUG_TRACE, __LINE__, __FUNCTION__, __FILE__,
+                                "", "<b>OPSI attributes adapted</b>");
+                    }
+
+                    // Queue entry to be activated, when it is saved.
+                    if($data['OG'] != "none"){
+
+                        // Set gotoMode to active if there was an ogroup selected.
+                        $found = false;
+                        foreach(array("workgeneric"=>"active","servgeneric"=>"active","termgeneric"=>"active") as $tab => $value){
+                            if(isset($this->tabObject->by_object[$tab]->gotoMode)) {
+                                $found = true;
+                                $this->tabObject->by_object[$tab]->gotoMode = $value;
+                                @DEBUG (DEBUG_TRACE, __LINE__, __FUNCTION__, __FILE__,
+                                        $tab."->gotoMode = {$value}", "<b>Setting gotoMode to: </b>");
+                            }
+                        }
+                        if(!$found){
+                            msg_dialog::display(_("Internal error"), _("Cannot set mode to 'active'!"), ERROR_DIALOG);
+                        }
+
+                        // Update object group membership
+                        $og = new ogroup($this->config,$data['OG']);
+                        if($og){
+                            $og->AddDelMembership($this->tabObject->dn);
+                            $og->save();
+                            @DEBUG (DEBUG_TRACE, __LINE__, __FUNCTION__, __FILE__,
+                                    $og->dn, "<b>Adding system to ogroup</b>");
+                        }
+
+                        // Set default system specific attributes
+                        foreach (array("workgeneric", "termgeneric") as $cls){
+                            if (isset($this->tabObject->by_object[$cls])){
+                                $this->tabObject->by_object[$cls]->set_everything_to_inherited();
+                                @DEBUG (DEBUG_TRACE, __LINE__, __FUNCTION__, __FILE__,
+                                        $og->dn, "<b>Calling {$cls}->set_everything_to_inherited()</b>");
+                            }
+                        }
+
+                        // Enable activation
+                        foreach (array("servgeneric", "workgeneric", "termgeneric") as $cls){
+                            if (isset($this->tabObject->by_object[$cls])){
+                                $this->tabObject->by_object[$cls]->auto_activate= TRUE;
+                                @DEBUG (DEBUG_TRACE, __LINE__, __FUNCTION__, __FILE__,
+                                        $cls, "<b>Setting auto_activate=TRUE for</b>");
+                            }
+                        }
+
+                        // Enable sending of LDAP events
+                        if (isset($this->tabObject->by_object["workstartup"])){
+                            $this->tabObject->by_object["workstartup"]->gotoLdap_inherit= TRUE;
+                            @DEBUG (DEBUG_TRACE, __LINE__, __FUNCTION__, __FILE__,
+                                    "", "<b>Setting workstartup->gotoLdap_inherit=TRUE</b>");
+                        }
+                    }
+
+                    // Try to inherit everythin from the selected object group and then save
+                    //  the entry, normally this should work without any problems. 
+                    // But if there is any, then display the dialogs.
+                    if($data['OG'] != "none"){
+                        $str = $this->saveChanges();
+
+                        // There was a problem, skip activation here and allow to fix the problems..
+                        if(is_object($this->tabObject)){
+                            @DEBUG (DEBUG_TRACE, __LINE__, __FUNCTION__, __FILE__,
+                                    "", "<b>Automatic saving failed, let the user fix the issues now.</b>");
+                            return;
+                        }
+                        @DEBUG (DEBUG_TRACE, __LINE__, __FUNCTION__, __FILE__,
+                                "", "<b>System activated!</b>");
+                    }else{
+                        @DEBUG (DEBUG_TRACE, __LINE__, __FUNCTION__, __FILE__,
+                                "", "<b>Open dialogs now</b>");
+                        return;
+                    }
+                }
+            }
         }
-      } 
     }
 
-    /* Search for incoming objects */ 
-    $filter = "(|(&".$userregex."(objectClass=goHard)(cn=".$this->DivListSystem->Regex.")))";
-    $res = array_merge($res,get_list($filter,$sys_categories, get_ou('systemIncomingRDN').$base,$sys_attrs, GL_SIZELIMIT));
 
-    /* Append opsi systems, the opsi extension have to installed.
-        (Only, if we are allowed to view opsi hosts)
+    /*! \brief  Save object modifications here and any dialogs too.
+     *          After a successfull update of the object data, close
+     *           the dialogs.
      */
-    if($this->opsi instanceof opsi && $this->opsi->enabled() && $this->DivListSystem->ShowOpsiHosts){
-      $o_acl = $this->ui->get_permissions($base,"opsi/opsiGeneric","");
-      if(preg_match("/r/",$o_acl)){
-        $opsi_clients = $this->opsi->get_hosts_for_system_management();
-        if($this->opsi->is_error()){
-          msg_dialog::display(_("Error"),msgPool::siError($this->opsi->get_error()),ERROR_DIALOG);
-        }
-      }
-    }
-    
-    /* Get all gotoTerminal's */
-    $t_id = 0;
-    $opsi_map  = array();
-    foreach ($res as $value){
-
-      $tmp= $value['dn'];
-      $add= "";
-
-      /* Extract base */
-      foreach($objs as $obj){
-        if(preg_match("/,".$obj['TREE']."/i",$value['dn'])){
-          $tmp = trim( preg_replace("/^[^,]+,[^o]*".$obj['TREE']."/i","",$value['dn']));
-        }
-      }
-
-      /* Create a string containing the last part of the department. */
-      $dn_name = preg_replace("#^([^/]+/)*#","",convert_department_dn(LDAP::fix($tmp)));
-      if(empty($dn_name)){
-        $dn_name = "/";
-      }
-
-      /* check if current object is a new one */
-      if (preg_match ("/,".get_ou('systemIncomingRDN')."/i", $tmp)){
-        if (in_array_ics('gotoTerminal', $value['objectClass'])){
-          $add= "- "._("New terminal");
-        }elseif (in_array_ics('gotoWorkstation', $value['objectClass'])){
-          $add= "- "._("New workstation");
-        }elseif (in_array_ics('GOhard', $value['objectClass']) && !isset($value['gotoMode'])){
-          $add= "- "._("Unknown device");
-        }elseif (in_array_ics('GOhard', $value['objectClass'])){
-          $add= "- "._("New Device");
-        }
-      } 
-
-      /* Detect type of object and create an entry for $this->terminals */
-      $terminal = array();
-
-       if (0 && in_array_ics('gosa_opsi_client', $value["objectClass"])){
-
-         /* check acl */
-         $terminal             = $value;
-         $terminal['type']     = "O";
-
-       } elseif (in_array_ics('gotoTerminal', $value["objectClass"])){
-
-        /* check acl */
-        $acl = $ui->get_permissions($value['dn'],"terminal/termgeneric");
-        if($add != "" || preg_match("/r/",$acl)) {
-          if (isset($value["macAddress"][0]) && $value["macAddress"][0] != "-"){
-            $terminal             = $value;
-            $terminal['type']     = "T";
-            $terminal['is_new']   = $add;
-          } else {
-            $terminal             = $value;
-            $terminal['type']     = "D";
-            $terminal['message']  = _("Terminal template for")."&nbsp;'".$dn_name."'&nbsp;";
-            $terminal['location'] = array_search($tmp, $this->config->departments); 
-          }
+    protected function saveChanges()
+    {
+        @DEBUG (DEBUG_TRACE, __LINE__, __FUNCTION__, __FILE__,
+                get_class($this->tabObject).": ".$this->tabObject->dn, "<b>Save</b>");
+
+        // Handle 'New Unknown Devices' here.
+        if($this->tabObject instanceOf ArpNewDeviceTabs){
+            $this->tabObject->save_object();
+
+            if($this->tabObject->by_object['ArpNewDevice']->gotoIntegration){
+                $message = $this->tabObject->check();
+                if(count($message)){
+                    msg_dialog::displayChecks($message);
+                }else{
+                    @DEBUG (DEBUG_TRACE, __LINE__, __FUNCTION__, __FILE__,
+                            get_class($this->tabObject).": ".$this->tabObject->dn, "<b>Queued for goto activation</b>");
+                    $this->tabObject->save();
+                    $this->activationQueue[$this->tabObject->dn]=array();
+                    $this->closeDialogs();
+                    $this->systemTypeChosen();
+                }
+                return;
+            }
         }
-      } elseif (in_array_ics('gotoWorkstation', $value["objectClass"])){
-
-        $acl = $ui->get_permissions($value['dn'],"workstation/workgeneric");
-        if($add != "" || preg_match("/r/",$acl)) {
-          if (isset($value["macAddress"][0]) &&  $value["macAddress"][0] != "-"){
-            $terminal             = $value;
-            $terminal['type']     = "L";
-            $terminal['is_new']   = $add;
-          } else {
-            $terminal             = $value;
-            $terminal['type']     = "D";
-            $terminal['location'] = array_search($tmp, $this->config->departments);
-            $terminal['message']  = _("Workstation template for")."&nbsp;'".$dn_name."'&nbsp;";
-          }
-#          if (isset($value["FAIstate"][0])){
-#            $terminal['type']= $this->getState($terminal['type'], $value["FAIstate"][0]);
-#          }
+
+        // Try to save changes here.
+        $str = management::saveChanges();
+        if($this->tabObject) return("");
+
+        // Activate system if required..
+        if(isset($this->activationQueue[$this->last_dn])){
+            $dn = $this->last_tabObject->dn;
+            $this->activate_new_device($dn);
+            unset($this->activationQueue[$this->last_dn]);
         }
-      } elseif (in_array_ics('gotoPrinter', $value["objectClass"])){
-       
-   
-        $acl = $ui->get_permissions($value['dn'],"printer/printgeneric");
-        if($add != "" || preg_match("/r/",$acl)) {
-
-          $terminal             = $value;
-          $terminal['type']     = "P";
+
+        /* Post handling for activated systems
+           target opsi -> Remove source.
+           target gosa -> Activate system.
+         */
+        if($this->last_tabObject instanceOf opsi_tabs){
+            $ldap = $this->config->get_ldap_link();
+            $ldap->cd($this->config->current['BASE']);
+            $ldap->rmdir ($this->last_tabObject->dn);
+            @DEBUG(DEBUG_LDAP,__LINE__, __FUNCTION__, __FILE__,
+                    "Source removed: ".$this->tabObject->dn,"<b>Opsi host activated</b>");
+
+            $hostId =  $this->last_tabObject->by_object['opsiGeneric']->hostId;
+            $mac    =  $this->last_tabObject->by_object['opsiGeneric']->mac;
+            $this->opsi->job_opsi_activate_client($hostId,$mac);
+
+        }elseif(isset($this->last_tabObject->was_activated) && $this->last_tabObject->was_activated){
+            $this->activate_new_device($this->last_tabObject->dn);
         }
-      } elseif (in_array_ics('goServer', $value["objectClass"])){
 
-        $acl = $ui->get_permissions($value['dn'],"server/servgeneric");
-        if($add != "" || preg_match("/r/",$acl)) {
+        // Avoid using values from an older input dialog
+        $_POST = array();
+        $this->handleActivationQueue();
+    }
+
 
-          $terminal             = $value;
-          $terminal['type']     = "S";
-#          if (isset($value["FAIstate"][0])){
-#            $terminal['type']= $this->getState($terminal['type'], $value["FAIstate"][0]);
-#          }
+    /*! \brief  Save object modifications here and any dialogs too.
+     *          Keep dialogs opened.
+     */
+    protected function applyChanges()
+    {
+        $str = management::applyChanges();
+        if($str) return($str);
+
+        /* Post handling for activated systems
+           target opsi -> Remove source.
+           target gosa -> Activate system.
+         */
+        if($this->tabObject instanceOf opsi_tabs){
+            $ldap = $this->config->get_ldap_link();
+            $ldap->cd($this->config->current['BASE']);
+            $ldap->rmdir ($this->tabObject->dn);
+            @DEBUG(DEBUG_LDAP,__LINE__, __FUNCTION__, __FILE__,
+                    "Source removed: ".$this->tabObject->dn,"<b>Opsi host activated</b>");
+
+            $hostId =  $this->tabObject->by_object['opsiGeneric']->hostId;
+            $mac    =  $this->tabObject->by_object['opsiGeneric']->mac;
+            $this->opsi->job_opsi_activate_client($hostId,$mac);
+            $this->tabObject->set_acl_base($this->dn);
+
+        }elseif(isset($this->tabObject->was_activated) && $this->tabObject->was_activated){
+            $this->activate_new_device($this->tabObject->dn);
         }
-      } elseif (in_array_ics('goFonHardware', $value["objectClass"])){
+    }
 
-        $acl = $ui->get_permissions($value['dn'],"phone/phoneGeneric");
-        if($add != "" || preg_match("/r/",$acl)) {
 
-          $terminal             = $value;
-          $terminal['type']     = "F";
+    /*! \brief  Sets FAIstate to "install" for "New Devices".
+      This function is some kind of "Post handler" for activated systems,
+      it is called directly after the object (workstabs,servtabs) gets saved.
+      @param  String  $dn   The dn of the newly activated object.
+      @return Boolean TRUE if activated else FALSE
+     */
+    function activate_new_device($dn)
+    {
+        @DEBUG (DEBUG_TRACE, __LINE__, __FUNCTION__, __FILE__,
+                $dn, "<b>Activating system:</b>");
+        $ldap = $this->config->get_ldap_link();
+        $ldap->cd($this->config->current['BASE']);
+        $ldap->cat($dn);
+        if($ldap->count()){
+            $attrs = $ldap->fetch();
+            if(count(array_intersect(array('goServer','gotoWorkstation'), $attrs['objectClass']))){
+                $ocs = $attrs['objectClass'];
+                unset($ocs['count']);
+                $new_attrs = array();
+                if(!in_array_strict("FAIobject",$ocs)){
+                    $ocs[] = "FAIobject";
+                    $new_attrs['objectClass'] = $ocs;
+                }
+                $new_attrs['FAIstate'] = "install";
+                $ldap->cd($dn);
+                $ldap->modify($new_attrs);
+                if (!$ldap->success()){
+                    msg_dialog::display(_("LDAP error"), msgPool::ldaperror($ldap->get_error(), $this->dn,
+                                LDAP_MOD, "activate_new_device($dn)"));
+                    @DEBUG (DEBUG_TRACE, __LINE__, __FUNCTION__, __FILE__,
+                            $dn, "<b>Failed!</b>");
+                }else{
+                    @DEBUG (DEBUG_TRACE, __LINE__, __FUNCTION__, __FILE__,
+                            $dn, "<b>Success</b>");
+                    return(TRUE);
+                }
+            }else{
+                @DEBUG (DEBUG_TRACE, __LINE__, __FUNCTION__, __FILE__,
+                        $dn, "<b>FAIstate not set to install, this is only done for gotoWorkstation/goServer!</b>");
+            }
         }
-      }elseif (in_array_ics("GOhard",$value['objectClass'])){
+        return(FALSE);
+    }
 
-        $acl =  $ui->get_permissions($value['dn'],"server/servgeneric"). 
-                $ui->get_permissions($value['dn'],"terminal/termgeneric").
-                $ui->get_permissions($value['dn'],"workstation/workgeneric");
-        if($add != "" || preg_match("/r/",$acl)) {
 
-          $terminal = $value;
-          $terminal['type']   = "Q";
-          $terminal['is_new'] = $add;
-        }
-      } elseif (in_array_ics('ieee802Device', $value["objectClass"]) && 
-        !( in_array_ics('sambaAccount', $value["objectClass"]) || in_array_ics('sambaSamAccount', $value["objectClass"]))){
-        $type= "winstation";
-        $acl = $ui->get_permissions($value['dn'],"component/componentGeneric");
-        if($add != "" || preg_match("/r/",$acl)) {
-
-          $terminal             = $value;
-          $terminal['type']     = "C";
-        }
-      } else{
+    /*! \brief  Opens the snapshot creation dialog for the given target.
+     *
+     *  @param  String  'action'  The name of the action which was the used as trigger.
+     *  @param  Array   'target'  A list of object dns, which should be affected by this method.
+     *  @param  Array   'all'     A combination of both 'action' and 'target'.
+     */
+    function createSnapshotDialog($action="",$target=array(),$all=array())
+    {
+        @DEBUG (DEBUG_TRACE, __LINE__, __FUNCTION__, __FILE__,$target,"Snaptshot creation initiated!");
+
+        $pInfo    = $this->getObjectDefinitions();
+        $headpage = $this->getHeadpage();
+        foreach($target as $dn){
+
+            $entry = $headpage->getEntry($dn);
+            $type = $headpage->getType($dn);
+            if(!isset($pInfo[$type])) {
+                trigger_error('Unknown system type \''.$type.'\'!');
+                return;
+            }
 
-        $name= preg_replace('/\$$/', '', $value['cn'][0]);
-        if (isset($value['sambaDomainName'])){
-          $domain= " [".$value['sambaDomainName'][0]."]";
-        } else {
-          $domain= "";
-        }
-        $acl = $ui->get_permissions($value['dn'],"winworkstation/wingeneric");
-        if($add != "" || preg_match("/r/",$acl)) {
-          $terminal=$value;
-          $terminal['type']     ="W";
-          $terminal['domain']   = $name.$domain;
+            if(!empty($dn) && $this->ui->allow_snapshot_create($dn,$pInfo[$type]['aclCategory'])){
+                $this->dialogObject = new SnapShotDialog($this->config,$dn,$this);
+                $this->dialogObject->aclCategories = array($pInfo[$type]['aclCategory']);
+                $this->dialogObject->parent = &$this;
+
+            }else{
+                msg_dialog::display(_("Permission"),sprintf(_("You are not allowed to create a snapshot for %s."),$dn),
+                        ERROR_DIALOG);
+            }
         }
-      }
-
-      /* Append collected data to the host list.
-       */
-      if(count($terminal)){
-        $t_id ++ ;
-        $this->terminals[$t_id]=$terminal;
-        $opsi_map[preg_replace('/\$$/',"",$value['cn'][0])] = $t_id;
-      }
     }
 
 
-    /* Merge real hosts with opsi hosts.
-       If there is a samba host, then merge it with the opsi host,
-        to avoid duplicate entries.
+    /*! \brief  Displays the "Restore snapshot dialog" for a given target.
+     *          If no target is specified, open the restore removed object
+     *           dialog.
+     *  @param  String  'action'  The name of the action which was the used as trigger.
+     *  @param  Array   'target'  A list of object dns, which should be affected by this method.
+     *  @param  Array   'all'     A combination of both 'action' and 'target'.
      */
-    foreach($opsi_clients as $entry){
-      if(isset($opsi_map[$entry['cn'][0]])){
-        continue;
-      }
-      $terminal             = $entry;
-      $terminal['type']     = "O";
-      $this->terminals[] = $terminal;
-    }
+    function restoreSnapshotDialog($action="",$target=array(),$all=array())
+    {
+        // Set current restore base for snapshot handling.
+        $headpage = $this->getHeadpage();
+        $pInfo    = $this->getObjectDefinitions();
+        if(is_object($this->snapHandler)){
+            $bases = array();
+            foreach($this->storagePoints as $sp){
+                $bases[] = $sp.$headpage->getBase();
+            }
+        }
 
-    $tmp  =array();
-    $tmp2 =array();
-    foreach($this->terminals as $tkey => $val ){
-      $tmp[strtolower($val['cn'][0]).$val['dn']]=$val;
-      $tmp2[strtolower($val['cn'][0]).$val['dn']] = strtolower($val['cn'][0]).$val['dn'];
-    }
-    natcasesort($tmp2);
-    $this->terminals=array();
-    foreach($tmp2 as $val){
-      $this->terminals[]=$tmp[$val];
-    }
-    reset ($this->terminals);
-  }
-
-  function remove_lock()
-  {
-     
-    if(isset($this->dn) && !empty($this->dn) && $this->dn != "new"){
-      del_lock($this->dn);
-    }elseif (isset($this->systab->dn)){
-      del_lock ($this->systab->dn);
-    }
-    if(isset($this->dns) && is_array($this->dns) && count($this->dns)){
-      del_lock($this->dns);
-    }
-  }
+        // No bases specified? Try base
+        if(!count($bases)) $bases[] = $this->headpage->getBase();
 
+        // No target, open the restore removed object dialog.
+        if(!count($target)){
 
-  function copyPasteHandling_from_queue($s_action,$s_entry)
-  {
-    /* Check if Copy & Paste is disabled */
-    if(!is_object($this->CopyPasteHandler)){
-      return("");
-    }
+            $cats = array();
+            foreach($pInfo as $data){
+                $cats[] = $data['aclCategory'];
+            }
+            $cats = array_unique($cats);
+
+            $entry = $headpage->getBase();
+            if(!empty($entry) && $this->ui->allow_snapshot_restore($entry,$cats)){
+                @DEBUG (DEBUG_TRACE, __LINE__, __FUNCTION__, __FILE__,$entry,"Snaptshot restoring initiated!");
+                $this->dialogObject = new SnapShotDialog($this->config,$entry,$this);
+                $this->dialogObject->set_snapshot_bases($bases);
+                $this->dialogObject->display_all_removed_objects = true;
+                $this->dialogObject->display_restore_dialog = true;
+                $this->dialogObject->parent = &$this;
+            }else{
+                msg_dialog::display(_("Permission"),sprintf(_("You are not allowed to restore a snapshot for %s."),$entry),
+                        ERROR_DIALOG);
+            }
+        }else{
 
-    $ui = get_userinfo();
-    
-    $tabs = $this->get_tab_defs();
-
-    /* Add a single entry to queue */
-    if($s_action == "cut" || $s_action == "copy"){
-
-      /* Cleanup object queue */
-      $this->CopyPasteHandler->cleanup_queue();
-      $dn     = $this->terminals[$s_entry]['dn'];
-      $oc     = $this->terminals[$s_entry]['objectClass'];
-      $type   = $this->get_system_type($this->terminals[$s_entry]);
-
-      $tab_o  = $tabs[$type]['CLASS'];
-      $tab_c  = $tabs[$type]['TABCLASS'];
-      $acl_c  = $tabs[$type]['TABNAME'];
-      $acl    = $tabs[$type]['ACLC'];
-
-      if($s_action == "copy" && $ui->is_copyable($dn,$acl,$acl_c)){
-        $this->CopyPasteHandler->add_to_queue($dn,$s_action,$tab_c,$tab_o,$acl);
-      }
-      if($s_action == "cut" && $ui->is_cutable($dn,$acl,$acl_c)){
-        $this->CopyPasteHandler->add_to_queue($dn,$s_action,$tab_c,$tab_o,$acl);
-      }
-    }
+            // Display the restore points for a given object.
+            $dn = array_pop($target);
+            $entry = $headpage->getEntry($dn);
+            $type = $headpage->getType($dn);
+            if(!isset($pInfo[$type])) {
+                trigger_error('Unknown system type \''.$type.'\'!');
+                return;
+            }
 
-    /* Add entries to queue */
-    if($s_action == "copy_multiple" || $s_action == "cut_multiple"){
-
-      /* Cleanup object queue */
-      $this->CopyPasteHandler->cleanup_queue();
-
-      /* Add new entries to CP queue */
-      foreach($this->list_get_selected_items() as $id){
-        $dn = $this->terminals[$id]['dn'];
-        $oc = $this->terminals[$id]['objectClass']; 
-        $type = $this->get_system_type($this->terminals[$id]);
-
-        if(isset($tabs[$type])){
-          $tab_o  = $tabs[$type]['CLASS'];
-          $tab_c  = $tabs[$type]['TABCLASS'];
-          $acl_c  = $tabs[$type]['TABNAME'];
-          $acl    = $tabs[$type]['ACLC'];
-
-          if($s_action == "copy_multiple" && $ui->is_copyable($dn,$acl,$acl_c)){ 
-            $this->CopyPasteHandler->add_to_queue($dn,"copy",$tab_c,$tab_o,$acl);
-          }
-          if($s_action == "cut_multiple" && $ui->is_cutable($dn,$acl,$acl_c)){
-            $this->CopyPasteHandler->add_to_queue($dn,"cut",$tab_c,$tab_o,$acl);
-          }
+            if(!empty($dn) && $this->ui->allow_snapshot_create($dn,$pInfo[$type]['aclCategory'])){
+                @DEBUG (DEBUG_TRACE, __LINE__, __FUNCTION__, __FILE__,$dn,"Snaptshot restoring initiated!");
+                $this->dialogObject = new SnapShotDialog($this->config,$dn,$this);
+                $this->dialogObject->set_snapshot_bases($bases);
+                $this->dialogObject->display_restore_dialog = true;
+                $this->dialogObject->parent = &$this;
+            }else{
+                msg_dialog::display(_("Permission"),sprintf(_("You are not allowed to restore a snapshot for %s."),$dn),
+                        ERROR_DIALOG);
+            }
         }
-      }
     }
 
-    /* Start pasting entries */
-    if($s_action == "editPaste"){
-      $this->start_pasting_copied_objects = TRUE;
-    }
-  
-    /* Return C&P dialog */
-    if($this->start_pasting_copied_objects && $this->CopyPasteHandler->entries_queued()){
-
-      /* Get dialog */
-      $this->CopyPasteHandler->SetVar("base",$this->DivListSystem->selectedBase);
-      $data = $this->CopyPasteHandler->execute();
-
-      /* Return dialog data */
-      if(!empty($data)){
-        return($data);
-      }
-    }
 
-    /* Automatically disable status for pasting */
-    if(!$this->CopyPasteHandler->entries_queued()){
-      $this->start_pasting_copied_objects = FALSE;
-    }
-    return("");
-  }
-
-
-  function get_system_type($attrs)
-  {
-    $classes = $attrs['objectClass'];
-
-    $type= "";
-    if (in_array_ics('gosa_opsi_client', $classes)){
-      $type= "opsi_client";
-    }elseif (in_array_ics('sambaAccount', $classes) ||
-        in_array_ics('sambaSamAccount', $classes)){
-      $type= "winstation";
-    }elseif (in_array_ics('ieee802Device', $classes)){
-      $type= "component";
-    }elseif (in_array_ics('gotoTerminal', $classes)){
-      $type= "terminal";
-    }elseif (in_array_ics('gotoWorkstation', $classes)){
-      $type= "workstation";
-    }elseif (in_array_ics('gotoPrinter', $classes)){
-      $type= "printer";
-    }elseif (in_array_ics('goFonHardware', $classes)){
-      $type= "phone";
-    }elseif (in_array_ics('goServer', $classes)){
-      $type= "server";
-    }elseif (in_array_ics('GOhard', $classes) && !isset($attrs['gotoMode']) && $this->arp_handling_active){
-      $type= "ArpNewDevice";
-    }elseif (in_array_ics('GOhard', $classes)){
-      $type= "NewDevice";
+    /*! \brief  Restores a snapshot object.
+     *          The dn of the snapshot entry has to be given as ['target'] parameter.
+     *
+     *  @param  String  'action'  The name of the action which was the used as trigger.
+     *  @param  Array   'target'  A list of object dns, which should be affected by this method.
+     *  @param  Array   'all'     A combination of both 'action' and 'target'.
+     */
+    function restoreSnapshot($action="",$target=array(),$all=array())
+    {
+        $dn       = array_pop($target);
+        $this->snapHandler->restore_snapshot($dn);
+        @DEBUG (DEBUG_TRACE, __LINE__, __FUNCTION__, __FILE__,$dn,"Snaptshot restored!");
+        $this->closeDialogs();
     }
-    return ($type);
-  }
 
 
-  function convert_list($input)
-  {
-    $temp= "";
+    /*! \brief  Detects actions/events send by the ui
+     *           and the corresponding targets.
+     */
+    function detectPostActions()
+    {
+        $action= management::detectPostActions();
+        if(isset($_POST['abort_event_dialog']))  $action['action'] = "cancel";
+        if(isset($_POST['save_event_dialog']))  $action['action'] = "saveEvent";
+        if(isset($_POST['cd_create']))  $action['action'] = "initiateISOcreation";
+        if(isset($_GET['PerformIsoCreation']))  $action['action'] = "performIsoCreation";
+        if(isset($_POST['SystemTypeAborted']))  $action['action'] = "cancel";
+        if(isset($_POST['password_cancel']))  $action['action'] = "cancel";
+        if(isset($_POST['password_finish']))  $action['action'] = "passwordChangeConfirmed";
+
+        if(isset($_POST['new_goServer']))  $action['action'] = "new_goServer";
+        if(isset($_POST['new_gotoWorkstation']))  $action['action'] = "new_gotoWorkstation";
+        if(isset($_POST['new_gotoTerminal']))  $action['action'] = "new_gotoTerminal";
+        if(isset($_POST['new_gotoPrinter']))  $action['action'] = "new_gotoPrinter";
+        if(isset($_POST['new_goFonHardware']))  $action['action'] = "new_goFonHardware";
+        if(isset($_POST['new_ieee802Device']))  $action['action'] = "new_ieee802Device";
+        if(isset($_POST['new_FAKE_OC_OpsiHost']))  $action['action'] = "new_FAKE_OC_OpsiHost";
+
+        if(!is_object($this->tabObject) && !is_object($this->dialogObject)){
+            if(count($this->activationQueue)) $action['action'] = "handleActivationQueue";
+        }
 
-    $conv= array(
-        "D" => array("plugins/systems/images/select_default.png",_("Template")),
-        "F" => array("plugins/systems/images/select_phone.png",_("Phone")),
-        "C" => array("plugins/systems/images/select_component.png",_("Network device")),
-        "P" => array("plugins/systems/images/select_printer.png",_("Printer")),
+        if(isset($_POST['systemTypeChosen']))  $action['action'] = "systemTypeChosen";
 
-        "W" => array("plugins/systems/images/select_winstation.png",_("Windows workstation")),
+        return($action);
+    }
 
-        "L" => array("plugins/systems/images/select_workstation.png",_("Workstation")),
-        "S" => array("plugins/systems/images/select_server.png",_("Server")),
-        "T" => array("plugins/systems/images/select_terminal.png",_("Terminal")),
 
-        "LX" => array("plugins/systems/images/workstation_locked.png",_("Locked workstation")),
-        "SX" => array("plugins/systems/images/server_locked.png",_("Locked server")),
-        "TX" => array("plugins/systems/images/terminal_locked.png",_("Locked terminal")),
+    /*! \brief   Overridden render method of class management.
+     *            this allows us to add a release selection box.
+     */
+    function renderList()
+    {
+        $headpage = $this->getHeadpage();
+        $headpage->update();
+
+        $tD = $this->getObjectDefinitions();
+        $smarty = get_smarty();
+        foreach($tD as $name => $obj){
+            $smarty->assign("USE_".$name, (empty($obj['TABNAME']) || class_available($obj['TABNAME'])));
+        }
 
-        "LE" => array("plugins/systems/images/workstation_error.png",_("Workstation error")),
-        "SE" => array("plugins/systems/images/server_error.png",_("Server error")),
-        "TE" => array("plugins/systems/images/terminal_error.png",_("Terminal error")),
+        $display = $headpage->render();
+        return($this->getHeader().$display);
+    }
+
+
+    public function getObjectDefinitions()
+    {
+        $tabs = array(
+                "device" => array(
+                    "ou"          => get_ou('Device','DeviceRDN'),
+                    "plugClass"   => "Device",
+                    "tabClass"    => "DeviceTab",
+                    "tabDesc"     => "NEWDEVICETABS",
+                    "aclClass"    => "Device",
+                    "sendEvents"  => FALSE,
+                    "aclCategory" => "Device"),
+
+                "FAKE_OC_OpsiHost" => array(
+                    "ou"          => "",
+                    "plugClass"   => "opsiGeneric",
+                    "tabClass"    => "opsi_tabs",
+                    "tabDesc"     => "OPSITABS",
+                    "aclClass"    => "opsiGeneric",
+                    "sendEvents"  => TRUE,
+                    "aclCategory" => "opsi"),
+
+                "goServer" => array(
+                    "ou"          => get_ou("servgeneric", "serverRDN"),
+                    "plugClass"   => "servgeneric",
+                    "tabClass"    => "servtabs",
+                    "tabDesc"     => "SERVTABS",
+                    "aclClass"    => "servgeneric",
+                    "sendEvents"  => TRUE,
+                    "aclCategory" => "server"),
+
+                "gotoWorkstation" => array(
+                    "ou"          => get_ou("workgeneric", "workstationRDN"),
+                    "plugClass"   => "workgeneric",
+                    "tabClass"    => "worktabs",
+                    "tabDesc"     => "WORKTABS",
+                    "aclClass"    => "workgeneric",
+                    "sendEvents"  => TRUE,
+                    "aclCategory" => "workstation"),
+
+                "gotoTerminal" => array(
+                        "ou"          => get_ou("termgeneric", "terminalRDN"),
+                        "plugClass"   => "termgeneric",
+                        "tabClass"    => "termtabs",
+                        "sendEvents"  => TRUE,
+                        "tabDesc"     => "TERMTABS",
+                        "aclClass"    => "termgeneric",
+                        "aclCategory" => "terminal"),
+
+                "gotoPrinter" => array(
+                        "ou"          => get_ou("printgeneric", "printerRDN"),
+                        "plugClass"   => "printgeneric",
+                        "tabClass"    => "printtabs",
+                        "tabDesc"     => "PRINTTABS",
+                        "aclClass"    => "printgeneric",
+                        "sendEvents"  => FALSE,
+                        "aclCategory" => "printer"),
+
+                "FAKE_OC_NewDevice" => array(
+                        "ou"          => get_ou("ArpNewDevice", "systemIncomingRDN"),
+                        "plugClass"   => "termgeneric",
+                        "tabClass"    => "termtabs",
+                        "sendEvents"  => TRUE,
+                        "tabDesc"     => "TERMTABS",
+                        "aclClass"    => "termgeneric",
+                        "aclCategory" => "terminal"),
+
+                "goFonHardware" => array(
+                        "ou"          => get_ou("phoneGeneric", "phoneRDN"),
+                        "plugClass"   => "phoneGeneric",
+                        "tabClass"    => "phonetabs",
+                        "tabDesc"     => "PHONETABS",
+                        "sendEvents"  => FALSE,
+                        "aclClass"    => "phoneGeneric",
+                        "aclCategory" => "phone"),
+
+                "FAKE_OC_winstation" => array(
+                        "ou"          => get_winstations_ou(),
+                        "plugClass"   => "wingeneric",
+                        "sendEvents"  => TRUE,
+                        "tabClass"    => "wintabs",
+                        "tabDesc"     => "WINTABS",
+                        "aclClass"    => "wingeneric",
+                        "aclCategory" => "winworkstation"),
+
+                "ieee802Device" => array(
+                        "ou"          => get_ou("componentGeneric", "componentRDN"),
+                        "plugClass"   => "componentGeneric",
+                        "sendEvents"  => FALSE,
+                        "tabClass"    => "componenttabs",
+                        "tabDesc"     => "COMPONENTTABS",
+                        "aclClass"    => "componentGeneric",
+                        "aclCategory" => "component"),
+                );
+
+        // Now map some special types
+        $tabs['FAKE_OC_NewWorkstation'] = &$tabs['gotoWorkstation'];
+        $tabs['FAKE_OC_NewTerminal'] = &$tabs['gotoTerminal'];
+        $tabs['FAKE_OC_NewServer'] = &$tabs['gotoWorkstation'];
+        $tabs['gotoWorkstation__IS_BUSY'] = &$tabs['gotoWorkstation'];
+        $tabs['gotoWorkstation__IS_ERROR'] = &$tabs['gotoWorkstation'];
+        $tabs['gotoWorkstation__IS_LOCKED'] = &$tabs['gotoWorkstation'];
+        $tabs['gotoTerminal__IS_BUSY'] = &$tabs['gotoTerminal'];
+        $tabs['gotoTerminal__IS_ERROR'] = &$tabs['gotoTerminal'];
+        $tabs['gotoTerminal__IS_LOCKED'] = &$tabs['gotoTerminal'];
+        $tabs['FAKE_OC_TerminalTemplate'] = &$tabs['gotoTerminal'];
+        $tabs['FAKE_OC_WorkstationTemplate'] = &$tabs['gotoTerminal'];
+        $tabs['goServer__IS_BUSY'] = &$tabs['goServer'];
+        $tabs['goServer__IS_ERROR'] = &$tabs['goServer'];
+        $tabs['goServer__IS_LOCKED'] = &$tabs['goServer'];
+
+        $tabs['FAKE_OC_ArpNewDevice'] = &$tabs['FAKE_OC_NewDevice'];
+
+
+        // Remove those types, we cannot handle at the moment due to lack of 
+        //  installed GOsa-plugins.
+        foreach($tabs as $name => $tab){
+
+            if(!class_available($tab['plugClass'])) {
+                unset($tabs[$name]);
+            }
+        }
 
-        "LB" => array("plugins/systems/images/workstation_busy.png",_("Workstation busy")),
-        "SB" => array("plugins/systems/images/server_busy.png",_("Server busy")),
+        return($tabs);
+    }
 
-        "NQ" => array("plugins/systems/images/select_newsystem.png",_("New system from incoming")),
-        "NT" => array("plugins/systems/images/select_new_terminal.png",_("New terminal")),
-        "NL" => array("plugins/systems/images/select_new_workstation.png",_("New workstation")));
 
-    /* Add opsi client to system types */
-    if($this->opsi != NULL){
-        $conv["O"] = array("plugins/systems/images/select_winstation.png",_("Opsi client"));
+    static function filterSystemDescription($row,$dn,$pid,$state = '',$description=array())
+    {
+        $dn= LDAP::fix(func_get_arg(1));
+        $desc = isset($description[0])?set_post($description[0]):"";
+    
+        $rc = "";
+        switch($state){
+            case 'locked' : $rc = "<rowClass:entry-locked/><rowLabel:locked/>"; break;
+            case 'error' : $rc = "<rowClass:entry-error/><rowLabel:error/>"; break;
+            case 'busy' : $rc = "<rowClass:entry-busy/><rowLabel:busy/>"; break;
+            case 'warning' : $rc = "<rowClass:entry-warning/><rowLabel:warning/>"; break;
+        }
+        return("<a href='?plug=".$_GET['plug']."&amp;PID={$pid}&amp;act=listing_edit_{$row}' title='{$dn}'>".$desc."</a>{$rc}");
     }
 
-    /* Use locked icons 
-     */
-    if( in_array($input['type'],array("S","T","L")) && 
-        isset($input['gotoMode'][0]) && 
-        preg_match("/locked/",$input['gotoMode'][0])){
-      $input['type'].="X";
-    } elseif(in_array($input['type'],array("S","L")) &&
-        isset($input['FAIstate'][0])){
-
-    /* Add FAI state icons 
-     */
-      $type= "";
-      switch (preg_replace('/:.*$/', '', $input['FAIstate'][0])) {
-        case 'error':
-          $type= 'E';
-          break;
-        case 'installing':
-        case 'install':
-        case 'sysinfo':
-        case 'softupdate':
-        case 'scheduledupdate':
-          $type= 'B';
-          break;
-      }
-
-      $input['type'].= $type;
-    }   
-
-    /* Use new images if object is from incoming 
-     */
-    if((isset($input['is_new']))&&(!empty($input['is_new']))){
-      $input['type']="N".$input['type'];
-    }
 
-    /* Check which flags this objects uses 
-     */
-    foreach ($conv  as $key => $value){
-      $found = TRUE;
-      if(strlen($key) != strlen($input['type'])) {
-        $found = FALSE;
-      }
-      for($i = 0 ; $i < strlen($key) ; $i++){
-        if(!preg_match("/".$key[$i]."/",$input['type'])){
-          $found = FALSE;
+    static function filterLink()
+    {
+        $result= "&nbsp;";
+        $row= func_get_arg(0);
+        $pid= func_get_arg(4);
+        $dn= LDAP::fix(func_get_arg(1));
+        $params= array(func_get_arg(2));
+
+        // Collect sprintf params
+        for ($i = 3;$i < func_num_args();$i++) {
+            $val= func_get_arg($i);
+            if (is_array($val)){
+                $params[]= $val[0];
+                continue;
+            }
+            $params[]= $val;
         }
-     }
 
-      if($found){
-        $tmp['img'] ="<img class='center' src='".$value[0]."' alt='".$key."' title='".$value['1']."'>";
-        $tmp['class']=$key;
-        return $tmp;
-      }
+        $result= "&nbsp;";
+        $trans= call_user_func_array("sprintf", $params);
+        if ($trans != "") {
+            return("<a href='?plug=".$_GET['plug']."&amp;PID=$pid&amp;act=listing_edit_$row' title='$dn'>".$trans."</a>");
+        }
+        return $result;
     }
-  }
 
 
-  function list_get_selected_items()
-  {
-    $ids = array();
-    foreach($_POST as $name => $value){
-      if(preg_match("/^item_selected_[0-9]*$/",$name)){
-        $id   = preg_replace("/^item_selected_/","",$name);
-        $ids[$id] = $id;
-      }
-    }
-    return($ids);
-  }
-
-
-  public function get_tab_defs()
-  {
-    $tabs = array(
-        "incoming"    => array(
-          "CLASS"     => "",
-          "TABNAME"   => "",
-          "TABCLASS"  => "",
-          "ACLC"      => "incoming",
-          "ACL"       => "incoming/systems"),
-
-        "ArpNewDevice"=> array(
-          "CLASS"     => "TERMTABS",
-          "TABNAME"   => "termgeneric" ,
-          "TABCLASS"  => "termtabs",
-          "ACLC"      => "incoming",
-          "ACL"       => "incoming/systems"),
-
-        "NewDevice"   => array(
-          "CLASS"     => "TERMTABS",
-          "TABNAME"   => "termgeneric",
-          "TABCLASS"  => "termtabs",
-          "ACLC"      => "incoming",
-          "ACL"       => "incoming/systems"),
-
-        "terminal"    => array(
-            "CLASS"     => "TERMTABS",
-            "TABNAME"   => "termgeneric",
-            "TABCLASS"  => "termtabs",
-            "ACLC"      => "terminal",
-            "ACL"       => "terminal/termgeneric"),
-
-        "workstation" =>  array(
-            "CLASS"   => "WORKTABS",
-            "TABNAME" => "workgeneric",
-            "TABCLASS"=> "worktabs",
-            "ACLC"    => "workstation",
-            "ACL"     => "workstation/workgeneric" ),
-
-        "server"      => array(
-            "CLASS"   => "SERVTABS",
-            "TABNAME" => "servgeneric",
-            "TABCLASS"=> "servtabs",
-            "ACLC"    => "server",
-            "ACL"     => "server/servgeneric"),
-
-        "printer"     => array(
-            "CLASS"   => "PRINTTABS",
-            "TABNAME" => "printgeneric",
-            "TABCLASS"=> "printtabs",
-            "ACLC"    => "printer",
-            "ACL"     => "printer/printgeneric"),
-
-        "phone"       => array(
-            "CLASS"   => "PHONETABS",
-            "TABNAME" => "phoneGeneric",
-            "TABCLASS"=> "phonetabs",
-            "ACLC"    => "phone",
-            "ACL"     => "phone/phoneGeneric"),
-
-        "winstation"  => array(
-            "CLASS"   => "WINTABS",
-            "TABNAME" => "wingeneric",
-            "TABCLASS"=> "wintabs",
-            "ACLC"    => "winworkstation",
-            "ACL"     => "winworkstation/wingeneric"),
-
-        "component"   => array(
-            "CLASS"   => "COMPONENTTABS",
-            "TABNAME" => "componentGeneric",
-            "TABCLASS"=> "componenttabs",
-            "ACLC"    => "component",
-            "ACL"     => "component/componentGeneric"));
-
-    if($this->opsi != NULL){
-      $tabs["opsi_client"] = array(
-          "CLASS"   => "OPSITABS",
-          "TABNAME" => "opsiGeneric" ,
-          "TABCLASS"=> "opsi_tabs",
-          "ACLC"    => "opsi" ,
-          "ACL"     => "opsi/opsiGeneric");
-    }
+    static function systemRelease($a,$b,$c,$objectclasses= null,$class= null)
+    {
+        global $config;
 
-    return($tabs);
-  }
+        // No objectclasses set - go ahead
+        if(!$objectclasses) return("&nbsp;");
 
+        // Skip non fai objects
+        if (!in_array_ics("FAIobject", $objectclasses)) {
+            return "&nbsp;";
+        }
 
-  /*! \brief  Sets FAIstate to "install" for "New Devices".
-              This function is some kind of "Post handler" for activated systems,
-               it is called directly after the object (workstabs,servtabs) gets saved.  
-      @param  String  $dn   The dn of the newly activated object.
-      @return Boolean TRUE if activated else FALSE
-   */
-  function activate_new_device($dn)
-  {
-    $ldap = $this->config->get_ldap_link();
-    $ldap->cd($this->config->current['BASE']);
-    $ldap->cat($dn);
-    if($ldap->count()){
-      $attrs = $ldap->fetch();
-      $type  = $this->get_system_type($attrs);
-      if(!in_array($type,array("workstation","server"))) {
-        $ocs = $attrs['objectClass'];
-        unset($ocs['count']);
-        $new_attrs = array();
-        if(!in_array("FAIobject",$ocs)){
-          $ocs[] = "FAIobject";
-          $new_attrs['objectClass'] = $ocs;
+        // If we've an own fai class, just use this
+        if ($class && is_array($class)) {
+            foreach (explode(' ', $class[0]) as $element) {
+                if ($element[0] == ":") {
+                    return "&nbsp;".image('images/empty.png')."&nbsp;".mb_substr($element, 1);
+                }
+            }
         }
-        $new_attrs['FAIstate'] = "install";
-        $ldap->cd($dn);
-        $ldap->modify($new_attrs);
-        if (!$ldap->success()){
-          msg_dialog::display(_("LDAP error"), msgPool::ldaperror($ldap->get_error(), $this->dn, 
-                LDAP_MOD, "activate_new_device($dn)"));
-        }else{
-          return(TRUE);
+
+        // Load information if needed
+        $ldap = $config->get_ldap_link();
+        $ldap->cd($config->current['BASE']);
+        $ldap->search("(&(objectClass=gosaGroupOfNames)(FAIclass=*)(member=".$b."))",array('FAIclass','cn'));
+        while($attrs = $ldap->fetch()){
+            $rel = preg_replace("/^.*:/","",$attrs['FAIclass'][0]);
+            $sys = sprintf(_("Inherited from %s"),$attrs['cn'][0]);
+            $str = "&nbsp;".image('plugins/ogroups/images/ogroup.png', "", $sys)."&nbsp;".$rel;
+            return($str);
         }
-      }
+
+        return("&nbsp;");
     }
-    return(FALSE);
-  }
-
-
-  /* !! Incoming dummy acls, required to defined acls for incoming objects
-   */
-  static function plInfo()
-  {
-    return (array(
-          "plShortName"   => _("Incoming objects"),
-          "plDescription" => _("Incoming objects"),
-          "plSelfModify"  => FALSE,
-          "plDepends"     => array(),
-          "plPriority"    => 99,
-          "plSection"     => array("administration"),
-          "plCategory"    => array("incoming"   => array( "description"  => _("Incoming"),
-                                                          "objectClass"  => "")),
-          "plProvidedAcls"=> array()
-            
-          ));
-  }
-}
 
+
+    /*! \brief  !! Incoming dummy acls, required to defined acls for incoming objects
+     */
+    static function plInfo()
+    {
+        return (array(
+                    "plShortName"   => _("Incoming objects"),
+                    "plDescription" => _("Incoming objects"),
+                    "plSelfModify"  => FALSE,
+                    "plDepends"     => array(),
+                    "plPriority"    => 99,
+                    "plSection"     => array("administration"),
+
+                    "plProperties" =>
+                    array(
+                        array(
+                            "name"          => "systemRDN",
+                            "type"          => "rdn",
+                            "default"       => "ou=systems,",
+                            "description"   => _("RDN for system storage."),
+                            "check"         => "gosaProperty::isRdn",
+                            "migrate"       => "migrate_systemRDN",
+                            "group"         => "plugin",
+                            "mandatory"     => FALSE
+                            )
+                        ),
+
+
+            "plCategory"    => array("incoming"   => array( "description"  => _("Incoming"))),
+            "plProvidedAcls"=> array()
+                ));
+    }
+} 
 // vim:tabstop=2:expandtab:shiftwidth=2:filetype=php:syntax:ruler:
 ?>