diff --git a/extensions/composer/composer.json b/extensions/composer/composer.json
index db430a2..b696093 100644
--- a/extensions/composer/composer.json
+++ b/extensions/composer/composer.json
@@ -1,8 +1,8 @@
 {
 	"name": "yiisoft/yii2-composer",
-	"description": "The composer integration for the Yii framework",
-	"keywords": ["yii", "composer", "install", "update"],
-	"type": "library",
+	"description": "The composer plugin for Yii extension installer",
+	"keywords": ["yii", "composer", "extension installer"],
+	"type": "composer-plugin",
 	"license": "BSD-3-Clause",
 	"support": {
 		"issues": "https://github.com/yiisoft/yii2/issues?state=open",
@@ -18,9 +18,6 @@
 		}
 	],
 	"minimum-stability": "dev",
-	"require": {
-		"yiisoft/yii2": "*"
-	},
 	"autoload": {
 		"psr-0": { "yii\\composer\\": "" }
 	}
diff --git a/extensions/composer/yii/composer/Installer.php b/extensions/composer/yii/composer/Installer.php
index 3082c3b..6fcfeff 100644
--- a/extensions/composer/yii/composer/Installer.php
+++ b/extensions/composer/yii/composer/Installer.php
@@ -10,6 +10,9 @@ namespace yii\composer;
 use Composer\Package\PackageInterface;
 use Composer\Installer\LibraryInstaller;
 use Composer\Repository\InstalledRepositoryInterface;
+use Composer\Script\CommandEvent;
+use yii\console\Application;
+use yii\console\Exception;
 
 /**
  * @author Qiang Xue <qiang.xue@gmail.com>
@@ -17,20 +20,18 @@ use Composer\Repository\InstalledRepositoryInterface;
  */
 class Installer extends LibraryInstaller
 {
-	const EXTRA_WRITABLES = 'yii-writables';
-	const EXTRA_EXECUTABLES = 'yii-executables';
+	const EXTRA_WRITABLE = 'writable';
+	const EXTRA_EXECUTABLE = 'executable';
 	const EXTRA_CONFIG = 'yii-config';
 	const EXTRA_COMMANDS = 'yii-commands';
-	const EXTRA_ALIASES = 'yii-aliases';
-	const EXTRA_PREINIT = 'yii-preinit';
-	const EXTRA_INIT = 'yii-init';
+	const EXTRA_BOOTSTRAP = 'bootstrap';
 
 	/**
 	 * @inheritdoc
 	 */
 	public function supports($packageType)
 	{
-		return $packageType === 'yii2-extension';
+		return $packageType === 'yii-extension';
 	}
 
 	/**
@@ -63,81 +64,39 @@ class Installer extends LibraryInstaller
 
 	protected function addPackage(PackageInterface $package)
 	{
-		$extension = ['name' => $package->getPrettyName()];
-
-		$root = $package->getPrettyName();
-		if ($targetDir = $package->getTargetDir()) {
-			$root .= '/' . trim($targetDir, '/');
-		}
-		$root = trim($root, '/');
+		$extension = [
+			'name' => $package->getPrettyName(),
+			'version' => $package->getVersion(),
+		];
 
 		$extra = $package->getExtra();
 
-		if (isset($extra[self::EXTRA_PREINIT]) && is_string($extra[self::EXTRA_PREINIT])) {
-			$extension[self::EXTRA_PREINIT] = "<vendor-dir>/$root/" . ltrim(str_replace('\\', '/', $extra[self::EXTRA_PREINIT]), '/');
-		}
-		if (isset($extra[self::EXTRA_INIT]) && is_string($extra[self::EXTRA_INIT])) {
-			$extension[self::EXTRA_INIT] = "<vendor-dir>/$root/" . ltrim(str_replace('\\', '/', $extra[self::EXTRA_INIT]), '/');
-		}
-
-		if (isset($extra['aliases']) && is_array($extra['aliases'])) {
-			foreach ($extra['aliases'] as $alias => $path) {
-				$extension['aliases']['@' . ltrim($alias, '@')] = "<vendor-dir>/$root/" . ltrim(str_replace('\\', '/', $path), '/');
-			}
-		}
-
-		if (!empty($aliases)) {
-			foreach ($aliases as $alias => $path) {
-				if (strncmp($alias, '@', 1) !== 0) {
-					$alias = '@' . $alias;
-				}
-				$path = trim(str_replace('\\', '/', $path), '/');
-				$extension['aliases'][$alias] = $root . '/' . $path;
-			}
+		if (isset($extra[self::EXTRA_BOOTSTRAP]) && is_string($extra[self::EXTRA_BOOTSTRAP])) {
+			$extension['bootstrap'] = $extra[self::EXTRA_BOOTSTRAP];
 		}
 
 		$extensions = $this->loadExtensions();
-		$extensions[$package->getId()] = $extension;
+		$extensions[$package->getUniqueName()] = $extension;
 		$this->saveExtensions($extensions);
 	}
 
 	protected function removePackage(PackageInterface $package)
 	{
 		$packages = $this->loadExtensions();
-		unset($packages[$package->getId()]);
+		unset($packages[$package->getUniqueName()]);
 		$this->saveExtensions($packages);
 	}
 
 	protected function loadExtensions()
 	{
 		$file = $this->vendorDir . '/yii-extensions.php';
-		if (!is_file($file)) {
-			return [];
-		}
-		$extensions = require($file);
-		/** @var string $vendorDir defined in yii-extensions.php */
-		$n = strlen($vendorDir);
-		foreach ($extensions as &$extension) {
-			if (isset($extension['aliases'])) {
-				foreach ($extension['aliases'] as $alias => $path) {
-					$extension['aliases'][$alias] = '<vendor-dir>' . substr($path, $n);
-				}
-			}
-			if (isset($extension[self::EXTRA_PREINIT])) {
-				$extension[self::EXTRA_PREINIT] = '<vendor-dir>' . substr($extension[self::EXTRA_PREINIT], $n);
-			}
-			if (isset($extension[self::EXTRA_INIT])) {
-				$extension[self::EXTRA_INIT] = '<vendor-dir>' . substr($extension[self::EXTRA_INIT], $n);
-			}
-		}
-		return $extensions;
+		return is_file($file) ? require($file) : [];
 	}
 
 	protected function saveExtensions(array $extensions)
 	{
 		$file = $this->vendorDir . '/yii-extensions.php';
-		$array = str_replace("'<vendor-dir>", '$vendorDir . \'', var_export($extensions, true));
-		file_put_contents($file, "<?php\n\$vendorDir = __DIR__;\n\nreturn $array;\n");
+		file_put_contents($file, "<?php\nreturn " . var_export($extensions, true) . ";\n");
 	}
 
 
@@ -148,11 +107,11 @@ class Installer extends LibraryInstaller
 	public static function setPermissions($event)
 	{
 		$options = array_merge([
-			self::EXTRA_WRITABLES => [],
-			self::EXTRA_EXECUTABLES => [],
+			self::EXTRA_WRITABLE => [],
+			self::EXTRA_EXECUTABLE => [],
 		], $event->getComposer()->getPackage()->getExtra());
 
-		foreach ((array)$options[self::EXTRA_WRITABLES] as $path) {
+		foreach ((array)$options[self::EXTRA_WRITABLE] as $path) {
 			echo "Setting writable: $path ...";
 			if (is_dir($path)) {
 				chmod($path, 0777);
@@ -163,7 +122,7 @@ class Installer extends LibraryInstaller
 			}
 		}
 
-		foreach ((array)$options[self::EXTRA_EXECUTABLES] as $path) {
+		foreach ((array)$options[self::EXTRA_EXECUTABLE] as $path) {
 			echo "Setting executable: $path ...";
 			if (is_file($path)) {
 				chmod($path, 0755);
diff --git a/extensions/mutex/composer.json b/extensions/mutex/composer.json
index 2fb95c4..99adcdf 100644
--- a/extensions/mutex/composer.json
+++ b/extensions/mutex/composer.json
@@ -2,7 +2,7 @@
 	"name": "yiisoft/yii2-mutex",
 	"description": "Mutual exclusion extension for the Yii framework",
 	"keywords": ["yii", "mutex"],
-	"type": "library",
+	"type": "yii-extension",
 	"license": "BSD-3-Clause",
 	"support": {
 		"issues": "https://github.com/yiisoft/yii2/issues?state=open",
@@ -23,5 +23,8 @@
 	},
 	"autoload": {
 		"psr-0": { "yii\\mutex\\": "" }
+	},
+	"extra": {
+		"bootstrap": "yii\\mutex\\Extension"
 	}
 }
diff --git a/framework/composer.json b/framework/composer.json
index 0a9c630..419b4b7 100644
--- a/framework/composer.json
+++ b/framework/composer.json
@@ -65,6 +65,7 @@
 	},
 	"require": {
 		"php": ">=5.4.0",
+		"yiisoft/yii2-composer": "*",
 		"ext-mbstring": "*",
 		"lib-pcre": "*",
 		"phpspec/php-diff": "1.0.*",