public T DoNamedNodeStep <T>(IDocumentationBuilder builder, string requiredName, IGraphFilter requiredFilter = null,
                                     Action <IDocumentationBuilder> stepContent = null) where T : GenericNode
        {
            T existing = null;

            if (WorkspaceService.CurrentWorkspace == null || WorkspaceService.CurrentWorkspace.CurrentGraph == null)
            {
            }
            else
            {
                existing = WorkspaceService.Repository.All <T>().FirstOrDefault(p => p.Name == requiredName);
            }

            builder.ShowTutorialStep(new TutorialStep(string.Format("Create a '{0}' node with the name '{1}'", InvertApplication.Container.GetNodeConfig <T>().Name, requiredName), () =>
            {
                if (existing == null)
                {
                    if (requiredFilter != null)
                    {
                        if (WorkspaceService.CurrentWorkspace.CurrentGraph.CurrentFilter != requiredFilter)
                        {
                            return(string.Format("Double-click on the '{0}' Node.", requiredFilter.Name));
                        }
                    }

                    return("Node not created yet");
                }
                return(null);
            })
            {
                StepContent = _ =>
                {
                    var nodeTypeName = typeof(T).Name.Replace("Node", "");

                    _.Paragraph("In this step you need to create {0}.", nodeTypeName);
                    _.Paragraph("To create any kind of node you need to right click on an empty space on the graph. Context menu will appear. It will contain different 'Add' commands. Each 'Add' command" +
                                "allows you to add a new node to the graph. The types of nodes you can create may be different based on the context. For example, you can create elements only inside of subsystems, and " +
                                "you can only create views inside of elements.");

                    if (requiredFilter != null)
                    {
                        if (WorkspaceService.CurrentWorkspace.CurrentGraph.CurrentFilter != requiredFilter)
                        {
                            _.Paragraph("First of all you need to get into {0} node.", requiredFilter.Name);

                            _.Paragraph(
                                "At any time you can tell where you are, by refering to filter bar, which is located under opened tabs bar. It will show your current position in the hierarchy.");

                            _.ImageByUrl("http://i.imgur.com/bPMlmOq.png");

                            _.Paragraph(
                                "There are several ways you can navigate in the graph. First of all, you may switch graphs them selves. Each graph is represented as a graph node and is a filter on it's own. " +
                                "You can double-click the headers of certain nodes. If it is possible, such node will become a current filter. This will show the graph filtered by this node. " +
                                "If you double-click the header of the current filter, it will bring bring you back.");

                            _.Paragraph("If {0} node is a graph node, just open the corresponding graph and select root in the filter bar.",
                                        requiredFilter.Name);

                            _.Paragraph("If {0} node is a regular node, locate it and double-click it's header.",
                                        requiredFilter.Name);
                        }
                        else
                        {
                            _.Paragraph("It seems like you are inside of {0}, which is correct. Now you should be able to right-click on empty space of the graph and select Add {1}.", requiredFilter.Name, nodeTypeName);

                            _.Paragraph("Finally you need to rename newly created node. To rename your node you have to right-click on the header of the node and click rename." +
                                        "Node title will become editable. Type in \"{0}\". Click anywhere else, to finish editing", requiredName);

                            _.ImageByUrl("http://i.imgur.com/PDUZhsU.png", "This picture shows how to rename a node");
                        }
                    }

                    if (stepContent != null)
                    {
                        stepContent(_);
                    }
                    _.Break();
                    _.ToggleContentByNode <T>(null);
                }
            });
            return(existing);
        }