diff --git modules/webfm_pathfilter/webfm_pathfilter.info modules/webfm_pathfilter/webfm_pathfilter.info
new file mode 100644
index 0000000..f92d4c0
--- /dev/null
+++ modules/webfm_pathfilter/webfm_pathfilter.info
@@ -0,0 +1,6 @@
+; $Id$
+name = WebFM Path Filter
+description = Change webfm path to server paths
+package = WebFM
+dependencies[] = webfm
+core = "6.x"
\ No newline at end of file
diff --git modules/webfm_pathfilter/webfm_pathfilter.module modules/webfm_pathfilter/webfm_pathfilter.module
new file mode 100644
index 0000000..11f9ae4
--- /dev/null
+++ modules/webfm_pathfilter/webfm_pathfilter.module
@@ -0,0 +1,88 @@
+<?php
+// $Id$
+/**
+ * @file
+ * Convert webfm_send/FID paths to server paths
+ */
+
+/**
+ * Implements hook_help();
+ */
+function webfm_pf_help($path, $arg) {
+  switch ($path) {
+    // Main module help for the block module
+    case 'admin/help#webfm_pf':
+      $help = '<p>' . t('Substitutes WebFM paths (webfm_send) for real server paths on any tag that includes "href" or "src" attributes. <br /><br />e.g. &lt;a href="/webfm_path/123" alt="a webfm link"&gt; : &lt;a href="/base/path/path/to/file.ext" alt="a webfm link"&gt;') . '</p>';
+      return $help;
+  }
+}
+
+/**
+ * Implements hook_filter();
+ */
+function webfm_pf_filter($op, $delta = 0, $format = -1, $text = '', $cache_id = 0) {
+  if ($op == 'list') {
+    return array(
+      0 => t('WebFM path filter'),
+    );
+  }
+
+  switch ($delta) {
+
+    case 0:
+
+      switch ($op) {
+        case 'description':
+          $description =  t('Substitutes WebFM paths (webfm_send) for real server paths on any tag that includes "href" or "src" attributes. <br /><br />e.g. &lt;a href="/webfm_path/123" alt="a webfm link"&gt; : &lt;a href="/base/path/path/to/file.ext" alt="a webfm link"&gt;');
+          return $description;
+
+        case 'prepare':
+          return $text;
+
+        case 'process':
+          if ($text != '') {
+            // Regex that matches any "a" or "img" tag
+            // Split in multiple groups so that we can put back again in the callback without loosing any information
+            // TODO: provide users with a way to set which tags to match
+            $pattern = '/<((a|img)+[^>]*(href|src)=("|\'))([^"|^\'|^?]+)([^>]*)>/i';
+            // Run the regex and send to the call back for processing
+            $text = preg_replace_callback($pattern, '_webfm_pf_replacement', $text);
+          }
+
+          return $text;
+      }
+      break;
+  }
+}
+
+/**
+ * Callback for preg_replace_callback(),
+ * Get the real path for a WebFM file id.
+ *
+ * @param $matches
+ *   Array of matches provided by preg_replace_callback().
+ *
+ * @return
+ *   Openning HTML tag replacing webfm_send/FID for its server path.
+ */
+function _webfm_pf_replacement($matches) {
+  // Get and escape $base_url and base_path()
+  global $base_url;
+  $escaped_base_url = preg_quote($base_url,'/');
+  $escaped_base_path = preg_quote(base_path(),'/');
+
+  // make path relative
+  $path = preg_replace('/^((' . $escaped_base_url . ')?(' . $escaped_base_path . ')?)/i', '', $matches[5]);
+
+  // Get normal drupal path
+  $drupal_path = drupal_get_normal_path($path);
+
+  // Check if it is a webfm_send/123 path
+  if (preg_match('/webfm_send\/([0-9]+)/i', $drupal_path, $result) == 1) {
+    // Get server file path
+    $file = webfm_get_file_record($result[1]);
+    // Return tag with real path
+    return '<' . $matches[1] . base_path() . $file->fpath . $matches[6] . '>';
+  }
+  return $matches[0];
+}
\ No newline at end of file
