diff --git a/lib/appconfig.php b/lib/appconfig.php
index e615d838173e9a182d2397be10a9d5cad98577f9..9a21bfb0a24509c5259367259e2aa8a27ad10b58 100644
--- a/lib/appconfig.php
+++ b/lib/appconfig.php
@@ -33,11 +33,21 @@
  *
  */
 
+namespace OC;
+
+use \OC\DB\Connection;
+
 /**
  * This class provides an easy way for apps to store config values in the
  * database.
  */
-class OC_Appconfig{
+class AppConfig {
+	protected $conn;
+
+	public function __construct(Connection $conn) {
+		$this->conn = $conn;
+	}
+
 	/**
 	 * @brief Get all apps using the config
 	 * @return array with app ids
@@ -45,16 +55,14 @@ class OC_Appconfig{
 	 * This function returns a list of all apps that have at least one
 	 * entry in the appconfig table.
 	 */
-	public static function getApps() {
-		// No magic in here!
-		$query = OC_DB::prepare( 'SELECT DISTINCT `appid` FROM `*PREFIX*appconfig`' );
-		$result = $query->execute();
+	public function getApps() {
+		$query = 'SELECT DISTINCT `appid` FROM `*PREFIX*appconfig`';
+		$result = $this->conn->executeQuery( $query );
 
 		$apps = array();
-		while( $row = $result->fetchRow()) {
-			$apps[] = $row["appid"];
+		while( $appid = $result->fetchColumn()) {
+			$apps[] = $appid;
 		}
-
 		return $apps;
 	}
 
@@ -66,14 +74,13 @@ class OC_Appconfig{
 	 * This function gets all keys of an app. Please note that the values are
 	 * not returned.
 	 */
-	public static function getKeys( $app ) {
-		// No magic in here as well
-		$query = OC_DB::prepare( 'SELECT `configkey` FROM `*PREFIX*appconfig` WHERE `appid` = ?' );
-		$result = $query->execute( array( $app ));
+	public function getKeys( $app ) {
+		$query = 'SELECT `configkey` FROM `*PREFIX*appconfig` WHERE `appid` = ?';
+		$result = $this->conn->executeQuery( $query, array( $app ));
 
 		$keys = array();
-		while( $row = $result->fetchRow()) {
-			$keys[] = $row["configkey"];
+		while( $key = $result->fetchColumn()) {
+			$keys[] = $key;
 		}
 
 		return $keys;
@@ -89,15 +96,13 @@ class OC_Appconfig{
 	 * This function gets a value from the appconfig table. If the key does
 	 * not exist the default value will be returned
 	 */
-	public static function getValue( $app, $key, $default = null ) {
-		// At least some magic in here :-)
-		$query = OC_DB::prepare( 'SELECT `configvalue` FROM `*PREFIX*appconfig`'
-			.' WHERE `appid` = ? AND `configkey` = ?' );
-		$result = $query->execute( array( $app, $key ));
-		$row = $result->fetchRow();
+	public function getValue( $app, $key, $default = null ) {
+		$query = 'SELECT `configvalue` FROM `*PREFIX*appconfig`'
+			.' WHERE `appid` = ? AND `configkey` = ?';
+		$row = $this->conn->fetchAssoc($query, array( $app, $key ));
 		if($row) {
-			return $row["configvalue"];
-		}else{
+			return $row['configvalue'];
+		} else {
 			return $default;
 		}
 	}
@@ -108,8 +113,8 @@ class OC_Appconfig{
 	 * @param string $key
 	 * @return bool
 	 */
-	public static function hasKey($app, $key) {
-		$exists = self::getKeys( $app );
+	public function hasKey($app, $key) {
+		$exists = $this->getKeys( $app );
 		return in_array( $key, $exists );
 	}
 
@@ -118,21 +123,27 @@ class OC_Appconfig{
 	 * @param string $app app
 	 * @param string $key key
 	 * @param string $value value
-	 * @return bool
 	 *
 	 * Sets a value. If the key did not exist before it will be created.
 	 */
-	public static function setValue( $app, $key, $value ) {
-		// Does the key exist? yes: update. No: insert
-		if(! self::hasKey($app, $key)) {
-			$query = OC_DB::prepare( 'INSERT INTO `*PREFIX*appconfig` ( `appid`, `configkey`, `configvalue` )'
-				.' VALUES( ?, ?, ? )' );
-			$query->execute( array( $app, $key, $value ));
-		}
-		else{
-			$query = OC_DB::prepare( 'UPDATE `*PREFIX*appconfig` SET `configvalue` = ?'
-				.' WHERE `appid` = ? AND `configkey` = ?' );
-			$query->execute( array( $value, $app, $key ));
+	public function setValue( $app, $key, $value ) {
+		// Does the key exist? no: insert, yes: update.
+		if ( !$this->hasKey($app, $key)) {
+			$data = array(
+				'appid' => $app,
+				'configkey' => $key,
+				'configvalue' => $value,
+			);
+			$this->conn->insert('*PREFIX*appconfig', $data);
+		} else {
+			$data = array(
+				'configvalue' => $value,
+			);
+			$where = array(
+				'appid' => $app,
+				'configkey' => $key,
+			);
+			$this->conn->update('*PREFIX*appconfig', $data, $where);
 		}
 	}
 
@@ -144,12 +155,12 @@ class OC_Appconfig{
 	 *
 	 * Deletes a key.
 	 */
-	public static function deleteKey( $app, $key ) {
-		// Boring!
-		$query = OC_DB::prepare( 'DELETE FROM `*PREFIX*appconfig` WHERE `appid` = ? AND `configkey` = ?' );
-		$query->execute( array( $app, $key ));
-
-		return true;
+	public function deleteKey( $app, $key ) {
+		$where = array(
+			'appid' => $app,
+			'configkey' => $key,
+		);
+		$this->conn->delete('*PREFIX*appconfig', $where);
 	}
 
 	/**
@@ -159,12 +170,11 @@ class OC_Appconfig{
 	 *
 	 * Removes all keys in appconfig belonging to the app.
 	 */
-	public static function deleteApp( $app ) {
-		// Nothing special
-		$query = OC_DB::prepare( 'DELETE FROM `*PREFIX*appconfig` WHERE `appid` = ?' );
-		$query->execute( array( $app ));
-
-		return true;
+	public function deleteApp( $app ) {
+		$where = array(
+			'appid' => $app,
+		);
+		$this->conn->delete('*PREFIX*appconfig', $where);
 	}
 
 	/**
@@ -173,31 +183,35 @@ class OC_Appconfig{
 	 * @param key
 	 * @return array
 	 */
-	public static function getValues($app, $key) {
-		if($app!==false and $key!==false) {
+	public function getValues($app, $key) {
+		if(($app!==false) == ($key!==false)) {
 			return false;
 		}
-		$fields='`configvalue`';
-		$where='WHERE';
-		$params=array();
+
+		$fields = '`configvalue`';
+		$where = 'WHERE';
+		$params = array();
 		if($app!==false) {
-			$fields.=', `configkey`';
-			$where.=' `appid` = ?';
-			$params[]=$app;
-			$key='configkey';
+			$fields .= ', `configkey`';
+			$where .= ' `appid` = ?';
+			$params[] = $app;
+			$key = 'configkey';
 		}else{
-			$fields.=', `appid`';
-			$where.=' `configkey` = ?';
-			$params[]=$key;
-			$key='appid';
+			$fields .= ', `appid`';
+			$where .= ' `configkey` = ?';
+			$params[] = $key;
+			$key = 'appid';
 		}
-		$queryString='SELECT '.$fields.' FROM `*PREFIX*appconfig` '.$where;
-		$query=OC_DB::prepare($queryString);
-		$result=$query->execute($params);
-		$values=array();
-		while($row=$result->fetchRow()) {
-			$values[$row[$key]]=$row['configvalue'];
+		$query = 'SELECT '.$fields.' FROM `*PREFIX*appconfig` '.$where;
+		$result = $this->conn->executeQuery( $query, $params );
+
+		$values = array();
+		while( $row = $result->fetch((\PDO::FETCH_ASSOC))) {
+			$values[$row[$key]] = $row['configvalue'];
 		}
+
 		return $values;
 	}
 }
+
+require_once __DIR__.'/legacy/'.basename(__FILE__);
diff --git a/lib/legacy/appconfig.php b/lib/legacy/appconfig.php
new file mode 100644
index 0000000000000000000000000000000000000000..0ca6d4150efd5c3343a602416a926bd66a34e8f9
--- /dev/null
+++ b/lib/legacy/appconfig.php
@@ -0,0 +1,120 @@
+<?php
+/**
+ * ownCloud
+ *
+ * @author Frank Karlitschek
+ * @author Jakob Sack
+ * @copyright 2012 Frank Karlitschek frank@owncloud.org
+ *
+ * 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/>.
+ *
+ */
+
+/**
+ * This class provides an easy way for apps to store config values in the
+ * database.
+ */
+OC_Appconfig::$object = new \OC\AppConfig(OC_DB::getConnection());
+class OC_Appconfig{
+	public static $object;
+	/**
+	 * @brief Get all apps using the config
+	 * @return array with app ids
+	 *
+	 * This function returns a list of all apps that have at least one
+	 * entry in the appconfig table.
+	 */
+	public static function getApps() {
+		return self::$object->getApps();
+	}
+
+	/**
+	 * @brief Get the available keys for an app
+	 * @param string $app the app we are looking for
+	 * @return array with key names
+	 *
+	 * This function gets all keys of an app. Please note that the values are
+	 * not returned.
+	 */
+	public static function getKeys( $app ) {
+		return self::$object->getKeys( $app );
+	}
+
+	/**
+	 * @brief Gets the config value
+	 * @param string $app app
+	 * @param string $key key
+	 * @param string $default = null, default value if the key does not exist
+	 * @return string the value or $default
+	 *
+	 * This function gets a value from the appconfig table. If the key does
+	 * not exist the default value will be returned
+	 */
+	public static function getValue( $app, $key, $default = null ) {
+		return self::$object->getValue($app, $key, $default);
+	}
+
+	/**
+	 * @brief check if a key is set in the appconfig
+	 * @param string $app
+	 * @param string $key
+	 * @return bool
+	 */
+	public static function hasKey($app, $key) {
+		return self::$object->hasKey($app, $key);
+	}
+
+	/**
+	 * @brief sets a value in the appconfig
+	 * @param string $app app
+	 * @param string $key key
+	 * @param string $value value
+	 *
+	 * Sets a value. If the key did not exist before it will be created.
+	 */
+	public static function setValue( $app, $key, $value ) {
+		self::$object->setValue( $app, $key, $value );
+	}
+
+	/**
+	 * @brief Deletes a key
+	 * @param string $app app
+	 * @param string $key key
+	 *
+	 * Deletes a key.
+	 */
+	public static function deleteKey( $app, $key ) {
+		self::$object->deleteKey( $app, $key );
+	}
+
+	/**
+	 * @brief Remove app from appconfig
+	 * @param string $app app
+	 *
+	 * Removes all keys in appconfig belonging to the app.
+	 */
+	public static function deleteApp( $app ) {
+		self::$object->deleteApp( $app );
+	}
+
+	/**
+	 * get multiply values, either the app or key can be used as wildcard by setting it to false
+	 * @param app
+	 * @param key
+	 * @return array
+	 */
+	public static function getValues($app, $key) {
+		return self::$object->getValues($app, $key);
+	}
+}
diff --git a/tests/lib/appconfig.php b/tests/lib/appconfig.php
index 4d82cd5ba7b8b52fa37e23260ab90f7df7e010b8..1b7a1c668e7beedb24852e61605144c6c5b4f1ba 100644
--- a/tests/lib/appconfig.php
+++ b/tests/lib/appconfig.php
@@ -1,6 +1,7 @@
 <?php
 /**
  * Copyright (c) 2013 Christopher Schäpers <christopher@schaepers.it>
+ * Copyright (c) 2013 Bart Visscher <bartv@thisnet.nl>
  * This file is licensed under the Affero General Public License version 3 or
  * later.
  * See the COPYING-README file.
@@ -130,3 +131,183 @@ class Test_Appconfig extends PHPUnit_Framework_TestCase {
 		$this->assertEquals($expected, $values);
 	}
 }
+
+class Test_AppConfig_Object extends PHPUnit_Framework_TestCase {
+	public function testGetApps()
+	{
+		$statementMock = $this->getMock('\Doctrine\DBAL\Statement', array(), array(), '', false);
+		$statementMock->expects($this->exactly(2))
+			->method('fetchColumn')
+			->will($this->onConsecutiveCalls('foo', false));
+		$connectionMock = $this->getMock('\OC\DB\Connection', array(), array(), '', false);
+		$connectionMock->expects($this->once())
+			->method('executeQuery')
+			->with($this->equalTo('SELECT DISTINCT `appid` FROM `*PREFIX*appconfig`'))
+			->will($this->returnValue($statementMock));
+
+		$appconfig = new OC\AppConfig($connectionMock);
+		$apps = $appconfig->getApps();
+		$this->assertEquals(array('foo'), $apps);
+	}
+
+	public function testGetKeys()
+	{
+		$statementMock = $this->getMock('\Doctrine\DBAL\Statement', array(), array(), '', false);
+		$statementMock->expects($this->exactly(2))
+			->method('fetchColumn')
+			->will($this->onConsecutiveCalls('foo', false));
+		$connectionMock = $this->getMock('\OC\DB\Connection', array(), array(), '', false);
+		$connectionMock->expects($this->once())
+			->method('executeQuery')
+			->with($this->equalTo('SELECT `configkey` FROM `*PREFIX*appconfig` WHERE `appid` = ?'),
+				$this->equalTo(array('bar')))
+			->will($this->returnValue($statementMock));
+
+		$appconfig = new OC\AppConfig($connectionMock);
+		$keys = $appconfig->getKeys('bar');
+		$this->assertEquals(array('foo'), $keys);
+	}
+
+	public function testGetValue()
+	{
+		$connectionMock = $this->getMock('\OC\DB\Connection', array(), array(), '', false);
+		$connectionMock->expects($this->exactly(2))
+			->method('fetchAssoc')
+			->with($this->equalTo('SELECT `configvalue` FROM `*PREFIX*appconfig` WHERE `appid` = ? AND `configkey` = ?'),
+				$this->equalTo(array('bar', 'red')))
+			->will($this->onConsecutiveCalls(array('configvalue'=>'foo'), null));
+
+		$appconfig = new OC\AppConfig($connectionMock);
+		$value = $appconfig->getValue('bar', 'red');
+		$this->assertEquals('foo', $value);
+		$value = $appconfig->getValue('bar', 'red', 'def');
+		$this->assertEquals('def', $value);
+	}
+
+	public function testHasKey()
+	{
+		$statementMock = $this->getMock('\Doctrine\DBAL\Statement', array(), array(), '', false);
+		$statementMock->expects($this->exactly(3))
+			->method('fetchColumn')
+			->will($this->onConsecutiveCalls('foo', false, false));
+		$connectionMock = $this->getMock('\OC\DB\Connection', array(), array(), '', false);
+		$connectionMock->expects($this->exactly(2))
+			->method('executeQuery')
+			->with($this->equalTo('SELECT `configkey` FROM `*PREFIX*appconfig` WHERE `appid` = ?'),
+				$this->equalTo(array('bar')))
+			->will($this->returnValue($statementMock));
+
+		$appconfig = new OC\AppConfig($connectionMock);
+		$this->assertTrue($appconfig->hasKey('bar', 'foo'));
+		$this->assertFalse($appconfig->hasKey('bar', 'foo'));
+	}
+
+	public function testSetValue()
+	{
+		$statementMock = $this->getMock('\Doctrine\DBAL\Statement', array(), array(), '', false);
+		$statementMock->expects($this->exactly(4))
+			->method('fetchColumn')
+			->will($this->onConsecutiveCalls('foo', false, 'foo', false));
+		$connectionMock = $this->getMock('\OC\DB\Connection', array(), array(), '', false);
+		$connectionMock->expects($this->exactly(2))
+			->method('executeQuery')
+			->with($this->equalTo('SELECT `configkey` FROM `*PREFIX*appconfig` WHERE `appid` = ?'),
+				$this->equalTo(array('bar')))
+			->will($this->returnValue($statementMock));
+		$connectionMock->expects($this->once())
+			->method('insert')
+			->with($this->equalTo('*PREFIX*appconfig'),
+				$this->equalTo(
+					array(
+						'appid' => 'bar',
+						'configkey' => 'moo',
+						'configvalue' => 'v1',
+					)
+				));
+		$connectionMock->expects($this->once())
+			->method('update')
+			->with($this->equalTo('*PREFIX*appconfig'),
+				$this->equalTo(
+					array(
+						'configvalue' => 'v2',
+					)),
+				$this->equalTo(
+					array(
+						'appid' => 'bar',
+						'configkey' => 'foo',
+					)
+				));
+
+		$appconfig = new OC\AppConfig($connectionMock);
+		$appconfig->setValue('bar', 'moo', 'v1');
+		$appconfig->setValue('bar', 'foo', 'v2');
+	}
+
+	public function testDeleteKey()
+	{
+		$connectionMock = $this->getMock('\OC\DB\Connection', array(), array(), '', false);
+		$connectionMock->expects($this->once())
+			->method('delete')
+			->with($this->equalTo('*PREFIX*appconfig'),
+				$this->equalTo(
+					array(
+						'appid' => 'bar',
+						'configkey' => 'foo',
+					)
+				));
+
+		$appconfig = new OC\AppConfig($connectionMock);
+		$appconfig->deleteKey('bar', 'foo');
+	}
+
+	public function testDeleteApp()
+	{
+		$connectionMock = $this->getMock('\OC\DB\Connection', array(), array(), '', false);
+		$connectionMock->expects($this->once())
+			->method('delete')
+			->with($this->equalTo('*PREFIX*appconfig'),
+				$this->equalTo(
+					array(
+						'appid' => 'bar',
+					)
+				));
+
+		$appconfig = new OC\AppConfig($connectionMock);
+		$appconfig->deleteApp('bar');
+	}
+
+	public function testGetValues()
+	{
+		$statementMock = $this->getMock('\Doctrine\DBAL\Statement', array(), array(), '', false);
+		$statementMock->expects($this->exactly(4))
+			->method('fetch')
+			->with(\PDO::FETCH_ASSOC)
+			->will($this->onConsecutiveCalls(
+				array('configvalue' =>'bar', 'configkey' => 'x'),
+				false,
+				array('configvalue' =>'foo', 'appid' => 'y'),
+				false
+			));
+		$connectionMock = $this->getMock('\OC\DB\Connection', array(), array(), '', false);
+		$connectionMock->expects($this->at(0))
+			->method('executeQuery')
+			->with($this->equalTo('SELECT `configvalue`, `configkey` FROM `*PREFIX*appconfig` WHERE `appid` = ?'),
+				$this->equalTo(array('foo')))
+			->will($this->returnValue($statementMock));
+		$connectionMock->expects($this->at(1))
+			->method('executeQuery')
+			->with($this->equalTo('SELECT `configvalue`, `appid` FROM `*PREFIX*appconfig` WHERE `configkey` = ?'),
+				$this->equalTo(array('bar')))
+			->will($this->returnValue($statementMock));
+
+		$appconfig = new OC\AppConfig($connectionMock);
+		$values = $appconfig->getValues('foo', false);
+		//$this->assertEquals(array('x'=> 'bar'), $values);
+		$values = $appconfig->getValues(false, 'bar');
+		//$this->assertEquals(array('y'=> 'foo'), $values);
+		$values = $appconfig->getValues(false, false);
+		//$this->assertEquals(false, $values);
+		$values = $appconfig->getValues('x', 'x');
+		//$this->assertEquals(false, $values);
+	}
+}