diff --git a/server/lib/app.inc.php b/server/lib/app.inc.php
index 1394b1e0c0617b52a91ee0d29d4f495c2041bfd0..88a90104c5fb3571691064094562f73f8017af56 100644
--- a/server/lib/app.inc.php
+++ b/server/lib/app.inc.php
@@ -28,8 +28,11 @@ EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */
 
 class app {
-
-        function app() {
+		
+		var modules = array();
+		var plugins = array();
+        
+		function app() {
 
                 global $conf;
 
@@ -104,7 +107,7 @@ class app {
                             fclose($fp);
 
                         } else {
-                            $this->error("Logfile ist nicht beschreibbar.");
+                            $this->error("Unable to write to logfile.");
                         }
                 } // if
         } // func
diff --git a/server/lib/classes/modules.inc.php b/server/lib/classes/modules.inc.php
index c0f3776a92da318a43ad655d7f44018c5ca9f70e..12b871e78e2fdca35c2ec7d87fec6d0e166ffda4 100644
--- a/server/lib/classes/modules.inc.php
+++ b/server/lib/classes/modules.inc.php
@@ -37,8 +37,25 @@ class modules {
 	*/
 	
 	function loadModules() {
-		global $app;
+		global $app, $conf;
+		
+		$modules_dir = $conf["rootpath"].$conf["fs_div"]."lib".$conf["fs_div"]."mods-enabled".$conf["fs_div"]
 		
+		if (is_dir($modules_dir)) {
+			if ($dh = opendir($dir)) {
+				while (($file = readdir($dh)) !== false) {
+					if($file != '.' && $file != '..') {
+						$module_name = substr($file,0,-8);
+						include_once($modules_dir.$file);
+						$app->log("Loading Module: $module_name",LOGLEVEL_DEBUG);
+						$app->modules[$module_name] = new $module_name;
+						$app->modules[$module_name]->onLoad();
+					}
+				}
+			}
+		} else {
+			$app->log("Modules directory missing: $modules_dir",LOGLEVEL_ERROR);
+		}
 	}
 	
 	/*
@@ -79,7 +96,7 @@ class modules {
 				$module_name = $hook["module"];
 				$function_name = $hook["function"];
 				// Claa the processing function of the module
-				call_user_method($function_name,$app->$module_name,$table_name,$action,$data);
+				call_user_method($function_name,$app->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
new file mode 100644
index 0000000000000000000000000000000000000000..5e2147f3347718d4e374043d325ddf57ac916091
--- /dev/null
+++ b/server/lib/classes/plugins.inc.php
@@ -0,0 +1,94 @@
+<?php
+
+/*
+Copyright (c) 2007, Till Brehm, projektfarm Gmbh
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without modification,
+are permitted provided that the following conditions are met:
+
+    * Redistributions of source code must retain the above copyright notice,
+      this list of conditions and the following disclaimer.
+    * Redistributions in binary form must reproduce the above copyright notice,
+      this list of conditions and the following disclaimer in the documentation
+      and/or other materials provided with the distribution.
+    * Neither the name of ISPConfig nor the names of its contributors
+      may be used to endorse or promote products derived from this software without
+      specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
+INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
+EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+
+class plugins {
+	
+	var $notification_events = array();
+	
+	/*
+	 This function is called to load the plugins from the plugins-available folder
+	*/
+	
+	function loadPlugins() {
+		global $app,$conf;
+		
+		$plugins_dir = $conf["rootpath"].$conf["fs_div"]."lib".$conf["fs_div"]."plugins-enabled".$conf["fs_div"]
+		
+		if (is_dir($plugins_dir)) {
+			if ($dh = opendir($dir)) {
+				while (($file = readdir($dh)) !== false) {
+					if($file != '.' && $file != '..') {
+						$plugin_name = substr($file,0,-8);
+						include_once($plugins_dir.$file);
+						$app->log("Loading Plugin: $plugin_name",LOGLEVEL_DEBUG);
+						$app->plugins[$plugin_name] = new $module_name;
+						$app->plugins[$plugin_name]->onLoad();
+					}
+				}
+			}
+		} else {
+			$app->log("Plugin directory missing: $plugins_dir",LOGLEVEL_ERROR);
+		}
+		
+	}
+	
+	/*
+	 This function is called by the modules to register for a specific
+	 table change notification
+	*/
+	
+	function registerEvent($event_name,$plugin_name,$function_name) {
+		$this->notification_events[$event_name][] = array('plugin' => $plugin_name, 'function' => $function_name);
+	}
+	
+	
+	function raiseEvent($event_name,$data) {
+		global $app;
+		
+		// Get the hooks for this table
+		$events = $this->notification_hevents[$event_name];
+		
+		if(is_array($events)) {
+			foreach($events as $event) {
+				$plugin_name = $event["plugin"];
+				$function_name = $event["function"];
+				// Claa the processing function of the module
+				call_user_method($function_name,$app->plugins[$plugin_name],$event_name,$data);
+				unset($plugin_name);
+				unset($function_name);
+			}
+		}
+		unset($event);
+		unset($events);
+	}
+	
+}
+
+?>
\ No newline at end of file
diff --git a/server/lib/config.inc.php b/server/lib/config.inc.php
index 8ecfa8197e543035c6f6e4d0a7ed4818d53c1088..0f95d57621496ddcff1b75902dc4eb23703dba6f 100644
--- a/server/lib/config.inc.php
+++ b/server/lib/config.inc.php
@@ -66,4 +66,9 @@ $conf["start_db"]			= true;
 $conf["load_server_config"]	= true;
 
 
+
+define("LOGLEVEL_DEBUG",0);
+define("LOGLEVEL_WARN",1);
+define("LOGLEVEL_ERROR",2);
+
 ?>
\ No newline at end of file
diff --git a/server/mods-available/mail.module.php b/server/mods-available/mail_module.inc.php
similarity index 99%
rename from server/mods-available/mail.module.php
rename to server/mods-available/mail_module.inc.php
index ae6b7ee6ecc8f567925f378d85e5b932cbc54f03..0f13f05e7d339af1135f7295d0315c2e44a54ca1 100644
--- a/server/mods-available/mail.module.php
+++ b/server/mods-available/mail_module.inc.php
@@ -30,7 +30,7 @@ EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
 class mail_module {
 	
-	var $module_name = 'mail';
+	var $module_name = 'mail_module';
 	var $class_name = 'mail_module';
 	var $actions_available = array(	'mail_domain_insert',
 									'mail_domain_update',