/// <summary>
        /// Create a new DataContractDsl model and return a modelbus reference to it
        /// </summary>
        /// <param name="modelName">Name of the model to create (with or without the extension)</param>
        /// <param name="relativeToPathName">pathName on a model relative to which to create the new model</param>
        /// <param name="relativePath">Path relative to the <paramref name="relativeTo"/> model. If <c>null</c>, the new
        /// model is created at the same location as the <paramref name="relativeTo"/> model</param>
        public static DslIntegration::ModelBusReference CreateDataContractModel(string modelName, string relativeToPathName, string relativePath = null)
        {
            global::EnvDTE.DTE        dte      = Microsoft.VisualStudio.Shell.Package.GetGlobalService(typeof(global::EnvDTE.DTE)) as global::EnvDTE.DTE;
            DslIntegration::IModelBus modelBus = Microsoft.VisualStudio.Shell.Package.GetGlobalService(typeof(DslIntegration::SModelBus)) as DslIntegration::IModelBus;

            global::EnvDTE.ProjectItem item    = dte.Solution.FindProjectItem(relativeToPathName);
            global::EnvDTE.Project     project = item.ContainingProject;

            string template = (dte.Solution as global::EnvDTE80.Solution2).GetProjectItemTemplate("DataContractDsl.zip", "CSharp");

            string modelNameWithExtension = global::System.IO.Path.ChangeExtension(modelName, ".datacontract");

            global::EnvDTE.ProjectItem newItem = project.ProjectItems.AddFromTemplate(template, modelNameWithExtension);
            if (newItem == null) /// Well known bug
            {
                newItem = project.ProjectItems.Item(modelNameWithExtension);
            }

            DslIntegration::ModelingAdapterReference mar = new DslIntegration::ModelingAdapterReference(null, null, newItem.get_FileNames(1));

            DslIntegration::ModelBusReference mbr = new DslIntegration::ModelBusReference(modelBus,
                                                                                          DataContractDslAdapter.AdapterId,
                                                                                          System.IO.Path.GetFileNameWithoutExtension(newItem.Name),
                                                                                          mar);

            return(mbr);
        }
        /// <summary>
        /// Create a new CloudCoreArchitectSubProcess model and return a modelbus reference to it
        /// </summary>
        /// <param name="modelName">Name of the model to create (with or without the extension)</param>
        /// <param name="relativeToPathName">pathName on a model relative to which to create the new model</param>
        /// <param name="relativePath">Path relative to the <paramref name="relativeTo"/> model. If <c>null</c>, the new
        /// model is created at the same location as the <paramref name="relativeTo"/> model</param>
        public static DslIntegration::ModelBusReference CreateSubProcess(string modelName, string relativeToPathName, string relativePath = null)
        {
            // Get the Visual Studio services
            global::EnvDTE.DTE dte = Microsoft.VisualStudio.Shell.Package.GetGlobalService(typeof(global::EnvDTE.DTE)) as global::EnvDTE.DTE;
            DslIntegration::IModelBus modelBus = Microsoft.VisualStudio.Shell.Package.GetGlobalService(typeof(DslIntegration::SModelBus)) as DslIntegration::IModelBus;
            // Get the item corresponding to "relativePathName".
            global::EnvDTE.ProjectItem item = dte.Solution.FindProjectItem(relativeToPathName);
            global::EnvDTE.Project project = item.ContainingProject;
            global::EnvDTE.ProjectItems parent = project.ProjectItems;

            // Find the sub folder (or create it if necessary) in the case of a relativePath
            if (relativePath != null)
            {
                string[] pathSegments = relativePath.Split(global::System.IO.Path.PathSeparator);

                for (int i = 0; i < pathSegments.Length; ++i)
                {
                    global::EnvDTE.ProjectItem folder = parent.OfType<global::EnvDTE.ProjectItem>().FirstOrDefault(projectItem => string.Compare(projectItem.Name, pathSegments[i], true) == 0);
                    if (folder == null)
                    {
                        folder = parent.AddFolder(pathSegments[i]);
                    }

                    parent = folder.ProjectItems;
                }
            }

            // Find the model item template
            string template = (dte.Solution as global::EnvDTE80.Solution2).GetProjectItemTemplate("CloudCoreArchitectSubProcess.zip", "CSharp");
        
            string modelNameWithExtension = global::System.IO.Path.ChangeExtension(modelName, ".subprocess");
            global::EnvDTE.ProjectItem newItem = parent.AddFromTemplate(template, modelNameWithExtension);
            if (newItem == null) /// Well known behavior for C# and VB project, null is returned, so we need to re-ask for the project item
                newItem = parent.Item(modelNameWithExtension);

            DslIntegration::ModelingAdapterReference mar = new DslIntegration::ModelingAdapterReference(null, null, newItem.get_FileNames(1));

            DslIntegration::ModelBusReference mbr = new DslIntegration::ModelBusReference(modelBus,
                                                          CloudCoreArchitectSubProcessAdapter.AdapterId,
                                                          System.IO.Path.GetFileNameWithoutExtension(newItem.Name),
                                                          mar);

            return mbr; 
        }
        /// <summary>
        /// Create a reference on a model described by the parameters
        /// </summary>
        /// <param name="modelLocatorInfo">The default implementation (which can be overriden)
        /// supports models described as ProjectItems, and
        /// model file path whether or not in the project/solution</param>
        /// <returns>true if this adapter </returns>
        public override DslIntegration::ModelBusReference CreateReference(params object[] modelLocatorInfo)
        {
            // Infer the project item from the parameters
            global::EnvDTE.ProjectItem item = GetProjectItem(modelLocatorInfo);

            if (item == null)
            {
                return(null);
            }

            // Create the part of the reference which depends on the Adapter
            DslIntegration::ModelingAdapterReference mar = new DslIntegration::ModelingAdapterReference(null, null, item.get_FileNames(1));

            // And aggregate it with the adapter manager's part
            DslIntegration::ModelBusReference mbr = new DslIntegration::ModelBusReference(
                this.ModelBus, DataContractDslAdapter.AdapterId,
                global::System.IO.Path.GetFileNameWithoutExtension(item.Name),
                mar);

            return(mbr);
        }
        /// <summary>
        /// Create a new ServiceContractDsl model and return a modelbus reference to it
        /// </summary>
        /// <param name="modelName">Name of the model to create (with or without the extension)</param>
        /// <param name="relativeToPathName">pathName on a model relative to which to create the new model</param>
        /// <param name="relativePath">Path relative to the <paramref name="relativeTo"/> model. If <c>null</c>, the new
        /// model is created at the same location as the <paramref name="relativeTo"/> model</param>
        public static DslIntegration::ModelBusReference CreateServiceContractModel(string modelName, string relativeToPathName, string relativePath = null)
        {
            global::EnvDTE.DTE dte = Microsoft.VisualStudio.Shell.Package.GetGlobalService(typeof(global::EnvDTE.DTE)) as global::EnvDTE.DTE;
            DslIntegration::IModelBus modelBus = Microsoft.VisualStudio.Shell.Package.GetGlobalService(typeof(DslIntegration::SModelBus)) as DslIntegration::IModelBus;
            global::EnvDTE.ProjectItem item = dte.Solution.FindProjectItem(relativeToPathName);
            global::EnvDTE.Project project = item.ContainingProject;

            string template = (dte.Solution as global::EnvDTE80.Solution2).GetProjectItemTemplate("ServiceContractDsl.zip", "CSharp");
        
            string modelNameWithExtension = global::System.IO.Path.ChangeExtension(modelName, ".servicecontract");
            global::EnvDTE.ProjectItem newItem = project.ProjectItems.AddFromTemplate(template, modelNameWithExtension);
            if (newItem == null) /// Well known bug
                newItem = project.ProjectItems.Item(modelNameWithExtension);

            DslIntegration::ModelingAdapterReference mar = new DslIntegration::ModelingAdapterReference(null, null, newItem.get_FileNames(1));

            DslIntegration::ModelBusReference mbr = new DslIntegration::ModelBusReference(modelBus,
                                                          ServiceContractDslAdapter.AdapterId,
                                                          System.IO.Path.GetFileNameWithoutExtension(newItem.Name),
                                                          mar);

            return mbr; 
        }
        /// <summary>
        /// Create a reference on a model described by the parameters
        /// </summary>
        /// <param name="modelLocatorInfo">The default implementation (which can be overriden) 
        /// supports models described as ProjectItems, and
        /// model file path whether or not in the project/solution</param>
        /// <returns>true if this adapter </returns>
        public override DslIntegration::ModelBusReference CreateReference(params object[] modelLocatorInfo)
        {
            // Infer the project item from the parameters
            global::EnvDTE.ProjectItem item = GetProjectItem(modelLocatorInfo);

            if (item == null)
            {
                return null;
            }

            // Create the part of the reference which depends on the Adapter
            DslIntegration::ModelingAdapterReference mar = new DslIntegration::ModelingAdapterReference(null, null, item.get_FileNames(1));

            // And aggregate it with the adapter manager's part
            DslIntegration::ModelBusReference mbr = new DslIntegration::ModelBusReference(
                this.ModelBus, DataContractDslAdapter.AdapterId,
                global::System.IO.Path.GetFileNameWithoutExtension(item.Name),
                mar);

            return mbr;
        }