diff --git a/autoassignrole.admin.inc b/autoassignrole.admin.inc
index 683d68c..709250e 100644
--- a/autoassignrole.admin.inc
+++ b/autoassignrole.admin.inc
@@ -5,7 +5,6 @@
  * Administrative functionality for auto assign role.
  */
 
-
 /**
  * Provide a single block from the administration menu as a page.
  *
@@ -167,3 +166,308 @@ function autoassignrole_user_settings() {
 
   return system_settings_form($form);
 }
+
+/**
+ * Implements hook_form().
+ *
+ * Form to edit or add role-specific pages.
+ */
+function autoassignrole_page_form($form, &$form_state, $op = 'add', $id = 0) {
+  $roles = user_roles(TRUE);
+  unset($roles[DRUPAL_AUTHENTICATED_RID]);
+
+  $form = array();
+
+  switch ($op) {
+    case 'add':
+      $title = t('Add a new role page');
+      $submit_value = t('Add');
+      break;
+
+    case 'edit':
+      $title = t('Edit role page');
+      $submit_value = t('Save');
+      break;
+  }
+
+  $form['rid_page'] = array(
+    '#type' => 'fieldset',
+    '#title' => $title,
+  );
+
+  $form['rid_page']['op_term'] = array(
+    '#type' => 'hidden',
+    '#value' => $op,
+  );
+
+  if ($op == 'edit') {
+    $form['rid_page']['id'] = array(
+      '#type' => 'hidden',
+      '#value' => $id,
+    );
+    if ($id > 0) {
+      $page = autoassignrole_get_page($id);
+    }
+  }
+
+  $form['rid_page']['roles'] = array(
+    '#type' => 'checkboxes',
+    '#title' => t('Role'),
+    '#description' => t('Select the roles this page will assign'),
+    '#options' => $roles,
+    '#required' => TRUE,
+    '#default_value' => isset($page->rids) ? unserialize($page->rids) : array(),
+  );
+
+  $form['rid_page']['title'] = array(
+    '#type' => 'textfield',
+    '#title' => t('Page Title'),
+    '#description' => t('Enter the title of the page'),
+    '#size' => 60,
+    '#required' => TRUE,
+    '#default_value' => isset($page->title) ? $page->title : "",
+  );
+
+  $form['rid_page']['path'] = array(
+    '#type' => 'textfield',
+    '#title' => t('Page Path'),
+    '#description' => t('Enter the Drupal path for the registration page for this role. This is a relative path based on your Drupal installation.'),
+    '#size' => 60,
+    '#required' => TRUE,
+    '#default_value' => isset($page->path) ? $page->path : "",
+  );
+
+  $form['rid_page']['menu'] = array(
+    '#type' => 'select',
+    '#title' => t('Menu'),
+    '#description' => t('Which parent menu item should these pages appear under? This will only apply if you choose the "Standard" display option below.'),
+    '#options' => menu_get_menus(),
+    '#default_value' => isset($page->menu) ? $page->menu : "",
+  );
+
+  $form['rid_page']['display'] = array(
+    '#type' => 'select',
+    '#title' => t('Display type'),
+    '#description' => t('Choose the way you would like these pages to be displayed.<br /><em>Standard</em> is equivalent to the core Drupal log in/ registration form, with tabs along the top.<br /><em>Individual</em> is a separate page without tabs.'),
+    '#options' => array(
+      AUTOASSIGNROLE_PAGE_DISPLAY_STANDARD => t('Standard'),
+      AUTOASSIGNROLE_PAGE_DISPLAY_INDIVIDUAL => t('Individual'),
+    ),
+    '#default_value' => isset($page->display) ? $page->display : "",
+  );
+
+  $form['submit'] = array(
+    '#type' => 'submit',
+    '#value' => $submit_value,
+  );
+
+  return $form;
+}
+
+/**
+ * Implements hook_form_validate().
+ *
+ * Check path to see if page already exists.
+ */
+function autoassignrole_page_form_validate($form_id, &$form_state) {
+  $path = $form_state['values']['path'];
+
+  // @todo need to check if the path already exists.
+  if ($path) {
+    if (preg_match('/[^A-Za-z0-9\/_-]+/', $path) || strpos(trim($path), '/') === 0) {
+      form_set_error('path', '\'' . check_plain($path) . '\' ' . t('is not a valid path'));
+    }
+    else {
+      $query = db_select('menu_links', 'm')
+        ->fields('m', array('mlid'))
+        ->condition('link_path', $path, 'like');
+      $count = $query->countQuery()->execute()->fetchField();
+      if (drupal_lookup_path('source', $path) || $count > 0) {
+        // The menu item exists so need to check if the path has something other
+        // than autoassign_role_path registered otherwise throw an error.
+        $menu_item = menu_get_item($path);
+        if (!isset($menu_item['page_callback']) && $menu_item['page_callback'] != 'autoassignrole_path') {
+          form_set_error('path', '\'' . check_plain($path) . '\' ' . t('is already in use as a path'));
+        }
+      }
+    }
+  }
+}
+
+/**
+ * Implements hook_form_submit().
+ */
+function autoassignrole_page_form_submit($form_id, &$form_state) {
+  $page = array(
+    'rids' => serialize($form_state['values']['roles']),
+    'path' => $form_state['values']['path'],
+    'menu' => $form_state['values']['menu'],
+    'title' => $form_state['values']['title'],
+    'display' => $form_state['values']['display'],
+  );
+
+  $return = FALSE;
+  $op = $form_state['values']['op_term'];
+  switch ($op) {
+    case 'add':
+      $return = autoassignrole_add_page($page);
+      $operation = 'Created';
+      break;
+
+    case 'edit':
+      $id = $form_state['values']['id'];
+      $return = autoassignrole_update_page($page, $id);
+      $operation = 'Updated';
+      break;
+  }
+
+  if ($return) {
+    menu_rebuild();
+    drupal_set_message(t('Successfuly @operation Page @page', array('@operation' => $operation, '@page' => $page['title'])));
+    drupal_goto('admin/config/people/autoassignrole/pages');
+  }
+  else {
+    drupal_set_message(t('Unfortunately there has been an error and this page could not be %op', array('%op' => drupal_strtolower($operation))), 'error');
+  }
+}
+
+/**
+ * Function to add role-specific page.
+ *
+ * @param array $page
+ *   The details of the page to be added.
+ *
+ * @return bool
+ *   Return true if successful | false.
+ */
+function autoassignrole_add_page($page) {
+  $return_value = FALSE;
+  try {
+    $return_value = db_insert('autoassignrole_page')->fields($page)->execute();
+  }
+  catch (Exception $e) {
+    drupal_set_message(t('db_insert failed. Message = %message, query = %query', array('%message' => $e->getMessage(), '%query' => $e->query_string)), 'error');
+  }
+  return $return_value;
+}
+
+/**
+ * Function to update existing role-specific page.
+ *
+ * @param array $page
+ *   The details of the page to be added.
+ * @param int $id
+ *   The id of the page to be updated.
+ *
+ * @return bool
+ *   Return true if successful | false.
+ */
+function autoassignrole_update_page($page, $id) {
+  $return_value = FALSE;
+  try {
+    $return_value = db_update('autoassignrole_page')
+      ->fields($page)
+      ->condition('rid_page_id', $id)
+      ->execute();
+  }
+  catch (Exception $e) {
+    drupal_set_message(t('db_update failed. Message = %message, query = %query', array('%message' => $e->getMessage(), '%query' => $e->query_string)), 'error');
+  }
+  return $return_value;
+}
+
+/**
+ * Function to delete role-specific page.
+ */
+function autoassignrole_page_delete_confirm($form, &$form_state, $page_id) {
+  $page = autoassignrole_get_page($page_id);
+  $form['page_id'] = array(
+    '#type' => 'value',
+    '#value' => $page_id,
+  );
+
+  return confirm_form($form, t('Are you sure you want to delete the page %name ?', array('%name' => $page->title)), 'admin/config/people/autoassignrole/pages', t('This action cannot be undone.'), t('Delete'));
+}
+
+/**
+ * Form submit handler for autoassignrole_page_delete_confirm().
+ */
+function autoassignrole_page_delete_confirm_submit($form, &$form_state) {
+  db_delete('autoassignrole_page')
+    ->condition('rid_page_id', (int) $form_state['values']['page_id'])
+    ->execute();
+  menu_rebuild();
+  drupal_set_message(t('Successfully deleted page'));
+  $form_state['redirect'] = 'admin/config/people/autoassignrole/pages';
+}
+
+/**
+ * Function to display list of role-specific pages.
+ *
+ * @return array
+ *   Returns a build array.
+ */
+function autoassignrole_list_pages() {
+  $header = array(
+    array('data' => 'Title', 'field' => 'title', 'sort' => 'asc'),
+    array('data' => 'Roles', 'field' => 'rids'),
+    array('data' => 'Path', 'field' => 'path'),
+    array('data' => 'Operations'),
+  );
+
+  $query = db_select('autoassignrole_page', 'p')
+    ->extend('PagerDefault')
+    ->limit(10)
+    ->extend('TableSort')
+    ->orderByHeader($header)
+    ->fields('p', array(
+        'rid_page_id',
+        'rids',
+        'title',
+        'path',
+        )
+      );
+
+  $results = $query->execute();
+
+  $user_roles = user_roles(TRUE);
+  $rows = array();
+  foreach ($results as $page) {
+    $rids = unserialize($page->rids);
+    $roles = '';
+    $count = 0;
+    foreach ($rids as $rid) {
+      if (!empty($rid) && array_key_exists($rid, $user_roles)) {
+        if ($count != 0) {
+          $roles .= ', ';
+        }
+        $roles .= $user_roles[$rid];
+        $count++;
+      }
+    }
+    $edit = l(t('Edit'), 'admin/config/people/autoassignrole/pages/edit/' . $page->rid_page_id);
+    $delete = l(t('Delete'), 'admin/config/people/autoassignrole/pages/delete/' . $page->rid_page_id);
+    $links = $edit . ' | ' . $delete;
+    $rows[] = array(
+      'data' => array(
+        $page->title,
+        $roles,
+        $page->path,
+        $links,
+      ),
+    );
+  }
+
+  $html = theme('table',
+    array(
+      'header' => $header,
+      'rows' => $rows,
+      'sticky' => TRUE,
+      'empty' => 'No Auto Assign pages created...',
+    )
+  );
+
+  $html .= theme('pager', array('tags' => array()));
+
+  return $html;
+}
diff --git a/autoassignrole.install b/autoassignrole.install
index b723c83..899eb12 100644
--- a/autoassignrole.install
+++ b/autoassignrole.install
@@ -31,6 +31,56 @@ function autoassignrole_uninstall() {
   // D6 installation.
   variable_del('autoassignrole_node_user_register');
   variable_del('autoassignrole_page_active');
+
+  // Remove the autoassignrole_page table.
+  db_drop_table('autoassignrole_page');
+}
+
+/**
+ * Implementation of hook_schema().
+ */
+function autoassignrole_schema() {
+  $schema['autoassignrole_page'] = array(
+    'description' => 'Stores autoassignrole page information',
+    'fields' => array(
+      'rid_page_id' => array(
+        'type' => 'serial',
+        'not null' => TRUE,
+        'description' => 'The unique identifier for this role page',
+      ),
+      'rids' => array(
+        'type' => 'varchar',
+        'length' => 255,
+        'not null' => TRUE,
+        'description' => 'The role IDs for this page',
+      ),
+      'path' => array(
+        'type' => 'text',
+        'length' => 255,
+        'not null' => TRUE,
+        'description' => 'The path for this page',
+      ),
+      'menu' => array(
+        'type' => 'varchar',
+        'length' => 255,
+        'not null' => TRUE,
+        'description' => 'The default parent menu for this menu item',
+      ),
+      'title' => array(
+        'type' => 'text',
+        'not null' => TRUE,
+        'description' => 'The description for this page',
+      ),
+      'display' => array(
+        'type' => 'int',
+        'not null' => TRUE,
+        'description' => 'The display type for this page',
+      ),
+    ),
+    'primary key' => array('rid_page_id'),
+  );
+
+  return $schema;
 }
 
 /**
@@ -39,7 +89,6 @@ function autoassignrole_uninstall() {
 
 /**
  * Upgrade the custom table used on the D6 version.
- * TODO: Updated to handle the {autoassignrole_page} table too.
  */
 function autoassignrole_update_7100() {
   if (db_table_exists('autoassignrole')) {
@@ -91,3 +140,52 @@ function autoassignrole_update_7100() {
     drupal_set_message(t('AutoAssignRole: no need to upgrade existing D7 sites.'));
   }
 }
+
+/**
+ * Add the assign to page table.
+ */
+function autoassignrole_update_7101() {
+  if (!db_table_exists('autoassignrole_page')) {
+    $schema['autoassignrole_page'] = array(
+      'description' => 'Stores autoassignrole page information',
+      'fields' => array(
+        'rid_page_id' => array(
+          'type' => 'serial',
+          'not null' => TRUE,
+          'description' => 'The unique identifier for this role page',
+        ),
+        'rids' => array(
+          'type' => 'varchar',
+          'length' => 255,
+          'not null' => TRUE,
+          'description' => 'The role IDs for this page',
+        ),
+        'path' => array(
+          'type' => 'text',
+          'length' => 255,
+          'not null' => TRUE,
+          'description' => 'The path for this page',
+        ),
+        'menu' => array(
+          'type' => 'varchar',
+          'length' => 255,
+          'not null' => TRUE,
+          'description' => 'The default parent menu for this menu item',
+        ),
+        'title' => array(
+          'type' => 'text',
+          'not null' => TRUE,
+          'description' => 'The description for this page',
+        ),
+        'display' => array(
+          'type' => 'int',
+          'not null' => TRUE,
+          'description' => 'The display type for this page',
+        ),
+      ),
+      'primary key' => array('rid_page_id'),
+    );
+
+    db_create_table('autoassignrole_page', $schema['autoassignrole_page']);
+  }
+}
\ No newline at end of file
diff --git a/autoassignrole.module b/autoassignrole.module
index 06db6d7..3017646 100644
--- a/autoassignrole.module
+++ b/autoassignrole.module
@@ -17,6 +17,12 @@ define('AUTOASSIGNROLE_ELEMENT_SELECT', 1);
 // Says to use element of type select for checkbox selection.
 define('AUTOASSIGNROLE_ELEMENT_CHECKBOX', 2);
 
+// Sets the page display for standard.
+define('AUTOASSIGNROLE_PAGE_DISPLAY_STANDARD', 0);
+
+// Sets the page display for individual.
+define('AUTOASSIGNROLE_PAGE_DISPLAY_INDIVIDUAL', 1);
+
 /**
  * Implements hook_permission().
  */
@@ -57,18 +63,132 @@ function autoassignrole_menu() {
     'page arguments' => array('autoassignrole_user_settings'),
     'file' => 'autoassignrole.admin.inc',
   );
+  $items['admin/config/people/autoassignrole/pages'] = array(
+    'title' => 'Per Role Pages',
+    'description' => 'Configure individual pages to allow user to sign up for a particular role',
+    'access arguments' => array('administer autoassignrole'),
+    'page callback' => 'autoassignrole_list_pages',
+    'file' => 'autoassignrole.admin.inc',
+  );
+  $items['admin/config/people/autoassignrole/pages/add'] = array(
+    'title' => 'Add Auto Assign Role Page',
+    'access arguments' => array('administer autoassignrole'),
+    'page callback' => 'drupal_get_form',
+    'page arguments' => array('autoassignrole_page_form', 'add'),
+    'type' => MENU_LOCAL_ACTION,
+    'file' => 'autoassignrole.admin.inc',
+  );
+  $items['admin/config/people/autoassignrole/pages/edit/%'] = array(
+    'title' => 'Edit Auto Assign Role Page',
+    'access arguments' => array('administer autoassignrole'),
+    'page callback' => 'drupal_get_form',
+    'page arguments' => array('autoassignrole_page_form', 'edit', 6),
+    'file' => 'autoassignrole.admin.inc',
+  );
+  $items['admin/config/people/autoassignrole/pages/delete/%'] = array(
+    'title' => 'Delete Auto Assign Role Page',
+    'access arguments' => array('administer autoassignrole'),
+    'page callback' => 'drupal_get_form',
+    'page arguments' => array('autoassignrole_page_delete_confirm', 6),
+    'file' => 'autoassignrole.admin.inc',
+  );
+
+  $pages = autoassignrole_get_pages();
+  foreach ($pages as $page) {
+    $rids = unserialize($page->rids);
+    switch ($page->display) {
+      case AUTOASSIGNROLE_PAGE_DISPLAY_STANDARD:
+        $items[$page->path] = array(
+          'title' => check_plain($page->title),
+          'page arguments' => array($rids),
+          'page callback' => 'autoassignrole_register',
+          'access callback' => 'user_register_access',
+          'file' => 'autoassignrole.paths.inc',
+          'type' => MENU_NORMAL_ITEM,
+          'menu_name' => $page->menu,
+        );
+        $items[$page->path . '/register'] = array(
+          'title' => 'Register',
+          'page arguments' => array($rids),
+          'page callback' => 'autoassignrole_register',
+          'access callback' => 'user_register_access',
+          'file' => 'autoassignrole.paths.inc',
+          'type' => MENU_DEFAULT_LOCAL_TASK,
+        );
+        $items[$page->path . '/login'] = array(
+          'title' => 'Log In',
+          'page callback' => 'autoassignrole_login',
+          'access callback' => 'user_is_anonymous',
+          'file' => 'autoassignrole.paths.inc',
+          'type' => MENU_LOCAL_TASK,
+        );
+        $items[$page->path . '/password'] = array(
+          'title' => 'Request New Password',
+          'page callback' => 'autoassignrole_password',
+          'access callback' => 'user_is_anonymous',
+          'file' => 'autoassignrole.paths.inc',
+          'type' => MENU_LOCAL_TASK,
+        );
+        break;
+
+      case AUTOASSIGNROLE_PAGE_DISPLAY_INDIVIDUAL:
+        $items[$page->path] = array(
+          'title' => check_plain($page->title),
+          'page arguments' => array($rids),
+          'page callback' => 'autoassignrole_register',
+          'access callback' => 'user_register_access',
+          'file' => 'autoassignrole.paths.inc',
+          'type' => MENU_CALLBACK,
+        );
+        $items[$page->path . '/register'] = array(
+          'title' => 'Register',
+          'page arguments' => array($rids),
+          'page callback' => 'autoassignrole_register',
+          'access callback' => 'user_register_access',
+          'file' => 'autoassignrole.paths.inc',
+          'type' => MENU_CALLBACK,
+        );
+        $items[$page->path . '/login'] = array(
+          'title' => 'Log In',
+          'page callback' => 'autoassignrole_login',
+          'access callback' => 'user_is_anonymous',
+          'file' => 'autoassignrole.paths.inc',
+          'type' => MENU_CALLBACK,
+        );
+        $items[$page->path . '/password'] = array(
+          'title' => 'Request New Password',
+          'page callback' => 'autoassignrole_password',
+          'access callback' => 'user_is_anonymous',
+          'file' => 'autoassignrole.paths.inc',
+          'type' => MENU_CALLBACK,
+        );
+        break;
+    }
+  }
 
   return $items;
 }
 
 /**
+ * Finds any role ids attached to current page, if any.
+ */
+function autoassignrole_get_active_path_rid() {
+  $item = menu_get_item();
+  if ($item['page_callback'] == 'autoassignrole_register') {
+    return $item['page_arguments'][0];
+  }
+  return FALSE;
+}
+
+/**
  * Implements hook_user_presave().
  */
 function autoassignrole_user_presave(&$edit, $account, $category) {
   // Use case http://drupal.org/node/971622
   // Make sure we only assign roles automatically when enabled to do so.
   if (variable_get('autoassignrole_auto_active', 0) || variable_get("autoassignrole_user_active", 0)
-    || (variable_get('autoassignrole_admin_active', 0) && user_access('administer users'))) {
+    || (variable_get('autoassignrole_admin_active', 0) && user_access('administer users'))
+    || autoassignrole_get_active_path_rid()) {
     // Use case http://drupal.org/node/944864
     // Only assign roles if this is a new account.
     if (isset($account->is_new) && !empty($account->is_new)) {
@@ -91,6 +211,12 @@ function autoassignrole_user_presave(&$edit, $account, $category) {
         $roles_to_add += array_intersect_key($user_roles, array_filter($edit['user_roles']));
       }
 
+      // Add page-specific roles.
+      $page_rids = autoassignrole_get_active_path_rid();
+      if ($page_rids) {
+        $roles_to_add = array_intersect_key($user_roles, array_filter($page_rids));
+      }
+
       // Make sure the roles key exists.
       if (!isset($edit['roles'])) {
         $edit['roles'] = array();
@@ -149,3 +275,46 @@ function autoassignrole_form_user_register_form_alter(&$form, &$form_state) {
     }
   }
 }
+
+/**
+ * Function to retrieve all role-specific pages.
+ *
+ * @return SelectQuery
+ *   An array of page objects.
+ */
+function autoassignrole_get_pages() {
+  $query = _autoasignrole_get_page_query();
+  return $query->execute();
+}
+
+/**
+ * Function to get role-specific page details.
+ *
+ * @param int $id
+ *   The id of the page to be updated.
+ *
+ * @return SelectQuery
+ *   A query object with all page details.
+ */
+function autoassignrole_get_page($id) {
+  $query = _autoasignrole_get_page_query();
+  $query->condition('rid_page_id', $id, '=');
+  return $query->execute()->fetchObject();
+}
+
+/**
+ * Helper method for getting the page query object.
+ *
+ * @return SelectQuery
+ *   The query object.
+ */
+function _autoasignrole_get_page_query() {
+  return db_select('autoassignrole_page', 'p')
+    ->fields('p', array(
+      'rids',
+      'path',
+      'title',
+      'menu',
+      'display',
+    ));
+}
\ No newline at end of file
diff --git a/autoassignrole.paths.inc b/autoassignrole.paths.inc
new file mode 100644
index 0000000..4dea791
--- /dev/null
+++ b/autoassignrole.paths.inc
@@ -0,0 +1,53 @@
+<?php
+
+/**
+ * @file
+ * Paths used for autoassignrole created user pages.
+ *
+ * Autoassignrole allows an admin to create specific register, login and reset
+ * password pages for a particular set of roles. The menu callback arguments
+ * for these pages are defined here.
+ *
+ * These functions simply call the standard user forms from Drupal core, the
+ * reason we wrap them like this is so that we can detect when one of our
+ * role-specific pages are being called rather than the default ones.
+ */
+
+//We require this file from the user module to get the user_pass form.
+require_once drupal_get_path('module', 'user') . '/user.pages.inc';
+
+/**
+ * Loads the user registration form.
+ *
+ * $rid is not actually used in the function but by passing it we can find out
+ * which roles are meant to be added to the new user by using
+ * autoassignrole_get_active_path_rid();
+ *
+ * @see autoassignrole.module
+ *
+ * @param $rid
+ *   $rid is the 'rid_page_id' of the page we are currently generating.
+ *
+ * @return string
+ *   User registration form renderer.
+ */
+function autoassignrole_register($rid) {
+  $output = drupal_get_form('user_register_form');
+  return $output;
+}
+
+/**
+ * Loads the user login form
+ */
+function autoassignrole_login() {
+  $output = drupal_get_form('user_login');
+  return $output;
+}
+
+/**
+ * Loads the password reset form
+ */
+function autoassignrole_password() {
+  $output = drupal_get_form('user_pass');
+  return $output;
+}
