diff --git a/tamauth.admin.inc b/tamauth.admin.inc
index bbafb3e..1ee0ba8 100644
--- a/tamauth.admin.inc
+++ b/tamauth.admin.inc
@@ -10,18 +10,19 @@ define('TAM_HEADER_FIELD_MAPPING_PATTERN', '/(.+)=(.+)/');
  * Page callback for admin/config/tamauth.
  */
 function tamauth_settings_form($form, $form_state) {
-  $mappings = tamauth_field_mappings();
-  $mappings_text = '';
-
-  foreach ($mappings as $tam_header => $drupal_field_name) {
-    $mappings_text .= $tam_header . '=' . $drupal_field_name . "\n";
-  }
 
   $form['tam_field_mappings'] = array(
     '#title' => t('Header / Field Mappings'),
     '#type' => 'textarea',
     '#description' => t('Enter your header to field mappings, one per line in the format:') . '<br />' . t('TAM_HEADER=drupal_field_name'),
-    '#default_value' => $mappings_text,
+    '#default_value' => tamauth_settings_get_mapping(tamauth_field_mappings()),
+  );
+
+  $form['tamauth_map_roles'] = array(
+    '#title' => t('Header / Roles Mappings'),
+    '#description' => t('Enter your header to roles mappings'),
+    '#type' => 'textarea',
+    '#default_value' => tamauth_settings_get_mapping(tamauth_role_mappings()),
   );
 
   $form['actions'] = array(
@@ -38,6 +39,18 @@ function tamauth_settings_form($form, $form_state) {
 }
 
 /**
+ * Helper function to get mapping array as text.
+ */
+
+function tamauth_settings_get_mapping($mappings) {
+  $mappings_text = '';
+  foreach ($mappings as $tam_header => $drupal_name) {
+    $mappings_text .= $tam_header . '=' . $drupal_name . "\n";
+  }
+  return $mappings_text;
+}
+
+/**
  * Validate handler for tamauth_settings_form.
  */
 function tamauth_settings_form_validate($form, $form_state) {
@@ -45,18 +58,32 @@ function tamauth_settings_form_validate($form, $form_state) {
   if (!empty($mappings) && !preg_match(TAM_HEADER_FIELD_MAPPING_PATTERN, $mappings)) {
     form_set_error('tam_field_mappings', t('Header / Field Mappings invalid'));
   }
+
+  $mappings = trim($form_state['values']['tamauth_map_roles']);
+  if (!empty($mappings) && !preg_match(TAM_HEADER_FIELD_MAPPING_PATTERN, $mappings)) {
+    form_set_error('tamauth_map_roles', t('Header / Roles Mappings invalid'));
+  }
 }
 
 /**
  * Submit handler for tamauth_settings_form.
  */
 function tamauth_settings_form_submit($form, $form_state) {
-  $mappings = trim($form_state['values']['tam_field_mappings']);
-  $tam_field_mappings = array();
-  if (preg_match_all(TAM_HEADER_FIELD_MAPPING_PATTERN, $mappings, $matches)) {
+  tamauth_settings_set_mapping('tam_field_mappings', $form_state);
+  tamauth_settings_set_mapping('tamauth_map_roles', $form_state);
+}
+
+/**
+ * Helper function to set the mapping array.
+ */
+
+function tamauth_settings_set_mapping($field_name, $form_state) {
+  $mappings_text = trim($form_state['values'][$field_name]);
+  $mappings = array();
+  if (preg_match_all(TAM_HEADER_FIELD_MAPPING_PATTERN, $mappings_text, $matches)) {
     $tam_headers = array_map('trim', $matches[1]);
-    $drupal_field_names = array_map('trim', $matches[2]);
-    $tam_field_mappings = array_combine($tam_headers, $drupal_field_names);
+    $drupal_names = array_map('trim', $matches[2]);
+    $mappings = array_combine($tam_headers, $drupal_names);
   }
-  variable_set('tam_field_mappings', $tam_field_mappings);
+  variable_set($field_name, $mappings);
 }
diff --git a/tamauth.module b/tamauth.module
index e3c15d6..9e1f3fb 100644
--- a/tamauth.module
+++ b/tamauth.module
@@ -56,14 +56,13 @@ function tamauth_page() {
 
   $name = tamauth_get_tam_name_header();
   $roles = tamauth_get_tam_groups_header();
-  $user = user_load_by_name($name);
   $role_map = variable_get('tamauth_map_roles', array());
   $roles_valid = (bool) count(array_intersect($roles, array_keys($role_map)));
 
   if (!$name || !$roles_valid) {
     watchdog('tamauth', implode(' ', array(t('Incomplete headers'), serialize($name), serialize($roles))));
     drupal_add_http_header('Status', '400 Bad Request');
-    echo t("Nice try...");
+    echo t("Invalid authentification headers");
     drupal_exit();
   }
   else if (tamauth_user_is_not_tam($name)) {
@@ -76,6 +75,15 @@ function tamauth_page() {
   user_external_login_register($name, 'tamauth');
   tamauth_set_roles($user, tamauth_map_roles($roles));
   tamauth_set_user_mapped_header_fields($user);
+
+  // Make sure at least one module implements our hook.
+  if (sizeof(module_implements('tamauth_login_event')) > 0) {
+    // Call all modules that implement the hook
+    module_invoke_all('tamauth_login_event', $user);
+  }
+
+  watchdog('tamauth', t('Login success : @name', array('@name' => $name)));
+
   drupal_goto(variable_get('tamauth_redirect', 'admin'));
 }
 
@@ -199,7 +207,7 @@ function tamauth_get_tam_groups_header() {
  *   List of valid drupal groups.
  */
 function tamauth_map_roles($tam_roles) {
-  $map = variable_get('tamauth_map_roles', array());
+  $map = tamauth_role_mappings();
   $drupal_roles = array();
   foreach ($tam_roles as $role) {
     if (isset($map[$role])) {
@@ -217,3 +225,12 @@ function tamauth_map_roles($tam_roles) {
 function tamauth_field_mappings() {
   return variable_get('tam_field_mappings', array());
 }
+
+/**
+ * Provides the mappings between TAM headers and Drupal roles.
+ *
+ * @return array TAM_HEADER => drupal_role_name.
+ */
+function tamauth_role_mappings() {
+  return variable_get('tamauth_map_roles', array());
+}
