diff --git a/typo3/sysext/core/Classes/Package/PackageManager.php b/typo3/sysext/core/Classes/Package/PackageManager.php
index 617fd1bcb04f7f9b1e7f04b99ede7f90d170fd19..5817360b3801b8414c4470164c8323536e3e6520 100644
--- a/typo3/sysext/core/Classes/Package/PackageManager.php
+++ b/typo3/sysext/core/Classes/Package/PackageManager.php
@@ -156,6 +156,19 @@ class PackageManager extends \TYPO3\Flow\Package\PackageManager implements \TYPO
 		}
 	}
 
+	/**
+	 * Updates the class loader with currently active packages.
+	 * This method is currently a slot that monitors the after
+	 * extension is installed signal to make the class loader
+	 * populate its caches again.
+	 * Maybe we find a better solution in the future, but as of now
+	 * we have to do this as all caches are flushed after an extension
+	 * is installed and the current request might fail otherwise.
+	 */
+	public function updatePackagesForClassLoader() {
+		$this->classLoader->setPackages($this->activePackages);
+	}
+
 	/**
 	 * @return PackageFactory
 	 */
diff --git a/typo3/sysext/extensionmanager/Classes/Service/ExtensionManagementService.php b/typo3/sysext/extensionmanager/Classes/Service/ExtensionManagementService.php
index 03f9a19d7f62881987f90845ca3fcbea563bbf0a..eb40df3bde4b74eb6f2b9589b661128dbe7195c7 100644
--- a/typo3/sysext/extensionmanager/Classes/Service/ExtensionManagementService.php
+++ b/typo3/sysext/extensionmanager/Classes/Service/ExtensionManagementService.php
@@ -51,6 +51,12 @@ class ExtensionManagementService implements \TYPO3\CMS\Core\SingletonInterface {
 	 */
 	protected $installUtility;
 
+	/**
+	 * @var \TYPO3\CMS\Extensionmanager\Utility\ExtensionModelUtility
+	 * @inject
+	 */
+	protected $extensionModelUtility;
+
 	/**
 	 * @var \TYPO3\CMS\Extensionmanager\Utility\ListUtility
 	 * @inject
@@ -63,11 +69,24 @@ class ExtensionManagementService implements \TYPO3\CMS\Core\SingletonInterface {
 	 */
 	protected $downloadUtility;
 
+	/**
+	 * @var \TYPO3\CMS\Core\Package\PackageManager
+	 * @inject
+	 */
+	protected $packageManager;
+
 	/**
 	 * @param string $extensionKey
 	 * @return void
 	 */
 	public function markExtensionForInstallation($extensionKey) {
+		// We have to check for dependencies of the extension first, before marking it for installation
+		// because this extension might have dependencies, which need to be installed first
+		$this->dependencyUtility->buildExtensionDependenciesTree(
+			$this->extensionModelUtility->mapExtensionArrayToModel(
+				$this->installUtility->enrichExtensionWithDetails($extensionKey)
+			)
+		);
 		$this->downloadQueue->addExtensionToInstallQueue($extensionKey);
 	}
 
@@ -89,8 +108,10 @@ class ExtensionManagementService implements \TYPO3\CMS\Core\SingletonInterface {
 	 * @return void
 	 */
 	public function markExtensionForDownload(\TYPO3\CMS\Extensionmanager\Domain\Model\Extension $extension) {
-		$this->downloadQueue->addExtensionToQueue($extension);
+		// We have to check for dependencies of the extension first, before marking it for download
+		// because this extension might have dependencies, which need to be downloaded and installed first
 		$this->dependencyUtility->buildExtensionDependenciesTree($extension);
+		$this->downloadQueue->addExtensionToQueue($extension);
 	}
 
 	/**
@@ -98,8 +119,10 @@ class ExtensionManagementService implements \TYPO3\CMS\Core\SingletonInterface {
 	 * @return void
 	 */
 	public function markExtensionForUpdate(\TYPO3\CMS\Extensionmanager\Domain\Model\Extension $extension) {
-		$this->downloadQueue->addExtensionToQueue($extension, 'update');
+		// We have to check for dependencies of the extension first, before marking it for download
+		// because this extension might have dependencies, which need to be downloaded and installed first
 		$this->dependencyUtility->buildExtensionDependenciesTree($extension);
+		$this->downloadQueue->addExtensionToQueue($extension, 'update');
 	}
 
 	/**
@@ -110,7 +133,7 @@ class ExtensionManagementService implements \TYPO3\CMS\Core\SingletonInterface {
 	 * @return array
 	 */
 	public function resolveDependenciesAndInstall(\TYPO3\CMS\Extensionmanager\Domain\Model\Extension $extension) {
-		$downloadedDependencies = $this->downloadMainExtension($extension);
+		$this->downloadMainExtension($extension);
 		$extensionKey = $extension->getExtensionKey();
 		$this->setInExtensionRepository($extensionKey);
 		$this->dependencyUtility->buildExtensionDependenciesTree($extension);
@@ -123,9 +146,9 @@ class ExtensionManagementService implements \TYPO3\CMS\Core\SingletonInterface {
 		if (count($copyQueue) > 0) {
 			$this->copyDependencies($copyQueue);
 		}
-
+		$downloadedDependencies = array();
 		if (array_key_exists('download', $queue)) {
-			$downloadedDependencies = array_merge($downloadedDependencies, $this->downloadDependencies($queue['download']));
+			$downloadedDependencies = $this->downloadDependencies($queue['download']);
 		}
 		if (array_key_exists('update', $queue)) {
 			$this->downloadDependencies($queue['update']);
@@ -200,6 +223,7 @@ class ExtensionManagementService implements \TYPO3\CMS\Core\SingletonInterface {
 		$resolvedDependencies = array();
 		foreach ($installQueue as $extensionKey => $extensionDetails) {
 			$this->installUtility->install($extensionDetails);
+			$this->emitHasInstalledExtension($extensionDetails);
 			if (!is_array($resolvedDependencies['installed'])) {
 				$resolvedDependencies['installed'] = array();
 			}
@@ -247,16 +271,12 @@ class ExtensionManagementService implements \TYPO3\CMS\Core\SingletonInterface {
 	 * as an extension is able to provide it's own dependencies
 	 *
 	 * @param \TYPO3\CMS\Extensionmanager\Domain\Model\Extension $extension
-	 * @return array
+	 * @return void
 	 */
 	public function downloadMainExtension(\TYPO3\CMS\Extensionmanager\Domain\Model\Extension $extension) {
-		$downloadedDependencies = array();
-		if ($extension->getUid()) {
-			$this->downloadQueue->addExtensionToQueue($extension);
-			$queue = $this->downloadQueue->getExtensionQueue();
-			$downloadedDependencies = $this->downloadDependencies($queue['download']);
+		if (!$this->packageManager->isPackageAvailable($extension->getExtensionKey())) {
+			$this->downloadUtility->download($extension);
 		}
-		return $downloadedDependencies;
 	}
 
 	/**
@@ -266,6 +286,13 @@ class ExtensionManagementService implements \TYPO3\CMS\Core\SingletonInterface {
 		$this->getSignalSlotDispatcher()->dispatch(__CLASS__, 'willInstallExtensions', array($installQueue));
 	}
 
+	/**
+	 * @param string $extensionKey
+	 */
+	protected function emitHasInstalledExtension($extensionKey) {
+		$this->getSignalSlotDispatcher()->dispatch(__CLASS__, 'hasInstalledExtensions', array($extensionKey));
+	}
+
 	/**
 	 * Get the SignalSlot dispatcher
 	 *
diff --git a/typo3/sysext/extensionmanager/ext_localconf.php b/typo3/sysext/extensionmanager/ext_localconf.php
index c2b628135b7e4333fe068ac60080db09067f86c5..0c90fa6f36a4587872633e0539a4d46779203468 100644
--- a/typo3/sysext/extensionmanager/ext_localconf.php
+++ b/typo3/sysext/extensionmanager/ext_localconf.php
@@ -21,6 +21,12 @@ if (TYPO3_MODE === 'BE') {
 			'TYPO3\\CMS\\Core\\Package\\PackageManager',
 			'scanAvailablePackages'
 		);
+		$signalSlotDispatcher->connect(
+			'TYPO3\\CMS\\Extensionmanager\\Service\\ExtensionManagementService',
+			'hasInstalledExtensions',
+			'TYPO3\\CMS\\Core\\Package\\PackageManager',
+			'updatePackagesForClassLoader'
+		);
 		$signalSlotDispatcher->connect(
 			'TYPO3\\CMS\\Extensionmanager\\Utility\\InstallUtility',
 			'tablesDefinitionIsBeingBuilt',