diff --git a/contrib/openldap/core-fd.schema b/contrib/openldap/core-fd.schema
index 2d4f974f7ef9456136c3bad92234270f612911f7..af6f433b1057f1fe1744573f6a2f3d785cdcbb5d 100644
--- a/contrib/openldap/core-fd.schema
+++ b/contrib/openldap/core-fd.schema
@@ -119,10 +119,6 @@ objectclass ( 1.3.6.1.4.1.10098.1.2.1.19.6 NAME 'gosaAccount' SUP top AUXILIARY
         gosaDefaultLanguage $ academicTitle $ personalTitle $ dateOfBirth $
         sambaBadPasswordCount $ sambaBadPasswordTime $ gender $ gosaLoginRestriction ))
 
-objectclass ( 1.3.6.1.4.1.10098.1.2.1.19.11 NAME 'gosaUserTemplate' SUP top AUXILIARY
-  DESC 'Class for GOsa User Templates (v2.6.1)'
-  MUST ( cn ))
-
 objectclass ( 1.3.6.1.4.1.10098.1.2.1.19.12 NAME 'gosaGroupOfNames'
   DESC 'GOsa object grouping (v2.6.1)'
   SUP top STRUCTURAL
diff --git a/contrib/openldap/template-fd.schema b/contrib/openldap/template-fd.schema
index 53184227ea27449ae3c7d72c4772b6b921edd408..828ae9a9ffc69f253b70aad374866cea91d1a028 100644
--- a/contrib/openldap/template-fd.schema
+++ b/contrib/openldap/template-fd.schema
@@ -3,13 +3,13 @@
 ##
 
 # Attributes
-attributetype ( 1.3.6.1.4.1.38414.ID.1.1 NAME 'fdTemplateField'
+attributetype ( 1.3.6.1.4.1.38414.38.1.1 NAME 'fdTemplateField'
   DESC 'FusionDirectory - template field'
   EQUALITY caseExactIA5Match
   SYNTAX 1.3.6.1.4.1.1466.115.121.1.26)
 
 # Objectclasses
-objectclass (1.3.6.1.4.1.38414.ID.2.1 NAME 'fdTemplate'
+objectclass (1.3.6.1.4.1.38414.38.2.1 NAME 'fdTemplate'
   DESC 'FusionDirectory - template object'
   MUST ( cn )
   MAY ( fdTemplateField ) )
diff --git a/include/class_plugin.inc b/include/class_plugin.inc
index b9ebb5fd64c98cab01d2621250e093521e38dd88..aa4a5c138587d210ce7eb6f61fa44bd1ac850b4d 100644
--- a/include/class_plugin.inc
+++ b/include/class_plugin.inc
@@ -1,5 +1,4 @@
 <?php
-
 /*
   This code is part of FusionDirectory (http://www.fusiondirectory.org/)
   Copyright (C) 2003-2010  Cajus Pollmeier
@@ -81,6 +80,7 @@ class plugin
     \sa plugin::save() plugin::execute()
    */
   var $is_template    = FALSE;
+  var $template_cn    = FALSE;
   var $ignore_account = FALSE;
   var $is_modified    = FALSE;
 
@@ -188,8 +188,7 @@ class plugin
       if (isset($this->attrs['objectClass'])) {
         if (in_array_ics ("fdTemplate", $this->attrs['objectClass'])) {
           @DEBUG (DEBUG_TRACE, __LINE__, __FUNCTION__, __FILE__, "found", "Template check");
-          $this->is_template = TRUE;
-          $this->attrs = self::prepareTemplateAttrs($this->attrs);
+          $this->loadTemplateAttrs($this->attrs);
         }
       }
 
@@ -264,9 +263,14 @@ class plugin
     }
   }
 
-  static function prepareTemplateAttrs($template_attrs)
+  protected function loadTemplateAttrs($template_attrs)
   {
+    $this->is_template = TRUE;
+    if ($this->mainTab) {
+      $this->template_cn = $template_attrs['cn'][0];
+    }
     /* Translate template attrs into $attrs as if taken from LDAP */
+    unset($template_attrs['fdTemplateField']['count']);
     sort($template_attrs['fdTemplateField']);
     $attrs = array();
     foreach ($template_attrs['fdTemplateField'] as $field) {
@@ -279,22 +283,52 @@ class plugin
         $attrs[$m[1]]['count']  = 1;
       }
     }
-    return $attrs;
+    $this->attrs = $attrs;
   }
 
   protected function saveTemplateAttrs()
   {
-    $template_attrs = array('objectClass' => 'fdTemplate', 'fdTemplateField' => array());
-    /* Translate $attrs into template attrs */
-    foreach ($this->attrs as $key => $value) {
-      if (empty($value)) {
-        continue;
+    $ldap = $this->config->get_ldap_link();
+    $ldap->cat($this->dn);
+    $template_attrs = $ldap->fetch();
+    if (!$template_attrs) {
+      if (!$this->mainTab) {
+        trigger_error('It seems main tab has not been saved.');
       }
-      unset($value['count']);
-      foreach ($value as $v) {
-        $template_attrs['fdTemplateField'][] = $key.':'.$v;
+      $template_attrs = array(
+        'objectClass'     => array('fdTemplate'),
+        'fdTemplateField' => array()
+      );
+    }
+    if ($this->mainTab) {
+      $template_attrs['cn'] = $this->template_cn;
+    }
+    unset($template_attrs['fdTemplateField']['count']);
+    /* First remove all concerned values */
+    foreach ($template_attrs['fdTemplateField'] as $key => $value) {
+      preg_match('/^([^:]+):(.*)$/', $value, $m);
+      if (isset($this->attrs[$m[1]])) {
+        unset($template_attrs['fdTemplateField'][$key]);
+      }
+    }
+    /* Then insert non-empty values */
+    foreach ($this->attrs as $key => $value) {
+      if (is_array($value)) {
+        foreach ($value as $v) {
+          if ($value == "") {
+            continue;
+          }
+          $template_attrs['fdTemplateField'][] = $key.':'.$v;
+        }
+      } else {
+        if ($value == "") {
+          continue;
+        }
+        $template_attrs['fdTemplateField'][] = $key.':'.$value;
       }
     }
+    sort($template_attrs['fdTemplateField']);
+    print_r($template_attrs);
     return $template_attrs;
   }
 
diff --git a/include/class_tabs.inc b/include/class_tabs.inc
index 88031056f1f7004e99b0ca37e9f1d07d9910abd1..3d66cd848591b6dfd1b4f29a0d53db3e48252563 100644
--- a/include/class_tabs.inc
+++ b/include/class_tabs.inc
@@ -312,7 +312,7 @@ class tabs
 
     /* Check all plugins */
     foreach ($this->by_object as $key => &$obj) {
-      if ($obj->is_account || $obj->ignore_account) {
+      if (($obj->is_account || $obj->ignore_account) && (!$obj->is_template)) {
         @DEBUG (DEBUG_TRACE, __LINE__, __FUNCTION__, __FILE__, $key, "Checking");
 
         $msg = $obj->check();
@@ -420,5 +420,15 @@ class tabs
     }
     unset($obj);
   }
+
+  function setTemplateMode($cn)
+  {
+    $this->getBaseObject()->template_cn = $cn;
+
+    foreach ($this->by_object as &$obj) {
+      $obj->is_template = TRUE;
+    }
+    unset($obj);
+  }
 }
 ?>
diff --git a/plugins/admin/groups/class_group.inc b/plugins/admin/groups/class_group.inc
index c6534c31af33247f4d26b4aafb6dd2208b820e96..9e81bfdea497c5ff048da85e5bec9f8d5f5d03bd 100644
--- a/plugins/admin/groups/class_group.inc
+++ b/plugins/admin/groups/class_group.inc
@@ -606,7 +606,7 @@ class group extends plugin
     /* Create display list of users matching regex & filter
      */
     $this->displayUsers = array();
-    $filter = "(&(objectClass=gosaAccount)(!(objectClass=gosaUserTemplate))(!(uid=*$))(|(uid=".$regex.")(sn=".$regex.")(givenName=".$regex.")))";
+    $filter = "(&(objectClass=gosaAccount)(!(uid=*$))(|(uid=".$regex.")(sn=".$regex.")(givenName=".$regex.")))";
 
     /* Search in current tree or within subtrees depending on the checkbox from filter section */
     if($gufilter['SubSearchGroup']){
diff --git a/plugins/admin/groups/userGroupSelect/selectUserGroup-filter.xml b/plugins/admin/groups/userGroupSelect/selectUserGroup-filter.xml
index c0442846e7c70be9e89a9068284b20cf9673d29c..76f99f7c93b97f210f8e4a8589a2f0fa99a5f951 100644
--- a/plugins/admin/groups/userGroupSelect/selectUserGroup-filter.xml
+++ b/plugins/admin/groups/userGroupSelect/selectUserGroup-filter.xml
@@ -45,7 +45,7 @@
     <type>checkbox</type>
     <tag>USER</tag>
     <default>true</default>
-    <set>(&amp;(objectClass=posixAccount)(!(objectClass=gosaUserTemplate)))</set>
+    <set>(objectClass=posixAccount)</set>
     <unset></unset>
   </element>
 
diff --git a/plugins/admin/ogroups/class_ogroup.inc b/plugins/admin/ogroups/class_ogroup.inc
index b0ebe27c841c3445cd2381039b0eb140b52c20f0..506ac95cb6e0c23d28183bde36d1098a0e8b3a68 100644
--- a/plugins/admin/ogroups/class_ogroup.inc
+++ b/plugins/admin/ogroups/class_ogroup.inc
@@ -673,7 +673,7 @@ class ogroup extends plugin
     $type= "I";
 
     foreach(array(
-          "Y" => "gosaUserTemplate",
+          "Y" => "fdTemplate",
           "U" => "gosaAccount",
           "G" => "posixGroup",
           "A" => "gosaApplication",
diff --git a/plugins/admin/ogroups/objectSelect/selectObject-filter.xml b/plugins/admin/ogroups/objectSelect/selectObject-filter.xml
index 5cc3f205a53f615a4bfa08a179682a0b3c163fd1..5a12e616efae9a4cca8f3944751a7ff00bbd5907 100644
--- a/plugins/admin/ogroups/objectSelect/selectObject-filter.xml
+++ b/plugins/admin/ogroups/objectSelect/selectObject-filter.xml
@@ -61,7 +61,7 @@
     <type>checkbox</type>
     <tag>USER</tag>
     <default></default>
-    <set>(&amp;(objectClass=gosaAccount)(!(objectClass=gosaUserTemplate)))</set>
+    <set>(objectClass=gosaAccount)</set>
     <unset></unset>
   </element>
 
@@ -88,7 +88,7 @@
     <unset></unset>
     <set>(objectClass=gosaApplication)</set>
   </element>
-  
+
   <element>
     <type>checkbox</type>
     <tag>SERVER</tag>
diff --git a/plugins/admin/users/class_userManagement.inc b/plugins/admin/users/class_userManagement.inc
index d9935cf2190a58bcc94625d5e266c668689bc210..9d8cffe85ee008d73041551a11f0e540bcee221b 100644
--- a/plugins/admin/users/class_userManagement.inc
+++ b/plugins/admin/users/class_userManagement.inc
@@ -176,10 +176,10 @@ class userManagement extends management
 
   /*! \brief  Intiates template creation.
    */
-  function newTemplate($action,$entry)
+  function newTemplate($action, $entry)
   {
     $this->newEntry();
-    $this->tabObject->set_template_mode ();
+    $this->tabObject->setTemplateMode('template_tmp'); // FIXME : this needs to be chosen by the user
   }
 
 
@@ -766,7 +766,7 @@ class userManagement extends management
       if (preg_match("/c/",$acl)) {
         // Search all templates from the current dn.
         $ldap->cd(get_people_ou().$value);
-        $ldap->search("(objectClass=gosaUserTemplate)", array('cn'));
+        $ldap->search("(&(fdTemplateField=objectClass:person)(objectClass=fdTemplate))", array('cn'));
         if ($ldap->count() != 0) {
           while ($attrs = $ldap->fetch()) {
             $templates[$ldap->getDN()] = $attrs['cn'][0]." - ".LDAP::fix($key);
diff --git a/plugins/admin/users/user-filter.xml b/plugins/admin/users/user-filter.xml
index 5af0b0c8b20c922e84c659632f617743fb35aea1..02aaaf5edef82abbca18db98cad2f0c970349788 100644
--- a/plugins/admin/users/user-filter.xml
+++ b/plugins/admin/users/user-filter.xml
@@ -10,7 +10,7 @@
   <search>
     <query>
       <backend>LDAP</backend>
-      <filter>(&amp;(objectClass=gosaAccount)$TEMPLATES$NAME(|$FUNCTIONAL$SAMBA$POSIX$MAIL))</filter>
+      <filter>(&amp;$NAME(|(&amp;(objectClass=gosaAccount)(|$FUNCTIONAL$SAMBA$POSIX$MAIL))$TEMPLATES))</filter>
       <attribute>dn</attribute>
       <attribute>objectClass</attribute>
       <attribute>givenName</attribute>
@@ -44,8 +44,8 @@
     <type>checkbox</type>
     <tag>TEMPLATES</tag>
     <default></default>
-    <unset>(!(objectClass=gosaUserTemplate))</unset>
-    <set></set>
+    <unset></unset>
+    <set>(objectClass=fdTemplate)</set>
   </element>
 
   <element>
diff --git a/plugins/admin/users/user-list.xml b/plugins/admin/users/user-list.xml
index 1e4b230bcb525a797ea86ad5d143e7c21db28309..6069f02ef1f6cca67908d9c4dcc8b22eb52df34c 100644
--- a/plugins/admin/users/user-list.xml
+++ b/plugins/admin/users/user-list.xml
@@ -13,7 +13,7 @@
 
     <objectType>
       <label>Template</label>
-      <objectClass>gosaUserTemplate</objectClass>
+      <objectClass>fdTemplate</objectClass>
       <category>users</category>
       <class>user</class>
       <image>plugins/users/images/select_template.png</image>
@@ -188,13 +188,13 @@
       <name>newfromtpl</name>
       <type>entry</type>
       <image>images/lists/new.png</image>
-      <objectclass>gosaUserTemplate</objectclass>
+      <objectclass>fdTemplate</objectclass>
       <label>New user from template</label>
     </action>
 
     <action>
       <name>cp</name>
-      <objectclass>!gosaUserTemplate</objectclass>
+      <objectclass>!fdTemplate</objectclass>
       <type>copypaste</type>
     </action>
 
@@ -209,7 +209,7 @@
     <action>
       <name>lock</name>
       <type>entry</type>
-      <objectclass>!gosaUserTemplate</objectclass>
+      <objectclass>!fdTemplate</objectclass>
       <image>%{filter:lockImage(userPassword)}</image>
       <acl>users/password[w]</acl>
       <label>%{filter:lockLabel(userPassword)}</label>
@@ -218,7 +218,7 @@
     <action>
       <name>password</name>
       <type>entry</type>
-      <objectclass>!gosaUserTemplate</objectclass>
+      <objectclass>!fdTemplate</objectclass>
       <acl>users/password[w]</acl>
       <image>plugins/users/images/list_password.png</image>
       <label>Change password</label>
@@ -227,7 +227,7 @@
     <action>
       <name>snapshot</name>
       <type>snapshot</type>
-      <objectclass>!gosaUserTemplate</objectclass>
+      <objectclass>!fdTemplate</objectclass>
     </action>
 
     <action>
diff --git a/plugins/personal/generic/class_user.inc b/plugins/personal/generic/class_user.inc
index fcd6387fa3c284fa0ab1d6e0254ca44d3dfb0f99..6fb86d15919cbea650bb7c880c00e67f9f02d8f5 100644
--- a/plugins/personal/generic/class_user.inc
+++ b/plugins/personal/generic/class_user.inc
@@ -349,6 +349,11 @@ class user extends simplePlugin
 
   function compute_dn()
   {
+    if ($this->is_template) {
+      $dn = 'cn='.$this->template_cn.',ou=templates,'.get_people_ou().$this->base;
+      return $dn;
+    }
+
     $this->update_cn();
     // Handle accountRDN if filled
     $attribute  = '';
@@ -384,7 +389,7 @@ class user extends simplePlugin
     }
 
     /* Remove ACL dependencies too */
-    if ($this->dn != $this->orig_dn && $this->orig_dn != 'new') {
+    if (($this->dn != $this->orig_dn) && ($this->orig_dn != 'new') && (!$this->is_template)) {
       $tmp = new acl($this->config, $this->dn, $this);
       $tmp->update_acl_membership($this->orig_dn, $this->dn);
     }
diff --git a/plugins/personal/posix/class_posixAccount.inc b/plugins/personal/posix/class_posixAccount.inc
index 4e1f6b448edbfead4963adeb254ec2f4e9815b66..6c3ac637f534dc216f94ba1e5a96be957b75f73f 100644
--- a/plugins/personal/posix/class_posixAccount.inc
+++ b/plugins/personal/posix/class_posixAccount.inc
@@ -603,13 +603,13 @@ class posixAccount extends simplePlugin
       }
     }
 
-    $ldap->cd($this->config->current['BASE']);
-    $ldap->search("(&(objectClass=gosaUserTemplate)(uid=$template)(accessTo=*))", array("cn","accessTo"));
-    while ($attr = $ldap->fetch()) {
-      $tmp = $attr['accessTo'];
-      unset($tmp['count']);
-      $this->accessTo = $tmp;
-    }
+    //~ $ldap->cd($this->config->current['BASE']);
+    //~ $ldap->search("(&(objectClass=gosaUserTemplate)(uid=$template)(accessTo=*))", array("cn","accessTo"));
+    //~ while ($attr = $ldap->fetch()) {
+      //~ $tmp = $attr['accessTo'];
+      //~ unset($tmp['count']);
+      //~ $this->accessTo = $tmp;
+    //~ }
   }
 }