diff --git a/apps/test_db/appinfo/app.php b/apps/test_db/appinfo/app.php
new file mode 100644
index 0000000000000000000000000000000000000000..b1ec4c4639c67f35c9ee21ec1de0e20f622e11f0
--- /dev/null
+++ b/apps/test_db/appinfo/app.php
@@ -0,0 +1,17 @@
+<?php
+
+OC_App::register( array( 
+  'order' => 11,
+  'id' => 'test_db',
+  'name' => 'Test' ));
+  
+OC_App::addNavigationEntry( array( 
+  'id' => 'test_db_index',
+  'order' => 11,
+  'href' => OC_Helper::linkTo( 'test_db', 'index.php' ),
+/*
+  'icon' => OC_Helper::imagePath( 'openstreetgame', 'icon.svg' ),
+*/
+  'name' => 'Test DB' ));
+  
+?>
diff --git a/apps/test_db/appinfo/info.xml b/apps/test_db/appinfo/info.xml
new file mode 100644
index 0000000000000000000000000000000000000000..06c716453cce2a4b610c23568a80095be84d2a53
--- /dev/null
+++ b/apps/test_db/appinfo/info.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="ISO-8859-1" ?>
+<info>
+	<id>test_db</id>
+	<name>Test DB</name>
+	<description>A test of the db</description>
+	<version>0.1</version>
+	<licence>AGPL</licence>
+	<author>Côme BERNIGAUD</author>
+	<require>2</require>
+</info>
diff --git a/apps/test_db/appinfo/install.php b/apps/test_db/appinfo/install.php
new file mode 100644
index 0000000000000000000000000000000000000000..034bf359140a40c6cb07310b9611780795ac501a
--- /dev/null
+++ b/apps/test_db/appinfo/install.php
@@ -0,0 +1,7 @@
+<?php
+//do some dummy stuff to test the newly created tables
+/*
+$query=OC_DB::prepare("INSERT INTO *PREFIX*test_dummy(foo_name,foo_value) VALUES(?,?)");
+$query->execute(array('bar',42));
+*/
+?>
diff --git a/apps/test_db/index.php b/apps/test_db/index.php
new file mode 100644
index 0000000000000000000000000000000000000000..2569aedb9b3b75e78f4607485ce560a77d6fe82b
--- /dev/null
+++ b/apps/test_db/index.php
@@ -0,0 +1,26 @@
+<?php
+
+require_once('../../lib/base.php');
+
+// Check if we are a user
+if( !OC_User::isLoggedIn()){
+	header( "Location: ".OC_Helper::linkTo( '', 'index.php' ));
+	exit();
+}
+
+class Test {
+    private $test1;
+    private $test2;
+    public function init() {
+        $this->test1 = "test1";
+        $this->test2 = 2;
+    }
+    public function show() {
+        echo "test1:".$this->test1."<br/>test2:".$this->test2."<br/>";
+    }
+};
+
+$tmpl = new OC_Template( 'test_db', 'index', 'user' );
+
+$tmpl->printPage();
+?>
diff --git a/apps/test_db/templates/index.php b/apps/test_db/templates/index.php
new file mode 100644
index 0000000000000000000000000000000000000000..3209e4d4b7b8d676c234455214f79d65bb2b35e8
--- /dev/null
+++ b/apps/test_db/templates/index.php
@@ -0,0 +1,17 @@
+<?php
+
+$t1 = new Test();
+$t1->init();
+$t1->show();
+$testid = OC_DB4App::store('test_db','main',OC_User::getUser(),$t1);
+echo "id in db is $testid<br/>\n";
+
+$t2 = OC_DB4App::get_object('test_db','main',$testid);
+$t2->show();
+
+print_r(OC_DB4App::get_objects('test_db','main',OC_User::getUser()));
+
+OC_DB4App::delete_object('test_db','main',$testid);
+
+OC_DB4App::drop('test_db','main');
+?>
diff --git a/lib/db.php b/lib/db.php
index 76d3fe5efcb2079afed0455f7670d0654018938a..414525ae20706103b7f1e4d9288d3552440a05b8 100644
--- a/lib/db.php
+++ b/lib/db.php
@@ -129,7 +129,7 @@ class OC_DB {
 		// Die if we have an error (error means: bad query, not 0 results!)
 		if( PEAR::isError($result)) {
 			$entry = 'DB Error: "'.$result->getMessage().'"<br />';
-			$entry .= 'Offending command was: '.$cmd.'<br />';
+			$entry .= 'Offending command was: '.$query.'<br />';
 			error_log( $entry );
 			die( $entry );
 		}
diff --git a/lib/db4app.php b/lib/db4app.php
new file mode 100644
index 0000000000000000000000000000000000000000..1200652fada4746937951c50819f7b83cb7d7f2c
--- /dev/null
+++ b/lib/db4app.php
@@ -0,0 +1,117 @@
+<?php
+/**
+ * ownCloud
+ *
+ * @author Côme BERNIGAUD
+ * @copyright 2011 Côme BERNIGAUD come.bernigaud@laposte.net
+ *
+ * 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/>.
+ *
+ */
+
+require_once('base.php');
+
+/**
+ * This class manages the access to the database from apps. It basically is a wrapper for
+ * OC_DB. It allows that apps doesn't contains SQL code.
+ */
+class OC_DB4App {
+	/**
+	 * @brief Store an object in the database
+	 * @param $appname  Name of the application
+	 * @param $table    Name of the database table
+	 * @param $userid   Id of owner of the object
+	 * @param $object   Object to save in the database
+	 * @returns id of the object in the database
+	 *
+	 */
+    static public function store($appname,$tablename,$userid,$object) {
+        $table = $appname."_".$tablename;
+        if(OC_DB::connect()) {
+            $CONFIG_DBTYPE = OC_Config::getValue( "dbtype", "sqlite" );
+            if( $CONFIG_DBTYPE == 'sqlite' or $CONFIG_DBTYPE == 'sqlite3' ){
+                $idline = "id INTEGER PRIMARY KEY AUTOINCREMENT";
+            } else {
+                $idline = "id int NOT NULL AUTO_INCREMENT";
+            }
+            $query = "CREATE TABLE IF NOT EXISTS *PREFIX*$table ($idline,uid int REFERENCES user(id),object text)";
+            OC_DB::query($query);
+            $query = "INSERT INTO *PREFIX*$table (uid,object) VALUES ('$userid','".OC_DB::escape(base64_encode(serialize($object)))."')";
+            OC_DB::query($query);
+            return OC_DB::insertid();
+        } else {
+            die ("could not connect to database");
+        }
+    }
+    
+	/**
+	 * @brief Get an object from the database
+	 * @param $appname  Name of the application
+	 * @param $table    Name of the database table
+	 * @param $objectid Id of the object
+	 * @returns the object
+	 *
+	 */
+    static public function get_object($appname,$tablename,$objectid) {
+        $table = $appname."_".$tablename;
+        if(OC_DB::connect()) {
+            $query = "SELECT object FROM *PREFIX*$table WHERE id='".OC_DB::escape($objectid)."'";
+            $q = OC_DB::prepare($query);
+            $result = $q->execute()->fetchOne();
+            return unserialize(base64_decode($result));
+        } else {
+            die ("could not connect to database");
+        }
+        
+    }
+    
+    static public function get_objects($appname,$tablename,$userid) {
+        $table = $appname."_".$tablename;
+        if(OC_DB::connect()) {
+            $query = "SELECT id FROM *PREFIX*$table WHERE uid='".OC_DB::escape($userid)."'";
+            $q = OC_DB::prepare($query);
+            $result = $q->execute()->fetchAll();
+            return $result;
+        } else {
+            die ("could not connect to database");
+        }
+    }
+    
+    static public function delete_object($appname,$tablename,$objectid) {
+        $table = $appname."_".$tablename;
+        if(OC_DB::connect()) {
+            $query = "DELETE FROM *PREFIX*$table WHERE id='".OC_DB::escape($objectid)."'";
+            $q = OC_DB::prepare($query);
+            $q->execute();
+            return true;
+        } else {
+            die ("could not connect to database");
+        }
+        
+    }
+    
+    static public function drop($appname,$tablename) {
+        $table = $appname."_".$tablename;
+        if(OC_DB::connect()) {
+            $query = "DROP TABLE *PREFIX*$table";
+            $q = OC_DB::prepare($query);
+            $q->execute();
+            return true;
+        } else {
+            die ("could not connect to database");
+        }
+        
+    }
+}
+?>