diff -Naur privatemsg-orig/privatemsg_limitroles/privatemsg_limitroles.info privatemsg/privatemsg_limitroles/privatemsg_limitroles.info
--- privatemsg-orig/privatemsg_limitroles/privatemsg_limitroles.info	1970-01-01 01:00:00.000000000 +0100
+++ privatemsg/privatemsg_limitroles/privatemsg_limitroles.info	2010-10-05 14:08:37.000000000 +0200
@@ -0,0 +1,6 @@
+; $Id$
+name = Privatemsg limit roles
+description = Allows to limit sending messages from/to role members.
+package = Mail
+core = 6.x
+dependencies[] = privatemsg
diff -Naur privatemsg-orig/privatemsg_limitroles/privatemsg_limitroles.install privatemsg/privatemsg_limitroles/privatemsg_limitroles.install
--- privatemsg-orig/privatemsg_limitroles/privatemsg_limitroles.install	1970-01-01 01:00:00.000000000 +0100
+++ privatemsg/privatemsg_limitroles/privatemsg_limitroles.install	2010-10-06 19:02:24.000000000 +0200
@@ -0,0 +1,17 @@
+<?php
+
+/**
+ * @file
+ * Allows to limit sending messages from/to role members.
+ *
+ * @author
+ * Boobaa - http://drupal.org/user/199303
+ */
+
+/**
+ * Implementation of hook_uninstall().
+ */
+function privatemsg_limitroles_uninstall() {
+  variable_del('privatemsg_limitroles');
+}
+
diff -Naur privatemsg-orig/privatemsg_limitroles/privatemsg_limitroles.module privatemsg/privatemsg_limitroles/privatemsg_limitroles.module
--- privatemsg-orig/privatemsg_limitroles/privatemsg_limitroles.module	1970-01-01 01:00:00.000000000 +0100
+++ privatemsg/privatemsg_limitroles/privatemsg_limitroles.module	2010-10-06 19:07:46.000000000 +0200
@@ -0,0 +1,165 @@
+<?php
+// $Id$
+
+/**
+ * @file
+ * Allows to limit sending messages from/to role members.
+ *
+ * @author
+ * Boobaa - http://drupal.org/user/199303
+ */
+
+/**
+ * Implementation of hook_menu().
+ */
+function privatemsg_limitroles_menu() {
+  $items = array();
+  $items['admin/settings/messages/limitroles'] = array(
+    'title' => 'Limit roles',
+    'description' => 'Configure limit roles settings.',
+    'page callback' => 'drupal_get_form',
+    'page arguments' => array('privatemsg_limitroles_form_settings'),
+    'access arguments' => array('administer privatemsg settings'),
+    'type' => MENU_LOCAL_TASK,
+  );
+  return $items;
+}
+
+/**
+ * Build the settings form.
+ */
+function privatemsg_limitroles_form_settings() {
+  $defaults = variable_get('privatemsg_limitroles', array(array()));
+  $roles_from = user_roles();
+  $roles_to = user_roles(TRUE);
+  $form['privatemsg_limitroles']['#tree'] = TRUE;
+  foreach ($roles_from as $rid_from => $role_from) {
+    $form['#privatemsg_limitroles'][$rid_from] = $role_from;
+    foreach ($roles_to as $rid_to => $role_to) {
+      $form['privatemsg_limitroles'][$rid_from][$rid_to] = array(
+        '#type' => 'checkbox',
+        '#default_value' => !empty($defaults[$rid_from][$rid_to]),
+      );
+    }
+  }
+  $form['buttons']['submit'] = array(
+    '#type' => 'submit',
+    '#value' => t('Save'),
+  );
+  return $form;
+}
+
+/**
+ * Store settings to DB.
+ */
+function privatemsg_limitroles_form_settings_submit($form, &$form_state) {
+  foreach ($form_state['values']['privatemsg_limitroles'] as $rid_from => $values_from) {
+    $form_state['values']['privatemsg_limitroles'][$rid_from] = array_filter($values_from);
+  }
+  $form_state['values']['privatemsg_limitroles'] = array_filter($form_state['values']['privatemsg_limitroles']);
+  variable_set('privatemsg_limitroles', $form_state['values']['privatemsg_limitroles']);
+}
+
+/**
+ * Implementation of hook_theme().
+ */
+function privatemsg_limitroles_theme() {
+  return array(
+    'privatemsg_limitroles_form_settings' => array(
+      'arguments' => array('form' => array()),
+    ),
+  );
+}
+
+/**
+ * Theme function for settings form.
+ */
+function theme_privatemsg_limitroles_form_settings($form) {
+  $header = array(0 => FALSE);
+  $rows = array();
+  foreach (element_children($form['privatemsg_limitroles']) as $rid_from) {
+    $rows[$rid_from] = array(check_plain($form['#privatemsg_limitroles'][$rid_from]));
+    foreach (element_children($form['privatemsg_limitroles'][$rid_from]) as $rid_to) {
+      $header[$rid_to] = check_plain($form['#privatemsg_limitroles'][$rid_to]);
+      $rows[$rid_from][$rid_to] = drupal_render($form['privatemsg_limitroles'][$rid_from][$rid_to]);
+    }
+  }
+  return theme('table', $header, $rows) . drupal_render($form);
+}
+
+/**
+ * Implements hook_privatemsg_name_lookup().
+ */
+function privatemsg_limitroles_privatemsg_name_lookup($string) {
+  // This is something that get coded, but does not seem to prohibit sending
+  // messages to the prohibited accounts. TODO: Hooking into
+  // _privatemsg_parse_userstring() seems to be the best approach to follow,
+  // but it's way too much easier by utilizing some form_alter() magic.
+  $roles = _privatemsg_limitroles_may_send_to();
+  $result = db_query("SELECT * FROM {users} u INNER JOIN {users_roles} ur ON (ur.uid = u.uid) WHERE name = '%s' AND ur.rid IN (%s)", $string, implode(',', $roles));
+  if ($account = db_fetch_object($result)) {
+    return $account;
+  }
+  return FALSE;
+}
+
+/**
+ * Implementation of hook_privatemsg_sql_autocomplete_alter().
+ */
+function privatemsg_limitroles_privatemsg_sql_autocomplete_alter(&$fragments, $search, $names) {
+  $roles = _privatemsg_limitroles_may_send_to();
+  $fragments['inner_join'][] = 'INNER JOIN {users_roles} ur ON (ur.uid = u.uid)';
+  $fragments['where'][] = 'ur.rid IN (%s)';
+  $fragments['query_args']['where'][] = implode(',', $roles);
+}
+
+function _privatemsg_limitroles_may_send_to() {
+  $settings = variable_get('privatemsg_limitroles', array(array()));
+  global $user;
+  $roles = array(0 => 0);
+  foreach ($user->roles as $rid => $role) {
+    if (!is_array($settings[$rid])) {
+      continue;
+    }
+    foreach ($settings[$rid] as $rid_to => $value) {
+      $roles[$rid_to] = $rid_to;
+    }
+  }
+  return $roles;
+}
+
+/**
+ * Implementation of hook_form_FORM_ID_alter().
+ */
+function privatemsg_limitroles_form_privatemsg_new_alter(&$form, $form_state) {
+  global $user;
+  // Allow uid=1 to send private messages to anyone.
+  if ($user->uid != 1) {
+    $form['recipient']['#element_validate'][] = 'privatemsg_limitroles_form_privatemsg_new_alter_recipient_validate';
+  }
+}
+
+/**
+ * Additional validate callback for privatemsg recipient names.
+ */
+function privatemsg_limitroles_form_privatemsg_new_alter_recipient_validate($element, &$form_state) {
+  $usernames = drupal_explode_tags($element['#value']);
+  if (!empty($usernames)) {
+    $roles = _privatemsg_limitroles_may_send_to();
+    foreach ($usernames as $username) {
+      if ($account = user_load(array('name' => $username))) {
+        $allowed = FALSE;
+        foreach ($account->roles as $rid => $role) {
+          if (isset($roles[$rid])) {
+            $allowed = TRUE;
+            break;
+          }
+        }
+        if (!$allowed) {
+          form_set_error('recipient', t('Sending message to !name is not allowed.', array('!name' => theme('username', $account))));
+        }
+      }
+    }
+  }
+}
+
