diff --git a/inc/acl_admin.php b/inc/acl_admin.php
deleted file mode 100644
index f7cd7fbd7d9beb4d7826e4203e0ed86079e624a1..0000000000000000000000000000000000000000
--- a/inc/acl_admin.php
+++ /dev/null
@@ -1,121 +0,0 @@
-<?php
-/**
- * $ID is pagename, reads matching lines from $AUTH_ACL,
- * also reads acls from namespace
- * returns multi-array with key=pagename and value=array(user, acl)
- *
- * @author	Frank Schubert <frank@schokilade.de>
- */
-function get_acl_config($ID){
-  global $AUTH_ACL;
-  
-  $acl_config=array();
-  
-  // match exact name
-  $matches = preg_grep('/^'.$ID.'\s+.*/',$AUTH_ACL);
-  if(count($matches)){
-    foreach($matches as $match){
-      $match = preg_replace('/#.*$/','',$match); //ignore comments
-      $acl   = preg_split('/\s+/',$match);
-      //0 is pagename, 1 is user, 2 is acl
-      $acl_config["$acl[0]"][]=array($acl[1],$acl[2]);
-    }
-  }
-  
-  $specific_found=array();
-  // match ns
-  if(($ID=getNS($ID)) !== false){
-    $matches = preg_grep('/^'.$ID.':\*\s+.*/',$AUTH_ACL);
-    if(count($matches)){
-      foreach($matches as $match){
-	$match = preg_replace('/#.*$/','',$match); //ignore comments
-	$acl   = preg_split('/\s+/',$match);
-	//0 is pagename, 1 is user, 2 is acl
-	$acl_config["$acl[0]"][]=array($acl[1],$acl[2]);
-	$specific_found[]=$acl[1];
-      }
-    }
-  }
-  
-  //include *-config
-  $matches = preg_grep('/^\*\s+.*/',$AUTH_ACL);
-  if(count($matches)){
-    foreach($matches as $match){
-      $match = preg_replace('/#.*$/','',$match); //ignore comments
-      $acl   = preg_split('/\s+/',$match);
-      // only include * for this user if not already found in ns
-      if(!in_array($acl[1], $specific_found)){
-        //0 is pagename, 1 is user, 2 is acl
-        $acl_config["$acl[0]"][]=array($acl[1],$acl[2]);
-      }
-    }
-  }
-  
-  //sort
-  //FIXME: better sort algo: first sort by key, then sort by first value
-  krsort($acl_config, SORT_STRING);
-  
-  return($acl_config);
-}
-
-/**
- * adds new acl-entry to conf/acl.auth
- *
- * @author	Frank Schubert <frank@schokilade.de>
- */
-function acl_admin_add($acl_scope, $acl_user, $acl_level){
-  if($acl_scope === '' || $acl_user === '' || $acl_level === '') { return false; }
-  
-  $acl_config = join("",file('conf/acl.auth'));
-  
-  // max level for pagenames is 2
-  if(strpos("*", $acl_scope) === false) {
-    if($acl_level > 2) { $acl_level = 2; }
-  }
-  
-  $new_acl = "$acl_scope\t$acl_user\t$acl_level\n";
-  
-  $new_config = $acl_config.$new_acl;
-  
-  return io_saveFile("conf/acl.auth", $new_config);
-}
-
-/**
- * remove acl-entry from conf/acl.auth
- *
- * @author	Frank Schubert <frank@schokilade.de>
- */
-function acl_admin_del($acl_scope, $acl_user, $acl_level){
-  if($acl_scope === '' || $acl_user === '' || $acl_level === '') { return false; }
-  
-  $acl_pattern = preg_quote($acl_scope)."\s+".$acl_user."\s+".$acl_level."\n";
-  
-  $acl_config = file('conf/acl.auth');
-  
-  // save all non!-matching
-  $new_config = preg_grep("/$acl_pattern/", $acl_config, PREG_GREP_INVERT);
-  
-  return io_saveFile("conf/acl.auth", join("",$new_config));
-}
-
-/**
- * change existing acl entries
- *
- * @author	Frank Schubert <frank@schokilade.de>
- */
-function acl_admin_change($acl_scope, $acl_user, $acl_level, $acl_checkbox){
-  
-  $new_level = 0;
-  if(is_array($acl_checkbox)) {
-    foreach($acl_checkbox as $acl_num => $value){
-      if( ($value == "on") && 
-          ($acl_num > $new_level)) {
-	$new_level = $acl_num;
-      }
-    }
-  }
-  
-  acl_admin_del($acl_scope, $acl_user, $acl_level);
-  acl_admin_add($acl_scope, $acl_user, $new_level);
-}
-?>
diff --git a/inc/actions.php b/inc/actions.php
index e660c136b1008c1c1186a821b135ee2edeb4bda3..282d36ae7f7b37aa954d36c40d817ccc16139a52 100644
--- a/inc/actions.php
+++ b/inc/actions.php
@@ -59,9 +59,19 @@ function act_dispatch(){
     $ACT = 'show';
   }
 
+  //handle admin tasks
+  if($ACT == 'admin'){
+		if($_REQUEST['page'] == 'acl'){
+			require_once(DOKU_INC.'inc/admin_acl.php');
+			admin_acl_handler();
+		}
+  }
+
   //call template FIXME: all needed vars available?
   header('Content-Type: text/html; charset=utf-8'); 
   include(DOKU_INC.'tpl/'.$conf['template'].'/main.php');
+  // output for the commands is now handled in inc/templates.php
+  // in function tpl_content()
 }
 
 /**
@@ -85,7 +95,7 @@ function act_clean($act){
   if(!array_search($act,array('login','logout','register','save','edit',
                               'preview','export_raw','export_html',
                               'search','show','check','index','revisions',
-                              'diff','recent','backlink',))){
+                              'diff','recent','backlink','admin',))){
     msg('Unknown command: '.htmlspecialchars($act),-1);
     return 'show';
   }
@@ -108,6 +118,8 @@ function act_permcheck($act){
     }
   }elseif(in_array($act,array('login','register','search','recent'))){
     $permneed = AUTH_NONE;
+  }elseif($act == 'admin'){
+    $permneed = AUTH_ADMIN;
   }else{
     $permneed = AUTH_READ;
   }
diff --git a/inc/admin_acl.php b/inc/admin_acl.php
new file mode 100644
index 0000000000000000000000000000000000000000..9732318f0804fb44bf87959ff16280a74610ca7e
--- /dev/null
+++ b/inc/admin_acl.php
@@ -0,0 +1,388 @@
+<?php
+/**
+ * ACL administration functions
+ *
+ * @license    GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ * @author     Frank Schubert <frank@schokilade.de>
+ */
+
+function admin_acl_handler(){
+  $cmd   = $_REQUEST['acl_cmd'];
+  $scope = $_REQUEST['acl_scope'];
+  $type  = $_REQUEST['acl_type'];
+  $user  = $_REQUEST['acl_user'];
+  $perm  = $_REQUEST['acl_perm'];
+  if(is_array($perm)){
+    $perm = array_pop(sort($perm)); //use the maximum
+  }else{
+    $perm = 0;
+  }
+
+  //sanitize
+  $user  = cleanID($user);
+  if($type == '@') $user = '@'.$user;
+  if($perm > AUTH_UPLOAD) $perm = AUTH_UPLOAD;
+  //FIXME sanitize scope!!!
+
+
+  //FIXME add should delete if nessary, too
+  if($cmd == 'add'){
+    admin_acl_add($scope, $user, $perm); //add feedback?
+  }elseif($cmd == 'update'){
+  	admin_acl_del($scope, $user, $perm);
+    admin_acl_add($scope, $user, $perm);	
+  }elseif($cmd == 'delete'){
+		admin_acl_del($scope, $user, $perm);
+  }
+
+}
+
+/**
+ * Get matching ACL lines for a page
+ *
+ * $ID is pagename, reads matching lines from $AUTH_ACL,
+ * also reads acls from namespace
+ * returns multi-array with key=pagename and value=array(user, acl)
+ *
+ * @todo    Fix comment to make sense
+ * @todo    should this moved to auth.php?
+ * @todo    can this be combined with auth_aclcheck to avoid duplicate code?
+ * @author  Frank Schubert <frank@schokilade.de>
+ */
+function get_acl_config($ID){
+  global $AUTH_ACL;
+  
+  $acl_config=array();
+  
+  // match exact name
+  $matches = preg_grep('/^'.$ID.'\s+.*/',$AUTH_ACL);
+  if(count($matches)){
+    foreach($matches as $match){
+      $match = preg_replace('/#.*$/','',$match); //ignore comments
+      $acl   = preg_split('/\s+/',$match);
+      //0 is pagename, 1 is user, 2 is acl
+      $acl_config[$acl[0]][] = array( 'name' => $acl[1], 'perm' => $acl[2]);
+    }
+  }
+  
+  $specific_found=array();
+  // match ns
+  if(($ID=getNS($ID)) !== false){
+    $matches = preg_grep('/^'.$ID.':\*\s+.*/',$AUTH_ACL);
+    if(count($matches)){
+      foreach($matches as $match){
+        $match = preg_replace('/#.*$/','',$match); //ignore comments
+        $acl   = preg_split('/\s+/',$match);
+        //0 is pagename, 1 is user, 2 is acl
+        $acl_config[$acl[0]][] = array( 'name' => $acl[1], 'perm' => $acl[2]);
+        $specific_found[]=$acl[1];
+      }
+    }
+  }
+  
+  //include *-config
+  $matches = preg_grep('/^\*\s+.*/',$AUTH_ACL);
+  if(count($matches)){
+    foreach($matches as $match){
+      $match = preg_replace('/#.*$/','',$match); //ignore comments
+      $acl   = preg_split('/\s+/',$match);
+      // only include * for this user if not already found in ns
+      if(!in_array($acl[1], $specific_found)){
+        //0 is pagename, 1 is user, 2 is acl
+        $acl_config[$acl[0]][] = array( 'name' => $acl[1], 'perm' => $acl[2]);
+      }
+    }
+  }
+  
+  //sort
+  //FIXME: better sort algo: first sort by key, then sort by first value
+  krsort($acl_config, SORT_STRING);
+ 
+  return($acl_config);
+}
+
+
+/**
+ * adds new acl-entry to conf/acl.auth
+ *
+ * @author  Frank Schubert <frank@schokilade.de>
+ */
+function admin_acl_add($acl_scope, $acl_user, $acl_level){
+  if($acl_scope === '' || $acl_user === '' || $acl_level === '') return false;
+  
+  $acl_config = join("",file('conf/acl.auth'));
+  
+  // max level for pagenames is edit
+  if(strpos("*", $acl_scope) === false) {
+    if($acl_level > AUTH_EDIT) $acl_level = AUTH_EDIT;
+  }
+  
+  $new_acl = "$acl_scope\t$acl_user\t$acl_level\n";
+  
+  $new_config = $acl_config.$new_acl;
+  
+  return io_saveFile("conf/acl.auth", $new_config);
+}
+
+/**
+ * remove acl-entry from conf/acl.auth
+ *
+ * @author  Frank Schubert <frank@schokilade.de>
+ */
+function admin_acl_del($acl_scope, $acl_user, $acl_level){
+  if($acl_scope === '' || $acl_user === '' || $acl_level === '') return false;
+  
+  $acl_pattern = preg_quote($acl_scope)."\s+".$acl_user."\s+".$acl_level."\n";
+  
+  $acl_config = file('conf/acl.auth');
+  
+  // save all non!-matching
+  $new_config = preg_grep("/$acl_pattern/", $acl_config, PREG_GREP_INVERT);
+  
+  return io_saveFile("conf/acl.auth", join("",$new_config));
+}
+
+// --- HTML OUTPUT FUNCTIONS BELOW --- //
+
+/**
+ * ACL Output function
+ *
+ * print a table with all significant permissions for the
+ * current id
+ *
+ * @author  Frank Schubert <frank@schokilade.de>
+ * @author  Andreas Gohr <andi@splitbrain.org>
+ */
+function admin_acl_html(){
+  global $ID;
+
+  print parsedLocale('admin_acl');
+
+	ptln('<div class="acladmin"');
+  ptln('<table class="inline">');
+
+  //new
+  admin_acl_html_new();
+
+  //current config
+  $acls = get_acl_config($ID);
+  foreach ($acls as $id => $acl){
+    admin_acl_html_current($id,$acl); 
+  }
+
+  ptln('</table>');
+  ptln('</div>');
+}
+
+/**
+ * print tablerows with the current permissions for one id
+ *
+ * @author  Frank Schubert <frank@schokilade.de>
+ * @author  Andreas Gohr <andi@splitbrain.org>
+ */
+function admin_acl_html_dropdown($id){
+  global $lang;
+  $cur = $id;
+  $ret = '';
+  $opt = array();
+
+  //prepare all options
+
+  // current page
+  $opt[] = array('key'=> $id, 'val'=> $id.' ('.$lang['page'].')');
+
+  // additional namespaces
+  while(($id=getNS($id)) !== false){
+    $opt[] = array('key'=> $id.':*', 'val'=> $id.':* ('.$lang['namespace'].')');
+  }
+
+  // the top namespace
+  $opt[] = array('key'=> '*', 'val'=> '* ('.$lang['namespace'].')');
+
+  // set sel on second entry (current namespace)
+  $opt[1]['sel'] = ' selected="selected"';
+
+  // flip options
+  $opt = array_reverse($opt);
+
+  // create HTML
+  $att = array( 'name'  => 'acl_scope',
+                'class' => 'edit',
+                'title' => $lang['page'].'/'.$lang['namespace']);
+  $ret .= '<select '.html_attbuild($att).' />';
+  foreach($opt as $o){
+    $ret .= '<option value="'.$o['key'].'"'.$o['sel'].'>'.$o['val'].'</option>';
+  }
+  $ret .= '</select>';
+
+  return $ret;
+}
+
+/**
+ * print tablerows with the current permissions for one id
+ *
+ * @author  Frank Schubert <frank@schokilade.de>
+ * @author  Andreas Gohr <andi@splitbrain.org>
+ */
+function admin_acl_html_new(){
+  global $lang;
+  global $ID;
+
+  // table headers
+  ptln('<tr>',2);
+  ptln('  <th class="leftalign" colspan="3">'.$lang['acl_new'].'</th>',2);
+  ptln('</tr>',2);
+
+  ptln('<tr>',2);
+
+  ptln('<td class="centeralign" colspan="3">',4);
+
+  ptln('  <form method="post" action="'.wl($ID).'">',4);
+  ptln('    <input type="hidden" name="do"   value="admin" />',4);
+  ptln('    <input type="hidden" name="page" value="acl" />',4);
+  ptln('    <input type="hidden" name="acl_cmd"   value="add" />',4);
+ 
+  //scope select
+  ptln($lang['acl_perms'],4);
+  ptln(admin_acl_html_dropdown($ID),4); 
+
+  $att = array( 'name'  => 'acl_type',
+                'class' => 'edit',
+                'title' => $lang['acl_user'].'/'.$lang['acl_group']);
+  ptln('    <select '.html_attbuild($att).'>',4);
+  ptln('      <option value="@">'.$lang['acl_group'].'</option>',4);
+  ptln('      <option value="">'.$lang['acl_user'].'</option>',4);
+  ptln('    </select>',4);
+
+  $att = array( 'name'  => 'acl_user',
+                'type'  => 'text',
+                'class' => 'edit',
+                'title' => $lang['acl_user'].'/'.$lang['acl_group']);
+  ptln('    <input '.html_attbuild($att).' />',4);
+  ptln('    <br />');
+
+  ptln(     admin_acl_html_checkboxes(0,false,false),8);
+
+  ptln('    <input type="submit" class="edit" value="'.$lang['btn_save'].'" \>',4);
+  ptln('  </form>');
+
+
+
+
+  ptln('</tr>',2);
+
+}
+
+/**
+ * print tablerows with the current permissions for one id
+ *
+ * @author  Frank Schubert <frank@schokilade.de>
+ * @author  Andreas Gohr <andi@splitbrain.org>
+ */
+function admin_acl_html_current($id,$permissions){
+  global $lang;
+  global $ID;
+
+  //is it a page?
+  if(substr($id,-1) == '*'){
+    $ispage = false;
+  }else{
+    $ispage = true;
+  }
+
+  // table headers
+  ptln('  <tr>');
+  ptln('    <th class="leftalign" colspan="3">');
+  ptln($lang['acl_perms'],6);
+  if($ispage){
+    ptln($lang['page'],6);
+  }else{
+    ptln($lang['namespace'],6);
+  }
+  ptln('<em>'.$id.'</em>',6);
+  ptln('    </th>');
+  ptln('  </tr>');
+
+  foreach ($permissions as $conf){
+    //userfriendly group/user display
+    if(substr($conf['name'],0,1)=="@"){
+      $group = $lang['acl_group'];
+      $name  = substr($conf['name'],1);
+    }else{
+      $group = $lang['acl_user'];
+      $name  = $conf['name'];
+    }
+
+    ptln('<tr>',2);
+    ptln('<td class="leftalign">'.$group.' '.$name.'</th>',4);
+
+    // update form
+    ptln('<td class="centeralign">',4);
+    ptln('  <form method="post" action="'.wl($ID).'">',4);
+    ptln('    <input type="hidden" name="do"   value="admin" />',4);
+    ptln('    <input type="hidden" name="page" value="acl" />',4);
+    ptln('    <input type="hidden" name="acl_cmd"   value="update" />',4);
+    ptln('    <input type="hidden" name="acl_scope" value="'.formtext($id).'" />',4);
+    ptln('    <input type="hidden" name="acl_user"  value="'.formtext($conf['name']).'" />',4);
+    ptln(     admin_acl_html_checkboxes($conf['perm'],$ispage),8);
+    ptln('    <input type="submit" class="edit" value="'.$lang['btn_update'].'" \>',4);
+    ptln('  </form>');
+    ptln('</td>',4);
+
+
+    // deletion form
+
+    $ask  = $lang['del_confirm'].'\\n';
+    $ask .= $id.'  '.$conf['name'].'  '.$conf['perm'];
+    ptln('<td class="centeralign">',4);
+    ptln('  <form method="post" action="'.wl($ID).'" onsubmit="return confirm(\''.$ask.'\')">',4);
+    ptln('    <input type="hidden" name="do"        value="admin" />',4);
+    ptln('    <input type="hidden" name="page"      value="acl" />',4);
+    ptln('    <input type="hidden" name="acl_cmd"   value="delete" />',4);
+    ptln('    <input type="hidden" name="acl_scope" value="'.formtext($id).'" />',4);
+    ptln('    <input type="hidden" name="acl_user"  value="'.formtext($conf['name']).'" />',4);
+    ptln('    <input type="submit" class="edit" value="'.$lang['btn_delete'].'" \>',4);
+    ptln('  </form>',4);
+    ptln('</td>',4);
+
+    ptln('</tr>',2);
+  }
+
+}
+
+
+/**
+ * print the permission checkboxes
+ *
+ * @author  Frank Schubert <frank@schokilade.de>
+ * @author  Andreas Gohr <andi@splitbrain.org>
+ */
+function admin_acl_html_checkboxes($setperm,$ispage,$submit=false){
+  global $lang;
+
+  static $label = 0; //number labels
+  $ret = '';
+
+  foreach(array(AUTH_READ,AUTH_EDIT,AUTH_CREATE,AUTH_UPLOAD) as $perm){
+    $label += 1;
+
+    //general checkbox attributes
+    $atts = array( 'type'  => 'checkbox',
+                   'id'    => 'pbox'.$label,
+                   'name'  => 'aclperm[]',
+                   'value' => $perm );
+    //dynamic attributes
+    if($setperm >= $perm)            $atts['checked']  = 'checked';
+    if($submit)                      $atts['onchange'] = 'submit()';
+    if($ispage && $perm > AUTH_EDIT) $atts['disabled'] = 'disabled';
+
+    //build code
+    $ret .= '<label for="pbox'.$label.'" title="'.$lang['acl_perm'.$perm].'">';
+    $ret .= '<input '.html_attbuild($atts).' />';
+    $ret .= $lang['acl_perm'.$perm];
+    $ret .= "</label>\n";
+  }
+  return $ret;
+}
+
+?>
diff --git a/inc/html.php b/inc/html.php
index df3f446b5cae9eca699c686f436f69df9bb830cc..3b31c96ff8b32f7a94b08f5dc182aaaa58e68794 100644
--- a/inc/html.php
+++ b/inc/html.php
@@ -29,6 +29,19 @@ function html_wikilink($url,$name='',$search=''){
   return format_link_build($link);
 }
 
+/**
+ * Helps building long attribute lists
+ *
+ * @author Andreas Gohr <andi@splitbrain.org>
+ */
+function html_attbuild($attributes){
+  $ret = '';
+  foreach ( $attributes as $key => $value ) {
+    $ret .= $key.'="'.formtext($value).'" ';
+  }
+  return trim($ret);
+}
+
 /**
  * The loginform
  *
@@ -1208,6 +1221,9 @@ function html_acl_admin(){
 ?>  
   <fieldset style="float:left; text-align:left; white-space:nowrap; width:320px;">
     <legend><?=$lang['acl_admin']?></legend>
+
+
+<!-- XXXXXXXXXXXXX -->
     
     <form name="acl_admin_add" method="post" action="<?=wl($ID)?>" accept-charset="<?=$lang['encoding']?>">
       <input type="hidden" name="do" value="acl_admin_add" />
@@ -1241,17 +1257,20 @@ function html_acl_admin(){
         </tr>
       </table>
     </form>
+<!-- XXXXXXXXXXXXX -->
   </fieldset>
 
   <div style="float:right;">
     <fieldset>
     <legend><?=$lang['acl_current']?></legend>
     <div style="text-align:left">
+
+<!-- XXXXXXXXXXXXX -->
     <?php
       $acl_config=get_acl_config($ID);
       foreach($acl_config as $pagename => $value){
         if($pagename != '*') {
-      $ID_cur=$pagename;
+          $ID_cur=$pagename;
           while(($piece=getNS($ID_cur)) !== false){
             $url="<a href='".wl($piece,'do=acl_admin')."'>".noNS($piece)."</a>:".$url;;
             $ID_cur=$piece;
@@ -1262,6 +1281,8 @@ function html_acl_admin(){
            }else{
              print $pagename;
            } ?>
+
+           <!-- XXXXXXXXXXXXX -->
            <table class="inline">
              <tr>
                <th class="inline"></th>
@@ -1270,7 +1291,7 @@ function html_acl_admin(){
                <th class="inline">W</th>
                <th class="inline">C</th>
                <th class="inline">U</th>
-        <th class="inline">UPDATE</th>
+               <th class="inline">UPDATE</th>
                <th class="inline">DELETE</th>
              </tr>
            <?php
@@ -1337,4 +1358,24 @@ function html_acl_admin(){
   </div>
 <?
 }
+
+/**
+ * Print the admin overview page
+ *
+ * @author  Andreas Gohr <andi@splitbrain.org>
+ */
+function html_admin(){
+  global $ID;
+  global $lang;
+
+  print parsedLocale('admin');
+
+  ptln('<ul class="admin">');
+
+  // currently ACL only - more to come
+  ptln('<li><a href="'.wl($ID,'do=admin&page=acl').'">'.$lang['admin_acl'].'</a></li>');
+
+  ptln('</ul>');
+}
+
 ?>
diff --git a/inc/template.php b/inc/template.php
index d52d5c7a00940b74815aa57d8f8a0fad38d2ca23..8047a33d07c61677262994475e84e96efb31e4df 100644
--- a/inc/template.php
+++ b/inc/template.php
@@ -99,11 +99,28 @@ function tpl_content(){
     case 'denied':
       print parsedLocale('denied');
 			break;
+    case 'admin':
+      tpl_admin();
+      break;
     default:
 			msg("Failed to handle command: ".hsc($ACT),-1); 
   }
 }
 
+/**
+ * Handle the admin page contents
+ *
+ * @author Andreas Gohr <andi@splitbrain.org>
+ */
+function tpl_admin(){
+  switch($_REQUEST['page']){
+		case 'acl':
+			admin_acl_html();
+			break;
+    default:
+			html_admin();
+	}
+}
 
 /**
  * Print the correct HTML meta headers
@@ -184,12 +201,14 @@ function tpl_link($url,$name,$more=''){
  *  recent  - recent changes
  *  login   - login/logout button - if ACL enabled
  *  index   - The index
+ *  admin   - admin page - if enough rights
  *  top     - a back to top button
  *
  * @author Andreas Gohr <andi@splitbrain.org>
  */
 function tpl_button($type){
   global $ID;
+  global $INFO;
   global $conf;
 
   switch($type){
@@ -217,6 +236,12 @@ function tpl_button($type){
         }
       }
       break;
+    case 'admin':
+      if($INFO['perm'] == AUTH_ADMIN)
+        print html_btn(admin,$ID,'',array('do' => 'admin'));
+      break;
+		default:
+			print '[unknown button type]';
   }
 }
 
diff --git a/lang/de/acl_admin.txt b/lang/de/acl_admin.txt
deleted file mode 100644
index 3693f82c7d016556e361436ea17e61637b45eb2e..0000000000000000000000000000000000000000
--- a/lang/de/acl_admin.txt
+++ /dev/null
@@ -1,3 +0,0 @@
-====== ACL-Administration ======
-
-Ansicht der vorhandenen ACL-Einstellungen und Konfiguration.
diff --git a/lang/de/lang.php b/lang/de/lang.php
index 1980c34b6ec4e5fe8ecd7b48b1c2d38fa0b62aa4..ce4a665c4195edea31f6c1e50874a7e65a91e358 100644
--- a/lang/de/lang.php
+++ b/lang/de/lang.php
@@ -25,7 +25,7 @@ $lang['btn_index']  = 'Übersicht';
 $lang['btn_secedit']= 'Bearbeiten';
 $lang['btn_login']  = 'Einloggen';
 $lang['btn_logout'] = 'Ausloggen';
-$lang['btn_acl_admin'] = 'ACL';
+$lang['btn_admin']  = 'Admin';
 
 $lang['loggedinas'] = 'Eingeloggt als';
 $lang['user']       = 'Benutzername';
@@ -101,21 +101,5 @@ $lang['qb_ul']      = 'Listenpunkt';
 $lang['qb_media']   = 'Bilder und andere Dateien hinzufügen';
 $lang['qb_sig']     = 'Unterschrift einfügen';
 
-$lang['acl_admin']  = 'Hinzuf&uuml;gen';
-$lang['acl_current']= 'Aktuelle Access Control Konfiguration';
-$lang['acl_user']   = 'Benutzer/Gruppe';
-$lang['acl_scope']  = 'Pagename/Namespace';
-$lang['acl_level']  = 'Zugriffslevel';
-$lang['acl_none']   = 'Keine';
-$lang['acl_read']   = 'Lesen';
-$lang['acl_edit']   = 'Bearbeiten';
-$lang['acl_create'] = 'Anlegen';
-$lang['acl_upload'] = 'Upload';
-$lang['acl_commit'] = 'Ausführen';
-$lang['acl_input_request'] = 'bitte wählen';
-$lang['acl_group']  = 'Gruppe';
-$lang['acl_user']   = 'Benutzer';
-$lang['acl_confirm_delete'] = 'Diesen Eintrag entfernen?';
-
 //Setup VIM: ex: et ts=2 enc=utf-8 :
 ?>
diff --git a/lang/en/acl_admin.txt b/lang/en/acl_admin.txt
deleted file mode 100644
index e8a112619330827f93fc7dde597ece47c6180269..0000000000000000000000000000000000000000
--- a/lang/en/acl_admin.txt
+++ /dev/null
@@ -1,3 +0,0 @@
-=== ACL-adminstration ===
-
-View current acl-configuration and change it.
diff --git a/lang/en/lang.php b/lang/en/lang.php
index f98e0d20d6428a122d9f78a8fb17f7d2ec38f6f3..206d82cafafe4036ffe2ae570c01ab16d8cd42c9 100644
--- a/lang/en/lang.php
+++ b/lang/en/lang.php
@@ -24,7 +24,9 @@ $lang['btn_index']  = 'Index';
 $lang['btn_secedit']= 'Edit';
 $lang['btn_login']  = 'Login';
 $lang['btn_logout'] = 'Logout';
-$lang['btn_acl_admin'] = 'ACL';
+$lang['btn_admin']  = 'Admin';
+$lang['btn_update'] = 'Update';
+$lang['btn_delete'] = 'Delete';
 
 $lang['loggedinas'] = 'Logged in as';
 $lang['user']       = 'Username';
@@ -99,21 +101,21 @@ $lang['qb_ul']      = 'Unordered List Item';
 $lang['qb_media']   = 'Add Images and other files';
 $lang['qb_sig']     = 'Insert Signature';
 
-$lang['acl_admin']  = 'New';
-$lang['acl_current']= 'Current Access Control Configuration';
-$lang['acl_user']   = 'User/Group';
-$lang['acl_scope']  = 'Pagename/Namespace';
-$lang['acl_level']  = 'Access Level';
-$lang['acl_none']   = 'None';
-$lang['acl_read']   = 'Read';
-$lang['acl_edit']   = 'Edit';
-$lang['acl_create'] = 'Create';
-$lang['acl_upload'] = 'Upload';
-$lang['acl_commit'] = 'Commit';
-$lang['acl_input_request'] = 'please select';
+$lang['del_confirm']= 'Delete this entry?';
+
+$lang['admin_acl']  = 'Access Control List Management...';
+
 $lang['acl_group']  = 'Group';
 $lang['acl_user']   = 'User';
-$lang['acl_confirm_delete'] = 'Delete this entry?';
+$lang['acl_perms']  = 'Permissions for';
+$lang['page']       = 'Page';
+$lang['namespace']  = 'Namespace';
+
+$lang['acl_perm1']  = 'Read';
+$lang['acl_perm2']  = 'Edit';
+$lang['acl_perm4']  = 'Create';
+$lang['acl_perm8']  = 'Upload';
+$lang['acl_new']    = 'Add new Entry';
 
 //Setup VIM: ex: et ts=2 enc=utf-8 :
 ?>
diff --git a/tpl/default/design.css b/tpl/default/design.css
index 2bf7903ea1f783fbeb3dd31e5244159c9081a3fd..f25c889359cc57fb96faf094f7adf88d06616733 100644
--- a/tpl/default/design.css
+++ b/tpl/default/design.css
@@ -87,7 +87,7 @@ textarea.edit {
   width:100%;
 }
 
-input.edit {
+input.edit,select.edit {
   font-size: 100%;
   border: 1px solid #8cacbb;
   height: 22px !important;
@@ -565,3 +565,16 @@ div.search_quickhits {
 .footerinc a:hover img {
     opacity: 1;
 }
+
+/* ---- Admin --- */
+
+div.acladmin label {
+  text-align: left;
+  font-weight: normal;
+  display: inline;
+}
+
+div.acladmin table{
+  margin-left: 10%;
+  width: 80%;
+}
diff --git a/images/interwiki.png b/tpl/default/images/interwiki.png
similarity index 100%
rename from images/interwiki.png
rename to tpl/default/images/interwiki.png
diff --git a/tpl/default/main.php b/tpl/default/main.php
index a19ee32171875f3431780c9033a272bf3ce0f2dc..09171714260b1f169fee13721db4078aac4a15f6 100644
--- a/tpl/default/main.php
+++ b/tpl/default/main.php
@@ -98,6 +98,7 @@
         <?tpl_button('history')?>
       </div>
       <div class="bar-right" id="bar_bottomright">
+        <?tpl_button('admin')?>
         <?tpl_button('login')?>
         <?tpl_button('index')?>
         <?tpl_button('top')?>&nbsp;