diff --git a/lib/private/api.php b/lib/private/api.php
index 8e483b7efe9da9cbefd1f5ec06806b49feac88bc..125c547aebf2254fe7fc9ef17dc5ce3a7a24512f 100644
--- a/lib/private/api.php
+++ b/lib/private/api.php
@@ -1,4 +1,7 @@
 <?php
+use OCP\API;
+use OCP\AppFramework\Http;
+
 /**
  * @author Bart Visscher <bartv@thisnet.nl>
  * @author Bernhard Posselt <dev@bernhard-posselt.com>
@@ -82,7 +85,7 @@ class OC_API {
 	 * @param array $requirements
 	 */
 	public static function register($method, $url, $action, $app,
-				$authLevel = \OCP\API::USER_AUTH,
+				$authLevel = API::USER_AUTH,
 				$defaults = array(),
 				$requirements = array()) {
 		$name = strtolower($method).$url;
@@ -123,7 +126,7 @@ class OC_API {
 			if(!self::isAuthorised($action)) {
 				$responses[] = array(
 					'app' => $action['app'],
-					'response' => new OC_OCS_Result(null, \OCP\API::RESPOND_UNAUTHORISED, 'Unauthorised'),
+					'response' => new OC_OCS_Result(null, API::RESPOND_UNAUTHORISED, 'Unauthorised'),
 					'shipped' => OC_App::isShipped($action['app']),
 					);
 				continue;
@@ -131,7 +134,7 @@ class OC_API {
 			if(!is_callable($action['action'])) {
 				$responses[] = array(
 					'app' => $action['app'],
-					'response' => new OC_OCS_Result(null, \OCP\API::RESPOND_NOT_FOUND, 'Api method not found'),
+					'response' => new OC_OCS_Result(null, API::RESPOND_NOT_FOUND, 'Api method not found'),
 					'shipped' => OC_App::isShipped($action['app']),
 					);
 				continue;
@@ -252,15 +255,15 @@ class OC_API {
 	private static function isAuthorised($action) {
 		$level = $action['authlevel'];
 		switch($level) {
-			case \OCP\API::GUEST_AUTH:
+			case API::GUEST_AUTH:
 				// Anyone can access
 				return true;
 				break;
-			case \OCP\API::USER_AUTH:
+			case API::USER_AUTH:
 				// User required
 				return self::loginUser();
 				break;
-			case \OCP\API::SUBADMIN_AUTH:
+			case API::SUBADMIN_AUTH:
 				// Check for subadmin
 				$user = self::loginUser();
 				if(!$user) {
@@ -275,7 +278,7 @@ class OC_API {
 					}
 				}
 				break;
-			case \OCP\API::ADMIN_AUTH:
+			case API::ADMIN_AUTH:
 				// Check for admin
 				$user = self::loginUser();
 				if(!$user) {
@@ -342,10 +345,18 @@ class OC_API {
 	 */
 	public static function respond($result, $format='xml') {
 		// Send 401 headers if unauthorised
-		if($result->getStatusCode() === \OCP\API::RESPOND_UNAUTHORISED) {
+		if($result->getStatusCode() === API::RESPOND_UNAUTHORISED) {
 			header('WWW-Authenticate: Basic realm="Authorisation Required"');
 			header('HTTP/1.0 401 Unauthorized');
 		}
+
+		if (self::isV2()) {
+			$statusCode = self::mapStatusCodes($result->getStatusCode());
+			if (!is_null($statusCode)) {
+				OC_Response::setStatus($statusCode);
+			}
+		}
+
 		$response = array(
 			'ocs' => array(
 				'meta' => $result->getMeta(),
@@ -415,5 +426,42 @@ class OC_API {
 		header('Content-Type: application/octet-stream; charset=utf-8');
 	}
 
+	/**
+	 * @return boolean
+	 */
+	private static function isV2() {
+		$request = \OC::$server->getRequest();
+		$script = $request->getScriptName();
 
+		return $script === '/ocs/v2.php';
+	}
+
+	/**
+	 * @param integer $sc
+	 */
+	public static function mapStatusCodes($sc) {
+		switch ($sc) {
+			case API::RESPOND_NOT_FOUND:
+				return Http::STATUS_NOT_FOUND;
+			case API::RESPOND_SERVER_ERROR:
+				return Http::STATUS_INTERNAL_SERVER_ERROR;
+			case API::RESPOND_UNKNOWN_ERROR:
+				return Http::STATUS_INTERNAL_SERVER_ERROR;
+			case API::RESPOND_UNAUTHORISED:
+				// already handled for v1
+				return null;
+			case 100:
+				return Http::STATUS_OK;
+		}
+		// any 2xx, 4xx and 5xx will be used as is
+		if ($sc >= 200 && $sc < 600) {
+			return $sc;
+		}
+
+		// any error codes > 100 are treated as client errors
+		if ($sc > 100 && $sc < 200) {
+			return Http::STATUS_BAD_REQUEST;
+		}
+		return null;
+	}
 }
diff --git a/ocs/v2.php b/ocs/v2.php
new file mode 100644
index 0000000000000000000000000000000000000000..b2e3b25972759192d11db456df45e6c69d557936
--- /dev/null
+++ b/ocs/v2.php
@@ -0,0 +1,22 @@
+<?php
+/**
+ * @author Thomas Müller <thomas.mueller@tmit.eu>
+ *
+ * @copyright Copyright (c) 2015, ownCloud, Inc.
+ * @license AGPL-3.0
+ *
+ * This code is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License, version 3,
+ * as published by the Free Software Foundation.
+ *
+ * This program 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, version 3,
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>
+ *
+ */
+
+require_once 'v1.php';
diff --git a/tests/ocs/response.php b/tests/ocs/response.php
new file mode 100644
index 0000000000000000000000000000000000000000..71397bcf2c99d533003d6031a19d452e017c2418
--- /dev/null
+++ b/tests/ocs/response.php
@@ -0,0 +1,40 @@
+<?php
+use OCP\AppFramework\Http;
+
+/**
+ * @author Thomas Müller <thomas.mueller@tmit.eu>
+ *
+ * @copyright Copyright (c) 2015, ownCloud, Inc.
+ * @license AGPL-3.0
+ *
+ * This code is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License, version 3,
+ * as published by the Free Software Foundation.
+ *
+ * This program 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, version 3,
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>
+ *
+ */
+
+class OcsResponseTest extends \Test\TestCase {
+
+	/**
+	 * @dataProvider providesStatusCodes
+	 */
+	public function testStatusCodeMapper($expected, $sc) {
+		$result = OC_API::mapStatusCodes($sc);
+		$this->assertEquals($expected, $result);
+	}
+
+	public function providesStatusCodes() {
+		return [
+			[Http::STATUS_OK, 100],
+			[Http::STATUS_BAD_REQUEST, 104],
+		];
+	}
+}