Index: oak-core/src/test/java/org/apache/jackrabbit/oak/core/RootFuzzIT.java
IDEA additional info:
Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
<+>UTF-8
===================================================================
--- oak-core/src/test/java/org/apache/jackrabbit/oak/core/RootFuzzIT.java	(revision 1651970)
+++ oak-core/src/test/java/org/apache/jackrabbit/oak/core/RootFuzzIT.java	(revision )
@@ -38,6 +38,7 @@
 import org.apache.jackrabbit.oak.api.Tree;
 import org.apache.jackrabbit.oak.commons.PathUtils;
 import org.apache.jackrabbit.oak.core.RootFuzzIT.Operation.Rebase;
+import org.apache.jackrabbit.oak.plugins.tree.RootFactory;
 import org.apache.jackrabbit.oak.spi.state.NodeStore;
 import org.junit.After;
 import org.junit.Before;
@@ -77,10 +78,10 @@
     private final NodeStoreFixture fixture;
 
     private NodeStore store1;
-    private SystemRoot root1;
+    private Root root1;
 
     private NodeStore store2;
-    private SystemRoot root2;
+    private Root root2;
 
     private int counter;
 
@@ -97,12 +98,12 @@
         counter = 0;
 
         store1 = fixture.createNodeStore();
-        root1 = new SystemRoot(store1);
+        root1 = RootFactory.createSystemRoot(store1, null, null, null, null, null);
         root1.getTree("/").addChild("root");
         root1.commit();
 
         store2 = fixture.createNodeStore();
-        root2 = new SystemRoot(store2);
+        root2 = RootFactory.createSystemRoot(store2, null, null, null, null, null);
         root2.getTree("/").addChild("root");
         root2.commit();
     }
Index: oak-core/src/main/java/org/apache/jackrabbit/oak/security/privilege/PrivilegeInitializer.java
IDEA additional info:
Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
<+>UTF-8
===================================================================
--- oak-core/src/main/java/org/apache/jackrabbit/oak/security/privilege/PrivilegeInitializer.java	(revision 1651970)
+++ oak-core/src/main/java/org/apache/jackrabbit/oak/security/privilege/PrivilegeInitializer.java	(revision )
@@ -19,10 +19,11 @@
 import javax.jcr.RepositoryException;
 
 import org.apache.jackrabbit.JcrConstants;
+import org.apache.jackrabbit.oak.api.Root;
 import org.apache.jackrabbit.oak.api.Type;
-import org.apache.jackrabbit.oak.core.SystemRoot;
 import org.apache.jackrabbit.oak.plugins.memory.MemoryNodeStore;
 import org.apache.jackrabbit.oak.plugins.nodetype.NodeTypeConstants;
+import org.apache.jackrabbit.oak.plugins.tree.RootFactory;
 import org.apache.jackrabbit.oak.spi.lifecycle.RepositoryInitializer;
 import org.apache.jackrabbit.oak.spi.security.privilege.PrivilegeConstants;
 import org.apache.jackrabbit.oak.spi.state.ApplyDiff;
@@ -54,7 +55,8 @@
             NodeState base = builder.getNodeState();
             NodeStore store = new MemoryNodeStore(base);
             try {
-                new PrivilegeDefinitionWriter(new SystemRoot(store)).writeBuiltInDefinitions();
+                Root systemRoot = RootFactory.createSystemRoot(store, null, null, null, null, null);
+                new PrivilegeDefinitionWriter(systemRoot).writeBuiltInDefinitions();
             } catch (RepositoryException e) {
                 log.error("Failed to register built-in privileges", e);
                 throw new RuntimeException(e);
Index: oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/tree/impl/ImmutableTree.java
IDEA additional info:
Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
<+>UTF-8
===================================================================
--- oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/tree/impl/ImmutableTree.java	(revision 1652081)
+++ oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/tree/impl/ImmutableTree.java	(revision )
@@ -71,7 +71,8 @@
  * {@code org.apache.jackrabbit.oak.spi.state.NodeStateUtils#isHidden(String)}.
  *
  * <h3>Equality and hash code</h3>
- * In contrast to {@link org.apache.jackrabbit.oak.core.MutableTree} the {@code ImmutableTree} implements
+ * In contrast to {@link org.apache.jackrabbit.oak.plugins.tree.impl.AbstractMutableTree}
+ * the {@code ImmutableTree} implements
  * {@link Object#equals(Object)} and {@link Object#hashCode()}: Two {@code ImmutableTree}s
  * are consider equal if their name and the underlying {@code NodeState}s are equal. Note
  * however, that according to the contract defined in {@code NodeState} these
Index: oak-authorization-cug/src/main/java/org/apache/jackrabbit/oak/spi/security/authorization/cug/impl/CugConfiguration.java
IDEA additional info:
Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
<+>UTF-8
===================================================================
--- oak-authorization-cug/src/main/java/org/apache/jackrabbit/oak/spi/security/authorization/cug/impl/CugConfiguration.java	(revision 1651970)
+++ oak-authorization-cug/src/main/java/org/apache/jackrabbit/oak/spi/security/authorization/cug/impl/CugConfiguration.java	(revision )
@@ -41,11 +41,11 @@
 import org.apache.jackrabbit.oak.api.ContentRepository;
 import org.apache.jackrabbit.oak.api.ContentSession;
 import org.apache.jackrabbit.oak.api.Root;
-import org.apache.jackrabbit.oak.core.SystemRoot;
 import org.apache.jackrabbit.oak.namepath.NamePathMapper;
 import org.apache.jackrabbit.oak.plugins.memory.MemoryNodeStore;
 import org.apache.jackrabbit.oak.plugins.name.NamespaceEditorProvider;
 import org.apache.jackrabbit.oak.plugins.nodetype.TypeEditorProvider;
+import org.apache.jackrabbit.oak.plugins.tree.RootFactory;
 import org.apache.jackrabbit.oak.spi.commit.CompositeEditorProvider;
 import org.apache.jackrabbit.oak.spi.commit.EditorHook;
 import org.apache.jackrabbit.oak.spi.lifecycle.RepositoryInitializer;
@@ -153,10 +153,9 @@
                 NodeState base = builder.getNodeState();
                 NodeStore store = new MemoryNodeStore(base);
 
-                Root root = new SystemRoot(store,
-                        new EditorHook(new CompositeEditorProvider(
-                                new NamespaceEditorProvider(),
-                                new TypeEditorProvider())));
+                Root root = RootFactory.createSystemRoot(store,
+                        new EditorHook(new CompositeEditorProvider(new NamespaceEditorProvider(), new TypeEditorProvider())),
+                        null, null, null, null);
                 if (CugUtil.registerCugNodeTypes(root)) {
                     NodeState target = store.getRoot();
                     target.compareAgainstBaseState(base, new ApplyDiff(builder));
\ No newline at end of file
Index: oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/nodetype/write/InitialContent.java
IDEA additional info:
Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
<+>UTF-8
===================================================================
--- oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/nodetype/write/InitialContent.java	(revision 1651970)
+++ oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/nodetype/write/InitialContent.java	(revision )
@@ -24,7 +24,6 @@
 import com.google.common.collect.ImmutableList;
 
 import org.apache.jackrabbit.oak.api.Type;
-import org.apache.jackrabbit.oak.core.SystemRoot;
 import org.apache.jackrabbit.oak.plugins.index.IndexConstants;
 import org.apache.jackrabbit.oak.plugins.index.IndexUtils;
 import org.apache.jackrabbit.oak.plugins.index.counter.NodeCounterEditorProvider;
@@ -34,6 +33,7 @@
 import org.apache.jackrabbit.oak.plugins.name.Namespaces;
 import org.apache.jackrabbit.oak.plugins.nodetype.NodeTypeConstants;
 import org.apache.jackrabbit.oak.plugins.nodetype.TypeEditorProvider;
+import org.apache.jackrabbit.oak.plugins.tree.RootFactory;
 import org.apache.jackrabbit.oak.plugins.version.VersionConstants;
 import org.apache.jackrabbit.oak.spi.commit.CompositeEditorProvider;
 import org.apache.jackrabbit.oak.spi.commit.EditorHook;
@@ -93,10 +93,10 @@
 
         NodeState base = builder.getNodeState();
         NodeStore store = new MemoryNodeStore(base);
-        NodeTypeRegistry.registerBuiltIn(new SystemRoot(
+        NodeTypeRegistry.registerBuiltIn(RootFactory.createSystemRoot(
                 store, new EditorHook(new CompositeEditorProvider(
                 new NamespaceEditorProvider(),
-                new TypeEditorProvider()))));
+                new TypeEditorProvider())), null, null, null, null));
         NodeState target = store.getRoot();
         target.compareAgainstBaseState(base, new ApplyDiff(builder));
     }
Index: oak-core/src/main/java/org/apache/jackrabbit/oak/core/SystemRoot.java
IDEA additional info:
Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
<+>UTF-8
===================================================================
--- oak-core/src/main/java/org/apache/jackrabbit/oak/core/SystemRoot.java	(revision 1651970)
+++ oak-core/src/main/java/org/apache/jackrabbit/oak/core/SystemRoot.java	(revision )
@@ -16,16 +16,13 @@
  */
 package org.apache.jackrabbit.oak.core;
 
+import javax.annotation.Nonnull;
 import javax.security.auth.Subject;
 
-import org.apache.jackrabbit.oak.Oak;
 import org.apache.jackrabbit.oak.api.Root;
 import org.apache.jackrabbit.oak.query.QueryEngineSettings;
 import org.apache.jackrabbit.oak.spi.commit.CommitHook;
-import org.apache.jackrabbit.oak.spi.commit.EmptyHook;
-import org.apache.jackrabbit.oak.spi.query.CompositeQueryIndexProvider;
 import org.apache.jackrabbit.oak.spi.query.QueryIndexProvider;
-import org.apache.jackrabbit.oak.spi.security.OpenSecurityProvider;
 import org.apache.jackrabbit.oak.spi.security.SecurityProvider;
 import org.apache.jackrabbit.oak.spi.security.authentication.LoginContext;
 import org.apache.jackrabbit.oak.spi.security.authentication.SystemSubject;
@@ -50,19 +47,19 @@
         }
     };
 
-    private SystemRoot(
-            NodeStore store, CommitHook hook, String workspaceName,
-            SecurityProvider securityProvider, 
-            QueryEngineSettings queryEngineSettings,
-            QueryIndexProvider indexProvider,
-            ContentSessionImpl session) {
+    private SystemRoot(@Nonnull NodeStore store, @Nonnull CommitHook hook,
+                       @Nonnull String workspaceName, @Nonnull SecurityProvider securityProvider,
+                       @Nonnull QueryEngineSettings queryEngineSettings,
+                       @Nonnull QueryIndexProvider indexProvider,
+                       @Nonnull ContentSessionImpl session) {
         super(store, hook, workspaceName, SystemSubject.INSTANCE,
                 securityProvider, queryEngineSettings, indexProvider, session);
     }
 
-    public SystemRoot(final NodeStore store, final CommitHook hook, final String workspaceName,
-            final SecurityProvider securityProvider, final QueryEngineSettings queryEngineSettings, 
-            final QueryIndexProvider indexProvider) {
+    public SystemRoot(@Nonnull final NodeStore store, @Nonnull final CommitHook hook,
+                      @Nonnull final String workspaceName, @Nonnull final SecurityProvider securityProvider,
+                      @Nonnull final QueryEngineSettings queryEngineSettings,
+                      @Nonnull final QueryIndexProvider indexProvider) {
         this(store, hook, workspaceName, securityProvider, queryEngineSettings, indexProvider,
                 new ContentSessionImpl(
                         LOGIN_CONTEXT, securityProvider, workspaceName,
@@ -76,16 +73,4 @@
                     }
                 });
     }
-
-    public SystemRoot(NodeStore store) {
-        this(store, EmptyHook.INSTANCE);
-    }
-
-    public SystemRoot(NodeStore store, CommitHook hook) {
-        // FIXME: define proper default or pass workspace name with the constructor
-        this(store, hook, Oak.DEFAULT_WORKSPACE_NAME, new OpenSecurityProvider(),
-                new QueryEngineSettings(),
-                new CompositeQueryIndexProvider());
-    }
-
 }
Index: oak-lucene/src/test/java/org/apache/jackrabbit/oak/plugins/index/lucene/LuceneIndexAggregationTest2.java
IDEA additional info:
Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
<+>UTF-8
===================================================================
--- oak-lucene/src/test/java/org/apache/jackrabbit/oak/plugins/index/lucene/LuceneIndexAggregationTest2.java	(revision 1651970)
+++ oak-lucene/src/test/java/org/apache/jackrabbit/oak/plugins/index/lucene/LuceneIndexAggregationTest2.java	(revision )
@@ -45,7 +45,6 @@
 import org.apache.jackrabbit.oak.api.ContentRepository;
 import org.apache.jackrabbit.oak.api.Root;
 import org.apache.jackrabbit.oak.api.Tree;
-import org.apache.jackrabbit.oak.core.SystemRoot;
 import org.apache.jackrabbit.oak.plugins.index.aggregate.NodeAggregator;
 import org.apache.jackrabbit.oak.plugins.index.aggregate.SimpleNodeAggregator;
 import org.apache.jackrabbit.oak.plugins.memory.MemoryNodeStore;
@@ -54,6 +53,7 @@
 import org.apache.jackrabbit.oak.plugins.nodetype.TypeEditorProvider;
 import org.apache.jackrabbit.oak.plugins.nodetype.write.InitialContent;
 import org.apache.jackrabbit.oak.plugins.nodetype.write.NodeTypeRegistry;
+import org.apache.jackrabbit.oak.plugins.tree.RootFactory;
 import org.apache.jackrabbit.oak.query.AbstractQueryTest;
 import org.apache.jackrabbit.oak.spi.commit.CompositeEditorProvider;
 import org.apache.jackrabbit.oak.spi.commit.EditorHook;
@@ -99,9 +99,9 @@
                         NodeState base = builder.getNodeState();
                         NodeStore store = new MemoryNodeStore(base);
 
-                        Root root = new SystemRoot(store, new EditorHook(
+                        Root root = RootFactory.createSystemRoot(store, new EditorHook(
                             new CompositeEditorProvider(new NamespaceEditorProvider(),
-                                new TypeEditorProvider())));
+                                new TypeEditorProvider())), null, null, null, null);
 
                         NodeTypeRegistry.register(root, stream, "testing node types");
 
Index: oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/tree/RootFactory.java
IDEA additional info:
Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
<+>UTF-8
===================================================================
--- oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/tree/RootFactory.java	(revision 1651970)
+++ oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/tree/RootFactory.java	(revision )
@@ -17,10 +17,21 @@
 package org.apache.jackrabbit.oak.plugins.tree;
 
 import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
 
+import org.apache.jackrabbit.oak.Oak;
 import org.apache.jackrabbit.oak.api.Root;
 import org.apache.jackrabbit.oak.core.ImmutableRoot;
+import org.apache.jackrabbit.oak.core.SystemRoot;
+import org.apache.jackrabbit.oak.query.QueryEngineSettings;
+import org.apache.jackrabbit.oak.spi.commit.CommitHook;
+import org.apache.jackrabbit.oak.spi.commit.EmptyHook;
+import org.apache.jackrabbit.oak.spi.query.CompositeQueryIndexProvider;
+import org.apache.jackrabbit.oak.spi.query.QueryIndexProvider;
+import org.apache.jackrabbit.oak.spi.security.OpenSecurityProvider;
+import org.apache.jackrabbit.oak.spi.security.SecurityProvider;
 import org.apache.jackrabbit.oak.spi.state.NodeState;
+import org.apache.jackrabbit.oak.spi.state.NodeStore;
 
 /**
  * Factory to obtain immutable {@code Tree} objects from {@code NodeState}s.
@@ -29,11 +40,29 @@
 
     private RootFactory() {}
 
+    @Nonnull
     public static Root createReadOnlyRoot(@Nonnull NodeState rootState) {
         return new ImmutableRoot(rootState);
     }
 
+    @Nonnull
     public static Root createReadOnlyRoot(@Nonnull Root root) {
         return ImmutableRoot.getInstance(root);
+    }
+
+    @Nonnull
+    public static Root createSystemRoot(@Nonnull NodeStore store,
+                                        @Nullable CommitHook hook,
+                                        @Nullable String workspaceName,
+                                        @Nullable SecurityProvider securityProvider,
+                                        @Nullable QueryEngineSettings queryEngineSettings,
+                                        @Nullable QueryIndexProvider indexProvider) {
+        return new SystemRoot(store,
+                (hook == null) ? EmptyHook.INSTANCE : hook,
+                (workspaceName == null) ? Oak.DEFAULT_WORKSPACE_NAME : workspaceName,
+                (securityProvider == null) ? new OpenSecurityProvider() : securityProvider,
+                (queryEngineSettings == null) ? new QueryEngineSettings() : queryEngineSettings,
+                (indexProvider == null) ? new CompositeQueryIndexProvider(): indexProvider);
+
     }
 }
\ No newline at end of file
Index: oak-core/src/main/java/org/apache/jackrabbit/oak/security/user/UserInitializer.java
IDEA additional info:
Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
<+>UTF-8
===================================================================
--- oak-core/src/main/java/org/apache/jackrabbit/oak/security/user/UserInitializer.java	(revision 1651970)
+++ oak-core/src/main/java/org/apache/jackrabbit/oak/security/user/UserInitializer.java	(revision )
@@ -24,13 +24,13 @@
 import org.apache.jackrabbit.api.security.user.UserManager;
 import org.apache.jackrabbit.oak.api.CommitFailedException;
 import org.apache.jackrabbit.oak.api.Root;
-import org.apache.jackrabbit.oak.core.SystemRoot;
 import org.apache.jackrabbit.oak.namepath.NamePathMapper;
 import org.apache.jackrabbit.oak.plugins.index.IndexConstants;
 import org.apache.jackrabbit.oak.plugins.index.IndexUtils;
 import org.apache.jackrabbit.oak.plugins.index.nodetype.NodeTypeIndexProvider;
 import org.apache.jackrabbit.oak.plugins.index.property.PropertyIndexProvider;
 import org.apache.jackrabbit.oak.plugins.memory.MemoryNodeStore;
+import org.apache.jackrabbit.oak.plugins.tree.RootFactory;
 import org.apache.jackrabbit.oak.query.QueryEngineSettings;
 import org.apache.jackrabbit.oak.spi.commit.EmptyHook;
 import org.apache.jackrabbit.oak.spi.lifecycle.WorkspaceInitializer;
@@ -92,7 +92,7 @@
         NodeState base = builder.getNodeState();
         MemoryNodeStore store = new MemoryNodeStore(base);
 
-        Root root = new SystemRoot(store, EmptyHook.INSTANCE, workspaceName,
+        Root root = RootFactory.createSystemRoot(store, EmptyHook.INSTANCE, workspaceName,
                 securityProvider, new QueryEngineSettings(),
                 new CompositeQueryIndexProvider(new PropertyIndexProvider(),
                         new NodeTypeIndexProvider()));
