protected override TreeViewItem BuildRoot()
        {
            managersByGroup.Clear();
            managersByID.Clear();
            floatingManagers.Clear();
            recordersByManager.Clear();

            systemVersion = -1;
            if (window.WorldSelection != null)
            {
                systemVersion = window.WorldSelection.Version;
                Dictionary <Type, ScriptBehaviourUpdateOrder.ScriptBehaviourGroup> allGroups;
                Dictionary <Type, ScriptBehaviourUpdateOrder.DependantBehavior>    dependencies;
                ScriptBehaviourUpdateOrder.CollectGroups(window.WorldSelection.BehaviourManagers, out allGroups, out dependencies);

                foreach (var manager in window.WorldSelection.BehaviourManagers)
                {
                    var hasGroup = false;
                    foreach (var attributeData in manager.GetType().GetCustomAttributesData())
                    {
                        if (attributeData.AttributeType == typeof(UpdateInGroupAttribute))
                        {
                            var groupType = (Type)attributeData.ConstructorArguments[0].Value;
                            if (!managersByGroup.ContainsKey(groupType))
                            {
                                managersByGroup[groupType] = new List <ScriptBehaviourManager> {
                                    manager
                                }
                            }
                            ;
                            else
                            {
                                managersByGroup[groupType].Add(manager);
                            }
                            hasGroup = true;
                            break;
                        }
                    }

                    if (!hasGroup)
                    {
                        floatingManagers.Add(manager);
                    }
                }
                foreach (var managerSet in managersByGroup.Values)
                {
                    managerSet.Sort(CompareSystem);
                }
            }
            floatingManagers.Sort(CompareSystem);

            var currentID = 0;
            var root      = new TreeViewItem {
                id = currentID++, depth = -1, displayName = "Root"
            };

            if (managersByGroup.Count == 0 && floatingManagers.Count == 0)
            {
                root.AddChild(new TreeViewItem {
                    id = currentID++, displayName = "No ComponentSystems Loaded"
                });
            }
            else
            {
                foreach (var manager in floatingManagers)
                {
                    root.AddChild(CreateManagerItem(currentID++, manager));
                }

                foreach (var group in (from g in managersByGroup.Keys orderby g.Name select g))
                {
                    var groupItem = new TreeViewItem {
                        id = currentID++, displayName = group.Name
                    };
                    root.AddChild(groupItem);
                    foreach (var manager in managersByGroup[group])
                    {
                        groupItem.AddChild(CreateManagerItem(currentID++, manager));
                    }
                }
                SetupDepthsFromParentsAndChildren(root);
            }
            return(root);
        }