diff --git a/install/sql/ispconfig3.sql b/install/sql/ispconfig3.sql
index 35df22227fd416dd5f5ed44e41b465fd8c1672cd..fbb2539088f5041ab087b23a02f6d1160b192051 100644
--- a/install/sql/ispconfig3.sql
+++ b/install/sql/ispconfig3.sql
@@ -598,7 +598,7 @@ CREATE TABLE `server` (
   `db_server` tinyint(4) NOT NULL default '0',
   `vserver_server` tinyint(4) NOT NULL default '0',
   `config` text NOT NULL,
-  `updated` tinyint(4) NOT NULL default '0',
+  `updated` bigint(20) unsigned NOT NULL default '0',
   `active` tinyint(4) NOT NULL default '1',
   PRIMARY KEY  (`server_id`)
 ) ENGINE=MyISAM AUTO_INCREMENT=1 ;
@@ -1004,6 +1004,7 @@ INSERT INTO `sys_group` (`groupid`, `name`, `description`, `client_id`) VALUES (
 CREATE TABLE `sys_log` (
   `syslog_id` int(10) unsigned NOT NULL auto_increment,
   `server_id` int(10) unsigned NOT NULL default '0',
+  `datalog_id` bigint(20) unsigned NOT NULL default '0',
   `loglevel` tinyint(4) NOT NULL default '0',
   `tstamp` int(10) unsigned NOT NULL,
   `message` text,
diff --git a/install/update.php b/install/update.php
index 8ce3b4b02fb79126abcd481e78ab3e29ba664041..0bfaf3d376466b6b00efd8a9e7d2d113896020c8 100644
--- a/install/update.php
+++ b/install/update.php
@@ -134,6 +134,7 @@ $inst->db = new db();
 
 //* Update $conf array with values from the server.ini that shall be preserved
 $tmp = $inst->db->queryOneRecord("SELECT * FROM ".$conf["mysql"]["database"].".server WHERE server_id = ".$conf['server_id']);
+$ini_array = ini_to_array(stripslashes($tmp['config']));
 
 $conf['services']['mail'] = ($tmp['mail_server'] == 1)?true:false;
 $conf['services']['web'] = ($tmp['web_server'] == 1)?true:false;
@@ -141,6 +142,7 @@ $conf['services']['dns'] = ($tmp['dns_server'] == 1)?true:false;
 $conf['services']['file'] = ($tmp['file_server'] == 1)?true:false;
 $conf['services']['db'] = ($tmp['db_server'] == 1)?true:false;
 $conf['services']['vserver'] = ($tmp['vserver_server'] == 1)?true:false;
+$conf['postfix']['vmail_mailbox_base'] = $ini_array['mail']['homedir_path'];
 
 //** Delete the old database
 if( !$inst->db->query('DROP DATABASE IF EXISTS '.$conf['mysql']['database']) ) {
diff --git a/interface/lib/app.inc.php b/interface/lib/app.inc.php
index 09054a1410195fbff71dda5bdfed07b478cb32f6..c003ef4a1799aa9626b18bc55268c1db826d34f0 100644
--- a/interface/lib/app.inc.php
+++ b/interface/lib/app.inc.php
@@ -145,9 +145,11 @@ class app {
 			//* loading global and module Wordbook
             // TODO: this need to be made clearer somehow - pedro
 			@include_once(ISPC_ROOT_PATH.'/lib/lang/'.$_SESSION['s']['language'].'.lng');
-			$lng_file = ISPC_ROOT_PATH.'/web/'.$_SESSION['s']['module']['name'].'/lib/lang/'.$_SESSION['s']['language'].'.lng';
-			if(!file_exists($lng_file)) $lng_file = ISPC_ROOT_PATH.'/web/'.$_SESSION['s']['module']['name'].'/lib/lang/en.lng';
-			include_once($lng_file);
+			if(isset($_SESSION['s']['module']['name']) && isset($_SESSION['s']['language'])) {
+				$lng_file = ISPC_ROOT_PATH.'/web/'.$_SESSION['s']['module']['name'].'/lib/lang/'.$_SESSION['s']['language'].'.lng';
+				if(!file_exists($lng_file)) $lng_file = ISPC_ROOT_PATH.'/web/'.$_SESSION['s']['module']['name'].'/lib/lang/en.lng';
+				@include_once($lng_file);
+			}
 			$this->_wb = $wb;
 			$this->_language_inc = 1;
 		}		
diff --git a/server/lib/app.inc.php b/server/lib/app.inc.php
index 697fd23b3eb99423326efe29d3454e040cb88eb4..457693b5058653396025c2ae0bc9f5075723bc94 100644
--- a/server/lib/app.inc.php
+++ b/server/lib/app.inc.php
@@ -125,15 +125,27 @@ class app {
                             }
 							echo date("d.m.Y-H:i")." - ".$priority_txt." - ". $msg."\n";
                             fclose($fp);
-							
+
 							// Log to database
-							if(isset($this->db)) {
+							if(isset($this->dbmaster)) {
 								$server_id = $conf['server_id'];
 								$loglevel = $priority;
 								$tstamp = time();
-								$message = $this->db->quote($msg);
-								$sql = "INSERT INTO sys_log (server_id,loglevel,tstamp,message) VALUES ('$server_id','$loglevel','$tstamp','$message')";
-								$this->db->query($sql);
+								$message = $this->dbmaster->quote($msg);
+								$datalog_id = (isset($this->modules->current_datalog_id) && $this->modules->current_datalog_id > 0)?$this->modules->current_datalog_id:0;
+								if($datalog_id > 0) {
+									$tmp_rec = $this->dbmaster->queryOneRecord("SELECT count(syslog_id) as number FROM sys_log WHERE datalog_id = $datalog_id AND loglevel = ".LOGLEVEL_ERROR);
+									//* Do not insert duplicate errors into the web log.
+									if($tmp_rec['number'] == 0) {
+										$sql = "INSERT INTO sys_log (server_id,datalog_id,loglevel,tstamp,message) VALUES ('$server_id',$datalog_id,'$loglevel','$tstamp','$message')";
+										$this->dbmaster->query($sql);
+									}
+								} else {
+									$sql = "INSERT INTO sys_log (server_id,datalog_id,loglevel,tstamp,message) VALUES ('$server_id',0,'$loglevel','$tstamp','$message')";
+									$this->dbmaster->query($sql);
+								}
+								
+								
 							}
 
                         //} else {
diff --git a/server/lib/classes/modules.inc.php b/server/lib/classes/modules.inc.php
index 394f15cb0c85ac608e74d56e56677067eef45cfd..542ebef83fcf2cf7d97fc45b47f5b73f1cdd02e4 100644
--- a/server/lib/classes/modules.inc.php
+++ b/server/lib/classes/modules.inc.php
@@ -31,6 +31,8 @@ EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 class modules {
 	
 	var $notification_hooks = array();
+	var $current_datalog_id = 0;
+	var $debug = false;
 	
 	/*
 	 This function is called to load the modules from the mods-enabled or the mods-core folder
@@ -48,7 +50,7 @@ class modules {
 					if($file != '.' && $file != '..' && substr($file,-8,8) == '.inc.php') {
 						$module_name = substr($file,0,-8);
 						include_once($modules_dir.$file);
-						$app->log("Loading Module: $module_name",LOGLEVEL_DEBUG);
+						if($this->debug) $app->log("Loading Module: $module_name",LOGLEVEL_DEBUG);
 						$app->loaded_modules[$module_name] = new $module_name;
 						$app->loaded_modules[$module_name]->onLoad();
 					}
@@ -68,7 +70,7 @@ class modules {
 	function registerTableHook($table_name,$module_name,$function_name) {
 		global $app;
 		$this->notification_hooks[$table_name][] = array('module' => $module_name, 'function' => $function_name);
-		$app->log("Registered TableHook '$table_name' in module '$module_name' for processing function '$function_name'",LOGLEVEL_DEBUG);
+		if($this->debug) $app->log("Registered TableHook '$table_name' in module '$module_name' for processing function '$function_name'",LOGLEVEL_DEBUG);
 	}
 	
 	/*
@@ -83,13 +85,15 @@ class modules {
 		// TODO: process only new entries.
 		//* If its a multiserver setup
 		if($app->db->dbHost != $app->dbmaster->dbHost) {
-			$sql = "SELECT * FROM sys_datalog WHERE server_id = ".$conf["server_id"]." ORDER BY datalog_id";
+			$sql = "SELECT * FROM sys_datalog WHERE datalog_id > ".$conf['last_datalog_id']." AND (server_id = ".$conf["server_id"]." OR server_id = 0) ORDER BY datalog_id";
 			$records = $app->dbmaster->queryAllRecords($sql);
 			foreach($records as $d) {
 				
 				$data = unserialize(stripslashes($d["data"]));
 				$replication_error = false;
 				
+				$this->current_datalog_id = $d["datalog_id"];
+				
 				if($d["action"] == 'i') {
 					$idx = explode(":",$d["dbidx"]);
 					$tmp_sql1 = '';
@@ -144,25 +148,25 @@ class modules {
 					$this->raiseTableHook($d["dbtable"],$d["action"],$data);
 					//$app->dbmaster->query("DELETE FROM sys_datalog WHERE datalog_id = ".$d["datalog_id"]);
 					//$app->log("Deleting sys_datalog ID ".$d["datalog_id"],LOGLEVEL_DEBUG);
-					$app->db->query("UPDATE sys_datalog SET status = 'ok' WHERE datalog_id = ".$d["datalog_id"]);
-					$app->log("Changing datalog status to -ok- for sys_datalog ID ".$rec["datalog_id"],LOGLEVEL_DEBUG);
+					$app->dbmaster->query("UPDATE server SET updated = ".$d["datalog_id"]." WHERE server_id = ".$conf["server_id"]);
+					$app->log("Processed datalog_id ".$d["datalog_id"],LOGLEVEL_DEBUG);
 				} else {
 					$app->log("Error in Repliction, changes were not processed.",LOGLEVEL_ERROR);
-					$app->db->query("UPDATE sys_datalog SET status = 'error' WHERE datalog_id = ".$d["datalog_id"]);
 				}
 			}
 			
 		//* if we have a single server setup
 		} else {
-			$sql = "SELECT * FROM sys_datalog WHERE server_id = ".$conf["server_id"]." ORDER BY datalog_id";
+			$sql = "SELECT * FROM sys_datalog WHERE datalog_id > ".$conf['last_datalog_id']." AND (server_id = ".$conf["server_id"]." OR server_id = 0) ORDER BY datalog_id";
 			$records = $app->db->queryAllRecords($sql);
-			foreach($records as $rec) {
-				$data = unserialize(stripslashes($rec["data"]));
-				$this->raiseTableHook($rec["dbtable"],$rec["action"],$data);
+			foreach($records as $d) {
+				$data = unserialize(stripslashes($d["data"]));
+				$this->current_datalog_id = $d["datalog_id"];
+				$this->raiseTableHook($d["dbtable"],$d["action"],$data);
 				//$app->db->query("DELETE FROM sys_datalog WHERE datalog_id = ".$rec["datalog_id"]);
 				//$app->log("Deleting sys_datalog ID ".$rec["datalog_id"],LOGLEVEL_DEBUG);
-				$app->db->query("UPDATE sys_datalog SET status = 'ok' WHERE datalog_id = ".$rec["datalog_id"]);
-				$app->log("Changing datalog status to -ok- for sys_datalog ID ".$rec["datalog_id"],LOGLEVEL_DEBUG);
+				$app->db->query("UPDATE server SET updated = ".$d["datalog_id"]." WHERE server_id = ".$conf["server_id"]);
+				$app->log("Processed datalog_id ".$d["datalog_id"],LOGLEVEL_DEBUG);
 			}
 		}
 		
@@ -177,14 +181,14 @@ class modules {
 		
 		// Get the hooks for this table
 		$hooks = $this->notification_hooks[$table_name];
-		$app->log("Raised TableHook for table: '$table_name'",LOGLEVEL_DEBUG);
+		if($this->debug) $app->log("Raised TableHook for table: '$table_name'",LOGLEVEL_DEBUG);
 		
 		if(is_array($hooks)) {
 			foreach($hooks as $hook) {
 				$module_name = $hook["module"];
 				$function_name = $hook["function"];
 				// Claa the processing function of the module
-				$app->log("Call function '$function_name' in module '$module_name' raised by TableHook '$table_name'.",LOGLEVEL_DEBUG);
+				if($this->debug) $app->log("Call function '$function_name' in module '$module_name' raised by TableHook '$table_name'.",LOGLEVEL_DEBUG);
 				call_user_method($function_name,$app->loaded_modules[$module_name],$table_name,$action,$data);
 				unset($module_name);
 				unset($function_name);
diff --git a/server/lib/classes/plugins.inc.php b/server/lib/classes/plugins.inc.php
index 8d016d2f535c511e637ffcb3695b7a49b41e4619..beb7868c3dfb2f4c17dc059a62a80b8328756492 100644
--- a/server/lib/classes/plugins.inc.php
+++ b/server/lib/classes/plugins.inc.php
@@ -32,6 +32,7 @@ class plugins {
 	
 	var $available_events = array();
 	var $subscribed_events = array();
+	var $debug = false;
 	
 	/*
 	 This function is called to load the plugins from the plugins-enabled or the plugins-core folder
@@ -61,7 +62,7 @@ class plugins {
 				//** load the plugins
 				foreach($tmp_plugins as $plugin_name => $file) {
 					include_once($plugins_dir.$file);
-					$app->log("Loading Plugin: $plugin_name",LOGLEVEL_DEBUG);
+					if($this->debug) $app->log("Loading Plugin: $plugin_name",LOGLEVEL_DEBUG);
 					$app->loaded_plugins[$plugin_name] = new $plugin_name;
 					$app->loaded_plugins[$plugin_name]->onLoad();
 				}
@@ -82,7 +83,7 @@ class plugins {
 		global $app;
 		foreach($events as $event_name) {
 			$this->available_events[$event_name] = $module_name;
-			$app->log("Announced event: $event_name",LOGLEVEL_DEBUG);
+			if($this->debug) $app->log("Announced event: $event_name",LOGLEVEL_DEBUG);
 		}
 	}
 	
@@ -97,7 +98,7 @@ class plugins {
 			$app->log("Unable to register the function '$function_name' in the plugin '$plugin_name' for event '$event_name'",LOGLEVEL_DEBUG);
 		} else {
 			$this->subscribed_events[$event_name][] = array('plugin' => $plugin_name, 'function' => $function_name);
-			$app->log("Registered the function '$function_name' in the plugin '$plugin_name' for event '$event_name'.",LOGLEVEL_DEBUG);
+			if($this->debug)  $app->log("Registered the function '$function_name' in the plugin '$plugin_name' for event '$event_name'.",LOGLEVEL_DEBUG);
 		}
 	}
 	
@@ -107,7 +108,7 @@ class plugins {
 		
 		// Get the subscriptions for this event
 		$events = $this->subscribed_events[$event_name];
-		$app->log("Raised event: '$event_name'",LOGLEVEL_DEBUG);
+		if($this->debug) $app->log("Raised event: '$event_name'",LOGLEVEL_DEBUG);
 		
 		if(is_array($events)) {
 			foreach($events as $event) {
diff --git a/server/lib/classes/services.inc.php b/server/lib/classes/services.inc.php
index b4cccede0ecb871004bfc1bd1b945891579f96f1..3f9e6e45944a0bd6e5067b9b7ae984d028ffeca7 100644
--- a/server/lib/classes/services.inc.php
+++ b/server/lib/classes/services.inc.php
@@ -32,6 +32,7 @@ class services {
 
 	var $registered_services = array();
 	var $delayed_restarts = array();
+	var $debug = false;
 	
 	// This function adds a request for restarting 
 	// a service at the end of the configuration run.
@@ -64,7 +65,7 @@ class services {
 	function registerService($service_name,$module_name, $function_name) {
 		global $app;
 		$this->registered_services[$service_name] = array('module' => $module_name, 'function' => $function_name);
-		$app->log("Registered Service '$service_name' in module '$module_name' for processing function '$function_name'",LOGLEVEL_DEBUG);
+		if($this->debug) $app->log("Registered Service '$service_name' in module '$module_name' for processing function '$function_name'",LOGLEVEL_DEBUG);
 	}
 	
 	// This function is called at the end of the server script to restart services.
diff --git a/server/server.php b/server/server.php
index 135fac2f0afb9e05842303575078796f9d722932..384404c0a5963c7de57dec8afb525b23c37a29e2 100644
--- a/server/server.php
+++ b/server/server.php
@@ -66,8 +66,13 @@ if(is_file($conf["temppath"].$conf["fs_div"].".ispconfig_lock")){
 $app->log("Set Lock: ".$conf["temppath"].$conf["fs_div"].".ispconfig_lock", LOGLEVEL_DEBUG);
 */
 
+// get the dalaog_id of the last performed record
+$tmp_rec = $app->dbmaster->queryOneRecord("SELECT updated FROM server WHERE server_id = ".$conf["server_id"]);
+$conf['last_datalog_id'] = (int)$tmp_rec['updated'];
+unset($tmp_rec);
+
 // Check if there is anything to update
-$tmp_rec = $app->dbmaster->queryOneRecord("SELECT count(server_id) as number from sys_datalog WHERE server_id = ".$conf["server_id"]." AND status = 'pending'");
+$tmp_rec = $app->dbmaster->queryOneRecord("SELECT count(server_id) as number from sys_datalog WHERE datalog_id > ".$conf['last_datalog_id']." AND (server_id = ".$conf["server_id"]." OR server_id = 0)");
 $tmp_num_records = $tmp_rec["number"];
 unset($tmp_rec);