diff --git a/chromatin.cabal b/chromatin.cabal
--- a/chromatin.cabal
+++ b/chromatin.cabal
@@ -4,10 +4,10 @@
 --
 -- see: https://github.com/sol/hpack
 --
--- hash: 560b0a26d65a7e63d7c566631d1a3e83822116adb9958225a42bbb595604065f
+-- hash: a5e8b4dcc258cfd22703e2dec094e1a68592dffd9517b92197800e8551b6c940
 
 name:           chromatin
-version:        0.1.0.0
+version:        0.1.1.0
 synopsis:       neovim package manager
 description:    Please see the README on GitHub at <https://github.com/tek/chromatin-hs>
 category:       Neovim
@@ -44,12 +44,14 @@
       Chromatin.Data.RunBuiltResult
       Chromatin.Data.RunExistingResult
       Chromatin.Diag
+      Chromatin.Env
       Chromatin.Init
       Chromatin.Log
       Chromatin.Plugin
       Chromatin.Rebuild
       Chromatin.Rebuild.Build
       Chromatin.Rebuild.Existing
+      Chromatin.Rebuild.Init
       Chromatin.Rebuild.Nonexisting
       Chromatin.Run
       Chromatin.Settings
@@ -77,10 +79,11 @@
     , parsec
     , prettyprinter
     , resourcet
-    , ribosome
+    , ribosome >=0.1.2
     , split
     , stm-chans
     , stm-conduit
+    , strings
     , transformers
     , typed-process
     , unliftio
@@ -111,10 +114,11 @@
     , parsec
     , prettyprinter
     , resourcet
-    , ribosome
+    , ribosome >=0.1.2
     , split
     , stm-chans
     , stm-conduit
+    , strings
     , transformers
     , typed-process
     , unliftio
@@ -147,10 +151,11 @@
     , parsec
     , prettyprinter
     , resourcet
-    , ribosome
+    , ribosome >=0.1.2
     , split
     , stm-chans
     , stm-conduit
+    , strings
     , transformers
     , typed-process
     , unliftio
@@ -189,10 +194,11 @@
     , parsec
     , prettyprinter
     , resourcet
-    , ribosome
+    , ribosome >=0.1.2
     , split
     , stm-chans
     , stm-conduit
+    , strings
     , transformers
     , typed-process
     , unliftio
diff --git a/lib/Chromatin/Env.hs b/lib/Chromatin/Env.hs
new file mode 100644
--- /dev/null
+++ b/lib/Chromatin/Env.hs
@@ -0,0 +1,22 @@
+module Chromatin.Env(
+  logError,
+) where
+
+import qualified Control.Lens as Lens (over)
+import qualified Data.Map.Strict as Map (adjust)
+import Ribosome.Api.Exists (epochSeconds)
+import qualified Ribosome.Control.Ribo as Ribo (modify)
+import Ribosome.Data.Errors (Errors(Errors), Error(Error), ComponentName)
+import Chromatin.Data.Chromatin (Chromatin)
+import qualified Chromatin.Data.Env as Env (_errors)
+
+storeError :: Int -> ComponentName -> [String] -> Errors -> Errors
+storeError time name msg (Errors errors) =
+  Errors (Map.adjust (err:) name errors)
+  where
+    err = Error time msg
+
+logError :: ComponentName -> String -> Chromatin ()
+logError name e = do
+  time <- epochSeconds
+  Ribo.modify $ Lens.over Env._errors (storeError time name [e])
diff --git a/lib/Chromatin/Rebuild.hs b/lib/Chromatin/Rebuild.hs
--- a/lib/Chromatin/Rebuild.hs
+++ b/lib/Chromatin/Rebuild.hs
@@ -18,6 +18,7 @@
 import Ribosome.Data.ScratchOptions (defaultScratchOptions)
 import Ribosome.Internal.IO (forkNeovim)
 import Ribosome.Scratch (showInScratch)
+import Chromatin.Data.ActiveRplugin (ActiveRplugin)
 import Chromatin.Data.Chromatin (Chromatin)
 import Chromatin.Data.Env (Env)
 import qualified Chromatin.Data.Env as Env (installerChan, _installerChan)
@@ -31,6 +32,7 @@
 import Chromatin.Data.RpluginSource (RpluginSource)
 import Chromatin.Config (readConfig, analyzeConfigIO, RpluginModification(RpluginNew))
 import Chromatin.Rebuild.Existing (handleExisting)
+import Chromatin.Rebuild.Init (initializeRplugins)
 import Chromatin.Rebuild.Nonexisting (handleNonexisting)
 import qualified Chromatin.Log as Log
 
@@ -56,6 +58,10 @@
 extractFailure (RunBuiltResult.PreviousFailure stage (RebuildTask (RpluginName name) _) err) =
   ("error in stage `" ++ stage ++ "` for plugin `" ++ name ++ "`:") : err
 
+extractSuccess :: RunBuiltResult -> [ActiveRplugin]
+extractSuccess (RunBuiltResult.Success arp) = [arp]
+extractSuccess _ = []
+
 controlC :: ConduitT RebuildControl RebuildTask (Ribo (TVar Env)) ()
 controlC = do
   ctrl <- await
@@ -83,6 +89,7 @@
   case concatMap extractFailure result of
     err@(_:_) -> void $ showInScratch err (defaultScratchOptions "chromatin-rebuild-error")
     _ -> return ()
+  initializeRplugins (concatMap extractSuccess result)
   Log.debug $ "installer terminated: " ++ show result
 
 forkRebuilder :: Chromatin (TBMChan RebuildControl)
diff --git a/lib/Chromatin/Rebuild/Init.hs b/lib/Chromatin/Rebuild/Init.hs
new file mode 100644
--- /dev/null
+++ b/lib/Chromatin/Rebuild/Init.hs
@@ -0,0 +1,65 @@
+module Chromatin.Rebuild.Init(
+  initializeRplugins,
+) where
+
+import Control.Monad (when)
+import Data.Default.Class (def)
+import Data.Foldable (traverse_)
+import Data.Functor (void)
+import Data.Maybe (catMaybes)
+import Data.Strings (strCapitalize)
+import Neovim (NeovimException, vim_call_function)
+import Ribosome.Api.Exists (waitForFunction)
+import qualified Ribosome.Api.Exists as Exists (function)
+import Chromatin.Data.ActiveRplugin (ActiveRplugin(ActiveRplugin))
+import Chromatin.Data.Chromatin (Chromatin)
+import Ribosome.Data.Errors (ComponentName(ComponentName))
+import Chromatin.Data.Rplugin (Rplugin(Rplugin))
+import Chromatin.Data.RpluginName (RpluginName(RpluginName))
+import Chromatin.Env (logError)
+
+activeRpluginName :: ActiveRplugin -> String
+activeRpluginName (ActiveRplugin _ (Rplugin (RpluginName rpluginName) _)) = rpluginName
+
+pluginRpcName :: String -> ActiveRplugin -> String
+pluginRpcName rpcName rplugin =
+  strCapitalize (activeRpluginName rplugin) ++ rpcName
+
+waitForPlugin :: ActiveRplugin -> Chromatin (Maybe ActiveRplugin)
+waitForPlugin rplugin = do
+  result <- waitForFunction (pluginRpcName "Poll" rplugin) def
+  return $ case result of
+    Right _ -> Just rplugin
+    Left _ -> Nothing
+
+stageError :: ActiveRplugin -> Int -> NeovimException -> Chromatin ()
+stageError rplugin stage err =
+  logError (ComponentName "rebuild-init") $ "error in stage " ++ show stage ++ " of `" ++ name ++ "`" ++ show err
+  where
+    name = activeRpluginName rplugin
+
+runStage :: ActiveRplugin -> Int -> String -> Chromatin ()
+runStage rplugin stage func = do
+  result <- void <$> vim_call_function func []
+  either (stageError rplugin stage) return result
+
+runStageInRpluginIfExists :: Int -> ActiveRplugin -> Chromatin ()
+runStageInRpluginIfExists stage rplugin = do
+  exists <- Exists.function func
+  when exists $ runStage rplugin stage func
+  where
+    func = pluginRpcName ("Stage" ++ show stage) rplugin
+
+runStageInRplugins :: [ActiveRplugin] -> Int -> Chromatin ()
+runStageInRplugins rplugins stage =
+  traverse_ (runStageInRpluginIfExists stage) rplugins
+
+runStages :: [ActiveRplugin] -> Chromatin ()
+runStages rplugins =
+  traverse_ (runStageInRplugins rplugins) [1..5]
+
+initializeRplugins :: [ActiveRplugin] -> Chromatin ()
+initializeRplugins rplugins = do
+  results <- traverse waitForPlugin rplugins
+  let crmPlugins = catMaybes results
+  runStages crmPlugins
