diff -ru privatemsg.orig/privatemsg.install privatemsg/privatemsg.install
--- privatemsg.orig/privatemsg.install	2007-01-27 01:56:10.000000000 +0100
+++ privatemsg/privatemsg.install	2007-02-12 18:12:05.418002300 +0100
@@ -18,6 +18,7 @@
           author_del    tinyint unsigned NOT NULL DEFAULT '0',
           recipient_del tinyint unsigned NOT NULL DEFAULT '0',
           format        int(4) NOT NULL DEFAULT '0',
+          system_msg    tinyint(3) unsigned NOT NULL DEFAULT '0',
           key (recipient),
           key (folder)
         ) /*!40100 DEFAULT CHARACTER SET utf8 */;");
@@ -55,6 +56,7 @@
           folder        integer NOT NULL DEFAULT '0',
           author_del    smallint NOT NULL DEFAULT '0',
           recipient_del smallint NOT NULL DEFAULT '0',
+          system_msg    smallint NOT NULL DEFAULT '0',
           PRIMARY KEY (id)
         )");
       db_query("CREATE INDEX {privatemsg_folder_index} ON {privatemsg}(folder)");
@@ -142,4 +144,17 @@
 function privatemsg_update_1() {
   return _system_update_utf8(array('privatemsg', 'privatemsg_archive', 'privatemsg_folder'));
 }
-?>
+
+function privatemsg_update_2() {
+  $ret = array();
+  switch ($GLOBALS['db_type']) {
+    case 'mysql':
+    case 'mysqli':
+      $ret[] = update_sql("ALTER TABLE {privatemsg} ADD COLUMN system_msg tinyint(3) unsigned NOT NULL DEFAULT '0'");
+      break;
+    case 'pgsql':
+      db_add_column($ret, 'privatemsg', 'system_msg', 'smallint', array('default' => 0, 'not null' => TRUE));
+      break;
+  }
+  return $ret;
+}
Only in privatemsg/: privatemsg.install[1].bak
diff -ru privatemsg.orig/privatemsg.module privatemsg/privatemsg.module
--- privatemsg.orig/privatemsg.module	2007-02-11 22:31:26.000000000 +0100
+++ privatemsg/privatemsg.module	2007-02-12 20:32:36.751519300 +0100
@@ -326,7 +326,7 @@
   drupal_set_title(t('Private messages'));
   $current_folder = arg(2);
   if ($current_folder != 1) {
-    $result = pager_query('SELECT id, subject, p.timestamp, u.uid, u.name, newmsg FROM {privatemsg} p, {users} u WHERE p.author = u.uid AND p.recipient = %d AND folder = %d AND p.recipient_del = 0 ORDER BY p.timestamp DESC', variable_get('privatemsg_per_page', 10), 0, NULL, $user->uid, $current_folder);
+    $result = pager_query('SELECT id, subject, p.timestamp, u.uid, u.name, newmsg, system_msg FROM {privatemsg} p, {users} u WHERE p.author = u.uid AND p.recipient = %d AND folder = %d AND p.recipient_del = 0 ORDER BY p.timestamp DESC', variable_get('privatemsg_per_page', 10), 0, NULL, $user->uid, $current_folder);
 
     if ($current_folder > 0) {
       $folder_name = db_result(db_query('SELECT name FROM {privatemsg_folder} WHERE fid = %d AND uid = %d', $current_folder, $user->uid));
@@ -521,14 +521,24 @@
   drupal_goto($user->uid ? 'privatemsg' : '');
 }
 
-// API callable from other modules:
+/**
+ * @{
+ * API callable from other modules.
+ */
 function privatemsg_send_privatemsg($recipient, $subject, $body, $format = FILTER_FORMAT_DEFAULT) {
   global $user;
-  return _privatemsg_send($user, $recipient, $subject, $body, $format);
+  return _privatemsg_send($user, $recipient, $subject, $body, $format, FALSE);
 }
 
-function _privatemsg_send($sender, $recipient, $subject, $body, $format) {
-  $result = db_query("INSERT INTO {privatemsg} (author, recipient, subject, message, timestamp, newmsg, hostname, format) VALUES (%d, %d, '%s', '%s', %d, %d, '%s', %d)", $sender->uid, $recipient->uid, $subject, $body, time(), 1, getenv('REMOTE_ADDR'), $format);
+function privatemsg_send_systemmsg($recipient, $subject, $body, $format = FILTER_FORMAT_DEFAULT) {
+  return _privatemsg_send(NULL, $recipient, $subject, $body, $format, TRUE);
+}
+/**
+ * @}
+ */
+
+function _privatemsg_send($sender, $recipient, $subject, $body, $format, $system_msg = FALSE) {
+  $result = db_query("INSERT INTO {privatemsg} (author, recipient, subject, message, timestamp, newmsg, hostname, format, system_msg) VALUES (%d, %d, '%s', '%s', %d, %d, '%s', %d, %d)", $system_msg ? 0 : $sender->uid, $recipient->uid, $subject, $body, time(), 1, $system_msg ? '' : getenv('REMOTE_ADDR'), $format, (int)$system_msg);
   if ($result !== false && isset($recipient->privatemsg_mailalert) && $recipient->privatemsg_mailalert == PRIVATEMSG_MAIL_INDIVIDUAL) {
     _privatemsg_sendmail($recipient, 1);
   }
@@ -537,14 +547,15 @@
 
 function privatemsg_view($message_id) {
   global $user;
-  $result = db_query('SELECT p.id, u.uid, u.name, p.author, p.timestamp, p.subject, p.message, p.newmsg, p.recipient, p.folder, p.format FROM {privatemsg} p, {users} u WHERE (recipient = %d OR author = %d) AND author = u.uid AND id = %d', $user->uid, $user->uid, $message_id);
+  $result = db_query('SELECT p.id, u.uid, u.name, p.author, p.timestamp, p.subject, p.message, p.newmsg, p.recipient, p.folder, p.format, p.system_msg FROM {privatemsg} p, {users} u WHERE (recipient = %d OR author = %d) AND author = u.uid AND id = %d', $user->uid, $user->uid, $message_id);
 
   $message = db_fetch_object($result);
   if ($message->newmsg && $user->uid == $message->recipient) {
     $result = db_query('UPDATE {privatemsg} SET newmsg = 0 WHERE id = %d', $message_id);
   }
 
-  return theme('privatemsg_view', $message);
+  $theme = ($message->system_msg) ?  'privatemsg_system_message_view' : 'privatemsg_view';
+  return theme($theme, $message);
 }
 
 function privatemsg_delete() {
@@ -557,14 +568,19 @@
 function _privatemsg_delete($id) {
   global $user;
 
-  $result = db_query('SELECT author, recipient, folder FROM {privatemsg} WHERE (recipient = %d OR author = %d) AND id = %d', $user->uid, $user->uid, $id);
+  $result = db_query('SELECT author, recipient, folder, system_msg FROM {privatemsg} WHERE (recipient = %d OR author = %d) AND id = %d', $user->uid, $user->uid, $id);
 
   if ($message = db_fetch_object($result)) {
-    if ($message->author == $user->uid) {
-      db_query('UPDATE {privatemsg} SET author_del = 1 WHERE id = %d', $id);
+    if ($message->system_msg) {
+      db_query('DELETE FROM {privatemsg} WHERE id = %d', $message->id);
     }
-    if ($message->recipient == $user->uid) {
-      db_query('UPDATE {privatemsg} SET recipient_del = 1 WHERE id = %d', $id);
+    else {
+      if ($message->author == $user->uid) {
+        db_query('UPDATE {privatemsg} SET author_del = 1 WHERE id = %d', $id);
+      }
+      if ($message->recipient == $user->uid) {
+        db_query('UPDATE {privatemsg} SET recipient_del = 1 WHERE id = %d', $id);
+      }
     }
     return $message->folder;
   }
@@ -663,6 +679,37 @@
 }
 
 /**
+ Returns content to view a system message
+ 
+ @param message
+**/
+function theme_privatemsg_system_message_view($message) {
+  global $user;
+
+  if ($message) {
+    $body = '
+      <p><strong>'.t('Subject').':</strong> '.check_plain($message->subject) .'<br />
+      <strong>'.t('Date').':</strong> '. format_date($message->timestamp) .'</p>
+       <div class="privatemsgbody">
+      '. check_markup($message->message, $message->format, FALSE).
+      '</div>';
+    $links = array();
+    if (($message->recipient == $user->uid) || (variable_get("privatemsg_sent_status", 1))) {
+      $links[] = l(t('Delete this message'), "privatemsg/delete/$message->id", array('onClick' => "return confirm('".t('Are you sure to delete this message?')."')"));
+    }
+
+    $links[] = l(t('List messages'), 'privatemsg');
+    $body .= '<div class="links">'. theme('links', $links) .'</div>';
+  } 
+  else {
+    drupal_set_message(t('Error: you can\'t read this message'), 'error');
+    $body = '';
+  }
+
+  return $body;
+}
+
+/**
  Returns content to view a list of private messages
 
  @param current_folder
@@ -707,10 +754,19 @@
         '#type' => 'value',
         '#value' => format_date($message->timestamp, 'small')
         );
-    $form['messages'][$message->id]['user'] = array(
-        '#type' => 'value',
-        '#value' => theme('username', $message)
-        );
+    if ($message->system_msg) {
+      $form['messages'][$message->id]['#attributes'] = array('class' => 'privatemsg-system-msg');
+      $form['messages'][$message->id]['user'] = array(
+          '#type' => 'value',
+          '#value' => t('[System]') 
+          );
+    }
+    else {
+      $form['messages'][$message->id]['user'] = array(
+          '#type' => 'value',
+          '#value' => theme('username', $message) 
+          );
+    }
     $form['messages'][$message->id]['subject'] = array(
         '#type' => 'value',
         '#value' => l($message->subject, 'privatemsg/view/'. $message->id) . ($new ? (' '. theme('mark')) : '')
Only in privatemsg/: privatemsg.module[1].bak
