diff --git a/core/Application/Environment.php b/core/Application/Environment.php
index 6041dba01aa1d750b2d0f35546a0f4c978494b76..cabf9273a9721ffeac123593c80ed2054c6b9bdf 100644
--- a/core/Application/Environment.php
+++ b/core/Application/Environment.php
@@ -15,6 +15,7 @@ use Piwik\Application\Kernel\PluginList\IniPluginList;
 use Piwik\Application\Kernel\GlobalSettingsProvider\IniSettingsProvider;
 use Piwik\Container\ContainerFactory;
 use Piwik\Container\StaticContainer;
+use Piwik\Piwik;
 
 /**
  * TODO
@@ -48,6 +49,8 @@ class Environment
         $this->container = $this->createContainer();
 
         StaticContainer::set($this->container);
+
+        Piwik::postEvent('Environment.bootstrapped');
     }
 
     public function getContainer()
diff --git a/core/Application/Kernel/PluginList/IniPluginList.php b/core/Application/Kernel/PluginList/IniPluginList.php
index e35554d688766a7f09996eb56fa25034ffbdec4f..f677836e36b98a634eaa73a1aea6de9668157240 100644
--- a/core/Application/Kernel/PluginList/IniPluginList.php
+++ b/core/Application/Kernel/PluginList/IniPluginList.php
@@ -31,7 +31,7 @@ class IniPluginList implements \Piwik\Application\Kernel\PluginList
     public function getActivatedPlugins()
     {
         $section = $this->settings->getSection('Plugins');
-        return $section['Plugins'];
+        return @$section['Plugins'] ?: array();
     }
 
     /**
@@ -40,6 +40,6 @@ class IniPluginList implements \Piwik\Application\Kernel\PluginList
     public function getInstalledPlugins()
     {
         $section = $this->settings->getSection('PluginsInstalled');
-        return $section['PluginsInstalled'];
+        return @$section['PluginsInstalled'] ?: array();
     }
 }
\ No newline at end of file
diff --git a/core/Container/ContainerFactory.php b/core/Container/ContainerFactory.php
index cd7eaf8140aaa4b8045409cd37e2dfdd143fc420..101a9c0aef5dde6e6d55b553b9f8e779c1b2c87a 100644
--- a/core/Container/ContainerFactory.php
+++ b/core/Container/ContainerFactory.php
@@ -80,7 +80,7 @@ class ContainerFactory
         $this->addPluginConfigs($builder);
 
         // Development config
-        if (Development::isEnabled()) {
+        if ($this->isDevelopmentModeEnabled()) {
             $builder->addDefinitions(PIWIK_USER_PATH . '/config/environment/dev.php');
         }
 
@@ -128,4 +128,10 @@ class ContainerFactory
             $builder->addDefinitions($file);
         }
     }
+
+    private function isDevelopmentModeEnabled()
+    {
+        $section = $this->settings->getSection('Development');
+        return (bool) @$section['enabled']; // TODO: code redundancy w/ Development. hopefully ok for now.
+    }
 }
diff --git a/core/EventDispatcher.php b/core/EventDispatcher.php
index bdec8c1c7c34b6de0fe40d1d13770cbd8a296504..87e8ca59c2f12837ae79ff8e5998b27948c8e348 100644
--- a/core/EventDispatcher.php
+++ b/core/EventDispatcher.php
@@ -213,8 +213,9 @@ class EventDispatcher extends Singleton
     private function getPluginManager()
     {
         if ($this->pluginManager === null) {
-            $this->pluginManager = Plugin\Manager::getInstance();
+            return Plugin\Manager::getInstance(); // caching the var breaks DI for now since only Plugin\Manager is in the container.
+        } else {
+            return $this->pluginManager;
         }
-        return $this->pluginManager;
     }
 }
\ No newline at end of file
diff --git a/core/Plugin/Manager.php b/core/Plugin/Manager.php
index 32999bb422ff2400a8004587daa3b5af600846b9..9053dda2f8312c9e4603c7380899f09d388bf839 100644
--- a/core/Plugin/Manager.php
+++ b/core/Plugin/Manager.php
@@ -9,6 +9,7 @@
 
 namespace Piwik\Plugin;
 
+use Piwik\Application\Kernel\PluginList;
 use Piwik\Cache;
 use Piwik\Columns\Dimension;
 use Piwik\Config as PiwikConfig;
@@ -35,11 +36,17 @@ require_once PIWIK_INCLUDE_PATH . '/core/EventDispatcher.php';
 
 /**
  * The singleton that manages plugin loading/unloading and installation/uninstallation.
- *
- * @method static Manager getInstance()
  */
-class Manager extends Singleton
+class Manager
 {
+    /**
+     * @return self
+     */
+    public static function getInstance()
+    {
+        return StaticContainer::get('Piwik\Plugin\Manager');
+    }
+
     protected $pluginsToLoad = array();
 
     protected $doLoadPlugins = true;
@@ -93,6 +100,16 @@ class Manager extends Singleton
 
     private $trackerPluginsNotToLoad = array();
 
+    /**
+     * @var PluginList
+     */
+    private $pluginList;
+
+    public function __construct(PluginList $pluginList)
+    {
+        $this->pluginList = $pluginList;
+    }
+
     /**
      * Loads plugin that are enabled
      */
@@ -107,7 +124,7 @@ class Manager extends Singleton
      */
     public function loadCorePluginsDuringTracker()
     {
-        $pluginsToLoad = Config::getInstance()->Plugins['Plugins'];
+        $pluginsToLoad = $this->pluginList->getActivatedPlugins();
         $pluginsToLoad = array_diff($pluginsToLoad, $this->getTrackerPluginsNotToLoad());
         $this->loadPlugins($pluginsToLoad);
     }
@@ -203,6 +220,8 @@ class Manager extends Singleton
      * Update Plugins config
      *
      * @param array $pluginsToLoad Plugins
+     *
+     * TODO: see uses of this + updatePluginsInstalledConfig (also clearPluginsInstalledConfig)
      */
     private function updatePluginsConfig($pluginsToLoad)
     {
@@ -459,10 +478,12 @@ class Manager extends Singleton
      *
      * @param string $pluginName Name of plugin
      * @throws \Exception
+     *
+     * TODO: pluginList needs to be updated in this case. some of these methods need to go into PluginList.
      */
     public function activatePlugin($pluginName)
     {
-        $plugins = PiwikConfig::getInstance()->Plugins['Plugins'];
+        $plugins = $this->pluginList->getActivatedPlugins();
         if (in_array($pluginName, $plugins)) {
             throw new \Exception("Plugin '$pluginName' already activated.");
         }
@@ -588,7 +609,7 @@ class Manager extends Singleton
 
         $listPlugins = array_merge(
             $this->readPluginsDirectory(),
-            PiwikConfig::getInstance()->Plugins['Plugins']
+            $this->pluginList->getActivatedPlugins()
         );
         $listPlugins = array_unique($listPlugins);
         foreach ($listPlugins as $pluginName) {
@@ -649,8 +670,8 @@ class Manager extends Singleton
     public function isPluginBundledWithCore($name)
     {
         return $this->isPluginEnabledByDefault($name)
-                || in_array($name, $this->getCorePluginsDisabledByDefault())
-                || $name == self::DEFAULT_THEME;
+        || in_array($name, $this->getCorePluginsDisabledByDefault())
+        || $name == self::DEFAULT_THEME;
     }
 
     protected function isPluginThirdPartyAndBogus($pluginName)
@@ -671,7 +692,7 @@ class Manager extends Singleton
 
     /**
      * Load AND activates the specified plugins. It will also overwrite all previously loaded plugins, so it acts
-     * as a setter. 
+     * as a setter.
      *
      * @param array $pluginsToLoad Array of plugins to load.
      */
@@ -792,7 +813,7 @@ class Manager extends Singleton
 
     public function getActivatedPluginsFromConfig()
     {
-        $plugins = @Config::getInstance()->Plugins['Plugins'];
+        $plugins = $this->pluginList->getActivatedPlugins();
 
         return $this->makePluginsToLoad($plugins);
     }
@@ -863,7 +884,6 @@ class Manager extends Singleton
     public static function getAllPluginsNames()
     {
         $pluginsToLoad = array_merge(
-            PiwikConfig::getInstance()->Plugins['Plugins'],
             self::getInstance()->readPluginsDirectory(),
             self::getInstance()->getCorePluginsDisabledByDefault()
         );
@@ -1002,7 +1022,7 @@ class Manager extends Singleton
      */
     public function getInstalledPluginsName()
     {
-        $pluginNames = PiwikConfig::getInstance()->PluginsInstalled['PluginsInstalled'];
+        $pluginNames = $this->pluginList->getInstalledPlugins();
         return $pluginNames;
     }
 
@@ -1016,17 +1036,17 @@ class Manager extends Singleton
     public function getMissingPlugins()
     {
         $missingPlugins = array();
-        if (isset(PiwikConfig::getInstance()->Plugins['Plugins'])) {
-            $plugins = PiwikConfig::getInstance()->Plugins['Plugins'];
-            foreach ($plugins as $pluginName) {
-                // if a plugin is listed in the config, but is not loaded, it does not exist in the folder
-                if (!self::getInstance()->isPluginLoaded($pluginName)
-                    && !$this->isPluginBogus($pluginName)
-                ) {
-                    $missingPlugins[] = $pluginName;
-                }
+
+        $plugins = $this->pluginList->getActivatedPlugins();
+        foreach ($plugins as $pluginName) {
+            // if a plugin is listed in the config, but is not loaded, it does not exist in the folder
+            if (!self::getInstance()->isPluginLoaded($pluginName)
+                && !$this->isPluginBogus($pluginName)
+            ) {
+                $missingPlugins[] = $pluginName;
             }
         }
+
         return $missingPlugins;
     }
 
@@ -1100,7 +1120,7 @@ class Manager extends Singleton
      */
     private function removePluginFromPluginsInstalledConfig($pluginName)
     {
-        $pluginsInstalled = PiwikConfig::getInstance()->PluginsInstalled['PluginsInstalled'];
+        $pluginsInstalled = $this->pluginList->getInstalledPlugins();
         $key = array_search($pluginName, $pluginsInstalled);
         if ($key !== false) {
             unset($pluginsInstalled[$key]);
@@ -1114,7 +1134,7 @@ class Manager extends Singleton
      */
     private function removePluginFromPluginsConfig($pluginName)
     {
-        $pluginsEnabled = PiwikConfig::getInstance()->Plugins['Plugins'];
+        $pluginsEnabled = $this->pluginList->getActivatedPlugins();
         $key = array_search($pluginName, $pluginsEnabled);
         if ($key !== false) {
             unset($pluginsEnabled[$key]);
@@ -1259,7 +1279,7 @@ class Manager extends Singleton
      *
      * @return array
      */
-    protected function getPluginsFromGlobalIniConfigFile()
+    protected function getPluginsFromGlobalIniConfigFile() // TODO: if this is only used for sorting, move to PluginList
     {
         $pluginsBundledWithPiwik = PiwikConfig::getInstance()->getFromGlobalConfig('Plugins');
         $pluginsBundledWithPiwik = $pluginsBundledWithPiwik['Plugins'];
diff --git a/tests/PHPUnit/TestingEnvironment.php b/tests/PHPUnit/TestingEnvironment.php
index 5841735b7e11be2609f908d22c3e2f4e29b515a0..afd398c01b879faf3861ef425b3b79f7fc2d662d 100644
--- a/tests/PHPUnit/TestingEnvironment.php
+++ b/tests/PHPUnit/TestingEnvironment.php
@@ -256,9 +256,10 @@ class Piwik_TestingEnvironment
                 DbHelper::deleteArchiveTables();
             }
         });
-
-        $testingEnvironment->logVariables();
-        $testingEnvironment->executeSetupTestEnvHook();
+        Piwik::addAction('Environment.bootstrapped', function () use ($testingEnvironment) {
+            $testingEnvironment->logVariables();
+            $testingEnvironment->executeSetupTestEnvHook();
+        });
     }
 
     public static function addSendMailHook()
diff --git a/tests/PHPUnit/proxy/piwik.php b/tests/PHPUnit/proxy/piwik.php
index bc03155b25ba2a379ec69070d01712fec4d8f319..b5a984cd00e74fbe391e30fcd1cd2e26261f7e15 100755
--- a/tests/PHPUnit/proxy/piwik.php
+++ b/tests/PHPUnit/proxy/piwik.php
@@ -24,10 +24,12 @@ try {
 
     GeoIp::$geoIPDatabaseDir = 'tests/lib/geoip-files';
 
-    Tracker::setTestEnvironment();
-    Manager::getInstance()->deleteAll();
-    Option::clearCache();
-    Site::clearCache();
+    \Piwik\Piwik::addAction('Environment.bootstrapped', function () {
+        Tracker::setTestEnvironment();
+        Manager::getInstance()->deleteAll();
+        Option::clearCache();
+        Site::clearCache();
+    });
 
     include PIWIK_INCLUDE_PATH . '/piwik.php';
 } catch (Exception $ex) {