diff --git a/lib/legacy/log.php b/lib/legacy/log.php
new file mode 100644
index 0000000000000000000000000000000000000000..7802ead24127d27012fcfef31cb91dcf4668e791
--- /dev/null
+++ b/lib/legacy/log.php
@@ -0,0 +1,77 @@
+<?php
+/**
+ * Copyright (c) 2012 Bart Visscher <bartv@thisnet.nl>
+ * This file is licensed under the Affero General Public License version 3 or
+ * later.
+ * See the COPYING-README file.
+ */
+
+/**
+ * logging utilities
+ *
+ * Log is saved by default at data/owncloud.log using OC_Log_Owncloud.
+ * Selecting other backend is done with a config option 'log_type'.
+ */
+
+OC_Log::$object = new \OC\Log();
+class OC_Log {
+	public static $object;
+
+	const DEBUG=0;
+	const INFO=1;
+	const WARN=2;
+	const ERROR=3;
+	const FATAL=4;
+
+	static private $level_funcs = array(
+		self::DEBUG	=> 'debug',
+		self::INFO	=> 'info',
+		self::WARN	=> 'warning',
+		self::ERROR	=> 'error',
+		self::FATAL	=> 'emergency',
+		);
+
+	static public $enabled = true;
+	static protected $class = null;
+
+	/**
+	 * write a message in the log
+	 * @param string $app
+	 * @param string $message
+	 * @param int $level
+	 */
+	public static function write($app, $message, $level) {
+		if (self::$enabled) {
+			$context = array('app' => $app);
+			$func = array(self::$object, self::$level_funcs[$level]);
+			call_user_func($func, $message, $context);
+		}
+	}
+
+	//Fatal errors handler
+	public static function onShutdown() {
+		$error = error_get_last();
+		if($error) {
+			//ob_end_clean();
+			self::write('PHP', $error['message'] . ' at ' . $error['file'] . '#' . $error['line'], self::FATAL);
+		} else {
+			return true;
+		}
+	}
+
+	// Uncaught exception handler
+	public static function onException($exception) {
+		self::write('PHP',
+			$exception->getMessage() . ' at ' . $exception->getFile() . '#' . $exception->getLine(),
+			self::FATAL);
+	}
+
+	//Recoverable errors handler
+	public static function onError($number, $message, $file, $line) {
+		if (error_reporting() === 0) {
+			return;
+		}
+		self::write('PHP', $message . ' at ' . $file . '#' . $line, self::WARN);
+
+	}
+}
diff --git a/lib/log.php b/lib/log.php
index 3f3334801e5e6a9bb6ff9818f41947ab85a175f5..e0b9fe3c696a85e72c2ae02e76251921703c9d69 100644
--- a/lib/log.php
+++ b/lib/log.php
@@ -1,69 +1,136 @@
 <?php
 /**
- * Copyright (c) 2012 Bart Visscher <bartv@thisnet.nl>
+ * 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.
  */
 
+namespace OC;
+
 /**
  * logging utilities
  *
- * Log is saved by default at data/owncloud.log using OC_Log_Owncloud.
- * Selecting other backend is done with a config option 'log_type'.
+ * This is a stand in, this should be replaced by a Psr\Log\LoggerInterface
+ * compatible logger. See https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-3-logger-interface.md
+ * for the full interface specification.
+ *
+ * MonoLog is an example implementing this interface.
  */
 
-class OC_Log {
-	const DEBUG=0;
-	const INFO=1;
-	const WARN=2;
-	const ERROR=3;
-	const FATAL=4;
+class Log {
+	private $logClass;
 
-	static public $enabled = true;
-	static protected $class = null;
+	/**
+	 * System is unusable.
+	 *
+	 * @param string $message
+	 * @param array $context
+	 */
+	public function emergency($message, array $context = array()) {
+		$this->log(\OC_Log::FATAL, $message, $context);
+	}
 
 	/**
-	 * write a message in the log
-	 * @param string $app
+	 * Action must be taken immediately.
+	 *
+	 * Example: Entire website down, database unavailable, etc. This should
+	 * trigger the SMS alerts and wake you up.
+	 *
 	 * @param string $message
-	 * @param int level
+	 * @param array $context
 	 */
-	public static function write($app, $message, $level) {
-		if (self::$enabled) {
-			if (!self::$class) {
-				self::$class = 'OC_Log_'.ucfirst(OC_Config::getValue('log_type', 'owncloud'));
-				call_user_func(array(self::$class, 'init'));
-			}
-			$log_class=self::$class;
-			$log_class::write($app, $message, $level);
-		}
+	public function alert($message, array $context = array()) {
+		$this->log(\OC_Log::ERROR, $message, $context);
 	}
 
-	//Fatal errors handler
-	public static function onShutdown() {
-		$error = error_get_last();
-		if($error) {
-			//ob_end_clean();
-			self::write('PHP', $error['message'] . ' at ' . $error['file'] . '#' . $error['line'], self::FATAL);
-		} else {
-			return true;
-		}
+	/**
+	 * Critical conditions.
+	 *
+	 * Example: Application component unavailable, unexpected exception.
+	 *
+	 * @param string $message
+	 * @param array $context
+	 */
+	public function critical($message, array $context = array()) {
+		$this->log(\OC_Log::ERROR, $message, $context);
 	}
 
-	// Uncaught exception handler
-	public static function onException($exception) {
-		self::write('PHP',
-			$exception->getMessage() . ' at ' . $exception->getFile() . '#' . $exception->getLine(),
-			self::FATAL);
+	/**
+	 * Runtime errors that do not require immediate action but should typically
+	 * be logged and monitored.
+	 *
+	 * @param string $message
+	 * @param array $context
+	 */
+	public function error($message, array $context = array()) {
+		$this->log(\OC_Log::ERROR, $message, $context);
 	}
 
-	//Recoverable errors handler
-	public static function onError($number, $message, $file, $line) {
-		if (error_reporting() === 0) {
-			return;
-		}
-		self::write('PHP', $message . ' at ' . $file . '#' . $line, self::WARN);
+	/**
+	 * Exceptional occurrences that are not errors.
+	 *
+	 * Example: Use of deprecated APIs, poor use of an API, undesirable things
+	 * that are not necessarily wrong.
+	 *
+	 * @param string $message
+	 * @param array $context
+	 */
+	public function warning($message, array $context = array()) {
+		$this->log(\OC_Log::WARN, $message, $context);
+	}
+
+	/**
+	 * Normal but significant events.
+	 *
+	 * @param string $message
+	 * @param array $context
+	 */
+	public function notice($message, array $context = array()) {
+		$this->log(\OC_Log::INFO, $message, $context);
+	}
 
+	/**
+	 * Interesting events.
+	 *
+	 * Example: User logs in, SQL logs.
+	 *
+	 * @param string $message
+	 * @param array $context
+	 */
+	public function info($message, array $context = array()) {
+		$this->log(\OC_Log::INFO, $message, $context);
+	}
+
+	/**
+	 * Detailed debug information.
+	 *
+	 * @param string $message
+	 * @param array $context
+	 */
+	public function debug($message, array $context = array()) {
+		$this->log(\OC_Log::DEBUG, $message, $context);
+	}
+
+	public function __construct() {
+		$this->logClass = 'OC_Log_'.ucfirst(\OC_Config::getValue('log_type', 'owncloud'));
+		call_user_func(array($this->logClass, 'init'));
+	}
+
+	/**
+	 * Logs with an arbitrary level.
+	 *
+	 * @param mixed $level
+	 * @param string $message
+	 * @param array $context
+	 */
+	public function log($level, $message, array $context = array()) {
+		if (isset($context['app'])) {
+			$app = $context['app'];
+		} else {
+			$app = 'no app in context';
+		}
+		$logClass=$this->logClass;
+		$logClass::write($app, $message, $level);
 	}
 }