public void GenerateChildren(ViewModelContext context, IViewModelNode viewModelNode, ref bool handled)
        {
            if ((viewModelNode.NodeValue as string) == "Root")
            {
                viewModelNode.Children.Add(new ViewModelNode("SearchResults", new EnumerableViewModelContent<ViewModelReference>(() =>
                    searchResults != null && searchResults.IsCompleted ? searchResults.Result.Select(searchResult => new ViewModelReference(KeyValuePair.Create(UrlType.SearchResult, searchResult), true))
                                                                       : new ViewModelReference[] { })));
                viewModelNode.Children.Add(new ViewModelNode("SearchFilter",
                    new LambdaViewModelContent<string>(
                        () => searchFilter,
                        (newFilter) =>
                        {
                            searchFilter = newFilter;
                            StartSearch();
                        })));
                viewModelNode.Children.Add(new ViewModelNode("Packages",
                    new EnumerableViewModelContent<ViewModelReference>(() => engineContext.PackageManager.Packages.Select(package => new ViewModelReference(package, true)))));

                fileTracker = new FileTracker();
                fileTracker.Setup("/global_data");
                fileTracker.Setup("/global_data2");
                viewModelNode.Children.Add(new ViewModelNode("FileTracker", new RootViewModelContent(fileTracker)).GenerateChildren(context));
            }
            if (viewModelNode.Type == typeof(FileTracker))
            {
                viewModelNode.Content.SerializeFlags = ViewModelContentSerializeFlags.None;
                viewModelNode.Children.Add(new ViewModelNode("RootFolder", KeyValuePair.Create(UrlType.FileTracker, "/")).GenerateChildren(context));
                handled = true;
            }
            if (viewModelNode.NodeValue is Package)
            {
                viewModelNode.Children.Add(new ViewModelNode("Name", new PropertyInfoViewModelContent(new ParentNodeValueViewModelContent(), typeof(Package).GetProperty("Name"))));
                handled = true;
            }

            if (viewModelNode.NodeValue is Tuple<UrlType, string>)
            {
                var nodeValue = (Tuple<UrlType, string>)viewModelNode.NodeValue;
                var url = nodeValue.Item2;

                if (nodeValue.Item1 == UrlType.SearchResult)
                {
                    // Load thumbnail (not cached yet)
                    if (url.EndsWith(".png") || url.EndsWith(".jpg"))
                    {
                        //var textureData = engineContext.ContentManager.LoadAsync<Image>(url);
                        var thumbnail = new ViewModelNode("Thumbnail",
                            new AsyncViewModelContent<Image>(new NullViewModelContent(), operand => engineContext.AssetManager.Load<Image>(url)));
                        viewModelNode.Children.Add(thumbnail);
                        /*textureData.ContinueWith(task =>
                            {
                                thumbnail.Value = task.Result;
                                thumbnail.Content.Flags |= ViewModelFlags.Static;
                            });*/
                    }
                    /*else
                    {
                        throw new NotImplementedException();
                    }*/

                    viewModelNode.Content = new RootViewModelContent(url);
                    viewModelNode.Content.SerializeFlags = ViewModelContentSerializeFlags.Serialize;
                }
                else if (nodeValue.Item1 == UrlType.FileTracker)
                {
                    viewModelNode.Content = new RootViewModelContent(url);
                    viewModelNode.Content.SerializeFlags = ViewModelContentSerializeFlags.Serialize;

                    viewModelNode.Children.Add(new ViewModelNode("SetAsSearchFilter", new RootViewModelContent((ExecuteCommand)((viewModel2, parameter) =>
                        {
                            searchRoot = url;
                            StartSearch();
                        }))));

                    if (url.EndsWith("/"))
                    {
                        viewModelNode.Children.Add(new ViewModelNode("Folders", new EnumerableViewModelContent<ViewModelReference>(() =>
                                fileTracker.Files
                                    .Where(file => file.StartsWith(url))
                                    .GroupBy(file =>
                                        {
                                            var separatorIndex = file.IndexOf('/', url.Length + 1);
                                            return file.Substring(url.Length, separatorIndex != -1 ? separatorIndex - url.Length + 1 : file.Length - url.Length);
                                        })
                                    .Where(x => x.Key.EndsWith("/") || x.Key.EndsWith(".dat") || x.Key.EndsWith(".xksl"))
                                    .Select(x => new ViewModelReference(KeyValuePair.Create(UrlType.FileTracker, url + x.Key), this))
                            )));
                    }
                }

                handled = true;
            }
        }