diff --git a/sites/all/modules/unl/cron.php b/sites/all/modules/unl/cron.php
index ef13733ecffe2153eecee1613056749cc4f439a4..05f945594d561410bdf0ffd0373b98a3d2cb8488 100644
--- a/sites/all/modules/unl/cron.php
+++ b/sites/all/modules/unl/cron.php
@@ -14,8 +14,10 @@ drupal_bootstrap(DRUPAL_BOOTSTRAP_FULL);
 
 unl_remove_aliases();
 unl_remove_sites();
+unl_remove_page_aliases();
 unl_add_sites();
 unl_add_aliases();
+unl_add_page_aliases();
 
 function unl_add_sites() {
   $query = db_query('SELECT * FROM {unl_sites} WHERE installed=0');
@@ -114,6 +116,57 @@ function unl_remove_aliases() {
   }
 }
 
+function unl_add_page_aliases() {
+  $query = db_select('unl_page_aliases', 'a');
+  $query->fields('a', array('page_alias_id', 'from_uri', 'to_uri'));
+  $query->condition('a.installed', 0);
+  $results = $query->execute()->fetchAll();
+  
+  foreach ($results as $row) {
+    db_update('unl_page_aliases')
+      ->fields(array('installed' => 1))
+      ->condition('page_alias_id', $row->page_alias_id)
+      ->execute();
+    if (unl_add_page_alias($row->from_uri, $row->to_uri, $row->page_alias_id)) {
+      db_update('unl_page_aliases')
+        ->fields(array('installed' => 2))
+        ->condition('page_alias_id', $row->page_alias_id)
+        ->execute();
+    }
+    else {
+      db_update('unl_sites_aliases')
+        ->fields(array('installed' => 5))
+        ->condition('site_alias_id', $row->page_alias_id)
+        ->execute();
+    }
+  }
+}
+
+function unl_remove_page_aliases() {
+  $query = db_select('unl_page_aliases', 'a');
+  $query->fields('a', array('page_alias_id'));
+  $query->condition('a.installed', 3);
+  $results = $query->execute()->fetchAll();
+  
+  foreach ($results as $row) {
+    db_update('unl_page_aliases')
+      ->fields(array('installed' => 4))
+      ->condition('page_alias_id', $row->page_alias_id)
+      ->execute();
+    if (unl_remove_page_alias($row->page_alias_id)) {
+      db_delete('unl_page_aliases')
+        ->condition('page_alias_id', $row->page_alias_id)
+        ->execute();
+    }
+    else {
+      db_update('unl_page_aliases')
+        ->fields(array('installed' => 5))
+        ->condition('page_alias_id', $row->page_alias_id)
+        ->execute();
+    }
+  }
+}
+
 
 function _unl_get_sites_subdir($uri, $trim_subdomain = TRUE) {
   $path_parts = parse_url($uri);
@@ -251,6 +304,21 @@ function unl_remove_alias($base_uri, $path, $alias_id) {
   return TRUE;
 }
 
+function unl_add_page_alias($from_uri, $to_uri, $alias_id) {
+  $host = parse_url($from_uri, PHP_URL_HOST);
+  $path = parse_url($from_uri, PHP_URL_PATH);
+  
+  unl_add_page_alias_to_htaccess($alias_id, $host, $path, $to_uri);
+  
+  return TRUE;
+}
+
+function unl_remove_page_alias($alias_id) {
+  unl_remove_page_alias_from_htaccess($alias_id);
+  
+  return TRUE;
+}
+
 function unl_add_site_to_htaccess($site_id, $site_path, $is_alias) {
   if ($is_alias) {
     $site_or_alias = 'ALIAS';
@@ -301,6 +369,42 @@ function unl_remove_site_from_htaccess($site_id, $is_alias) {
   file_put_contents(DRUPAL_ROOT . '/.htaccess', $new_htaccess);
 }
 
+function unl_add_page_alias_to_htaccess($site_id, $host, $path, $to_uri) {
+  $stub_token = '  # %UNL_CREATION_TOOL_STUB%';
+  $htaccess = file_get_contents(DRUPAL_ROOT . '/.htaccess');
+  $stub_pos = strpos($htaccess, $stub_token);
+  if ($stub_pos === FALSE) {
+    return FALSE;
+  }
+  $new_htaccess = substr($htaccess, 0, $stub_pos)
+                . "  # %UNL_START_PAGE_ALIAS_ID_{$site_id}%\n"
+                . "  RewriteCond %{HTTP_HOST} ^{$host}$\n"
+                . "  RewriteCond %{REQUEST_URI} ^{$path}$\n"
+                . "  RewriteRule (.*) {$to_uri} [R,L]\n"
+  				. "  # %UNL_END_PAGE_ALIAS_ID_{$site_id}%\n\n" 
+                . $stub_token
+                . substr($htaccess, $stub_pos + strlen($stub_token));
+  
+  file_put_contents(DRUPAL_ROOT . '/.htaccess', $new_htaccess);
+}
+
+function unl_remove_page_alias_from_htaccess($site_id) {
+  $htaccess = file_get_contents(DRUPAL_ROOT . '/.htaccess');
+  $site_start_token = "\n  # %UNL_START_PAGE_ALIAS_ID_{$site_id}%";
+  $site_end_token = "  # %UNL_END_PAGE_ALIAS_ID_{$site_id}%\n";
+  
+  $start_pos = strpos($htaccess, $site_start_token);
+  $end_pos = strpos($htaccess, $site_end_token);
+  
+  if ($start_pos === FALSE || $end_pos === FALSE) {
+    return FALSE;
+  }
+  $new_htaccess = substr($htaccess, 0, $start_pos)
+                . substr($htaccess, $end_pos + strlen($site_end_token))
+                ;
+  file_put_contents(DRUPAL_ROOT . '/.htaccess', $new_htaccess);
+}
+
 
 
 
diff --git a/sites/all/modules/unl/unl.install b/sites/all/modules/unl/unl.install
index eae46f20e5a260c0cae638e7f4f4f5be4c165b5f..97b001e718417d36473afcb19da7a2333f8acb06 100644
--- a/sites/all/modules/unl/unl.install
+++ b/sites/all/modules/unl/unl.install
@@ -56,14 +56,14 @@ function unl_schema() {
         'not null' => TRUE,
         'default'  => '',
       ),
-  
+
     ),
     'primary key' => array('site_id'),
     'unique keys' => array(
       'sub_site' => array('site_path'),
     ),
   );
-  
+
   $schema['unl_sites_aliases'] = array(
     'description' => 'Table of URL aliases for UNL sites.',
     'fields' => array(
@@ -104,7 +104,37 @@ function unl_schema() {
       ),
     ),
   );
-  
+
+  $schema['unl_page_aliases'] = array(
+    'description' => 'Table of URL aliases for UNL pages.',
+    'fields' => array(
+      'page_alias_id' => array(
+        'type'     => 'serial',
+        'unsigned' => TRUE,
+        'not null' => TRUE,
+      ),
+      'from_uri' => array(
+        'type'     => 'varchar',
+        'length'   => 255,
+        'not null' => TRUE,
+      ),
+      'to_uri' => array(
+        'type'     => 'varchar',
+        'length'   => 255,
+        'not null' => TRUE,
+      ),
+      'installed' => array(
+        'type'     => 'int',
+        'not null' => TRUE,
+        'default'  => 0,
+      ),
+    ),
+    'primary key' => array('page_alias_id'),
+    'unique keys' => array(
+      'from_uri' => array('from_uri'),
+    ),
+  );
+
   return $schema;
 }
 
@@ -149,7 +179,7 @@ function unl_update_7100() {
       'sub_site' => array('site_path_prefix', 'site_path'),
     )
   );
-  
+
   db_create_table('unl_sites', $table);
 }
 
@@ -209,7 +239,7 @@ function unl_update_7103() {
       ),
     ),
   );
-  
+
   db_create_table('unl_sites_aliases', $table);
 }
 
@@ -239,19 +269,53 @@ function unl_update_7105() {
 
 function unl_update_7106() {
   db_drop_unique_key('unl_sites_aliases', 'alias_uri');
-  
+
   db_change_field('unl_sites_aliases', 'uri', 'base_uri', array(
     'type'     => 'varchar',
     'length'   => 255,
     'not null' => TRUE,
   ));
-  
+
   db_add_field('unl_sites_aliases', 'path', array(
     'type'     => 'varchar',
     'length'   => 255,
     'not null' => TRUE,
     'default'  => '',
   ));
-  
+
   db_add_unique_key('unl_sites_aliases', 'alias_uri', array('base_uri', 'path'));
 }
+
+function unl_update_7107() {
+  $table = array(
+    'description' => 'Table of URL aliases for UNL pages.',
+    'fields' => array(
+      'page_alias_id' => array(
+        'type'     => 'serial',
+        'unsigned' => TRUE,
+        'not null' => TRUE,
+      ),
+      'from_uri' => array(
+        'type'     => 'varchar',
+        'length'   => 255,
+        'not null' => TRUE,
+      ),
+      'to_uri' => array(
+        'type'     => 'varchar',
+        'length'   => 255,
+        'not null' => TRUE,
+      ),
+      'installed' => array(
+        'type'     => 'int',
+        'not null' => TRUE,
+        'default'  => 0,
+      ),
+    ),
+    'primary key' => array('page_alias_id'),
+    'unique keys' => array(
+      'from_uri' => array('from_uri'),
+    ),
+  );
+
+  db_create_table('unl_page_aliases', $table);
+}
diff --git a/sites/all/modules/unl/unl_site_creation.php b/sites/all/modules/unl/unl_site_creation.php
index 040fd538b2cdd4335bcd1697775c5b0773d607bb..214d84843b98823e1c477cca7de28e1a80aa02de 100644
--- a/sites/all/modules/unl/unl_site_creation.php
+++ b/sites/all/modules/unl/unl_site_creation.php
@@ -299,14 +299,16 @@ function _unl_get_sites_subdir($uri) {
 
 function unl_aliases_page() {
   $page = array();
-  $page[] = drupal_get_form('unl_alias_create');
-  $page[] = drupal_get_form('unl_alias_list');
+  $page[] = drupal_get_form('unl_site_alias_create');
+  $page[] = drupal_get_form('unl_site_alias_list');
+  $page[] = drupal_get_form('unl_page_alias_create');
+  $page[] = drupal_get_form('unl_page_alias_list');
   
   return $page;
 }
 
 
-function unl_alias_create($form, &$form_state) {
+function unl_site_alias_create($form, &$form_state) {
   
   $sites = db_select('unl_sites', 's')
     ->fields('s', array('site_id', 'uri'))
@@ -318,7 +320,7 @@ function unl_alias_create($form, &$form_state) {
   
   $form['root'] = array(
     '#type'  => 'fieldset',
-    '#title' => 'Create New Alias',
+    '#title' => 'Create New Site Alias',
   );
   
   $form['root']['site'] = array(
@@ -351,7 +353,7 @@ function unl_alias_create($form, &$form_state) {
   return $form;
 }
 
-function unl_alias_create_submit($form, &$form_state) {
+function unl_site_alias_create_submit($form, &$form_state) {
   db_insert('unl_sites_aliases')->fields(array(
     'site_id'  => $form_state['values']['site'],
     'base_uri' => $form_state['values']['base_uri'],
@@ -360,11 +362,11 @@ function unl_alias_create_submit($form, &$form_state) {
 }
 
 
-function unl_alias_list($form, &$form_state) {
+function unl_site_alias_list($form, &$form_state) {
 
   $form['root'] = array(
     '#type'  => 'fieldset',
-    '#title' => 'Existing Aliases',
+    '#title' => 'Existing Site Aliases',
   );
   
   $headers = array(
@@ -417,7 +419,7 @@ function unl_alias_list($form, &$form_state) {
   return $form;
 }
 
-function unl_alias_list_submit($form, &$form_state) {
+function unl_site_alias_list_submit($form, &$form_state) {
   $site_alias_ids = array();
   foreach ($form_state['values']['aliases'] as $site_alias_id => $alias) {
     if ($alias['remove']) {
@@ -432,6 +434,115 @@ function unl_alias_list_submit($form, &$form_state) {
 }
 
 
+function unl_page_alias_create($form, &$form_state) {
+  
+  $form['root'] = array(
+    '#type'  => 'fieldset',
+    '#title' => 'Create New Page Alias',
+  );
+  
+  $form['root']['from_uri'] = array(
+    '#type'          => 'textfield',
+    '#title'         => t('From URL'),
+    '#description'   => 'The URL that users will visit.',
+    '#default_value' => url('', array('https' => FALSE)),
+    '#required'      => TRUE,
+  );
+  
+  $form['root']['to_uri'] = array(
+    '#type'          => 'textfield',
+    '#title'         => t('To URL'),
+    '#description'   => t('The URL users will be redirected to.'),
+    '#default_value' => url('', array('https' => FALSE)),
+    '#required'      => TRUE,
+  );
+  
+  $form['root']['submit'] = array(
+    '#type'  => 'submit',
+    '#value' => 'Create Alias',
+  );
+  
+  return $form;
+}
+
+function unl_page_alias_create_submit($form, &$form_state) {
+  db_insert('unl_page_aliases')->fields(array(
+    'from_uri'  => $form_state['values']['from_uri'],
+    'to_uri'    => $form_state['values']['to_uri'],
+  ))->execute();
+}
+
+
+function unl_page_alias_list($form, &$form_state) {
+
+  $form['root'] = array(
+    '#type'  => 'fieldset',
+    '#title' => 'Existing Page Aliases',
+  );
+  
+  $headers = array(
+    'site_uri' => array(
+      'data' => 'From URI',
+      'field' => 'a.from_uri',
+    ),
+    'alias_uri' => array(
+      'data' => 'To URI',
+      'field' => 'a.to_uri',
+    ),
+    'installed' => array(
+      'data' => 'Status',
+      'field' => 'a.installed',
+    ),
+    'remove'    => 'Remove (can not undo!)'
+  );
+  
+  $form['root']['alias_list'] = array(
+    '#theme'  => 'unl_table',
+    '#header' => $headers,
+  );
+  
+  $query = db_select('unl_page_aliases', 'a')
+    ->extend('TableSort')
+    ->orderByHeader($headers);
+  $query->fields('a', array('page_alias_id', 'from_uri', 'to_uri', 'installed'));
+  $sites = $query->execute()->fetchAll();
+  
+  foreach ($sites as $site) {
+    $form['root']['alias_list']['rows'][$site->page_alias_id] = array(
+      'site_uri' => array('#prefix'  => $site->from_uri),
+      'alias_uri' => array('#prefix' => $site->to_uri),
+      'installed' => array('#prefix' => _unl_get_install_status_text($site->installed)),
+      'remove'    => array(
+        '#type'          => 'checkbox',
+        '#parents'       => array('aliases', $site->page_alias_id, 'remove'),
+        '#default_value' => 0
+      ),
+    );
+  }
+  
+  $form['root']['submit'] = array(
+    '#type'  => 'submit',
+    '#value' => 'Delete Selected Aliases',
+  );
+  
+  return $form;
+}
+
+function unl_page_alias_list_submit($form, &$form_state) {
+  $page_alias_ids = array();
+  foreach ($form_state['values']['aliases'] as $page_alias_id => $alias) {
+    if ($alias['remove']) {
+      $page_alias_ids[] = $page_alias_id;
+    }
+  }
+  
+  db_update('unl_page_aliases')
+    ->fields(array('installed' => 3))
+    ->condition('page_alias_id', $page_alias_ids, 'IN')
+    ->execute();
+}
+
+
 function unl_wdn_registry($form, &$form_state) {
   
   $form['root'] = array(