diff --git a/pathinc.test b/pathinc.test
index 7a51487..040eb9a 100644
--- a/pathinc.test
+++ b/pathinc.test
@@ -5,117 +5,355 @@
  * Tests for the Pathinc path.inc
  */
 
-/**
- * A little helper class to make our class extensions simpler to change.
- */
-class PathincTestHelperDelegate extends DrupalTestCase {
-  public static function getInfoHelper($parentInfo) {
-    $parentInfo['group'] = str_replace('Path', 'Pathinc', $parentInfo['group']);
-    return $parentInfo;
+class PathincPathLookupTest extends PathLookupTest {
+
+  public static function getInfo() {
+    return PathincWebTestHelperDelegate::getInfoHelper(parent::getInfo());
+  }
+
+  function setUp() {
+    parent::setUp();
+    PathincWebTestHelperDelegate::setUpHelper($this);
   }
 
-  public static function setUpHelper($testClass) {
-    $modules = array('pathinc');
-    $success = module_enable($modules, TRUE);
-    $testClass->assertTrue($success, t('Enabled modules: %modules', array('%modules' => implode(', ', $modules))));
+  function testDrupalLookupPath() {
+    if (PathincWebTestHelperDelegate::testRun($this)) {
+      parent::testDrupalLookupPath();
+    }
   }
 }
 
 class PathincDrupalMatchPathTestCase extends DrupalMatchPathTestCase {
   public static function getInfo() {
-    return PathincTestHelperDelegate::getInfoHelper(parent::getInfo());
+    return PathincWebTestHelperDelegate::getInfoHelper(parent::getInfo());
   }
 
   function setUp() {
     parent::setUp();
-    PathincTestHelperDelegate::setUpHelper($this);
+    PathincWebTestHelperDelegate::setUpHelper($this);
+  }
+
+  function testDrupalMatchPath() {
+    if (PathincWebTestHelperDelegate::testRun($this)) {
+      parent::testDrupalMatchPath();
+    }
   }
 }
 
 class PathincUrlAlterFunctionalTest extends UrlAlterFunctionalTest {
   public static function getInfo() {
-    return PathincTestHelperDelegate::getInfoHelper(parent::getInfo());
+    return PathincWebTestHelperDelegate::getInfoHelper(parent::getInfo());
   }
 
   function setUp() {
     parent::setUp();
-    PathincTestHelperDelegate::setUpHelper($this);
+    PathincWebTestHelperDelegate::setUpHelper($this);
   }
-}
 
-class PathincPathLookupTest extends PathLookupTest {
-  public static function getInfo() {
-    return PathincTestHelperDelegate::getInfoHelper(parent::getInfo());
+  function testUrlAlter() {
+    if (PathincWebTestHelperDelegate::testRun($this)) {
+      parent::testUrlAlter();
+    }
   }
 
-  function setUp() {
-    parent::setUp();
-    PathincTestHelperDelegate::setUpHelper($this);
+  function testCurrentUrlRequestedPath() {
+    if (PathincWebTestHelperDelegate::testRun($this)) {
+      parent::testCurrentUrlRequestedPath();
+    }
   }
+
+  function testGetQInitialized() {
+    if (PathincWebTestHelperDelegate::testRun($this)) {
+      parent::testGetQInitialized();
+    }
+  }
+
+
 }
 
 class PathincPathSaveTest extends PathSaveTest {
   public static function getInfo() {
-    return PathincTestHelperDelegate::getInfoHelper(parent::getInfo());
+    return PathincWebTestHelperDelegate::getInfoHelper(parent::getInfo());
   }
 
   function setUp() {
     parent::setUp();
-    PathincTestHelperDelegate::setUpHelper($this);
+    PathincWebTestHelperDelegate::setUpHelper($this);
+  }
+
+  function testDrupalSaveOriginalPath() {
+    if (PathincWebTestHelperDelegate::testRun($this)) {
+      parent::testDrupalSaveOriginalPath();
+    }
   }
+
+
 }
 
 class PathincPathTestCase extends PathTestCase {
   public static function getInfo() {
-    return PathincTestHelperDelegate::getInfoHelper(parent::getInfo());
+    return PathincWebTestHelperDelegate::getInfoHelper(parent::getInfo());
   }
 
   function setUp() {
     parent::setUp();
-    PathincTestHelperDelegate::setUpHelper($this);
+    PathincWebTestHelperDelegate::setUpHelper($this);
+  }
+
+  function testPathinc() {
+    if (!PathincWebTestHelperDelegate::testRun($this)) {
+      PathincWebTestHelperDelegate::testOuterRun($this);
+    }
+  }
+
+  function testPathCache() {
+    if (PathincWebTestHelperDelegate::testRun($this)) {
+      parent::testPathCache();
+    }
+  }
+
+  function testAdminAlias() {
+    if (PathincWebTestHelperDelegate::testRun($this)) {
+      parent::testAdminAlias();
+    }
+  }
+
+  function testNodeAlias() {
+    if (PathincWebTestHelperDelegate::testRun($this)) {
+      parent::testNodeAlias();
+    }
+  }
+
+  function testDuplicateNodeAlias() {
+    if (PathincWebTestHelperDelegate::testRun($this)) {
+      parent::testDuplicateNodeAlias();
+    }
   }
 }
 
 class PathincPathTaxonomyTermTestCase extends PathTaxonomyTermTestCase {
   public static function getInfo() {
-    return PathincTestHelperDelegate::getInfoHelper(parent::getInfo());
+    return PathincWebTestHelperDelegate::getInfoHelper(parent::getInfo());
   }
 
   function setUp() {
     parent::setUp();
-    PathincTestHelperDelegate::setUpHelper($this);
+    PathincWebTestHelperDelegate::setUpHelper($this);
+  }
+
+  function testTermAlias() {
+    if (PathincWebTestHelperDelegate::testRun($this)) {
+      parent::testTermAlias();
+    }
   }
+
 }
 
 class PathincPathLanguageTestCase extends PathLanguageTestCase {
   public static function getInfo() {
-    return PathincTestHelperDelegate::getInfoHelper(parent::getInfo());
+    return PathincWebTestHelperDelegate::getInfoHelper(parent::getInfo());
   }
 
   function setUp() {
     parent::setUp();
-    PathincTestHelperDelegate::setUpHelper($this);
+    PathincWebTestHelperDelegate::setUpHelper($this);
+  }
+
+  function testAliasTranslation() {
+    if (PathincWebTestHelperDelegate::testRun($this)) {
+      parent::testAliasTranslation();
+    }
   }
 }
 
 class PathincPathLanguageUITestCase extends PathLanguageUITestCase {
   public static function getInfo() {
-    return PathincTestHelperDelegate::getInfoHelper(parent::getInfo());
+    return PathincWebTestHelperDelegate::getInfoHelper(parent::getInfo());
   }
 
   function setUp() {
     parent::setUp();
-    PathincTestHelperDelegate::setUpHelper($this);
+    PathincWebTestHelperDelegate::setUpHelper($this);
+  }
+
+  function testLanguageNeutralURLs() {
+    if (PathincWebTestHelperDelegate::testRun($this)) {
+      parent::testLanguageNeutralURLs();
+    }
+  }
+
+  function testDefaultLanguageURLs() {
+    if (PathincWebTestHelperDelegate::testRun($this)) {
+      parent::testDefaultLanguageURLs();
+    }
+  }
+
+  function testNonDefaultURLs() {
+    if (PathincWebTestHelperDelegate::testRun($this)) {
+      parent::testNonDefaultURLs();
+    }
   }
 }
 
 class PathincPathMonolingualTestCase extends PathMonolingualTestCase {
   public static function getInfo() {
-    return PathincTestHelperDelegate::getInfoHelper(parent::getInfo());
+    return PathincWebTestHelperDelegate::getInfoHelper(parent::getInfo());
   }
 
   function setUp() {
     parent::setUp();
-    PathincTestHelperDelegate::setUpHelper($this);
+    PathincWebTestHelperDelegate::setUpHelper($this);
+  }
+
+  function testPageLinks() {
+    if (PathincWebTestHelperDelegate::testRun($this)) {
+      parent::testPageLinks();
+    }
   }
 }
+
+/**
+ * A little helper class to make our class extensions simpler to change.
+ */
+class PathincWebTestHelperDelegate extends DrupalWebTestCase {
+  public static function getInfoHelper($parentInfo) {
+    $parentInfo['group'] = str_replace('Path', 'Pathinc', $parentInfo['group']);
+    return $parentInfo;
+  }
+
+  public static function setUpHelper(DrupalWebTestCase $testClass) {
+    if (!self::inCURL()) {
+      $modules = array('simpletest', 'pathinc');
+      $success = module_enable($modules, TRUE);
+      $testClass->assertTrue($success, t('Enabled modules: %modules', array('%modules' => implode(', ', $modules))));
+      $testClass->resetAll();
+      // Create and login user
+      $admin_user = $testClass->drupalCreateUser(array('administer unit tests'));
+      $testClass->drupalLogin($admin_user);
+    }
+    else {
+      $modules = array('pathinc');
+      $success = module_enable($modules, TRUE);
+      $testClass->assertTrue($success, t('Enabled modules: %modules', array('%modules' => implode(', ', $modules))));
+      //$testClass->resetAll();
+    }
+  }
+
+  public static function testOuterRun($testClass) {
+    // Run this test from web interface.
+    $testClass->drupalGet('admin/config/development/testing');
+
+    $edit = array();
+    $edit[get_class($testClass)] = TRUE;
+    $testClass->drupalPost(NULL, $edit, t('Run tests'));
+
+    // Parse results and add to our results.
+    $results = self::getTestResults($testClass);
+    if (!empty($results['assertions'])) {
+      foreach ($results['assertions'] as $result) {
+        switch ($result['status']) {
+          case 'pass':
+          case 'fail':
+            $testClass->assert($result['status'], $result['message'], $result['type'], array(
+              'file' => $result['file'],
+              'line' => $result['line'],
+              'function' => $result['function'],
+            ));
+            break;
+        }
+      }
+    }
+    else {
+      $testClass->fail('Did not find any valid assertions from sub tests.');
+    }
+  }
+
+  public static function testRun($testClass) {
+    if (self::inCURL()) {
+      return TRUE;
+    }
+    else {
+      return FALSE;
+    }
+  }
+
+  /**
+   * Get the results from a test and store them in the class array $results.
+   */
+  public static function getTestResults($testClass) {
+    $results = array();
+    if ($testClass->parse()) {
+      if ($fieldset = self::getResultFieldSet($testClass)) {
+        // Code assumes this is the only test in group.
+        $results['summary'] = self::asText($testClass, $fieldset->div->div[1]);
+        $results['name'] = self::asText($testClass, $fieldset->legend);
+
+        $results['assertions'] = array();
+        $tbody = $fieldset->div->table->tbody;
+        foreach ($tbody->tr as $row) {
+          $assertion = array();
+          $assertion['message'] = self::asText($testClass, $row->td[0]);
+          $assertion['type'] = self::asText($testClass, $row->td[1]);
+          $assertion['file'] = self::asText($testClass, $row->td[2]);
+          $assertion['line'] = self::asText($testClass, $row->td[3]);
+          $assertion['function'] = self::asText($testClass, $row->td[4]);
+          $ok_url = file_create_url('misc/watchdog-ok.png');
+          $fail_url = file_create_url('misc/watchdog-error.png');
+          $verbose_url = file_create_url('misc/watchdog-warning.png');
+          switch ($row->td[5]->img['src']) {
+            case $ok_url:
+              $assertion['status'] = 'pass';
+              break;
+
+            case $fail_url:
+              $assertion['status'] = 'fail';
+              break;
+
+            case $verbose_url:
+              $assertion['status'] = 'verbose';
+              break;
+          }
+          $results['assertions'][] = $assertion;
+        }
+      }
+    }
+    return $results;
+  }
+
+  /**
+   * Get the fieldset containing the results for group this test is in.
+   */
+  public static function getResultFieldSet($testClass) {
+    $name = get_class($testClass);
+    $fieldsets = $testClass->xpath('//fieldset');
+    $info = $name::getInfo();
+    foreach ($fieldsets as $fieldset) {
+      if (self::asText($testClass, $fieldset->legend) == $info['name']) {
+        return $fieldset;
+      }
+    }
+    return FALSE;
+  }
+
+  /**
+   * Extract the text contained by the element.
+   *
+   * @param $element
+   *   Element to extract text from.
+   * @return
+   *   Extracted text.
+   */
+  public static function asText($testClass, SimpleXMLElement $element) {
+    if (!is_object($element)) {
+      return $testClass->fail('The element is not an element.');
+    }
+    return trim(html_entity_decode(strip_tags($element->asXML())));
+  }
+
+  /**
+   * Check if the test is being run from inside a CURL request.
+   */
+  public static function inCURL() {
+    return (bool) drupal_valid_test_ua();
+  }
+}
\ No newline at end of file
