diff --git a/lib/private/appframework/dependencyinjection/dicontainer.php b/lib/private/appframework/dependencyinjection/dicontainer.php
index ce6523cc8a883e77b998b7d57d94bd964845f193..88ffc1c6f98a6d733b07a4eccf59f2a4d60d8522 100644
--- a/lib/private/appframework/dependencyinjection/dicontainer.php
+++ b/lib/private/appframework/dependencyinjection/dicontainer.php
@@ -62,6 +62,10 @@ class DIContainer extends SimpleContainer implements IAppContainer {
 		$this['AppName'] = $appName;
 		$this['urlParams'] = $urlParams;
 
+		/** @var \OC\ServerContainer $server */
+		$server = $this->getServer();
+		$server->registerAppContainer($appName, $this);
+
 		// aliases
 		$this->registerAlias('appName', 'AppName');
 		$this->registerAlias('webRoot', 'WebRoot');
diff --git a/lib/private/backgroundjob/joblist.php b/lib/private/backgroundjob/joblist.php
index 75c205833fe922dbfd39785929f01fb5d7e10bf7..446de2fa1a43f4329687b2557eda9ab31d72d26d 100644
--- a/lib/private/backgroundjob/joblist.php
+++ b/lib/private/backgroundjob/joblist.php
@@ -24,6 +24,7 @@
 
 namespace OC\BackgroundJob;
 
+use OCP\AppFramework\QueryException;
 use OCP\BackgroundJob\IJob;
 use OCP\BackgroundJob\IJobList;
 use OCP\AutoloadNotAllowedException;
@@ -232,24 +233,29 @@ class JobList implements IJobList {
 	 * @return IJob|null
 	 */
 	private function buildJob($row) {
-		$class = $row['class'];
-		/**
-		 * @var Job $job
-		 */
 		try {
-			if (!class_exists($class)) {
-				// job from disabled app or old version of an app, no need to do anything
-				return null;
+			try {
+				// Try to load the job as a service
+				/** @var IJob $job */
+				$job = \OC::$server->query($row['class']);
+			} catch (QueryException $e) {
+				if (class_exists($row['class'])) {
+					$class = $row['class'];
+					$job = new $class();
+				} else {
+					// job from disabled app or old version of an app, no need to do anything
+					return null;
+				}
 			}
-			$job = new $class();
+
 			$job->setId($row['id']);
 			$job->setLastRun($row['last_run']);
 			$job->setArgument(json_decode($row['argument'], true));
 			return $job;
 		} catch (AutoloadNotAllowedException $e) {
 			// job is from a disabled app, ignore
+			return null;
 		}
-		return null;
 	}
 
 	/**
diff --git a/lib/private/server.php b/lib/private/server.php
index 3e1af0310d1a95f971f89e6a52571c85bc9b6ae2..7efe78b7c37899c2d54e05561a30ce1d7e71e043 100644
--- a/lib/private/server.php
+++ b/lib/private/server.php
@@ -78,7 +78,7 @@ use Symfony\Component\EventDispatcher\EventDispatcherInterface;
  *
  * TODO: hookup all manager classes
  */
-class Server extends SimpleContainer implements IServerContainer {
+class Server extends ServerContainer implements IServerContainer {
 	/** @var string */
 	private $webRoot;
 
diff --git a/lib/private/servercontainer.php b/lib/private/servercontainer.php
new file mode 100644
index 0000000000000000000000000000000000000000..856e3f9b4956d24ba0865988a6db375c564d4961
--- /dev/null
+++ b/lib/private/servercontainer.php
@@ -0,0 +1,89 @@
+<?php
+/**
+ * @author Joas Schilling <nickvergessen@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;
+
+
+use OC\AppFramework\DependencyInjection\DIContainer;
+use OC\AppFramework\Utility\SimpleContainer;
+use OCP\AppFramework\QueryException;
+
+/**
+ * Class ServerContainer
+ *
+ * @package OC
+ */
+class ServerContainer extends SimpleContainer {
+	/** @var DIContainer[] */
+	protected $appContainers;
+
+	/**
+	 * ServerContainer constructor.
+	 */
+	public function __construct() {
+		parent::__construct();
+		$this->appContainers = [];
+	}
+
+	/**
+	 * @param string $appName
+	 * @param DIContainer $container
+	 */
+	public function registerAppContainer($appName, DIContainer $container) {
+		$this->appContainers[$appName] = $container;
+	}
+
+	/**
+	 * @param string $appName
+	 * @return DIContainer
+	 */
+	public function getAppContainer($appName) {
+		if (isset($this->appContainers[$appName])) {
+			return $this->appContainers[$appName];
+		}
+
+		return new DIContainer($appName);
+	}
+
+	/**
+	 * @param string $name name of the service to query for
+	 * @return mixed registered service for the given $name
+	 * @throws QueryException if the query could not be resolved
+	 */
+	public function query($name) {
+		$name = $this->sanitizeName($name);
+
+		// In case the service starts with OCA\ we try to find the service in
+		// the apps container first.
+		if (strpos($name, 'OCA\\') === 0 && substr_count($name, '\\') >= 2) {
+			$segments = explode('\\', $name);
+			$appContainer = $this->getAppContainer(strtolower($segments[0]));
+			try {
+				return $appContainer->query($name);
+			} catch (QueryException $e) {
+				// Didn't find the service in the respective app container,
+				// ignore it and fall back to the core container.
+			}
+		}
+
+		return parent::query($name);
+	}
+}
diff --git a/lib/public/backgroundjob/ijob.php b/lib/public/backgroundjob/ijob.php
index a24a54345210ad4b63acced3735610648ebf4d1e..8d970dbe781e35374107a4d8ccc9328681f0e3e0 100644
--- a/lib/public/backgroundjob/ijob.php
+++ b/lib/public/backgroundjob/ijob.php
@@ -36,11 +36,28 @@ interface IJob {
 	 *
 	 * @param \OCP\BackgroundJob\IJobList $jobList The job list that manages the state of this job
 	 * @param ILogger $logger
-	 * @return void
 	 * @since 7.0.0
 	 */
 	public function execute($jobList, ILogger $logger = null);
 
+	/**
+	 * @param int $id
+	 * @since 7.0.0
+	 */
+	public function setId($id);
+
+	/**
+	 * @param int $lastRun
+	 * @since 7.0.0
+	 */
+	public function setLastRun($lastRun);
+
+	/**
+	 * @param mixed $argument
+	 * @since 7.0.0
+	 */
+	public function setArgument($argument);
+
 	/**
 	 * Get the id of the background job
 	 * This id is determined by the job list when a job is added to the list