diff --git a/lib/testcase.php b/lib/testcase.php
new file mode 100644
index 0000000000000000000000000000000000000000..19494dc2f193f302918f5542ce5da0b8d70f1f44
--- /dev/null
+++ b/lib/testcase.php
@@ -0,0 +1,93 @@
+<?php
+
+/**
+* ownCloud
+*
+* @author Robin Appelman
+* @copyright 2010 Robin Appelman icewind1991@gmailc.om
+*
+* This library is free software; you can redistribute it and/or
+* modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
+* License as published by the Free Software Foundation; either
+* version 3 of the License, or any later version.
+*
+* This library is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+* GNU AFFERO GENERAL PUBLIC LICENSE for more details.
+*
+* You should have received a copy of the GNU Affero General Public
+* License along with this library.  If not, see <http://www.gnu.org/licenses/>.
+*
+*/
+
+
+/**
+ * base class for unit tests
+ */
+class OC_TestCase{
+	private $tests; //array of all tests in this test case
+	
+	public function __construct(){
+		$this->tests=array();
+		$this->results=array();
+		$functions=get_class_methods(get_class($this));
+		$exclude=get_class_methods('OC_TestCase');
+		foreach($functions as $function){
+			if(array_search($function,$exclude)===false){
+				$this->tests[]=$function;
+			}
+		}
+	}
+	
+	public function getTests(){
+		return $this->tests;
+	}
+	
+	/**
+	 * function that gets called before each test
+	 */
+	private function setup(){
+	}
+
+	/**
+	 * function that gets called after each test
+	 */
+	private function tearDown(){
+	}
+	
+	/**
+	 * check if the result equals the expected result
+	 * @param mixed $expected the expected result
+	 * @param mixed $result the actual result
+	 * @param string $error (optional) the error message to display if the result isn't expected
+	 */
+	protected function assertEquals($expected,$result,$error=''){
+		if($expected!==$result){
+			if($expected===true){
+				$expected='true';
+			}
+			if($expected===false){
+				$expected='false';
+			}
+			if($result===true){
+				$result='true';
+			}
+			if($result===false){
+				$result='false';
+			}
+			if($error==''){
+				$error="Unexpected result, expected '$expected' but was '$result'";
+			}
+			throw new Exception($error);
+		}
+	}
+
+	/**
+	 * fail the test
+	 * @param string $error the error message
+	 */
+	protected function fail($error){
+		throw new Exception($error);
+	}
+}
\ No newline at end of file
diff --git a/tests/index.php b/tests/index.php
new file mode 100644
index 0000000000000000000000000000000000000000..5e0dbc2c8388a19c1e1f681bb4175a3527d67a73
--- /dev/null
+++ b/tests/index.php
@@ -0,0 +1,79 @@
+<?php
+/**
+* ownCloud
+*
+* @author Robin Appelman
+* @copyright 2010 Robin Appelman icewind1991@gmailc.om
+*
+* This library is free software; you can redistribute it and/or
+* modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
+* License as published by the Free Software Foundation; either
+* version 3 of the License, or any later version.
+*
+* This library is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+* GNU AFFERO GENERAL PUBLIC LICENSE for more details.
+*
+* You should have received a copy of the GNU Affero General Public
+* License along with this library.  If not, see <http://www.gnu.org/licenses/>.
+*
+*/
+
+
+/**
+ * run all test cases
+ */
+ $RUNTIME_NOSETUPFS=true;
+require_once('../lib/base.php');
+require_once('testcase.php');
+require_once('template.php');
+
+$testCases=loadFiles(__DIR__,array('index.php','templates'));
+
+$testResults=array();
+foreach($testCases as $testCaseClass){
+	$testCase=new $testCaseClass();
+	$results=array();
+	foreach($testCase->getTests() as $test){
+		$testCase->setup();
+		try{
+			$testCase->$test();
+			$results[$test]='Ok';
+		}catch(Exception $e){
+			$results[$test]=$e->getMessage();
+		}
+		$testCase->tearDown();
+	}
+	$testResults[$testCaseClass]=$results;
+}
+
+$tmpl = new OC_TEMPLATE( 'tests', 'index');
+$tmpl->assign('tests',$testResults);
+$tmpl->printPage();
+
+/**
+ * recursively load all files in a folder
+ * @param string $path
+ * @param array $exclude list of files to exclude
+ */
+function loadFiles($path,$exclude=false){
+	$results=array();
+	if(!$exclude){
+		$exclude=array();
+	}
+	$dh=opendir($path);
+	while($file=readdir($dh)){
+		if($file!='.' && $file!='..' && array_search($file,$exclude)===false){
+			if(is_file($path.'/'.$file)){
+				$result=require_once($path.'/'.$file);
+				$results[]=$result;
+			}else{
+				$subResults=loadFiles($path.'/'.$file);
+				$results=array_merge($results,$subResults);
+			}
+		}
+	}
+	return $results;
+}
+?>
\ No newline at end of file
diff --git a/tests/lib/filesystem.php b/tests/lib/filesystem.php
new file mode 100644
index 0000000000000000000000000000000000000000..a1ded471a65196dc2647dca51ba1aef119ea4e18
--- /dev/null
+++ b/tests/lib/filesystem.php
@@ -0,0 +1,31 @@
+<?php
+class OC_FILEYSYSTEM_Test extends OC_TestCase
+{
+	public function setup(){
+		OC_UTIL::setupFS('testuser','testcase');
+	}
+	
+	public function isDir(){
+		$this->assertEquals(true, OC_FILESYSTEM::is_dir('/'),'Root is not a directory');
+	}
+	
+	public function fileExists(){
+		$this->assertEquals(false, OC_FILESYSTEM::file_exists('/dummy'),'Unexpected result with non-existing file');
+		OC_FILESYSTEM::file_put_contents('/dummy','foo');
+		$this->assertEquals(true, OC_FILESYSTEM::file_exists('/dummy'),'Unexpected result with existing file');
+	}
+
+	public function mkdir(){
+		OC_FILESYSTEM::mkdir('/dummy');
+		$this->assertEquals(true, OC_FILESYSTEM::file_exists('/dummy'),'No such file or directory after creating folder');
+		$this->assertEquals(true, OC_FILESYSTEM::is_dir('/dummy'),'File created instead of filder');
+	}
+	
+	public function tearDown(){
+		OC_FILESYSTEM::chroot('');
+		OC_FILESYSTEM::delTree('/testuser');
+		OC_UTIL::tearDownFS();
+	}
+}
+return 'OC_FILEYSYSTEM_Test';
+?>
\ No newline at end of file
diff --git a/tests/templates/index.php b/tests/templates/index.php
new file mode 100644
index 0000000000000000000000000000000000000000..b8d3dac06662be0ead6f93d383837832cb608e90
--- /dev/null
+++ b/tests/templates/index.php
@@ -0,0 +1,11 @@
+<?php foreach($_['tests'] as $name=>$results):?>
+	<h2><?php echo $name;?></h2>
+	<ul>
+		<?php foreach($results as $test=>$result):?>
+			<li>
+				<b><?php echo $test;?></b>
+				<?php echo $result;?>
+			</il>
+		<?php endforeach ?>
+	</ul>
+<?php endforeach ?>
\ No newline at end of file