diff --git purl.module purl.module
index b75f73c..cb53041 100644
--- purl.module
+++ purl.module
@@ -540,7 +540,14 @@ function purl_load($modifier, $reset = FALSE) {
  */
 function purl_validate($modifier) {
   // Check that the value is valid
-  if (check_plain($modifier['provider']) && !empty($modifier['value']) && preg_match('!^[\.a-z0-9_-]+$!', $modifier['value']) && !menu_get_item($modifier['value'])) {
+  if (check_plain($modifier['provider']) && !empty($modifier['value']) && preg_match('!^[\.a-z0-9_-]+$!', $modifier['value']) && !menu_get_item($modifier['value']) && !in_array($modifier['value'], _purl_pathauto_patterns())) {
+    // Check the alias table for any potential conflicting aliases.
+    if (module_exists('path')) {
+      $has_alias = db_result(db_query_range("SELECT 1 FROM {url_alias} WHERE dst like '%s/%%' OR dst = '%s'", $modifier['value'], $modifier['value'], 0, 1));
+      if ($has_alias) {
+        return FALSE;
+      }
+    }
     $id = db_result(db_query("SELECT id FROM {purl} WHERE value = '%s'", $modifier['value']));
     if (!$id) {
       return true;
@@ -1008,3 +1015,82 @@ function purl_purl_processor() {
   );
   return $info;
 }
+
+
+/**
+ * Implementation of hook_requirements().
+ */
+function purl_requirements($phase) {
+  $requirements = array();
+  $t = get_t();
+  if ($phase == 'runtime' && module_exists('pathauto')) {
+    foreach(_purl_pathauto_patterns() as $pattern) {
+      if (strpos('[', $pattern) !== 0) {
+        $requirements['purl_pathauto'] = array(
+          'title' => $t('Purl'), 
+          'severity' => REQUIREMENT_WARNING,
+          'value' => $t('Pathauto Conflict'),
+          'description' => $t('Possible conflict between Purl and Pathauto: the beginning of at least of the patterns has a token. Cannot predict urls and prevent creation of PURLs that would conflict'),
+        );
+        break;
+      }
+    }
+  }
+  return $requirements;
+}
+
+/**
+ * Get all set pathauto patterns for validation purposes.
+ */
+function _purl_pathauto_patterns() {
+  static $pathauto_patterns = NULL;
+  if (!isset($pathauto_patterns)) {
+    $pathauto_patterns = array();
+    if (module_exists('pathauto')) {
+      // This could also be done by getting all possible pathauto patterns but
+      // was not sure how to do that as modules might define weird patterns
+    
+      // Using global $conf due to strongarm.
+      global $conf;
+    
+      // Set the defaults if have not been overriden
+      _pathauto_include();
+      $all_settings = module_invoke_all('pathauto', 'settings');
+      foreach ($all_settings as $settings) {
+        $module = $settings->module;
+        if (!isset($conf['pathauto_' . $module . '_pattern']) && isset($settings->patterndefault)) {
+          $start = array_shift(explode('/', $settings->patterndefault, 2));
+          $pathauto_patterns[$start] = $start;
+        }
+      }
+      foreach($conf as $key => $value) {
+        if (preg_match('/pathauto_.*_pattern/', $key) && !empty($value)) {
+          $start = array_shift(explode('/', $value, 2));
+          $pathauto_patterns[$start] = $start;
+        }
+      }
+    }
+  }
+  return $pathauto_patterns;
+}
+
+/**
+ * Implementation of hook_nodeapi().
+ *
+ * Preventing creating aliases that conflict with purl.
+ */
+function purl_nodeapi(&$node, $op, $arg) {
+  switch ($op) {
+    case 'validate':
+      if (module_exists('path') && (user_access('create url aliases') || user_access('administer url aliases'))) {
+        $node->path = trim($node->path);
+        // If the path is already in error, don't repeat the warning
+        if (!db_result(db_query("SELECT COUNT(dst) FROM {url_alias} WHERE dst = '%s' AND src != '%s'", $node->path, "node/$node->nid"))) {
+          if (db_result(db_query("SELECT id FROM {purl} WHERE value = '%s'", arg(0, $node->path)))) {
+            form_set_error('path', t('The path is already in use.'));
+          }
+        }
+      }
+      break;
+  }
+}
