diff --git a/.htaccess b/.htaccess
index 9ba609af759aba4c7e99a168b7e88c671caee24a..6a1c296c066c08a0507befa600cb46202759f941 100644
--- a/.htaccess
+++ b/.htaccess
@@ -32,4 +32,5 @@ ErrorDocument 500 /error.php
    php_value session.cookie_lifetime 2000000
    php_value session.gc_maxlifetime  2000000
    php_value session.cache_expire    200000
+   php_value session.save_path       /tmp/dropsessions
 </IfModule>
diff --git a/admin.php b/admin.php
index b20e98efdc1760cecabfb732209f73f6365ffccd..7fb758535bdaf272605b0f547c3287f3e3d75238 100644
--- a/admin.php
+++ b/admin.php
@@ -1,39 +1,50 @@
 <?
 
-// temporary permission solution:
+// validate user permission:
 if (!$user->id || ($user->permissions != 1 && $user->id > 1)) exit();
 
-include "includes/admin.inc";
-include "includes/cron.inc";
-
-// display admin header:
-admin_header();
-
-// generate administrator menu:
-$handle = opendir("modules");
-while ($file = readdir($handle)) {
-  if ($filename = substr($file, 0, strpos($file, ".module"))) {
-    if ($filename == $mod) {
-      $output .= "$filename | ";
-    }
-    else {
-      include_once "modules/$filename.module";
-      if ($module["cron"] && !cron_get($filename)) cron_set($filename, 172800); 
-      if ($module["admin"]) $output .= "<A HREF=\"admin.php?mod=$filename\">$filename</A> | ";
-    }
+include_once "includes/theme.inc";
+include_once "includes/cron.inc";
+
+function admin_page($mod) {  
+  global $repository, $menu, $modules;
+
+  function module($name, $module) {
+    global $menu, $modules;
+    if ($module["admin"]) $output .= "<A HREF=\"admin.php?mod=$name\">$name</A> | ";
+    $menu .= $output;
   }
-}
-closedir($handle);
+
+ ?>
+  <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
+  <HTML>
+   <HEAD><TITLE><? echo $site_name; ?> administration center</TITLE></HEAD>
+   <STYLE>
+    body { font-family: helvetica, arial; }
+    h1   { font-size: 14pt; font-weight: bold; color: #990000; }
+    h2   { font-family: helvetica, arial; font-size: 12pt; font-weight: bold; }
+    h3   { font-family: helvetica, arial; font-size: 14pt; font-weight: bold; }
+    th	 { font-family: helvetica, arial; text-align: center; background-color: #CCCCCC; color: #995555; }
+    td	 { font-family: helvetica, arial; }
+   </STYLE>
+   <BODY BGCOLOR="#FFFFFF" LINK="#005599" VLINK="#004499" ALINK="#FF0000">
+    <H1>Administration center</H1>
+ <?
   
-print "<HR>$output <A HREF=\"\">home</A><HR>";
+  module_iterate("module");
+ 
+ ?> 
+    <HR><? echo $menu; ?><A HREF="">home</A><HR>
+ <?
+
+  module_execute($mod, "admin");
 
-// display administrator body:
-if ($mod) {
-  include "modules/$mod.module";
-  if ($function = $module["admin"]) $function();
+ ?>
+   </BODY>
+  </HTML>
+ <?
 }
 
-// display admin footer:
-admin_footer();
+admin_page($mod);
 
-?>
\ No newline at end of file
+?>
diff --git a/cron.php b/cron.php
index 376792366bbad14b4c1d191393607bf38703395b..3cb6abfcb093db8f502d21bbb437c632c2224476 100644
--- a/cron.php
+++ b/cron.php
@@ -1,7 +1,24 @@
 <?
 
-include "includes/cron.inc";
+include "includes/theme.inc";
+
+function cron_run($cron) {
+  global $repository;
+
+  $time = time();
+  
+  $result = db_query("SELECT * FROM crons WHERE $time - timestamp > scheduled");
+
+  while ($task = db_fetch_object($result)) {
+    if ($repository[$task->module]["cron"]) {
+      watchdog("message", "cron: executed '". $task->module ."_cron()'"); 
+      $repository[$task->module]["cron"]();
+    }
+  }
+
+  db_query("UPDATE crons SET timestamp = $time WHERE $time - timestamp > scheduled");
+}
 
 cron_run();
 
-?>
+?>
\ No newline at end of file
diff --git a/includes/theme.inc b/includes/theme.inc
index d1c3540e5551c84577e1701ce6f2e6094481d4e8..583bc0044cbef1a301401236525e8f73d6143d43 100644
--- a/includes/theme.inc
+++ b/includes/theme.inc
@@ -5,6 +5,7 @@
 include_once "includes/watchdog.inc";
 include_once "includes/function.inc";
 include_once "includes/droplet.inc";
+include_once "includes/module.inc";
 include_once "includes/widget.inc";
 include_once "includes/user.inc";
 
diff --git a/includes/widget.inc b/includes/widget.inc
index 2ea57a2469ed28d1d1b72ccdd303c5d0d4c4afde..96fe68ab4b0ad401552243a915b6efb901d8c274 100644
--- a/includes/widget.inc
+++ b/includes/widget.inc
@@ -1,5 +1,21 @@
 <?
 
+function display_module_blocks() {
+  global $repository, $theme;
+
+  function display_block($name, $module) {
+    global $theme;
+        
+    if ($blocks = module_execute($name, "block")) {
+      foreach ($blocks as $id=>$block) {
+        $theme->box($block["subject"], $block["content"]);
+      }
+    }
+  }
+
+  module_iterate("display_block");
+}
+
 function display_morelink($theme, $story) {
   return ($story->article) ? "[ <A HREF=\"discussion.php?id=$story->id\"><FONT COLOR=\"$theme->hlcolor2\"><B>read more</B></FONT></A> | ". strlen($story->article) ." bytes | <A HREF=\"discussion.php?id=$story->id\"><FONT COLOR=\"$theme->hlcolor2\">". format_plural($story->comments, "comment", "comments") ."</FONT></A> ]" : "[ <A HREF=\"discussion.php?id=$story->id\"><FONT COLOR=\"$theme->hlcolor2\">". format_plural($story->comments, "comment", "comments") ."</FONT></A> ]";
 }
@@ -72,20 +88,6 @@ function display_comment_moderation($id, $author, $score, $votes) {
   return $output;
 }
 
-function display_new_diaries($theme, $num = 20) {
-  $result = db_query("SELECT u.userid, d.timestamp FROM diaries d LEFT JOIN users u ON d.author = u.id ORDER BY timestamp DESC LIMIT $num");
-
-  while ($diary = db_fetch_object($result)) {
-    if ($time != date("F jS", $diary->timestamp)) {
-      $content .= "<P><B>". date("l, M jS", $diary->timestamp) ."</B></P>\n";
-      $time = date("F jS", $diary->timestamp);
-    }
-    $content .= "<LI><A HREF=\"module.php?mod=diary&op=view&name=$diary->userid\">$diary->userid</A></LI>\n";
-  }
-  $content .= "<P ALIGN=\"right\">[ <A HREF=\"module.php?mod=diary\"><FONT COLOR=\"$theme->hlcolor2\">more</FONT></A> ]</P>";
-  $theme->box("Recent diary entries", $content);
-}
-
 function display_new_headlines($theme, $num = 10) {
   global $user;
 
@@ -115,7 +117,7 @@ function submission_number() {
     $content .= "<P>\n";
     $content .= "<LI><A HREF=\"account.php?op=edit&topic=diary\">edit your diary</A></LI>\n";
     $content .= "<LI><A HREF=\"account.php?op=edit&topic=user\">edit your information</A></LI>\n";
-    $content .= "<LI><A HREF=\"account.php?op=edit&topic=page\">edit your settings</A></LI>\n";
+    $content .= "<LI><A HREF=\"account.php?op=edit&topic=site\">edit your settings</A></LI>\n";
     $content .= "<P>\n";
     $content .= "<LI><A HREF=\"account.php?op=view&topic=diary\">view your diary</A></LI>\n";
     $content .= "<LI><A HREF=\"account.php?op=view&topic=info\">view your information</A></LI>\n";
diff --git a/module.php b/module.php
index c6ceacf0643a75a130ea7edd4627c04450d92a7b..f2246aae66aa51277d1725ed32b9700791c14f54 100644
--- a/module.php
+++ b/module.php
@@ -1,6 +1,6 @@
 <?
 
-include "modules/$mod.module"; 
-if ($function = $module["page"]) $function();
+include_once "includes/theme.inc";
+module_execute($mod, "page");
 
 ?>
diff --git a/themes/marvin/marvin.theme b/themes/marvin/marvin.theme
index 076f0083a672694bdcce60c655e7ad31918adf2d..b8e6710838a41d0c0471f8ffe98f53f364522a8a 100644
--- a/themes/marvin/marvin.theme
+++ b/themes/marvin/marvin.theme
@@ -256,14 +256,11 @@ function footer() {
            ### Display account:
            display_account($this);
 
-           ### Display calendar:
+           ### Display old headlines:
            display_old_headlines($this);
 
-           ### Display calendar:
-           $this->box("Browse archives", droplet_get("calendar"));
-
-           ### Display new diary entries:
-           display_new_diaries($this);           
+           ### Display module blocks:
+           display_module_blocks();
          }
          elseif (strstr($PHP_SELF, "account.php")) {
            ### Display account: