Index: config/main.inc.php.dist
===================================================================
--- config/main.inc.php.dist	(revision 3352)
+++ config/main.inc.php.dist	(working copy)
@@ -421,6 +421,15 @@
 // default setting if preview pane is enabled
 $rcmail_config['preview_pane'] = false;
 
+// Preview pane mark as read
+$rcmail_config['preview_pane_mark_read'] = true;
+
+// Preview pane mark as read delay (seconds)
+$rcmail_config['preview_pane_mark_read_delay'] = 0;
+
+// Message display mark as read
+$rcmail_config['message_view_mark_read'] = true;
+
 // focus new window if new message arrives
 $rcmail_config['focus_on_new_message'] = true;
 
Index: program/include/rcube_config.php
===================================================================
--- program/include/rcube_config.php	(revision 3352)
+++ program/include/rcube_config.php	(working copy)
@@ -80,6 +80,11 @@
       foreach ($this->prop['default_imap_folders'] as $n => $folder)
         $this->prop['default_imap_folders'][$n] = rcube_charset_convert($folder, RCMAIL_CHARSET, 'UTF7-IMAP');
 
+    // fix default mark as read behaviour
+    if (!isset($this->prop['preview_pane_mark_read'])) $this->prop['preview_pane_mark_read'] = TRUE;
+    if (!isset($this->prop['preview_pane_mark_read_delay'])) $this->prop['preview_pane_mark_read_delay'] = 0;
+    if (!isset($this->prop['message_view_mark_read'])) $this->prop['message_view_mark_read'] = TRUE;
+
     // set PHP error logging according to config
     if ($this->prop['debug_level'] & 1) {
       ini_set('log_errors', 1);
Index: program/localization/en_GB/labels.inc
===================================================================
--- program/localization/en_GB/labels.inc	(revision 3352)
+++ program/localization/en_GB/labels.inc	(working copy)
@@ -310,4 +310,9 @@
 $labels['korean'] = 'Korean'; 
 $labels['chinese'] = 'Chinese';
 
+$labels['previewpanemarkread']  = 'Mark previewed messages as read';
+$labels['previewpanemarkreaddelay']  = 'Delay before marking messages as read';
+$labels['messageviewmarkread']  = 'Mark opened messages as read';
+$labels['everynseconds']  = '$n second(s)';
+
 ?>
Index: program/localization/en_US/labels.inc
===================================================================
--- program/localization/en_US/labels.inc	(revision 3352)
+++ program/localization/en_US/labels.inc	(working copy)
@@ -370,4 +370,9 @@
 $labels['korean'] = 'Korean';
 $labels['chinese'] = 'Chinese';
 
+$labels['previewpanemarkread']  = 'Mark previewed messages as read';
+$labels['previewpanemarkreaddelay']  = 'Delay before marking messages as read';
+$labels['messageviewmarkread']  = 'Mark opened messages as read';
+$labels['everynseconds']  = '$n second(s)';
+
 ?>
Index: program/js/app.js
===================================================================
--- program/js/app.js	(revision 3352)
+++ program/js/app.js	(working copy)
@@ -1285,6 +1285,9 @@
     if (this.preview_timer)
       clearTimeout(this.preview_timer);
     
+    if (this.preview_read_timer)
+      clearTimeout(this.preview_read_timer);
+
     // save folderlist and folders location/sizes for droptarget calculation in drag_move()
     if (this.gui_objects.folderlist && model)
       {
@@ -1450,6 +1453,9 @@
     if (this.preview_timer)
       clearTimeout(this.preview_timer);
 
+    if (this.preview_read_timer)
+      clearTimeout(this.preview_read_timer);
+
     var selected = list.selection.length==1;
 
     // Hide certain command buttons when Drafts folder is selected
@@ -1477,6 +1483,9 @@
       if (this.preview_timer)
         clearTimeout(this.preview_timer);
 
+      if (this.preview_read_timer)
+        clearTimeout(this.preview_read_timer);
+
     var uid = list.get_single_selection();
     if (uid && this.env.mailbox == this.env.drafts_mailbox)
       this.goto_url('compose', '_draft_uid='+uid+'&_mbox='+urlencode(this.env.mailbox), true);
@@ -1551,14 +1560,17 @@
       target.location.href = this.env.comm_path+url;
 
       // mark as read and change mbox unread counter
-      if (action == 'preview' && this.message_list && this.message_list.rows[id] && this.message_list.rows[id].unread)
+      if (action == 'preview' && this.message_list && this.message_list.rows[id] && this.message_list.rows[id].unread && this.env.preview_pane_mark_read)
         {
-        this.set_message(id, 'unread', false);
-        if (this.env.unread_counts[this.env.mailbox])
+          this.preview_read_timer = window.setTimeout(function(rcmail){
+          ref.set_message(id, 'unread', false);
+          if (ref.env.unread_counts[ref.env.mailbox])
           {
-          this.env.unread_counts[this.env.mailbox] -= 1;
-          this.set_unread_count(this.env.mailbox, this.env.unread_counts[this.env.mailbox], this.env.mailbox == 'INBOX');
+            ref.env.unread_counts[ref.env.mailbox] -= 1;
+            ref.set_unread_count(ref.env.mailbox, ref.env.unread_counts[ref.env.mailbox], ref.env.mailbox == 'INBOX');
           }
+          if (ref.env.preview_pane_mark_read_delay > 0) ref.toggle_read_status('read', Array(id));
+          }, this.env.preview_pane_mark_read_delay * 1000);
         }
       }
     };
@@ -4057,6 +4069,24 @@
       addrbook_show_images.disabled = !checkbox.checked;
     }
 
+  this.toggle_preview_pane = function(checkbox)
+    {
+    var preview_pane_mark_read;
+    if (preview_pane_mark_read = document.getElementById('rcmfd_preview_pane_mark_read'))
+      preview_pane_mark_read.disabled = !checkbox.checked;
+
+    var preview_pane_mark_read_delay;
+    if ((preview_pane_mark_read_delay = document.getElementById('rcmfd_preview_pane_mark_read_delay')) && (preview_pane_mark_read.checked || !checkbox.checked))
+      preview_pane_mark_read_delay.disabled = !checkbox.checked;
+    }
+
+  this.toggle_preview_read = function(checkbox)
+    {
+    var preview_pane_mark_read_delay;
+    if (preview_pane_mark_read_delay = document.getElementById('rcmfd_preview_pane_mark_read_delay'))
+      preview_pane_mark_read_delay.disabled = !checkbox.checked;
+    }
+
   // display fetched raw headers
   this.set_headers = function(content)
   {
Index: program/steps/settings/func.inc
===================================================================
--- program/steps/settings/func.inc	(revision 3352)
+++ program/steps/settings/func.inc	(working copy)
@@ -290,7 +290,8 @@
     // show config parameter for preview pane
     if (!isset($no_override['preview_pane'])) {
       $field_id = 'rcmfd_preview';
-      $input_preview = new html_checkbox(array('name' => '_preview_pane', 'id' => $field_id, 'value' => 1));
+      $input_preview = new html_checkbox(array('name' => '_preview_pane', 'id' => $field_id, 'value' => 1,
+        'onchange' => JS_OBJECT_NAME.'.toggle_preview_pane(this)'));
 
       $blocks['main']['options']['preview_pane'] = array(
         'title' => html::label($field_id, Q(rcube_label('previewpane'))),
@@ -298,6 +299,34 @@
       );
     }
 
+    // show config parameter for preview pane auto mark as read
+    if (!isset($no_override['preview_pane_mark_read'])) {
+      $field_id = 'rcmfd_preview_pane_mark_read';
+      $input_preview = new html_checkbox(array('name' => '_preview_pane_mark_read', 'id' => $field_id,
+        'value' => 1,  'disabled' => $config['preview_pane']?0:1, 'onchange' => JS_OBJECT_NAME.'.toggle_preview_read(this)'));
+
+      $blocks['main']['options']['preview_pane_mark_read'] = array(
+        'title' => html::label($field_id, Q(rcube_label('previewpanemarkread'))),
+        'content' => $input_preview->show($config['preview_pane_mark_read']?1:0),
+      );
+    }
+
+    // show config parameter for preview pane auto mark as read delay
+    if (!isset($no_override['preview_pane_mark_read_delay'])) {
+      $field_id = 'rcmfd_preview_pane_mark_read_delay';
+      $select_delay = new html_select(array('name' => '_preview_pane_mark_read_delay', 'id' => $field_id,
+        'disabled' => $config['preview_pane_mark_read']?0:1));
+
+      foreach(array(0, 5, 10, 20, 30, 60) as $sec)
+        $select_delay->add(rcube_label(array('name' => 'everynseconds', 'vars' => array('n' => $sec))), $sec);
+
+      $blocks['main']['options']['preview_pane_mark_read_delay'] = array(
+        'advanced' => true,
+        'title' => html::label($field_id, Q(rcube_label('previewpanemarkreaddelay'))),
+        'content' => $select_delay->show($config['preview_pane_mark_read_delay']),
+      );
+    }
+
     if (!isset($no_override['mdn_requests'])) {
       $field_id = 'rcmfd_mdn_requests';
       $select_mdn_requests = new html_select(array('name' => '_mdn_requests', 'id' => $field_id));
@@ -356,6 +385,17 @@
       'main' => array('name' => Q(rcube_label('mainoptions'))),
     );
 
+    // show config parameter for message view auto mark as read
+    if (!isset($no_override['message_view_mark_read'])) {
+      $field_id = 'rcmfd_message_view_mark_read';
+      $input_mark = new html_checkbox(array('name' => '_message_view_mark_read', 'id' => $field_id, 'value' => 1));
+
+      $blocks['main']['options']['message_view_mark_read'] = array(
+        'title' => html::label($field_id, Q(rcube_label('messageviewmarkread'))),
+        'content' => $input_mark->show($config['message_view_mark_read']?1:0),
+      );
+    }
+
     // show checkbox for HTML/plaintext messages
     if (!isset($no_override['prefer_html'])) {
       $field_id = 'rcmfd_htmlmsg';
Index: program/steps/settings/save_prefs.inc
===================================================================
--- program/steps/settings/save_prefs.inc	(revision 3352)
+++ program/steps/settings/save_prefs.inc	(working copy)
@@ -42,6 +42,8 @@
     $a_user_prefs = array(
       'focus_on_new_message' => isset($_POST['_focus_on_new_message']) ? TRUE : FALSE,
       'preview_pane' 	     => isset($_POST['_preview_pane']) ? TRUE : FALSE,
+      'preview_pane_mark_read' => isset($_POST['_preview_pane_mark_read']) ? TRUE : FALSE,
+      'preview_pane_mark_read_delay' => is_numeric($_POST['_preview_pane_mark_read_delay']) ? intval($_POST['_preview_pane_mark_read_delay']) : $CONFIG['preview_pane_mark_read_delay'],
       'mdn_requests'         => isset($_POST['_mdn_requests']) ? intval($_POST['_mdn_requests']) : 0,
       'keep_alive'           => isset($_POST['_keep_alive']) ? intval($_POST['_keep_alive'])*60 : $CONFIG['keep_alive'],
       'check_all_folders'    => isset($_POST['_check_all_folders']) ? TRUE : FALSE,
@@ -50,6 +52,7 @@
   break;
   case 'mailview':
     $a_user_prefs = array(
+      'message_view_mark_read' => isset($_POST['_message_view_mark_read']) ? TRUE : FALSE,
       'prefer_html'     => isset($_POST['_prefer_html']) ? TRUE : FALSE,
       'inline_images'   => isset($_POST['_inline_images']) ? TRUE : FALSE,
       'show_images'     => isset($_POST['_show_images']) ? intval($_POST['_show_images']) : 0,
Index: program/steps/mail/show.inc
===================================================================
--- program/steps/mail/show.inc	(revision 3352)
+++ program/steps/mail/show.inc	(working copy)
@@ -140,7 +140,7 @@
       $OUTPUT->set_env('last_uid', $last);
     }
 
-  if (!$MESSAGE->headers->seen)
+  if (!$MESSAGE->headers->seen && (($RCMAIL->action == 'preview' && $CONFIG['preview_pane_mark_read'] && $CONFIG['preview_pane_mark_read_delay'] == 0) || ($RCMAIL->action == 'show' && $CONFIG['message_view_mark_read'])))
     $RCMAIL->plugins->exec_hook('message_read', array('uid' => $MESSAGE->uid,
       'mailbox' => $IMAP->mailbox, 'message' => $MESSAGE));
 }
@@ -226,7 +226,7 @@
 
 
 // mark message as read
-if ($MESSAGE && $MESSAGE->headers && !$MESSAGE->headers->seen)
+if ($MESSAGE && $MESSAGE->headers && !$MESSAGE->headers->seen && (($RCMAIL->action == 'preview' && $CONFIG['preview_pane_mark_read'] && $CONFIG['preview_pane_mark_read_delay'] == 0) || ($RCMAIL->action == 'show' && $CONFIG['message_view_mark_read'])))
   $IMAP->set_flag($MESSAGE->uid, 'SEEN');
 
 exit;
Index: program/steps/mail/func.inc
===================================================================
--- program/steps/mail/func.inc	(revision 3352)
+++ program/steps/mail/func.inc	(working copy)
@@ -105,6 +105,11 @@
   if ($CONFIG['display_next'])
     $OUTPUT->set_env('display_next', true);
 	  
+  if ($CONFIG['preview_pane_mark_read'])
+    $OUTPUT->set_env('preview_pane_mark_read', true);
+  if ($CONFIG['preview_pane_mark_read_delay'])
+    $OUTPUT->set_env('preview_pane_mark_read_delay', $CONFIG['preview_pane_mark_read_delay']);
+
   if ($CONFIG['trash_mbox'])
     $OUTPUT->set_env('trash_mailbox', $CONFIG['trash_mbox']);
   if ($CONFIG['drafts_mbox'])
Index: program/steps/mail/compose.inc
===================================================================
--- program/steps/mail/compose.inc	(revision 3352)
+++ program/steps/mail/compose.inc	(working copy)
@@ -140,6 +140,10 @@
   $CONFIG['prefer_html'] = $CONFIG['prefer_html'] || $CONFIG['htmleditor'] || $compose_mode == RCUBE_COMPOSE_DRAFT || $compose_mode == RCUBE_COMPOSE_EDIT;
   $MESSAGE = new rcube_message($msg_uid);
   
+  // make sure message is marked as read
+  if ($MESSAGE && $MESSAGE->headers && !$MESSAGE->headers->seen)
+    $IMAP->set_flag($msg_uid, 'SEEN');
+
   if (!empty($MESSAGE->headers->charset))
     $IMAP->set_charset($MESSAGE->headers->charset);
     
