diff --git a/html/setup.php b/html/setup.php
index 3b4271ae4398851c7851b50d35c7bd6688fc4708..ecac7101859b2ea39a7ae7ffe3ef91ff05f765d6 100644
--- a/html/setup.php
+++ b/html/setup.php
@@ -101,6 +101,8 @@ if (!session::global_is_set('config')) {
 $config = session::global_get('config');
 load_plist(FALSE);
 IconTheme::loadThemes('themes');
+/* Fake user bypassing acl system */
+$ui = new fake_userinfo();
 /* Call setup */
 $display = "";
 require_once("../setup/main.inc");
diff --git a/setup/class_setup.inc b/setup/class_setup.inc
index 086b42ee7b2c9c173ad6626d6eb910c7b649c11d..7e92a630c123c7480f8ab19aa2d7fa2abc9e672a 100644
--- a/setup/class_setup.inc
+++ b/setup/class_setup.inc
@@ -22,6 +22,25 @@
 
 require_once("class_setupStep.inc");
 
+class fake_userinfo extends userinfo
+{
+  function __construct()
+  {
+    global $config;
+    $this->config = &$config;
+
+    $this->cn   = 'fake_cn';
+    $this->dn   = 'fake_dn';
+    $this->uid  = 'fake_uid';
+    $this->ip   = $_SERVER['REMOTE_ADDR'];
+
+    /* This fake user have all rights */
+    $this->ignoreACL = TRUE;
+
+    /* Initialize ACL_CACHE */
+    $this->reset_acl_cache();
+  }
+}
 
 class setup
 {
diff --git a/setup/class_setupStep.inc b/setup/class_setupStep.inc
index 21af134c912aeb85acbedaf88e3ab8ef3977a61b..6756ec225b755388c81c2c4d16023e4855c2ec15 100644
--- a/setup/class_setupStep.inc
+++ b/setup/class_setupStep.inc
@@ -102,32 +102,6 @@ class setupStep extends simplePlugin
     return $tmp;
   }
 
-  /* bypass acl system as there is no user login */
-  function acl_is_writeable($attribute, $skip_write = FALSE)
-  {
-    return TRUE;
-  }
-  function acl_is_readable($attribute)
-  {
-    return TRUE;
-  }
-  function acl_is_createable($base = "")
-  {
-    return TRUE;
-  }
-  function acl_is_removeable($base = "")
-  {
-    return TRUE;
-  }
-  function acl_is_moveable($base = "")
-  {
-    return TRUE;
-  }
-  function getacl($attribute, $skip_write = FALSE)
-  {
-    return 'cmdrw';
-  }
-
   /* bypass LDAP loading */
   protected function loadAttributes()
   {
diff --git a/setup/class_setupStep_Migrate.inc b/setup/class_setupStep_Migrate.inc
index efb42d220d891e5812a4eafb4f0308deb48c55cd..7b1d4b106f89ece8bdd82e574d74d0181447b087 100644
--- a/setup/class_setupStep_Migrate.inc
+++ b/setup/class_setupStep_Migrate.inc
@@ -968,6 +968,8 @@ class Step_Migrate extends setupStep
       $dn = 'cn='.$role['cn'].','.get_ou('aclRoleRDN').$config->current['BASE'];
       $ldap->cat($dn);
       if ($ldap->count() == 0) {
+        $ldap->cd($config->current['BASE']);
+        $ldap->create_missing_trees(get_ou('aclRoleRDN').$config->current['BASE']);
         $ldap->cd($dn);
         $ldap->add($role);
         if (!$ldap->success()) {
@@ -975,7 +977,7 @@ class Step_Migrate extends setupStep
             _('Migration error'),
             sprintf(
               _('Cannot add ACL role "%s":').'<br/><br/><i>%s</i>',
-              LDAP::fix($roledn), $ldap->get_error()
+              LDAP::fix($dn), $ldap->get_error()
             ),
             ERROR_DIALOG
           );