--- privatemsg_5x/privatemsg.module	2008-01-21 22:49:22.000000000 -0800
+++ privatemsg_6x/privatemsg.module	2008-02-20 12:44:46.000000000 -0800
@@ -1,5 +1,5 @@
 <?php
-// $Id: privatemsg.module,v 1.70.2.30.2.88 2008/01/22 06:49:22 karthik Exp $
+// $Id$
 
 define('PRIVATEMSG_FOLDER_RECYCLE_BIN', -1);
 define('PRIVATEMSG_FOLDER_INBOX', 0);
@@ -8,10 +8,10 @@ define('PRIVATEMSG_FOLDER_SENT', 1);
 /**
  * Implementation of hook_help().
  */
-function privatemsg_help($section) {
-  switch ($section) {
+function privatemsg_help($path, $arg) {
+  switch ($path) {
     case 'admin/help#privatemsg':
-      $output = '<p>'. t('The private messaging module allows users to send messages to each other without having to share email addresses. An inbox link will appear in the navigation menu. The "write to author" links are included in posts, allowing users to write a private message instead of commenting openly. Allowing users to communicate directly is an important part of building the strength of the community.') .'</p>';
+      $output = '<p>'. t('The private messaging module allows users to send messages to each other without having to share email addresses. An inbox link will appear in the navigation menu. The "write to author" links are included in posts, allowing users to write a private message instead of commenting openly. Allowing users to communicate directly is an important  part of building the strength of the community.') .'</p>';
       $output .= '<p>'. t('The contacts list contains only users that you have previously messaged. To contact users not in your list, you need to know their local user name. Administrators can set messaging options such as frequency of emails, message status display, and number of messages to display per page. They can also configure \'Write to Author\' options.') .'</p>';
       $output .= t('<p>You can</p>
 <ul>
@@ -27,231 +27,202 @@ function privatemsg_help($section) {
 /**
  * Implementation of hook_menu().
  */
-function privatemsg_menu($may_cache) {
+function privatemsg_menu() {
   global $user;
 
   $items = array();
-  $access = user_access('access private messages');
-  if ($may_cache) {
-    $items[] = array(
-      'path' => 'admin/settings/privatemsg',
-      'title' => t('Privatemsg'),
-      'description' => t('Configure Privatemsg settings.'),
-      'callback' => 'drupal_get_form',
-      'callback arguments' => array('privatemsg_configure'),
-      'access' => user_access('administer private messages'),
-    );
-    $items[] = array(
-      'path' => 'privatemsg',
-      'title' => t('Private messages'),
-      'callback' => 'privatemsg_list',
-      'access' => !$user->uid || $access,
-      'type' => MENU_SUGGESTED_ITEM,
-    );
-    $items[] = array(
-      'path' => 'privatemsg/list',
-      'title' => t('List'),
-      'callback' => 'privatemsg_list',
-      'callback arguments' => array(NULL),
-      'access' => !$user->uid || $access,
-      'type' => MENU_DEFAULT_LOCAL_TASK,
-      'weight' => -10,
-    );
-    $items[] = array(
-      'path' => 'privatemsg/new',
-      'title' => t('Compose'),
-      'callback' => 'drupal_get_form',
-      'callback arguments' => array('privatemsg_new_form'),
-      'access' => $access,
-      'type' => MENU_LOCAL_TASK,
-      'weight' => -5,
-    );
-    $items[] = array(
-      'path' => 'privatemsg/contacts',
-      'title' => t('Contacts'),
-      'callback' => 'drupal_get_form',
-      'callback arguments' => array('privatemsg_contacts_form'),
-      'access' => $access,
-      'type' => MENU_LOCAL_TASK,
-      'weight' => 0,
-    );
-    $items[] = array(
-      'path' => 'privatemsg/folders',
-      'title' => t('Manage folders'),
-      'callback' => 'privatemsg_manage_folders',
-      'access' => user_access('create new folder') && $user->uid,
-      'type' => MENU_LOCAL_TASK,
-      'weight' => 5,
-    );
-    $items[] = array(
-      'path' => 'privatemsg/folders/movetonew',
-      'title' => t('Move to new folder'),
-      'callback' => 'drupal_get_form',
-      'callback arguments' => array('privatemsg_new_folder_form'),
-      'access' => user_access('create new folder') && $user->uid,
-      'type' => MENU_CALLBACK,
-    );
-    $items[] = array(
-      'path' => 'privatemsg/autocomplete',
-      'title' => t('Privatemsg autocomplete'),
-      'callback' => 'privatemsg_autocomplete',
-      'access' => $access,
-      'type' => MENU_CALLBACK,
-    );
-    $items[] = array(
-      'path' => 'privatemsg/delete',
-      'callback' => 'privatemsg_delete',
-      'access' => $access && $user->uid, // No guest access
-      'type' => MENU_CALLBACK
-    );
-  }
-  else {
-    if (!isset($user->privatemsg_allow)) {
-      _privatemsg_user_add_defaults($user);
-    }
-    if (arg(0) == 'privatemsg' && arg(1) == 'view' && intval(arg(2)) > 0) {
-      $items[] = array(
-        'path' => 'privatemsg/view/'. arg(2),
-        'title' => t('Read message'),
-        'callback' => 'privatemsg_view',
-        'callback arguments' => array(intval(arg(2)), FALSE),
-        'access' => $access && $user->uid, // Check access/redirect in callback
-        'type' => MENU_CALLBACK,
-        'weight' => -10,
-      );
-      $items[] = array(
-        'path' => 'privatemsg/view/'. arg(2) .'/read',
-        'title' => t('Read message'),
-        'access' => $access && $user->uid, // Check access/redirect in callback
-        'type' => MENU_DEFAULT_LOCAL_TASK,
-        'weight' => -10,
-      );
-      $items[] = array(
-        'path' => 'privatemsg/view/'. arg(2) .'/back',
-        'title' => t('Back to list'),
-        'callback' => 'privatemsg_back_to_list',
-        'callback arguments' => array(intval(arg(2))),
-        'access' => TRUE, // Check access/redirect in callback
-        'type' => MENU_LOCAL_TASK,
-        'weight' => 0,
-      );
-    }
-
-    if (arg(0) == 'privatemsg' && arg(1) == 'reply' && intval(arg(2)) > 0) {
-      $items[] = array(
-        'path' => 'privatemsg/reply/'. arg(2),
-        'title' => t('Write a reply'),
-        'callback' => 'drupal_get_form',
-        'callback arguments' => array('privatemsg_new_form'),
-        'access' => $access,
-        'type' => MENU_CALLBACK,
-      );
-    }
-
-    if (arg(0) == 'privatemsg' && arg(1) == 'new' && intval(arg(2)) > 0) {
-      $items[] = array(
-        'path' => 'privatemsg/new/'. arg(2),
-        'title' => t('Write a new message'),
-        'callback' => 'drupal_get_form',
-        'callback arguments' => array('privatemsg_new_form'),
-        'access' => $access,
-        'type' => MENU_CALLBACK,
-      );
-    }
-    if ($user-> uid != arg(2) && arg(0) == 'privatemsg' && arg(1) == 'block' && ($account = user_load(array('uid' => arg(2))))) {
-      $blocked = privatemsg_user_blocked($account->uid);
-      $title_args = array('@user' => $account->name);
-      $items[] = array(
-        'path' => 'privatemsg/block/'. arg(2),
-        'title' => $blocked ? t('Unblock @user', $title_args) : t('Block @user', $title_args),
-        'callback' => 'drupal_get_form',
-        'callback arguments' => array($blocked ? 'privatemsg_unblock_user_form' : 'privatemsg_block_user_form', $account),
-        'type' => MENU_CALLBACK,
-      );
-    }
-
-    $new = _privatemsg_get_new_messages();
-    $items[] = array(
-      'path' => 'privatemsg/inbox',
-      'title' => variable_get('privatemsg_menu_link', t('My inbox')) . ($new ? ' ('. $new .')' : ''),
-      'callback' => 'drupal_goto',
-      'callback arguments' => array('privatemsg'),
-      'type' => $user->uid && $user->privatemsg_allow ? MENU_DYNAMIC_ITEM : MENU_CALLBACK,
-    );
-
-    if ($new && strncmp($_GET['q'], 'privatemsg', 10) && $user->privatemsg_setmessage_notify && user_access('access private messages')) {
-      $m = drupal_set_message();
-      if (empty($m)) {
-        drupal_set_message(strtr(format_plural($new, 'You have a new <a href="!url">private message</a>.', 'You have @count new <a href="!url">private messages</a>.'), array('!url' => url('privatemsg'))));
-      }
-    }
-
-    if (arg(0) == 'privatemsg' && arg(1) == 'folders' && intval(arg(2)) > 1) {
-      $modify_folder = privatemsg_folder_access($user->uid, arg(2));
-      if (!$modify_folder) {
-        drupal_goto('privatemsg/folders');
-      }
-
-      $items[] = array(
-        'path' => 'privatemsg/folders/'. arg(2) .'/rename',
-        'title' => t('Rename folder'),
-        'callback' => 'drupal_get_form',
-        'callback arguments' => array('privatemsg_rename_folder_form', arg(2)),
-        'access' => $access,
-        'type' => MENU_CALLBACK,
-      );
-      $items[] = array(
-        'path' => 'privatemsg/folders/'. arg(2) .'/empty',
-        'title' => t('Empty folder?'),
-        'callback' => 'drupal_get_form',
-        'callback arguments' => array('privatemsg_empty_folder_form', arg(2)),
-        'access' => $access,
-        'type' => MENU_CALLBACK,
-      );
-      $items[] = array(
-        'path' => 'privatemsg/folders/'. arg(2) .'/delete',
-        'title' => t('Delete folder?'),
-        'callback' => 'drupal_get_form',
-        'callback arguments' => array('privatemsg_delete_folder_form', arg(2)),
-        'access' => $access,
-        'type' => MENU_CALLBACK,
-      );
-    }
-    if (is_numeric(arg(1)) && (arg(0) == 'privatemsg' || arg(0) == 'user') && ($user->uid == arg(1) || user_access('administer private messages'))) {
-      if (arg(0) == 'user' && arg(2) == 'privatemsg') {
-        $account = $user->uid == arg(1) ? $user : user_load(array('uid' => arg(1)));
-        $items[] = array(
-          'path' => 'user/'. arg(1) .'/privatemsg',
-          'title' => t('Privatemsg'),
-          'callback' => 'privatemsg_list',
-          'callback arguments' => array(arg(1)),
-          'access' => $account->privatemsg_allow,
-          'type' => MENU_LOCAL_TASK,
-        );
-      }
-      if (arg(0) == 'privatemsg') {
-        if ($user->uid == arg(1)) {
-          $account = $user;
-          $title = t('Private messages');
-        }
-        else {
-          $account = user_load(array('uid' => arg(1)));
-          $title = t('Private messages for @name', array('@name' => $account->name));
-        }
-
-        $items[] = array(
-          'path' => 'privatemsg/'. arg(1),
-          'title' => $title,
-          'callback' => 'privatemsg_list',
-          'callback arguments' => array(arg(1)),
-          'access' => $account->privatemsg_allow,
-          'type' => MENU_CALLBACK,
-        );
-      }
-    }
 
-    drupal_add_css('./'. drupal_get_path('module', 'privatemsg') .'/privatemsg.css');
-  }
+  $items['admin/settings/privatemsg'] = array(
+    'title' => 'Privatemsg',
+    'description' => 'Configure Privatemsg settings.',
+    'page callback' => 'drupal_get_form',
+    'page arguments' => array('privatemsg_configure'),
+    'access arguments' => array('administer private messages'),
+  );
+  $items['privatemsg'] = array(
+    'title' => privatemsg_get_inbox_title(),
+    'title callback' => 'privatemsg_get_inbox_title',
+    'page callback' => 'privatemsg_list',
+    'page arguments' => array(NULL),
+    'access callback' => 'privatemsg_special_access1',
+    'type' => MENU_SUGGESTED_ITEM,
+  );
+  $items['privatemsg/list'] = array(
+    'title' => privatemsg_get_inbox_title(),
+    'page callback' => 'privatemsg_list',
+    'page arguments' => array(NULL),
+    'access callback' => 'privatemsg_special_access1',
+    'type' => MENU_DEFAULT_LOCAL_TASK,
+    'weight' => -10,
+  );
+  $items['privatemsg/new'] = array(
+    'title' => 'Compose',
+    'page callback' => 'drupal_get_form',
+    'page arguments' => array('privatemsg_new_form'),
+    'access arguments' => array('administer private messages'),
+    'type' => MENU_LOCAL_TASK,
+    'weight' => -5,
+  );
+  $items['privatemsg/contacts'] = array(
+    'title' => 'Contacts',
+    'page callback' => 'drupal_get_form',
+    'page arguments' => array('privatemsg_contacts_form'),
+    'access arguments' => array('administer private messages'),
+    'type' => MENU_LOCAL_TASK,
+    'weight' => 0,
+  );
+  $items['privatemsg/folders'] = array(
+    'title' => 'Manage folders',
+    'page callback' => 'privatemsg_manage_folders',
+    'access callback' => 'privatemsg_special_access3',
+    'type' => MENU_LOCAL_TASK,
+    'weight' => 5,
+  );
+  $items['privatemsg/folders/movetonew'] = array(
+    'title' => 'Move to new folder',
+    'page callback' => 'drupal_get_form',
+    'page arguments' => array('privatemsg_new_folder_form'),
+    'access callback' => 'privatemsg_special_access3',
+    'type' => MENU_CALLBACK,
+  );
+  $items['privatemsg/autocomplete'] = array(
+    'title' => 'Privatemsg autocomplete',
+    'page callback' => 'privatemsg_autocomplete',
+    'access arguments' => array('administer private messages'),
+    'type' => MENU_CALLBACK,
+  );
+  $items['privatemsg/delete'] = array(
+    'page callback' => 'privatemsg_delete',
+    'access callback' => 'privatemsg_special_access2',
+    'type' => MENU_CALLBACK,
+  );
+
+
+  $items['privatemsg/view/%privatemsg'] = array(
+    'title' => 'Read message',
+    'page callback' => 'privatemsg_view',
+    'page arguments' => array(2, FALSE),
+    'access callback' => 'privatemsg_special_access2',
+    'type' => MENU_CALLBACK,
+    'weight' => -10,
+  );
+  $items['privatemsg/view/%privatemsg/read'] = array(
+    'title' => 'Read message',
+    'access callback' => 'privatemsg_special_access2',
+    'type' => MENU_DEFAULT_LOCAL_TASK,
+    'weight' => -10,
+  );
+  $items['privatemsg/view/%/back'] = array(
+    'title' => 'Back to list',
+    'page callback' => 'privatemsg_back_to_list',
+    'page arguments' => array(2),
+    'access callback' => 'privatemsg_return_true',
+    'type' => MENU_LOCAL_TASK,
+    'weight' => 0,
+  );
+
+  $items['privatemsg/reply/%'] = array(
+    'title' => 'Write a reply',
+    'page callback' => 'drupal_get_form',
+    'page arguments' => array('privatemsg_new_form', 2),
+    'access arguments' => array('administer private messages'),
+    'type' => MENU_CALLBACK,
+  );
+  $items['privatemsg/reply/%/write'] = array(
+    'title' => 'Write a reply',
+    'access arguments' => array('administer private messages'),
+    'type' => MENU_DEFAULT_LOCAL_TASK,
+    'weight' => -10,
+  );
+  $items['privatemsg/reply/%/cancel'] = array(
+    'title' => 'Cancel reply',
+    'page callback' => 'privatemsg_cancel_reply',
+    'page arguments' => array(2),
+    'access callback' => 'privatemsg_special_access2',
+    'type' => MENU_LOCAL_TASK,
+    'weight' => 0,
+  );
+
+  $items['privatemsg/new/%'] = array(
+    'title' => 'Write a new message',
+    'page callback' => 'drupal_get_form',
+    'page arguments' => array('privatemsg_new_form'),
+    'access arguments' => array('administer private messages'),
+    'type' => MENU_CALLBACK,
+  );
+  $items['privatemsg/new/%/write'] = array(
+    'title' => 'Write a new message',
+    'access arguments' => array('administer private messages'),
+    'type' => MENU_DEFAULT_LOCAL_TASK,
+    'weight' => -10,
+  );
+  $items['privatemsg/new/%/cancel'] = array(
+    'title' => 'Cancel message',
+    'page callback' => 'drupal_goto',
+    'page arguments' => array('privatemsg'),
+    'access callback' => 'privatemsg_special_access2',
+    'type' => MENU_LOCAL_TASK,
+    'weight' => 0,
+  );
+
+  $items['privatemsg/block/%user'] = array(
+    'title callback' => 'privatemsg_get_block_title',
+    'title arguments' => array(2),
+    'page callback' => 'privatemsg_get_block_form',
+    'page arguments' => array(2),
+    'type' => MENU_CALLBACK,
+  );
+
+  $items['privatemsg/inbox'] = array(
+    'title callback' => 'privatemsg_get_inbox_title',
+    'title arguments' => array(),
+    'page callback' => 'drupal_goto',
+    'page arguments' => array('privatemsg'),
+    'type' => MENU_CALLBACK,
+  );
+
+  $items['privatemsg/folders/%/rename'] = array(
+    'title' => 'Rename folder',
+    'page callback' => 'drupal_get_form',
+    'page arguments' => array('privatemsg_rename_folder_form', 2),
+    'access callback' => 'privatemsg_administer_folder_permission',
+    'access arguments' => array(2),
+    'type' => MENU_CALLBACK,
+  );
+  $items['privatemsg/folders/%/empty'] = array(
+    'title' => 'Empty folder?',
+    'page callback' => 'drupal_get_form',
+    'page arguments' => array('privatemsg_empty_folder_form', 2),
+    'access callback' => 'privatemsg_administer_folder_permission',
+    'access arguments' => array(2),
+    'type' => MENU_CALLBACK,
+  );
+  $items['privatemsg/folders/%/delete'] = array(
+    'title' => 'Delete folder?',
+    'page callback' => 'drupal_get_form',
+    'page arguments' => array('privatemsg_delete_folder_form', 2),
+    'access callback' => 'privatemsg_administer_folder_permission',
+    'access arguments' => array(2),
+    'type' => MENU_CALLBACK,
+  );
+
+  $items['user/%user/privatemsg'] = array(
+    'title' => 'Privatemsg',
+    'page callback' => 'privatemsg_list',
+    'page arguments' => array(1),
+    'access callback' => 'privatemsg_special_access6',
+    'access arguments' => array(1),
+    'type' => MENU_LOCAL_TASK,
+  );
+  $items['privatemsg/%user'] = array(
+    'title callback' => 'privatemsg_get_title',
+    'title arguments' => array(1),
+    'page callback' => 'privatemsg_list',
+    'page arguments' => array(1),
+    'access callback' => 'privatemsg_special_access6',
+    'access arguments' => array(1),
+    'type' => MENU_CALLBACK,
+  );
 
   return $items;
 }
@@ -285,7 +256,11 @@ function privatemsg_link($type, $node = 
   if ($type == 'comment' && $node->nid) {
     $node = node_load($node->nid);
   }
-  if (user_access('access private messages') && in_array($teaser ? 'teaser' : $type, variable_get('privatemsg_link_'. $node->type, array())) && $uid != $user->uid && $user->privatemsg_allow) {
+  if (user_access('access private messages')
+      && in_array($teaser ? 'teaser' : $type, variable_get('privatemsg_link_'. $node->type, array()))
+      && (!property_exists($user, 'uid')
+          || !property_exists($user, 'privatemsg_allow')
+          || ($uid != $user->uid && $user->privatemsg_allow))) {
     if (!isset($access[$uid])) {
       $author = user_load(array('uid' => $uid));
       $access[$uid] = user_access('access private messages', $author) && $author->uid && $author->privatemsg_allow;
@@ -304,8 +279,6 @@ function privatemsg_link($type, $node = 
  * Implementation of hook_user().
  */
 function privatemsg_user($type, &$edit, &$account, $category = NULL) {
-  global $user;
-
   switch ($type) {
     case 'load':
       _privatemsg_user_add_defaults($account);
@@ -313,30 +286,35 @@ function privatemsg_user($type, &$edit, 
     case 'view':
       if (user_access('access private messages')) {
         if (privatemsg_message_allowed($account->uid)) {
-          $return[t('Private messages')][] = array(
-            'value' => l(t('Write private message'), 'privatemsg/new/'. $account->uid, array(
-             'title' => t('Send private message to @name', array('@name' => $account->name)))),
-            'class' => 'send-message');
+          $account->content[t('Private messages')][] = array(
+            '#type' => 'user_profile_item',
+            '#title' => t('Send private message to @name', array('@name' => $account->name)),
+            '#value' => l(t('Write private message'), 'privatemsg/new/'. $account->uid, array('attributes' =>
+              array('title' => t('Send private message to @name', array('@name' => $account->name))))),
+            '#attributes' => array('class' => 'send-message'),
+          );
         }
-        if ($account->uid != $user->uid) {
-          if (!privatemsg_user_blocked($account->uid) ) {
-            $return[t('Private messages')][] = array(
-              'value' => l(t('Block messages'), 'privatemsg/block/'. $account->uid, array(
-              'title' => t('Block private messages from @name', array('@name' => $account->name)))),
-              'class' => 'block-message'
-            );
-          }
-          else {
-            $return[t('Private messages')][] = array(
-              'value' => l(t('Unblock messages'), 'privatemsg/block/'. $account->uid, array(
-              'title' => t('Unblock private messages from @name', array('@name' => $account->name)))),
-              'class' => 'unblock-message');
-          }
+        if (!privatemsg_user_blocked($account->uid)) {
+          $account->content[t('Private messages')][] = array(
+            '#type' => 'user_profile_item',
+            '#title' => t('Block private messages from @name', array('@name' => $account->name)),
+            '#value' => l(t('Block messages'), 'privatemsg/block/'. $account->uid, array('attributes' =>
+              array('title' => t('Block private messages from @name', array('@name' => $account->name))))),
+            '#attributes' => array('class' => 'block-message'),
+          );
         }
-
-        return $return;
+        else  {
+          $account->content[t('Private messages')][] = array(
+            '#type' => 'user_profile_item',
+            '#title' => t('Unblock private messages from @name', array('@name' => $account->name)),
+            '#value' => l(t('Unblock messages'), 'privatemsg/block/'. $account->uid, array('attributes' =>
+              array('title' => t('Unblock private messages from @name', array('@name' => $account->name))))),
+            '#attributes' => array('class' => 'unblock-message'),
+          );
+        }
+        return;
       }
-      elseif ($user->uid) {
+      elseif ($GLOBALS['user']->uid) {
         return;
       }
       elseif ($account->privatemsg_allow) {
@@ -399,35 +377,38 @@ function privatemsg_user($type, &$edit, 
   }
 }
 
+function _privatemsg_user_add_defaults(&$account) {
+  if (!isset($account->privatemsg_allow)) {
+    $account->privatemsg_allow = variable_get('privatemsg_default_allow', 1);
+    $account->privatemsg_setmessage_notify = variable_get('privatemsg_default_setmessage_notify', 1);
+  }
+}
+
 /**
  * Implementation of hook_form_alter().
  */
-function privatemsg_form_alter($form_id, &$form) {
-  switch ($form_id) {
-    case 'node_type_form':
-      $link = variable_get('privatemsg_link_'. $form['#node_type']->type, array());
-      $form['workflow']['privatemsg_link'] = array(
-        '#type' => 'checkboxes',
-        '#title' => t('Private message "Write to author" links'),
-        '#weight' => 30,
-        'node' => array(
-          '#type' => 'checkbox',
-          '#title' => t('Link on node'),
-          '#default_value' => in_array('node', $link),
-        ),
-        'teaser' => array(
-          '#type' => 'checkbox',
-          '#title' => t('Link on teaser'),
-          '#default_value' => in_array('teaser', $link),
-        ),
-        'comment' => array(
-          '#type' => module_exists('comment') ? 'checkbox' : 'hidden',
-          '#title' => t('Link on comments'),
-          '#default_value' => in_array('comment', $link),
-        ),
-      );
-      break;
-  }
+function privatemsg_form_node_type_form_alter(&$form, $form_state, $form_id) {
+  $link = variable_get('privatemsg_link_'. $form['#node_type']->type, array());
+  $form['workflow']['privatemsg_link'] = array(
+    '#type' => 'checkboxes',
+    '#title' => t('Private message "Write to author" links'),
+    '#weight' => 30,
+    'node' => array(
+      '#type' => 'checkbox',
+      '#title' => t('Link on node'),
+      '#default_value' => in_array('node', $link),
+    ),
+    'teaser' => array(
+      '#type' => 'checkbox',
+      '#title' => t('Link on teaser'),
+      '#default_value' => in_array('teaser', $link),
+    ),
+    'comment' => array(
+      '#type' => module_exists('comment') ? 'checkbox' : 'hidden',
+      '#title' => t('Link on comments'),
+      '#default_value' => in_array('comment', $link),
+    ),
+  );
 }
 
 /**
@@ -436,6 +417,7 @@ function privatemsg_form_alter($form_id,
 function privatemsg_block($op = 'list', $delta = 0, $edit = array()) {
   if ($op == 'list') {
     $blocks[0]['info'] = t('Private messages');
+    $blocks[0]['cache'] = BLOCK_NO_CACHE;
     return $blocks;
   }
   else if ($op == 'view') {
@@ -447,7 +429,7 @@ function privatemsg_block($op = 'list', 
 }
 
 /**
- * Implementation of hook privatemsg_alter().
+ * Implementation of hook privatemsg_alter
  */
 function privatemsg_privatemsg_alter($sender = NULL, $recipient = NULL, $subject = NULL, $body = NULL, $format = NULL, $thread = NULL, $type = NULL) {
   $key = _privatemsg_get_type_key($type);
@@ -459,11 +441,18 @@ function privatemsg_privatemsg_alter($se
   return TRUE;
 }
 
-function privatemsg_message_allowed($recipient, $author = NULL) {
-  global $user;
+/**
+ * Implementation of hook_simpletest
+ */
+function privatemsg_simpletest() {
+  $dir = drupal_get_path('module', 'privatemsg') .'/tests';
+  $tests = file_scan_directory($dir, '\.test$');
+  return array_keys($tests);
+}
 
-  $author = $author ? $author : $user->uid;
-  $account = user_load(array('uid' => $recipient));
+function privatemsg_message_allowed($recipient, $author = NULL) {
+  $author = $author ? $author : $GLOBALS['user']->uid;
+  $user = user_load(array('uid' => $recipient));
   # user can not message themselves
   if ($recipient == $author) {
     return FALSE;
@@ -471,7 +460,7 @@ function privatemsg_message_allowed($rec
   if (privatemsg_user_blocked($author, $recipient)) {
     return FALSE;
   }
-  if (isset($account->privatemsg_allow) && !$account->privatemsg_allow) {
+  if (isset($user->privatemsg_allow) && !$user->privatemsg_allow) {
     return FALSE;
   }
   return TRUE;
@@ -479,7 +468,7 @@ function privatemsg_message_allowed($rec
 
 function privatemsg_user_blocked($author, $recipient = NULL) {
   global $user;
-  $recipient = ($recipient) ? $recipient : $user->uid;
+  $recipient = $recipient ? $recipient : $user->uid;
   return db_result(db_query("SELECT COUNT(*) FROM {privatemsg_block_user} WHERE author = %d AND recipient = %d", $author, $recipient));
 }
 
@@ -488,7 +477,9 @@ function privatemsg_block_user($author, 
   global $user;
   $recipient = ($recipient) ? $recipient : $user->uid;
   if (!privatemsg_user_blocked($author, $recipient)) {
-    db_query("INSERT INTO {privatemsg_block_user} (author, recipient) VALUES (%d, %d)", $author, $recipient);
+    $data = array('author' => $author, 'recipient' => $recipient);
+    drupal_write_record('privatemsg_block_user', $data);
+    //db_query("INSERT INTO {privatemsg_block_user} (author, recipient) VALUES (%d, %d)", $author, $recipient);
     drupal_set_message(t('User has been blocked'));
   }
 }
@@ -508,9 +499,9 @@ function privatemsg_block_user_form($acc
   return confirm_form($form, t('Are you sure you want to block !user from sending you any more messages?', array('!user' => $account->name)), 'user/'. $account->uid, '');
 }
 
-function privatemsg_block_user_form_submit($form_id, $form_values) {
-  privatemsg_block_user($form_values['uid']);
-  return 'user/'. $form_values['uid'];
+function privatemsg_block_user_form_submit($form, &$form_state) {
+  privatemsg_block_user($form_state['values']['uid']);
+  $form_state['redirect'] = 'user/'. $form_state['values']['uid'];
 }
 
 function privatemsg_unblock_user_form($account) {
@@ -519,9 +510,9 @@ function privatemsg_unblock_user_form($a
   return confirm_form($form, t('Are you sure you want to allow !user to send you messages?', array('!user' => $account->name)), 'user/'. $account->uid, '');
 }
 
-function privatemsg_unblock_user_form_submit($form_id, $form_values) {
-  privatemsg_unblock_user($form_values['uid']);
-  return 'user/'. $form_values['uid'];
+function privatemsg_unblock_user_form_submit($form, &$form_state) {
+  privatemsg_unblock_user($form_state['values']['uid']);
+  $form_state['redirect'] = 'user/'. $form_state['values']['uid'];
 }
 
 function _privatemsg_block_inbox() {
@@ -654,11 +645,11 @@ function privatemsg_configure() {
   return system_settings_form($form);
 }
 
-function privatemsg_configure_validate($form_id, $form_values, $form) {
-  if (!empty($form_values['privatemsg_welcome_sender'])) {
-    $sender = user_load(array('name' => $form_values['privatemsg_welcome_sender']));
+function privatemsg_configure_validate($form, &$form_state) {
+  if (!empty($form_state['values']['privatemsg_welcome_sender'])) {
+    $sender = user_load(array('name' => $form_state['values']['privatemsg_welcome_sender']));
     if ($sender->uid) {
-      form_set_value($form['welcome']['privatemsg_welcome_sender'], $sender->uid);
+      $form_state['privatemsg_welcome_sender'] = $sender->uid;
     }
     else {
       form_set_error('privatemsg_welcome_sender', t('The <em>Sender</em> does not exist.'));
@@ -666,31 +657,25 @@ function privatemsg_configure_validate($
   }
 }
 
-function privatemsg_list($uid = NULL) {
-  global $user;
-
-  if (!empty($uid) && is_numeric($uid) && user_access('administer private messages')) {
-    $account = user_load(array('uid' => $uid));
-  }
-  else {
-    $account = $user;
+function privatemsg_list($account = NULL) {
+  if ($account == null) {
+    $account = $GLOBALS['user'];
   }
   // Notification emails link here, but the user may not be logged in yet.
   if ($account && !$account->uid) {
     drupal_goto('user/login', 'destination=privatemsg');
   }
-  // wha? Disallow users who have set their pref to "don't contact me" from
-  // seeing their inbox? Surely not: privatemsg_allow only determines whether a
-  // user receives direct private messages, there are still other types of
-  // messages that arrive in a user's inbox.
+  // wha? Disallow users who have set their pref to "don't contact me" from seeing their inbox?
+  // Surely not: privatemsg_allow only determines whether a user receives direct private messages,
+  // there are still other types of message that arrive in a user's inbox
   if (!user_access('access private messages')) {// || !$account->privatemsg_allow) {
     return drupal_access_denied();
   }
 
   $args = array($account->uid);
-  if (isset($_SESSION['privatemsg_type'])) {
+  if (isset($form_state['storage']['privatemsg_type'])) {
     $type = " AND type = '%s'";
-    $args[] = $_SESSION['privatemsg_type'];
+    $args[] = $form_state['storage']['privatemsg_type'];
   }
   else {
     $type = '';
@@ -708,7 +693,7 @@ function privatemsg_list($uid = NULL) {
     $join_field = 'author';
   }
   $sql1 = "SELECT id, subject, p.timestamp, u.uid, u.name, newmsg, type FROM {privatemsg} p INNER JOIN {users} u ON ";
-  $sql = $sql1 ."p.$join_field = u.uid WHERE p.$where_field = %d $type AND p.{$where_field}_del = %d";
+  $sql = $sql1 . "p.$join_field = u.uid WHERE p.$where_field = %d $type AND p.{$where_field}_del = %d";
   if ($current_folder == PRIVATEMSG_FOLDER_RECYCLE_BIN) {
     $args[] = 1;
     $sql .= " UNION $sql1 p.recipient = u.uid WHERE p.author = %d $type AND p.author_del = %d";
@@ -725,7 +710,7 @@ function privatemsg_list($uid = NULL) {
 
   $header = _privatemsg_list_header($current_folder);
   $ts = tablesort_init($header);
-  $_SESSION['privatemsg_list_sql'] = array(
+  $form_state['storage']['privatemsg_list_sql'] = array(
     'sql' => $sql,
     'args' => $args,
     'field' => db_escape_string($ts['sql']),
@@ -733,9 +718,9 @@ function privatemsg_list($uid = NULL) {
   );
   $result = pager_query($sql . tablesort_sql($header), variable_get('privatemsg_per_page', 10), 0, $count_query, $args);
   $messages = array();
-  while ($message = db_fetch_object($result)) {
+  while ($message = db_fetch_array($result)) {
     if ($current_folder == PRIVATEMSG_FOLDER_SENT) {
-      $message->newmsg = 0;
+      $message['newmsg'] = 0;
     }
     $messages[] = $message;
   }
@@ -757,7 +742,7 @@ function _privatemsg_folder_map($fid = N
   if (!isset($fid)) {
     return $map;
   }
-  return isset($map[$fid]) ? $map[$fid] : db_result(db_query('SELECT name FROM {privatemsg_folder} WHERE fid = %d AND uid = %d', $current_folder, $uid));
+  return isset($map[$fid]) ? $map[$fid] : db_result(db_query('SELECT name FROM {privatemsg_folder} WHERE fid = %d AND uid = %d', $fid, $uid));
 }
 
 function _privatemsg_list_header($current_folder) {
@@ -769,9 +754,7 @@ function _privatemsg_list_header($curren
   );
 }
 
-function privatemsg_cur_folder_form($folders, $current_folder) {
-  global $user;
-
+function privatemsg_cur_folder_form(&$form_state, $folders, $current_folder) {
   foreach ($folders as $folder) {
     $options[$folder['fid']] = $folder['name'];
   }
@@ -794,7 +777,7 @@ function privatemsg_cur_folder_form($fol
     '#attributes' => array('class' => 'js-hide'),
   );
   $actor = $current_folder == 1 ? 'author' : 'recipient';
-  $result = db_query("SELECT DISTINCT type FROM {privatemsg} WHERE folder = %d AND {$actor}_del = 0 AND {$actor} = %d", $current_folder, $user->uid);
+  $result = db_query("SELECT DISTINCT type FROM {privatemsg} WHERE folder = %d AND {$actor}_del = 0 AND {$actor} = %d", $current_folder, $GLOBALS['user']->uid);
   $types = array(
     '_all' => t('All'),
     '_read' => t('Read'),
@@ -805,8 +788,8 @@ function privatemsg_cur_folder_form($fol
     'all types' => t('All types'),
   );
   $filter_types = array('all types' => t('All types'));
-  while ($t = db_fetch_object($result)) {
-    $type = check_plain($t->type);
+  while ($t = db_fetch_array($result)) {
+    $type = check_plain($t['type']);
     $types[$type] = $type;
     $filter_types[$type] = $type;
   }
@@ -821,10 +804,10 @@ function privatemsg_cur_folder_form($fol
     '#type' => 'select',
     '#title' => t('Filter'),
     '#options' => $filter_types,
-    '#default_value' => isset($_SESSION['privatemsg_type']) ? $_SESSION['privatemsg_type'] : 'all types',
+    '#default_value' => isset($form_state['storage']['privatemsg_type']) ? $form_state['storage']['privatemsg_type'] : 'all types',
   );
-  if (isset($_SESSION['privatemsg_type'])) {
-    $form['header']['type']['#default_value'] = $_SESSION['privatemsg_type'];
+  if (isset($form_state['storage']['privatemsg_type'])) {
+    $form['header']['type']['#default_value'] = $form_state['storage']['privatemsg_type'];
   }
   $form['header']['type_submit'] = array(
     '#type' => 'submit',
@@ -832,35 +815,36 @@ function privatemsg_cur_folder_form($fol
     '#attributes' => array('class' => 'js-hide'),
   );
 
+
   return $form;
 }
 
-function privatemsg_cur_folder_form_submit($form_id, $form_values) {
-  switch ($form_values['op']) {
+function privatemsg_cur_folder_form_submit($form, &$form_state) {
+  switch ($form_state['clicked_button']['#value']) {
     case t('Go'):
       $redirect = 'privatemsg';
-      if ($form_values['folder_select']) {
+      if ($form_state['values']['folder_select']) {
         $redirect .= '/'. (is_numeric(arg(1)) ? arg(1) : 'list');
-        $redirect .= '/'. $form_values['folder_select'];
+        $redirect .= '/'. $form_state['values']['folder_select'];
       }
-      unset($_SESSION['privatemsg_type']);
-      return $redirect;
+      unset($form_state['storage']['privatemsg_type']);
+      $form_state['redirect'] = $redirect;
     case t('Filter'):
-      $type = $form_values['filter_type'];
+      $type = $form_state['values']['filter_type'];
       // all other '_' will be handled by JS.
       if ($type[0] != '_') {
         if ($type == 'all types') {
-          unset($_SESSION['privatemsg_type']);
+          unset($form_state['storage']['privatemsg_type']);
         }
         else {
-          $_SESSION['privatemsg_type'] = $form_values['filter_type'];
+          $form_state['storage']['privatemsg_type'] = $form_state['values']['filter_type'];
         }
       }
       break;
   }
 }
 
-function privatemsg_list_form($messages, $folders, $current_folder, $account) {
+function privatemsg_list_form(&$form_state, $messages, $folders, $current_folder, $account) {
   global $user;
 
   $form['account'] = array('#type' => 'value', '#value' => $account);
@@ -875,38 +859,39 @@ function privatemsg_list_form($messages,
   );
   foreach ($messages as $message) {
     if ($current_folder != 1) {
-      $new = $message->newmsg;
+      $new = $message['newmsg'];
       $new_text = theme('mark');
     }
     else {
-      $new = variable_get('privatemsg_sent_status', 1) ? $message->newmsg : 0;
+      $new = variable_get('privatemsg_sent_status', 1) ? $message['newmsg'] : 0;
       $new_text = ' <span class="marker">'. t('unread') .'</span>';
     }
 
-    $form['messages'][$message->id]['message'] = array(
+
+    $form['messages'][$message['id']]['message'] = array(
       '#type' => 'value',
       '#value' => $message,
     );
 
-    $form['messages'][$message->id]['#new'] = $new;
+    $form['messages'][$message['id']]['#new'] = $new;
 
-    $form['messages'][$message->id]['selected'] = array(
+    $form['messages'][$message['id']]['selected'] = array(
       '#type' => 'checkbox',
     );
-    $form['messages'][$message->id]['type'] = array(
-      '#value' => check_plain($message->type),
+    $form['messages'][$message['id']]['type'] = array(
+      '#value' => check_plain($message['type']),
     );
-    $form['messages'][$message->id]['user'] = array(
+    $form['messages'][$message['id']]['user'] = array(
       '#type' => 'value',
-      '#value' => theme('privatemsg_username', $message),
+      '#value' => theme('privatemsg_username', user_load($message['uid'])),
     );
-    $form['messages'][$message->id]['subject'] = array(
+    $form['messages'][$message['id']]['subject'] = array(
       '#type' => 'value',
-      '#value' => l($message->subject, 'privatemsg/view/'. $message->id, array(), NULL, 'message-'. $message->id) . ($new ? (' '. $new_text) : ''),
+      '#value' => l($message['subject'], 'privatemsg/view/'. $message['id'], array(), NULL, 'message-'. $message['id']) . ($new ? (' '. $new_text) : ''),
     );
-    $form['messages'][$message->id]['date'] = array(
+    $form['messages'][$message['id']]['date'] = array(
       '#type' => 'value',
-      '#value' => format_date($message->timestamp, 'small'),
+      '#value' => format_date($message['timestamp'], 'small'),
     );
   }
   $form['pager'] = array(
@@ -931,7 +916,7 @@ function privatemsg_list_form($messages,
         );
         $actions['undelete'] = array(
           '#type' => 'submit',
-          '#value' => t('Restore'),
+          '#value' => t('Move to inbox'),
         );
         $actions['empty'] = array(
           '#type' => 'submit',
@@ -955,6 +940,7 @@ function privatemsg_list_form($messages,
         );
     }
 
+
     if ($del == 1) {
       $form['selected']['actions'] = $actions;
     }
@@ -970,10 +956,9 @@ function privatemsg_list_form($messages,
         }
       }
       $extra_folders['new'] = t('New folder...');
-  
-      // Control to move messages to a new folder. Display only for inbox and
-      // custom folders.
-      if ((arg(1) == NULL || arg(1) == 'list') && count($extra_folders) > 0 && $current_folder != PRIVATEMSG_FOLDER_RECYCLE_BIN && $current_folder != PRIVATEMSG_FOLDER_SENT) {
+
+      // Control to move messages to a new folder.
+      if ((arg(1) == NULL || arg(1) == 'list' || arg(1) == $account->uid) && count($extra_folders) > 0 && $current_folder != 1) {
         $form['selected']['folder'] = array(
           '#prefix' => '<div class="pm-spacer">',
           '#type' => 'select',
@@ -986,7 +971,7 @@ function privatemsg_list_form($messages,
           '#suffix' => '</div>',
         );
       }
-    }
+	}
 
     if ($del == 2) {
       $form['selected']['actions'] = $actions;
@@ -999,44 +984,43 @@ function privatemsg_list_form($messages,
   );
 
   drupal_add_js(drupal_get_path('module', 'privatemsg') .'/privatemsg.js');
-  drupal_add_js(array('privatemsg' => $js), 'setting');
+  if (isset($js)) {
+    drupal_add_js(array('privatemsg' => $js), 'setting');
+  }
 
   return $form;
 }
 
-function privatemsg_list_form_submit($form_id, $form_values) {
-  global $user;
-
+function privatemsg_list_form_submit($form, &$form_state) {
   $selected = $placeholders = array();
-  foreach ($form_values['messages'] as $mid => $message) {
+  foreach ($form_state['values']['messages'] as $mid => $message) {
     if ($message['selected']) {
       $selected[$mid] = $message;
       $placeholders[] = '%d';
     }
   }
-  if (empty($selected) && ($form_values['op'] != t('Empty recycle bin'))) {
+if (empty($selected) && ($form_values['op'] != t('Empty recycle bin'))) {
     drupal_set_message(t('No messages selected.'), 'error');
     return;
   }
-  else {
-    $args = array_keys($selected);
-    $args[] = $form_values['account']->uid;
-    $where1 = 'WHERE id IN ('. implode(', ', $placeholders) .')  AND ';
-    $where = $where1 .'recipient = %d';
-    $new = 0;
+  else {  
+  $args = array_keys($selected);
+  $args[] = $form_state['values']['account']->uid;
+  $where1 = 'WHERE id IN ('. implode(', ', $placeholders) .')  AND ';
+  $where = $where1 .'recipient = %d';
+  $new = 0;
   }
-
-  switch ($form_values['op']) {
+  switch ($form_state['clicked_button']['#value']) {
     case t('Delete'):
       if ($_POST['js_bypass'] == 1) {
         foreach ($selected as $mid => $message) {
           _privatemsg_delete($mid);
         }
-        drupal_set_message(t('The selected messages have been deleted.'));
+        drupal_set_message(t('Messages deleted.'));
       }
       else {
-        $_SESSION['privatemsg'] = $form_values['messages'];
-        $_SESSION['fromfolder'] = intval(arg(2));
+        $form_state['storage']['privatemsg'] = $form_state['values']['messages'];
+        $form_state['storage']['fromfolder'] = intval(arg(2));
         drupal_goto('privatemsg/delete/multiple');
       }
       break;
@@ -1046,38 +1030,33 @@ function privatemsg_list_form_submit($fo
     case t('Mark as read'):
       array_unshift($args, $new);
       db_query('UPDATE {privatemsg} SET newmsg = %d '. $where, $args);
-
-      drupal_set_message(t('The selected messages have been updated.'));
       break;
     case t('Move to folder'):
-      $fid = $form_values['folder'];
+      $fid = $form_state['values']['folder'];
       if ($fid == 'new') {
-        $_SESSION['privatemsg'] = $form_values['messages'];
-        $_SESSION['fromfolder'] = intval(arg(2));
+        $form_state['storage']['privatemsg'] = $form_state['values']['messages'];
+        $form_state['storage']['fromfolder'] = intval(arg(2));
         drupal_goto('privatemsg/folders/movetonew');
       }
-      _privatemsg_move_folder($where, $args, $fid, $form_values['extra_folders']);
+      _privatemsg_move_folder($where, $args, $fid, $form_state['values']['extra_folders']);
       break;
     case t('Delete permanently'):
       foreach (array_keys($selected) as $mid) {
         _privatemsg_delete($mid, 2);
       }
-      drupal_set_message(t('The selected messages have been deleted permanently.'));
+      drupal_set_message(t('Your messages have been deleted permanently'));
       break;
-    case t('Restore'):
+    case t('Move to inbox'):
       db_query('UPDATE {privatemsg} SET recipient_del = 0 '. $where, $args);
       $where = $where1 .'author = %d';
       db_query('UPDATE {privatemsg} SET author_del = 0 '. $where, $args);
-
-      drupal_set_message(t('The selected messages have been restored.'));
-
       break;
     case t('Empty recycle bin'):
-      $result = db_query('SELECT id FROM {privatemsg} p WHERE p.recipient = %d AND p.recipient_del = 1 UNION SELECT id FROM {privatemsg} p WHERE p.author = %d AND p.author_del = 1', $user->uid, $user->uid);
-      while ($message = db_fetch_object($result)) {
-        _privatemsg_delete($message->id, 2);
+      $result = db_query('SELECT id FROM privatemsg p WHERE p.recipient = %d AND p.recipient_del = 1 UNION SELECT id FROM privatemsg p  WHERE p.author = %d AND p.author_del = 1', $GLOBALS['user']->uid, $GLOBALS['user']->uid);
+      while ($message = db_fetch_array($result)) {
+        _privatemsg_delete($message['id'], 2);
       }
-      drupal_set_message('Recycle bin emptied.');
+      drupal_set_message('Recycle bin emptied');
       break;
   }
 }
@@ -1088,7 +1067,7 @@ function _privatemsg_move_folder($where,
   $msg_count = count($args);
 
   $folder = $extra_folders[$fid];
-  $link = l(t('%folder', array('%folder' => $folder)), 'privatemsg/list/'. $fid, array(), NULL, NULL, FALSE, TRUE);
+  $link = l(t('%folder', array('%folder' => $folder)), 'privatemsg/list/'. $fid, array('html' => TRUE));
 
   if ($msg_count == 1) {
     drupal_set_message(t('Your message has been moved to !link.', array('!link' => $link)));
@@ -1118,10 +1097,10 @@ function privatemsg_manage_folders() {
         break;
       case PRIVATEMSG_FOLDER_SENT:
         $msg_count = db_result(db_query("SELECT COUNT(*) FROM {privatemsg} WHERE author = %d AND author_del = 0", $user->uid, $fid));
-        break;
+         break;
       case PRIVATEMSG_FOLDER_INBOX:
         $msg_count = db_result(db_query("SELECT COUNT(*) FROM {privatemsg} WHERE recipient = %d AND folder = %d AND recipient_del = 0", $user->uid, $fid));
-        break;
+      break;
       default:
         // Custom folders.
         $msg_count = db_result(db_query("SELECT COUNT(*) FROM {privatemsg} WHERE recipient = %d AND folder = %d AND recipient_del = 0", $user->uid, $fid));
@@ -1130,7 +1109,6 @@ function privatemsg_manage_folders() {
         $operations[] = l(t('Delete'), 'privatemsg/folders/'. $fid .'/delete');
         break;
     }
-
     $row = array(
       l($folder['name'], $fid != 0 ? 'privatemsg/list/'. $fid : 'privatemsg'),
       $msg_count
@@ -1140,7 +1118,8 @@ function privatemsg_manage_folders() {
     $rows[] = $row;
   }
 
-  $output = theme('table', $header, $rows, array('class' => 'pm-manage-folders')) . drupal_get_form('privatemsg_new_folder_form');
+  $output = theme('table', $header, $rows, array('class' => 'pm-manage-folders'))
+. drupal_get_form('privatemsg_new_folder_form');
 
   return $output;
 }
@@ -1148,7 +1127,7 @@ function privatemsg_manage_folders() {
 /**
  * Form to add a new folder.
  */
-function privatemsg_new_folder_form() {
+function privatemsg_new_folder_form(&$form_state) {
   if (arg(2) == 'movetonew') {
     $movetonew = TRUE;
   }
@@ -1156,10 +1135,10 @@ function privatemsg_new_folder_form() {
     $movetonew = FALSE;
   }
 
-  if (isset($_SESSION['privatemsg'])) {
+  if (isset($form_state['storage']['privatemsg'])) {
     $name_desc = t('Enter a name for the new folder.');
     $form['messages'] = array('#tree' => TRUE);
-    foreach ($_SESSION['privatemsg'] as $mid => $message) {
+    foreach ($form_state['storage']['privatemsg'] as $mid => $message) {
       if ($message['selected']) {
         $form['messages'][$mid] = array(
           '#type' => 'hidden',
@@ -1174,7 +1153,7 @@ function privatemsg_new_folder_form() {
     }
   }
 
-  $to_fid = $_SESSION['fromfolder'];
+  $to_fid = $form_state['storage']['fromfolder'];
   if (empty($to_fid)) {
     $path = 'privatemsg';
   }
@@ -1206,38 +1185,42 @@ function privatemsg_new_folder_form() {
   return $form;
 }
 
-function privatemsg_new_folder_form_validate($form_id, $form_values) {
+function privatemsg_new_folder_form_validate($form, &$form_state) {
   global $user;
-  if (!empty($form_values['name']) && db_result(db_query("SELECT name FROM {privatemsg_folder} WHERE name = '%s' AND uid = %d", $form_values['name'], $user->uid))) {
+  if (!empty($form_state['values']['name']) && db_result(db_query("SELECT name FROM {privatemsg_folder} WHERE name = '%s' AND uid = %d", $form_state['values']['name'], $user->uid))) {
     form_set_error('name', t('A folder with this name already exists.'));
   }
-  if (empty($form_values['name'])) {
+  if (empty($form_state['values']['name'])) {
     form_set_error('name', t('You must specify a name for the new folder.'));
   }
 }
 
-function privatemsg_new_folder_form_submit($form_id, $form_values) {
+function privatemsg_new_folder_form_submit($form, &$form_state) {
   global $user;
-  $fid = db_next_id('{privatemsg_folder}_fid');
-  db_query("INSERT INTO {privatemsg_folder} (fid, uid, name) VALUES (%d, %d, '%s')", $fid, $user->uid, $form_values['name']);
-
-  if (isset($form_values['messages']) && is_array($form_values['messages'])) {
-    unset($_SESSION['privatemsg']);
-    foreach ($form_values['messages'] as $key => $value) {
+  $record = array(
+    'uid' => $user->uid,
+    'name' => $form_state['values']['name'],
+  );
+  drupal_write_record('privatemsg_folder', $record);
+  //db_query("INSERT INTO {privatemsg_folder} (fid, uid, name) VALUES (%d, %d, '%s')", $fid, $user->uid, $form_state['values']['name']);
+
+  if (isset($form_state['values']['messages']) && is_array($form_state['values']['messages'])) {
+    unset($form_state['storage']['privatemsg']);
+    foreach ($form_state['values']['messages'] as $key => $value) {
       db_query("UPDATE {privatemsg} SET folder = %d WHERE id = %d AND recipient = %d", $fid, $key, $user->uid);
     }
 
-    $link = l(t('%folder', array('%folder' => $form_values['name'])), 'privatemsg/list/'. $fid, array(), NULL, NULL, FALSE, TRUE);
+    $link = l(t('%folder', array('%folder' => $form_state['values']['name'])), 'privatemsg/list/'. $fid, array('html' => TRUE));
 
-    if (count($form_values['messages']) == 1) {
+    if (count($form_state['values']['messages']) == 1) {
       drupal_set_message(t('Your message has been moved to !link.', array('!link' => $link)));
     }
-    elseif (count($form_values['messages']) > 1) {
+    elseif (count($form_state['values']['messages']) > 1) {
       drupal_set_message(t('Your messages have been moved to !link.', array('!link' => $link)));
     }
 
-    $to_fid = $_SESSION['fromfolder'];
-    unset($_SESSION['fromfolder']);
+    $to_fid = $form_state['storage']['fromfolder'];
+    unset($form_state['storage']['fromfolder']);
     if (empty($to_fid)) {
       drupal_goto('privatemsg');
     }
@@ -1253,10 +1236,10 @@ function privatemsg_new_folder_form_subm
   }
   else {
     drupal_set_message(t('Folder created successfully.'));
-    if (isset($_SESSION['privatemsg'])) {
-      unset($_SESSION['privatemsg']);
-      $to_fid = $_SESSION['fromfolder'];
-      unset($_SESSION['fromfolder']);
+    if (isset($form_state['storage']['privatemsg'])) {
+      unset($form_state['storage']['privatemsg']);
+      $to_fid = $form_state['storage']['fromfolder'];
+      unset($form_state['storage']['fromfolder']);
       if (empty($to_fid)) {
         drupal_goto('privatemsg');
       }
@@ -1270,16 +1253,16 @@ function privatemsg_new_folder_form_subm
 /**
  * Display form to rename a folder.
  */
-function privatemsg_rename_folder_form($fid) {
-  $folder = db_result(db_query("SELECT name FROM {privatemsg_folder} WHERE fid = %d", $fid));
-  if (empty($folder)) {
+function privatemsg_rename_folder_form($form_state, $fid) {
+  $folder = db_result(db_query("SELECT name FROM {privatemsg_folder} WHERE fid = %d", $fid));  
+  if (!$folder) {
     drupal_set_message(t('Folder does not exist.'));
     drupal_goto('privatemsg/folders');
   }
 
   $form['old_name'] = array(
     '#type' => 'hidden',
-    '#value' => $folder,
+    '#value' => $folder->name,
   );
   $form['new_name'] = array(
     '#type' => 'textfield',
@@ -1298,24 +1281,25 @@ function privatemsg_rename_folder_form($
   return $form;
 }
 
-function privatemsg_rename_folder_form_validate($form_id, $form_values) {
+
+function privatemsg_rename_folder_form_validate($form, &$form_state) {
   global $user;
-  if (!empty($form_values['new_name']) &&
-      $form_values['new_name'] != $form_values['old_name'] &&
-      db_result(db_query("SELECT name FROM {privatemsg_folder} WHERE name = '%s' AND uid = %d", $form_values['new_name'], $user->uid))) {
+  if (!empty($form_state['values']['new_name']) &&
+      $form_state['values']['new_name'] != $form_state['values']['old_name'] &&
+      db_result(db_query("SELECT name FROM {privatemsg_folder} WHERE name = '%s' AND uid = %d", $form_state['values']['new_name'], $user->uid))) {
     form_set_error('new_name', t('A folder with this name already exists.'));
   }
-  if (empty($form_values['new_name'])) {
+  if (empty($form_state['values']['new_name'])) {
     form_set_error('new_name', t('You must specify a name for the new folder.'));
   }
 }
 
-function privatemsg_rename_folder_form_submit($form_id, $form_values) {
-  if ($form_values['new_name'] != $form_values['old_name']) {
-    db_query("UPDATE {privatemsg_folder} SET name = '%s' WHERE fid = %d", $form_values['new_name'], intval(arg(2)));
+function privatemsg_rename_folder_form_submit($form, &$form_state) {
+  if ($form_state['values']['new_name'] != $form_state['values']['old_name']) {
+    db_query("UPDATE {privatemsg_folder} SET name = '%s' WHERE fid = %d", $form_state['values']['new_name'], intval(arg(2)));
     drupal_set_message(t('Folder name changed from %old_name to %new_name.',
-                         array('%old_name' => $form_values['old_name'],
-                               '%new_name' => $form_values['new_name'])));
+                         array('%old_name' => $form_state['values']['old_name'],
+                               '%new_name' => $form_state['values']['new_name'])));
   }
   else {
     drupal_set_message(t('Folder name left the same.'));
@@ -1326,7 +1310,7 @@ function privatemsg_rename_folder_form_s
 /**
  * Prompt to delete all the messages in a folder.
  */
-function privatemsg_empty_folder_form($fid) {
+function privatemsg_empty_folder_form(&$form_state, $fid) {
   $folder = db_result(db_query("SELECT name FROM {privatemsg_folder} WHERE fid = %d", $fid));
   if (empty($folder)) {
     drupal_set_message(t('Folder does not exist.'));
@@ -1341,11 +1325,11 @@ function privatemsg_empty_folder_form($f
   return $form;
 }
 
-function privatemsg_empty_folder_form_submit($form_id, $form_values) {
+function privatemsg_empty_folder_form_submit($form, &$form_state) {
   global $user;
   $fid = intval(arg(2));
 
-  if ($fid == 0 || $form_values['empty'] != 1) {
+  if ($fid == 0 || $form_state['values']['empty'] != 1) {
     drupal_goto('privatemsg/folders');
   }
 
@@ -1353,7 +1337,7 @@ function privatemsg_empty_folder_form_su
     db_query("UPDATE {privatemsg} SET author_del = 1 WHERE author = %d", $user->uid);
   }
   else if ($fid > 1 && !db_result(db_query('SELECT fid FROM {privatemsg_folder} WHERE fid = %d AND uid = %d', $fid, $user->uid))) {
-    watchdog('privatemsg', t('Attempted use of unauthorized folder'), WATCHDOG_WARNING);
+    watchdog('privatemsg', 'Attempted use of unauthorized folder', array(), WATCHDOG_WARNING);
     return drupal_access_denied();
   }
   else {
@@ -1367,7 +1351,7 @@ function privatemsg_empty_folder_form_su
 /**
  * Prompt to delete a folder and all its messages.
  */
-function privatemsg_delete_folder_form($fid) {
+function privatemsg_delete_folder_form(&$form_state, $fid) {
   $folder = db_result(db_query("SELECT name FROM {privatemsg_folder} WHERE fid = %d", $fid));
   if (empty($folder)) {
     drupal_set_message(t('Folder does not exist.'));
@@ -1382,16 +1366,16 @@ function privatemsg_delete_folder_form($
   return $form;
 }
 
-function privatemsg_delete_folder_form_submit($form_id, $form_values) {
+function privatemsg_delete_folder_form_submit($form, &$form_state) {
   global $user;
   $fid = intval(arg(2));
 
-  if ($fid == 0 || $form_values['delete'] != 1) {
+  if ($fid == 0 || $form_state['values']['delete'] != 1) {
     drupal_goto('privatemsg/folders');
   }
 
   if (!db_result(db_query("SELECT fid FROM {privatemsg_folder} WHERE fid = %d AND uid = %d", $fid, $user->uid))) {
-    watchdog('privatemsg', t('Attempted use of unauthorized folder'), WATCHDOG_WARNING);
+    watchdog('privatemsg', 'Attempted use of unauthorized folder', array(), WATCHDOG_WARNING);
     return drupal_access_denied();
   }
   db_query("DELETE FROM {privatemsg_folder} WHERE fid = %d", $fid);
@@ -1404,7 +1388,7 @@ function privatemsg_delete_folder_form_s
 /**
  * Provides a form to write a private message.
  */
-function privatemsg_new_form($message = NULL) {
+function privatemsg_new_form(&$form_state, $message = NULL) {
   global $user;
   if (!isset($message)) {
     $message = 0;
@@ -1413,21 +1397,21 @@ function privatemsg_new_form($message = 
     if ($op == 'reply') {
       $message = arg(2);
     }
-    else if (($uid = arg(2)) && ($msg->recipient = db_result(db_query('SELECT name FROM {users} WHERE uid = %d', $uid)))) {
+    else if (($uid = arg(2)) && ($msg['recipient'] = db_result(db_query('SELECT name FROM {users} WHERE uid = %d', $uid)))) {
       if (!privatemsg_message_allowed($uid, $user->uid)) {
-        drupal_set_message(t('You cannot contact %recipient', array('%recipient' => $msg->recipient)));
+        drupal_set_message(t('You cannot contact %recipient', array('%recipient' => $msg['recipient'])));
         drupal_goto("user/$uid");
       }
       $message = $msg;
     }
   }
 
-  if ($message && !is_object($message)) {
+  if ($message && !is_array($message)) {
     // This is a reply to another message
-    $message = db_fetch_object(db_query('SELECT thread, subject, message, u.name AS recipient FROM {privatemsg} p INNER JOIN {users} u ON u.uid = p.author WHERE id = %d AND recipient = %d', $message, $user->uid));
+    $message = db_fetch_array(db_query('SELECT thread, subject, message, u.name AS recipient FROM {privatemsg} p INNER JOIN {users} u ON u.uid = p.author WHERE id = %d AND recipient = %d', $message, $user->uid));
 
-    if (!stristr($message->subject, t('Re:'))) {
-      $message->subject = t('Re: ') . $message->subject;
+    if (!stristr($message['subject'], t('Re:'))) {
+      $message['subject'] = t('Re:') .' '. $message['subject'];
     }
 
     // quoting; [quote] if default input format uses bbcode or quote, else > quoting
@@ -1438,113 +1422,106 @@ function privatemsg_new_form($message = 
       }
     }
     if (isset($bbcode)) {
-      $message->message = "\n\n[quote=". $message->recipient .']'. $message->message .'[/quote]';
+      $message['message'] = "\n\n[quote=". $message['recipient'] .']'. $message['message'] .'[/quote]';
     }
     else {
-      $message->message = "\n\n\n". str_replace("\n", "\n> ", "\n". $message->message);
+      $message['message'] = "\n\n\n". str_replace("\n", "\n> ", "\n". $message['message']);
     }
   }
-  if (!is_object($message)) {
-    $message = new stdClass();
+  if (!is_array($message)) {
+    $message = array();
   }
   // The first if can provide a partial message, so we fill it in to avoid
   // notices. Also we remove the message if it's a reply in a threaded view,
   // the original message will be seen anyways.
-  if (!isset($message->subject) || variable_get('privatemsg_threaded_view', 0)) {
-    $message->message = '';
+  if (variable_get('privatemsg_threaded_view', 0)) {
+    $message['message'] = '';
+  }
+  foreach (array('subject', 'recipient', 'format', 'message') as $key) {
+    if (!isset($message[$key])) {
+      $message[$key] = '';
+    }
   }
 
   if (isset($_SESSION['recipients'])) {
-    $recipient = implode(', ', $_SESSION['recipients']);
+    $message['recipient'] = implode(', ', $_SESSION['recipients']);
     unset($_SESSION['recipients']);
   }
 
-  $form['thread'] = array('#type' => 'value', '#value' => isset($message->thread) ? $message->thread : 0);
+  if (isset($form_state['post']['op']) && $form_state['post']['op'] == t('Preview')) {
+    $message['subject'] = $form_state['post']['subject'];
+    $message['message'] = $form_state['post']['privatemsgbody'];
+    $message['format'] = $form_state['post']['format'];
+    $message['timestamp'] = time();
+    $message['newmsg'] = TRUE;
+    $message['folder'] = 1;
+    $message['uid'] = $message['author'] = $user->uid;
+    $message['name'] = $user->name;
+    $message['recipient'] = $form_state['post']['recipient'];
+    $message['preview'] = TRUE;
+
+    // Allow other modules to change the message.
+    privatemsg_invoke_privatemsg($message, 'view');
+    $form['#prefix'] = '<div class="preview">' .
+        theme('privatemsg_view', $message, TRUE) .
+        '</div>';
+    drupal_set_title(t('Preview message'));
+  }
+
+  if (!isset($form['thread'])) {
+    $form['thread'] = array('#type' => 'value', '#value' => isset($message['thread']) ? $message['thread'] : 0);
+  }
   $form['header']['#theme'] = 'privatemsg_new_msg_header';
-  $form['header']['recipient'] = array(
-    '#type' => 'textfield',
-    '#title' => t('To'),
-    '#description' => t('Separate multiple names with commas.'),
-    '#default_value' => isset($recipient) ? $recipient : $message->recipient,
-    '#autocomplete_path' => 'privatemsg/autocomplete',
-    '#size' => 50,
-    '#maxlength' => 1000,
-    '#required' => TRUE,
-  );
+  if (!isset($form['header']['recipient'])) {
+    $form['header']['recipient'] = array(
+      '#type' => 'textfield',
+      '#title' => t('To'),
+      '#description' => t('Separate multiple names with commas.'),
+      '#default_value' => $message['recipient'],
+      '#autocomplete_path' => 'privatemsg/autocomplete',
+      '#size' => 50,
+      '#maxlength' => 1000,
+      '#required' => TRUE,
+    );
+  }
   $form['header']['subject'] = array(
     '#type' => 'textfield',
     '#title' => t('Subject'),
-    '#default_value' => $message->subject,
+    '#default_value' => $message['subject'],
     '#size' => 50,
     '#maxlength' => 64,
     '#required' => TRUE,
   );
   $form['privatemsgbody'] = array(
     '#type' => 'textarea',
-    '#title' => empty($message->thread) ? t('Message') : t('Reply'),
-    '#default_value' => $message->message,
+    '#title' => empty($message['thread']) ? t('Message') : t('Reply'),
+    '#default_value' => $message['message'],
     '#cols' => 80,
     '#rows' => 6,
   );
-  $form['filter_form'] = filter_form($message->format);
+  $form['filter_form'] = filter_form($message['format']);
   $form['preview'] = array(
     '#type' => 'submit',
-    '#value' => t('Preview'),
-    '#prefix' => '<div class="pm-controls">'
+    '#value' => t('Preview')
+  );
+  $form['preview_msg'] = array(
+    '#weight' => -5,
+    '#value' => '',
   );
   $form['send'] = array(
     '#type' => 'submit',
     '#value' => t('Send private message')
   );
-  $form['cancel'] = array(
-    '#value' => l(t('Cancel'), arg(1) == 'reply' ? 'privatemsg/view/'. arg(2) : 'privatemsg'),
-    '#suffix' => '</div>'
-  );
-
-  $form['#after_build'] = array('_privatemsg_new_preview');
 
   drupal_add_js(drupal_get_path('module', 'privatemsg') .'/privatemsg.js');
 
   return $form;
 }
 
-function _privatemsg_new_preview($form, $form_values) {
-  if ($form_values['op'] == t('Preview')) {
-    $pass = TRUE;
-    $recipients = explode(',', $form_values['recipient']);
-    foreach ($recipients as $recipient) {
-      $recipient = user_load(array('name' => trim($recipient)));
-      if (!$recipient->uid) {
-        $pass = FALSE;
-      }
-    }
-    if ($pass) {
-      global $user;
-      $message->subject = $form_values['subject'];
-      $message->message = $form_values['privatemsgbody'];
-      $message->format = $form_values['format'];
-      $message->timestamp = time();
-      $message->newmsg = TRUE;
-      $message->folder = 1;
-      $message->uid = $message->author = $user->uid;
-      $message->name = $user->name;
-      $message->recipient = implode(', ', $recipients);
-      $message->preview = TRUE;
-      // Allow other modules to change the message.
-      privatemsg_invoke_privatemsg($message, 'view');
-      $form['preview'] = array(
-        '#prefix' => '<div class="preview">',
-        '#value' => theme('privatemsg_view', $message, TRUE),
-        '#suffix' => '</div>');
-      drupal_set_title(t('Preview message'));
-    }
-  }
-  return $form;
-}
 
-function privatemsg_new_form_validate($form_id, $form_values) {
-  if (!empty($form_values['recipient'])) {
-    $recipients = explode(',', $form_values['recipient']);
+function privatemsg_new_form_validate($form, &$form_state) {
+  if (!empty($form_state['values']['recipient'])) {
+    $recipients = explode(',', $form_state['values']['recipient']);
     foreach ($recipients as $recipient) {
       $account = user_load(array('name' => trim($recipient)));
       if (!$account) {
@@ -1555,46 +1532,47 @@ function privatemsg_new_form_validate($f
       }
     }
   }
-  if (!isset($form_values['format']) || !filter_access($form_values['format'])) {
+  if (!isset($form_state['values']['format']) || !filter_access($form_state['values']['format'])) {
     form_set_error('format', t('The supplied input format is invalid.'));
   }
-  if (empty($form_values['privatemsgbody'])) {
+  if (empty($form_state['values']['privatemsgbody'])) {
     form_set_error('privatemsgbody', t('Message field is required.'));
   }
 }
 
-function privatemsg_new_form_submit($form_id, $form_values) {
+function privatemsg_new_form_submit($form, &$form_state) {
   global $user;
   static $seen = array();
-  if ($form_values['op'] != t('Send private message')) {
-    return FALSE;
-  }
+  if ($form_state['clicked_button']['#value'] == t('Send private message')) {
+    // Do not allow sending a message to yourself.
+    $seen[$user->name] = TRUE;
+    $recipients = explode(',', $form_state['values']['recipient']);
+    $sent = FALSE;
+    foreach ($recipients as $recipient) {
+      $recipient = trim($recipient);
+      if (isset($seen[$recipient])) {
+        continue;
+      }
+      $seen[$recipient] = TRUE;
+      $recipient = user_load(array('name' => $recipient));
+      $message_id = _privatemsg_send($user, $recipient, $form_state['values']['subject'], $form_state['values']['privatemsgbody'], $form_state['values']['format'], $form_state['values']['thread']);
+      if ($message_id) {
+        // Load the message for consistency.
+        $message = privatemsg_load($message_id);
+        // Tell the other modules a new private message has been sent.
+        privatemsg_invoke_privatemsg($message, 'sent');
+        $sent = TRUE;
+      }
+    }
 
-  // Do not allow sending a message to yourself.
-  $seen[$user->name] = TRUE;
-  $recipients = explode(',', $form_values['recipient']);
-  $sent = FALSE;
-  foreach ($recipients as $recipient) {
-    $recipient = trim($recipient);
-    if (isset($seen[$recipient])) {
-      continue;
-    }
-    $seen[$recipient] = TRUE;
-    $recipient = user_load(array('name' => $recipient));
-    $message_id = _privatemsg_send($user, $recipient, $form_values['subject'], $form_values['privatemsgbody'], $form_values['format'], $form_values['thread']);
-    if ($message_id) {
-      // Load the message for consistency.
-      $message = privatemsg_load($message_id);
-      // Tell the other modules a new private message has been sent.
-      privatemsg_invoke_privatemsg($message, 'sent');
-      $sent = TRUE;
+    if ($sent) {
+      drupal_set_message(t('Message sent.'));
     }
+    drupal_goto($user->uid ? 'privatemsg' : '');
   }
-
-  if ($sent) {
-    drupal_set_message(t('Message sent.'));
+  else if ($form_state['clicked_button']['#value'] == t('Preview')) {
+    $form_state['redirect'] = FALSE;
   }
-  drupal_goto($user->uid ? 'privatemsg' : '');
 }
 
 /**
@@ -1613,8 +1591,7 @@ function privatemsg_new_form_submit($for
  * @param $type
  *   Type of the message as defined on admin/build/privatemsg .
  * @param $variables
- *   If this message is a subscriptions mail, the variables used to compose the
- * message.
+ *   If this message is a subscriptions mail, the variables used to compose the message.
  **/
 function privatemsg_send_privatemsg($recipient, $subject, $body, $format = FILTER_FORMAT_DEFAULT, $thread = 0, $type = 'private-message', $variables = array()) {
   global $user;
@@ -1627,9 +1604,9 @@ function _privatemsg_send($sender, $reci
     return;
   }
 
-  // Hook to allow other modules to alter any aspect of a privatemsg by
-  // accepting these params by reference. Any module can cancel a privatemsg by
-  // returning false here
+  // hook to allow other modules to alter any aspect of a privatemsg
+  // by accepting these params by reference. Any module can cancel a
+  // privatemsg by returning false here
   foreach (module_implements('privatemsg_alter') as $name) {
     $function = $name .'_privatemsg_alter';
     if (!$function($sender, $recipient, $subject, $body, $format, $thread, $type)) {
@@ -1639,37 +1616,51 @@ function _privatemsg_send($sender, $reci
   if ($sender->uid == $recipient->uid) {
     return FALSE;
   }
-  $message_id = db_next_id('{privatemsg}_id');
+  $message_id = db_last_insert_id('{privatemsg}', 'id') + 1;
   if (!$thread) {
-    $thread = db_next_id('{privatemsg}_thread');
+    $thread = db_last_insert_id('{privatemsg}', 'thread');
   }
   $variables = array();
   foreach ($original_variables as $name => $value) {
     $variables[str_replace('!', '!original_', $name)] = $value;
   }
-  $result = db_query("INSERT INTO {privatemsg} (id, author, recipient, subject, message, timestamp, newmsg, hostname, format, thread, type, variables) VALUES (%d, %d, %d, '%s', '%s', %d, %d, '%s', %d, %d, '%s', '%s')", $message_id, $sender->uid, $recipient->uid, $subject, $body, time(), 1, getenv('REMOTE_ADDR'), $format, $thread, $type, serialize($variables));
+
+  $message = array(
+    'author' => $sender->uid,
+    'recipient' => $recipient->uid,
+    'subject' => $subject,
+    'message' => $body,
+    'timestamp' => time(),
+    'newmsg' => 1,
+    'hostname' => getenv('REMOTE_ADDR'),
+    'format' => $format,
+    'thread' => $thread,
+    'type' => $type,
+    'variables' => serialize($variables),
+  );
+  $result = drupal_write_record('privatemsg', $message);
+  //$result = db_query("INSERT INTO {privatemsg} (id, author, recipient, subject, message, timestamp, newmsg, hostname, format, thread, type, variables) VALUES (%d, %d, %d, '%s', '%s', %d, %d, '%s', %d, %d, '%s', '%s')", $message_id, $sender->uid, $recipient->uid, $subject, $body, time(), 1, getenv('REMOTE_ADDR'), $format, $thread, $type, serialize($variables));
   if ($points = variable_get('privatemsg_userpoints', 0)) {
     module_invoke('userpoints', 'userpointsapi', 'points', $points, $sender->uid, 'privatemsg');
   }
   module_invoke('pm_subscriptions', 'subscriptions_handle', privatemsg_load($message_id));
 
-  return $result ? $message_id : $result;
+  return ($result == SAVED_NEW) ? db_last_insert_id('privatemsg', 'id') : FALSE;
 }
 
 /**
- * Return a version of type that can be used as an object property key
- * (change whitespace to _)
+ * Return a version of type that can be used as an object property key (change whitespace to _)
  */
 function _privatemsg_get_type_key($type) {
-  return 'privatemsg_allow_'. preg_replace('/\s+/', '_', $type);
+  return 'privatemsg_allow_' . preg_replace('/\s+/', '_', $type);
 }
 
 /**
  * Display a user's contacts list and let them write a PM to multiple contacts.
  */
 function privatemsg_contacts_form() {
-  $contacts = array();
   global $user;
+  $contacts = array();
 
   // Add people who have messaged the user to the contact list.
   $result = db_query("SELECT DISTINCT u.name, u.uid FROM {privatemsg} AS p "
@@ -1677,8 +1668,8 @@ function privatemsg_contacts_form() {
                     ."p.recipient = %d AND p.author != %d AND p.timestamp > "
                     ."(UNIX_TIMESTAMP(NOW()) - (3600 * 24 * 30)) ORDER BY "
                     ."u.name", $user->uid, $user->uid);
-  while ($author = db_fetch_object($result)) {
-    $contacts[check_plain($author->name)] = $author->uid;
+  while ($author = db_fetch_array($result)) {
+    $contacts[check_plain($author['name'])] = $author['uid'];
   }
 
   // Add people the user has messaged to the contact list.
@@ -1687,15 +1678,15 @@ function privatemsg_contacts_form() {
                     ."p.author = %d AND p.timestamp > "
                     ."(UNIX_TIMESTAMP(NOW()) - (3600 * 24 * 30)) ORDER BY "
                     ."u.name", $user->uid, $user->uid);
-  while ($author = db_fetch_object($result)) {
-    $contacts[check_plain($author->name)] = $author->uid;
+  while ($author = db_fetch_array($result)) {
+    $contacts[check_plain($author['name'])] = $author['uid'];
   }
 
   if (module_exists('buddylist')) {
     $result = db_query("SELECT u.name, u.uid FROM {buddylist} AS b LEFT JOIN "
                       ."{users} AS u ON b.buddy = u.uid WHERE b.uid = %d", $user->uid);
-    while ($buddy = db_fetch_object($result)) {
-      $contacts[check_plain($buddy->name)] = $buddy->uid;
+    while ($buddy = db_fetch_array($result)) {
+      $contacts[check_plain($buddy['name'])] = $buddy['uid'];
     }
   }
 
@@ -1743,9 +1734,10 @@ function privatemsg_contacts_form() {
   return $form;
 }
 
-function privatemsg_contacts_form_submit($form_id, $form_values) {
-  if ($form_values['op'] == t('Write private message')) {
-    foreach ($form_values['contacts'] as $uid => $contact) {
+function privatemsg_contacts_form_submit($form, &$form_state) {
+  if ($form_state['clicked_button']['#value'] == t('Write private message')) {
+    $recipients = array();
+    foreach ($form_state['values']['contacts'] as $uid => $contact) {
       if ($contact['selected']) {
         $recipients[] = $contact['name'];
       }
@@ -1760,30 +1752,30 @@ function privatemsg_contacts_form_submit
 /**
  * Display a private message to a user.
  *
- * We calculate previous and next message here. Let's assume the order is from
- * oldest to newest. The next message is then the first row from:
+ * We calculate previous and next message here. Let's assume the order is
+ * from oldest to newest. The next message is then the first row from:
  * SELECT id FROM privatemsg WHERE timestamp > %d ORDER BY timestamp ASC
  * The code below is the abstraction of this to every field and ASC/DESC.
  */
-function privatemsg_view($message_id) {
+function privatemsg_view($message) {
   global $user;
-  if ($message = privatemsg_load($message_id)) {
+  if ($message) {
     $threaded_view = variable_get('privatemsg_threaded_view', 0);
-    if (isset($_SESSION['privatemsg_list_sql'])) {
+    if (isset($form_state['storage']['privatemsg_list_sql'])) {
       // This is the SQL assembled in privatemsg_list
-      $sql = $_SESSION['privatemsg_list_sql']['sql'];
+      $sql = $form_state['storage']['privatemsg_list_sql']['sql'];
       // These are the arguments, again from privatemsg_list
-      $args = $_SESSION['privatemsg_list_sql']['args'];
+      $args = $form_state['storage']['privatemsg_list_sql']['args'];
       // This is the field we are ordering on.
-      $field = $_SESSION['privatemsg_list_sql']['field'];
+      $field = $form_state['storage']['privatemsg_list_sql']['field'];
       // This is either ASC or DESC.
-      $sort = $_SESSION['privatemsg_list_sql']['sort'];
+      $sort = $form_state['storage']['privatemsg_list_sql']['sort'];
       if ($threaded_view) {
         $sql .= ' AND thread != %d';
-        $args[] = $message->thread;
+        $args[] = $message['thread'];
       }
       $placeholder = ($field == 'type' || $field == 'subject') ? "'%s'" : '%d';
-      $args[] = $message->$field;
+      $args[] = $message[$field];
       if ($sort == 'ASC') {
         $prev_operator = '<';
         $next_operator = '>';
@@ -1797,26 +1789,26 @@ function privatemsg_view($message_id) {
         $next_sort = 'DESC';
       }
       if ($previous_id = db_result(db_query_range("$sql AND $field $prev_operator $placeholder ORDER BY $field $prev_sort", $args, 0, 1))) {
-        $previous_link = l(t('Previous'), 'privatemsg/view/'. $previous_id, array(), NULL, 'message-'. $previous_id);
+        $previous_link = l(t('Previous'), 'privatemsg/view/'. $previous_id, array('fragment' => 'message-'. $previous_id));
       }
       else {
         $previous_link = '';
       }
       if ($next_id = db_result(db_query_range("$sql AND $field $next_operator $placeholder ORDER BY $field $next_sort", $args, 0, 1))) {
-        $next_link =  l(t('Next'), 'privatemsg/view/'. $next_id, array(), NULL, 'message-'. $next_id);
+        $next_link =  l(t('Next'), 'privatemsg/view/'. $next_id, array('fragment' => 'message-'. $next_id));
       }
       else {
         $next_link = '';
       }
     }
-    if ($threaded_view && $message->thread) {
-      $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 INNER JOIN {users} u ON p.author = u.uid WHERE p.thread = %d ORDER BY timestamp ASC', $message->thread);
+    if ($threaded_view && $message['thread']) {
+      $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 INNER JOIN {users} u ON p.author = u.uid WHERE p.thread = %d ORDER BY timestamp ASC', $message['thread']);
       $messages = '';
-      while ($message = db_fetch_object($result)) {
+      while ($message = db_fetch_array($result)) {
         if (!isset($first)) {
           $first = $message;
         }
-        if ($message->recipient == $user->uid) {
+        if ($message['recipient'] == $user->uid) {
           $last = $message;
         }
         $messages .= _privatemsg_view($message);
@@ -1826,10 +1818,13 @@ function privatemsg_view($message_id) {
       $first = $message;
       $messages = _privatemsg_view($message);
     }
-    $output = theme('privatemsg_links', $previous_link, $next_link);
+    $output = '';
+    if (isset($previous_link)) {
+      $output .= theme('privatemsg_links', $previous_link, $next_link);
+    }
     $output .= $messages;
-    if ($last->recipient == $user->uid) {
-      $output .= drupal_get_form('privatemsg_new_form', $last->id);
+    if (isset($last) && $last['recipient'] == $user->uid) {
+      $output .= drupal_get_form('privatemsg_new_form', $last['id']);
     }
     return $output;
   }
@@ -1838,10 +1833,11 @@ function privatemsg_view($message_id) {
 
 function _privatemsg_view($message) {
   global $user;
+  
   // Allow other modules to change the message.
   privatemsg_invoke_privatemsg($message, 'view');
-  if ($message->newmsg && $user->uid == $message->recipient) {
-    db_query("UPDATE {privatemsg} SET newmsg = 0 WHERE id = %d", $message->id);
+  if ($message['newmsg'] && $user->uid == $message['recipient']) {
+    db_query("UPDATE {privatemsg} SET newmsg = 0 WHERE id = %d", $message['id']);
   }
   return theme('privatemsg_view', $message, FALSE);
 }
@@ -1849,20 +1845,20 @@ function _privatemsg_view($message) {
 /**
  * Add the action form to the view message screen.
  */
-function privatemsg_view_form($message) {
+function privatemsg_view_form(&$form_state, $message) {
   global $user;
 
   $form['pm_id'] = array(
     '#type' => 'hidden',
-    '#value' => $message->id,
+    '#value' => $message['id'],
   );
   $form['pm_fid'] = array(
     '#type' => 'hidden',
-    '#value' => $message->folder,
+    '#value' => $message['folder'],
   );
   $form['author']= array(
     '#type' => 'value',
-    '#value' => $message->author,
+    '#value' => $message['author'],
   );
   $form['js_bypass'] = array(
     '#type' => 'hidden',
@@ -1878,7 +1874,7 @@ function privatemsg_view_form($message) 
   $form['actions']['text'] = array(
     '#value' => '<div><strong>'. t('With this message:') .'</strong> </div>',
   );
-  if ($user->uid == $message->recipient) {
+  if ($user->uid == $message['recipient']) {
     $form['actions']['reply'] = array(
       '#type' => 'submit',
       '#value' => t('Reply'),
@@ -1897,32 +1893,40 @@ function privatemsg_view_form($message) 
     );
   }
 
+  $form['actions']['unread'] = array(
+      '#type' => 'submit',
+      '#value' => t('Mark as Unread'),
+      '#prefix' => ' &nbsp; &nbsp;',
+      '#attributes' => array('class' => 'pm-add-unread pm-spacer'),
+    );
+  
   $folders = privatemsg_load_folders($user->uid);
-  if (user_access('create new folder')) {
-    $extra_folders = array();
-    foreach ($folders as $folder) {
-      // Do not display the recycle bin in the move to folder drop down as the
-      // delete button is already available. Similarly, avoid displaying
-      // the sent items folder as it is for internal use only.
-      if ($folder['fid'] != PRIVATEMSG_FOLDER_SENT && $folder['fid'] != PRIVATEMSG_FOLDER_RECYCLE_BIN && $folder['fid'] != $message->folder) {
-        $extra_folders[$folder['fid']] = $folder['name'];
-      }
-    }
-    $extra_folders['new'] = t('New folder...');
-
-    if ($user->uid == $message->recipient) {
-      $form['actions']['folder'] = array(
-        '#type' => 'select',
-        '#options' => $extra_folders,
-        '#attributes' => array('class' => 'pm-spacer'),
-      );
-      $form['actions']['extra_folders'] = array('#type' => 'value', '#value' => $extra_folders);
-      $form['actions']['move_messages'] = array(
-        '#type' => 'submit',
-        '#value' => t('Move to folder'),
-      );
+  foreach ($folders as $key => $folder) {
+    if ($folder['fid'] != PRIVATEMSG_FOLDER_SENT && $folder['fid'] != PRIVATEMSG_FOLDER_RECYCLE_BIN && $folder['fid'] != $current_folder) {
+      $extra_folders[$folder['fid']] = $folder['name'];
     }
   }
+  $extra_folders['new'] = t('New folder...');
+  
+  if ($user->uid == $message['recipient']) {
+    $form['actions']['folder'] = array(
+      '#type' => 'select',
+      '#options' => $extra_folders,
+      '#attributes' => array('class' => 'pm-spacer'),
+    );
+    
+    $form['actions']['extra_folders'] = array('#type' => 'value', '#value' => $extra_folders);
+    $form['actions']['move_messages'] = array(
+      '#type' => 'submit',
+      '#value' => t('Move to folder'),
+    );
+  }
+  if (!privatemsg_user_blocked($message['author'])) {
+    $form['actions']['block'] = array(
+      '#type' => 'submit',
+      '#value' => t('Block this user'),
+    );
+  }
 
   if ($del == '2') {
     $form['actions']['delete'] = array(
@@ -1946,29 +1950,35 @@ function privatemsg_view_form($message) 
   return $form;
 }
 
-function privatemsg_view_form_submit($form_id, $form_values) {
+function privatemsg_view_form_submit($form, &$form_state) {
   global $user;
 
-  switch ($form_values['op']) {
+  switch ($form_state['clicked_button']['#value']) {
     case t('Reply'):
-      drupal_goto('privatemsg/reply/'. $form_values['pm_id']);
+      drupal_goto('privatemsg/reply/'. $form_state['values']['pm_id']);
     case t('Delete'):
       if ($_POST['js_bypass'] == 1) {
-        drupal_goto('privatemsg/delete/'. $form_values['pm_id']);
+        drupal_goto('privatemsg/delete/'. $form_state['values']['pm_id']);
       }
-      drupal_goto('privatemsg/delete/confirm/'. $form_values['pm_id']);
-    case t('Move to folder'):
-      $fid = $form_values['folder'];
+      drupal_goto('privatemsg/delete/confirm/'. $form_state['values']['pm_id']);
+    case t('Mark as Unread'):
+      db_query("UPDATE {privatemsg} SET newmsg = 1 WHERE id = %d", $form_state['values']['pm_id']);
+      drupal_goto('privatemsg/list/'. $form_state['values']['pm_fid']);
+    case t('Block this user'):
+      privatemsg_block_user($form_state['values']['author']);
+      break;
+    case t('Move to folder'):      
+      $fid = $form_state['values']['folder'];
       if ($fid == 'new') {
-        $_SESSION['privatemsg'] = array(
-          $form_values['pm_id'] => array('selected' => TRUE)
+        $form_state['storage']['privatemsg'] = array(
+          $form_state['values']['pm_id'] => array('selected' => TRUE)
         );
-        $_SESSION['fromfolder'] = 'view/'. intval($form_values['pm_id']);
+        $form_state['storage']['fromfolder'] = 'view/'. intval($form_state['values']['pm_id']);
         drupal_goto('privatemsg/folders/movetonew');
       }
 
-      db_query("UPDATE {privatemsg} SET folder = %d WHERE id = %d AND recipient = %d", $fid, $form_values['pm_id'], $user->uid);
-      $link = l(t('%folder', array('%folder' => $form_values['extra_folders'][$fid])), 'privatemsg/list/'. $fid, array(), NULL, NULL, FALSE, TRUE);
+      db_query("UPDATE {privatemsg} SET folder = %d WHERE id = %d AND recipient = %d", $fid, $form_state['values']['pm_id'], $user->uid);
+      $link = l(t('%folder', array('%folder' => $form_state['values']['extra_folders'][$fid])), 'privatemsg/list/'. $fid, array('html' => TRUE));
       drupal_set_message(t('Your message has been moved to !link.', array('!link' => $link)));
 
       break;
@@ -1977,13 +1987,13 @@ function privatemsg_view_form_submit($fo
 
 function privatemsg_back_to_list($message_id) {
   global $user;
-  $message = db_fetch_object(db_query("SELECT folder, recipient FROM {privatemsg} WHERE id = %d", $message_id));
+  $message = db_fetch_array(db_query("SELECT folder, recipient FROM {privatemsg} WHERE id = %d", $message_id));
 
-  if ($message->fid > 0) {
+  if ($message['folder'] > 0) {
     drupal_goto('privatemsg/list/'. $fid);
   }
   else {
-    drupal_goto('privatemsg'. ($user->uid == $message->recipient ? '' : '/'. $message->recipient));
+    drupal_goto('privatemsg'. ($user->uid == $message['recipient'] ? '' : '/'. $message['recipient']));
   }
 }
 
@@ -2000,7 +2010,7 @@ function privatemsg_delete() {
   }
 
   if (arg(2) == 'multiple') {
-    if (empty($_SESSION['privatemsg']) || !is_array($_SESSION['privatemsg'])) {
+    if (empty($form_state['storage']['privatemsg']) || !is_array($form_state['storage']['privatemsg'])) {
       drupal_goto('priatemsg');
     }
     return drupal_get_form('privatemsg_delete_multiple_form');
@@ -2022,22 +2032,22 @@ function privatemsg_delete_form($mid) {
   return $form;
 }
 
-function privatemsg_delete_form_submit($form_id, $form_values) {
+function privatemsg_delete_form_submit($form, &$form_state) {
   drupal_goto('privatemsg/delete/'. arg(3));
 }
 
 function privatemsg_delete_multiple_form() {
-  foreach ($_SESSION['privatemsg'] as $mid => $message) {
+  foreach ($form_state['storage']['privatemsg'] as $mid => $message) {
     if ($message['selected']) {
       $messages[] = $message['subject'];
     }
   }
 
-  if ($_SESSION['fromfolder'] == 0) {
+  if ($form_state['storage']['fromfolder'] == 0) {
     $cancel_path = 'privatemsg';
   }
   else {
-    $cancel_path = 'privatemsg/list/'. $_SESSION['fromfolder'];
+    $cancel_path = 'privatemsg/list/'. $form_state['storage']['fromfolder'];
   }
 
   $message = t('Are you sure you wish to delete the following messages?')
@@ -2049,20 +2059,20 @@ function privatemsg_delete_multiple_form
   return $form;
 }
 
-function privatemsg_delete_multiple_form_submit($form_id, $form_values) {
-  foreach ($_SESSION['privatemsg'] as $mid => $message) {
+function privatemsg_delete_multiple_form_submit($form, &$form_state) {
+  foreach ($form_state['storage']['privatemsg'] as $mid => $message) {
     if ($message['selected']) {
       _privatemsg_delete($mid);
     }
   }
 
-  if ($_SESSION['fromfolder'] == 0) {
+  if ($form_state['storage']['fromfolder'] == 0) {
     $path = 'privatemsg';
   }
   else {
-    $path = 'privatemsg/list/'. $_SESSION['fromfolder'];
+    $path = 'privatemsg/list/'. $form_state['storage']['fromfolder'];
   }
-  unset($_SESSION['privatemsg'], $_SESSION['fromfolder']);
+  unset($form_state['storage']['privatemsg'], $form_state['storage']['fromfolder']);
 
   drupal_set_message(t('Messages deleted.'));
 
@@ -2074,14 +2084,14 @@ function _privatemsg_delete($id, $delete
 
   $result = db_query('SELECT author, recipient, folder 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) {
+  if ($message = db_fetch_array($result)) {
+    if ($message['author'] == $user->uid) {
       db_query('UPDATE {privatemsg} SET author_del = %d WHERE id = %d', $deleted_status, $id);
       $retval = 1;
     }
-    if ($message->recipient == $user->uid) {
+    if ($message['recipient'] == $user->uid) {
       db_query('UPDATE {privatemsg} SET recipient_del = %d WHERE id = %d', $deleted_status, $id);
-      $retval = $message->folder;
+      $retval = $message['folder'];
     }
     // Notify other modules that a message is deleted.
     privatemsg_invoke_privatemsg($message, 'delete');
@@ -2102,9 +2112,6 @@ function _privatemsg_get_new_messages($u
   return $cache[$uid];
 }
 
-/**
- * Implementation of hook_userpoints.
- */
 function privatemsg_userpoints($op, $new_points = 0, $uid = 0, $event = '') {
   switch ($op) {
     case 'setting':
@@ -2117,47 +2124,74 @@ function privatemsg_userpoints($op, $new
 }
 
 /**
- * Implementation of hook_simpletest.
+ * Implementation of hook_theme().
  */
-function privatemsg_simpletest() {
-  $dir = drupal_get_path('module', 'privatemsg') .'/tests';
-  $tests = file_scan_directory($dir, '\.test$');
-  return array_keys($tests);
+function privatemsg_theme() {
+  $themes = array();
+
+  $themes['privatemsg_view'] = array('arguments' => array(
+    'message' => array(),
+    'preview' => FALSE,
+    'prev' => 0,
+    'next' => 0,
+  ));
+  $themes['privatemsg_message_table'] = array('arguments' => array(
+    'form' => array(),
+  ));
+  $themes['privatemsg_contacts_table'] = array('arguments' => array(
+    'form' => array(),
+  ));
+  $themes['privatemsg_new_msg_header'] = array('arguments' => array(
+    'form' => array(),
+  ));
+  $themes['privatemsg_username'] = array('arguments' => array(
+    'user' => new stdClass(),
+  ));
+  $themes['privatemsg_links'] = array('arguments' => array(
+    'previous_link' => '',
+    'next_link' => '',
+  ));
+  $themes['privatemsg_block_inbox'] = array('arguments' => array(
+    'new' => FALSE,
+  ));
+
+  return $themes;
 }
 
 /**
  * @addtogroup theme_system
  *
- * Privatemsg module specific theme functions.
+ * Privatemsg module specific theme functions
  * @{
- */
+**/
 
 /**
- * Returns content to view a private message.
- *
- * @param message
- */
+ Returns content to view a private message
+
+ @param message
+**/
 function theme_privatemsg_view($message, $preview = FALSE, $prev = 0, $next = 0) {
+  drupal_add_css(drupal_get_path('module', 'privatemsg') .'/privatemsg.css');
   $option = variable_get('privatemsg_view_actions', '3');
   global $user;
-
+  $output = '';
   if ($option == '4') {
     $links = array();
-    if ($message->recipient == $user->uid) {
-      $author = user_load(array('uid' => $message->uid));
+    if ($message['recipient'] == $user->uid) {
+      $author = user_load(array('uid' => $message['uid']));
       if ($author->uid && $author->privatemsg_allow) {
-        $links['privatemsg_reply'] = array('title' => t('Reply to this message'), 'href' => 'privatemsg/reply/'. $message->id);
+        $links['privatemsg_reply'] = array('title' => t('Reply to this message'), 'href' => 'privatemsg/reply/'. $message['id']);
       }
       else {
         $links['privatemsg_noreply'] = array('title' => t('Sender does not accept replies'), 'href' => NULL);
       }
     }
-    if ($message->recipient == $user->uid || variable_get('privatemsg_sent_status', 1)) {
-      $links['privatemsg_delete'] = array('title' => t('Delete this message'), 'href' => 'privatemsg/delete/'. $message->id, 'attributes' => array('onclick' => "return confirm('". t('Are you sure you want to delete this message?') ."')"));
+    if ($message['recipient'] == $user->uid || variable_get('privatemsg_sent_status', 1)) {
+      $links['privatemsg_delete'] = array('title' => t('Delete this message'), 'href' => 'privatemsg/delete/'. $message['id'], 'attributes' => array('onclick' => "return confirm('". t('Are you sure you want to delete this message?') ."')"));
     }
 
-    $links['privatemsg_list'] = array('title' => t('List messages'), 'href' => ($message->recipient == $user->uid && $message->folder) ? 'privatemsg/list/'. $message->folder : 'privatemsg');
-    if ($message->id) {
+    $links['privatemsg_list'] = array('title' => t('List messages'), 'href' => ($message['recipient'] == $user->uid && $message['folder']) ? 'privatemsg/list/'. $message['folder'] : 'privatemsg');
+    if ($message['id']) {
       $link_display = '<div class="links">'. theme('links', $links) .'</div>';
     }
   }
@@ -2167,15 +2201,7 @@ function theme_privatemsg_view($message,
     $pm_from = $user->name;
   }
   else {
-    $pm_from = theme('privatemsg_username', $message);
-    if ($message->author != $user->uid) {
-      if (!privatemsg_user_blocked($message->author)) {
-        $pm_from .= t('<span class="pm-block-link">(<a href="!block-link">Block user</a>)</span>', array('!block-link' => url('privatemsg/block/'. $message->author, drupal_get_destination())));
-      }
-      else {
-        $pm_from .= t('<span class="pm-block-link">(<a href="!block-link">Unblock user</a>)</span>', array('!block-link' => url('privatemsg/block/'. $message->author, drupal_get_destination())));
-      }
-    }
+    $pm_from = theme('privatemsg_username', user_load(array('uid' => $message['author'])));
   }
   $rows[] = array(
     array('data' => t('From:'), 'class' => 'title-cell', 'nowrap' => 'nowrap'),
@@ -2184,10 +2210,10 @@ function theme_privatemsg_view($message,
 
   // To row.
   if ($preview) {
-    $pm_to = $message->recipient;
+    $pm_to = $message['recipient'];
   }
   else {
-    $pm_to = theme('privatemsg_username', user_load(array('uid' => $message->recipient)));
+    $pm_to = theme('privatemsg_username', user_load(array('uid' => $message['recipient'])));
   }
   $rows[] = array(
     array('data' => t('To:'), 'class' => 'title-cell', 'nowrap' => 'nowrap'),
@@ -2195,14 +2221,14 @@ function theme_privatemsg_view($message,
   );
 
   // Subject row.
-  $subject = check_plain($message->subject);
+  $subject = check_plain($message['subject']);
   $rows[] = array(
     array('data' => t('Subject:'), 'class' => 'title-cell', 'nowrap' => 'nowrap'),
     array('data' => $subject, 'class' => 'data-cell'),
   );
 
   // Date row.
-  $date = format_date($message->timestamp);
+  $date = format_date($message['timestamp']);
   $rows[] = array(
     array('data' => t('Date:'), 'class' => 'title-cell', 'nowrap' => 'nowrap'),
     array('data' => $date, 'class' => 'data-cell'),
@@ -2210,7 +2236,7 @@ function theme_privatemsg_view($message,
 
   // Message body.
   $body = '<div class="pm-body">'
-        . check_markup($message->message, $message->format, FALSE) .'</div>';
+        . check_markup($message['message'], $message['format'], FALSE) .'</div>';
 /*  $rows[] = array(
     array('data' => $body, 'class' => 'pm-body', 'colspan' => 5),
   );*/
@@ -2221,7 +2247,12 @@ function theme_privatemsg_view($message,
   if (!$preview && ($option == '1' || $option == '3')) {
     $output .= $form;
   }
-  $output .= theme('table', NULL, $rows, array('id' => 'message-'. $message->id, 'class' => 'pm-view-table'));
+  if (isset($message['id'])) {
+    $output .= theme('table', NULL, $rows, array('id' => 'message-'. $message['id'], 'class' => 'pm-view-table'));
+  }
+  else {
+    $output .= theme('table', NULL, $rows, array('id' => 'newmessage', 'class' => 'pm-view-table'));
+  }
   $output .= $body;
   if (!$preview && ($option == '2' || $option == '3')) {
     $output .= $form;
@@ -2258,7 +2289,7 @@ function theme_privatemsg_message_table(
   }
 
   if (count($rows) == 0) {
-    $rows[] = array(array('data' => t('No messages.'), 'colspan' => 5));
+    $rows[] = array(array('data' => t('No messages.'), 'colspan' => 4));
     $select_cell = NULL;
   }
   else {
@@ -2272,6 +2303,7 @@ function theme_privatemsg_message_table(
 }
 
 function theme_privatemsg_contacts_table($form) {
+  drupal_add_css(drupal_get_path('module', 'privatemsg') .'/privatemsg.css');
   $rows = array();
 
   foreach (element_children($form) as $key) {
@@ -2300,6 +2332,7 @@ function theme_privatemsg_contacts_table
 }
 
 function theme_privatemsg_new_msg_header($form) {
+  drupal_add_css(drupal_get_path('module', 'privatemsg') .'/privatemsg.css');
   $rows = array();
 
   $title = $form['recipient']['#title'] .':';
@@ -2345,7 +2378,7 @@ function theme_privatemsg_block_inbox($n
 
 /**  @} End of addtogroup theme_system
  *
- */
+**/
 
 /**
  * Return autocomplete results for usernames.
@@ -2364,8 +2397,8 @@ function privatemsg_autocomplete($string
     $result = db_query_range($sql, $search, 0, 10);
     $prefix = count($names) ? implode(', ', $names) .', ' : '';
     $matches = array();
-    while ($user = db_fetch_object($result)) {
-      $matches[$prefix . $user->name] = check_plain($user->name);
+    while ($user = db_fetch_array($result)) {
+      $matches[$prefix . $user['name']] = check_plain($user['name']);
     }
     print drupal_to_js($matches);
     exit();
@@ -2401,10 +2434,6 @@ function privatemsg_folder_access($uid, 
     return FALSE;
   }
 
-  if (intval($fid) == 0) {
-    return FALSE;
-  }
-
   // Check the database for the user ID of the folder.
   $owner = db_result(db_query("SELECT uid FROM {privatemsg_folder} WHERE fid = %d", $fid));
   if ($owner == $uid) {
@@ -2417,18 +2446,27 @@ function privatemsg_folder_access($uid, 
 function _privatemsg_prune() {
   // move deleted message older than 1 month to archive table, and optimize table
   $result = db_query('SELECT * FROM {privatemsg} WHERE author_del = 1 AND recipient_del = 1 AND timestamp < %d', time() - 3600*24*30);
-  while ($message = db_fetch_object($result)) {
-    db_query("INSERT INTO {privatemsg_archive} (id, author, recipient, subject, message, timestamp, hostname, format, folder, thread, type) VALUES (%d, %d, %d, '%s', '%s', %d, '%s', %d, %d, %d, '%s')", $message->id, $message->author, $message->recipient, $message->subject, $message->message, $message->timestamp, $message->hostname, $message->format, $message->folder, $message->thread, $message->type);
-    db_query('DELETE FROM {privatemsg} WHERE id = %d', $message->id);
+  while ($message = db_fetch_array($result)) {
+    /*$data = array(
+    'id' => $message['id'],
+    'author' => $message['author'],
+    'recipient' => $message['recipient'],
+    'subject' => $message['subject'],
+    'message' => $message['message'],
+    'timestamp' => $message['timestamp'],
+    'hostname' => $message['hostname'],
+    'format' => $message['format'],
+    'folder' => $message['folder'],
+    'thread' => $message['thread'],
+    'type' => $message['type'],
+    );*/
+    drupal_write_record('privatemsg_archive', $message);
+    //db_query("INSERT INTO {privatemsg_archive} (id, author, recipient, subject, message, timestamp, hostname, format, folder, thread, type) VALUES (%d, %d, %d, '%s', '%s', %d, '%s', %d, %d, %d, '%s')", $message['id'], $message['author'], $message['recipient'], $message['subject'], $message['message'], $message['timestamp'], $message['hostname'], $message['format'], $message['folder'], $message['thread'], $message['type']);
+    db_query('DELETE FROM {privatemsg} WHERE id = %d', $message['id']);
 
     // Notify other modules that a message is pruned.
     privatemsg_invoke_privatemsg($message, 'prune');
   }
-
-  // this is MySQL-specific
-  if (!strncmp($GLOBALS['db_type'], 'mysql', 5)) {
-    db_query('OPTIMIZE TABLE {privatemsg}');
-  }
 }
 
 /**
@@ -2466,12 +2504,133 @@ function privatemsg_load($message_id) {
     $params[] = $user->uid;
   }
   $result = db_query($sql, $params);
-  return db_fetch_object($result);
+  return db_fetch_array($result);
 }
 
-function _privatemsg_user_add_defaults(&$account) {
-  if (!isset($account->privatemsg_allow)) {
-    $account->privatemsg_allow = variable_get('privatemsg_default_allow', 1);
-    $account->privatemsg_setmessage_notify = variable_get('privatemsg_default_setmessage_notify', 1);
+/**
+ * Provides a callback function for a special permission type of privatemsg.
+ */
+function privatemsg_special_access1() {
+  global $user;
+  return !$user->uid || user_access('access private messages');
+}
+
+/**
+ * Provides a callback function for a special permission type of privatemsg.
+ */
+function privatemsg_special_access2() {
+  global $user;
+  return user_access('access private messages') && $user->uid;
+}
+
+/**
+ * Provides a callback function for a special permission type of privatemsg.
+ */
+function privatemsg_special_access3() {
+  global $user;
+  return user_access('create new folder') && $user->uid;
+}
+
+/**
+ * Provides a callback function for a special permission type of privatemsg.
+ */
+function privatemsg_special_access4() {
+  global $user;
+  if (arg(0) == 'user' && arg(2) == 'privatemsg' && is_numeric(arg(1))) {
+    if ($user->uid == arg(1)) {
+      return $user->privatemsg_allow;
+    }
+    else if (user_access('administer private messages')) {
+      $account = user_load(array('uid' => arg(1)));
+      return $account->privatemsg_allow;
+    }
+  }
+  return false;
+}
+
+/**
+ * Provides a callback function for a special permission type of privatemsg.
+ */
+function privatemsg_special_access5() {
+  global $user;
+  return arg(0) == 'privatemsg' && is_numeric(arg(1)) && ($user->uid == arg(1) || user_access('administer private messages'));
+}
+
+/**
+ * Provides a callback function for a special permission type of privatemsg.
+ */
+function privatemsg_special_access6($account) {
+  global $user;
+  return ($user->uid == $account->uid || user_access('administer private messages')) && $account->privatemsg_allow;
+}
+
+/**
+ * Tests, whether the user has the right to manipulate the given folder.
+ */
+function privatemsg_administer_folder_permission($fid) {
+  global $user;
+  return privatemsg_folder_access($user->uid, $fid) && user_access('administer private messages');
+}
+
+/**
+ * Function that just returns true. (For access control.)
+ */
+function privatemsg_return_true() {
+  return true;
+}
+
+/**
+ * Function that determines the title for the /block site.
+ */
+function privatemsg_get_block_title($account) {
+  $title = t(privatemsg_user_blocked($account->uid) ? 'Unblock @user' : 'Block @user');
+  return str_replace('@user', $account->name, $title);
+}
+
+/**
+ * Callback for the /block site.
+ */
+function privatemsg_get_block_form($account) {
+  return drupal_get_form(privatemsg_user_blocked($account->uid) ? 'privatemsg_unblock_user_form' : 'privatemsg_block_user_form', $account);
+}
+
+/**
+ * Returns the title for the inbox site.
+ */
+function privatemsg_get_inbox_title() {
+  global $user;
+
+  $new = _privatemsg_get_new_messages();
+
+  if ($new && strncmp($_GET['q'], 'privatemsg', 10) && property_exists($user, 'privatemsg_setmessage_notify') &&
+      $user->privatemsg_setmessage_notify && user_access('access private messages')) {
+    $m = drupal_set_message();
+    if (empty($m)) {
+      drupal_set_message(strtr(
+        format_plural($new,
+          'You have a new <a href="!url">private message</a>.',
+          'You have @count new <a href="!url">private messages</a>.'),
+        array('!url' => url('privatemsg'))));
+    }
   }
+
+  return variable_get('privatemsg_menu_link', 'My inbox') . ($new ? ' ('. $new .')' : '');
+}
+
+/**
+ * Returns the title for the privatemsg main site.
+ */
+function privatemsg_get_title($account) {
+  global $user;
+  if ($user->uid == $account->uid) {
+    return 'Private messages';
+  }
+  return 'Private messages for ' . $account->name;
+}
+
+/**
+ * Cancels from 'reply'.
+ */
+function privatemsg_cancel_reply($msgid) {
+  return drupal_goto('privatemsg/view/' . $msgid);
 }
