diff --git a/src/Lunr/DataAccess/FilesystemAccessObjectInterface.php b/src/Lunr/DataAccess/FilesystemAccessObjectInterface.php
new file mode 100644
index 0000000000000000000000000000000000000000..8757183e2ad4ae14e0f40d2eb400d545754d7ab6
--- /dev/null
+++ b/src/Lunr/DataAccess/FilesystemAccessObjectInterface.php
@@ -0,0 +1,90 @@
+<?php
+
+/**
+ * Filesystem Access Object interface.
+ *
+ * PHP Version 5.3
+ *
+ * @category   Libraries
+ * @package    DataAccess
+ * @subpackage Libraries
+ * @author     Heinz Wiesinger <heinz@m2mobi.com>
+ * @copyright  2013, M2Mobi BV, Amsterdam, The Netherlands
+ * @license    http://lunr.nl/LICENSE MIT License
+ */
+
+namespace Lunr\DataAccess;
+
+/**
+ * Filesystem Access Object interface.
+ *
+ * @category   Libraries
+ * @package    DataAccess
+ * @subpackage Libraries
+ * @author     Heinz Wiesinger <heinz@m2mobi.com>
+ */
+interface FilesystemAccessObjectInterface
+{
+
+    /**
+     * Get a list of all non-dot directories in a given directory.
+     *
+     * @param String $directory Base directory
+     *
+     * @return Array $contents List of directory in that directory
+     */
+    public function get_list_of_directories($directory);
+
+    /**
+     * Get a list of all non-dot files in a given directory.
+     *
+     * @param String $directory Base directory
+     *
+     * @return Array $contents List of files in that directory
+     */
+    public function get_list_of_files($directory);
+
+    /**
+     * Get a listing of the contents of a given directory.
+     *
+     * @param String $directory Base directory
+     *
+     * @return Array $contents List of contents of that directory
+     */
+    public function get_directory_listing($directory);
+
+    /**
+     * Find a file in a given directory.
+     *
+     * @param String $needle   Filename to look for
+     * @param String $haystack Base directory to search in
+     *
+     * @return mixed $return Path of the file if found,
+     *                       FALSE on failure
+     */
+    public function find_matches($needle, $haystack);
+
+    /**
+     * Get the contents of a given file.
+     *
+     * @param String $file Filepath
+     *
+     * @return mixed $contents Contents of the given file as String on success,
+     *                         FALSE on failure
+     */
+    public function get_file_content($file);
+
+    /**
+     * Write contents into file.
+     *
+     * @param String $file     Filepath
+     * @param String $contents Contents to write
+     *
+     * @return mixed $return Written bytes as integer on success,
+     *                       FALSE on failure
+     */
+    public function put_file_content($file, $contents);
+
+}
+
+?>
diff --git a/src/Lunr/DataAccess/PhysicalFilesystemAccessObject.php b/src/Lunr/DataAccess/PhysicalFilesystemAccessObject.php
new file mode 100644
index 0000000000000000000000000000000000000000..17dffb8e2ee0b0c98038fca0de59d59b7fa3abb0
--- /dev/null
+++ b/src/Lunr/DataAccess/PhysicalFilesystemAccessObject.php
@@ -0,0 +1,263 @@
+<?php
+
+/**
+ * Physical filesystem access class.
+ *
+ * PHP Version 5.4
+ *
+ * @category   Libraries
+ * @package    DataAccess
+ * @subpackage Libraries
+ * @author     Heinz Wiesinger <heinz@m2mobi.com>
+ * @copyright  2013, M2Mobi BV, Amsterdam, The Netherlands
+ * @license    http://lunr.nl/LICENSE MIT License
+ */
+
+namespace Lunr\DataAccess;
+
+use DirectoryIterator;
+use RegexIterator;
+use UnexpectedValueException;
+use InvalidArgumentException;
+use RuntimeException;
+use LogicException;
+use RecursiveDirectoryIterator;
+use RecursiveIteratorIterator;
+use RecursiveRegexIterator;
+use SplFileObject;
+
+/**
+ * Class to access a physical filesystem.
+ *
+ * @category   Libraries
+ * @package    DataAccess
+ * @subpackage Libraries
+ * @author     Heinz Wiesinger <heinz@m2mobi.com>
+ */
+class PhysicalFilesystemAccessObject implements DataAccessObjectInterface, FilesystemAccessObjectInterface
+{
+
+    /**
+     * Shared instance of a Logger class.
+     * @var LoggerInterface
+     */
+    protected $logger;
+
+    /**
+     * Constructor.
+     *
+     * @param LoggerInterface $logger Shared instance of a Logger.
+     */
+    public function __construct($logger)
+    {
+        $this->logger = $logger;
+    }
+
+    /**
+     * Destructor.
+     */
+    public function __destruct()
+    {
+        unset($this->logger);
+    }
+
+    /**
+     * Get a list of all non-dot directories in a given directory.
+     *
+     * @param String $directory Base directory
+     *
+     * @return Array $contents List of directory in that directory
+     */
+    public function get_list_of_directories($directory)
+    {
+        $directories = array();
+
+        if (is_bool($directory))
+        {
+            return $directories;
+        }
+
+        try
+        {
+            $dir = new DirectoryIterator($directory);
+            foreach ($dir as $file)
+            {
+                if (!$file->isDot() && $file->isDir())
+                {
+                    $directories[] = $dir->getFilename();
+                }
+            }
+        }
+        catch(UnexpectedValueException $unexpected)
+        {
+            $context = [ 'directory' => $directory, 'message' => $unexpected->getMessage() ];
+            $this->logger->error("Couldn't open directory '{directory}': {message}", $context);
+        }
+        catch(RuntimeException $runtime)
+        {
+            $context = [ 'message' => $runtime->getMessage() ];
+            $this->logger->warning("{message}", $context);
+        }
+
+        return $directories;
+    }
+
+    /**
+     * Get a list of all non-dot files in a given directory.
+     *
+     * @param String $directory Base directory
+     *
+     * @return Array $contents List of files in that directory
+     */
+    public function get_list_of_files($directory)
+    {
+        $files = array();
+
+        if (is_bool($directory))
+        {
+            return $files;
+        }
+
+        try
+        {
+            $dir = new DirectoryIterator($directory);
+            foreach ($dir as $file)
+            {
+                if (!$file->isDot() && !$file->isDir())
+                {
+                    $files[] = $dir->getFilename();
+                }
+            }
+        }
+        catch(UnexpectedValueException $unexpected)
+        {
+            $context = [ 'directory' => $directory, 'message' => $unexpected->getMessage() ];
+            $this->logger->error("Couldn't open directory '{directory}': {message}", $context);
+        }
+        catch(RuntimeException $runtime)
+        {
+            $context = [ 'message' => $runtime->getMessage() ];
+            $this->logger->warning("{message}", $context);
+        }
+
+        return $files;
+    }
+
+    /**
+     * Get a listing of the contents of a given directory.
+     *
+     * @param String $directory Base directory
+     *
+     * @return Array $contents List of contents of that directory
+     */
+    public function get_directory_listing($directory)
+    {
+        $raw_results = scandir($directory, SCANDIR_SORT_NONE);
+
+        return array_diff($raw_results, array('.', '..'));
+    }
+
+    /**
+     * Find a file in a given directory.
+     *
+     * @param String $needle   Filename to look for
+     * @param String $haystack Base directory to search in
+     *
+     * @return mixed $return Path of the file if found,
+     *                       FALSE on failure
+     */
+    public function find_matches($needle, $haystack)
+    {
+        if (is_bool($needle) || is_bool($haystack))
+        {
+            return array();
+        }
+
+        try
+        {
+            $directory = new RecursiveDirectoryIterator($haystack);
+            $iterator  = new RecursiveIteratorIterator($directory);
+            $matches   = new RegexIterator($iterator, $needle, RecursiveRegexIterator::GET_MATCH);
+        }
+        catch(UnexpectedValueException $unexpected)
+        {
+            $context = [ 'directory' => $haystack, 'message' => $unexpected->getMessage() ];
+            $this->logger->error("Couldn't open directory '{directory}': {message}", $context);
+            return FALSE;
+        }
+        catch(InvalidArgumentException $invalid)
+        {
+            $context = [ 'message' => $invalid->getMessage() ];
+            $this->logger->error("{message}", $context);
+            return FALSE;
+        }
+        catch(RuntimeException $runtime)
+        {
+            $context = [ 'message' => $runtime->getMessage() ];
+            $this->logger->warning("{message}", $context);
+            return array();
+        }
+
+        return array_keys(iterator_to_array($matches));
+    }
+
+    /**
+     * Get a SplFileObject for a given path.
+     *
+     * @param String $file Filepath
+     * @param String $mode The mode in which to open the file. Default: readonly
+     *
+     * @return mixed $file SplFileObject instance for the path, FALSE on failure
+     */
+    public function get_file_object($file, $mode = 'r')
+    {
+        try
+        {
+            return is_bool($file) ? FALSE : new SplFileObject($file, $mode);
+        }
+        catch(RuntimeException $runtime)
+        {
+            $context = [ 'message' => $runtime->getMessage() ];
+            $this->logger->error("{message}", $context);
+
+            return FALSE;
+        }
+        catch(LogicException $logic)
+        {
+            $context = [ 'message' => $logic->getMessage() ];
+            $this->logger->error("{message}", $context);
+
+            return FALSE;
+        }
+    }
+
+    /**
+     * Get the contents of a given file.
+     *
+     * @param String $file Filepath
+     *
+     * @return mixed $contents Contents of the given file as String on success,
+     *                         FALSE on failure
+     */
+    public function get_file_content($file)
+    {
+        return is_bool($file) ? FALSE : file_get_contents($file);
+    }
+
+    /**
+     * Write contents into file.
+     *
+     * @param String $file     Filepath
+     * @param String $contents Contents to write
+     *
+     * @return mixed $return Written bytes as integer on success,
+     *                       FALSE on failure
+     */
+    public function put_file_content($file, $contents)
+    {
+        return is_bool($file) ? FALSE : file_put_contents($file, $contents);
+    }
+
+}
+
+?>
diff --git a/src/Lunr/DataAccess/Tests/PhysicalFilesystemAccessObjectBaseTest.php b/src/Lunr/DataAccess/Tests/PhysicalFilesystemAccessObjectBaseTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..c81cbb4630092b1f515ecf480ce40cef986f645a
--- /dev/null
+++ b/src/Lunr/DataAccess/Tests/PhysicalFilesystemAccessObjectBaseTest.php
@@ -0,0 +1,48 @@
+<?php
+
+/**
+ * This file contains the PhysicalFilesystemAccessObjectBaseTest class.
+ *
+ * PHP Version 5.4
+ *
+ * @category   Libraries
+ * @package    DataAccess
+ * @subpackage Tests
+ * @author     Heinz Wiesinger <heinz@m2mobi.com>
+ * @copyright  2013, M2Mobi BV, Amsterdam, The Netherlands
+ * @license    http://lunr.nl/LICENSE MIT License
+ */
+
+namespace Lunr\DataAccess\Tests;
+
+use Lunr\DataAccess\PhysicalFilesystemAccessObject;
+
+/**
+ * This class contains base tests for the PhysicalFilesystemAccessObject.
+ *
+ * @category   Libraries
+ * @package    DataAccess
+ * @subpackage Tests
+ * @author     Heinz Wiesinger <heinz@m2mobi.com>
+ * @covers     Lunr\DataAccess\PhysicalFilesystemAccessObject
+ */
+class PhysicalFilesystemAccessObjectBaseTest extends PhysicalFilesystemAccessObjectTest
+{
+
+    /**
+     * Test that the logger class is passed correctly.
+     */
+    public function testLoggerIsPassedCorrectly()
+    {
+        $property = $this->reflection->getProperty('logger');
+        $property->setAccessible(TRUE);
+
+        $value = $property->getValue($this->class);
+
+        $this->assertInstanceOf('Psr\Log\LoggerInterface', $value);
+        $this->assertSame($this->logger, $value);
+    }
+
+}
+
+?>
diff --git a/src/Lunr/DataAccess/Tests/PhysicalFilesystemAccessObjectDirectoryTest.php b/src/Lunr/DataAccess/Tests/PhysicalFilesystemAccessObjectDirectoryTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..9bb5384011eb76d0a88b9bc5f415631098f1112a
--- /dev/null
+++ b/src/Lunr/DataAccess/Tests/PhysicalFilesystemAccessObjectDirectoryTest.php
@@ -0,0 +1,132 @@
+<?php
+
+/**
+ * This file contains the PhysicalFilesystemAccessObjectDirectoryTest class.
+ *
+ * PHP Version 5.4
+ *
+ * @category   Libraries
+ * @package    DataAccess
+ * @subpackage Tests
+ * @author     Heinz Wiesinger <heinz@m2mobi.com>
+ * @copyright  2013, M2Mobi BV, Amsterdam, The Netherlands
+ * @license    http://lunr.nl/LICENSE MIT License
+ */
+
+namespace Lunr\DataAccess\Tests;
+
+use Lunr\DataAccess\PhysicalFilesystemAccessObject;
+
+/**
+ * This class contains tests for directory related methods in the PhysicalFilesystemAccessObject.
+ *
+ * @category   Libraries
+ * @package    DataAccess
+ * @subpackage Tests
+ * @author     Heinz Wiesinger <heinz@m2mobi.com>
+ * @covers     Lunr\DataAccess\PhysicalFilesystemAccessObject
+ */
+class PhysicalFilesystemAccessObjectDirectoryTest extends PhysicalFilesystemAccessObjectTest
+{
+
+    /**
+     * Test listing an accessible directory.
+     *
+     * @covers Lunr\DataAccess\PhysicalFilesystemAccessObject::get_directory_listing
+     */
+    public function testGetListingOfAccessibleDirectory()
+    {
+        $directory = __DIR__ . '/../../../../tests/statics/fao';
+
+        $expected = [ 'file1', 'file2', 'folder1', 'folder2' ];
+
+        $value = $this->class->get_directory_listing($directory);
+
+        $this->assertInternalType('array', $value);
+
+        sort($value);
+
+        $this->assertEquals($expected, $value);
+    }
+
+    /**
+     * Test listing  an inaccessible directory.
+     *
+     * @expectedException PHPUnit_Framework_Error_Warning
+     * @covers            Lunr\DataAccess\PhysicalFilesystemAccessObject::get_directory_listing
+     */
+    public function testGetListingOfInaccessibleDirectory()
+    {
+        $directory = '/root';
+
+        $value = $this->class->get_directory_listing($directory);
+
+        $this->assertInternalType('array', $value);
+        $this->assertEmpty($value);
+    }
+
+    /**
+     * Test listing an non-existant directory.
+     *
+     * @expectedException PHPUnit_Framework_Error_Warning
+     * @covers            Lunr\DataAccess\PhysicalFilesystemAccessObject::get_directory_listing
+     */
+    public function testGetListingOfNonExistantDirectory()
+    {
+        $directory = '/tmp56474q';
+
+        $value = $this->class->get_directory_listing($directory);
+
+        $this->assertInternalType('array', $value);
+        $this->assertEmpty($value);
+    }
+
+    /**
+     * Test listing a file.
+     *
+     * @expectedException PHPUnit_Framework_Error_Warning
+     * @covers            Lunr\DataAccess\PhysicalFilesystemAccessObject::get_directory_listing
+     */
+    public function testGetListingOfFile()
+    {
+        $directory = tempnam('/tmp', 'phpunit_');;
+
+        $value = $this->class->get_directory_listing($directory);
+
+        $this->assertInternalType('array', $value);
+        $this->assertEmpty($value);
+    }
+
+    /**
+     * Test listing an invalid directory.
+     *
+     * @expectedException PHPUnit_Framework_Error_Warning
+     * @dataProvider      invalidNameProvider
+     * @covers            Lunr\DataAccess\PhysicalFilesystemAccessObject::get_directory_listing
+     */
+    Public function testGetListingOfInvalidDirectory($directory)
+    {
+        $value = $this->class->get_directory_listing($directory);
+
+        $this->assertInternalType('array', $value);
+        $this->assertEmpty($value);
+    }
+
+    /**
+     * Test listing an boolean directory.
+     *
+     * @expectedException PHPUnit_Framework_Error_Warning
+     * @dataProvider      booleanNameProvider
+     * @covers            Lunr\DataAccess\PhysicalFilesystemAccessObject::get_directory_listing
+     */
+    Public function testGetListingOfBooleanDirectory($directory)
+    {
+        $value = $this->class->get_directory_listing($directory);
+
+        $this->assertInternalType('array', $value);
+        $this->assertEmpty($value);
+    }
+
+}
+
+?>
diff --git a/src/Lunr/DataAccess/Tests/PhysicalFilesystemAccessObjectFileTest.php b/src/Lunr/DataAccess/Tests/PhysicalFilesystemAccessObjectFileTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..a14fe4df279932314e31f7fa2d44c8f7e66169aa
--- /dev/null
+++ b/src/Lunr/DataAccess/Tests/PhysicalFilesystemAccessObjectFileTest.php
@@ -0,0 +1,344 @@
+<?php
+
+/**
+ * This file contains the PhysicalFilesystemAccessObjectFileTest class.
+ *
+ * PHP Version 5.4
+ *
+ * @category   Libraries
+ * @package    DataAccess
+ * @subpackage Tests
+ * @author     Heinz Wiesinger <heinz@m2mobi.com>
+ * @copyright  2013, M2Mobi BV, Amsterdam, The Netherlands
+ * @license    http://lunr.nl/LICENSE MIT License
+ */
+
+namespace Lunr\DataAccess\Tests;
+
+use Lunr\DataAccess\PhysicalFilesystemAccessObject;
+
+/**
+ * This class contains tests for file related methods in the PhysicalFilesystemAccessObject.
+ *
+ * @category   Libraries
+ * @package    DataAccess
+ * @subpackage Tests
+ * @author     Heinz Wiesinger <heinz@m2mobi.com>
+ * @covers     Lunr\DataAccess\PhysicalFilesystemAccessObject
+ */
+class PhysicalFilesystemAccessObjectFileTest extends PhysicalFilesystemAccessObjectTest
+{
+
+    /**
+     * Test that get_file_content() gets contents of an accessible file.
+     *
+     * @covers Lunr\DataAccess\PhysicalFilesystemAccessObject::get_file_content
+     */
+    public function testGetFileContentWithAccessibleFile()
+    {
+        $file = __DIR__ . '/../../../../tests/statics/logs/error.log';
+
+        $content = "[2011-11-10 10:30:22]: WARNING: Foo";
+
+        $fetched = $this->class->get_file_content($file);
+
+        $this->assertEquals($content, $fetched);
+    }
+
+    /**
+     * Test that get_file_content() does not get contents of an inaccessible file.
+     *
+     * @expectedException PHPUnit_Framework_Error_Warning
+     * @covers            Lunr\DataAccess\PhysicalFilesystemAccessObject::get_file_content
+     */
+    public function testGetFileContentWithInaccessibleFile()
+    {
+        $file = '/root/ab45cd89';
+
+        $fetched = $this->class->get_file_content($file);
+
+        $this->assertFalse($fetched);
+    }
+
+    /**
+     * Test that get_file_content() does not get contents of a non-existant file.
+     *
+     * @expectedException PHPUnit_Framework_Error_Warning
+     * @covers            Lunr\DataAccess\PhysicalFilesystemAccessObject::get_file_content
+     */
+    public function testGetFileContentWithNonExistantFile()
+    {
+        $file = '/tmp/ab45cd89';
+
+        $fetched = $this->class->get_file_content($file);
+
+        $this->assertFalse($fetched);
+    }
+
+    /**
+     * Test that get_file_content() does not get contents of a directory.
+     *
+     * @covers Lunr\DataAccess\PhysicalFilesystemAccessObject::get_file_content
+     */
+    public function testGetFileContentOfDirectory()
+    {
+        $file = '/tmp';
+
+        $fetched = $this->class->get_file_content($file);
+
+        $this->assertEquals('', $fetched);
+    }
+
+    /**
+     * Test that get_file_content() with invalid file names.
+     *
+     * @expectedException PHPUnit_Framework_Error_Warning
+     * @dataProvider      invalidNameProvider
+     * @covers            Lunr\DataAccess\PhysicalFilesystemAccessObject::get_file_content
+     */
+    public function testGetFileContentWithInvalidFilenames($file)
+    {
+        $fetched = $this->class->get_file_content($file);
+
+        $this->assertFalse($fetched);
+    }
+
+    /**
+     * Test that get_file_content() with invalid file names.
+     *
+     * @dataProvider booleanNameProvider
+     * @covers       Lunr\DataAccess\PhysicalFilesystemAccessObject::get_file_content
+     */
+    public function testGetFileContentWithBooleanFilenames($file)
+    {
+        $fetched = $this->class->get_file_content($file);
+
+        $this->assertFalse($fetched);
+    }
+
+    /**
+     * Test that put_file_content() puts contents in an accessible file.
+     *
+     * @covers Lunr\DataAccess\PhysicalFilesystemAccessObject::put_file_content
+     */
+    public function testPutFileContentWithAccessibleFile()
+    {
+        $file = tempnam('/tmp', 'phpunit_');
+
+        $content = "[2011-11-10 10:30:22]: WARNING: Foo";
+
+        $written = $this->class->put_file_content($file, $content);
+
+        $this->assertFileEquals(__DIR__ . '/../../../../tests/statics/logs/error.log', $file);
+        $this->assertEquals(35, $written);
+    }
+
+    /**
+     * Test that put_file_content() does not put contents in an inaccessible file.
+     *
+     * @expectedException PHPUnit_Framework_Error_Warning
+     * @covers            Lunr\DataAccess\PhysicalFilesystemAccessObject::put_file_content
+     */
+    public function testPutFileContentWithInaccessibleFile()
+    {
+        $file = '/root/ab45cd89';
+
+        $content = "[2011-11-10 10:30:22]: WARNING: Foo";
+
+        $written = $this->class->put_file_content($file, $content);
+
+        $this->assertFalse($written);
+    }
+
+    /**
+     * Test that put_file_content() puts contents in a non-existant file.
+     *
+     * @covers Lunr\DataAccess\PhysicalFilesystemAccessObject::put_file_content
+     */
+    public function testPutFileContentWithNonExistantFile()
+    {
+        $file = '/tmp/ab65cd89';
+
+        $content = "[2011-11-10 10:30:22]: WARNING: Foo";
+
+        $written = $this->class->put_file_content($file, $content);
+
+        $this->assertFileEquals(__DIR__ . '/../../../../tests/statics/logs/error.log', $file);
+        $this->assertEquals(35, $written);
+    }
+
+    /**
+     * Test that put_file_content() does not put contents in a directory.
+     *
+     * @expectedException PHPUnit_Framework_Error_Warning
+     * @covers            Lunr\DataAccess\PhysicalFilesystemAccessObject::put_file_content
+     */
+    public function testPutFileContentInDirectory()
+    {
+        $file = '/tmp';
+
+        $content = "[2011-11-10 10:30:22]: WARNING: Foo";
+
+        $written = $this->class->put_file_content($file, $content);
+
+        $this->assertFalse($written);
+    }
+
+    /**
+     * Test that put_file_content() with invalid file names.
+     *
+     * @expectedException PHPUnit_Framework_Error_Warning
+     * @dataProvider      invalidNameProvider
+     * @covers            Lunr\DataAccess\PhysicalFilesystemAccessObject::put_file_content
+     */
+    public function testPutFileContentWithInvalidFilenames($file)
+    {
+        $content = "[2011-11-10 10:30:22]: WARNING: Foo";
+
+        $written = $this->class->put_file_content($file, $content);
+
+        $this->assertFalse($written);
+    }
+
+    /**
+     * Test that put_file_content() with boolean file names.
+     *
+     * @dataProvider booleanNameProvider
+     * @covers       Lunr\DataAccess\PhysicalFilesystemAccessObject::put_file_content
+     */
+    public function testPutFileContentWithBooleanFilenames($file)
+    {
+        $content = "[2011-11-10 10:30:22]: WARNING: Foo";
+
+        $written = $this->class->put_file_content($file, $content);
+
+        $this->assertFalse($written);
+    }
+
+    /**
+     * Test getting a SplFileObject for an accessible file.
+     *
+     * @covers Lunr\DataAccess\PhysicalFilesystemAccessObject::get_file_object
+     */
+    public function testGetFileObjectForAccessibleFile()
+    {
+        $file = tempnam('/tmp', 'phpunit_');
+
+        $value = $this->class->get_file_object($file);
+
+        $this->assertInstanceOf('\SplFileObject', $value);
+    }
+
+    /**
+     * Test getting a SplFileObject for an accessible file with invalid mode.
+     *
+     * @runInSeparateProcess
+     *
+     * @dataProvider invalidModesProvider
+     * @covers       Lunr\DataAccess\PhysicalFilesystemAccessObject::get_file_object
+     */
+    public function testGetFileObjectForAccessibleFileWithInvalidMode($mode, $message)
+    {
+        $file = tempnam('/tmp', 'phpunit_');
+
+        $filename = is_object($mode) ? '' : $file;
+
+        $this->logger->expects($this->once())
+                     ->method('error')
+                     ->with("{message}", array('message' => "SplFileObject::__construct($filename)$message"));
+
+        $value = $this->class->get_file_object($file, $mode);
+
+        $this->assertFalse($value);
+    }
+
+    /**
+     * Test getting a SplFileObject for an inaccessible file.
+     *
+     * @covers Lunr\DataAccess\PhysicalFilesystemAccessObject::get_file_object
+     */
+    public function testGetFileObjectForInaccessibleFile()
+    {
+        $file = '/root/ab45cd89';
+
+        $error = "SplFileObject::__construct($file): failed to open stream: Permission denied";
+
+        $this->logger->expects($this->once())
+                     ->method('error')
+                     ->with("{message}", array('message' => $error));
+
+        $value = $this->class->get_file_object($file);
+
+        $this->assertFalse($value);
+    }
+
+    /**
+     * Test getting a SplFileObject for a non-existant file.
+     *
+     * @covers Lunr\DataAccess\PhysicalFilesystemAccessObject::get_file_object
+     */
+    public function testGetFileObjectForNonExistantFile()
+    {
+        $file = '/tmp/ab65cd89';
+
+        $value = $this->class->get_file_object($file);
+
+        $this->assertInstanceOf('\SplFileObject', $value);
+    }
+
+    /**
+     * Test getting a SplFileObject for a directory.
+     *
+     * @covers Lunr\DataAccess\PhysicalFilesystemAccessObject::get_file_object
+     */
+    public function testGetFileObjectOfDirectory()
+    {
+        $file = '/tmp';
+
+        $error = "Cannot use SplFileObject with directories";
+
+        $this->logger->expects($this->once())
+                     ->method('error')
+                     ->with("{message}", array('message' => $error));
+
+        $value = $this->class->get_file_object($file);
+
+        $this->assertFalse($value);
+    }
+
+    /**
+     * Test getting a SplFileObject for invalid file names.
+     *
+     * @dataProvider invalidNameProvider
+     * @covers       Lunr\DataAccess\PhysicalFilesystemAccessObject::get_file_object
+     */
+    public function testGetFileObjectForInvalidFilenames($file, $message)
+    {
+        $this->logger->expects($this->once())
+                     ->method('error')
+                     ->with("{message}", array('message' => $message));
+
+        $value = $this->class->get_file_object($file);
+
+        $this->assertFalse($value);
+    }
+
+    /**
+     * Test getting a SplFileObject for boolean file names.
+     *
+     * @dataProvider booleanNameProvider
+     * @covers       Lunr\DataAccess\PhysicalFilesystemAccessObject::get_file_object
+     */
+    public function testGetFileObjectForBooleanFilenames($file)
+    {
+        $this->logger->expects($this->never())
+                     ->method('error');
+
+        $value = $this->class->get_file_object($file);
+
+        $this->assertFalse($value);
+    }
+
+}
+
+?>
diff --git a/src/Lunr/DataAccess/Tests/PhysicalFilesystemAccessObjectFindTest.php b/src/Lunr/DataAccess/Tests/PhysicalFilesystemAccessObjectFindTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..bf1c711c5ea5311d2a4082bb2fed76fcc19e45d0
--- /dev/null
+++ b/src/Lunr/DataAccess/Tests/PhysicalFilesystemAccessObjectFindTest.php
@@ -0,0 +1,244 @@
+<?php
+
+/**
+ * This file contains the PhysicalFilesystemAccessObjectFindTest class.
+ *
+ * PHP Version 5.4
+ *
+ * @category   Libraries
+ * @package    DataAccess
+ * @subpackage Tests
+ * @author     Heinz Wiesinger <heinz@m2mobi.com>
+ * @copyright  2013, M2Mobi BV, Amsterdam, The Netherlands
+ * @license    http://lunr.nl/LICENSE MIT License
+ */
+
+namespace Lunr\DataAccess\Tests;
+
+use Lunr\DataAccess\PhysicalFilesystemAccessObject;
+
+/**
+ * This class contains tests for finding files in directories.
+ *
+ * @category   Libraries
+ * @package    DataAccess
+ * @subpackage Tests
+ * @author     Heinz Wiesinger <heinz@m2mobi.com>
+ * @covers     Lunr\DataAccess\PhysicalFilesystemAccessObject
+ */
+class PhysicalFilesystemAccessObjectFindTest extends PhysicalFilesystemAccessObjectTest
+{
+
+    /**
+     * Test finding in an accessible directory.
+     *
+     * @covers Lunr\DataAccess\PhysicalFilesystemAccessObject::find_matches
+     */
+    public function testGetMatchesOfAccessibleDirectory()
+    {
+        $directory = __DIR__ . '/../../../../tests/statics/fao';
+
+        $expected = [ $directory . '/folder1/filepattern' ];
+
+        $value = $this->class->find_matches('/^.+pattern/i', $directory);
+
+        $this->assertInternalType('array', $value);
+
+        sort($value);
+
+        $this->assertEquals($expected, $value);
+    }
+
+    /**
+     * Test fincing in an accessible directory with a NULL needle.
+     *
+     * @covers Lunr\DataAccess\PhysicalFilesystemAccessObject::find_matches
+     */
+    public function testGetMatchesOfAccessibleDirectoryWithNullNeedle()
+    {
+        $directory = __DIR__ . '/../../../../tests/statics/fao';
+
+        $error = "RegexIterator::__construct(): Empty regular expression";
+
+        $this->logger->expects($this->once())
+                     ->method('error')
+                     ->with("{message}", array('message' => $error)
+                     );
+
+        $value = $this->class->find_matches(NULL, $directory);
+
+        $this->assertFalse($value);
+    }
+
+    /**
+     * Test fincing in an accessible directory with an object needle.
+     *
+     * @covers Lunr\DataAccess\PhysicalFilesystemAccessObject::find_matches
+     */
+    public function testGetMatchesOfAccessibleDirectoryWithObjectNeedle()
+    {
+        $directory = __DIR__ . '/../../../../tests/statics/fao';
+
+        $error = "RegexIterator::__construct() expects parameter 2 to be string, object given";
+
+        $this->logger->expects($this->once())
+                     ->method('error')
+                     ->with("{message}", array('message' => $error)
+                     );
+
+        $value = $this->class->find_matches(new \stdClass(), $directory);
+
+        $this->assertFalse($value);
+    }
+
+    /**
+     * Test fincing in an accessible directory with an boolean needle.
+     *
+     * @dataProvider booleanNameProvider
+     * @covers       Lunr\DataAccess\PhysicalFilesystemAccessObject::find_matches
+     */
+    public function testGetMatchesOfAccessibleDirectoryWithBooleanNeedle($needle)
+    {
+        $directory = __DIR__ . '/../../../../tests/statics/fao';
+
+        $this->logger->expects($this->never())
+                     ->method('error');
+
+        $value = $this->class->find_matches($needle, $directory);
+
+        $this->assertInternalType('array', $value);
+        $this->assertEmpty($value);
+    }
+
+    /**
+     * Test finding in an inaccessible directory.
+     *
+     * @covers Lunr\DataAccess\PhysicalFilesystemAccessObject::find_matches
+     */
+    public function testGetMatchesOfInaccessibleDirectory()
+    {
+        $directory = '/root';
+
+        $error = "RecursiveDirectoryIterator::__construct($directory): failed to open dir: Permission denied";
+
+        $this->logger->expects($this->once())
+                     ->method('error')
+                     ->with("Couldn't open directory '{directory}': {message}",
+                        array('message'   => $error,
+                              'directory' => $directory
+                        )
+                     );
+
+        $value = $this->class->find_matches('/^.+pattern/i', $directory);
+
+        $this->assertFalse($value);
+    }
+
+    /**
+     * Test finding in an non-existant directory.
+     *
+     * @covers Lunr\DataAccess\PhysicalFilesystemAccessObject::find_matches
+     */
+    public function testGetMatchesOfNonExistantDirectory()
+    {
+        $directory = '/tmp56474q';
+
+        $error = "RecursiveDirectoryIterator::__construct($directory): failed to open dir: No such file or directory";
+
+        $this->logger->expects($this->once())
+                     ->method('error')
+                     ->with("Couldn't open directory '{directory}': {message}",
+                        array('message'   => $error,
+                              'directory' => $directory
+                        )
+                     );
+
+        $value = $this->class->find_matches('/^.+pattern/i', $directory);
+
+        $this->assertFalse($value);
+    }
+
+    /**
+     * Test finding in a file.
+     *
+     * @covers Lunr\DataAccess\PhysicalFilesystemAccessObject::find_matches
+     */
+    public function testGetFileMatchesInFile()
+    {
+        $directory = tempnam('/tmp', 'phpunit_');;
+
+        $error = "RecursiveDirectoryIterator::__construct($directory): failed to open dir: Not a directory";
+
+        $this->logger->expects($this->once())
+                     ->method('error')
+                     ->with("Couldn't open directory '{directory}': {message}",
+                        array('message'   => $error,
+                              'directory' => $directory
+                        )
+                     );
+
+        $value = $this->class->find_matches('/^.+pattern/i', $directory);
+
+        $this->assertFalse($value);
+    }
+
+    /**
+     * Test finding in an invalid directory.
+     *
+     * @covers Lunr\DataAccess\PhysicalFilesystemAccessObject::find_matches
+     */
+    Public function testGetMatchesOfNullDirectory()
+    {
+        $this->logger->expects($this->once())
+                     ->method('warning')
+                     ->with("{message}", array('message' => 'Directory name must not be empty.'));
+
+        $value = $this->class->find_matches('/^.+pattern/i', NULL);
+
+        $this->assertInternalType('array', $value);
+        $this->assertEmpty($value);
+    }
+
+    /**
+     * Test finding in an invalid directory.
+     *
+     * @covers Lunr\DataAccess\PhysicalFilesystemAccessObject::find_matches
+     */
+    Public function testGetMatchesOfObjectDirectory()
+    {
+        $directory = new \stdClass();
+
+        $error = "RecursiveDirectoryIterator::__construct() expects parameter 1 to be string, object given";
+
+        $this->logger->expects($this->once())
+                     ->method('error')
+                     ->with("Couldn't open directory '{directory}': {message}",
+                        array('message'   => $error,
+                              'directory' => $directory
+                        )
+                     );
+
+        $value = $this->class->find_matches('/^.+pattern/i', $directory);
+
+        $this->assertFalse($value);
+    }
+
+    /**
+     * Test finding in an boolean directory.
+     *
+     * @dataProvider booleanNameProvider
+     * @covers       Lunr\DataAccess\PhysicalFilesystemAccessObject::find_matches
+     */
+    Public function testGetMatchesOfBooleanDirectory($directory)
+    {
+        $this->logger->expects($this->never())
+                     ->method('error');
+
+        $value = $this->class->find_matches('/^.+pattern/i', NULL);
+
+        $this->assertInternalType('array', $value);
+        $this->assertEmpty($value);
+    }
+}
+
+?>
diff --git a/src/Lunr/DataAccess/Tests/PhysicalFilesystemAccessObjectListDirectoriesTest.php b/src/Lunr/DataAccess/Tests/PhysicalFilesystemAccessObjectListDirectoriesTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..88b3d21b31e93047f7e961edf2bdac0211d418b0
--- /dev/null
+++ b/src/Lunr/DataAccess/Tests/PhysicalFilesystemAccessObjectListDirectoriesTest.php
@@ -0,0 +1,182 @@
+<?php
+
+/**
+ * This file contains the PhysicalFilesystemAccessObjectListDirectoriesTest class.
+ *
+ * PHP Version 5.4
+ *
+ * @category   Libraries
+ * @package    DataAccess
+ * @subpackage Tests
+ * @author     Heinz Wiesinger <heinz@m2mobi.com>
+ * @copyright  2013, M2Mobi BV, Amsterdam, The Netherlands
+ * @license    http://lunr.nl/LICENSE MIT License
+ */
+
+namespace Lunr\DataAccess\Tests;
+
+use Lunr\DataAccess\PhysicalFilesystemAccessObject;
+
+/**
+ * This class contains tests for directory related methods in the PhysicalFilesystemAccessObject.
+ *
+ * @category   Libraries
+ * @package    DataAccess
+ * @subpackage Tests
+ * @author     Heinz Wiesinger <heinz@m2mobi.com>
+ * @covers     Lunr\DataAccess\PhysicalFilesystemAccessObject
+ */
+class PhysicalFilesystemAccessObjectListDirectoriesTest extends PhysicalFilesystemAccessObjectTest
+{
+
+    /**
+     * Test listing directories in an accessible directory.
+     *
+     * @covers Lunr\DataAccess\PhysicalFilesystemAccessObject::get_list_of_directories
+     */
+    public function testGetListOfDirectoriesInAccessibleDirectory()
+    {
+        $directory = __DIR__ . '/../../../../tests/statics/fao';
+
+        $expected = [ 'folder1', 'folder2' ];
+
+        $value = $this->class->get_list_of_directories($directory);
+
+        $this->assertInternalType('array', $value);
+
+        sort($value);
+
+        $this->assertEquals($expected, $value);
+    }
+
+    /**
+     * Test listing directories in an inaccessible directory.
+     *
+     * @covers Lunr\DataAccess\PhysicalFilesystemAccessObject::get_list_of_directories
+     */
+    public function testGetListOfDirectoriesInInaccessibleDirectory()
+    {
+        $directory = '/root';
+
+        $this->logger->expects($this->once())
+                     ->method('error')
+                     ->with("Couldn't open directory '{directory}': {message}",
+                        array('message'   => "DirectoryIterator::__construct($directory): failed to open dir: Permission denied",
+                              'directory' => $directory
+                        )
+                     );
+
+        $value = $this->class->get_list_of_directories($directory);
+
+        $this->assertInternalType('array', $value);
+        $this->assertEmpty($value);
+    }
+
+    /**
+     * Test listing directories in an non-existant directory.
+     *
+     * @covers Lunr\DataAccess\PhysicalFilesystemAccessObject::get_list_of_directories
+     */
+    public function testGetListOfDirectoriesInNonExistantDirectory()
+    {
+        $directory = '/tmp56474q';
+
+        $error = "DirectoryIterator::__construct($directory): failed to open dir: No such file or directory";
+
+        $this->logger->expects($this->once())
+                     ->method('error')
+                     ->with("Couldn't open directory '{directory}': {message}",
+                        array('message'   => $error,
+                              'directory' => $directory
+                        )
+                     );
+
+        $value = $this->class->get_list_of_directories($directory);
+
+        $this->assertInternalType('array', $value);
+        $this->assertEmpty($value);
+    }
+
+    /**
+     * Test listing directories in a file.
+     *
+     * @covers Lunr\DataAccess\PhysicalFilesystemAccessObject::get_list_of_directories
+     */
+    public function testGetListOfDirectoriesInFile()
+    {
+        $directory = tempnam('/tmp', 'phpunit_');;
+
+        $this->logger->expects($this->once())
+                     ->method('error')
+                     ->with("Couldn't open directory '{directory}': {message}",
+                        array('message'   => "DirectoryIterator::__construct($directory): failed to open dir: Not a directory",
+                              'directory' => $directory
+                        )
+                     );
+
+        $value = $this->class->get_list_of_directories($directory);
+
+        $this->assertInternalType('array', $value);
+        $this->assertEmpty($value);
+    }
+
+    /**
+     * Test listing directories in an invalid directory.
+     *
+     * @covers Lunr\DataAccess\PhysicalFilesystemAccessObject::get_list_of_directories
+     */
+    Public function testGetListOfDirectoriesInNullDirectory()
+    {
+        $this->logger->expects($this->once())
+                     ->method('warning')
+                     ->with("{message}", array('message' => 'Directory name must not be empty.'));
+
+        $value = $this->class->get_list_of_directories(NULL);
+
+        $this->assertInternalType('array', $value);
+        $this->assertEmpty($value);
+    }
+
+    /**
+     * Test listing directories in an invalid directory.
+     *
+     * @covers Lunr\DataAccess\PhysicalFilesystemAccessObject::get_list_of_directories
+     */
+    Public function testGetListOfDirectoriesInObjectDirectory()
+    {
+        $directory = new \stdClass();
+
+        $this->logger->expects($this->once())
+                     ->method('error')
+                     ->with("Couldn't open directory '{directory}': {message}",
+                        array('message'   => "DirectoryIterator::__construct() expects parameter 1 to be string, object given",
+                              'directory' => $directory
+                        )
+                     );
+
+        $value = $this->class->get_list_of_directories($directory);
+
+        $this->assertInternalType('array', $value);
+        $this->assertEmpty($value);
+    }
+
+    /**
+     * Test listing directories in an boolean directory.
+     *
+     * @dataProvider booleanNameProvider
+     * @covers       Lunr\DataAccess\PhysicalFilesystemAccessObject::get_list_of_directories
+     */
+    Public function testGetListOfDirectoriesInBooleanDirectory($directory)
+    {
+        $this->logger->expects($this->never())
+                     ->method('error');
+
+        $value = $this->class->get_list_of_directories($directory);
+
+        $this->assertInternalType('array', $value);
+        $this->assertEmpty($value);
+    }
+
+}
+
+?>
diff --git a/src/Lunr/DataAccess/Tests/PhysicalFilesystemAccessObjectListFilesTest.php b/src/Lunr/DataAccess/Tests/PhysicalFilesystemAccessObjectListFilesTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..3ff4ffdc98052d21a16e39ed8980862c135e1691
--- /dev/null
+++ b/src/Lunr/DataAccess/Tests/PhysicalFilesystemAccessObjectListFilesTest.php
@@ -0,0 +1,181 @@
+<?php
+
+/**
+ * This file contains the PhysicalFilesystemAccessObjectListFilesTest class.
+ *
+ * PHP Version 5.4
+ *
+ * @category   Libraries
+ * @package    DataAccess
+ * @subpackage Tests
+ * @author     Heinz Wiesinger <heinz@m2mobi.com>
+ * @copyright  2013, M2Mobi BV, Amsterdam, The Netherlands
+ * @license    http://lunr.nl/LICENSE MIT License
+ */
+
+namespace Lunr\DataAccess\Tests;
+
+use Lunr\DataAccess\PhysicalFilesystemAccessObject;
+
+/**
+ * This class contains tests for directory related methods in the PhysicalFilesystemAccessObject.
+ *
+ * @category   Libraries
+ * @package    DataAccess
+ * @subpackage Tests
+ * @author     Heinz Wiesinger <heinz@m2mobi.com>
+ * @covers     Lunr\DataAccess\PhysicalFilesystemAccessObject
+ */
+class PhysicalFilesystemAccessObjectListFilesTest extends PhysicalFilesystemAccessObjectTest
+{
+
+    /**
+     * Test listing files in an accessible directory.
+     *
+     * @covers Lunr\DataAccess\PhysicalFilesystemAccessObject::get_list_of_files
+     */
+    public function testGetListOfFilesInAccessibleDirectory()
+    {
+        $directory = __DIR__ . '/../../../../tests/statics/fao';
+
+        $expected = [ 'file1', 'file2' ];
+
+        $value = $this->class->get_list_of_files($directory);
+
+        $this->assertInternalType('array', $value);
+
+        sort($value);
+
+        $this->assertEquals($expected, $value);
+    }
+
+    /**
+     * Test listing files in an inaccessible directory.
+     *
+     * @covers Lunr\DataAccess\PhysicalFilesystemAccessObject::get_list_of_files
+     */
+    public function testGetListOfFilesInInaccessibleDirectory()
+    {
+        $directory = '/root';
+
+        $this->logger->expects($this->once())
+                     ->method('error')
+                     ->with("Couldn't open directory '{directory}': {message}",
+                        array('message'   => "DirectoryIterator::__construct($directory): failed to open dir: Permission denied",
+                              'directory' => $directory
+                        )
+                     );
+
+        $value = $this->class->get_list_of_files($directory);
+
+        $this->assertInternalType('array', $value);
+        $this->assertEmpty($value);
+    }
+
+    /**
+     * Test listing files in an non-existant directory.
+     *
+     * @covers Lunr\DataAccess\PhysicalFilesystemAccessObject::get_list_of_files
+     */
+    public function testGetListOfFilesInNonExistantDirectory()
+    {
+        $directory = '/tmp56474q';
+
+        $error = "DirectoryIterator::__construct($directory): failed to open dir: No such file or directory";
+
+        $this->logger->expects($this->once())
+                     ->method('error')
+                     ->with("Couldn't open directory '{directory}': {message}",
+                        array('message'   => $error,
+                              'directory' => $directory
+                        )
+                     );
+
+        $value = $this->class->get_list_of_files($directory);
+
+        $this->assertInternalType('array', $value);
+        $this->assertEmpty($value);
+    }
+
+    /**
+     * Test listing files in a file.
+     *
+     * @covers Lunr\DataAccess\PhysicalFilesystemAccessObject::get_list_of_files
+     */
+    public function testGetListOfFilesInFile()
+    {
+        $directory = tempnam('/tmp', 'phpunit_');;
+
+        $this->logger->expects($this->once())
+                     ->method('error')
+                     ->with("Couldn't open directory '{directory}': {message}",
+                        array('message'   => "DirectoryIterator::__construct($directory): failed to open dir: Not a directory",
+                              'directory' => $directory
+                        )
+                     );
+
+        $value = $this->class->get_list_of_files($directory);
+
+        $this->assertInternalType('array', $value);
+        $this->assertEmpty($value);
+    }
+
+    /**
+     * Test listing files in an invalid directory.
+     *
+     * @covers Lunr\DataAccess\PhysicalFilesystemAccessObject::get_list_of_files
+     */
+    Public function testGetListOfFilesInNullDirectory()
+    {
+        $this->logger->expects($this->never())
+                     ->method('error');
+
+        $value = $this->class->get_list_of_files(NULL);
+
+        $this->assertInternalType('array', $value);
+        $this->assertEmpty($value);
+    }
+
+    /**
+     * Test listing files in an invalid directory.
+     *
+     * @covers Lunr\DataAccess\PhysicalFilesystemAccessObject::get_list_of_files
+     */
+    Public function testGetListOfFilesInObjectDirectory()
+    {
+        $directory = new \stdClass();
+
+        $this->logger->expects($this->once())
+                     ->method('error')
+                     ->with("Couldn't open directory '{directory}': {message}",
+                        array('message'   => "DirectoryIterator::__construct() expects parameter 1 to be string, object given",
+                              'directory' => $directory
+                        )
+                     );
+
+        $value = $this->class->get_list_of_files($directory);
+
+        $this->assertInternalType('array', $value);
+        $this->assertEmpty($value);
+    }
+
+    /**
+     * Test listing files in an boolean directory.
+     *
+     * @dataProvider booleanNameProvider
+     * @covers       Lunr\DataAccess\PhysicalFilesystemAccessObject::get_list_of_files
+     */
+    Public function testGetListOfFilesInBooleanTrueDirectory($directory)
+    {
+        $this->logger->expects($this->never())
+                     ->method('error');
+
+        $value = $this->class->get_list_of_files($directory);
+
+        $this->assertInternalType('array', $value);
+        $this->assertEmpty($value);
+    }
+
+}
+
+?>
diff --git a/src/Lunr/DataAccess/Tests/PhysicalFilesystemAccessObjectTest.php b/src/Lunr/DataAccess/Tests/PhysicalFilesystemAccessObjectTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..c2418c5c48775331a04844b76ce0c18c1832bc0d
--- /dev/null
+++ b/src/Lunr/DataAccess/Tests/PhysicalFilesystemAccessObjectTest.php
@@ -0,0 +1,121 @@
+<?php
+
+/**
+ * This file contains the PhysicalFilesystemAccessObjectTest class.
+ *
+ * PHP Version 5.4
+ *
+ * @category   Libraries
+ * @package    DataAccess
+ * @subpackage Tests
+ * @author     Heinz Wiesinger <heinz@m2mobi.com>
+ * @copyright  2013, M2Mobi BV, Amsterdam, The Netherlands
+ * @license    http://lunr.nl/LICENSE MIT License
+ */
+
+namespace Lunr\DataAccess\Tests;
+
+use Lunr\DataAccess\PhysicalFilesystemAccessObject;
+use Psr\Log\LoggerInterface;
+use PHPUnit_Framework_TestCase;
+use ReflectionClass;
+use stdClass;
+
+/**
+ * This class contains common constructors/destructors and data providers
+ * for testing the PhysicalFilesystemAccessObject class.
+ *
+ * @category   Libraries
+ * @package    DataAccess
+ * @subpackage Tests
+ * @author     Heinz Wiesinger <heinz@m2mobi.com>
+ * @covers     Lunr\DataAccess\PhysicalFilesystemAccessObject
+ */
+abstract class PhysicalFilesystemAccessObjectTest extends PHPUnit_Framework_TestCase
+{
+
+    /**
+     * Instance of the PhysicalFilesystemAccessObject class.
+     * @var PhysicalFilesystemAccessObject
+     */
+    protected $class;
+
+    /**
+     * Reflection instance of the PhysicalFilesystemAccessObject class.
+     * @var ReflectionClass
+     */
+    protected $reflection;
+
+    /**
+     * Mock instance of a Logger class.
+     * @var LoggerInterface
+     */
+    protected $logger;
+
+    /**
+     * Test case constructor.
+     */
+    public function setUp()
+    {
+        $this->logger     = $this->getMock('Psr\Log\LoggerInterface');
+        $this->class      = new PhysicalFilesystemAccessObject($this->logger);
+        $this->reflection = new ReflectionClass('Lunr\DataAccess\PhysicalFilesystemAccessObject');
+    }
+
+    /**
+     * Test case destructor.
+     */
+    public function tearDown()
+    {
+        unset($this->class);
+        unset($this->reflection);
+        unset($this->logger);
+    }
+
+    /**
+     * Unit test data provider for invalid file or directory names.
+     *
+     * @return array $names Array of invalid names,
+     */
+    public function invalidNameProvider()
+    {
+        $names   = array();
+        $names[] = array(NULL, "SplFileObject::__construct(): Filename cannot be empty");
+        $names[] = array(new stdClass(), "SplFileObject::__construct() expects parameter 1 to be a valid path, object given");
+
+        return $names;
+    }
+
+    /**
+     * Unit test data provider for boolean file or directory names.
+     *
+     * @return array $names Array of boolean names,
+     */
+    public function booleanNameProvider()
+    {
+        $names   = array();
+        $names[] = array(TRUE);
+        $names[] = array(FALSE);
+
+        return $names;
+    }
+
+    /**
+     * Unit test data provider for invalid file open modes.
+     *
+     * @return array $modes Array of invalid modes,
+     */
+    public function invalidModesProvider()
+    {
+        $modes   = array();
+        $modes[] = array(NULL, ": failed to open stream: No such file or directory");
+        $modes[] = array(new stdClass(), ' expects parameter 2 to be string, object given');
+        $modes[] = array(TRUE, ": failed to open stream: No such file or directory");
+        $modes[] = array(FALSE, ": failed to open stream: No such file or directory");
+
+        return $modes;
+    }
+
+}
+
+?>
diff --git a/tests/phpunit.xml b/tests/phpunit.xml
index 35a398b810e354ebc281a5e0228e0354ab1b8864..409bcc8a9084eff646d1acfbd6b2fa1e7ff7c205 100644
--- a/tests/phpunit.xml
+++ b/tests/phpunit.xml
@@ -109,6 +109,12 @@
             <file>src/Lunr/DataAccess/Tests/DatabaseAccessObjectNoPoolTest.php</file>
             <file>src/Lunr/DataAccess/Tests/DatabaseAccessObjectPoolTest.php</file>
             <file>src/Lunr/DataAccess/Tests/DatabaseAccessObjectResultsTest.php</file>
+            <file>src/Lunr/DataAccess/Tests/PhysicalFilesystemAccessObjectBaseTest.php</file>
+            <file>src/Lunr/DataAccess/Tests/PhysicalFilesystemAccessObjectFileTest.php</file>
+            <file>src/Lunr/DataAccess/Tests/PhysicalFilesystemAccessObjectListDirectoriesTest.php</file>
+            <file>src/Lunr/DataAccess/Tests/PhysicalFilesystemAccessObjectListFilesTest.php</file>
+            <file>src/Lunr/DataAccess/Tests/PhysicalFilesystemAccessObjectDirectoryTest.php</file>
+            <file>src/Lunr/DataAccess/Tests/PhysicalFilesystemAccessObjectFindTest.php</file>
             <file>src/Lunr/Spwn/Tests/ResqueJobDispatcherTest.php</file>
 <!--            <file>src/Lunr/Database/Tests/DBManTest.php</file>
             <file>src/Lunr/Database/Tests/DBConTest.php</file>-->
