diff -Naur monit/gc.c monit-system/gc.c
--- monit/gc.c	2005-11-17 12:13:30.000000000 +0100
+++ monit-system/gc.c	2005-11-17 12:14:00.000000000 +0100
@@ -108,6 +108,7 @@
   
   FREE(Run.eventlist_dir);
   FREE(Run.mygroup);
+  FREE(Run.localhostname);
   FREE(Run.httpsslpem);
   FREE(Run.httpsslclientpem);
   FREE(Run.bind_addr);
diff -Naur monit/http/cervlet.c monit-system/http/cervlet.c
--- monit/http/cervlet.c	2005-11-12 11:58:19.000000000 +0100
+++ monit-system/http/cervlet.c	2005-11-17 12:14:00.000000000 +0100
@@ -114,6 +114,7 @@
 static void print_service_rules_match(HttpResponse, Service_T);
 static void print_service_rules_checksum(HttpResponse, Service_T);
 static void print_service_rules_process(HttpResponse, Service_T);
+static void print_service_rules_resource(HttpResponse, Service_T);
 static void print_service_params_port(HttpResponse, Service_T);
 static void print_service_params_icmp(HttpResponse, Service_T);
 static void print_service_params_perm(HttpResponse, Service_T);
@@ -125,6 +126,7 @@
 static void print_service_params_match(HttpResponse, Service_T);
 static void print_service_params_checksum(HttpResponse, Service_T);
 static void print_service_params_process(HttpResponse, Service_T);
+static void print_service_params_resource(HttpResponse, Service_T);
 static void print_status(HttpRequest, HttpResponse);
 static void status_service_txt(Service_T, HttpResponse, short);
 static char *get_service_status_html(Service_T);
@@ -267,9 +269,7 @@
 
   FREE(uptime);
   
-  if(Run.doprocess) {
-    do_home_system(req, res);
-  }
+  do_home_system(req, res);
   do_home_process(req, res);
   do_home_device(req, res);
   do_home_file(req, res);
@@ -707,15 +707,18 @@
       "<tr>"
       "<td>Name</td>"
       "<td>%s</td>"
-      "</tr>"
-      "<tr>"
-      "<td>%s</td>"
-      "<td>%s</td>"
       "</tr>",
       servicetypes[s->type],
-      s->name,
-      pathnames[s->type],
-      s->path);
+      s->name);
+
+    if(s->path && *s->path)
+      out_print(res,
+        "<tr>"
+        "<td>%s</td>"
+        "<td>%s</td>"
+        "</tr>",
+        pathnames[s->type],
+        s->path);
 
     status= get_service_status_html(s);
     out_print(res,
@@ -790,6 +793,7 @@
     print_service_params_match(res, s);
     print_service_params_checksum(res, s);
     print_service_params_process(res, s);
+    print_service_params_resource(res, s);
 
     /* Rules */
     print_service_rules_icmp(res, s);
@@ -803,6 +807,7 @@
     print_service_rules_match(res, s);
     print_service_rules_checksum(res, s);
     print_service_rules_process(res, s);
+    print_service_rules_resource(res, s);
 
     print_alerts(res, s->maillist);
 
@@ -849,37 +854,55 @@
 
 static void do_home_system(HttpRequest req, HttpResponse res) {
   
+  char      *status;
+  Service_T  s = Run.system;
+
+  status= get_service_status_html(s);
+
   out_print(res,
     "<br><p>&nbsp;</p>"
-    "<table cellspacing=0 cellpadding=3 border=0 width=\"70%%\">"
+    "<table cellspacing=0 cellpadding=3 border=0 width=\"90%%\">"
     "<tr>"
     "<td width=\"20%%\"><h3><b>System</b></h3></td>"
-    "<td align=\"right\"><h3><b>Load</b></h3></td>"
-    "<td align=\"right\"><h3><b>CPU</b></h3></td>"
-    "<td align=\"right\"><h3><b>Memory</b></h3></td>"
+    "<td align=\"left\"><h3><b>Status</b></h3></td>");
+
+  if(Run.doprocess) {
+    out_print(res,
+      "<td align=\"right\"><h3><b>Load</b></h3></td>"
+      "<td align=\"right\"><h3><b>CPU</b></h3></td>"
+      "<td align=\"right\"><h3><b>Memory</b></h3></td>");
+  }
+
+  out_print(res,
     "</tr>"
     "<tr bgcolor=\"#EFEFEF\">"
-    "<td align=\"left\">%s</td>"
-    "<td align=\"right\" width=\"20%%\">[%.2f]&nbsp;[%.2f]&nbsp;[%.2f]</td>"
-    "<td align=\"right\" width=\"20%%\">"
+    "<td align=\"left\"><a href='/%s'>%s</a></td>"
+    "<td align=\"left\">%s</td>",
+    s->name, s->name,
+    status);
+  FREE(status);
+
+  if(Run.doprocess) {
+    out_print(res,
+      "<td align=\"right\" width=\"20%%\">[%.2f]&nbsp;[%.2f]&nbsp;[%.2f]</td>"
+      "<td align=\"right\" width=\"20%%\">"
       "%.1f%%us,&nbsp;%.1f%%sy"
-  #ifdef HAVE_CPU_WAIT
+    #ifdef HAVE_CPU_WAIT
       ",&nbsp;%.1f%%wa"
-  #endif
-    "</td>"
-    "<td align=\"right\" width=\"20%%\">%.1f%% [%ld&nbsp;kB]</td>"
+    #endif
+      "</td>"
+      "<td align=\"right\" width=\"20%%\">%.1f%% [%ld&nbsp;kB]</td>",
+      systeminfo.loadavg[0], systeminfo.loadavg[1], systeminfo.loadavg[2],
+      systeminfo.total_cpu_user_percent/10., systeminfo.total_cpu_syst_percent/10.,
+    #ifdef HAVE_CPU_WAIT
+      systeminfo.total_cpu_wait_percent/10.,
+    #endif
+      systeminfo.total_mem_percent/10., systeminfo.total_mem_kbyte);
+  }
+
+  out_print(res,
     "</tr>"
-    "</table>",
-    Run.localhostname,
-    systeminfo.loadavg[0], systeminfo.loadavg[1], systeminfo.loadavg[2],
-    systeminfo.total_cpu_user_percent/10.,
-    systeminfo.total_cpu_syst_percent/10.,
-  #ifdef HAVE_CPU_WAIT
-    systeminfo.total_cpu_wait_percent/10.,
-  #endif
-    systeminfo.total_mem_percent/10.,
-    systeminfo.total_mem_kbyte);
-    
+    "</table>");
 }
 
 
@@ -898,7 +921,7 @@
       
       out_print(res,
         "<br><p>&nbsp;</p>"
-        "<table cellspacing=0 cellpadding=3 border=0 width=\"70%%\">"
+        "<table cellspacing=0 cellpadding=3 border=0 width=\"90%%\">"
         "<tr>"
         "<td width=\"20%%\"><h3><b>Process</b></h3></td>"
         "<td align=\"left\"><h3><b>Status</b></h3></td>"
@@ -985,7 +1008,7 @@
       
       out_print(res,
 	"<br><p>&nbsp;</p>"
-	"<table cellspacing=0 cellpadding=3 border=0 width=\"70%%\">"
+	"<table cellspacing=0 cellpadding=3 border=0 width=\"90%%\">"
 	"<tr>"
 	"<td width=\"20%%\"><h3><b>Device</b></h3></td>"
 	"<td align=\"left\"><h3><b>Status</b></h3></td>"
@@ -1064,7 +1087,7 @@
       
       out_print(res,
 	"<br><p>&nbsp;</p>"
-	"<table cellspacing=0 cellpadding=3 border=0 width=\"70%%\">"
+	"<table cellspacing=0 cellpadding=3 border=0 width=\"90%%\">"
 	"<tr>"
 	"<td width=\"20%%\"><h3><b>File</b></h3></td>"
 	"<td align=\"left\"><h3><b>Status</b></h3></td>"
@@ -1137,7 +1160,7 @@
 
       out_print(res,
 	"<br><p>&nbsp;</p>"
-	"<table cellspacing=0 cellpadding=3 border=0 width=\"70%%\">"
+	"<table cellspacing=0 cellpadding=3 border=0 width=\"90%%\">"
 	"<tr>"
 	"<td width=\"20%%\"><h3><b>Directory</b></h3></td>"
 	"<td align=\"left\"><h3><b>Status</b></h3></td>"
@@ -1208,7 +1231,7 @@
       
       out_print(res,
 	"<br><p>&nbsp;</p>"
-	"<table cellspacing=0 cellpadding=3 border=0 width=\"70%%\">"
+	"<table cellspacing=0 cellpadding=3 border=0 width=\"90%%\">"
 	"<tr>"
 	"<td width=\"20%%\"><h3><b>Host</b></h3></td>"
 	"<td align=\"left\"><h3><b>Status</b></h3></td>"
@@ -1714,10 +1737,10 @@
 
 static void print_service_rules_process(HttpResponse res, Service_T s) {
 
-  char ratio1[STRLEN];
-  char ratio2[STRLEN];
-
   if(s->type == TYPE_PROCESS) {
+
+    char ratio1[STRLEN];
+
     out_print(res, "<tr><td>Pid</td><td>If changed %s then %s</td></tr>\n",
       Util_getEventratio(s->action_PID->failed, ratio1),
       actionnames[s->action_PID->failed->id]);
@@ -1725,9 +1748,15 @@
       Util_getEventratio(s->action_PPID->failed, ratio1),
       actionnames[s->action_PPID->failed->id]);
   }
+}
+
+
+static void print_service_rules_resource(HttpResponse res, Service_T s) {
 
   if(s->resourcelist) {
 
+    char          ratio1[STRLEN];
+    char          ratio2[STRLEN];
     Resource_T    q;
     EventAction_T a;
     
@@ -1751,6 +1780,39 @@
           ratio2, actionnames[a->passed->id]);
 	break;
 	  
+      case RESOURCE_ID_CPUUSER: 
+	  
+	out_print(res,"<tr><td>CPU user limit</td>"
+	  "<td>If %s %.1f%% %s then %s "
+          "else if passed %s then %s</td></tr>", 
+	  operatornames[q->operator],
+	  q->limit/10.0,
+          ratio1, actionnames[a->failed->id],
+          ratio2, actionnames[a->passed->id]);
+	break;
+	  
+      case RESOURCE_ID_CPUSYSTEM: 
+	  
+	out_print(res,"<tr><td>CPU system limit</td>"
+	  "<td>If %s %.1f%% %s then %s "
+          "else if passed %s then %s</td></tr>", 
+	  operatornames[q->operator],
+	  q->limit/10.0,
+          ratio1, actionnames[a->failed->id],
+          ratio2, actionnames[a->passed->id]);
+	break;
+	  
+      case RESOURCE_ID_CPUWAIT: 
+	  
+	out_print(res,"<tr><td>CPU wait limit</td>"
+	  "<td>If %s %.1f%% %s then %s "
+          "else if passed %s then %s</td></tr>", 
+	  operatornames[q->operator],
+	  q->limit/10.0,
+          ratio1, actionnames[a->failed->id],
+          ratio2, actionnames[a->passed->id]);
+	break;
+	  
       case RESOURCE_ID_MEM_PERCENT: 
 	  
 	out_print(res,"<tr><td>Memory usage limit</td>"
@@ -2147,15 +2209,6 @@
         "<tr><td>Parent process id </td><td>-</td></tr>"
         "<tr><td>Process uptime</td><td>-</td></tr>");
 
-      if(Run.doprocess) {
-        out_print(res,
-          "<tr><td>CPU usage</td><td>-</td></tr>"
-          "<tr><td>Memory usage</td><td>-</td></tr>"
-          "<tr><td>Children</td><td>-</td></tr>"
-          "<tr><td>Total CPU usage (incl. children)</td><td>-</td></tr>"
-          "<tr><td>Total memory usage (incl. children)</td><td>-</td></tr>");
-      }
-
     } else {
 
       char *uptime;
@@ -2172,8 +2225,32 @@
         "<tr><td>Process uptime</td><td>%s</td></tr>",
         uptime);
       FREE(uptime);
+    }
+  }
+}
 
-      if(Run.doprocess) {
+
+static void print_service_params_resource(HttpResponse res, Service_T s) {
+
+  if(Run.doprocess && (s->type == TYPE_PROCESS || s->type == TYPE_SYSTEM) ) {
+
+    if(!Util_hasServiceStatus(s)) {
+      if(s->type == TYPE_PROCESS) {
+        out_print(res,
+          "<tr><td>CPU usage</td><td>-</td></tr>"
+          "<tr><td>Memory usage</td><td>-</td></tr>"
+          "<tr><td>Children</td><td>-</td></tr>"
+          "<tr><td>Total CPU usage (incl. children)</td><td>-</td></tr>"
+          "<tr><td>Total memory usage (incl. children)</td><td>-</td></tr>");
+      } else if(s->type == TYPE_SYSTEM) {
+        out_print(res,
+          "<tr><td>Load average</td><td>-</td></tr>"
+          "<tr><td>CPU usage</td><td>-</td></tr>"
+          "<tr><td>Memory usage</td><td>-</td></tr>");
+      }
+    } else {
+
+      if(s->type == TYPE_PROCESS) {
         out_print(res,
           "<tr><td>CPU usage</td><td><font%s>%.1f%%</font></td></tr>",
           (s->error & EVENT_RESOURCE)?" color='#ff0000'":"",
@@ -2196,6 +2273,31 @@
           "<td><font%s>%.1f%% [%ldkB]</font></td></tr>",
           (s->error & EVENT_RESOURCE)?" color='#ff0000'":"",
           s->inf->total_mem_percent/10.0, s->inf->total_mem_kbyte);
+      } else if(s->type == TYPE_SYSTEM) {
+        out_print(res,
+          "<tr><td>Load average</td><td><font%s>[%.2f] [%.2f] [%.2f]</font></td></tr>",
+          (s->error & EVENT_RESOURCE)?" color='#ff0000'":"",
+          systeminfo.loadavg[0],
+          systeminfo.loadavg[1],
+          systeminfo.loadavg[2]);
+        out_print(res,
+          "<tr><td>CPU usage</td><td><font%s>%.1f%%us %.1f%%sy"
+        #ifdef HAVE_CPU_WAIT
+          " %.1f%%wa"
+        #endif
+          "%s",
+          (s->error & EVENT_RESOURCE)?" color='#ff0000'":"",
+          systeminfo.total_cpu_user_percent/10.,
+          systeminfo.total_cpu_syst_percent/10.,
+        #ifdef HAVE_CPU_WAIT
+          systeminfo.total_cpu_wait_percent/10.,
+        #endif
+          "</font></td></tr>");
+        out_print(res,
+          "<tr><td>Memory usage</td><td><font%s>%ld kB [%.1f%%]</font></td></tr>",
+          (s->error & EVENT_RESOURCE)?" color='#ff0000'":"",
+          systeminfo.total_mem_kbyte,
+          systeminfo.total_mem_percent/10.);
       }
     }
   }
@@ -2393,7 +2495,7 @@
   	}
         }
       }
-      if(s->type == TYPE_SYSTEM) {
+      if(s->type == TYPE_SYSTEM && Run.doprocess) {
         out_print(res,
           "  %-33s [%.2f] [%.2f] [%.2f]\n"
           "  %-33s %.1f%%us %.1f%%sy"
diff -Naur monit/l.l monit-system/l.l
--- monit/l.l	2005-11-06 01:53:21.000000000 +0100
+++ monit-system/l.l	2005-11-17 12:14:00.000000000 +0100
@@ -97,6 +97,9 @@
 loadavg1    load(avg)[ ]*(\([ ]*1[ ]*(m|min)?[ ]*\))?
 loadavg5    load(avg)[ ]*\([ ]*5[ ]*(m|min)?[ ]*\)
 loadavg15   load(avg)[ ]*\([ ]*15[ ]*(m|min)?[ ]*\)
+cpuuser     cpu[ ]*(usage)*[ ]*\([ ]*(us|usr|user)?[ ]*\)
+cpusyst     cpu[ ]*(usage)*[ ]*\([ ]*(sy|sys|system)?[ ]*\)
+cpuwait     cpu[ ]*(usage)*[ ]*\([ ]*(wa|wait)?[ ]*\)
 startarg    start{ws}?(program)?{ws}?([=]{ws})?["]
 stoparg     stop{ws}?(program)?{ws}?([=]{ws})?["]
 execarg     exec(ute)?{ws}?["]
@@ -178,6 +181,7 @@
 mailserver        { return MAILSERVER; }
 every             { return EVERY; }
 host              { return HOST; }
+system            { return SYSTEM; }
 default           { return DEFAULT; }
 http              { return HTTP; }
 apache-status     { return APACHESTATUS; }
@@ -275,6 +279,9 @@
 {loadavg1}        { return LOADAVG1; }
 {loadavg5}        { return LOADAVG5; }
 {loadavg15}       { return LOADAVG15; }
+{cpuuser}         { return CPUUSER; }
+{cpusyst}         { return CPUSYSTEM; }
+{cpuwait}         { return CPUWAIT; }
 {greater}         { return GREATER; }
 {less}            { return LESS; }
 {equal}           { return EQUAL; }
@@ -313,6 +320,11 @@
                     return CHECKHOST;
                   }
 
+check[ \t]+system {
+                    BEGIN(SERVICE_COND);
+                    return CHECKSYSTEM;
+                  }
+
 [a-zA-Z0-9]+"://" {
 		    yylval.url= 
 		      create_URL(xstrndup(yytext, strlen(yytext)-3));
diff -Naur monit/monitor.c monit-system/monitor.c
--- monit/monitor.c	2005-11-12 11:58:14.000000000 +0100
+++ monit-system/monitor.c	2005-11-17 12:14:00.000000000 +0100
@@ -478,23 +478,26 @@
     Event_post(Run.system, EVENT_INSTANCE, STATE_FAILED,
       Run.system->action_MONIT_START, "Monit started");
 
-    for(;;) {
+    while(TRUE) {
 
       validate();
       State_save();
       sleep(Run.polltime);
 
-      if(Run.doreload)
-        do_reinit();
-      
-      if(Run.stopped)
-        do_exit();
-      
       if(Run.dowakeup) {
         Run.dowakeup = FALSE;
         log("Awakened by User defined signal 1\n");
       }
       
+      if(Run.stopped) {
+        do_exit();
+      } else if(Run.doreload) {
+        do_reinit();
+      } else {
+        Event_post(Run.system, EVENT_INSTANCE, STATE_PASSED,
+          Run.system->action_MONIT_START, "Monit has not changed");
+      }
+      
     }
     
   } else {
diff -Naur monit/monitor.h monit-system/monitor.h
--- monit/monitor.h	2005-11-12 11:58:14.000000000 +0100
+++ monit-system/monitor.h	2005-11-17 12:14:00.000000000 +0100
@@ -142,6 +142,9 @@
 #define RESOURCE_ID_TOTAL_MEM_PERCENT 9
 #define RESOURCE_ID_INODE             10
 #define RESOURCE_ID_SPACE             11
+#define RESOURCE_ID_CPUUSER           12
+#define RESOURCE_ID_CPUSYSTEM         13
+#define RESOURCE_ID_CPUWAIT           14
 
 #define DIGEST_CLEARTEXT   1
 #define DIGEST_CRYPT       2
@@ -588,10 +591,10 @@
   int    children;
   long   mem_kbyte;    
   long   total_mem_kbyte;
-  int    mem_percent;                                    /**< pecentage * 10 */
-  int    total_mem_percent;                              /**< pecentage * 10 */
-  int    cpu_percent;                                    /**< pecentage * 10 */
-  int    total_cpu_percent;                              /**< pecentage * 10 */
+  int    mem_percent;                                   /**< percentage * 10 */
+  int    total_mem_percent;                             /**< percentage * 10 */
+  int    cpu_percent;                                   /**< percentage * 10 */
+  int    total_cpu_percent;                             /**< percentage * 10 */
   time_t uptime;                                         /**< Process uptime */
 } *Info_T;
 
diff -Naur monit/monitrc monit-system/monitrc
--- monit/monitrc	2005-11-06 01:53:21.000000000 +0100
+++ monit-system/monitrc	2005-11-17 12:14:00.000000000 +0100
@@ -266,7 +266,7 @@
 #
 ## [NB! Check and edit for your system and uncomment below]
 #
-## Poll at 2-minute intervals.
+## Daemonize monit and poll at 2-minute intervals.
 # set daemon  120
 #
 ## Set syslog logging.
@@ -295,6 +295,16 @@
 #     allow localhost       # allow localhost to connect to the server and
 #     allow admin:monit     # user 'admin' with password 'monit'
 #
+#    
+#  check system myhost.mydomain.tld
+#    if loadavg (1min) > 4 then alert
+#    if loadavg (5min) > 2 then alert
+#    if memory usage > 75% then alert
+#    if cpu usage (user) > 70% then alert
+#    if cpu usage (system) > 30% then alert
+#    if cpu usage (wait) > 20% then alert
+#
+#    
 #  check process apache with pidfile /usr/local/apache/logs/httpd.pid
 #    start program = "/etc/init.d/httpd start"
 #    stop program  = "/etc/init.d/httpd stop"
diff -Naur monit/process.c monit-system/process.c
--- monit/process.c	2005-11-06 01:53:21.000000000 +0100
+++ monit-system/process.c	2005-11-17 12:14:00.000000000 +0100
@@ -78,10 +78,11 @@
 char operatorshortnames[][3]= {">", "<", "=", "!="};
 char monitornames[][STRLEN]=  {"not monitored", "monitored", "initializing"};
 char statusnames[][STRLEN]=   {"accessible", "accessible", "accessible",
-                               "running", "online with all services"};
+                               "running", "online with all services",
+                               "running"};
 char servicetypes[][STRLEN]=  {"Device", "Directory", "File", "Process",
                                "Remote Host", "System"};
-char pathnames[][STRLEN]=     {"Path", "Path", "Path", "Pid file", "Path"};
+char pathnames[][STRLEN]=     {"Path", "Path", "Path", "Pid file", "Path", ""};
 char icmpnames[][STRLEN]=     {"Echo Reply", "", "", "Destination Unreachable",
                                "Source Quench", "Redirect", "", "",
                                "Echo Request", "", "", "Time Exceeded",
@@ -197,18 +198,16 @@
     /** Get load average triplet */
     if(-1 == getloadavg_sysdep(systeminfo.loadavg, 3))
     {
-      log("'system' statistic error -- load average gathering failed\n");
+      log("'%s' statistic error -- load average gathering failed\n",
+        Run.system->name);
       goto error1;
     }
-    DEBUG("'system' load average [%.2f][%.2f][%.2f]\n",
-      systeminfo.loadavg[0],
-      systeminfo.loadavg[1],
-      systeminfo.loadavg[2]);
 
     /** Get real memory usage statistic */
     if(!used_system_memory_sysdep(&systeminfo))
     {
-      DEBUG("'system' statistic -- memory usage gathering method fallback\n");
+      DEBUG("'%s' statistic -- memory usage gathering method fallback\n",
+        Run.system->name);
       /* Update the total real memory usage by monitoring process with PID 1 */
       if((leaf = findprocess(1, pt, treesize)) && leaf->mem_kbyte_sum > 0)
       {
@@ -216,20 +215,19 @@
       }
       else
       {
-        log("'system' statistic error -- memory usage gathering failed\n");
+        log("'%s' statistic error -- memory usage gathering failed\n",
+          Run.system->name);
         goto error2;
       }
     }
     systeminfo.total_mem_percent = (int)(1000 *
       (double)systeminfo.total_mem_kbyte / (double)systeminfo.mem_kbyte_max);
-    DEBUG("'system' memory usage %.1f%% [%ld kB]\n",
-      systeminfo.total_mem_percent / 10.,
-      systeminfo.total_mem_kbyte);
 
     /** Get CPU usage statistic */
     if(!used_system_cpu_sysdep(&systeminfo))
     {
-      DEBUG("'system' statistic -- cpu usage gathering method fallback\n");
+      DEBUG("'%s' statistic -- cpu usage gathering method fallback\n",
+        Run.system->name);
       /* Update the total CPU load by monitoring process with PID 1 */
       if((leaf = findprocess(1, pt, treesize)))
       {
@@ -239,14 +237,11 @@
       }
       else
       {
-        log("'system' statistic error -- cpu usage gathering failed\n");
+        log("'%s' statistic error -- cpu usage gathering failed\n",
+          Run.system->name);
         goto error3;
       }
     }
-    DEBUG("'system' cpu usage %.1f%%us %.1f%%sy %.1f%%wa\n",
-      systeminfo.total_cpu_user_percent / 10.,
-      systeminfo.total_cpu_syst_percent / 10.,
-      systeminfo.total_cpu_wait_percent / 10.);
 
     return TRUE;
   }
diff -Naur monit/p.y monit-system/p.y
--- monit/p.y	2005-11-12 11:58:15.000000000 +0100
+++ monit-system/p.y	2005-11-17 12:14:00.000000000 +0100
@@ -261,10 +261,10 @@
 %token <number> REPLYLIMIT REQUESTLIMIT STARTLIMIT WAITLIMIT GRACEFULLIMIT 
 %token <number> CLEANUPLIMIT 
 %token <real> REAL
-%token CHECKPROC CHECKDEV CHECKFILE CHECKDIR CHECKHOST
-%token CPUUSAGE MEMUSAGE MEMKBYTE CHILDREN 
-%token RESOURCE MEMORY TOTALMEMORY CPU LOADAVG1 LOADAVG5 LOADAVG15 
-%token MODE ACTIVE PASSIVE MANUAL
+%token CHECKPROC CHECKDEV CHECKFILE CHECKDIR CHECKHOST CHECKSYSTEM
+%token CPUUSAGE MEMUSAGE MEMKBYTE CHILDREN SYSTEM
+%token RESOURCE MEMORY TOTALMEMORY LOADAVG1 LOADAVG5 LOADAVG15 
+%token MODE ACTIVE PASSIVE MANUAL CPU CPUUSER CPUSYSTEM CPUWAIT
 %token GROUP REQUEST DEPENDS BASEDIR SLOT EVENTQUEUE
 %token UID GID COLLECTOR INSTANCE
 %token TIMESTAMP CHANGED SECOND MINUTE HOUR DAY
@@ -303,6 +303,7 @@
                 | checkdev optdevlist
                 | checkdir optdirlist
                 | checkhost opthostlist
+                | checksystem optsystemlist
                 ;
 
 optproclist     : /* EMPTY */
@@ -321,7 +322,7 @@
                 | mode
                 | group
                 | depend
-                | resourcesystem
+                | resourceprocess
                 ;
 
 optfilelist      : /* EMPTY */
@@ -398,6 +399,18 @@
                 | depend
                 ;
 
+optsystemlist   : /* EMPTY */
+                | optsystemlist optsystem
+                ;
+
+optsystem       : timeout
+                | alert
+                | every
+                | group
+                | depend
+                | resourcesystem
+                ;
+
 setalert        : SET alertmail '{' eventoptionlist '}' formatlist reminder {
                     addmail($<string>2, &mailset, &Run.maillist, eventset, $<number>5);
                   }
@@ -704,6 +717,13 @@
                   }
                 ;
 
+checksystem     : CHECKSYSTEM SERVICENAME {
+                   check_name($<string>2);
+                   createservice(TYPE_SYSTEM, $<string>2, xstrdup(""),
+                     check_system);
+                  }
+                ;
+
 start           : START argumentlist { addcommand(START); }
                 | START argumentlist useroptionlist { addcommand(START); }
                 ;
@@ -1082,19 +1102,65 @@
 dependant       : SERVICENAME { adddependant($<string>1); }
                 ;
 
-resourcesystem  : IF resource rate1 THEN action1 recovery {
+resourceprocess : IF resourceprocesslist rate1 THEN action1 recovery {
+                     addeventaction(&(resourceset).action,
+                       $<number>5, $<number>6);
+                     addresource(&resourceset);
+                   }
+                ;
+
+resourceprocesslist : resourceprocessopt
+                    | resourceprocesslist resourceprocessopt
+                    ;
+
+resourceprocessopt  : resourcecpuproc
+                    | resourcemem
+                    | resourcechild
+                    | resourceload
+                    ;
+
+resourcesystem  : IF resourcesystemlist rate1 THEN action1 recovery {
                      addeventaction(&(resourceset).action,
                        $<number>5, $<number>6);
                      addresource(&resourceset);
                    }
                 ;
 
-resource        : /* Old syntax */
+resourcesystemlist : resourcesystemopt
+                   | resourcesystemlist resourcesystemopt
+                   ;
+
+resourcesystemopt  : resourceload
+                   | resourcemem
+                   | resourcecpu
+                   ;
+
+resourcecpuproc : /* Old syntax */
                   CPUUSAGE operator value { 
                     yyerror("CPUUSAGE is obsolete -"
                             " use the CPU statement instead");
                   }
-                | MEMUSAGE operator value { 
+                | CPU operator NUMBER PERCENT {
+                    resourceset.resource_id= RESOURCE_ID_CPU_PERCENT;
+                    resourceset.operator= $<number>2;
+                    resourceset.limit= ($3 * 10); 
+                  }
+                ;
+
+resourcecpu     : resourcecpuid operator NUMBER PERCENT {
+                    resourceset.resource_id= $<number>1;
+                    resourceset.operator= $<number>2;
+                    resourceset.limit= ($3 * 10); 
+                  }
+                ;
+
+resourcecpuid   : CPUUSER   { $<number>$= RESOURCE_ID_CPUUSER; }
+                | CPUSYSTEM { $<number>$= RESOURCE_ID_CPUSYSTEM; }
+                | CPUWAIT   { $<number>$= RESOURCE_ID_CPUWAIT; }
+                ;
+
+resourcemem     : /* Old syntax */
+                  MEMUSAGE operator value { 
                     yyerror("MEMUSAGE is obsolete -"
                             " use the MEMORY statement instead");
                   }
@@ -1135,33 +1201,31 @@
                               prog, lineno);
 #endif
                   }
-                | CPU operator NUMBER PERCENT {
-                    resourceset.resource_id= RESOURCE_ID_CPU_PERCENT;
-                    resourceset.operator= $<number>2;
-                    resourceset.limit= ($3 * 10); 
-                  }
-                /* Remaining syntax */
-                | CHILDREN operator NUMBER { 
+                ;
+
+resourcechild   : CHILDREN operator NUMBER { 
                     resourceset.resource_id= RESOURCE_ID_CHILDREN;
                     resourceset.operator= $<number>2;
                     resourceset.limit= (int) $3; 
                   }
-                | resourceload operator value { 
+                ;
+
+resourceload    : resourceloadavg operator value { 
                     resourceset.resource_id= $<number>1;
                     resourceset.operator= $<number>2;
                     resourceset.limit= (int) ($<real>3 * 10.0); 
                   }
                 ;
 
-value           : REAL { $<real>$ = $1; }
-                | NUMBER { $<real>$ = (float) $1; }
-                ;
-
-resourceload    : LOADAVG1  { $<number>$= RESOURCE_ID_LOAD1; }
+resourceloadavg : LOADAVG1  { $<number>$= RESOURCE_ID_LOAD1; }
                 | LOADAVG5  { $<number>$= RESOURCE_ID_LOAD5; }
                 | LOADAVG15 { $<number>$= RESOURCE_ID_LOAD15; }
                 ;
 
+value           : REAL { $<real>$ = $1; }
+                | NUMBER { $<real>$ = (float) $1; }
+                ;
+
 timestamp       : IF TIMESTAMP operator NUMBER time rate1 THEN action1
                   recovery {
                     timestampset.operator= $<number>3;
@@ -1566,8 +1630,10 @@
     yyparse();
     fclose(yyin);
     /* If defined - add the last service to the service list */
-    if(current)
+    if(current) {
       addservice(current);
+      current = NULL;
+    }
     postparse();
   END_LOCK;
 
@@ -1587,12 +1653,6 @@
  * Initialize objects used by the parser.
  */
 static void preparse() {
-  char host[STRLEN];
-
-  if(gethostname(host, sizeof(host)) < 0) {
-    snprintf(host, STRLEN, "%s", LOCALHOST);
-  }
-
   /* Set instance incarnation ID */
   time(&Run.incarnation);
   /* Reset lexer */
@@ -1636,8 +1696,6 @@
   reset_resourceset();
   reset_checksumset();
   reset_timestampset();
-  /* Add the general system service */
-  createservice(TYPE_SYSTEM, xstrdup(host), xstrdup(""), check_system);
 }
 
 
@@ -1681,6 +1739,13 @@
     }
   }
 
+  /* Add the default general system service if not specified explicitly */
+  if(!Run.system) {
+    createservice(TYPE_SYSTEM, xstrdup(Run.localhostname), xstrdup(""), check_system);
+    addservice(current);
+    current = NULL;
+    Run.system = Util_getService(Run.localhostname);
+  }
 }
 
 
@@ -1725,9 +1790,9 @@
   addeventaction(&(current)->action_PPID,     ACTION_ALERT,     ACTION_IGNORE);
 
   /* Initialize internal event handlers */
-  addeventaction(&(current)->action_MONIT_START,  ACTION_ALERT, ACTION_ALERT);
-  addeventaction(&(current)->action_MONIT_STOP,   ACTION_ALERT, ACTION_ALERT);
-  addeventaction(&(current)->action_MONIT_RELOAD, ACTION_ALERT, ACTION_ALERT);
+  addeventaction(&(current)->action_MONIT_START,  ACTION_ALERT, ACTION_IGNORE);
+  addeventaction(&(current)->action_MONIT_STOP,   ACTION_ALERT, ACTION_IGNORE);
+  addeventaction(&(current)->action_MONIT_RELOAD, ACTION_ALERT, ACTION_IGNORE);
   
   pthread_mutex_init(&current->mutex, NULL);
 
diff -Naur monit/util.c monit-system/util.c
--- monit/util.c	2005-11-06 01:53:21.000000000 +0100
+++ monit-system/util.c	2005-11-17 12:14:00.000000000 +0100
@@ -887,6 +887,36 @@
         ratio2, actionnames[a->passed->id]);
       break;
 
+    case RESOURCE_ID_CPUUSER: 
+
+      printf(" %-20s = if %s %.1f%% %s then %s "
+        "else if passed %s then %s\n", 
+        "CPU user limit", 
+        operatornames[q->operator], q->limit/10.0,
+        ratio1, actionnames[a->failed->id],
+        ratio2, actionnames[a->passed->id]);
+      break;
+
+    case RESOURCE_ID_CPUSYSTEM: 
+
+      printf(" %-20s = if %s %.1f%% %s then %s "
+        "else if passed %s then %s\n", 
+        "CPU system limit", 
+        operatornames[q->operator], q->limit/10.0,
+        ratio1, actionnames[a->failed->id],
+        ratio2, actionnames[a->passed->id]);
+      break;
+
+    case RESOURCE_ID_CPUWAIT: 
+
+      printf(" %-20s = if %s %.1f%% %s then %s "
+        "else if passed %s then %s\n", 
+        "CPU wait limit", 
+        operatornames[q->operator], q->limit/10.0,
+        ratio1, actionnames[a->failed->id],
+        ratio2, actionnames[a->passed->id]);
+      break;
+
     case RESOURCE_ID_MEM_PERCENT: 
 
       printf(" %-20s = if %s %.1f%% %s then %s "
diff -Naur monit/validate.c monit-system/validate.c
--- monit/validate.c	2005-11-06 01:53:21.000000000 +0100
+++ monit-system/validate.c	2005-11-17 12:14:00.000000000 +0100
@@ -460,6 +460,15 @@
  * FALSE is returned.
  */
 int check_system(Service_T s) {
+
+  Resource_T r= NULL;
+
+  ASSERT(s);
+
+  for(r= s->resourcelist; r; r= r->next) {
+    check_process_resources(s, r);
+  }
+
   return TRUE;
 }
 
@@ -612,20 +621,21 @@
 /**
  * Check process resources
  */
-static void check_process_resources(Service_T s, Resource_T pr) {
+static void check_process_resources(Service_T s, Resource_T r) {
 
   int okay= TRUE;
   char report[STRLEN]={0};
 
-  ASSERT(s && pr);
+  ASSERT(s && r);
+
+  switch(r->resource_id) {
 
-  switch(pr->resource_id) {
   case RESOURCE_ID_CPU_PERCENT:
-    if(Util_evalQExpression(pr->operator, s->inf->cpu_percent, pr->limit)) {
+    if(Util_evalQExpression(r->operator, s->inf->cpu_percent, r->limit)) {
       snprintf(report, STRLEN,
         "'%s' cpu usage of %.1f%% matches resource limit [cpu usage%s%.1f%%]",
-        s->name, s->inf->cpu_percent/10.0, operatorshortnames[pr->operator],
-        pr->limit/10.0);
+        s->name, s->inf->cpu_percent/10.0, operatorshortnames[r->operator],
+        r->limit/10.0);
       okay= FALSE;
     } else {
       DEBUG("'%s' cpu usage check passed [current cpu usage=%.1f%%]\n",
@@ -633,39 +643,103 @@
     }
     break;
 
-  case RESOURCE_ID_MEM_PERCENT:
-    if(Util_evalQExpression(pr->operator, s->inf->mem_percent, pr->limit)) {
+  case RESOURCE_ID_CPUUSER:
+    if(Util_evalQExpression(r->operator, systeminfo.total_cpu_user_percent, r->limit)) {
       snprintf(report, STRLEN,
-        "'%s' mem usage of %.1f%% matches resource limit [mem usage%s%.1f%%]",
-        s->name, s->inf->mem_percent/10.0, operatorshortnames[pr->operator],
-        pr->limit/10.0);
+        "'%s' cpu user usage of %.1f%% matches resource limit [cpu user usage%s%.1f%%]",
+        s->name, systeminfo.total_cpu_user_percent/10.0, operatorshortnames[r->operator],
+        r->limit/10.0);
       okay= FALSE;
     } else {
-      DEBUG("'%s' mem usage check passed [current mem usage=%.1f%%]\n",
-        s->name, s->inf->mem_percent/10.0);
+      DEBUG("'%s' cpu user usage check passed [current cpu user usage=%.1f%%]\n",
+        s->name, systeminfo.total_cpu_user_percent/10.0);
     }
     break;
 
-  case RESOURCE_ID_MEM_KBYTE:
-    if(Util_evalQExpression(pr->operator, s->inf->mem_kbyte, pr->limit)) {
+  case RESOURCE_ID_CPUSYSTEM:
+    if(Util_evalQExpression(r->operator, systeminfo.total_cpu_syst_percent, r->limit)) {
       snprintf(report, STRLEN,
-        "'%s' mem amount of %ldkB matches resource limit [mem amount%s%ldkB]",
-        s->name, s->inf->mem_kbyte, operatorshortnames[pr->operator], pr->limit);
+        "'%s' cpu system usage of %.1f%% matches resource limit [cpu system usage%s%.1f%%]",
+        s->name, systeminfo.total_cpu_syst_percent/10.0, operatorshortnames[r->operator],
+        r->limit/10.0);
       okay= FALSE;
     } else {
-      DEBUG("'%s' mem amount check passed [current mem amount=%ldkB]\n",
-        s->name, s->inf->mem_kbyte);
+      DEBUG("'%s' cpu system usage check passed [current cpu system usage=%.1f%%]\n",
+        s->name, systeminfo.total_cpu_syst_percent/10.0);
+    }
+    break;
+
+  case RESOURCE_ID_CPUWAIT:
+    if(Util_evalQExpression(r->operator, systeminfo.total_cpu_wait_percent, r->limit)) {
+      snprintf(report, STRLEN,
+        "'%s' cpu wait usage of %.1f%% matches resource limit [cpu wait usage%s%.1f%%]",
+        s->name, systeminfo.total_cpu_wait_percent/10.0, operatorshortnames[r->operator],
+        r->limit/10.0);
+      okay= FALSE;
+    } else {
+      DEBUG("'%s' cpu wait usage check passed [current cpu wait usage=%.1f%%]\n",
+        s->name, systeminfo.total_cpu_wait_percent/10.0);
+    }
+    break;
+
+  case RESOURCE_ID_MEM_PERCENT:
+    if(s->type == TYPE_SYSTEM) {
+      if(Util_evalQExpression(r->operator, systeminfo.total_mem_percent, r->limit)) {
+        snprintf(report, STRLEN,
+          "'%s' mem usage of %.1f%% matches resource limit [mem usage%s%.1f%%]",
+          s->name, systeminfo.total_mem_percent/10.0, operatorshortnames[r->operator],
+          r->limit/10.0);
+        okay= FALSE;
+      } else {
+        DEBUG("'%s' mem usage check passed [current mem usage=%.1f%%]\n",
+          s->name, systeminfo.total_mem_percent/10.0);
+      }
+    } else {
+      if(Util_evalQExpression(r->operator, s->inf->mem_percent, r->limit)) {
+        snprintf(report, STRLEN,
+          "'%s' mem usage of %.1f%% matches resource limit [mem usage%s%.1f%%]",
+          s->name, s->inf->mem_percent/10.0, operatorshortnames[r->operator],
+          r->limit/10.0);
+        okay= FALSE;
+      } else {
+        DEBUG("'%s' mem usage check passed [current mem usage=%.1f%%]\n",
+          s->name, s->inf->mem_percent/10.0);
+      }
+    }
+    break;
+
+  case RESOURCE_ID_MEM_KBYTE:
+    if(s->type == TYPE_SYSTEM) {
+      if(Util_evalQExpression(r->operator, systeminfo.total_mem_kbyte, r->limit)) {
+        snprintf(report, STRLEN,
+          "'%s' mem amount of %ldkB matches resource limit [mem amount%s%ldkB]",
+          s->name, systeminfo.total_mem_kbyte, operatorshortnames[r->operator], r->limit);
+        okay= FALSE;
+      } else {
+        DEBUG("'%s' mem amount check passed [current mem amount=%ldkB]\n",
+          s->name, systeminfo.total_mem_kbyte);
+      }
+    } else {
+      if(Util_evalQExpression(r->operator, s->inf->mem_kbyte, r->limit)) {
+        snprintf(report, STRLEN,
+          "'%s' mem amount of %ldkB matches resource limit [mem amount%s%ldkB]",
+          s->name, s->inf->mem_kbyte, operatorshortnames[r->operator], r->limit);
+        okay= FALSE;
+      } else {
+        DEBUG("'%s' mem amount check passed [current mem amount=%ldkB]\n",
+          s->name, s->inf->mem_kbyte);
+      }
     }
     break;
 
   case RESOURCE_ID_LOAD1:
-    if(Util_evalQExpression(pr->operator,
-                     (int)(systeminfo.loadavg[0]*10.0), pr->limit)) {
+    if(Util_evalQExpression(r->operator,
+                     (int)(systeminfo.loadavg[0]*10.0), r->limit)) {
       snprintf(report, STRLEN,
         "'%s' loadavg(1min) of %.1f matches resource limit "
         "[loadavg(1min)%s%.1f]",
-        s->name, systeminfo.loadavg[0], operatorshortnames[pr->operator],
-        pr->limit/10.0);
+        s->name, systeminfo.loadavg[0], operatorshortnames[r->operator],
+        r->limit/10.0);
       okay= FALSE;
     } else {
       DEBUG("'%s' loadavg(1min) check passed [current loadavg(1min)=%.1f]\n",
@@ -674,13 +748,13 @@
     break;
 
   case RESOURCE_ID_LOAD5:
-    if(Util_evalQExpression(pr->operator,
-                     (int)(systeminfo.loadavg[1]*10.0), pr->limit)) {
+    if(Util_evalQExpression(r->operator,
+                     (int)(systeminfo.loadavg[1]*10.0), r->limit)) {
       snprintf(report, STRLEN,
         "'%s' loadavg(5min) of %.1f matches resource limit "
         "[loadavg(5min)%s%.1f]",
-        s->name, systeminfo.loadavg[1], operatorshortnames[pr->operator],
-        pr->limit/10.0);
+        s->name, systeminfo.loadavg[1], operatorshortnames[r->operator],
+        r->limit/10.0);
       okay= FALSE;
     } else {
       DEBUG("'%s' loadavg(5min) check passed [current loadavg(5min)=%.1f]\n",
@@ -689,13 +763,13 @@
     break;
 
   case RESOURCE_ID_LOAD15:
-    if(Util_evalQExpression(pr->operator,
-                     (int)(systeminfo.loadavg[2]*10.0), pr->limit)) {
+    if(Util_evalQExpression(r->operator,
+                     (int)(systeminfo.loadavg[2]*10.0), r->limit)) {
       snprintf(report, STRLEN,
         "'%s' loadavg(15min) of %.1f matches resource limit "
         "[loadavg(15min)%s%.1f]",
-        s->name, systeminfo.loadavg[2], operatorshortnames[pr->operator],
-        pr->limit/10.0);
+        s->name, systeminfo.loadavg[2], operatorshortnames[r->operator],
+        r->limit/10.0);
       okay= FALSE;
     } else {
       DEBUG("'%s' loadavg(15min) check passed [current loadavg(15min)=%.1f]\n",
@@ -704,10 +778,10 @@
     break;
 
   case RESOURCE_ID_CHILDREN:
-    if(Util_evalQExpression(pr->operator, s->inf->children, pr->limit)) {
+    if(Util_evalQExpression(r->operator, s->inf->children, r->limit)) {
       snprintf(report, STRLEN,
         "'%s' children of %i matches resource limit [children%s%ld]",
-        s->name, s->inf->children, operatorshortnames[pr->operator], pr->limit);
+        s->name, s->inf->children, operatorshortnames[r->operator], r->limit);
       okay= FALSE;
     } else {
       DEBUG("'%s' children check passed [current children=%i]\n",
@@ -716,12 +790,12 @@
     break;
 
   case RESOURCE_ID_TOTAL_MEM_KBYTE:
-    if(Util_evalQExpression(pr->operator, s->inf->total_mem_kbyte, pr->limit)) {
+    if(Util_evalQExpression(r->operator, s->inf->total_mem_kbyte, r->limit)) {
       snprintf(report, STRLEN,
         "'%s' total mem amount of %ldkB matches resource limit"
         " [total mem amount%s%ldkB]",
-        s->name, s->inf->total_mem_kbyte, operatorshortnames[pr->operator],
-        pr->limit);
+        s->name, s->inf->total_mem_kbyte, operatorshortnames[r->operator],
+        r->limit);
       okay= FALSE;
     } else {
       DEBUG("'%s' total mem amount check passed "
@@ -730,12 +804,12 @@
     break;
 
   case RESOURCE_ID_TOTAL_MEM_PERCENT:
-    if(Util_evalQExpression(pr->operator, s->inf->total_mem_percent, pr->limit)) {
+    if(Util_evalQExpression(r->operator, s->inf->total_mem_percent, r->limit)) {
       snprintf(report, STRLEN,
         "'%s' total mem amount of %.1f%% matches resource limit"
         " [total mem amount%s%.1f%%]",
         s->name, (float)s->inf->total_mem_percent/10.0,
-        operatorshortnames[pr->operator], (float)pr->limit/10.0);
+        operatorshortnames[r->operator], (float)r->limit/10.0);
       okay= FALSE;
     } else {
       DEBUG("'%s' total mem amount check passed "
@@ -745,14 +819,14 @@
     break;
 
   default:
-    log("'%s' error -- unknown resource ID: [%d]\n", s->name, pr->resource_id);
+    log("'%s' error -- unknown resource ID: [%d]\n", s->name, r->resource_id);
     return;
   }
 
   if(! okay) {
-    Event_post(s, EVENT_RESOURCE, STATE_FAILED, pr->action, report);
+    Event_post(s, EVENT_RESOURCE, STATE_FAILED, r->action, "%s", report);
   } else {
-    Event_post(s, EVENT_RESOURCE, STATE_PASSED, pr->action,
+    Event_post(s, EVENT_RESOURCE, STATE_PASSED, r->action,
       "'%s' resource passed", s->name);
   }
   
diff -Naur monit/xml.c monit-system/xml.c
--- monit/xml.c	2005-11-12 11:58:18.000000000 +0100
+++ monit-system/xml.c	2005-11-17 12:14:00.000000000 +0100
@@ -296,9 +296,8 @@
           }
         }
       }
-      if(S->type == TYPE_SYSTEM) {
+      if(S->type == TYPE_SYSTEM && Run.doprocess) {
         buf_print(B,
-                  "\t\t<hostname>%s</hostname>\r\n"
                   "\t\t<load>\r\n"
                   "\t\t\t<avg01>%.2f</avg01>\r\n"
                   "\t\t\t<avg05>%.2f</avg05>\r\n"
