Index: Z:/rml/sites/all/modules/contrib/messaging/messaging.module
===================================================================
--- Z:/rml/sites/all/modules/contrib/messaging/messaging.module	(revision 5526)
+++ Z:/rml/sites/all/modules/contrib/messaging/messaging.module	(revision 14801)
@@ -1283,3 +1283,99 @@
   $account = messaging_user_object($account);
   return $html ? theme('username', $account) : check_plain($account->name);
 }
+
+/**
+ * MJY 2011-11-11 : adapted version of messaging_admin_message_form_submit from version 2, taking tpid into account
+ * Process and save message parts, retaining tpid
+ */
+function messaging_admin_message_form_submit($form, &$form_state) {
+  $group = $form_state['values']['group'];
+  foreach ($form_state['values']['messages'] as $key => $messages) {
+    foreach ($messages as $method => $language_arr) {
+      foreach ($language_arr as $language => $text) {
+        $result = db_query("SELECT tpid FROM {messaging_message_parts} WHERE type = '%s' AND msgkey = '%s' AND method = '%s' AND language = '%s'", $group, $key, $method, $language);
+          while($row = db_fetch_array($result))
+           $tpid = $row['tpid'];
+           $module = $row['module'];
+          db_query("DELETE FROM {messaging_message_parts} WHERE type = '%s' AND msgkey = '%s' AND method = '%s' AND language = '%s'", $group, $key, $method, $language);
+          if (trim($text)) {
+             db_query("INSERT INTO {messaging_message_parts} (type, msgkey, method, module, message, tpid, language) VALUES('%s', '%s', '%s', '%s', '%s', '%d' '%s')", $group, $key, $method, $modlue, $text, $tpid, $language);
+          }
+       }
+    }
+  }
+  drupal_set_message('The message templates have been updated');
+}
+
+
+// patch from http://drupal.org/node/800614
+
+/**
+ * Implementation of hook_features_api().
+ */
+function messaging_features_api() {
+  return array(
+    'messaging' => array(
+      'name' => t('Messaging'),
+      'default_hook' => 'messaging_features_store',
+    ),
+  );
+}
+
+/**
+ * Implementation of hook_features_export_options().
+ */
+function messaging_features_export_options() {
+  $rs = db_query('SELECT type, msgkey, method, language FROM {messaging_message_parts} ORDER BY type, method, msgkey, language');
+  while ($row = db_fetch_array($rs)) {
+    $key = implode('::', $row);
+    $options[$key] = $key;
+  }
+  return $options;
+}
+
+/**
+ * Implementation of hook_features_export().
+ */
+function messaging_features_export($data, &$export, $module_name = '') {
+  foreach ($data as $preset) {
+    $export['features']['messaging'][$preset] = $preset;
+  }
+}
+
+/**
+ * Implementation of hook_features_export_render().
+ */
+function messaging_features_export_render($module_name = 'messaging', $data) {
+  foreach ($data as $key) {
+    $args = explode('::', $key);
+    $message = db_result(db_query("SELECT message FROM {messaging_message_parts} WHERE type = '%s' AND msgkey = '%s' AND method = '%s' AND language = '%s'", $args));
+    $presets[$key] = $message;
+  }
+  $code = "  \$message_parts = ". features_var_export($presets, '  ') .";\n";
+  $code .= '  return $message_parts;';
+  return array('messaging_features_store' => $code);
+}
+
+/**
+ * Implementation of hook_features_revert().
+ */
+function messaging_features_revert($module = 'messaging') {
+  module_load_include('inc', 'messaging', 'messaging.admin');
+  $defaults = module_invoke($module, 'messaging_features_store');
+  if (empty($defaults)) {
+    return;
+  }
+  $settings = array();
+  foreach ($defaults as $key => $message) {
+    list($type, $msgkey, $method, $language) = explode('::', $key);
+    $settings[$type][$msgkey][$method][$language] = $message;
+  }
+  foreach ($settings as $group => $messages) {
+    $form_values = array(
+      'values' => array(
+        'group' => $group,
+        'messages' => $messages,
+      ),
+    );
+    messaging_admin_message_form_submit(array(), $form_values);
+  }
+}
\ No newline at end of file