diff --git a/bob/bio/base/config/preprocessor/filename.py b/bob/bio/base/config/preprocessor/filename.py
new file mode 100644
index 0000000000000000000000000000000000000000..e5d8b4d1d7552dce403069b842fdbb044abc1c8b
--- /dev/null
+++ b/bob/bio/base/config/preprocessor/filename.py
@@ -0,0 +1,3 @@
+import bob.bio.base
+
+preprocessor = bob.bio.base.preprocessor.Filename()
diff --git a/bob/bio/base/preprocessor/Filename.py b/bob/bio/base/preprocessor/Filename.py
new file mode 100644
index 0000000000000000000000000000000000000000..8d2f8ba0795c3a2c6325cda505399419fb421f80
--- /dev/null
+++ b/bob/bio/base/preprocessor/Filename.py
@@ -0,0 +1,105 @@
+# @date Wed May 11 12:39:37 MDT 2016
+# @author Manuel Gunther <siebenkopf@googlemail.com>
+#
+# Copyright (c) 2016, Regents of the University of Colorado on behalf of the University of Colorado Colorado Springs.
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
+#
+# 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
+#
+# 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
+#
+# 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+import bob.io.base
+
+import os
+
+from .Preprocessor import Preprocessor
+
+class Filename (Preprocessor):
+  """This preprocessor is simply passing over the file name, in order to be used in an extractor that loads the data from file.
+
+  The file name that will be returned by the :py:meth:`read_data` function will contain the path of the :py:class:`bob.db.verification.utils.File`, but it might contain more paths (such as the ``--preprocessed-directory`` passed on command line).
+  """
+
+  def __init__(self):
+    pass
+
+
+  # The call function (i.e. the operator() in C++ terms)
+  def __call__(self, data, annotations = None):
+    """__call__(data, annotations) -> data
+
+    This function appears to do something, but it simply returns ``1``, which is used nowhere.
+    We could also return ``None``, but this might trigger warnings in the calling function.
+
+    **Parameters:**
+
+    ``data`` : ``None``
+      The file name returned by :py:meth:`read_original_data`.
+
+    ``annotations`` : any
+      ignored.
+
+    **Returns:**
+
+    ``data`` : int
+      1 throughout
+    """
+    return 1
+
+
+  ############################################################
+  ### Special functions that might be overwritten on need
+  ############################################################
+
+  def read_original_data(self, original_file_name):
+    """read_original_data(original_file_name) -> data
+
+    This function does **not** read the original image..
+
+    **Parameters:**
+
+    ``original_file_name`` : any
+      ignored
+
+    **Returns:**
+
+    ``data`` : ``None``
+      throughout.
+    """
+    pass
+
+
+  def write_data(self, data, data_file):
+    """Does **not** write any data.
+
+    ``data`` : any
+      ignored.
+
+    ``data_file`` : any
+      ignored.
+    """
+    pass
+
+
+  def read_data(self, data_file):
+    """read_data(data_file) -> data
+
+    Returns the name of the data file without its filename extension.
+
+    **Parameters:**
+
+    ``data_file`` : str
+      The name of the preprocessed data file.
+
+    **Returns:**
+
+    ``data`` : str
+      The preprocessed data read from file.
+    """
+    return os.path.splitext(data_file)[0]
diff --git a/bob/bio/base/preprocessor/__init__.py b/bob/bio/base/preprocessor/__init__.py
index 11d00588f97c51573726b6be93fccd768ee79847..37dd71f9a870f77d3a72ad0a7dba91097384aad6 100644
--- a/bob/bio/base/preprocessor/__init__.py
+++ b/bob/bio/base/preprocessor/__init__.py
@@ -1,4 +1,5 @@
 from .Preprocessor import Preprocessor
+from .Filename import Filename
 
 # gets sphinx autodoc done right - don't remove it
 __all__ = [_ for _ in dir() if not _.startswith('_')]
diff --git a/bob/bio/base/test/test_preprocessor.py b/bob/bio/base/test/test_preprocessor.py
new file mode 100644
index 0000000000000000000000000000000000000000..bd78b60d25e4cd716cb8e67e0d2445a22c98480c
--- /dev/null
+++ b/bob/bio/base/test/test_preprocessor.py
@@ -0,0 +1,21 @@
+import bob.bio.base
+
+from . import utils
+
+def test_filename():
+  # load extractor
+  preprocessor = bob.bio.base.load_resource("filename", "preprocessor", preferred_package = 'bob.bio.base')
+  assert isinstance(preprocessor, bob.bio.base.preprocessor.Preprocessor)
+  assert isinstance(preprocessor, bob.bio.base.preprocessor.Filename)
+
+  # try to load the original image
+  assert preprocessor.read_original_data("/any/path") is None
+
+  # try to process
+  assert preprocessor(None, None) == 1
+
+  # try to write
+  preprocessor.write_data(None, "/any/path")
+
+  # read a file
+  assert preprocessor.read_data("/any/file.name") == "/any/file"
diff --git a/doc/implemented.rst b/doc/implemented.rst
index 6737d58008d04e68f8af7be834b4c355a02bf9b4..e753ab0bca98efa0034530874a42b5ff70f2e9d2 100644
--- a/doc/implemented.rst
+++ b/doc/implemented.rst
@@ -23,6 +23,7 @@ Implementations
 ~~~~~~~~~~~~~~~
 
 .. autosummary::
+   bob.bio.base.preprocessor.Filename
    bob.bio.base.extractor.Linearize
    bob.bio.base.algorithm.Distance
    bob.bio.base.algorithm.PCA
diff --git a/setup.py b/setup.py
index 5d0650d705fa6ee6d969ce31c1d889e3632ba8c0..92304c24a2572edb49367ccf96c58f490099534a 100644
--- a/setup.py
+++ b/setup.py
@@ -120,6 +120,7 @@ setup(
 
       'bob.bio.preprocessor': [
         'dummy             = bob.bio.base.test.dummy.preprocessor:preprocessor', # for test purposes only
+        'filename          = bob.bio.base.config.preprocessor.filename:preprocessor', # for test purposes only
       ],
 
       'bob.bio.extractor': [