diff --git a/typo3/sysext/core/Classes/Package/Package.php b/typo3/sysext/core/Classes/Package/Package.php
index 29b1b1a04daa544257c90efaa26ad34cfaf4a979..138916b03dc78520a528f218c9b325afe1ab3ff3 100644
--- a/typo3/sysext/core/Classes/Package/Package.php
+++ b/typo3/sysext/core/Classes/Package/Package.php
@@ -19,7 +19,7 @@ namespace TYPO3\CMS\Core\Package;
  */
 class Package extends \TYPO3\Flow\Package\Package implements PackageInterface {
 
-	const PATTERN_MATCH_EXTENSIONKEY = '/^[0-9a-z_]+$/i';
+	const PATTERN_MATCH_EXTENSIONKEY = '/^[0-9a-z_-]+$/i';
 
 	/**
 	 * @var array
diff --git a/typo3/sysext/core/Classes/Package/PackageManager.php b/typo3/sysext/core/Classes/Package/PackageManager.php
index a79ef15ab95b13353ca6bc7d72bd4972b27d6ec0..9f11edfe58906509f70405bf1517bcff899b0c02 100644
--- a/typo3/sysext/core/Classes/Package/PackageManager.php
+++ b/typo3/sysext/core/Classes/Package/PackageManager.php
@@ -59,7 +59,7 @@ class PackageManager extends \TYPO3\Flow\Package\PackageManager implements \TYPO
 	protected $packageAliasMap = array();
 
 	/**
-	 *
+	 * Constructor
 	 */
 	public function __construct() {
 		$this->packagesBasePaths = array(
@@ -170,7 +170,7 @@ class PackageManager extends \TYPO3\Flow\Package\PackageManager implements \TYPO
 	protected function saveToPackageCache() {
 		$cacheEntryIdentifier = $this->getCacheEntryIdentifier();
 		if ($cacheEntryIdentifier !== NULL && !$this->coreCache->has($cacheEntryIdentifier)) {
-			$cacheEntryPath = rtrim($this->coreCache->getBackend()->getCacheDirectory(), '/\\');
+			$cacheEntryPath = rtrim(\TYPO3\CMS\Core\Utility\GeneralUtility::fixWindowsFilePath($this->coreCache->getBackend()->getCacheDirectory()), '/');
 			// Package objects get their own cache entry, so PHP does not have to parse the serialized string
 			$packageObjectsCacheEntryIdentifier = uniqid('PackageObjects_');
 			// Build cache file
@@ -275,10 +275,11 @@ class PackageManager extends \TYPO3\Flow\Package\PackageManager implements \TYPO
 				$this->composerNameToPackageKeyMap[strtolower($composerManifest->name)] = $packageKey;
 				$this->packageStatesConfiguration['packages'][$packageKey]['manifestPath'] = substr($composerManifestPath, strlen($packagePath)) ? : '';
 				$this->packageStatesConfiguration['packages'][$packageKey]['composerName'] = $composerManifest->name;
-			}
-			catch (\TYPO3\Flow\Package\Exception\MissingPackageManifestException $exception) {
+			} catch (\TYPO3\Flow\Package\Exception\MissingPackageManifestException $exception) {
 				$relativePackagePath = substr($packagePath, strlen($packagesBasePath));
 				$packageKey = substr($relativePackagePath, strpos($relativePackagePath, '/') + 1, -1);
+			} catch (\TYPO3\Flow\Package\Exception\InvalidPackageKeyException $exception) {
+				continue;
 			}
 			if (!isset($this->packageStatesConfiguration['packages'][$packageKey]['state'])) {
 				$this->packageStatesConfiguration['packages'][$packageKey]['state'] = 'inactive';
@@ -290,7 +291,8 @@ class PackageManager extends \TYPO3\Flow\Package\PackageManager implements \TYPO
 			$this->packageStatesConfiguration['packages'][$packageKey]['classesPath'] = \TYPO3\Flow\Package\Package::DIRECTORY_CLASSES;
 		}
 
-		$this->registerPackagesFromConfiguration(!empty($this->packages));
+		$registerOnlyNewPackages = !empty($this->packages);
+		$this->registerPackagesFromConfiguration($registerOnlyNewPackages);
 		if ($this->packageStatesConfiguration != $previousPackageStatesConfiguration) {
 			$this->sortAndsavePackageStates();
 		}
@@ -359,6 +361,9 @@ class PackageManager extends \TYPO3\Flow\Package\PackageManager implements \TYPO
 			} catch (\TYPO3\Flow\Package\Exception\InvalidPackagePathException $exception) {
 				$this->unregisterPackageByPackageKey($packageKey);
 				continue;
+			} catch (\TYPO3\Flow\Package\Exception\InvalidPackageKeyException $exception) {
+				$this->unregisterPackageByPackageKey($packageKey);
+				continue;
 			}
 
 			$this->registerPackage($package, FALSE);