diff --git a/lib/private/ocs.php b/lib/private/ocs.php
index 6d166f8adb035506746fa8a3eb3b82c3d4554b2d..1b5ec2f35ac0eb90a823c06164f193a892580148 100644
--- a/lib/private/ocs.php
+++ b/lib/private/ocs.php
@@ -28,6 +28,7 @@
  * along with this program.  If not, see <http://www.gnu.org/licenses/>
  *
  */
+use OCP\API;
 
 /**
  * Class to handle open collaboration services API requests
@@ -64,8 +65,7 @@ class OC_OCS {
 			}
 		}
 		if ($data === false) {
-			echo self::generateXml('', 'fail', 400, 'Bad request. Please provide a valid '.$key);
-			exit();
+			throw new \OC\OCS\Exception(new OC_OCS_Result(null, 400, 'Bad request. Please provide a valid '.$key));
 		} else {
 			// NOTE: Is the raw type necessary? It might be a little risky without sanitization
 			if ($type == 'raw') return $data;
@@ -78,23 +78,12 @@ class OC_OCS {
 	}
 
 	public static function notFound() {
-		if($_SERVER['REQUEST_METHOD'] == 'GET') {
-			$method='get';
-		}elseif($_SERVER['REQUEST_METHOD'] == 'PUT') {
-			$method='put';
-		}elseif($_SERVER['REQUEST_METHOD'] == 'POST') {
-			$method='post';
-		}else{
-			echo('internal server error: method not supported');
-			exit();
-		}
-
-		$format = self::readData($method, 'format', 'text', '');
+		$format = OC_API::requestedFormat();
 		$txt='Invalid query, please check the syntax. API specifications are here:'
 		.' http://www.freedesktop.org/wiki/Specifications/open-collaboration-services. DEBUG OUTPUT:'."\n";
 		$txt.=OC_OCS::getDebugOutput();
-		echo(OC_OCS::generateXml($format, 'failed', 999, $txt));
 
+		OC_API::respond(new OC_OCS_Result(null, API::RESPOND_UNKNOWN_ERROR, $txt), $format);
 	}
 
 	/**
diff --git a/lib/private/ocs/exception.php b/lib/private/ocs/exception.php
new file mode 100644
index 0000000000000000000000000000000000000000..d2370ac695f5a37f2e17196d30f2471cfc90dc4b
--- /dev/null
+++ b/lib/private/ocs/exception.php
@@ -0,0 +1,40 @@
+<?php
+/**
+ * @author Bart Visscher <bartv@thisnet.nl>
+ * @author Björn Schießle <schiessle@owncloud.com>
+ * @author Christopher Schäpers <kondou@ts.unde.re>
+ * @author Lukas Reschke <lukas@owncloud.com>
+ * @author Morris Jobke <hey@morrisjobke.de>
+ * @author Robin McCorkell <rmccorkell@karoshi.org.uk>
+ * @author Tom Needham <tom@owncloud.com>
+ *
+ * @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/>
+ *
+ */
+
+namespace OC\OCS;
+
+class Exception extends \Exception {
+
+	public function __construct(\OC_OCS_Result $result) {
+		$this->result = $result;
+	}
+
+	public function getResult() {
+		return $this->result;
+	}
+
+}
diff --git a/ocs/v1.php b/ocs/v1.php
index 2829cf08c57ba0b3f1ad1ebda86a52c9310dc0cc..c5c18d20b8ab0ac03138d0de17b5ea1a5b47205d 100644
--- a/ocs/v1.php
+++ b/ocs/v1.php
@@ -56,5 +56,7 @@ try {
 } catch (MethodNotAllowedException $e) {
 	OC_API::setContentType();
 	OC_Response::setStatus(405);
+} catch (\OC\OCS\Exception $ex) {
+	OC_API::respond($ex->getResult(), OC_API::requestedFormat());
 }