Index: privatemsg.module
===================================================================
RCS file: /cvs/drupal/contributions/modules/privatemsg/privatemsg.module,v
retrieving revision 1.158
diff -u -p -r1.158 privatemsg.module
--- privatemsg.module	27 Dec 2010 09:33:03 -0000	1.158
+++ privatemsg.module	2 Jan 2011 11:26:23 -0000
@@ -719,6 +719,7 @@ function template_preprocess_privatemsg_
 
   $message = $vars['message'];
   $vars['mid'] = isset($message['mid']) ? $message['mid'] : NULL;
+  $vars['classes'] = $message['classes'];
   $vars['thread_id'] = isset($message['thread_id']) ? $message['thread_id'] : NULL;
   $vars['author_picture'] = theme('user_picture', $message['author']);
   // Directly address the current user if he is the author.
Index: privatemsg.pages.inc
===================================================================
RCS file: /cvs/drupal/contributions/modules/privatemsg/privatemsg.pages.inc,v
retrieving revision 1.24
diff -u -p -r1.24 privatemsg.pages.inc
--- privatemsg.pages.inc	27 Dec 2010 09:33:03 -0000	1.24
+++ privatemsg.pages.inc	2 Jan 2011 11:26:23 -0000
@@ -145,11 +145,24 @@ function privatemsg_view($thread) {
 
   // Render the messages.
   $output = '';
+  $i = 1;
+  $count = count($thread['messages']);
   foreach ($thread['messages'] as $pmid => $message) {
-    // Set message as read and theme it.
+    // Add CSS classes.
+    $message['classes'] = array('privatemsg-message', 'privatemsg-message-' . $i, $i % 2 == 1 ? 'privatemsg-message-even' : 'privatemsg-message-odd');
     if (!empty($message['is_new'])) {
+      // Mark message as read.
       privatemsg_message_change_status($pmid, PRIVATEMSG_READ, $thread['user']);
+      $message['classes'][] = 'privatemsg-message-new';
     }
+
+    if ($i == 1) {
+      $message['classes'][] = 'privatemsg-message-first';
+    }
+    if ($i == $count) {
+      $message['classes'][] = 'privatemsg-message-last';
+    }
+    $i++;
     $output .= theme('privatemsg_view', $message);
   }
   $content['messages']['#value'] = $output;
@@ -497,6 +510,7 @@ function privatemsg_new_submit($form, &$
 function privatemsg_new_preview($form, &$form_state) {
   drupal_validate_form($form['form_id']['#value'], $form, $form_state);
   if (!form_get_errors()) {
+    $form_state['validate_built_message']['classes'] = array('privatemsg-message', 'privatemsg-message-preview');
     $form_state['privatemsg_preview'] = theme('privatemsg_view', $form_state['validate_built_message']);
   }
   $form_state['rebuild'] = TRUE; // this forces our form to be rebuilt instead of being submitted.
Index: privatemsg-view.tpl.php
===================================================================
RCS file: /cvs/drupal/contributions/modules/privatemsg/privatemsg-view.tpl.php,v
retrieving revision 1.9
diff -u -p -r1.9 privatemsg-view.tpl.php
--- privatemsg-view.tpl.php	27 Oct 2010 14:40:59 -0000	1.9
+++ privatemsg-view.tpl.php	2 Jan 2011 11:26:23 -0000
@@ -5,7 +5,7 @@
 drupal_add_css(drupal_get_path('module', 'privatemsg') . '/styles/privatemsg-view.css');
 ?>
 <?php print $anchors; ?>
-<div class="privatemsg-message<?php echo isset($new) ? ' privatemsg-message-new' : '' ?>" id="privatemsg-mid-<?php print $mid; ?>">
+<div class="<?php echo implode(' ', $classes); ?>" id="privatemsg-mid-<?php print $mid; ?>">
   <div class="privatemsg-author-avatar">
     <?php print $author_picture; ?>
   </div>
