diff --git a/.htaccess.sample b/.htaccess.sample
index c7b4df00f7d629ec99e800a4a6dd7c9e45432cbd..f8135d45af313187c8c94c29df4e4392ef95c1b4 100644
--- a/.htaccess.sample
+++ b/.htaccess.sample
@@ -62,6 +62,13 @@ DirectoryIndex index.php index.html index.htm
 <IfModule mod_rewrite.c>
   RewriteEngine on
 
+  # THIS SECTION IS AUTOMATICALY GENERATED.
+  # DO NOT EDIT!!!!
+  
+  # %UNL_CREATION_TOOL_STUB%
+  
+  # END AUTOMATICALLY GENERATED AREA.
+  
   # Block access to "hidden" directories whose names begin with a period. This
   # includes directories used by version control systems such as Subversion or
   # Git to store control files. Files whose names begin with a period, as well
diff --git a/includes/unl_bootstrap.inc b/includes/unl_bootstrap.inc
new file mode 100644
index 0000000000000000000000000000000000000000..4f6d1a2d33eaae87d370f5f14821ae1f28b3b421
--- /dev/null
+++ b/includes/unl_bootstrap.inc
@@ -0,0 +1,32 @@
+<?php
+
+function unl_bootstrap() {
+  $original_script_name = $_SERVER['SCRIPT_NAME'];
+  
+  $path_parts = explode('/', $_SERVER['SCRIPT_URL']);
+  foreach ($path_parts as $path_index => $path_part) {
+    if (!$path_part) {
+      unset($path_parts[$path_index]);
+    }
+  }
+  
+  $previous_conf_path = '';
+  $previous_script_name = '';
+  for ($i = count($path_parts); $i > 0; $i--) {
+    $_SERVER['SCRIPT_NAME'] = '/' . implode('/', array_slice($path_parts, 0, $i)) . '/index.php';
+    $conf_path = conf_path(TRUE, TRUE);
+    
+    if ($previous_conf_path && ($conf_path != $previous_conf_path)) {
+      $_SERVER['SCRIPT_NAME'] = $previous_script_name;
+      break;
+    }
+    
+    if ($_SERVER['SCRIPT_NAME'] == $original_script_name) {
+      break;
+    }
+    $previous_conf_path = $conf_path;
+    $previous_script_name = $_SERVER['SCRIPT_NAME'];
+  }
+  
+  conf_path(TRUE, TRUE);
+}
diff --git a/index.php b/index.php
index c7d323b49714b52a4cdb6217ff659f712d640a7a..ea72099b49f7e8b6e23d91e10ff9cda9b98984f7 100644
--- a/index.php
+++ b/index.php
@@ -17,6 +17,8 @@
  */
 define('DRUPAL_ROOT', getcwd());
 
+require_once DRUPAL_ROOT . '/includes/unl_bootstrap.inc';
 require_once DRUPAL_ROOT . '/includes/bootstrap.inc';
+unl_bootstrap();
 drupal_bootstrap(DRUPAL_BOOTSTRAP_FULL);
 menu_execute_active_handler();
diff --git a/sites/all/modules/unl/cron.php b/sites/all/modules/unl/cron.php
index 671318c25f7373f684d6233b8aa36b15c6ccb27d..956b5436ae71c26dfa14e69486970a35b7337fcd 100644
--- a/sites/all/modules/unl/cron.php
+++ b/sites/all/modules/unl/cron.php
@@ -18,11 +18,18 @@ while ($row = $query->fetchAssoc()) {
    ->fields(array('installed' => 1))
    ->condition('site_id', $row['site_id'])
    ->execute();
-  unl_add_site($row['site_path'], $row['uri'], $row['clean_url'], $row['db_prefix']);
-  db_update('unl_sites')
-    ->fields(array('installed' => 2))
-    ->condition('site_id', $row['site_id'])
-    ->execute();
+  if (unl_add_site($row['site_path'], $row['uri'], $row['clean_url'], $row['db_prefix'], $row['site_id'])) {
+    db_update('unl_sites')
+      ->fields(array('installed' => 2))
+      ->condition('site_id', $row['site_id'])
+      ->execute();
+  }
+  else {
+    db_update('unl_sites')
+      ->fields(array('installed' => 5))
+      ->condition('site_id', $row['site_id'])
+      ->execute();
+  }
 }
 
 $query = db_query('SELECT * FROM {unl_sites} WHERE installed=3');
@@ -31,7 +38,7 @@ while ($row = $query->fetchAssoc()) {
     ->fields(array('installed' => 4))
     ->condition('site_id', $row['site_id'])
     ->execute();
-  if (unl_remove_site($row['site_path'], $row['uri'], $row['db_prefix'])) {
+  if (unl_remove_site($row['site_path'], $row['uri'], $row['db_prefix'], $row['site_id'])) {
     db_delete('unl_sites')
       ->condition('site_id', $row['site_id'])
       ->execute();
@@ -46,7 +53,7 @@ while ($row = $query->fetchAssoc()) {
 }
 
 
-function unl_add_site($site_path, $uri, $clean_url, $db_prefix) {
+function unl_add_site($site_path, $uri, $clean_url, $db_prefix, $site_id) {
   if (substr($site_path, 0, 1) == '/') {
     $site_path = substr($site_path, 1);
   }
@@ -74,37 +81,28 @@ function unl_add_site($site_path, $uri, $clean_url, $db_prefix) {
   $db_prefix = escapeshellarg($db_prefix);
   
   $command = "$php_path sites/all/modules/drush/drush.php -y --uri=$uri site-install unl_profile --sites-subdir=$sites_subdir --db-url=$db_url --db-prefix=$db_prefix --clean-url=$clean_url";
-
-  $subdir = explode('/', $site_path);
-  $symlink_name = array_pop($subdir);
-  $subdir = implode('/', $subdir);
-
-  if ($subdir) {
-    mkdir($subdir, 0755, TRUE);
-  }
-  
-  $subdir = realpath($subdir);
-  $subdir_levels = count(explode('/', $subdir)) - count(explode('/', DRUPAL_ROOT));
-  
-  $symlink_target = array();
-  for ($i = 0; $i < $subdir_levels; $i++) {
-      $symlink_target[] = '..';
-  }
-  $symlink_target = implode('/', $symlink_target);
+  shell_exec($command);
   
-  if (!$symlink_target) {
-    $symlink_target = '.';
+  $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;
   }
-  
-  if ($subdir) {
-    mkdir($subdir, 0755, TRUE);
+  $new_htaccess = substr($htaccess, 0, $stub_pos)
+                . "  # %UNL_START_SITE_ID_$site_id%\n";
+  foreach (array('misc', 'modules', 'sites', 'themes') as $drupal_dir) {
+    $new_htaccess .=  "  RewriteRule $site_path/$drupal_dir/(.*) $drupal_dir/$1\n";
   }
+  $new_htaccess .= "  # %UNL_END_SITE_ID_$site_id%\n\n" 
+                 . $stub_token
+                 . substr($htaccess, $stub_pos + strlen($stub_token));
   
-  symlink($symlink_target, $subdir . '/' . $symlink_name);
-  shell_exec($command);
+  file_put_contents(DRUPAL_ROOT . '/.htaccess', $new_htaccess);
+  return TRUE;
 }
 
-function unl_remove_site($site_path, $uri, $db_prefix) {
+function unl_remove_site($site_path, $uri, $db_prefix, $site_id) {
   $schema = drupal_get_schema();
   $tables = array_keys($schema);
   sort($tables);
@@ -138,24 +136,21 @@ function unl_remove_site($site_path, $uri, $db_prefix) {
   shell_exec('chmod -R u+w ' . escapeshellarg($sites_subdir));
   shell_exec('rm -rf ' . escapeshellarg($sites_subdir));
   
-  // Check to see if this site had any sub-sites.
-  // If so, we don't want to remove any symlinks.
-  // TODO: instead, iterate over all sites and rebuild directories/symlinks if needed.
-  $results = db_select('unl_sites', 's')
-    ->fields('s', array('uri'))
-    ->condition('uri', $uri . '/%', 'LIKE')
-    ->execute()
-    ->fetchAll();
-  if (count($results) > 0) {
-    return TRUE;
-  }
+  // Remove the rewrite rules from .htaccess for this site.
+  $htaccess = file_get_contents(DRUPAL_ROOT . '/.htaccess');
+  $site_start_token = "\n  # %UNL_START_SITE_ID_$site_id%";
+  $site_end_token = "  # %UNL_END_SITE_ID_$site_id%\n";
   
-  // Remove the symlink to the drupal root for this site.
-  $subdir = explode('/', $site_path);
-  $symlink_name = array_pop($subdir);
-  $subdir_levels = count($subdir);
-  $subdir = implode('/', $subdir);
-  unlink(DRUPAL_ROOT . '/' . $subdir . '/' . $symlink_name);
+  $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);
   
   return TRUE;
 }