Index: src/main/java/org/apache/jackrabbit/oak/plugins/nodetype/InitialContent.java
===================================================================
--- src/main/java/org/apache/jackrabbit/oak/plugins/nodetype/InitialContent.java	(revision 1412472)
+++ src/main/java/org/apache/jackrabbit/oak/plugins/nodetype/InitialContent.java	(working copy)
@@ -22,10 +22,12 @@
 import org.apache.jackrabbit.oak.api.CommitFailedException;
 import org.apache.jackrabbit.oak.api.Type;
 import org.apache.jackrabbit.oak.core.RootImpl;
+import org.apache.jackrabbit.oak.plugins.memory.MemoryNodeStore;
 import org.apache.jackrabbit.oak.plugins.memory.PropertyStates;
 import org.apache.jackrabbit.oak.spi.lifecycle.RepositoryInitializer;
 import org.apache.jackrabbit.oak.spi.security.user.UserConstants;
 import org.apache.jackrabbit.oak.spi.state.NodeBuilder;
+import org.apache.jackrabbit.oak.spi.state.NodeState;
 import org.apache.jackrabbit.oak.spi.state.NodeStore;
 import org.apache.jackrabbit.oak.spi.state.NodeStoreBranch;
 
@@ -40,10 +42,8 @@
 public class InitialContent implements RepositoryInitializer {
 
     @Override
-    public void initialize(NodeStore store) {
-        NodeStoreBranch branch = store.branch();
-
-        NodeBuilder root = branch.getRoot().builder();
+    public NodeState initialize(NodeState state) {
+        NodeBuilder root = state.builder();
         root.setProperty("jcr:primaryType", "rep:root", Type.NAME);
 
         if (!root.hasChildNode("jcr:system")) {
@@ -94,14 +94,17 @@
                 .setProperty("propertyNames", UserConstants.REP_MEMBERS)
                 .setProperty("reindex", true);
         }
+
         try {
+            NodeStore ns = new MemoryNodeStore();
+            NodeStoreBranch branch = ns.branch();
             branch.setRoot(root.getNodeState());
+            BuiltInNodeTypes.register(new RootImpl(ns));
             branch.merge();
+            return ns.getRoot();
         } catch (CommitFailedException e) {
-            throw new RuntimeException(e); // TODO: shouldn't need the wrapper
+            throw new RuntimeException(e);
         }
-
-        BuiltInNodeTypes.register(new RootImpl(store));
     }
 
 }
Index: src/main/java/org/apache/jackrabbit/oak/spi/lifecycle/OakInitializer.java
===================================================================
--- src/main/java/org/apache/jackrabbit/oak/spi/lifecycle/OakInitializer.java	(revision 1412472)
+++ src/main/java/org/apache/jackrabbit/oak/spi/lifecycle/OakInitializer.java	(working copy)
@@ -21,8 +21,8 @@
 import org.apache.jackrabbit.oak.api.CommitFailedException;
 import org.apache.jackrabbit.oak.plugins.index.IndexHookManager;
 import org.apache.jackrabbit.oak.plugins.index.IndexHookProvider;
-import org.apache.jackrabbit.oak.plugins.memory.MemoryNodeState;
-import org.apache.jackrabbit.oak.spi.state.NodeBuilder;
+import org.apache.jackrabbit.oak.spi.commit.CommitHook;
+import org.apache.jackrabbit.oak.spi.state.NodeState;
 import org.apache.jackrabbit.oak.spi.state.NodeStore;
 import org.apache.jackrabbit.oak.spi.state.NodeStoreBranch;
 
@@ -30,19 +30,12 @@
 
     public static void initialize(NodeStore store,
             RepositoryInitializer initializer, IndexHookProvider indexHook) {
-
-        // TODO refactor initializer to be able to first #branch, then
-        // #initialize, next #index and finally #merge
-        // This means that the RepositoryInitializer should receive a
-        // NodeStoreBranch as a param
-
-        initializer.initialize(store);
-
         NodeStoreBranch branch = store.branch();
-        NodeBuilder root = branch.getRoot().builder();
+        NodeState before = branch.getRoot();
+        NodeState after = initializer.initialize(before);
         try {
-            branch.setRoot(IndexHookManager.of(indexHook).processCommit(
-                    MemoryNodeState.EMPTY_NODE, root.getNodeState()));
+            CommitHook hook = IndexHookManager.of(indexHook);
+            branch.setRoot(hook.processCommit(before, after));
             branch.merge();
         } catch (CommitFailedException e) {
             throw new RuntimeException(e);
Index: src/main/java/org/apache/jackrabbit/oak/spi/lifecycle/CompositeInitializer.java
===================================================================
--- src/main/java/org/apache/jackrabbit/oak/spi/lifecycle/CompositeInitializer.java	(revision 1412472)
+++ src/main/java/org/apache/jackrabbit/oak/spi/lifecycle/CompositeInitializer.java	(working copy)
@@ -21,12 +21,13 @@
 import java.util.Arrays;
 import java.util.Collection;
 
+import org.apache.jackrabbit.oak.spi.state.NodeState;
 import org.apache.jackrabbit.oak.spi.state.NodeStore;
 
 /**
  * Composite repository initializer that delegates the
- * {@link #initialize(NodeStore)} call in sequence to all the
- * component initializers.
+ * {@link #initialize(NodeStore)} call in sequence to all the component
+ * initializers.
  */
 public class CompositeInitializer implements RepositoryInitializer {
 
@@ -41,9 +42,11 @@
     }
 
     @Override
-    public void initialize(NodeStore store) {
+    public NodeState initialize(NodeState state) {
+        NodeState newState = state;
         for (RepositoryInitializer tracker : initializers) {
-            tracker.initialize(store);
+            newState = tracker.initialize(newState);
         }
+        return newState;
     }
 }
Index: src/main/java/org/apache/jackrabbit/oak/osgi/OsgiRepositoryInitializer.java
===================================================================
--- src/main/java/org/apache/jackrabbit/oak/osgi/OsgiRepositoryInitializer.java	(revision 1412472)
+++ src/main/java/org/apache/jackrabbit/oak/osgi/OsgiRepositoryInitializer.java	(working copy)
@@ -18,8 +18,9 @@
  */
 package org.apache.jackrabbit.oak.osgi;
 
+import org.apache.jackrabbit.oak.spi.lifecycle.CompositeInitializer;
 import org.apache.jackrabbit.oak.spi.lifecycle.RepositoryInitializer;
-import org.apache.jackrabbit.oak.spi.state.NodeStore;
+import org.apache.jackrabbit.oak.spi.state.NodeState;
 import org.osgi.framework.ServiceReference;
 
 /**
@@ -34,30 +35,30 @@
     /**
      * The reference to the micro kernel once available.
      */
-    private volatile NodeStore store;
+    private volatile NodeState state;
 
     public OsgiRepositoryInitializer() {
         super(RepositoryInitializer.class);
     }
 
     @Override
-    public void initialize(NodeStore store) {
-        this.store = store;
-        if (store != null) {
-            for (RepositoryInitializer mki : getServices()) {
-                mki.initialize(store);
-            }
+    public NodeState initialize(NodeState state) {
+        this.state = state;
+        if (state != null) {
+            this.state = new CompositeInitializer(getServices())
+                    .initialize(this.state);
         }
+        return this.state;
     }
 
     @Override
     public Object addingService(ServiceReference reference) {
         RepositoryInitializer mki =
                 (RepositoryInitializer) super.addingService(reference);
-        NodeStore store = this.store;
-        if (store != null) {
-            //TODO index added content
-            mki.initialize(store);
+        NodeState state = this.state;
+        if (state != null) {
+            // TODO add! and index added content
+            this.state = mki.initialize(state);
         }
         return mki;
     }
Index: src/main/java/org/apache/jackrabbit/oak/spi/lifecycle/RepositoryInitializer.java
===================================================================
--- src/main/java/org/apache/jackrabbit/oak/spi/lifecycle/RepositoryInitializer.java	(revision 1412472)
+++ src/main/java/org/apache/jackrabbit/oak/spi/lifecycle/RepositoryInitializer.java	(working copy)
@@ -18,7 +18,7 @@
  */
 package org.apache.jackrabbit.oak.spi.lifecycle;
 
-import org.apache.jackrabbit.oak.spi.state.NodeStore;
+import org.apache.jackrabbit.oak.spi.state.NodeState;
 
 /**
  * Initializer of repository content. A component that needs to add specific
@@ -34,8 +34,8 @@
      * have been initialized, so the implementation of this method should
      * check for that before blindly adding new content.
      *
-     * @param store node store of the repository
+     * @param state node state of the repository
      */
-    public void initialize(NodeStore store);
+    public NodeState initialize(NodeState state);
 
 }
